@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
@@ -27,6 +27,7 @@ import { mkdirSync, existsSync, readFileSync, writeFileSync, readdirSync, rename
27
27
  import { join } from "node:path";
28
28
  import { homedir } from "node:os";
29
29
  import { createHash, randomUUID } from "node:crypto";
30
+ import { acquireFileLock, writeFileAtomic } from "../utils/file-mutex.js";
30
31
  function frontmatterLine(key, value) {
31
32
  return `${key}: ${JSON.stringify(value)}\n`;
32
33
  }
@@ -178,8 +179,9 @@ export class MemoryManager {
178
179
  // save by paying one loadAll() — every save after that just
179
180
  // mutates the cache and rewrites MEMORY.md.
180
181
  const cache = this.ensureIndexCache();
181
- cache.set(fileName, { name: entry.name, description: entry.description });
182
- this.writeIndex(cache);
182
+ const meta = { name: entry.name, description: entry.description };
183
+ cache.set(fileName, meta);
184
+ this.writeIndex(cache, { kind: "save", fileName, meta });
183
185
  return fileName;
184
186
  }
185
187
  /**
@@ -386,7 +388,7 @@ export class MemoryManager {
386
388
  renameSync(join(this.memoryDir, entry.fileName), join(trashDir, entry.fileName));
387
389
  const cache = this.ensureIndexCache();
388
390
  cache.delete(entry.fileName);
389
- this.writeIndex(cache);
391
+ this.writeIndex(cache, { kind: "delete", fileName: entry.fileName });
390
392
  return true;
391
393
  }
392
394
  catch {
@@ -627,47 +629,64 @@ export class MemoryManager {
627
629
  `\n\nTo read a specific memory, look under ${this.memoryRoot}/{user,dream}/`);
628
630
  }
629
631
  /**
630
- * Two-layer injection index (用户拍板). Merges GLOBAL (cross-project
631
- * experience) + PROJECT (this repo's facts) memories into a compact index —
632
- * one line per entry, name + description only, NO body. The model reads a
633
- * specific entry's full content on demand via MemoryRead (which records a
634
- * recall → drives TTL + UI visibility).
632
+ * Three-layer injection index (用户拍板). Merges GLOBAL (cross-project
633
+ * experience) + DIGITAL-HUMAN (portable profile experience) + PROJECT
634
+ * (this repo's facts) memories into a compact index one line per entry,
635
+ * name + description only, NO body.
635
636
  *
636
637
  * This is what fixes "global memory never shows up": global memories are now
637
638
  * injected alongside project ones, every session, regardless of cwd.
638
639
  *
639
- * Static because it must construct two managers (global = no projectDir,
640
- * project = with projectDir). `projectDir` undefined → only global is shown.
640
+ * Static because it must construct the managers for each configured layer.
641
+ * `projectDir` undefined no project layer; `profileDir` undefined → no
642
+ * digital-human layer.
641
643
  */
642
644
  static buildInjectionIndex(opts) {
643
645
  const global = new MemoryManager({ baseDir: opts.baseDir });
644
646
  const project = opts.projectDir
645
647
  ? new MemoryManager({ baseDir: opts.baseDir, projectDir: opts.projectDir })
646
648
  : null;
649
+ // 数字人层:baseDir 直接指向 profiles/<name>(其 memory/ 子目录随
650
+ // MemoryManager 的常规布局落盘)。跟着 Profile 走、跨 workspace 复用。
651
+ const profile = opts.profileDir ? new MemoryManager({ baseDir: opts.profileDir }) : null;
647
652
  const pinnedFirst = (a, b) => Number(b.pinned ?? false) - Number(a.pinned ?? false);
648
653
  const collect = (mm) => filterByAge([...mm.loadScope("user"), ...mm.loadScope("dream")], opts.maxAgeDays, opts.now).sort(pinnedFirst);
649
654
  const globalEntries = collect(global);
655
+ const profileEntries = profile ? collect(profile) : [];
650
656
  const projectEntries = project ? collect(project) : [];
651
- if (globalEntries.length === 0 && projectEntries.length === 0)
657
+ if (globalEntries.length === 0 && profileEntries.length === 0 && projectEntries.length === 0) {
652
658
  return "";
653
- const fmt = (e) => `- ${e.pinned ? "[pinned] " : ""}[${e.type}] ${e.name}: ${e.description}`;
659
+ }
660
+ const fmt = (e, location) => `- ${e.pinned ? "[pinned] " : ""}[scope="${e.scope}" location="${location}" type="${e.type}"] ${e.name}: ${e.description}`;
661
+ const readableLocations = profile ? "global, profile, or project" : "global or project";
654
662
  const lines = [];
655
663
  if (globalEntries.length > 0) {
656
664
  lines.push("## Global memories (apply across all projects)");
657
665
  for (const e of globalEntries)
658
- lines.push(fmt(e));
666
+ lines.push(fmt(e, "global"));
667
+ }
668
+ if (profileEntries.length > 0) {
669
+ if (lines.length > 0)
670
+ lines.push("");
671
+ lines.push("## Digital-human memories (travel with the active profile)");
672
+ for (const e of profileEntries)
673
+ lines.push(fmt(e, "profile"));
659
674
  }
660
675
  if (projectEntries.length > 0) {
661
676
  if (lines.length > 0)
662
677
  lines.push("");
663
678
  lines.push("## Project memories (this repo)");
664
679
  for (const e of projectEntries)
665
- lines.push(fmt(e));
680
+ lines.push(fmt(e, "project"));
666
681
  }
667
682
  return (`# Persistent Memory (index)\n\n` +
668
683
  `These are summaries of memories from previous sessions. Only the summary is shown here.\n` +
669
684
  `When a memory looks relevant to the current task, read its full content with the ` +
670
- `MemoryRead tool (scope = user or dream; location = global or project) before relying on it.\n\n` +
685
+ `MemoryRead tool before relying on it. Every entry includes its exact scope and location; ` +
686
+ `copy both values exactly and never infer them from the memory name or type. ` +
687
+ `Readable locations for this run: ${readableLocations}.\n` +
688
+ `If MemoryRead reports that an entry is missing, do not repeat the same call. ` +
689
+ `Use MemoryList once to refresh that exact store, or continue without the memory.\n\n` +
671
690
  lines.join("\n"));
672
691
  }
673
692
  /**
@@ -750,13 +769,52 @@ export class MemoryManager {
750
769
  this.indexCache = cache;
751
770
  return cache;
752
771
  }
753
- writeIndex(cache) {
754
- const lines = [];
755
- for (const [fileName, meta] of cache) {
756
- lines.push(`- [${meta.name}](${fileName}) — ${meta.description}`);
772
+ /**
773
+ * Rewrite MEMORY.md from the CURRENT set of memory files on disk, under a
774
+ * cross-process lock.
775
+ *
776
+ * The in-memory `indexCache` is a per-instance optimisation, and several
777
+ * managers exist for the same directory (desktop main, agent worker, TUI, a
778
+ * second desktop instance). Writing the cache out verbatim meant a stale
779
+ * snapshot clobbered whatever another writer had added:
780
+ *
781
+ * A saves a → B loads {a}, saves b → A still holds {a}, saves c
782
+ * → files a, b, c all exist, but MEMORY.md lists only a and c.
783
+ *
784
+ * The individual `<name>.md` files are the source of truth; MEMORY.md is a
785
+ * derived index. So rather than trusting any cache, re-derive it from disk
786
+ * inside the lock. `pending` carries this writer's own change, which may not
787
+ * be visible on disk yet (a delete moves the file to trash first, a save
788
+ * writes it first) — it is applied on top of the freshly scanned set.
789
+ */
790
+ writeIndex(cache, pending) {
791
+ const release = acquireFileLock(this.indexPath);
792
+ try {
793
+ // Re-scan under the lock: picks up entries written by other processes
794
+ // since this instance's cache was built.
795
+ const merged = new Map();
796
+ for (const entry of this.loadAll()) {
797
+ merged.set(entry.fileName, { name: entry.name, description: entry.description });
798
+ }
799
+ if (pending?.kind === "save")
800
+ merged.set(pending.fileName, pending.meta);
801
+ if (pending?.kind === "delete")
802
+ merged.delete(pending.fileName);
803
+ // Keep this instance's cache consistent with what we are about to write,
804
+ // so the next incremental update starts from the merged truth.
805
+ cache.clear();
806
+ for (const [fileName, meta] of merged)
807
+ cache.set(fileName, meta);
808
+ const lines = [];
809
+ for (const [fileName, meta] of merged) {
810
+ lines.push(`- [${meta.name}](${fileName}) — ${meta.description}`);
811
+ }
812
+ const content = lines.length > 0 ? lines.join("\n") + "\n" : "(no memories stored)\n";
813
+ writeFileAtomic(this.indexPath, content);
814
+ }
815
+ finally {
816
+ release();
757
817
  }
758
- const content = lines.length > 0 ? lines.join("\n") + "\n" : "(no memories stored)\n";
759
- writeFileSync(this.indexPath, content, "utf-8");
760
818
  }
761
819
  generateId() {
762
820
  return `mem_${randomUUID().replace(/-/g, "")}`;
@@ -1,8 +1,13 @@
1
1
  /**
2
2
  * Session lifecycle manager.
3
3
  */
4
- import type { SessionForkLineage, SessionState, SessionWorkspace, TranscriptEvent } from "../types.js";
4
+ import type { SessionForkLineage, SessionState, SessionKind, SessionWorkspace, TokenUsage, TranscriptEvent } from "../types.js";
5
5
  import { Transcript } from "./transcript.js";
6
+ import { type GoalConfig, type PersistedGoalTerminationReason } from "../goal/lifecycle.js";
7
+ import { type SessionWorkspaceCapability } from "../capabilities/index.js";
8
+ /** Non-Goal fields accepted by the generic latest-state merge path. */
9
+ export type SessionStateFieldPatch = Readonly<Partial<Omit<SessionState, "sessionId" | "goalLifecycle" | "activeGoal" | "goalTerminal" | "goalTerminals">>>;
10
+ export type GoalTerminalSaveOutcome = "persisted" | "obsolete" | "failed";
6
11
  export interface SessionBundle {
7
12
  state: SessionState;
8
13
  transcript: Transcript;
@@ -11,12 +16,24 @@ export interface ForkSessionOptions {
11
16
  targetSessionId?: string;
12
17
  /** Inclusive source event cursor; omitted means the frozen transcript tail. */
13
18
  throughEventId?: string;
19
+ /** `completed` is the interrupted snapshot used by ephemeral side chats. */
20
+ snapshotMode?: "tail" | "completed";
21
+ /** Hide this temporary fork from ordinary session lists and resume pickers. */
22
+ ephemeral?: boolean;
14
23
  }
15
24
  export interface ForkSessionResult {
16
25
  bundle: SessionBundle;
17
26
  lineage: SessionForkLineage;
18
27
  copiedEventCount: number;
19
28
  }
29
+ export interface SummaryForkOptions {
30
+ targetSessionId?: string;
31
+ fromEventId: string;
32
+ toEventId: string;
33
+ summary: string;
34
+ sourceEventCount: number;
35
+ estimatedTokens: number;
36
+ }
20
37
  export type SessionWorkspaceResumeResolution = {
21
38
  ok: true;
22
39
  cwd: string;
@@ -28,7 +45,7 @@ export type SessionWorkspaceResumeResolution = {
28
45
  cwd: string;
29
46
  workspace: SessionWorkspace;
30
47
  message: string;
31
- reason: "worktree_missing_branch_exists";
48
+ reason: "worktree_missing_branch_exists" | "workspace_capability_unavailable";
32
49
  };
33
50
  /**
34
51
  * Validate a session ID before it is joined into a filesystem path.
@@ -44,6 +61,13 @@ export type SessionWorkspaceResumeResolution = {
44
61
  * Exported for direct unit testing.
45
62
  */
46
63
  export declare function assertSafeSessionId(sessionId: unknown): asserts sessionId is string;
64
+ /**
65
+ * Runtime source of truth for sessions whose state must not outlive their UI
66
+ * lifecycle. The explicit marker covers modern side forks; the qchat namespace
67
+ * keeps historical/blank quick chats fail-closed if their older state file did
68
+ * not contain the marker yet.
69
+ */
70
+ export declare function isEphemeralSessionState(state: Pick<SessionState, "sessionId" | "ephemeral">): boolean;
47
71
  /**
48
72
  * Resolve the `.code-shell` home dir. `CODE_SHELL_HOME` overrides the default
49
73
  * `~/.code-shell` — mirrors Codex's `CODEX_HOME`. Tests set it to a temp dir
@@ -52,10 +76,24 @@ export declare function assertSafeSessionId(sessionId: unknown): asserts session
52
76
  * with throwaway test sessions (the rm-usage/test-model sidebar junk).
53
77
  */
54
78
  export declare function codeShellHome(): string;
79
+ /**
80
+ * Canonical root for every persisted CodeShell session. An explicit `home`
81
+ * (a `~/.code-shell`-equivalent data root) overrides the default resolution;
82
+ * absent → `codeShellHome()` exactly as before.
83
+ */
84
+ export declare function sessionsRoot(home?: string): string;
85
+ /**
86
+ * Read the session's persisted main-project root from the legacy `state.cwd`
87
+ * field. The field name is part of the state.json compatibility contract and
88
+ * must not be rewritten to `projectRoot`; `state.workspace.root` separately
89
+ * identifies the current main/worktree execution root used on resume.
90
+ */
91
+ export declare function sessionMainRoot(state: Pick<SessionState, "cwd">): string | undefined;
55
92
  export declare class SessionManager {
56
93
  private readonly sessionsDir;
57
94
  private readonly registeredCloseEpochs;
58
- constructor(storageDir?: string);
95
+ private readonly workspaceCapability?;
96
+ constructor(storageDir?: string, workspaceCapability?: SessionWorkspaceCapability);
59
97
  private cleanupStaleForkStaging;
60
98
  /** Bind one Engine/session pair to the current close epoch without advancing it. */
61
99
  registerSessionGeneration(sessionId: string): number;
@@ -68,7 +106,7 @@ export declare class SessionManager {
68
106
  * nanoid. Either way the on-disk directory is materialized and the
69
107
  * state.json + transcript.jsonl files are written before return.
70
108
  */
71
- create(cwd: string, model: string, provider: string, explicitSessionId?: string, parentSessionId?: string | null, origin?: import("../types.js").SessionOrigin): SessionBundle;
109
+ create(cwd: string, model: string, provider: string, explicitSessionId?: string, parentSessionId?: string | null, origin?: import("../types.js").SessionOrigin, kind?: SessionKind): SessionBundle;
72
110
  /**
73
111
  * Whether a session directory exists on disk. Used by ChatSession-driven
74
112
  * cold starts to decide between resume vs create-with-explicit-sid
@@ -76,16 +114,36 @@ export declare class SessionManager {
76
114
  */
77
115
  exists(sessionId: string): boolean;
78
116
  /**
79
- * Cheap "what cwd is this session bound to?" probe — reads only state.json,
80
- * NOT the transcript (unlike resume()). engine.run uses this to recover a
81
- * resumed session's project directory when the caller omits options.cwd
82
- * (e.g. a desktop host whose sidebar repo selection has drifted to null),
83
- * so a project-bound session keeps loading its own agents/settings/memory
84
- * instead of falling back to process.cwd(). Returns undefined for an
85
- * unknown, malformed, or traversal-shaped id rather than throwing — the
86
- * caller treats "no recoverable cwd" the same as "not given".
117
+ * Cheap persisted-main-root probe — reads only state.json, NOT the transcript
118
+ * (unlike resume()). This deliberately reads legacy `state.cwd`, not the
119
+ * current `state.workspace.root`; callers use it as the stable main-project
120
+ * fallback when a worktree is unavailable or is being released.
87
121
  */
122
+ readSessionMainRoot(sessionId: string): string | undefined;
123
+ /** Cheap durable classification read. Legacy sessions are ordinary work sessions. */
124
+ readSessionKind(sessionId: string): SessionKind | undefined;
125
+ /** Cheap durable digital-human binding read. */
126
+ readSessionWorkspaceProfile(sessionId: string): string | undefined;
127
+ /**
128
+ * Find durable Sessions currently bound to one digital-human profile without loading
129
+ * transcripts. Used by profile deletion guards so a reusable/historical
130
+ * Session cannot be left permanently unresumable.
131
+ */
132
+ /**
133
+ * Sessions whose state pins this digital human.
134
+ *
135
+ * `includeArchived: false` drops archived Sessions: they are closed history,
136
+ * not a live binding, so they should not block deleting the profile. A
137
+ * dangling name is already handled downstream — resolveActiveWorkspaceProfile
138
+ * logs `profile.active_missing_from_library` and returns undefined.
139
+ */
140
+ findSessionIdsByWorkspaceProfile(profileName: string, limit?: number, options?: {
141
+ includeArchived?: boolean;
142
+ }): string[];
143
+ /** @deprecated Use readSessionMainRoot; retained for public API compatibility. */
88
144
  readCwd(sessionId: string): string | undefined;
145
+ /** Disk-only direct-parent ACL metadata. Undefined means unprovable/corrupt. */
146
+ readParentSessionId(sessionId: string): string | null | undefined;
89
147
  /**
90
148
  * Disk-only workspace pointer reader. Legacy sessions written before
91
149
  * `workspace` existed are treated as main-workspace sessions rooted at
@@ -97,7 +155,11 @@ export declare class SessionManager {
97
155
  * `cwd`. P1 will teach ToolContext to resolve cwd from this field; for P0 it
98
156
  * is a safety pointer and resume breadcrumb.
99
157
  */
100
- setSessionWorkspace(sessionId: string, workspace: SessionWorkspace): void;
158
+ setSessionWorkspace(sessionId: string, workspace: SessionWorkspace): number;
159
+ /** Read the durable archival timestamp; undefined = not archived / unprovable. */
160
+ readSessionArchivedAt(sessionId: string): number | undefined;
161
+ /** Set (number) or clear (undefined) the durable archival marker. */
162
+ setSessionArchived(sessionId: string, archivedAt: number | undefined): number;
101
163
  recordWorkspaceHandoff(sessionId: string, from: SessionWorkspace | undefined, to: SessionWorkspace): void;
102
164
  /**
103
165
  * Resolve the cwd a resumed session must run in from its persisted workspace
@@ -109,8 +171,8 @@ export declare class SessionManager {
109
171
  resolveSessionWorkspaceForResume(sessionId: string): Promise<SessionWorkspaceResumeResolution>;
110
172
  /**
111
173
  * Cheap "does this session have a persisted goal?" probe — reads only
112
- * state.json, NOT the transcript (like readCwd). A persistent goal lives ONLY
113
- * in state.activeGoal; it is never appended to the transcript as an event, so
174
+ * state.json, NOT the transcript (like readSessionMainRoot). A persistent goal lives in
175
+ * the canonical goalLifecycle union; it is never appended to the transcript as an event, so
114
176
  * a session rebuilt from disk (e.g. localStorage wiped) can't recover the
115
177
  * goal from its messages. The desktop host calls this on session load to
116
178
  * re-surface the active-goal block + its Cancel button, which would otherwise
@@ -118,11 +180,12 @@ export declare class SessionManager {
118
180
  * run. Returns undefined for an unknown / malformed / traversal-shaped id, or
119
181
  * a session with no active goal — never throws.
120
182
  */
121
- readActiveGoal(sessionId: string): import("../engine/goal.js").GoalConfig | undefined;
183
+ readActiveGoal(sessionId: string): import("../goal/lifecycle.js").GoalConfig | undefined;
122
184
  /**
123
185
  * Disk-only "wipe this session's persistent goal" — the counterpart to
124
- * readActiveGoal. Reads state.json, removes state.activeGoal, and rewrites it
125
- * atomically (via saveState). Returns true only if a goal was actually
186
+ * readActiveGoal. Reads state.json, transitions the matching goalLifecycle
187
+ * to terminal(user_cleared), and rewrites it through the field-level CAS.
188
+ * Returns true only if a goal was actually
126
189
  * present (idempotent — clearing a session with no goal is a no-op returning
127
190
  * false). Never throws on an unknown / malformed / traversal-shaped id
128
191
  * (returns false), matching readActiveGoal's tolerance.
@@ -135,27 +198,118 @@ export declare class SessionManager {
135
198
  * Engine.clearGoal also delegates its disk write here so the wipe logic lives
136
199
  * in exactly one place.
137
200
  */
138
- clearActiveGoal(sessionId: string): boolean;
201
+ clearActiveGoal(sessionId: string, expected?: {
202
+ goalId?: string;
203
+ revision?: number;
204
+ }): boolean;
205
+ /**
206
+ * Edit or pause/resume the currently active goal with an identity-checked,
207
+ * field-level CAS. The goalId is preserved: editing the objective changes
208
+ * the same user-owned goal rather than terminally cancelling it and arming a
209
+ * replacement. A changed objective receives a fresh deadline anchor.
210
+ *
211
+ * Returns undefined when the session/goal is absent or the patch is invalid.
212
+ * The returned state lets a live Engine rebase its in-memory bundle after
213
+ * this control operation.
214
+ */
215
+ updateActiveGoal(sessionId: string, patch: {
216
+ objective?: string;
217
+ paused?: boolean;
218
+ expectedGoalId?: string;
219
+ expectedRevision?: number;
220
+ }): {
221
+ goal: GoalConfig;
222
+ stateRevision: number;
223
+ state: SessionState;
224
+ } | undefined;
139
225
  resume(sessionId: string): SessionBundle;
226
+ /**
227
+ * Return the exact persistence directory owned by this manager.
228
+ *
229
+ * Cross-session sidecars (for example versioned handoffs) use this to stay
230
+ * inside an identity/custom-data-root boundary instead of falling back to
231
+ * the process-global default sessions directory.
232
+ */
233
+ getStorageDir(): string;
234
+ /**
235
+ * Read one durable session state without changing its lifecycle status.
236
+ * `resume()` intentionally marks the returned in-memory state active; host
237
+ * coordination code needs a read-only snapshot for completed cursors and
238
+ * workspace/profile metadata.
239
+ */
240
+ readSessionState(sessionId: string): SessionState | undefined;
140
241
  /**
141
242
  * Merge a field-level state update into the latest persisted snapshot.
142
243
  *
143
244
  * Unlike saveState(), callers do not supply a potentially stale whole-state
144
- * object. The read, shallow merge, and atomic write are synchronous, so no
145
- * other callback on this process's event loop can interleave between them.
146
- * This is deliberately not a session-level lock. Engine.run rejects re-entry
147
- * on one Engine (G6), and the generation check in saveState rejects an older
148
- * registered Engine in this process. Workers and separate processes remain
149
- * an unresolved finding requiring locking/CAS.
150
- */
151
- updateSessionState(sessionId: string, partial: Readonly<Partial<Omit<SessionState, "sessionId">>>): void;
245
+ * object. saveState serializes the read/revision-check/write section with the
246
+ * per-session lock and returns the new persisted revision to the caller.
247
+ */
248
+ updateSessionState(sessionId: string, partial: SessionStateFieldPatch): number;
249
+ /**
250
+ * Atomically add one billed auxiliary request to the latest source state.
251
+ * This field-level read/add/write avoids publishing a detached stale state
252
+ * snapshot and accounts prompt, completion, total, cache, and cost together.
253
+ */
254
+ recordAuxiliaryUsage(sessionId: string, usage: TokenUsage, costState?: Record<string, unknown>): void;
255
+ /** @deprecated Compatibility fixture writer; runtime code must use domain updates. */
152
256
  saveState(state: SessionState, generation?: number): boolean;
257
+ /**
258
+ * Persist one goal terminal transition without allowing a revision race to
259
+ * resurrect that goal. This is always a Goal-domain update: read the newest
260
+ * snapshot, transition only the matching lifecycle identity, then commit. A detached run
261
+ * snapshot is never used as the write candidate,
262
+ * so a successful terminal transition cannot publish stale summary/workspace
263
+ * or accounting fields. Lock/generation conflicts remain distinct failures.
264
+ */
265
+ saveGoalTerminal(state: SessionState, goal: GoalConfig | undefined, reason: PersistedGoalTerminationReason): boolean;
266
+ /**
267
+ * Persist a terminal transition and distinguish a durable commit from a stale
268
+ * run whose Goal identity has already been replaced. Callers may publish a
269
+ * terminal event only for `persisted`.
270
+ */
271
+ saveGoalTerminalOutcome(state: SessionState, goal: GoalConfig | undefined, reason: PersistedGoalTerminationReason): GoalTerminalSaveOutcome;
272
+ /**
273
+ * Arm or migrate one active goal as a Goal-domain update. The newest state is
274
+ * always the write base, so unrelated fields written by another host survive.
275
+ * Replacement is explicit and terminally closes the latest active identity;
276
+ * a non-replacement write may only normalize the same legacy/current goal.
277
+ */
278
+ saveActiveGoal(state: SessionState, goal: GoalConfig, options?: {
279
+ replaceCurrent?: boolean;
280
+ }): boolean;
281
+ /** Persist active → waiting only for the expected concrete Goal version. */
282
+ markGoalWaiting(state: SessionState, goal: GoalConfig): boolean;
283
+ /** Drop a matching active goal only when its terminal identity is durable. */
284
+ clearTerminatedActiveGoal(state: SessionState, goal: GoalConfig): boolean;
285
+ /**
286
+ * Commit only the fields owned by a live run. The detached `state` object is
287
+ * used solely as a live-view target for the returned revision; it is never
288
+ * serialized wholesale. This prevents a Goal/workspace/title domain write
289
+ * from authorizing a later stale metadata overwrite.
290
+ */
291
+ saveStateOrUpdateFields(state: SessionState, partial: SessionStateFieldPatch): boolean;
292
+ private saveStateAttempt;
293
+ private acquireStateLock;
294
+ /** Recover only the old implementation's regular-file orphan lock. */
295
+ private prepareLegacyStateLock;
296
+ private readPersistedState;
297
+ private rebaseLiveState;
153
298
  private generationKey;
154
299
  /** Create an independent, top-level session from a frozen event cursor. */
155
300
  fork(sourceSessionId: string, options?: ForkSessionOptions): ForkSessionResult;
301
+ /** Freeze and validate an inclusive source range before any model call. */
302
+ selectContextPackage(sourceSessionId: string, range: {
303
+ fromEventId: string;
304
+ toEventId: string;
305
+ }): ReturnType<typeof Transcript.selectContextRange>;
306
+ /** Publish a summary-only top-level fork after summarization has succeeded. */
307
+ createSummaryFork(sourceSessionId: string, options: SummaryForkOptions): ForkSessionResult;
156
308
  private readForkSnapshot;
157
309
  private publishSessionAtomically;
158
- list(limit?: number): SessionListEntry[];
310
+ list(limit?: number, opts?: {
311
+ excludeKinds?: readonly string[];
312
+ }): SessionListEntry[];
159
313
  }
160
314
  export declare function buildForkState(source: SessionState, targetSessionId: string, lineage: SessionForkLineage, startedAt?: number): SessionState;
161
315
  export declare function buildForkTranscript(sourceEvents: readonly TranscriptEvent[], state: SessionState): TranscriptEvent[];