@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,137 @@
1
+ /**
2
+ * 数据源只读读取面(ADR §5)。ListSources 只出 metadata(自动允许);
3
+ * ReadSource 读内容(permissionDefault: ask,在 index.ts 注册处声明),
4
+ * 执行时对 source/scope/resource 二次校验(防审批后换参),结果带
5
+ * provenance + maxBytes 截断 + secret redaction + untrusted input 包裹。
6
+ */
7
+ import { SettingsManager } from "../../settings/manager.js";
8
+ import { connectorAdapterFor, registerConnectorAdapter } from "../../sources/adapter.js";
9
+ import { LOCAL_FILES_SOURCE_ID, listLocalFiles, localFilesAdapter, } from "../../sources/adapters/local-files.js";
10
+ import { defaultMcpResourceAdapter } from "../../sources/adapters/mcp-resource.js";
11
+ import { mockAdapter } from "../../sources/adapters/mock.js";
12
+ import { defaultCredentialStatus } from "../../sources/credential-status.js";
13
+ import { resolveEffectiveSourceAccess } from "../../sources/resolve.js";
14
+ import { truncateUtf8Text } from "../../sources/truncate-utf8.js";
15
+ import { scrubSecrets } from "../../utils/secret-scrubber.js";
16
+ import { wrapUntrustedInput } from "../../automation/write-policy.js";
17
+ const DEFAULT_MAX_BYTES = 262_144;
18
+ const mcpResourceAdapter = defaultMcpResourceAdapter();
19
+ /** Registering the same adapter objects is safe to repeat across test/host imports. */
20
+ export function registerBuiltinSourceAdapters() {
21
+ registerConnectorAdapter(mockAdapter);
22
+ registerConnectorAdapter(localFilesAdapter);
23
+ registerConnectorAdapter(mcpResourceAdapter);
24
+ }
25
+ registerBuiltinSourceAdapters();
26
+ function accessFor(cwd) {
27
+ const settings = new SettingsManager(cwd, "full");
28
+ return resolveEffectiveSourceAccess({
29
+ cwd,
30
+ settings,
31
+ credentialStatus: defaultCredentialStatus,
32
+ });
33
+ }
34
+ async function resourcesFor(access, scope, cwd) {
35
+ if (access.sourceId === LOCAL_FILES_SOURCE_ID)
36
+ return listLocalFiles(cwd);
37
+ if (!access.definition)
38
+ return [];
39
+ return (await connectorAdapterFor(access.kind)?.listResources(access.definition, scope)) ?? [];
40
+ }
41
+ export const listSourcesToolDef = {
42
+ name: "ListSources",
43
+ description: "List the data sources bound to this workspace: names, scopes, availability status and resource names/sizes. Metadata only — use ReadSource to read content (requires approval).",
44
+ inputSchema: { type: "object", properties: {} },
45
+ };
46
+ export async function listSourcesTool(_args, ctx) {
47
+ const cwd = ctx?.cwd ?? process.cwd();
48
+ const access = accessFor(cwd);
49
+ if (access.length === 0)
50
+ return "No data sources are bound to this workspace.";
51
+ const lines = [];
52
+ for (const item of access) {
53
+ lines.push(`## ${item.label} (id: ${item.sourceId}, kind: ${item.kind}, status: ${item.status}, readPolicy: ${item.readPolicy})`);
54
+ if (item.status !== "ok")
55
+ continue;
56
+ for (const scope of item.scopes) {
57
+ let resources = [];
58
+ try {
59
+ resources = await resourcesFor(item, scope, cwd);
60
+ }
61
+ catch {
62
+ // Listing is metadata-only and best effort. A temporarily failing scope
63
+ // must not expose content or make the other bound sources disappear.
64
+ }
65
+ lines.push(`### scope: ${scope}`);
66
+ for (const resource of resources.filter((candidate) => candidate.scopeId === scope)) {
67
+ lines.push(`- ${resource.name} (resource: ${resource.id}${resource.sizeBytes === undefined ? "" : `, ${resource.sizeBytes}B`})`);
68
+ }
69
+ }
70
+ }
71
+ return lines.join("\n");
72
+ }
73
+ export const readSourceToolDef = {
74
+ name: "ReadSource",
75
+ description: "Read the content of one resource from a bound data source. Requires approval. Args must exactly match a bound source/scope and a listed resource id.",
76
+ inputSchema: {
77
+ type: "object",
78
+ properties: {
79
+ source: { type: "string", description: "Bound source id (from ListSources)" },
80
+ scope: { type: "string", description: "Bound scope id" },
81
+ resource: { type: "string", description: "Resource id within that scope" },
82
+ },
83
+ required: ["source", "scope", "resource"],
84
+ },
85
+ };
86
+ export async function readSourceTool(args, ctx) {
87
+ const cwd = ctx?.cwd ?? process.cwd();
88
+ const source = String(args.source ?? "");
89
+ const scope = String(args.scope ?? "");
90
+ const resource = String(args.resource ?? "");
91
+ const signal = args.__signal;
92
+ // Second authorization gate after approval: the source must still be bound
93
+ // and healthy, and the requested scope must still be explicitly selected.
94
+ const access = accessFor(cwd).find((item) => item.sourceId === source);
95
+ if (!access)
96
+ return `Error: source "${source}" is not bound to this workspace.`;
97
+ if (access.status !== "ok")
98
+ return `Error: source "${source}" is ${access.status}.`;
99
+ if (access.readPolicy === "deny") {
100
+ return `Error: source "${source}" is metadata-only in this workspace (readPolicy: deny).`;
101
+ }
102
+ if (!access.scopes.includes(scope)) {
103
+ return `Error: scope "${scope}" is not bound for source "${source}".`;
104
+ }
105
+ if (!access.definition)
106
+ return `Error: source "${source}" is dangling.`;
107
+ const adapter = connectorAdapterFor(access.kind);
108
+ if (!adapter)
109
+ return `Error: no adapter for kind "${access.kind}".`;
110
+ try {
111
+ // Validate resource ownership from the selected scope's metadata before
112
+ // any content read. This prevents a valid id from another scope being used
113
+ // after approval with otherwise unchanged source/scope arguments.
114
+ const resources = await resourcesFor(access, scope, cwd);
115
+ const listed = resources.some((candidate) => candidate.id === resource && candidate.scopeId === scope);
116
+ if (!listed) {
117
+ return `Error: resource "${resource}" is not listed in scope "${scope}" for source "${source}".`;
118
+ }
119
+ const content = await adapter.read(access.definition, resource, {
120
+ maxBytes: DEFAULT_MAX_BYTES,
121
+ signal,
122
+ cwd,
123
+ });
124
+ if (content.resourceId !== resource) {
125
+ return `Error: source "${source}" returned a different resource id.`;
126
+ }
127
+ // Adapters enforce maxBytes too; keep this boundary-level cap so a future
128
+ // or injected adapter cannot bypass the 256 KiB context limit.
129
+ const capped = truncateUtf8Text(content.text, DEFAULT_MAX_BYTES);
130
+ const truncated = content.truncated || capped.truncated;
131
+ const provenance = `source=${source} scope=${scope} resource=${resource}${truncated ? " (truncated)" : ""}`;
132
+ return wrapUntrustedInput(scrubSecrets(capped.text), provenance);
133
+ }
134
+ catch (error) {
135
+ return `Error: read failed: ${error instanceof Error ? error.message : String(error)}`;
136
+ }
137
+ }
@@ -5,6 +5,7 @@
5
5
  * The model uses ToolSearch to discover full schemas on demand,
6
6
  * saving context by not loading all MCP tool schemas upfront.
7
7
  */
8
+ import { isRegisteredMcpToolAllowed } from "../mcp-tool-policy.js";
8
9
  export const toolSearchToolDef = {
9
10
  name: "ToolSearch",
10
11
  description: "Search for and discover available tools by name or keyword. " +
@@ -48,11 +49,15 @@ export async function toolSearchTool(args, ctx) {
48
49
  if (tool.source !== "mcp")
49
50
  return true;
50
51
  const allowed = ctx.allowedMcpServers;
51
- return !allowed || allowed.has(tool.serverName ?? "");
52
+ return ((!allowed || allowed.has(tool.serverName ?? "")) &&
53
+ isRegisteredMcpToolAllowed(tool, ctx.mcpToolPolicies));
52
54
  };
53
55
  // "select:Name1,Name2" → exact match
54
56
  if (query.startsWith("select:")) {
55
- const names = query.slice(7).split(",").map((n) => n.trim());
57
+ const names = query
58
+ .slice(7)
59
+ .split(",")
60
+ .map((n) => n.trim());
56
61
  return matchExact(ctx.toolRegistry, names, visible);
57
62
  }
58
63
  // Keyword search
@@ -47,6 +47,8 @@ export function makeUpdateAutomationMemoryTool(sink) {
47
47
  isReadOnly: false,
48
48
  isConcurrencySafe: false,
49
49
  },
50
+ // Host-injected automation contribution, never part of a default preset.
51
+ exposure: { presetTags: [] },
50
52
  execute: async (args) => {
51
53
  const raw = typeof args.summary === "string" ? args.summary : "";
52
54
  const summary = raw.trim();
@@ -28,8 +28,13 @@ const DEFAULT_MAX = 50_000;
28
28
  const RAW_BYTE_BUDGET_MULTIPLIER = 4;
29
29
  // Header names that must not be overridable via args.headers (SSRF / auth injection)
30
30
  const BLOCKED_REQUEST_HEADERS = new Set([
31
- "host", "authorization", "cookie", "proxy-authorization",
32
- "x-forwarded-for", "x-real-ip", "x-forwarded-host",
31
+ "host",
32
+ "authorization",
33
+ "cookie",
34
+ "proxy-authorization",
35
+ "x-forwarded-for",
36
+ "x-real-ip",
37
+ "x-forwarded-host",
33
38
  ]);
34
39
  // Hostname patterns that block SSRF to internal/metadata services
35
40
  const BLOCKED_HOST_PATTERNS = [
@@ -41,15 +46,14 @@ const BLOCKED_HOST_PATTERNS = [
41
46
  /^192\.168\./,
42
47
  /^172\.(1[6-9]|2[0-9]|3[01])\./, // 172.16.0.0/12
43
48
  /^::1$/,
44
- /^fc00:/i, /^fd00:/i, // IPv6 ULA
49
+ /^fc00:/i,
50
+ /^fd00:/i, // IPv6 ULA
45
51
  /^fe80:/i, // IPv6 link-local
46
52
  ];
47
53
  function isBlockedHost(hostname) {
48
54
  // `new URL("http://[::1]/").hostname` returns "[::1]" (with brackets);
49
55
  // strip them so IPv6 patterns match.
50
- const stripped = hostname.startsWith("[") && hostname.endsWith("]")
51
- ? hostname.slice(1, -1)
52
- : hostname;
56
+ const stripped = hostname.startsWith("[") && hostname.endsWith("]") ? hostname.slice(1, -1) : hostname;
53
57
  return BLOCKED_HOST_PATTERNS.some((re) => re.test(stripped));
54
58
  }
55
59
  // A3 hardening: per-IP block list. Used after DNS resolution to catch
@@ -119,11 +123,7 @@ const MAX_REDIRECTS = 5;
119
123
  // Headers that must be stripped when a redirect crosses origins.
120
124
  // Same policy fetch(... redirect: "follow") applies internally; we
121
125
  // re-implement it here because we drive redirects manually.
122
- const CROSS_ORIGIN_STRIP_HEADERS = new Set([
123
- "authorization",
124
- "cookie",
125
- "proxy-authorization",
126
- ]);
126
+ const CROSS_ORIGIN_STRIP_HEADERS = new Set(["authorization", "cookie", "proxy-authorization"]);
127
127
  async function defaultDnsLookup(hostname) {
128
128
  // For literal IPs, lookup returns the IP itself (Node behavior),
129
129
  // which still flows through the block-list check above.
@@ -147,7 +147,10 @@ async function validateHopHost(u) {
147
147
  ips = await dnsLookupImpl(u.hostname);
148
148
  }
149
149
  catch (err) {
150
- return { ok: false, reason: `DNS lookup failed for "${u.hostname}": ${err.message}` };
150
+ return {
151
+ ok: false,
152
+ reason: `DNS lookup failed for "${u.hostname}": ${err.message}`,
153
+ };
151
154
  }
152
155
  if (ips.length === 0) {
153
156
  return { ok: false, reason: `DNS returned no addresses for "${u.hostname}"` };
@@ -302,7 +305,8 @@ async function readAndTruncateBody(res, maxLength) {
302
305
  }
303
306
  if (rawTruncated || text.length > maxLength) {
304
307
  const shownChars = Math.min(text.length, maxLength);
305
- text = text.slice(0, maxLength) + `\n\n... content truncated (showing first ${shownChars} chars)`;
308
+ text =
309
+ text.slice(0, maxLength) + `\n\n... content truncated (showing first ${shownChars} chars)`;
306
310
  }
307
311
  return text || "(page returned empty content)";
308
312
  }
@@ -153,9 +153,7 @@ export async function webSearchTool(args, ctx) {
153
153
  }
154
154
  if (results.length === 0)
155
155
  return "No results found.";
156
- return results
157
- .map((r, i) => `${i + 1}. ${r.title}\n ${r.url}\n ${r.snippet}`)
158
- .join("\n\n");
156
+ return results.map((r, i) => `${i + 1}. ${r.title}\n ${r.url}\n ${r.snippet}`).join("\n\n");
159
157
  }
160
158
  catch (err) {
161
159
  return `Search error: ${err.message}`;
@@ -0,0 +1,93 @@
1
+ import type { RegisteredTool, StreamEvent } from "../types.js";
2
+ import type { ToolContext } from "./context.js";
3
+ import type { ToolRegistry } from "./registry.js";
4
+ import type { BuiltinTool } from "./builtin/index.js";
5
+ import type { RunBehaviorProfile } from "../engine/run-types.js";
6
+ import type { PendingApprovalMetadata } from "../protocol/types.js";
7
+ export interface ExtensionTool {
8
+ definition: RegisteredTool;
9
+ execute: (args: Record<string, unknown>, ctx?: ToolContext) => Promise<unknown>;
10
+ }
11
+ export type ExtensionQueryHandler = (params: Readonly<Record<string, unknown>>) => unknown | Promise<unknown>;
12
+ /** Read-only live-session state exposed to protocol observers. */
13
+ export interface ProtocolLiveSession {
14
+ sessionId: string;
15
+ busy: boolean;
16
+ queueDepth: number;
17
+ lastActivityAt: number;
18
+ kind: string;
19
+ }
20
+ /**
21
+ * Domain-agnostic protocol lifecycle observer. An extension module can attach
22
+ * one per AgentServer to project protocol activity (runs, stream events,
23
+ * approvals, session/server teardown) into its own state — without the server
24
+ * carrying any domain-specific logic. Observer callbacks must be cheap and
25
+ * must never throw (the server isolates exceptions per observer regardless).
26
+ */
27
+ export interface ProtocolObserver {
28
+ /** A session was created/attached by agent/run (before the turn is queued). */
29
+ onSessionAttached?: (sessionId: string, lastActivityAt: number) => void;
30
+ /** Every StreamEvent forwarded to the client for a session's run. */
31
+ onSessionStream?: (sessionId: string, event: StreamEvent) => void;
32
+ /** Run lifecycle boundary: turn accepted (start), finished (end) or threw (error). */
33
+ onRunBoundary?: (sessionId: string, phase: "start" | "end" | "error") => void;
34
+ /**
35
+ * A pending approval was registered. May return replacement metadata (e.g.
36
+ * to override `surfaceable`); returning nothing keeps the input metadata.
37
+ */
38
+ onApprovalCreated?: (metadata: PendingApprovalMetadata) => PendingApprovalMetadata | void;
39
+ /** A pending approval left the pending state (resolved/expired/cancelled/owner-lost). */
40
+ onApprovalTransition?: (metadata: PendingApprovalMetadata, status: string) => void;
41
+ /** A session was explicitly closed (agent/closeSession). */
42
+ onSessionClosed?: (sessionId: string) => void;
43
+ /** The server is shutting down. */
44
+ onServerClose?: () => void;
45
+ /** Resolver-free pending-decision projections for host/debug snapshots. */
46
+ snapshotPendingDecisions?: () => readonly unknown[];
47
+ }
48
+ /** Capabilities the AgentServer lends to a protocol observer. */
49
+ export interface ProtocolObserverHost {
50
+ /** Snapshot of live chat sessions (empty in legacy single-engine mode). */
51
+ getLiveSessionSnapshot: () => readonly ProtocolLiveSession[];
52
+ /** Host lifecycle generation attached to projection snapshots/deltas. */
53
+ projectionGeneration: () => number;
54
+ /** Persisted session kind, when the session is live and its engine knows it. */
55
+ getSessionKind: (sessionId: string) => string | undefined;
56
+ /** True once the server's transport owner disconnected. */
57
+ isTransportDisconnected: () => boolean;
58
+ /** Server → client notification. */
59
+ notify: (method: string, params: Record<string, unknown>) => void;
60
+ /** Register a protocol-method/query alias handled by this extension. */
61
+ registerQuery: (type: string, handler: ExtensionQueryHandler) => void;
62
+ }
63
+ /**
64
+ * Trusted, in-process product extension. Core owns the registration seam while
65
+ * optional packages own their tools and diagnostic/query surface.
66
+ */
67
+ export interface ExtensionModule {
68
+ readonly id: string;
69
+ readonly tools?: readonly ExtensionTool[];
70
+ readonly queries?: Readonly<Record<string, ExtensionQueryHandler>>;
71
+ /** Named per-run behavior profiles contributed by this extension. */
72
+ readonly behaviorProfiles?: readonly RunBehaviorProfile[];
73
+ /** Attach a protocol lifecycle observer to an AgentServer. */
74
+ readonly createProtocolObserver?: (host: ProtocolObserverHost) => ProtocolObserver;
75
+ /** Extra agent/run params validation. Returns an error message or null. */
76
+ readonly validateRunParams?: (params: Record<string, unknown>) => string | null;
77
+ /** Session kinds this extension owns that must stay out of generic session lists. */
78
+ readonly hiddenSessionKinds?: readonly string[];
79
+ /**
80
+ * Full-metadata tool contributions (exposure tags, availability guards,
81
+ * per-turn definition rewrites, default permission rules). These join the
82
+ * engine's composed tool catalog exactly like builtin/capability tools do —
83
+ * use this instead of `tools` when the tool needs visibility metadata.
84
+ */
85
+ readonly catalogTools?: readonly BuiltinTool[];
86
+ }
87
+ export declare function registerExtensionModules(registry: ToolRegistry, modules: readonly ExtensionModule[]): void;
88
+ export declare function queryExtensionModules(modules: readonly ExtensionModule[], type: string, params: Readonly<Record<string, unknown>>): Promise<{
89
+ handled: false;
90
+ } | {
91
+ handled: true;
92
+ data: unknown;
93
+ }>;
@@ -0,0 +1,53 @@
1
+ import { ConfigError } from "../exceptions.js";
2
+ function validateExtensionModules(modules) {
3
+ const ids = new Set();
4
+ const queries = new Set();
5
+ const tools = new Set();
6
+ for (const module of modules) {
7
+ if (ids.has(module.id)) {
8
+ throw new ConfigError(`Duplicate capability module id: ${module.id}`, {
9
+ duplicateCapabilityId: module.id,
10
+ });
11
+ }
12
+ ids.add(module.id);
13
+ for (const tool of module.tools ?? []) {
14
+ if (tools.has(tool.definition.name)) {
15
+ throw new ConfigError(`Duplicate capability tool: ${tool.definition.name}`, {
16
+ duplicateCapabilityTool: tool.definition.name,
17
+ });
18
+ }
19
+ tools.add(tool.definition.name);
20
+ }
21
+ for (const query of Object.keys(module.queries ?? {})) {
22
+ if (queries.has(query)) {
23
+ throw new ConfigError(`Duplicate capability query: ${query}`, {
24
+ duplicateCapabilityQuery: query,
25
+ });
26
+ }
27
+ queries.add(query);
28
+ }
29
+ }
30
+ }
31
+ export function registerExtensionModules(registry, modules) {
32
+ validateExtensionModules(modules);
33
+ for (const module of modules) {
34
+ for (const tool of module.tools ?? []) {
35
+ if (registry.hasTool(tool.definition.name)) {
36
+ throw new ConfigError(`Capability tool conflicts with registered tool: ${tool.definition.name}`, {
37
+ duplicateCapabilityTool: tool.definition.name,
38
+ capabilityId: module.id,
39
+ });
40
+ }
41
+ registry.registerTool(tool.definition, tool.execute);
42
+ }
43
+ }
44
+ }
45
+ export async function queryExtensionModules(modules, type, params) {
46
+ validateExtensionModules(modules);
47
+ for (const module of modules) {
48
+ const handler = module.queries?.[type];
49
+ if (handler)
50
+ return { handled: true, data: await handler(params) };
51
+ }
52
+ return { handled: false };
53
+ }
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * ToolContext — runtime services injected into every tool execution.
3
3
  *
4
- * Replaces the legacy module-level singletons (`setAskUserFn`,
5
- * `setArenaLLMConfig`, `setSubAgentConfig`, `setToolSearchRegistry`).
4
+ * Replaces the legacy module-level singleton setters used by built-ins and
5
+ * product capabilities.
6
6
  *
7
7
  * Each Engine instance builds its own ToolContext when run() starts and
8
8
  * passes it through ToolExecutor → ToolRegistry → executor function.
@@ -16,11 +16,13 @@ import type { LLMConfig, StreamCallback, TokenUsage } from "../types.js";
16
16
  import type { ModelPool } from "../llm/model-pool.js";
17
17
  import type { ToolRegistry } from "./registry.js";
18
18
  import type { AgentPresetName } from "../preset/index.js";
19
- import type { SandboxBackend } from "./sandbox/index.js";
19
+ import type { SandboxBackend, SandboxMode } from "./sandbox/index.js";
20
20
  import type { HookRegistry } from "../hooks/registry.js";
21
21
  import type { SessionManager } from "../session/session-manager.js";
22
22
  import type { SessionWorkspace } from "../types.js";
23
23
  import type { ApprovalRouter } from "./permission.js";
24
+ import type { ChildWriterLease, LiveChildControl } from "./builtin/agent-registry.js";
25
+ import type { McpToolPolicy } from "./mcp-tool-policy.js";
24
26
  /**
25
27
  * Narrow view of the owning Engine that tools are allowed to call back into.
26
28
  * Defined here (in the low-level tool-system) rather than importing the
@@ -34,19 +36,6 @@ export interface ToolRuntimeHost {
34
36
  readonly planMode: boolean;
35
37
  /** Toggle plan mode (EnterPlanMode / ExitPlanMode tools). */
36
38
  setPlanMode(value: boolean): void;
37
- /** Per-worktree setup scripts, or undefined for sub-agents / no cwd. */
38
- readWorktreeSetupScripts(cwd?: string): {
39
- default?: string;
40
- macos?: string;
41
- linux?: string;
42
- windows?: string;
43
- } | undefined;
44
- /** Branch prefix used for CodeShell-managed worktree branches. */
45
- readWorktreeBranchPrefix?(cwd?: string): string | undefined;
46
- /** Resolve a setup-only sandbox for a newly-created worktree root. */
47
- resolveWorktreeSetupSandbox?(cwd: string): Promise<SandboxBackend | undefined>;
48
- /** Resolve setup-only shell env for a newly-created worktree root. */
49
- readWorktreeSetupShellEnv?(cwd?: string): Record<string, string> | undefined;
50
39
  /** Session state store used by session-scoped tools such as worktree switching. */
51
40
  getSessionManager?(): SessionManager;
52
41
  }
@@ -129,6 +118,10 @@ export interface SubAgentSpawnRequest {
129
118
  * tool. Undefined → child inherits the parent's full skill pool.
130
119
  */
131
120
  skillAllowlist?: string[];
121
+ /** Optional role-level sandbox mode. Undefined → inherit the parent sandbox. */
122
+ sandboxMode?: SandboxMode;
123
+ /** Optional MCP server allowlist. Undefined → inherit all; [] → no MCP. */
124
+ mcpAllowlist?: string[];
132
125
  /**
133
126
  * Optional per-call system prompt appended to the child Engine's prompt
134
127
  * (the role definition's Markdown body). Undefined → child inherits only
@@ -147,6 +140,15 @@ export interface SubAgentSpawnRequest {
147
140
  * See AgentSendInput in builtin/agent.ts.
148
141
  */
149
142
  resumeSessionId?: string;
143
+ /** Trusted live-runtime generation; never exposed in the Agent tool schema. */
144
+ runtimeGeneration?: number;
145
+ /** Bind the existing child runtime to the registry's single-writer lease. */
146
+ bindLiveControl?: (control: LiveChildControl, ownerToken: string) => ChildWriterLease | true | false;
147
+ /** Atomically close intake before the child publishes its terminal result. */
148
+ closeLiveControl?: (control: LiveChildControl, lease?: ChildWriterLease) => boolean | void;
149
+ /** Raw child stream tap used to deterministically reduce structured progress. */
150
+ onProgressEvent?: (event: Parameters<StreamCallback>[0]) => void;
151
+ onAgentProgress?: import("../engine/run-types.js").EngineRunOptions["onAgentProgress"];
150
152
  }
151
153
  export interface SubAgentSpawner {
152
154
  /**
@@ -162,6 +164,8 @@ export interface SubAgentSpawner {
162
164
  * the session transcript is still persisted). Optional for legacy callers.
163
165
  */
164
166
  sessionExists?(sessionId: string): boolean;
167
+ /** Persisted direct-parent metadata used to authorize cross-restart continuation. */
168
+ getSessionParentId?(sessionId: string): string | null | undefined;
165
169
  /** Stream callback to forward sub-agent events back to the parent UI. */
166
170
  parentStream?: StreamCallback;
167
171
  /** Static config used to describe what the spawned engine looks like. */
@@ -186,7 +190,20 @@ export interface SubAgentSpawnResult {
186
190
  export interface ToolVisibilityContext {
187
191
  cwd: string;
188
192
  hasGoal: boolean;
193
+ /** Resolved Session identity for per-session extension-tool visibility. */
194
+ sessionId?: string;
189
195
  settingsScope?: import("../settings/manager.js").SettingsScope;
196
+ host?: string;
197
+ isSubAgent?: boolean;
198
+ behaviorProfile?: string;
199
+ /** Host-authorized targets available to the cross-Session messaging builtin. */
200
+ sessionMessageTargets?: readonly import("../session/session-message.js").SessionMessageTarget[];
201
+ /**
202
+ * Per-run metadata produced by the active behavior profile's
203
+ * buildVisibilityMeta. Availability guards / definition rewriters that share
204
+ * the profile's domain read their conventional keys from here.
205
+ */
206
+ profileMeta?: Readonly<Record<string, unknown>>;
190
207
  }
191
208
  export interface ExternalFileChangesRecord {
192
209
  jobId: string;
@@ -197,19 +214,43 @@ export interface ExternalFileChangesRecord {
197
214
  changedFiles: string[];
198
215
  originClientMessageId?: string;
199
216
  }
217
+ export type ToolRunYieldReason = "background_notification";
218
+ /** Run-scoped handoff from a trusted tool to the owning turn loop. */
219
+ export interface ToolRunYieldController {
220
+ request(reason: ToolRunYieldReason): void;
221
+ /** Inspect without clearing so the loop can prioritize an accepted steer. */
222
+ peek?(): ToolRunYieldReason | undefined;
223
+ consume(): ToolRunYieldReason | undefined;
224
+ }
200
225
  export interface ToolContext {
201
226
  /** Active working directory for this Engine. */
202
227
  cwd: string;
228
+ /**
229
+ * Active digital-human profile's portable memory root. Present only when
230
+ * the resolved WorkspaceProfile enables portableMemory for this run.
231
+ * Memory tools use it for location:"profile"; other tools should treat the
232
+ * path as trusted run metadata, not as model-supplied input.
233
+ */
234
+ profileMemoryDir?: string;
203
235
  /** Mutate the owning live context cwd. Worktree switching intentionally does not use this. */
204
236
  setCwd?(cwd: string): void;
205
- /** Mutate the owning live session state after a session workspace switch. */
206
- setSessionWorkspace?(workspace: SessionWorkspace): void;
237
+ /** Mutate/rebase the owning live session state after a workspace switch. */
238
+ setSessionWorkspace?(workspace: SessionWorkspace, stateRevision?: number): void;
207
239
  /** LLM credentials/endpoint for tools that need to make their own calls. */
208
240
  llmConfig: LLMConfig;
209
- /** Active model pool (Arena reads this to pick participants). */
241
+ /** Active model pool for model-aware tools and product capabilities. */
210
242
  modelPool?: ModelPool;
211
243
  /** Tool registry (ToolSearch reads this to enumerate available tools). */
212
244
  toolRegistry: ToolRegistry;
245
+ /** Opaque services contributed by capability modules, keyed by capability id. */
246
+ capabilityServices?: Readonly<Record<string, unknown>>;
247
+ /**
248
+ * Run-scoped services produced by the active behavior profile's
249
+ * createRunServices. Tools that share the profile's domain conventions read
250
+ * their keys from here (e.g. DelegateWork reads the pet profile's
251
+ * petWorkspaces / requestPetWorkDelegation entries).
252
+ */
253
+ runScopedServices?: Readonly<Record<string, unknown>>;
213
254
  /** UI-backed AskUserQuestion handler. Undefined → headless mode. */
214
255
  askUser?: AskUserFn;
215
256
  /** Sub-agent spawner (Agent tool). Undefined → Agent tool unavailable. */
@@ -282,6 +323,8 @@ export interface ToolContext {
282
323
  * narrow context, or standalone tool tests. (B2 — Gate 1, standard §S3.)
283
324
  */
284
325
  sessionId?: string;
326
+ /** Engine-owned, run-scoped cross-Session message sender. */
327
+ sessionMessages?: import("../session/session-message.js").SessionMessageToolService;
285
328
  /** Stable id of the real user turn that owns async work launched here. */
286
329
  originClientMessageId?: string;
287
330
  /**
@@ -291,6 +334,12 @@ export interface ToolContext {
291
334
  * launched it has already returned.
292
335
  */
293
336
  recordExternalFileChanges?: (record: ExternalFileChangesRecord) => void;
337
+ /**
338
+ * A tool that launched asynchronous work can yield the current model loop.
339
+ * The completion notification will wake the same Session later, avoiding
340
+ * model-authored status polling while no new evidence can exist yet.
341
+ */
342
+ runYield?: ToolRunYieldController;
294
343
  /**
295
344
  * Skill names the user has hidden from the LLM (full namespaced names
296
345
  * for plugin skills, e.g. "docs:pdf"). The skill builtin tool uses
@@ -339,6 +388,8 @@ export interface ToolContext {
339
388
  * sub-agents and no-cwd contexts (same as readBuiltinOverride).
340
389
  */
341
390
  disabledBuiltins?: Set<string>;
391
+ /** Run-profile execution allowlist; omitted keeps the normal tool surface. */
392
+ allowedToolNames?: ReadonlySet<string>;
342
393
  /**
343
394
  * Per-turn context used by builtin availability guards. Engine.run() uses the
344
395
  * same object to hide tools from the model; ToolExecutor reuses it to reject
@@ -354,6 +405,11 @@ export interface ToolContext {
354
405
  * no gating (sub-agents / tests whose registries carry no MCP tools).
355
406
  */
356
407
  allowedMcpServers?: Set<string>;
408
+ /**
409
+ * Exact per-server MCP tool policy for this run. The engine uses the same
410
+ * map for model visibility, ToolSearch, and the executor's direct-call gate.
411
+ */
412
+ mcpToolPolicies?: ReadonlyMap<string, McpToolPolicy>;
357
413
  /**
358
414
  * The engine's settings scope, so tools that read disk config directly (e.g.
359
415
  * the credential tools) can honor host-isolation instead of always merging
@@ -388,6 +444,8 @@ export interface ToolContext {
388
444
  * session workspace.
389
445
  */
390
446
  workspace?: import("./workspace-bridge.js").WorkspaceBridge;
447
+ /** Host panel discovery/focus bridge. Undefined in non-Desktop/headless engines. */
448
+ panels?: import("./panel-bridge.js").PanelHostBridge;
391
449
  /**
392
450
  * Inject a stored cookie credential into the built-in browser (restore its
393
451
  * login state so the AI can drive the page as that account). The host