@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
@@ -1,4 +1,5 @@
1
1
  import { isAbortError } from "../llm/client-base.js";
2
+ import { isSameGoalInstance } from "../goal/lifecycle.js";
2
3
  /**
3
4
  * One ChatSession per UI chat tab. Owns a single Engine, an AbortController
4
5
  * for the active turn, and a FIFO queue so a fast second send waits for the
@@ -8,16 +9,16 @@ export class ChatSession {
8
9
  id;
9
10
  engine;
10
11
  /**
11
- * Per-session approval callbacks indexed by tool-call requestId.
12
+ * Per-session approval callbacks and resolver-free metadata indexed by requestId.
12
13
  * `readonly` guards the Map reference (preventing reassignment); the
13
14
  * contents are mutated by `.set()` / `.delete()` as approvals come and go.
14
- * Task 10 will register entries here when the Engine raises an approval
15
- * request and clean them up on response.
15
+ * The resolver stays process-local; only metadata is eligible for Pet snapshots.
16
16
  */
17
17
  pendingApprovals = new Map();
18
18
  lastActivityAt = Date.now();
19
19
  queue = [];
20
20
  active = null;
21
+ exclusiveOperation = false;
21
22
  controller = null;
22
23
  defaultOnStream;
23
24
  /**
@@ -44,6 +45,8 @@ export class ChatSession {
44
45
  * (the user is engaging again) so normal wakeups resume working afterward.
45
46
  */
46
47
  cancelledSinceLastTurn = false;
48
+ settlePromise = Promise.resolve();
49
+ resolveSettled = null;
47
50
  constructor(opts) {
48
51
  this.id = opts.id;
49
52
  this.engine = opts.engine;
@@ -60,6 +63,36 @@ export class ChatSession {
60
63
  this.pump();
61
64
  });
62
65
  }
66
+ /**
67
+ * Run session maintenance (for example context-package summarization) under
68
+ * the same per-session mutex as turns. Existing activity fails fast; turns
69
+ * arriving after the lock is acquired remain queued until maintenance has
70
+ * persisted its final usage/state update.
71
+ */
72
+ async runExclusive(operation) {
73
+ if (this.active || this.exclusiveOperation || this.queue.length > 0) {
74
+ throw new Error("source session is still producing or has queued turns");
75
+ }
76
+ this.lastActivityAt = Date.now();
77
+ this.exclusiveOperation = true;
78
+ this.settlePromise = new Promise((resolve) => {
79
+ this.resolveSettled = resolve;
80
+ });
81
+ this.controller = new AbortController();
82
+ try {
83
+ return await operation(this.controller.signal);
84
+ }
85
+ finally {
86
+ this.lastActivityAt = Date.now();
87
+ this.resolveSettled?.();
88
+ this.resolveSettled = null;
89
+ this.controller = null;
90
+ this.exclusiveOperation = false;
91
+ this.applyPendingModelSwitchAtRunBoundary();
92
+ if (this.queue.length > 0)
93
+ void this.pump();
94
+ }
95
+ }
63
96
  /**
64
97
  * True when the user hit Stop and hasn't started a new turn since. The server
65
98
  * consults this before auto-waking an idle session on a background-job
@@ -92,7 +125,11 @@ export class ChatSession {
92
125
  }
93
126
  }
94
127
  isBusy() {
95
- return this.active !== null;
128
+ return this.active !== null || this.exclusiveOperation;
129
+ }
130
+ /** Resolves after the active engine.run() has completed its pump finally. */
131
+ get settled() {
132
+ return this.settlePromise;
96
133
  }
97
134
  /**
98
135
  * Extend the in-flight goal run's turn/budget ceilings (TODO 3.1). Delegates
@@ -104,7 +141,7 @@ export class ChatSession {
104
141
  return this.engine.extendGoalRun(opts);
105
142
  }
106
143
  /**
107
- * Read this session's persisted active goal (state.activeGoal), or undefined
144
+ * Read this session's persisted active goal (state.goalLifecycle), or undefined
108
145
  * when none. Cheap — reads only state.json. The host calls this on session
109
146
  * load to re-surface the goal block + Cancel button after a reload.
110
147
  */
@@ -115,8 +152,56 @@ export class ChatSession {
115
152
  * Clear this session's persisted active goal (CC /goal clear). Works idle or
116
153
  * mid-run. Returns true if a goal was actually cleared.
117
154
  */
118
- clearGoal() {
119
- return this.engine.clearGoal(this.id);
155
+ clearGoal(expected) {
156
+ return this.engine.clearGoal(this.id, expected);
157
+ }
158
+ /** Edit or pause/resume this session's persistent goal. */
159
+ updateGoal(patch) {
160
+ return this.engine.updateGoal(this.id, patch);
161
+ }
162
+ /** Whether a paused Goal can reuse this run's already Goal-capable prompt/tools. */
163
+ canResumeGoalInPlace() {
164
+ return this.engine.canResumeGoalInPlace(this.id);
165
+ }
166
+ /**
167
+ * Queue the synthetic turn which actually drives an idle/dormant Goal after
168
+ * Resume. The version guard is checked at queue head, so a later edit/delete
169
+ * cannot leave a stale "resume" turn behind another user turn.
170
+ */
171
+ enqueueGoalResumeTurn(goal, opts = {}) {
172
+ this.lastActivityAt = Date.now();
173
+ this.cancelledSinceLastTurn = false;
174
+ return new Promise((resolve, reject) => {
175
+ // Resume is level-triggered, not an instruction that should accumulate.
176
+ // While another turn owns the session, pause -> resume can otherwise
177
+ // leave multiple continuation turns for the same Goal instance queued.
178
+ // Supersede only pending entries; an already-active resume is governed by
179
+ // the live TurnLoop control path.
180
+ if (goal.goalId) {
181
+ for (let index = this.queue.length - 1; index >= 0; index--) {
182
+ const pending = this.queue[index];
183
+ if (pending?.goalResumeId !== goal.goalId)
184
+ continue;
185
+ this.queue.splice(index, 1);
186
+ pending.onSkipped?.();
187
+ }
188
+ }
189
+ this.queue.push({
190
+ task: "<system-reminder>\n用户已恢复持久目标。请读取当前持久目标并继续执行。\n</system-reminder>",
191
+ opts: { ...opts, injected: true },
192
+ ...(goal.goalId ? { goalResumeId: goal.goalId } : {}),
193
+ guard: () => {
194
+ const current = this.engine.getGoal(this.id);
195
+ // Edits retain the same user-owned goalId and should update the
196
+ // queued resume, not cancel it. Pause/delete/replacement must skip.
197
+ return current?.paused !== true && isSameGoalInstance(current, goal);
198
+ },
199
+ onSkipped: () => resolve(false),
200
+ resolve: () => resolve(true),
201
+ reject,
202
+ });
203
+ void this.pump();
204
+ });
120
205
  }
121
206
  /**
122
207
  * Switch this session's active model (per-session, not worker-global).
@@ -144,20 +229,54 @@ export class ChatSession {
144
229
  * path and the deferred run-boundary path.
145
230
  */
146
231
  applyModelSwitch(key) {
147
- const entry = this.engine.switchModel(key);
232
+ // persist: false — a per-session switch must not become the global boot
233
+ // default (settings.defaults.text); only explicit default-model changes
234
+ // (legacy single-engine path, TUI /model) persist.
235
+ const entry = this.engine.switchModel(key, { persist: false });
148
236
  this.engine.resetSessionUsage(this.id);
149
237
  return entry;
150
238
  }
239
+ /** Apply and clear a deferred switch before another run may start. */
240
+ applyPendingModelSwitchAtRunBoundary() {
241
+ const key = this.pendingModel;
242
+ this.pendingModel = null;
243
+ if (key === null)
244
+ return;
245
+ try {
246
+ this.applyModelSwitch(key);
247
+ }
248
+ catch {
249
+ // requestModelSwitch already returned when the switch was queued. A
250
+ // run-boundary persistence failure must not become an unhandled pump
251
+ // rejection or prevent the session from settling/continuing.
252
+ }
253
+ }
151
254
  queueDepth() {
152
255
  return this.queue.length;
153
256
  }
154
257
  async pump() {
155
- if (this.active)
258
+ if (this.active || this.exclusiveOperation)
156
259
  return;
157
- const next = this.queue.shift();
260
+ let next;
261
+ while ((next = this.queue.shift())) {
262
+ let allowed = true;
263
+ try {
264
+ allowed = next.guard?.() ?? true;
265
+ }
266
+ catch {
267
+ allowed = false;
268
+ }
269
+ if (allowed)
270
+ break;
271
+ next.onSkipped?.();
272
+ next = undefined;
273
+ }
158
274
  if (!next)
159
275
  return;
160
276
  this.active = next;
277
+ this.settlePromise = new Promise((resolve) => {
278
+ this.resolveSettled = resolve;
279
+ });
161
280
  this.cancelledActive = false;
162
281
  this.controller = new AbortController();
163
282
  try {
@@ -165,12 +284,23 @@ export class ChatSession {
165
284
  const result = await this.engine.run(next.task, {
166
285
  cwd: next.opts.cwd,
167
286
  sessionId: this.id,
287
+ displayText: next.opts.displayText,
168
288
  signal: this.controller.signal,
169
289
  onStream,
170
290
  goal: next.opts.goal,
171
291
  injected: next.opts.injected,
172
292
  clientMessageId: next.opts.clientMessageId,
173
293
  attachments: next.opts.attachments,
294
+ permissionMode: next.opts.permissionMode,
295
+ planMode: next.opts.planMode,
296
+ behaviorMode: next.opts.behaviorMode,
297
+ profileParams: next.opts.profileParams,
298
+ workspaceProfile: next.opts.workspaceProfile,
299
+ sessionMessageTargets: next.opts.sessionMessageTargets,
300
+ petRuntimeContext: next.opts.petRuntimeContext,
301
+ petWorkspaces: next.opts.petWorkspaces,
302
+ kind: next.opts.kind,
303
+ approvalRouter: next.opts.approvalRouter,
174
304
  });
175
305
  this.lastActivityAt = Date.now();
176
306
  next.resolve(result);
@@ -195,19 +325,24 @@ export class ChatSession {
195
325
  }
196
326
  }
197
327
  finally {
328
+ // close() must never be held hostage by run-boundary cleanup. Resolve
329
+ // before model switching or any other operation that may throw.
330
+ this.resolveSettled?.();
331
+ this.resolveSettled = null;
198
332
  this.active = null;
199
333
  this.controller = null;
200
334
  this.cancelledActive = false;
201
335
  // Run boundary: apply any model switch that was deferred because it was
202
336
  // requested mid-run. Done here (not in pump) so it still applies when
203
337
  // no further turn is queued.
204
- if (this.pendingModel !== null) {
205
- this.applyModelSwitch(this.pendingModel);
206
- this.pendingModel = null;
338
+ this.applyPendingModelSwitchAtRunBoundary();
339
+ // Drain the next turn even if deferred model switching failed.
340
+ if (this.queue.length > 0) {
341
+ // Let the just-settled turn's resolve/reject handlers publish their
342
+ // terminal lifecycle before a queued turn can synchronously emit its
343
+ // session_started event. This preserves external QueryGuard ordering.
344
+ queueMicrotask(() => void this.pump());
207
345
  }
208
- // Drain the next turn if one is waiting.
209
- if (this.queue.length > 0)
210
- void this.pump();
211
346
  }
212
347
  }
213
348
  }
@@ -11,9 +11,11 @@
11
11
  * const result = await client.run("fix the bug");
12
12
  */
13
13
  import type { Transport } from "./transport.js";
14
- import { type RunParams, type RunResult, type AgentStreamEventNotification, type ConfigureParams, type QueryParams, type QueryResult, type ApprovalRequestNotification, type ApprovalResolvedNotification } from "./types.js";
15
- import type { ApprovalRequest, ApprovalResult, PermissionMode, BackgroundAgentCompletedEvent } from "../types.js";
16
- export type ApprovalRequestMeta = Pick<ApprovalRequestNotification, "sessionId">;
14
+ import { type RunParams, type RunResult, type ForkSessionParams, type ForkSessionResult, type AgentStreamEventNotification, type ConfigureParams, type QueryParams, type QueryResult, type PluginCommandsListResult, type PluginCommandExpandResult, type ApprovalRequestNotification, type ApprovalResolvedNotification } from "./types.js";
15
+ import type { ApprovalRequest, ApprovalResult, PermissionMode, BackgroundAgentCompletedEvent, SessionKind } from "../types.js";
16
+ import type { RunBehaviorMode } from "../engine/run-types.js";
17
+ import type { GoalConfig } from "../goal/lifecycle.js";
18
+ export type ApprovalRequestMeta = Pick<ApprovalRequestNotification, "connectionId" | "sessionId" | "generation">;
17
19
  export type ApprovalResolvedEvent = ApprovalResolvedNotification;
18
20
  export interface AgentClientEvents {
19
21
  /** Multi-session envelope: carries sessionId + event. */
@@ -28,12 +30,16 @@ export interface AgentRunOptions {
28
30
  permissionMode?: PermissionMode;
29
31
  model?: string;
30
32
  planMode?: boolean;
33
+ behaviorMode?: RunBehaviorMode;
34
+ kind?: SessionKind;
31
35
  }
32
36
  export type BackgroundAgentCompletedHandler = (sessionId: string, event: BackgroundAgentCompletedEvent) => void;
33
37
  export declare class AgentClient {
34
38
  private transport;
35
39
  private emitter;
36
40
  private pendingRequests;
41
+ /** Routing tuple captured from approval notifications and echoed on approve. */
42
+ private approvalRoutes;
37
43
  /**
38
44
  * Map from a user-supplied `BackgroundAgentCompletedHandler` to the
39
45
  * internal envelope-filtering wrapper actually registered on the
@@ -52,7 +58,7 @@ export declare class AgentClient {
52
58
  * for multi-session servers) or the legacy string form `(task, sessionId?)`
53
59
  * for backward compatibility with createInProcessClient callers.
54
60
  */
55
- run(taskOrParams: string | RunParams, sessionIdOrOptions?: string | AgentRunOptions): Promise<RunResult>;
61
+ run(taskOrParams: string | RunParams, sessionIdOrOptions?: string | AgentRunOptions, onTransportResponse?: () => void): Promise<RunResult>;
56
62
  /**
57
63
  * Respond to an approval request from the server.
58
64
  *
@@ -68,11 +74,26 @@ export declare class AgentClient {
68
74
  * Legacy form: cancel(reason?)
69
75
  */
70
76
  cancel(sessionId?: string, reason?: string): Promise<void>;
77
+ forkSession(params: ForkSessionParams): Promise<ForkSessionResult>;
71
78
  /**
72
79
  * Clear a session's persisted active goal (CC `/goal clear`). Returns whether
73
80
  * a goal was actually cleared (false = there was none).
74
81
  */
75
82
  goalClear(sessionId?: string): Promise<boolean>;
83
+ /** Delete a persisted goal. Kept separate from goalClear for UI semantics. */
84
+ goalDelete(sessionId: string, expected: {
85
+ goalId: string;
86
+ revision: number;
87
+ }): Promise<boolean>;
88
+ /** Edit or pause/resume a goal while preserving its goalId. */
89
+ goalUpdate(sessionId: string, patch: {
90
+ objective?: string;
91
+ paused?: boolean;
92
+ expectedGoalId: string;
93
+ expectedRevision: number;
94
+ }): Promise<GoalConfig | null>;
95
+ /** Read the full persisted goal control state. */
96
+ goalGetState(sessionId: string): Promise<GoalConfig | null>;
76
97
  /**
77
98
  * Read a session's persisted active goal objective, or null when there's
78
99
  * none. The host calls this on session load to re-surface the goal block +
@@ -106,6 +127,13 @@ export declare class AgentClient {
106
127
  * Query server state.
107
128
  */
108
129
  query(type: QueryParams["type"], arg?: string | Record<string, unknown>, ...extra: unknown[]): Promise<QueryResult>;
130
+ /** Discover enabled installed plugin commands for one workspace. */
131
+ listPluginCommands(cwd: string): Promise<PluginCommandsListResult>;
132
+ /**
133
+ * Expand one plugin command inside the trusted server. The command source
134
+ * body and install path never cross the protocol boundary.
135
+ */
136
+ expandPluginCommand(cwd: string, name: string, rawArguments?: string): Promise<PluginCommandExpandResult>;
109
137
  /**
110
138
  * Inject context into the session transcript without triggering a LLM turn.
111
139
  * Used to make arena results, tool outputs, etc. visible to subsequent LLM calls.
@@ -136,5 +164,10 @@ export declare class AgentClient {
136
164
  private request;
137
165
  private handleResponse;
138
166
  private handleNotification;
167
+ /** Subscribe to an extension-owned server notification method. */
168
+ onExtensionNotification(method: string, handler: (params: Record<string, unknown>) => void): void;
169
+ offExtensionNotification(method: string, handler: (params: Record<string, unknown>) => void): void;
170
+ /** Issue a request to an extension-registered protocol method. */
171
+ requestExtension(method: string, params?: Record<string, unknown>): Promise<unknown>;
139
172
  close(): void;
140
173
  }
@@ -10,13 +10,15 @@
10
10
  * client.onApprovalRequest((reqId, request) => { ... });
11
11
  * const result = await client.run("fix the bug");
12
12
  */
13
- import { Methods, createRequest, isResponse, isNotification, } from "./types.js";
13
+ import { Methods, createRequest, isResponse, isNotification, ErrorCodes, } from "./types.js";
14
14
  import { EventEmitter } from "node:events";
15
15
  import { logger } from "../logging/logger.js";
16
16
  export class AgentClient {
17
17
  transport;
18
18
  emitter = new EventEmitter();
19
19
  pendingRequests = new Map();
20
+ /** Routing tuple captured from approval notifications and echoed on approve. */
21
+ approvalRoutes = new Map();
20
22
  /**
21
23
  * Map from a user-supplied `BackgroundAgentCompletedHandler` to the
22
24
  * internal envelope-filtering wrapper actually registered on the
@@ -44,7 +46,7 @@ export class AgentClient {
44
46
  * for multi-session servers) or the legacy string form `(task, sessionId?)`
45
47
  * for backward compatibility with createInProcessClient callers.
46
48
  */
47
- async run(taskOrParams, sessionIdOrOptions) {
49
+ async run(taskOrParams, sessionIdOrOptions, onTransportResponse) {
48
50
  let params;
49
51
  if (typeof taskOrParams === "string") {
50
52
  // Form: run(task, sessionId | options?)
@@ -70,7 +72,7 @@ export class AgentClient {
70
72
  // first call of a brand-new session, when sessionId is undefined.
71
73
  if (params.sessionId)
72
74
  logger.setSid(params.sessionId);
73
- const result = (await this.request(Methods.Run, params));
75
+ const result = (await this.request(Methods.Run, params, onTransportResponse));
74
76
  if (result.sessionId)
75
77
  logger.setSid(result.sessionId);
76
78
  return result;
@@ -78,16 +80,24 @@ export class AgentClient {
78
80
  approve(...args) {
79
81
  if (args.length === 3) {
80
82
  const [sessionId, requestId, decision] = args;
83
+ const route = this.approvalRoutes.get(requestId);
81
84
  return this.request(Methods.Approve, {
85
+ ...route,
82
86
  sessionId,
83
87
  requestId,
84
88
  decision,
89
+ }).finally(() => {
90
+ this.approvalRoutes.delete(requestId);
85
91
  });
86
92
  }
87
93
  const [requestId, decision] = args;
94
+ const route = this.approvalRoutes.get(requestId);
88
95
  return this.request(Methods.Approve, {
96
+ ...route,
89
97
  requestId,
90
98
  decision,
99
+ }).finally(() => {
100
+ this.approvalRoutes.delete(requestId);
91
101
  });
92
102
  }
93
103
  /**
@@ -99,6 +109,9 @@ export class AgentClient {
99
109
  async cancel(sessionId, reason) {
100
110
  await this.request(Methods.Cancel, { sessionId, reason });
101
111
  }
112
+ async forkSession(params) {
113
+ return this.request(Methods.ForkSession, params);
114
+ }
102
115
  /**
103
116
  * Clear a session's persisted active goal (CC `/goal clear`). Returns whether
104
117
  * a goal was actually cleared (false = there was none).
@@ -107,6 +120,51 @@ export class AgentClient {
107
120
  const res = (await this.request(Methods.GoalClear, { sessionId }));
108
121
  return res?.cleared === true;
109
122
  }
123
+ /** Delete a persisted goal. Kept separate from goalClear for UI semantics. */
124
+ async goalDelete(sessionId, expected) {
125
+ try {
126
+ const res = (await this.request(Methods.GoalDelete, {
127
+ sessionId,
128
+ expectedGoalId: expected.goalId,
129
+ expectedRevision: expected.revision,
130
+ }));
131
+ return res?.deleted === true;
132
+ }
133
+ catch (err) {
134
+ // Compatibility only: old servers do not know GoalDelete and expose the
135
+ // unfenced GoalClear method. Never downgrade on a stale/validation error.
136
+ if (err.code !== ErrorCodes.MethodNotFound)
137
+ throw err;
138
+ return this.goalClear(sessionId);
139
+ }
140
+ }
141
+ /** Edit or pause/resume a goal while preserving its goalId. */
142
+ async goalUpdate(sessionId, patch) {
143
+ const res = (await this.request(Methods.GoalUpdate, {
144
+ sessionId,
145
+ ...patch,
146
+ }));
147
+ if (res?.updated !== true || !res.goal)
148
+ return null;
149
+ return {
150
+ objective: res.goal,
151
+ ...(res.goalId ? { goalId: res.goalId } : {}),
152
+ ...(res.revision ? { revision: res.revision } : {}),
153
+ ...(res.paused === true ? { paused: true } : {}),
154
+ };
155
+ }
156
+ /** Read the full persisted goal control state. */
157
+ async goalGetState(sessionId) {
158
+ const res = (await this.request(Methods.GoalGet, { sessionId }));
159
+ if (!res?.goal)
160
+ return null;
161
+ return {
162
+ objective: res.goal,
163
+ ...(res.goalId ? { goalId: res.goalId } : {}),
164
+ ...(res.revision ? { revision: res.revision } : {}),
165
+ ...(res.paused === true ? { paused: true } : {}),
166
+ };
167
+ }
110
168
  /**
111
169
  * Read a session's persisted active goal objective, or null when there's
112
170
  * none. The host calls this on session load to re-surface the goal block +
@@ -186,6 +244,21 @@ export class AgentClient {
186
244
  }
187
245
  return this.request(Methods.Query, params);
188
246
  }
247
+ /** Discover enabled installed plugin commands for one workspace. */
248
+ async listPluginCommands(cwd) {
249
+ return this.request(Methods.PluginCommandsList, { cwd });
250
+ }
251
+ /**
252
+ * Expand one plugin command inside the trusted server. The command source
253
+ * body and install path never cross the protocol boundary.
254
+ */
255
+ async expandPluginCommand(cwd, name, rawArguments = "") {
256
+ return this.request(Methods.PluginCommandExpand, {
257
+ cwd,
258
+ name,
259
+ rawArguments,
260
+ });
261
+ }
189
262
  /**
190
263
  * Inject context into the session transcript without triggering a LLM turn.
191
264
  * Used to make arena results, tool outputs, etc. visible to subsequent LLM calls.
@@ -247,10 +320,10 @@ export class AgentClient {
247
320
  this.emitter.off("stream", wrapper);
248
321
  }
249
322
  // ─── Internals ──────────────────────────────────────────────────
250
- request(method, params) {
323
+ request(method, params, onResponse) {
251
324
  return new Promise((resolve, reject) => {
252
325
  const req = createRequest(method, params);
253
- this.pendingRequests.set(req.id, { resolve, reject });
326
+ this.pendingRequests.set(req.id, { onResponse, resolve, reject });
254
327
  this.transport.send(req);
255
328
  });
256
329
  }
@@ -259,6 +332,19 @@ export class AgentClient {
259
332
  if (!pending)
260
333
  return;
261
334
  this.pendingRequests.delete(res.id);
335
+ // Emit before resolving/rejecting: Promise continuations run in a later
336
+ // microtask, while the transport may synchronously parse the next queued
337
+ // session_started notification in the same chunk.
338
+ if (pending.onResponse) {
339
+ try {
340
+ pending.onResponse();
341
+ }
342
+ catch (error) {
343
+ logger.warn("client.run_response_handler_failed", {
344
+ error: error instanceof Error ? error.message : String(error),
345
+ });
346
+ }
347
+ }
262
348
  if (res.error) {
263
349
  // Attach both message and code so callers can do toMatchObject({ code }).
264
350
  const err = new Error(`[${res.error.code}] ${res.error.message}`);
@@ -286,7 +372,14 @@ export class AgentClient {
286
372
  const request = params.request;
287
373
  if (requestId && request) {
288
374
  const sessionId = typeof params.sessionId === "string" ? params.sessionId : undefined;
289
- const meta = sessionId === undefined ? {} : { sessionId };
375
+ const connectionId = typeof params.connectionId === "string" ? params.connectionId : undefined;
376
+ const generation = typeof params.generation === "number" ? params.generation : undefined;
377
+ const meta = {
378
+ ...(connectionId === undefined ? {} : { connectionId }),
379
+ ...(sessionId === undefined ? {} : { sessionId }),
380
+ ...(generation === undefined ? {} : { generation }),
381
+ };
382
+ this.approvalRoutes.set(requestId, meta);
290
383
  this.emitter.emit("approvalRequest", requestId, request, meta);
291
384
  }
292
385
  break;
@@ -294,6 +387,7 @@ export class AgentClient {
294
387
  case Methods.ApprovalResolved: {
295
388
  const requestId = params.requestId;
296
389
  if (requestId) {
390
+ this.approvalRoutes.delete(requestId);
297
391
  const sessionId = typeof params.sessionId === "string" ? params.sessionId : undefined;
298
392
  const event = sessionId === undefined ? { requestId } : { sessionId, requestId };
299
393
  this.emitter.emit("approvalResolved", event);
@@ -306,8 +400,26 @@ export class AgentClient {
306
400
  this.emitter.emit("status", status, message);
307
401
  break;
308
402
  }
403
+ default: {
404
+ // Extension-owned notification methods (e.g. projection deltas pushed
405
+ // by a ProtocolObserver via host.notify) surface through a generic
406
+ // per-method channel; core knows nothing about their payloads.
407
+ this.emitter.emit(`notification:${notif.method}`, params);
408
+ break;
409
+ }
309
410
  }
310
411
  }
412
+ /** Subscribe to an extension-owned server notification method. */
413
+ onExtensionNotification(method, handler) {
414
+ this.emitter.on(`notification:${method}`, handler);
415
+ }
416
+ offExtensionNotification(method, handler) {
417
+ this.emitter.off(`notification:${method}`, handler);
418
+ }
419
+ /** Issue a request to an extension-registered protocol method. */
420
+ async requestExtension(method, params) {
421
+ return this.request(method, params);
422
+ }
311
423
  close() {
312
424
  // Reject all pending requests
313
425
  for (const [, pending] of this.pendingRequests) {
@@ -1,4 +1,4 @@
1
1
  export { AgentServer, type AgentServerOptions } from "./server.js";
2
2
  export { AgentClient } from "./client.js";
3
- export { createInProcessTransport, StdioTransport, type Transport, } from "./transport.js";
4
- export { Methods, ErrorCodes, type RpcMessage, type RunResult } from "./types.js";
3
+ export { createInProcessTransport, StdioTransport, type Transport } from "./transport.js";
4
+ export { Methods, ErrorCodes, type RpcMessage, type RunResult, type PluginCommandsListParams, type PluginCommandsListResult, type ProtocolPluginCommandDescriptor, type PluginCommandExpandParams, type PluginCommandExpandResult, } from "./types.js";
@@ -1,4 +1,4 @@
1
1
  export { AgentServer } from "./server.js";
2
2
  export { AgentClient } from "./client.js";
3
- export { createInProcessTransport, StdioTransport, } from "./transport.js";
4
- export { Methods, ErrorCodes } from "./types.js";
3
+ export { createInProcessTransport, StdioTransport } from "./transport.js";
4
+ export { Methods, ErrorCodes, } from "./types.js";