@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
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * ToolContext — runtime services injected into every tool execution.
3
3
  *
4
- * Replaces the legacy module-level singletons (`setAskUserFn`,
5
- * `setArenaLLMConfig`, `setSubAgentConfig`, `setToolSearchRegistry`).
4
+ * Replaces the legacy module-level singleton setters used by built-ins and
5
+ * product capabilities.
6
6
  *
7
7
  * Each Engine instance builds its own ToolContext when run() starts and
8
8
  * passes it through ToolExecutor → ToolRegistry → executor function.
@@ -12,14 +12,17 @@
12
12
  * Tools that don't need any context (Read/Write/Bash/...) just ignore
13
13
  * the second argument; the type is purely additive.
14
14
  */
15
- import type { LLMConfig, StreamCallback } from "../types.js";
15
+ import type { LLMConfig, StreamCallback, TokenUsage } from "../types.js";
16
16
  import type { ModelPool } from "../llm/model-pool.js";
17
17
  import type { ToolRegistry } from "./registry.js";
18
18
  import type { AgentPresetName } from "../preset/index.js";
19
- import type { SandboxBackend } from "./sandbox/index.js";
19
+ import type { SandboxBackend, SandboxMode } from "./sandbox/index.js";
20
20
  import type { HookRegistry } from "../hooks/registry.js";
21
21
  import type { SessionManager } from "../session/session-manager.js";
22
22
  import type { SessionWorkspace } from "../types.js";
23
+ import type { ApprovalRouter } from "./permission.js";
24
+ import type { ChildWriterLease, LiveChildControl } from "./builtin/agent-registry.js";
25
+ import type { McpToolPolicy } from "./mcp-tool-policy.js";
23
26
  /**
24
27
  * Narrow view of the owning Engine that tools are allowed to call back into.
25
28
  * Defined here (in the low-level tool-system) rather than importing the
@@ -33,19 +36,6 @@ export interface ToolRuntimeHost {
33
36
  readonly planMode: boolean;
34
37
  /** Toggle plan mode (EnterPlanMode / ExitPlanMode tools). */
35
38
  setPlanMode(value: boolean): void;
36
- /** Per-worktree setup scripts, or undefined for sub-agents / no cwd. */
37
- readWorktreeSetupScripts(cwd?: string): {
38
- default?: string;
39
- macos?: string;
40
- linux?: string;
41
- windows?: string;
42
- } | undefined;
43
- /** Branch prefix used for CodeShell-managed worktree branches. */
44
- readWorktreeBranchPrefix?(cwd?: string): string | undefined;
45
- /** Resolve a setup-only sandbox for a newly-created worktree root. */
46
- resolveWorktreeSetupSandbox?(cwd: string): Promise<SandboxBackend | undefined>;
47
- /** Resolve setup-only shell env for a newly-created worktree root. */
48
- readWorktreeSetupShellEnv?(cwd?: string): Record<string, string> | undefined;
49
39
  /** Session state store used by session-scoped tools such as worktree switching. */
50
40
  getSessionManager?(): SessionManager;
51
41
  }
@@ -128,6 +118,10 @@ export interface SubAgentSpawnRequest {
128
118
  * tool. Undefined → child inherits the parent's full skill pool.
129
119
  */
130
120
  skillAllowlist?: string[];
121
+ /** Optional role-level sandbox mode. Undefined → inherit the parent sandbox. */
122
+ sandboxMode?: SandboxMode;
123
+ /** Optional MCP server allowlist. Undefined → inherit all; [] → no MCP. */
124
+ mcpAllowlist?: string[];
131
125
  /**
132
126
  * Optional per-call system prompt appended to the child Engine's prompt
133
127
  * (the role definition's Markdown body). Undefined → child inherits only
@@ -146,6 +140,15 @@ export interface SubAgentSpawnRequest {
146
140
  * See AgentSendInput in builtin/agent.ts.
147
141
  */
148
142
  resumeSessionId?: string;
143
+ /** Trusted live-runtime generation; never exposed in the Agent tool schema. */
144
+ runtimeGeneration?: number;
145
+ /** Bind the existing child runtime to the registry's single-writer lease. */
146
+ bindLiveControl?: (control: LiveChildControl, ownerToken: string) => ChildWriterLease | true | false;
147
+ /** Atomically close intake before the child publishes its terminal result. */
148
+ closeLiveControl?: (control: LiveChildControl, lease?: ChildWriterLease) => boolean | void;
149
+ /** Raw child stream tap used to deterministically reduce structured progress. */
150
+ onProgressEvent?: (event: Parameters<StreamCallback>[0]) => void;
151
+ onAgentProgress?: import("../engine/run-types.js").EngineRunOptions["onAgentProgress"];
149
152
  }
150
153
  export interface SubAgentSpawner {
151
154
  /**
@@ -154,16 +157,15 @@ export interface SubAgentSpawner {
154
157
  * (or `resumeSessionId` when resuming), so the parent can address follow-up
155
158
  * input at the same session via AgentSendInput (transcript replay).
156
159
  */
157
- spawn(req: SubAgentSpawnRequest): Promise<{
158
- text: string;
159
- sessionId: string;
160
- }>;
160
+ spawn(req: SubAgentSpawnRequest): Promise<SubAgentSpawnResult>;
161
161
  /**
162
162
  * Whether a child session id exists on disk. Lets AgentSendInput resume an
163
163
  * agent across a process restart (when the in-memory registry is empty but
164
164
  * the session transcript is still persisted). Optional for legacy callers.
165
165
  */
166
166
  sessionExists?(sessionId: string): boolean;
167
+ /** Persisted direct-parent metadata used to authorize cross-restart continuation. */
168
+ getSessionParentId?(sessionId: string): string | null | undefined;
167
169
  /** Stream callback to forward sub-agent events back to the parent UI. */
168
170
  parentStream?: StreamCallback;
169
171
  /** Static config used to describe what the spawned engine looks like. */
@@ -173,6 +175,12 @@ export interface SubAgentSpawner {
173
175
  permissionMode: string;
174
176
  };
175
177
  }
178
+ export interface SubAgentSpawnResult {
179
+ text: string;
180
+ sessionId: string;
181
+ /** Complete billed usage returned by the child Engine run. */
182
+ usage?: TokenUsage;
183
+ }
176
184
  /**
177
185
  * The full context object handed to every tool invocation.
178
186
  *
@@ -182,7 +190,20 @@ export interface SubAgentSpawner {
182
190
  export interface ToolVisibilityContext {
183
191
  cwd: string;
184
192
  hasGoal: boolean;
193
+ /** Resolved Session identity for per-session extension-tool visibility. */
194
+ sessionId?: string;
185
195
  settingsScope?: import("../settings/manager.js").SettingsScope;
196
+ host?: string;
197
+ isSubAgent?: boolean;
198
+ behaviorProfile?: string;
199
+ /** Host-authorized targets available to the cross-Session messaging builtin. */
200
+ sessionMessageTargets?: readonly import("../session/session-message.js").SessionMessageTarget[];
201
+ /**
202
+ * Per-run metadata produced by the active behavior profile's
203
+ * buildVisibilityMeta. Availability guards / definition rewriters that share
204
+ * the profile's domain read their conventional keys from here.
205
+ */
206
+ profileMeta?: Readonly<Record<string, unknown>>;
186
207
  }
187
208
  export interface ExternalFileChangesRecord {
188
209
  jobId: string;
@@ -193,19 +214,43 @@ export interface ExternalFileChangesRecord {
193
214
  changedFiles: string[];
194
215
  originClientMessageId?: string;
195
216
  }
217
+ export type ToolRunYieldReason = "background_notification";
218
+ /** Run-scoped handoff from a trusted tool to the owning turn loop. */
219
+ export interface ToolRunYieldController {
220
+ request(reason: ToolRunYieldReason): void;
221
+ /** Inspect without clearing so the loop can prioritize an accepted steer. */
222
+ peek?(): ToolRunYieldReason | undefined;
223
+ consume(): ToolRunYieldReason | undefined;
224
+ }
196
225
  export interface ToolContext {
197
226
  /** Active working directory for this Engine. */
198
227
  cwd: string;
228
+ /**
229
+ * Active digital-human profile's portable memory root. Present only when
230
+ * the resolved WorkspaceProfile enables portableMemory for this run.
231
+ * Memory tools use it for location:"profile"; other tools should treat the
232
+ * path as trusted run metadata, not as model-supplied input.
233
+ */
234
+ profileMemoryDir?: string;
199
235
  /** Mutate the owning live context cwd. Worktree switching intentionally does not use this. */
200
236
  setCwd?(cwd: string): void;
201
- /** Mutate the owning live session state after a session workspace switch. */
202
- setSessionWorkspace?(workspace: SessionWorkspace): void;
237
+ /** Mutate/rebase the owning live session state after a workspace switch. */
238
+ setSessionWorkspace?(workspace: SessionWorkspace, stateRevision?: number): void;
203
239
  /** LLM credentials/endpoint for tools that need to make their own calls. */
204
240
  llmConfig: LLMConfig;
205
- /** Active model pool (Arena reads this to pick participants). */
241
+ /** Active model pool for model-aware tools and product capabilities. */
206
242
  modelPool?: ModelPool;
207
243
  /** Tool registry (ToolSearch reads this to enumerate available tools). */
208
244
  toolRegistry: ToolRegistry;
245
+ /** Opaque services contributed by capability modules, keyed by capability id. */
246
+ capabilityServices?: Readonly<Record<string, unknown>>;
247
+ /**
248
+ * Run-scoped services produced by the active behavior profile's
249
+ * createRunServices. Tools that share the profile's domain conventions read
250
+ * their keys from here (e.g. DelegateWork reads the pet profile's
251
+ * petWorkspaces / requestPetWorkDelegation entries).
252
+ */
253
+ runScopedServices?: Readonly<Record<string, unknown>>;
209
254
  /** UI-backed AskUserQuestion handler. Undefined → headless mode. */
210
255
  askUser?: AskUserFn;
211
256
  /** Sub-agent spawner (Agent tool). Undefined → Agent tool unavailable. */
@@ -247,6 +292,14 @@ export interface ToolContext {
247
292
  * headless/test mode; tools must tolerate absence.
248
293
  */
249
294
  streamCallback?: StreamCallback;
295
+ /**
296
+ * Report provider usage produced by a tool or child Engine into the owning
297
+ * session and run-scoped Goal budget. This must not invoke the process-wide
298
+ * billing hook again; the originating provider client already did that.
299
+ */
300
+ recordBilledUsage?: (usage: TokenUsage) => void;
301
+ /** Connection-scoped approval owner router supplied by the protocol host. */
302
+ approvalRouter?: ApprovalRouter;
250
303
  /** Whether the owning Engine is currently in plan mode. Replaces the
251
304
  * removed module-level `isInPlanMode()` singleton. */
252
305
  planMode: boolean;
@@ -270,6 +323,8 @@ export interface ToolContext {
270
323
  * narrow context, or standalone tool tests. (B2 — Gate 1, standard §S3.)
271
324
  */
272
325
  sessionId?: string;
326
+ /** Engine-owned, run-scoped cross-Session message sender. */
327
+ sessionMessages?: import("../session/session-message.js").SessionMessageToolService;
273
328
  /** Stable id of the real user turn that owns async work launched here. */
274
329
  originClientMessageId?: string;
275
330
  /**
@@ -279,6 +334,12 @@ export interface ToolContext {
279
334
  * launched it has already returned.
280
335
  */
281
336
  recordExternalFileChanges?: (record: ExternalFileChangesRecord) => void;
337
+ /**
338
+ * A tool that launched asynchronous work can yield the current model loop.
339
+ * The completion notification will wake the same Session later, avoiding
340
+ * model-authored status polling while no new evidence can exist yet.
341
+ */
342
+ runYield?: ToolRunYieldController;
282
343
  /**
283
344
  * Skill names the user has hidden from the LLM (full namespaced names
284
345
  * for plugin skills, e.g. "docs:pdf"). The skill builtin tool uses
@@ -327,6 +388,8 @@ export interface ToolContext {
327
388
  * sub-agents and no-cwd contexts (same as readBuiltinOverride).
328
389
  */
329
390
  disabledBuiltins?: Set<string>;
391
+ /** Run-profile execution allowlist; omitted keeps the normal tool surface. */
392
+ allowedToolNames?: ReadonlySet<string>;
330
393
  /**
331
394
  * Per-turn context used by builtin availability guards. Engine.run() uses the
332
395
  * same object to hide tools from the model; ToolExecutor reuses it to reject
@@ -342,6 +405,11 @@ export interface ToolContext {
342
405
  * no gating (sub-agents / tests whose registries carry no MCP tools).
343
406
  */
344
407
  allowedMcpServers?: Set<string>;
408
+ /**
409
+ * Exact per-server MCP tool policy for this run. The engine uses the same
410
+ * map for model visibility, ToolSearch, and the executor's direct-call gate.
411
+ */
412
+ mcpToolPolicies?: ReadonlyMap<string, McpToolPolicy>;
345
413
  /**
346
414
  * The engine's settings scope, so tools that read disk config directly (e.g.
347
415
  * the credential tools) can honor host-isolation instead of always merging
@@ -376,6 +444,8 @@ export interface ToolContext {
376
444
  * session workspace.
377
445
  */
378
446
  workspace?: import("./workspace-bridge.js").WorkspaceBridge;
447
+ /** Host panel discovery/focus bridge. Undefined in non-Desktop/headless engines. */
448
+ panels?: import("./panel-bridge.js").PanelHostBridge;
379
449
  /**
380
450
  * Inject a stored cookie credential into the built-in browser (restore its
381
451
  * login state so the AI can drive the page as that account). The host
@@ -3,15 +3,14 @@
3
3
  */
4
4
  import { setMaxListeners } from "node:events";
5
5
  import { resolve as resolvePath, isAbsolute as isAbsolutePath } from "node:path";
6
+ import { isMcpToolNameAllowed, isRegisteredMcpToolAllowed } from "./mcp-tool-policy.js";
6
7
  import { classifyBashCommand } from "./permission.js";
7
8
  import { ToolNotFoundError } from "../exceptions.js";
8
9
  import { logger as rootLogger, getCurrentSid } from "../logging/logger.js";
9
10
  import { recordToolCall, recordToolResult } from "../logging/session-recorder.js";
10
11
  import { validateToolArgs } from "./validation.js";
11
12
  import { PLAN_MODE_ALLOWED_TOOLS } from "./plan-mode-allowlist.js";
12
- import { enforcePathPolicyWithApproval } from "./path-policy.js";
13
- import { parsePatch } from "./builtin/apply-patch/parser.js";
14
- import { BUILTIN_TOOL_GUARDS } from "./builtin/index.js";
13
+ import { attachFinalWritePathSnapshot, enforcePathPolicyWithApproval, } from "./path-policy.js";
15
14
  import { COMPLETE_GOAL_TOOL_NAME } from "./builtin/complete-goal.js";
16
15
  import { CANCEL_GOAL_TOOL_NAME } from "./builtin/cancel-goal.js";
17
16
  import { toolResultDisplayText } from "./tool-result-redaction.js";
@@ -119,6 +118,14 @@ export class ToolExecutor {
119
118
  isError: true,
120
119
  };
121
120
  }
121
+ if (this.toolCtx?.allowedToolNames && !this.toolCtx.allowedToolNames.has(call.toolName)) {
122
+ return {
123
+ id: call.id,
124
+ toolName: call.toolName,
125
+ error: `Tool ${call.toolName} is not allowed by this run profile. Do NOT retry this tool call.`,
126
+ isError: true,
127
+ };
128
+ }
122
129
  // 0. Capability override: a builtin the project marked `off` is HIDDEN from
123
130
  // the model's tool list (engine.ts applyBuiltinOverrideVisibility), but the
124
131
  // model can still NAME it (hallucination, or a remembered earlier turn). The
@@ -142,7 +149,7 @@ export class ToolExecutor {
142
149
  isError: true,
143
150
  };
144
151
  }
145
- const visibilityGuard = BUILTIN_TOOL_GUARDS.get(call.toolName);
152
+ const visibilityGuard = this.registry.getAvailabilityGuard(call.toolName);
146
153
  if (visibilityGuard &&
147
154
  this.toolCtx?.toolVisibility &&
148
155
  !visibilityGuard(this.toolCtx.toolVisibility)) {
@@ -167,6 +174,19 @@ export class ToolExecutor {
167
174
  isError: true,
168
175
  };
169
176
  }
177
+ if (reg?.source === "mcp" &&
178
+ !isRegisteredMcpToolAllowed({
179
+ source: "mcp",
180
+ serverName: reg.serverName,
181
+ mcpToolName: reg.mcpToolName,
182
+ }, this.toolCtx.mcpToolPolicies)) {
183
+ return {
184
+ id: call.id,
185
+ toolName: call.toolName,
186
+ error: `MCP tool "${reg.mcpToolName ?? call.toolName}" is disabled by this project's tool policy. Do NOT retry this tool call.`,
187
+ isError: true,
188
+ };
189
+ }
170
190
  // The generic MCP builtins (MCPTool / ReadMcpResource) take the target
171
191
  // server as an ARGUMENT and call MCPManager directly, so the source==="mcp"
172
192
  // check above can't see them — without this a session could invoke a tool
@@ -184,6 +204,17 @@ export class ToolExecutor {
184
204
  isError: true,
185
205
  };
186
206
  }
207
+ if (call.toolName === "MCPTool") {
208
+ const tool = String(call.args.tool ?? "");
209
+ if (!isMcpToolNameAllowed(this.toolCtx.mcpToolPolicies, server, tool)) {
210
+ return {
211
+ id: call.id,
212
+ toolName: call.toolName,
213
+ error: `MCP tool "${tool}" is disabled by this project's tool policy. Do NOT retry this tool call.`,
214
+ isError: true,
215
+ };
216
+ }
217
+ }
187
218
  }
188
219
  else if (call.toolName === "ListMcpResources") {
189
220
  const server = String(call.args.server ?? "");
@@ -244,6 +275,7 @@ export class ToolExecutor {
244
275
  toolName: call.toolName,
245
276
  args: call.args,
246
277
  toolCallId: call.id,
278
+ signal: this.signal ?? this.toolCtx?.signal,
247
279
  });
248
280
  if (hookResult.decision === "deny") {
249
281
  return {
@@ -280,6 +312,16 @@ export class ToolExecutor {
280
312
  // path surface on RegisteredTool.pathPolicy; the executor enforces it
281
313
  // after hooks have had a chance to rewrite args, but before permission
282
314
  // classification or the handler can touch the filesystem.
315
+ if ((call.toolName === "Write" || call.toolName === "Edit") &&
316
+ this.toolCtx?.cwd &&
317
+ typeof call.args.file_path === "string") {
318
+ const raw = call.args.file_path;
319
+ const target = isAbsolutePath(raw) ? raw : resolvePath(this.toolCtx.cwd, raw);
320
+ call = {
321
+ ...call,
322
+ args: attachFinalWritePathSnapshot(call.args, target, this.toolCtx.cwd),
323
+ };
324
+ }
283
325
  const pathPolicyError = await this.enforceDeclaredPathPolicy(toolDef, call.args);
284
326
  if (pathPolicyError) {
285
327
  return {
@@ -325,6 +367,7 @@ export class ToolExecutor {
325
367
  args: call.args,
326
368
  toolCallId: call.id,
327
369
  classifierDecision,
370
+ signal: this.signal ?? this.toolCtx?.signal,
328
371
  });
329
372
  const preClamped = clampHookDecision(classifierDecision, hookResult.decision);
330
373
  let decision = preClamped.decision;
@@ -383,6 +426,7 @@ export class ToolExecutor {
383
426
  toolName: call.toolName,
384
427
  args: call.args,
385
428
  toolCallId: call.id,
429
+ signal: this.signal ?? this.toolCtx?.signal,
386
430
  });
387
431
  // 3. Execute. Use a span so begin/end share one cat and end carries
388
432
  // duration_ms; widen args truncation from 200→2000 so Edit/Write payloads
@@ -431,25 +475,25 @@ export class ToolExecutor {
431
475
  result.id = call.id;
432
476
  // Prepend any non-blocking guard reminder onto a successful result so the
433
477
  // model sees it on its next turn alongside the content it just fetched.
434
- if (guardDecision?.prepend && !result.error && result.result) {
478
+ if (guardDecision?.prepend && !result.isError && result.result) {
435
479
  result.result = `${guardDecision.prepend}\n${result.result}`;
436
480
  }
437
481
  const observerResult = toolResultDisplayText(result);
438
482
  const payload = observerResult ?? result.error ?? "";
439
483
  span.end({
440
- ok: !result.error,
484
+ ok: !result.isError,
441
485
  chars: payload.length,
442
486
  // Snippet only on failure — successful tool output can be huge and is
443
487
  // already on the transcript. Failures are rare and the first 500 chars
444
488
  // usually contain the message we need.
445
- ...(result.error ? { errorSnippet: payload.slice(0, 500) } : {}),
489
+ ...(result.isError ? { errorSnippet: payload.slice(0, 500) } : {}),
446
490
  });
447
491
  recordToolResult(sid, {
448
492
  id: call.id,
449
493
  toolName: call.toolName,
450
- ok: !result.error,
494
+ ok: !result.isError,
451
495
  durationMs: Date.now() - toolStartedAt,
452
- output: result.error ? undefined : observerResult,
496
+ output: result.isError ? undefined : observerResult,
453
497
  error: result.error,
454
498
  });
455
499
  // 4. Post-tool hook
@@ -458,6 +502,7 @@ export class ToolExecutor {
458
502
  toolCallId: call.id,
459
503
  result: observerResult,
460
504
  error: result.error,
505
+ signal: this.signal ?? this.toolCtx?.signal,
461
506
  });
462
507
  // 5. Post-tool-use hook (after execution, can observe/modify result)
463
508
  const postHook = await this.hooks.emit("post_tool_use", {
@@ -465,13 +510,14 @@ export class ToolExecutor {
465
510
  toolCallId: call.id,
466
511
  result: observerResult,
467
512
  error: result.error,
513
+ signal: this.signal ?? this.toolCtx?.signal,
468
514
  });
469
515
  // Append handler-supplied context (linter output, type-check result,
470
516
  // etc.) onto the tool result so the model sees it on the next turn.
471
517
  // Tagged with a separator so the model can tell hook output from
472
518
  // tool output. Skip when the tool errored — additional context on a
473
519
  // failed tool would be confusing.
474
- if (postHook.additionalContext && !result.error) {
520
+ if (postHook.additionalContext && !result.isError) {
475
521
  const tag = "--- additional context from post_tool_use hook ---";
476
522
  result.result = result.result
477
523
  ? `${result.result}\n\n${tag}\n${postHook.additionalContext}`
@@ -484,10 +530,11 @@ export class ToolExecutor {
484
530
  });
485
531
  }
486
532
  // 6. file_changed hook for Write/Edit tools
487
- if ((call.toolName === "Write" || call.toolName === "Edit") && !result.error) {
533
+ if ((call.toolName === "Write" || call.toolName === "Edit") && !result.isError) {
488
534
  await this.hooks.emit("file_changed", {
489
535
  toolName: call.toolName,
490
536
  filePath: call.args.file_path,
537
+ signal: this.signal ?? this.toolCtx?.signal,
491
538
  });
492
539
  }
493
540
  return result;
@@ -504,6 +551,20 @@ export class ToolExecutor {
504
551
  return op.default;
505
552
  }
506
553
  async enforceDeclaredPathPolicy(tool, args) {
554
+ if (tool?.pathResolver) {
555
+ let targets;
556
+ try {
557
+ targets = tool.pathResolver.resolve(args, this.toolCtx?.cwd ?? process.cwd());
558
+ }
559
+ catch (err) {
560
+ return `Error: ${err instanceof Error ? err.message : String(err)}`;
561
+ }
562
+ for (const target of targets) {
563
+ const blocked = await enforcePathPolicyWithApproval(target, tool.pathResolver.operation, this.toolCtx);
564
+ if (blocked)
565
+ return blocked;
566
+ }
567
+ }
507
568
  const policies = tool?.pathPolicy;
508
569
  if (!policies?.length)
509
570
  return null;
@@ -521,55 +582,35 @@ export class ToolExecutor {
521
582
  return null;
522
583
  }
523
584
  resolvePathPolicyTargets(policy, args) {
524
- if (policy.kind === "arg") {
525
- const raw = args[policy.arg];
526
- if (typeof raw === "string" && raw.length > 0) {
527
- // Resolve a RELATIVE single-string path arg against ctx.cwd before
528
- // classification, mirroring the array branch below and the apply_patch
529
- // branch otherwise classifyPath's process.cwd()-based resolution
530
- // mis-places an in-workspace relative path (e.g. Read "src/x.ts") as
531
- // "outside workspace" and over-prompts. Absolute paths pass through.
532
- const cwd = this.toolCtx?.cwd ?? process.cwd();
533
- return [isAbsolutePath(raw) ? raw : resolvePath(cwd, raw)];
534
- }
535
- // Array path args (e.g. GenerateImage `referenceImages`, GenerateVideo
536
- // `images`): enforce EVERY element. Without this an array yielded zero
537
- // targets, so out-of-workspace reads bypassed the path-policy "ask" gate
538
- // that Read/Write enforce. http(s) URLs aren't file reads → skip them.
539
- // Relative paths resolve against ctx.cwd (the workspace) before
540
- // classification, like the apply_patch branch — otherwise classifyPath's
541
- // process.cwd()-based resolution would mis-place an in-workspace relative
542
- // path as "outside" and over-prompt. Non-string / empty elements skipped.
543
- if (Array.isArray(raw)) {
544
- const cwd = this.toolCtx?.cwd ?? process.cwd();
545
- const paths = raw
546
- .filter((v) => typeof v === "string" && v.length > 0)
547
- .filter((v) => !/^https?:\/\//i.test(v))
548
- .map((v) => (isAbsolutePath(v) ? v : resolvePath(cwd, v)));
549
- if (paths.length > 0)
550
- return paths;
551
- }
552
- if (policy.defaultToCwd && this.toolCtx?.cwd)
553
- return [this.toolCtx.cwd];
554
- return [];
555
- }
556
- const rawPatch = args[policy.arg];
557
- if (typeof rawPatch !== "string" || rawPatch.length === 0)
558
- return [];
559
- try {
560
- const parsed = parsePatch(rawPatch, "lenient");
585
+ const raw = args[policy.arg];
586
+ if (typeof raw === "string" && raw.length > 0) {
587
+ // Resolve a RELATIVE single-string path arg against ctx.cwd before
588
+ // classification, mirroring the array branch below and the apply_patch
589
+ // branch otherwise classifyPath's process.cwd()-based resolution
590
+ // mis-places an in-workspace relative path (e.g. Read "src/x.ts") as
591
+ // "outside workspace" and over-prompts. Absolute paths pass through.
561
592
  const cwd = this.toolCtx?.cwd ?? process.cwd();
562
- const targets = [];
563
- for (const hunk of parsed.hunks) {
564
- targets.push(resolvePath(cwd, hunk.path));
565
- if (hunk.kind === "update" && hunk.movePath) {
566
- targets.push(resolvePath(cwd, hunk.movePath));
567
- }
568
- }
569
- return targets;
593
+ return [isAbsolutePath(raw) ? raw : resolvePath(cwd, raw)];
570
594
  }
571
- catch (err) {
572
- return `Error: ${err.message}`;
595
+ // Array path args (e.g. GenerateImage `referenceImages`, GenerateVideo
596
+ // `images`): enforce EVERY element. Without this an array yielded zero
597
+ // targets, so out-of-workspace reads bypassed the path-policy "ask" gate
598
+ // that Read/Write enforce. http(s) URLs aren't file reads → skip them.
599
+ // Relative paths resolve against ctx.cwd (the workspace) before
600
+ // classification, like the apply_patch branch — otherwise classifyPath's
601
+ // process.cwd()-based resolution would mis-place an in-workspace relative
602
+ // path as "outside" and over-prompt. Non-string / empty elements skipped.
603
+ if (Array.isArray(raw)) {
604
+ const cwd = this.toolCtx?.cwd ?? process.cwd();
605
+ const paths = raw
606
+ .filter((v) => typeof v === "string" && v.length > 0)
607
+ .filter((v) => !/^https?:\/\//i.test(v))
608
+ .map((v) => (isAbsolutePath(v) ? v : resolvePath(cwd, v)));
609
+ if (paths.length > 0)
610
+ return paths;
573
611
  }
612
+ if (policy.defaultToCwd && this.toolCtx?.cwd)
613
+ return [this.toolCtx.cwd];
614
+ return [];
574
615
  }
575
616
  }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * The Host Tool allowlist for external Agent Runtimes.
3
+ *
4
+ * This is a policy artifact, not plumbing. It exists as one reviewable file —
5
+ * rather than scattered through the Claude/Codex adapters — because the design
6
+ * (§9.1) requires each entry to have been risk-reviewed individually, and a
7
+ * reviewer needs to see the whole surface at once.
8
+ *
9
+ * Two rules shape everything here:
10
+ *
11
+ * 1. **Allowlist only.** No "everything in the registry", no prefix matching.
12
+ * A tool absent from this file does not exist for an external runtime.
13
+ * Widening it is an edit to this file, which is the point: it leaves a diff.
14
+ * 2. **Host-loopback tools are special** (§9.3). `Panel`, `Browser`,
15
+ * `SwitchSessionWorkspace` and `InjectCredential` reach back out to a
16
+ * specific Desktop renderer window to do their work. Passing `ToolExecutor`
17
+ * does NOT make them callable — owner routing decides that, and it lives
18
+ * outside the executor. Any such tool needs its owner story argued before it
19
+ * can be listed.
20
+ *
21
+ * ## Why this is much wider than the original phase-one list
22
+ *
23
+ * The first cut exposed exactly one tool (`Panel`). That was not the product of
24
+ * a risk judgement so much as of an ordering: tools were held back until each
25
+ * had an argument written, and only one did. The result was a runtime that
26
+ * could list panels and nothing else — no skills, no memory, no file access —
27
+ * which is not a usable Agent Runtime, and made the feature's real state easy
28
+ * to overstate.
29
+ *
30
+ * The widening below was an explicit product-owner decision. The governing
31
+ * principle it rests on: **every tool here still executes through
32
+ * `ToolExecutor`**, so path policy, project trust, the user's permission rules
33
+ * and the approval UI all still apply. An external runtime holding `Bash` from
34
+ * this list is strictly more governed than the same model calling its own
35
+ * built-in shell, which answers only to the runtime's sandbox. Exposure moves
36
+ * capability from an unobservable authorization domain into the user's.
37
+ *
38
+ * That argument does not extend to everything, and four tools remain excluded
39
+ * for structural reasons rather than caution — see the block below them.
40
+ * `InjectCredential` is the highest-risk entry and depends on an in-tool
41
+ * approval that must stay mandatory; if that ever changes, it goes back out.
42
+ */
43
+ import type { ExternalToolExposurePolicy } from "./session-tool-host.js";
44
+ /** Why a tool is in (or out of) the first-phase allowlist. */
45
+ export interface ExposureRationale {
46
+ tool: string;
47
+ /** `self-contained` completes in-process; `host-loopback` calls back to a window. */
48
+ kind: "self-contained" | "host-loopback";
49
+ status: "exposed" | "deferred" | "excluded";
50
+ reason: string;
51
+ }
52
+ /**
53
+ * The audit trail behind {@link FIRST_PHASE_EXPOSURE}. Kept as data so the
54
+ * "excluded" decisions are visible too — a bare allowlist tells a reviewer what
55
+ * was included but not what was considered and rejected, which is the more
56
+ * useful half when judging whether the surface is sound.
57
+ */
58
+ export declare const FIRST_PHASE_EXPOSURE_RATIONALE: readonly ExposureRationale[];
59
+ /** The phase-one policy. Pass to `createSessionToolHost({ exposure })`. */
60
+ export declare const FIRST_PHASE_EXPOSURE: ExternalToolExposurePolicy;