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,6 +1,6 @@
1
- import m from"node:crypto";import o from"node:fs";import u from"node:path";import{getRuntimeHomeDir as w}from"../config.js";import{createLogger as R}from"../utils/logger.js";const g=R("runtime-binding"),b="sha256",x=v();function v(){const e=m.randomInt(0,1e6);return String(e).padStart(6,"0").replace(/(\d{3})(\d{3})/,"$1-$2")}function a(){return u.join(w(),".aws-bridge")}function p(){return u.join(a(),"binding.json")}function S(){return u.join(a(),"runtime-tokens.properties")}function T(e){return m.createHash(b).update(e,"utf8").digest("hex")}function $(e,t){const n=Buffer.from(e,"hex"),r=Buffer.from(t,"hex");return n.length!==r.length?!1:m.timingSafeEqual(n,r)}function H(e,t){const n=Buffer.from(e,"utf8"),r=Buffer.from(t,"utf8");return n.length!==r.length?!1:m.timingSafeEqual(n,r)}function d(e){return String(e||"").trim()}function I(e){return e.replace(/^((?:https?|wss?):\/\/(?:\[[^\]]+\]|[^/:?#]+):\d+):\d+(?=\/|$)/i,"$1")}function U(e){const t=e.toLowerCase();return t==="localhost"||t==="::1"||t==="[::1]"?"127.0.0.1":t}function f(e){const t=d(e);if(!t)return;const n=I(t);try{const r=new URL(n);return r.protocol==="ws:"?r.protocol="http:":r.protocol==="wss:"?r.protocol="https:":r.protocol=r.protocol.toLowerCase(),r.hostname=U(r.hostname),r.origin}catch{return n.replace(/\/+$/,"")}}function z(){return x}function L(){return p()}function N(){return S()}function F(e){const t=f(e);if(t)return t;const n=String(e||"").trim();return n?n.replace(/\/+$/,"").toLowerCase():""}function y(e){const t=F(e);if(!t)throw new Error("serverBaseUrl is required to build runtime token key");return m.createHash("md5").update(t,"utf8").digest("hex")}function k(){const e=new Map;try{const t=o.readFileSync(S(),"utf8");for(const n of t.split(/\r?\n/)){const r=n.trim();if(!r||r.startsWith("#"))continue;const i=r.indexOf("=");if(i<=0)continue;const s=r.slice(0,i).trim(),c=r.slice(i+1).trim();s&&c&&e.set(s,c)}}catch{}return e}function B(e){o.mkdirSync(a(),{recursive:!0});const t=[...e.entries()].sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>`${n}=${r}`);o.writeFileSync(S(),`${t.join(`
1
+ import m from"node:crypto";import c from"node:fs";import a from"node:path";import{getRuntimeHomeDir as T}from"../config.js";import{createLogger as U}from"../utils/logger.js";import{normalizeSchedulerUrl as F}from"../utils/scheduler-url.js";import{buildTargetKey as I,fingerprintUserKey as H}from"../utils/target-identity.js";const g=U("runtime-binding"),A="sha256",b=K();function K(){const e=m.randomInt(0,1e6);return String(e).padStart(6,"0").replace(/(\d{3})(\d{3})/,"$1-$2")}function d(){return a.join(T(),".aws-bridge")}function h(){return a.join(d(),"binding.json")}function S(){return a.join(d(),"runtime-tokens.properties")}function w(e){return m.createHash(A).update(e,"utf8").digest("hex")}function E(e,n){const t=Buffer.from(e,"hex"),r=Buffer.from(n,"hex");return t.length!==r.length?!1:m.timingSafeEqual(t,r)}function O(e,n){const t=Buffer.from(e,"utf8"),r=Buffer.from(n,"utf8");return t.length!==r.length?!1:m.timingSafeEqual(t,r)}function p(e){return String(e||"").trim()}function f(e){return F(e)}function M(){return b}function W(){return h()}function G(){return S()}function y(e){const n=f(e);if(n)return n;const t=String(e||"").trim();return t?t.replace(/\/+$/,"").toLowerCase():""}function R(e){const n=y(e);if(!n)throw new Error("serverBaseUrl is required to build runtime token key");return m.createHash("md5").update(n,"utf8").digest("hex")}function x(e,n){const t=y(e);if(!t)throw new Error("serverBaseUrl is required to build runtime token key");return I(t,n)}function k(){const e=new Map;try{const n=c.readFileSync(S(),"utf8");for(const t of n.split(/\r?\n/)){const r=t.trim();if(!r||r.startsWith("#"))continue;const i=r.indexOf("=");if(i<=0)continue;const o=r.slice(0,i).trim(),s=r.slice(i+1).trim();o&&s&&e.set(o,s)}}catch{}return e}function B(e){c.mkdirSync(d(),{recursive:!0});const n=[...e.entries()].sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>`${t}=${r}`);c.writeFileSync(S(),`${n.join(`
2
2
  `)}
3
- `,{encoding:"utf8",mode:384})}function A(e){const t=d(e.accessToken);if(t.length<16)throw new Error("accessToken must be at least 16 characters");const n=y(e.serverBaseUrl),r=k();return r.set(n,t),B(r),n}function O(e){if(e)try{const t=y(e);return k().get(t)}catch{return}}function _(e){if(!e)return!1;try{const t=y(e),n=k(),r=n.delete(t);return r&&B(n),r}catch{return!1}}function j(e){if(!e)return!1;for(const t of k().values())if(H(e,t))return!0;return!1}function l(){try{const e=o.readFileSync(p(),"utf8"),t=JSON.parse(e);if(t?.status==="paired"&&t.tokenHash)return{...t,schedulerBaseUrl:f(t.schedulerBaseUrl)||t.schedulerBaseUrl}}catch{}return{status:"unpaired"}}function J(){const e=l(),t={...e};return delete t.tokenHash,delete t.accessToken,{...t,paired:e.status==="paired"}}function K(){const e=l();return e.status==="paired"&&!!e.tokenHash}function M(e){const t=d(e);if(!t)return!1;const n=l();return n.status==="paired"&&n.tokenHash&&$(T(t),n.tokenHash)?!0:j(t)}function G(e){const t=O(e);if(t)return t;const n=l();if(n.status==="paired"){if(e){const r=f(e),i=f(n.schedulerBaseUrl);return r&&i&&r===i&&d(n.accessToken)||void 0}return d(n.accessToken)||void 0}}function W(e){return String(e||"").trim()===x}function Q(e){const t=d(e.accessToken);if(t.length<16)throw new Error("accessToken must be at least 16 characters");const n=l(),r=f(e.schedulerBaseUrl)||f(n.schedulerBaseUrl),i=new Date().toISOString(),s={status:"paired",instanceId:e.instanceId?String(e.instanceId):n.instanceId,userId:e.userId?String(e.userId):n.userId,schedulerBaseUrl:r,accessToken:t,tokenHash:T(t),createdAt:n.createdAt||i,updatedAt:i};if(o.mkdirSync(a(),{recursive:!0}),o.writeFileSync(p(),`${JSON.stringify(s,null,2)}
4
- `,{encoding:"utf8",mode:384}),s.schedulerBaseUrl){const c=A({serverBaseUrl:s.schedulerBaseUrl,accessToken:t});g.info(`[runtime-bridge] scoped runtime token saved: key=${c}`)}return g.info(`[runtime-bridge] runtime binding saved: ${p()}`),s}function V(){const t={...l(),status:"unpaired",accessToken:void 0,tokenHash:void 0,revokedAt:new Date().toISOString(),updatedAt:new Date().toISOString()};o.mkdirSync(a(),{recursive:!0}),o.writeFileSync(p(),`${JSON.stringify(t,null,2)}
5
- `,{encoding:"utf8",mode:384}),g.info("[runtime-bridge] runtime binding cleared")}function X(){const e=w(),t=u.join(e,".agentswork","runtime-bridge"),n=a();if(t===n||!o.existsSync(t))return;const r=["binding.json","runtime-tokens.properties"];let i=0;for(const s of r){const c=u.join(t,s),h=u.join(n,s);if(o.existsSync(c)&&!o.existsSync(h)){o.mkdirSync(n,{recursive:!0}),o.copyFileSync(c,h);try{o.chmodSync(h,384)}catch{}i++,g.info(`[runtime-bridge] \u5DF2\u8FC1\u79FB ${c} \u2192 ${h}`)}}i>0&&g.info(`[runtime-bridge] \u5DF2\u8FC1\u79FB ${i} \u4E2A\u914D\u7F6E\u6587\u4EF6\u4ECE ${t} \u5230 ${n}`)}export{y as buildRuntimeTokenKey,V as clearRuntimeBinding,_ as clearScopedRuntimeAccessToken,G as getRuntimeAccessToken,L as getRuntimeBindingFilePath,J as getRuntimeBindingPublicState,z as getRuntimePairingCode,N as getRuntimeTokenStoreFilePath,O as getScopedRuntimeAccessToken,K as hasRuntimeBinding,l as loadRuntimeBinding,X as migrateOldBindingDir,f as normalizeSchedulerBaseUrl,Q as saveRuntimeBinding,A as saveScopedRuntimeAccessToken,M as validateRuntimeBindingToken,W as validateRuntimePairingCode};
3
+ `,{encoding:"utf8",mode:384})}function j(e){const n=p(e.accessToken);if(n.length<16)throw new Error("accessToken must be at least 16 characters");const t=x(e.serverBaseUrl,e.userKey),r=k();return r.set(t,n),B(r),t}function D(e,n){if(e)try{const t=k(),r=x(e,n),i=t.get(r);if(i)return i;if(!!String(n||"").trim())return;const s=v(e);return s.length===1?s[0].accessToken:s.length>1?void 0:t.get(R(e))}catch{return}}function v(e){const n=y(e);if(!n)return[];const t=[],r=`${n}#`;for(const[i,o]of k().entries())i.startsWith(r)&&t.push({userKeyFingerprint:i.slice(r.length),accessToken:o});return t}function Q(e,n){if(!e)return!1;try{const t=k(),r=t.delete(x(e,n)),i=String(n||"").trim()?!1:t.delete(R(e));return(r||i)&&B(t),r||i}catch{return!1}}function q(e){if(!e)return!1;for(const n of k().values())if(O(e,n))return!0;return!1}function l(){try{const e=c.readFileSync(h(),"utf8"),n=JSON.parse(e);if(n?.status==="paired"&&n.tokenHash)return{...n,schedulerBaseUrl:f(n.schedulerBaseUrl)||n.schedulerBaseUrl}}catch{}return{status:"unpaired"}}function V(){const e=l(),n={...e};return delete n.tokenHash,delete n.accessToken,{...n,paired:e.status==="paired"}}function X(){const e=l();return e.status==="paired"&&!!e.tokenHash}function Y(e){const n=p(e);if(!n)return!1;const t=l();return t.status==="paired"&&t.tokenHash&&E(w(n),t.tokenHash)?!0:q(n)}function Z(e,n){const t=D(e,n);if(t)return t;const r=l();if(r.status==="paired"){if(e){const i=f(e),o=f(r.schedulerBaseUrl);if(i&&o&&i===o){if(String(n||"").trim()){const s=v(i),u=new Set(s.map($=>$.userKeyFingerprint));if(u.size>1&&!u.has(H(n)))return}return p(r.accessToken)||void 0}return}return p(r.accessToken)||void 0}}function ee(e){return String(e||"").trim()===b}function ne(e){const n=p(e.accessToken);if(n.length<16)throw new Error("accessToken must be at least 16 characters");const t=l(),r=f(e.schedulerBaseUrl)||f(t.schedulerBaseUrl),i=new Date().toISOString(),o={status:"paired",instanceId:e.instanceId?String(e.instanceId):t.instanceId,userId:e.userId?String(e.userId):t.userId,schedulerBaseUrl:r,accessToken:n,tokenHash:w(n),createdAt:t.createdAt||i,updatedAt:i};if(c.mkdirSync(d(),{recursive:!0}),c.writeFileSync(h(),`${JSON.stringify(o,null,2)}
4
+ `,{encoding:"utf8",mode:384}),o.schedulerBaseUrl){const s=j({serverBaseUrl:o.schedulerBaseUrl,accessToken:n,userKey:e.userKey});g.info(`[runtime-bridge] scoped runtime token saved: key=${s}`+(e.userKey?` (userKey=****${String(e.userKey).slice(-4)})`:""))}return g.info(`[runtime-bridge] runtime binding saved: ${h()}`),o}function te(){const n={...l(),status:"unpaired",accessToken:void 0,tokenHash:void 0,revokedAt:new Date().toISOString(),updatedAt:new Date().toISOString()};c.mkdirSync(d(),{recursive:!0}),c.writeFileSync(h(),`${JSON.stringify(n,null,2)}
5
+ `,{encoding:"utf8",mode:384}),g.info("[runtime-bridge] runtime binding cleared")}function re(){const e=T(),n=a.join(e,".agentswork","runtime-bridge"),t=d();if(n===t||!c.existsSync(n))return;const r=["binding.json","runtime-tokens.properties"];let i=0;for(const o of r){const s=a.join(n,o),u=a.join(t,o);if(c.existsSync(s)&&!c.existsSync(u)){c.mkdirSync(t,{recursive:!0}),c.copyFileSync(s,u);try{c.chmodSync(u,384)}catch{}i++,g.info(`[runtime-bridge] \u5DF2\u8FC1\u79FB ${s} \u2192 ${u}`)}}i>0&&g.info(`[runtime-bridge] \u5DF2\u8FC1\u79FB ${i} \u4E2A\u914D\u7F6E\u6587\u4EF6\u4ECE ${n} \u5230 ${t}`)}export{R as buildLegacyRuntimeTokenKey,x as buildRuntimeTokenKey,te as clearRuntimeBinding,Q as clearScopedRuntimeAccessToken,Z as getRuntimeAccessToken,W as getRuntimeBindingFilePath,V as getRuntimeBindingPublicState,M as getRuntimePairingCode,G as getRuntimeTokenStoreFilePath,D as getScopedRuntimeAccessToken,X as hasRuntimeBinding,v as listScopedRuntimeAccessTokens,l as loadRuntimeBinding,re as migrateOldBindingDir,f as normalizeSchedulerBaseUrl,ne as saveRuntimeBinding,j as saveScopedRuntimeAccessToken,Y as validateRuntimeBindingToken,ee as validateRuntimePairingCode};
6
6
 
@@ -8,8 +8,25 @@ export interface GracefulShutdownPlan {
8
8
  stopTunnelClient: boolean;
9
9
  }
10
10
 
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
11
20
  export declare function buildGracefulShutdownPlan(preserveSessions: boolean): GracefulShutdownPlan;
12
21
 
22
+
23
+
24
+
25
+
13
26
  export declare function shouldCleanupPersistedSessionsOnStartup(preserveSessions: boolean, env?: NodeJS.ProcessEnv): boolean;
14
27
 
28
+
29
+
30
+
31
+
15
32
  export declare function shouldAutoCleanOrphanProcesses(env?: NodeJS.ProcessEnv): boolean;
@@ -1,3 +1,29 @@
1
1
 
2
2
 
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
3
29
  export declare function buildRuntimeResourcesSnapshot(agentId: string | undefined): Promise<string | null>;
@@ -1,9 +1,18 @@
1
1
  import { type ProviderEvent } from "../adapter/types.js";
2
2
 
3
+
4
+
5
+
3
6
  export declare function onSdkToolUseStart(sessionId: string, toolUseId: string | undefined, toolInput: Record<string, unknown> | undefined, toolName?: string, workspacePath?: string): void;
4
7
 
8
+
9
+
10
+
5
11
  export declare function forgetSession(sessionId: string): void;
6
12
 
13
+
14
+
15
+
7
16
  export declare function onSdkToolUseEnd(event: ProviderEvent, entry: {
8
17
  sessionId: string;
9
18
  agentId: string;
@@ -1,11 +1,23 @@
1
1
 
2
+
3
+
4
+
5
+
2
6
  import { type AxiosResponse } from "axios";
3
7
  import type { RuntimeToolBatchMetrics } from "../adapter/types.js";
4
8
  import type { Session } from "../types.js";
5
9
  import { RingBuffer, type RingBufferEntry, type RingBufferSlice } from "./ring-buffer.js";
6
10
 
11
+
12
+
13
+
7
14
  export type BridgeEventCategory = "status" | "output" | "question" | "file_changed";
8
15
 
16
+
17
+
18
+
19
+
20
+
9
21
  export interface BridgeEventPayload {
10
22
  readonly category: BridgeEventCategory;
11
23
  readonly agentId: string;
@@ -44,6 +56,11 @@ export interface BridgeEventPayload {
44
56
 
45
57
  export type { RingBufferEntry, RingBufferSlice };
46
58
 
59
+
60
+
61
+
62
+
63
+
47
64
  export declare const bridgeEventBuffer: RingBuffer<BridgeEventPayload>;
48
65
  interface RuntimeStatusActionInfo {
49
66
  actionType?: string;
@@ -68,6 +85,12 @@ export interface RuntimeCallbackAuthOptions {
68
85
  export interface RuntimeOutputMetadata {
69
86
  sourceEventType?: string;
70
87
 
88
+
89
+
90
+
91
+
92
+
93
+
71
94
  skipLocalPersist?: boolean;
72
95
  logLevel?: "info" | "warn" | "error";
73
96
  logMessage?: string;
@@ -81,6 +104,13 @@ export interface RuntimeOutputMetadata {
81
104
 
82
105
  export declare const sessions: Map<string, Session>;
83
106
 
107
+
108
+
109
+
110
+
111
+
112
+
113
+
84
114
  export declare function sendStatus(agentId: string, sessionId: string | null, status: string, actionInfo?: RuntimeStatusActionInfo, usage?: {
85
115
  inputTokens: number;
86
116
  outputTokens: number;
@@ -94,8 +124,23 @@ export declare function sendStatus(agentId: string, sessionId: string | null, st
94
124
  cacheMissTokens?: number;
95
125
  }, authOptions?: RuntimeCallbackAuthOptions, timestamp?: number, sourceEventType?: string): Promise<AxiosResponse<unknown> | undefined>;
96
126
 
127
+
128
+
129
+
130
+
131
+
132
+
133
+
97
134
  export declare function sendOutput(agentId: string, output: string, sessionId: string, seq: number, metadata?: RuntimeOutputMetadata, authOptions?: RuntimeCallbackAuthOptions, signal?: AbortSignal): Promise<void>;
98
135
 
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+
99
144
  export declare function sendQuestionRequest(agentId: string, sessionId: string, questions: unknown[], authOptions?: RuntimeCallbackAuthOptions, toolCallId?: string): Promise<void>;
100
145
  export interface RuntimeFileChangedPayload {
101
146
  bridgeBaseUrl?: string;
@@ -114,12 +159,30 @@ export interface ToolAuthRequestPayload {
114
159
  operation?: string;
115
160
  }
116
161
 
162
+
163
+
164
+
165
+
117
166
  export declare function sendToolAuthRequest(agentId: string, sessionId: string, request: ToolAuthRequestPayload, authOptions?: RuntimeCallbackAuthOptions): Promise<void>;
118
167
 
168
+
169
+
119
170
  export declare function sendFileChanged(payload: RuntimeFileChangedPayload): Promise<void>;
120
171
 
172
+
173
+
174
+
175
+
121
176
  export declare function appendSessionOutput(sessionId: string, data: string): void;
122
177
 
178
+
179
+
180
+
181
+
123
182
  export declare function scheduleOutputFlush(sessionId: string): void;
124
183
 
184
+
185
+
186
+
187
+
125
188
  export declare function flushSessionOutput(sessionId: string): Promise<void>;
@@ -1,5 +1,5 @@
1
- import h from"axios";import{resolveSchedulerBaseUrlFrom as H}from"../config.js";import{requestRuntimeAccessTokenRefreshForServer as P}from"../services/auto-register.js";import{logger as f}from"../utils/logger.js";import{agentEventStore as S}from"./agent-event-store.js";import{scheduleEventPush as $}from"./event-delta-pusher.js";import{RingBuffer as C}from"./ring-buffer.js";import{getRuntimeAccessToken as _}from"./runtime-binding.js";const B=new C(2e3);function m(t,r=y(t)){const c=t?.runtimeAccessToken||_(r)||_();return c?{"X-Runtime-Token":c}:void 0}function x(t){if(t)return{schedulerBaseUrl:t.schedulerBaseUrl}}function y(t){return H(t?.schedulerBaseUrl).url}const O=100;function w(t){if(typeof t!="object"||t===null)return;const r=t.response;if(typeof r!="object"||r===null)return;const c=r.status;return typeof c=="number"?c:void 0}let L=null;async function R(t){if(L)return L;L=(async()=>{try{const r=await P(t);return r.success&&r.runtimeAccessToken?(f.info("[session-output] Runtime token refreshed after 401"),!0):(f.warn("[session-output] Runtime token refresh failed",{error:r.error}),!1)}catch(r){return f.warn("[session-output] Runtime token refresh threw",{error:r}),!1}})();try{return await L}finally{L=null}}const E=8e3,M=64*1024,g=32*1024,A=15e3,U=new Map;async function J(t,r,c,e,i,o,u,s){const n={agentId:t,sessionId:r,status:c};u!==void 0&&(n.timestamp=u),e&&(e.actionType&&(n.actionType=e.actionType),e.actionLabel&&(n.actionLabel=e.actionLabel),e.actionDetail&&(n.actionDetail=e.actionDetail),e.actionInput&&(n.actionInput=e.actionInput),e.actionResult&&(n.actionResult=e.actionResult),e.actionError&&(n.actionError=e.actionError),e.actionId&&(n.actionId=e.actionId),e.parentId&&(n.parentId=e.parentId),e.batchId&&(n.batchId=e.batchId),e.batchMetrics&&(n.batchMetrics=e.batchMetrics)),i&&(n.inputTokens=i.inputTokens,n.outputTokens=i.outputTokens,i.contextLimit&&(n.contextLimit=i.contextLimit),i.maxOutput&&(n.maxOutput=i.maxOutput),i.inputLimit&&(n.inputLimit=i.inputLimit),i.compactionThreshold&&(n.compactionThreshold=i.compactionThreshold),i.cacheHitTokens!==void 0&&(n.cacheHitTokens=i.cacheHitTokens),i.cacheMissTokens!==void 0&&(n.cacheMissTokens=i.cacheMissTokens)),s&&(n.sourceEventType=s),process.env.ACODE_TOKEN_DEBUG==="1"&&(n.inputTokens!==void 0||n.outputTokens!==void 0||n.cacheHitTokens!==void 0||n.cacheMissTokens!==void 0)&&console.log(`[TokenDebug][SendStatus] status=${c} inputTokens=${n.inputTokens??"(none)"} outputTokens=${n.outputTokens??"(none)"} cacheHitTokens=${n.cacheHitTokens??"(none)"} cacheMissTokens=${n.cacheMissTokens??"(none)"} contextLimit=${n.contextLimit??"(none)"} actionType=${n.actionType??"(none)"}`);const a=y(o),k=m(o,a);if(!k){f.warn("Skip runtime status callback because runtime token is missing",{agentId:t,sessionId:r,status:c,schedulerBaseUrl:a});return}const p=e?.actionType==="context_compaction";p&&f.info("[compaction-diag] sendStatus enter",{agentId:t,sessionId:r,status:c,actionId:e?.actionId,parentId:e?.parentId,actionLabel:e?.actionLabel});try{const l=await h.post(`${a}/api/runtime/callback/status`,n,{headers:k,timeout:15e3});if(p){const d=l?.data;f.info("[compaction-diag] sendStatus success",{agentId:t,actionId:e?.actionId,actionLabel:e?.actionLabel,httpStatus:l?.status,ignored:d?.ignored,responseBody:d})}return l}catch(l){if(w(l)===401&&await R(a)){const T=m(x(o),a);if(T)try{const b=await h.post(`${a}/api/runtime/callback/status`,n,{headers:T,timeout:15e3});if(p){const v=b?.data;f.info("[compaction-diag] sendStatus retry success",{agentId:t,actionId:e?.actionId,actionLabel:e?.actionLabel,httpStatus:b?.status,ignored:v?.ignored})}return b}catch(b){f.warn("Runtime status callback retry failed after token refresh",{agentId:t,sessionId:r,status:c,error:b});return}}f.warn("Runtime status callback failed",{agentId:t,sessionId:r,status:c,schedulerBaseUrl:a,error:l});return}finally{const l={category:"status",agentId:t,sessionId:r,status:c,actionType:e?.actionType,actionLabel:e?.actionLabel,actionDetail:e?.actionDetail,actionInput:e?.actionInput,actionResult:e?.actionResult,actionError:e?.actionError,actionId:e?.actionId,parentId:e?.parentId,batchId:e?.batchId,batchMetrics:e?.batchMetrics,inputTokens:i?.inputTokens,outputTokens:i?.outputTokens,cacheHitTokens:i?.cacheHitTokens,cacheMissTokens:i?.cacheMissTokens,sourceEventType:s};B.append(l);const d=S.append(t,l);$(t,d,o)}}async function D(t,r,c,e,i,o,u){const s=y(o);try{const n=m(o,s);if(!n){f.warn("Skip runtime output callback because runtime token is missing",{agentId:t,sessionId:c,schedulerBaseUrl:s});return}const a={headers:n,timeout:A};u&&(a.signal=u),await h.post(`${s}/api/runtime/callback/output`,{agentId:t,output:r,sessionId:c,seq:e,...i},a)}catch(n){if(u?.aborted||n?.name==="AbortError"||n?.code==="ERR_CANCELED")throw n;if(w(n)===401&&await R(s)){const k=m(x(o),s);if(k)try{const p={headers:k,timeout:A};u&&(p.signal=u),await h.post(`${s}/api/runtime/callback/output`,{agentId:t,output:r,sessionId:c,seq:e,...i},p);return}catch{}}throw f.warn("Runtime output callback failed",{agentId:t,sessionId:c,error:n}),n}finally{if(!i?.skipLocalPersist){const n=r.length>E?`...(truncated)
2
- ${r.slice(-E)}`:r,a={category:"output",agentId:t,sessionId:c,output:n,seq:e,sourceEventType:i?.sourceEventType,logLevel:i?.logLevel,logCategory:i?.logCategory};B.appendOrMerge(a,p=>{const l=p.data;if(l.category!=="output"||l.sessionId!==c||l.sourceEventType!==i?.sourceEventType||Date.now()-p.timestamp>1e4)return!1;const d=(l.output||"").length,T=(a.output||"").length;return d+T<=E},(p,l)=>{const d=p.output||"",T=l.output||"";return d.includes(T)?p:{...p,output:`${d}${T}`}});const k=S.appendOrMergeOutput(t,a);$(t,k,o)}}}async function V(t,r,c,e,i){const o=y(e),u={agentId:t,sessionId:r,questions:c,...i?{toolCallId:i}:{}};try{const s=m(e,o);if(!s)return;await h.post(`${o}/api/runtime/callback/question`,u,{headers:s})}catch(s){if(w(s)===401&&await R(o)){const a=m(x(e),o);if(a)try{await h.post(`${o}/api/runtime/callback/question`,u,{headers:a});return}catch{}}}finally{const s={category:"question",agentId:t,sessionId:r,...i?{toolCallId:i}:{},questions:c};B.append(s);const n=S.append(t,s);$(t,n,e)}}async function Y(t,r,c,e){const i=y(e),o={agentId:t,sessionId:r,...c};try{const u=m(e,i);if(!u)return;await h.post(`${i}/api/runtime/callback/tool-auth`,o,{headers:u})}catch(u){if(w(u)===401&&await R(i)){const n=m(x(e),i);if(n)try{await h.post(`${i}/api/runtime/callback/tool-auth`,o,{headers:n});return}catch{}}}}async function Z(t){const r=y();try{const c=m(void 0,r);if(!c)return;await h.post(`${r}/api/runtime/callback/file-changed`,t,{headers:c})}catch(c){if(w(c)===401&&await R(r)){const i=m(void 0,r);if(i)try{await h.post(`${r}/api/runtime/callback/file-changed`,t,{headers:i});return}catch{}}}finally{const c={category:"file_changed",agentId:"",sessionId:null,workspacePath:t.workspacePath,filePath:t.filePath,eventType:t.eventType,size:t.size};B.append(c)}}function I(t,r){const c=U.get(t);if(!c||!r)return;const e=`${c.outputBuffer}${r}`;if(e.length<=M){c.outputBuffer=e;return}const o=`\r
1
+ import m from"axios";import{resolveSchedulerBaseUrlFrom as H}from"../config.js";import{requestRuntimeAccessTokenRefreshForServer as P,resolveTargetIdentityFromToken as C}from"../services/auto-register.js";import{logger as d}from"../utils/logger.js";import{agentEventStore as S}from"./agent-event-store.js";import{scheduleEventPush as $}from"./event-delta-pusher.js";import{RingBuffer as O}from"./ring-buffer.js";import{getRuntimeAccessToken as _}from"./runtime-binding.js";const B=new O(2e3);function k(t,n=b(t)){const c=t?.runtimeAccessToken||_(n)||_();return c?{"X-Runtime-Token":c}:void 0}function x(t){if(t)return{schedulerBaseUrl:t.schedulerBaseUrl}}function b(t){return H(t?.schedulerBaseUrl).url}const D=100;function w(t){if(typeof t!="object"||t===null)return;const n=t.response;if(typeof n!="object"||n===null)return;const c=n.status;return typeof c=="number"?c:void 0}let R=null;async function L(t,n){if(R)return R;R=(async()=>{try{const c=n?C(n)?.identityKey:void 0,e=await P(t,c);return e.success&&e.runtimeAccessToken?(d.info("[session-output] Runtime token refreshed after 401"),!0):(d.warn("[session-output] Runtime token refresh failed",{error:e.error}),!1)}catch(c){return d.warn("[session-output] Runtime token refresh threw",{error:c}),!1}})();try{return await R}finally{R=null}}const E=8e3,M=64*1024,g=32*1024,v=15e3,U=new Map;async function V(t,n,c,e,r,o,a,l){const i={agentId:t,sessionId:n,status:c};a!==void 0&&(i.timestamp=a),e&&(e.actionType&&(i.actionType=e.actionType),e.actionLabel&&(i.actionLabel=e.actionLabel),e.actionDetail&&(i.actionDetail=e.actionDetail),e.actionInput&&(i.actionInput=e.actionInput),e.actionResult&&(i.actionResult=e.actionResult),e.actionError&&(i.actionError=e.actionError),e.actionId&&(i.actionId=e.actionId),e.parentId&&(i.parentId=e.parentId),e.batchId&&(i.batchId=e.batchId),e.batchMetrics&&(i.batchMetrics=e.batchMetrics)),r&&(i.inputTokens=r.inputTokens,i.outputTokens=r.outputTokens,r.contextLimit&&(i.contextLimit=r.contextLimit),r.maxOutput&&(i.maxOutput=r.maxOutput),r.inputLimit&&(i.inputLimit=r.inputLimit),r.compactionThreshold&&(i.compactionThreshold=r.compactionThreshold),r.cacheHitTokens!==void 0&&(i.cacheHitTokens=r.cacheHitTokens),r.cacheMissTokens!==void 0&&(i.cacheMissTokens=r.cacheMissTokens)),l&&(i.sourceEventType=l),process.env.ACODE_TOKEN_DEBUG==="1"&&(i.inputTokens!==void 0||i.outputTokens!==void 0||i.cacheHitTokens!==void 0||i.cacheMissTokens!==void 0)&&console.log(`[TokenDebug][SendStatus] status=${c} inputTokens=${i.inputTokens??"(none)"} outputTokens=${i.outputTokens??"(none)"} cacheHitTokens=${i.cacheHitTokens??"(none)"} cacheMissTokens=${i.cacheMissTokens??"(none)"} contextLimit=${i.contextLimit??"(none)"} actionType=${i.actionType??"(none)"}`);const s=b(o),f=k(o,s);if(!f){d.warn("Skip runtime status callback because runtime token is missing",{agentId:t,sessionId:n,status:c,schedulerBaseUrl:s});return}const T=e?.actionType==="context_compaction";T&&d.info("[compaction-diag] sendStatus enter",{agentId:t,sessionId:n,status:c,actionId:e?.actionId,parentId:e?.parentId,actionLabel:e?.actionLabel});try{const u=await m.post(`${s}/api/runtime/callback/status`,i,{headers:f,timeout:15e3});if(T){const p=u?.data;d.info("[compaction-diag] sendStatus success",{agentId:t,actionId:e?.actionId,actionLabel:e?.actionLabel,httpStatus:u?.status,ignored:p?.ignored,responseBody:p})}return u}catch(u){if(w(u)===401&&await L(s,f?.["X-Runtime-Token"])){const y=k(x(o),s);if(y)try{const h=await m.post(`${s}/api/runtime/callback/status`,i,{headers:y,timeout:15e3});if(T){const A=h?.data;d.info("[compaction-diag] sendStatus retry success",{agentId:t,actionId:e?.actionId,actionLabel:e?.actionLabel,httpStatus:h?.status,ignored:A?.ignored})}return h}catch(h){d.warn("Runtime status callback retry failed after token refresh",{agentId:t,sessionId:n,status:c,error:h});return}}d.warn("Runtime status callback failed",{agentId:t,sessionId:n,status:c,schedulerBaseUrl:s,error:u});return}finally{const u={category:"status",agentId:t,sessionId:n,status:c,actionType:e?.actionType,actionLabel:e?.actionLabel,actionDetail:e?.actionDetail,actionInput:e?.actionInput,actionResult:e?.actionResult,actionError:e?.actionError,actionId:e?.actionId,parentId:e?.parentId,batchId:e?.batchId,batchMetrics:e?.batchMetrics,inputTokens:r?.inputTokens,outputTokens:r?.outputTokens,cacheHitTokens:r?.cacheHitTokens,cacheMissTokens:r?.cacheMissTokens,sourceEventType:l};B.append(u);const p=S.append(t,u);$(t,p,o)}}async function F(t,n,c,e,r,o,a){const l=b(o),i=k(o,l);try{if(!i){d.warn("Skip runtime output callback because runtime token is missing",{agentId:t,sessionId:c,schedulerBaseUrl:l});return}const s={headers:i,timeout:v};a&&(s.signal=a),await m.post(`${l}/api/runtime/callback/output`,{agentId:t,output:n,sessionId:c,seq:e,...r},s)}catch(s){if(a?.aborted||s?.name==="AbortError"||s?.code==="ERR_CANCELED")throw s;if(w(s)===401&&await L(l,i?.["X-Runtime-Token"])){const T=k(x(o),l);if(T)try{const u={headers:T,timeout:v};a&&(u.signal=a),await m.post(`${l}/api/runtime/callback/output`,{agentId:t,output:n,sessionId:c,seq:e,...r},u);return}catch{}}throw d.warn("Runtime output callback failed",{agentId:t,sessionId:c,error:s}),s}finally{if(!r?.skipLocalPersist){const s=n.length>E?`...(truncated)
2
+ ${n.slice(-E)}`:n,f={category:"output",agentId:t,sessionId:c,output:s,seq:e,sourceEventType:r?.sourceEventType,logLevel:r?.logLevel,logCategory:r?.logCategory};B.appendOrMerge(f,u=>{const p=u.data;if(p.category!=="output"||p.sessionId!==c||p.sourceEventType!==r?.sourceEventType||Date.now()-u.timestamp>1e4)return!1;const y=(p.output||"").length,h=(f.output||"").length;return y+h<=E},(u,p)=>{const y=u.output||"",h=p.output||"";return y.includes(h)?u:{...u,output:`${y}${h}`}});const T=S.appendOrMergeOutput(t,f);$(t,T,o)}}}async function Y(t,n,c,e,r){const o=b(e),a={agentId:t,sessionId:n,questions:c,...r?{toolCallId:r}:{}},l=k(e,o);try{if(!l)return;await m.post(`${o}/api/runtime/callback/question`,a,{headers:l})}catch(i){if(w(i)===401&&await L(o,l?.["X-Runtime-Token"])){const f=k(x(e),o);if(f)try{await m.post(`${o}/api/runtime/callback/question`,a,{headers:f});return}catch{}}}finally{const i={category:"question",agentId:t,sessionId:n,...r?{toolCallId:r}:{},questions:c};B.append(i);const s=S.append(t,i);$(t,s,e)}}async function Z(t,n,c,e){const r=b(e),o={agentId:t,sessionId:n,...c},a=k(e,r);try{if(!a)return;await m.post(`${r}/api/runtime/callback/tool-auth`,o,{headers:a})}catch(l){if(w(l)===401&&await L(r,a?.["X-Runtime-Token"])){const s=k(x(e),r);if(s)try{await m.post(`${r}/api/runtime/callback/tool-auth`,o,{headers:s});return}catch{}}}}async function I(t){const n=b(),c=k(void 0,n);try{if(!c)return;await m.post(`${n}/api/runtime/callback/file-changed`,t,{headers:c})}catch(e){if(w(e)===401&&await L(n,c?.["X-Runtime-Token"])){const o=k(void 0,n);if(o)try{await m.post(`${n}/api/runtime/callback/file-changed`,t,{headers:o});return}catch{}}}finally{const e={category:"file_changed",agentId:"",sessionId:null,workspacePath:t.workspacePath,filePath:t.filePath,eventType:t.eventType,size:t.size};B.append(e)}}function ee(t,n){const c=U.get(t);if(!c||!n)return;const e=`${c.outputBuffer}${n}`;if(e.length<=M){c.outputBuffer=e;return}const o=`\r
3
3
  [AgentsWorkStudio: omitted ${e.length-M} chars of old terminal output]\r
4
- `,u=Math.max(0,M-o.length);c.outputBuffer=`${o}${e.slice(-u)}`}function F(t){const r=U.get(t);r&&(r.flushTimer||(r.flushTimer=setTimeout(()=>{r.flushTimer=null,q(t).catch(()=>{})},O)))}async function q(t){const r=U.get(t);if(!r||r.flushInFlight||!r.outputBuffer)return;const c=r.outputBuffer.slice(0,g);r.outputBuffer=r.outputBuffer.slice(g);const e=(async()=>{const i=r.seq+1;r.seq=i,await D(r.agentId,c,t,i),U.get(t)?.outputBuffer&&F(t)})();r.flushInFlight=e;try{await e}finally{const i=U.get(t);i&&(i.flushInFlight=null)}}export{I as appendSessionOutput,B as bridgeEventBuffer,q as flushSessionOutput,F as scheduleOutputFlush,Z as sendFileChanged,D as sendOutput,V as sendQuestionRequest,J as sendStatus,Y as sendToolAuthRequest,U as sessions};
4
+ `,a=Math.max(0,M-o.length);c.outputBuffer=`${o}${e.slice(-a)}`}function X(t){const n=U.get(t);n&&(n.flushTimer||(n.flushTimer=setTimeout(()=>{n.flushTimer=null,q(t).catch(()=>{})},D)))}async function q(t){const n=U.get(t);if(!n||n.flushInFlight||!n.outputBuffer)return;const c=n.outputBuffer.slice(0,g);n.outputBuffer=n.outputBuffer.slice(g);const e=(async()=>{const r=n.seq+1;n.seq=r,await F(n.agentId,c,t,r),U.get(t)?.outputBuffer&&X(t)})();n.flushInFlight=e;try{await e}finally{const r=U.get(t);r&&(r.flushInFlight=null)}}export{ee as appendSessionOutput,B as bridgeEventBuffer,q as flushSessionOutput,X as scheduleOutputFlush,I as sendFileChanged,F as sendOutput,Y as sendQuestionRequest,V as sendStatus,Z as sendToolAuthRequest,U as sessions};
5
5
 
@@ -1,4 +1,23 @@
1
1
 
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+ import { type UserScope } from "./user-scope.js";
2
21
  export interface DeployedSkillEntry {
3
22
  skillName: string;
4
23
  zipFile: string;
@@ -16,9 +35,15 @@ export interface DeployedSkillResult {
16
35
 
17
36
  export declare function isValidSkillName(name: unknown): name is string;
18
37
  export declare class SkillManager {
38
+ private readonly scope;
19
39
  private readonly rootDir;
20
- private static _instance;
21
- static getInstance(): SkillManager;
40
+ private static instances;
41
+
42
+
43
+
44
+
45
+
46
+ static forScope(scope: UserScope): SkillManager;
22
47
  private constructor();
23
48
  private manifestFile;
24
49
  private skillDir;
@@ -26,6 +51,11 @@ export declare class SkillManager {
26
51
  private readManifest;
27
52
  private writeManifest;
28
53
 
54
+
55
+
56
+
57
+
58
+
29
59
  saveSharedSkill(zipBuffer: Buffer, originalName: string, defaultEnabled?: boolean, sha256?: string, requestedSkillName?: string): Promise<DeployedSkillResult>;
30
60
 
31
61
  removeDeployedSkill(skillName: string): Promise<{
@@ -39,6 +69,9 @@ export declare class SkillManager {
39
69
  private readPrivateManifest;
40
70
  private writePrivateManifest;
41
71
 
72
+
73
+
74
+
42
75
  savePrivateSkill(agentId: string, zipBuffer: Buffer, originalName: string, sha256?: string, requestedSkillName?: string): Promise<DeployedSkillResult>;
43
76
 
44
77
  removePrivateSkill(agentId: string, skillName: string): Promise<{
@@ -50,7 +83,11 @@ export declare class SkillManager {
50
83
 
51
84
  deployedDefaultEnabled(): Record<string, boolean>;
52
85
 
53
- private applyToKnownAgents;
86
+
87
+
88
+
89
+ private applyToUserAgents;
54
90
  }
55
- export declare const skillManager: SkillManager;
56
- export declare const reconcileSkillsDefaultsFromDeployed: () => number;
91
+
92
+ export declare function getSkillManager(scope: UserScope): SkillManager;
93
+ export declare const reconcileSkillsDefaultsFromDeployed: (scope: UserScope) => number;
@@ -1,4 +1,4 @@
1
- import{promises as F,cpSync as S,existsSync as l,mkdirSync as D,readFileSync as E,readdirSync as x,rmSync as f,writeFileSync as P}from"node:fs";import i from"node:path";import{getBridgeInstancePrivateSkillsDir as b,getBridgeInstancePrivateSkillsManifest as O,getBridgeTemplateSkillsDir as _}from"../config.js";import{extractSkillZip as z,resolveSkillSourceDirFromExtractRoot as N}from"../utils/file-utils.js";import{createLogger as J}from"../utils/logger.js";import{getSkillFarmRoot as R,syncAgentSkillFarm as j}from"./agent-capability-sync.js";import{setDeployedDefaultsProvider as T,reconcileDefaultsFromDeployed as H}from"./capability-config.js";import{getAgentInitRoot as L}from"./instance-state.js";const d=J("skill-manager");function w(v){return typeof v=="string"&&v.length>0&&v.length<=128&&/^[a-zA-Z0-9_.-]+$/.test(v)}const A=1;class ${static getInstance(){return this._instance||(this._instance=new $(i.join(_(),"deployed"))),this._instance}constructor(r){this.rootDir=r}manifestFile(){return i.join(this.rootDir,"manifest.json")}skillDir(r){const e=i.join(this.rootDir,r),t=i.resolve(this.rootDir);if(i.resolve(e)!==i.join(t,r))throw new Error(`\u6280\u80FD\u76EE\u5F55\u8D8A\u51FA\u90E8\u7F72\u533A: ${r}`);return e}isHealthy(r){return l(i.join(this.skillDir(r),"SKILL.md"))}readManifest(){try{const r=JSON.parse(E(this.manifestFile(),"utf8"));return Array.isArray(r.skills)?r.skills.filter(e=>e&&e.skillName):[]}catch{return[]}}writeManifest(r){D(this.rootDir,{recursive:!0}),P(this.manifestFile(),`${JSON.stringify({version:A,skills:r},null,2)}
2
- `,"utf8")}async saveSharedSkill(r,e,t=!0,o,g){if(!r||r.length===0)return{ok:!1,error:"zip \u5305\u5185\u5BB9\u4E3A\u7A7A"};const y=i.join(L("_tmp"),`skill-deploy-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);try{await K(r,y);const n=await N(y),a=i.basename(i.resolve(n)),M=String(e||"").replace(/\.zip$/i,"").trim(),s=g&&g.trim()||(a&&!a.startsWith("skill-deploy-")?a:"")||M;if(!w(s))return{ok:!1,error:`\u6280\u80FD\u540D\u975E\u6CD5: ${JSON.stringify(s)}`};if(!l(i.join(n,"SKILL.md")))return{ok:!1,error:`\u6280\u80FD\u5305\u7F3A\u5C11 SKILL.md: ${e}`};const c=this.readManifest().find(m=>m.skillName===s);if(c&&c.sha256===o&&this.isHealthy(s))return{ok:!0,skillName:s};D(this.rootDir,{recursive:!0});const u=this.skillDir(s),h=i.join(this.rootDir,`.old-${s}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);if(l(u))try{S(u,h,{recursive:!0})}catch{f(u,{recursive:!0,force:!0})}try{S(n,u,{recursive:!0})}catch(m){throw l(h)&&(f(u,{recursive:!0,force:!0}),S(h,u,{recursive:!0})),m}l(h)&&f(h,{recursive:!0,force:!0});const k=this.readManifest().filter(m=>m.skillName!==s);return k.push({skillName:s,zipFile:c?.zipFile??`${s}.zip`,fileName:e,defaultEnabled:t,sha256:o}),this.writeManifest(k),d.info("[shared] \u6280\u80FD\u5DF2\u90E8\u7F72\u5230 bridge: %s\uFF08\u6765\u6E90 %s%s\uFF09",s,e,o?`, sha256=${o.slice(0,12)}\u2026`:""),this.applyToKnownAgents(),{ok:!0,skillName:s}}catch(n){const a=n instanceof Error?n.message:String(n);return d.warn("[shared] \u6280\u80FD\u90E8\u7F72\u5931\u8D25\uFF08%s\uFF09: %s",e,a),{ok:!1,error:`\u6280\u80FD\u90E8\u7F72\u5931\u8D25: ${a}`}}finally{try{f(y,{recursive:!0,force:!0})}catch{}}}async removeDeployedSkill(r){if(!w(r))return{ok:!1,error:"skillName \u975E\u6CD5"};const e=this.readManifest().filter(t=>t.skillName!==r);this.writeManifest(e);try{f(this.skillDir(r),{recursive:!0,force:!0})}catch(t){return{ok:!1,error:`\u90E8\u7F72\u76EE\u5F55\u6E05\u7406\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`}}return this.applyToKnownAgents(),d.info("[shared] \u6280\u80FD\u5DF2\u4ECE bridge \u79FB\u9664\u90E8\u7F72: %s",r),{ok:!0}}listDeployed(){return this.readManifest().filter(r=>!/^skill-deploy-/.test(r.skillName)).map(r=>({...r,deployed:this.isHealthy(r.skillName)}))}privateManifestFile(r){return O(r)}privateSkillDir(r,e){const t=i.resolve(b(r)),o=i.join(t,e);if(i.resolve(o)!==i.join(t,e))throw new Error(`\u79C1\u6709\u6280\u80FD\u76EE\u5F55\u8D8A\u51FA\u5B9E\u4F8B\u79C1\u6709\u533A: ${e}`);return o}readPrivateManifest(r){try{const e=JSON.parse(E(this.privateManifestFile(r),"utf8"));return Array.isArray(e.skills)?e.skills.filter(t=>t&&t.skillName):[]}catch{return[]}}writePrivateManifest(r,e){const t=this.privateManifestFile(r);D(i.dirname(t),{recursive:!0}),P(t,`${JSON.stringify({version:A,skills:e},null,2)}
3
- `,"utf8")}async savePrivateSkill(r,e,t,o,g){if(!r)return{ok:!1,error:"agentId is required"};if(!e||e.length===0)return{ok:!1,error:"zip \u5305\u5185\u5BB9\u4E3A\u7A7A"};const y=i.join(L("_tmp"),`skill-private-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);try{await K(e,y);const n=await N(y),a=i.basename(i.resolve(n)),M=String(t||"").replace(/\.zip$/i,"").trim(),s=g&&g.trim()||(a&&!a.startsWith("skill-private-")?a:"")||M;if(!w(s))return{ok:!1,error:`\u6280\u80FD\u540D\u975E\u6CD5: ${JSON.stringify(s)}`};if(!l(i.join(n,"SKILL.md")))return{ok:!1,error:`\u6280\u80FD\u5305\u7F3A\u5C11 SKILL.md: ${t}`};const c=this.privateSkillDir(r,s),u=b(r);D(u,{recursive:!0});const h=this.readPrivateManifest(r).find(p=>p.skillName===s);if(h&&h.sha256===o&&l(i.join(c,"SKILL.md")))return{ok:!0,skillName:s};const k=i.join(u,`.old-${s}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);if(l(c))try{S(c,k,{recursive:!0})}catch{f(c,{recursive:!0,force:!0})}try{S(n,c,{recursive:!0})}catch(p){throw l(k)&&(f(c,{recursive:!0,force:!0}),S(k,c,{recursive:!0})),p}l(k)&&f(k,{recursive:!0,force:!0});const m=this.readPrivateManifest(r).filter(p=>p.skillName!==s);m.push({skillName:s,zipFile:h?.zipFile??`${s}.zip`,fileName:t,defaultEnabled:!0,sha256:o}),this.writePrivateManifest(r,m),d.info("[private] agent=%s \u79C1\u6709\u6280\u80FD\u5DF2\u5B89\u88C5: %s\uFF08\u6765\u6E90 %s%s\uFF09",r,s,t,o?`, sha256=${o.slice(0,12)}\u2026`:"");try{j(r)}catch(p){d.warn("[private] agent=%s \u79C1\u6709\u6280\u80FD\u5B89\u88C5\u540E\u540C\u6B65\u519C\u573A\u5931\u8D25: %s",r,p instanceof Error?p.message:String(p))}return{ok:!0,skillName:s}}catch(n){const a=n instanceof Error?n.message:String(n);return d.warn("[private] \u79C1\u6709\u6280\u80FD\u5B89\u88C5\u5931\u8D25\uFF08%s\uFF09: %s",t,a),{ok:!1,error:`\u79C1\u6709\u6280\u80FD\u5B89\u88C5\u5931\u8D25: ${a}`}}finally{try{f(y,{recursive:!0,force:!0})}catch{}}}async removePrivateSkill(r,e){if(!r)return{ok:!1,error:"agentId is required"};if(!w(e))return{ok:!1,error:"skillName \u975E\u6CD5"};const t=this.readPrivateManifest(r).filter(o=>o.skillName!==e);this.writePrivateManifest(r,t);try{f(this.privateSkillDir(r,e),{recursive:!0,force:!0})}catch(o){return{ok:!1,error:`\u79C1\u6709\u6280\u80FD\u76EE\u5F55\u6E05\u7406\u5931\u8D25: ${o instanceof Error?o.message:String(o)}`}}try{j(r)}catch{}return d.info("[private] agent=%s \u79C1\u6709\u6280\u80FD\u5DF2\u79FB\u9664: %s",r,e),{ok:!0}}listPrivateSkills(r){return r?this.readPrivateManifest(r).filter(e=>!/^skill-private-/.test(e.skillName)).map(e=>({...e,deployed:l(i.join(this.privateSkillDir(r,e.skillName),"SKILL.md"))})):[]}deployedDefaultEnabled(){const r={};for(const e of this.readManifest())/^skill-deploy-/.test(e.skillName)||(r[e.skillName]=e.defaultEnabled);return r}applyToKnownAgents(){const r=new Set,e=R();try{if(l(e))for(const t of x(e))t.startsWith(".")||r.add(t)}catch{}for(const t of r)try{j(t)}catch(o){d.warn("[shared] \u540C\u6B65\u6280\u80FD\u519C\u573A\u5931\u8D25 agent=%s: %s",t,o instanceof Error?o.message:String(o))}}}$._instance=null;async function K(v,r){const e=i.join(L("_tmp"),`skill-${Date.now()}-${Math.random().toString(36).slice(2,8)}.zip`);await F.mkdir(i.dirname(e),{recursive:!0}),await F.writeFile(e,v);try{await z(e,r)}finally{await F.rm(e,{force:!0}).catch(()=>{})}}const I=$.getInstance();T("skills",()=>I.deployedDefaultEnabled());const U=()=>H("skills");export{$ as SkillManager,w as isValidSkillName,U as reconcileSkillsDefaultsFromDeployed,I as skillManager};
1
+ import{promises as F,cpSync as d,existsSync as p,mkdirSync as D,readFileSync as E,rmSync as h,writeFileSync as P}from"node:fs";import i from"node:path";import{getBridgeInstancePrivateSkillsDir as N,getBridgeInstancePrivateSkillsManifest as z}from"../config.js";import{runExclusiveConfigWrite as w}from"../utils/config-write-queue.js";import{extractSkillZip as K,resolveSkillSourceDirFromExtractRoot as A}from"../utils/file-utils.js";import{createLogger as J}from"../utils/logger.js";import{syncAgentSkillFarm as L}from"./agent-capability-sync.js";import{listAgentsOwnedBy as R}from"./agent-ownership.js";import{setDeployedDefaultsProvider as _,reconcileDefaultsFromDeployed as T}from"./capability-config.js";import{getAgentInitRoot as j}from"./instance-state.js";import{getUserSkillsDeployedDir as U}from"./user-scope.js";const v=J("skill-manager");function M(a){return typeof a=="string"&&a.length>0&&a.length<=128&&/^[a-zA-Z0-9_.-]+$/.test(a)}const x=1;class g{static forScope(r){const e=U(r),t=i.resolve(e);let o=this.instances.get(t);return o||(o=new g(r,e),this.instances.set(t,o)),o}constructor(r,e){this.scope=r,this.rootDir=e}manifestFile(){return i.join(this.rootDir,"manifest.json")}skillDir(r){const e=i.join(this.rootDir,r),t=i.resolve(this.rootDir);if(i.resolve(e)!==i.join(t,r))throw new Error(`\u6280\u80FD\u76EE\u5F55\u8D8A\u51FA\u90E8\u7F72\u533A: ${r}`);return e}isHealthy(r){return p(i.join(this.skillDir(r),"SKILL.md"))}readManifest(){try{const r=JSON.parse(E(this.manifestFile(),"utf8"));return Array.isArray(r.skills)?r.skills.filter(e=>e&&e.skillName):[]}catch{return[]}}writeManifest(r){D(this.rootDir,{recursive:!0}),P(this.manifestFile(),`${JSON.stringify({version:x,skills:r},null,2)}
2
+ `,"utf8")}async saveSharedSkill(r,e,t=!0,o,S){if(!r||r.length===0)return{ok:!1,error:"zip \u5305\u5185\u5BB9\u4E3A\u7A7A"};const y=i.join(j("_tmp"),`skill-deploy-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);try{await b(r,y);const n=await A(y),l=i.basename(i.resolve(n)),$=String(e||"").replace(/\.zip$/i,"").trim(),s=S&&S.trim()||(l&&!l.startsWith("skill-deploy-")?l:"")||$;if(!M(s))return{ok:!1,error:`\u6280\u80FD\u540D\u975E\u6CD5: ${JSON.stringify(s)}`};if(!p(i.join(n,"SKILL.md")))return{ok:!1,error:`\u6280\u80FD\u5305\u7F3A\u5C11 SKILL.md: ${e}`};const u=this.readManifest().find(c=>c.skillName===s);if(u&&u.sha256===o&&this.isHealthy(s))return{ok:!0,skillName:s};D(this.rootDir,{recursive:!0});const m=this.skillDir(s),k=i.join(this.rootDir,`.old-${s}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);if(p(m))try{d(m,k,{recursive:!0})}catch{h(m,{recursive:!0,force:!0})}try{d(n,m,{recursive:!0})}catch(c){throw p(k)&&(h(m,{recursive:!0,force:!0}),d(k,m,{recursive:!0})),c}return p(k)&&h(k,{recursive:!0,force:!0}),await w(this.manifestFile(),()=>{const c=this.readManifest().filter(f=>f.skillName!==s);c.push({skillName:s,zipFile:u?.zipFile??`${s}.zip`,fileName:e,defaultEnabled:t,sha256:o}),this.writeManifest(c)}),v.info("[shared] \u6280\u80FD\u5DF2\u90E8\u7F72\u5230\u7528\u6237\u5E93: %s\uFF08scope=%s/%s \u6765\u6E90 %s%s\uFF09",s,this.scope.tenantId,this.scope.userId,e,o?`, sha256=${o.slice(0,12)}\u2026`:""),this.applyToUserAgents(),{ok:!0,skillName:s}}catch(n){const l=n instanceof Error?n.message:String(n);return v.warn("[shared] \u6280\u80FD\u90E8\u7F72\u5931\u8D25\uFF08%s\uFF09: %s",e,l),{ok:!1,error:`\u6280\u80FD\u90E8\u7F72\u5931\u8D25: ${l}`}}finally{try{h(y,{recursive:!0,force:!0})}catch{}}}async removeDeployedSkill(r){if(!M(r))return{ok:!1,error:"skillName \u975E\u6CD5"};await w(this.manifestFile(),()=>{const e=this.readManifest().filter(t=>t.skillName!==r);this.writeManifest(e)});try{h(this.skillDir(r),{recursive:!0,force:!0})}catch(e){return{ok:!1,error:`\u90E8\u7F72\u76EE\u5F55\u6E05\u7406\u5931\u8D25: ${e instanceof Error?e.message:String(e)}`}}return this.applyToUserAgents(),v.info("[shared] \u6280\u80FD\u5DF2\u4ECE\u7528\u6237\u5E93\u79FB\u9664\u90E8\u7F72: %s",r),{ok:!0}}listDeployed(){return this.readManifest().filter(r=>!/^skill-deploy-/.test(r.skillName)).map(r=>({...r,deployed:this.isHealthy(r.skillName)}))}privateManifestFile(r){return z(r)}privateSkillDir(r,e){const t=i.resolve(N(r)),o=i.join(t,e);if(i.resolve(o)!==i.join(t,e))throw new Error(`\u79C1\u6709\u6280\u80FD\u76EE\u5F55\u8D8A\u51FA\u5B9E\u4F8B\u79C1\u6709\u533A: ${e}`);return o}readPrivateManifest(r){try{const e=JSON.parse(E(this.privateManifestFile(r),"utf8"));return Array.isArray(e.skills)?e.skills.filter(t=>t&&t.skillName):[]}catch{return[]}}writePrivateManifest(r,e){const t=this.privateManifestFile(r);D(i.dirname(t),{recursive:!0}),P(t,`${JSON.stringify({version:x,skills:e},null,2)}
3
+ `,"utf8")}async savePrivateSkill(r,e,t,o,S){if(!r)return{ok:!1,error:"agentId is required"};if(!e||e.length===0)return{ok:!1,error:"zip \u5305\u5185\u5BB9\u4E3A\u7A7A"};const y=i.join(j("_tmp"),`skill-private-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);try{await b(e,y);const n=await A(y),l=i.basename(i.resolve(n)),$=String(t||"").replace(/\.zip$/i,"").trim(),s=S&&S.trim()||(l&&!l.startsWith("skill-private-")?l:"")||$;if(!M(s))return{ok:!1,error:`\u6280\u80FD\u540D\u975E\u6CD5: ${JSON.stringify(s)}`};if(!p(i.join(n,"SKILL.md")))return{ok:!1,error:`\u6280\u80FD\u5305\u7F3A\u5C11 SKILL.md: ${t}`};const u=this.privateSkillDir(r,s),m=N(r);D(m,{recursive:!0});const k=this.readPrivateManifest(r).find(f=>f.skillName===s);if(k&&k.sha256===o&&p(i.join(u,"SKILL.md")))return{ok:!0,skillName:s};const c=i.join(m,`.old-${s}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);if(p(u))try{d(u,c,{recursive:!0})}catch{h(u,{recursive:!0,force:!0})}try{d(n,u,{recursive:!0})}catch(f){throw p(c)&&(h(u,{recursive:!0,force:!0}),d(c,u,{recursive:!0})),f}p(c)&&h(c,{recursive:!0,force:!0}),await w(this.privateManifestFile(r),()=>{const f=this.readPrivateManifest(r).filter(O=>O.skillName!==s);f.push({skillName:s,zipFile:k?.zipFile??`${s}.zip`,fileName:t,defaultEnabled:!0,sha256:o}),this.writePrivateManifest(r,f)}),v.info("[private] agent=%s \u79C1\u6709\u6280\u80FD\u5DF2\u5B89\u88C5: %s\uFF08\u6765\u6E90 %s%s\uFF09",r,s,t,o?`, sha256=${o.slice(0,12)}\u2026`:"");try{L(r)}catch(f){v.warn("[private] agent=%s \u79C1\u6709\u6280\u80FD\u5B89\u88C5\u540E\u540C\u6B65\u519C\u573A\u5931\u8D25: %s",r,f instanceof Error?f.message:String(f))}return{ok:!0,skillName:s}}catch(n){const l=n instanceof Error?n.message:String(n);return v.warn("[private] \u79C1\u6709\u6280\u80FD\u5B89\u88C5\u5931\u8D25\uFF08%s\uFF09: %s",t,l),{ok:!1,error:`\u79C1\u6709\u6280\u80FD\u5B89\u88C5\u5931\u8D25: ${l}`}}finally{try{h(y,{recursive:!0,force:!0})}catch{}}}async removePrivateSkill(r,e){if(!r)return{ok:!1,error:"agentId is required"};if(!M(e))return{ok:!1,error:"skillName \u975E\u6CD5"};await w(this.privateManifestFile(r),()=>{const t=this.readPrivateManifest(r).filter(o=>o.skillName!==e);this.writePrivateManifest(r,t)});try{h(this.privateSkillDir(r,e),{recursive:!0,force:!0})}catch(t){return{ok:!1,error:`\u79C1\u6709\u6280\u80FD\u76EE\u5F55\u6E05\u7406\u5931\u8D25: ${t instanceof Error?t.message:String(t)}`}}try{L(r)}catch{}return v.info("[private] agent=%s \u79C1\u6709\u6280\u80FD\u5DF2\u79FB\u9664: %s",r,e),{ok:!0}}listPrivateSkills(r){return r?this.readPrivateManifest(r).filter(e=>!/^skill-private-/.test(e.skillName)).map(e=>({...e,deployed:p(i.join(this.privateSkillDir(r,e.skillName),"SKILL.md"))})):[]}deployedDefaultEnabled(){const r={};for(const e of this.readManifest())/^skill-deploy-/.test(e.skillName)||(r[e.skillName]=e.defaultEnabled);return r}applyToUserAgents(){for(const r of R(this.scope))try{L(r)}catch(e){v.warn("[shared] \u540C\u6B65\u6280\u80FD\u519C\u573A\u5931\u8D25 agent=%s: %s",r,e instanceof Error?e.message:String(e))}}}g.instances=new Map;function Y(a){return g.forScope(a)}async function b(a,r){const e=i.join(j("_tmp"),`skill-${Date.now()}-${Math.random().toString(36).slice(2,8)}.zip`);await F.mkdir(i.dirname(e),{recursive:!0}),await F.writeFile(e,a);try{await K(e,r)}finally{await F.rm(e,{force:!0}).catch(()=>{})}}_("skills",a=>a?g.forScope(a).deployedDefaultEnabled():{});const rr=a=>T(a,"skills");export{g as SkillManager,Y as getSkillManager,M as isValidSkillName,rr as reconcileSkillsDefaultsFromDeployed};
4
4
 
@@ -1,5 +1,28 @@
1
1
 
2
2
 
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
3
26
  export declare function setSnapshotRetentionDays(days: unknown, fromConfig?: boolean): void;
4
27
 
5
28
  export declare function getSnapshotRetentionDays(): number | null;
@@ -6,11 +6,14 @@ interface AutoRegisterTargetConfig {
6
6
  [key: string]: unknown;
7
7
  }
8
8
  interface StartupConfigFile {
9
- connectionKey?: string;
10
9
  autoRegisterTargets?: AutoRegisterTargetConfig[];
11
10
  [key: string]: unknown;
12
11
  }
13
12
 
13
+
14
+
15
+
16
+
14
17
  export declare const MINIMAL_CONFIG_TEMPLATE: StartupConfigFile;
15
18
 
16
19
  export declare function formatConfigExample(template?: object): string;
@@ -29,5 +32,8 @@ export type StartupConfigWizardResult = "exists" | "created" | "configured" | "s
29
32
  export declare function ensureStartupConfig(options?: EnsureStartupConfigOptions): Promise<StartupConfigWizardResult>;
30
33
  export declare function configureStartupConfig(options?: EnsureStartupConfigOptions): Promise<StartupConfigWizardResult>;
31
34
 
35
+
36
+
37
+
32
38
  export declare function printConfigExampleCommand(options?: EnsureStartupConfigOptions): Promise<StartupConfigWizardResult>;
33
39
  export {};
@@ -1,14 +1,14 @@
1
- import{randomBytes as R}from"node:crypto";import{existsSync as m,readFileSync as T}from"node:fs";import v from"node:os";import{stdin as E,stdout as i}from"node:process";import{createInterface as x}from"node:readline/promises";import{atomicWriteJsonFile as _}from"../utils/file-utils.js";import{logger as o}from"../utils/logger.js";import{getAutoRegisterConfigFilePath as d}from"./auto-register.js";const w={autoRegisterTargets:[{instanceName:"<\u5B9E\u4F8B\u540D\u79F0\uFF0C\u4F8B\u5982 \u6211\u7684\u4E3B\u673A>",serverUrl:"http://<\u8C03\u5EA6\u4E2D\u5FC3IP>:<\u7AEF\u53E3>",userKey:"<\u4F60\u7684 userKey>",instanceId:"<\u5B9E\u4F8BID\uFF0C\u9996\u6B21\u53EF\u7559\u7A7A\u7531\u670D\u52A1\u7AEF\u751F\u6210>"}],connectionKey:"<\u9762\u677F\u8FDE\u63A5 Bridge \u7684\u5BC6\u94A5>",panelUsername:"<\u9762\u677F\u7528\u6237\u540D>",panelPassword:"<\u9762\u677F\u5BC6\u7801>"};function $(t=w){return`[runtime-bridge] \u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\uFF08\u8BF7\u5C06 <\u5360\u4F4D\u7B26> \u66FF\u6362\u4E3A\u771F\u5B9E\u503C\u540E\u4FDD\u5B58\uFF09:
1
+ import{randomBytes as T}from"node:crypto";import{existsSync as m,readFileSync as R}from"node:fs";import E from"node:os";import{stdin as x,stdout as i}from"node:process";import{createInterface as _}from"node:readline/promises";import{atomicWriteJsonFile as U}from"../utils/file-utils.js";import{logger as o}from"../utils/logger.js";import{getAutoRegisterConfigFilePath as d}from"./auto-register.js";const w={autoRegisterTargets:[{instanceName:"<\u5B9E\u4F8B\u540D\u79F0\uFF0C\u4F8B\u5982 \u6211\u7684\u4E3B\u673A>",serverUrl:"http://<\u8C03\u5EA6\u4E2D\u5FC3IP>:<\u7AEF\u53E3>",userKey:"<\u4F60\u7684 userKey>",connectionKey:"<\u8BE5 target \u4E13\u7528\u8FDE\u63A5\u5BC6\u94A5\uFF0C\u53EF\u7531\u5411\u5BFC\u751F\u6210>",instanceId:"<\u5B9E\u4F8BID\uFF0C\u9996\u6B21\u53EF\u7559\u7A7A\u7531\u670D\u52A1\u7AEF\u751F\u6210>"}],panelUsername:"<\u9762\u677F\u7528\u6237\u540D>",panelPassword:"<\u9762\u677F\u5BC6\u7801>"};function K(t=w){return`[runtime-bridge] \u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\uFF08\u8BF7\u5C06 <\u5360\u4F4D\u7B26> \u66FF\u6362\u4E3A\u771F\u5B9E\u503C\u540E\u4FDD\u5B58\uFF09:
2
2
  ${JSON.stringify(t,null,2)}
3
- [runtime-bridge] \u8BF4\u660E\uFF1AautoRegisterTargets \u53EF\u5305\u542B\u591A\u4E2A\u76EE\u6807\uFF1BinstanceId \u9996\u6B21\u53EF\u7701\u7565\uFF0C\u7531\u670D\u52A1\u7AEF\u751F\u6210\uFF1BpanelUsername / panelPassword \u4E3A\u53EF\u9009\u9762\u677F\u8BA4\u8BC1\u3002`}function l(t){return t.trim().toLowerCase()}function U(t){return["","y","yes","\u662F","\u597D","\u914D\u7F6E"].includes(l(t))}function B(t){return["n","no","\u5426","\u4E0D","\u8DF3\u8FC7","skip","s"].includes(l(t))}function N(t){if(!m(t))return{};try{const e=JSON.parse(T(t,"utf-8"));return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch(e){const r=e;return o.warn(`[runtime-bridge] \u8BFB\u53D6\u73B0\u6709\u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u4F7F\u7528\u7A7A\u9ED8\u8BA4\u503C: ${r.message}`),{}}}function k(){return`awsb_${R(24).toString("base64url")}`}async function g(t,e){await _(t,e)}async function p(t,e){const r=e();await g(t,{connectionKey:r});const n=`[runtime-bridge] \u5DF2\u521B\u5EFA\u914D\u7F6E\u6587\u4EF6: ${t}
4
- [runtime-bridge] \u81EA\u52A8\u751F\u6210 connectionKey: ${r}
5
- [runtime-bridge] \u8BF7\u4FDD\u5B58\u8BE5 connectionKey\uFF1Bserver/\u9762\u677F\u8FDE\u63A5\u6B64 Bridge \u65F6\u9700\u8981\u4F7F\u7528\u5B83\u3002`;o.info(n),i.write(`${n}
6
- `)}async function y(t,e,r){return(await t.question(`${e}\uFF08\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u503C ${r}\uFF0C\u76F4\u63A5\u56DE\u8F66\u4FDD\u7559\uFF09: `)).trim()||r}const h=10;async function b(t,e,r){let n=0;for(;;){const a=(await t.question(r?`${e}\uFF08\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u503C ${r}\uFF0C\u76F4\u63A5\u56DE\u8F66\u4FDD\u7559\uFF09: `:`${e}: `)).trim();if(a)return a;if(r)return r;if(n++,n>=h)throw new Error(`${e} \u8F93\u5165\u8D85\u8FC7\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF08${h}\uFF09\uFF0C\u9000\u51FA\u914D\u7F6E\u5F15\u5BFC`);i.write(`${e} \u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\u3002
7
- `)}}async function Y(t){for(;;){const e=await t.question(`\u672A\u68C0\u6D4B\u5230 ${d()}\uFF0C\u662F\u5426\u73B0\u5728\u8FDB\u5165\u81EA\u52A8\u6CE8\u518C\u914D\u7F6E\u5F15\u5BFC\uFF1F(Y/n): `);if(U(e))return!0;if(B(e))return!1;i.write(`\u8BF7\u8F93\u5165 Y \u7EE7\u7EED\u914D\u7F6E\uFF0C\u6216\u8F93\u5165 n \u8DF3\u8FC7\u3002
8
- `)}}async function q(t){for(;;){const e=await t.question("\u672A\u68C0\u6D4B\u5230\u914D\u7F6E\u6587\u4EF6\uFF0C\u8BF7\u9009\u62E9\u914D\u7F6E\u65B9\u5F0F\uFF1A[1] \u5B8C\u6574\u9010\u6B65\u5F15\u5BFC [2] \u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\uFF08\u751F\u6210\u5360\u4F4D\u7B26\u6A21\u677F\uFF0C\u7A0D\u540E\u624B\u52A8\u586B\u5199\uFF09 (\u9ED8\u8BA4 1): "),r=l(e);if(r===""||r==="1"||r==="full"||r==="\u5B8C\u6574"||r==="\u5F15\u5BFC")return"full";if(r==="2"||r==="minimal"||r==="\u6700\u5C0F"||r==="\u793A\u4F8B")return"minimal";i.write(`\u8BF7\u8F93\u5165 1\uFF08\u5B8C\u6574\u5F15\u5BFC\uFF09\u6216 2\uFF08\u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\uFF09\u3002
9
- `)}}async function I(t,e={}){const r=e.autoRegisterTargets?.[0]||{},n="http://127.0.0.1:8080",a=v.hostname()||"AgentsWork Runtime Bridge",c=r.registerAddr||r.registerIp||"127.0.0.1",u=await b(t,"connectionKey\uFF08\u9762\u677F\u8FDE\u63A5 Bridge \u7684\u5BC6\u94A5\uFF09",e.connectionKey),f=await y(t,"serverUrl\uFF08\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\uFF09",r.serverUrl||n),S=await y(t,"instanceName\uFF08\u5B9E\u4F8B\u540D\u79F0\uFF09",r.instanceName||a),A=await b(t,"userKey\uFF08\u7528\u6237 API Key\uFF09",r.userKey),P=await y(t,"registerAddr\uFF08Bridge \u5BF9\u5916\u8BBF\u95EE\u5730\u5740\uFF0C\u652F\u6301 host:port / \u7EAF host / \u5B8C\u6574 URL\uFF09",c),C={...r};return delete C.registerIp,{...e,connectionKey:u,autoRegisterTargets:[{...C,serverUrl:f,instanceName:S,userKey:A,registerAddr:P}]}}async function K(t){return{prompt:t.prompt||x({input:E,output:i,terminal:!0}),shouldClosePrompt:!t.prompt}}async function J(t={}){const e=t.configPath||d(),r=t.generateConnectionKey||k;if(m(e))return"exists";if((t.env||process.env).AWS_BRIDGE_SKIP_SETUP==="true")return await p(e,r),o.info("[runtime-bridge] AWS_BRIDGE_SKIP_SETUP=true\uFF0C\u8DF3\u8FC7\u9996\u6B21\u914D\u7F6E\u5F15\u5BFC"),"skipped";if(!(t.interactive??!!(process.stdin.isTTY&&process.stdout.isTTY)))return await p(e,r),o.info(`[runtime-bridge] \u672A\u68C0\u6D4B\u5230\u914D\u7F6E\u6587\u4EF6: ${e}\uFF1B\u5F53\u524D\u4E3A\u975E\u4EA4\u4E92\u73AF\u5883\uFF0C\u8DF3\u8FC7\u9996\u6B21\u914D\u7F6E\u5F15\u5BFC`),"non-interactive";const{prompt:s,shouldClosePrompt:c}=await K(t);try{if(!await Y(s))return await p(e,r),o.info("[runtime-bridge] \u5DF2\u8DF3\u8FC7\u9996\u6B21\u914D\u7F6E\u5F15\u5BFC"),"skipped";const f=await I(s);return await g(e,f),o.info(`[runtime-bridge] \u5DF2\u5199\u5165\u914D\u7F6E\u6587\u4EF6: ${e}`),"created"}catch(u){const f=u;return o.warn(`[runtime-bridge] \u9996\u6B21\u914D\u7F6E\u5F15\u5BFC\u5931\u8D25: ${f.message}`),"failed"}finally{c&&s.close()}}async function z(t={}){const e=t.configPath||d();if(!(t.interactive??!!(process.stdin.isTTY&&process.stdout.isTTY)))return o.warn("[runtime-bridge] awsb config \u9700\u8981\u4EA4\u4E92\u5F0F\u7EC8\u7AEF"),"failed";const{prompt:n,shouldClosePrompt:a}=await K(t);try{const s=N(e);if(!m(e)&&await q(n)==="minimal")return i.write($()),await g(e,w),i.write(`[runtime-bridge] \u5DF2\u5C06\u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\u6A21\u677F\u5199\u5165: ${e}
3
+ [runtime-bridge] \u8BF4\u660E\uFF1AconnectionKey \u5C5E\u4E8E\u6BCF\u4E2A target\uFF0C\u591A\u4E2A target \u4E0D\u5F97\u5171\u7528\uFF1BinstanceId \u9996\u6B21\u53EF\u7701\u7565\uFF0C\u7531\u670D\u52A1\u7AEF\u751F\u6210\uFF1BpanelUsername / panelPassword \u4E3A\u53EF\u9009\u9762\u677F\u8BA4\u8BC1\u3002`}function l(t){return t.trim().toLowerCase()}function N(t){return["","y","yes","\u662F","\u597D","\u914D\u7F6E"].includes(l(t))}function k(t){return["n","no","\u5426","\u4E0D","\u8DF3\u8FC7","skip","s"].includes(l(t))}function B(t){if(!m(t))return{};try{const e=JSON.parse(R(t,"utf-8"));return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch(e){const n=e;return o.warn(`[runtime-bridge] \u8BFB\u53D6\u73B0\u6709\u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u4F7F\u7528\u7A7A\u9ED8\u8BA4\u503C: ${n.message}`),{}}}function Y(){return`awsb_${T(24).toString("base64url")}`}async function g(t,e){await U(t,e)}async function p(t,e){const n=e();await g(t,{connectionKey:n});const r=`[runtime-bridge] \u5DF2\u521B\u5EFA\u914D\u7F6E\u6587\u4EF6: ${t}
4
+ [runtime-bridge] \u81EA\u52A8\u751F\u6210 connectionKey: ${n}
5
+ [runtime-bridge] \u8BF7\u4FDD\u5B58\u8BE5 connectionKey\uFF1Bserver/\u9762\u677F\u8FDE\u63A5\u6B64 Bridge \u65F6\u9700\u8981\u4F7F\u7528\u5B83\u3002`;o.info(r),i.write(`${r}
6
+ `)}async function y(t,e,n){return(await t.question(`${e}\uFF08\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u503C ${n}\uFF0C\u76F4\u63A5\u56DE\u8F66\u4FDD\u7559\uFF09: `)).trim()||n}const $=10;async function b(t,e,n){let r=0;for(;;){const a=(await t.question(n?`${e}\uFF08\u9ED8\u8BA4\u4F7F\u7528\u5F53\u524D\u503C ${n}\uFF0C\u76F4\u63A5\u56DE\u8F66\u4FDD\u7559\uFF09: `:`${e}: `)).trim();if(a)return a;if(n)return n;if(r++,r>=$)throw new Error(`${e} \u8F93\u5165\u8D85\u8FC7\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF08${$}\uFF09\uFF0C\u9000\u51FA\u914D\u7F6E\u5F15\u5BFC`);i.write(`${e} \u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165\u3002
7
+ `)}}async function W(t){for(;;){const e=await t.question(`\u672A\u68C0\u6D4B\u5230 ${d()}\uFF0C\u662F\u5426\u73B0\u5728\u8FDB\u5165\u81EA\u52A8\u6CE8\u518C\u914D\u7F6E\u5F15\u5BFC\uFF1F(Y/n): `);if(N(e))return!0;if(k(e))return!1;i.write(`\u8BF7\u8F93\u5165 Y \u7EE7\u7EED\u914D\u7F6E\uFF0C\u6216\u8F93\u5165 n \u8DF3\u8FC7\u3002
8
+ `)}}async function q(t){for(;;){const e=await t.question("\u672A\u68C0\u6D4B\u5230\u914D\u7F6E\u6587\u4EF6\uFF0C\u8BF7\u9009\u62E9\u914D\u7F6E\u65B9\u5F0F\uFF1A[1] \u5B8C\u6574\u9010\u6B65\u5F15\u5BFC [2] \u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\uFF08\u751F\u6210\u5360\u4F4D\u7B26\u6A21\u677F\uFF0C\u7A0D\u540E\u624B\u52A8\u586B\u5199\uFF09 (\u9ED8\u8BA4 1): "),n=l(e);if(n===""||n==="1"||n==="full"||n==="\u5B8C\u6574"||n==="\u5F15\u5BFC")return"full";if(n==="2"||n==="minimal"||n==="\u6700\u5C0F"||n==="\u793A\u4F8B")return"minimal";i.write(`\u8BF7\u8F93\u5165 1\uFF08\u5B8C\u6574\u5F15\u5BFC\uFF09\u6216 2\uFF08\u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\uFF09\u3002
9
+ `)}}async function S(t,e={}){const n=e.autoRegisterTargets?.[0]||{},r="http://127.0.0.1:8080",a=E.hostname()||"AgentsWork Runtime Bridge",c=n.registerAddr||n.registerIp||"127.0.0.1",u=await b(t,"connectionKey\uFF08\u8BE5 target \u4E13\u7528\u8FDE\u63A5\u5BC6\u94A5\uFF09",String(n.connectionKey||e.connectionKey||"").trim()||void 0),f=await y(t,"serverUrl\uFF08\u8C03\u5EA6\u4E2D\u5FC3\u5730\u5740\uFF09",n.serverUrl||r),v=await y(t,"instanceName\uFF08\u5B9E\u4F8B\u540D\u79F0\uFF09",n.instanceName||a),A=await b(t,"userKey\uFF08\u7528\u6237 API Key\uFF09",n.userKey),P=await y(t,"registerAddr\uFF08Bridge \u5BF9\u5916\u8BBF\u95EE\u5730\u5740\uFF0C\u652F\u6301 host:port / \u7EAF host / \u5B8C\u6574 URL\uFF09",c),C={...n};delete C.registerIp;const h={...e};return delete h.connectionKey,{...h,autoRegisterTargets:[{...C,serverUrl:f,instanceName:v,userKey:A,connectionKey:u,registerAddr:P}]}}async function I(t){return{prompt:t.prompt||_({input:x,output:i,terminal:!0}),shouldClosePrompt:!t.prompt}}async function z(t={}){const e=t.configPath||d(),n=t.generateConnectionKey||Y;if(m(e))return"exists";if((t.env||process.env).AWS_BRIDGE_SKIP_SETUP==="true")return await p(e,n),o.info("[runtime-bridge] AWS_BRIDGE_SKIP_SETUP=true\uFF0C\u8DF3\u8FC7\u9996\u6B21\u914D\u7F6E\u5F15\u5BFC"),"skipped";if(!(t.interactive??!!(process.stdin.isTTY&&process.stdout.isTTY)))return await p(e,n),o.info(`[runtime-bridge] \u672A\u68C0\u6D4B\u5230\u914D\u7F6E\u6587\u4EF6: ${e}\uFF1B\u5F53\u524D\u4E3A\u975E\u4EA4\u4E92\u73AF\u5883\uFF0C\u8DF3\u8FC7\u9996\u6B21\u914D\u7F6E\u5F15\u5BFC`),"non-interactive";const{prompt:s,shouldClosePrompt:c}=await I(t);try{if(!await W(s))return await p(e,n),o.info("[runtime-bridge] \u5DF2\u8DF3\u8FC7\u9996\u6B21\u914D\u7F6E\u5F15\u5BFC"),"skipped";const f=await S(s);return await g(e,f),o.info(`[runtime-bridge] \u5DF2\u5199\u5165\u914D\u7F6E\u6587\u4EF6: ${e}`),"created"}catch(u){const f=u;return o.warn(`[runtime-bridge] \u9996\u6B21\u914D\u7F6E\u5F15\u5BFC\u5931\u8D25: ${f.message}`),"failed"}finally{c&&s.close()}}async function Q(t={}){const e=t.configPath||d();if(!(t.interactive??!!(process.stdin.isTTY&&process.stdout.isTTY)))return o.warn("[runtime-bridge] awsb config \u9700\u8981\u4EA4\u4E92\u5F0F\u7EC8\u7AEF"),"failed";const{prompt:r,shouldClosePrompt:a}=await I(t);try{const s=B(e);if(!m(e)&&await q(r)==="minimal")return i.write(K()),await g(e,w),i.write(`[runtime-bridge] \u5DF2\u5C06\u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\u6A21\u677F\u5199\u5165: ${e}
10
10
  `),i.write(`[runtime-bridge] \u8BF7\u5C06 <\u5360\u4F4D\u7B26> \u66FF\u6362\u4E3A\u771F\u5B9E\u503C\u540E\u4FDD\u5B58\u3002
11
- `),"created";const u=await I(n,s);return await g(e,u),o.info(`[runtime-bridge] \u5DF2\u66F4\u65B0\u914D\u7F6E\u6587\u4EF6: ${e}`),"configured"}catch(s){const c=s;return o.warn(`[runtime-bridge] \u914D\u7F6E\u5F15\u5BFC\u5931\u8D25: ${c.message}`),"failed"}finally{a&&n.close()}}async function Q(t={}){const e=t.configPath||d();i.write($());try{return await g(e,w),i.write(`[runtime-bridge] \u5DF2\u5C06\u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\u6A21\u677F\u5199\u5165: ${e}
11
+ `),"created";const u=await S(r,s);return await g(e,u),o.info(`[runtime-bridge] \u5DF2\u66F4\u65B0\u914D\u7F6E\u6587\u4EF6: ${e}`),"configured"}catch(s){const c=s;return o.warn(`[runtime-bridge] \u914D\u7F6E\u5F15\u5BFC\u5931\u8D25: ${c.message}`),"failed"}finally{a&&r.close()}}async function X(t={}){const e=t.configPath||d();i.write(K());try{return await g(e,w),i.write(`[runtime-bridge] \u5DF2\u5C06\u6700\u5C0F\u914D\u7F6E\u793A\u4F8B\u6A21\u677F\u5199\u5165: ${e}
12
12
  `),i.write(`[runtime-bridge] \u8BF7\u5C06 <\u5360\u4F4D\u7B26> \u66FF\u6362\u4E3A\u771F\u5B9E\u503C\u540E\u4FDD\u5B58\u3002
13
- `),"created"}catch(r){const n=r;return o.warn(`[runtime-bridge] \u5199\u5165\u793A\u4F8B\u6A21\u677F\u5931\u8D25: ${n.message}`),"failed"}}export{w as MINIMAL_CONFIG_TEMPLATE,z as configureStartupConfig,J as ensureStartupConfig,$ as formatConfigExample,Q as printConfigExampleCommand};
13
+ `),"created"}catch(n){const r=n;return o.warn(`[runtime-bridge] \u5199\u5165\u793A\u4F8B\u6A21\u677F\u5931\u8D25: ${r.message}`),"failed"}}export{w as MINIMAL_CONFIG_TEMPLATE,Q as configureStartupConfig,z as ensureStartupConfig,K as formatConfigExample,X as printConfigExampleCommand};
14
14
 
@@ -33,4 +33,7 @@ export interface SystemMetricsSnapshot {
33
33
  network: SystemNetworkMetrics;
34
34
  }
35
35
 
36
+
37
+
38
+
36
39
  export declare function collectSystemMetrics(): Promise<SystemMetricsSnapshot>;
@@ -1,5 +1,13 @@
1
1
 
2
2
 
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
3
11
  export type LaunchStackType = "generic" | "java" | "python" | "node" | "go" | "php";
4
12
  export interface TechStackCandidate {
5
13
 
@@ -28,4 +36,8 @@ export interface TechStackScanResult {
28
36
  candidates: TechStackCandidate[];
29
37
  }
30
38
 
39
+
40
+
41
+
42
+
31
43
  export declare function scanTechStack(workspacePath: string): Promise<TechStackScanResult>;