@cjhyy/code-shell-core 0.7.1 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/path-policy.js +99 -2
  374. package/dist/tool-system/permission.d.ts +26 -0
  375. package/dist/tool-system/permission.js +46 -0
  376. package/dist/tool-system/registry.d.ts +12 -1
  377. package/dist/tool-system/registry.js +31 -7
  378. package/dist/tool-system/sandbox/index.js +3 -8
  379. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  380. package/dist/tool-system/session-tool-host.d.ts +139 -0
  381. package/dist/tool-system/session-tool-host.js +167 -0
  382. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  383. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  384. package/dist/tool-system/validation.d.ts +14 -7
  385. package/dist/tool-system/validation.js +701 -7
  386. package/dist/types.d.ts +186 -20
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  388. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  389. package/dist/utils/file-mutex.d.ts +65 -0
  390. package/dist/utils/file-mutex.js +145 -0
  391. package/dist/utils/json.d.ts +2 -4
  392. package/dist/utils/json.js +2 -4
  393. package/dist/utils/lockfile.d.ts +30 -1
  394. package/dist/utils/lockfile.js +2 -2
  395. package/dist/utils/secret-scrubber.d.ts +8 -0
  396. package/dist/utils/secret-scrubber.js +227 -0
  397. package/dist/utils/toolDisplay.js +1 -1
  398. package/package.json +20 -5
  399. package/THIRD_PARTY_NOTICES.md +0 -206
  400. package/dist/arena/arena.d.ts +0 -45
  401. package/dist/arena/arena.js +0 -362
  402. package/dist/arena/context/context-tools.d.ts +0 -16
  403. package/dist/arena/context/context-tools.js +0 -272
  404. package/dist/arena/context/within-root.d.ts +0 -7
  405. package/dist/arena/context/within-root.js +0 -15
  406. package/dist/arena/detect-mode.d.ts +0 -20
  407. package/dist/arena/detect-mode.js +0 -78
  408. package/dist/arena/digest-builder.d.ts +0 -25
  409. package/dist/arena/digest-builder.js +0 -120
  410. package/dist/arena/index.d.ts +0 -29
  411. package/dist/arena/index.js +0 -29
  412. package/dist/arena/iterate/convergence.d.ts +0 -25
  413. package/dist/arena/iterate/convergence.js +0 -103
  414. package/dist/arena/iterate/formats/index.d.ts +0 -22
  415. package/dist/arena/iterate/formats/index.js +0 -283
  416. package/dist/arena/iterate/index.d.ts +0 -11
  417. package/dist/arena/iterate/index.js +0 -9
  418. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  419. package/dist/arena/iterate/iterative-arena.js +0 -237
  420. package/dist/arena/iterate/parse.d.ts +0 -42
  421. package/dist/arena/iterate/parse.js +0 -123
  422. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  423. package/dist/arena/iterate/phases/argue.js +0 -165
  424. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  425. package/dist/arena/iterate/phases/revise.js +0 -62
  426. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  427. package/dist/arena/iterate/phases/tournament.js +0 -113
  428. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  429. package/dist/arena/iterate/tools/web-tools.js +0 -54
  430. package/dist/arena/iterate/types.d.ts +0 -152
  431. package/dist/arena/iterate/types.js +0 -8
  432. package/dist/arena/ledger.d.ts +0 -47
  433. package/dist/arena/ledger.js +0 -159
  434. package/dist/arena/lenses/architecture.d.ts +0 -5
  435. package/dist/arena/lenses/architecture.js +0 -22
  436. package/dist/arena/lenses/engineering.d.ts +0 -5
  437. package/dist/arena/lenses/engineering.js +0 -22
  438. package/dist/arena/lenses/general.d.ts +0 -5
  439. package/dist/arena/lenses/general.js +0 -20
  440. package/dist/arena/lenses/index.d.ts +0 -16
  441. package/dist/arena/lenses/index.js +0 -47
  442. package/dist/arena/lenses/product.d.ts +0 -5
  443. package/dist/arena/lenses/product.js +0 -22
  444. package/dist/arena/model-presets.d.ts +0 -23
  445. package/dist/arena/model-presets.js +0 -44
  446. package/dist/arena/phases/adjudication.d.ts +0 -25
  447. package/dist/arena/phases/adjudication.js +0 -142
  448. package/dist/arena/phases/build-consensus.d.ts +0 -30
  449. package/dist/arena/phases/build-consensus.js +0 -85
  450. package/dist/arena/phases/claim-registry.d.ts +0 -26
  451. package/dist/arena/phases/claim-registry.js +0 -60
  452. package/dist/arena/phases/cross-review.d.ts +0 -47
  453. package/dist/arena/phases/cross-review.js +0 -224
  454. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  455. package/dist/arena/phases/debate-rounds.js +0 -161
  456. package/dist/arena/phases/participant-research.d.ts +0 -39
  457. package/dist/arena/phases/participant-research.js +0 -316
  458. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  459. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  460. package/dist/arena/planner.d.ts +0 -28
  461. package/dist/arena/planner.js +0 -312
  462. package/dist/arena/providers/docs.d.ts +0 -7
  463. package/dist/arena/providers/docs.js +0 -111
  464. package/dist/arena/providers/git.d.ts +0 -8
  465. package/dist/arena/providers/git.js +0 -174
  466. package/dist/arena/providers/index.d.ts +0 -32
  467. package/dist/arena/providers/index.js +0 -132
  468. package/dist/arena/providers/none.d.ts +0 -7
  469. package/dist/arena/providers/none.js +0 -11
  470. package/dist/arena/providers/repo.d.ts +0 -7
  471. package/dist/arena/providers/repo.js +0 -258
  472. package/dist/arena/render/session.d.ts +0 -17
  473. package/dist/arena/render/session.js +0 -190
  474. package/dist/arena/render/terminal.d.ts +0 -34
  475. package/dist/arena/render/terminal.js +0 -286
  476. package/dist/arena/strategies/discussion.d.ts +0 -25
  477. package/dist/arena/strategies/discussion.js +0 -143
  478. package/dist/arena/strategies/index.d.ts +0 -15
  479. package/dist/arena/strategies/index.js +0 -28
  480. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  481. package/dist/arena/strategies/language-wrapper.js +0 -102
  482. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  483. package/dist/arena/strategies/lens-wrapper.js +0 -236
  484. package/dist/arena/strategies/planning.d.ts +0 -30
  485. package/dist/arena/strategies/planning.js +0 -225
  486. package/dist/arena/strategies/review.d.ts +0 -26
  487. package/dist/arena/strategies/review.js +0 -168
  488. package/dist/arena/strategies/utils.d.ts +0 -36
  489. package/dist/arena/strategies/utils.js +0 -603
  490. package/dist/arena/tools/selector.d.ts +0 -17
  491. package/dist/arena/tools/selector.js +0 -61
  492. package/dist/arena/transitions.d.ts +0 -53
  493. package/dist/arena/transitions.js +0 -97
  494. package/dist/arena/types.d.ts +0 -518
  495. package/dist/arena/types.js +0 -27
  496. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  497. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  498. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  499. package/dist/cc-orchestrator/cc-capability.js +0 -53
  500. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  501. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  502. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  503. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  504. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  505. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  506. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  507. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  508. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  509. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  510. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  511. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  512. package/dist/cc-orchestrator/index.d.ts +0 -8
  513. package/dist/cc-orchestrator/index.js +0 -8
  514. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  515. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  516. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  517. package/dist/cc-orchestrator/session-discovery.js +0 -125
  518. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  519. package/dist/cc-orchestrator/session-history.js +0 -150
  520. package/dist/cron/cron-runtime.d.ts +0 -2
  521. package/dist/cron/cron-runtime.js +0 -2
  522. package/dist/cron/cron-store.d.ts +0 -2
  523. package/dist/cron/cron-store.js +0 -2
  524. package/dist/cron/scheduler.d.ts +0 -7
  525. package/dist/cron/scheduler.js +0 -7
  526. package/dist/engine/goal.js +0 -206
  527. package/dist/external-agents/config.d.ts +0 -2
  528. package/dist/external-agents/config.js +0 -15
  529. package/dist/external-agents/types.d.ts +0 -31
  530. package/dist/git/parse-log.d.ts +0 -13
  531. package/dist/git/parse-log.js +0 -21
  532. package/dist/git/utils.d.ts +0 -49
  533. package/dist/git/utils.js +0 -161
  534. package/dist/git/worktree/crud.d.ts +0 -72
  535. package/dist/git/worktree/crud.js +0 -235
  536. package/dist/git/worktree/diff.d.ts +0 -14
  537. package/dist/git/worktree/diff.js +0 -82
  538. package/dist/git/worktree/git-exec.d.ts +0 -7
  539. package/dist/git/worktree/git-exec.js +0 -87
  540. package/dist/git/worktree/index.d.ts +0 -5
  541. package/dist/git/worktree/index.js +0 -5
  542. package/dist/git/worktree/query.d.ts +0 -43
  543. package/dist/git/worktree/query.js +0 -128
  544. package/dist/git/worktree/slug.d.ts +0 -11
  545. package/dist/git/worktree/slug.js +0 -58
  546. package/dist/git/worktree.d.ts +0 -1
  547. package/dist/git/worktree.js +0 -5
  548. package/dist/lsp/client.d.ts +0 -41
  549. package/dist/lsp/client.js +0 -186
  550. package/dist/lsp/manager.d.ts +0 -40
  551. package/dist/lsp/manager.js +0 -155
  552. package/dist/lsp/root-path.d.ts +0 -9
  553. package/dist/lsp/root-path.js +0 -12
  554. package/dist/lsp/servers.d.ts +0 -16
  555. package/dist/lsp/servers.js +0 -60
  556. package/dist/prompt/sections/coding.md +0 -35
  557. package/dist/quota/credentials.d.ts +0 -3
  558. package/dist/quota/credentials.js +0 -80
  559. package/dist/quota/index.d.ts +0 -36
  560. package/dist/quota/index.js +0 -155
  561. package/dist/quota/types.d.ts +0 -48
  562. package/dist/quota/types.js +0 -13
  563. package/dist/review/review-prompt.d.ts +0 -28
  564. package/dist/review/review-prompt.js +0 -81
  565. package/dist/state.d.ts +0 -160
  566. package/dist/state.js +0 -267
  567. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  568. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  570. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  571. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  572. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  573. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  574. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  576. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  577. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  578. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  579. package/dist/tool-system/builtin/arena.d.ts +0 -31
  580. package/dist/tool-system/builtin/arena.js +0 -416
  581. package/dist/tool-system/builtin/brief.d.ts +0 -6
  582. package/dist/tool-system/builtin/brief.js +0 -41
  583. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  584. package/dist/tool-system/builtin/check-quota.js +0 -34
  585. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  586. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  587. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  588. package/dist/tool-system/builtin/lsp.js +0 -144
  589. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  590. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  591. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  592. package/dist/tool-system/builtin/worktree.js +0 -363
  593. /package/dist/{external-agents → links}/types.js +0 -0
  594. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  595. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -13,6 +13,7 @@ import { createTranscriptTranslator } from "./agent-transcript-translator.js";
13
13
  import { notificationQueue } from "./agent-notifications.js";
14
14
  import { nanoid } from "nanoid";
15
15
  import { logger } from "../../logging/logger.js";
16
+ import { applyAgentProgressPhase, applyAgentProgressUsage, initialAgentProgress, reduceAgentProgress, } from "./agent-progress.js";
16
17
  /**
17
18
  * Invoke a stream callback that came from outside the engine's own
18
19
  * TurnLoop wrap (e.g. `subAgentSpawner.parentStream`, which is the
@@ -69,6 +70,8 @@ export function resolveAgentTypeOverrides(agentType, registry) {
69
70
  maxTurns: def.maxTurns,
70
71
  toolAllowlist: def.tools,
71
72
  skillAllowlist: namespacePluginSkills(def.skills, def.source, def.pluginName),
73
+ sandboxMode: def.sandbox,
74
+ mcpAllowlist: def.mcp,
72
75
  appendSystemPrompt: def.systemPrompt,
73
76
  };
74
77
  }
@@ -273,10 +276,34 @@ streamOverride) {
273
276
  if (usage)
274
277
  opts.recordBilledUsage?.(usage);
275
278
  const finalText = text || `Agent completed but produced no text output.`;
276
- safeEmit(startEndSink, { type: "agent_end", agentId, name, description, text: finalText, agentType });
279
+ safeEmit(startEndSink, {
280
+ type: "agent_end",
281
+ agentId,
282
+ name,
283
+ description,
284
+ text: finalText,
285
+ agentType,
286
+ });
277
287
  emitSubAgentHook(opts.hooks, "subagent_finish", { agentId, description, text: finalText });
278
288
  return finalText;
279
289
  }
290
+ function createAgentProgressTracker(agentId) {
291
+ let progress = initialAgentProgress();
292
+ return {
293
+ current: () => progress,
294
+ onEvent: (event) => {
295
+ progress = reduceAgentProgress(progress, event);
296
+ asyncAgentRegistry.updateProgress(agentId, progress);
297
+ },
298
+ onRuntime: (event) => {
299
+ progress =
300
+ event.type === "usage"
301
+ ? applyAgentProgressUsage(progress, event.usage)
302
+ : applyAgentProgressPhase(progress, event.phase, Date.now(), event.toolName);
303
+ asyncAgentRegistry.updateProgress(agentId, progress);
304
+ },
305
+ };
306
+ }
280
307
  export async function agentTool(args, ctx) {
281
308
  const prompt = args.prompt;
282
309
  const description = args.description || "sub-agent";
@@ -329,10 +356,13 @@ export async function agentTool(args, ctx) {
329
356
  // through AgentCancel(agent_id).
330
357
  if (runInBackground) {
331
358
  if (asyncAgentRegistry.runningCount() >= MAX_BACKGROUND_AGENTS) {
332
- return `Error: too many background agents running (limit ${MAX_BACKGROUND_AGENTS}). ` +
333
- `Wait for some to finish or cancel one with AgentCancel(agent_id) before launching more.`;
359
+ return (`Error: too many background agents running (limit ${MAX_BACKGROUND_AGENTS}). ` +
360
+ `Wait for some to finish or cancel one with AgentCancel(agent_id) before launching more.`);
334
361
  }
335
362
  const controller = new AbortController();
363
+ const runtimeGeneration = asyncAgentRegistry.allocateRuntimeGeneration(agentId);
364
+ const progressTracker = createAgentProgressTracker(agentId);
365
+ let liveLease;
336
366
  asyncAgentRegistry.register({
337
367
  agentId,
338
368
  name,
@@ -341,6 +371,9 @@ export async function agentTool(args, ctx) {
341
371
  // Tag with the spawning session so the parent Engine.run waits only on
342
372
  // its own background agents (hasRunningForSession).
343
373
  sessionId: ctx?.sessionId,
374
+ childSessionId: agentId,
375
+ runtimeGeneration,
376
+ progress: progressTracker.current(),
344
377
  status: "running",
345
378
  startedAt: Date.now(),
346
379
  abort: () => controller.abort(),
@@ -371,15 +404,52 @@ export async function agentTool(args, ctx) {
371
404
  model: overrides.model,
372
405
  toolAllowlist: overrides.toolAllowlist,
373
406
  skillAllowlist: overrides.skillAllowlist,
407
+ sandboxMode: overrides.sandboxMode,
408
+ mcpAllowlist: overrides.mcpAllowlist,
374
409
  appendSystemPrompt: overrides.appendSystemPrompt,
375
410
  readOnlySession: overrides.resolvedType === "researcher" || overrides.resolvedType === "explorer",
376
411
  hooks: ctx?.hooks,
377
412
  recordBilledUsage: ctx?.recordBilledUsage,
413
+ runtimeGeneration,
414
+ bindLiveControl: (control, ownerToken) => {
415
+ const lease = asyncAgentRegistry.acquireWriterLease(control.childSessionId, control.runtimeGeneration, ownerToken);
416
+ if (!lease)
417
+ return false;
418
+ if (!asyncAgentRegistry.bindLiveControl(agentId, control, lease)) {
419
+ asyncAgentRegistry.releaseWriterLease(lease);
420
+ return false;
421
+ }
422
+ liveLease = lease;
423
+ return lease;
424
+ },
425
+ closeLiveControl: (_control, lease) => {
426
+ if (lease)
427
+ asyncAgentRegistry.closeDirectionIntake(agentId, lease);
428
+ },
429
+ onProgressEvent: progressTracker.onEvent,
430
+ onAgentProgress: progressTracker.onRuntime,
378
431
  signal: controller.signal,
379
432
  }, parentStream, // uiStream: agent_start/end → main feed
380
433
  transcriptSink)
381
434
  .then((text) => {
382
- asyncAgentRegistry.markCompleted(agentId);
435
+ if (controller.signal.aborted) {
436
+ if (liveLease)
437
+ asyncAgentRegistry.completeTerminal(agentId, "cancelled", liveLease);
438
+ else
439
+ asyncAgentRegistry.markCancelled(agentId);
440
+ void ctx?.hooks?.emit("notification", {
441
+ kind: "agent_cancelled",
442
+ agentId,
443
+ name,
444
+ description,
445
+ });
446
+ return;
447
+ }
448
+ const transitioned = liveLease
449
+ ? asyncAgentRegistry.completeTerminal(agentId, "completed", liveLease)
450
+ : (asyncAgentRegistry.markCompleted(agentId), true);
451
+ if (!transitioned)
452
+ return;
383
453
  // External-readable copy of the result (tail / cross-session history).
384
454
  // Best-effort; never blocks the completion path.
385
455
  void writeAgentOutputFile(agentId, {
@@ -442,7 +512,10 @@ export async function agentTool(args, ctx) {
442
512
  // User-initiated cancel: mark status but do NOT enqueue —
443
513
  // the main agent doesn't need a follow-up turn. Dock still
444
514
  // shows the "cancelled" badge for the fade window.
445
- asyncAgentRegistry.markCancelled(agentId);
515
+ if (liveLease)
516
+ asyncAgentRegistry.completeTerminal(agentId, "cancelled", liveLease);
517
+ else
518
+ asyncAgentRegistry.markCancelled(agentId);
446
519
  void ctx?.hooks?.emit("notification", {
447
520
  kind: "agent_cancelled",
448
521
  agentId,
@@ -451,7 +524,11 @@ export async function agentTool(args, ctx) {
451
524
  });
452
525
  return;
453
526
  }
454
- asyncAgentRegistry.markFailed(agentId);
527
+ const transitioned = liveLease
528
+ ? asyncAgentRegistry.completeTerminal(agentId, "failed", liveLease)
529
+ : (asyncAgentRegistry.markFailed(agentId), true);
530
+ if (!transitioned)
531
+ return;
455
532
  void writeAgentOutputFile(agentId, {
456
533
  status: "failed",
457
534
  body: err.message,
@@ -535,6 +612,7 @@ function recordCompletedSyncAgent(opts) {
535
612
  sessionId: opts.parentSessionId,
536
613
  // agent_id === childSid: the resumable session lives at sessions/<agentId>/.
537
614
  childSessionId: opts.agentId,
615
+ runtimeGeneration: opts.runtimeGeneration,
538
616
  status: "completed",
539
617
  startedAt: now,
540
618
  finishedAt: now,
@@ -566,6 +644,10 @@ async function runSyncSubAgent(args) {
566
644
  // the background, so the finally block leaves the parent-abort listener with
567
645
  // the background handlers instead of removing it.
568
646
  let handedOff = false;
647
+ const childSessionId = resumeSessionId ?? agentId;
648
+ const runtimeGeneration = asyncAgentRegistry.allocateRuntimeGeneration(childSessionId);
649
+ const progressTracker = createAgentProgressTracker(agentId);
650
+ let liveBinding;
569
651
  // Run the agent, but don't necessarily await it to completion: race the run
570
652
  // against the auto-background timer. The run promise is shared between the
571
653
  // inline await and (if we hand off) the background completion handlers, so
@@ -580,11 +662,30 @@ async function runSyncSubAgent(args) {
580
662
  model: overrides.model,
581
663
  toolAllowlist: overrides.toolAllowlist,
582
664
  skillAllowlist: overrides.skillAllowlist,
665
+ sandboxMode: overrides.sandboxMode,
666
+ mcpAllowlist: overrides.mcpAllowlist,
583
667
  appendSystemPrompt: overrides.appendSystemPrompt,
584
668
  readOnlySession: overrides.resolvedType === "researcher" || overrides.resolvedType === "explorer",
585
669
  resumeSessionId,
586
670
  hooks: ctx?.hooks,
587
671
  recordBilledUsage: ctx?.recordBilledUsage,
672
+ runtimeGeneration,
673
+ bindLiveControl: (control, ownerToken) => {
674
+ const lease = asyncAgentRegistry.acquireWriterLease(control.childSessionId, control.runtimeGeneration, ownerToken);
675
+ if (!lease)
676
+ return false;
677
+ liveBinding = { control, lease };
678
+ return lease;
679
+ },
680
+ closeLiveControl: (_control, lease) => {
681
+ if (!lease)
682
+ return;
683
+ if (handedOff)
684
+ return asyncAgentRegistry.closeDirectionIntake(agentId, lease);
685
+ return asyncAgentRegistry.releaseWriterLease(lease);
686
+ },
687
+ onProgressEvent: progressTracker.onEvent,
688
+ onAgentProgress: progressTracker.onRuntime,
588
689
  signal: syncController.signal,
589
690
  });
590
691
  // Sentinel that the timer resolves with, so we can tell "agent finished" from
@@ -599,7 +700,12 @@ async function runSyncSubAgent(args) {
599
700
  try {
600
701
  // If there's no timer (threshold 0/∞ disabled), just await as before.
601
702
  const winner = timerPromise
602
- ? await Promise.race([runPromise.then((t) => ({ ok: true, text: t })).catch((e) => ({ ok: false, err: e })), timerPromise])
703
+ ? await Promise.race([
704
+ runPromise
705
+ .then((t) => ({ ok: true, text: t }))
706
+ .catch((e) => ({ ok: false, err: e })),
707
+ timerPromise,
708
+ ])
603
709
  : { ok: true, text: await runPromise };
604
710
  if (winner === BG_HANDOFF) {
605
711
  // Threshold elapsed while the agent is STILL running. Detach it into the
@@ -616,6 +722,10 @@ async function runSyncSubAgent(args) {
616
722
  hooks: ctx?.hooks,
617
723
  parentSignal,
618
724
  onParentAbort,
725
+ childSessionId,
726
+ runtimeGeneration,
727
+ liveBinding,
728
+ progress: progressTracker.current(),
619
729
  // The agent_start fired in runSubAgent put the UI card into 'working'.
620
730
  // runSubAgent's own agent_end (line ~299) only fires if spawn() RESOLVES;
621
731
  // on failure/cancel it throws before that, so the card would hang
@@ -644,14 +754,26 @@ async function runSyncSubAgent(args) {
644
754
  agentType: overrides.resolvedType,
645
755
  description,
646
756
  parentSessionId: ctx?.sessionId,
757
+ runtimeGeneration,
647
758
  });
648
759
  return winner.text;
649
760
  }
650
761
  throw winner.err;
651
762
  }
652
763
  catch (err) {
653
- emitSubAgentHook(ctx?.hooks, "subagent_error", { agentId, description, error: err.message });
654
- safeEmit(parentStream, { type: "agent_end", agentId, name, description, error: err.message, agentType: overrides.resolvedType });
764
+ emitSubAgentHook(ctx?.hooks, "subagent_error", {
765
+ agentId,
766
+ description,
767
+ error: err.message,
768
+ });
769
+ safeEmit(parentStream, {
770
+ type: "agent_end",
771
+ agentId,
772
+ name,
773
+ description,
774
+ error: err.message,
775
+ agentType: overrides.resolvedType,
776
+ });
655
777
  if (parentSignal?.aborted)
656
778
  return "Agent was aborted.";
657
779
  return `Agent error: ${err.message}`;
@@ -674,7 +796,7 @@ async function runSyncSubAgent(args) {
674
796
  * a running (then completed/failed) background agent. Never aborts the agent.
675
797
  */
676
798
  function handoffToBackground(runPromise, controller, meta) {
677
- const { agentId, name, description, agentType, sessionId, hooks, uiStream } = meta;
799
+ const { agentId, name, description, agentType, sessionId, hooks, uiStream, childSessionId, runtimeGeneration, liveBinding, progress, } = meta;
678
800
  // The agent outlives the spawning turn now, so parent-turn abort must NOT
679
801
  // cascade to it (same contract as an explicit background agent). Detach the
680
802
  // parent listener; cancellation from here on goes through AgentCancel.
@@ -685,10 +807,21 @@ function handoffToBackground(runPromise, controller, meta) {
685
807
  agentType,
686
808
  description,
687
809
  sessionId,
810
+ childSessionId,
811
+ runtimeGeneration,
812
+ progress,
688
813
  status: "running",
689
814
  startedAt: Date.now(),
690
815
  abort: () => controller.abort(),
691
816
  });
817
+ if (liveBinding &&
818
+ !asyncAgentRegistry.bindLiveControl(agentId, liveBinding.control, liveBinding.lease)) {
819
+ logger.warn("agent_live_control.handoff_bind_failed", {
820
+ agentId,
821
+ childSessionId,
822
+ runtimeGeneration,
823
+ });
824
+ }
692
825
  // Tell the UI this agent is now running in the BACKGROUND (still working,
693
826
  // just detached from the parent turn). Without this the card's only signals
694
827
  // are agent_start (looks foreground) and the eventual agent_end — so during
@@ -701,7 +834,21 @@ function handoffToBackground(runPromise, controller, meta) {
701
834
  ensureAgentHeartbeat();
702
835
  runPromise
703
836
  .then((text) => {
704
- asyncAgentRegistry.markCompleted(agentId);
837
+ if (controller.signal.aborted) {
838
+ if (liveBinding) {
839
+ asyncAgentRegistry.completeTerminal(agentId, "cancelled", liveBinding.lease);
840
+ }
841
+ else {
842
+ asyncAgentRegistry.markCancelled(agentId);
843
+ }
844
+ void hooks?.emit("notification", { kind: "agent_cancelled", agentId, name, description });
845
+ return;
846
+ }
847
+ const transitioned = liveBinding
848
+ ? asyncAgentRegistry.completeTerminal(agentId, "completed", liveBinding.lease)
849
+ : (asyncAgentRegistry.markCompleted(agentId), true);
850
+ if (!transitioned)
851
+ return;
705
852
  void writeAgentOutputFile(agentId, {
706
853
  status: "completed",
707
854
  body: text,
@@ -710,24 +857,53 @@ function handoffToBackground(runPromise, controller, meta) {
710
857
  onError: (m, meta) => logger.warn(m, meta),
711
858
  });
712
859
  if (sessionId) {
713
- notificationQueue.enqueue({ agentId, name, description, status: "completed", finalText: text, enqueuedAt: Date.now() }, sessionId);
860
+ notificationQueue.enqueue({
861
+ agentId,
862
+ name,
863
+ description,
864
+ status: "completed",
865
+ finalText: text,
866
+ enqueuedAt: Date.now(),
867
+ }, sessionId);
714
868
  }
715
869
  else {
716
870
  logger.warn("agent_completion_without_session", { agentId, name, status: "completed" });
717
871
  }
718
- void hooks?.emit("notification", { kind: "agent_completed", agentId, name, description, finalText: text });
872
+ void hooks?.emit("notification", {
873
+ kind: "agent_completed",
874
+ agentId,
875
+ name,
876
+ description,
877
+ finalText: text,
878
+ });
719
879
  })
720
880
  .catch((err) => {
721
881
  // runSubAgent threw before its success agent_end, so the UI card is still
722
882
  // 'working'. Close it out with a terminal agent_end{error} (mirrors the
723
883
  // synchronous catch at the agentTool level).
724
- safeEmit(uiStream, { type: "agent_end", agentId, name, description, error: err.message, agentType });
884
+ safeEmit(uiStream, {
885
+ type: "agent_end",
886
+ agentId,
887
+ name,
888
+ description,
889
+ error: err.message,
890
+ agentType,
891
+ });
725
892
  if (controller.signal.aborted) {
726
- asyncAgentRegistry.markCancelled(agentId);
893
+ if (liveBinding) {
894
+ asyncAgentRegistry.completeTerminal(agentId, "cancelled", liveBinding.lease);
895
+ }
896
+ else {
897
+ asyncAgentRegistry.markCancelled(agentId);
898
+ }
727
899
  void hooks?.emit("notification", { kind: "agent_cancelled", agentId, name, description });
728
900
  return;
729
901
  }
730
- asyncAgentRegistry.markFailed(agentId);
902
+ const transitioned = liveBinding
903
+ ? asyncAgentRegistry.completeTerminal(agentId, "failed", liveBinding.lease)
904
+ : (asyncAgentRegistry.markFailed(agentId), true);
905
+ if (!transitioned)
906
+ return;
731
907
  void writeAgentOutputFile(agentId, {
732
908
  status: "failed",
733
909
  body: err.message,
@@ -736,12 +912,25 @@ function handoffToBackground(runPromise, controller, meta) {
736
912
  onError: (m, meta) => logger.warn(m, meta),
737
913
  });
738
914
  if (sessionId) {
739
- notificationQueue.enqueue({ agentId, name, description, status: "failed", error: err.message, enqueuedAt: Date.now() }, sessionId);
915
+ notificationQueue.enqueue({
916
+ agentId,
917
+ name,
918
+ description,
919
+ status: "failed",
920
+ error: err.message,
921
+ enqueuedAt: Date.now(),
922
+ }, sessionId);
740
923
  }
741
924
  else {
742
925
  logger.warn("agent_completion_without_session", { agentId, name, status: "failed" });
743
926
  }
744
- void hooks?.emit("notification", { kind: "agent_failed", agentId, name, description, error: err.message });
927
+ void hooks?.emit("notification", {
928
+ kind: "agent_failed",
929
+ agentId,
930
+ name,
931
+ description,
932
+ error: err.message,
933
+ });
745
934
  });
746
935
  }
747
936
  // ─── AgentStatus / AgentCancel — companions to run_in_background ─
@@ -784,13 +973,17 @@ export async function agentStatusTool(args, ctx) {
784
973
  return list
785
974
  .map((e) => {
786
975
  const dur = ((e.finishedAt ?? Date.now()) - e.startedAt) / 1000;
787
- return `${e.agentId} [${e.status}] ${e.description} (${dur.toFixed(1)}s)`;
976
+ const progress = e.status === "running" && e.progress ? ` — ${e.progress.summary}` : "";
977
+ return `${e.agentId} [${e.status}] ${e.description}${progress} (${dur.toFixed(1)}s)`;
788
978
  })
789
979
  .join("\n");
790
980
  }
791
981
  const e = asyncAgentRegistry.get(agentId);
792
982
  if (!e)
793
983
  return `Error: agent_id "${agentId}" not found.`;
984
+ if (ctx?.sessionId && e.sessionId !== ctx.sessionId) {
985
+ return `Error: agent_id "${agentId}" is not in this session.`;
986
+ }
794
987
  const dur = ((e.finishedAt ?? Date.now()) - e.startedAt) / 1000;
795
988
  const lines = [
796
989
  `agent_id: ${e.agentId}`,
@@ -808,6 +1001,9 @@ export async function agentStatusTool(args, ctx) {
808
1001
  lines.push("", "(cancelled — no result delivered)");
809
1002
  }
810
1003
  else if (e.status === "running") {
1004
+ if (e.progress) {
1005
+ lines.push(`phase: ${e.progress.phase}`, `progress: ${e.progress.summary}`, `tokens: ${e.progress.tokens.total}`, `observed: ${e.progress.observedAt}`);
1006
+ }
811
1007
  lines.push("", "(still running — call AgentStatus again later)");
812
1008
  }
813
1009
  return lines.join("\n");
@@ -838,9 +1034,7 @@ export async function agentCancelTool(args) {
838
1034
  return `Agent ${agentId} is already ${e.status}; nothing to cancel.`;
839
1035
  }
840
1036
  const ok = asyncAgentRegistry.cancel(agentId);
841
- return ok
842
- ? `Agent ${agentId} cancelled.`
843
- : `Failed to cancel agent ${agentId}.`;
1037
+ return ok ? `Agent ${agentId} cancelled.` : `Failed to cancel agent ${agentId}.`;
844
1038
  }
845
1039
  // ─── AgentSendInput — continue a previously-spawned sub-agent ────
846
1040
  export const agentSendInputToolDef = {
@@ -870,24 +1064,47 @@ export const agentSendInputToolDef = {
870
1064
  description: "The follow-up instruction. The agent already remembers its earlier work — " +
871
1065
  "send only what's new (feedback, the next step, a question).",
872
1066
  },
1067
+ delivery: {
1068
+ type: "string",
1069
+ enum: ["next-safe-point", "interrupt-and-redrive"],
1070
+ description: "For a running child: queue at the next complete model/tool boundary (default), " +
1071
+ "or cooperatively interrupt the active batch and serially redrive the same runtime.",
1072
+ },
873
1073
  },
1074
+ additionalProperties: false,
874
1075
  required: ["agent_id", "prompt"],
875
1076
  },
876
1077
  };
877
1078
  export async function agentSendInputTool(args, ctx) {
1079
+ const allowedKeys = new Set(["agent_id", "prompt", "delivery", "__signal"]);
1080
+ if (Object.keys(args).some((key) => !allowedKeys.has(key))) {
1081
+ return "Error: invalid-request: AgentSendInput accepts only agent_id, prompt, and delivery.";
1082
+ }
878
1083
  const agentId = args.agent_id?.trim();
879
1084
  const prompt = args.prompt;
1085
+ const rawDelivery = args.delivery;
880
1086
  if (!agentId)
881
1087
  return "Error: agent_id is required.";
882
1088
  if (!prompt)
883
1089
  return "Error: prompt is required.";
1090
+ if (rawDelivery !== undefined &&
1091
+ rawDelivery !== "next-safe-point" &&
1092
+ rawDelivery !== "interrupt-and-redrive") {
1093
+ return "Error: invalid delivery. Expected next-safe-point or interrupt-and-redrive.";
1094
+ }
1095
+ const delivery = rawDelivery ?? "next-safe-point";
884
1096
  if (!ctx?.subAgentSpawner) {
885
1097
  return "Error: Agent tool is not configured (no subAgentSpawner in ctx).";
886
1098
  }
887
1099
  // Same flat-hierarchy rule as Agent: a sub-agent cannot continue (or spawn)
888
1100
  // another sub-agent. Layered with the NESTED_AGENT_TOOLS strip in engine.ts.
889
1101
  if (ctx.isSubAgent === true) {
890
- return "Error: nested agents are not supported. Sub-agents cannot send input to other sub-agents. Complete the task directly using your available tools.";
1102
+ return JSON.stringify({
1103
+ status: "rejected",
1104
+ reason: "not-direct-parent",
1105
+ rejectedAt: Date.now(),
1106
+ message: "Nested agents are not supported. Sub-agents cannot send input to other sub-agents.",
1107
+ });
891
1108
  }
892
1109
  const spawner = ctx.subAgentSpawner;
893
1110
  const parentSignal = args.__signal;
@@ -910,17 +1127,41 @@ export async function agentSendInputTool(args, ctx) {
910
1127
  `It may never have run or its session was cleaned up. ` +
911
1128
  `Re-spawn with Agent(...) and a complete task description.`);
912
1129
  }
913
- // Concurrency guard: a sub-agent that's still running (e.g. it auto-moved to
914
- // the background and hasn't finished) owns its child session. Resuming now
915
- // would build a SECOND child Engine that resumes the SAME session and appends
916
- // to the SAME transcript concurrently — sub-agents have no per-session
917
- // `active` lock (the protocol layer's serialization only covers top-level
918
- // sessions), so the two writers interleave and can corrupt the transcript.
919
- // Refuse until it finishes (or is cancelled).
1130
+ // A running target owns its transcript writer lease. This branch is route-only:
1131
+ // registry validation + the bound live runtime enqueue the direction envelope;
1132
+ // it must never construct/resume a second child Engine.
920
1133
  if (entry?.status === "running") {
921
- return (`Error: sub-agent "${agentId}" is still running. ` +
922
- `Wait for it to finish (poll with AgentStatus), or cancel it with ` +
923
- `AgentCancel, before sending it more input.`);
1134
+ const ack = await asyncAgentRegistry.routeDirection({
1135
+ callerSessionId: ctx.sessionId ?? "",
1136
+ callerIsSubAgent: false,
1137
+ agentId,
1138
+ prompt,
1139
+ delivery,
1140
+ });
1141
+ return JSON.stringify(ack);
1142
+ }
1143
+ if (entry?.status === "cancelling" || asyncAgentRegistry.getWriterLease(resumeSessionId)) {
1144
+ return `Error: sub-agent "${agentId}" is still cancelling; wait for its previous runtime to fully exit.`;
1145
+ }
1146
+ const callerSessionId = ctx.sessionId ?? "";
1147
+ if (entry) {
1148
+ if (!callerSessionId || entry.sessionId !== callerSessionId) {
1149
+ return `Error: caller is not the direct parent of sub-agent "${agentId}" (not in this session).`;
1150
+ }
1151
+ }
1152
+ else {
1153
+ const persistedParent = spawner.getSessionParentId?.(resumeSessionId);
1154
+ if (!callerSessionId || persistedParent === undefined || persistedParent === null) {
1155
+ return `Error: cannot verify the direct parent of sub-agent "${agentId}"; continuation is denied.`;
1156
+ }
1157
+ if (persistedParent !== callerSessionId) {
1158
+ return `Error: caller is not the direct parent of sub-agent "${agentId}" (not in this session).`;
1159
+ }
1160
+ }
1161
+ if (delivery === "interrupt-and-redrive") {
1162
+ return (`Error: sub-agent "${agentId}" is no longer running; ` +
1163
+ `interrupt-and-redrive cannot interrupt a terminal target. ` +
1164
+ `Omit delivery to use the existing transcript continuation path.`);
924
1165
  }
925
1166
  const name = entry?.name;
926
1167
  const description = entry?.description ?? "sub-agent continuation";
@@ -44,12 +44,39 @@ export interface BackgroundJobEntry {
44
44
  ccSessionId?: string;
45
45
  /** Files the external agent changed (parsed from its transcript, #6). */
46
46
  changedFiles?: string[];
47
- /** Working directory for jobs that operate on the filesystem, e.g. DriveAgent. */
47
+ /** Directory in which the external job was launched. This is an audit/listing
48
+ * snapshot, not necessarily the workspace the job ultimately writes. */
49
+ launchCwd?: string;
50
+ /** @deprecated Back-compatible serialized alias of launchCwd. */
48
51
  cwd?: string;
52
+ /** Normalized snapshot of the declared effective workspace cwd. Preserved
53
+ * separately from its resolved root for mixed git-resolution fallback. */
54
+ effectiveWorkspaceCwd?: string;
55
+ /** Canonical source workspace before per-run isolation. Unlike
56
+ * effectiveWorkspaceRoot, this remains the main checkout for linked
57
+ * worktrees so later writers targeting that checkout can auto-isolate too. */
58
+ workspaceRoot?: string;
59
+ /** Canonical conflict identity: git worktree root when resolvable, otherwise
60
+ * the normalized effective workspace cwd. */
61
+ effectiveWorkspaceRoot?: string;
62
+ /** Git common dir identifies the main repository shared by linked worktrees.
63
+ * Conflict checks deliberately compare worktree roots, so separate
64
+ * worktrees of the same repository remain isolated. */
65
+ gitCommonDir?: string;
66
+ /** Whether effectiveWorkspaceRoot came from git or the cwd fallback. */
67
+ effectiveWorkspaceKind?: "git-worktree" | "cwd";
49
68
  /** DriveAgent prompt summary, separate from the UI-oriented description. */
50
69
  promptSummary?: string;
51
70
  /** External CLI kind for DriveAgent jobs. */
52
71
  cli?: ExternalCliKind;
72
+ /** DriveAgent workspace lifecycle metadata. */
73
+ isolation?: "current" | "worktree" | "none";
74
+ worktreePath?: string;
75
+ worktreeBranch?: string;
76
+ worktreeBaseRef?: string;
77
+ worktreeCleanup?: "auto" | "keep" | "detach" | "discard";
78
+ worktreeBranchPrefix?: string;
79
+ worktreeLifecycle?: "running" | "kept" | "detached" | "discarded" | "cleanup-failed";
53
80
  /** Client message that launched this external job. */
54
81
  originClientMessageId?: string;
55
82
  /** Optional cancellation hook for jobs backed by a live process. It may
@@ -63,12 +90,27 @@ export interface BackgroundJobOutcome {
63
90
  finalText?: string;
64
91
  ccSessionId?: string;
65
92
  changedFiles?: string[];
93
+ worktreeLifecycle?: "running" | "kept" | "detached" | "discarded" | "cleanup-failed";
66
94
  }
67
95
  export interface BackgroundJobStartOptions {
68
96
  kind?: BackgroundJobKind;
97
+ /** Preferred name for the external process's launch directory. */
98
+ launchCwd?: string;
99
+ /** @deprecated Back-compatible alias for launchCwd. */
69
100
  cwd?: string;
101
+ /** Optional host-declared workspace the job is expected to write. Defaults
102
+ * to launchCwd. This avoids guessing later shell `cd` commands. */
103
+ effectiveWorkspaceCwd?: string;
104
+ /** Source workspace before a job-specific worktree was created. */
105
+ workspaceRoot?: string;
70
106
  promptSummary?: string;
71
107
  cli?: ExternalCliKind;
108
+ isolation?: "current" | "worktree" | "none";
109
+ worktreePath?: string;
110
+ worktreeBranch?: string;
111
+ worktreeBaseRef?: string;
112
+ worktreeCleanup?: "auto" | "keep" | "detach" | "discard";
113
+ worktreeBranchPrefix?: string;
72
114
  originClientMessageId?: string;
73
115
  abort?: () => void | BackgroundJobOutcome | Promise<void | BackgroundJobOutcome>;
74
116
  }
@@ -83,13 +125,24 @@ declare class BackgroundJobRegistry {
83
125
  get(jobId: string): BackgroundJobEntry | undefined;
84
126
  /** Persist artifacts discovered while a running job is winding down. */
85
127
  recordArtifacts(jobId: string, artifacts: Pick<BackgroundJobOutcome, "ccSessionId" | "changedFiles">): void;
128
+ /** Update retained DriveAgent lifecycle state after an explicit cleanup. */
129
+ recordWorktreeLifecycle(jobId: string, lifecycle: NonNullable<BackgroundJobEntry["worktreeLifecycle"]>, note?: string): boolean;
86
130
  cancel(jobId: string, outcome?: Omit<BackgroundJobOutcome, "status">): Promise<boolean>;
87
131
  /** True while any running/cancelling job spawned by `sessionId` remains. */
88
132
  hasRunningForSession(sessionId: string): boolean;
89
133
  /** Running jobs spawned by `sessionId`. Feeds the goal judge's task list. */
90
134
  listRunningForSession(sessionId: string): BackgroundJobEntry[];
91
- /** Running jobs, across all sessions, that are operating in the same cwd. */
135
+ /** Running jobs, across all sessions, in the same effective workspace.
136
+ *
137
+ * Git paths compare by canonical worktree root, so sibling launch directories
138
+ * collide while distinct linked worktrees do not. A declared
139
+ * effectiveWorkspaceCwd takes precedence over launchCwd. If either side could
140
+ * not be resolved through git, exact launch-cwd matching remains the
141
+ * conservative back-compatible fallback. */
92
142
  listRunningByCwd(cwd: string): BackgroundJobEntry[];
143
+ /** Running and retained terminal jobs in the effective workspace containing
144
+ * cwd. Used by DriveAgentJobs' cross-session cwd filter. */
145
+ listByWorkspaceCwd(cwd: string): BackgroundJobEntry[];
93
146
  /** All jobs (running + retained terminal) for `sessionId`. Feeds the panel. */
94
147
  listForSession(sessionId: string): BackgroundJobEntry[];
95
148
  /** All jobs (running + retained terminal) across sessions. Feeds all-scope UI. */