@cjhyy/code-shell-core 0.7.0 → 0.8.0

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 (621) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +20 -5
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +20 -4
  26. package/dist/context/manager.js +42 -7
  27. package/dist/context/token-counter.js +5 -3
  28. package/dist/context/tool-result-storage.d.ts +6 -0
  29. package/dist/context/tool-result-storage.js +25 -4
  30. package/dist/credentials/access.d.ts +13 -2
  31. package/dist/credentials/access.js +99 -4
  32. package/dist/credentials/index.d.ts +3 -2
  33. package/dist/credentials/index.js +2 -1
  34. package/dist/credentials/oauth.d.ts +9 -1
  35. package/dist/credentials/oauth.js +80 -1
  36. package/dist/credentials/store.d.ts +16 -2
  37. package/dist/credentials/store.js +33 -11
  38. package/dist/credentials/types.d.ts +62 -1
  39. package/dist/credentials/types.js +16 -1
  40. package/dist/credentials/use-credential-tool.js +15 -1
  41. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  42. package/dist/engine/auxiliary-pipeline.js +181 -0
  43. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  44. package/dist/{settings → engine}/disk-defaults.js +5 -2
  45. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  46. package/dist/engine/dynamic-tool-defs.js +4 -0
  47. package/dist/engine/engine.d.ts +272 -184
  48. package/dist/engine/engine.js +1869 -1864
  49. package/dist/engine/file-history-hook.d.ts +11 -0
  50. package/dist/engine/file-history-hook.js +31 -0
  51. package/dist/engine/goal-judge-context.d.ts +9 -0
  52. package/dist/engine/goal-judge-context.js +234 -0
  53. package/dist/engine/injected-context-cache.d.ts +6 -0
  54. package/dist/engine/injected-context-cache.js +13 -0
  55. package/dist/engine/input-attachments.d.ts +1 -1
  56. package/dist/engine/model-facade.d.ts +3 -3
  57. package/dist/engine/model-facade.js +15 -14
  58. package/dist/engine/permission-controller.d.ts +55 -0
  59. package/dist/engine/permission-controller.js +148 -0
  60. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  61. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  62. package/dist/engine/run-accounting.d.ts +41 -0
  63. package/dist/engine/run-accounting.js +126 -0
  64. package/dist/engine/run-context.d.ts +44 -0
  65. package/dist/engine/run-context.js +88 -0
  66. package/dist/engine/run-environment.d.ts +30 -0
  67. package/dist/engine/run-environment.js +77 -0
  68. package/dist/engine/run-finalize.d.ts +58 -0
  69. package/dist/engine/run-finalize.js +245 -0
  70. package/dist/engine/run-goal.d.ts +58 -0
  71. package/dist/engine/run-goal.js +188 -0
  72. package/dist/engine/run-image-input.d.ts +1 -1
  73. package/dist/engine/run-image-input.js +5 -3
  74. package/dist/engine/run-session-open.d.ts +41 -0
  75. package/dist/engine/run-session-open.js +186 -0
  76. package/dist/engine/run-setup.d.ts +42 -0
  77. package/dist/engine/run-setup.js +58 -0
  78. package/dist/engine/run-tooling.d.ts +125 -0
  79. package/dist/engine/run-tooling.js +283 -0
  80. package/dist/engine/run-types.d.ts +139 -0
  81. package/dist/engine/run-types.js +12 -0
  82. package/dist/engine/run-workspace.d.ts +50 -0
  83. package/dist/engine/run-workspace.js +114 -0
  84. package/dist/engine/session-title.d.ts +2 -1
  85. package/dist/engine/session-title.js +4 -1
  86. package/dist/engine/steer-queue.d.ts +1 -1
  87. package/dist/engine/subagent-spawner.d.ts +32 -0
  88. package/dist/engine/subagent-spawner.js +287 -0
  89. package/dist/engine/tool-summary.d.ts +2 -2
  90. package/dist/engine/tool-summary.js +2 -2
  91. package/dist/engine/turn-loop.d.ts +67 -10
  92. package/dist/engine/turn-loop.js +538 -97
  93. package/dist/engine/types.d.ts +35 -4
  94. package/dist/engine/types.js +1 -1
  95. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
  96. package/dist/goal/lifecycle.js +482 -0
  97. package/dist/hooks/events.d.ts +26 -9
  98. package/dist/hooks/events.js +0 -3
  99. package/dist/hooks/goal-stop-hook.d.ts +28 -29
  100. package/dist/hooks/goal-stop-hook.js +344 -144
  101. package/dist/hooks/registry.js +4 -1
  102. package/dist/hooks/shell-runner.d.ts +12 -1
  103. package/dist/hooks/shell-runner.js +160 -9
  104. package/dist/index.d.ts +51 -110
  105. package/dist/index.extension.d.ts +51 -0
  106. package/dist/index.extension.js +39 -0
  107. package/dist/index.internal.d.ts +86 -0
  108. package/dist/index.internal.js +92 -0
  109. package/dist/index.js +37 -125
  110. package/dist/links/cli.d.ts +48 -0
  111. package/dist/links/cli.js +617 -0
  112. package/dist/links/http.d.ts +40 -0
  113. package/dist/links/http.js +166 -0
  114. package/dist/links/index.d.ts +4 -0
  115. package/dist/links/index.js +3 -0
  116. package/dist/links/link-action-tool.d.ts +5 -0
  117. package/dist/links/link-action-tool.js +241 -0
  118. package/dist/links/providers.d.ts +8 -0
  119. package/dist/links/providers.js +665 -0
  120. package/dist/links/types.d.ts +44 -0
  121. package/dist/llm/client-base.d.ts +7 -0
  122. package/dist/llm/client-base.js +72 -10
  123. package/dist/llm/model-pool.d.ts +1 -1
  124. package/dist/llm/model-pool.js +1 -1
  125. package/dist/llm/providers/anthropic.d.ts +1 -0
  126. package/dist/llm/providers/anthropic.js +9 -0
  127. package/dist/llm/providers/openai.d.ts +1 -0
  128. package/dist/llm/providers/openai.js +17 -0
  129. package/dist/llm/types.d.ts +12 -5
  130. package/dist/model-catalog/index.js +15 -2
  131. package/dist/model-catalog/resolve.d.ts +13 -1
  132. package/dist/model-catalog/resolve.js +37 -2
  133. package/dist/model-catalog/types.d.ts +74 -48
  134. package/dist/model-catalog/types.js +16 -5
  135. package/dist/model-catalog/upsert.d.ts +3 -1
  136. package/dist/model-catalog/upsert.js +9 -0
  137. package/dist/onboarding.d.ts +0 -1
  138. package/dist/onboarding.js +1 -22
  139. package/dist/panel-apps/bindings.d.ts +24 -0
  140. package/dist/panel-apps/bindings.js +69 -0
  141. package/dist/panel-apps/github-archive.d.ts +21 -0
  142. package/dist/panel-apps/github-archive.js +98 -0
  143. package/dist/panel-apps/index.d.ts +4 -0
  144. package/dist/panel-apps/index.js +4 -0
  145. package/dist/panel-apps/installer.d.ts +68 -0
  146. package/dist/panel-apps/installer.js +622 -0
  147. package/dist/panel-apps/manifest.d.ts +364 -0
  148. package/dist/panel-apps/manifest.js +189 -0
  149. package/dist/panel-apps/paths.d.ts +13 -0
  150. package/dist/panel-apps/paths.js +38 -0
  151. package/dist/panel-apps/registry.d.ts +51 -0
  152. package/dist/panel-apps/registry.js +99 -0
  153. package/dist/panel-apps/runtime.d.ts +80 -0
  154. package/dist/panel-apps/runtime.js +154 -0
  155. package/dist/plugins/gitOps.js +8 -1
  156. package/dist/plugins/installedPlugins.d.ts +2 -1
  157. package/dist/plugins/installedPlugins.js +146 -8
  158. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  159. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  160. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  161. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  162. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  163. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  164. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  165. package/dist/plugins/installer/install.d.ts +7 -1
  166. package/dist/plugins/installer/install.js +21 -87
  167. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  168. package/dist/plugins/installer/installFromArchive.js +44 -27
  169. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  170. package/dist/plugins/installer/installFromNpm.js +273 -0
  171. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  172. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  173. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  174. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  175. package/dist/plugins/installer/normalizeManifest.js +306 -0
  176. package/dist/plugins/installer/npmTar.d.ts +13 -0
  177. package/dist/plugins/installer/npmTar.js +321 -0
  178. package/dist/plugins/installer/parseSource.d.ts +11 -0
  179. package/dist/plugins/installer/parseSource.js +48 -0
  180. package/dist/plugins/installer/preview.d.ts +101 -0
  181. package/dist/plugins/installer/preview.js +336 -0
  182. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  183. package/dist/plugins/installer/projectPluginSource.js +140 -0
  184. package/dist/plugins/installer/types.d.ts +775 -0
  185. package/dist/plugins/installer/types.js +100 -0
  186. package/dist/plugins/installer/unzip.d.ts +11 -0
  187. package/dist/plugins/installer/unzip.js +123 -9
  188. package/dist/plugins/installer/update.d.ts +2 -2
  189. package/dist/plugins/installer/update.js +43 -4
  190. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  191. package/dist/plugins/loadPluginHooks.js +97 -86
  192. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  193. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  194. package/dist/plugins/pluginCatalog.d.ts +45 -0
  195. package/dist/plugins/pluginCatalog.js +87 -0
  196. package/dist/plugins/pluginCommandHook.d.ts +10 -4
  197. package/dist/plugins/pluginCommandHook.js +133 -18
  198. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  199. package/dist/plugins/pluginCommandsLoader.js +181 -7
  200. package/dist/plugins/pluginContent.d.ts +10 -1
  201. package/dist/plugins/pluginContent.js +87 -30
  202. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  203. package/dist/plugins/pluginHookApproval.js +160 -0
  204. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  205. package/dist/plugins/pluginHookIntegrity.js +361 -0
  206. package/dist/plugins/pluginInstaller.js +71 -12
  207. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  208. package/dist/plugins/pluginMcpApproval.js +110 -0
  209. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  210. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  211. package/dist/plugins/types.d.ts +30 -0
  212. package/dist/plugins/varRewrite.d.ts +9 -5
  213. package/dist/plugins/varRewrite.js +26 -17
  214. package/dist/preset/index.d.ts +11 -8
  215. package/dist/preset/index.js +62 -203
  216. package/dist/product/define.js +9 -3
  217. package/dist/product/types.d.ts +0 -2
  218. package/dist/profile/activation.d.ts +36 -0
  219. package/dist/profile/activation.js +57 -0
  220. package/dist/profile/catalog-store.d.ts +77 -0
  221. package/dist/profile/catalog-store.js +346 -0
  222. package/dist/profile/catalog.d.ts +54 -0
  223. package/dist/profile/catalog.js +152 -0
  224. package/dist/profile/index.d.ts +7 -0
  225. package/dist/profile/index.js +7 -0
  226. package/dist/profile/requirements.d.ts +76 -0
  227. package/dist/profile/requirements.js +117 -0
  228. package/dist/profile/resolve.d.ts +11 -0
  229. package/dist/profile/resolve.js +41 -0
  230. package/dist/profile/store.d.ts +17 -0
  231. package/dist/profile/store.js +167 -0
  232. package/dist/profile/types.d.ts +321 -0
  233. package/dist/profile/types.js +104 -0
  234. package/dist/prompt/composer.d.ts +46 -7
  235. package/dist/prompt/composer.js +78 -48
  236. package/dist/prompt/instruction-scanner.d.ts +6 -5
  237. package/dist/prompt/instruction-scanner.js +8 -23
  238. package/dist/prompt/section-loader.d.ts +2 -2
  239. package/dist/prompt/section-loader.js +7 -4
  240. package/dist/prompt/sections/browser.md +10 -9
  241. package/dist/prompt/sections/harness-base.md +9 -0
  242. package/dist/protocol/chat-session-manager.d.ts +77 -3
  243. package/dist/protocol/chat-session-manager.js +194 -18
  244. package/dist/protocol/chat-session.d.ts +72 -9
  245. package/dist/protocol/chat-session.js +151 -16
  246. package/dist/protocol/client.d.ts +37 -4
  247. package/dist/protocol/client.js +118 -6
  248. package/dist/protocol/index.d.ts +2 -2
  249. package/dist/protocol/index.js +2 -2
  250. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  251. package/dist/protocol/mobile-remote-types.js +1 -0
  252. package/dist/protocol/server.d.ts +152 -14
  253. package/dist/protocol/server.js +1574 -229
  254. package/dist/protocol/types.d.ts +182 -32
  255. package/dist/protocol/types.js +18 -0
  256. package/dist/run/ArtifactTracker.d.ts +6 -1
  257. package/dist/run/ArtifactTracker.js +29 -21
  258. package/dist/run/EngineRunner.d.ts +2 -0
  259. package/dist/run/EngineRunner.js +1 -0
  260. package/dist/run/RunManager.d.ts +26 -0
  261. package/dist/run/RunManager.js +82 -11
  262. package/dist/run/factory.d.ts +3 -0
  263. package/dist/run/factory.js +2 -0
  264. package/dist/runtime/safe-spawn.d.ts +6 -0
  265. package/dist/runtime/safe-spawn.js +8 -13
  266. package/dist/services/auto-dream.d.ts +13 -1
  267. package/dist/services/auto-dream.js +56 -8
  268. package/dist/services/dream-consolidation.d.ts +3 -0
  269. package/dist/services/dream-consolidation.js +14 -2
  270. package/dist/services/index.d.ts +1 -1
  271. package/dist/services/index.js +1 -1
  272. package/dist/services/memory-orchestrator.js +6 -2
  273. package/dist/services/oauth.d.ts +34 -10
  274. package/dist/services/oauth.js +236 -98
  275. package/dist/services/session-memory.d.ts +4 -4
  276. package/dist/services/session-memory.js +13 -10
  277. package/dist/session/memory.d.ts +26 -7
  278. package/dist/session/memory.js +79 -21
  279. package/dist/session/session-manager.d.ts +208 -25
  280. package/dist/session/session-manager.js +1232 -116
  281. package/dist/session/session-message.d.ts +22 -0
  282. package/dist/session/session-message.js +1 -0
  283. package/dist/session/transcript.d.ts +76 -6
  284. package/dist/session/transcript.js +278 -7
  285. package/dist/settings/feature-flags.d.ts +40 -0
  286. package/dist/settings/feature-flags.js +40 -0
  287. package/dist/settings/manager.d.ts +39 -1
  288. package/dist/settings/manager.js +102 -41
  289. package/dist/settings/migrate-config.js +4 -2
  290. package/dist/settings/schema.d.ts +511 -177
  291. package/dist/settings/schema.js +98 -25
  292. package/dist/skills/scanner.d.ts +6 -2
  293. package/dist/skills/scanner.js +160 -9
  294. package/dist/sources/adapter.d.ts +14 -0
  295. package/dist/sources/adapter.js +7 -0
  296. package/dist/sources/adapters/local-files.d.ts +10 -0
  297. package/dist/sources/adapters/local-files.js +127 -0
  298. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  299. package/dist/sources/adapters/mcp-resource.js +41 -0
  300. package/dist/sources/adapters/mock.d.ts +3 -0
  301. package/dist/sources/adapters/mock.js +29 -0
  302. package/dist/sources/binding.d.ts +6 -0
  303. package/dist/sources/binding.js +24 -0
  304. package/dist/sources/catalog.d.ts +6 -0
  305. package/dist/sources/catalog.js +64 -0
  306. package/dist/sources/context-summary.d.ts +8 -0
  307. package/dist/sources/context-summary.js +13 -0
  308. package/dist/sources/credential-status.d.ts +2 -0
  309. package/dist/sources/credential-status.js +13 -0
  310. package/dist/sources/index.d.ts +10 -0
  311. package/dist/sources/index.js +10 -0
  312. package/dist/sources/resolve.d.ts +28 -0
  313. package/dist/sources/resolve.js +47 -0
  314. package/dist/sources/truncate-utf8.d.ts +7 -0
  315. package/dist/sources/truncate-utf8.js +18 -0
  316. package/dist/sources/types.d.ts +71 -0
  317. package/dist/sources/types.js +26 -0
  318. package/dist/testing/fetch-stub.d.ts +32 -0
  319. package/dist/testing/fetch-stub.js +24 -0
  320. package/dist/themes/image.d.ts +18 -0
  321. package/dist/themes/image.js +117 -0
  322. package/dist/themes/index.d.ts +4 -0
  323. package/dist/themes/index.js +4 -0
  324. package/dist/themes/installer.d.ts +50 -0
  325. package/dist/themes/installer.js +290 -0
  326. package/dist/themes/manifest.d.ts +102 -0
  327. package/dist/themes/manifest.js +86 -0
  328. package/dist/themes/paths.d.ts +14 -0
  329. package/dist/themes/paths.js +33 -0
  330. package/dist/tool-system/browser-bridge.d.ts +53 -11
  331. package/dist/tool-system/browser-bridge.js +8 -9
  332. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  333. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  334. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  335. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  336. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  337. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  338. package/dist/tool-system/builtin/agent-progress.js +83 -0
  339. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  340. package/dist/tool-system/builtin/agent-registry.js +178 -9
  341. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  342. package/dist/tool-system/builtin/agent.d.ts +2 -0
  343. package/dist/tool-system/builtin/agent.js +279 -34
  344. package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
  345. package/dist/tool-system/builtin/background-jobs.js +111 -15
  346. package/dist/tool-system/builtin/background-work.d.ts +12 -1
  347. package/dist/tool-system/builtin/background-work.js +12 -1
  348. package/dist/tool-system/builtin/bash.d.ts +3 -5
  349. package/dist/tool-system/builtin/bash.js +14 -6
  350. package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
  351. package/dist/tool-system/builtin/browser-tools.js +89 -23
  352. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  353. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  354. package/dist/tool-system/builtin/edit.d.ts +2 -1
  355. package/dist/tool-system/builtin/edit.js +14 -10
  356. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  357. package/dist/tool-system/builtin/file-cache.js +4 -0
  358. package/dist/tool-system/builtin/generate-image.js +17 -10
  359. package/dist/tool-system/builtin/generate-video.d.ts +4 -0
  360. package/dist/tool-system/builtin/generate-video.js +164 -28
  361. package/dist/tool-system/builtin/glob.d.ts +2 -1
  362. package/dist/tool-system/builtin/glob.js +28 -3
  363. package/dist/tool-system/builtin/grep.d.ts +1 -0
  364. package/dist/tool-system/builtin/grep.js +82 -17
  365. package/dist/tool-system/builtin/image-uploader.js +7 -1
  366. package/dist/tool-system/builtin/index.d.ts +57 -18
  367. package/dist/tool-system/builtin/index.js +280 -167
  368. package/dist/tool-system/builtin/memory.d.ts +6 -0
  369. package/dist/tool-system/builtin/memory.js +36 -15
  370. package/dist/tool-system/builtin/panel.d.ts +9 -0
  371. package/dist/tool-system/builtin/panel.js +314 -0
  372. package/dist/tool-system/builtin/read.js +5 -1
  373. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  374. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  375. package/dist/tool-system/builtin/sources.d.ts +8 -0
  376. package/dist/tool-system/builtin/sources.js +137 -0
  377. package/dist/tool-system/builtin/tool-search.js +7 -2
  378. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  379. package/dist/tool-system/builtin/video-providers.d.ts +12 -15
  380. package/dist/tool-system/builtin/video-providers.js +1 -0
  381. package/dist/tool-system/builtin/view-image.d.ts +2 -2
  382. package/dist/tool-system/builtin/web-fetch.js +60 -15
  383. package/dist/tool-system/builtin/web-search.js +1 -3
  384. package/dist/tool-system/builtin/write.d.ts +2 -1
  385. package/dist/tool-system/builtin/write.js +14 -4
  386. package/dist/tool-system/capability-module.d.ts +93 -0
  387. package/dist/tool-system/capability-module.js +53 -0
  388. package/dist/tool-system/context.d.ts +94 -24
  389. package/dist/tool-system/executor.js +99 -58
  390. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  391. package/dist/tool-system/external-tool-exposure.js +304 -0
  392. package/dist/tool-system/mcp-manager.d.ts +17 -1
  393. package/dist/tool-system/mcp-manager.js +72 -7
  394. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  395. package/dist/tool-system/mcp-tool-policy.js +34 -0
  396. package/dist/tool-system/panel-bridge.d.ts +53 -0
  397. package/dist/tool-system/panel-bridge.js +1 -0
  398. package/dist/tool-system/path-policy.d.ts +19 -0
  399. package/dist/tool-system/path-policy.js +62 -1
  400. package/dist/tool-system/permission.d.ts +69 -3
  401. package/dist/tool-system/permission.js +429 -30
  402. package/dist/tool-system/registry.d.ts +15 -3
  403. package/dist/tool-system/registry.js +82 -40
  404. package/dist/tool-system/sandbox/index.js +3 -8
  405. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  406. package/dist/tool-system/session-tool-host.d.ts +139 -0
  407. package/dist/tool-system/session-tool-host.js +167 -0
  408. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  409. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  410. package/dist/tool-system/validation.d.ts +14 -7
  411. package/dist/tool-system/validation.js +701 -7
  412. package/dist/types.d.ts +201 -20
  413. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  414. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  415. package/dist/utils/file-mutex.d.ts +65 -0
  416. package/dist/utils/file-mutex.js +145 -0
  417. package/dist/utils/json.d.ts +2 -4
  418. package/dist/utils/json.js +2 -4
  419. package/dist/utils/lockfile.d.ts +30 -1
  420. package/dist/utils/lockfile.js +2 -2
  421. package/dist/utils/secret-scrubber.d.ts +8 -0
  422. package/dist/utils/secret-scrubber.js +227 -0
  423. package/dist/utils/toolDisplay.js +1 -1
  424. package/package.json +20 -5
  425. package/THIRD_PARTY_NOTICES.md +0 -206
  426. package/dist/arena/arena.d.ts +0 -43
  427. package/dist/arena/arena.js +0 -333
  428. package/dist/arena/context/context-tools.d.ts +0 -16
  429. package/dist/arena/context/context-tools.js +0 -272
  430. package/dist/arena/context/within-root.d.ts +0 -7
  431. package/dist/arena/context/within-root.js +0 -15
  432. package/dist/arena/detect-mode.d.ts +0 -20
  433. package/dist/arena/detect-mode.js +0 -78
  434. package/dist/arena/digest-builder.d.ts +0 -25
  435. package/dist/arena/digest-builder.js +0 -120
  436. package/dist/arena/index.d.ts +0 -29
  437. package/dist/arena/index.js +0 -29
  438. package/dist/arena/iterate/convergence.d.ts +0 -25
  439. package/dist/arena/iterate/convergence.js +0 -103
  440. package/dist/arena/iterate/formats/index.d.ts +0 -22
  441. package/dist/arena/iterate/formats/index.js +0 -283
  442. package/dist/arena/iterate/index.d.ts +0 -11
  443. package/dist/arena/iterate/index.js +0 -9
  444. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  445. package/dist/arena/iterate/iterative-arena.js +0 -237
  446. package/dist/arena/iterate/parse.d.ts +0 -42
  447. package/dist/arena/iterate/parse.js +0 -123
  448. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  449. package/dist/arena/iterate/phases/argue.js +0 -165
  450. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  451. package/dist/arena/iterate/phases/revise.js +0 -62
  452. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  453. package/dist/arena/iterate/phases/tournament.js +0 -113
  454. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  455. package/dist/arena/iterate/tools/web-tools.js +0 -54
  456. package/dist/arena/iterate/types.d.ts +0 -152
  457. package/dist/arena/iterate/types.js +0 -8
  458. package/dist/arena/ledger.d.ts +0 -47
  459. package/dist/arena/ledger.js +0 -159
  460. package/dist/arena/lenses/architecture.d.ts +0 -5
  461. package/dist/arena/lenses/architecture.js +0 -22
  462. package/dist/arena/lenses/engineering.d.ts +0 -5
  463. package/dist/arena/lenses/engineering.js +0 -22
  464. package/dist/arena/lenses/general.d.ts +0 -5
  465. package/dist/arena/lenses/general.js +0 -20
  466. package/dist/arena/lenses/index.d.ts +0 -16
  467. package/dist/arena/lenses/index.js +0 -47
  468. package/dist/arena/lenses/product.d.ts +0 -5
  469. package/dist/arena/lenses/product.js +0 -22
  470. package/dist/arena/model-presets.d.ts +0 -23
  471. package/dist/arena/model-presets.js +0 -44
  472. package/dist/arena/phases/adjudication.d.ts +0 -24
  473. package/dist/arena/phases/adjudication.js +0 -141
  474. package/dist/arena/phases/build-consensus.d.ts +0 -29
  475. package/dist/arena/phases/build-consensus.js +0 -83
  476. package/dist/arena/phases/claim-registry.d.ts +0 -26
  477. package/dist/arena/phases/claim-registry.js +0 -60
  478. package/dist/arena/phases/cross-review.d.ts +0 -45
  479. package/dist/arena/phases/cross-review.js +0 -218
  480. package/dist/arena/phases/debate-rounds.d.ts +0 -27
  481. package/dist/arena/phases/debate-rounds.js +0 -159
  482. package/dist/arena/phases/participant-research.d.ts +0 -38
  483. package/dist/arena/phases/participant-research.js +0 -314
  484. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
  485. package/dist/arena/phases/planning-detail-expansion.js +0 -119
  486. package/dist/arena/planner.d.ts +0 -27
  487. package/dist/arena/planner.js +0 -311
  488. package/dist/arena/providers/docs.d.ts +0 -7
  489. package/dist/arena/providers/docs.js +0 -111
  490. package/dist/arena/providers/git.d.ts +0 -8
  491. package/dist/arena/providers/git.js +0 -174
  492. package/dist/arena/providers/index.d.ts +0 -32
  493. package/dist/arena/providers/index.js +0 -132
  494. package/dist/arena/providers/none.d.ts +0 -7
  495. package/dist/arena/providers/none.js +0 -11
  496. package/dist/arena/providers/repo.d.ts +0 -7
  497. package/dist/arena/providers/repo.js +0 -258
  498. package/dist/arena/render/session.d.ts +0 -17
  499. package/dist/arena/render/session.js +0 -190
  500. package/dist/arena/render/terminal.d.ts +0 -34
  501. package/dist/arena/render/terminal.js +0 -286
  502. package/dist/arena/strategies/discussion.d.ts +0 -25
  503. package/dist/arena/strategies/discussion.js +0 -143
  504. package/dist/arena/strategies/index.d.ts +0 -15
  505. package/dist/arena/strategies/index.js +0 -28
  506. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  507. package/dist/arena/strategies/language-wrapper.js +0 -102
  508. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  509. package/dist/arena/strategies/lens-wrapper.js +0 -236
  510. package/dist/arena/strategies/planning.d.ts +0 -30
  511. package/dist/arena/strategies/planning.js +0 -225
  512. package/dist/arena/strategies/review.d.ts +0 -26
  513. package/dist/arena/strategies/review.js +0 -168
  514. package/dist/arena/strategies/utils.d.ts +0 -36
  515. package/dist/arena/strategies/utils.js +0 -603
  516. package/dist/arena/tools/selector.d.ts +0 -17
  517. package/dist/arena/tools/selector.js +0 -61
  518. package/dist/arena/transitions.d.ts +0 -53
  519. package/dist/arena/transitions.js +0 -97
  520. package/dist/arena/types.d.ts +0 -514
  521. package/dist/arena/types.js +0 -27
  522. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  523. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  524. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  525. package/dist/cc-orchestrator/cc-capability.js +0 -53
  526. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  527. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  528. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  529. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  530. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  531. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  532. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  533. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  534. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  535. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  536. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  537. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  538. package/dist/cc-orchestrator/index.d.ts +0 -8
  539. package/dist/cc-orchestrator/index.js +0 -8
  540. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  541. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  542. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  543. package/dist/cc-orchestrator/session-discovery.js +0 -125
  544. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  545. package/dist/cc-orchestrator/session-history.js +0 -150
  546. package/dist/cron/cron-runtime.d.ts +0 -2
  547. package/dist/cron/cron-runtime.js +0 -2
  548. package/dist/cron/cron-store.d.ts +0 -2
  549. package/dist/cron/cron-store.js +0 -2
  550. package/dist/cron/scheduler.d.ts +0 -7
  551. package/dist/cron/scheduler.js +0 -7
  552. package/dist/engine/goal.js +0 -206
  553. package/dist/external-agents/config.d.ts +0 -2
  554. package/dist/external-agents/config.js +0 -15
  555. package/dist/external-agents/types.d.ts +0 -31
  556. package/dist/git/parse-log.d.ts +0 -13
  557. package/dist/git/parse-log.js +0 -21
  558. package/dist/git/utils.d.ts +0 -49
  559. package/dist/git/utils.js +0 -161
  560. package/dist/git/worktree/crud.d.ts +0 -69
  561. package/dist/git/worktree/crud.js +0 -206
  562. package/dist/git/worktree/diff.d.ts +0 -14
  563. package/dist/git/worktree/diff.js +0 -82
  564. package/dist/git/worktree/git-exec.d.ts +0 -7
  565. package/dist/git/worktree/git-exec.js +0 -51
  566. package/dist/git/worktree/index.d.ts +0 -5
  567. package/dist/git/worktree/index.js +0 -5
  568. package/dist/git/worktree/query.d.ts +0 -42
  569. package/dist/git/worktree/query.js +0 -121
  570. package/dist/git/worktree/slug.d.ts +0 -11
  571. package/dist/git/worktree/slug.js +0 -58
  572. package/dist/git/worktree.d.ts +0 -1
  573. package/dist/git/worktree.js +0 -5
  574. package/dist/lsp/client.d.ts +0 -41
  575. package/dist/lsp/client.js +0 -186
  576. package/dist/lsp/manager.d.ts +0 -40
  577. package/dist/lsp/manager.js +0 -155
  578. package/dist/lsp/root-path.d.ts +0 -9
  579. package/dist/lsp/root-path.js +0 -12
  580. package/dist/lsp/servers.d.ts +0 -16
  581. package/dist/lsp/servers.js +0 -60
  582. package/dist/prompt/sections/coding.md +0 -35
  583. package/dist/quota/credentials.d.ts +0 -3
  584. package/dist/quota/credentials.js +0 -80
  585. package/dist/quota/index.d.ts +0 -36
  586. package/dist/quota/index.js +0 -155
  587. package/dist/quota/types.d.ts +0 -48
  588. package/dist/quota/types.js +0 -13
  589. package/dist/review/review-prompt.d.ts +0 -28
  590. package/dist/review/review-prompt.js +0 -81
  591. package/dist/state.d.ts +0 -160
  592. package/dist/state.js +0 -267
  593. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  594. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  595. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  596. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  597. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  598. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  599. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  600. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  601. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  602. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  603. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  604. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  605. package/dist/tool-system/builtin/arena.d.ts +0 -31
  606. package/dist/tool-system/builtin/arena.js +0 -415
  607. package/dist/tool-system/builtin/brief.d.ts +0 -6
  608. package/dist/tool-system/builtin/brief.js +0 -41
  609. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  610. package/dist/tool-system/builtin/check-quota.js +0 -34
  611. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  612. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  613. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  614. package/dist/tool-system/builtin/lsp.js +0 -144
  615. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  616. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  617. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  618. package/dist/tool-system/builtin/worktree.js +0 -345
  619. /package/dist/{external-agents → links}/types.js +0 -0
  620. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  621. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -2,22 +2,26 @@
2
2
  * Unified tool registry — built-in tools + MCP tools.
3
3
  */
4
4
  import { ConfigError, ToolNotFoundError, ToolExecutionError, ToolTimeoutError, } from "../exceptions.js";
5
- import { BUILTIN_TOOLS } from "./builtin/index.js";
5
+ import { BUILTIN_TOOLS, toToolExecutionResult, } from "./builtin/index.js";
6
6
  import { validateToolMetadata } from "./validate-tool-metadata.js";
7
7
  /**
8
8
  * Default execution timeout for any tool that does not declare its own
9
9
  * timeoutMs at registration time. Tools that need to run longer (Agent,
10
- * Arena, Bash, custom long-running tools) should set timeoutMs explicitly.
10
+ * Bash, or custom capability tools) should set timeoutMs explicitly.
11
11
  */
12
12
  export const DEFAULT_TOOL_TIMEOUT_MS = 120_000;
13
13
  export class ToolRegistry {
14
14
  tools = new Map();
15
15
  builtinExecutors = new Map();
16
+ availabilityGuards = new Map();
16
17
  constructor(options = {}) {
17
- this.registerBuiltins(options.builtinTools);
18
+ this.registerBuiltins(options.builtinTools, options.toolCatalog ?? BUILTIN_TOOLS);
18
19
  }
19
- registerBuiltins(selectedBuiltinTools) {
20
- const availableNames = new Set(BUILTIN_TOOLS.map((tool) => tool.definition.name));
20
+ registerBuiltins(selectedBuiltinTools, toolCatalog) {
21
+ const availableNames = new Set(toolCatalog.map((tool) => tool.definition.name));
22
+ if (availableNames.size !== toolCatalog.length) {
23
+ throw new ConfigError("Tool catalog contains duplicate names");
24
+ }
21
25
  const selectedNames = selectedBuiltinTools ? new Set(selectedBuiltinTools) : null;
22
26
  if (selectedNames) {
23
27
  const unknown = [...selectedNames].filter((name) => !availableNames.has(name));
@@ -27,7 +31,7 @@ export class ToolRegistry {
27
31
  });
28
32
  }
29
33
  }
30
- for (const tool of BUILTIN_TOOLS) {
34
+ for (const tool of toolCatalog) {
31
35
  if (selectedNames && !selectedNames.has(tool.definition.name)) {
32
36
  continue;
33
37
  }
@@ -36,24 +40,36 @@ export class ToolRegistry {
36
40
  validateToolMetadata(tool.definition);
37
41
  this.tools.set(tool.definition.name, tool.definition);
38
42
  this.builtinExecutors.set(tool.definition.name, tool.execute);
43
+ if (tool.exposure.availability) {
44
+ this.availabilityGuards.set(tool.definition.name, tool.exposure.availability);
45
+ }
39
46
  }
40
47
  }
41
48
  registerTool(tool, executor) {
42
49
  validateToolMetadata(tool);
43
50
  this.tools.set(tool.name, tool);
44
51
  if (executor) {
45
- this.builtinExecutors.set(tool.name, executor);
52
+ this.builtinExecutors.set(tool.name, async (args, ctx) => toToolExecutionResult(await executor(args, ctx)));
46
53
  }
47
54
  }
55
+ /** Create an engine-local registry view without sharing mutable maps. */
56
+ fork() {
57
+ const fork = new ToolRegistry({ builtinTools: [] });
58
+ fork.tools = new Map(this.tools);
59
+ fork.builtinExecutors = new Map(this.builtinExecutors);
60
+ return fork;
61
+ }
48
62
  unregisterTool(name) {
49
63
  this.tools.delete(name);
50
64
  this.builtinExecutors.delete(name);
65
+ this.availabilityGuards.delete(name);
51
66
  }
52
67
  getToolDefinitions() {
53
68
  return [...this.tools.values()].map((t) => ({
54
69
  name: t.name,
55
70
  description: t.description,
56
71
  inputSchema: t.inputSchema,
72
+ sensitiveResult: t.sensitiveResult,
57
73
  }));
58
74
  }
59
75
  getTool(name) {
@@ -62,6 +78,15 @@ export class ToolRegistry {
62
78
  hasTool(name) {
63
79
  return this.tools.has(name);
64
80
  }
81
+ /** Test/harness introspection: definitions without implementations are valid
82
+ * for some dynamic registrations, but every builtin catalog entry must have
83
+ * an executor. */
84
+ hasExecutor(name) {
85
+ return this.builtinExecutors.has(name);
86
+ }
87
+ getAvailabilityGuard(name) {
88
+ return this.availabilityGuards.get(name);
89
+ }
65
90
  async executeTool(name, args, options) {
66
91
  const tool = this.tools.get(name);
67
92
  if (!tool) {
@@ -73,7 +98,7 @@ export class ToolRegistry {
73
98
  }
74
99
  // Tool timeout precedence:
75
100
  // options.timeoutMs (per-call override) > tool.timeoutMs (declared at registration) > default 120s.
76
- // To run longer, declare timeoutMs on the tool (e.g. Agent/Arena: 30min, Bash: 1h).
101
+ // To run longer, declare timeoutMs on the tool (e.g. Agent: 30min, Bash: 1h).
77
102
  const timeout = options?.timeoutMs ?? tool.timeoutMs ?? DEFAULT_TOOL_TIMEOUT_MS;
78
103
  const parentSignal = options?.signal;
79
104
  const id = `tool_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
@@ -88,61 +113,78 @@ export class ToolRegistry {
88
113
  }
89
114
  // Create a child AbortController that aborts on timeout OR parent abort
90
115
  const childController = new AbortController();
116
+ let timedOut = false;
91
117
  const timerId = timeout > 0
92
- ? setTimeout(() => childController.abort(new ToolTimeoutError(name, timeout)), timeout)
118
+ ? setTimeout(() => {
119
+ timedOut = true;
120
+ childController.abort(new ToolTimeoutError(name, timeout));
121
+ }, timeout)
93
122
  : undefined;
94
123
  // Cascade parent abort to child
95
124
  const onParentAbort = () => childController.abort(parentSignal?.reason);
96
125
  parentSignal?.addEventListener("abort", onParentAbort, { once: true });
126
+ if (parentSignal?.aborted)
127
+ onParentAbort();
97
128
  // Inject the abort signal into args so tools (like Agent) can use it
98
129
  const argsWithSignal = { ...args, __signal: childController.signal };
99
130
  // Build per-call ctx: caller's ctx (if any) + this call's signal
100
131
  const ctx = options?.ctx
101
132
  ? { ...options.ctx, signal: childController.signal }
102
133
  : undefined;
103
- try {
104
- const result = await Promise.race([
105
- executor(argsWithSignal, ctx),
106
- new Promise((_, reject) => {
107
- childController.signal.addEventListener("abort", () => {
108
- const reason = childController.signal.reason;
109
- reject(reason instanceof ToolTimeoutError ? reason : new Error("Tool aborted"));
110
- }, { once: true });
111
- }),
112
- ]);
134
+ let onChildAbort;
135
+ const aborted = new Promise((_, reject) => {
136
+ onChildAbort = () => {
137
+ const reason = childController.signal.reason;
138
+ reject(reason instanceof Error
139
+ ? reason
140
+ : Object.assign(new Error("Tool aborted"), { name: "AbortError" }));
141
+ };
142
+ childController.signal.addEventListener("abort", onChildAbort, { once: true });
143
+ if (childController.signal.aborted)
144
+ onChildAbort();
145
+ });
146
+ const cleanup = () => {
113
147
  clearTimeout(timerId);
114
148
  parentSignal?.removeEventListener("abort", onParentAbort);
115
- // executor 可返回纯字符串,或 { contentBlocks, result? }(view_image
116
- // 用后者回传图片块)。归一化成 ToolResult:有 contentBlocks 就带上,
117
- // result 始终保留一份文本镜像供 transcript / 摘要使用。
118
- if (typeof result === "string") {
119
- return { id, toolName: name, result };
149
+ if (onChildAbort)
150
+ childController.signal.removeEventListener("abort", onChildAbort);
151
+ };
152
+ try {
153
+ const rawResult = await Promise.race([executor(argsWithSignal, ctx), aborted]);
154
+ const result = toToolExecutionResult(rawResult);
155
+ if (childController.signal.aborted) {
156
+ throw childController.signal.reason instanceof Error
157
+ ? childController.signal.reason
158
+ : Object.assign(new Error("Tool aborted"), { name: "AbortError" });
159
+ }
160
+ cleanup();
161
+ if (!result.ok) {
162
+ return {
163
+ id,
164
+ toolName: name,
165
+ error: result.error,
166
+ isError: true,
167
+ sandbox: result.sandbox,
168
+ };
120
169
  }
121
- // 结构化返回:图片块(view_image)或沙箱标记(Bash 等)。两者互斥,
122
- // 各取所有,缺的字段为 undefined。
123
- const contentBlocks = "contentBlocks" in result ? result.contentBlocks : undefined;
124
- const sandbox = "sandbox" in result ? result.sandbox : undefined;
125
- const sensitive = "sensitive" in result ? result.sensitive : undefined;
126
- const displayResult = "displayResult" in result ? result.displayResult : undefined;
127
- const transcriptResult = "transcriptResult" in result ? result.transcriptResult : undefined;
128
170
  return {
129
171
  id,
130
172
  toolName: name,
131
- result: result.result ?? (contentBlocks ? "(image)" : ""),
132
- contentBlocks,
133
- sandbox,
134
- sensitive,
135
- displayResult,
136
- transcriptResult,
173
+ result: result.result ?? (result.contentBlocks ? "(image)" : ""),
174
+ contentBlocks: result.contentBlocks,
175
+ sandbox: result.sandbox,
176
+ sensitive: result.sensitive,
177
+ displayResult: result.displayResult,
178
+ transcriptResult: result.transcriptResult,
179
+ isError: false,
137
180
  };
138
181
  }
139
182
  catch (err) {
140
- clearTimeout(timerId);
141
- parentSignal?.removeEventListener("abort", onParentAbort);
183
+ cleanup();
142
184
  // Always return error as ToolResult, never throw
143
185
  let errorMsg;
144
186
  const isAbort = err?.name === "AbortError" || parentSignal?.aborted === true;
145
- if (err instanceof ToolTimeoutError) {
187
+ if (timedOut || err instanceof ToolTimeoutError) {
146
188
  errorMsg = `Tool timed out after ${timeout}ms: ${name}`;
147
189
  }
148
190
  else if (isAbort) {
@@ -26,7 +26,8 @@ import { SandboxUnavailableError } from "../../exceptions.js";
26
26
  export function detectSandboxCapabilities() {
27
27
  return {
28
28
  seatbelt: process.platform === "darwin" && binaryExists("/usr/bin/sandbox-exec"),
29
- bwrap: process.platform === "linux" && (binaryExists("/usr/bin/bwrap") || binaryExists("/usr/local/bin/bwrap")),
29
+ bwrap: process.platform === "linux" &&
30
+ (binaryExists("/usr/bin/bwrap") || binaryExists("/usr/local/bin/bwrap")),
30
31
  };
31
32
  }
32
33
  function binaryExists(path) {
@@ -119,13 +120,7 @@ export function defaultSandboxConfig(mode = "auto") {
119
120
  return {
120
121
  mode,
121
122
  writableRoots: ["${workspace}", ...tmpRoots],
122
- deniedReads: [
123
- "~/.ssh",
124
- "~/.aws",
125
- "~/.config/gcloud",
126
- "~/.code-shell",
127
- "~/.claude",
128
- ],
123
+ deniedReads: ["~/.ssh", "~/.aws", "~/.config/gcloud", "~/.code-shell", "~/.claude"],
129
124
  network: "allow",
130
125
  };
131
126
  }
@@ -54,12 +54,8 @@ export function createSeatbeltBackend(config) {
54
54
  };
55
55
  }
56
56
  function buildProfile(config) {
57
- const writeAllows = config.writableRoots
58
- .map((p) => ` (subpath ${quote(p)})`)
59
- .join("\n");
60
- const readDenies = config.deniedReads
61
- .map((p) => ` (subpath ${quote(p)})`)
62
- .join("\n");
57
+ const writeAllows = config.writableRoots.map((p) => ` (subpath ${quote(p)})`).join("\n");
58
+ const readDenies = config.deniedReads.map((p) => ` (subpath ${quote(p)})`).join("\n");
63
59
  const networkClause = config.network === "deny" ? "(deny network-outbound)" : "(allow network*)";
64
60
  // SBPL evaluation note: when a broad `(allow file-read*)` and a specific
65
61
  // `(deny file-read* (subpath …))` both match, the more specific subpath
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Session-scoped tool host for external Agent Runtimes.
3
+ *
4
+ * An external runtime (Codex, Claude Code) drives its own agent loop and its own
5
+ * native tools. When it wants a CODESHELL tool it comes back in over MCP, and
6
+ * this is what it reaches: a narrow, per-business-session surface that exposes an
7
+ * explicitly allowlisted subset of the registry.
8
+ *
9
+ * The single rule that matters: **every call goes through
10
+ * `ToolExecutor.executeSingle()`**. `ToolRegistry` is not a security boundary —
11
+ * calling it directly would skip visibility, plan mode, argument validation, path
12
+ * policy, permission, sandbox, hooks, and result redaction. The MCP transport,
13
+ * the model's chosen tool name, and its arguments are all untrusted; the business
14
+ * session context is bound here by the host, out of band.
15
+ *
16
+ * Deliberately domain-agnostic: no Claude/Codex/Electron/coding literals. The
17
+ * runtime adapters live in the coding capability and talk to this through the
18
+ * `SessionToolHost` interface.
19
+ */
20
+ import type { PermissionMode, ToolDefinition, ToolResult } from "../types.js";
21
+ import type { ToolContext } from "./context.js";
22
+ import { ToolRegistry } from "./registry.js";
23
+ import { type ApprovalBackend } from "./permission.js";
24
+ import { HookRegistry } from "../hooks/registry.js";
25
+ import { type ToolVisibilityInputs } from "../engine/run-tooling.js";
26
+ /**
27
+ * Permission modes an external session may use.
28
+ *
29
+ * `bypassPermissions` and `dontAsk` are excluded at the type level because they
30
+ * short-circuit `PermissionClassifier` entirely (it returns allow / deny before
31
+ * consulting any rule). Under either one, "the call went through ToolExecutor"
32
+ * becomes true but meaningless. The external runtime's OWN permission mode is a
33
+ * separate thing and is unaffected by this — it governs that runtime's native
34
+ * tools, not CodeShell's.
35
+ */
36
+ export type ExternalSessionPermissionMode = Exclude<PermissionMode, "bypassPermissions" | "dontAsk">;
37
+ /**
38
+ * Which tools an external runtime may see and call.
39
+ *
40
+ * Allowlist only — no "everything in the registry", no prefix matching. A tool
41
+ * that is not named here does not exist as far as the runtime is concerned, and
42
+ * naming it anyway is an error rather than a silent no-op.
43
+ */
44
+ export interface ExternalToolExposurePolicy {
45
+ mode: "allowlist";
46
+ toolNames: ReadonlySet<string>;
47
+ /**
48
+ * Optional per-tool argument narrowing, for tools that multiplex several
49
+ * operations behind one name (e.g. a Panel tool with list/open/tools/invoke).
50
+ * Each value is a regex source matched against the whole argument value —
51
+ * patterns are anchored for you, see {@link matchesWholeValue}.
52
+ *
53
+ * This binds on `execute()`, not just `listTools()`: describing a limit only in
54
+ * the advertised schema would leave it advisory, and the arguments come from
55
+ * the model.
56
+ *
57
+ * **Scope, stated plainly:** this constrains only the keys it names. Keys the
58
+ * pattern does not mention pass through untouched, so it is a good fit for
59
+ * "which action may run" and a poor one for "what may that action do".
60
+ * Restricting a nested payload (e.g. the arguments a Panel tool forwards to a
61
+ * Panel App) is the tool's own schema validation, not this. Do not treat an
62
+ * `argsPatterns` entry as a sandbox for everything a tool might accept.
63
+ */
64
+ argsPatterns?: ReadonlyMap<string, Readonly<Record<string, string>>>;
65
+ }
66
+ export interface SessionToolHost {
67
+ readonly businessSessionId: string;
68
+ /**
69
+ * The assembled session ToolContext.
70
+ *
71
+ * Exposed read-only so a host can inspect what the executor will actually see
72
+ * — most usefully `toolVisibility` (absent means ToolExecutor SKIPS its
73
+ * availability guard) and `allowedToolNames`. Do not mutate it; narrow the
74
+ * exposure policy instead.
75
+ */
76
+ readonly toolContext: ToolContext;
77
+ listTools(): readonly ToolDefinition[];
78
+ execute(call: {
79
+ id: string;
80
+ name: string;
81
+ input: unknown;
82
+ }, signal?: AbortSignal): Promise<ToolResult>;
83
+ dispose(): Promise<void>;
84
+ }
85
+ export interface CreateSessionToolHostOptions {
86
+ businessSessionId: string;
87
+ cwd: string;
88
+ registry: ToolRegistry;
89
+ permissionMode: ExternalSessionPermissionMode;
90
+ /**
91
+ * The agent preset's permission rules (e.g.
92
+ * `BUILTIN_AGENT_PRESETS.general.defaultPermissionRules`).
93
+ *
94
+ * Only the PRESET layer is supplied here. The rest of the stack — the standing
95
+ * memory-scope carve-outs, mode-derived rules, and the user's own
96
+ * `settings.permissions.rules` — is composed internally by
97
+ * {@link composePermissionRules}, the same function the Native Engine uses.
98
+ *
99
+ * That composition is deliberately not left to the caller. An earlier revision
100
+ * took a finished rule array, which turned an equivalence guarantee into an
101
+ * unenforceable obligation: nothing checked that a caller reproduced
102
+ * `PermissionController.build()`, and the easy mistake — omitting
103
+ * `settings.permissions.rules` — meant a user's explicit "deny this tool" bound
104
+ * the Native Engine but not the external runtime.
105
+ */
106
+ presetRules: readonly import("../types.js").PermissionRule[];
107
+ /** Settings scope used to resolve the user's own permission rules. */
108
+ settingsScope?: import("../settings/manager.js").SettingsScope;
109
+ /**
110
+ * Whether the project at `cwd` has been trusted by the user.
111
+ *
112
+ * **Required, and there is no default** — `permissions` is the first entry in
113
+ * `DANGEROUS_PROJECT_FIELDS`, so an untrusted project's
114
+ * `settings.permissions.rules` are stripped precisely to stop a cloned repo
115
+ * self-authorizing. Every protocol-layer caller resolves this explicitly and
116
+ * defaults it to `false`; an optional field defaulting to "trusted" here would
117
+ * let a hostile repo grant an external runtime tools the user never trusted,
118
+ * without the approval backend ever being consulted.
119
+ *
120
+ * Optional-plus-unsafe-default is the exact shape of the bug this whole
121
+ * options object has now been bitten by twice. Hence: required.
122
+ */
123
+ projectTrusted: boolean;
124
+ planMode: boolean;
125
+ exposure: ExternalToolExposurePolicy;
126
+ /**
127
+ * Availability-guard inputs. Required, not optional: `ToolExecutor` SKIPS its
128
+ * visibility gate when `toolCtx.toolVisibility` is absent, so omitting this
129
+ * would not merely under-expose tools — it would make host-gated tools
130
+ * callable in a context their guard was written to exclude.
131
+ */
132
+ visibility: ToolVisibilityInputs;
133
+ approvalBackend?: ApprovalBackend;
134
+ hooks?: HookRegistry;
135
+ /** Extra ToolContext seams the host supplies (panels, browser, askUser, …). */
136
+ contextOverrides?: Partial<ToolContext>;
137
+ signal?: AbortSignal;
138
+ }
139
+ export declare function createSessionToolHost(options: CreateSessionToolHostOptions): SessionToolHost;
@@ -0,0 +1,167 @@
1
+ import { ToolExecutor } from "./executor.js";
2
+ import { PermissionClassifier } from "./permission.js";
3
+ import { HookRegistry } from "../hooks/registry.js";
4
+ import { buildToolVisibility } from "../engine/run-tooling.js";
5
+ import { composePermissionRules } from "../engine/permission-controller.js";
6
+ const FORBIDDEN_MODES = new Set(["bypassPermissions", "dontAsk"]);
7
+ /**
8
+ * Whole-string match for an exposure pattern.
9
+ *
10
+ * Patterns are ANCHORED here rather than trusting the author to write `^…$`.
11
+ * An unanchored `action: "list"` would also admit `"invoke_list"` — a silent
12
+ * widening of a rule whose entire purpose is to narrow. Anchoring in one place
13
+ * makes the safe reading the only reading; an author who deliberately writes
14
+ * `^(list|open)$` gets the same result either way.
15
+ */
16
+ function matchesWholeValue(source, value) {
17
+ let re;
18
+ try {
19
+ re = new RegExp(`^(?:${source})$`, "u");
20
+ }
21
+ catch {
22
+ // A malformed pattern must not silently permit everything.
23
+ return false;
24
+ }
25
+ return re.test(value);
26
+ }
27
+ function argsMatch(patterns, input) {
28
+ if (!patterns)
29
+ return true;
30
+ for (const [key, source] of Object.entries(patterns)) {
31
+ // Read own properties only: a model-supplied JSON body cannot smuggle a
32
+ // match through the prototype chain.
33
+ const value = Object.prototype.hasOwnProperty.call(input, key) ? input[key] : undefined;
34
+ // Only primitives are comparable. Objects/arrays are rejected rather than
35
+ // stringified — `String(["list"])` is `"list"`, which would let an array
36
+ // satisfy a scalar pattern.
37
+ if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
38
+ return false;
39
+ }
40
+ if (!matchesWholeValue(source, String(value)))
41
+ return false;
42
+ }
43
+ return true;
44
+ }
45
+ export function createSessionToolHost(options) {
46
+ if (FORBIDDEN_MODES.has(options.permissionMode)) {
47
+ throw new Error(`SessionToolHost refuses permission mode '${options.permissionMode}': it short-circuits ` +
48
+ `PermissionClassifier, so CodeShell tool authorization would not actually run. ` +
49
+ `An external runtime's own permission mode is separate and unaffected.`);
50
+ }
51
+ const { registry, exposure } = options;
52
+ const hooks = options.hooks ?? new HookRegistry();
53
+ // Composed HERE, by the same function the Native Engine uses, so the two paths
54
+ // cannot drift. In particular this is what pulls in the user's own
55
+ // `settings.permissions.rules` — a deny the user wrote must bind an external
56
+ // runtime exactly as it binds the Native Engine.
57
+ const permission = new PermissionClassifier(composePermissionRules({
58
+ mode: options.permissionMode,
59
+ cwd: options.cwd,
60
+ presetRules: options.presetRules,
61
+ projectTrusted: options.projectTrusted,
62
+ ...(options.settingsScope ? { settingsScope: options.settingsScope } : {}),
63
+ }), options.permissionMode, options.approvalBackend);
64
+ // Every in-flight call is chained to this, so dispose() can actually stop work
65
+ // that is mid-execution or parked on an approval prompt (§13.4).
66
+ const lifetime = new AbortController();
67
+ const sessionSignal = options.signal
68
+ ? AbortSignal.any([options.signal, lifetime.signal])
69
+ : lifetime.signal;
70
+ const toolCtx = {
71
+ cwd: options.cwd,
72
+ toolRegistry: registry,
73
+ // The COMBINED signal, not just the caller's: a tool that cooperates with
74
+ // ctx.signal must observe session disposal too.
75
+ signal: sessionSignal,
76
+ // Caller-supplied host seams (panels, browser, askUser, …) come FIRST so the
77
+ // security-relevant fields below always win. Spreading them last would let a
78
+ // caller — or a careless refactor — set `toolVisibility: undefined` (which
79
+ // makes ToolExecutor skip its availability guard entirely), widen
80
+ // `allowedToolNames`, or re-introduce a permission mode the throw above
81
+ // just rejected.
82
+ ...options.contextOverrides,
83
+ sessionId: options.businessSessionId,
84
+ planMode: options.planMode,
85
+ permissionMode: options.permissionMode,
86
+ toolVisibility: buildToolVisibility(options.visibility),
87
+ // Belt and braces with the exposure check in execute(): the executor
88
+ // enforces this too, so a future refactor that loses one still fails closed.
89
+ allowedToolNames: new Set(exposure.toolNames),
90
+ };
91
+ const executor = new ToolExecutor(registry, permission, hooks);
92
+ executor.setContext(toolCtx);
93
+ executor.setSignal(sessionSignal);
94
+ let disposed = false;
95
+ const failClosed = (id, name, error) => ({
96
+ id,
97
+ toolName: name,
98
+ error,
99
+ isError: true,
100
+ });
101
+ return {
102
+ businessSessionId: options.businessSessionId,
103
+ toolContext: toolCtx,
104
+ listTools() {
105
+ if (disposed)
106
+ return [];
107
+ return registry
108
+ .getToolDefinitions()
109
+ .filter((definition) => exposure.toolNames.has(definition.name));
110
+ },
111
+ async execute(call, callSignal) {
112
+ if (disposed) {
113
+ return failClosed(call.id, call.name, "This tool session has been closed.");
114
+ }
115
+ if (!exposure.toolNames.has(call.name)) {
116
+ // Fail closed on a KNOWN-but-unexposed name too. Not listing a tool is a
117
+ // boundary, not a hint to the model.
118
+ return failClosed(call.id, call.name, `Tool ${call.name} is not exposed to this session. Do NOT retry this tool call.`);
119
+ }
120
+ const input = call.input && typeof call.input === "object" && !Array.isArray(call.input)
121
+ ? call.input
122
+ : {};
123
+ if (!argsMatch(exposure.argsPatterns?.get(call.name), input)) {
124
+ return failClosed(call.id, call.name, `Tool ${call.name} was called with arguments outside the scope exposed to this ` +
125
+ `session. Do NOT retry this tool call with the same arguments.`);
126
+ }
127
+ // `sessionSignal` folds in the session lifetime and the caller-supplied
128
+ // signal; `callSignal` is the optional per-call one (an MCP cancellation).
129
+ if (sessionSignal.aborted || callSignal?.aborted) {
130
+ return failClosed(call.id, call.name, `Tool aborted before execution: ${call.name}`);
131
+ }
132
+ // Forward the per-call signal rather than only checking it at entry: an MCP
133
+ // cancellation arriving mid-flight has to actually stop the work.
134
+ //
135
+ // A `ToolExecutor` holds exactly one signal, and swapping it per call would
136
+ // race with concurrent calls carrying different signals. So a call that
137
+ // brings its own signal gets its own executor — cheap (it is a thin wrapper
138
+ // over the shared registry/permission/hooks) and free of shared mutable
139
+ // state. Calls without one use the shared executor unchanged.
140
+ if (!callSignal) {
141
+ // The one authorized path. Everything above only NARROWS what may reach it.
142
+ return await executor.executeSingle({
143
+ id: call.id,
144
+ toolName: call.name,
145
+ args: input,
146
+ });
147
+ }
148
+ const scoped = new ToolExecutor(registry, permission, hooks);
149
+ scoped.setContext(toolCtx);
150
+ scoped.setSignal(AbortSignal.any([sessionSignal, callSignal]));
151
+ return await scoped.executeSingle({
152
+ id: call.id,
153
+ toolName: call.name,
154
+ args: input,
155
+ });
156
+ },
157
+ async dispose() {
158
+ // Order matters (§13.4): stop accepting new calls, THEN abort in-flight
159
+ // ones. Marking disposed without aborting would let a call that is already
160
+ // running — or parked on an approval prompt — continue and complete after
161
+ // the session is gone.
162
+ disposed = true;
163
+ lifetime.abort();
164
+ executor.setContext(undefined);
165
+ },
166
+ };
167
+ }
@@ -0,0 +1,31 @@
1
+ import type { BuiltinTool } from "../builtin/index.js";
2
+ import type { ToolContext } from "../context.js";
3
+ import { ToolRegistry } from "../registry.js";
4
+ import type { ToolResult } from "../../types.js";
5
+ export interface FakeToolContextOptions {
6
+ cwd?: string;
7
+ sessionId?: string;
8
+ signal?: AbortSignal;
9
+ /** Shallow overrides for tool-family-specific host bridges. */
10
+ overrides?: Partial<ToolContext>;
11
+ }
12
+ export interface ToolRegistryHarnessOptions extends FakeToolContextOptions {
13
+ builtinTools?: readonly string[];
14
+ toolCatalog?: readonly BuiltinTool[];
15
+ registry?: ToolRegistry;
16
+ timeoutMs?: number;
17
+ }
18
+ export interface ToolRegistryHarness {
19
+ registry: ToolRegistry;
20
+ context: ToolContext;
21
+ execute(name: string, args?: Record<string, unknown>): Promise<ToolResult>;
22
+ }
23
+ /**
24
+ * Shared fake ToolContext for builtin integration tests. It intentionally
25
+ * supplies only stable harness defaults; tests opt into browser/workspace/MCP/
26
+ * sub-agent behavior through `overrides`, so missing host seams fail visibly.
27
+ */
28
+ export declare function createFakeToolContext(registry: ToolRegistry, options?: FakeToolContextOptions): ToolContext;
29
+ /** Build a real ToolRegistry and execute through its timeout/signal/result
30
+ * protocol while keeping host dependencies deterministic and injectable. */
31
+ export declare function createToolRegistryHarness(options?: ToolRegistryHarnessOptions): ToolRegistryHarness;
@@ -0,0 +1,51 @@
1
+ import { resolve } from "node:path";
2
+ import { ToolRegistry } from "../registry.js";
3
+ /**
4
+ * Shared fake ToolContext for builtin integration tests. It intentionally
5
+ * supplies only stable harness defaults; tests opt into browser/workspace/MCP/
6
+ * sub-agent behavior through `overrides`, so missing host seams fail visibly.
7
+ */
8
+ export function createFakeToolContext(registry, options = {}) {
9
+ const cwd = resolve(options.cwd ?? process.cwd());
10
+ const context = {
11
+ cwd,
12
+ setCwd(next) {
13
+ context.cwd = resolve(next);
14
+ },
15
+ llmConfig: {},
16
+ toolRegistry: registry,
17
+ planMode: false,
18
+ sessionId: options.sessionId ?? "tool-harness-session",
19
+ signal: options.signal,
20
+ allowBackgroundShells: false,
21
+ toolVisibility: { hasGoal: true },
22
+ engine: {
23
+ getPlanMode: () => context.planMode,
24
+ setPlanMode: (enabled) => {
25
+ context.planMode = enabled;
26
+ },
27
+ },
28
+ askUser: async () => "harness-answer",
29
+ ...options.overrides,
30
+ };
31
+ return context;
32
+ }
33
+ /** Build a real ToolRegistry and execute through its timeout/signal/result
34
+ * protocol while keeping host dependencies deterministic and injectable. */
35
+ export function createToolRegistryHarness(options = {}) {
36
+ const registryOptions = {
37
+ ...(options.builtinTools ? { builtinTools: options.builtinTools } : {}),
38
+ ...(options.toolCatalog ? { toolCatalog: options.toolCatalog } : {}),
39
+ };
40
+ const registry = options.registry ?? new ToolRegistry(registryOptions);
41
+ const context = createFakeToolContext(registry, options);
42
+ return {
43
+ registry,
44
+ context,
45
+ execute: async (name, args = {}) => await registry.executeTool(name, args, {
46
+ ctx: context,
47
+ signal: options.signal,
48
+ timeoutMs: options.timeoutMs ?? 5_000,
49
+ }),
50
+ };
51
+ }