@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
@@ -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
+ });
@@ -48,6 +48,12 @@ export declare function buildStdioEnv(serverName: string, config: MCPServerConfi
48
48
  export declare function buildHttpHeaders(serverName: string, config: MCPServerConfig, resolveCredential?: (id: string) => HttpCredentialResolverResult, options?: BuildHttpHeadersOptions): Record<string, string>;
49
49
  export declare function bearerTokenFromMcpCredential(serverName: string, credentialId: string, credential: ResolvedMcpCredential, options?: BuildHttpHeadersOptions): string;
50
50
  export declare function buildHttpHeadersWithCredentialAccess(serverName: string, config: MCPServerConfig, access?: Pick<CredentialAccess, "resolveValue"> & Partial<Pick<CredentialAccess, "resolveMeta">>, options?: BuildHttpHeadersOptions): Promise<Record<string, string>>;
51
+ /**
52
+ * Fetch adapter for long-lived HTTP MCP transports. OAuth access tokens are
53
+ * resolved for every request, refreshed by the host inside the skew window,
54
+ * and force-refreshed once after a replayable 401.
55
+ */
56
+ export declare function createMcpAuthenticatedFetch(serverName: string, config: MCPServerConfig, access?: CredentialAccess, baseFetch?: typeof fetch): typeof fetch;
51
57
  /**
52
58
  * Infer the transport when the config doesn't name one: a url-only entry is
53
59
  * HTTP, everything else stdio. This is the CC `.mcp.json` convention —
@@ -73,6 +79,16 @@ export declare function spillMcpImage(serverName: string, toolName: string, base
73
79
  export declare function wrapMcpOutput(serverName: string, toolName: string, body: string): string;
74
80
  export declare function stripInternalToolArgs(args: Record<string, unknown>): Record<string, unknown>;
75
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
+ }
76
92
  export declare class MCPManager {
77
93
  private readonly toolRegistry;
78
94
  private static instance;
@@ -98,7 +114,7 @@ export declare class MCPManager {
98
114
  /**
99
115
  * Connect to all configured MCP servers and register their tools.
100
116
  */
101
- connectAll(servers: Record<string, MCPServerConfig>, owner?: unknown): Promise<void>;
117
+ connectAll(servers: Record<string, MCPServerConfig>, owner?: unknown, onServerEvent?: (event: McpServerLifecycleEvent) => void): Promise<void>;
102
118
  reconcile(servers: Record<string, MCPServerConfig>, owner?: unknown): Promise<void>;
103
119
  /**
104
120
  * Remove one owner from the shared desired-server pool and disconnect servers
@@ -11,6 +11,7 @@ import { getCredentialAccess } from "../credentials/access.js";
11
11
  import { buildOAuthRefreshRequest, oauthCredentialStatus, parseOAuthCredentialSecret, } from "../credentials/oauth.js";
12
12
  import { ENV_ALLOWLIST } from "../runtime/spawn-common.js";
13
13
  import { mkdir, readdir, unlink, writeFile } from "node:fs/promises";
14
+ import { randomUUID } from "node:crypto";
14
15
  import { join } from "node:path";
15
16
  import { diagnoseMcpStdioMissingCommand, previewPath } from "./mcp-stdio-diagnostics.js";
16
17
  import { codeShellHome } from "../session/session-manager.js";
@@ -153,6 +154,60 @@ export async function buildHttpHeadersWithCredentialAccess(serverName, config, a
153
154
  });
154
155
  return buildHttpHeaders(serverName, config, (id) => id === config.credentialRef ? { secret, type: meta?.type, label: meta?.label } : undefined, options);
155
156
  }
157
+ /**
158
+ * Fetch adapter for long-lived HTTP MCP transports. OAuth access tokens are
159
+ * resolved for every request, refreshed by the host inside the skew window,
160
+ * and force-refreshed once after a replayable 401.
161
+ */
162
+ export function createMcpAuthenticatedFetch(serverName, config, access = getCredentialAccess(), baseFetch = fetch) {
163
+ return (async (input, init) => {
164
+ const credentialId = config.credentialRef;
165
+ const meta = credentialId ? access.resolveMeta(undefined, credentialId, "full") : undefined;
166
+ const isOAuth = meta?.type === "oauth";
167
+ const headers = isOAuth
168
+ ? buildHttpHeaders(serverName, { ...config, credentialRef: undefined })
169
+ : await buildHttpHeadersWithCredentialAccess(serverName, config, access);
170
+ let token;
171
+ if (isOAuth) {
172
+ if (!access.resolveOAuthAccess) {
173
+ throw new Error(`MCP server "${serverName}": oauth credential "${credentialId}" requires host OAuth access`);
174
+ }
175
+ token = (await access.resolveOAuthAccess({ id: credentialId, scope: "full" })).accessToken;
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.
180
+ const source = new Request(input, init);
181
+ let replayable = true;
182
+ try {
183
+ source.clone();
184
+ }
185
+ catch {
186
+ replayable = false;
187
+ }
188
+ const send = async (accessToken) => {
189
+ const request = replayable ? source.clone() : source;
190
+ const requestHeaders = new Headers(Array.from(request.headers.entries()));
191
+ for (const [name, value] of Object.entries(headers))
192
+ requestHeaders.set(name, value);
193
+ if (accessToken)
194
+ requestHeaders.set("Authorization", `Bearer ${accessToken}`);
195
+ return baseFetch(new Request(request, {
196
+ headers: Array.from(requestHeaders.entries()),
197
+ }));
198
+ };
199
+ const first = await send(token);
200
+ if (first.status !== 401 || !isOAuth || !credentialId || !replayable || source.signal.aborted) {
201
+ return first;
202
+ }
203
+ const refreshed = await access.resolveOAuthAccess({
204
+ id: credentialId,
205
+ scope: "full",
206
+ forceRefresh: true,
207
+ });
208
+ return send(refreshed.accessToken);
209
+ });
210
+ }
156
211
  /**
157
212
  * Infer the transport when the config doesn't name one: a url-only entry is
158
213
  * HTTP, everything else stdio. This is the CC `.mcp.json` convention —
@@ -186,9 +241,7 @@ const MAX_MCP_IMAGE_SPILLS_PER_TOOL = 50;
186
241
  const MAX_MCP_IMAGE_BYTES = 8 * 1024 * 1024;
187
242
  function spillTimestamp(filename, prefix) {
188
243
  const suffix = filename.slice(prefix.length);
189
- const dot = suffix.lastIndexOf(".");
190
- const raw = dot === -1 ? suffix : suffix.slice(0, dot);
191
- const timestamp = Number(raw);
244
+ const timestamp = Number(/^\d+/.exec(suffix)?.[0]);
192
245
  return Number.isFinite(timestamp) ? timestamp : 0;
193
246
  }
194
247
  async function pruneMcpImageSpills(baseDir, prefix) {
@@ -232,7 +285,7 @@ export async function spillMcpImage(serverName, toolName, base64, mimeType, opts
232
285
  const safeServer = serverName.replace(/[^\w.-]+/g, "_");
233
286
  const safeTool = toolName.replace(/[^\w.-]+/g, "_");
234
287
  const prefix = `${safeServer}-${safeTool}-`;
235
- const filename = `${prefix}${now()}.${ext}`;
288
+ const filename = `${prefix}${now()}-${randomUUID().slice(0, 8)}.${ext}`;
236
289
  const filePath = join(baseDir, filename);
237
290
  try {
238
291
  await mkdir(baseDir, { recursive: true });
@@ -297,6 +350,7 @@ export function buildRegisteredTool(serverName, tool) {
297
350
  },
298
351
  source: "mcp",
299
352
  serverName,
353
+ mcpToolName: tool.name,
300
354
  permissionDefault: "ask",
301
355
  isConcurrencySafe: readOnly,
302
356
  isReadOnly: readOnly,
@@ -335,7 +389,7 @@ export class MCPManager {
335
389
  /**
336
390
  * Connect to all configured MCP servers and register their tools.
337
391
  */
338
- async connectAll(servers, owner) {
392
+ async connectAll(servers, owner, onServerEvent) {
339
393
  const enabledNames = this.enabledServerNames(servers);
340
394
  // Register this owner's desired set up front (see reconcile's shared-pool
341
395
  // note) so a later reconcile from ANOTHER session can't disconnect servers
@@ -362,12 +416,21 @@ export class MCPManager {
362
416
  const results = await Promise.allSettled(entries.map(([name, config]) => this.connect(name, config)));
363
417
  for (let i = 0; i < results.length; i++) {
364
418
  const result = results[i];
419
+ const server = entries[i][0];
365
420
  if (result.status === "rejected") {
366
421
  logger.warn("mcp.connect_failed", {
367
- server: entries[i][0],
422
+ server,
368
423
  error: result.reason.message,
369
424
  });
370
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
+ }
371
434
  }
372
435
  }
373
436
  async reconcile(servers, owner) {
@@ -472,9 +535,11 @@ export class MCPManager {
472
535
  // credentialRef resolves against user-scope credential access. The shared
473
536
  // MCPManager pool has no per-session cwd, and MCP-referenced credentials
474
537
  // (e.g. a Figma token) remain user-global by design.
475
- const headers = await buildHttpHeadersWithCredentialAccess(name, config);
538
+ const access = getCredentialAccess();
539
+ const headers = buildHttpHeaders(name, { ...config, credentialRef: undefined });
476
540
  transport = new StreamableHTTPClientTransport(new URL(config.url), {
477
541
  requestInit: Object.keys(headers).length ? { headers } : undefined,
542
+ fetch: createMcpAuthenticatedFetch(name, config, access),
478
543
  });
479
544
  }
480
545
  else {
@@ -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;
@@ -0,0 +1,34 @@
1
+ export function buildMcpToolPolicies(servers) {
2
+ const policies = new Map();
3
+ for (const [serverName, config] of Object.entries(servers)) {
4
+ if (config.enabled === false)
5
+ continue;
6
+ if (config.allowedTools === undefined && config.disabledTools === undefined)
7
+ continue;
8
+ policies.set(serverName, {
9
+ allowedTools: config.allowedTools === undefined ? undefined : new Set(config.allowedTools),
10
+ disabledTools: new Set(config.disabledTools ?? []),
11
+ });
12
+ }
13
+ return policies;
14
+ }
15
+ export function isMcpToolNameAllowed(policies, serverName, toolName) {
16
+ const policy = policies?.get(serverName);
17
+ if (!policy)
18
+ return true;
19
+ if (policy.allowedTools && !policy.allowedTools.has(toolName))
20
+ return false;
21
+ return !policy.disabledTools.has(toolName);
22
+ }
23
+ export function isRegisteredMcpToolAllowed(tool, policies) {
24
+ if (tool.source !== "mcp")
25
+ return true;
26
+ const policy = policies?.get(tool.serverName ?? "");
27
+ if (!policy)
28
+ return true;
29
+ // Restricted servers fail closed for registry entries created by an older
30
+ // or third-party adapter that did not preserve the original MCP tool name.
31
+ if (!tool.mcpToolName)
32
+ return false;
33
+ return isMcpToolNameAllowed(policies, tool.serverName ?? "", tool.mcpToolName);
34
+ }
@@ -0,0 +1,53 @@
1
+ /** One panel the active host can present to the user. */
2
+ export interface AgentPanelDescriptor {
3
+ id: string;
4
+ title: string;
5
+ source: "builtin" | "builtin-panel-app" | "panel-app";
6
+ }
7
+ export interface PanelOpenResult {
8
+ ok: boolean;
9
+ panelId: string;
10
+ detail?: string;
11
+ }
12
+ export interface AgentPanelToolDescriptor {
13
+ name: string;
14
+ description: string;
15
+ inputSchema: Record<string, unknown>;
16
+ readOnly: boolean;
17
+ }
18
+ export interface PanelInvokeResult {
19
+ ok: boolean;
20
+ panelId: string;
21
+ toolName: string;
22
+ result?: unknown;
23
+ detail?: string;
24
+ }
25
+ /**
26
+ * A discovery result that can distinguish "the host has none" from "the request
27
+ * never completed".
28
+ *
29
+ * `list` / `tools` used to return a bare array, so every failure — a user Stop, a
30
+ * closed session, a timeout — collapsed to `[]`, which the Panel tool then
31
+ * reported as the factual claim "(no panels available)". That is worse than a
32
+ * refusal: it tells the model panel hosting is unavailable, so it stops trying.
33
+ * `failed` carries the reason instead, and an absent `failed` means the empty
34
+ * list is real.
35
+ */
36
+ export interface PanelDiscoveryResult<T> {
37
+ items: T[];
38
+ /** Present only when the request did not complete; `items` is then empty. */
39
+ failed?: string;
40
+ }
41
+ /**
42
+ * UI-agnostic bridge used by agent tools to discover and focus host panels.
43
+ *
44
+ * Core never imports a renderer. Desktop implements this through its protocol
45
+ * host; headless/TUI engines leave it undefined. Plugin-contributed tools may
46
+ * use the same bridge to open their own panel by stable registry id.
47
+ */
48
+ export interface PanelHostBridge {
49
+ list(): Promise<PanelDiscoveryResult<AgentPanelDescriptor>>;
50
+ open(panelId: string): Promise<PanelOpenResult>;
51
+ tools?(panelId: string): Promise<PanelDiscoveryResult<AgentPanelToolDescriptor>>;
52
+ invoke?(panelId: string, toolName: string, args: Record<string, unknown>): Promise<PanelInvokeResult>;
53
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -49,11 +49,30 @@ export interface ClassifyOptions {
49
49
  /** "read" or "write" — different defaults for sensitive paths. */
50
50
  operation: PathOperation;
51
51
  }
52
+ export interface FinalWritePathSnapshot {
53
+ resolvedPath: string;
54
+ workspacePath: string;
55
+ insideWorkspace: boolean;
56
+ }
52
57
  export type PathApprovalScope = "once" | "session" | "project";
53
58
  /** Test seam: clear the in-memory session grants. */
54
59
  export declare function _resetSessionPathGrants(): void;
55
60
  export declare function openSessionPathApprovals(sessionId: string): void;
56
61
  export declare function clearSessionPathApprovals(sessionId: string): void;
62
+ /**
63
+ * Capture the concrete target approved by the executor's first path-policy
64
+ * pass. The snapshot is carried on the internal args object via a symbol, so
65
+ * it cannot collide with an LLM-supplied schema property or leak into logs.
66
+ */
67
+ export declare function attachFinalWritePathSnapshot(args: Record<string, unknown>, filePath: string, workspaceRoot: string): Record<string, unknown>;
68
+ export declare function getFinalWritePathSnapshot(args: Record<string, unknown>, filePath: string, workspaceRoot: string): FinalWritePathSnapshot;
69
+ export declare function revalidateFinalWritePath(filePath: string, workspaceRoot: string, approved: FinalWritePathSnapshot): {
70
+ resolvedPath: string;
71
+ } | {
72
+ error: string;
73
+ };
74
+ /** Open the already-revalidated final path without following its last segment. */
75
+ export declare function writeFileNoFollow(filePath: string, content: string): Promise<void>;
57
76
  /**
58
77
  * Classify a file path against the workspace + sensitive-path policy.
59
78
  *