@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,6 @@
1
+ import { join } from "node:path";
1
2
  import { ChatSession } from "./chat-session.js";
3
+ import { codeShellHome } from "../session/session-manager.js";
2
4
  import { backgroundShellManager } from "../runtime/background-shell.js";
3
5
  import { clearAgentOutputFiles } from "../tool-system/builtin/agent-output-file.js";
4
6
  import { backgroundJobRegistry } from "../tool-system/builtin/background-jobs.js";
@@ -7,35 +9,113 @@ import { clearInjectCredentialSessionAllow } from "../credentials/inject-credent
7
9
  import { logger } from "../logging/logger.js";
8
10
  import { clearSessionPathApprovals, openSessionPathApprovals } from "../tool-system/path-policy.js";
9
11
  import { clearInteractiveApprovalSession, openInteractiveApprovalSession, } from "../tool-system/permission.js";
12
+ /** Identity scope every ChatSessionManager belongs to when none is injected. */
13
+ export const LOCAL_CHAT_IDENTITY = "local";
14
+ /**
15
+ * An identity becomes an on-disk path segment (`<root>/identities/<id>`), so
16
+ * it gets the same conservative validation as session ids: no separators, no
17
+ * parent-dir tokens, short, and a strict character allow-list.
18
+ */
19
+ function assertSafeIdentity(identity) {
20
+ if (typeof identity !== "string" || identity.length === 0 || identity.length > 64) {
21
+ throw new Error(`invalid identity: must be a non-empty string of at most 64 chars`);
22
+ }
23
+ if (identity.includes("/") ||
24
+ identity.includes("\\") ||
25
+ identity === "." ||
26
+ identity.includes("..") ||
27
+ !/^[A-Za-z0-9_.-]+$/.test(identity)) {
28
+ throw new Error(`invalid identity: unexpected characters: ${identity}`);
29
+ }
30
+ }
31
+ export const CLOSED_CHAT_SESSION_TOMBSTONE_LIMIT = 4096;
10
32
  export class ChatSessionManager {
11
33
  sessions = new Map();
34
+ closingSessions = new Map();
35
+ closedSessions = new Set();
36
+ sessionGeneration = new Map();
12
37
  runtime;
38
+ /** Identity scope this manager serves ("local" unless injected). */
39
+ identity;
13
40
  factory;
14
41
  maxSessions;
15
42
  idleTtlMs;
43
+ projectionGeneration;
44
+ /** Construction options retained so forIdentity() can derive siblings. */
45
+ baseOptions;
16
46
  sweeper = null;
17
47
  constructor(opts) {
18
48
  this.runtime = opts.runtime;
49
+ this.identity = opts.identity ?? LOCAL_CHAT_IDENTITY;
50
+ if (opts.identity !== undefined)
51
+ assertSafeIdentity(opts.identity);
19
52
  this.factory = opts.engineFactory;
20
53
  this.maxSessions = opts.maxSessions ?? 16;
21
54
  this.idleTtlMs = opts.idleTtlMs ?? 30 * 60 * 1000;
55
+ this.projectionGeneration = opts.projectionGeneration ?? 1;
56
+ this.baseOptions = opts;
57
+ }
58
+ /**
59
+ * Derive a manager scoped to another identity. The derived manager shares
60
+ * this manager's runtime/limits but persists its sessions under
61
+ * `<dataRoot>/identities/<identity>/sessions` by injecting
62
+ * `sessionStorageDir` into every engineFactory slice (Task 1's SessionManager
63
+ * storageDir seam). Asking for this manager's own identity returns `this`
64
+ * unchanged, so the default single-identity ("local") path is byte-for-byte
65
+ * today's behavior. Callers (AgentServer) cache derived managers per
66
+ * identity; each call here builds a fresh instance.
67
+ */
68
+ forIdentity(identity) {
69
+ assertSafeIdentity(identity);
70
+ if (identity === this.identity)
71
+ return this;
72
+ const sessionStorageDir = join(this.baseOptions.dataRoot ?? codeShellHome(), "identities", identity, "sessions");
73
+ const baseFactory = this.baseOptions.engineFactory;
74
+ return new ChatSessionManager({
75
+ ...this.baseOptions,
76
+ identity,
77
+ engineFactory: (slice) => baseFactory({ ...slice, sessionStorageDir }),
78
+ });
79
+ }
80
+ async getOrCreate(sessionId, slice) {
81
+ const closing = this.closingSessions.get(sessionId);
82
+ if (closing) {
83
+ await closing;
84
+ }
85
+ return this.getOrCreateNow(sessionId, slice);
22
86
  }
23
- getOrCreate(sessionId, slice) {
87
+ /**
88
+ * Cold-resume a persisted session using its own cwd. The first detached
89
+ * Engine is only a storage probe; all actual work runs on the second Engine
90
+ * built from the recovered project slice.
91
+ */
92
+ async getOrCreatePersisted(sessionId, slice = {}, restorePersistedModel = true) {
93
+ const existing = this.sessions.get(sessionId);
94
+ if (existing)
95
+ return existing;
96
+ const probe = this.factory(slice);
97
+ if (!probe.sessionExistsOnDisk(sessionId))
98
+ return null;
99
+ const cwd = probe.getSessionManager().readSessionMainRoot(sessionId);
100
+ if (!cwd)
101
+ return null;
102
+ const session = await this.getOrCreate(sessionId, {
103
+ ...slice,
104
+ cwd,
105
+ projectTrusted: slice.projectTrusted ?? false,
106
+ });
107
+ if (restorePersistedModel)
108
+ session.engine.restoreSessionModel(sessionId);
109
+ return session;
110
+ }
111
+ getOrCreateNow(sessionId, slice) {
24
112
  openSessionPathApprovals(sessionId);
25
113
  openInteractiveApprovalSession(sessionId);
26
114
  const existing = this.sessions.get(sessionId);
27
115
  if (existing) {
28
116
  existing.lastActivityAt = Date.now();
29
- // Re-apply the per-send permission mode so a pill change on an
30
- // already-running session takes effect on the NEXT turn. Without this the
31
- // engine kept whatever mode it was first created with — changing the pill
32
- // on a resumed session was silently ignored at enforcement time (#11
33
- // secondary: "档位 doesn't take effect after first send"). setPermissionMode
34
- // reconfigures the live permission backend, so it's safe between turns.
35
- if (slice.permissionMode &&
36
- typeof existing.engine.getPermissionMode === "function" &&
37
- existing.engine.getPermissionMode() !== slice.permissionMode) {
38
- existing.engine.setPermissionMode(slice.permissionMode);
117
+ if (slice.permissionMode && existing.engine.getPermissionMode?.() !== slice.permissionMode) {
118
+ existing.engine.setPermissionMode?.(slice.permissionMode);
39
119
  }
40
120
  return existing;
41
121
  }
@@ -46,12 +126,27 @@ export class ChatSessionManager {
46
126
  }
47
127
  const engine = this.factory(slice);
48
128
  const session = new ChatSession({ id: sessionId, engine });
129
+ const sessionManager = this.engineSessionManager(engine);
130
+ const generation = sessionManager?.registerSessionGeneration(sessionId) ?? 1;
131
+ this.sessionGeneration.set(sessionId, generation);
49
132
  this.sessions.set(sessionId, session);
133
+ // A direct user run is an explicit resume/open and may clear the tombstone.
134
+ // Background wakeups must check isUnavailable() before reaching this path.
135
+ this.closedSessions.delete(sessionId);
50
136
  return session;
51
137
  }
52
138
  get(sessionId) {
53
139
  return this.sessions.get(sessionId);
54
140
  }
141
+ isClosing(sessionId) {
142
+ return this.closingSessions.has(sessionId);
143
+ }
144
+ isClosed(sessionId) {
145
+ return this.closedSessions.has(sessionId);
146
+ }
147
+ isUnavailable(sessionId) {
148
+ return this.isClosing(sessionId) || this.isClosed(sessionId);
149
+ }
55
150
  sessionExistsOnDisk(sessionId, slice) {
56
151
  const existing = this.sessions.get(sessionId);
57
152
  if (existing)
@@ -69,17 +164,80 @@ export class ChatSessionManager {
69
164
  for (const s of [...this.sessions.values()])
70
165
  fn(s);
71
166
  }
167
+ /** Snapshot-safe, read-only source shared by query("sessions") and Pet projection. */
168
+ getLiveSessionSnapshot() {
169
+ const sessions = [];
170
+ this.forEachSession((session) => {
171
+ sessions.push({
172
+ sessionId: session.id,
173
+ busy: session.isBusy(),
174
+ queueDepth: session.queueDepth(),
175
+ lastActivityAt: session.lastActivityAt,
176
+ kind: session.engine
177
+ .getSessionManager?.()
178
+ .readSessionKind?.(session.id) ?? "work",
179
+ });
180
+ });
181
+ sessions.sort((a, b) => a.sessionId.localeCompare(b.sessionId));
182
+ return { generation: this.projectionGeneration, identity: this.identity, sessions };
183
+ }
72
184
  close(sessionId) {
185
+ return this.closeSession(sessionId, true);
186
+ }
187
+ closeSession(sessionId, markClosed) {
188
+ const alreadyClosing = this.closingSessions.get(sessionId);
189
+ if (alreadyClosing)
190
+ return alreadyClosing;
73
191
  const s = this.sessions.get(sessionId);
74
- if (!s)
75
- return;
192
+ if (!s) {
193
+ if (markClosed)
194
+ this.rememberClosedSession(sessionId);
195
+ return Promise.resolve();
196
+ }
197
+ const sessionManager = this.engineSessionManager(s.engine);
198
+ const generation = this.sessionGeneration.get(sessionId) ?? 0;
199
+ const invalidated = sessionManager?.incrementSessionGeneration(sessionId) ?? generation + 1;
200
+ this.sessionGeneration.set(sessionId, invalidated);
76
201
  s.cancel();
77
202
  clearSessionPathApprovals(sessionId);
78
203
  clearInteractiveApprovalSession(sessionId);
79
204
  clearCredentialSessionAllow(sessionId);
80
205
  clearInjectCredentialSessionAllow(sessionId);
81
- this.unregisterMcpOwner(s);
82
- this.sessions.delete(sessionId);
206
+ const finishClose = () => {
207
+ this.unregisterMcpOwner(s);
208
+ if (this.sessions.get(sessionId) === s)
209
+ this.sessions.delete(sessionId);
210
+ if (markClosed)
211
+ this.rememberClosedSession(sessionId);
212
+ else
213
+ this.closedSessions.delete(sessionId);
214
+ this.sessionGeneration.delete(sessionId);
215
+ };
216
+ if (!s.isBusy()) {
217
+ finishClose();
218
+ return Promise.resolve();
219
+ }
220
+ const closing = (async () => {
221
+ try {
222
+ await s.settled;
223
+ finishClose();
224
+ }
225
+ finally {
226
+ this.closingSessions.delete(sessionId);
227
+ }
228
+ })();
229
+ this.closingSessions.set(sessionId, closing);
230
+ return closing;
231
+ }
232
+ rememberClosedSession(sessionId) {
233
+ this.closedSessions.delete(sessionId);
234
+ this.closedSessions.add(sessionId);
235
+ while (this.closedSessions.size > CLOSED_CHAT_SESSION_TOMBSTONE_LIMIT) {
236
+ const oldest = this.closedSessions.values().next().value;
237
+ if (oldest === undefined)
238
+ break;
239
+ this.closedSessions.delete(oldest);
240
+ }
83
241
  }
84
242
  closeAll() {
85
243
  // Fire-and-forget variant for callers that can't await (e.g. AgentServer
@@ -95,8 +253,7 @@ export class ChatSessionManager {
95
253
  * immediately afterward (the TUI REPL) doesn't orphan detached dev servers.
96
254
  */
97
255
  async closeAllAsync() {
98
- for (const id of [...this.sessions.keys()])
99
- this.close(id);
256
+ await Promise.all([...this.sessions.keys()].map((id) => this.close(id)));
100
257
  // App/worker shutdown — reap every background shell so a detached
101
258
  // `npm run dev` doesn't outlive the process as an orphan holding a port
102
259
  // (design §6 / §难点1). NOTE: deliberately NOT in close()/sweepIdle() —
@@ -120,7 +277,7 @@ export class ChatSessionManager {
120
277
  continue;
121
278
  if (backgroundJobRegistry.hasRunningForSession(id))
122
279
  continue;
123
- this.close(id);
280
+ void this.closeSession(id, false);
124
281
  }
125
282
  }
126
283
  startIdleSweeper(intervalMs = 60_000) {
@@ -142,8 +299,27 @@ export class ChatSessionManager {
142
299
  void mcpPool.unregisterOwner(session.engine).catch((err) => {
143
300
  logger.warn("chat_session.mcp_owner_unregister_failed", {
144
301
  sessionId: session.id,
302
+ identity: this.identity,
145
303
  error: err instanceof Error ? err.message : String(err),
146
304
  });
147
305
  });
148
306
  }
307
+ engineSessionManager(engine) {
308
+ const candidate = engine;
309
+ const manager = candidate.getSessionManager?.();
310
+ if (typeof manager?.registerSessionGeneration !== "function" ||
311
+ typeof manager.incrementSessionGeneration !== "function") {
312
+ return undefined;
313
+ }
314
+ return manager;
315
+ }
316
+ }
317
+ /**
318
+ * Factory counterpart of `new ChatSessionManager(opts)` for identity/dataRoot
319
+ * aware hosts (identity dimension foundations, Task 2). Identity defaults to
320
+ * "local" and dataRoot to `codeShellHome()`, so omitting both is exactly the
321
+ * constructor every existing host already calls.
322
+ */
323
+ export function createChatSessionManager(opts) {
324
+ return new ChatSessionManager(opts);
149
325
  }
@@ -1,20 +1,32 @@
1
1
  import type { Engine, EngineResult } from "../engine/engine.js";
2
2
  import type { ModelEntry } from "../llm/model-pool.js";
3
3
  import type { StreamEvent } from "../types.js";
4
- import type { InputAttachmentMeta } from "./types.js";
4
+ import type { PermissionMode, SessionKind } from "../types.js";
5
+ import type { InputAttachmentMeta, PendingApprovalMetadata } from "./types.js";
6
+ import type { ApprovalRouter } from "../tool-system/permission.js";
7
+ import type { RunBehaviorMode } from "../engine/run-types.js";
8
+ import type { SessionMessageTarget } from "../session/session-message.js";
9
+ import type { LegacyPetWorkspaceOption } from "../types.js";
10
+ import { type GoalConfig } from "../goal/lifecycle.js";
5
11
  export interface ChatSessionOptions {
6
12
  id: string;
7
13
  engine: Engine;
8
14
  onStream?: (event: StreamEvent) => void;
9
15
  }
16
+ export interface PendingApprovalEntry {
17
+ resolve: (decision: unknown) => void;
18
+ metadata: PendingApprovalMetadata;
19
+ }
10
20
  export interface TurnOpts {
11
21
  /** Working directory override for this turn. If omitted, Engine uses its
12
22
  * configured cwd. */
13
23
  cwd?: string;
14
24
  onStream?: (event: StreamEvent) => void;
25
+ /** User-facing text persisted beside the full model-facing task. */
26
+ displayText?: string;
15
27
  /** Goal mode for this turn — forwarded to engine.run (loop-until-done).
16
28
  * String objective or full GoalConfig (objective + optional budgets). */
17
- goal?: string | import("../engine/goal.js").GoalConfig;
29
+ goal?: string | import("../goal/lifecycle.js").GoalConfig;
18
30
  /** Marks this turn as a synthetic system-reminder injection (background-job
19
31
  * completion notification) rather than the user's own input — persisted so
20
32
  * the disk reader skips it as a user bubble on replay. See Engine.run. */
@@ -23,6 +35,26 @@ export interface TurnOpts {
23
35
  clientMessageId?: string;
24
36
  /** Structured input attachments for this turn. */
25
37
  attachments?: InputAttachmentMeta[];
38
+ /** Permission mode snapshot for this queued turn only. */
39
+ permissionMode?: PermissionMode;
40
+ /** Plan-mode snapshot for this queued turn only. */
41
+ planMode?: boolean;
42
+ /** Named behavior profile snapshot for this queued turn only. */
43
+ behaviorMode?: RunBehaviorMode;
44
+ /** Generic per-run parameters consumed by the active behavior profile. */
45
+ profileParams?: Record<string, unknown>;
46
+ /** Digital human to bind durably to this Work Session. */
47
+ workspaceProfile?: string;
48
+ /** Closed same-project Session catalog available to SendMessageToSession. */
49
+ sessionMessageTargets?: readonly SessionMessageTarget[];
50
+ /** @deprecated Compat alias for `profileParams.runtimeContext`. */
51
+ petRuntimeContext?: string;
52
+ /** @deprecated Compat alias for `profileParams.workspaces`. */
53
+ petWorkspaces?: LegacyPetWorkspaceOption[];
54
+ /** Durable classification used only when the Engine creates the session. */
55
+ kind?: SessionKind;
56
+ /** Connection owner router for permission prompts in this turn. */
57
+ approvalRouter?: ApprovalRouter;
26
58
  }
27
59
  /**
28
60
  * One ChatSession per UI chat tab. Owns a single Engine, an AbortController
@@ -33,16 +65,16 @@ export declare class ChatSession {
33
65
  readonly id: string;
34
66
  readonly engine: Engine;
35
67
  /**
36
- * Per-session approval callbacks indexed by tool-call requestId.
68
+ * Per-session approval callbacks and resolver-free metadata indexed by requestId.
37
69
  * `readonly` guards the Map reference (preventing reassignment); the
38
70
  * contents are mutated by `.set()` / `.delete()` as approvals come and go.
39
- * Task 10 will register entries here when the Engine raises an approval
40
- * request and clean them up on response.
71
+ * The resolver stays process-local; only metadata is eligible for Pet snapshots.
41
72
  */
42
- readonly pendingApprovals: Map<string, (decision: unknown) => void>;
73
+ readonly pendingApprovals: Map<string, PendingApprovalEntry>;
43
74
  lastActivityAt: number;
44
75
  private queue;
45
76
  private active;
77
+ private exclusiveOperation;
46
78
  private controller;
47
79
  private readonly defaultOnStream?;
48
80
  /**
@@ -69,8 +101,17 @@ export declare class ChatSession {
69
101
  * (the user is engaging again) so normal wakeups resume working afterward.
70
102
  */
71
103
  private cancelledSinceLastTurn;
104
+ private settlePromise;
105
+ private resolveSettled;
72
106
  constructor(opts: ChatSessionOptions);
73
107
  enqueueTurn(task: string, opts: TurnOpts): Promise<EngineResult>;
108
+ /**
109
+ * Run session maintenance (for example context-package summarization) under
110
+ * the same per-session mutex as turns. Existing activity fails fast; turns
111
+ * arriving after the lock is acquired remain queued until maintenance has
112
+ * persisted its final usage/state update.
113
+ */
114
+ runExclusive<T>(operation: (signal: AbortSignal) => Promise<T>): Promise<T>;
74
115
  /**
75
116
  * True when the user hit Stop and hasn't started a new turn since. The server
76
117
  * consults this before auto-waking an idle session on a background-job
@@ -88,6 +129,8 @@ export declare class ChatSession {
88
129
  */
89
130
  cancel(): void;
90
131
  isBusy(): boolean;
132
+ /** Resolves after the active engine.run() has completed its pump finally. */
133
+ get settled(): Promise<void>;
91
134
  /**
92
135
  * Extend the in-flight goal run's turn/budget ceilings (TODO 3.1). Delegates
93
136
  * to the engine, which forwards to the active TurnLoop. Returns null when no
@@ -106,16 +149,34 @@ export declare class ChatSession {
106
149
  maxStopBlocks: number;
107
150
  } | null;
108
151
  /**
109
- * Read this session's persisted active goal (state.activeGoal), or undefined
152
+ * Read this session's persisted active goal (state.goalLifecycle), or undefined
110
153
  * when none. Cheap — reads only state.json. The host calls this on session
111
154
  * load to re-surface the goal block + Cancel button after a reload.
112
155
  */
113
- getGoal(): import("../engine/goal.js").GoalConfig | undefined;
156
+ getGoal(): import("../goal/lifecycle.js").GoalConfig | undefined;
114
157
  /**
115
158
  * Clear this session's persisted active goal (CC /goal clear). Works idle or
116
159
  * mid-run. Returns true if a goal was actually cleared.
117
160
  */
118
- clearGoal(): boolean;
161
+ clearGoal(expected?: {
162
+ goalId?: string;
163
+ revision?: number;
164
+ }): boolean;
165
+ /** Edit or pause/resume this session's persistent goal. */
166
+ updateGoal(patch: {
167
+ objective?: string;
168
+ paused?: boolean;
169
+ expectedGoalId?: string;
170
+ expectedRevision?: number;
171
+ }): import("../goal/lifecycle.js").GoalConfig | undefined;
172
+ /** Whether a paused Goal can reuse this run's already Goal-capable prompt/tools. */
173
+ canResumeGoalInPlace(): boolean;
174
+ /**
175
+ * Queue the synthetic turn which actually drives an idle/dormant Goal after
176
+ * Resume. The version guard is checked at queue head, so a later edit/delete
177
+ * cannot leave a stale "resume" turn behind another user turn.
178
+ */
179
+ enqueueGoalResumeTurn(goal: GoalConfig, opts?: Omit<TurnOpts, "goal">): Promise<boolean>;
119
180
  /**
120
181
  * Switch this session's active model (per-session, not worker-global).
121
182
  * Applies immediately when idle; defers to the next run boundary when a
@@ -132,6 +193,8 @@ export declare class ChatSession {
132
193
  * path and the deferred run-boundary path.
133
194
  */
134
195
  private applyModelSwitch;
196
+ /** Apply and clear a deferred switch before another run may start. */
197
+ private applyPendingModelSwitchAtRunBoundary;
135
198
  queueDepth(): number;
136
199
  private pump;
137
200
  }