@cjhyy/code-shell-core 0.5.0-rc.2 → 0.6.0-rc.10

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 (396) hide show
  1. package/README.md +13 -10
  2. package/dist/agent/agent-definition-registry.d.ts +3 -0
  3. package/dist/agent/agent-definition-registry.js +3 -1
  4. package/dist/agent/agent-definition.d.ts +15 -0
  5. package/dist/agent/agent-definition.js +27 -3
  6. package/dist/arena/context/context-tools.js +47 -4
  7. package/dist/arena/ledger.js +9 -1
  8. package/dist/arena/strategies/utils.d.ts +1 -4
  9. package/dist/arena/strategies/utils.js +7 -84
  10. package/dist/automation/cron-expr.d.ts +10 -0
  11. package/dist/automation/cron-expr.js +23 -5
  12. package/dist/automation/runner.d.ts +21 -4
  13. package/dist/automation/runner.js +48 -12
  14. package/dist/automation/scheduler.d.ts +38 -0
  15. package/dist/automation/scheduler.js +89 -12
  16. package/dist/automation/store.js +5 -2
  17. package/dist/capability-control/disabled-lists.d.ts +25 -0
  18. package/dist/capability-control/disabled-lists.js +57 -0
  19. package/dist/capability-control/overlay.d.ts +15 -0
  20. package/dist/capability-control/overlay.js +27 -0
  21. package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
  22. package/dist/cc-orchestrator/agent-adapter.js +133 -0
  23. package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
  24. package/dist/cc-orchestrator/cc-capability.js +53 -0
  25. package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
  26. package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
  27. package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
  28. package/dist/cc-orchestrator/codex-session-history.js +187 -0
  29. package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
  30. package/dist/cc-orchestrator/external-agent-changes.js +214 -0
  31. package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
  32. package/dist/cc-orchestrator/external-agent-driver.js +69 -0
  33. package/dist/cc-orchestrator/index.d.ts +8 -0
  34. package/dist/cc-orchestrator/index.js +8 -0
  35. package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
  36. package/dist/cc-orchestrator/relevance-judge.js +29 -0
  37. package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
  38. package/dist/cc-orchestrator/session-discovery.js +125 -0
  39. package/dist/cc-orchestrator/session-history.d.ts +19 -0
  40. package/dist/cc-orchestrator/session-history.js +67 -0
  41. package/dist/cli/agent-server-stdio.d.ts +15 -1
  42. package/dist/cli/agent-server-stdio.js +115 -17
  43. package/dist/cli/agent-server-tcp.js +40 -26
  44. package/dist/context/compaction.d.ts +86 -0
  45. package/dist/context/compaction.js +279 -0
  46. package/dist/context/manager.d.ts +18 -0
  47. package/dist/context/manager.js +181 -48
  48. package/dist/context/token-counter.js +13 -0
  49. package/dist/cost-tracker.js +5 -61
  50. package/dist/credentials/cipher.d.ts +49 -0
  51. package/dist/credentials/cipher.js +45 -0
  52. package/dist/credentials/cookie-jar.d.ts +24 -0
  53. package/dist/credentials/cookie-jar.js +40 -0
  54. package/dist/credentials/index.d.ts +7 -0
  55. package/dist/credentials/index.js +5 -0
  56. package/dist/credentials/inject-credential-tool.d.ts +20 -0
  57. package/dist/credentials/inject-credential-tool.js +130 -0
  58. package/dist/credentials/store.d.ts +72 -0
  59. package/dist/credentials/store.js +184 -0
  60. package/dist/credentials/types.d.ts +56 -0
  61. package/dist/credentials/use-credential-tool.d.ts +29 -0
  62. package/dist/credentials/use-credential-tool.js +205 -0
  63. package/dist/credentials/use-gate.d.ts +56 -0
  64. package/dist/credentials/use-gate.js +52 -0
  65. package/dist/data/model-metadata.d.ts +77 -0
  66. package/dist/data/model-metadata.js +56 -0
  67. package/dist/data/model-metadata.json +216 -0
  68. package/dist/data/openrouter-models.d.ts +18 -7
  69. package/dist/data/openrouter-models.js +35 -8
  70. package/dist/engine/aux-key.d.ts +10 -0
  71. package/dist/engine/aux-key.js +11 -0
  72. package/dist/engine/dynamic-tool-defs.d.ts +19 -0
  73. package/dist/engine/dynamic-tool-defs.js +36 -0
  74. package/dist/engine/engine.d.ts +280 -141
  75. package/dist/engine/engine.js +1193 -245
  76. package/dist/engine/friendly-error.d.ts +18 -0
  77. package/dist/engine/friendly-error.js +63 -0
  78. package/dist/engine/goal.d.ts +145 -0
  79. package/dist/engine/goal.js +144 -0
  80. package/dist/engine/image-policy.d.ts +13 -0
  81. package/dist/engine/image-policy.js +24 -0
  82. package/dist/engine/model-connections-pool.d.ts +17 -0
  83. package/dist/engine/model-connections-pool.js +67 -0
  84. package/dist/engine/model-facade.d.ts +10 -0
  85. package/dist/engine/model-facade.js +15 -0
  86. package/dist/engine/patch-orphaned-tools.js +3 -0
  87. package/dist/engine/query.js +2 -0
  88. package/dist/engine/resolve-llm-config.d.ts +16 -0
  89. package/dist/engine/resolve-llm-config.js +44 -0
  90. package/dist/engine/runtime.d.ts +2 -0
  91. package/dist/engine/runtime.js +27 -1
  92. package/dist/engine/sandbox-cache-key.d.ts +10 -0
  93. package/dist/engine/sandbox-cache-key.js +9 -0
  94. package/dist/engine/sandbox-config.d.ts +31 -0
  95. package/dist/engine/sandbox-config.js +38 -0
  96. package/dist/engine/session-usage.d.ts +31 -0
  97. package/dist/engine/session-usage.js +81 -0
  98. package/dist/engine/steer-queue.d.ts +33 -0
  99. package/dist/engine/steer-queue.js +26 -0
  100. package/dist/engine/streaming-tool-queue.d.ts +12 -0
  101. package/dist/engine/streaming-tool-queue.js +50 -10
  102. package/dist/engine/turn-loop.d.ts +94 -4
  103. package/dist/engine/turn-loop.js +432 -54
  104. package/dist/engine/types.d.ts +175 -0
  105. package/dist/engine/types.js +13 -0
  106. package/dist/external-agents/config.d.ts +2 -0
  107. package/dist/external-agents/config.js +15 -0
  108. package/dist/external-agents/types.d.ts +31 -0
  109. package/dist/external-agents/types.js +1 -0
  110. package/dist/git/utils.d.ts +12 -0
  111. package/dist/git/utils.js +38 -6
  112. package/dist/git/worktree.d.ts +48 -0
  113. package/dist/git/worktree.js +86 -10
  114. package/dist/hooks/goal-stop-hook.d.ts +28 -0
  115. package/dist/hooks/goal-stop-hook.js +186 -9
  116. package/dist/hooks/registry.d.ts +8 -0
  117. package/dist/hooks/registry.js +19 -0
  118. package/dist/hooks/shell-runner.js +10 -21
  119. package/dist/index.d.ts +51 -7
  120. package/dist/index.js +62 -5
  121. package/dist/llm/capabilities/param-specs.d.ts +14 -0
  122. package/dist/llm/capabilities/param-specs.js +62 -0
  123. package/dist/llm/capabilities/rules.js +5 -1
  124. package/dist/llm/capabilities/types.d.ts +10 -0
  125. package/dist/llm/client-base.d.ts +28 -1
  126. package/dist/llm/client-base.js +119 -13
  127. package/dist/llm/model-cache.js +4 -2
  128. package/dist/llm/model-pool.d.ts +21 -0
  129. package/dist/llm/model-pool.js +21 -1
  130. package/dist/llm/provider-auth.d.ts +41 -0
  131. package/dist/llm/provider-auth.js +76 -0
  132. package/dist/llm/provider-catalog.d.ts +4 -0
  133. package/dist/llm/providers/anthropic.js +64 -14
  134. package/dist/llm/providers/openai.d.ts +36 -0
  135. package/dist/llm/providers/openai.js +257 -51
  136. package/dist/llm/reasoning-setting.d.ts +3 -3
  137. package/dist/llm/reasoning-setting.js +9 -1
  138. package/dist/llm/stream-watchdog.js +5 -1
  139. package/dist/llm/token-counter.js +9 -2
  140. package/dist/llm/types.d.ts +4 -0
  141. package/dist/logging/sanitize-messages.js +22 -0
  142. package/dist/lsp/manager.d.ts +1 -1
  143. package/dist/lsp/manager.js +40 -10
  144. package/dist/model-catalog/builtin.d.ts +12 -0
  145. package/dist/model-catalog/builtin.js +412 -0
  146. package/dist/model-catalog/gen-connections.d.ts +20 -0
  147. package/dist/model-catalog/gen-connections.js +28 -0
  148. package/dist/model-catalog/index.d.ts +41 -0
  149. package/dist/model-catalog/index.js +90 -0
  150. package/dist/model-catalog/params.d.ts +20 -0
  151. package/dist/model-catalog/params.js +45 -0
  152. package/dist/model-catalog/resolve.d.ts +48 -0
  153. package/dist/model-catalog/resolve.js +33 -0
  154. package/dist/model-catalog/save-entry.d.ts +32 -0
  155. package/dist/model-catalog/save-entry.js +104 -0
  156. package/dist/model-catalog/types.d.ts +561 -0
  157. package/dist/model-catalog/types.js +93 -0
  158. package/dist/model-catalog/upsert.d.ts +9 -0
  159. package/dist/model-catalog/upsert.js +8 -0
  160. package/dist/onboarding.d.ts +12 -82
  161. package/dist/onboarding.js +61 -326
  162. package/dist/plugins/gitOps.d.ts +19 -0
  163. package/dist/plugins/gitOps.js +73 -4
  164. package/dist/plugins/installer/checkUpdate.d.ts +16 -0
  165. package/dist/plugins/installer/checkUpdate.js +32 -0
  166. package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
  167. package/dist/plugins/installer/codex/convertCommands.js +46 -0
  168. package/dist/plugins/installer/codex/convertMcp.d.ts +5 -2
  169. package/dist/plugins/installer/codex/convertMcp.js +45 -5
  170. package/dist/plugins/installer/install.js +25 -1
  171. package/dist/plugins/installer/installFromArchive.d.ts +43 -0
  172. package/dist/plugins/installer/installFromArchive.js +134 -0
  173. package/dist/plugins/installer/installFromSource.js +8 -2
  174. package/dist/plugins/installer/loadPluginAgents.js +6 -2
  175. package/dist/plugins/installer/loadPluginMcp.d.ts +9 -2
  176. package/dist/plugins/installer/loadPluginMcp.js +35 -2
  177. package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
  178. package/dist/plugins/installer/pruneDisabled.js +73 -0
  179. package/dist/plugins/installer/types.d.ts +5 -2
  180. package/dist/plugins/installer/types.js +1 -0
  181. package/dist/plugins/installer/uninstall.js +4 -0
  182. package/dist/plugins/installer/unzip.d.ts +14 -0
  183. package/dist/plugins/installer/unzip.js +82 -0
  184. package/dist/plugins/installer/update.d.ts +14 -0
  185. package/dist/plugins/installer/update.js +53 -21
  186. package/dist/plugins/loadPluginHooks.d.ts +47 -1
  187. package/dist/plugins/loadPluginHooks.js +73 -1
  188. package/dist/plugins/marketplaceManager.d.ts +7 -0
  189. package/dist/plugins/marketplaceManager.js +20 -0
  190. package/dist/plugins/pluginCommandHook.js +4 -18
  191. package/dist/plugins/pluginContent.d.ts +30 -0
  192. package/dist/plugins/pluginContent.js +83 -0
  193. package/dist/plugins/pluginInstaller.d.ts +13 -0
  194. package/dist/plugins/pluginInstaller.js +42 -8
  195. package/dist/plugins/schemas.js +1 -0
  196. package/dist/plugins/types.d.ts +6 -0
  197. package/dist/preset/index.d.ts +11 -1
  198. package/dist/preset/index.js +115 -6
  199. package/dist/product/types.d.ts +1 -1
  200. package/dist/prompt/composer.d.ts +32 -0
  201. package/dist/prompt/composer.js +75 -21
  202. package/dist/prompt/instruction-scanner.js +5 -3
  203. package/dist/prompt/section-loader.js +1 -0
  204. package/dist/prompt/sections/base.md +2 -0
  205. package/dist/prompt/sections/browser.md +10 -0
  206. package/dist/prompt/sections/coding.md +4 -0
  207. package/dist/protocol/chat-session-manager.d.ts +9 -2
  208. package/dist/protocol/chat-session-manager.js +38 -0
  209. package/dist/protocol/chat-session.d.ts +69 -1
  210. package/dist/protocol/chat-session.js +102 -4
  211. package/dist/protocol/client.d.ts +31 -0
  212. package/dist/protocol/client.js +44 -0
  213. package/dist/protocol/server.d.ts +120 -7
  214. package/dist/protocol/server.js +753 -51
  215. package/dist/protocol/transport.js +3 -2
  216. package/dist/protocol/types.d.ts +60 -0
  217. package/dist/protocol/types.js +16 -0
  218. package/dist/quota/credentials.d.ts +3 -0
  219. package/dist/quota/credentials.js +80 -0
  220. package/dist/quota/index.d.ts +36 -0
  221. package/dist/quota/index.js +155 -0
  222. package/dist/quota/types.d.ts +48 -0
  223. package/dist/quota/types.js +13 -0
  224. package/dist/review/review-prompt.d.ts +28 -0
  225. package/dist/review/review-prompt.js +81 -0
  226. package/dist/run/FileRunStore.js +8 -3
  227. package/dist/run/RunApprovalBackend.js +25 -5
  228. package/dist/run/RunManager.d.ts +12 -0
  229. package/dist/run/RunManager.js +35 -0
  230. package/dist/run/factory.d.ts +1 -1
  231. package/dist/runtime/background-shell.d.ts +139 -0
  232. package/dist/runtime/background-shell.js +509 -0
  233. package/dist/runtime/output-clean.d.ts +24 -0
  234. package/dist/runtime/output-clean.js +41 -0
  235. package/dist/runtime/ring-file.d.ts +64 -0
  236. package/dist/runtime/ring-file.js +174 -0
  237. package/dist/runtime/safe-spawn.js +98 -39
  238. package/dist/runtime/spawn-common.d.ts +159 -0
  239. package/dist/runtime/spawn-common.js +404 -0
  240. package/dist/runtime/truncate-output.d.ts +22 -0
  241. package/dist/runtime/truncate-output.js +49 -0
  242. package/dist/runtime/utf8-cut.d.ts +11 -0
  243. package/dist/runtime/utf8-cut.js +23 -0
  244. package/dist/services/auto-dream.d.ts +4 -0
  245. package/dist/services/auto-dream.js +26 -26
  246. package/dist/services/diagnostics.d.ts +1 -2
  247. package/dist/services/diagnostics.js +12 -7
  248. package/dist/services/extract-memories.d.ts +14 -1
  249. package/dist/services/extract-memories.js +45 -6
  250. package/dist/services/memory-orchestrator.d.ts +21 -0
  251. package/dist/services/memory-orchestrator.js +125 -50
  252. package/dist/services/session-memory.js +24 -12
  253. package/dist/session/file-history.d.ts +124 -1
  254. package/dist/session/file-history.js +222 -6
  255. package/dist/session/memory.d.ts +116 -2
  256. package/dist/session/memory.js +250 -28
  257. package/dist/session/session-manager.d.ts +40 -0
  258. package/dist/session/session-manager.js +119 -3
  259. package/dist/session/simple-diff.d.ts +23 -0
  260. package/dist/session/simple-diff.js +84 -0
  261. package/dist/session/transcript.d.ts +29 -1
  262. package/dist/session/transcript.js +56 -2
  263. package/dist/session/undo-target.d.ts +67 -0
  264. package/dist/session/undo-target.js +144 -0
  265. package/dist/settings/disk-defaults.d.ts +9 -2
  266. package/dist/settings/disk-defaults.js +11 -2
  267. package/dist/settings/feature-flags.d.ts +64 -0
  268. package/dist/settings/feature-flags.js +61 -0
  269. package/dist/settings/manager.d.ts +68 -1
  270. package/dist/settings/manager.js +266 -29
  271. package/dist/settings/migrate-config.d.ts +45 -0
  272. package/dist/settings/migrate-config.js +125 -0
  273. package/dist/settings/schema-export.d.ts +25 -0
  274. package/dist/settings/schema-export.js +38 -0
  275. package/dist/settings/schema.d.ts +1186 -771
  276. package/dist/settings/schema.js +268 -97
  277. package/dist/skills/scanner.d.ts +9 -0
  278. package/dist/skills/scanner.js +30 -2
  279. package/dist/stt/resolve-transcribe.d.ts +31 -0
  280. package/dist/stt/resolve-transcribe.js +108 -0
  281. package/dist/stt/transcribe.d.ts +51 -0
  282. package/dist/stt/transcribe.js +65 -0
  283. package/dist/tool-system/browser-bridge.d.ts +226 -0
  284. package/dist/tool-system/browser-bridge.js +163 -0
  285. package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
  286. package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
  287. package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
  288. package/dist/tool-system/builtin/agent-notifications.js +9 -3
  289. package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
  290. package/dist/tool-system/builtin/agent-output-file.js +72 -0
  291. package/dist/tool-system/builtin/agent-registry.d.ts +12 -0
  292. package/dist/tool-system/builtin/agent-registry.js +8 -0
  293. package/dist/tool-system/builtin/agent.d.ts +21 -1
  294. package/dist/tool-system/builtin/agent.js +489 -42
  295. package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
  296. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
  297. package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
  298. package/dist/tool-system/builtin/apply-patch/index.js +0 -15
  299. package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
  300. package/dist/tool-system/builtin/background-jobs.js +124 -0
  301. package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
  302. package/dist/tool-system/builtin/background-shell-tools.js +108 -0
  303. package/dist/tool-system/builtin/background-work.d.ts +67 -0
  304. package/dist/tool-system/builtin/background-work.js +86 -0
  305. package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
  306. package/dist/tool-system/builtin/bash-output-style.js +40 -0
  307. package/dist/tool-system/builtin/bash.d.ts +5 -2
  308. package/dist/tool-system/builtin/bash.js +101 -64
  309. package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
  310. package/dist/tool-system/builtin/browser-tools.js +312 -0
  311. package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
  312. package/dist/tool-system/builtin/cancel-goal.js +64 -0
  313. package/dist/tool-system/builtin/check-quota.d.ts +15 -0
  314. package/dist/tool-system/builtin/check-quota.js +34 -0
  315. package/dist/tool-system/builtin/config.js +7 -0
  316. package/dist/tool-system/builtin/cron.d.ts +7 -0
  317. package/dist/tool-system/builtin/cron.js +64 -4
  318. package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
  319. package/dist/tool-system/builtin/drive-claude-code.js +157 -0
  320. package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
  321. package/dist/tool-system/builtin/edit-model-catalog.js +104 -0
  322. package/dist/tool-system/builtin/edit.js +20 -16
  323. package/dist/tool-system/builtin/eol.d.ts +29 -0
  324. package/dist/tool-system/builtin/eol.js +37 -0
  325. package/dist/tool-system/builtin/file-cache.d.ts +6 -0
  326. package/dist/tool-system/builtin/file-cache.js +8 -0
  327. package/dist/tool-system/builtin/generate-image.d.ts +35 -0
  328. package/dist/tool-system/builtin/generate-image.js +278 -50
  329. package/dist/tool-system/builtin/generate-video.d.ts +55 -0
  330. package/dist/tool-system/builtin/generate-video.js +364 -0
  331. package/dist/tool-system/builtin/glob.js +0 -7
  332. package/dist/tool-system/builtin/grep.d.ts +9 -0
  333. package/dist/tool-system/builtin/grep.js +106 -11
  334. package/dist/tool-system/builtin/image-providers.d.ts +86 -0
  335. package/dist/tool-system/builtin/image-providers.js +190 -0
  336. package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
  337. package/dist/tool-system/builtin/image-uploader.js +74 -0
  338. package/dist/tool-system/builtin/index.d.ts +10 -2
  339. package/dist/tool-system/builtin/index.js +251 -27
  340. package/dist/tool-system/builtin/mcp-tools.js +23 -3
  341. package/dist/tool-system/builtin/memory.js +45 -7
  342. package/dist/tool-system/builtin/notebook-edit.js +0 -7
  343. package/dist/tool-system/builtin/powershell.js +8 -2
  344. package/dist/tool-system/builtin/read.js +10 -10
  345. package/dist/tool-system/builtin/repl.js +4 -1
  346. package/dist/tool-system/builtin/skill.js +9 -0
  347. package/dist/tool-system/builtin/sleep.js +8 -2
  348. package/dist/tool-system/builtin/tool-search.js +25 -7
  349. package/dist/tool-system/builtin/video-providers.d.ts +154 -0
  350. package/dist/tool-system/builtin/video-providers.js +235 -0
  351. package/dist/tool-system/builtin/web-fetch.js +12 -2
  352. package/dist/tool-system/builtin/web-search.js +21 -7
  353. package/dist/tool-system/builtin/worktree.d.ts +2 -1
  354. package/dist/tool-system/builtin/worktree.js +31 -4
  355. package/dist/tool-system/builtin/write.js +0 -6
  356. package/dist/tool-system/context.d.ts +164 -6
  357. package/dist/tool-system/executor.d.ts +3 -1
  358. package/dist/tool-system/executor.js +197 -90
  359. package/dist/tool-system/investigation-guard.js +1 -1
  360. package/dist/tool-system/mcp-manager.d.ts +42 -4
  361. package/dist/tool-system/mcp-manager.js +203 -20
  362. package/dist/tool-system/mcp-stdio-diagnostics.d.ts +9 -0
  363. package/dist/tool-system/mcp-stdio-diagnostics.js +93 -0
  364. package/dist/tool-system/path-policy.d.ts +5 -0
  365. package/dist/tool-system/path-policy.js +307 -8
  366. package/dist/tool-system/permission.d.ts +39 -2
  367. package/dist/tool-system/permission.js +283 -70
  368. package/dist/tool-system/plan-mode-allowlist.d.ts +13 -2
  369. package/dist/tool-system/plan-mode-allowlist.js +24 -2
  370. package/dist/tool-system/registry.d.ts +1 -0
  371. package/dist/tool-system/registry.js +16 -2
  372. package/dist/tool-system/sandbox/index.d.ts +8 -0
  373. package/dist/tool-system/sandbox/index.js +7 -2
  374. package/dist/tool-system/sandbox/off.js +7 -1
  375. package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
  376. package/dist/tool-system/validate-tool-metadata.js +63 -0
  377. package/dist/types.d.ts +252 -7
  378. package/dist/updater.js +20 -9
  379. package/dist/utils/envUtils.d.ts +0 -9
  380. package/dist/utils/envUtils.js +3 -28
  381. package/dist/utils/exec.d.ts +48 -0
  382. package/dist/utils/exec.js +154 -0
  383. package/dist/utils/json.d.ts +12 -0
  384. package/dist/utils/json.js +92 -0
  385. package/dist/utils/theme.d.ts +1 -1
  386. package/dist/utils/theme.js +1 -1
  387. package/dist/utils/toolDisplay.js +0 -1
  388. package/package.json +13 -7
  389. package/dist/agent/coordinator.d.ts +0 -49
  390. package/dist/agent/coordinator.js +0 -77
  391. package/dist/settings/manager.test.js +0 -73
  392. package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
  393. package/dist/tool-system/builtin/remote-trigger.js +0 -54
  394. package/dist/tool-system/builtin/send-message.d.ts +0 -6
  395. package/dist/tool-system/builtin/send-message.js +0 -47
  396. /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
@@ -2,10 +2,18 @@
2
2
  * Tool executor — orchestrates permission checks, hooks, and execution.
3
3
  */
4
4
  import { setMaxListeners } from "node:events";
5
+ import { resolve as resolvePath, isAbsolute as isAbsolutePath } from "node:path";
6
+ import { classifyBashCommand } from "./permission.js";
7
+ import { ToolNotFoundError } from "../exceptions.js";
5
8
  import { logger as rootLogger, getCurrentSid } from "../logging/logger.js";
6
9
  import { recordToolCall, recordToolResult } from "../logging/session-recorder.js";
7
10
  import { validateToolArgs } from "./validation.js";
8
11
  import { PLAN_MODE_ALLOWED_TOOLS } from "./plan-mode-allowlist.js";
12
+ import { enforcePathPolicyWithApproval } from "./path-policy.js";
13
+ import { parsePatch } from "./builtin/apply-patch/parser.js";
14
+ import { BUILTIN_TOOL_GUARDS } from "./builtin/index.js";
15
+ import { COMPLETE_GOAL_TOOL_NAME } from "./builtin/complete-goal.js";
16
+ import { CANCEL_GOAL_TOOL_NAME } from "./builtin/cancel-goal.js";
9
17
  // A1 hardening: hooks must never promote a non-`allow` classifier
10
18
  // decision to `allow`. They may otherwise adjust the decision freely
11
19
  // (e.g. tighten `allow` to `deny`/`ask`, or relax `deny` to `ask` to
@@ -114,22 +122,95 @@ export class ToolExecutor {
114
122
  isError: true,
115
123
  };
116
124
  }
117
- // 0. Plan mode: only allow read-only tools — no file writes at all
118
- if (this.toolCtx?.planMode) {
119
- // Shared with engine.ts's tool-visibility filter so the set the model
120
- // SEES and the set the executor RUNS can't drift (they had).
121
- if (!PLAN_MODE_ALLOWED_TOOLS.has(call.toolName)) {
122
- if (call.toolName === "Bash" && this.isReadOnlyBashCommand(call.args)) {
123
- // Read-only bash is fine
125
+ if ((call.toolName === COMPLETE_GOAL_TOOL_NAME || call.toolName === CANCEL_GOAL_TOOL_NAME) &&
126
+ this.toolCtx?.toolVisibility?.hasGoal !== true) {
127
+ return {
128
+ id: call.id,
129
+ toolName: call.toolName,
130
+ error: `Tool ${call.toolName} is only available while an active goal is present. Do NOT retry this tool call unless a goal is active.`,
131
+ isError: true,
132
+ };
133
+ }
134
+ const visibilityGuard = BUILTIN_TOOL_GUARDS.get(call.toolName);
135
+ if (visibilityGuard && this.toolCtx?.toolVisibility && !visibilityGuard(this.toolCtx.toolVisibility)) {
136
+ return {
137
+ id: call.id,
138
+ toolName: call.toolName,
139
+ error: `Tool ${call.toolName} is not available in the current session context. Do NOT retry this tool call unless the relevant context changes.`,
140
+ isError: true,
141
+ };
142
+ }
143
+ // Same gate for MCP tools: the registry is worker-shared, so it can hold
144
+ // tools from servers OTHER sessions enabled. Visibility filtering hides
145
+ // them from this session's tool list; this rejects a direct call anyway.
146
+ if (this.toolCtx?.allowedMcpServers) {
147
+ const allowed = this.toolCtx.allowedMcpServers;
148
+ const reg = this.registry.getTool(call.toolName);
149
+ if (reg?.source === "mcp" && !allowed.has(reg.serverName ?? "")) {
150
+ return {
151
+ id: call.id,
152
+ toolName: call.toolName,
153
+ error: `Tool ${call.toolName} belongs to an MCP server that is not enabled for this project. Do NOT retry this tool call.`,
154
+ isError: true,
155
+ };
156
+ }
157
+ // The generic MCP builtins (MCPTool / ReadMcpResource) take the target
158
+ // server as an ARGUMENT and call MCPManager directly, so the source==="mcp"
159
+ // check above can't see them — without this a session could invoke a tool
160
+ // or read a resource on a server only ANOTHER session enabled. Gate on the
161
+ // server arg. ListMcpResources has an optional server filter and would
162
+ // otherwise enumerate every connected server's resources, so we inject the
163
+ // allowlist for it to filter by (see mcp-tools.ts).
164
+ if (call.toolName === "MCPTool" || call.toolName === "ReadMcpResource") {
165
+ const server = String(call.args.server ?? "");
166
+ if (!allowed.has(server)) {
167
+ return {
168
+ id: call.id,
169
+ toolName: call.toolName,
170
+ error: `MCP server "${server}" is not enabled for this project. Do NOT retry this tool call.`,
171
+ isError: true,
172
+ };
124
173
  }
125
- else {
174
+ }
175
+ else if (call.toolName === "ListMcpResources") {
176
+ const server = String(call.args.server ?? "");
177
+ if (server && !allowed.has(server)) {
126
178
  return {
127
179
  id: call.id,
128
180
  toolName: call.toolName,
129
- error: `Plan mode: ${call.toolName} is blocked. Only read-only tools (Read, Glob, Grep, WebSearch, WebFetch, Bash read-only) are allowed. You MUST output your plan as text in the conversation instead. Do NOT retry this tool call.`,
181
+ error: `MCP server "${server}" is not enabled for this project. Do NOT retry this tool call.`,
130
182
  isError: true,
131
183
  };
132
184
  }
185
+ call.args.__allowedMcpServers = allowed;
186
+ }
187
+ }
188
+ // 0. Plan mode: only allow read-only tools — no file writes at all
189
+ if (this.toolCtx?.planMode) {
190
+ // Shared with engine.ts's tool-visibility filter so the set the model
191
+ // SEES and the set the executor RUNS can't drift (they had).
192
+ // Bash is in the allow-list so the model can SEE it for read-only probing,
193
+ // but membership alone must NOT grant write access: a Bash command that
194
+ // modifies files (echo >, sed -i, mv, ...) has to be blocked here too, or it
195
+ // would slip past plan mode into the normal permission flow (where the user
196
+ // could approve it) AND leave no diff, since it never touches Write/Edit.
197
+ const allowed = PLAN_MODE_ALLOWED_TOOLS.has(call.toolName);
198
+ // Defer to the canonical shell classifier (the same one the permission
199
+ // flow uses) instead of a second hand-rolled allowlist that drifted and
200
+ // let find -delete / awk system() / process substitution / git difftool
201
+ // through. Plan mode is strictly read-only, so ONLY "safe-read" passes —
202
+ // safe-write (mkdir/touch/cp), unsafe, and dangerous are all blocked.
203
+ const bashWrite = call.toolName === "Bash" &&
204
+ classifyBashCommand(String(call.args.command ?? "")) !== "safe-read";
205
+ if (!allowed || bashWrite) {
206
+ return {
207
+ id: call.id,
208
+ toolName: call.toolName,
209
+ error: allowed && bashWrite
210
+ ? `Plan mode is read-only: this Bash command writes or modifies files, which is not allowed while planning. To carry it out, first call ExitPlanMode (after the user approves your plan), then run it. Do NOT retry this command in plan mode.`
211
+ : `Plan mode: ${call.toolName} is blocked. Only read-only tools (Read, Glob, Grep, WebSearch, WebFetch, Bash read-only) are allowed. You MUST output your plan as text in the conversation instead. Do NOT retry this tool call.`,
212
+ isError: true,
213
+ };
133
214
  }
134
215
  }
135
216
  // 0.5. Validate tool args
@@ -182,6 +263,19 @@ export class ToolExecutor {
182
263
  toolCallId: call.id,
183
264
  });
184
265
  }
266
+ // 0.65. Centralized file path policy. Tool handlers declare their file
267
+ // path surface on RegisteredTool.pathPolicy; the executor enforces it
268
+ // after hooks have had a chance to rewrite args, but before permission
269
+ // classification or the handler can touch the filesystem.
270
+ const pathPolicyError = await this.enforceDeclaredPathPolicy(toolDef, call.args);
271
+ if (pathPolicyError) {
272
+ return {
273
+ id: call.id,
274
+ toolName: call.toolName,
275
+ error: pathPolicyError,
276
+ isError: true,
277
+ };
278
+ }
185
279
  // A1 hardening: pre_tool_use can no longer pre-approve a tool via
186
280
  // `decision === "allow"`. Hooks may relax `allow` and may force
187
281
  // `ask`/`deny`, but they cannot promote a `deny`/`ask` decision to
@@ -201,7 +295,7 @@ export class ToolExecutor {
201
295
  // the hook and the user together have decided.
202
296
  if (hookResult.decision === "ask") {
203
297
  const reason = hookResult.messages?.join("\n") ?? undefined;
204
- const approved = await this.permission.handleAsk(call.toolName, call.args, reason);
298
+ const approved = await this.permission.handleAsk(call.toolName, call.args, reason, { sessionId: this.toolCtx?.sessionId });
205
299
  if (!approved) {
206
300
  return {
207
301
  id: call.id,
@@ -274,7 +368,9 @@ export class ToolExecutor {
274
368
  }
275
369
  if (decision === "ask") {
276
370
  const reason = permHook.messages?.join("\n");
277
- const approved = await this.permission.handleAsk(call.toolName, call.args, reason);
371
+ const approved = await this.permission.handleAsk(call.toolName, call.args, reason, {
372
+ sessionId: this.toolCtx?.sessionId,
373
+ });
278
374
  if (!approved) {
279
375
  return {
280
376
  id: call.id,
@@ -321,6 +417,18 @@ export class ToolExecutor {
321
417
  durationMs: Date.now() - toolStartedAt,
322
418
  error: err instanceof Error ? err.stack ?? err.message : String(err),
323
419
  });
420
+ // A model calling a tool that isn't in the registry (hallucinated name,
421
+ // or a builtin missing from the active preset's whitelist) must not kill
422
+ // the turn. Feed it back as a normal tool error so the model can retry
423
+ // or pick a different tool — same path as permission denials above.
424
+ if (err instanceof ToolNotFoundError) {
425
+ return {
426
+ id: call.id,
427
+ toolName: call.toolName,
428
+ error: `Tool not found: ${call.toolName}. It is not available in this session — do not call it again; use a different tool.`,
429
+ isError: true,
430
+ };
431
+ }
324
432
  throw err;
325
433
  }
326
434
  result.id = call.id;
@@ -386,86 +494,85 @@ export class ToolExecutor {
386
494
  }
387
495
  return result;
388
496
  }
389
- isReadOnlyBashCommand(args) {
390
- const cmd = String(args.command ?? "").trim();
391
- // Reject shell metacharacters that could chain a write command after a
392
- // read-only prefix: ; && || ` $(...) redirections. A single pipe (|) is
393
- // still allowed the per-part whitelist further down validates it.
394
- const DANGEROUS = /;|&&|\|\||`|\$\(|>/;
395
- if (DANGEROUS.test(cmd))
396
- return false;
397
- // Extract the base command (first word, ignoring env vars like VAR=val)
398
- const baseCmd = cmd.replace(/^(\w+=\S+\s+)*/, "").split(/\s/)[0];
399
- const readOnlyCommands = new Set([
400
- "ls",
401
- "find",
402
- "cat",
403
- "head",
404
- "tail",
405
- "wc",
406
- "file",
407
- "stat",
408
- "tree",
409
- "du",
410
- "df",
411
- "pwd",
412
- "echo",
413
- "which",
414
- "type",
415
- "env",
416
- "printenv",
417
- "grep",
418
- "rg",
419
- "ag",
420
- "awk",
421
- "less",
422
- "more",
423
- "sort",
424
- "uniq",
425
- "diff",
426
- "readlink",
427
- "realpath",
428
- "basename",
429
- "dirname",
430
- "date",
431
- "whoami",
432
- "uname",
433
- "hostname",
434
- "id",
435
- "groups",
436
- "locale",
437
- "uptime",
438
- ]);
439
- // Whitelisted read-only git/tool subcommands.
440
- // Deliberately exclude `node -e`, `python -c`, `sed -n`, etc. those can
441
- // execute arbitrary code even though they "look read-only".
442
- const readOnlyPrefixes = [
443
- "git log",
444
- "git status",
445
- "git diff",
446
- "git branch",
447
- "git show",
448
- "git blame",
449
- "git remote",
450
- "git tag",
451
- "git stash list",
452
- "git rev-parse",
453
- "npx tsc --noEmit",
454
- ];
455
- if (readOnlyCommands.has(baseCmd))
456
- return true;
457
- if (readOnlyPrefixes.some((p) => cmd.startsWith(p)))
458
- return true;
459
- // Allow piped commands if all parts are read-only. Redirections were
460
- // already rejected above, so a bare `|` here is a real pipeline.
461
- if (cmd.includes("|")) {
462
- const parts = cmd.split("|").map((p) => p.trim());
463
- return parts.every((part) => {
464
- const partBase = part.replace(/^(\w+=\S+\s+)*/, "").split(/\s/)[0];
465
- return readOnlyCommands.has(partBase);
466
- });
497
+ resolvePolicyOperation(op, args) {
498
+ if (op === "read" || op === "write")
499
+ return op;
500
+ const raw = args[op.fromArg];
501
+ const value = typeof raw === "string" ? raw : String(raw ?? "");
502
+ if (op.readValues?.includes(value))
503
+ return "read";
504
+ if (op.writeValues?.includes(value))
505
+ return "write";
506
+ return op.default;
507
+ }
508
+ async enforceDeclaredPathPolicy(tool, args) {
509
+ const policies = tool?.pathPolicy;
510
+ if (!policies?.length)
511
+ return null;
512
+ for (const policy of policies) {
513
+ const targets = this.resolvePathPolicyTargets(policy, args);
514
+ if (typeof targets === "string")
515
+ return targets;
516
+ const operation = this.resolvePolicyOperation(policy.operation, args);
517
+ for (const target of targets) {
518
+ const blocked = await enforcePathPolicyWithApproval(target, operation, this.toolCtx);
519
+ if (blocked)
520
+ return blocked;
521
+ }
522
+ }
523
+ return null;
524
+ }
525
+ resolvePathPolicyTargets(policy, args) {
526
+ if (policy.kind === "arg") {
527
+ const raw = args[policy.arg];
528
+ if (typeof raw === "string" && raw.length > 0) {
529
+ // Resolve a RELATIVE single-string path arg against ctx.cwd before
530
+ // classification, mirroring the array branch below and the apply_patch
531
+ // branch — otherwise classifyPath's process.cwd()-based resolution
532
+ // mis-places an in-workspace relative path (e.g. Read "src/x.ts") as
533
+ // "outside workspace" and over-prompts. Absolute paths pass through.
534
+ const cwd = this.toolCtx?.cwd ?? process.cwd();
535
+ return [isAbsolutePath(raw) ? raw : resolvePath(cwd, raw)];
536
+ }
537
+ // Array path args (e.g. GenerateImage `referenceImages`, GenerateVideo
538
+ // `images`): enforce EVERY element. Without this an array yielded zero
539
+ // targets, so out-of-workspace reads bypassed the path-policy "ask" gate
540
+ // that Read/Write enforce. http(s) URLs aren't file reads → skip them.
541
+ // Relative paths resolve against ctx.cwd (the workspace) before
542
+ // classification, like the apply_patch branch — otherwise classifyPath's
543
+ // process.cwd()-based resolution would mis-place an in-workspace relative
544
+ // path as "outside" and over-prompt. Non-string / empty elements skipped.
545
+ if (Array.isArray(raw)) {
546
+ const cwd = this.toolCtx?.cwd ?? process.cwd();
547
+ const paths = raw
548
+ .filter((v) => typeof v === "string" && v.length > 0)
549
+ .filter((v) => !/^https?:\/\//i.test(v))
550
+ .map((v) => (isAbsolutePath(v) ? v : resolvePath(cwd, v)));
551
+ if (paths.length > 0)
552
+ return paths;
553
+ }
554
+ if (policy.defaultToCwd && this.toolCtx?.cwd)
555
+ return [this.toolCtx.cwd];
556
+ return [];
557
+ }
558
+ const rawPatch = args[policy.arg];
559
+ if (typeof rawPatch !== "string" || rawPatch.length === 0)
560
+ return [];
561
+ try {
562
+ const parsed = parsePatch(rawPatch, "lenient");
563
+ const cwd = this.toolCtx?.cwd ?? process.cwd();
564
+ const targets = [];
565
+ for (const hunk of parsed.hunks) {
566
+ targets.push(resolvePath(cwd, hunk.path));
567
+ if (hunk.kind === "update" && hunk.movePath) {
568
+ targets.push(resolvePath(cwd, hunk.movePath));
569
+ }
570
+ }
571
+ return targets;
572
+ }
573
+ catch (err) {
574
+ return `Error: ${err.message}`;
467
575
  }
468
- return false;
469
576
  }
470
577
  /**
471
578
  * Convert tool results into Message entries for the transcript.
@@ -16,7 +16,7 @@
16
16
  *
17
17
  * Everything decays naturally on any write/Bash/AskUser tool (state reset).
18
18
  */
19
- const READ_ONLY_TOOLS = new Set(["Read", "Grep", "Glob", "WebFetch", "WebSearch", "ToolSearch"]);
19
+ import { READ_ONLY_TOOLS } from "./plan-mode-allowlist.js";
20
20
  const READ_BUDGET = 3;
21
21
  const SILENT_TURN_BUDGET = 3;
22
22
  const DEDUPE_OFFSET_BUCKET = 50;
@@ -6,6 +6,36 @@
6
6
  import type { Tool as McpTool } from "@modelcontextprotocol/sdk/types.js";
7
7
  import type { MCPServerConfig, RegisteredTool } from "../types.js";
8
8
  import { ToolRegistry } from "./registry.js";
9
+ /**
10
+ * Read a required secret from `process.env` by NAME (Codex-style env-secret
11
+ * handling — the value is never persisted in MCP config). A referenced env var
12
+ * that is undefined OR empty string is treated as missing so the connection
13
+ * fails with a clear, actionable error naming the server, the config field,
14
+ * and the env var.
15
+ */
16
+ export declare function readRequiredEnv(serverName: string, field: string, envName: string): string;
17
+ /**
18
+ * Build the spawned stdio server's environment. Priority (lowest → highest):
19
+ * a minimal inherited allowlist < forwarded `envVars` (read from process.env by
20
+ * name) < explicit plaintext `config.env`. Returns `undefined` when neither
21
+ * `env` nor `envVars` is present, preserving the old "inherit nothing extra"
22
+ * behavior (transport gets `env: undefined`). Pure + exported for unit testing.
23
+ */
24
+ export declare function buildStdioEnv(serverName: string, config: MCPServerConfig): Record<string, string> | undefined;
25
+ /**
26
+ * Build the HTTP transport's request headers. Static `config.headers` form the
27
+ * base; env-sourced secrets (`bearerTokenEnvVar`, `envHeaders`) layer on top
28
+ * and win on conflict. Pure + exported for unit testing.
29
+ */
30
+ export declare function buildHttpHeaders(serverName: string, config: MCPServerConfig, resolveCredential?: (id: string) => string | undefined): Record<string, string>;
31
+ /**
32
+ * Infer the transport when the config doesn't name one: a url-only entry is
33
+ * HTTP, everything else stdio. This is the CC `.mcp.json` convention —
34
+ * plugin-bundled servers commonly write just `{ "url": "..." }`, and the old
35
+ * blind `?? "stdio"` default then failed them with "command is required for
36
+ * stdio transport" despite a perfectly good url. Pure + exported for testing.
37
+ */
38
+ export declare function inferTransportType(config: MCPServerConfig): NonNullable<MCPServerConfig["transport"]>;
9
39
  /**
10
40
  * Persist an MCP-returned image to disk and return the textual
11
41
  * reference the LLM should see. Images larger than
@@ -27,6 +57,8 @@ export declare class MCPManager {
27
57
  private readonly toolRegistry;
28
58
  private static instance;
29
59
  private connections;
60
+ private registeredToolsByServer;
61
+ private desiredServerNames;
30
62
  /**
31
63
  * In-flight connect()s keyed by server name. When the broadcast config
32
64
  * reload (server.ts forEachSession → every session's refreshRuntimeConfig)
@@ -39,12 +71,17 @@ export declare class MCPManager {
39
71
  * connect can be retried later.
40
72
  */
41
73
  private connecting;
74
+ /** Per-owner (engine) desired server sets — see reconcile()'s shared-pool note. */
75
+ private desiredByOwner;
42
76
  constructor(toolRegistry: ToolRegistry);
43
77
  static getInstance(): MCPManager;
44
78
  /**
45
79
  * Connect to all configured MCP servers and register their tools.
46
80
  */
47
- connectAll(servers: Record<string, MCPServerConfig>): Promise<void>;
81
+ connectAll(servers: Record<string, MCPServerConfig>, owner?: unknown): Promise<void>;
82
+ reconcile(servers: Record<string, MCPServerConfig>, owner?: unknown): Promise<void>;
83
+ /** Union of every registered owner's desired set; null when none registered. */
84
+ private unionDesired;
48
85
  /**
49
86
  * Connect to a single MCP server.
50
87
  *
@@ -68,6 +105,7 @@ export declare class MCPManager {
68
105
  * Disconnect all MCP servers.
69
106
  */
70
107
  disconnectAll(): Promise<void>;
108
+ disconnect(name: string): Promise<void>;
71
109
  /**
72
110
  * List connected servers.
73
111
  */
@@ -75,11 +113,11 @@ export declare class MCPManager {
75
113
  /**
76
114
  * Call a tool on a specific MCP server.
77
115
  */
78
- callTool(serverName: string, toolName: string, args: Record<string, unknown>): Promise<unknown>;
116
+ callTool(serverName: string, toolName: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<unknown>;
79
117
  /**
80
118
  * List resources from MCP servers.
81
119
  */
82
- listResources(serverName?: string): Promise<Array<{
120
+ listResources(serverName?: string, signal?: AbortSignal): Promise<Array<{
83
121
  uri: string;
84
122
  name: string;
85
123
  description?: string;
@@ -87,5 +125,5 @@ export declare class MCPManager {
87
125
  /**
88
126
  * Read a resource from an MCP server.
89
127
  */
90
- readResource(serverName: string, uri: string): Promise<string>;
128
+ readResource(serverName: string, uri: string, signal?: AbortSignal): Promise<string>;
91
129
  }