@cjhyy/code-shell-core 0.7.0 → 0.8.0

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 (621) 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 +20 -5
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +20 -4
  26. package/dist/context/manager.js +42 -7
  27. package/dist/context/token-counter.js +5 -3
  28. package/dist/context/tool-result-storage.d.ts +6 -0
  29. package/dist/context/tool-result-storage.js +25 -4
  30. package/dist/credentials/access.d.ts +13 -2
  31. package/dist/credentials/access.js +99 -4
  32. package/dist/credentials/index.d.ts +3 -2
  33. package/dist/credentials/index.js +2 -1
  34. package/dist/credentials/oauth.d.ts +9 -1
  35. package/dist/credentials/oauth.js +80 -1
  36. package/dist/credentials/store.d.ts +16 -2
  37. package/dist/credentials/store.js +33 -11
  38. package/dist/credentials/types.d.ts +62 -1
  39. package/dist/credentials/types.js +16 -1
  40. package/dist/credentials/use-credential-tool.js +15 -1
  41. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  42. package/dist/engine/auxiliary-pipeline.js +181 -0
  43. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  44. package/dist/{settings → engine}/disk-defaults.js +5 -2
  45. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  46. package/dist/engine/dynamic-tool-defs.js +4 -0
  47. package/dist/engine/engine.d.ts +272 -184
  48. package/dist/engine/engine.js +1869 -1864
  49. package/dist/engine/file-history-hook.d.ts +11 -0
  50. package/dist/engine/file-history-hook.js +31 -0
  51. package/dist/engine/goal-judge-context.d.ts +9 -0
  52. package/dist/engine/goal-judge-context.js +234 -0
  53. package/dist/engine/injected-context-cache.d.ts +6 -0
  54. package/dist/engine/injected-context-cache.js +13 -0
  55. package/dist/engine/input-attachments.d.ts +1 -1
  56. package/dist/engine/model-facade.d.ts +3 -3
  57. package/dist/engine/model-facade.js +15 -14
  58. package/dist/engine/permission-controller.d.ts +55 -0
  59. package/dist/engine/permission-controller.js +148 -0
  60. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  61. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  62. package/dist/engine/run-accounting.d.ts +41 -0
  63. package/dist/engine/run-accounting.js +126 -0
  64. package/dist/engine/run-context.d.ts +44 -0
  65. package/dist/engine/run-context.js +88 -0
  66. package/dist/engine/run-environment.d.ts +30 -0
  67. package/dist/engine/run-environment.js +77 -0
  68. package/dist/engine/run-finalize.d.ts +58 -0
  69. package/dist/engine/run-finalize.js +245 -0
  70. package/dist/engine/run-goal.d.ts +58 -0
  71. package/dist/engine/run-goal.js +188 -0
  72. package/dist/engine/run-image-input.d.ts +1 -1
  73. package/dist/engine/run-image-input.js +5 -3
  74. package/dist/engine/run-session-open.d.ts +41 -0
  75. package/dist/engine/run-session-open.js +186 -0
  76. package/dist/engine/run-setup.d.ts +42 -0
  77. package/dist/engine/run-setup.js +58 -0
  78. package/dist/engine/run-tooling.d.ts +125 -0
  79. package/dist/engine/run-tooling.js +283 -0
  80. package/dist/engine/run-types.d.ts +139 -0
  81. package/dist/engine/run-types.js +12 -0
  82. package/dist/engine/run-workspace.d.ts +50 -0
  83. package/dist/engine/run-workspace.js +114 -0
  84. package/dist/engine/session-title.d.ts +2 -1
  85. package/dist/engine/session-title.js +4 -1
  86. package/dist/engine/steer-queue.d.ts +1 -1
  87. package/dist/engine/subagent-spawner.d.ts +32 -0
  88. package/dist/engine/subagent-spawner.js +287 -0
  89. package/dist/engine/tool-summary.d.ts +2 -2
  90. package/dist/engine/tool-summary.js +2 -2
  91. package/dist/engine/turn-loop.d.ts +67 -10
  92. package/dist/engine/turn-loop.js +538 -97
  93. package/dist/engine/types.d.ts +35 -4
  94. package/dist/engine/types.js +1 -1
  95. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
  96. package/dist/goal/lifecycle.js +482 -0
  97. package/dist/hooks/events.d.ts +26 -9
  98. package/dist/hooks/events.js +0 -3
  99. package/dist/hooks/goal-stop-hook.d.ts +28 -29
  100. package/dist/hooks/goal-stop-hook.js +344 -144
  101. package/dist/hooks/registry.js +4 -1
  102. package/dist/hooks/shell-runner.d.ts +12 -1
  103. package/dist/hooks/shell-runner.js +160 -9
  104. package/dist/index.d.ts +51 -110
  105. package/dist/index.extension.d.ts +51 -0
  106. package/dist/index.extension.js +39 -0
  107. package/dist/index.internal.d.ts +86 -0
  108. package/dist/index.internal.js +92 -0
  109. package/dist/index.js +37 -125
  110. package/dist/links/cli.d.ts +48 -0
  111. package/dist/links/cli.js +617 -0
  112. package/dist/links/http.d.ts +40 -0
  113. package/dist/links/http.js +166 -0
  114. package/dist/links/index.d.ts +4 -0
  115. package/dist/links/index.js +3 -0
  116. package/dist/links/link-action-tool.d.ts +5 -0
  117. package/dist/links/link-action-tool.js +241 -0
  118. package/dist/links/providers.d.ts +8 -0
  119. package/dist/links/providers.js +665 -0
  120. package/dist/links/types.d.ts +44 -0
  121. package/dist/llm/client-base.d.ts +7 -0
  122. package/dist/llm/client-base.js +72 -10
  123. package/dist/llm/model-pool.d.ts +1 -1
  124. package/dist/llm/model-pool.js +1 -1
  125. package/dist/llm/providers/anthropic.d.ts +1 -0
  126. package/dist/llm/providers/anthropic.js +9 -0
  127. package/dist/llm/providers/openai.d.ts +1 -0
  128. package/dist/llm/providers/openai.js +17 -0
  129. package/dist/llm/types.d.ts +12 -5
  130. package/dist/model-catalog/index.js +15 -2
  131. package/dist/model-catalog/resolve.d.ts +13 -1
  132. package/dist/model-catalog/resolve.js +37 -2
  133. package/dist/model-catalog/types.d.ts +74 -48
  134. package/dist/model-catalog/types.js +16 -5
  135. package/dist/model-catalog/upsert.d.ts +3 -1
  136. package/dist/model-catalog/upsert.js +9 -0
  137. package/dist/onboarding.d.ts +0 -1
  138. package/dist/onboarding.js +1 -22
  139. package/dist/panel-apps/bindings.d.ts +24 -0
  140. package/dist/panel-apps/bindings.js +69 -0
  141. package/dist/panel-apps/github-archive.d.ts +21 -0
  142. package/dist/panel-apps/github-archive.js +98 -0
  143. package/dist/panel-apps/index.d.ts +4 -0
  144. package/dist/panel-apps/index.js +4 -0
  145. package/dist/panel-apps/installer.d.ts +68 -0
  146. package/dist/panel-apps/installer.js +622 -0
  147. package/dist/panel-apps/manifest.d.ts +364 -0
  148. package/dist/panel-apps/manifest.js +189 -0
  149. package/dist/panel-apps/paths.d.ts +13 -0
  150. package/dist/panel-apps/paths.js +38 -0
  151. package/dist/panel-apps/registry.d.ts +51 -0
  152. package/dist/panel-apps/registry.js +99 -0
  153. package/dist/panel-apps/runtime.d.ts +80 -0
  154. package/dist/panel-apps/runtime.js +154 -0
  155. package/dist/plugins/gitOps.js +8 -1
  156. package/dist/plugins/installedPlugins.d.ts +2 -1
  157. package/dist/plugins/installedPlugins.js +146 -8
  158. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  159. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  160. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  161. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  162. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  163. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  164. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  165. package/dist/plugins/installer/install.d.ts +7 -1
  166. package/dist/plugins/installer/install.js +21 -87
  167. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  168. package/dist/plugins/installer/installFromArchive.js +44 -27
  169. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  170. package/dist/plugins/installer/installFromNpm.js +273 -0
  171. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  172. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  173. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  174. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  175. package/dist/plugins/installer/normalizeManifest.js +306 -0
  176. package/dist/plugins/installer/npmTar.d.ts +13 -0
  177. package/dist/plugins/installer/npmTar.js +321 -0
  178. package/dist/plugins/installer/parseSource.d.ts +11 -0
  179. package/dist/plugins/installer/parseSource.js +48 -0
  180. package/dist/plugins/installer/preview.d.ts +101 -0
  181. package/dist/plugins/installer/preview.js +336 -0
  182. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  183. package/dist/plugins/installer/projectPluginSource.js +140 -0
  184. package/dist/plugins/installer/types.d.ts +775 -0
  185. package/dist/plugins/installer/types.js +100 -0
  186. package/dist/plugins/installer/unzip.d.ts +11 -0
  187. package/dist/plugins/installer/unzip.js +123 -9
  188. package/dist/plugins/installer/update.d.ts +2 -2
  189. package/dist/plugins/installer/update.js +43 -4
  190. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  191. package/dist/plugins/loadPluginHooks.js +97 -86
  192. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  193. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  194. package/dist/plugins/pluginCatalog.d.ts +45 -0
  195. package/dist/plugins/pluginCatalog.js +87 -0
  196. package/dist/plugins/pluginCommandHook.d.ts +10 -4
  197. package/dist/plugins/pluginCommandHook.js +133 -18
  198. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  199. package/dist/plugins/pluginCommandsLoader.js +181 -7
  200. package/dist/plugins/pluginContent.d.ts +10 -1
  201. package/dist/plugins/pluginContent.js +87 -30
  202. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  203. package/dist/plugins/pluginHookApproval.js +160 -0
  204. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  205. package/dist/plugins/pluginHookIntegrity.js +361 -0
  206. package/dist/plugins/pluginInstaller.js +71 -12
  207. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  208. package/dist/plugins/pluginMcpApproval.js +110 -0
  209. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  210. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  211. package/dist/plugins/types.d.ts +30 -0
  212. package/dist/plugins/varRewrite.d.ts +9 -5
  213. package/dist/plugins/varRewrite.js +26 -17
  214. package/dist/preset/index.d.ts +11 -8
  215. package/dist/preset/index.js +62 -203
  216. package/dist/product/define.js +9 -3
  217. package/dist/product/types.d.ts +0 -2
  218. package/dist/profile/activation.d.ts +36 -0
  219. package/dist/profile/activation.js +57 -0
  220. package/dist/profile/catalog-store.d.ts +77 -0
  221. package/dist/profile/catalog-store.js +346 -0
  222. package/dist/profile/catalog.d.ts +54 -0
  223. package/dist/profile/catalog.js +152 -0
  224. package/dist/profile/index.d.ts +7 -0
  225. package/dist/profile/index.js +7 -0
  226. package/dist/profile/requirements.d.ts +76 -0
  227. package/dist/profile/requirements.js +117 -0
  228. package/dist/profile/resolve.d.ts +11 -0
  229. package/dist/profile/resolve.js +41 -0
  230. package/dist/profile/store.d.ts +17 -0
  231. package/dist/profile/store.js +167 -0
  232. package/dist/profile/types.d.ts +321 -0
  233. package/dist/profile/types.js +104 -0
  234. package/dist/prompt/composer.d.ts +46 -7
  235. package/dist/prompt/composer.js +78 -48
  236. package/dist/prompt/instruction-scanner.d.ts +6 -5
  237. package/dist/prompt/instruction-scanner.js +8 -23
  238. package/dist/prompt/section-loader.d.ts +2 -2
  239. package/dist/prompt/section-loader.js +7 -4
  240. package/dist/prompt/sections/browser.md +10 -9
  241. package/dist/prompt/sections/harness-base.md +9 -0
  242. package/dist/protocol/chat-session-manager.d.ts +77 -3
  243. package/dist/protocol/chat-session-manager.js +194 -18
  244. package/dist/protocol/chat-session.d.ts +72 -9
  245. package/dist/protocol/chat-session.js +151 -16
  246. package/dist/protocol/client.d.ts +37 -4
  247. package/dist/protocol/client.js +118 -6
  248. package/dist/protocol/index.d.ts +2 -2
  249. package/dist/protocol/index.js +2 -2
  250. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  251. package/dist/protocol/mobile-remote-types.js +1 -0
  252. package/dist/protocol/server.d.ts +152 -14
  253. package/dist/protocol/server.js +1574 -229
  254. package/dist/protocol/types.d.ts +182 -32
  255. package/dist/protocol/types.js +18 -0
  256. package/dist/run/ArtifactTracker.d.ts +6 -1
  257. package/dist/run/ArtifactTracker.js +29 -21
  258. package/dist/run/EngineRunner.d.ts +2 -0
  259. package/dist/run/EngineRunner.js +1 -0
  260. package/dist/run/RunManager.d.ts +26 -0
  261. package/dist/run/RunManager.js +82 -11
  262. package/dist/run/factory.d.ts +3 -0
  263. package/dist/run/factory.js +2 -0
  264. package/dist/runtime/safe-spawn.d.ts +6 -0
  265. package/dist/runtime/safe-spawn.js +8 -13
  266. package/dist/services/auto-dream.d.ts +13 -1
  267. package/dist/services/auto-dream.js +56 -8
  268. package/dist/services/dream-consolidation.d.ts +3 -0
  269. package/dist/services/dream-consolidation.js +14 -2
  270. package/dist/services/index.d.ts +1 -1
  271. package/dist/services/index.js +1 -1
  272. package/dist/services/memory-orchestrator.js +6 -2
  273. package/dist/services/oauth.d.ts +34 -10
  274. package/dist/services/oauth.js +236 -98
  275. package/dist/services/session-memory.d.ts +4 -4
  276. package/dist/services/session-memory.js +13 -10
  277. package/dist/session/memory.d.ts +26 -7
  278. package/dist/session/memory.js +79 -21
  279. package/dist/session/session-manager.d.ts +208 -25
  280. package/dist/session/session-manager.js +1232 -116
  281. package/dist/session/session-message.d.ts +22 -0
  282. package/dist/session/session-message.js +1 -0
  283. package/dist/session/transcript.d.ts +76 -6
  284. package/dist/session/transcript.js +278 -7
  285. package/dist/settings/feature-flags.d.ts +40 -0
  286. package/dist/settings/feature-flags.js +40 -0
  287. package/dist/settings/manager.d.ts +39 -1
  288. package/dist/settings/manager.js +102 -41
  289. package/dist/settings/migrate-config.js +4 -2
  290. package/dist/settings/schema.d.ts +511 -177
  291. package/dist/settings/schema.js +98 -25
  292. package/dist/skills/scanner.d.ts +6 -2
  293. package/dist/skills/scanner.js +160 -9
  294. package/dist/sources/adapter.d.ts +14 -0
  295. package/dist/sources/adapter.js +7 -0
  296. package/dist/sources/adapters/local-files.d.ts +10 -0
  297. package/dist/sources/adapters/local-files.js +127 -0
  298. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  299. package/dist/sources/adapters/mcp-resource.js +41 -0
  300. package/dist/sources/adapters/mock.d.ts +3 -0
  301. package/dist/sources/adapters/mock.js +29 -0
  302. package/dist/sources/binding.d.ts +6 -0
  303. package/dist/sources/binding.js +24 -0
  304. package/dist/sources/catalog.d.ts +6 -0
  305. package/dist/sources/catalog.js +64 -0
  306. package/dist/sources/context-summary.d.ts +8 -0
  307. package/dist/sources/context-summary.js +13 -0
  308. package/dist/sources/credential-status.d.ts +2 -0
  309. package/dist/sources/credential-status.js +13 -0
  310. package/dist/sources/index.d.ts +10 -0
  311. package/dist/sources/index.js +10 -0
  312. package/dist/sources/resolve.d.ts +28 -0
  313. package/dist/sources/resolve.js +47 -0
  314. package/dist/sources/truncate-utf8.d.ts +7 -0
  315. package/dist/sources/truncate-utf8.js +18 -0
  316. package/dist/sources/types.d.ts +71 -0
  317. package/dist/sources/types.js +26 -0
  318. package/dist/testing/fetch-stub.d.ts +32 -0
  319. package/dist/testing/fetch-stub.js +24 -0
  320. package/dist/themes/image.d.ts +18 -0
  321. package/dist/themes/image.js +117 -0
  322. package/dist/themes/index.d.ts +4 -0
  323. package/dist/themes/index.js +4 -0
  324. package/dist/themes/installer.d.ts +50 -0
  325. package/dist/themes/installer.js +290 -0
  326. package/dist/themes/manifest.d.ts +102 -0
  327. package/dist/themes/manifest.js +86 -0
  328. package/dist/themes/paths.d.ts +14 -0
  329. package/dist/themes/paths.js +33 -0
  330. package/dist/tool-system/browser-bridge.d.ts +53 -11
  331. package/dist/tool-system/browser-bridge.js +8 -9
  332. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  333. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  334. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  335. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  336. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  337. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  338. package/dist/tool-system/builtin/agent-progress.js +83 -0
  339. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  340. package/dist/tool-system/builtin/agent-registry.js +178 -9
  341. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  342. package/dist/tool-system/builtin/agent.d.ts +2 -0
  343. package/dist/tool-system/builtin/agent.js +279 -34
  344. package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
  345. package/dist/tool-system/builtin/background-jobs.js +111 -15
  346. package/dist/tool-system/builtin/background-work.d.ts +12 -1
  347. package/dist/tool-system/builtin/background-work.js +12 -1
  348. package/dist/tool-system/builtin/bash.d.ts +3 -5
  349. package/dist/tool-system/builtin/bash.js +14 -6
  350. package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
  351. package/dist/tool-system/builtin/browser-tools.js +89 -23
  352. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  353. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  354. package/dist/tool-system/builtin/edit.d.ts +2 -1
  355. package/dist/tool-system/builtin/edit.js +14 -10
  356. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  357. package/dist/tool-system/builtin/file-cache.js +4 -0
  358. package/dist/tool-system/builtin/generate-image.js +17 -10
  359. package/dist/tool-system/builtin/generate-video.d.ts +4 -0
  360. package/dist/tool-system/builtin/generate-video.js +164 -28
  361. package/dist/tool-system/builtin/glob.d.ts +2 -1
  362. package/dist/tool-system/builtin/glob.js +28 -3
  363. package/dist/tool-system/builtin/grep.d.ts +1 -0
  364. package/dist/tool-system/builtin/grep.js +82 -17
  365. package/dist/tool-system/builtin/image-uploader.js +7 -1
  366. package/dist/tool-system/builtin/index.d.ts +57 -18
  367. package/dist/tool-system/builtin/index.js +280 -167
  368. package/dist/tool-system/builtin/memory.d.ts +6 -0
  369. package/dist/tool-system/builtin/memory.js +36 -15
  370. package/dist/tool-system/builtin/panel.d.ts +9 -0
  371. package/dist/tool-system/builtin/panel.js +314 -0
  372. package/dist/tool-system/builtin/read.js +5 -1
  373. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  374. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  375. package/dist/tool-system/builtin/sources.d.ts +8 -0
  376. package/dist/tool-system/builtin/sources.js +137 -0
  377. package/dist/tool-system/builtin/tool-search.js +7 -2
  378. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  379. package/dist/tool-system/builtin/video-providers.d.ts +12 -15
  380. package/dist/tool-system/builtin/video-providers.js +1 -0
  381. package/dist/tool-system/builtin/view-image.d.ts +2 -2
  382. package/dist/tool-system/builtin/web-fetch.js +60 -15
  383. package/dist/tool-system/builtin/web-search.js +1 -3
  384. package/dist/tool-system/builtin/write.d.ts +2 -1
  385. package/dist/tool-system/builtin/write.js +14 -4
  386. package/dist/tool-system/capability-module.d.ts +93 -0
  387. package/dist/tool-system/capability-module.js +53 -0
  388. package/dist/tool-system/context.d.ts +94 -24
  389. package/dist/tool-system/executor.js +99 -58
  390. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  391. package/dist/tool-system/external-tool-exposure.js +304 -0
  392. package/dist/tool-system/mcp-manager.d.ts +17 -1
  393. package/dist/tool-system/mcp-manager.js +72 -7
  394. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  395. package/dist/tool-system/mcp-tool-policy.js +34 -0
  396. package/dist/tool-system/panel-bridge.d.ts +53 -0
  397. package/dist/tool-system/panel-bridge.js +1 -0
  398. package/dist/tool-system/path-policy.d.ts +19 -0
  399. package/dist/tool-system/path-policy.js +62 -1
  400. package/dist/tool-system/permission.d.ts +69 -3
  401. package/dist/tool-system/permission.js +429 -30
  402. package/dist/tool-system/registry.d.ts +15 -3
  403. package/dist/tool-system/registry.js +82 -40
  404. package/dist/tool-system/sandbox/index.js +3 -8
  405. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  406. package/dist/tool-system/session-tool-host.d.ts +139 -0
  407. package/dist/tool-system/session-tool-host.js +167 -0
  408. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  409. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  410. package/dist/tool-system/validation.d.ts +14 -7
  411. package/dist/tool-system/validation.js +701 -7
  412. package/dist/types.d.ts +201 -20
  413. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  414. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  415. package/dist/utils/file-mutex.d.ts +65 -0
  416. package/dist/utils/file-mutex.js +145 -0
  417. package/dist/utils/json.d.ts +2 -4
  418. package/dist/utils/json.js +2 -4
  419. package/dist/utils/lockfile.d.ts +30 -1
  420. package/dist/utils/lockfile.js +2 -2
  421. package/dist/utils/secret-scrubber.d.ts +8 -0
  422. package/dist/utils/secret-scrubber.js +227 -0
  423. package/dist/utils/toolDisplay.js +1 -1
  424. package/package.json +20 -5
  425. package/THIRD_PARTY_NOTICES.md +0 -206
  426. package/dist/arena/arena.d.ts +0 -43
  427. package/dist/arena/arena.js +0 -333
  428. package/dist/arena/context/context-tools.d.ts +0 -16
  429. package/dist/arena/context/context-tools.js +0 -272
  430. package/dist/arena/context/within-root.d.ts +0 -7
  431. package/dist/arena/context/within-root.js +0 -15
  432. package/dist/arena/detect-mode.d.ts +0 -20
  433. package/dist/arena/detect-mode.js +0 -78
  434. package/dist/arena/digest-builder.d.ts +0 -25
  435. package/dist/arena/digest-builder.js +0 -120
  436. package/dist/arena/index.d.ts +0 -29
  437. package/dist/arena/index.js +0 -29
  438. package/dist/arena/iterate/convergence.d.ts +0 -25
  439. package/dist/arena/iterate/convergence.js +0 -103
  440. package/dist/arena/iterate/formats/index.d.ts +0 -22
  441. package/dist/arena/iterate/formats/index.js +0 -283
  442. package/dist/arena/iterate/index.d.ts +0 -11
  443. package/dist/arena/iterate/index.js +0 -9
  444. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  445. package/dist/arena/iterate/iterative-arena.js +0 -237
  446. package/dist/arena/iterate/parse.d.ts +0 -42
  447. package/dist/arena/iterate/parse.js +0 -123
  448. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  449. package/dist/arena/iterate/phases/argue.js +0 -165
  450. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  451. package/dist/arena/iterate/phases/revise.js +0 -62
  452. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  453. package/dist/arena/iterate/phases/tournament.js +0 -113
  454. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  455. package/dist/arena/iterate/tools/web-tools.js +0 -54
  456. package/dist/arena/iterate/types.d.ts +0 -152
  457. package/dist/arena/iterate/types.js +0 -8
  458. package/dist/arena/ledger.d.ts +0 -47
  459. package/dist/arena/ledger.js +0 -159
  460. package/dist/arena/lenses/architecture.d.ts +0 -5
  461. package/dist/arena/lenses/architecture.js +0 -22
  462. package/dist/arena/lenses/engineering.d.ts +0 -5
  463. package/dist/arena/lenses/engineering.js +0 -22
  464. package/dist/arena/lenses/general.d.ts +0 -5
  465. package/dist/arena/lenses/general.js +0 -20
  466. package/dist/arena/lenses/index.d.ts +0 -16
  467. package/dist/arena/lenses/index.js +0 -47
  468. package/dist/arena/lenses/product.d.ts +0 -5
  469. package/dist/arena/lenses/product.js +0 -22
  470. package/dist/arena/model-presets.d.ts +0 -23
  471. package/dist/arena/model-presets.js +0 -44
  472. package/dist/arena/phases/adjudication.d.ts +0 -24
  473. package/dist/arena/phases/adjudication.js +0 -141
  474. package/dist/arena/phases/build-consensus.d.ts +0 -29
  475. package/dist/arena/phases/build-consensus.js +0 -83
  476. package/dist/arena/phases/claim-registry.d.ts +0 -26
  477. package/dist/arena/phases/claim-registry.js +0 -60
  478. package/dist/arena/phases/cross-review.d.ts +0 -45
  479. package/dist/arena/phases/cross-review.js +0 -218
  480. package/dist/arena/phases/debate-rounds.d.ts +0 -27
  481. package/dist/arena/phases/debate-rounds.js +0 -159
  482. package/dist/arena/phases/participant-research.d.ts +0 -38
  483. package/dist/arena/phases/participant-research.js +0 -314
  484. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
  485. package/dist/arena/phases/planning-detail-expansion.js +0 -119
  486. package/dist/arena/planner.d.ts +0 -27
  487. package/dist/arena/planner.js +0 -311
  488. package/dist/arena/providers/docs.d.ts +0 -7
  489. package/dist/arena/providers/docs.js +0 -111
  490. package/dist/arena/providers/git.d.ts +0 -8
  491. package/dist/arena/providers/git.js +0 -174
  492. package/dist/arena/providers/index.d.ts +0 -32
  493. package/dist/arena/providers/index.js +0 -132
  494. package/dist/arena/providers/none.d.ts +0 -7
  495. package/dist/arena/providers/none.js +0 -11
  496. package/dist/arena/providers/repo.d.ts +0 -7
  497. package/dist/arena/providers/repo.js +0 -258
  498. package/dist/arena/render/session.d.ts +0 -17
  499. package/dist/arena/render/session.js +0 -190
  500. package/dist/arena/render/terminal.d.ts +0 -34
  501. package/dist/arena/render/terminal.js +0 -286
  502. package/dist/arena/strategies/discussion.d.ts +0 -25
  503. package/dist/arena/strategies/discussion.js +0 -143
  504. package/dist/arena/strategies/index.d.ts +0 -15
  505. package/dist/arena/strategies/index.js +0 -28
  506. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  507. package/dist/arena/strategies/language-wrapper.js +0 -102
  508. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  509. package/dist/arena/strategies/lens-wrapper.js +0 -236
  510. package/dist/arena/strategies/planning.d.ts +0 -30
  511. package/dist/arena/strategies/planning.js +0 -225
  512. package/dist/arena/strategies/review.d.ts +0 -26
  513. package/dist/arena/strategies/review.js +0 -168
  514. package/dist/arena/strategies/utils.d.ts +0 -36
  515. package/dist/arena/strategies/utils.js +0 -603
  516. package/dist/arena/tools/selector.d.ts +0 -17
  517. package/dist/arena/tools/selector.js +0 -61
  518. package/dist/arena/transitions.d.ts +0 -53
  519. package/dist/arena/transitions.js +0 -97
  520. package/dist/arena/types.d.ts +0 -514
  521. package/dist/arena/types.js +0 -27
  522. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  523. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  524. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  525. package/dist/cc-orchestrator/cc-capability.js +0 -53
  526. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  527. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  528. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  529. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  530. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  531. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  532. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  533. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  534. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  535. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  536. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  537. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  538. package/dist/cc-orchestrator/index.d.ts +0 -8
  539. package/dist/cc-orchestrator/index.js +0 -8
  540. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  541. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  542. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  543. package/dist/cc-orchestrator/session-discovery.js +0 -125
  544. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  545. package/dist/cc-orchestrator/session-history.js +0 -150
  546. package/dist/cron/cron-runtime.d.ts +0 -2
  547. package/dist/cron/cron-runtime.js +0 -2
  548. package/dist/cron/cron-store.d.ts +0 -2
  549. package/dist/cron/cron-store.js +0 -2
  550. package/dist/cron/scheduler.d.ts +0 -7
  551. package/dist/cron/scheduler.js +0 -7
  552. package/dist/engine/goal.js +0 -206
  553. package/dist/external-agents/config.d.ts +0 -2
  554. package/dist/external-agents/config.js +0 -15
  555. package/dist/external-agents/types.d.ts +0 -31
  556. package/dist/git/parse-log.d.ts +0 -13
  557. package/dist/git/parse-log.js +0 -21
  558. package/dist/git/utils.d.ts +0 -49
  559. package/dist/git/utils.js +0 -161
  560. package/dist/git/worktree/crud.d.ts +0 -69
  561. package/dist/git/worktree/crud.js +0 -206
  562. package/dist/git/worktree/diff.d.ts +0 -14
  563. package/dist/git/worktree/diff.js +0 -82
  564. package/dist/git/worktree/git-exec.d.ts +0 -7
  565. package/dist/git/worktree/git-exec.js +0 -51
  566. package/dist/git/worktree/index.d.ts +0 -5
  567. package/dist/git/worktree/index.js +0 -5
  568. package/dist/git/worktree/query.d.ts +0 -42
  569. package/dist/git/worktree/query.js +0 -121
  570. package/dist/git/worktree/slug.d.ts +0 -11
  571. package/dist/git/worktree/slug.js +0 -58
  572. package/dist/git/worktree.d.ts +0 -1
  573. package/dist/git/worktree.js +0 -5
  574. package/dist/lsp/client.d.ts +0 -41
  575. package/dist/lsp/client.js +0 -186
  576. package/dist/lsp/manager.d.ts +0 -40
  577. package/dist/lsp/manager.js +0 -155
  578. package/dist/lsp/root-path.d.ts +0 -9
  579. package/dist/lsp/root-path.js +0 -12
  580. package/dist/lsp/servers.d.ts +0 -16
  581. package/dist/lsp/servers.js +0 -60
  582. package/dist/prompt/sections/coding.md +0 -35
  583. package/dist/quota/credentials.d.ts +0 -3
  584. package/dist/quota/credentials.js +0 -80
  585. package/dist/quota/index.d.ts +0 -36
  586. package/dist/quota/index.js +0 -155
  587. package/dist/quota/types.d.ts +0 -48
  588. package/dist/quota/types.js +0 -13
  589. package/dist/review/review-prompt.d.ts +0 -28
  590. package/dist/review/review-prompt.js +0 -81
  591. package/dist/state.d.ts +0 -160
  592. package/dist/state.js +0 -267
  593. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  594. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  595. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  596. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  597. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  598. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  599. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  600. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  601. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  602. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  603. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  604. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  605. package/dist/tool-system/builtin/arena.d.ts +0 -31
  606. package/dist/tool-system/builtin/arena.js +0 -415
  607. package/dist/tool-system/builtin/brief.d.ts +0 -6
  608. package/dist/tool-system/builtin/brief.js +0 -41
  609. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  610. package/dist/tool-system/builtin/check-quota.js +0 -34
  611. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  612. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  613. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  614. package/dist/tool-system/builtin/lsp.js +0 -144
  615. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  616. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  617. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  618. package/dist/tool-system/builtin/worktree.js +0 -345
  619. /package/dist/{external-agents → links}/types.js +0 -0
  620. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  621. /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
  }
@@ -269,12 +272,38 @@ streamOverride) {
269
272
  // that no longer exists. The child Engine is a fresh instance; plan-mode
270
273
  // isolation between parent and child is enforced via separate Engine
271
274
  // instances (finalized in T6).
272
- const { text } = await spawner.spawn({ ...opts, streamOverride });
275
+ const { text, usage } = await spawner.spawn({ ...opts, streamOverride });
276
+ if (usage)
277
+ opts.recordBilledUsage?.(usage);
273
278
  const finalText = text || `Agent completed but produced no text output.`;
274
- 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
+ });
275
287
  emitSubAgentHook(opts.hooks, "subagent_finish", { agentId, description, text: finalText });
276
288
  return finalText;
277
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
+ }
278
307
  export async function agentTool(args, ctx) {
279
308
  const prompt = args.prompt;
280
309
  const description = args.description || "sub-agent";
@@ -327,10 +356,13 @@ export async function agentTool(args, ctx) {
327
356
  // through AgentCancel(agent_id).
328
357
  if (runInBackground) {
329
358
  if (asyncAgentRegistry.runningCount() >= MAX_BACKGROUND_AGENTS) {
330
- return `Error: too many background agents running (limit ${MAX_BACKGROUND_AGENTS}). ` +
331
- `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.`);
332
361
  }
333
362
  const controller = new AbortController();
363
+ const runtimeGeneration = asyncAgentRegistry.allocateRuntimeGeneration(agentId);
364
+ const progressTracker = createAgentProgressTracker(agentId);
365
+ let liveLease;
334
366
  asyncAgentRegistry.register({
335
367
  agentId,
336
368
  name,
@@ -339,6 +371,9 @@ export async function agentTool(args, ctx) {
339
371
  // Tag with the spawning session so the parent Engine.run waits only on
340
372
  // its own background agents (hasRunningForSession).
341
373
  sessionId: ctx?.sessionId,
374
+ childSessionId: agentId,
375
+ runtimeGeneration,
376
+ progress: progressTracker.current(),
342
377
  status: "running",
343
378
  startedAt: Date.now(),
344
379
  abort: () => controller.abort(),
@@ -369,14 +404,52 @@ export async function agentTool(args, ctx) {
369
404
  model: overrides.model,
370
405
  toolAllowlist: overrides.toolAllowlist,
371
406
  skillAllowlist: overrides.skillAllowlist,
407
+ sandboxMode: overrides.sandboxMode,
408
+ mcpAllowlist: overrides.mcpAllowlist,
372
409
  appendSystemPrompt: overrides.appendSystemPrompt,
373
410
  readOnlySession: overrides.resolvedType === "researcher" || overrides.resolvedType === "explorer",
374
411
  hooks: ctx?.hooks,
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,
375
431
  signal: controller.signal,
376
432
  }, parentStream, // uiStream: agent_start/end → main feed
377
433
  transcriptSink)
378
434
  .then((text) => {
379
- 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;
380
453
  // External-readable copy of the result (tail / cross-session history).
381
454
  // Best-effort; never blocks the completion path.
382
455
  void writeAgentOutputFile(agentId, {
@@ -439,7 +512,10 @@ export async function agentTool(args, ctx) {
439
512
  // User-initiated cancel: mark status but do NOT enqueue —
440
513
  // the main agent doesn't need a follow-up turn. Dock still
441
514
  // shows the "cancelled" badge for the fade window.
442
- asyncAgentRegistry.markCancelled(agentId);
515
+ if (liveLease)
516
+ asyncAgentRegistry.completeTerminal(agentId, "cancelled", liveLease);
517
+ else
518
+ asyncAgentRegistry.markCancelled(agentId);
443
519
  void ctx?.hooks?.emit("notification", {
444
520
  kind: "agent_cancelled",
445
521
  agentId,
@@ -448,7 +524,11 @@ export async function agentTool(args, ctx) {
448
524
  });
449
525
  return;
450
526
  }
451
- asyncAgentRegistry.markFailed(agentId);
527
+ const transitioned = liveLease
528
+ ? asyncAgentRegistry.completeTerminal(agentId, "failed", liveLease)
529
+ : (asyncAgentRegistry.markFailed(agentId), true);
530
+ if (!transitioned)
531
+ return;
452
532
  void writeAgentOutputFile(agentId, {
453
533
  status: "failed",
454
534
  body: err.message,
@@ -532,6 +612,7 @@ function recordCompletedSyncAgent(opts) {
532
612
  sessionId: opts.parentSessionId,
533
613
  // agent_id === childSid: the resumable session lives at sessions/<agentId>/.
534
614
  childSessionId: opts.agentId,
615
+ runtimeGeneration: opts.runtimeGeneration,
535
616
  status: "completed",
536
617
  startedAt: now,
537
618
  finishedAt: now,
@@ -563,6 +644,10 @@ async function runSyncSubAgent(args) {
563
644
  // the background, so the finally block leaves the parent-abort listener with
564
645
  // the background handlers instead of removing it.
565
646
  let handedOff = false;
647
+ const childSessionId = resumeSessionId ?? agentId;
648
+ const runtimeGeneration = asyncAgentRegistry.allocateRuntimeGeneration(childSessionId);
649
+ const progressTracker = createAgentProgressTracker(agentId);
650
+ let liveBinding;
566
651
  // Run the agent, but don't necessarily await it to completion: race the run
567
652
  // against the auto-background timer. The run promise is shared between the
568
653
  // inline await and (if we hand off) the background completion handlers, so
@@ -577,10 +662,30 @@ async function runSyncSubAgent(args) {
577
662
  model: overrides.model,
578
663
  toolAllowlist: overrides.toolAllowlist,
579
664
  skillAllowlist: overrides.skillAllowlist,
665
+ sandboxMode: overrides.sandboxMode,
666
+ mcpAllowlist: overrides.mcpAllowlist,
580
667
  appendSystemPrompt: overrides.appendSystemPrompt,
581
668
  readOnlySession: overrides.resolvedType === "researcher" || overrides.resolvedType === "explorer",
582
669
  resumeSessionId,
583
670
  hooks: ctx?.hooks,
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,
584
689
  signal: syncController.signal,
585
690
  });
586
691
  // Sentinel that the timer resolves with, so we can tell "agent finished" from
@@ -595,7 +700,12 @@ async function runSyncSubAgent(args) {
595
700
  try {
596
701
  // If there's no timer (threshold 0/∞ disabled), just await as before.
597
702
  const winner = timerPromise
598
- ? 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
+ ])
599
709
  : { ok: true, text: await runPromise };
600
710
  if (winner === BG_HANDOFF) {
601
711
  // Threshold elapsed while the agent is STILL running. Detach it into the
@@ -612,6 +722,10 @@ async function runSyncSubAgent(args) {
612
722
  hooks: ctx?.hooks,
613
723
  parentSignal,
614
724
  onParentAbort,
725
+ childSessionId,
726
+ runtimeGeneration,
727
+ liveBinding,
728
+ progress: progressTracker.current(),
615
729
  // The agent_start fired in runSubAgent put the UI card into 'working'.
616
730
  // runSubAgent's own agent_end (line ~299) only fires if spawn() RESOLVES;
617
731
  // on failure/cancel it throws before that, so the card would hang
@@ -640,14 +754,26 @@ async function runSyncSubAgent(args) {
640
754
  agentType: overrides.resolvedType,
641
755
  description,
642
756
  parentSessionId: ctx?.sessionId,
757
+ runtimeGeneration,
643
758
  });
644
759
  return winner.text;
645
760
  }
646
761
  throw winner.err;
647
762
  }
648
763
  catch (err) {
649
- emitSubAgentHook(ctx?.hooks, "subagent_error", { agentId, description, error: err.message });
650
- 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
+ });
651
777
  if (parentSignal?.aborted)
652
778
  return "Agent was aborted.";
653
779
  return `Agent error: ${err.message}`;
@@ -670,7 +796,7 @@ async function runSyncSubAgent(args) {
670
796
  * a running (then completed/failed) background agent. Never aborts the agent.
671
797
  */
672
798
  function handoffToBackground(runPromise, controller, meta) {
673
- const { agentId, name, description, agentType, sessionId, hooks, uiStream } = meta;
799
+ const { agentId, name, description, agentType, sessionId, hooks, uiStream, childSessionId, runtimeGeneration, liveBinding, progress, } = meta;
674
800
  // The agent outlives the spawning turn now, so parent-turn abort must NOT
675
801
  // cascade to it (same contract as an explicit background agent). Detach the
676
802
  // parent listener; cancellation from here on goes through AgentCancel.
@@ -681,10 +807,21 @@ function handoffToBackground(runPromise, controller, meta) {
681
807
  agentType,
682
808
  description,
683
809
  sessionId,
810
+ childSessionId,
811
+ runtimeGeneration,
812
+ progress,
684
813
  status: "running",
685
814
  startedAt: Date.now(),
686
815
  abort: () => controller.abort(),
687
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
+ }
688
825
  // Tell the UI this agent is now running in the BACKGROUND (still working,
689
826
  // just detached from the parent turn). Without this the card's only signals
690
827
  // are agent_start (looks foreground) and the eventual agent_end — so during
@@ -697,7 +834,21 @@ function handoffToBackground(runPromise, controller, meta) {
697
834
  ensureAgentHeartbeat();
698
835
  runPromise
699
836
  .then((text) => {
700
- 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;
701
852
  void writeAgentOutputFile(agentId, {
702
853
  status: "completed",
703
854
  body: text,
@@ -706,24 +857,53 @@ function handoffToBackground(runPromise, controller, meta) {
706
857
  onError: (m, meta) => logger.warn(m, meta),
707
858
  });
708
859
  if (sessionId) {
709
- 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);
710
868
  }
711
869
  else {
712
870
  logger.warn("agent_completion_without_session", { agentId, name, status: "completed" });
713
871
  }
714
- 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
+ });
715
879
  })
716
880
  .catch((err) => {
717
881
  // runSubAgent threw before its success agent_end, so the UI card is still
718
882
  // 'working'. Close it out with a terminal agent_end{error} (mirrors the
719
883
  // synchronous catch at the agentTool level).
720
- 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
+ });
721
892
  if (controller.signal.aborted) {
722
- asyncAgentRegistry.markCancelled(agentId);
893
+ if (liveBinding) {
894
+ asyncAgentRegistry.completeTerminal(agentId, "cancelled", liveBinding.lease);
895
+ }
896
+ else {
897
+ asyncAgentRegistry.markCancelled(agentId);
898
+ }
723
899
  void hooks?.emit("notification", { kind: "agent_cancelled", agentId, name, description });
724
900
  return;
725
901
  }
726
- asyncAgentRegistry.markFailed(agentId);
902
+ const transitioned = liveBinding
903
+ ? asyncAgentRegistry.completeTerminal(agentId, "failed", liveBinding.lease)
904
+ : (asyncAgentRegistry.markFailed(agentId), true);
905
+ if (!transitioned)
906
+ return;
727
907
  void writeAgentOutputFile(agentId, {
728
908
  status: "failed",
729
909
  body: err.message,
@@ -732,12 +912,25 @@ function handoffToBackground(runPromise, controller, meta) {
732
912
  onError: (m, meta) => logger.warn(m, meta),
733
913
  });
734
914
  if (sessionId) {
735
- 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);
736
923
  }
737
924
  else {
738
925
  logger.warn("agent_completion_without_session", { agentId, name, status: "failed" });
739
926
  }
740
- 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
+ });
741
934
  });
742
935
  }
743
936
  // ─── AgentStatus / AgentCancel — companions to run_in_background ─
@@ -780,13 +973,17 @@ export async function agentStatusTool(args, ctx) {
780
973
  return list
781
974
  .map((e) => {
782
975
  const dur = ((e.finishedAt ?? Date.now()) - e.startedAt) / 1000;
783
- 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)`;
784
978
  })
785
979
  .join("\n");
786
980
  }
787
981
  const e = asyncAgentRegistry.get(agentId);
788
982
  if (!e)
789
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
+ }
790
987
  const dur = ((e.finishedAt ?? Date.now()) - e.startedAt) / 1000;
791
988
  const lines = [
792
989
  `agent_id: ${e.agentId}`,
@@ -804,6 +1001,9 @@ export async function agentStatusTool(args, ctx) {
804
1001
  lines.push("", "(cancelled — no result delivered)");
805
1002
  }
806
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
+ }
807
1007
  lines.push("", "(still running — call AgentStatus again later)");
808
1008
  }
809
1009
  return lines.join("\n");
@@ -834,9 +1034,7 @@ export async function agentCancelTool(args) {
834
1034
  return `Agent ${agentId} is already ${e.status}; nothing to cancel.`;
835
1035
  }
836
1036
  const ok = asyncAgentRegistry.cancel(agentId);
837
- return ok
838
- ? `Agent ${agentId} cancelled.`
839
- : `Failed to cancel agent ${agentId}.`;
1037
+ return ok ? `Agent ${agentId} cancelled.` : `Failed to cancel agent ${agentId}.`;
840
1038
  }
841
1039
  // ─── AgentSendInput — continue a previously-spawned sub-agent ────
842
1040
  export const agentSendInputToolDef = {
@@ -866,24 +1064,47 @@ export const agentSendInputToolDef = {
866
1064
  description: "The follow-up instruction. The agent already remembers its earlier work — " +
867
1065
  "send only what's new (feedback, the next step, a question).",
868
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
+ },
869
1073
  },
1074
+ additionalProperties: false,
870
1075
  required: ["agent_id", "prompt"],
871
1076
  },
872
1077
  };
873
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
+ }
874
1083
  const agentId = args.agent_id?.trim();
875
1084
  const prompt = args.prompt;
1085
+ const rawDelivery = args.delivery;
876
1086
  if (!agentId)
877
1087
  return "Error: agent_id is required.";
878
1088
  if (!prompt)
879
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";
880
1096
  if (!ctx?.subAgentSpawner) {
881
1097
  return "Error: Agent tool is not configured (no subAgentSpawner in ctx).";
882
1098
  }
883
1099
  // Same flat-hierarchy rule as Agent: a sub-agent cannot continue (or spawn)
884
1100
  // another sub-agent. Layered with the NESTED_AGENT_TOOLS strip in engine.ts.
885
1101
  if (ctx.isSubAgent === true) {
886
- 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
+ });
887
1108
  }
888
1109
  const spawner = ctx.subAgentSpawner;
889
1110
  const parentSignal = args.__signal;
@@ -906,17 +1127,41 @@ export async function agentSendInputTool(args, ctx) {
906
1127
  `It may never have run or its session was cleaned up. ` +
907
1128
  `Re-spawn with Agent(...) and a complete task description.`);
908
1129
  }
909
- // Concurrency guard: a sub-agent that's still running (e.g. it auto-moved to
910
- // the background and hasn't finished) owns its child session. Resuming now
911
- // would build a SECOND child Engine that resumes the SAME session and appends
912
- // to the SAME transcript concurrently — sub-agents have no per-session
913
- // `active` lock (the protocol layer's serialization only covers top-level
914
- // sessions), so the two writers interleave and can corrupt the transcript.
915
- // 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.
916
1133
  if (entry?.status === "running") {
917
- return (`Error: sub-agent "${agentId}" is still running. ` +
918
- `Wait for it to finish (poll with AgentStatus), or cancel it with ` +
919
- `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.`);
920
1165
  }
921
1166
  const name = entry?.name;
922
1167
  const description = entry?.description ?? "sub-agent continuation";
@@ -23,6 +23,7 @@
23
23
  type Listener = () => void;
24
24
  export type BackgroundJobStatus = "running" | "cancelling" | "completed" | "failed" | "cancelled";
25
25
  export type BackgroundJobKind = "drive-agent" | "video" | "job";
26
+ export type ExternalCliKind = "claude" | "codex";
26
27
  /** A background job, running or finished. */
27
28
  export interface BackgroundJobEntry {
28
29
  jobId: string;
@@ -43,16 +44,45 @@ export interface BackgroundJobEntry {
43
44
  ccSessionId?: string;
44
45
  /** Files the external agent changed (parsed from its transcript, #6). */
45
46
  changedFiles?: string[];
46
- /** 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. */
47
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";
48
68
  /** DriveAgent prompt summary, separate from the UI-oriented description. */
49
69
  promptSummary?: string;
50
70
  /** External CLI kind for DriveAgent jobs. */
51
- cli?: string;
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";
52
80
  /** Client message that launched this external job. */
53
81
  originClientMessageId?: string;
54
- /** Optional cancellation hook for jobs backed by a live process. */
55
- abort?: () => void | Promise<void>;
82
+ /** Optional cancellation hook for jobs backed by a live process. It may
83
+ * return a richer terminal outcome when cancellation races with a result
84
+ * that must still be retained (for example, a remotely rendered video). */
85
+ abort?: () => void | BackgroundJobOutcome | Promise<void | BackgroundJobOutcome>;
56
86
  }
57
87
  /** Outcome passed to finish() to record how a job ended. */
58
88
  export interface BackgroundJobOutcome {
@@ -60,14 +90,29 @@ export interface BackgroundJobOutcome {
60
90
  finalText?: string;
61
91
  ccSessionId?: string;
62
92
  changedFiles?: string[];
93
+ worktreeLifecycle?: "running" | "kept" | "detached" | "discarded" | "cleanup-failed";
63
94
  }
64
95
  export interface BackgroundJobStartOptions {
65
96
  kind?: BackgroundJobKind;
97
+ /** Preferred name for the external process's launch directory. */
98
+ launchCwd?: string;
99
+ /** @deprecated Back-compatible alias for launchCwd. */
66
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;
67
106
  promptSummary?: string;
68
- cli?: string;
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;
69
114
  originClientMessageId?: string;
70
- abort?: () => void | Promise<void>;
115
+ abort?: () => void | BackgroundJobOutcome | Promise<void | BackgroundJobOutcome>;
71
116
  }
72
117
  declare class BackgroundJobRegistry {
73
118
  private jobs;
@@ -80,13 +125,24 @@ declare class BackgroundJobRegistry {
80
125
  get(jobId: string): BackgroundJobEntry | undefined;
81
126
  /** Persist artifacts discovered while a running job is winding down. */
82
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;
83
130
  cancel(jobId: string, outcome?: Omit<BackgroundJobOutcome, "status">): Promise<boolean>;
84
131
  /** True while any running/cancelling job spawned by `sessionId` remains. */
85
132
  hasRunningForSession(sessionId: string): boolean;
86
133
  /** Running jobs spawned by `sessionId`. Feeds the goal judge's task list. */
87
134
  listRunningForSession(sessionId: string): BackgroundJobEntry[];
88
- /** 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. */
89
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[];
90
146
  /** All jobs (running + retained terminal) for `sessionId`. Feeds the panel. */
91
147
  listForSession(sessionId: string): BackgroundJobEntry[];
92
148
  /** All jobs (running + retained terminal) across sessions. Feeds all-scope UI. */