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

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 (387) 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 +56 -0
  45. package/dist/context/compaction.js +186 -0
  46. package/dist/context/manager.js +25 -4
  47. package/dist/cost-tracker.js +5 -61
  48. package/dist/credentials/cipher.d.ts +49 -0
  49. package/dist/credentials/cipher.js +45 -0
  50. package/dist/credentials/cookie-jar.d.ts +24 -0
  51. package/dist/credentials/cookie-jar.js +40 -0
  52. package/dist/credentials/index.d.ts +7 -0
  53. package/dist/credentials/index.js +5 -0
  54. package/dist/credentials/inject-credential-tool.d.ts +20 -0
  55. package/dist/credentials/inject-credential-tool.js +130 -0
  56. package/dist/credentials/store.d.ts +72 -0
  57. package/dist/credentials/store.js +184 -0
  58. package/dist/credentials/types.d.ts +56 -0
  59. package/dist/credentials/use-credential-tool.d.ts +29 -0
  60. package/dist/credentials/use-credential-tool.js +205 -0
  61. package/dist/credentials/use-gate.d.ts +56 -0
  62. package/dist/credentials/use-gate.js +52 -0
  63. package/dist/data/model-metadata.d.ts +77 -0
  64. package/dist/data/model-metadata.js +56 -0
  65. package/dist/data/model-metadata.json +216 -0
  66. package/dist/data/openrouter-models.d.ts +18 -7
  67. package/dist/data/openrouter-models.js +35 -8
  68. package/dist/engine/aux-key.d.ts +10 -0
  69. package/dist/engine/aux-key.js +11 -0
  70. package/dist/engine/dynamic-tool-defs.d.ts +19 -0
  71. package/dist/engine/dynamic-tool-defs.js +36 -0
  72. package/dist/engine/engine.d.ts +267 -138
  73. package/dist/engine/engine.js +957 -191
  74. package/dist/engine/friendly-error.d.ts +18 -0
  75. package/dist/engine/friendly-error.js +63 -0
  76. package/dist/engine/goal.d.ts +145 -0
  77. package/dist/engine/goal.js +144 -0
  78. package/dist/engine/image-policy.d.ts +13 -0
  79. package/dist/engine/image-policy.js +24 -0
  80. package/dist/engine/model-connections-pool.d.ts +17 -0
  81. package/dist/engine/model-connections-pool.js +66 -0
  82. package/dist/engine/model-facade.d.ts +10 -0
  83. package/dist/engine/model-facade.js +25 -0
  84. package/dist/engine/patch-orphaned-tools.js +3 -0
  85. package/dist/engine/resolve-llm-config.d.ts +16 -0
  86. package/dist/engine/resolve-llm-config.js +44 -0
  87. package/dist/engine/runtime.js +2 -1
  88. package/dist/engine/sandbox-cache-key.d.ts +10 -0
  89. package/dist/engine/sandbox-cache-key.js +9 -0
  90. package/dist/engine/sandbox-config.d.ts +31 -0
  91. package/dist/engine/sandbox-config.js +38 -0
  92. package/dist/engine/session-usage.d.ts +19 -0
  93. package/dist/engine/session-usage.js +25 -0
  94. package/dist/engine/steer-queue.d.ts +32 -0
  95. package/dist/engine/steer-queue.js +26 -0
  96. package/dist/engine/streaming-tool-queue.d.ts +12 -0
  97. package/dist/engine/streaming-tool-queue.js +50 -10
  98. package/dist/engine/turn-loop.d.ts +67 -3
  99. package/dist/engine/turn-loop.js +292 -41
  100. package/dist/engine/types.d.ts +175 -0
  101. package/dist/engine/types.js +13 -0
  102. package/dist/external-agents/config.d.ts +2 -0
  103. package/dist/external-agents/config.js +15 -0
  104. package/dist/external-agents/types.d.ts +31 -0
  105. package/dist/external-agents/types.js +1 -0
  106. package/dist/git/utils.js +11 -6
  107. package/dist/git/worktree.d.ts +48 -0
  108. package/dist/git/worktree.js +86 -10
  109. package/dist/hooks/goal-stop-hook.d.ts +28 -0
  110. package/dist/hooks/goal-stop-hook.js +186 -9
  111. package/dist/hooks/registry.d.ts +8 -0
  112. package/dist/hooks/registry.js +19 -0
  113. package/dist/hooks/shell-runner.js +10 -21
  114. package/dist/index.d.ts +49 -6
  115. package/dist/index.js +60 -4
  116. package/dist/llm/capabilities/param-specs.d.ts +14 -0
  117. package/dist/llm/capabilities/param-specs.js +62 -0
  118. package/dist/llm/capabilities/rules.js +4 -0
  119. package/dist/llm/capabilities/types.d.ts +10 -0
  120. package/dist/llm/client-base.d.ts +28 -1
  121. package/dist/llm/client-base.js +119 -13
  122. package/dist/llm/model-cache.js +4 -2
  123. package/dist/llm/model-pool.d.ts +14 -0
  124. package/dist/llm/model-pool.js +13 -0
  125. package/dist/llm/provider-auth.d.ts +41 -0
  126. package/dist/llm/provider-auth.js +76 -0
  127. package/dist/llm/provider-catalog.d.ts +4 -0
  128. package/dist/llm/providers/anthropic.js +64 -14
  129. package/dist/llm/providers/openai.d.ts +36 -0
  130. package/dist/llm/providers/openai.js +257 -51
  131. package/dist/llm/reasoning-setting.d.ts +3 -3
  132. package/dist/llm/reasoning-setting.js +9 -1
  133. package/dist/llm/stream-watchdog.js +5 -1
  134. package/dist/llm/token-counter.js +9 -2
  135. package/dist/llm/types.d.ts +4 -0
  136. package/dist/logging/sanitize-messages.js +22 -0
  137. package/dist/lsp/manager.d.ts +1 -1
  138. package/dist/lsp/manager.js +40 -10
  139. package/dist/model-catalog/builtin.d.ts +12 -0
  140. package/dist/model-catalog/builtin.js +407 -0
  141. package/dist/model-catalog/gen-connections.d.ts +20 -0
  142. package/dist/model-catalog/gen-connections.js +28 -0
  143. package/dist/model-catalog/index.d.ts +41 -0
  144. package/dist/model-catalog/index.js +90 -0
  145. package/dist/model-catalog/params.d.ts +20 -0
  146. package/dist/model-catalog/params.js +45 -0
  147. package/dist/model-catalog/resolve.d.ts +48 -0
  148. package/dist/model-catalog/resolve.js +33 -0
  149. package/dist/model-catalog/save-entry.d.ts +32 -0
  150. package/dist/model-catalog/save-entry.js +104 -0
  151. package/dist/model-catalog/types.d.ts +561 -0
  152. package/dist/model-catalog/types.js +93 -0
  153. package/dist/model-catalog/upsert.d.ts +9 -0
  154. package/dist/model-catalog/upsert.js +8 -0
  155. package/dist/onboarding.d.ts +12 -82
  156. package/dist/onboarding.js +61 -326
  157. package/dist/plugins/gitOps.d.ts +19 -0
  158. package/dist/plugins/gitOps.js +73 -4
  159. package/dist/plugins/installer/checkUpdate.d.ts +16 -0
  160. package/dist/plugins/installer/checkUpdate.js +32 -0
  161. package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
  162. package/dist/plugins/installer/codex/convertCommands.js +46 -0
  163. package/dist/plugins/installer/codex/convertMcp.d.ts +5 -2
  164. package/dist/plugins/installer/codex/convertMcp.js +45 -5
  165. package/dist/plugins/installer/install.js +25 -1
  166. package/dist/plugins/installer/installFromArchive.d.ts +43 -0
  167. package/dist/plugins/installer/installFromArchive.js +134 -0
  168. package/dist/plugins/installer/installFromSource.js +8 -2
  169. package/dist/plugins/installer/loadPluginAgents.js +6 -2
  170. package/dist/plugins/installer/loadPluginMcp.d.ts +9 -2
  171. package/dist/plugins/installer/loadPluginMcp.js +35 -2
  172. package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
  173. package/dist/plugins/installer/pruneDisabled.js +73 -0
  174. package/dist/plugins/installer/types.d.ts +5 -2
  175. package/dist/plugins/installer/types.js +1 -0
  176. package/dist/plugins/installer/uninstall.js +4 -0
  177. package/dist/plugins/installer/unzip.d.ts +14 -0
  178. package/dist/plugins/installer/unzip.js +82 -0
  179. package/dist/plugins/installer/update.d.ts +14 -0
  180. package/dist/plugins/installer/update.js +53 -21
  181. package/dist/plugins/loadPluginHooks.d.ts +47 -1
  182. package/dist/plugins/loadPluginHooks.js +73 -1
  183. package/dist/plugins/marketplaceManager.d.ts +7 -0
  184. package/dist/plugins/marketplaceManager.js +20 -0
  185. package/dist/plugins/pluginCommandHook.js +4 -18
  186. package/dist/plugins/pluginContent.d.ts +30 -0
  187. package/dist/plugins/pluginContent.js +83 -0
  188. package/dist/plugins/pluginInstaller.d.ts +13 -0
  189. package/dist/plugins/pluginInstaller.js +42 -8
  190. package/dist/plugins/schemas.js +1 -0
  191. package/dist/plugins/types.d.ts +6 -0
  192. package/dist/preset/index.d.ts +7 -1
  193. package/dist/preset/index.js +96 -6
  194. package/dist/product/types.d.ts +1 -1
  195. package/dist/prompt/composer.d.ts +27 -0
  196. package/dist/prompt/composer.js +67 -21
  197. package/dist/prompt/instruction-scanner.js +5 -3
  198. package/dist/prompt/section-loader.js +1 -0
  199. package/dist/prompt/sections/base.md +1 -0
  200. package/dist/prompt/sections/browser.md +10 -0
  201. package/dist/prompt/sections/coding.md +4 -0
  202. package/dist/protocol/chat-session-manager.d.ts +8 -2
  203. package/dist/protocol/chat-session-manager.js +36 -0
  204. package/dist/protocol/chat-session.d.ts +65 -0
  205. package/dist/protocol/chat-session.js +94 -2
  206. package/dist/protocol/client.d.ts +27 -0
  207. package/dist/protocol/client.js +38 -0
  208. package/dist/protocol/server.d.ts +112 -0
  209. package/dist/protocol/server.js +586 -16
  210. package/dist/protocol/transport.js +3 -2
  211. package/dist/protocol/types.d.ts +46 -0
  212. package/dist/protocol/types.js +16 -0
  213. package/dist/quota/credentials.d.ts +3 -0
  214. package/dist/quota/credentials.js +80 -0
  215. package/dist/quota/index.d.ts +36 -0
  216. package/dist/quota/index.js +155 -0
  217. package/dist/quota/types.d.ts +48 -0
  218. package/dist/quota/types.js +13 -0
  219. package/dist/review/review-prompt.d.ts +28 -0
  220. package/dist/review/review-prompt.js +81 -0
  221. package/dist/run/FileRunStore.js +8 -3
  222. package/dist/run/RunApprovalBackend.js +25 -5
  223. package/dist/run/RunManager.d.ts +12 -0
  224. package/dist/run/RunManager.js +35 -0
  225. package/dist/run/factory.d.ts +1 -1
  226. package/dist/runtime/background-shell.d.ts +139 -0
  227. package/dist/runtime/background-shell.js +495 -0
  228. package/dist/runtime/output-clean.d.ts +24 -0
  229. package/dist/runtime/output-clean.js +41 -0
  230. package/dist/runtime/ring-file.d.ts +64 -0
  231. package/dist/runtime/ring-file.js +174 -0
  232. package/dist/runtime/safe-spawn.js +15 -34
  233. package/dist/runtime/spawn-common.d.ts +148 -0
  234. package/dist/runtime/spawn-common.js +303 -0
  235. package/dist/runtime/truncate-output.d.ts +22 -0
  236. package/dist/runtime/truncate-output.js +49 -0
  237. package/dist/runtime/utf8-cut.d.ts +11 -0
  238. package/dist/runtime/utf8-cut.js +23 -0
  239. package/dist/services/auto-dream.d.ts +4 -0
  240. package/dist/services/auto-dream.js +26 -26
  241. package/dist/services/diagnostics.d.ts +1 -2
  242. package/dist/services/diagnostics.js +12 -7
  243. package/dist/services/extract-memories.d.ts +14 -1
  244. package/dist/services/extract-memories.js +45 -6
  245. package/dist/services/memory-orchestrator.d.ts +21 -0
  246. package/dist/services/memory-orchestrator.js +125 -50
  247. package/dist/services/session-memory.js +24 -12
  248. package/dist/session/file-history.d.ts +124 -1
  249. package/dist/session/file-history.js +222 -6
  250. package/dist/session/memory.d.ts +116 -2
  251. package/dist/session/memory.js +250 -28
  252. package/dist/session/session-manager.d.ts +40 -0
  253. package/dist/session/session-manager.js +113 -3
  254. package/dist/session/simple-diff.d.ts +23 -0
  255. package/dist/session/simple-diff.js +84 -0
  256. package/dist/session/transcript.d.ts +25 -1
  257. package/dist/session/transcript.js +35 -2
  258. package/dist/session/undo-target.d.ts +67 -0
  259. package/dist/session/undo-target.js +144 -0
  260. package/dist/settings/disk-defaults.d.ts +9 -2
  261. package/dist/settings/disk-defaults.js +11 -2
  262. package/dist/settings/feature-flags.d.ts +64 -0
  263. package/dist/settings/feature-flags.js +61 -0
  264. package/dist/settings/manager.d.ts +68 -1
  265. package/dist/settings/manager.js +266 -29
  266. package/dist/settings/migrate-config.d.ts +45 -0
  267. package/dist/settings/migrate-config.js +125 -0
  268. package/dist/settings/schema-export.d.ts +25 -0
  269. package/dist/settings/schema-export.js +38 -0
  270. package/dist/settings/schema.d.ts +1186 -771
  271. package/dist/settings/schema.js +268 -97
  272. package/dist/skills/scanner.d.ts +9 -0
  273. package/dist/skills/scanner.js +30 -2
  274. package/dist/stt/resolve-transcribe.d.ts +31 -0
  275. package/dist/stt/resolve-transcribe.js +108 -0
  276. package/dist/stt/transcribe.d.ts +51 -0
  277. package/dist/stt/transcribe.js +65 -0
  278. package/dist/tool-system/browser-bridge.d.ts +226 -0
  279. package/dist/tool-system/browser-bridge.js +163 -0
  280. package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
  281. package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
  282. package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
  283. package/dist/tool-system/builtin/agent-notifications.js +9 -3
  284. package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
  285. package/dist/tool-system/builtin/agent-output-file.js +72 -0
  286. package/dist/tool-system/builtin/agent-registry.d.ts +12 -0
  287. package/dist/tool-system/builtin/agent-registry.js +8 -0
  288. package/dist/tool-system/builtin/agent.d.ts +21 -1
  289. package/dist/tool-system/builtin/agent.js +489 -42
  290. package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
  291. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
  292. package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
  293. package/dist/tool-system/builtin/apply-patch/index.js +0 -15
  294. package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
  295. package/dist/tool-system/builtin/background-jobs.js +124 -0
  296. package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
  297. package/dist/tool-system/builtin/background-shell-tools.js +108 -0
  298. package/dist/tool-system/builtin/background-work.d.ts +67 -0
  299. package/dist/tool-system/builtin/background-work.js +86 -0
  300. package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
  301. package/dist/tool-system/builtin/bash-output-style.js +40 -0
  302. package/dist/tool-system/builtin/bash.d.ts +5 -2
  303. package/dist/tool-system/builtin/bash.js +98 -62
  304. package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
  305. package/dist/tool-system/builtin/browser-tools.js +312 -0
  306. package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
  307. package/dist/tool-system/builtin/cancel-goal.js +64 -0
  308. package/dist/tool-system/builtin/check-quota.d.ts +15 -0
  309. package/dist/tool-system/builtin/check-quota.js +34 -0
  310. package/dist/tool-system/builtin/config.js +7 -0
  311. package/dist/tool-system/builtin/cron.d.ts +7 -0
  312. package/dist/tool-system/builtin/cron.js +55 -3
  313. package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
  314. package/dist/tool-system/builtin/drive-claude-code.js +157 -0
  315. package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
  316. package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
  317. package/dist/tool-system/builtin/edit.js +20 -16
  318. package/dist/tool-system/builtin/eol.d.ts +29 -0
  319. package/dist/tool-system/builtin/eol.js +37 -0
  320. package/dist/tool-system/builtin/file-cache.d.ts +6 -0
  321. package/dist/tool-system/builtin/file-cache.js +8 -0
  322. package/dist/tool-system/builtin/generate-image.d.ts +35 -0
  323. package/dist/tool-system/builtin/generate-image.js +278 -50
  324. package/dist/tool-system/builtin/generate-video.d.ts +55 -0
  325. package/dist/tool-system/builtin/generate-video.js +361 -0
  326. package/dist/tool-system/builtin/glob.js +0 -7
  327. package/dist/tool-system/builtin/grep.js +6 -8
  328. package/dist/tool-system/builtin/image-providers.d.ts +86 -0
  329. package/dist/tool-system/builtin/image-providers.js +190 -0
  330. package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
  331. package/dist/tool-system/builtin/image-uploader.js +74 -0
  332. package/dist/tool-system/builtin/index.d.ts +7 -1
  333. package/dist/tool-system/builtin/index.js +249 -25
  334. package/dist/tool-system/builtin/mcp-tools.js +23 -3
  335. package/dist/tool-system/builtin/memory.js +45 -7
  336. package/dist/tool-system/builtin/notebook-edit.js +0 -7
  337. package/dist/tool-system/builtin/powershell.js +4 -1
  338. package/dist/tool-system/builtin/read.js +10 -10
  339. package/dist/tool-system/builtin/repl.js +4 -1
  340. package/dist/tool-system/builtin/skill.js +9 -0
  341. package/dist/tool-system/builtin/sleep.js +3 -2
  342. package/dist/tool-system/builtin/tool-search.js +25 -7
  343. package/dist/tool-system/builtin/video-providers.d.ts +154 -0
  344. package/dist/tool-system/builtin/video-providers.js +235 -0
  345. package/dist/tool-system/builtin/web-fetch.js +12 -2
  346. package/dist/tool-system/builtin/web-search.js +21 -7
  347. package/dist/tool-system/builtin/worktree.d.ts +2 -1
  348. package/dist/tool-system/builtin/worktree.js +31 -4
  349. package/dist/tool-system/builtin/write.js +0 -6
  350. package/dist/tool-system/context.d.ts +154 -6
  351. package/dist/tool-system/executor.d.ts +3 -1
  352. package/dist/tool-system/executor.js +172 -88
  353. package/dist/tool-system/investigation-guard.js +1 -1
  354. package/dist/tool-system/mcp-manager.d.ts +42 -4
  355. package/dist/tool-system/mcp-manager.js +186 -20
  356. package/dist/tool-system/path-policy.d.ts +5 -0
  357. package/dist/tool-system/path-policy.js +307 -8
  358. package/dist/tool-system/permission.d.ts +36 -1
  359. package/dist/tool-system/permission.js +281 -69
  360. package/dist/tool-system/plan-mode-allowlist.d.ts +13 -2
  361. package/dist/tool-system/plan-mode-allowlist.js +24 -2
  362. package/dist/tool-system/registry.d.ts +1 -0
  363. package/dist/tool-system/registry.js +16 -2
  364. package/dist/tool-system/sandbox/index.d.ts +8 -0
  365. package/dist/tool-system/sandbox/index.js +7 -2
  366. package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
  367. package/dist/tool-system/validate-tool-metadata.js +63 -0
  368. package/dist/types.d.ts +217 -6
  369. package/dist/updater.js +20 -9
  370. package/dist/utils/envUtils.d.ts +0 -9
  371. package/dist/utils/envUtils.js +3 -28
  372. package/dist/utils/exec.d.ts +40 -0
  373. package/dist/utils/exec.js +144 -0
  374. package/dist/utils/json.d.ts +12 -0
  375. package/dist/utils/json.js +92 -0
  376. package/dist/utils/theme.d.ts +1 -1
  377. package/dist/utils/theme.js +1 -1
  378. package/dist/utils/toolDisplay.js +0 -1
  379. package/package.json +13 -7
  380. package/dist/agent/coordinator.d.ts +0 -49
  381. package/dist/agent/coordinator.js +0 -77
  382. package/dist/settings/manager.test.js +0 -73
  383. package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
  384. package/dist/tool-system/builtin/remote-trigger.js +0 -54
  385. package/dist/tool-system/builtin/send-message.d.ts +0 -6
  386. package/dist/tool-system/builtin/send-message.js +0 -47
  387. /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Public Engine configuration & result types.
3
+ *
4
+ * Extracted out of engine/engine.ts so consumers (protocol server, run
5
+ * factory, product layer, settings/disk-defaults, SDK index) can import the
6
+ * Engine's *types* without importing the 3000-line Engine *implementation* —
7
+ * which would pull the whole engine module (and its transitive deps) into a
8
+ * type-only consumer and make engine.ts a "type water tower". engine.ts
9
+ * re-exports these names, so existing `import { EngineConfig } from
10
+ * "../engine/engine.js"` callers keep working; new callers should prefer
11
+ * `engine/types.js`.
12
+ */
13
+ import type { ClientDefaults, LLMConfig, SessionOrigin, TerminalReason, TokenUsage } from "../types.js";
14
+ import type { AgentPresetName } from "../preset/index.js";
15
+ import type { GoalConfig } from "./goal.js";
16
+ import type { ApprovalBackend } from "../tool-system/permission.js";
17
+ import type { SandboxConfig } from "../tool-system/sandbox/index.js";
18
+ import type { CostStateStore } from "./cost-store.js";
19
+ import type { AskUserFn } from "../tool-system/builtin/ask-user.js";
20
+ import type { SettingsScope } from "../settings/manager.js";
21
+ import type { EngineRuntime } from "./runtime.js";
22
+ import type { HookEventName } from "../hooks/events.js";
23
+ import type { HookHandler } from "../hooks/registry.js";
24
+ export interface EngineConfig {
25
+ llm: LLMConfig;
26
+ /**
27
+ * Cross-model runtime knobs (temperature/timeout/retryMaxAttempts/imageDetail).
28
+ * Stays stable across hot model switches — only `llm` rotates. When omitted,
29
+ * Engine reads settings.json (model.temperature, images.detail) on construction.
30
+ */
31
+ clientDefaults?: ClientDefaults;
32
+ cwd?: string;
33
+ maxTurns?: number;
34
+ /**
35
+ * Override the goal-mode consecutive-stop-block cap (TODO 3.1). Falls back to
36
+ * goal.maxStopBlocks, then GOAL_DEFAULT_MAX_STOP_BLOCKS. See resolveMaxStopBlocks.
37
+ */
38
+ maxStopBlocks?: number;
39
+ maxToolCallsPerTurn?: number;
40
+ permissionMode?: "default" | "acceptEdits" | "dontAsk" | "bypassPermissions" | "auto" | "plan";
41
+ preset?: AgentPresetName;
42
+ enabledBuiltinTools?: string[];
43
+ disabledBuiltinTools?: string[];
44
+ /**
45
+ * When false, `Bash(run_in_background=true)` is rejected and the
46
+ * background-shell tools are disabled (design §5.5). Set false by
47
+ * unattended automation/cron hosts — no one is there to reap a long-lived
48
+ * dev server. Defaults to true (interactive sessions allow it).
49
+ */
50
+ allowBackgroundShells?: boolean;
51
+ customSystemPrompt?: string;
52
+ appendSystemPrompt?: string;
53
+ responseLanguage?: string;
54
+ userProfile?: string;
55
+ instructions?: {
56
+ compatClaude?: boolean;
57
+ compatCodex?: boolean;
58
+ };
59
+ /**
60
+ * Goal mode: when set, the engine registers a GoalStopHook on `on_stop`
61
+ * so the turn loop runs until the session model judges this goal met
62
+ * (bounded by maxStopBlocks + maxTurns). Orthogonal to permissionMode —
63
+ * the desktop UI defaults permission to bypass when a goal is set, but
64
+ * the engine treats the two independently.
65
+ *
66
+ * Accepts a raw string (objective only) or a full GoalConfig (objective +
67
+ * optional token/time budgets); the run boundary normalizes it once.
68
+ */
69
+ goal?: string | GoalConfig;
70
+ sessionStorageDir?: string;
71
+ maxContextTokens?: number;
72
+ approvalBackend?: ApprovalBackend;
73
+ hooks?: EngineHookConfig[];
74
+ askUser?: AskUserFn;
75
+ /** Browser automation bridge (browser_* tools). Wired by the host (desktop)
76
+ * after construction via setBrowserBridge. Undefined → tools degrade. */
77
+ browserBridge?: import("../tool-system/browser-bridge.js").BrowserBridge;
78
+ /** Inject a cookie credential into the built-in browser (InjectCredential
79
+ * tool). Wired by the host after construction via setInjectCredential.
80
+ * Undefined → the tool degrades with a clear "no browser" error. */
81
+ injectCredentialToBrowser?: import("../tool-system/context.js").InjectCredentialFn;
82
+ mcpServers?: Record<string, import("../types.js").MCPServerConfig>;
83
+ /**
84
+ * Optional opaque store for per-session cost/usage state. When provided,
85
+ * Engine calls `restore()` on session resume and `serialize()` at the end
86
+ * of each `run()` and stores the blob on the session. Without this the
87
+ * Engine doesn't persist cost state — it's a UI concern.
88
+ */
89
+ costStore?: CostStateStore;
90
+ /**
91
+ * True when the Engine runs in a no-UI / one-shot context (e.g. the `run`
92
+ * command). Currently controls InvestigationGuard soft-mode: in headless
93
+ * we never hard-block a tool call because there is no human to retry.
94
+ * Defaults to false.
95
+ */
96
+ headless?: boolean;
97
+ /**
98
+ * When true, treat like headless for InvestigationGuard soft-mode — a
99
+ * read-only session should never be hard-blocked for repeated reads.
100
+ */
101
+ readOnlySession?: boolean;
102
+ /**
103
+ * Sandbox configuration for shell-tool execution. When omitted, headless
104
+ * runs default to "auto" (Seatbelt on macOS / bwrap on Linux when
105
+ * available) and interactive runs default to "off" because a human is in
106
+ * the loop to approve commands.
107
+ */
108
+ sandbox?: SandboxConfig;
109
+ /**
110
+ * True when this Engine is itself a sub-agent (spawned by another
111
+ * Engine's Agent tool). Threaded into ToolContext so the Agent tool can
112
+ * refuse re-entry — defense in depth against the tool-list strip in
113
+ * spawn(): if a tool registry regression ever leaks Agent into a child's
114
+ * pool, the runtime check still blocks the call.
115
+ */
116
+ isSubAgent?: boolean;
117
+ /**
118
+ * Hard skill isolation for a sub-agent. When set, this Engine only lists
119
+ * and invokes skills in this allowlist (applied on top of disabledSkills).
120
+ * Set by the spawn() closure from the role definition's `skills:`
121
+ * frontmatter. Undefined → inherit the parent's full skill pool.
122
+ */
123
+ skillAllowlist?: string[];
124
+ /**
125
+ * Host/context that created this Engine's sessions — written to state.json's
126
+ * `origin` so the desktop disk-rebuild can filter the sidebar (desktop +
127
+ * automation shown; tui hidden). Sub-agents override to "subagent".
128
+ */
129
+ origin?: SessionOrigin;
130
+ /**
131
+ * Optional shared EngineRuntime providing pre-constructed shared resources
132
+ * (modelPool, toolRegistry, etc.). When provided, Engine uses these instead
133
+ * of constructing its own. Existing callers that omit this field continue to
134
+ * work unchanged — T11 will migrate them.
135
+ */
136
+ runtime?: EngineRuntime;
137
+ /**
138
+ * Which disk config layers this Engine may read. Defaults to 'project' —
139
+ * the safe default: a library/SDK embedding never silently inherits the
140
+ * host user's personal ~/.code-shell config (keys, models, MCP, hooks); it
141
+ * only reads the project-level ${cwd}/.code-shell that travels with a repo.
142
+ * Host-terminal entrypoints (TUI/desktop/CLI) pass 'full' to restore the
143
+ * managed+user+project+local behavior. 'isolated' reads no disk at all.
144
+ * Subagents inherit the parent Engine's scope. See SettingsScope.
145
+ */
146
+ settingsScope?: SettingsScope;
147
+ /**
148
+ * Workspace trust for the project directory (`cwd`). When explicitly `false`,
149
+ * dangerous fields committed into the project's own
150
+ * `.code-shell/settings.{json,local.json}` (permissions / env / hooks /
151
+ * mcpServers / localEnvironment) are stripped before merge, so a cloned
152
+ * malicious repo can't self-authorize permission rules, inject env
153
+ * (BASH_ENV/LD_PRELOAD), register hooks, or auto-connect MCP servers. Safe
154
+ * fields still apply. The user/managed layers are never gated.
155
+ *
156
+ * Undefined / true keeps the pre-trust behavior (fully trusted) so embedders
157
+ * that don't wire a trust store are unaffected. Host terminals (desktop) pass
158
+ * the real decision from their per-directory trust store; when it's "unknown"
159
+ * they should pass `false` (fail-closed) until the user grants trust.
160
+ */
161
+ projectTrusted?: boolean;
162
+ }
163
+ export interface EngineHookConfig {
164
+ event: HookEventName;
165
+ handler: HookHandler;
166
+ priority?: number;
167
+ name?: string;
168
+ }
169
+ export interface EngineResult {
170
+ text: string;
171
+ reason: TerminalReason;
172
+ sessionId: string;
173
+ turnCount: number;
174
+ usage: TokenUsage;
175
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Public Engine configuration & result types.
3
+ *
4
+ * Extracted out of engine/engine.ts so consumers (protocol server, run
5
+ * factory, product layer, settings/disk-defaults, SDK index) can import the
6
+ * Engine's *types* without importing the 3000-line Engine *implementation* —
7
+ * which would pull the whole engine module (and its transitive deps) into a
8
+ * type-only consumer and make engine.ts a "type water tower". engine.ts
9
+ * re-exports these names, so existing `import { EngineConfig } from
10
+ * "../engine/engine.js"` callers keep working; new callers should prefer
11
+ * `engine/types.js`.
12
+ */
13
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { ExternalAgentsSettings, ResolvedExternalAgentsConfig } from "./types.js";
2
+ export declare function resolveExternalAgentConfig(settings: ExternalAgentsSettings | undefined): ResolvedExternalAgentsConfig;
@@ -0,0 +1,15 @@
1
+ export function resolveExternalAgentConfig(settings) {
2
+ return {
3
+ claudeCode: {
4
+ command: settings?.claudeCode?.command ?? "claude",
5
+ defaultMode: settings?.claudeCode?.defaultMode ?? "safe",
6
+ dangerousArgs: settings?.claudeCode?.dangerousArgs ?? [],
7
+ trustedWorkspaces: settings?.claudeCode?.trustedWorkspaces ?? [],
8
+ autoStartInTrustedWorkspaces: settings?.claudeCode?.autoStartInTrustedWorkspaces ?? false,
9
+ },
10
+ codex: {
11
+ command: settings?.codex?.command ?? "codex",
12
+ args: settings?.codex?.args ?? [],
13
+ },
14
+ };
15
+ }
@@ -0,0 +1,31 @@
1
+ export type ExternalAgentMode = "safe" | "dangerous";
2
+ export interface ClaudeCodeSettings {
3
+ command?: string;
4
+ defaultMode?: ExternalAgentMode;
5
+ dangerousArgs?: string[];
6
+ trustedWorkspaces?: string[];
7
+ autoStartInTrustedWorkspaces?: boolean;
8
+ }
9
+ export interface CodexSettings {
10
+ command?: string;
11
+ args?: string[];
12
+ }
13
+ export interface ExternalAgentsSettings {
14
+ claudeCode?: ClaudeCodeSettings;
15
+ codex?: CodexSettings;
16
+ }
17
+ export interface ResolvedClaudeCodeSettings {
18
+ command: string;
19
+ defaultMode: ExternalAgentMode;
20
+ dangerousArgs: string[];
21
+ trustedWorkspaces: string[];
22
+ autoStartInTrustedWorkspaces: boolean;
23
+ }
24
+ export interface ResolvedCodexSettings {
25
+ command: string;
26
+ args: string[];
27
+ }
28
+ export interface ResolvedExternalAgentsConfig {
29
+ claudeCode: ResolvedClaudeCodeSettings;
30
+ codex: ResolvedCodexSettings;
31
+ }
@@ -0,0 +1 @@
1
+ export {};
package/dist/git/utils.js CHANGED
@@ -9,13 +9,18 @@
9
9
  */
10
10
  import { execFileSync } from "node:child_process";
11
11
  import { parseGitLog } from "./parse-log.js";
12
+ import { resolveExecutable } from "../utils/exec.js";
13
+ // Resolve git/gh through PATH×PATHEXT on Windows so a .cmd/.exe shim is found
14
+ // (bare execFile doesn't walk PATHEXT). No-op on POSIX. See utils/exec.ts.
15
+ const GIT_BIN = resolveExecutable("git");
16
+ const GH_BIN = resolveExecutable("gh");
12
17
  /** Run git with an argv array and return its trimmed stdout. */
13
18
  function git(cwd, args, timeoutMs = 10000) {
14
- return execFileSync("git", args, { cwd, encoding: "utf-8", timeout: timeoutMs }).trim();
19
+ return execFileSync(GIT_BIN, args, { cwd, encoding: "utf-8", timeout: timeoutMs }).trim();
15
20
  }
16
21
  /** Run gh with an argv array and return its trimmed stdout. */
17
22
  function gh(cwd, args, timeoutMs = 10000) {
18
- return execFileSync("gh", args, { cwd, encoding: "utf-8", timeout: timeoutMs }).trim();
23
+ return execFileSync(GH_BIN, args, { cwd, encoding: "utf-8", timeout: timeoutMs }).trim();
19
24
  }
20
25
  export function isGitRepo(cwd) {
21
26
  try {
@@ -77,13 +82,13 @@ export function gitAdd(cwd, files = ["."]) {
77
82
  // `--` ensures a path starting with `-` cannot be parsed as a flag.
78
83
  // Each file is its own argv token, so spaces / quotes / non-ASCII pass
79
84
  // through verbatim with no shell parsing.
80
- execFileSync("git", ["add", "--", ...files], { cwd, timeout: 10000 });
85
+ execFileSync(GIT_BIN, ["add", "--", ...files], { cwd, timeout: 10000 });
81
86
  }
82
87
  export function gitCommit(cwd, message) {
83
88
  // Pre-fix this used `JSON.stringify(message)` which only happened to be
84
89
  // safe because JSON.stringify covers most shell metacharacters — but it's
85
90
  // not real escaping. The argv form is.
86
- return execFileSync("git", ["commit", "-m", message], {
91
+ return execFileSync(GIT_BIN, ["commit", "-m", message], {
87
92
  cwd,
88
93
  encoding: "utf-8",
89
94
  timeout: 30000,
@@ -110,11 +115,11 @@ export function gitCheckout(cwd, branch, create = false) {
110
115
  throw new Error(`refusing branch name that starts with '-': ${branch}`);
111
116
  }
112
117
  const args = create ? ["checkout", "-b", branch] : ["checkout", branch];
113
- execFileSync("git", args, { cwd, timeout: 10000 });
118
+ execFileSync(GIT_BIN, args, { cwd, timeout: 10000 });
114
119
  }
115
120
  export function ghAvailable() {
116
121
  try {
117
- execFileSync("gh", ["--version"], { encoding: "utf-8", timeout: 5000 });
122
+ execFileSync(GH_BIN, ["--version"], { encoding: "utf-8", timeout: 5000 });
118
123
  return true;
119
124
  }
120
125
  catch {
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Git worktree management — create/remove isolated worktrees for agents.
3
3
  */
4
+ import type { SandboxBackend } from "../tool-system/sandbox/index.js";
4
5
  export interface WorktreeSession {
5
6
  originalCwd: string;
6
7
  worktreePath: string;
@@ -10,6 +11,21 @@ export interface WorktreeSession {
10
11
  sessionId: string;
11
12
  createdAt: number;
12
13
  }
14
+ /** Per-platform setup/cleanup scripts (a project's localEnvironment). */
15
+ export interface PlatformScripts {
16
+ default?: string;
17
+ macos?: string;
18
+ linux?: string;
19
+ windows?: string;
20
+ }
21
+ /**
22
+ * Pick the setup/cleanup script for the running platform, falling back to
23
+ * `default`. Empty/whitespace-only scripts are treated as absent so a project
24
+ * can leave a platform key blank without spawning an empty shell. `platform`
25
+ * defaults to `process.platform` so callers usually omit it; tests pass a
26
+ * fixed value.
27
+ */
28
+ export declare function selectPlatformScript(scripts: PlatformScripts | undefined, platform?: NodeJS.Platform): string | undefined;
13
29
  /**
14
30
  * Validate worktree slug to prevent path traversal attacks.
15
31
  */
@@ -22,6 +38,38 @@ export declare function findGitRoot(cwd: string): string;
22
38
  * Create an isolated git worktree for an agent session.
23
39
  */
24
40
  export declare function createWorktree(cwd: string, slug: string, sessionId: string): WorktreeSession;
41
+ export interface WorktreeSetupResult {
42
+ /** True if no setup script was configured for this platform (nothing ran). */
43
+ skipped: boolean;
44
+ /** True if a script ran and exited 0. */
45
+ ok: boolean;
46
+ /** Combined stdout/stderr, for surfacing to the user on failure. */
47
+ output: string;
48
+ /** Exit code when a script ran; undefined when skipped. */
49
+ exitCode?: number | null;
50
+ }
51
+ /**
52
+ * Run a project's `localEnvironment.setupScripts` once, in the freshly-created
53
+ * worktree's root, right after `git worktree add`. This mirrors Codex's
54
+ * local-environment semantics: setup belongs to the *worktree* lifecycle, not
55
+ * the conversation — it runs when the isolated copy is born so e.g. `bun
56
+ * install` or `cp .env.example .env` happens before the agent works there.
57
+ *
58
+ * Failure is non-fatal by design (Beta decision 2026-06-08, "警告但继续"): a
59
+ * broken setup script shouldn't strand the agent outside a worktree it already
60
+ * created. The caller surfaces `output` as a warning and proceeds. cleanup
61
+ * scripts are intentionally NOT auto-run on exit (same decision).
62
+ *
63
+ * Reuses the same sandbox + env primitives as the Bash tool so the setup
64
+ * command sees the project's `localEnvironment.env` and runs under the same
65
+ * isolation the agent's later commands will.
66
+ */
67
+ export declare function runWorktreeSetup(worktreePath: string, script: string | undefined, opts?: {
68
+ sandbox?: SandboxBackend;
69
+ shellEnv?: Record<string, string>;
70
+ timeoutMs?: number;
71
+ signal?: AbortSignal;
72
+ }): Promise<WorktreeSetupResult>;
25
73
  /**
26
74
  * Remove a worktree and optionally its branch.
27
75
  */
@@ -4,6 +4,28 @@
4
4
  import { execFileSync } from "node:child_process";
5
5
  import { existsSync, symlinkSync, lstatSync } from "node:fs";
6
6
  import { join, resolve, dirname } from "node:path";
7
+ import { safeSpawnShell } from "../runtime/safe-spawn.js";
8
+ import { buildSandboxEnv, mergeShellEnv, defaultShellBinary } from "../runtime/spawn-common.js";
9
+ import { resolveExecutable } from "../utils/exec.js";
10
+ // git resolved via PATH×PATHEXT on Windows (.cmd/.exe shim); no-op on POSIX.
11
+ const GIT_BIN = resolveExecutable("git");
12
+ /**
13
+ * Pick the setup/cleanup script for the running platform, falling back to
14
+ * `default`. Empty/whitespace-only scripts are treated as absent so a project
15
+ * can leave a platform key blank without spawning an empty shell. `platform`
16
+ * defaults to `process.platform` so callers usually omit it; tests pass a
17
+ * fixed value.
18
+ */
19
+ export function selectPlatformScript(scripts, platform = process.platform) {
20
+ if (!scripts)
21
+ return undefined;
22
+ const key = platform === "darwin" ? "macos" : platform === "win32" ? "windows" : "linux";
23
+ // A blank platform key shouldn't shadow a real `default` — fall through.
24
+ const platformScript = scripts[key]?.trim() ? scripts[key] : undefined;
25
+ const candidate = platformScript ?? scripts.default;
26
+ const trimmed = candidate?.trim();
27
+ return trimmed ? candidate : undefined;
28
+ }
7
29
  /**
8
30
  * Validate worktree slug to prevent path traversal attacks.
9
31
  */
@@ -19,7 +41,7 @@ export function validateWorktreeSlug(slug) {
19
41
  * Find the canonical git root (resolves worktree → main repo).
20
42
  */
21
43
  export function findGitRoot(cwd) {
22
- return execFileSync("git", ["rev-parse", "--show-toplevel"], { cwd, encoding: "utf-8", timeout: 5000 }).trim();
44
+ return execFileSync(GIT_BIN, ["rev-parse", "--show-toplevel"], { cwd, encoding: "utf-8", timeout: 5000 }).trim();
23
45
  }
24
46
  /**
25
47
  * Create an isolated git worktree for an agent session.
@@ -32,7 +54,7 @@ export function createWorktree(cwd, slug, sessionId) {
32
54
  // Get current branch for later reference
33
55
  let originalBranch;
34
56
  try {
35
- originalBranch = execFileSync("git", ["branch", "--show-current"], {
57
+ originalBranch = execFileSync(GIT_BIN, ["branch", "--show-current"], {
36
58
  cwd: gitRoot,
37
59
  encoding: "utf-8",
38
60
  timeout: 5000,
@@ -44,7 +66,7 @@ export function createWorktree(cwd, slug, sessionId) {
44
66
  // Create the worktree. Pre-fix this used a quoted command string; the argv
45
67
  // form keeps branchName/worktreePath as literal positional arguments even
46
68
  // if a future caller bypasses validateWorktreeSlug.
47
- execFileSync("git", ["worktree", "add", "-b", branchName, worktreePath], {
69
+ execFileSync(GIT_BIN, ["worktree", "add", "-b", branchName, worktreePath], {
48
70
  cwd: gitRoot,
49
71
  timeout: 30000,
50
72
  });
@@ -60,6 +82,54 @@ export function createWorktree(cwd, slug, sessionId) {
60
82
  createdAt: Date.now(),
61
83
  };
62
84
  }
85
+ /**
86
+ * Run a project's `localEnvironment.setupScripts` once, in the freshly-created
87
+ * worktree's root, right after `git worktree add`. This mirrors Codex's
88
+ * local-environment semantics: setup belongs to the *worktree* lifecycle, not
89
+ * the conversation — it runs when the isolated copy is born so e.g. `bun
90
+ * install` or `cp .env.example .env` happens before the agent works there.
91
+ *
92
+ * Failure is non-fatal by design (Beta decision 2026-06-08, "警告但继续"): a
93
+ * broken setup script shouldn't strand the agent outside a worktree it already
94
+ * created. The caller surfaces `output` as a warning and proceeds. cleanup
95
+ * scripts are intentionally NOT auto-run on exit (same decision).
96
+ *
97
+ * Reuses the same sandbox + env primitives as the Bash tool so the setup
98
+ * command sees the project's `localEnvironment.env` and runs under the same
99
+ * isolation the agent's later commands will.
100
+ */
101
+ export async function runWorktreeSetup(worktreePath, script, opts = {}) {
102
+ const trimmed = script?.trim();
103
+ if (!trimmed)
104
+ return { skipped: true, ok: true, output: "" };
105
+ const shell = defaultShellBinary();
106
+ const backend = opts.sandbox;
107
+ const baseEnv = backend && backend.name !== "off" ? buildSandboxEnv() : { ...process.env };
108
+ const env = mergeShellEnv(baseEnv, opts.shellEnv);
109
+ const result = await safeSpawnShell(trimmed, {
110
+ cwd: worktreePath,
111
+ env,
112
+ timeoutMs: opts.timeoutMs ?? 120_000,
113
+ maxOutputBytes: 1024 * 1024,
114
+ sandbox: backend,
115
+ shell,
116
+ signal: opts.signal,
117
+ });
118
+ const parts = [];
119
+ if (result.stdout)
120
+ parts.push(result.stdout);
121
+ if (result.stderr)
122
+ parts.push(result.stderr);
123
+ const output = parts.join("\n").trim();
124
+ if (result.aborted)
125
+ return { skipped: false, ok: false, output: output || "setup aborted" };
126
+ if (result.timedOut)
127
+ return { skipped: false, ok: false, output: output || "setup timed out" };
128
+ if (result.spawnFailed) {
129
+ return { skipped: false, ok: false, output: result.error ?? "failed to spawn setup script" };
130
+ }
131
+ return { skipped: false, ok: result.exitCode === 0, output, exitCode: result.exitCode };
132
+ }
63
133
  /**
64
134
  * Remove a worktree and optionally its branch.
65
135
  */
@@ -69,7 +139,7 @@ export function removeWorktree(worktreePath, removeBranch = false) {
69
139
  // --show-toplevel` from inside a worktree returns the worktree path, which
70
140
  // is about to be deleted; the branch-delete must run from the main repo,
71
141
  // which outlives the worktree. Derive it from the common git dir.
72
- const commonDir = execFileSync("git", ["rev-parse", "--path-format=absolute", "--git-common-dir"], { cwd: worktreePath, encoding: "utf-8", timeout: 5000 }).trim();
142
+ const commonDir = execFileSync(GIT_BIN, ["rev-parse", "--path-format=absolute", "--git-common-dir"], { cwd: worktreePath, encoding: "utf-8", timeout: 5000 }).trim();
73
143
  const mainRoot = dirname(commonDir); // <main>/.git → <main>
74
144
  // Capture the worktree's branch BEFORE removing the worktree — afterwards
75
145
  // the directory is gone and `git branch --show-current` in it would fail
@@ -77,7 +147,7 @@ export function removeWorktree(worktreePath, removeBranch = false) {
77
147
  let branch = "";
78
148
  if (removeBranch) {
79
149
  try {
80
- branch = execFileSync("git", ["branch", "--show-current"], {
150
+ branch = execFileSync(GIT_BIN, ["branch", "--show-current"], {
81
151
  cwd: worktreePath,
82
152
  encoding: "utf-8",
83
153
  timeout: 5000,
@@ -87,13 +157,13 @@ export function removeWorktree(worktreePath, removeBranch = false) {
87
157
  // Detached HEAD or unreadable — nothing to delete.
88
158
  }
89
159
  }
90
- execFileSync("git", ["worktree", "remove", worktreePath, "--force"], {
160
+ execFileSync(GIT_BIN, ["worktree", "remove", worktreePath, "--force"], {
91
161
  cwd: mainRoot,
92
162
  timeout: 30000,
93
163
  });
94
164
  if (removeBranch && branch.startsWith("worktree/")) {
95
165
  try {
96
- execFileSync("git", ["branch", "-D", branch], { cwd: mainRoot, timeout: 10000 });
166
+ execFileSync(GIT_BIN, ["branch", "-D", branch], { cwd: mainRoot, timeout: 10000 });
97
167
  }
98
168
  catch {
99
169
  // Branch might already be removed.
@@ -108,7 +178,7 @@ export function removeWorktree(worktreePath, removeBranch = false) {
108
178
  * List active worktrees.
109
179
  */
110
180
  export function listWorktrees(cwd) {
111
- const raw = execFileSync("git", ["worktree", "list", "--porcelain"], {
181
+ const raw = execFileSync(GIT_BIN, ["worktree", "list", "--porcelain"], {
112
182
  cwd,
113
183
  encoding: "utf-8",
114
184
  timeout: 10000,
@@ -139,15 +209,21 @@ export function listWorktrees(cwd) {
139
209
  */
140
210
  function symlinkLargeDirectories(sourceRoot, worktreePath) {
141
211
  const largeDirs = ["node_modules", ".venv", "vendor", ".pnpm-store"];
212
+ // Windows directory symlinks need admin/Developer Mode and throw EPERM for a
213
+ // normal user; NTFS junctions don't and behave the same for our purpose
214
+ // (share node_modules into the worktree). Use "junction" on win32, "dir"
215
+ // elsewhere. Failure stays non-fatal — the worktree just doesn't share dirs.
216
+ const linkType = process.platform === "win32" ? "junction" : "dir";
142
217
  for (const dir of largeDirs) {
143
218
  const source = join(sourceRoot, dir);
144
219
  const target = join(worktreePath, dir);
145
220
  if (existsSync(source) && lstatSync(source).isDirectory() && !existsSync(target)) {
146
221
  try {
147
- symlinkSync(source, target, "dir");
222
+ symlinkSync(source, target, linkType);
148
223
  }
149
224
  catch {
150
- // Symlink might fail on some systems
225
+ // Symlink/junction might fail on some systems — non-fatal, the
226
+ // worktree just won't share this directory (more disk, still works).
151
227
  }
152
228
  }
153
229
  }
@@ -13,6 +13,8 @@ export interface GoalJudgeLLM {
13
13
  maxTokens?: number;
14
14
  recordUsage?: boolean;
15
15
  signal?: AbortSignal;
16
+ /** Reasoning control — the judge always asks for it OFF (see call site). */
17
+ reasoning?: import("../llm/reasoning-setting.js").ReasoningSetting;
16
18
  }): Promise<LLMResponse>;
17
19
  }
18
20
  interface GoalLogger {
@@ -25,6 +27,32 @@ export interface GoalStopHookOptions {
25
27
  log: GoalLogger;
26
28
  /** Override the goal instead of reading ctx.data.goal (mainly for tests). */
27
29
  goal?: string | GoalConfig;
30
+ /**
31
+ * Re-check whether the session STILL has a live persisted goal, evaluated
32
+ * fresh each time the hook fires. The hook's `goal` above is frozen at
33
+ * creation, so a goal cleared mid-run (user hit 清除 while a long-lived
34
+ * run kept going) would otherwise be judged forever off the stale copy —
35
+ * the unregister path in Engine.clearGoal only fires for the one in-flight
36
+ * hook it tracks, which misses automation / resumed runs. When this returns
37
+ * false the hook allows the stop immediately without calling the judge.
38
+ * Injectable (reads SessionManager on the engine); omit to disable the
39
+ * re-check (tests / non-persistent callers).
40
+ */
41
+ isGoalActive?: (sessionId: string) => boolean;
42
+ /**
43
+ * Called once when the judge first returns met:true, before this handler
44
+ * returns. The engine uses it to clear the session's persisted activeGoal so
45
+ * a later bare send doesn't re-inherit a satisfied goal. Optional so tests /
46
+ * non-persistent callers can omit it.
47
+ */
48
+ onMet?: () => void;
49
+ /**
50
+ * Clock source for the current time fed to the judge. Injectable so tests
51
+ * pin a fixed instant (the judge prompt is a fresh sub-call, not part of the
52
+ * cached prefix, so a live clock here has no cache cost). Defaults to
53
+ * `() => new Date()`.
54
+ */
55
+ now?: () => Date;
28
56
  }
29
57
  export declare function createGoalStopHook(opts: GoalStopHookOptions): HookHandler;
30
58
  export {};