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,4 +1,6 @@
1
- import h from"node:path";import w,{WebSocketServer as m}from"ws";import{isUpgradeAllowed as P}from"../services/access-control.js";import{LspProcessBridge as S}from"../services/lsp-stdio-bridge.js";import{createLogger as $}from"../utils/logger.js";const o=$("lsp-ws"),k=6e4,b={typescript:"typescript",ts:"typescript",javascript:"javascript",js:"javascript",tsx:"typescript",jsx:"javascript"};function v(e){return b[e.toLowerCase()]??null}const l=new Map;function L(e){return h.resolve(e)}function E(e){const s=e.toString("utf8");if(!s.trim())return null;try{return JSON.parse(s)}catch{return null}}function u(e){e.idleTimer&&(clearTimeout(e.idleTimer),e.idleTimer=null)}function T(e){u(e),e.idleTimer=setTimeout(()=>{if(!(e.ws!==null&&e.ws.readyState===w.OPEN)){for(const[t,a]of l)if(a===e){l.delete(t);break}e.bridge.dispose()}},k)}function d(e,s){const t=new S({workspacePath:s.workspacePath,language:s.language},{onMessage:a=>{const r=l.get(e)?.ws;if(r&&r.readyState===w.OPEN)try{r.send(JSON.stringify(a))}catch(n){o.warn(`[lsp-ws] \u8F6C\u53D1 server \u6D88\u606F\u5931\u8D25: ${n.message}`)}},onExit:()=>{l.get(e)?.bridge===t&&l.delete(e)},onError:a=>{o.warn(`[lsp-ws] \u8BED\u8A00\u670D\u52A1\u9519\u8BEF ${s.workspacePath}: ${a.message}`)}});return t.start(),t}function y(e,s){return{bridge:d(e,s),ws:null,idleTimer:null,initialized:!1}}function z(e,s){const t=L(s.workspacePath);let a=l.get(t);a||(a=y(t,s),l.set(t,a)),u(a);const r=a;r.ws&&r.ws!==e&&r.ws.readyState===w.OPEN&&(o.info(`[lsp-ws] \u6324\u5360\u65E7\u8FDE\u63A5 workspace=${s.workspacePath}\uFF08\u65B0\u8FDE\u63A5\u63A5\u7BA1\u540C\u4E00\u8FDB\u7A0B\uFF09`),r.ws.close(1e3,"superseded by new lsp connection")),r.ws=e,e.on("message",n=>{const i=E(n);if(i===null){o.warn(`[lsp-ws] \u5FFD\u7565\u65E0\u6CD5\u89E3\u6790\u7684\u6D88\u606F: ${n.toString("utf8").slice(0,200)}`);return}i.method==="initialize"&&(r.initialized&&(o.info(`[lsp-ws] \u590D\u7528\u8FDB\u7A0B\u6536\u5230\u4E8C\u6B21 initialize\uFF0C\u91CD\u5EFA\u8BED\u8A00\u670D\u52A1\u8FDB\u7A0B workspace=${s.workspacePath}`),r.bridge.dispose(),r.bridge=d(t,s)),r.initialized=!0),r.bridge.send(i)}),e.on("close",()=>{r.ws===e&&(r.ws=null),T(r)}),e.on("error",n=>{o.warn(`[lsp-ws] \u8FDE\u63A5\u5F02\u5E38 workspace=${s.workspacePath}: ${n.message}`)}),o.info(`[lsp-ws] \u8FDE\u63A5\u5EFA\u7ACB workspace=${s.workspacePath} file=${s.filePath} language=${s.language} reused=${a.bridge.running}`)}function U(e){const s=new m({noServer:!0});e.on("upgrade",(t,a,r)=>{if(!P(t,a))return;const n=t.headers.host||"localhost",i=new URL(t.url||"/",`http://${n}`);if(i.pathname!=="/ws/lsp")return;const c=i.searchParams.get("workspacePath")||"",p=i.searchParams.get("file")||"",g=v(i.searchParams.get("language")||"");if(!c||!p||!g){o.warn(`[lsp-ws] upgrade \u53C2\u6570\u7F3A\u5931: workspacePath=${!!c}, file=${!!p}, language=${g}`),a.write(`HTTP/1.1 400 Bad Request\r
1
+ import $ from"node:path";import u,{WebSocketServer as b}from"ws";import{isRuntimeTokenValid as y}from"../middleware/auth.js";import{isUpgradeAllowed as A}from"../services/access-control.js";import{buildLaunchSpec as g,checkProviderAvailability as T,getProvider as f,resolveLanguageId as E,resolveProviderForFile as L}from"../services/lsp/provider-registry.js";import{buildUriRewriteRules as R,canonicalizePath as v,invertRules as N,rewriteMessageUris as h}from"../services/lsp/uri-rewrite.js";import{LspProcessBridge as z}from"../services/lsp-stdio-bridge.js";import{createLogger as O}from"../utils/logger.js";const a=O("lsp-ws"),M=6e4,_=Number(process.env.AWS_LSP_MAX_PROCESSES||6),d=new Map;function W(e){return $.resolve(e)}function m(e){return[W(e.workspacePath),e.providerId||"typescript",e.clientId||"default"].join("::")}function C(e){const r=e.toString("utf8");if(!r.trim())return null;try{return JSON.parse(r)}catch{return null}}function w(e){e.idleTimer&&(clearTimeout(e.idleTimer),e.idleTimer=null)}function F(e){w(e),e.idleTimer=setTimeout(()=>{if(!(e.ws!==null&&e.ws.readyState===u.OPEN)){for(const[i,o]of d)if(o===e){d.delete(i);break}e.bridge.dispose(),a.info(`[lsp-ws] \u7A7A\u95F2\u56DE\u6536\u8BED\u8A00\u670D\u52A1 provider=${e.providerId}`)}},M)}function U(){for(;d.size>_;){let e=null,r=Number.POSITIVE_INFINITY;for(const[o,t]of d)t.ws!==null&&t.ws.readyState===u.OPEN||t.lastActiveAt<r&&(r=t.lastActiveAt,e=o);if(!e)break;const i=d.get(e);d.delete(e),i?.bridge.dispose(),a.info(`[lsp-ws] \u8FDB\u7A0B\u4E0A\u9650\u6DD8\u6C70 provider=${i?.providerId} key=${e}`)}}function P(e,r,i,o=[]){const t=new z({workspacePath:r.workspacePath,language:r.language,providerId:r.providerId,launch:i},{onMessage:s=>{const n=d.get(e)?.ws;if(n&&n.readyState===u.OPEN)try{const l=o.length>0?h(s,o):s;n.send(JSON.stringify(l))}catch(l){a.warn(`[lsp-ws] \u8F6C\u53D1 server \u6D88\u606F\u5931\u8D25: ${l.message}`)}},onExit:()=>{d.get(e)?.bridge===t&&d.delete(e)},onError:s=>{a.warn(`[lsp-ws] \u8BED\u8A00\u670D\u52A1\u9519\u8BEF provider=${r.providerId} ${r.workspacePath}: ${s.message}`)}});return t.start(),t}async function B(e,r,i){const o=await g(i,{workspacePath:r.workspacePath,filePath:r.filePath});if(!o){const p=T(i);return a.warn(`[lsp-ws] provider \u4E0D\u53EF\u7528 provider=${i.id} reason=${p.reason??"unknown"}`),null}const t=await v(r.workspacePath),s=await v(r.filePath),n=R(r.workspacePath,t,r.filePath,s),l=N(n);return n.length>0&&a.info(`[lsp-ws] URI \u89C4\u8303\u5316\u542F\u7528 workspace=${r.workspacePath} -> ${t}`),U(),{bridge:P(e,r,o,l),ws:null,idleTimer:null,initialized:!1,lastActiveAt:Date.now(),providerId:i.id,toServerRules:n,toClientRules:l}}function D(e){const r=e.searchParams.get("workspacePath")||"",i=e.searchParams.get("file")||"",o=e.searchParams.get("language")||"",t=(e.searchParams.get("provider")||"").trim().toLowerCase(),s=(e.searchParams.get("clientId")||"default").trim()||"default";if(!r||!i)return{ctx:{workspacePath:r,filePath:i,language:"plaintext",providerId:"",clientId:s},provider:null,error:"workspacePath and file are required"};let n=t?f(t):null;if(n||(n=L(i)),n||(o==="typescript"||o==="javascript")&&(n=f("typescript")),!n)return{ctx:{workspacePath:r,filePath:i,language:o||"plaintext",providerId:"",clientId:s},provider:null,error:`no lsp provider for file: ${i}`};const l=E(n,i);return{ctx:{workspacePath:r,filePath:i,language:l,providerId:n.id,clientId:s},provider:n}}function J(e,r,i){const o=m(r),t=d.get(o);if(!t){B(o,r,i).then(s=>{if(!s){e.close(1011,"lsp provider unavailable");return}d.set(o,s),I(s,e,r)}).catch(s=>{a.warn(`[lsp-ws] \u521B\u5EFA\u8BED\u8A00\u670D\u52A1\u5931\u8D25 provider=${r.providerId}: ${s.message}`),e.close(1011,"lsp provider start failed")});return}I(t,e,r)}function I(e,r,i){const o=m(i);w(e);const t=e;t.ws&&t.ws!==r&&t.ws.readyState===u.OPEN&&(a.info(`[lsp-ws] \u6324\u5360\u65E7\u8FDE\u63A5 workspace=${i.workspacePath} provider=${i.providerId}`),t.ws.close(1e3,"superseded by new lsp connection")),t.ws=r,t.lastActiveAt=Date.now(),r.on("message",s=>{t.lastActiveAt=Date.now();const n=C(s);if(n===null){a.warn(`[lsp-ws] \u5FFD\u7565\u65E0\u6CD5\u89E3\u6790\u7684\u6D88\u606F: ${s.toString("utf8").slice(0,200)}`);return}const l=h(n,t.toServerRules);if(l.method==="initialize"){if(t.initialized){a.info(`[lsp-ws] \u590D\u7528\u8FDB\u7A0B\u6536\u5230\u4E8C\u6B21 initialize\uFF0C\u91CD\u5EFA\u8BED\u8A00\u670D\u52A1\u8FDB\u7A0B workspace=${i.workspacePath} provider=${i.providerId}`);const p=t.bridge;g(f(i.providerId)??f("typescript"),{workspacePath:i.workspacePath,filePath:i.filePath}).then(c=>{if(!c){r.close(1011,"lsp provider unavailable");return}p.dispose(),t.bridge=P(o,i,c,t.toClientRules),t.bridge.send(l)}).catch(c=>{a.warn(`[lsp-ws] \u91CD\u5EFA\u8BED\u8A00\u670D\u52A1\u5931\u8D25: ${c.message}`),r.close(1011,"lsp provider restart failed")});return}t.initialized=!0}t.bridge.send(l)}),r.on("close",()=>{t.ws===r&&(t.ws=null),F(t)}),r.on("error",s=>{a.warn(`[lsp-ws] \u8FDE\u63A5\u5F02\u5E38 workspace=${i.workspacePath} provider=${i.providerId}: ${s.message}`)}),a.info(`[lsp-ws] \u8FDE\u63A5\u5EFA\u7ACB workspace=${i.workspacePath} file=${i.filePath} provider=${i.providerId} language=${i.language} client=${i.clientId} reused=${e.bridge.running}`)}function K(e,r){const i=r.searchParams.get("token")||"";if(i.trim())return i.trim();const o=e.headers["x-runtime-token"];return Array.isArray(o)?o[0]?.trim()||"":typeof o=="string"?o.trim():String(e.headers.authorization||"").match(/^Bearer\s+(.+)$/i)?.[1]?.trim()||""}function V(e){const r=String(e.socket?.remoteAddress||"");return r==="127.0.0.1"||r==="::1"||r==="::ffff:127.0.0.1"||r.startsWith("127.")}function x(e){const r=new b({noServer:!0});e.on("upgrade",(i,o,t)=>{if(!A(i,o))return;const s=i.headers.host||"localhost",n=new URL(i.url||"/",`http://${s}`);if(n.pathname!=="/ws/lsp")return;const l=K(i,n);if(!y(l)&&!V(i)){a.warn("[lsp-ws] upgrade \u9274\u6743\u5931\u8D25\uFF1A\u7F3A\u5C11\u6216\u975E\u6CD5 runtime token"),o.write(`HTTP/1.1 401 Unauthorized\r
2
2
  \r
3
- `),a.destroy();return}s.handleUpgrade(t,a,r,f=>{z(f,{workspacePath:c,filePath:p,language:g})})})}export{U as attachLspWebSocketServer};
3
+ `),o.destroy();return}const p=D(n);if(!p.provider){a.warn(`[lsp-ws] upgrade \u53C2\u6570\u65E0\u6548: ${p.error}`),o.write(`HTTP/1.1 400 Bad Request\r
4
+ \r
5
+ `),o.destroy();return}const{ctx:c,provider:k}=p;r.handleUpgrade(i,o,t,S=>{J(S,c,k)})})}function ee(){return[...d.entries()].map(([e,r])=>({key:e,providerId:r.providerId,running:r.bridge.running,connected:r.ws!==null&&r.ws.readyState===u.OPEN}))}function re(){for(const e of d.values())w(e),e.bridge.dispose();d.clear()}export{x as attachLspWebSocketServer,re as disposeAllLspProcesses,ee as listLspProcesses,D as resolveLspSocketContext};
4
6
 
@@ -1,2 +1,17 @@
1
1
 
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
2
17
  export declare const mcpExtraRouter: import("express-serve-static-core").Router;
@@ -1,6 +1,22 @@
1
1
 
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
2
13
  import { type McpDeploySpec } from "../services/mcp-deploy.js";
3
14
  export declare const mcpRouter: import("express-serve-static-core").Router;
4
15
  export declare function normalizeSpec(raw: unknown): McpDeploySpec | null;
5
16
 
17
+
18
+
19
+
20
+
21
+
6
22
  export declare function stripBuiltinMcpDisable(map: Record<string, unknown>): Record<string, unknown>;
@@ -1,2 +1,2 @@
1
- import{Router as y}from"express";import{validateToken as a}from"../middleware/auth.js";import{getEffective as f,setDefault as g,setInherited as b,setOverride as j}from"../services/capability-config.js";import{mcpDeployManager as d}from"../services/mcp-deploy.js";import{isBuiltinMcpName as m}from"../services/mcp-env-injector.js";import{probeDeployedMcp as k}from"../services/mcp-probe-client.js";import{getPanelEnvVars as v,getAgentMeta as S}from"../services/panel-env.js";import{sanitizeEnvForChild as h}from"../utils/env-safety.js";import{createLogger as M}from"../utils/logger.js";const I=M("mcp"),i=y();function c(r){return(e,o)=>{r(e,o).catch(t=>{I.error("[mcp] %s %s \u5931\u8D25: %s",e.method,e.path,t.message),o.headersSent||o.status(500).json({ok:!1,error:t.message})})}}function E(r){if(!r||typeof r!="object")return null;const e=r,t={type:String(e.type||e.transport||"stdio").trim().toLowerCase()||"stdio"};e.command!==null&&e.command!==void 0&&String(e.command).trim()&&(t.command=String(e.command).trim()),e.url!==null&&e.url!==void 0&&String(e.url).trim()&&(t.url=String(e.url).trim()),Array.isArray(e.args)&&(t.args=e.args.map(s=>String(s))),e.env&&typeof e.env=="object"&&(t.env=e.env),e.headers&&typeof e.headers=="object"&&(t.headers=e.headers),e.collapsed===!0&&(t.collapsed=!0);const n=e.description===null||e.description===void 0?"":String(e.description).trim();return n&&(t.description=n),t}function C(r){const e={};for(const[o,t]of Object.entries(r))m(o)&&t===!1||(e[o]=t);return e}i.post("/mcp/deployed/list",a,c(async(r,e)=>{const t=d.listDeployed().map(n=>({...n,enabled:f("","mcp",n.name)}));e.json({ok:!0,deployedMcp:t})})),i.get("/mcp/deployed",a,c(async(r,e)=>{const t=d.listDeployed().map(n=>({...n,enabled:f("","mcp",n.name)}));e.json({ok:!0,deployedMcp:t})})),i.post("/mcp/deployed/default",a,c(async(r,e)=>{const o=String((r.body??{})?.name??"").trim();if(!o){e.status(400).json({ok:!1,error:"name is required"});return}const t=String((r.body??{})?.agentId??"").trim(),n=(r.body??{})?.enabled,s=n==null?null:!!n;if(m(o)&&s===!1){e.status(400).json({ok:!1,error:`\u300C${o}\u300D\u662F\u5185\u7F6E\u901A\u8BAF MCP\uFF0C\u6052\u4E3A\u9ED8\u8BA4\u542F\u7528\uFF0C\u4E0D\u53EF\u5173\u95ED`});return}t?j(t,"mcp",o,s):g("mcp",o,s),e.json({ok:!0,name:o,agentId:t,enabled:s})})),i.post("/mcp/deployed/inherited",a,c(async(r,e)=>{const o=String((r.body??{})?.agentId??"").trim();if(!o){e.status(400).json({ok:!1,error:"agentId is required"});return}const t=(r.body??{})?.map,n=t&&typeof t=="object"&&!Array.isArray(t)?C(t):t??null;b(o,"mcp",n),e.json({ok:!0,agentId:o,count:n&&typeof n=="object"?Object.keys(n).length:0})})),i.post("/mcp/deployed/save",a,c(async(r,e)=>{const{name:o,spec:t,defaultEnabled:n,sha256:s}=r.body??{},p=String(o??"").trim();if(!p){e.status(400).json({ok:!1,error:"name is required"});return}const l=E(t);if(!l){e.status(400).json({ok:!1,error:"spec \u975E\u6CD5"});return}if(m(p)){e.status(400).json({ok:!1,error:`\u300C${p}\u300D\u662F\u5185\u7F6E\u901A\u8BAF MCP\uFF0C\u7531\u5B9E\u4F8B\u521D\u59CB\u5316\u81EA\u52A8\u90E8\u7F72\uFF0C\u4E0D\u53EF\u8986\u76D6`});return}const u=d.saveMcp(p,l,n!==!1,s?String(s):void 0);e.status(u.ok?200:400).json(u)})),i.post("/mcp/deployed/remove",a,c(async(r,e)=>{const o=String((r.body??{})?.name??"").trim(),t=d.removeMcp(o);e.status(t.ok?200:400).json(t)})),i.post("/mcp/probe",a,c(async(r,e)=>{const o=r.body??{},t=String(o.name??"").trim();if(!t){e.status(400).json({ok:!1,error:"name is required"});return}if(Object.prototype.hasOwnProperty.call(o,"spec")){e.status(400).json({ok:!1,error:"probe \u53EA\u63A5\u53D7\u5DF2\u90E8\u7F72 MCP \u7684 name\uFF0C\u4E0D\u63A5\u53D7\u8C03\u7528\u65B9\u4F20\u5165 spec"});return}const n=String(o.agentId??"").trim(),s={...n?v(n):{},...h(o.env)},p=await k(t,{effectiveEnv:s,agentMeta:n?S(n):void 0});e.json(p)})),i.post("/mcp/cc-switch/list",a,c(async(r,e)=>{e.json({ok:!0,mcpServers:[],state:{skills:[],mcpServers:[]}})}));export{i as mcpRouter,E as normalizeSpec,C as stripBuiltinMcpDisable};
1
+ import{Router as h}from"express";import{validateToken as a}from"../middleware/auth.js";import{assertAgentOwnership as g}from"../services/agent-ownership.js";import{getEffective as b,setDefault as S,setInherited as k,setOverride as v}from"../services/capability-config.js";import{McpDeployManager as l}from"../services/mcp-deploy.js";import{isBuiltinMcpName as u}from"../services/mcp-env-injector.js";import{probeDeployedMcp as M}from"../services/mcp-probe-client.js";import{getPanelEnvVars as w,getAgentMeta as I}from"../services/panel-env.js";import{getUserScopeOrThrow as d,requireAgentOwnership as O,requireUserScope as m}from"../services/user-scope.js";import{sanitizeEnvForChild as A}from"../utils/env-safety.js";import{createLogger as E}from"../utils/logger.js";const C=E("mcp"),c=h();function p(n){return(e,t)=>{n(e,t).catch(o=>{if(C.error("[mcp] %s %s \u5931\u8D25: %s",e.method,e.path,o.message),!t.headersSent){const s=o.message.includes("agent-ownership-mismatch")?403:500;t.status(s).json({ok:!1,error:o.message})}})}}function D(n){if(!n||typeof n!="object")return null;const e=n,o={type:String(e.type||e.transport||"stdio").trim().toLowerCase()||"stdio"};e.command!==null&&e.command!==void 0&&String(e.command).trim()&&(o.command=String(e.command).trim()),e.url!==null&&e.url!==void 0&&String(e.url).trim()&&(o.url=String(e.url).trim()),Array.isArray(e.args)&&(o.args=e.args.map(r=>String(r))),e.env&&typeof e.env=="object"&&(o.env=e.env),e.headers&&typeof e.headers=="object"&&(o.headers=e.headers),e.collapsed===!0&&(o.collapsed=!0);const s=e.description===null||e.description===void 0?"":String(e.description).trim();return s&&(o.description=s),o}function P(n){const e={};for(const[t,o]of Object.entries(n))u(t)&&o===!1||(e[t]=o);return e}c.post("/mcp/deployed/list",a,m,p(async(n,e)=>{const t=d(n),s=l.forScope(t).listDeployed().map(r=>({...r,enabled:b(t,"","mcp",r.name)}));e.json({ok:!0,deployedMcp:s})})),c.get("/mcp/deployed",a,m,p(async(n,e)=>{const t=d(n),s=l.forScope(t).listDeployed().map(r=>({...r,enabled:b(t,"","mcp",r.name)}));e.json({ok:!0,deployedMcp:s})})),c.post("/mcp/deployed/default",a,m,p(async(n,e)=>{const t=String((n.body??{})?.name??"").trim();if(!t){e.status(400).json({ok:!1,error:"name is required"});return}const o=String((n.body??{})?.agentId??"").trim(),s=(n.body??{})?.enabled,r=s==null?null:!!s;if(u(t)&&r===!1){e.status(400).json({ok:!1,error:`\u300C${t}\u300D\u662F\u5185\u7F6E\u901A\u8BAF MCP\uFF0C\u6052\u4E3A\u9ED8\u8BA4\u542F\u7528\uFF0C\u4E0D\u53EF\u5173\u95ED`});return}const i=d(n);if(o){if(!g(o,i)){e.status(403).json({ok:!1,error:"agent-ownership-mismatch"});return}v(i,o,"mcp",t,r)}else S(i,"mcp",t,r);e.json({ok:!0,name:t,agentId:o,enabled:r})})),c.post("/mcp/deployed/inherited",a,m,p(async(n,e)=>{const t=String((n.body??{})?.agentId??"").trim();if(!t){e.status(400).json({ok:!1,error:"agentId is required"});return}const o=d(n);if(!g(t,o)){e.status(403).json({ok:!1,error:"agent-ownership-mismatch"});return}const s=(n.body??{})?.map,r=s&&typeof s=="object"&&!Array.isArray(s)?P(s):s??null;k(o,t,"mcp",r),e.json({ok:!0,agentId:t,count:r&&typeof r=="object"?Object.keys(r).length:0})})),c.post("/mcp/deployed/save",a,m,p(async(n,e)=>{const{name:t,spec:o,defaultEnabled:s,sha256:r}=n.body??{},i=String(t??"").trim();if(!i){e.status(400).json({ok:!1,error:"name is required"});return}const f=D(o);if(!f){e.status(400).json({ok:!1,error:"spec \u975E\u6CD5"});return}if(u(i)){e.status(400).json({ok:!1,error:`\u300C${i}\u300D\u662F\u5185\u7F6E\u901A\u8BAF MCP\uFF0C\u7531\u5B9E\u4F8B\u521D\u59CB\u5316\u81EA\u52A8\u90E8\u7F72\uFF0C\u4E0D\u53EF\u8986\u76D6`});return}const j=d(n),y=l.forScope(j).saveMcp(i,f,s!==!1,r?String(r):void 0);e.status(y.ok?200:400).json(y)})),c.post("/mcp/deployed/remove",a,m,p(async(n,e)=>{const t=String((n.body??{})?.name??"").trim(),o=d(n),s=l.forScope(o).removeMcp(t);e.status(s.ok?200:400).json(s)})),c.post("/mcp/probe",a,m,O,p(async(n,e)=>{const t=n.body??{},o=String(t.name??"").trim();if(!o){e.status(400).json({ok:!1,error:"name is required"});return}if(Object.prototype.hasOwnProperty.call(t,"spec")){e.status(400).json({ok:!1,error:"probe \u53EA\u63A5\u53D7\u5DF2\u90E8\u7F72 MCP \u7684 name\uFF0C\u4E0D\u63A5\u53D7\u8C03\u7528\u65B9\u4F20\u5165 spec"});return}const s=String(t.agentId??"").trim(),r={...s?w(s):{},...A(t.env)},i=await M(o,{scope:d(n),effectiveEnv:r,agentMeta:s?I(s):void 0});e.json(i)})),c.post("/mcp/cc-switch/list",a,p(async(n,e)=>{e.json({ok:!0,mcpServers:[],state:{skills:[],mcpServers:[]}})}));export{c as mcpRouter,D as normalizeSpec,P as stripBuiltinMcpDisable};
2
2
 
@@ -1,2 +1,21 @@
1
1
 
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
2
21
  export declare const pluginsRouter: import("express-serve-static-core").Router;
@@ -1,2 +1,2 @@
1
- import{Router as b}from"express";import{raw as I}from"express";import{validateToken as g,validateTokenOrLoopback as m}from"../middleware/auth.js";import{getEffective as j,setDefault as k,setInherited as S,setOverride as w}from"../services/capability-config.js";import{isValidPluginName as p,pluginManager as u}from"../services/plugin-manager.js";import{createLogger as N}from"../utils/logger.js";const v=N("plugins"),r=b();function i(s){return(e,n)=>{s(e,n).catch(t=>{v.error("[plugins] %s %s \u5931\u8D25: %s",e.method,e.path,t.message),n.headersSent||n.status(500).json({ok:!1,error:t.message})})}}r.get("/plugins/deployed",g,i(async(s,e)=>{const t=(await u.listDeployed()).map(a=>({...a,enabled:j("","plugins",a.pluginName)}));e.json({ok:!0,deployedPlugins:t})})),r.post("/plugins/deployed/default",g,i(async(s,e)=>{const n=String((s.body??{})?.pluginName??"").trim();if(!p(n)){e.status(400).json({ok:!1,error:"pluginName \u975E\u6CD5\uFF08\u987B\u4E3A kebab-case\uFF0C1~64 \u5B57\u7B26\uFF09"});return}const t=String((s.body??{})?.agentId??"").trim(),a=(s.body??{})?.enabled,o=a==null?null:!!a;t?w(t,"plugins",n,o):k("plugins",n,o),e.json({ok:!0,pluginName:n,agentId:t,enabled:o})})),r.post("/plugins/deployed/inherited",g,i(async(s,e)=>{const n=String((s.body??{})?.agentId??"").trim();if(!n){e.status(400).json({ok:!1,error:"agentId is required"});return}const t=(s.body??{})?.map;S(n,"plugins",t??null),e.json({ok:!0,agentId:n,count:Object.keys(t??{}).length})})),r.post("/plugins/deployed/remove",g,i(async(s,e)=>{const n=String((s.body??{})?.pluginName??"").trim();if(!p(n)){e.status(400).json({ok:!1,error:"pluginName \u975E\u6CD5\uFF08\u987B\u4E3A kebab-case\uFF0C1~64 \u5B57\u7B26\uFF09"});return}const t=await u.removeDeployedPlugin(n);e.status(t.ok?200:400).json(t)})),r.get("/plugins/:agentId",g,i(async(s,e)=>{const n=String(s.params.agentId??"").trim();if(!n){e.status(400).json({ok:!1,error:"agentId is required"});return}const t=await u.list(n);e.json({ok:!0,agentId:n,plugins:t})})),r.post("/plugins/:agentId/install",g,i(async(s,e)=>{const n=String(s.params.agentId??"").trim(),t=s.body??{},a=typeof t.source=="string"?t.source:"",o=t.config&&typeof t.config=="object"&&!Array.isArray(t.config)?Object.fromEntries(Object.entries(t.config).filter(d=>typeof d[1]=="string")):void 0;if(!n){e.status(400).json({ok:!1,error:"agentId is required"});return}const c={action:"install",source:a,...o?{config:o}:{}},l=await u.manage(n,c);e.status(l.ok?200:400).json(l)}));function f(s){return[g,i(async(e,n)=>{const t=String(e.params.agentId??"").trim(),a=String(e.params.name??"").trim();if(!t||t==="deployed"||!p(a)){n.status(400).json({ok:!1,error:"agentId \u4E14 name \u987B\u4E3A\u5408\u6CD5\u63D2\u4EF6\u540D\uFF08kebab-case\uFF0C1~64 \u5B57\u7B26\uFF09"});return}const o=await u.manage(t,{action:s,name:a});n.status(o.ok?200:400).json(o)})]}r.post("/plugins/:agentId/:name/reload",...f("reload")),r.post("/plugins/:agentId/:name/enable",...f("enable")),r.post("/plugins/:agentId/:name/disable",...f("disable")),r.delete("/plugins/:agentId/:name",...f("uninstall")),r.get("/plugins/:agentId/:name/logs",g,i(async(s,e)=>{const n=String(s.params.agentId??"").trim(),t=String(s.params.name??"").trim();if(!n||!p(t)){e.status(400).json({ok:!1,error:"agentId \u4E14 name \u987B\u4E3A\u5408\u6CD5\u63D2\u4EF6\u540D\uFF08kebab-case\uFF0C1~64 \u5B57\u7B26\uFF09"});return}const a=await u.getLogs(n,t);e.status(a.ok?200:404).json(a)})),r.get("/plugins/:agentId/commands",g,i(async(s,e)=>{const n=String(s.params.agentId??"").trim();if(!n){e.status(400).json({ok:!1,error:"agentId is required"});return}const t=await u.getPluginCommands(n);e.json({ok:!0,agentId:n,commands:t.map(a=>({name:a.name,description:a.description??"",argumentHint:a.argumentHint??"",sourcePath:a.sourcePath,plugin:a.plugin}))})})),r.get("/plugin-events/:agentId/events",m,i(async(s,e)=>{const n=String(s.params.agentId??"").trim();if(!n){e.status(400).json({ok:!1,error:"agentId is required"});return}const t=Number(s.query.maxPerKey),a=Number.isFinite(t)&&t>0?t:void 0,o=await u.drainEvents(n,{maxPerKey:a});e.json({ok:!0,agentId:n,...o})})),r.post("/plugin-events/:agentId/callback/:plugin",m,i(async(s,e)=>{const n=String(s.params.agentId??"").trim(),t=String(s.params.plugin??"").trim(),a=s.body??{};if(!n||!t){e.status(400).json({ok:!1,error:"agentId and plugin are required"});return}const o=await u.enqueueExternalEvent(n,t,a);e.status(o.ok?200:400).json(o)})),r.post("/plugins/:agentId/private-save",g,i(async(s,e)=>{const n=String(s.params.agentId??"").trim();if(!n){e.status(400).json({ok:!1,error:"agentId is required"});return}const t=s.body??{},a=Buffer.from(String(t.contentBase64??""),"base64");if(a.length===0){e.status(400).json({ok:!1,error:"contentBase64 \u4E3A\u7A7A"});return}const o=String(t.fileName??"plugin.zip"),c=t.config&&typeof t.config=="object"&&!Array.isArray(t.config)?Object.fromEntries(Object.entries(t.config).filter(d=>typeof d[1]=="string")):void 0,l=await u.installFromZip(n,a,o,c);e.status(l.ok?200:400).json(l)})),r.post("/plugins/:agentId/private-remove",g,i(async(s,e)=>{const n=String(s.params.agentId??"").trim(),t=String((s.body??{})?.pluginName??"").trim();if(!n||!p(t)){e.status(400).json({ok:!1,error:"agentId \u4E0E pluginName \u5FC5\u586B\uFF08kebab-case\uFF09"});return}const a=await u.manage(n,{action:"uninstall",name:t});e.status(a.ok?200:400).json(a)})),r.post("/plugins/:agentId/upload",g,I({type:()=>!0,limit:"100mb"}),i(async(s,e)=>{const n=String(s.params.agentId??"").trim();if(!n){e.status(400).json({ok:!1,error:"agentId is required"});return}const t=s.body;if(!Buffer.isBuffer(t)||t.length===0){e.status(400).json({ok:!1,error:"\u7F3A\u5C11 zip \u5185\u5BB9\uFF08raw body, Content-Type: application/zip\uFF09"});return}const a=String(s.query.filename??"plugin.zip");if(!a.toLowerCase().endsWith(".zip")){e.status(400).json({ok:!1,error:"\u4EC5\u652F\u6301 .zip \u63D2\u4EF6\u5305"});return}let o;const c=String(s.query.config??"").trim();if(c)try{const d=JSON.parse(c);if(d&&typeof d=="object"&&!Array.isArray(d))o=Object.fromEntries(Object.entries(d).filter(y=>typeof y[1]=="string"));else{e.status(400).json({ok:!1,error:"config \u5FC5\u987B\u662F JSON \u5BF9\u8C61"});return}}catch{e.status(400).json({ok:!1,error:"config \u4E0D\u662F\u5408\u6CD5\u7684 JSON \u5BF9\u8C61"});return}const l=await u.installFromZip(n,t,a,o);e.status(l.ok?200:400).json(l)}));export{r as pluginsRouter};
1
+ import{Router as S}from"express";import{raw as w}from"express";import{validateToken as g,validateTokenOrLoopback as I}from"../middleware/auth.js";import{assertAgentOwnership as j}from"../services/agent-ownership.js";import{getEffective as h,setDefault as N,setInherited as v,setOverride as O}from"../services/capability-config.js";import{isValidPluginName as f,pluginManager as u}from"../services/plugin-manager.js";import{getUserScopeOrThrow as y,requireAgentOwnership as m,requireUserScope as l}from"../services/user-scope.js";import{createLogger as E}from"../utils/logger.js";const P=E("plugins"),r=S();function i(s){return(n,e)=>{s(n,e).catch(t=>{if(P.error("[plugins] %s %s \u5931\u8D25: %s",n.method,n.path,t.message),!e.headersSent){const a=t.message.includes("agent-ownership-mismatch")?403:500;e.status(a).json({ok:!1,error:t.message})}})}}r.get("/plugins/deployed",g,l,i(async(s,n)=>{const e=y(s),a=(await u.listDeployed(e)).map(o=>({...o,enabled:h(e,"","plugins",o.pluginName)}));n.json({ok:!0,deployedPlugins:a})})),r.post("/plugins/deployed/default",g,l,i(async(s,n)=>{const e=String((s.body??{})?.pluginName??"").trim();if(!f(e)){n.status(400).json({ok:!1,error:"pluginName \u975E\u6CD5\uFF08\u987B\u4E3A kebab-case\uFF0C1~64 \u5B57\u7B26\uFF09"});return}const t=String((s.body??{})?.agentId??"").trim(),a=(s.body??{})?.enabled,o=a==null?null:!!a,c=y(s);if(t){if(!j(t,c)){n.status(403).json({ok:!1,error:"agent-ownership-mismatch"});return}O(c,t,"plugins",e,o)}else N(c,"plugins",e,o);n.json({ok:!0,pluginName:e,agentId:t,enabled:o})})),r.post("/plugins/deployed/inherited",g,l,i(async(s,n)=>{const e=String((s.body??{})?.agentId??"").trim();if(!e){n.status(400).json({ok:!1,error:"agentId is required"});return}const t=y(s);if(!j(e,t)){n.status(403).json({ok:!1,error:"agent-ownership-mismatch"});return}const a=(s.body??{})?.map;v(t,e,"plugins",a??null),n.json({ok:!0,agentId:e,count:Object.keys(a??{}).length})})),r.post("/plugins/deployed/remove",g,l,i(async(s,n)=>{const e=String((s.body??{})?.pluginName??"").trim();if(!f(e)){n.status(400).json({ok:!1,error:"pluginName \u975E\u6CD5\uFF08\u987B\u4E3A kebab-case\uFF0C1~64 \u5B57\u7B26\uFF09"});return}const t=y(s),a=await u.removeDeployedPlugin(e,t);n.status(a.ok?200:400).json(a)})),r.get("/plugins/:agentId",g,l,m,i(async(s,n)=>{const e=String(s.params.agentId??"").trim();if(!e){n.status(400).json({ok:!1,error:"agentId is required"});return}const t=await u.list(e);n.json({ok:!0,agentId:e,plugins:t})})),r.post("/plugins/:agentId/install",g,l,m,i(async(s,n)=>{const e=String(s.params.agentId??"").trim(),t=s.body??{},a=typeof t.source=="string"?t.source:"",o=t.config&&typeof t.config=="object"&&!Array.isArray(t.config)?Object.fromEntries(Object.entries(t.config).filter(d=>typeof d[1]=="string")):void 0;if(!e){n.status(400).json({ok:!1,error:"agentId is required"});return}const c={action:"install",source:a,...o?{config:o}:{}},p=await u.manage(e,c);n.status(p.ok?200:400).json(p)}));function b(s){return[g,l,m,i(async(n,e)=>{const t=String(n.params.agentId??"").trim(),a=String(n.params.name??"").trim();if(!t||t==="deployed"||!f(a)){e.status(400).json({ok:!1,error:"agentId \u4E14 name \u987B\u4E3A\u5408\u6CD5\u63D2\u4EF6\u540D\uFF08kebab-case\uFF0C1~64 \u5B57\u7B26\uFF09"});return}const o=await u.manage(t,{action:s,name:a});e.status(o.ok?200:400).json(o)})]}r.post("/plugins/:agentId/:name/reload",...b("reload")),r.post("/plugins/:agentId/:name/enable",...b("enable")),r.post("/plugins/:agentId/:name/disable",...b("disable")),r.delete("/plugins/:agentId/:name",...b("uninstall")),r.get("/plugins/:agentId/:name/logs",g,l,m,i(async(s,n)=>{const e=String(s.params.agentId??"").trim(),t=String(s.params.name??"").trim();if(!e||!f(t)){n.status(400).json({ok:!1,error:"agentId \u4E14 name \u987B\u4E3A\u5408\u6CD5\u63D2\u4EF6\u540D\uFF08kebab-case\uFF0C1~64 \u5B57\u7B26\uFF09"});return}const a=await u.getLogs(e,t);n.status(a.ok?200:404).json(a)})),r.get("/plugins/:agentId/commands",g,l,m,i(async(s,n)=>{const e=String(s.params.agentId??"").trim();if(!e){n.status(400).json({ok:!1,error:"agentId is required"});return}const t=await u.getPluginCommands(e);n.json({ok:!0,agentId:e,commands:t.map(a=>({name:a.name,description:a.description??"",argumentHint:a.argumentHint??"",sourcePath:a.sourcePath,plugin:a.plugin}))})})),r.get("/plugin-events/:agentId/events",I,i(async(s,n)=>{const e=String(s.params.agentId??"").trim();if(!e){n.status(400).json({ok:!1,error:"agentId is required"});return}const t=Number(s.query.maxPerKey),a=Number.isFinite(t)&&t>0?t:void 0,o=await u.drainEvents(e,{maxPerKey:a});n.json({ok:!0,agentId:e,...o})})),r.post("/plugin-events/:agentId/callback/:plugin",I,i(async(s,n)=>{const e=String(s.params.agentId??"").trim(),t=String(s.params.plugin??"").trim(),a=s.body??{};if(!e||!t){n.status(400).json({ok:!1,error:"agentId and plugin are required"});return}const o=await u.enqueueExternalEvent(e,t,a);n.status(o.ok?200:400).json(o)})),r.post("/plugins/:agentId/private-save",g,l,m,i(async(s,n)=>{const e=String(s.params.agentId??"").trim();if(!e){n.status(400).json({ok:!1,error:"agentId is required"});return}const t=s.body??{},a=Buffer.from(String(t.contentBase64??""),"base64");if(a.length===0){n.status(400).json({ok:!1,error:"contentBase64 \u4E3A\u7A7A"});return}const o=String(t.fileName??"plugin.zip"),c=t.config&&typeof t.config=="object"&&!Array.isArray(t.config)?Object.fromEntries(Object.entries(t.config).filter(d=>typeof d[1]=="string")):void 0,p=await u.installFromZip(e,a,o,c);n.status(p.ok?200:400).json(p)})),r.post("/plugins/:agentId/private-remove",g,l,m,i(async(s,n)=>{const e=String(s.params.agentId??"").trim(),t=String((s.body??{})?.pluginName??"").trim();if(!e||!f(t)){n.status(400).json({ok:!1,error:"agentId \u4E0E pluginName \u5FC5\u586B\uFF08kebab-case\uFF09"});return}const a=await u.manage(e,{action:"uninstall",name:t});n.status(a.ok?200:400).json(a)})),r.post("/plugins/:agentId/upload",g,l,m,w({type:()=>!0,limit:"100mb"}),i(async(s,n)=>{const e=String(s.params.agentId??"").trim();if(!e){n.status(400).json({ok:!1,error:"agentId is required"});return}const t=s.body;if(!Buffer.isBuffer(t)||t.length===0){n.status(400).json({ok:!1,error:"\u7F3A\u5C11 zip \u5185\u5BB9\uFF08raw body, Content-Type: application/zip\uFF09"});return}const a=String(s.query.filename??"plugin.zip");if(!a.toLowerCase().endsWith(".zip")){n.status(400).json({ok:!1,error:"\u4EC5\u652F\u6301 .zip \u63D2\u4EF6\u5305"});return}let o;const c=String(s.query.config??"").trim();if(c)try{const d=JSON.parse(c);if(d&&typeof d=="object"&&!Array.isArray(d))o=Object.fromEntries(Object.entries(d).filter(k=>typeof k[1]=="string"));else{n.status(400).json({ok:!1,error:"config \u5FC5\u987B\u662F JSON \u5BF9\u8C61"});return}}catch{n.status(400).json({ok:!1,error:"config \u4E0D\u662F\u5408\u6CD5\u7684 JSON \u5BF9\u8C61"});return}const p=await u.installFromZip(e,t,a,o);n.status(p.ok?200:400).json(p)}));export{r as pluginsRouter};
2
2
 
@@ -1,2 +1,6 @@
1
1
 
2
+
3
+
4
+
5
+
2
6
  export declare const processesRouter: import("express-serve-static-core").Router;
@@ -1,2 +1,6 @@
1
1
 
2
+
3
+
4
+
5
+
2
6
  export declare const propertiesRouter: import("express-serve-static-core").Router;
@@ -38,24 +38,44 @@ export interface PtySessionEntry extends PtySessionSummary {
38
38
  }
39
39
  export declare const ptySessions: Map<string, PtySessionEntry>;
40
40
 
41
+
42
+
43
+
41
44
  export declare function resolvePtyIdleTtlMs(env?: NodeJS.ProcessEnv): number;
42
45
 
46
+
47
+
48
+
49
+
50
+
43
51
  export declare function resolveDefaultShell(platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv, existsSync?: (path: fs.PathLike) => boolean): {
44
52
  shell: string;
45
53
  args: string[];
46
54
  };
47
55
 
56
+
57
+
58
+
48
59
  export declare function resolveRequestedShell(requestedShell: unknown, platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): {
49
60
  shell: string;
50
61
  args: string[];
51
62
  };
52
63
 
64
+
65
+
66
+
53
67
  export declare function isPathInsideRoot(candidatePath: string, rootPath: string): boolean;
54
68
 
69
+
70
+
71
+
55
72
  export declare function resolvePtyWorkspacePath(workspacePath: unknown, env?: NodeJS.ProcessEnv): string;
56
73
 
57
74
  export declare function readPtyOutputBuffer(session: PtySessionEntry): string;
58
75
 
76
+
77
+
78
+
59
79
  export declare function createPtySession(input: {
60
80
  workspacePath: unknown;
61
81
  title?: unknown;
@@ -73,15 +93,24 @@ export declare function resolveMaxPtySessions(env?: NodeJS.ProcessEnv): number;
73
93
  export declare function listPtySessions(): PtySessionSummary[];
74
94
  export declare function getPtySessionSummary(id: string): PtySessionSummary | undefined;
75
95
 
96
+
97
+
98
+
76
99
  export declare function createPtyConnectToken(sessionId: string): {
77
100
  token: string;
78
101
  expiresAt: string;
79
102
  } | undefined;
80
103
 
104
+
105
+
106
+
81
107
  export declare function closePtySession(id: string, reason?: string): boolean;
82
108
  export declare function closeAllPtySessions(reason?: string): void;
83
109
  export declare const ptyRouter: Router;
84
110
 
111
+
112
+
113
+
85
114
  export declare function attachPtyWebSocketServer(server: {
86
115
  on: (event: "upgrade", listener: (request: IncomingMessage, socket: Socket, head: Buffer) => void) => unknown;
87
116
  }): void;
@@ -13,5 +13,8 @@ export interface RuntimeTokenRequestResult {
13
13
  error?: string;
14
14
  }
15
15
 
16
+
17
+
18
+
16
19
  export declare function resolveRuntimeTokenRequest(input: RuntimeTokenRequestInput): RuntimeTokenRequestResult;
17
20
  export declare function logRuntimeBindingStartupState(): void;
@@ -1,4 +1,8 @@
1
1
 
2
+
3
+
4
+
5
+
2
6
  export declare const sessionsRouter: import("express-serve-static-core").Router;
3
7
  export interface HandleCapabilityToolsRequestInput {
4
8
  agentId: string;
@@ -11,6 +15,14 @@ export interface HandleCapabilityToolsRequestInput {
11
15
  resolveAdapter?: (providerId: string) => unknown;
12
16
  }
13
17
 
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
14
26
  export declare function handleCapabilityToolsRequest(input: HandleCapabilityToolsRequestInput): Promise<{
15
27
  status: number;
16
28
  body: Record<string, unknown>;
@@ -27,9 +39,19 @@ export interface HandleCapabilityToolCallRequestInput {
27
39
  resolveAdapter?: (providerId: string) => unknown;
28
40
  }
29
41
 
42
+
43
+
44
+
45
+
46
+
47
+
48
+
30
49
  export declare function handleCapabilityToolCallRequest(input: HandleCapabilityToolCallRequestInput): Promise<{
31
50
  status: number;
32
51
  body: Record<string, unknown>;
33
52
  }>;
34
53
 
54
+
55
+
56
+
35
57
  export declare function resolveActiveSdkSessionSnapshotStatus(adapterStatus?: string, currentRuntimeStatus?: string, currentRuntimeActionType?: string): string;
@@ -1,2 +1,17 @@
1
1
 
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
2
17
  export declare const skillsRouter: import("express-serve-static-core").Router;
@@ -1,2 +1,2 @@
1
- import{Router as y}from"express";import{raw as p}from"express";import{validateToken as a}from"../middleware/auth.js";import{getEffective as g,setDefault as S,setInherited as b,setOverride as j}from"../services/capability-config.js";import{skillManager as d,isValidSkillName as m}from"../services/skill-manager.js";import{createLogger as h}from"../utils/logger.js";const v=h("skills"),n=y();function o(t){return(e,s)=>{t(e,s).catch(l=>{v.error("[skills] %s %s \u5931\u8D25: %s",e.method,e.path,l.message),s.headersSent||s.status(500).json({ok:!1,error:l.message})})}}n.post("/skills/deployed/list",a,o(async(t,e)=>{const l=d.listDeployed().map(i=>({...i,enabled:g("","skills",i.skillName)}));e.json({ok:!0,deployedSkills:l})})),n.get("/skills/deployed",a,o(async(t,e)=>{const l=d.listDeployed().map(i=>({...i,enabled:g("","skills",i.skillName)}));e.json({ok:!0,deployedSkills:l})})),n.post("/skills/deployed/default",a,o(async(t,e)=>{const s=String((t.body??{})?.skillName??"").trim();if(!m(s)){e.status(400).json({ok:!1,error:"skillName \u975E\u6CD5"});return}const l=String((t.body??{})?.agentId??"").trim(),i=(t.body??{})?.enabled,r=i==null?null:!!i;l?j(l,"skills",s,r):S("skills",s,r),e.json({ok:!0,skillName:s,agentId:l,enabled:r})})),n.post("/skills/deployed/inherited",a,o(async(t,e)=>{const s=String((t.body??{})?.agentId??"").trim();if(!s){e.status(400).json({ok:!1,error:"agentId is required"});return}const l=(t.body??{})?.map;b(s,"skills",l??null),e.json({ok:!0,agentId:s,count:Object.keys(l??{}).length})})),n.post("/skills/deployed/upload",a,p({type:"application/zip",limit:"200mb"}),o(async(t,e)=>{const s=t.body??{},l=Buffer.isBuffer(s)?s:Buffer.from(s??"");if(!l||l.length===0){e.status(400).json({ok:!1,error:"zip \u5185\u5BB9\u4E3A\u7A7A"});return}const i=String(t.query.filename??t.headers["x-filename"]??"skill.zip"),r=String(t.query.sha256??"").trim()||void 0,k=t.query.defaultEnabled!=="false",u=await d.saveSharedSkill(l,String(i),k,r);e.status(u.ok?200:400).json(u)})),n.post("/skills/deployed/remove",a,o(async(t,e)=>{const s=String((t.body??{})?.skillName??"").trim();if(!m(s)){e.status(400).json({ok:!1,error:"skillName \u975E\u6CD5"});return}const l=await d.removeDeployedSkill(s);e.status(l.ok?200:400).json(l)})),n.post("/skills/private/:agentId/upload",a,p({type:()=>!0,limit:"200mb"}),o(async(t,e)=>{const s=String(t.params.agentId??"").trim();if(!s){e.status(400).json({ok:!1,error:"agentId is required"});return}const l=t.body;if(!Buffer.isBuffer(l)||l.length===0){e.status(400).json({ok:!1,error:"zip \u5185\u5BB9\u4E3A\u7A7A"});return}const i=t.query,r=String(i.filename??t.headers["x-filename"]??"skill.zip"),k=String(i.sha256??"").trim()||void 0,u=String(i.skillName??"").trim()||void 0,f=await d.savePrivateSkill(s,l,r,k,u);e.status(f.ok?200:400).json(f)})),n.post("/skills/private/:agentId/save",a,o(async(t,e)=>{const s=String(t.params.agentId??"").trim();if(!s){e.status(400).json({ok:!1,error:"agentId is required"});return}const l=t.body??{},i=String(l.contentBase64??""),r=Buffer.from(i,"base64");if(r.length===0){e.status(400).json({ok:!1,error:"contentBase64 \u4E3A\u7A7A"});return}const k=String(l.fileName??"skill.zip"),u=String(l.sha256??"").trim()||void 0,f=String(l.skillName??"").trim()||void 0,c=await d.savePrivateSkill(s,r,k,u,f);e.status(c.ok?200:400).json(c)})),n.post("/skills/private/:agentId/remove",a,o(async(t,e)=>{const s=String(t.params.agentId??"").trim(),l=String((t.body??{})?.skillName??"").trim();if(!s||!m(l)){e.status(400).json({ok:!1,error:"agentId \u4E0E skillName \u5FC5\u586B"});return}const i=await d.removePrivateSkill(s,l);e.status(i.ok?200:400).json(i)})),n.post("/skills/private/:agentId/list",a,o(async(t,e)=>{const s=String(t.params.agentId??"").trim();if(!s){e.status(400).json({ok:!1,error:"agentId is required"});return}e.json({ok:!0,agentId:s,privateSkills:d.listPrivateSkills(s)})})),n.post("/skills/cc-switch/list",a,o(async(t,e)=>{e.json({ok:!0,skills:[],state:{skills:[],mcpServers:[]}})}));export{n as skillsRouter};
1
+ import{Router as j}from"express";import{raw as h}from"express";import{validateToken as a}from"../middleware/auth.js";import{assertAgentOwnership as v}from"../services/agent-ownership.js";import{getEffective as b,setDefault as I,setInherited as N,setOverride as w}from"../services/capability-config.js";import{SkillManager as u,isValidSkillName as y}from"../services/skill-manager.js";import{getUserScopeOrThrow as r,requireUserScope as c}from"../services/user-scope.js";import{createLogger as B}from"../utils/logger.js";const z=B("skills"),d=j();function f(s){return(e,t)=>{s(e,t).catch(o=>{if(z.error("[skills] %s %s \u5931\u8D25: %s",e.method,e.path,o.message),!t.headersSent){const n=o.message.includes("agent-ownership-mismatch")?403:500;t.status(n).json({ok:!1,error:o.message})}})}}function m(s,e,t){const o=r(s);return v(t,o)?!0:(e.status(403).json({ok:!1,error:"agent-ownership-mismatch",message:"\u8BE5\u5B9E\u4F8B\u4E0D\u5C5E\u4E8E\u5F53\u524D\u7528\u6237"}),!1)}d.post("/skills/deployed/list",a,c,f(async(s,e)=>{const t=r(s),i=u.forScope(t).listDeployed().map(l=>({...l,enabled:b(t,"","skills",l.skillName)}));e.json({ok:!0,deployedSkills:i})})),d.get("/skills/deployed",a,c,f(async(s,e)=>{const t=r(s),i=u.forScope(t).listDeployed().map(l=>({...l,enabled:b(t,"","skills",l.skillName)}));e.json({ok:!0,deployedSkills:i})})),d.post("/skills/deployed/default",a,c,f(async(s,e)=>{const t=r(s),o=String((s.body??{})?.skillName??"").trim();if(!y(o)){e.status(400).json({ok:!1,error:"skillName \u975E\u6CD5"});return}const n=String((s.body??{})?.agentId??"").trim();if(n&&!m(s,e,n))return;const i=(s.body??{})?.enabled,l=i==null?null:!!i;n?w(t,n,"skills",o,l):I(t,"skills",o,l),e.json({ok:!0,skillName:o,agentId:n,enabled:l})})),d.post("/skills/deployed/inherited",a,c,f(async(s,e)=>{const t=r(s),o=String((s.body??{})?.agentId??"").trim();if(!o){e.status(400).json({ok:!1,error:"agentId is required"});return}if(!m(s,e,o))return;const n=(s.body??{})?.map;N(t,o,"skills",n??null),e.json({ok:!0,agentId:o,count:Object.keys(n??{}).length})})),d.post("/skills/deployed/upload",a,c,h({type:"application/zip",limit:"200mb"}),f(async(s,e)=>{const t=r(s),o=s.body??{},n=Buffer.isBuffer(o)?o:Buffer.from(o??"");if(!n||n.length===0){e.status(400).json({ok:!1,error:"zip \u5185\u5BB9\u4E3A\u7A7A"});return}const i=String(s.query.filename??s.headers["x-filename"]??"skill.zip"),l=String(s.query.sha256??"").trim()||void 0,k=s.query.defaultEnabled!=="false",p=await u.forScope(t).saveSharedSkill(n,String(i),k,l);e.status(p.ok?200:400).json(p)})),d.post("/skills/deployed/remove",a,c,f(async(s,e)=>{const t=r(s),o=String((s.body??{})?.skillName??"").trim();if(!y(o)){e.status(400).json({ok:!1,error:"skillName \u975E\u6CD5"});return}const n=await u.forScope(t).removeDeployedSkill(o);e.status(n.ok?200:400).json(n)})),d.post("/skills/private/:agentId/upload",a,c,h({type:()=>!0,limit:"200mb"}),f(async(s,e)=>{const t=String(s.params.agentId??"").trim();if(!t){e.status(400).json({ok:!1,error:"agentId is required"});return}if(!m(s,e,t))return;const o=r(s),n=s.body;if(!Buffer.isBuffer(n)||n.length===0){e.status(400).json({ok:!1,error:"zip \u5185\u5BB9\u4E3A\u7A7A"});return}const i=s.query,l=String(i.filename??s.headers["x-filename"]??"skill.zip"),k=String(i.sha256??"").trim()||void 0,p=String(i.skillName??"").trim()||void 0,g=await u.forScope(o).savePrivateSkill(t,n,l,k,p);e.status(g.ok?200:400).json(g)})),d.post("/skills/private/:agentId/save",a,c,f(async(s,e)=>{const t=String(s.params.agentId??"").trim();if(!t){e.status(400).json({ok:!1,error:"agentId is required"});return}if(!m(s,e,t))return;const o=r(s),n=s.body??{},i=String(n.contentBase64??""),l=Buffer.from(i,"base64");if(l.length===0){e.status(400).json({ok:!1,error:"contentBase64 \u4E3A\u7A7A"});return}const k=String(n.fileName??"skill.zip"),p=String(n.sha256??"").trim()||void 0,g=String(n.skillName??"").trim()||void 0,S=await u.forScope(o).savePrivateSkill(t,l,k,p,g);e.status(S.ok?200:400).json(S)})),d.post("/skills/private/:agentId/remove",a,c,f(async(s,e)=>{const t=String(s.params.agentId??"").trim(),o=String((s.body??{})?.skillName??"").trim();if(!t||!y(o)){e.status(400).json({ok:!1,error:"agentId \u4E0E skillName \u5FC5\u586B"});return}if(!m(s,e,t))return;const n=r(s),i=await u.forScope(n).removePrivateSkill(t,o);e.status(i.ok?200:400).json(i)})),d.post("/skills/private/:agentId/list",a,c,f(async(s,e)=>{const t=String(s.params.agentId??"").trim();if(!t){e.status(400).json({ok:!1,error:"agentId is required"});return}if(!m(s,e,t))return;const o=r(s);e.json({ok:!0,agentId:t,privateSkills:u.forScope(o).listPrivateSkills(t)})})),d.post("/skills/cc-switch/list",a,c,f(async(s,e)=>{e.json({ok:!0,skills:[],state:{skills:[],mcpServers:[]}})}));export{d as skillsRouter};
2
2
 
@@ -1,2 +1,13 @@
1
1
 
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
2
13
  export declare const subAgentsRouter: import("express-serve-static-core").Router;
@@ -1,4 +1,4 @@
1
- import{Router as m}from"express";import{validateToken as c}from"../middleware/auth.js";import{noteDashboardActivity as l}from"./dashboard.js";import{subAgentManager as u,subAgentStore as g}from"../services/sub-agent-manager-instance.js";import{createLogger as f}from"../utils/logger.js";const b=f("sub-agents"),p=m();p.get("/sub-agents/:agentId",c,async(r,t)=>{const s=String(r.params.agentId??"");if(!s.trim()){t.status(400).json({ok:!1,error:"agentId is required"});return}try{const e=await g.list(s),n=u.listActiveByParent(s),o=new Set(n.map(a=>a.subId)),i=n.map(a=>({subId:a.subId,parentAgentId:a.parentAgentId,parentSessionId:a.parentSessionId,subagentType:a.subagentType,description:a.description,prompt:a.prompt,status:a.status,startedAt:a.startedAt,contextSnapshot:a.contextSnapshot,availableTools:a.availableTools})),d=e.filter(a=>!o.has(a.subId)&&a.status!=="running"&&a.status!=="pending"),I=await g.read(s);t.json({ok:!0,agentId:s,updatedAt:I.updatedAt,running:i,history:d})}catch(e){const n=e;b.error("[sub-agents] \u5217\u8868\u5931\u8D25: %s",n.message),t.status(500).json({ok:!1,error:n.message})}}),p.get("/sub-agents/:agentId/events",c,async(r,t)=>{l();const s=String(r.params.agentId??"");if(!s.trim()){t.status(400).json({ok:!1,error:"agentId is required"});return}t.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),t.write(`: connected
1
+ import{Router as m}from"express";import{validateToken as c}from"../middleware/auth.js";import{subAgentManager as u,subAgentStore as g}from"../services/sub-agent-manager-instance.js";import{createLogger as f}from"../utils/logger.js";import{noteDashboardActivity as l}from"./dashboard.js";const b=f("sub-agents"),p=m();p.get("/sub-agents/:agentId",c,async(r,t)=>{const s=String(r.params.agentId??"");if(!s.trim()){t.status(400).json({ok:!1,error:"agentId is required"});return}try{const e=await g.list(s),n=u.listActiveByParent(s),o=new Set(n.map(a=>a.subId)),i=n.map(a=>({subId:a.subId,parentAgentId:a.parentAgentId,parentSessionId:a.parentSessionId,subagentType:a.subagentType,description:a.description,prompt:a.prompt,status:a.status,startedAt:a.startedAt,contextSnapshot:a.contextSnapshot,availableTools:a.availableTools})),d=e.filter(a=>!o.has(a.subId)&&a.status!=="running"&&a.status!=="pending"),I=await g.read(s);t.json({ok:!0,agentId:s,updatedAt:I.updatedAt,running:i,history:d})}catch(e){const n=e;b.error("[sub-agents] \u5217\u8868\u5931\u8D25: %s",n.message),t.status(500).json({ok:!1,error:n.message})}}),p.get("/sub-agents/:agentId/events",c,async(r,t)=>{l();const s=String(r.params.agentId??"");if(!s.trim()){t.status(400).json({ok:!1,error:"agentId is required"});return}t.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}),t.write(`: connected
2
2
 
3
3
  `);const e=u.listActiveByParent(s);e.length>0&&t.write(`data: ${JSON.stringify({type:"snapshot",agentId:s,timestamp:new Date().toISOString(),data:{running:e.map(i=>({subId:i.subId,subagentType:i.subagentType,description:i.description,status:i.status,startedAt:i.startedAt}))}})}
4
4
 
@@ -1,2 +1,7 @@
1
1
 
2
+
3
+
4
+
5
+
6
+
2
7
  export declare const taskContextRouter: import("express-serve-static-core").Router;
@@ -1,2 +1,6 @@
1
1
 
2
+
3
+
4
+
5
+
2
6
  export declare const techStackRouter: import("express-serve-static-core").Router;