@cjhyy/code-shell-core 0.7.1 → 0.8.1

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 (595) 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 +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/path-policy.js +99 -2
  374. package/dist/tool-system/permission.d.ts +26 -0
  375. package/dist/tool-system/permission.js +46 -0
  376. package/dist/tool-system/registry.d.ts +12 -1
  377. package/dist/tool-system/registry.js +31 -7
  378. package/dist/tool-system/sandbox/index.js +3 -8
  379. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  380. package/dist/tool-system/session-tool-host.d.ts +139 -0
  381. package/dist/tool-system/session-tool-host.js +167 -0
  382. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  383. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  384. package/dist/tool-system/validation.d.ts +14 -7
  385. package/dist/tool-system/validation.js +701 -7
  386. package/dist/types.d.ts +186 -20
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  388. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  389. package/dist/utils/file-mutex.d.ts +65 -0
  390. package/dist/utils/file-mutex.js +145 -0
  391. package/dist/utils/json.d.ts +2 -4
  392. package/dist/utils/json.js +2 -4
  393. package/dist/utils/lockfile.d.ts +30 -1
  394. package/dist/utils/lockfile.js +2 -2
  395. package/dist/utils/secret-scrubber.d.ts +8 -0
  396. package/dist/utils/secret-scrubber.js +227 -0
  397. package/dist/utils/toolDisplay.js +1 -1
  398. package/package.json +20 -5
  399. package/THIRD_PARTY_NOTICES.md +0 -206
  400. package/dist/arena/arena.d.ts +0 -45
  401. package/dist/arena/arena.js +0 -362
  402. package/dist/arena/context/context-tools.d.ts +0 -16
  403. package/dist/arena/context/context-tools.js +0 -272
  404. package/dist/arena/context/within-root.d.ts +0 -7
  405. package/dist/arena/context/within-root.js +0 -15
  406. package/dist/arena/detect-mode.d.ts +0 -20
  407. package/dist/arena/detect-mode.js +0 -78
  408. package/dist/arena/digest-builder.d.ts +0 -25
  409. package/dist/arena/digest-builder.js +0 -120
  410. package/dist/arena/index.d.ts +0 -29
  411. package/dist/arena/index.js +0 -29
  412. package/dist/arena/iterate/convergence.d.ts +0 -25
  413. package/dist/arena/iterate/convergence.js +0 -103
  414. package/dist/arena/iterate/formats/index.d.ts +0 -22
  415. package/dist/arena/iterate/formats/index.js +0 -283
  416. package/dist/arena/iterate/index.d.ts +0 -11
  417. package/dist/arena/iterate/index.js +0 -9
  418. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  419. package/dist/arena/iterate/iterative-arena.js +0 -237
  420. package/dist/arena/iterate/parse.d.ts +0 -42
  421. package/dist/arena/iterate/parse.js +0 -123
  422. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  423. package/dist/arena/iterate/phases/argue.js +0 -165
  424. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  425. package/dist/arena/iterate/phases/revise.js +0 -62
  426. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  427. package/dist/arena/iterate/phases/tournament.js +0 -113
  428. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  429. package/dist/arena/iterate/tools/web-tools.js +0 -54
  430. package/dist/arena/iterate/types.d.ts +0 -152
  431. package/dist/arena/iterate/types.js +0 -8
  432. package/dist/arena/ledger.d.ts +0 -47
  433. package/dist/arena/ledger.js +0 -159
  434. package/dist/arena/lenses/architecture.d.ts +0 -5
  435. package/dist/arena/lenses/architecture.js +0 -22
  436. package/dist/arena/lenses/engineering.d.ts +0 -5
  437. package/dist/arena/lenses/engineering.js +0 -22
  438. package/dist/arena/lenses/general.d.ts +0 -5
  439. package/dist/arena/lenses/general.js +0 -20
  440. package/dist/arena/lenses/index.d.ts +0 -16
  441. package/dist/arena/lenses/index.js +0 -47
  442. package/dist/arena/lenses/product.d.ts +0 -5
  443. package/dist/arena/lenses/product.js +0 -22
  444. package/dist/arena/model-presets.d.ts +0 -23
  445. package/dist/arena/model-presets.js +0 -44
  446. package/dist/arena/phases/adjudication.d.ts +0 -25
  447. package/dist/arena/phases/adjudication.js +0 -142
  448. package/dist/arena/phases/build-consensus.d.ts +0 -30
  449. package/dist/arena/phases/build-consensus.js +0 -85
  450. package/dist/arena/phases/claim-registry.d.ts +0 -26
  451. package/dist/arena/phases/claim-registry.js +0 -60
  452. package/dist/arena/phases/cross-review.d.ts +0 -47
  453. package/dist/arena/phases/cross-review.js +0 -224
  454. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  455. package/dist/arena/phases/debate-rounds.js +0 -161
  456. package/dist/arena/phases/participant-research.d.ts +0 -39
  457. package/dist/arena/phases/participant-research.js +0 -316
  458. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  459. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  460. package/dist/arena/planner.d.ts +0 -28
  461. package/dist/arena/planner.js +0 -312
  462. package/dist/arena/providers/docs.d.ts +0 -7
  463. package/dist/arena/providers/docs.js +0 -111
  464. package/dist/arena/providers/git.d.ts +0 -8
  465. package/dist/arena/providers/git.js +0 -174
  466. package/dist/arena/providers/index.d.ts +0 -32
  467. package/dist/arena/providers/index.js +0 -132
  468. package/dist/arena/providers/none.d.ts +0 -7
  469. package/dist/arena/providers/none.js +0 -11
  470. package/dist/arena/providers/repo.d.ts +0 -7
  471. package/dist/arena/providers/repo.js +0 -258
  472. package/dist/arena/render/session.d.ts +0 -17
  473. package/dist/arena/render/session.js +0 -190
  474. package/dist/arena/render/terminal.d.ts +0 -34
  475. package/dist/arena/render/terminal.js +0 -286
  476. package/dist/arena/strategies/discussion.d.ts +0 -25
  477. package/dist/arena/strategies/discussion.js +0 -143
  478. package/dist/arena/strategies/index.d.ts +0 -15
  479. package/dist/arena/strategies/index.js +0 -28
  480. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  481. package/dist/arena/strategies/language-wrapper.js +0 -102
  482. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  483. package/dist/arena/strategies/lens-wrapper.js +0 -236
  484. package/dist/arena/strategies/planning.d.ts +0 -30
  485. package/dist/arena/strategies/planning.js +0 -225
  486. package/dist/arena/strategies/review.d.ts +0 -26
  487. package/dist/arena/strategies/review.js +0 -168
  488. package/dist/arena/strategies/utils.d.ts +0 -36
  489. package/dist/arena/strategies/utils.js +0 -603
  490. package/dist/arena/tools/selector.d.ts +0 -17
  491. package/dist/arena/tools/selector.js +0 -61
  492. package/dist/arena/transitions.d.ts +0 -53
  493. package/dist/arena/transitions.js +0 -97
  494. package/dist/arena/types.d.ts +0 -518
  495. package/dist/arena/types.js +0 -27
  496. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  497. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  498. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  499. package/dist/cc-orchestrator/cc-capability.js +0 -53
  500. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  501. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  502. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  503. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  504. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  505. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  506. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  507. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  508. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  509. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  510. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  511. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  512. package/dist/cc-orchestrator/index.d.ts +0 -8
  513. package/dist/cc-orchestrator/index.js +0 -8
  514. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  515. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  516. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  517. package/dist/cc-orchestrator/session-discovery.js +0 -125
  518. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  519. package/dist/cc-orchestrator/session-history.js +0 -150
  520. package/dist/cron/cron-runtime.d.ts +0 -2
  521. package/dist/cron/cron-runtime.js +0 -2
  522. package/dist/cron/cron-store.d.ts +0 -2
  523. package/dist/cron/cron-store.js +0 -2
  524. package/dist/cron/scheduler.d.ts +0 -7
  525. package/dist/cron/scheduler.js +0 -7
  526. package/dist/engine/goal.js +0 -206
  527. package/dist/external-agents/config.d.ts +0 -2
  528. package/dist/external-agents/config.js +0 -15
  529. package/dist/external-agents/types.d.ts +0 -31
  530. package/dist/git/parse-log.d.ts +0 -13
  531. package/dist/git/parse-log.js +0 -21
  532. package/dist/git/utils.d.ts +0 -49
  533. package/dist/git/utils.js +0 -161
  534. package/dist/git/worktree/crud.d.ts +0 -72
  535. package/dist/git/worktree/crud.js +0 -235
  536. package/dist/git/worktree/diff.d.ts +0 -14
  537. package/dist/git/worktree/diff.js +0 -82
  538. package/dist/git/worktree/git-exec.d.ts +0 -7
  539. package/dist/git/worktree/git-exec.js +0 -87
  540. package/dist/git/worktree/index.d.ts +0 -5
  541. package/dist/git/worktree/index.js +0 -5
  542. package/dist/git/worktree/query.d.ts +0 -43
  543. package/dist/git/worktree/query.js +0 -128
  544. package/dist/git/worktree/slug.d.ts +0 -11
  545. package/dist/git/worktree/slug.js +0 -58
  546. package/dist/git/worktree.d.ts +0 -1
  547. package/dist/git/worktree.js +0 -5
  548. package/dist/lsp/client.d.ts +0 -41
  549. package/dist/lsp/client.js +0 -186
  550. package/dist/lsp/manager.d.ts +0 -40
  551. package/dist/lsp/manager.js +0 -155
  552. package/dist/lsp/root-path.d.ts +0 -9
  553. package/dist/lsp/root-path.js +0 -12
  554. package/dist/lsp/servers.d.ts +0 -16
  555. package/dist/lsp/servers.js +0 -60
  556. package/dist/prompt/sections/coding.md +0 -35
  557. package/dist/quota/credentials.d.ts +0 -3
  558. package/dist/quota/credentials.js +0 -80
  559. package/dist/quota/index.d.ts +0 -36
  560. package/dist/quota/index.js +0 -155
  561. package/dist/quota/types.d.ts +0 -48
  562. package/dist/quota/types.js +0 -13
  563. package/dist/review/review-prompt.d.ts +0 -28
  564. package/dist/review/review-prompt.js +0 -81
  565. package/dist/state.d.ts +0 -160
  566. package/dist/state.js +0 -267
  567. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  568. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  570. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  571. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  572. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  573. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  574. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  576. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  577. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  578. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  579. package/dist/tool-system/builtin/arena.d.ts +0 -31
  580. package/dist/tool-system/builtin/arena.js +0 -416
  581. package/dist/tool-system/builtin/brief.d.ts +0 -6
  582. package/dist/tool-system/builtin/brief.js +0 -41
  583. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  584. package/dist/tool-system/builtin/check-quota.js +0 -34
  585. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  586. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  587. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  588. package/dist/tool-system/builtin/lsp.js +0 -144
  589. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  590. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  591. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  592. package/dist/tool-system/builtin/worktree.js +0 -363
  593. /package/dist/{external-agents → links}/types.js +0 -0
  594. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  595. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -3,6 +3,7 @@
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";
@@ -10,8 +11,6 @@ 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
13
  import { attachFinalWritePathSnapshot, enforcePathPolicyWithApproval, } from "./path-policy.js";
13
- import { parsePatch } from "./builtin/apply-patch/parser.js";
14
- import { BUILTIN_TOOL_GUARDS } from "./builtin/index.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 ?? "");
@@ -520,6 +551,20 @@ export class ToolExecutor {
520
551
  return op.default;
521
552
  }
522
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
+ }
523
568
  const policies = tool?.pathPolicy;
524
569
  if (!policies?.length)
525
570
  return null;
@@ -537,55 +582,35 @@ export class ToolExecutor {
537
582
  return null;
538
583
  }
539
584
  resolvePathPolicyTargets(policy, args) {
540
- if (policy.kind === "arg") {
541
- const raw = args[policy.arg];
542
- if (typeof raw === "string" && raw.length > 0) {
543
- // Resolve a RELATIVE single-string path arg against ctx.cwd before
544
- // classification, mirroring the array branch below and the apply_patch
545
- // branch otherwise classifyPath's process.cwd()-based resolution
546
- // mis-places an in-workspace relative path (e.g. Read "src/x.ts") as
547
- // "outside workspace" and over-prompts. Absolute paths pass through.
548
- const cwd = this.toolCtx?.cwd ?? process.cwd();
549
- return [isAbsolutePath(raw) ? raw : resolvePath(cwd, raw)];
550
- }
551
- // Array path args (e.g. GenerateImage `referenceImages`, GenerateVideo
552
- // `images`): enforce EVERY element. Without this an array yielded zero
553
- // targets, so out-of-workspace reads bypassed the path-policy "ask" gate
554
- // that Read/Write enforce. http(s) URLs aren't file reads → skip them.
555
- // Relative paths resolve against ctx.cwd (the workspace) before
556
- // classification, like the apply_patch branch — otherwise classifyPath's
557
- // process.cwd()-based resolution would mis-place an in-workspace relative
558
- // path as "outside" and over-prompt. Non-string / empty elements skipped.
559
- if (Array.isArray(raw)) {
560
- const cwd = this.toolCtx?.cwd ?? process.cwd();
561
- const paths = raw
562
- .filter((v) => typeof v === "string" && v.length > 0)
563
- .filter((v) => !/^https?:\/\//i.test(v))
564
- .map((v) => (isAbsolutePath(v) ? v : resolvePath(cwd, v)));
565
- if (paths.length > 0)
566
- return paths;
567
- }
568
- if (policy.defaultToCwd && this.toolCtx?.cwd)
569
- return [this.toolCtx.cwd];
570
- return [];
571
- }
572
- const rawPatch = args[policy.arg];
573
- if (typeof rawPatch !== "string" || rawPatch.length === 0)
574
- return [];
575
- try {
576
- 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.
577
592
  const cwd = this.toolCtx?.cwd ?? process.cwd();
578
- const targets = [];
579
- for (const hunk of parsed.hunks) {
580
- targets.push(resolvePath(cwd, hunk.path));
581
- if (hunk.kind === "update" && hunk.movePath) {
582
- targets.push(resolvePath(cwd, hunk.movePath));
583
- }
584
- }
585
- return targets;
593
+ return [isAbsolutePath(raw) ? raw : resolvePath(cwd, raw)];
586
594
  }
587
- catch (err) {
588
- 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;
589
611
  }
612
+ if (policy.defaultToCwd && this.toolCtx?.cwd)
613
+ return [this.toolCtx.cwd];
614
+ return [];
590
615
  }
591
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;
@@ -0,0 +1,304 @@
1
+ /**
2
+ * The audit trail behind {@link FIRST_PHASE_EXPOSURE}. Kept as data so the
3
+ * "excluded" decisions are visible too — a bare allowlist tells a reviewer what
4
+ * was included but not what was considered and rejected, which is the more
5
+ * useful half when judging whether the surface is sound.
6
+ */
7
+ export const FIRST_PHASE_EXPOSURE_RATIONALE = [
8
+ {
9
+ tool: "Panel",
10
+ kind: "host-loopback",
11
+ status: "exposed",
12
+ reason: "Only list/open/tools. These are read-or-focus, and they have a broadcast " +
13
+ "fallback, so they work without an owning window. invoke stays out for now " +
14
+ "for a DIFFERENT reason than originally recorded: the owner claim it was " +
15
+ "waiting on now exists and is wired (ExternalRuntimeService claims before " +
16
+ "the runtime starts), so the blocker is no longer technical. What is still " +
17
+ "missing is a per-Panel-App risk review — invoke runs third-party Panel App " +
18
+ "code with whatever arguments the model supplies, and argsPatterns cannot " +
19
+ "constrain a nested payload. Enabling it is a policy decision, not a wiring " +
20
+ "one, and it belongs to whoever reviews the first Panel App to be trusted.",
21
+ },
22
+ {
23
+ // NOTE the names: there is no tool called "Browser". The registry exposes
24
+ // three separate browser tools, and an allowlist entry for a name that does
25
+ // not exist is silently inert — it neither grants nor denies anything,
26
+ // which is the worst of both (a reviewer reads it as covered).
27
+ tool: "browser_navigate",
28
+ kind: "host-loopback",
29
+ status: "exposed",
30
+ reason: "The browser capability the runtime genuinely lacks — the differentiator, " +
31
+ "not a duplicate — and the owner argument it was waiting on is the same one " +
32
+ "Panel now has: ExternalRuntimeService registers the session and claims the " +
33
+ "owning window before the runtime starts. Stays under ToolExecutor plus the " +
34
+ "user's permission rules; without an owning window it fails closed on " +
35
+ "routing rather than broadcasting.",
36
+ },
37
+ {
38
+ tool: "browser_observe",
39
+ kind: "host-loopback",
40
+ status: "exposed",
41
+ reason: "Reads page content. Same owner story as browser_navigate, no mutation.",
42
+ },
43
+ {
44
+ tool: "browser_act",
45
+ kind: "host-loopback",
46
+ status: "exposed",
47
+ reason: "Click / type / interact — the mutating third of the browser surface, and " +
48
+ "the one that combines with InjectCredential to act as the logged-in user. " +
49
+ "Exposed on the product owner's call, under the same ToolExecutor rules as " +
50
+ "every other entry here.",
51
+ },
52
+ {
53
+ tool: "InjectCredential",
54
+ kind: "host-loopback",
55
+ status: "exposed",
56
+ reason: "Injects saved cookie credentials into the built-in browser to restore a " +
57
+ "login. This is the single highest-risk entry in this file and the one " +
58
+ "reviewers should look at first: it hands a live session cookie to a page, " +
59
+ "and a model that can also drive the Browser can then act as the logged-in " +
60
+ "user. §12.4 excluded credential-bearing tools outright; that blanket rule " +
61
+ "is relaxed here on the product owner's explicit call because credential " +
62
+ "restore is what makes browser automation usable at all. The mitigation is " +
63
+ "NOT the allowlist — it is the tool's own in-tool approval, which stays " +
64
+ "mandatory (see builtin/index.ts) and is never auto-approved for an " +
65
+ "external runtime. If that approval is ever made skippable, this entry must " +
66
+ "go back to excluded.",
67
+ },
68
+ // ── Still excluded, and for a different KIND of reason ───────────
69
+ // The four below are not held back out of caution — widening the allowlist
70
+ // does not make them work. Each is excluded by a structural property that
71
+ // would have to be designed away first, so listing them would produce a tool
72
+ // that is advertised and then fails or misbehaves.
73
+ {
74
+ tool: "Agent",
75
+ kind: "self-contained",
76
+ status: "excluded",
77
+ reason: "Can spawn another agent, so an external runtime could recurse into itself, " +
78
+ "nest approvals, and escape concurrency/budget limits (§12.5). Unlike Bash " +
79
+ "or Browser, this is not a permission question: the recursion has no owner " +
80
+ "and no budget to charge, so exposing it would need a nesting model first.",
81
+ },
82
+ {
83
+ tool: "DriveAgent",
84
+ kind: "self-contained",
85
+ status: "excluded",
86
+ reason: "Same recursion hazard as Agent (§12.5).",
87
+ },
88
+ {
89
+ tool: "EnterPlanMode",
90
+ kind: "self-contained",
91
+ status: "excluded",
92
+ reason: "Engine state-machine tool. Exposing it lets the runtime and the Native " +
93
+ "Engine drive each other's plan state (§12.3) — and an external runtime has " +
94
+ "no Engine plan state of its own to enter, so the call has no coherent " +
95
+ "meaning on this path.",
96
+ },
97
+ {
98
+ tool: "ExitPlanMode",
99
+ kind: "self-contained",
100
+ status: "excluded",
101
+ reason: "Engine state-machine tool; same reason as EnterPlanMode.",
102
+ },
103
+ {
104
+ tool: "Read",
105
+ kind: "self-contained",
106
+ status: "exposed",
107
+ reason: "Overlaps a tool the runtime already has, which was the original reason to " +
108
+ "exclude it. That reasoning was wrong about which risk matters: the runtime's " +
109
+ "OWN Read answers to the runtime's sandbox, while this one answers to " +
110
+ "ToolExecutor — path policy, project trust and the user's permission rules. " +
111
+ "Exposing it means the model has a reachable path that IS governed by " +
112
+ "CodeShell, which is the point of augmented mode. Naming overlap is a " +
113
+ "presentation problem (the MCP server prefixes its tools); sandbox " +
114
+ "divergence is a security one.",
115
+ },
116
+ {
117
+ tool: "Bash",
118
+ kind: "self-contained",
119
+ status: "exposed",
120
+ reason: "Same argument as Read, and it is the tool where it matters most: the " +
121
+ "runtime's own shell runs under the runtime's approval policy, which the " +
122
+ "user did not configure and cannot see. Routing a shell call through " +
123
+ "ToolExecutor puts it under the user's own permission rules and the " +
124
+ "approval UI. Note this does NOT remove the runtime's own shell — it adds a " +
125
+ "governed alternative.",
126
+ },
127
+ // ── Skills, memory and planning ──────────────────────────────────
128
+ // These are the reason someone runs a model inside CodeShell rather than in a
129
+ // bare terminal. A runtime that cannot reach them is a stranger in the app: it
130
+ // cannot load the user's skills, cannot recall anything, and forgets the
131
+ // session the moment it ends. Phase one excluded them by omission rather than
132
+ // by argument — no rationale entry existed at all, which is how a surface ends
133
+ // up shipping at 1 tool out of 48 without anyone deciding that.
134
+ {
135
+ tool: "Skill",
136
+ kind: "self-contained",
137
+ status: "exposed",
138
+ reason: "Loads a SKILL.md body and returns it as the tool result — it reads from " +
139
+ "the scanner, never the disk directly, and executes nothing itself. A skill " +
140
+ "body may TELL the model to run commands, but those become ordinary tool " +
141
+ "calls that face the same authorization as any other. Withholding Skill " +
142
+ "does not withhold that capability; it only withholds the user's own " +
143
+ "curated instructions.",
144
+ },
145
+ {
146
+ tool: "MemoryRead",
147
+ kind: "self-contained",
148
+ status: "exposed",
149
+ reason: "Reads the user's memory store. No side effects.",
150
+ },
151
+ {
152
+ tool: "MemoryList",
153
+ kind: "self-contained",
154
+ status: "exposed",
155
+ reason: "Enumerates memory entries. No side effects.",
156
+ },
157
+ {
158
+ tool: "MemorySave",
159
+ kind: "self-contained",
160
+ status: "exposed",
161
+ reason: "Writes to the memory store, so it is a mutation — but a scoped one, into " +
162
+ "a store the user can read and edit, and it carries the same permission " +
163
+ "rules as on the native path.",
164
+ },
165
+ {
166
+ tool: "MemoryDelete",
167
+ kind: "self-contained",
168
+ status: "exposed",
169
+ reason: "Mutation, same store and same rules as MemorySave.",
170
+ },
171
+ {
172
+ tool: "TodoWrite",
173
+ kind: "self-contained",
174
+ status: "exposed",
175
+ reason: "Session-scoped task list. Visible to the user, trivially reversible.",
176
+ },
177
+ {
178
+ tool: "Glob",
179
+ kind: "self-contained",
180
+ status: "exposed",
181
+ reason: "Path search under the same path policy as Read.",
182
+ },
183
+ {
184
+ tool: "Grep",
185
+ kind: "self-contained",
186
+ status: "exposed",
187
+ reason: "Content search under the same path policy as Read.",
188
+ },
189
+ {
190
+ tool: "Write",
191
+ kind: "self-contained",
192
+ status: "exposed",
193
+ reason: "File mutation governed by ToolExecutor. Same argument as Bash.",
194
+ },
195
+ {
196
+ tool: "Edit",
197
+ kind: "self-contained",
198
+ status: "exposed",
199
+ reason: "File mutation governed by ToolExecutor. Same argument as Bash.",
200
+ },
201
+ {
202
+ tool: "WebSearch",
203
+ kind: "self-contained",
204
+ status: "exposed",
205
+ reason: "Read-only network lookup; already available to the model by other means.",
206
+ },
207
+ {
208
+ tool: "WebFetch",
209
+ kind: "self-contained",
210
+ status: "exposed",
211
+ reason: "Read-only fetch, subject to the same URL handling as the native path.",
212
+ },
213
+ ];
214
+ /**
215
+ * Action-level narrowing for tools that multiplex several operations behind one
216
+ * name. Anchored automatically — see `matchesWholeValue`.
217
+ *
218
+ * This is a second, independent layer from the tool's own
219
+ * `defaultPermissionRules`: those decide allow/ask for a call that IS permitted,
220
+ * while this decides whether the action is reachable from an external runtime at
221
+ * all. Both are narrowed to read-only actions in phase one, and `Panel.invoke`
222
+ * additionally fails closed on owner routing — three independent barriers, by
223
+ * design.
224
+ */
225
+ const FIRST_PHASE_ARGS_PATTERNS = new Map([
226
+ // Panel.invoke remains the one action-level restriction. It runs third-party
227
+ // Panel App code with whatever arguments the model supplies, and argsPatterns
228
+ // cannot constrain a nested payload — so unlike every tool widened above, the
229
+ // authorization layer genuinely cannot see what is being authorized. Enabling
230
+ // it belongs to whoever reviews the first Panel App to be trusted.
231
+ ["Panel", { action: "list|open|tools" }],
232
+ ]);
233
+ /**
234
+ * `ReadonlySet` / `ReadonlyMap` are compile-time only — the underlying `Set` and
235
+ * `Map` stay mutable at runtime, and this policy is a process-wide singleton read
236
+ * live on every `execute()`. Without this, one `argsPatterns.delete("Panel")`
237
+ * anywhere in the process would re-enable `Panel.invoke` for every already-running
238
+ * host: exactly the capability held back pending the §9.3.2 owner claim.
239
+ */
240
+ function reject() {
241
+ throw new TypeError("The external tool exposure policy is frozen and cannot be widened.");
242
+ }
243
+ /**
244
+ * Hand out a plain object implementing the read half of `Set`, not a real `Set`.
245
+ *
246
+ * Shadowing `add`/`delete`/`clear` on a `Set` is not enough: the prototype method
247
+ * is still reachable (`Set.prototype.add.call(policySet, "Bash")`), and `delete
248
+ * s.add` un-shadows it. Returning a non-`Set` object removes the mutators
249
+ * entirely — there is no `Set` internal slot to target — and `Object.freeze`
250
+ * stops the read methods from being swapped out.
251
+ */
252
+ function frozenSet(values) {
253
+ const inner = new Set(values);
254
+ const view = Object.freeze({
255
+ has: (value) => inner.has(value),
256
+ get size() {
257
+ return inner.size;
258
+ },
259
+ keys: () => inner.keys(),
260
+ values: () => inner.values(),
261
+ entries: () => inner.entries(),
262
+ // Pass the VIEW as the third argument, never `inner`. Set.prototype.forEach
263
+ // hands the callback the collection itself, so forwarding `inner` would leak
264
+ // a live mutable handle to the very object this wrapper exists to protect —
265
+ // `policy.forEach((_a, _b, s) => s.add("Bash"))` would widen it in one line,
266
+ // through the public frozen API, with no prototype tricks at all.
267
+ forEach: (fn, thisArg) => inner.forEach((a, b) => fn.call(thisArg, a, b, view)),
268
+ [Symbol.iterator]: () => inner[Symbol.iterator](),
269
+ add: reject,
270
+ delete: reject,
271
+ clear: reject,
272
+ });
273
+ return view;
274
+ }
275
+ /** Same reasoning as {@link frozenSet}, for the args-pattern map. */
276
+ function frozenMap(entries) {
277
+ const inner = new Map(entries);
278
+ const view = Object.freeze({
279
+ get: (key) => inner.get(key),
280
+ has: (key) => inner.has(key),
281
+ get size() {
282
+ return inner.size;
283
+ },
284
+ keys: () => inner.keys(),
285
+ values: () => inner.values(),
286
+ entries: () => inner.entries(),
287
+ // See frozenSet.forEach — arg 3 must be the view, not `inner`.
288
+ forEach: (fn, thisArg) => inner.forEach((v, k) => fn.call(thisArg, v, k, view)),
289
+ [Symbol.iterator]: () => inner[Symbol.iterator](),
290
+ set: reject,
291
+ delete: reject,
292
+ clear: reject,
293
+ });
294
+ return view;
295
+ }
296
+ /** The phase-one policy. Pass to `createSessionToolHost({ exposure })`. */
297
+ export const FIRST_PHASE_EXPOSURE = Object.freeze({
298
+ mode: "allowlist",
299
+ toolNames: frozenSet(FIRST_PHASE_EXPOSURE_RATIONALE.filter((entry) => entry.status === "exposed").map((entry) => entry.tool)),
300
+ argsPatterns: frozenMap([...FIRST_PHASE_ARGS_PATTERNS].map(([tool, patterns]) => [
301
+ tool,
302
+ Object.freeze({ ...patterns }),
303
+ ])),
304
+ });
@@ -79,6 +79,16 @@ export declare function spillMcpImage(serverName: string, toolName: string, base
79
79
  export declare function wrapMcpOutput(serverName: string, toolName: string, body: string): string;
80
80
  export declare function stripInternalToolArgs(args: Record<string, unknown>): Record<string, unknown>;
81
81
  export declare function buildRegisteredTool(serverName: string, tool: McpTool): RegisteredTool;
82
+ /**
83
+ * Per-server outcome of a connectAll() sweep (see the optional onServerEvent
84
+ * parameter). The engine forwards these onto the `notification` hook so hosts
85
+ * and plugins can surface MCP availability without polling.
86
+ */
87
+ export interface McpServerLifecycleEvent {
88
+ type: "mcp_server_connected" | "mcp_server_failed";
89
+ server: string;
90
+ error?: string;
91
+ }
82
92
  export declare class MCPManager {
83
93
  private readonly toolRegistry;
84
94
  private static instance;
@@ -104,7 +114,7 @@ export declare class MCPManager {
104
114
  /**
105
115
  * Connect to all configured MCP servers and register their tools.
106
116
  */
107
- connectAll(servers: Record<string, MCPServerConfig>, owner?: unknown): Promise<void>;
117
+ connectAll(servers: Record<string, MCPServerConfig>, owner?: unknown, onServerEvent?: (event: McpServerLifecycleEvent) => void): Promise<void>;
108
118
  reconcile(servers: Record<string, MCPServerConfig>, owner?: unknown): Promise<void>;
109
119
  /**
110
120
  * Remove one owner from the shared desired-server pool and disconnect servers
@@ -174,6 +174,9 @@ export function createMcpAuthenticatedFetch(serverName, config, access = getCred
174
174
  }
175
175
  token = (await access.resolveOAuthAccess({ id: credentialId, scope: "full" })).accessToken;
176
176
  }
177
+ // The SDK and Bun can contribute distinct undici-compatible Request types.
178
+ // Normalize once at the adapter boundary instead of leaking that ambient
179
+ // declaration mismatch through the authentication/replay logic.
177
180
  const source = new Request(input, init);
178
181
  let replayable = true;
179
182
  try {
@@ -184,12 +187,14 @@ export function createMcpAuthenticatedFetch(serverName, config, access = getCred
184
187
  }
185
188
  const send = async (accessToken) => {
186
189
  const request = replayable ? source.clone() : source;
187
- const requestHeaders = new Headers(request.headers);
190
+ const requestHeaders = new Headers(Array.from(request.headers.entries()));
188
191
  for (const [name, value] of Object.entries(headers))
189
192
  requestHeaders.set(name, value);
190
193
  if (accessToken)
191
194
  requestHeaders.set("Authorization", `Bearer ${accessToken}`);
192
- return baseFetch(new Request(request, { headers: requestHeaders }));
195
+ return baseFetch(new Request(request, {
196
+ headers: Array.from(requestHeaders.entries()),
197
+ }));
193
198
  };
194
199
  const first = await send(token);
195
200
  if (first.status !== 401 || !isOAuth || !credentialId || !replayable || source.signal.aborted) {
@@ -345,6 +350,7 @@ export function buildRegisteredTool(serverName, tool) {
345
350
  },
346
351
  source: "mcp",
347
352
  serverName,
353
+ mcpToolName: tool.name,
348
354
  permissionDefault: "ask",
349
355
  isConcurrencySafe: readOnly,
350
356
  isReadOnly: readOnly,
@@ -383,7 +389,7 @@ export class MCPManager {
383
389
  /**
384
390
  * Connect to all configured MCP servers and register their tools.
385
391
  */
386
- async connectAll(servers, owner) {
392
+ async connectAll(servers, owner, onServerEvent) {
387
393
  const enabledNames = this.enabledServerNames(servers);
388
394
  // Register this owner's desired set up front (see reconcile's shared-pool
389
395
  // note) so a later reconcile from ANOTHER session can't disconnect servers
@@ -410,12 +416,21 @@ export class MCPManager {
410
416
  const results = await Promise.allSettled(entries.map(([name, config]) => this.connect(name, config)));
411
417
  for (let i = 0; i < results.length; i++) {
412
418
  const result = results[i];
419
+ const server = entries[i][0];
413
420
  if (result.status === "rejected") {
414
421
  logger.warn("mcp.connect_failed", {
415
- server: entries[i][0],
422
+ server,
416
423
  error: result.reason.message,
417
424
  });
418
425
  }
426
+ try {
427
+ onServerEvent?.(result.status === "rejected"
428
+ ? { type: "mcp_server_failed", server, error: result.reason.message }
429
+ : { type: "mcp_server_connected", server });
430
+ }
431
+ catch {
432
+ /* observers must not affect connection handling */
433
+ }
419
434
  }
420
435
  }
421
436
  async reconcile(servers, owner) {
@@ -0,0 +1,9 @@
1
+ import type { MCPServerConfig, RegisteredTool } from "../types.js";
2
+ export interface McpToolPolicy {
3
+ /** Undefined means every tool is eligible before the denylist is applied. */
4
+ allowedTools?: ReadonlySet<string>;
5
+ disabledTools: ReadonlySet<string>;
6
+ }
7
+ export declare function buildMcpToolPolicies(servers: Record<string, MCPServerConfig>): ReadonlyMap<string, McpToolPolicy>;
8
+ export declare function isMcpToolNameAllowed(policies: ReadonlyMap<string, McpToolPolicy> | undefined, serverName: string, toolName: string): boolean;
9
+ export declare function isRegisteredMcpToolAllowed(tool: Pick<RegisteredTool, "source" | "serverName" | "mcpToolName">, policies: ReadonlyMap<string, McpToolPolicy> | undefined): boolean;