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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/README.md +13 -10
  2. package/dist/agent/agent-definition-registry.d.ts +21 -3
  3. package/dist/agent/agent-definition-registry.js +49 -18
  4. package/dist/agent/agent-definition.d.ts +32 -0
  5. package/dist/agent/agent-definition.js +49 -4
  6. package/dist/arena/arena.js +11 -12
  7. package/dist/arena/context/context-tools.js +47 -6
  8. package/dist/arena/context/within-root.d.ts +7 -0
  9. package/dist/arena/context/within-root.js +15 -0
  10. package/dist/arena/iterate/phases/argue.js +8 -2
  11. package/dist/arena/iterate/phases/revise.js +1 -1
  12. package/dist/arena/iterate/phases/tournament.js +3 -3
  13. package/dist/arena/ledger.js +9 -1
  14. package/dist/arena/phases/adjudication.js +1 -4
  15. package/dist/arena/phases/build-consensus.js +1 -4
  16. package/dist/arena/phases/cross-review.js +2 -8
  17. package/dist/arena/phases/debate-rounds.js +1 -4
  18. package/dist/arena/phases/participant-research.js +1 -4
  19. package/dist/arena/phases/planning-detail-expansion.js +8 -10
  20. package/dist/arena/planner.js +0 -1
  21. package/dist/arena/providers/docs.d.ts +1 -0
  22. package/dist/arena/providers/docs.js +5 -2
  23. package/dist/arena/providers/repo.d.ts +1 -0
  24. package/dist/arena/providers/repo.js +5 -2
  25. package/dist/arena/strategies/utils.d.ts +1 -4
  26. package/dist/arena/strategies/utils.js +7 -51
  27. package/dist/arena/transitions.d.ts +7 -2
  28. package/dist/arena/transitions.js +9 -4
  29. package/dist/arena/types.d.ts +8 -2
  30. package/dist/automation/cron-expr.d.ts +41 -0
  31. package/dist/automation/cron-expr.js +169 -0
  32. package/dist/automation/index.d.ts +41 -0
  33. package/dist/automation/index.js +39 -0
  34. package/dist/automation/runner.d.ts +84 -0
  35. package/dist/automation/runner.js +92 -0
  36. package/dist/automation/scheduler.d.ts +194 -0
  37. package/dist/automation/scheduler.js +623 -0
  38. package/dist/automation/store.d.ts +39 -0
  39. package/dist/automation/store.js +122 -0
  40. package/dist/automation/write-policy.d.ts +34 -0
  41. package/dist/automation/write-policy.js +113 -0
  42. package/dist/automation/write-run.d.ts +51 -0
  43. package/dist/automation/write-run.js +38 -0
  44. package/dist/capability-control/disabled-lists.d.ts +25 -0
  45. package/dist/capability-control/disabled-lists.js +57 -0
  46. package/dist/capability-control/index.d.ts +5 -0
  47. package/dist/capability-control/index.js +3 -0
  48. package/dist/capability-control/overlay.d.ts +64 -0
  49. package/dist/capability-control/overlay.js +116 -0
  50. package/dist/capability-control/project.d.ts +65 -0
  51. package/dist/capability-control/project.js +147 -0
  52. package/dist/capability-control/service.d.ts +70 -0
  53. package/dist/capability-control/service.js +147 -0
  54. package/dist/capability-control/types.d.ts +62 -0
  55. package/dist/capability-control/types.js +17 -0
  56. package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
  57. package/dist/cc-orchestrator/agent-adapter.js +133 -0
  58. package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
  59. package/dist/cc-orchestrator/cc-capability.js +53 -0
  60. package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
  61. package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
  62. package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
  63. package/dist/cc-orchestrator/codex-session-history.js +187 -0
  64. package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
  65. package/dist/cc-orchestrator/external-agent-changes.js +214 -0
  66. package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
  67. package/dist/cc-orchestrator/external-agent-driver.js +69 -0
  68. package/dist/cc-orchestrator/index.d.ts +8 -0
  69. package/dist/cc-orchestrator/index.js +8 -0
  70. package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
  71. package/dist/cc-orchestrator/relevance-judge.js +29 -0
  72. package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
  73. package/dist/cc-orchestrator/session-discovery.js +125 -0
  74. package/dist/cc-orchestrator/session-history.d.ts +19 -0
  75. package/dist/cc-orchestrator/session-history.js +67 -0
  76. package/dist/cli/agent-server-stdio.d.ts +26 -1
  77. package/dist/cli/agent-server-stdio.js +221 -28
  78. package/dist/cli/agent-server-tcp.d.ts +20 -0
  79. package/dist/cli/agent-server-tcp.js +134 -0
  80. package/dist/cli/graceful-shutdown.d.ts +27 -0
  81. package/dist/cli/graceful-shutdown.js +30 -0
  82. package/dist/context/compaction.d.ts +56 -0
  83. package/dist/context/compaction.js +209 -15
  84. package/dist/context/manager.d.ts +0 -20
  85. package/dist/context/manager.js +25 -41
  86. package/dist/cost-tracker.js +5 -61
  87. package/dist/credentials/cipher.d.ts +49 -0
  88. package/dist/credentials/cipher.js +45 -0
  89. package/dist/credentials/cookie-jar.d.ts +24 -0
  90. package/dist/credentials/cookie-jar.js +40 -0
  91. package/dist/credentials/index.d.ts +7 -0
  92. package/dist/credentials/index.js +5 -0
  93. package/dist/credentials/inject-credential-tool.d.ts +20 -0
  94. package/dist/credentials/inject-credential-tool.js +130 -0
  95. package/dist/credentials/store.d.ts +72 -0
  96. package/dist/credentials/store.js +184 -0
  97. package/dist/credentials/types.d.ts +56 -0
  98. package/dist/credentials/use-credential-tool.d.ts +29 -0
  99. package/dist/credentials/use-credential-tool.js +205 -0
  100. package/dist/credentials/use-gate.d.ts +56 -0
  101. package/dist/credentials/use-gate.js +52 -0
  102. package/dist/cron/cron-runtime.d.ts +2 -0
  103. package/dist/cron/cron-runtime.js +2 -0
  104. package/dist/cron/cron-store.d.ts +2 -0
  105. package/dist/cron/cron-store.js +2 -0
  106. package/dist/cron/scheduler.d.ts +5 -32
  107. package/dist/cron/scheduler.js +5 -113
  108. package/dist/data/model-metadata.d.ts +77 -0
  109. package/dist/data/model-metadata.js +56 -0
  110. package/dist/data/model-metadata.json +216 -0
  111. package/dist/data/openrouter-models.d.ts +18 -7
  112. package/dist/data/openrouter-models.js +35 -8
  113. package/dist/data/openrouter-sync.js +1 -1
  114. package/dist/engine/aux-key.d.ts +10 -0
  115. package/dist/engine/aux-key.js +11 -0
  116. package/dist/engine/dynamic-tool-defs.d.ts +19 -0
  117. package/dist/engine/dynamic-tool-defs.js +36 -0
  118. package/dist/engine/engine.d.ts +431 -108
  119. package/dist/engine/engine.js +1630 -279
  120. package/dist/engine/friendly-error.d.ts +18 -0
  121. package/dist/engine/friendly-error.js +63 -0
  122. package/dist/engine/goal.d.ts +187 -0
  123. package/dist/engine/goal.js +196 -0
  124. package/dist/engine/image-compression.d.ts +81 -0
  125. package/dist/engine/image-compression.js +186 -0
  126. package/dist/engine/image-policy.d.ts +165 -0
  127. package/dist/engine/image-policy.js +189 -0
  128. package/dist/engine/model-connections-pool.d.ts +17 -0
  129. package/dist/engine/model-connections-pool.js +66 -0
  130. package/dist/engine/model-facade.d.ts +10 -0
  131. package/dist/engine/model-facade.js +25 -0
  132. package/dist/engine/patch-orphaned-tools.js +3 -0
  133. package/dist/engine/reactive-threshold.d.ts +13 -0
  134. package/dist/engine/reactive-threshold.js +17 -0
  135. package/dist/engine/resolve-llm-config.d.ts +16 -0
  136. package/dist/engine/resolve-llm-config.js +44 -0
  137. package/dist/engine/runtime.js +9 -1
  138. package/dist/engine/sandbox-cache-key.d.ts +10 -0
  139. package/dist/engine/sandbox-cache-key.js +9 -0
  140. package/dist/engine/sandbox-config.d.ts +31 -0
  141. package/dist/engine/sandbox-config.js +38 -0
  142. package/dist/engine/session-title.d.ts +13 -0
  143. package/dist/engine/session-title.js +34 -0
  144. package/dist/engine/session-usage.d.ts +19 -0
  145. package/dist/engine/session-usage.js +25 -0
  146. package/dist/engine/steer-queue.d.ts +32 -0
  147. package/dist/engine/steer-queue.js +26 -0
  148. package/dist/engine/streaming-tool-queue.d.ts +12 -0
  149. package/dist/engine/streaming-tool-queue.js +50 -10
  150. package/dist/engine/turn-loop.d.ts +94 -9
  151. package/dist/engine/turn-loop.js +775 -342
  152. package/dist/engine/types.d.ts +175 -0
  153. package/dist/engine/types.js +13 -0
  154. package/dist/external-agents/config.d.ts +2 -0
  155. package/dist/external-agents/config.js +15 -0
  156. package/dist/external-agents/types.d.ts +31 -0
  157. package/dist/external-agents/types.js +1 -0
  158. package/dist/git/parse-log.d.ts +13 -0
  159. package/dist/git/parse-log.js +21 -0
  160. package/dist/git/utils.d.ts +8 -6
  161. package/dist/git/utils.js +62 -26
  162. package/dist/git/worktree.d.ts +48 -0
  163. package/dist/git/worktree.js +111 -20
  164. package/dist/hooks/events.d.ts +23 -1
  165. package/dist/hooks/goal-stop-hook.d.ts +58 -0
  166. package/dist/hooks/goal-stop-hook.js +279 -0
  167. package/dist/hooks/hook-output.d.ts +33 -0
  168. package/dist/hooks/hook-output.js +79 -0
  169. package/dist/hooks/registry.d.ts +15 -0
  170. package/dist/hooks/registry.js +57 -1
  171. package/dist/hooks/shell-runner.d.ts +2 -0
  172. package/dist/hooks/shell-runner.js +48 -18
  173. package/dist/index.d.ts +79 -11
  174. package/dist/index.js +89 -6
  175. package/dist/llm/capabilities/param-specs.d.ts +14 -0
  176. package/dist/llm/capabilities/param-specs.js +62 -0
  177. package/dist/llm/capabilities/reasoning-control.d.ts +24 -0
  178. package/dist/llm/capabilities/reasoning-control.js +38 -0
  179. package/dist/llm/capabilities/rules.js +37 -3
  180. package/dist/llm/capabilities/types.d.ts +32 -2
  181. package/dist/llm/clamp-max-tokens.d.ts +11 -0
  182. package/dist/llm/clamp-max-tokens.js +17 -0
  183. package/dist/llm/client-base.d.ts +69 -5
  184. package/dist/llm/client-base.js +185 -25
  185. package/dist/llm/client-factory.d.ts +3 -3
  186. package/dist/llm/client-factory.js +2 -2
  187. package/dist/llm/model-cache.js +4 -2
  188. package/dist/llm/model-pool.d.ts +29 -11
  189. package/dist/llm/model-pool.js +36 -20
  190. package/dist/llm/provider-auth.d.ts +41 -0
  191. package/dist/llm/provider-auth.js +76 -0
  192. package/dist/llm/provider-catalog.d.ts +6 -2
  193. package/dist/llm/providers/anthropic.d.ts +32 -2
  194. package/dist/llm/providers/anthropic.js +207 -18
  195. package/dist/llm/providers/openai.d.ts +47 -2
  196. package/dist/llm/providers/openai.js +478 -71
  197. package/dist/llm/reasoning-setting.d.ts +51 -0
  198. package/dist/llm/reasoning-setting.js +40 -0
  199. package/dist/llm/stop-reason.d.ts +13 -0
  200. package/dist/llm/stop-reason.js +21 -0
  201. package/dist/llm/stream-watchdog.js +5 -1
  202. package/dist/llm/strip-vision.d.ts +32 -0
  203. package/dist/llm/strip-vision.js +94 -0
  204. package/dist/llm/token-counter.js +9 -2
  205. package/dist/llm/types.d.ts +9 -6
  206. package/dist/logging/logger.js +18 -4
  207. package/dist/logging/sanitize-messages.d.ts +10 -0
  208. package/dist/logging/sanitize-messages.js +112 -0
  209. package/dist/lsp/client.js +28 -8
  210. package/dist/lsp/manager.d.ts +1 -1
  211. package/dist/lsp/manager.js +42 -11
  212. package/dist/lsp/root-path.d.ts +9 -0
  213. package/dist/lsp/root-path.js +12 -0
  214. package/dist/model-catalog/builtin.d.ts +12 -0
  215. package/dist/model-catalog/builtin.js +407 -0
  216. package/dist/model-catalog/gen-connections.d.ts +20 -0
  217. package/dist/model-catalog/gen-connections.js +28 -0
  218. package/dist/model-catalog/index.d.ts +41 -0
  219. package/dist/model-catalog/index.js +90 -0
  220. package/dist/model-catalog/params.d.ts +20 -0
  221. package/dist/model-catalog/params.js +45 -0
  222. package/dist/model-catalog/resolve.d.ts +48 -0
  223. package/dist/model-catalog/resolve.js +33 -0
  224. package/dist/model-catalog/save-entry.d.ts +32 -0
  225. package/dist/model-catalog/save-entry.js +104 -0
  226. package/dist/model-catalog/types.d.ts +561 -0
  227. package/dist/model-catalog/types.js +93 -0
  228. package/dist/model-catalog/upsert.d.ts +9 -0
  229. package/dist/model-catalog/upsert.js +8 -0
  230. package/dist/onboarding.d.ts +12 -82
  231. package/dist/onboarding.js +75 -333
  232. package/dist/plugins/gitOps.d.ts +53 -0
  233. package/dist/plugins/gitOps.js +130 -5
  234. package/dist/plugins/installer/checkUpdate.d.ts +16 -0
  235. package/dist/plugins/installer/checkUpdate.js +32 -0
  236. package/dist/plugins/installer/codex/convertAgents.d.ts +7 -0
  237. package/dist/plugins/installer/codex/convertAgents.js +55 -0
  238. package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
  239. package/dist/plugins/installer/codex/convertCommands.js +46 -0
  240. package/dist/plugins/installer/codex/convertMcp.d.ts +11 -0
  241. package/dist/plugins/installer/codex/convertMcp.js +85 -0
  242. package/dist/plugins/installer/codex/convertSkills.d.ts +12 -0
  243. package/dist/plugins/installer/codex/convertSkills.js +33 -0
  244. package/dist/plugins/installer/detectFormat.d.ts +2 -0
  245. package/dist/plugins/installer/detectFormat.js +6 -0
  246. package/dist/plugins/installer/install.d.ts +7 -0
  247. package/dist/plugins/installer/install.js +123 -0
  248. package/dist/plugins/installer/installFromArchive.d.ts +43 -0
  249. package/dist/plugins/installer/installFromArchive.js +134 -0
  250. package/dist/plugins/installer/installFromSource.d.ts +13 -0
  251. package/dist/plugins/installer/installFromSource.js +51 -0
  252. package/dist/plugins/installer/list.d.ts +9 -0
  253. package/dist/plugins/installer/list.js +30 -0
  254. package/dist/plugins/installer/loadPluginAgents.d.ts +3 -0
  255. package/dist/plugins/installer/loadPluginAgents.js +27 -0
  256. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  257. package/dist/plugins/installer/loadPluginMcp.js +107 -0
  258. package/dist/plugins/installer/parseSource.d.ts +20 -0
  259. package/dist/plugins/installer/parseSource.js +74 -0
  260. package/dist/plugins/installer/paths.d.ts +5 -0
  261. package/dist/plugins/installer/paths.js +25 -0
  262. package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
  263. package/dist/plugins/installer/pruneDisabled.js +73 -0
  264. package/dist/plugins/installer/types.d.ts +52 -0
  265. package/dist/plugins/installer/types.js +28 -0
  266. package/dist/plugins/installer/uninstall.d.ts +2 -0
  267. package/dist/plugins/installer/uninstall.js +18 -0
  268. package/dist/plugins/installer/unzip.d.ts +14 -0
  269. package/dist/plugins/installer/unzip.js +82 -0
  270. package/dist/plugins/installer/update.d.ts +28 -0
  271. package/dist/plugins/installer/update.js +97 -0
  272. package/dist/plugins/loadPluginHooks.d.ts +54 -1
  273. package/dist/plugins/loadPluginHooks.js +83 -1
  274. package/dist/plugins/marketplaceManager.d.ts +15 -1
  275. package/dist/plugins/marketplaceManager.js +58 -4
  276. package/dist/plugins/pluginCommandHook.js +34 -14
  277. package/dist/plugins/pluginContent.d.ts +30 -0
  278. package/dist/plugins/pluginContent.js +83 -0
  279. package/dist/plugins/pluginInstaller.d.ts +34 -0
  280. package/dist/plugins/pluginInstaller.js +168 -35
  281. package/dist/plugins/schemas.js +41 -6
  282. package/dist/plugins/types.d.ts +10 -0
  283. package/dist/preset/index.d.ts +7 -1
  284. package/dist/preset/index.js +112 -6
  285. package/dist/product/types.d.ts +1 -1
  286. package/dist/prompt/composer.d.ts +31 -0
  287. package/dist/prompt/composer.js +95 -25
  288. package/dist/prompt/instruction-scanner.js +5 -3
  289. package/dist/prompt/section-loader.js +1 -0
  290. package/dist/prompt/sections/base.md +1 -0
  291. package/dist/prompt/sections/browser.md +10 -0
  292. package/dist/prompt/sections/coding.md +4 -0
  293. package/dist/prompt/sections/orchestration.md +8 -0
  294. package/dist/protocol/chat-session-manager.d.ts +15 -2
  295. package/dist/protocol/chat-session-manager.js +46 -0
  296. package/dist/protocol/chat-session.d.ts +82 -0
  297. package/dist/protocol/chat-session.js +121 -1
  298. package/dist/protocol/client.d.ts +27 -0
  299. package/dist/protocol/client.js +38 -0
  300. package/dist/protocol/redact.d.ts +50 -0
  301. package/dist/protocol/redact.js +71 -0
  302. package/dist/protocol/server.d.ts +153 -2
  303. package/dist/protocol/server.js +807 -39
  304. package/dist/protocol/tcp-transport.d.ts +45 -0
  305. package/dist/protocol/tcp-transport.js +74 -0
  306. package/dist/protocol/transport.js +3 -2
  307. package/dist/protocol/types.d.ts +69 -0
  308. package/dist/protocol/types.js +22 -0
  309. package/dist/quota/credentials.d.ts +3 -0
  310. package/dist/quota/credentials.js +80 -0
  311. package/dist/quota/index.d.ts +36 -0
  312. package/dist/quota/index.js +155 -0
  313. package/dist/quota/types.d.ts +48 -0
  314. package/dist/quota/types.js +13 -0
  315. package/dist/remote/bridge.d.ts +11 -2
  316. package/dist/remote/bridge.js +61 -33
  317. package/dist/review/review-prompt.d.ts +28 -0
  318. package/dist/review/review-prompt.js +81 -0
  319. package/dist/run/ArtifactTracker.js +5 -4
  320. package/dist/run/EngineRunner.d.ts +27 -1
  321. package/dist/run/EngineRunner.js +46 -8
  322. package/dist/run/FileRunStore.js +40 -11
  323. package/dist/run/RunApprovalBackend.js +25 -5
  324. package/dist/run/RunLock.d.ts +28 -2
  325. package/dist/run/RunLock.js +49 -7
  326. package/dist/run/RunManager.d.ts +12 -0
  327. package/dist/run/RunManager.js +86 -3
  328. package/dist/run/RunQueue.d.ts +1 -0
  329. package/dist/run/RunQueue.js +8 -2
  330. package/dist/run/factory.d.ts +8 -1
  331. package/dist/run/factory.js +1 -0
  332. package/dist/run/index.d.ts +2 -2
  333. package/dist/run/index.js +1 -1
  334. package/dist/run/redirect-target.d.ts +7 -0
  335. package/dist/run/redirect-target.js +13 -0
  336. package/dist/run/types.js +1 -1
  337. package/dist/runtime/background-shell.d.ts +139 -0
  338. package/dist/runtime/background-shell.js +495 -0
  339. package/dist/runtime/output-clean.d.ts +24 -0
  340. package/dist/runtime/output-clean.js +41 -0
  341. package/dist/runtime/ring-file.d.ts +64 -0
  342. package/dist/runtime/ring-file.js +174 -0
  343. package/dist/runtime/safe-spawn.js +15 -34
  344. package/dist/runtime/spawn-common.d.ts +148 -0
  345. package/dist/runtime/spawn-common.js +303 -0
  346. package/dist/runtime/truncate-output.d.ts +22 -0
  347. package/dist/runtime/truncate-output.js +49 -0
  348. package/dist/runtime/utf8-cut.d.ts +11 -0
  349. package/dist/runtime/utf8-cut.js +23 -0
  350. package/dist/services/auto-dream.d.ts +4 -0
  351. package/dist/services/auto-dream.js +26 -26
  352. package/dist/services/browser-open.d.ts +13 -0
  353. package/dist/services/browser-open.js +16 -0
  354. package/dist/services/diagnostics.d.ts +1 -2
  355. package/dist/services/diagnostics.js +12 -7
  356. package/dist/services/dream-consolidation.d.ts +57 -0
  357. package/dist/services/dream-consolidation.js +151 -0
  358. package/dist/services/extract-memories.d.ts +14 -1
  359. package/dist/services/extract-memories.js +45 -6
  360. package/dist/services/memory-orchestrator.d.ts +21 -0
  361. package/dist/services/memory-orchestrator.js +125 -32
  362. package/dist/services/notifier.d.ts +8 -0
  363. package/dist/services/notifier.js +39 -25
  364. package/dist/services/oauth.js +5 -7
  365. package/dist/services/session-memory-sort.d.ts +8 -0
  366. package/dist/services/session-memory-sort.js +9 -0
  367. package/dist/services/session-memory.js +30 -19
  368. package/dist/session/file-history.d.ts +124 -1
  369. package/dist/session/file-history.js +232 -9
  370. package/dist/session/memory.d.ts +116 -2
  371. package/dist/session/memory.js +250 -28
  372. package/dist/session/session-manager.d.ts +63 -1
  373. package/dist/session/session-manager.js +186 -5
  374. package/dist/session/simple-diff.d.ts +23 -0
  375. package/dist/session/simple-diff.js +84 -0
  376. package/dist/session/transcript.d.ts +25 -1
  377. package/dist/session/transcript.js +35 -2
  378. package/dist/session/undo-target.d.ts +67 -0
  379. package/dist/session/undo-target.js +144 -0
  380. package/dist/settings/disk-defaults.d.ts +42 -0
  381. package/dist/settings/disk-defaults.js +33 -0
  382. package/dist/settings/feature-flags.d.ts +64 -0
  383. package/dist/settings/feature-flags.js +61 -0
  384. package/dist/settings/manager.d.ts +101 -1
  385. package/dist/settings/manager.js +345 -15
  386. package/dist/settings/migrate-config.d.ts +45 -0
  387. package/dist/settings/migrate-config.js +125 -0
  388. package/dist/settings/personalization.d.ts +19 -0
  389. package/dist/settings/personalization.js +7 -0
  390. package/dist/settings/schema-export.d.ts +25 -0
  391. package/dist/settings/schema-export.js +38 -0
  392. package/dist/settings/schema.d.ts +1827 -396
  393. package/dist/settings/schema.js +361 -81
  394. package/dist/skills/scanner.d.ts +9 -0
  395. package/dist/skills/scanner.js +30 -2
  396. package/dist/stt/resolve-transcribe.d.ts +31 -0
  397. package/dist/stt/resolve-transcribe.js +108 -0
  398. package/dist/stt/transcribe.d.ts +51 -0
  399. package/dist/stt/transcribe.js +65 -0
  400. package/dist/tool-system/browser-bridge.d.ts +226 -0
  401. package/dist/tool-system/browser-bridge.js +163 -0
  402. package/dist/tool-system/builtin/add-marketplace.d.ts +12 -0
  403. package/dist/tool-system/builtin/add-marketplace.js +76 -0
  404. package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
  405. package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
  406. package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
  407. package/dist/tool-system/builtin/agent-notifications.js +9 -3
  408. package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
  409. package/dist/tool-system/builtin/agent-output-file.js +72 -0
  410. package/dist/tool-system/builtin/agent-registry.d.ts +23 -0
  411. package/dist/tool-system/builtin/agent-registry.js +16 -4
  412. package/dist/tool-system/builtin/agent.d.ts +50 -11
  413. package/dist/tool-system/builtin/agent.js +576 -73
  414. package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
  415. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
  416. package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
  417. package/dist/tool-system/builtin/apply-patch/index.js +7 -3
  418. package/dist/tool-system/builtin/arena.js +6 -7
  419. package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
  420. package/dist/tool-system/builtin/background-jobs.js +124 -0
  421. package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
  422. package/dist/tool-system/builtin/background-shell-tools.js +108 -0
  423. package/dist/tool-system/builtin/background-work.d.ts +67 -0
  424. package/dist/tool-system/builtin/background-work.js +86 -0
  425. package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
  426. package/dist/tool-system/builtin/bash-output-style.js +40 -0
  427. package/dist/tool-system/builtin/bash.d.ts +5 -2
  428. package/dist/tool-system/builtin/bash.js +98 -62
  429. package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
  430. package/dist/tool-system/builtin/browser-tools.js +312 -0
  431. package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
  432. package/dist/tool-system/builtin/cancel-goal.js +64 -0
  433. package/dist/tool-system/builtin/check-quota.d.ts +15 -0
  434. package/dist/tool-system/builtin/check-quota.js +34 -0
  435. package/dist/tool-system/builtin/complete-goal.d.ts +25 -0
  436. package/dist/tool-system/builtin/complete-goal.js +45 -0
  437. package/dist/tool-system/builtin/config.js +7 -0
  438. package/dist/tool-system/builtin/cron.d.ts +7 -0
  439. package/dist/tool-system/builtin/cron.js +105 -9
  440. package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
  441. package/dist/tool-system/builtin/drive-claude-code.js +157 -0
  442. package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
  443. package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
  444. package/dist/tool-system/builtin/edit.d.ts +2 -1
  445. package/dist/tool-system/builtin/edit.js +21 -12
  446. package/dist/tool-system/builtin/eol.d.ts +29 -0
  447. package/dist/tool-system/builtin/eol.js +37 -0
  448. package/dist/tool-system/builtin/file-cache.d.ts +6 -0
  449. package/dist/tool-system/builtin/file-cache.js +8 -0
  450. package/dist/tool-system/builtin/generate-image.d.ts +60 -0
  451. package/dist/tool-system/builtin/generate-image.js +374 -0
  452. package/dist/tool-system/builtin/generate-video.d.ts +55 -0
  453. package/dist/tool-system/builtin/generate-video.js +361 -0
  454. package/dist/tool-system/builtin/grep.js +6 -2
  455. package/dist/tool-system/builtin/image-providers.d.ts +86 -0
  456. package/dist/tool-system/builtin/image-providers.js +190 -0
  457. package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
  458. package/dist/tool-system/builtin/image-uploader.js +74 -0
  459. package/dist/tool-system/builtin/index.d.ts +24 -1
  460. package/dist/tool-system/builtin/index.js +310 -25
  461. package/dist/tool-system/builtin/mcp-tools.js +23 -3
  462. package/dist/tool-system/builtin/memory.js +45 -7
  463. package/dist/tool-system/builtin/notebook-edit.d.ts +2 -1
  464. package/dist/tool-system/builtin/notebook-edit.js +1 -1
  465. package/dist/tool-system/builtin/powershell.js +4 -1
  466. package/dist/tool-system/builtin/read.d.ts +2 -1
  467. package/dist/tool-system/builtin/read.js +11 -3
  468. package/dist/tool-system/builtin/repl.js +4 -1
  469. package/dist/tool-system/builtin/skill.js +9 -0
  470. package/dist/tool-system/builtin/sleep.js +12 -5
  471. package/dist/tool-system/builtin/task.js +4 -1
  472. package/dist/tool-system/builtin/tool-search.js +25 -7
  473. package/dist/tool-system/builtin/update-automation-memory.d.ts +24 -0
  474. package/dist/tool-system/builtin/update-automation-memory.js +60 -0
  475. package/dist/tool-system/builtin/video-providers.d.ts +154 -0
  476. package/dist/tool-system/builtin/video-providers.js +235 -0
  477. package/dist/tool-system/builtin/view-image.d.ts +18 -0
  478. package/dist/tool-system/builtin/view-image.js +96 -0
  479. package/dist/tool-system/builtin/web-fetch.js +12 -2
  480. package/dist/tool-system/builtin/web-search.d.ts +4 -1
  481. package/dist/tool-system/builtin/web-search.js +57 -10
  482. package/dist/tool-system/builtin/worktree.d.ts +2 -1
  483. package/dist/tool-system/builtin/worktree.js +31 -4
  484. package/dist/tool-system/builtin/write.d.ts +2 -1
  485. package/dist/tool-system/builtin/write.js +1 -1
  486. package/dist/tool-system/context.d.ts +166 -6
  487. package/dist/tool-system/executor.d.ts +3 -2
  488. package/dist/tool-system/executor.js +197 -119
  489. package/dist/tool-system/investigation-guard.d.ts +4 -1
  490. package/dist/tool-system/investigation-guard.js +20 -4
  491. package/dist/tool-system/mcp-manager.d.ts +78 -16
  492. package/dist/tool-system/mcp-manager.js +357 -28
  493. package/dist/tool-system/path-policy.d.ts +99 -0
  494. package/dist/tool-system/path-policy.js +578 -0
  495. package/dist/tool-system/permission.d.ts +36 -1
  496. package/dist/tool-system/permission.js +322 -117
  497. package/dist/tool-system/plan-mode-allowlist.d.ts +32 -0
  498. package/dist/tool-system/plan-mode-allowlist.js +65 -0
  499. package/dist/tool-system/registry.d.ts +1 -0
  500. package/dist/tool-system/registry.js +26 -1
  501. package/dist/tool-system/sandbox/index.d.ts +8 -0
  502. package/dist/tool-system/sandbox/index.js +7 -2
  503. package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
  504. package/dist/tool-system/validate-tool-metadata.js +63 -0
  505. package/dist/tool-system/validation.d.ts +10 -0
  506. package/dist/tool-system/validation.js +16 -3
  507. package/dist/types.d.ts +301 -15
  508. package/dist/updater.js +20 -9
  509. package/dist/utils/envUtils.d.ts +0 -9
  510. package/dist/utils/envUtils.js +3 -28
  511. package/dist/utils/exec.d.ts +40 -0
  512. package/dist/utils/exec.js +144 -0
  513. package/dist/utils/format.js +4 -2
  514. package/dist/utils/json.d.ts +12 -0
  515. package/dist/utils/json.js +92 -0
  516. package/dist/utils/lockfile.js +9 -2
  517. package/dist/utils/theme.d.ts +7 -1
  518. package/dist/utils/theme.js +5 -3
  519. package/dist/utils/toolDisplay.js +0 -1
  520. package/package.json +14 -7
  521. package/dist/agent/coordinator.d.ts +0 -49
  522. package/dist/agent/coordinator.js +0 -77
  523. package/dist/settings/manager.test.js +0 -73
  524. package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
  525. package/dist/tool-system/builtin/remote-trigger.js +0 -54
  526. package/dist/tool-system/builtin/send-message.d.ts +0 -6
  527. package/dist/tool-system/builtin/send-message.js +0 -47
  528. /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
@@ -13,18 +13,33 @@ import { logger } from "../logging/logger.js";
13
13
  export class RunLock {
14
14
  runsDir;
15
15
  staleMs;
16
+ targetWaitMs;
17
+ targetPollMs;
16
18
  releaseFns = new Map();
17
19
  constructor(config) {
18
20
  this.runsDir = config?.runsDir ?? join(homedir(), ".code-shell", "runs");
19
21
  this.staleMs = config?.staleMs ?? 60_000;
22
+ this.targetWaitMs = config?.targetWaitMs ?? 2_000;
23
+ this.targetPollMs = config?.targetPollMs ?? 10;
20
24
  }
21
25
  /**
22
- * Acquire a lock for a run. Returns true if acquired, false if already held.
26
+ * Acquire a lock for a run. Missing target and held-lock failures are
27
+ * intentionally distinct so callers don't silently abandon a run as "locked"
28
+ * when the real issue is a bad/mismatched run store path.
29
+ *
30
+ * Race note: if the queue reaches acquire() before the file is visible, a
31
+ * short wait bridges that gap. Only a proper-lockfile conflict is "locked".
23
32
  */
24
33
  async acquire(runId) {
25
34
  const lockTarget = this.lockTarget(runId);
26
- if (!existsSync(lockTarget))
27
- return false;
35
+ if (!(await this.waitForTarget(lockTarget))) {
36
+ logger.warn("run.lock.target_missing", { runId, lockTarget });
37
+ return {
38
+ acquired: false,
39
+ reason: "missing_target",
40
+ message: `Lock target did not appear: ${lockTarget}`,
41
+ };
42
+ }
28
43
  try {
29
44
  const release = await lock(lockTarget, {
30
45
  stale: this.staleMs,
@@ -32,12 +47,39 @@ export class RunLock {
32
47
  });
33
48
  this.releaseFns.set(runId, release);
34
49
  logger.info("run.lock.acquired", { runId });
35
- return true;
50
+ return { acquired: true };
36
51
  }
37
- catch {
38
- // Lock already held by another process
39
- return false;
52
+ catch (err) {
53
+ const e = err;
54
+ logger.warn("run.lock.conflict", {
55
+ runId,
56
+ lockTarget,
57
+ code: e?.code,
58
+ message: e?.message,
59
+ alreadyHeldByThisInstance: this.releaseFns.has(runId),
60
+ });
61
+ return {
62
+ acquired: false,
63
+ reason: "locked",
64
+ code: e?.code,
65
+ message: e?.message,
66
+ };
67
+ }
68
+ }
69
+ /**
70
+ * Wait (up to ~targetWaitMs) for the lock target file to exist, polling on a
71
+ * short interval. Returns true once present, false if it never appears
72
+ * within the window. Bridges the submit→executeRun create race without
73
+ * blocking meaningfully when the file is already there (first check hits).
74
+ */
75
+ async waitForTarget(lockTarget) {
76
+ const deadline = Date.now() + this.targetWaitMs;
77
+ while (!existsSync(lockTarget)) {
78
+ if (Date.now() >= deadline)
79
+ return false;
80
+ await new Promise((r) => setTimeout(r, this.targetPollMs));
40
81
  }
82
+ return true;
41
83
  }
42
84
  /**
43
85
  * Release the lock for a run.
@@ -49,10 +49,22 @@ export declare class RunManager {
49
49
  private readonly abortControllers;
50
50
  /** Active execution handles — used to resolve pending approvals/input while Engine is suspended */
51
51
  private readonly executionHandles;
52
+ /**
53
+ * Runs with a resume()/cancel() decision currently being applied. Guards the
54
+ * approval/input resume race: resume() and cancel() each have multiple await
55
+ * points, and the status check at the top of resume() reads a value that
56
+ * stays `waiting_*` until a later `await transition()` lands. Two concurrent
57
+ * resumes (double-click approve), or resume racing cancel, would both pass
58
+ * that check and both drive transitions / resolve the handle. The handle's
59
+ * resolve is idempotent, but the duplicate transitions and (worse) the
60
+ * mismatched-input re-queue path are not. We serialize per-run here.
61
+ */
62
+ private readonly resolvingRuns;
52
63
  constructor(config: RunManagerConfig);
53
64
  submit(input: SubmitRunInput): Promise<RunSnapshot>;
54
65
  start(runId: string): Promise<void>;
55
66
  resume(runId: string, input?: ResumeRunInput): Promise<void>;
67
+ private resumeInner;
56
68
  cancel(runId: string, reason?: string): Promise<void>;
57
69
  get(runId: string): Promise<RunSnapshot | null>;
58
70
  list(query?: ListRunsQuery): Promise<RunSnapshot[]>;
@@ -33,6 +33,17 @@ export class RunManager {
33
33
  abortControllers = new Map();
34
34
  /** Active execution handles — used to resolve pending approvals/input while Engine is suspended */
35
35
  executionHandles = new Map();
36
+ /**
37
+ * Runs with a resume()/cancel() decision currently being applied. Guards the
38
+ * approval/input resume race: resume() and cancel() each have multiple await
39
+ * points, and the status check at the top of resume() reads a value that
40
+ * stays `waiting_*` until a later `await transition()` lands. Two concurrent
41
+ * resumes (double-click approve), or resume racing cancel, would both pass
42
+ * that check and both drive transitions / resolve the handle. The handle's
43
+ * resolve is idempotent, but the duplicate transitions and (worse) the
44
+ * mismatched-input re-queue path are not. We serialize per-run here.
45
+ */
46
+ resolvingRuns = new Set();
36
47
  constructor(config) {
37
48
  this.store = config.store;
38
49
  this.queue = new RunQueue({ concurrency: config.concurrency ?? 1 });
@@ -99,6 +110,23 @@ export class RunManager {
99
110
  }
100
111
  // ─── Resume ────────────────────────────────────────────────────
101
112
  async resume(runId, input) {
113
+ // Serialize resume/cancel decisions per run. Without this, two concurrent
114
+ // resumes (or resume racing cancel) both pass the status check below —
115
+ // status stays `waiting_*` until a later `await transition()` — and both
116
+ // drive transitions / the re-queue path. Reject the late arrival rather
117
+ // than letting it double-resolve.
118
+ if (this.resolvingRuns.has(runId)) {
119
+ throw new Error(`Cannot resume run ${runId}: another resume/cancel is already in progress`);
120
+ }
121
+ this.resolvingRuns.add(runId);
122
+ try {
123
+ await this.resumeInner(runId, input);
124
+ }
125
+ finally {
126
+ this.resolvingRuns.delete(runId);
127
+ }
128
+ }
129
+ async resumeInner(runId, input) {
102
130
  const run = await this.getOrThrow(runId);
103
131
  if (run.status !== "waiting_input" &&
104
132
  run.status !== "waiting_approval" &&
@@ -137,6 +165,13 @@ export class RunManager {
137
165
  handle.resolveInput(input.userInput);
138
166
  return;
139
167
  }
168
+ // A handle exists (Engine is live and suspended) but the input doesn't
169
+ // match what it's waiting for — e.g. userInput supplied for a
170
+ // waiting_approval run. Falling through to Case 2 would re-enqueue a
171
+ // FRESH execution while the suspended Engine still dangles (duplicate
172
+ // run + leaked handle). Reject with a clear message instead.
173
+ throw new Error(`Cannot resume run ${runId}: it is ${run.status} but the provided input does not match ` +
174
+ `(expected ${run.status === "waiting_approval" ? "approvalDecision" : "userInput"}).`);
140
175
  }
141
176
  // Case 2: No active handle (process restarted, or blocked state)
142
177
  // Re-queue the run for a fresh execution attempt
@@ -293,9 +328,25 @@ export class RunManager {
293
328
  async executeRun(runId) {
294
329
  const run = await this.getOrThrow(runId);
295
330
  // Acquire run lock — prevents concurrent execution by multiple workers
296
- const acquired = await this.lock.acquire(runId);
297
- if (!acquired) {
298
- logger.warn("run.lock.failed", { runId, reason: "already locked by another worker" });
331
+ const lockResult = await this.lock.acquire(runId);
332
+ if (!lockResult.acquired) {
333
+ if (lockResult.reason === "missing_target") {
334
+ const errorMsg = lockResult.message ?? "Run lock target was missing";
335
+ run.error = errorMsg;
336
+ await this.transition(run, "blocked");
337
+ await this.emitRunEvent(runId, "run_blocked", {
338
+ error: errorMsg,
339
+ reason: "missing_lock_target",
340
+ });
341
+ logger.error("run.lock.target_missing", { runId, error: errorMsg });
342
+ return;
343
+ }
344
+ logger.warn("run.lock.failed", {
345
+ runId,
346
+ reason: "already locked by another worker",
347
+ code: lockResult.code,
348
+ message: lockResult.message,
349
+ });
299
350
  return;
300
351
  }
301
352
  // Start heartbeat so crash recovery can detect liveness
@@ -331,6 +382,38 @@ export class RunManager {
331
382
  // Feed events to checkpoint writer and artifact tracker
332
383
  await checkpointWriter.onStreamEvent(event);
333
384
  await artifactTracker.onStreamEvent(event);
385
+ // Link the run's sessionId the moment the engine resolves it.
386
+ // session_started fires at run START (engine.ts:1081); without this,
387
+ // sessionId is only written at completion, so in-flight runs have
388
+ // sessionId=null on disk and never reach the sidebar import.
389
+ //
390
+ // The `!agentId` guard is defensive: the built-in engine already
391
+ // suppresses sub-agent session_started upstream (engine.ts:830-835),
392
+ // but a custom RunExecutor could forward sub-agent events — and only
393
+ // the MAIN run's session should identify the run, never a sub-agent's.
394
+ if (event.type === "session_started" &&
395
+ !event.agentId) {
396
+ try {
397
+ const run = await this.getOrThrow(runId);
398
+ if (run.sessionId !== event.sessionId) {
399
+ run.sessionId = event.sessionId;
400
+ checkpointWriter.setSessionId(event.sessionId);
401
+ await this.store.update(run);
402
+ await this.emitRunEvent(runId, "session_linked", {
403
+ sessionId: event.sessionId,
404
+ });
405
+ }
406
+ }
407
+ catch (linkErr) {
408
+ // Don't let a snapshot-write failure abort the run as a swallowed
409
+ // unhandled rejection — log and continue; the completion-time link
410
+ // is the backstop.
411
+ logger.warn("run.session_link_error", {
412
+ runId,
413
+ error: linkErr instanceof Error ? linkErr.message : String(linkErr),
414
+ });
415
+ }
416
+ }
334
417
  // Forward to run subscribers
335
418
  this.notifySubscribers(runId, { type: "engine_stream", event });
336
419
  },
@@ -11,6 +11,7 @@ export type RunQueueExecutor = (runId: string) => Promise<void>;
11
11
  export declare class RunQueue {
12
12
  private readonly concurrency;
13
13
  private readonly pending;
14
+ private readonly pendingSet;
14
15
  private readonly active;
15
16
  private executor;
16
17
  private draining;
@@ -6,7 +6,10 @@
6
6
  */
7
7
  export class RunQueue {
8
8
  concurrency;
9
+ // `pending` keeps FIFO order; `pendingSet` mirrors its membership for O(1)
10
+ // dedup/lookup (the array's includes() was O(n)).
9
11
  pending = [];
12
+ pendingSet = new Set();
10
13
  active = new Set();
11
14
  executor = null;
12
15
  draining = false;
@@ -17,15 +20,17 @@ export class RunQueue {
17
20
  this.executor = fn;
18
21
  }
19
22
  enqueue(runId) {
20
- if (this.pending.includes(runId) || this.active.has(runId))
23
+ if (this.pendingSet.has(runId) || this.active.has(runId))
21
24
  return;
22
25
  this.pending.push(runId);
26
+ this.pendingSet.add(runId);
23
27
  this.drain();
24
28
  }
25
29
  cancel(runId) {
26
30
  const idx = this.pending.indexOf(runId);
27
31
  if (idx !== -1) {
28
32
  this.pending.splice(idx, 1);
33
+ this.pendingSet.delete(runId);
29
34
  return true;
30
35
  }
31
36
  return false;
@@ -34,7 +39,7 @@ export class RunQueue {
34
39
  return this.active.has(runId);
35
40
  }
36
41
  isPending(runId) {
37
- return this.pending.includes(runId);
42
+ return this.pendingSet.has(runId);
38
43
  }
39
44
  get activeCount() {
40
45
  return this.active.size;
@@ -57,6 +62,7 @@ export class RunQueue {
57
62
  return;
58
63
  while (this.active.size < this.concurrency && this.pending.length > 0) {
59
64
  const runId = this.pending.shift();
65
+ this.pendingSet.delete(runId);
60
66
  this.active.add(runId);
61
67
  this.executor(runId)
62
68
  .catch((err) => {
@@ -18,7 +18,7 @@
18
18
  * ```
19
19
  */
20
20
  import type { LLMConfig, PermissionMode } from "../types.js";
21
- import type { EngineConfig, EngineHookConfig } from "../engine/engine.js";
21
+ import type { EngineConfig, EngineHookConfig } from "../engine/types.js";
22
22
  import type { Evaluator } from "./Evaluator.js";
23
23
  import { RunManager } from "./RunManager.js";
24
24
  export interface CreateRunManagerOptions {
@@ -56,6 +56,13 @@ export interface CreateRunManagerOptions {
56
56
  defaultTags?: string[];
57
57
  /** Metadata merged into every submitted run. Submit input wins on conflicts. */
58
58
  defaultMetadata?: Record<string, unknown>;
59
+ /**
60
+ * Override the approval backend for every run. Used by unattended hosts
61
+ * (automation/cron) that must auto-decide without a UI — e.g.
62
+ * `new HeadlessApprovalBackend("approve-read-only")`. When unset, runs use
63
+ * the interactive run-aware backend.
64
+ */
65
+ approvalBackend?: import("../tool-system/permission.js").ApprovalBackend;
59
66
  }
60
67
  /**
61
68
  * Create a fully configured RunManager with one call.
@@ -41,6 +41,7 @@ export function createRunManager(options) {
41
41
  customSystemPrompt: options.customSystemPrompt,
42
42
  appendSystemPrompt: options.appendSystemPrompt,
43
43
  hooks: options.hooks,
44
+ ...(options.approvalBackend ? { approvalBackend: options.approvalBackend } : {}),
44
45
  },
45
46
  concurrency: options.concurrency ?? 1,
46
47
  runsDir,
@@ -9,9 +9,9 @@ export { RunQueue } from "./RunQueue.js";
9
9
  export { RunApprovalBackend, createRunAskUserFn, type RunLifecycleHooks, type PendingApproval, type PendingInput, } from "./RunApprovalBackend.js";
10
10
  export { CheckpointWriter, type CheckpointWriterConfig } from "./CheckpointWriter.js";
11
11
  export { ArtifactTracker, type ArtifactTrackerConfig } from "./ArtifactTracker.js";
12
- export { RunLock, type RunLockConfig } from "./RunLock.js";
12
+ export { RunLock, type RunLockConfig, type RunLockAcquireResult } from "./RunLock.js";
13
13
  export { Heartbeat, type HeartbeatConfig, type HeartbeatData } from "./Heartbeat.js";
14
14
  export { NoopEvaluator, CompositeEvaluator, type Evaluator, type EvaluatorResult, type EvaluatorVerdict, type EvaluatorContext, } from "./Evaluator.js";
15
- export { EngineRunner, type EngineRunnerConfig, type RunExecutionHandle, type RunExecutor, type CustomToolEntry, } from "./EngineRunner.js";
15
+ export { EngineRunner, AUTOMATION_PROMPT_NOTE, AUTOMATION_RUN_SOURCE, type EngineRunnerConfig, type RunExecutionHandle, type RunExecutor, type CustomToolEntry, } from "./EngineRunner.js";
16
16
  export { RunManager, type RunManagerConfig } from "./RunManager.js";
17
17
  export { createRunManager, type CreateRunManagerOptions } from "./factory.js";
package/dist/run/index.js CHANGED
@@ -16,7 +16,7 @@ export { Heartbeat } from "./Heartbeat.js";
16
16
  // Evaluator
17
17
  export { NoopEvaluator, CompositeEvaluator, } from "./Evaluator.js";
18
18
  // Runner
19
- export { EngineRunner, } from "./EngineRunner.js";
19
+ export { EngineRunner, AUTOMATION_PROMPT_NOTE, AUTOMATION_RUN_SOURCE, } from "./EngineRunner.js";
20
20
  // Manager
21
21
  export { RunManager } from "./RunManager.js";
22
22
  // Factory
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Extract the file target of a trailing shell redirect (`> file` / `>> file`).
3
+ * Handles quoted paths with spaces — the old /> \s*(\S+)\s*$/ matched only the
4
+ * first non-whitespace run, so `> "my file.txt"` yielded `"my`
5
+ * (review-2026-05-30). Returns undefined when there's no trailing redirect.
6
+ */
7
+ export declare function parseRedirectTarget(command: string): string | undefined;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Extract the file target of a trailing shell redirect (`> file` / `>> file`).
3
+ * Handles quoted paths with spaces — the old /> \s*(\S+)\s*$/ matched only the
4
+ * first non-whitespace run, so `> "my file.txt"` yielded `"my`
5
+ * (review-2026-05-30). Returns undefined when there's no trailing redirect.
6
+ */
7
+ export function parseRedirectTarget(command) {
8
+ // Optional quote captured in group 1; body in group 2 (or unquoted in 3).
9
+ const m = command.match(/>>?\s*(?:(['"])(.*?)\1|(\S+))\s*$/);
10
+ if (!m)
11
+ return undefined;
12
+ return m[2] !== undefined ? m[2] : m[3];
13
+ }
package/dist/run/types.js CHANGED
@@ -10,7 +10,7 @@
10
10
  * Key = current status, Value = allowed next statuses.
11
11
  */
12
12
  export const VALID_TRANSITIONS = {
13
- queued: ["running", "cancelled"],
13
+ queued: ["running", "blocked", "cancelled"],
14
14
  running: [
15
15
  "waiting_input",
16
16
  "waiting_approval",
@@ -0,0 +1,139 @@
1
+ /**
2
+ * BackgroundShellManager — session-scoped registry + lifecycle for
3
+ * fire-and-forget background shells (design §4).
4
+ *
5
+ * A background shell is a long-lived process (typically `npm run dev`)
6
+ * started via `Bash(run_in_background=true)`. Unlike the foreground Bash
7
+ * path (which awaits the command to completion), this:
8
+ *
9
+ * - spawns the command **detached** so it owns its own process group
10
+ * (so KillShell can reap the whole `sh → npm → node vite` tree, §难点2);
11
+ * - returns a `shell_id` immediately, never blocking the turn;
12
+ * - streams output to an in-memory ring buffer + a wrap-around disk file,
13
+ * stripping ANSI/progress noise only when handed to the agent (§难点4);
14
+ * - detects a served port best-effort from the output (§难点3);
15
+ * - is **completely separate** from `asyncAgentRegistry` so Engine.run's
16
+ * wait-for-background loop never waits on a dev server (§难点5);
17
+ * - on exit, enqueues a one-line completion notification (no output body,
18
+ * §难点6 / D6) keyed by sessionId.
19
+ *
20
+ * Lifetime is process-local and session-scoped: `killSession(sid)` on
21
+ * explicit session deletion, `killAll()` on app/worker exit. Crashing the
22
+ * worker leaks the detached children as orphans — pidfiles let a restarted
23
+ * worker discover and reap them (§难点1, `reapOrphansFromPidfiles`).
24
+ */
25
+ import type { SandboxBackend } from "../tool-system/sandbox/index.js";
26
+ export type BgShellStatus = "starting" | "running" | "exited" | "killed" | "orphaned";
27
+ /** Per-session soft cap on background shells (design §7 — fork-bomb guard). */
28
+ export declare const MAX_SHELLS_PER_SESSION = 16;
29
+ interface PidfileRecord {
30
+ shellId: string;
31
+ pgid: number;
32
+ command: string;
33
+ port?: number;
34
+ startedAt: number;
35
+ sessionId: string;
36
+ }
37
+ export interface BgShell {
38
+ shellId: string;
39
+ sessionId: string;
40
+ command: string;
41
+ cwd: string;
42
+ pgid: number;
43
+ status: BgShellStatus;
44
+ startedAt: number;
45
+ exitedAt?: number;
46
+ exitCode: number | null;
47
+ signal: NodeJS.Signals | null;
48
+ detectedPort?: number;
49
+ /** Absolute stream position (RingFile.totalWritten) already returned to the
50
+ * agent. Absolute — not window-relative — so it survives ring wraparound. */
51
+ agentReadOffset: number;
52
+ /** Total bytes the shell has written so far (monotonic, survives ring
53
+ * wraparound). Lets the UI show live progress for long jobs like downloads
54
+ * ("↑ 1.1 GB") even though the panel doesn't parse the output itself. */
55
+ totalBytes: number;
56
+ didWrap: boolean;
57
+ diskAvailable: boolean;
58
+ }
59
+ export interface SpawnBackgroundOptions {
60
+ command: string;
61
+ cwd: string;
62
+ sessionId: string;
63
+ shell?: string;
64
+ sandbox?: SandboxBackend;
65
+ /**
66
+ * Project `localEnvironment.env` to layer on top of the base shell env
67
+ * (see mergeShellEnv). Same source as the foreground Bash tool's
68
+ * `ctx.shellEnv` — passed through so a background dev server sees the same
69
+ * project env as a one-shot command.
70
+ */
71
+ shellEnv?: Record<string, string>;
72
+ }
73
+ export type SpawnResult = {
74
+ ok: true;
75
+ shellId: string;
76
+ } | {
77
+ ok: false;
78
+ error: string;
79
+ };
80
+ export type ReadResult = {
81
+ ok: true;
82
+ text: string;
83
+ header: string;
84
+ } | {
85
+ ok: false;
86
+ error: string;
87
+ };
88
+ export type KillResult = {
89
+ ok: true;
90
+ alreadyExited?: boolean;
91
+ status: BgShellStatus;
92
+ } | {
93
+ ok: false;
94
+ error: string;
95
+ };
96
+ export declare class BackgroundShellManager {
97
+ private shells;
98
+ spawnBackground(opts: SpawnBackgroundOptions): SpawnResult;
99
+ private finalize;
100
+ private enqueueExitNotification;
101
+ private updatePidfilePort;
102
+ get(shellId: string): BgShell | undefined;
103
+ /** Raw retained output (no cleaning) — test/UI helper. */
104
+ readOutputRaw(shellId: string): string | undefined;
105
+ listForSession(sessionId: string): BgShell[];
106
+ /**
107
+ * Read a shell's output. `mode=incremental` (default) returns text since the
108
+ * agent's last read; `mode=all` returns the full retained buffer. Output is
109
+ * ANSI-stripped and progress-folded, capped at the last READ_RETURN_CAP
110
+ * chars. `expectSessionId`, when given, enforces session ownership.
111
+ */
112
+ readOutput(shellId: string, mode?: "incremental" | "all", expectSessionId?: string): ReadResult;
113
+ /**
114
+ * Build the status header line for a readOutput result. `mode` shapes the cap
115
+ * note: `all` keeps the trailing 16KB (older output omitted from THIS view),
116
+ * while incremental paginates (more output available on the next read).
117
+ */
118
+ private buildHeader;
119
+ /** Terminate a shell (its whole process group). Idempotent. */
120
+ kill(shellId: string, expectSessionId?: string): Promise<KillResult>;
121
+ /** Kill every background shell belonging to `sessionId`. */
122
+ killSession(sessionId: string): Promise<void>;
123
+ /** Kill every background shell (app/worker exit). */
124
+ killAll(): Promise<void>;
125
+ /**
126
+ * Scan pidfiles left by a previous (crashed) worker. For each: if the pgid
127
+ * is still alive it's an orphan (the dev server outlived its worker) — list
128
+ * it as `orphaned` so KillShell can clean it up; if dead, delete the stale
129
+ * pidfile. Returns the orphaned records found.
130
+ */
131
+ reapOrphansFromPidfiles(): PidfileRecord[];
132
+ private registerOrphan;
133
+ /** Test/reset helper — clears the registry without killing (used in tests). */
134
+ _clear(): void;
135
+ private toPublic;
136
+ }
137
+ /** Process-local singleton, mirroring asyncAgentRegistry's lifetime contract. */
138
+ export declare const backgroundShellManager: BackgroundShellManager;
139
+ export {};