@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
@@ -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 {};
@@ -29,11 +29,12 @@
29
29
  * approval round-trip; it is not an authority to write anywhere on disk.
30
30
  * Callers must consult classifyPath before honoring acceptEdits.
31
31
  */
32
- import { constants, realpathSync, existsSync, readFileSync, writeFileSync, mkdirSync, renameSync, } from "node:fs";
32
+ import { constants, realpathSync, existsSync, readFileSync, writeFileSync, mkdirSync, renameSync, statSync, } from "node:fs";
33
33
  import { open } from "node:fs/promises";
34
34
  import { homedir } from "node:os";
35
35
  import { randomUUID } from "node:crypto";
36
- import { dirname, isAbsolute, join, resolve as resolvePath, sep } from "node:path";
36
+ import { dirname, isAbsolute, join, relative, resolve as resolvePath, sep } from "node:path";
37
+ import { readInstalledPlugins } from "../plugins/installedPlugins.js";
37
38
  const FINAL_WRITE_PATH_SNAPSHOT = Symbol("codeshell.finalWritePathSnapshot");
38
39
  /**
39
40
  * Default sensitive path patterns. These are evaluated AFTER home-expansion
@@ -392,6 +393,88 @@ function isInsideDir(child, parent) {
392
393
  const p = par.endsWith(sep) ? par : par + sep;
393
394
  return c === par || c.startsWith(p);
394
395
  }
396
+ function configuredUserHome() {
397
+ return process.env.HOME ?? homedir();
398
+ }
399
+ /**
400
+ * Whether `resolved` belongs to one concrete Skill tree rooted below
401
+ * `<skillsRoot>/<skill>/`.
402
+ *
403
+ * Both the root and manifest are realpathed, so a reference symlink cannot
404
+ * turn this read-only exception into access outside the managed Skill tree.
405
+ */
406
+ function isSkillTreeResource(resolved, skillsRoot) {
407
+ try {
408
+ const realSkillsRoot = realpathSync(skillsRoot);
409
+ if (!isInsideDir(resolved, realSkillsRoot))
410
+ return false;
411
+ const rel = relative(realSkillsRoot, resolved);
412
+ const skillName = rel.split(sep).filter(Boolean)[0];
413
+ if (!skillName || skillName === "..")
414
+ return false;
415
+ const skillRoot = realpathSync(join(realSkillsRoot, skillName));
416
+ if (!isInsideDir(skillRoot, realSkillsRoot))
417
+ return false;
418
+ const manifest = realpathSync(join(skillRoot, "SKILL.md"));
419
+ if (!isInsideDir(manifest, skillRoot) || !statSync(manifest).isFile())
420
+ return false;
421
+ return isInsideDir(resolved, skillRoot);
422
+ }
423
+ catch {
424
+ return false;
425
+ }
426
+ }
427
+ /**
428
+ * Skill instructions routinely link to sibling references/scripts/assets.
429
+ * The Skill builtin can already read the registered SKILL.md, so asking again
430
+ * for every referenced file is both inconsistent and capable of wedging a
431
+ * headless run.
432
+ *
433
+ * Keep the exception narrow:
434
+ * - read-only (the caller checks the operation);
435
+ * - user Skills, or an installed plugin recorded in the V2 registry;
436
+ * - plugin installs must realpath beneath the managed plugin cache;
437
+ * - the target must remain inside a directory containing a real SKILL.md.
438
+ */
439
+ function isRegisteredSkillResourceRead(resolved) {
440
+ let codeShellRoot;
441
+ try {
442
+ codeShellRoot = realpathSync(join(configuredUserHome(), ".code-shell"));
443
+ }
444
+ catch {
445
+ return false;
446
+ }
447
+ if (!isInsideDir(resolved, codeShellRoot))
448
+ return false;
449
+ if (isSkillTreeResource(resolved, join(codeShellRoot, "skills")))
450
+ return true;
451
+ let cacheRoot;
452
+ try {
453
+ cacheRoot = realpathSync(join(codeShellRoot, "plugins", "cache"));
454
+ }
455
+ catch {
456
+ return false;
457
+ }
458
+ const installed = readInstalledPlugins();
459
+ for (const entries of Object.values(installed.plugins)) {
460
+ for (const entry of entries) {
461
+ try {
462
+ const installRoot = realpathSync(entry.installPath);
463
+ if (installRoot === cacheRoot || !isInsideDir(installRoot, cacheRoot))
464
+ continue;
465
+ const skillsRoot = realpathSync(join(installRoot, "skills"));
466
+ if (!isInsideDir(skillsRoot, installRoot))
467
+ continue;
468
+ if (isSkillTreeResource(resolved, skillsRoot))
469
+ return true;
470
+ }
471
+ catch {
472
+ // A stale/tampered registry entry must never broaden read authority.
473
+ }
474
+ }
475
+ }
476
+ return false;
477
+ }
395
478
  /**
396
479
  * Returns the matching sensitive-dir entry (with the user's home prefix) if
397
480
  * `resolved` lives underneath any sensitive directory, else undefined.
@@ -476,6 +559,20 @@ export function classifyPath(rawPath, opts) {
476
559
  const sensitiveFile = matchSensitiveFile(resolved);
477
560
  const sensitiveLabel = sensitiveDir ?? sensitiveFile;
478
561
  const insideWorkspace = isInsideDir(resolved, workspace);
562
+ // Registered Skill resources are managed runtime inputs. Their SKILL.md is
563
+ // already readable through the Skill builtin; allow its contained reference
564
+ // files through the ordinary Read tool as well. A credential-shaped basename
565
+ // (.env, token.txt, key files, ...) deliberately keeps the sensitive-file
566
+ // gate even inside a Skill tree.
567
+ if (opts.operation === "read" &&
568
+ !sensitiveFile &&
569
+ isRegisteredSkillResourceRead(resolved)) {
570
+ return {
571
+ decision: "allow",
572
+ reason: "registered Skill resource read",
573
+ resolvedPath: resolved,
574
+ };
575
+ }
479
576
  // Sensitive: write is always denied, read always asks. Workspace placement
480
577
  // doesn't soften the rule — an `.env` in the project still asks on read.
481
578
  if (sensitiveLabel) {
@@ -6,6 +6,19 @@ import { logger as rootPermLogger } from "../logging/logger.js";
6
6
  export interface ApprovalBackend {
7
7
  requestApproval(request: ApprovalRequest): Promise<ApprovalResult>;
8
8
  }
9
+ /**
10
+ * Interactive-approval lifecycle observation (see
11
+ * PermissionClassifier.setApprovalEventListener). "requested" fires right
12
+ * before the backend prompt is awaited; "resolved" fires after the user (or
13
+ * backend policy) answered, with the outcome.
14
+ */
15
+ export interface ApprovalLifecycleEvent {
16
+ phase: "requested" | "resolved";
17
+ toolName: string;
18
+ riskLevel: "low" | "medium" | "high";
19
+ approved?: boolean;
20
+ sessionId?: string;
21
+ }
9
22
  export interface ApprovalRouteTarget {
10
23
  connectionId: string;
11
24
  sessionId: string;
@@ -185,8 +198,21 @@ export declare class PermissionClassifier {
185
198
  * tests and ad-hoc usages still write log lines.
186
199
  */
187
200
  private log;
201
+ private approvalStateListener?;
202
+ private approvalEventListener?;
203
+ private activeApprovalCount;
188
204
  constructor(rules: PermissionRule[], defaultMode?: PermissionMode, approvalBackend?: ApprovalBackend);
189
205
  setLogger(log: typeof rootPermLogger): void;
206
+ setApprovalStateListener(listener: ((waiting: boolean, toolName: string) => void) | undefined): void;
207
+ /**
208
+ * Observe interactive-approval lifecycle (requested → resolved). The engine
209
+ * wires this to the `notification` hook so plugins / settings hooks can
210
+ * react to "waiting for the user's decision" moments (system notification,
211
+ * IM ping, …). Listener errors are swallowed — observation must never
212
+ * affect the approval outcome.
213
+ */
214
+ setApprovalEventListener(listener: ((event: ApprovalLifecycleEvent) => void) | undefined): void;
215
+ private emitApprovalEvent;
190
216
  /** Replace mode + backend in place so live tool execution sees the change. */
191
217
  reconfigure(mode: PermissionMode, approvalBackend: ApprovalBackend, rules?: PermissionRule[]): void;
192
218
  getMode(): PermissionMode;
@@ -1237,6 +1237,9 @@ export class PermissionClassifier {
1237
1237
  * tests and ad-hoc usages still write log lines.
1238
1238
  */
1239
1239
  log = rootPermLogger;
1240
+ approvalStateListener;
1241
+ approvalEventListener;
1242
+ activeApprovalCount = 0;
1240
1243
  constructor(rules, defaultMode = "default", approvalBackend = new HeadlessApprovalBackend("deny-all")) {
1241
1244
  this.rules = rules;
1242
1245
  this.defaultMode = defaultMode;
@@ -1245,6 +1248,27 @@ export class PermissionClassifier {
1245
1248
  setLogger(log) {
1246
1249
  this.log = log;
1247
1250
  }
1251
+ setApprovalStateListener(listener) {
1252
+ this.approvalStateListener = listener;
1253
+ }
1254
+ /**
1255
+ * Observe interactive-approval lifecycle (requested → resolved). The engine
1256
+ * wires this to the `notification` hook so plugins / settings hooks can
1257
+ * react to "waiting for the user's decision" moments (system notification,
1258
+ * IM ping, …). Listener errors are swallowed — observation must never
1259
+ * affect the approval outcome.
1260
+ */
1261
+ setApprovalEventListener(listener) {
1262
+ this.approvalEventListener = listener;
1263
+ }
1264
+ emitApprovalEvent(event) {
1265
+ try {
1266
+ this.approvalEventListener?.(event);
1267
+ }
1268
+ catch {
1269
+ /* observers must not affect approval flow */
1270
+ }
1271
+ }
1248
1272
  /** Replace mode + backend in place so live tool execution sees the change. */
1249
1273
  reconfigure(mode, approvalBackend, rules) {
1250
1274
  this.defaultMode = mode;
@@ -1330,6 +1354,14 @@ export class PermissionClassifier {
1330
1354
  riskLevel,
1331
1355
  });
1332
1356
  let result;
1357
+ this.activeApprovalCount++;
1358
+ this.approvalStateListener?.(true, toolName);
1359
+ this.emitApprovalEvent({
1360
+ phase: "requested",
1361
+ toolName,
1362
+ riskLevel,
1363
+ ...(opts?.sessionId ? { sessionId: opts.sessionId } : {}),
1364
+ });
1333
1365
  try {
1334
1366
  const baseDescription = this.describeToolCall(toolName, args);
1335
1367
  const description = reason ? `${baseDescription}\n\nReason:\n${reason}` : baseDescription;
@@ -1345,12 +1377,24 @@ export class PermissionClassifier {
1345
1377
  span.fail(err, { tool: toolName });
1346
1378
  throw err;
1347
1379
  }
1380
+ finally {
1381
+ this.activeApprovalCount = Math.max(0, this.activeApprovalCount - 1);
1382
+ if (this.activeApprovalCount === 0)
1383
+ this.approvalStateListener?.(false, toolName);
1384
+ }
1348
1385
  if (result.approved) {
1349
1386
  this.denialTracker.recordSuccess(toolName);
1350
1387
  }
1351
1388
  else {
1352
1389
  this.denialTracker.record(toolName);
1353
1390
  }
1391
+ this.emitApprovalEvent({
1392
+ phase: "resolved",
1393
+ toolName,
1394
+ riskLevel,
1395
+ approved: result.approved,
1396
+ ...(opts?.sessionId ? { sessionId: opts.sessionId } : {}),
1397
+ });
1354
1398
  span.end({
1355
1399
  tool: toolName,
1356
1400
  approved: result.approved,
@@ -1385,6 +1429,8 @@ export class PermissionClassifier {
1385
1429
  return "medium";
1386
1430
  if (toolName === "Bash")
1387
1431
  return "medium";
1432
+ if (toolName === "Panel")
1433
+ return args.action === "invoke" ? "medium" : "low";
1388
1434
  // Only genuinely read-only built-ins are "low" (the sole tier
1389
1435
  // AutoApprovalBackend approves with no delegate). Everything else —
1390
1436
  // crucially every MCP tool, which can delete records, send messages, or
@@ -2,27 +2,38 @@
2
2
  * Unified tool registry — built-in tools + MCP tools.
3
3
  */
4
4
  import type { RegisteredTool, ToolDefinition, ToolResult } from "../types.js";
5
+ import { type BuiltinTool, type BuiltinToolGuard } from "./builtin/index.js";
5
6
  import type { ToolContext } from "./context.js";
6
7
  /**
7
8
  * Default execution timeout for any tool that does not declare its own
8
9
  * timeoutMs at registration time. Tools that need to run longer (Agent,
9
- * Arena, Bash, custom long-running tools) should set timeoutMs explicitly.
10
+ * Bash, or custom capability tools) should set timeoutMs explicitly.
10
11
  */
11
12
  export declare const DEFAULT_TOOL_TIMEOUT_MS = 120000;
12
13
  export interface ToolRegistryOptions {
13
14
  builtinTools?: readonly string[];
15
+ /** Core catalog plus any tools contributed by host capability packages. */
16
+ toolCatalog?: readonly BuiltinTool[];
14
17
  }
15
18
  type ToolImplementation = (args: Record<string, unknown>, ctx?: ToolContext) => Promise<unknown>;
16
19
  export declare class ToolRegistry {
17
20
  private tools;
18
21
  private builtinExecutors;
22
+ private availabilityGuards;
19
23
  constructor(options?: ToolRegistryOptions);
20
24
  private registerBuiltins;
21
25
  registerTool(tool: RegisteredTool, executor?: ToolImplementation): void;
26
+ /** Create an engine-local registry view without sharing mutable maps. */
27
+ fork(): ToolRegistry;
22
28
  unregisterTool(name: string): void;
23
29
  getToolDefinitions(): ToolDefinition[];
24
30
  getTool(name: string): RegisteredTool | undefined;
25
31
  hasTool(name: string): boolean;
32
+ /** Test/harness introspection: definitions without implementations are valid
33
+ * for some dynamic registrations, but every builtin catalog entry must have
34
+ * an executor. */
35
+ hasExecutor(name: string): boolean;
36
+ getAvailabilityGuard(name: string): BuiltinToolGuard | undefined;
26
37
  executeTool(name: string, args: Record<string, unknown>, options?: {
27
38
  timeoutMs?: number;
28
39
  signal?: AbortSignal;
@@ -2,22 +2,26 @@
2
2
  * Unified tool registry — built-in tools + MCP tools.
3
3
  */
4
4
  import { ConfigError, ToolNotFoundError, ToolExecutionError, ToolTimeoutError, } from "../exceptions.js";
5
- import { BUILTIN_TOOLS, toToolExecutionResult } from "./builtin/index.js";
5
+ import { BUILTIN_TOOLS, toToolExecutionResult, } from "./builtin/index.js";
6
6
  import { validateToolMetadata } from "./validate-tool-metadata.js";
7
7
  /**
8
8
  * Default execution timeout for any tool that does not declare its own
9
9
  * timeoutMs at registration time. Tools that need to run longer (Agent,
10
- * Arena, Bash, custom long-running tools) should set timeoutMs explicitly.
10
+ * Bash, or custom capability tools) should set timeoutMs explicitly.
11
11
  */
12
12
  export const DEFAULT_TOOL_TIMEOUT_MS = 120_000;
13
13
  export class ToolRegistry {
14
14
  tools = new Map();
15
15
  builtinExecutors = new Map();
16
+ availabilityGuards = new Map();
16
17
  constructor(options = {}) {
17
- this.registerBuiltins(options.builtinTools);
18
+ this.registerBuiltins(options.builtinTools, options.toolCatalog ?? BUILTIN_TOOLS);
18
19
  }
19
- registerBuiltins(selectedBuiltinTools) {
20
- const availableNames = new Set(BUILTIN_TOOLS.map((tool) => tool.definition.name));
20
+ registerBuiltins(selectedBuiltinTools, toolCatalog) {
21
+ const availableNames = new Set(toolCatalog.map((tool) => tool.definition.name));
22
+ if (availableNames.size !== toolCatalog.length) {
23
+ throw new ConfigError("Tool catalog contains duplicate names");
24
+ }
21
25
  const selectedNames = selectedBuiltinTools ? new Set(selectedBuiltinTools) : null;
22
26
  if (selectedNames) {
23
27
  const unknown = [...selectedNames].filter((name) => !availableNames.has(name));
@@ -27,7 +31,7 @@ export class ToolRegistry {
27
31
  });
28
32
  }
29
33
  }
30
- for (const tool of BUILTIN_TOOLS) {
34
+ for (const tool of toolCatalog) {
31
35
  if (selectedNames && !selectedNames.has(tool.definition.name)) {
32
36
  continue;
33
37
  }
@@ -36,6 +40,9 @@ export class ToolRegistry {
36
40
  validateToolMetadata(tool.definition);
37
41
  this.tools.set(tool.definition.name, tool.definition);
38
42
  this.builtinExecutors.set(tool.definition.name, tool.execute);
43
+ if (tool.exposure.availability) {
44
+ this.availabilityGuards.set(tool.definition.name, tool.exposure.availability);
45
+ }
39
46
  }
40
47
  }
41
48
  registerTool(tool, executor) {
@@ -45,9 +52,17 @@ export class ToolRegistry {
45
52
  this.builtinExecutors.set(tool.name, async (args, ctx) => toToolExecutionResult(await executor(args, ctx)));
46
53
  }
47
54
  }
55
+ /** Create an engine-local registry view without sharing mutable maps. */
56
+ fork() {
57
+ const fork = new ToolRegistry({ builtinTools: [] });
58
+ fork.tools = new Map(this.tools);
59
+ fork.builtinExecutors = new Map(this.builtinExecutors);
60
+ return fork;
61
+ }
48
62
  unregisterTool(name) {
49
63
  this.tools.delete(name);
50
64
  this.builtinExecutors.delete(name);
65
+ this.availabilityGuards.delete(name);
51
66
  }
52
67
  getToolDefinitions() {
53
68
  return [...this.tools.values()].map((t) => ({
@@ -63,6 +78,15 @@ export class ToolRegistry {
63
78
  hasTool(name) {
64
79
  return this.tools.has(name);
65
80
  }
81
+ /** Test/harness introspection: definitions without implementations are valid
82
+ * for some dynamic registrations, but every builtin catalog entry must have
83
+ * an executor. */
84
+ hasExecutor(name) {
85
+ return this.builtinExecutors.has(name);
86
+ }
87
+ getAvailabilityGuard(name) {
88
+ return this.availabilityGuards.get(name);
89
+ }
66
90
  async executeTool(name, args, options) {
67
91
  const tool = this.tools.get(name);
68
92
  if (!tool) {
@@ -74,7 +98,7 @@ export class ToolRegistry {
74
98
  }
75
99
  // Tool timeout precedence:
76
100
  // options.timeoutMs (per-call override) > tool.timeoutMs (declared at registration) > default 120s.
77
- // To run longer, declare timeoutMs on the tool (e.g. Agent/Arena: 30min, Bash: 1h).
101
+ // To run longer, declare timeoutMs on the tool (e.g. Agent: 30min, Bash: 1h).
78
102
  const timeout = options?.timeoutMs ?? tool.timeoutMs ?? DEFAULT_TOOL_TIMEOUT_MS;
79
103
  const parentSignal = options?.signal;
80
104
  const id = `tool_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
@@ -26,7 +26,8 @@ import { SandboxUnavailableError } from "../../exceptions.js";
26
26
  export function detectSandboxCapabilities() {
27
27
  return {
28
28
  seatbelt: process.platform === "darwin" && binaryExists("/usr/bin/sandbox-exec"),
29
- bwrap: process.platform === "linux" && (binaryExists("/usr/bin/bwrap") || binaryExists("/usr/local/bin/bwrap")),
29
+ bwrap: process.platform === "linux" &&
30
+ (binaryExists("/usr/bin/bwrap") || binaryExists("/usr/local/bin/bwrap")),
30
31
  };
31
32
  }
32
33
  function binaryExists(path) {
@@ -119,13 +120,7 @@ export function defaultSandboxConfig(mode = "auto") {
119
120
  return {
120
121
  mode,
121
122
  writableRoots: ["${workspace}", ...tmpRoots],
122
- deniedReads: [
123
- "~/.ssh",
124
- "~/.aws",
125
- "~/.config/gcloud",
126
- "~/.code-shell",
127
- "~/.claude",
128
- ],
123
+ deniedReads: ["~/.ssh", "~/.aws", "~/.config/gcloud", "~/.code-shell", "~/.claude"],
129
124
  network: "allow",
130
125
  };
131
126
  }
@@ -54,12 +54,8 @@ export function createSeatbeltBackend(config) {
54
54
  };
55
55
  }
56
56
  function buildProfile(config) {
57
- const writeAllows = config.writableRoots
58
- .map((p) => ` (subpath ${quote(p)})`)
59
- .join("\n");
60
- const readDenies = config.deniedReads
61
- .map((p) => ` (subpath ${quote(p)})`)
62
- .join("\n");
57
+ const writeAllows = config.writableRoots.map((p) => ` (subpath ${quote(p)})`).join("\n");
58
+ const readDenies = config.deniedReads.map((p) => ` (subpath ${quote(p)})`).join("\n");
63
59
  const networkClause = config.network === "deny" ? "(deny network-outbound)" : "(allow network*)";
64
60
  // SBPL evaluation note: when a broad `(allow file-read*)` and a specific
65
61
  // `(deny file-read* (subpath …))` both match, the more specific subpath
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Session-scoped tool host for external Agent Runtimes.
3
+ *
4
+ * An external runtime (Codex, Claude Code) drives its own agent loop and its own
5
+ * native tools. When it wants a CODESHELL tool it comes back in over MCP, and
6
+ * this is what it reaches: a narrow, per-business-session surface that exposes an
7
+ * explicitly allowlisted subset of the registry.
8
+ *
9
+ * The single rule that matters: **every call goes through
10
+ * `ToolExecutor.executeSingle()`**. `ToolRegistry` is not a security boundary —
11
+ * calling it directly would skip visibility, plan mode, argument validation, path
12
+ * policy, permission, sandbox, hooks, and result redaction. The MCP transport,
13
+ * the model's chosen tool name, and its arguments are all untrusted; the business
14
+ * session context is bound here by the host, out of band.
15
+ *
16
+ * Deliberately domain-agnostic: no Claude/Codex/Electron/coding literals. The
17
+ * runtime adapters live in the coding capability and talk to this through the
18
+ * `SessionToolHost` interface.
19
+ */
20
+ import type { PermissionMode, ToolDefinition, ToolResult } from "../types.js";
21
+ import type { ToolContext } from "./context.js";
22
+ import { ToolRegistry } from "./registry.js";
23
+ import { type ApprovalBackend } from "./permission.js";
24
+ import { HookRegistry } from "../hooks/registry.js";
25
+ import { type ToolVisibilityInputs } from "../engine/run-tooling.js";
26
+ /**
27
+ * Permission modes an external session may use.
28
+ *
29
+ * `bypassPermissions` and `dontAsk` are excluded at the type level because they
30
+ * short-circuit `PermissionClassifier` entirely (it returns allow / deny before
31
+ * consulting any rule). Under either one, "the call went through ToolExecutor"
32
+ * becomes true but meaningless. The external runtime's OWN permission mode is a
33
+ * separate thing and is unaffected by this — it governs that runtime's native
34
+ * tools, not CodeShell's.
35
+ */
36
+ export type ExternalSessionPermissionMode = Exclude<PermissionMode, "bypassPermissions" | "dontAsk">;
37
+ /**
38
+ * Which tools an external runtime may see and call.
39
+ *
40
+ * Allowlist only — no "everything in the registry", no prefix matching. A tool
41
+ * that is not named here does not exist as far as the runtime is concerned, and
42
+ * naming it anyway is an error rather than a silent no-op.
43
+ */
44
+ export interface ExternalToolExposurePolicy {
45
+ mode: "allowlist";
46
+ toolNames: ReadonlySet<string>;
47
+ /**
48
+ * Optional per-tool argument narrowing, for tools that multiplex several
49
+ * operations behind one name (e.g. a Panel tool with list/open/tools/invoke).
50
+ * Each value is a regex source matched against the whole argument value —
51
+ * patterns are anchored for you, see {@link matchesWholeValue}.
52
+ *
53
+ * This binds on `execute()`, not just `listTools()`: describing a limit only in
54
+ * the advertised schema would leave it advisory, and the arguments come from
55
+ * the model.
56
+ *
57
+ * **Scope, stated plainly:** this constrains only the keys it names. Keys the
58
+ * pattern does not mention pass through untouched, so it is a good fit for
59
+ * "which action may run" and a poor one for "what may that action do".
60
+ * Restricting a nested payload (e.g. the arguments a Panel tool forwards to a
61
+ * Panel App) is the tool's own schema validation, not this. Do not treat an
62
+ * `argsPatterns` entry as a sandbox for everything a tool might accept.
63
+ */
64
+ argsPatterns?: ReadonlyMap<string, Readonly<Record<string, string>>>;
65
+ }
66
+ export interface SessionToolHost {
67
+ readonly businessSessionId: string;
68
+ /**
69
+ * The assembled session ToolContext.
70
+ *
71
+ * Exposed read-only so a host can inspect what the executor will actually see
72
+ * — most usefully `toolVisibility` (absent means ToolExecutor SKIPS its
73
+ * availability guard) and `allowedToolNames`. Do not mutate it; narrow the
74
+ * exposure policy instead.
75
+ */
76
+ readonly toolContext: ToolContext;
77
+ listTools(): readonly ToolDefinition[];
78
+ execute(call: {
79
+ id: string;
80
+ name: string;
81
+ input: unknown;
82
+ }, signal?: AbortSignal): Promise<ToolResult>;
83
+ dispose(): Promise<void>;
84
+ }
85
+ export interface CreateSessionToolHostOptions {
86
+ businessSessionId: string;
87
+ cwd: string;
88
+ registry: ToolRegistry;
89
+ permissionMode: ExternalSessionPermissionMode;
90
+ /**
91
+ * The agent preset's permission rules (e.g.
92
+ * `BUILTIN_AGENT_PRESETS.general.defaultPermissionRules`).
93
+ *
94
+ * Only the PRESET layer is supplied here. The rest of the stack — the standing
95
+ * memory-scope carve-outs, mode-derived rules, and the user's own
96
+ * `settings.permissions.rules` — is composed internally by
97
+ * {@link composePermissionRules}, the same function the Native Engine uses.
98
+ *
99
+ * That composition is deliberately not left to the caller. An earlier revision
100
+ * took a finished rule array, which turned an equivalence guarantee into an
101
+ * unenforceable obligation: nothing checked that a caller reproduced
102
+ * `PermissionController.build()`, and the easy mistake — omitting
103
+ * `settings.permissions.rules` — meant a user's explicit "deny this tool" bound
104
+ * the Native Engine but not the external runtime.
105
+ */
106
+ presetRules: readonly import("../types.js").PermissionRule[];
107
+ /** Settings scope used to resolve the user's own permission rules. */
108
+ settingsScope?: import("../settings/manager.js").SettingsScope;
109
+ /**
110
+ * Whether the project at `cwd` has been trusted by the user.
111
+ *
112
+ * **Required, and there is no default** — `permissions` is the first entry in
113
+ * `DANGEROUS_PROJECT_FIELDS`, so an untrusted project's
114
+ * `settings.permissions.rules` are stripped precisely to stop a cloned repo
115
+ * self-authorizing. Every protocol-layer caller resolves this explicitly and
116
+ * defaults it to `false`; an optional field defaulting to "trusted" here would
117
+ * let a hostile repo grant an external runtime tools the user never trusted,
118
+ * without the approval backend ever being consulted.
119
+ *
120
+ * Optional-plus-unsafe-default is the exact shape of the bug this whole
121
+ * options object has now been bitten by twice. Hence: required.
122
+ */
123
+ projectTrusted: boolean;
124
+ planMode: boolean;
125
+ exposure: ExternalToolExposurePolicy;
126
+ /**
127
+ * Availability-guard inputs. Required, not optional: `ToolExecutor` SKIPS its
128
+ * visibility gate when `toolCtx.toolVisibility` is absent, so omitting this
129
+ * would not merely under-expose tools — it would make host-gated tools
130
+ * callable in a context their guard was written to exclude.
131
+ */
132
+ visibility: ToolVisibilityInputs;
133
+ approvalBackend?: ApprovalBackend;
134
+ hooks?: HookRegistry;
135
+ /** Extra ToolContext seams the host supplies (panels, browser, askUser, …). */
136
+ contextOverrides?: Partial<ToolContext>;
137
+ signal?: AbortSignal;
138
+ }
139
+ export declare function createSessionToolHost(options: CreateSessionToolHostOptions): SessionToolHost;