@cjhyy/code-shell-core 0.7.1 → 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 (594) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/permission.d.ts +26 -0
  374. package/dist/tool-system/permission.js +46 -0
  375. package/dist/tool-system/registry.d.ts +12 -1
  376. package/dist/tool-system/registry.js +31 -7
  377. package/dist/tool-system/sandbox/index.js +3 -8
  378. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  379. package/dist/tool-system/session-tool-host.d.ts +139 -0
  380. package/dist/tool-system/session-tool-host.js +167 -0
  381. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  382. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  383. package/dist/tool-system/validation.d.ts +14 -7
  384. package/dist/tool-system/validation.js +701 -7
  385. package/dist/types.d.ts +186 -20
  386. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  388. package/dist/utils/file-mutex.d.ts +65 -0
  389. package/dist/utils/file-mutex.js +145 -0
  390. package/dist/utils/json.d.ts +2 -4
  391. package/dist/utils/json.js +2 -4
  392. package/dist/utils/lockfile.d.ts +30 -1
  393. package/dist/utils/lockfile.js +2 -2
  394. package/dist/utils/secret-scrubber.d.ts +8 -0
  395. package/dist/utils/secret-scrubber.js +227 -0
  396. package/dist/utils/toolDisplay.js +1 -1
  397. package/package.json +20 -5
  398. package/THIRD_PARTY_NOTICES.md +0 -206
  399. package/dist/arena/arena.d.ts +0 -45
  400. package/dist/arena/arena.js +0 -362
  401. package/dist/arena/context/context-tools.d.ts +0 -16
  402. package/dist/arena/context/context-tools.js +0 -272
  403. package/dist/arena/context/within-root.d.ts +0 -7
  404. package/dist/arena/context/within-root.js +0 -15
  405. package/dist/arena/detect-mode.d.ts +0 -20
  406. package/dist/arena/detect-mode.js +0 -78
  407. package/dist/arena/digest-builder.d.ts +0 -25
  408. package/dist/arena/digest-builder.js +0 -120
  409. package/dist/arena/index.d.ts +0 -29
  410. package/dist/arena/index.js +0 -29
  411. package/dist/arena/iterate/convergence.d.ts +0 -25
  412. package/dist/arena/iterate/convergence.js +0 -103
  413. package/dist/arena/iterate/formats/index.d.ts +0 -22
  414. package/dist/arena/iterate/formats/index.js +0 -283
  415. package/dist/arena/iterate/index.d.ts +0 -11
  416. package/dist/arena/iterate/index.js +0 -9
  417. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  418. package/dist/arena/iterate/iterative-arena.js +0 -237
  419. package/dist/arena/iterate/parse.d.ts +0 -42
  420. package/dist/arena/iterate/parse.js +0 -123
  421. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  422. package/dist/arena/iterate/phases/argue.js +0 -165
  423. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  424. package/dist/arena/iterate/phases/revise.js +0 -62
  425. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  426. package/dist/arena/iterate/phases/tournament.js +0 -113
  427. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  428. package/dist/arena/iterate/tools/web-tools.js +0 -54
  429. package/dist/arena/iterate/types.d.ts +0 -152
  430. package/dist/arena/iterate/types.js +0 -8
  431. package/dist/arena/ledger.d.ts +0 -47
  432. package/dist/arena/ledger.js +0 -159
  433. package/dist/arena/lenses/architecture.d.ts +0 -5
  434. package/dist/arena/lenses/architecture.js +0 -22
  435. package/dist/arena/lenses/engineering.d.ts +0 -5
  436. package/dist/arena/lenses/engineering.js +0 -22
  437. package/dist/arena/lenses/general.d.ts +0 -5
  438. package/dist/arena/lenses/general.js +0 -20
  439. package/dist/arena/lenses/index.d.ts +0 -16
  440. package/dist/arena/lenses/index.js +0 -47
  441. package/dist/arena/lenses/product.d.ts +0 -5
  442. package/dist/arena/lenses/product.js +0 -22
  443. package/dist/arena/model-presets.d.ts +0 -23
  444. package/dist/arena/model-presets.js +0 -44
  445. package/dist/arena/phases/adjudication.d.ts +0 -25
  446. package/dist/arena/phases/adjudication.js +0 -142
  447. package/dist/arena/phases/build-consensus.d.ts +0 -30
  448. package/dist/arena/phases/build-consensus.js +0 -85
  449. package/dist/arena/phases/claim-registry.d.ts +0 -26
  450. package/dist/arena/phases/claim-registry.js +0 -60
  451. package/dist/arena/phases/cross-review.d.ts +0 -47
  452. package/dist/arena/phases/cross-review.js +0 -224
  453. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  454. package/dist/arena/phases/debate-rounds.js +0 -161
  455. package/dist/arena/phases/participant-research.d.ts +0 -39
  456. package/dist/arena/phases/participant-research.js +0 -316
  457. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  458. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  459. package/dist/arena/planner.d.ts +0 -28
  460. package/dist/arena/planner.js +0 -312
  461. package/dist/arena/providers/docs.d.ts +0 -7
  462. package/dist/arena/providers/docs.js +0 -111
  463. package/dist/arena/providers/git.d.ts +0 -8
  464. package/dist/arena/providers/git.js +0 -174
  465. package/dist/arena/providers/index.d.ts +0 -32
  466. package/dist/arena/providers/index.js +0 -132
  467. package/dist/arena/providers/none.d.ts +0 -7
  468. package/dist/arena/providers/none.js +0 -11
  469. package/dist/arena/providers/repo.d.ts +0 -7
  470. package/dist/arena/providers/repo.js +0 -258
  471. package/dist/arena/render/session.d.ts +0 -17
  472. package/dist/arena/render/session.js +0 -190
  473. package/dist/arena/render/terminal.d.ts +0 -34
  474. package/dist/arena/render/terminal.js +0 -286
  475. package/dist/arena/strategies/discussion.d.ts +0 -25
  476. package/dist/arena/strategies/discussion.js +0 -143
  477. package/dist/arena/strategies/index.d.ts +0 -15
  478. package/dist/arena/strategies/index.js +0 -28
  479. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  480. package/dist/arena/strategies/language-wrapper.js +0 -102
  481. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  482. package/dist/arena/strategies/lens-wrapper.js +0 -236
  483. package/dist/arena/strategies/planning.d.ts +0 -30
  484. package/dist/arena/strategies/planning.js +0 -225
  485. package/dist/arena/strategies/review.d.ts +0 -26
  486. package/dist/arena/strategies/review.js +0 -168
  487. package/dist/arena/strategies/utils.d.ts +0 -36
  488. package/dist/arena/strategies/utils.js +0 -603
  489. package/dist/arena/tools/selector.d.ts +0 -17
  490. package/dist/arena/tools/selector.js +0 -61
  491. package/dist/arena/transitions.d.ts +0 -53
  492. package/dist/arena/transitions.js +0 -97
  493. package/dist/arena/types.d.ts +0 -518
  494. package/dist/arena/types.js +0 -27
  495. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  496. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  497. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  498. package/dist/cc-orchestrator/cc-capability.js +0 -53
  499. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  500. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  501. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  502. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  503. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  504. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  505. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  506. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  507. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  508. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  509. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  510. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  511. package/dist/cc-orchestrator/index.d.ts +0 -8
  512. package/dist/cc-orchestrator/index.js +0 -8
  513. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  514. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  515. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  516. package/dist/cc-orchestrator/session-discovery.js +0 -125
  517. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  518. package/dist/cc-orchestrator/session-history.js +0 -150
  519. package/dist/cron/cron-runtime.d.ts +0 -2
  520. package/dist/cron/cron-runtime.js +0 -2
  521. package/dist/cron/cron-store.d.ts +0 -2
  522. package/dist/cron/cron-store.js +0 -2
  523. package/dist/cron/scheduler.d.ts +0 -7
  524. package/dist/cron/scheduler.js +0 -7
  525. package/dist/engine/goal.js +0 -206
  526. package/dist/external-agents/config.d.ts +0 -2
  527. package/dist/external-agents/config.js +0 -15
  528. package/dist/external-agents/types.d.ts +0 -31
  529. package/dist/git/parse-log.d.ts +0 -13
  530. package/dist/git/parse-log.js +0 -21
  531. package/dist/git/utils.d.ts +0 -49
  532. package/dist/git/utils.js +0 -161
  533. package/dist/git/worktree/crud.d.ts +0 -72
  534. package/dist/git/worktree/crud.js +0 -235
  535. package/dist/git/worktree/diff.d.ts +0 -14
  536. package/dist/git/worktree/diff.js +0 -82
  537. package/dist/git/worktree/git-exec.d.ts +0 -7
  538. package/dist/git/worktree/git-exec.js +0 -87
  539. package/dist/git/worktree/index.d.ts +0 -5
  540. package/dist/git/worktree/index.js +0 -5
  541. package/dist/git/worktree/query.d.ts +0 -43
  542. package/dist/git/worktree/query.js +0 -128
  543. package/dist/git/worktree/slug.d.ts +0 -11
  544. package/dist/git/worktree/slug.js +0 -58
  545. package/dist/git/worktree.d.ts +0 -1
  546. package/dist/git/worktree.js +0 -5
  547. package/dist/lsp/client.d.ts +0 -41
  548. package/dist/lsp/client.js +0 -186
  549. package/dist/lsp/manager.d.ts +0 -40
  550. package/dist/lsp/manager.js +0 -155
  551. package/dist/lsp/root-path.d.ts +0 -9
  552. package/dist/lsp/root-path.js +0 -12
  553. package/dist/lsp/servers.d.ts +0 -16
  554. package/dist/lsp/servers.js +0 -60
  555. package/dist/prompt/sections/coding.md +0 -35
  556. package/dist/quota/credentials.d.ts +0 -3
  557. package/dist/quota/credentials.js +0 -80
  558. package/dist/quota/index.d.ts +0 -36
  559. package/dist/quota/index.js +0 -155
  560. package/dist/quota/types.d.ts +0 -48
  561. package/dist/quota/types.js +0 -13
  562. package/dist/review/review-prompt.d.ts +0 -28
  563. package/dist/review/review-prompt.js +0 -81
  564. package/dist/state.d.ts +0 -160
  565. package/dist/state.js +0 -267
  566. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  567. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  568. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  570. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  571. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  572. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  573. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  574. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  576. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  577. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  578. package/dist/tool-system/builtin/arena.d.ts +0 -31
  579. package/dist/tool-system/builtin/arena.js +0 -416
  580. package/dist/tool-system/builtin/brief.d.ts +0 -6
  581. package/dist/tool-system/builtin/brief.js +0 -41
  582. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  583. package/dist/tool-system/builtin/check-quota.js +0 -34
  584. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  585. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  586. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  587. package/dist/tool-system/builtin/lsp.js +0 -144
  588. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  589. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  590. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  591. package/dist/tool-system/builtin/worktree.js +0 -363
  592. /package/dist/{external-agents → links}/types.js +0 -0
  593. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  594. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -1,8 +1,11 @@
1
1
  import { ChatSession } from "./chat-session.js";
2
+ import type { SessionKind } from "../types.js";
2
3
  import type { Engine } from "../engine/engine.js";
3
4
  import type { EngineRuntime } from "../engine/runtime.js";
4
5
  import type { EngineConfig } from "../engine/types.js";
5
- export type EngineConfigSlice = Pick<EngineConfig, "permissionMode" | "preset" | "customSystemPrompt" | "appendSystemPrompt" | "goal" | "maxTurns" | "maxContextTokens" | "cwd" | "projectTrusted">;
6
+ export type EngineConfigSlice = Pick<EngineConfig, "permissionMode" | "preset" | "customSystemPrompt" | "appendSystemPrompt" | "goal" | "maxTurns" | "maxContextTokens" | "cwd" | "projectTrusted" | "sessionStorageDir">;
7
+ /** Identity scope every ChatSessionManager belongs to when none is injected. */
8
+ export declare const LOCAL_CHAT_IDENTITY = "local";
6
9
  export interface ChatSessionManagerOptions {
7
10
  /**
8
11
  * Shared runtime, supplied here so callers and engineFactory closures
@@ -14,6 +17,35 @@ export interface ChatSessionManagerOptions {
14
17
  engineFactory: (slice: EngineConfigSlice) => Engine;
15
18
  maxSessions?: number;
16
19
  idleTtlMs?: number;
20
+ /** Host lifecycle generation attached to Pet projection snapshots/deltas. */
21
+ projectionGeneration?: number;
22
+ /**
23
+ * Identity scope this manager serves. Defaults to "local" — the single
24
+ * OS-user manager every host uses today. A server host that authenticates
25
+ * connections derives one manager per identity via {@link
26
+ * ChatSessionManager.forIdentity}; sessions never cross identities.
27
+ */
28
+ identity?: string;
29
+ /**
30
+ * Base data root used to derive per-identity session persistence
31
+ * (`<dataRoot>/identities/<id>/sessions`). Defaults to `codeShellHome()`
32
+ * (`CODE_SHELL_HOME` env → `~/.code-shell`). Only consulted when a
33
+ * non-default identity manager is derived — the default "local" manager
34
+ * never redirects persistence.
35
+ */
36
+ dataRoot?: string;
37
+ }
38
+ export interface LiveChatSessionSnapshot {
39
+ generation: number;
40
+ /** Identity scope of the manager that produced this snapshot. */
41
+ identity: string;
42
+ sessions: Array<{
43
+ sessionId: string;
44
+ busy: boolean;
45
+ queueDepth: number;
46
+ lastActivityAt: number;
47
+ kind: SessionKind;
48
+ }>;
17
49
  }
18
50
  export declare const CLOSED_CHAT_SESSION_TOMBSTONE_LIMIT = 4096;
19
51
  export declare class ChatSessionManager {
@@ -22,12 +54,34 @@ export declare class ChatSessionManager {
22
54
  private readonly closedSessions;
23
55
  private readonly sessionGeneration;
24
56
  readonly runtime: EngineRuntime;
57
+ /** Identity scope this manager serves ("local" unless injected). */
58
+ readonly identity: string;
25
59
  private readonly factory;
26
60
  private readonly maxSessions;
27
61
  private readonly idleTtlMs;
62
+ private readonly projectionGeneration;
63
+ /** Construction options retained so forIdentity() can derive siblings. */
64
+ private readonly baseOptions;
28
65
  private sweeper;
29
66
  constructor(opts: ChatSessionManagerOptions);
67
+ /**
68
+ * Derive a manager scoped to another identity. The derived manager shares
69
+ * this manager's runtime/limits but persists its sessions under
70
+ * `<dataRoot>/identities/<identity>/sessions` by injecting
71
+ * `sessionStorageDir` into every engineFactory slice (Task 1's SessionManager
72
+ * storageDir seam). Asking for this manager's own identity returns `this`
73
+ * unchanged, so the default single-identity ("local") path is byte-for-byte
74
+ * today's behavior. Callers (AgentServer) cache derived managers per
75
+ * identity; each call here builds a fresh instance.
76
+ */
77
+ forIdentity(identity: string): ChatSessionManager;
30
78
  getOrCreate(sessionId: string, slice: EngineConfigSlice): Promise<ChatSession>;
79
+ /**
80
+ * Cold-resume a persisted session using its own cwd. The first detached
81
+ * Engine is only a storage probe; all actual work runs on the second Engine
82
+ * built from the recovered project slice.
83
+ */
84
+ getOrCreatePersisted(sessionId: string, slice?: Partial<EngineConfigSlice>, restorePersistedModel?: boolean): Promise<ChatSession | null>;
31
85
  private getOrCreateNow;
32
86
  get(sessionId: string): ChatSession | undefined;
33
87
  isClosing(sessionId: string): boolean;
@@ -41,6 +95,8 @@ export declare class ChatSessionManager {
41
95
  * the values so a callback that closes a session can't perturb the walk.
42
96
  */
43
97
  forEachSession(fn: (s: ChatSession) => void): void;
98
+ /** Snapshot-safe, read-only source shared by query("sessions") and Pet projection. */
99
+ getLiveSessionSnapshot(): LiveChatSessionSnapshot;
44
100
  close(sessionId: string): Promise<void>;
45
101
  private closeSession;
46
102
  private rememberClosedSession;
@@ -58,3 +114,10 @@ export declare class ChatSessionManager {
58
114
  private unregisterMcpOwner;
59
115
  private engineSessionManager;
60
116
  }
117
+ /**
118
+ * Factory counterpart of `new ChatSessionManager(opts)` for identity/dataRoot
119
+ * aware hosts (identity dimension foundations, Task 2). Identity defaults to
120
+ * "local" and dataRoot to `codeShellHome()`, so omitting both is exactly the
121
+ * constructor every existing host already calls.
122
+ */
123
+ export declare function createChatSessionManager(opts: ChatSessionManagerOptions): ChatSessionManager;
@@ -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,6 +9,25 @@ 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
+ }
10
31
  export const CLOSED_CHAT_SESSION_TOMBSTONE_LIMIT = 4096;
11
32
  export class ChatSessionManager {
12
33
  sessions = new Map();
@@ -14,15 +35,47 @@ export class ChatSessionManager {
14
35
  closedSessions = new Set();
15
36
  sessionGeneration = new Map();
16
37
  runtime;
38
+ /** Identity scope this manager serves ("local" unless injected). */
39
+ identity;
17
40
  factory;
18
41
  maxSessions;
19
42
  idleTtlMs;
43
+ projectionGeneration;
44
+ /** Construction options retained so forIdentity() can derive siblings. */
45
+ baseOptions;
20
46
  sweeper = null;
21
47
  constructor(opts) {
22
48
  this.runtime = opts.runtime;
49
+ this.identity = opts.identity ?? LOCAL_CHAT_IDENTITY;
50
+ if (opts.identity !== undefined)
51
+ assertSafeIdentity(opts.identity);
23
52
  this.factory = opts.engineFactory;
24
53
  this.maxSessions = opts.maxSessions ?? 16;
25
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
+ });
26
79
  }
27
80
  async getOrCreate(sessionId, slice) {
28
81
  const closing = this.closingSessions.get(sessionId);
@@ -31,6 +84,30 @@ export class ChatSessionManager {
31
84
  }
32
85
  return this.getOrCreateNow(sessionId, slice);
33
86
  }
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
+ }
34
111
  getOrCreateNow(sessionId, slice) {
35
112
  openSessionPathApprovals(sessionId);
36
113
  openInteractiveApprovalSession(sessionId);
@@ -87,6 +164,23 @@ export class ChatSessionManager {
87
164
  for (const s of [...this.sessions.values()])
88
165
  fn(s);
89
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
+ }
90
184
  close(sessionId) {
91
185
  return this.closeSession(sessionId, true);
92
186
  }
@@ -205,6 +299,7 @@ export class ChatSessionManager {
205
299
  void mcpPool.unregisterOwner(session.engine).catch((err) => {
206
300
  logger.warn("chat_session.mcp_owner_unregister_failed", {
207
301
  sessionId: session.id,
302
+ identity: this.identity,
208
303
  error: err instanceof Error ? err.message : String(err),
209
304
  });
210
305
  });
@@ -219,3 +314,12 @@ export class ChatSessionManager {
219
314
  return manager;
220
315
  }
221
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);
325
+ }
@@ -1,22 +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 { PermissionMode } from "../types.js";
5
- import type { InputAttachmentMeta } from "./types.js";
4
+ import type { PermissionMode, SessionKind } from "../types.js";
5
+ import type { InputAttachmentMeta, PendingApprovalMetadata } from "./types.js";
6
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";
7
11
  export interface ChatSessionOptions {
8
12
  id: string;
9
13
  engine: Engine;
10
14
  onStream?: (event: StreamEvent) => void;
11
15
  }
16
+ export interface PendingApprovalEntry {
17
+ resolve: (decision: unknown) => void;
18
+ metadata: PendingApprovalMetadata;
19
+ }
12
20
  export interface TurnOpts {
13
21
  /** Working directory override for this turn. If omitted, Engine uses its
14
22
  * configured cwd. */
15
23
  cwd?: string;
16
24
  onStream?: (event: StreamEvent) => void;
25
+ /** User-facing text persisted beside the full model-facing task. */
26
+ displayText?: string;
17
27
  /** Goal mode for this turn — forwarded to engine.run (loop-until-done).
18
28
  * String objective or full GoalConfig (objective + optional budgets). */
19
- goal?: string | import("../engine/goal.js").GoalConfig;
29
+ goal?: string | import("../goal/lifecycle.js").GoalConfig;
20
30
  /** Marks this turn as a synthetic system-reminder injection (background-job
21
31
  * completion notification) rather than the user's own input — persisted so
22
32
  * the disk reader skips it as a user bubble on replay. See Engine.run. */
@@ -29,6 +39,20 @@ export interface TurnOpts {
29
39
  permissionMode?: PermissionMode;
30
40
  /** Plan-mode snapshot for this queued turn only. */
31
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;
32
56
  /** Connection owner router for permission prompts in this turn. */
33
57
  approvalRouter?: ApprovalRouter;
34
58
  }
@@ -41,16 +65,16 @@ export declare class ChatSession {
41
65
  readonly id: string;
42
66
  readonly engine: Engine;
43
67
  /**
44
- * Per-session approval callbacks indexed by tool-call requestId.
68
+ * Per-session approval callbacks and resolver-free metadata indexed by requestId.
45
69
  * `readonly` guards the Map reference (preventing reassignment); the
46
70
  * contents are mutated by `.set()` / `.delete()` as approvals come and go.
47
- * Task 10 will register entries here when the Engine raises an approval
48
- * request and clean them up on response.
71
+ * The resolver stays process-local; only metadata is eligible for Pet snapshots.
49
72
  */
50
- readonly pendingApprovals: Map<string, (decision: unknown) => void>;
73
+ readonly pendingApprovals: Map<string, PendingApprovalEntry>;
51
74
  lastActivityAt: number;
52
75
  private queue;
53
76
  private active;
77
+ private exclusiveOperation;
54
78
  private controller;
55
79
  private readonly defaultOnStream?;
56
80
  /**
@@ -81,6 +105,13 @@ export declare class ChatSession {
81
105
  private resolveSettled;
82
106
  constructor(opts: ChatSessionOptions);
83
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>;
84
115
  /**
85
116
  * True when the user hit Stop and hasn't started a new turn since. The server
86
117
  * consults this before auto-waking an idle session on a background-job
@@ -118,16 +149,34 @@ export declare class ChatSession {
118
149
  maxStopBlocks: number;
119
150
  } | null;
120
151
  /**
121
- * Read this session's persisted active goal (state.activeGoal), or undefined
152
+ * Read this session's persisted active goal (state.goalLifecycle), or undefined
122
153
  * when none. Cheap — reads only state.json. The host calls this on session
123
154
  * load to re-surface the goal block + Cancel button after a reload.
124
155
  */
125
- getGoal(): import("../engine/goal.js").GoalConfig | undefined;
156
+ getGoal(): import("../goal/lifecycle.js").GoalConfig | undefined;
126
157
  /**
127
158
  * Clear this session's persisted active goal (CC /goal clear). Works idle or
128
159
  * mid-run. Returns true if a goal was actually cleared.
129
160
  */
130
- 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>;
131
180
  /**
132
181
  * Switch this session's active model (per-session, not worker-global).
133
182
  * Applies immediately when idle; defers to the next run boundary when a
@@ -144,6 +193,8 @@ export declare class ChatSession {
144
193
  * path and the deferred run-boundary path.
145
194
  */
146
195
  private applyModelSwitch;
196
+ /** Apply and clear a deferred switch before another run may start. */
197
+ private applyPendingModelSwitchAtRunBoundary;
147
198
  queueDepth(): number;
148
199
  private pump;
149
200
  }
@@ -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
  /**
@@ -62,6 +63,36 @@ export class ChatSession {
62
63
  this.pump();
63
64
  });
64
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
+ }
65
96
  /**
66
97
  * True when the user hit Stop and hasn't started a new turn since. The server
67
98
  * consults this before auto-waking an idle session on a background-job
@@ -94,7 +125,7 @@ export class ChatSession {
94
125
  }
95
126
  }
96
127
  isBusy() {
97
- return this.active !== null;
128
+ return this.active !== null || this.exclusiveOperation;
98
129
  }
99
130
  /** Resolves after the active engine.run() has completed its pump finally. */
100
131
  get settled() {
@@ -110,7 +141,7 @@ export class ChatSession {
110
141
  return this.engine.extendGoalRun(opts);
111
142
  }
112
143
  /**
113
- * Read this session's persisted active goal (state.activeGoal), or undefined
144
+ * Read this session's persisted active goal (state.goalLifecycle), or undefined
114
145
  * when none. Cheap — reads only state.json. The host calls this on session
115
146
  * load to re-surface the goal block + Cancel button after a reload.
116
147
  */
@@ -121,8 +152,56 @@ export class ChatSession {
121
152
  * Clear this session's persisted active goal (CC /goal clear). Works idle or
122
153
  * mid-run. Returns true if a goal was actually cleared.
123
154
  */
124
- clearGoal() {
125
- 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
+ });
126
205
  }
127
206
  /**
128
207
  * Switch this session's active model (per-session, not worker-global).
@@ -150,17 +229,48 @@ export class ChatSession {
150
229
  * path and the deferred run-boundary path.
151
230
  */
152
231
  applyModelSwitch(key) {
153
- 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 });
154
236
  this.engine.resetSessionUsage(this.id);
155
237
  return entry;
156
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
+ }
157
254
  queueDepth() {
158
255
  return this.queue.length;
159
256
  }
160
257
  async pump() {
161
- if (this.active)
258
+ if (this.active || this.exclusiveOperation)
162
259
  return;
163
- 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
+ }
164
274
  if (!next)
165
275
  return;
166
276
  this.active = next;
@@ -174,6 +284,7 @@ export class ChatSession {
174
284
  const result = await this.engine.run(next.task, {
175
285
  cwd: next.opts.cwd,
176
286
  sessionId: this.id,
287
+ displayText: next.opts.displayText,
177
288
  signal: this.controller.signal,
178
289
  onStream,
179
290
  goal: next.opts.goal,
@@ -182,6 +293,13 @@ export class ChatSession {
182
293
  attachments: next.opts.attachments,
183
294
  permissionMode: next.opts.permissionMode,
184
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,
185
303
  approvalRouter: next.opts.approvalRouter,
186
304
  });
187
305
  this.lastActivityAt = Date.now();
@@ -217,21 +335,13 @@ export class ChatSession {
217
335
  // Run boundary: apply any model switch that was deferred because it was
218
336
  // requested mid-run. Done here (not in pump) so it still applies when
219
337
  // no further turn is queued.
220
- try {
221
- if (this.pendingModel !== null) {
222
- this.applyModelSwitch(this.pendingModel);
223
- }
224
- }
225
- catch {
226
- // requestModelSwitch already returned when the switch was queued. A
227
- // run-boundary persistence failure must not become an unhandled pump
228
- // rejection or prevent the session from settling/continuing.
229
- }
230
- finally {
231
- this.pendingModel = null;
232
- // Drain the next turn even if deferred model switching failed.
233
- if (this.queue.length > 0)
234
- void this.pump();
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());
235
345
  }
236
346
  }
237
347
  }