aws-runtime-bridge 1.9.175 → 1.9.180

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. package/CHANGELOG.md +223 -0
  2. package/README.md +61 -2
  3. package/dist/adapter/AcodeSdkAdapter.d.ts +382 -0
  4. package/dist/adapter/AcodeSdkAdapter.js +3 -3
  5. package/dist/adapter/AdapterRegistry.d.ts +28 -0
  6. package/dist/adapter/ClaudeSdkAdapter.d.ts +71 -0
  7. package/dist/adapter/CodexSdkAdapter.d.ts +14 -0
  8. package/dist/adapter/OpencodeSdkAdapter.d.ts +44 -0
  9. package/dist/adapter/acode-tool-names.d.ts +9 -0
  10. package/dist/adapter/idle-poll-loop.d.ts +20 -0
  11. package/dist/adapter/index.d.ts +3 -0
  12. package/dist/adapter/instance-ai-config-resolver.d.ts +20 -0
  13. package/dist/adapter/prompts.d.ts +12 -0
  14. package/dist/adapter/types.d.ts +201 -0
  15. package/dist/browser/browser-bootstrap.d.ts +15 -0
  16. package/dist/browser/browser-connect-token.d.ts +11 -0
  17. package/dist/browser/browser-frame-encode.d.ts +32 -0
  18. package/dist/browser/browser-pool.d.ts +129 -0
  19. package/dist/browser/browser-profile-store.d.ts +41 -0
  20. package/dist/browser/browser-ws-bridge.d.ts +20 -0
  21. package/dist/browser/built-in-browser-tools.d.ts +44 -0
  22. package/dist/browser/element-locator.d.ts +25 -0
  23. package/dist/browser/element-picker.d.ts +30 -0
  24. package/dist/browser/frame-encode.d.ts +19 -0
  25. package/dist/browser/input-dispatcher.d.ts +35 -0
  26. package/dist/browser/listener-store.d.ts +44 -0
  27. package/dist/browser/page-listener-manager.d.ts +88 -0
  28. package/dist/browser/page-listener-types.d.ts +38 -0
  29. package/dist/browser/screencast-differ.d.ts +10 -0
  30. package/dist/browser/screencast-manager.d.ts +94 -0
  31. package/dist/browser/snapshot-serializer.d.ts +56 -0
  32. package/dist/browser/ssrf-guard.d.ts +44 -0
  33. package/dist/browser/stealth.d.ts +21 -0
  34. package/dist/browser/step-archive.d.ts +13 -0
  35. package/dist/browser/types.d.ts +100 -0
  36. package/dist/browser/ws-server.d.ts +54 -0
  37. package/dist/config.d.ts +138 -2
  38. package/dist/config.js +2 -2
  39. package/dist/desktop/built-in-desktop-tools.d.ts +68 -0
  40. package/dist/desktop/built-in-desktop-tools.js +2 -1
  41. package/dist/desktop/desktop-control.d.ts +142 -0
  42. package/dist/desktop/desktop-control.js +2 -0
  43. package/dist/desktop/desktop-mcp-client.d.ts +28 -0
  44. package/dist/desktop/desktop-staleness.d.ts +66 -0
  45. package/dist/desktop/desktop-staleness.js +2 -0
  46. package/dist/index.d.ts +4 -0
  47. package/dist/index.js +1 -1
  48. package/dist/middleware/auth.d.ts +26 -0
  49. package/dist/middleware/auth.js +1 -1
  50. package/dist/remote-desktop/computer-control.d.ts +3 -0
  51. package/dist/remote-desktop/coords.d.ts +6 -0
  52. package/dist/remote-desktop/frame-backpressure.d.ts +10 -0
  53. package/dist/remote-desktop/frame-encode.d.ts +3 -0
  54. package/dist/remote-desktop/index.js +2 -2
  55. package/dist/remote-desktop/input-dispatcher.d.ts +4 -0
  56. package/dist/remote-desktop/permission-manager.d.ts +3 -0
  57. package/dist/remote-desktop/screen-capture.d.ts +91 -0
  58. package/dist/remote-desktop/session-manager.d.ts +47 -0
  59. package/dist/remote-desktop/session-manager.js +1 -1
  60. package/dist/remote-desktop/system-backend.d.ts +64 -0
  61. package/dist/remote-desktop/types.d.ts +25 -0
  62. package/dist/remote-desktop/ui-automation.d.ts +11 -0
  63. package/dist/remote-desktop/win32-api.d.ts +10 -0
  64. package/dist/routes/acode-todos.d.ts +13 -0
  65. package/dist/routes/agent-state.d.ts +15 -0
  66. package/dist/routes/ai-sources.js +1 -1
  67. package/dist/routes/background-tasks.d.ts +18 -0
  68. package/dist/routes/background-tasks.js +2 -2
  69. package/dist/routes/browser-listeners.d.ts +17 -0
  70. package/dist/routes/browser-sessions.d.ts +10 -0
  71. package/dist/routes/capabilities.js +1 -1
  72. package/dist/routes/dashboard-icon.d.ts +9 -0
  73. package/dist/routes/dashboard-icon.js +2 -0
  74. package/dist/routes/dashboard-theme.d.ts +24 -0
  75. package/dist/routes/dashboard-theme.js +157 -0
  76. package/dist/routes/dashboard.d.ts +9 -0
  77. package/dist/routes/dashboard.js +1988 -625
  78. package/dist/routes/debug-mount.d.ts +16 -0
  79. package/dist/routes/desktop-control.d.ts +15 -0
  80. package/dist/routes/desktop-control.js +2 -0
  81. package/dist/routes/events.d.ts +4 -0
  82. package/dist/routes/file-browser.d.ts +11 -0
  83. package/dist/routes/file-change-diff.d.ts +25 -0
  84. package/dist/routes/file-diff-rollback.d.ts +28 -0
  85. package/dist/routes/file-snapshot.d.ts +7 -0
  86. package/dist/routes/git.d.ts +143 -0
  87. package/dist/routes/instance-tool-status.d.ts +5 -0
  88. package/dist/routes/instance.d.ts +8 -0
  89. package/dist/routes/instance.js +1 -1
  90. package/dist/routes/jdks.d.ts +4 -0
  91. package/dist/routes/launch.d.ts +5 -0
  92. package/dist/routes/lsp-providers.d.ts +11 -0
  93. package/dist/routes/lsp-providers.js +2 -0
  94. package/dist/routes/lsp.d.ts +41 -0
  95. package/dist/routes/lsp.js +4 -2
  96. package/dist/routes/mcp-extra.d.ts +15 -0
  97. package/dist/routes/mcp.d.ts +16 -0
  98. package/dist/routes/mcp.js +1 -1
  99. package/dist/routes/plugins.d.ts +19 -0
  100. package/dist/routes/plugins.js +1 -1
  101. package/dist/routes/processes.d.ts +4 -0
  102. package/dist/routes/properties.d.ts +4 -0
  103. package/dist/routes/pty.d.ts +29 -0
  104. package/dist/routes/runtime-binding.d.ts +3 -0
  105. package/dist/routes/sessions.d.ts +22 -0
  106. package/dist/routes/skills.d.ts +15 -0
  107. package/dist/routes/skills.js +1 -1
  108. package/dist/routes/sub-agents.d.ts +11 -0
  109. package/dist/routes/sub-agents.js +1 -1
  110. package/dist/routes/task-context.d.ts +5 -0
  111. package/dist/routes/tech-stack.d.ts +4 -0
  112. package/dist/routes/terminal.d.ts +131 -0
  113. package/dist/routes/terminal.js +25 -25
  114. package/dist/routes/workspace-index.d.ts +12 -0
  115. package/dist/routes/workspace-index.js +2 -0
  116. package/dist/routes/yml.d.ts +4 -0
  117. package/dist/scripts/migrate-user-scopes.d.ts +26 -0
  118. package/dist/scripts/migrate-user-scopes.js +2 -0
  119. package/dist/services/access-control.d.ts +21 -0
  120. package/dist/services/acode-bg-manager.d.ts +21 -0
  121. package/dist/services/acode-package.d.ts +10 -0
  122. package/dist/services/acode-package.js +1 -1
  123. package/dist/services/agent-capability-sync.d.ts +26 -0
  124. package/dist/services/agent-capability-sync.js +1 -1
  125. package/dist/services/agent-event-store.d.ts +20 -0
  126. package/dist/services/agent-ownership.d.ts +58 -0
  127. package/dist/services/agent-ownership.js +3 -0
  128. package/dist/services/agent-process-manager.d.ts +154 -0
  129. package/dist/services/agent-pty-manager.d.ts +37 -0
  130. package/dist/services/agent-startup-memory.d.ts +34 -0
  131. package/dist/services/agent-startup-memory.js +1 -1
  132. package/dist/services/ai-config-service.d.ts +26 -52
  133. package/dist/services/ai-config-service.js +1 -3
  134. package/dist/services/ai-source-apply.d.ts +7 -15
  135. package/dist/services/ai-source-apply.js +1 -1
  136. package/dist/services/auto-register.d.ts +165 -1
  137. package/dist/services/auto-register.js +1 -1
  138. package/dist/services/aws-client-agent-mcp.d.ts +14 -0
  139. package/dist/services/aws-client-agent-mcp.js +2 -2
  140. package/dist/services/bridge-package-publish-hooks.d.ts +14 -0
  141. package/dist/services/bridge-pairing.d.ts +82 -0
  142. package/dist/services/bridge-pairing.js +2 -0
  143. package/dist/services/bridge-temp-files.d.ts +29 -0
  144. package/dist/services/browser-session-manager.d.ts +71 -0
  145. package/dist/services/capability-config.d.ts +60 -15
  146. package/dist/services/capability-config.js +2 -2
  147. package/dist/services/change-cache-retention.d.ts +9 -0
  148. package/dist/services/changelog.d.ts +9 -0
  149. package/dist/services/cli-commands.d.ts +82 -0
  150. package/dist/services/cli-commands.js +6 -6
  151. package/dist/services/connection-key-rotation.d.ts +27 -0
  152. package/dist/services/connection-key-rotation.js +2 -0
  153. package/dist/services/debug-mount.d.ts +49 -0
  154. package/dist/services/desktop-mcp-manager.d.ts +103 -1
  155. package/dist/services/desktop-mcp-manager.js +1 -1
  156. package/dist/services/event-delta-pusher.d.ts +15 -0
  157. package/dist/services/fileSnapshotStore.d.ts +33 -0
  158. package/dist/services/gitignore.d.ts +9 -0
  159. package/dist/services/instance-ai-config-service.d.ts +9 -0
  160. package/dist/services/instance-ai-config-service.js +1 -1
  161. package/dist/services/instance-features.d.ts +127 -0
  162. package/dist/services/instance-features.js +1 -1
  163. package/dist/services/instance-init-service.d.ts +3 -0
  164. package/dist/services/instance-init-service.js +1 -1
  165. package/dist/services/instance-state.d.ts +23 -0
  166. package/dist/services/jdk-scanner.d.ts +15 -0
  167. package/dist/services/launch-manager.d.ts +138 -0
  168. package/dist/services/launch-metrics.d.ts +42 -0
  169. package/dist/services/launch-streams.d.ts +19 -0
  170. package/dist/services/lifecycle-state.d.ts +5 -0
  171. package/dist/services/log-retention.d.ts +38 -0
  172. package/dist/services/lsp/install-manager.d.ts +55 -0
  173. package/dist/services/lsp/install-manager.js +2 -0
  174. package/dist/services/lsp/provider-registry.d.ts +108 -0
  175. package/dist/services/lsp/provider-registry.js +2 -0
  176. package/dist/services/lsp/uri-rewrite.d.ts +44 -0
  177. package/dist/services/lsp/uri-rewrite.js +2 -0
  178. package/dist/services/lsp-stdio-bridge.d.ts +41 -4
  179. package/dist/services/lsp-stdio-bridge.js +3 -3
  180. package/dist/services/mcp-deploy.d.ts +45 -4
  181. package/dist/services/mcp-deploy.js +4 -4
  182. package/dist/services/mcp-env-injector.d.ts +52 -0
  183. package/dist/services/mcp-launch-binding-queue.d.ts +12 -0
  184. package/dist/services/mcp-package.d.ts +22 -0
  185. package/dist/services/mcp-package.js +1 -1
  186. package/dist/services/mcp-probe-client.d.ts +19 -0
  187. package/dist/services/mcp-probe-client.js +1 -1
  188. package/dist/services/open-doc-events.d.ts +22 -0
  189. package/dist/services/open-doc-registry.d.ts +35 -0
  190. package/dist/services/orphan-monitor.d.ts +43 -0
  191. package/dist/services/panel-auth.d.ts +24 -0
  192. package/dist/services/panel-env.d.ts +28 -0
  193. package/dist/services/plugin-deployment.d.ts +34 -1
  194. package/dist/services/plugin-deployment.js +2 -2
  195. package/dist/services/plugin-event-buffer.d.ts +21 -0
  196. package/dist/services/plugin-fs.d.ts +11 -0
  197. package/dist/services/plugin-handler-adapter.d.ts +13 -0
  198. package/dist/services/plugin-listener-runner.d.ts +10 -0
  199. package/dist/services/plugin-loader.d.ts +15 -0
  200. package/dist/services/plugin-manager.d.ts +95 -9
  201. package/dist/services/plugin-manager.js +4 -4
  202. package/dist/services/plugin-manifest.d.ts +14 -0
  203. package/dist/services/plugin-package.d.ts +13 -0
  204. package/dist/services/plugin-runtime.d.ts +15 -0
  205. package/dist/services/port-detector.d.ts +15 -0
  206. package/dist/services/process-detail.d.ts +3 -0
  207. package/dist/services/process-detector.d.ts +132 -0
  208. package/dist/services/process-registry.d.ts +120 -0
  209. package/dist/services/process-top.d.ts +6 -0
  210. package/dist/services/request-identity.d.ts +77 -0
  211. package/dist/services/request-identity.js +2 -0
  212. package/dist/services/request-invalid-dump.d.ts +4 -0
  213. package/dist/services/ring-buffer.d.ts +33 -0
  214. package/dist/services/runtime-binding.d.ts +56 -4
  215. package/dist/services/runtime-binding.js +4 -4
  216. package/dist/services/runtime-lifecycle-policy.d.ts +17 -0
  217. package/dist/services/runtime-resources-snapshot.d.ts +26 -0
  218. package/dist/services/sdk-tool-file-change-recorder.d.ts +9 -0
  219. package/dist/services/session-output.d.ts +63 -0
  220. package/dist/services/session-output.js +3 -3
  221. package/dist/services/skill-manager.d.ts +42 -5
  222. package/dist/services/skill-manager.js +3 -3
  223. package/dist/services/snapshot-retention.d.ts +23 -0
  224. package/dist/services/startup-config-wizard.d.ts +7 -1
  225. package/dist/services/startup-config-wizard.js +10 -10
  226. package/dist/services/system-metrics.d.ts +3 -0
  227. package/dist/services/tech-stack-scanner.d.ts +12 -0
  228. package/dist/services/terminal-persistence.d.ts +43 -0
  229. package/dist/services/tool-installer.d.ts +12 -0
  230. package/dist/services/tunnel-client.d.ts +57 -2
  231. package/dist/services/tunnel-client.js +1 -1
  232. package/dist/services/update-log.d.ts +6 -0
  233. package/dist/services/update-notifier.d.ts +17 -0
  234. package/dist/services/update-notifier.js +2 -2
  235. package/dist/services/user-scope.d.ts +115 -0
  236. package/dist/services/user-scope.js +2 -0
  237. package/dist/services/windows-service-manager.d.ts +12 -0
  238. package/dist/services/workspace-files.d.ts +64 -0
  239. package/dist/services/workspace-index/index-manager.d.ts +46 -0
  240. package/dist/services/workspace-index/index-manager.js +2 -0
  241. package/dist/services/workspace-index/indexer.d.ts +15 -0
  242. package/dist/services/workspace-index/indexer.js +2 -0
  243. package/dist/services/workspace-index/query.d.ts +74 -0
  244. package/dist/services/workspace-index/query.js +5 -0
  245. package/dist/services/workspace-index/resolver.d.ts +26 -0
  246. package/dist/services/workspace-index/resolver.js +2 -0
  247. package/dist/services/workspace-index/types.d.ts +89 -0
  248. package/dist/services/workspace-index/types.js +2 -0
  249. package/dist/services/workspace-watch.d.ts +4 -0
  250. package/dist/services/workspaceTaskChangeWatcher.d.ts +49 -0
  251. package/dist/services/workspaceTaskChangeWatcher.js +1 -1
  252. package/dist/types.d.ts +9 -0
  253. package/dist/utils/config-write-queue.d.ts +11 -0
  254. package/dist/utils/env-safety.d.ts +21 -0
  255. package/dist/utils/file-utils.d.ts +15 -0
  256. package/dist/utils/instance-ai-config-debug-logger.d.ts +15 -0
  257. package/dist/utils/lifecycle-log.d.ts +5 -0
  258. package/dist/utils/logger.d.ts +13 -0
  259. package/dist/utils/logger.js +2 -1
  260. package/dist/utils/npm-version.d.ts +10 -0
  261. package/dist/utils/path-utils.d.ts +12 -0
  262. package/dist/utils/scheduler-url.d.ts +18 -0
  263. package/dist/utils/scheduler-url.js +2 -0
  264. package/dist/utils/sdk-package-loader.d.ts +13 -0
  265. package/dist/utils/sdk-package-loader.js +1 -1
  266. package/dist/utils/target-identity.d.ts +31 -0
  267. package/dist/utils/target-identity.js +2 -0
  268. package/dist/utils/validation.d.ts +17 -0
  269. package/dist/utils/yaml-utils.d.ts +48 -0
  270. package/package/acode/dist/__tests__/summary-request-helper.d.ts +10 -0
  271. package/package/acode/dist/ask-user-question-tool.d.ts +17 -0
  272. package/package/acode/dist/await-complete-tool.d.ts +12 -0
  273. package/package/acode/dist/background-command-manager.d.ts +105 -0
  274. package/package/acode/dist/background-command-store.d.ts +27 -0
  275. package/package/acode/dist/background-command-tools.d.ts +8 -0
  276. package/package/acode/dist/background-output-ringbuffer.d.ts +15 -0
  277. package/package/acode/dist/built-in-file-tools.d.ts +65 -0
  278. package/package/acode/dist/built-in-symbols-tool.d.ts +3 -0
  279. package/package/acode/dist/builtins/commandArtifacts.d.ts +3 -0
  280. package/package/acode/dist/builtins/shellCommandPreparation.d.ts +17 -0
  281. package/package/acode/dist/builtins/shellCommandRunner.d.ts +4 -0
  282. package/package/acode/dist/builtins/shellOutputDecoder.d.ts +15 -0
  283. package/package/acode/dist/cache-control.d.ts +45 -0
  284. package/package/acode/dist/commands/commandLoader.d.ts +3 -0
  285. package/package/acode/dist/commands/commandParser.d.ts +3 -0
  286. package/package/acode/dist/commands/commandRegistry.d.ts +3 -0
  287. package/package/acode/dist/compaction.d.ts +354 -0
  288. package/package/acode/dist/config.d.ts +3 -0
  289. package/package/acode/dist/context-overflow.d.ts +32 -0
  290. package/package/acode/dist/fs-utils.d.ts +18 -0
  291. package/package/acode/dist/hooks/hookBus.d.ts +3 -0
  292. package/package/acode/dist/image-utils.d.ts +35 -0
  293. package/package/acode/dist/index.d.ts +1 -0
  294. package/package/acode/dist/index.js +1 -1
  295. package/package/acode/dist/mcpToolNames.d.ts +32 -0
  296. package/package/acode/dist/microcompact.d.ts +53 -0
  297. package/package/acode/dist/parsers/ast-cache.d.ts +41 -0
  298. package/package/acode/dist/parsers/file-index.d.ts +83 -0
  299. package/package/acode/dist/parsers/file-index.js +4 -0
  300. package/package/acode/dist/parsers/language-detector.d.ts +4 -0
  301. package/package/acode/dist/parsers/tree-sitter-loader.d.ts +12 -0
  302. package/package/acode/dist/parsers/types.d.ts +11 -0
  303. package/package/acode/dist/paths.d.ts +14 -0
  304. package/package/acode/dist/plugin-types.d.ts +34 -0
  305. package/package/acode/dist/read-file-state.d.ts +15 -0
  306. package/package/acode/dist/runtime-environment.d.ts +16 -0
  307. package/package/acode/dist/runtime.d.ts +824 -9
  308. package/package/acode/dist/runtime.js +22 -22
  309. package/package/acode/dist/skill-tool.d.ts +20 -0
  310. package/package/acode/dist/sub-agent-manager.d.ts +169 -0
  311. package/package/acode/dist/sub-agent-manager.js +1 -1
  312. package/package/acode/dist/sub-agent-store.d.ts +50 -0
  313. package/package/acode/dist/sub-agent-tools.d.ts +15 -0
  314. package/package/acode/dist/sub-agent-types.d.ts +13 -0
  315. package/package/acode/dist/terminal-tool.d.ts +15 -0
  316. package/package/acode/dist/terminal-types.d.ts +10 -0
  317. package/package/acode/dist/todo-store.d.ts +15 -0
  318. package/package/acode/dist/token-estimator.d.ts +17 -0
  319. package/package/acode/dist/tool-allocation.d.ts +113 -0
  320. package/package/acode/dist/tool-concurrency/index.d.ts +8 -0
  321. package/package/acode/dist/tool-concurrency/observability.d.ts +32 -0
  322. package/package/acode/dist/tool-concurrency/resource-lock.d.ts +30 -0
  323. package/package/acode/dist/tool-concurrency/scheduler.d.ts +19 -0
  324. package/package/acode/dist/tool-concurrency/types.d.ts +57 -0
  325. package/package/acode/dist/tool-group-manager.d.ts +195 -0
  326. package/package/acode/dist/tool-group-manager.js +4 -4
  327. package/package/acode/dist/types.d.ts +194 -0
  328. package/package/aws-client-agent-mcp/README.md +130 -215
  329. package/package/aws-client-agent-mcp/dist/ability-market-tools.d.ts +57 -0
  330. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +277 -3
  331. package/package/aws-client-agent-mcp/dist/agent-client.js +1 -1
  332. package/package/aws-client-agent-mcp/dist/config.d.ts +18 -0
  333. package/package/aws-client-agent-mcp/dist/constants.d.ts +2 -0
  334. package/package/aws-client-agent-mcp/dist/context-manager.d.ts +70 -0
  335. package/package/aws-client-agent-mcp/dist/http-client.d.ts +61 -0
  336. package/package/aws-client-agent-mcp/dist/index.d.ts +10 -0
  337. package/package/aws-client-agent-mcp/dist/logger.d.ts +24 -0
  338. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +606 -1
  339. package/package/aws-client-agent-mcp/dist/mcp-server.js +4 -4
  340. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +158 -0
  341. package/package/aws-client-agent-mcp/dist/mcp-tools.js +38 -22
  342. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +81 -0
  343. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +18 -0
  344. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +86 -0
  345. package/package/aws-client-agent-mcp/dist/messageContent.d.ts +24 -0
  346. package/package/aws-client-agent-mcp/dist/office/office-equation.d.ts +19 -0
  347. package/package/aws-client-agent-mcp/dist/office/office-image.d.ts +18 -0
  348. package/package/aws-client-agent-mcp/dist/office/office-workspace.d.ts +29 -0
  349. package/package/aws-client-agent-mcp/dist/parent-lifecycle.d.ts +18 -0
  350. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +6 -0
  351. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +4 -0
  352. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +41 -0
  353. package/package/aws-client-agent-mcp/dist/tool-groups.d.ts +136 -0
  354. package/package/aws-client-agent-mcp/dist/types.d.ts +123 -0
  355. package/package/aws-client-agent-mcp/dist/watchdog.d.ts +7 -0
  356. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +108 -0
  357. package/package.json +1 -1
@@ -1,2 +1,18 @@
1
1
 
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
2
18
  export declare const debugMountRouter: import("express-serve-static-core").Router;
@@ -0,0 +1,15 @@
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+ export declare const desktopControlRouter: import("express-serve-static-core").Router;
@@ -0,0 +1,2 @@
1
+ import{Router as i}from"express";import{broadcastControlState as p,getControlState as u,getRecentActions as c,setPaused as g}from"../desktop/desktop-control.js";import{validateToken as n}from"../middleware/auth.js";import{createLogger as m}from"../utils/logger.js";const f=m("desktop-control"),a=i();a.post("/desktop-control/:agentId/pause",n,(r,o)=>{const t=String(r.params.agentId??"").trim();if(!t){o.status(400).json({ok:!1,error:"agentId is required"});return}const e=r.body??{};if(typeof e.paused!="boolean"){o.status(400).json({ok:!1,error:"paused (boolean) is required"});return}const s=typeof e.by=="string"&&e.by.trim()?e.by.trim():"dashboard",d=g(t,e.paused,s);p(t),f.info(`[desktop-control] ${e.paused?"paused":"resumed"} by ${s} for ${t}`),o.json({ok:!0,agentId:t,state:d})}),a.get("/desktop-control/:agentId/state",n,(r,o)=>{const t=String(r.params.agentId??"").trim();if(!t){o.status(400).json({ok:!1,error:"agentId is required"});return}o.json({ok:!0,agentId:t,state:u(t),recentActions:c(t)})});export{a as desktopControlRouter};
2
+
@@ -1,2 +1,6 @@
1
1
 
2
+
3
+
4
+
5
+
2
6
  export declare const eventsRouter: import("express-serve-static-core").Router;
@@ -1,8 +1,17 @@
1
1
 
2
+
3
+
4
+
5
+
2
6
  import multer from 'multer';
3
7
  export declare const fileBrowserRouter: import("express-serve-static-core").Router;
4
8
  export declare const WORKSPACE_UPLOAD_FILE_LIMIT = 2000;
5
9
 
10
+
11
+
12
+
13
+
14
+
6
15
  export declare const WORKSPACE_UPLOAD_MAX_FILE_SIZE_BYTES: number;
7
16
  interface FileBrowserItem {
8
17
  name: string;
@@ -32,6 +41,8 @@ export declare function createWorkspaceUploadLimitResponse(error: multer.MulterE
32
41
  };
33
42
  export declare function parseWorkspaceUploadRelativePaths(body: Record<string, unknown>): string[];
34
43
 
44
+
45
+
35
46
  export declare function listHostDirectoryTree(requestPath?: string): Promise<DirectoryTreeResponse>;
36
47
 
37
48
  export { isIgnoredByGitIgnore, loadGitIgnoreRules, parseGitIgnoreRules, type GitIgnoreRule, } from '../services/gitignore.js';
@@ -1,4 +1,19 @@
1
1
 
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
2
17
  export declare const fileChangeDiffRouter: import("express-serve-static-core").Router;
3
18
 
4
19
  export type ChangeDiffLineType = 'hunk' | 'context' | 'add' | 'remove';
@@ -22,6 +37,16 @@ export interface ChangeDiffResponse {
22
37
  error?: string;
23
38
  }
24
39
 
40
+
41
+
42
+
43
+
25
44
  export declare function parseDiffPatchLines(patch: string): ChangeDiffLine[];
26
45
 
46
+
47
+
48
+
49
+
50
+
51
+
27
52
  export declare function buildChangeDiffResponse(workspacePath: string, cacheKey: string | null | undefined, operation: string, filePath: string): Promise<ChangeDiffResponse>;
@@ -1,3 +1,23 @@
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
1
21
 
2
22
  export declare const fileDiffRollbackRouter: import("express-serve-static-core").Router;
3
23
  export interface ReverseOperation {
@@ -14,6 +34,11 @@ export interface DiffRollbackRequest {
14
34
  workspacePath: string;
15
35
  operations: ReverseOperation[];
16
36
 
37
+
38
+
39
+
40
+
41
+
17
42
  skipFailed?: boolean;
18
43
  }
19
44
 
@@ -35,6 +60,9 @@ export interface DiffRollbackResult {
35
60
 
36
61
  previewFailed?: boolean;
37
62
 
63
+
64
+
65
+
38
66
  partial?: boolean;
39
67
 
40
68
  details: OperationDetail[];
@@ -1,2 +1,9 @@
1
1
 
2
+
3
+
4
+
5
+
6
+
7
+
8
+
2
9
  export declare const fileSnapshotRouter: import("express-serve-static-core").Router;
@@ -1,6 +1,13 @@
1
1
 
2
+
3
+
4
+
5
+
2
6
  export declare const gitRouter: import("express-serve-static-core").Router;
3
7
 
8
+
9
+
10
+
4
11
  export declare function resolveGitCommandTimeoutMs(): number;
5
12
  interface GitRepositoryContext {
6
13
  workspacePath: string;
@@ -40,8 +47,13 @@ interface GitCommitItem {
40
47
  isRemote: boolean;
41
48
  }
42
49
 
50
+
51
+
52
+
43
53
  export declare function resolveCommitPageLimit(rawLimit: unknown, graphMode: boolean): number;
44
54
 
55
+
56
+
45
57
  export declare function resolveCommitPageSkip(rawSkip: unknown): number;
46
58
 
47
59
  export interface CommitPageResult<T> {
@@ -50,6 +62,10 @@ export interface CommitPageResult<T> {
50
62
  nextSkip: number;
51
63
  }
52
64
 
65
+
66
+
67
+
68
+
53
69
  export declare function sliceCommitPage<T>(fetched: T[], limit: number, skip: number): CommitPageResult<T>;
54
70
  interface GitCommitLogQuery {
55
71
 
@@ -62,9 +78,18 @@ interface GitCommitLogQuery {
62
78
 
63
79
  relativeWorkspacePath: string;
64
80
 
81
+
82
+
83
+
65
84
  graphHeadRef?: string | null;
66
85
  }
67
86
 
87
+
88
+
89
+
90
+
91
+
92
+
68
93
  export declare function buildGitCommitLogArgs(query: GitCommitLogQuery): string[];
69
94
  export interface GitBranchItem {
70
95
 
@@ -78,11 +103,20 @@ export interface GitBranchItem {
78
103
  upstream: string;
79
104
  }
80
105
 
106
+
107
+
108
+
81
109
  export declare function shouldIncludeGitDiffSummaryFile(status: GitDiffFileStatus, additions: number, deletions: number, isBinaryDiff: boolean): boolean;
82
110
 
111
+
112
+
113
+
83
114
  export declare function isGitStashMissingInitialCommitError(output: string): boolean;
84
115
  export declare function createMissingInitialCommitSnapshotError(): string;
85
116
 
117
+
118
+
119
+
86
120
  export declare function isGitStashNoChangesOutput(output: string): boolean;
87
121
  interface LatestGitStash {
88
122
  ref: string;
@@ -90,39 +124,88 @@ interface LatestGitStash {
90
124
  message: string;
91
125
  }
92
126
 
127
+
128
+
129
+
93
130
  export declare function createAgentsWorkStashSnapshotRef(stashRef: string): string | null;
94
131
 
132
+
133
+
134
+
95
135
  export declare function parseGitStashListLine(line: string): GitStashItem | null;
96
136
 
137
+
138
+
139
+
97
140
  export declare function parseLatestGitStash(output: string): LatestGitStash | null;
98
141
 
142
+
143
+
144
+
99
145
  export declare function resolveGitPushTimeoutMs(): number;
100
146
 
147
+
148
+
149
+
101
150
  export declare function persistAgentsWorkStashSnapshotRef(workspacePath: string, stashRef: string): Promise<string | null>;
102
151
 
152
+
153
+
103
154
  export declare function parseGitStatusStagedPaths(output: string): Set<string>;
104
155
 
156
+
157
+
105
158
  export declare function parseGitDiffSummary(nameStatusOutput: string, numstatOutput: string, stagedPaths?: Set<string>, forceStaged?: boolean): GitDiffSummaryFile[];
106
159
 
160
+
161
+
162
+
107
163
  export declare function parseGitStatusUntrackedPaths(output: string): string[];
108
164
 
165
+
166
+
167
+
168
+
109
169
  export declare function countUntrackedFileAdditions(content: string): number;
110
170
 
171
+
172
+
173
+
111
174
  export declare function collectUntrackedFiles(repoRootPath: string, untrackedPaths: string[], existingFilePaths: Set<string>, maxDepth?: number): Promise<GitDiffSummaryFile[]>;
112
175
 
176
+
177
+
178
+
113
179
  export declare function mergeGitDiffSummaryFiles(unstagedFiles: GitDiffSummaryFile[], stagedFiles: GitDiffSummaryFile[]): GitDiffSummaryFile[];
114
180
  export declare function normalizeGitCommitMessage(message: unknown): string;
115
181
  export declare function createScopedGitPathspecArgs(context: Pick<GitRepositoryContext, 'relativeWorkspacePath'>): string[];
116
182
  export declare function createScopedFilePathspecArgs(filePath: string, context: Pick<GitRepositoryContext, 'relativeWorkspacePath'>): string[];
117
183
 
184
+
185
+
186
+
187
+
118
188
  export declare function parseGitCommitLog(output: string): Omit<GitCommitItem, 'isRemote'>[];
119
189
 
190
+
191
+
192
+
193
+
120
194
  export declare function resolveRemoteCommitHashes(repoRootPath: string): Promise<Set<string>>;
121
195
 
196
+
197
+
122
198
  export declare function resolveCurrentBranchName(repoRootPath: string): Promise<string>;
123
199
 
200
+
201
+
202
+
124
203
  export declare function listGitBranches(repoRootPath: string): Promise<GitBranchItem[]>;
125
204
 
205
+
206
+
207
+
208
+
126
209
  export declare function buildCommitDiffBaseArgs(commitHash: string, aggregate: boolean): string[];
127
210
  export interface GitPushResult {
128
211
  branch: string;
@@ -131,6 +214,10 @@ export interface GitPushResult {
131
214
  output: string;
132
215
  }
133
216
 
217
+
218
+
219
+
220
+
134
221
  export declare function pushBranchToRemote(repoRootPath: string): Promise<GitPushResult>;
135
222
  export interface GitStashSnapshotResult {
136
223
 
@@ -142,12 +229,22 @@ export interface GitStashSnapshotResult {
142
229
  message: string;
143
230
  }
144
231
 
232
+
233
+
234
+
235
+
145
236
  export declare function createGitStashSnapshot(workspacePath: string, message?: string): Promise<GitStashSnapshotResult>;
146
237
  export interface GitCommitOutcome {
147
238
  committedPaths: string[];
148
239
  output: string;
149
240
  }
150
241
 
242
+
243
+
244
+
245
+
246
+
247
+
151
248
  export declare function commitSelectedFiles(repoRootPath: string, message: string, pathspecs: string[]): Promise<GitCommitOutcome>;
152
249
  export type GitResetMode = 'soft' | 'hard';
153
250
  export interface GitResetPreview {
@@ -163,17 +260,63 @@ export interface GitResetPreview {
163
260
  affectsRemote: boolean;
164
261
  }
165
262
 
263
+
264
+
166
265
  export declare function previewRepositoryReset(repoRootPath: string, commitHash: string, mode: GitResetMode): Promise<GitResetPreview>;
167
266
 
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+
275
+
168
276
  export declare function resetRepositoryTo(repoRootPath: string, commitHash: string, mode: GitResetMode, cleanScopePath?: string): Promise<GitResetPreview>;
169
277
 
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
170
290
  export declare function sanitizeCommitMessage(raw: string): string;
171
291
 
292
+
293
+
294
+
172
295
  export declare function extractOpenAiStreamDelta(chunkText: string): string;
173
296
 
297
+
298
+
299
+
174
300
  export declare function debugAiStreamChunk(chunkText: string, index: number): void;
175
301
 
302
+
303
+
304
+
305
+
306
+
176
307
  export declare function callAiForCommitMessage(aiBaseUrl: string, aiApiKey: string, aiModel: string, diffContent: string): Promise<string>;
177
308
 
309
+
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+
319
+
320
+
178
321
  export declare function streamAiForCommitMessage(aiBaseUrl: string, aiApiKey: string, aiModel: string, diffContent: string, onDelta: (delta: string, accumulated: string) => void, abortSignal?: AbortSignal): Promise<string>;
179
322
  export {};
@@ -1,4 +1,9 @@
1
1
 
2
+
3
+
2
4
  export declare const PANEL_TOOL_STATUS_KEYS: readonly ["acode", "claude", "opencode", "codex"];
3
5
 
6
+
7
+
8
+
4
9
  export declare function buildToolStatusDetectionTargets(enabledTools: string[]): string[];
@@ -30,9 +30,17 @@ interface AmbiguousSchedulerBaseUrlResponse {
30
30
  hint: string;
31
31
  }
32
32
 
33
+
34
+
35
+
33
36
  export declare function buildSchedulerPingFailureResponse(error: Error, configuredSchedulerBaseUrl: string): SchedulerPingFailureResponse;
34
37
 
38
+
39
+
40
+
35
41
  export declare function buildAmbiguousSchedulerBaseUrlResponse(targetUrls: string[]): AmbiguousSchedulerBaseUrlResponse;
36
42
 
43
+
44
+
37
45
  export declare function summarizeToolStatus(toolStatus: Record<string, ToolInstallStatus>): Record<string, Pick<ToolInstallStatus, "installed" | "version" | "executable" | "error">>;
38
46
  export {};
@@ -1,2 +1,2 @@
1
- import{spawn as A}from"node:child_process";import{createHash as W,timingSafeEqual as G}from"node:crypto";import J from"node:fs/promises";import w from"node:path";import{fileURLToPath as _}from"node:url";import O from"axios";import{Router as Q}from"express";import{adapterRegistry as Y}from"../adapter/index.js";import{getBridgeVersion as R,resolveSchedulerBaseUrlFrom as Z}from"../config.js";import{validateToken as h,validateTokenOrPanelSession as T}from"../middleware/auth.js";import{getConfiguredConnectionKeys as C,getRegistrationState as ee,requestRuntimeAccessTokenRefreshForServer as te,resolveSchedulerBaseUrlFromToken as re}from"../services/auto-register.js";import{getEffective as v,getOverrides as j}from"../services/capability-config.js";import{appendChangelogSection as se,readChangelog as ne}from"../services/changelog.js";import{setAgentFeatures as oe,setAgentCapabilities as ae,setAgentInheritedFeatures as ie,setAgentCapabilitiesInherited as de,getAgentFeatures as x,getAgentInheritedFeatures as ce}from"../services/instance-features.js";import{initInstance as le}from"../services/instance-init-service.js";import{loadInstanceState as U,saveInstanceState as L}from"../services/instance-state.js";import{createBridgeLifecycleOperation as P,deliverPendingBridgeLifecycleNotifications as $,loadLifecycleState as ue,removeBridgeLifecycleOperation as ge,upsertBridgeLifecycleOperation as k}from"../services/lifecycle-state.js";import{mcpDeployManager as pe}from"../services/mcp-deploy.js";import{pluginManager as fe}from"../services/plugin-manager.js";import{getRuntimeAccessToken as me}from"../services/runtime-binding.js";import{skillManager as he}from"../services/skill-manager.js";import{detectToolStatuses as E,ensureToolsInstalled as Se,SUPPORTED_INSTALLABLE_TOOLS as F,SUPPORTED_UNINSTALLABLE_TOOLS as D,uninstallTools as ye}from"../services/tool-installer.js";import{appendUpdateLog as m,readUpdateLog as be}from"../services/update-log.js";import{createLogger as we}from"../utils/logger.js";import{checkBridgeUpdate as N}from"../utils/npm-version.js";const d=we("instance");import{buildToolStatusDetectionTargets as ke}from"./instance-tool-status.js";let I=null;function it(r){I=r}const g=Q();function M(r){return String(r||"").trim()||void 0}function K(r){const t=r.get("host");if(t)return`${r.protocol}://${t}`}function q(){const r=w.resolve(w.dirname(_(import.meta.url)),"..","..");return w.join(r,"dist","index.js")}function Be(){return new Promise((r,t)=>{const e=A(process.execPath,[q(),"update","--no-kill"],{shell:!1,windowsHide:!0});let s="",n="";e.stdout.on("data",o=>{s+=o.toString("utf8")}),e.stderr.on("data",o=>{n+=o.toString("utf8")}),e.on("error",t),e.on("close",o=>{r({exitCode:o,stdout:s,stderr:n})})})}function z(){const r=A(process.execPath,[q(),"service","restart"],{shell:!1,windowsHide:!0,stdio:["ignore","pipe","pipe"]});r.stdout.on("data",t=>{m(String(t)).catch(()=>{})}),r.stderr.on("data",t=>{m(String(t)).catch(()=>{})})}async function Ie(){try{const r=w.join(w.dirname(w.dirname(_(import.meta.url))),"package.json"),t=JSON.parse(await J.readFile(r,{encoding:"utf8"}));return(typeof t.version=="string"?t.version.trim():"")||null}catch{return null}}const V=3e3;async function Re(r){const t={...r,status:"running",message:"Bridge \u66F4\u65B0\u6B63\u5728\u540E\u53F0\u6267\u884C\u3002"};await k(t);try{d.info("[update-bridge] \u6B63\u5728\u540E\u53F0\u6267\u884C awsb update --yes"),await m(`===== Bridge \u66F4\u65B0\u5F00\u59CB\uFF1Av${R()} -> latest\uFF08\u64CD\u4F5C ${r.operationId}\uFF09 =====`);const e=await Be();if(e.stdout&&await m(e.stdout),e.stderr&&await m(e.stderr),e.exitCode===0){const s=await Ie(),n=r.latestVersion||s||R();await se(n,`Bridge \u5DF2\u66F4\u65B0\u81F3 ${n}\u3002`).catch(a=>{const i=a;d.warn(`[update-bridge] \u8FFD\u52A0 changelog \u6BB5\u5931\u8D25\uFF08\u5DF2\u5FFD\u7565\uFF09: ${i.message}`)}),await m("===== Bridge \u66F4\u65B0\u6210\u529F\uFF0C\u51C6\u5907\u81EA\u52A8\u91CD\u542F ===== ");const o={...t,status:"restarting",message:"Bridge \u66F4\u65B0\u5B8C\u6210\uFF0C\u6B63\u5728\u91CD\u542F..."};await k(o),d.info("[update-bridge] \u6B63\u5728\u6267\u884C awsb service restart"),z(),setTimeout(()=>{if(process.exitCode=42,I){I("BRIDGE_UPDATE_RESTART",!0).catch(a=>{const i=a;d.error("[update-bridge] graceful shutdown failed:",i),process.exit(42)});return}process.exit(42)},V)}else await m(`===== Bridge \u66F4\u65B0\u5931\u8D25\uFF1A\u9000\u51FA\u7801 ${e.exitCode??"unknown"} =====`),await k({...t,status:"failed",message:`Bridge \u66F4\u65B0\u5931\u8D25\uFF0Cnpm \u9000\u51FA\u7801: ${e.exitCode??"unknown"}`,error:e.stderr||e.stdout}),await $()}catch(e){const s=e;d.error("[update-bridge] background update failed:",s),await m(`===== Bridge \u66F4\u65B0\u5F02\u5E38\uFF1A${s.message} =====`).catch(()=>{}),await k({...t,status:"failed",message:"Bridge \u66F4\u65B0\u5931\u8D25\u3002",error:s.message||"update bridge failed"}),await $()}}async function X(r){const t=await import("node:fs/promises"),e=await import("node:path"),s=await import("node:os"),n=e.join(s.tmpdir(),"agentswork-runtime-bridge",".preserve-sessions");if(r){await t.mkdir(e.dirname(n),{recursive:!0}),await t.writeFile(n,JSON.stringify({preserveSessions:!0,timestamp:new Date().toISOString()}),"utf-8"),d.info(`[prepare-restart] \u5DF2\u521B\u5EFA\u4FDD\u7559\u4F1A\u8BDD\u6807\u8BB0\u6587\u4EF6: ${n}`);return}try{await t.unlink(n),d.info("[prepare-restart] \u5DF2\u5220\u9664\u4FDD\u7559\u4F1A\u8BDD\u6807\u8BB0\u6587\u4EF6")}catch{}}function Te(r){return W("md5").update(r,"utf8").digest("hex")}function ve(r){const t=r.trim().toLowerCase();if(!/^[a-f0-9]{32}$/.test(t))return!1;const e=Buffer.from(t,"hex");return C().map(s=>s.trim()).filter(Boolean).some(s=>{const n=Buffer.from(Te(s),"hex");return n.length===e.length&&G(n,e)})}function je(r){const e=C().length>0,s=R();return e?ve(r)?{status:200,body:{ok:!0,runtimeBridge:"healthy",version:s,connectionKeyMatched:!0,connectionKeyRequired:!0}}:{status:401,body:{ok:!1,error:"connection_key_mismatch",version:s,connectionKeyMatched:!1,connectionKeyRequired:!0}}:{status:200,body:{ok:!0,runtimeBridge:"healthy",version:s,connectionKeyMatched:!0,connectionKeyRequired:!1}}}function Ue(r,t){const s=t.trim()||"http://localhost:8080",n=/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?(?:\/|$)/i.test(s);return{ok:!1,error:r.message||"scheduler ping failed",failureStage:"scheduler_ping",runtimeBridge:"healthy",schedulerBaseUrl:s,hint:n?"aws-runtime-bridge \u5DF2\u8FDE\u901A\uFF0C\u4F46\u5B83\u56DE\u8FDE\u8C03\u5EA6\u4E2D\u5FC3\u5931\u8D25\u3002\u8BF7\u5728 bridge \u542F\u52A8\u73AF\u5883\u4E2D\u5C06 AWS_RUNTIME_SCHEDULER_BASE_URL \u914D\u7F6E\u4E3A\u8BE5\u5B9E\u4F8B\u53EF\u8BBF\u95EE\u7684\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\uFF0C\u4F8B\u5982 http://<server-host>:7380\u3002":"aws-runtime-bridge \u5DF2\u8FDE\u901A\uFF0C\u4F46\u5B83\u56DE\u8FDE\u8C03\u5EA6\u4E2D\u5FC3\u5931\u8D25\u3002\u8BF7\u786E\u8BA4 AWS_RUNTIME_SCHEDULER_BASE_URL \u6307\u5411\u7684\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\u53EF\u4ECE bridge \u673A\u5668\u8BBF\u95EE\uFF0C\u5E76\u4E14\u8FD0\u884C\u65F6\u8BBF\u95EE\u4EE4\u724C\u4ECD\u6709\u6548\u3002"}}function Ee(r){if(typeof r!="object"||r===null)return;const t=Reflect.get(r,"response");if(typeof t!="object"||t===null)return;const e=Reflect.get(t,"status");return typeof e=="number"?e:void 0}async function Ae(r,t){try{const e=await O.get(`${r}/api/runtime/ping`,{headers:{"X-Runtime-Token":t}});return{schedulerReachable:e.status>=200&&e.status<300,tokenRefreshed:!1}}catch(e){if(Ee(e)!==401)throw e;const s=await te(r);if(!s.success||!s.runtimeAccessToken)throw e;const n=await O.get(`${r}/api/runtime/ping`,{headers:{"X-Runtime-Token":s.runtimeAccessToken}});return{schedulerReachable:n.status>=200&&n.status<300,tokenRefreshed:!0}}}function _e(r){return{ok:!1,error:"ambiguous_scheduler_base_url",failureStage:"scheduler_ping",runtimeBridge:"healthy",schedulerBaseUrl:"",autoRegisterTargetUrls:r,hint:"Multiple autoRegisterTargets.serverUrl values were found, so bridge cannot safely infer which scheduler /runtime/ping should call back. Set AWS_RUNTIME_SCHEDULER_BASE_URL explicitly, or use future schedulerId/token-bound multi-scheduler routing."}}function Oe(r){return Object.fromEntries(Object.entries(r||{}).map(([t,e])=>[t,{installed:!!e?.installed,version:e?.version||null,executable:e?.executable||null,error:e?.error||null}]))}g.get("/check-update",async(r,t)=>{t.json(await N())}),g.get("/update-log",T,async(r,t)=>{try{const e=await be();t.json({ok:!0,...e})}catch(e){const s=e;d.error("[update-log] Error:",s),t.status(500).json({ok:!1,error:s.message||"read update log failed"})}}),g.get("/changelog",T,async(r,t)=>{const e=String(r.query?.version||"").trim();if(!e){t.status(400).json({ok:!1,error:"version is required"});return}try{const s=await ne(e);t.json({ok:!0,version:e,...s})}catch(s){const n=s;d.error("[changelog] Error:",n),t.status(500).json({ok:!1,error:n.message||"read changelog failed"})}}),g.get("/healthz",(r,t)=>{t.json({ok:!0,runtimeBridge:"healthy"})}),g.get("/connection-check",(r,t)=>{const e=String(r.header("X-Bridge-Connection-Key-MD5")||""),s=je(e);t.status(s.status).json(s.body)}),g.get("/ping",h,async(r,t)=>{let e=Z(r.header("X-Scheduler-Base-Url"),r.header("X-Bridge-Instance-Id"),r.header("X-Bridge-Instance-Name"));if(e.source==="ambiguous-auto-register-targets"){const n=re(r.header("X-Runtime-Token"));if(n)e={url:n,source:"token-match",ambiguousTargetUrls:[]};else{const o=r.header("X-Bridge-Instance-Id");if(o){const a=ee(),i=Object.entries(a.registrations).find(([,l])=>l===o)?.[0];i&&(e={url:i,source:"instance-id-match",ambiguousTargetUrls:[]})}if(!e.url||e.source==="ambiguous-auto-register-targets"){t.status(400).json(_e(e.ambiguousTargetUrls));return}}}const s=e.url;try{const n=me(s);if(!n){t.status(401).json({ok:!1,error:"runtime_access_token_required"});return}const o=await Ae(s,n);t.json({ok:!0,runtimeBridge:"healthy",version:R(),schedulerReachable:o.schedulerReachable,tokenRefreshed:o.tokenRefreshed,schedulerBaseUrl:s,instanceId:e.instanceId,instanceName:e.instanceName})}catch(n){const o=n;t.status(502).json(Ue(o,s))}}),g.post("/init-instance",h,async(r,t)=>{const{agentId:e,workspacePath:s,skillEnabled:n,mcpEnabled:o,ccSwitchEnabledTools:a,skillPackage:i,skillPackages:l,pluginPackages:f,mcpServers:S}=r.body||{};if(!e||!s){t.status(400).json({error:"agentId and workspacePath are required"});return}try{d.info("[init-instance] Request received",{agentId:String(e),workspacePath:String(s),skillEnabled:n,mcpEnabled:o,ccSwitchEnabledTools:a});const u=await le(e,s,{skillEnabled:n,mcpEnabled:o,ccSwitchEnabledTools:a,skillPackage:i,skillPackages:l,pluginPackages:f,mcpServers:S});d.info("[init-instance] Initialization completed",{agentId:String(e),ok:u.ok,logCount:u.logs?.length||0,enabledTools:u.enabledTools}),t.json(u)}catch(u){const p=u;d.error("[init-instance] Initialization failed",{agentId:String(e),workspacePath:String(s),error:p?.message||String(u),stack:p?.stack||null}),t.status(400).json({error:p?.message||"initialize instance failed"})}}),g.post("/features",h,async(r,t)=>{const{agentId:e,features:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}oe(String(e),s),r.body.inheritedFeatures!==void 0&&ie(String(e),r.body.inheritedFeatures),r.body.capabilities!==void 0&&ae(String(e),r.body.capabilities),r.body.capabilitiesInherited!==void 0&&de(String(e),r.body.capabilitiesInherited),d.info("[instance/features] \u80FD\u529B\u5F00\u5173\u5DF2\u66F4\u65B0",{agentId:String(e),features:x(String(e)),inheritedFeatures:ce(String(e))});let n=0;for(const o of Y.getAll())if(typeof o.applyAgentFeatures=="function")try{await o.applyAgentFeatures(String(e)),n+=1}catch(a){d.error("[instance/features] adapter \u70ED\u540C\u6B65\u5931\u8D25",{agentId:String(e),providerId:o.providerId,error:a?.message||String(a)})}t.json({ok:!0,agentId:String(e),features:x(String(e)),hotSyncedAdapters:n})}),g.post("/cc-switch/state",h,async(r,t)=>{const{agentId:e}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}try{d.info("[cc-switch/state] Request received",{agentId:String(e)});const s=await U(e),n=ke(s.enabledTools||[]);d.info("[cc-switch/state] Detecting SDK statuses",{agentId:String(e),detectionTargets:n});const o=await E(n),a=await fe.listDeployed(),i=he.listDeployed(),l=pe.listDeployed(),f=j(e,"skills"),S=j(e,"mcp"),u=j(e,"plugins"),p=i.map(c=>({...c,enabled:v(e,"skills",c.skillName),source:f[c.skillName]!==void 0?"agent":"bridge"})),y=l.map(c=>({...c,enabled:v(e,"mcp",c.name),source:S[c.name]!==void 0?"agent":"bridge"})),b=a.map(c=>({...c,enabled:v(e,"plugins",c.pluginName),source:u[c.pluginName]!==void 0?"agent":"bridge"}));d.info("[cc-switch/state] SDK status detection completed",{agentId:String(e),toolStatus:Oe(o)}),t.json({ok:!0,agentId:String(e),imported:{mcpServers:0,skills:0},deployedPlugins:b,deployedSkills:p,deployedMcp:y,state:{...s,toolStatus:o}})}catch(s){const n=s;d.error("[cc-switch/state] Failed to load state",{agentId:String(e),error:n?.message||String(s),stack:n?.stack||null}),t.status(400).json({error:n?.message||"load state failed"})}}),g.post("/tools/install",h,async(r,t)=>{const{agentId:e,tools:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}const n=Array.isArray(s)?s.map(i=>String(i||"").trim().toLowerCase()).filter(Boolean):[],o=new Set(F),a=n.filter(i=>o.has(i));if(a.length===0){t.status(400).json({error:`tools must include ${F.join(", ")}`});return}try{const i=await U(e),l=Array.from(new Set([...i.enabledTools||[],...a])),f=await Se(a),u={...await E(l),...f},p=await L(e,{...i,enabledTools:l,toolStatus:u}),y=new Set(a),b=Object.entries(u).filter(([c])=>y.has(c)).filter(([,c])=>!c.installed).map(([c,B])=>({tool:c,error:B.error||null}));t.json({ok:b.length===0,agentId:String(e),toolStatus:u,failedTools:b,state:p})}catch(i){const l=i;t.status(400).json({error:l?.message||"install tools failed"})}}),g.post("/tools/uninstall",h,async(r,t)=>{const{agentId:e,tools:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}const n=Array.isArray(s)?s.map(i=>String(i||"").trim().toLowerCase()).filter(Boolean):[],o=new Set(D),a=n.filter(i=>o.has(i));if(a.length===0){t.status(400).json({error:`tools must include ${D.join(", ")}`});return}try{const i=await U(e),l=new Set(a),f=(i.enabledTools||[]).filter(B=>!l.has(String(B||"").trim().toLowerCase())),S=await ye(a),p={...await E([...f,...a]),...S},y=a.filter(B=>p[B]?.installed),b=y.length>0?i.enabledTools||[]:f,c=await L(e,{...i,enabledTools:b,toolStatus:p});if(y.length>0){t.status(400).json({ok:!1,agentId:String(e),error:"uninstall incomplete",toolStatus:p,state:c});return}t.json({ok:!0,agentId:String(e),toolStatus:p,state:c})}catch(i){const l=i;t.status(400).json({error:l?.message||"uninstall tools failed"})}}),g.post("/prepare-restart",h,async(r,t)=>{const{preserveSessions:e=!0}=r.body||{};try{d.info(`[prepare-restart] \u6536\u5230\u51C6\u5907\u91CD\u542F\u901A\u77E5\uFF0CpreserveSessions=${e}`),await X(!!e),t.json({ok:!0,preserveSessions:e,message:e?"Bridge will preserve sessions for aws-mcp-server restart":"Bridge will clean up sessions on shutdown"})}catch(s){const n=s;d.error("[prepare-restart] Error:",n),t.status(500).json({error:n.message})}});const Ce={update:15*60*1e3,restart:5*60*1e3};async function xe(r){try{const t=await ue(),e=Date.now(),s=Ce[r],n=[];for(const o of t.operations){if(o.operationType!==r||!["accepted","running","restarting"].includes(o.status))continue;const a=new Date(o.updatedAt).getTime();if(!Number.isNaN(a)&&e-a<=s)return{operationId:o.operationId};n.push(o.operationId)}for(const o of n)try{await ge(o),d.info(`[${r}-bridge] \u5DF2\u6E05\u7406\u8D85\u65F6\u672A\u4EA4\u4ED8\u7684\u9648\u65E7\u64CD\u4F5C: ${o}`)}catch(a){const i=a;d.warn(`[${r}-bridge] \u6E05\u7406\u9648\u65E7\u64CD\u4F5C\u5931\u8D25\uFF0C\u7EE7\u7EED\u653E\u884C: ${o}, ${i.message}`)}return null}catch(t){const e=t;return d.warn(`[${r}-bridge] \u5728\u9014\u64CD\u4F5C\u68C0\u67E5\u5931\u8D25\uFF0C\u653E\u884C\u8BF7\u6C42: ${e.message}`),null}}async function H(r,t,e){const s=await xe(r);return s?(e.status(409).json({error:t,operationId:s.operationId}),!0):!1}g.post("/update-bridge",T,async(r,t)=>{const e=M(r.body?.requestedByUserId);try{if(!e){t.status(400).json({error:"requestedByUserId is required"});return}if(await H("update","\u5B9E\u4F8B Bridge \u66F4\u65B0\u6B63\u5728\u6267\u884C\u4E2D\uFF0C\u8BF7\u52FF\u91CD\u590D\u89E6\u53D1",t))return;const s=await N(),n=P({operationType:"update",requestedByUserId:e,schedulerBaseUrl:r.body?.schedulerBaseUrl,runtimeBridgeBaseUrl:K(r),status:"accepted",message:"Bridge \u66F4\u65B0\u8BF7\u6C42\u5DF2\u6536\u5230\uFF0C\u5C06\u5728\u540E\u53F0\u6267\u884C\u5E76\u81EA\u52A8\u91CD\u542F\u3002",latestVersion:s.ok&&s.latestVersion||void 0});await k(n),Re(n),t.json({ok:!0,operationId:n.operationId,message:"Bridge \u66F4\u65B0\u5DF2\u5728\u540E\u53F0\u5F00\u59CB\uFF0C\u66F4\u65B0\u5B8C\u6210\u540E\u5C06\u81EA\u52A8\u91CD\u542F\u5B9E\u4F8B Bridge\u3002"})}catch(s){const n=s;d.error("[update-bridge] Error:",n),t.status(500).json({error:n.message||"update bridge failed"})}}),g.post("/restart-bridge",T,async(r,t)=>{const{preserveSessions:e=!0}=r.body||{},s=M(r.body?.requestedByUserId);try{if(!s){t.status(400).json({error:"requestedByUserId is required"});return}if(await H("restart","\u5B9E\u4F8B Bridge \u6B63\u5728\u91CD\u542F\u4E2D\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5",t))return;d.info(`[restart-bridge] \u6536\u5230\u5B9E\u4F8B Bridge \u91CD\u542F\u8BF7\u6C42\uFF0CpreserveSessions=${e}`);const n=P({operationType:"restart",requestedByUserId:s,schedulerBaseUrl:r.body?.schedulerBaseUrl,runtimeBridgeBaseUrl:K(r),status:"accepted",message:"Bridge \u5DF2\u6536\u5230\u91CD\u542F\u8BF7\u6C42\uFF1B\u4E0B\u6B21\u542F\u52A8\u540E\u4F1A\u53D1\u9001\u786E\u8BA4\u901A\u77E5\u3002"});await k(n),await X(!!e),t.json({ok:!0,operationId:n.operationId,preserveSessions:!!e,message:"Bridge \u6B63\u5728\u91CD\u542F\uFF0C\u670D\u52A1\u7BA1\u7406\u5668\u4F1A\u81EA\u52A8\u62C9\u8D77\u5B9E\u4F8B\uFF1B\u4E0B\u6B21\u542F\u52A8\u540E\u4F1A\u901A\u8FC7\u6D88\u606F\u4E2D\u5FC3\u901A\u77E5\u7ED3\u679C\u3002"}),d.info("[restart-bridge] \u6B63\u5728\u6267\u884C awsb service restart"),z(),setTimeout(()=>{if(process.exitCode=42,I){I("PANEL_RESTART",!!e).catch(o=>{const a=o;d.error("[restart-bridge] graceful shutdown failed:",a),process.exit(42)});return}process.exit(42)},V)}catch(n){const o=n;d.error("[restart-bridge] Error:",o),t.status(500).json({error:o.message||"restart bridge failed"})}});export{_e as buildAmbiguousSchedulerBaseUrlResponse,je as buildConnectionCheckResponse,Ue as buildSchedulerPingFailureResponse,g as instanceRouter,it as setGracefulShutdownFn,Oe as summarizeToolStatus};
1
+ import{spawn as _}from"node:child_process";import{createHash as ee,timingSafeEqual as te}from"node:crypto";import re from"node:fs/promises";import k from"node:path";import{fileURLToPath as C}from"node:url";import O from"axios";import{Router as se}from"express";import{adapterRegistry as ne}from"../adapter/index.js";import{getBridgeVersion as T,isDesktopAppMode as oe,resolveSchedulerBaseUrlFrom as x}from"../config.js";import{validateToken as m,validateTokenOrPanelSession as R}from"../middleware/auth.js";import{registerAgentOwner as ae}from"../services/agent-ownership.js";import{getConfiguredConnectionKeys as L,getRegistrationState as ie,listConfiguredTargetSummaries as de,requestRuntimeAccessTokenRefreshForServer as ce,resolveTargetIdentityFromToken as P}from"../services/auto-register.js";import{getEffective as j,getOverrides as U}from"../services/capability-config.js";import{appendChangelogSection as le,readChangelog as ue}from"../services/changelog.js";import{rotateConnectionKeyFromServer as ge}from"../services/connection-key-rotation.js";import{setAgentFeatures as pe,setAgentCapabilities as fe,setAgentInheritedFeatures as me,setAgentCapabilitiesInherited as he,getAgentFeatures as F,getAgentInheritedFeatures as ye}from"../services/instance-features.js";import{initInstance as Se}from"../services/instance-init-service.js";import{loadInstanceState as A,saveInstanceState as $}from"../services/instance-state.js";import{createBridgeLifecycleOperation as D,deliverPendingBridgeLifecycleNotifications as K,loadLifecycleState as we,removeBridgeLifecycleOperation as be,upsertBridgeLifecycleOperation as B}from"../services/lifecycle-state.js";import{McpDeployManager as Ie}from"../services/mcp-deploy.js";import{pluginManager as ke}from"../services/plugin-manager.js";import{getRuntimeAccessToken as Be}from"../services/runtime-binding.js";import{SkillManager as ve}from"../services/skill-manager.js";import{detectToolStatuses as E,ensureToolsInstalled as Te,SUPPORTED_INSTALLABLE_TOOLS as M,SUPPORTED_UNINSTALLABLE_TOOLS as N,uninstallTools as Re}from"../services/tool-installer.js";import{appendUpdateLog as y,readUpdateLog as je}from"../services/update-log.js";import{getUserScopeOrThrow as X,requireUserScope as q}from"../services/user-scope.js";import{createLogger as Ue}from"../utils/logger.js";import{checkBridgeUpdate as z}from"../utils/npm-version.js";import{serverUrlOfTargetKey as Ae}from"../utils/target-identity.js";const d=Ue("instance");import{buildToolStatusDetectionTargets as Ee}from"./instance-tool-status.js";let v=null;function bt(r){v=r}const l=se();function H(r){return String(r||"").trim()||void 0}function V(r){const t=r.get("host");if(t)return`${r.protocol}://${t}`}function W(){const r=k.resolve(k.dirname(C(import.meta.url)),"..","..");return k.join(r,"dist","index.js")}function _e(){return new Promise((r,t)=>{const e=_(process.execPath,[W(),"update","--no-kill"],{shell:!1,windowsHide:!0});let s="",n="";e.stdout.on("data",o=>{s+=o.toString("utf8")}),e.stderr.on("data",o=>{n+=o.toString("utf8")}),e.on("error",t),e.on("close",o=>{r({exitCode:o,stdout:s,stderr:n})})})}function G(){const r=_(process.execPath,[W(),"service","restart"],{shell:!1,windowsHide:!0,stdio:["ignore","pipe","pipe"]});r.stdout.on("data",t=>{y(String(t)).catch(()=>{})}),r.stderr.on("data",t=>{y(String(t)).catch(()=>{})})}async function Ce(){try{const r=k.join(k.dirname(k.dirname(C(import.meta.url))),"package.json"),t=JSON.parse(await re.readFile(r,{encoding:"utf8"}));return(typeof t.version=="string"?t.version.trim():"")||null}catch{return null}}const J=3e3;async function Oe(r){const t={...r,status:"running",message:"Bridge \u66F4\u65B0\u6B63\u5728\u540E\u53F0\u6267\u884C\u3002"};await B(t);try{d.info("[update-bridge] \u6B63\u5728\u540E\u53F0\u6267\u884C awsb update --yes"),await y(`===== Bridge \u66F4\u65B0\u5F00\u59CB\uFF1Av${T()} -> latest\uFF08\u64CD\u4F5C ${r.operationId}\uFF09 =====`);const e=await _e();if(e.stdout&&await y(e.stdout),e.stderr&&await y(e.stderr),e.exitCode===0){const s=await Ce(),n=r.latestVersion||s||T();await le(n,`Bridge \u5DF2\u66F4\u65B0\u81F3 ${n}\u3002`).catch(a=>{const i=a;d.warn(`[update-bridge] \u8FFD\u52A0 changelog \u6BB5\u5931\u8D25\uFF08\u5DF2\u5FFD\u7565\uFF09: ${i.message}`)}),await y("===== Bridge \u66F4\u65B0\u6210\u529F\uFF0C\u51C6\u5907\u81EA\u52A8\u91CD\u542F ===== ");const o={...t,status:"restarting",message:"Bridge \u66F4\u65B0\u5B8C\u6210\uFF0C\u6B63\u5728\u91CD\u542F..."};await B(o),d.info("[update-bridge] \u6B63\u5728\u6267\u884C awsb service restart"),G(),setTimeout(()=>{if(process.exitCode=42,v){v("BRIDGE_UPDATE_RESTART",!0).catch(a=>{const i=a;d.error("[update-bridge] graceful shutdown failed:",i),process.exit(42)});return}process.exit(42)},J)}else await y(`===== Bridge \u66F4\u65B0\u5931\u8D25\uFF1A\u9000\u51FA\u7801 ${e.exitCode??"unknown"} =====`),await B({...t,status:"failed",message:`Bridge \u66F4\u65B0\u5931\u8D25\uFF0Cnpm \u9000\u51FA\u7801: ${e.exitCode??"unknown"}`,error:e.stderr||e.stdout}),await K()}catch(e){const s=e;d.error("[update-bridge] background update failed:",s),await y(`===== Bridge \u66F4\u65B0\u5F02\u5E38\uFF1A${s.message} =====`).catch(()=>{}),await B({...t,status:"failed",message:"Bridge \u66F4\u65B0\u5931\u8D25\u3002",error:s.message||"update bridge failed"}),await K()}}async function Q(r){const t=await import("node:fs/promises"),e=await import("node:path"),s=await import("node:os"),n=e.join(s.tmpdir(),"agentswork-runtime-bridge",".preserve-sessions");if(r){await t.mkdir(e.dirname(n),{recursive:!0}),await t.writeFile(n,JSON.stringify({preserveSessions:!0,timestamp:new Date().toISOString()}),"utf-8"),d.info(`[prepare-restart] \u5DF2\u521B\u5EFA\u4FDD\u7559\u4F1A\u8BDD\u6807\u8BB0\u6587\u4EF6: ${n}`);return}try{await t.unlink(n),d.info("[prepare-restart] \u5DF2\u5220\u9664\u4FDD\u7559\u4F1A\u8BDD\u6807\u8BB0\u6587\u4EF6")}catch{}}function xe(r){return ee("md5").update(r,"utf8").digest("hex")}function Le(r){const t=r.trim().toLowerCase();if(!/^[a-f0-9]{32}$/.test(t))return!1;const e=Buffer.from(t,"hex");return L().map(s=>s.trim()).filter(Boolean).some(s=>{const n=Buffer.from(xe(s),"hex");return n.length===e.length&&te(n,e)})}function Pe(r){const e=L().length>0,s=T();return e?Le(r)?{status:200,body:{ok:!0,runtimeBridge:"healthy",version:s,connectionKeyMatched:!0,connectionKeyRequired:!0}}:{status:401,body:{ok:!1,error:"connection_key_mismatch",version:s,connectionKeyMatched:!1,connectionKeyRequired:!0}}:{status:200,body:{ok:!0,runtimeBridge:"healthy",version:s,connectionKeyMatched:!0,connectionKeyRequired:!1}}}function Fe(r,t){const s=t.trim()||"http://localhost:8080",n=/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?(?:\/|$)/i.test(s);return{ok:!1,error:r.message||"scheduler ping failed",failureStage:"scheduler_ping",runtimeBridge:"healthy",schedulerBaseUrl:s,hint:n?"aws-runtime-bridge \u5DF2\u8FDE\u901A\uFF0C\u4F46\u5B83\u56DE\u8FDE\u8C03\u5EA6\u4E2D\u5FC3\u5931\u8D25\u3002\u8BF7\u5728 bridge \u542F\u52A8\u73AF\u5883\u4E2D\u5C06 AWS_RUNTIME_SCHEDULER_BASE_URL \u914D\u7F6E\u4E3A\u8BE5\u5B9E\u4F8B\u53EF\u8BBF\u95EE\u7684\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\uFF0C\u4F8B\u5982 http://<server-host>:7380\u3002":"aws-runtime-bridge \u5DF2\u8FDE\u901A\uFF0C\u4F46\u5B83\u56DE\u8FDE\u8C03\u5EA6\u4E2D\u5FC3\u5931\u8D25\u3002\u8BF7\u786E\u8BA4 AWS_RUNTIME_SCHEDULER_BASE_URL \u6307\u5411\u7684\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\u53EF\u4ECE bridge \u673A\u5668\u8BBF\u95EE\uFF0C\u5E76\u4E14\u8FD0\u884C\u65F6\u8BBF\u95EE\u4EE4\u724C\u4ECD\u6709\u6548\u3002"}}function $e(r){if(typeof r!="object"||r===null)return;const t=Reflect.get(r,"response");if(typeof t!="object"||t===null)return;const e=Reflect.get(t,"status");return typeof e=="number"?e:void 0}async function De(r,t){try{const e=await O.get(`${r}/api/runtime/ping`,{headers:{"X-Runtime-Token":t}});return{schedulerReachable:e.status>=200&&e.status<300,tokenRefreshed:!1}}catch(e){if($e(e)!==401)throw e;const s=await ce(r,P(t)?.identityKey);if(!s.success||!s.runtimeAccessToken)throw e;const n=await O.get(`${r}/api/runtime/ping`,{headers:{"X-Runtime-Token":s.runtimeAccessToken}});return{schedulerReachable:n.status>=200&&n.status<300,tokenRefreshed:!0}}}function Ke(r){return{ok:!1,error:"ambiguous_scheduler_base_url",failureStage:"scheduler_ping",runtimeBridge:"healthy",schedulerBaseUrl:"",autoRegisterTargetUrls:r,hint:"Multiple autoRegisterTargets.serverUrl values were found, so bridge cannot safely infer which scheduler /runtime/ping should call back. Set AWS_RUNTIME_SCHEDULER_BASE_URL explicitly, or use future schedulerId/token-bound multi-scheduler routing."}}function Me(r){return Object.fromEntries(Object.entries(r||{}).map(([t,e])=>[t,{installed:!!e?.installed,version:e?.version||null,executable:e?.executable||null,error:e?.error||null}]))}l.get("/check-update",async(r,t)=>{t.json(await z())}),l.get("/update-log",R,async(r,t)=>{try{const e=await je();t.json({ok:!0,...e})}catch(e){const s=e;d.error("[update-log] Error:",s),t.status(500).json({ok:!1,error:s.message||"read update log failed"})}}),l.get("/changelog",R,async(r,t)=>{const e=String(r.query?.version||"").trim();if(!e){t.status(400).json({ok:!1,error:"version is required"});return}try{const s=await ue(e);t.json({ok:!0,version:e,...s})}catch(s){const n=s;d.error("[changelog] Error:",n),t.status(500).json({ok:!1,error:n.message||"read changelog failed"})}}),l.get("/healthz",(r,t)=>{t.json({ok:!0,runtimeBridge:"healthy"})}),l.get("/connection-check",(r,t)=>{const e=String(r.header("X-Bridge-Connection-Key-MD5")||""),s=Pe(e);t.status(s.status).json(s.body)}),l.get("/server-config/summary",m,(r,t)=>{try{t.setHeader("Cache-Control","no-store"),t.json({ok:!0,targets:de()})}catch(e){const s=e;t.status(500).json({ok:!1,error:s.message||"read targets failed"})}}),l.post("/connection-key/rotate",m,async(r,t)=>{const e=r.body||{},s=x(e.serverUrl||r.header("X-Scheduler-Base-Url"),e.instanceId||r.header("X-Bridge-Instance-Id"),r.header("X-Bridge-Instance-Name")),n=await ge(e.connectionKey,{serverUrl:s.url,instanceId:String(e.instanceId||r.header("X-Bridge-Instance-Id")||"").trim(),credentialId:String(e.credentialId||"").trim()});t.status(n.status).json(n.body)}),l.get("/ping",m,async(r,t)=>{let e=x(r.header("X-Scheduler-Base-Url"),r.header("X-Bridge-Instance-Id"),r.header("X-Bridge-Instance-Name"));if(e.source==="ambiguous-auto-register-targets"){const n=P(r.header("X-Runtime-Token"));if(n)e={url:n.serverUrl,source:"token-match",ambiguousTargetUrls:[],userKey:n.userKey};else{const o=r.header("X-Bridge-Instance-Id");if(o){const a=ie(),i=Object.entries(a.registrations).find(([,u])=>u===o)?.[0];i&&(e={url:Ae(i),source:"instance-id-match",ambiguousTargetUrls:[]})}if(!e.url||e.source==="ambiguous-auto-register-targets"){t.status(400).json(Ke(e.ambiguousTargetUrls));return}}}const s=e.url;try{const n=Be(s,e.userKey);if(!n){t.status(401).json({ok:!1,error:"runtime_access_token_required"});return}const o=await De(s,n);t.json({ok:!0,runtimeBridge:"healthy",version:T(),schedulerReachable:o.schedulerReachable,tokenRefreshed:o.tokenRefreshed,schedulerBaseUrl:s,instanceId:e.instanceId,instanceName:e.instanceName})}catch(n){const o=n;t.status(502).json(Fe(o,s))}}),l.post("/init-instance",m,q,async(r,t)=>{const{agentId:e,workspacePath:s,skillEnabled:n,mcpEnabled:o,ccSwitchEnabledTools:a,skillPackage:i,skillPackages:u,pluginPackages:h,mcpServers:w}=r.body||{};if(!e||!s){t.status(400).json({error:"agentId and workspacePath are required"});return}try{const g=X(r);ae(e,g),d.info("[init-instance] Request received",{agentId:String(e),workspacePath:String(s),tenantId:g.tenantId,userId:g.userId,skillEnabled:n,mcpEnabled:o,ccSwitchEnabledTools:a});const c=await Se(e,s,{skillEnabled:n,mcpEnabled:o,ccSwitchEnabledTools:a,skillPackage:i,skillPackages:u,pluginPackages:h,mcpServers:w,scope:g});d.info("[init-instance] Initialization completed",{agentId:String(e),ok:c.ok,logCount:c.logs?.length||0,enabledTools:c.enabledTools}),t.json(c)}catch(g){const c=g;if(d.error("[init-instance] Initialization failed",{agentId:String(e),workspacePath:String(s),error:c?.message||String(g),stack:c?.stack||null}),c?.message.includes("agent-ownership-mismatch")){t.status(403).json({ok:!1,error:"agent-ownership-mismatch"});return}t.status(400).json({error:c?.message||"initialize instance failed"})}}),l.post("/features",m,async(r,t)=>{const{agentId:e,features:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}pe(String(e),s),r.body.inheritedFeatures!==void 0&&me(String(e),r.body.inheritedFeatures),r.body.capabilities!==void 0&&fe(String(e),r.body.capabilities),r.body.capabilitiesInherited!==void 0&&he(String(e),r.body.capabilitiesInherited),d.info("[instance/features] \u80FD\u529B\u5F00\u5173\u5DF2\u66F4\u65B0",{agentId:String(e),features:F(String(e)),inheritedFeatures:ye(String(e))});let n=0;for(const o of ne.getAll())if(typeof o.applyAgentFeatures=="function")try{await o.applyAgentFeatures(String(e)),n+=1}catch(a){d.error("[instance/features] adapter \u70ED\u540C\u6B65\u5931\u8D25",{agentId:String(e),providerId:o.providerId,error:a?.message||String(a)})}t.json({ok:!0,agentId:String(e),features:F(String(e)),hotSyncedAdapters:n})}),l.post("/cc-switch/state",m,q,async(r,t)=>{const{agentId:e}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}try{const s=X(r);d.info("[cc-switch/state] Request received",{agentId:String(e)});const n=await A(e),o=Ee(n.enabledTools||[]);d.info("[cc-switch/state] Detecting SDK statuses",{agentId:String(e),detectionTargets:o});const a=await E(o),i=ve.forScope(s),u=Ie.forScope(s),h=await ke.listDeployed(s),w=i.listDeployed(),g=u.listDeployed(),c=U(s,e,"skills"),b=U(s,e,"mcp"),I=U(s,e,"plugins"),f=w.map(p=>({...p,enabled:j(s,e,"skills",p.skillName),source:c[p.skillName]!==void 0?"agent":"bridge"})),S=g.map(p=>({...p,enabled:j(s,e,"mcp",p.name),source:b[p.name]!==void 0?"agent":"bridge"})),Z=h.map(p=>({...p,enabled:j(s,e,"plugins",p.pluginName),source:I[p.pluginName]!==void 0?"agent":"bridge"}));d.info("[cc-switch/state] SDK status detection completed",{agentId:String(e),toolStatus:Me(a)}),t.json({ok:!0,agentId:String(e),imported:{mcpServers:0,skills:0},deployedPlugins:Z,deployedSkills:f,deployedMcp:S,state:{...n,toolStatus:a}})}catch(s){const n=s;d.error("[cc-switch/state] Failed to load state",{agentId:String(e),error:n?.message||String(s),stack:n?.stack||null}),t.status(400).json({error:n?.message||"load state failed"})}}),l.post("/tools/install",m,async(r,t)=>{const{agentId:e,tools:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}const n=Array.isArray(s)?s.map(i=>String(i||"").trim().toLowerCase()).filter(Boolean):[],o=new Set(M),a=n.filter(i=>o.has(i));if(a.length===0){t.status(400).json({error:`tools must include ${M.join(", ")}`});return}try{const i=await A(e),u=Array.from(new Set([...i.enabledTools||[],...a])),h=await Te(a),g={...await E(u),...h},c=await $(e,{...i,enabledTools:u,toolStatus:g}),b=new Set(a),I=Object.entries(g).filter(([f])=>b.has(f)).filter(([,f])=>!f.installed).map(([f,S])=>({tool:f,error:S.error||null}));t.json({ok:I.length===0,agentId:String(e),toolStatus:g,failedTools:I,state:c})}catch(i){const u=i;t.status(400).json({error:u?.message||"install tools failed"})}}),l.post("/tools/uninstall",m,async(r,t)=>{const{agentId:e,tools:s}=r.body||{};if(!e){t.status(400).json({error:"agentId is required"});return}const n=Array.isArray(s)?s.map(i=>String(i||"").trim().toLowerCase()).filter(Boolean):[],o=new Set(N),a=n.filter(i=>o.has(i));if(a.length===0){t.status(400).json({error:`tools must include ${N.join(", ")}`});return}try{const i=await A(e),u=new Set(a),h=(i.enabledTools||[]).filter(S=>!u.has(String(S||"").trim().toLowerCase())),w=await Re(a),c={...await E([...h,...a]),...w},b=a.filter(S=>c[S]?.installed),I=b.length>0?i.enabledTools||[]:h,f=await $(e,{...i,enabledTools:I,toolStatus:c});if(b.length>0){t.status(400).json({ok:!1,agentId:String(e),error:"uninstall incomplete",toolStatus:c,state:f});return}t.json({ok:!0,agentId:String(e),toolStatus:c,state:f})}catch(i){const u=i;t.status(400).json({error:u?.message||"uninstall tools failed"})}}),l.post("/prepare-restart",m,async(r,t)=>{const{preserveSessions:e=!0}=r.body||{};try{d.info(`[prepare-restart] \u6536\u5230\u51C6\u5907\u91CD\u542F\u901A\u77E5\uFF0CpreserveSessions=${e}`),await Q(!!e),t.json({ok:!0,preserveSessions:e,message:e?"Bridge will preserve sessions for aws-mcp-server restart":"Bridge will clean up sessions on shutdown"})}catch(s){const n=s;d.error("[prepare-restart] Error:",n),t.status(500).json({error:n.message})}});const Ne={update:15*60*1e3,restart:5*60*1e3};async function Xe(r){try{const t=await we(),e=Date.now(),s=Ne[r],n=[];for(const o of t.operations){if(o.operationType!==r||!["accepted","running","restarting"].includes(o.status))continue;const a=new Date(o.updatedAt).getTime();if(!Number.isNaN(a)&&e-a<=s)return{operationId:o.operationId};n.push(o.operationId)}for(const o of n)try{await be(o),d.info(`[${r}-bridge] \u5DF2\u6E05\u7406\u8D85\u65F6\u672A\u4EA4\u4ED8\u7684\u9648\u65E7\u64CD\u4F5C: ${o}`)}catch(a){const i=a;d.warn(`[${r}-bridge] \u6E05\u7406\u9648\u65E7\u64CD\u4F5C\u5931\u8D25\uFF0C\u7EE7\u7EED\u653E\u884C: ${o}, ${i.message}`)}return null}catch(t){const e=t;return d.warn(`[${r}-bridge] \u5728\u9014\u64CD\u4F5C\u68C0\u67E5\u5931\u8D25\uFF0C\u653E\u884C\u8BF7\u6C42: ${e.message}`),null}}async function Y(r,t,e){const s=await Xe(r);return s?(e.status(409).json({error:t,operationId:s.operationId}),!0):!1}l.post("/update-bridge",R,async(r,t)=>{const e=H(r.body?.requestedByUserId);try{if(!e){t.status(400).json({error:"requestedByUserId is required"});return}if(oe()){t.status(409).json({error:"desktop_app_managed_update",message:"\u684C\u9762\u7248\u7531\u5E94\u7528\u81EA\u8EAB\u7684\u66F4\u65B0\u673A\u5236\u7BA1\u7406\uFF0C\u8BF7\u901A\u8FC7\u6258\u76D8\u83DC\u5355\u6216\u66F4\u65B0\u63D0\u793A\u5B8C\u6210\u5347\u7EA7\u3002"});return}if(await Y("update","\u5B9E\u4F8B Bridge \u66F4\u65B0\u6B63\u5728\u6267\u884C\u4E2D\uFF0C\u8BF7\u52FF\u91CD\u590D\u89E6\u53D1",t))return;const s=await z(),n=D({operationType:"update",requestedByUserId:e,schedulerBaseUrl:r.body?.schedulerBaseUrl,runtimeBridgeBaseUrl:V(r),status:"accepted",message:"Bridge \u66F4\u65B0\u8BF7\u6C42\u5DF2\u6536\u5230\uFF0C\u5C06\u5728\u540E\u53F0\u6267\u884C\u5E76\u81EA\u52A8\u91CD\u542F\u3002",latestVersion:s.ok&&s.latestVersion||void 0});await B(n),Oe(n),t.json({ok:!0,operationId:n.operationId,message:"Bridge \u66F4\u65B0\u5DF2\u5728\u540E\u53F0\u5F00\u59CB\uFF0C\u66F4\u65B0\u5B8C\u6210\u540E\u5C06\u81EA\u52A8\u91CD\u542F\u5B9E\u4F8B Bridge\u3002"})}catch(s){const n=s;d.error("[update-bridge] Error:",n),t.status(500).json({error:n.message||"update bridge failed"})}}),l.post("/restart-bridge",R,async(r,t)=>{const{preserveSessions:e=!0}=r.body||{},s=H(r.body?.requestedByUserId);try{if(!s){t.status(400).json({error:"requestedByUserId is required"});return}if(await Y("restart","\u5B9E\u4F8B Bridge \u6B63\u5728\u91CD\u542F\u4E2D\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5",t))return;d.info(`[restart-bridge] \u6536\u5230\u5B9E\u4F8B Bridge \u91CD\u542F\u8BF7\u6C42\uFF0CpreserveSessions=${e}`);const n=D({operationType:"restart",requestedByUserId:s,schedulerBaseUrl:r.body?.schedulerBaseUrl,runtimeBridgeBaseUrl:V(r),status:"accepted",message:"Bridge \u5DF2\u6536\u5230\u91CD\u542F\u8BF7\u6C42\uFF1B\u4E0B\u6B21\u542F\u52A8\u540E\u4F1A\u53D1\u9001\u786E\u8BA4\u901A\u77E5\u3002"});await B(n),await Q(!!e),t.json({ok:!0,operationId:n.operationId,preserveSessions:!!e,message:"Bridge \u6B63\u5728\u91CD\u542F\uFF0C\u670D\u52A1\u7BA1\u7406\u5668\u4F1A\u81EA\u52A8\u62C9\u8D77\u5B9E\u4F8B\uFF1B\u4E0B\u6B21\u542F\u52A8\u540E\u4F1A\u901A\u8FC7\u6D88\u606F\u4E2D\u5FC3\u901A\u77E5\u7ED3\u679C\u3002"}),d.info("[restart-bridge] \u6B63\u5728\u6267\u884C awsb service restart"),G(),setTimeout(()=>{if(process.exitCode=42,v){v("PANEL_RESTART",!!e).catch(o=>{const a=o;d.error("[restart-bridge] graceful shutdown failed:",a),process.exit(42)});return}process.exit(42)},J)}catch(n){const o=n;d.error("[restart-bridge] Error:",o),t.status(500).json({error:o.message||"restart bridge failed"})}});export{Ke as buildAmbiguousSchedulerBaseUrlResponse,Pe as buildConnectionCheckResponse,Fe as buildSchedulerPingFailureResponse,l as instanceRouter,bt as setGracefulShutdownFn,Me as summarizeToolStatus};
2
2
 
@@ -1,2 +1,6 @@
1
1
 
2
+
3
+
4
+
5
+
2
6
  export declare const jdksRouter: import("express-serve-static-core").Router;
@@ -1,4 +1,9 @@
1
1
 
2
+
3
+
4
+
5
+
6
+
2
7
  export declare const launchRouter: import("express-serve-static-core").Router;
3
8
 
4
9
  export declare const MAX_START_WAIT_MS = 300000;
@@ -0,0 +1,11 @@
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+ export declare const lspProvidersRouter: import("express-serve-static-core").Router;
@@ -0,0 +1,2 @@
1
+ import{Router as a}from"express";import{validateToken as e}from"../middleware/auth.js";import{listLspProcesses as n}from"../routes/lsp.js";import{getLspInstallTask as p,installLspProvider as d,isInstallBusy as l,listLspInstallTasks as u,uninstallLspProvider as m}from"../services/lsp/install-manager.js";import{listProviderSummaries as c}from"../services/lsp/provider-registry.js";import{createLogger as v}from"../utils/logger.js";const g=v("lsp-providers"),i=a();i.get("/lsp/providers",e,async(t,r)=>{try{const s=await c();r.json({ok:!0,providers:s,installTasks:u(),busy:l()})}catch(s){r.status(500).json({error:s.message})}}),i.post("/lsp/providers/install",e,async(t,r)=>{const s=String(t.body?.providerId||"").trim().toLowerCase();if(!s){r.status(400).json({error:"providerId is required"});return}try{const o=await d(s,{registry:String(t.body?.registry||"").trim()||void 0});r.json({ok:o.phase==="done",task:o})}catch(o){g.warn(`[lsp-providers] \u5B89\u88C5\u5931\u8D25 provider=${s}: ${o.message}`),r.status(400).json({error:o.message})}}),i.post("/lsp/providers/uninstall",e,async(t,r)=>{const s=String(t.body?.providerId||"").trim().toLowerCase();if(!s){r.status(400).json({error:"providerId is required"});return}try{const o=await m(s);r.json({ok:!0,task:o})}catch(o){r.status(400).json({error:o.message})}}),i.get("/lsp/providers/task/:providerId",e,(t,r)=>{const s=p(t.params.providerId);if(!s){r.status(404).json({error:"task not found"});return}r.json({ok:!0,task:s})}),i.get("/lsp/processes",e,(t,r)=>{r.json({ok:!0,processes:n()})});export{i as lspProvidersRouter};
2
+
@@ -1,6 +1,47 @@
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
1
15
  import type { IncomingMessage } from "node:http";
2
16
  import type { Socket } from "node:net";
17
+ import { type LspProviderSpec } from "../services/lsp/provider-registry.js";
18
+ interface LspSocketContext {
19
+ workspacePath: string;
20
+ filePath: string;
21
+ language: string;
22
+ providerId: string;
23
+ clientId: string;
24
+ }
25
+
26
+ export declare function resolveLspSocketContext(requestUrl: URL): {
27
+ ctx: LspSocketContext;
28
+ provider: LspProviderSpec | null;
29
+ error?: string;
30
+ };
31
+
32
+
33
+
3
34
 
4
35
  export declare function attachLspWebSocketServer(server: {
5
36
  on: (event: "upgrade", listener: (request: IncomingMessage, socket: Socket, head: Buffer) => void) => unknown;
6
37
  }): void;
38
+
39
+ export declare function listLspProcesses(): Array<{
40
+ key: string;
41
+ providerId: string;
42
+ running: boolean;
43
+ connected: boolean;
44
+ }>;
45
+
46
+ export declare function disposeAllLspProcesses(): void;
47
+ export {};