@sayknow-cli/coding-agent 0.3.11 → 0.3.13

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 (1161) hide show
  1. package/CHANGELOG.md +0 -21
  2. package/package.json +116 -117
  3. package/scripts/build-binary.ts +2 -43
  4. package/scripts/compile-args.ts +106 -0
  5. package/scripts/g004-tmux-smoke.ts +196 -36
  6. package/scripts/generate-docs-index.ts +3 -0
  7. package/src/build-metadata.ts +104 -0
  8. package/src/capability/mcp.ts +3 -1
  9. package/src/cli/daemon-cli.ts +19 -29
  10. package/src/cli/malloc-env-guard.test.ts +104 -0
  11. package/src/cli/malloc-env-guard.ts +149 -0
  12. package/src/cli/mcp-cli.ts +108 -26
  13. package/src/cli/notify-cli.ts +78 -14
  14. package/src/cli/session-picker.ts +23 -40
  15. package/src/cli/update-cli.ts +56 -37
  16. package/src/cli.ts +71 -10
  17. package/src/commands/daemon.ts +19 -5
  18. package/src/commands/harness.ts +515 -47
  19. package/src/commands/launch.ts +11 -3
  20. package/src/commands/mcp.ts +8 -8
  21. package/src/commands/notify.ts +5 -1
  22. package/src/commands/session.ts +6 -1
  23. package/src/commands/stats.ts +6 -2
  24. package/src/config/keybindings.ts +7 -2
  25. package/src/config/mcp-schema.json +21 -17
  26. package/src/config/model-profile-activation.ts +1 -1
  27. package/src/config/model-profiles.ts +23 -23
  28. package/src/config/settings-schema.ts +41 -1
  29. package/src/coordinator-mcp/model-preset.ts +100 -0
  30. package/src/coordinator-mcp/server.ts +2735 -435
  31. package/src/daemon/control-types.ts +11 -0
  32. package/src/daemon/operator-contract.ts +121 -0
  33. package/src/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.ts +57 -17
  34. package/src/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.ts +15 -2
  35. package/src/defaults/skc/extensions/grok-cli-vendor/src/provider/register.ts +5 -1
  36. package/src/discovery/builtin.ts +14 -0
  37. package/src/discovery/mcp-json.ts +14 -0
  38. package/src/eval/js/executor.ts +7 -1
  39. package/src/internal-urls/docs-index.generated.ts +10 -9
  40. package/src/internal-urls/local-protocol.ts +29 -10
  41. package/src/internal-urls/skc-protocol.ts +14 -1
  42. package/src/main.ts +298 -75
  43. package/src/modes/acp/acp-agent.ts +800 -114
  44. package/src/modes/acp/acp-client-bridge.ts +27 -5
  45. package/src/modes/acp/acp-event-mapper.ts +39 -1
  46. package/src/modes/acp/acp-mode.ts +29 -2
  47. package/src/modes/components/assistant-message.ts +33 -4
  48. package/src/modes/components/bash-execution.ts +43 -13
  49. package/src/modes/components/custom-editor.ts +5 -0
  50. package/src/modes/components/hook-selector.ts +16 -0
  51. package/src/modes/components/irc-sidebar.ts +206 -0
  52. package/src/modes/components/model-selector.ts +17 -6
  53. package/src/modes/components/pet-selector.ts +55 -0
  54. package/src/modes/components/sayknow-pet-widget.ts +360 -0
  55. package/src/modes/components/session-selector.ts +223 -222
  56. package/src/modes/components/settings-selector.ts +10 -0
  57. package/src/modes/components/status-line/presets.ts +5 -19
  58. package/src/modes/components/status-line/segments.ts +14 -0
  59. package/src/modes/components/status-line/types.ts +6 -0
  60. package/src/modes/components/status-line.ts +13 -6
  61. package/src/modes/components/tool-execution.ts +48 -7
  62. package/src/modes/components/user-message.ts +26 -9
  63. package/src/modes/components/welcome.ts +4 -1
  64. package/src/modes/controllers/command-controller.ts +29 -3
  65. package/src/modes/controllers/event-controller.ts +168 -45
  66. package/src/modes/controllers/extension-ui-controller.ts +36 -17
  67. package/src/modes/controllers/input-controller.ts +16 -4
  68. package/src/modes/controllers/selector-controller.ts +69 -18
  69. package/src/modes/interactive-mode.ts +194 -10
  70. package/src/modes/irc-observation-ledger.ts +127 -0
  71. package/src/modes/rpc/rpc-client.ts +30 -6
  72. package/src/modes/shared/agent-wire/deep-interview-gate.ts +45 -2
  73. package/src/modes/shared/agent-wire/unattended-session.ts +288 -1
  74. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +130 -20
  75. package/src/modes/types.ts +34 -2
  76. package/src/modes/utils/hotkeys-markdown.ts +1 -0
  77. package/src/modes/utils/irc-message.ts +138 -0
  78. package/src/modes/utils/ui-helpers.ts +368 -80
  79. package/src/notifications/config.ts +44 -0
  80. package/src/notifications/daemon-paths.ts +8 -0
  81. package/src/notifications/index.ts +535 -75
  82. package/src/notifications/lifecycle-control-runtime.ts +930 -77
  83. package/src/notifications/notification-service.ts +710 -0
  84. package/src/notifications/rate-limit-pool.ts +46 -12
  85. package/src/notifications/telegram-daemon-control.ts +27 -2
  86. package/src/notifications/telegram-daemon.ts +663 -96
  87. package/src/notifications/telegram-reference.ts +73 -13
  88. package/src/notifications/topic-registry.ts +86 -9
  89. package/src/prompts/system/irc-peer-roster.md +1 -0
  90. package/src/prompts/system/subagent-system-prompt.md +1 -0
  91. package/src/prompts/system/system-prompt.md +1 -0
  92. package/src/prompts/tools/irc.md +1 -1
  93. package/src/prompts/tools/skill.md +2 -2
  94. package/src/registry/agent-registry.ts +3 -0
  95. package/src/runtime-mcp/config-writer.ts +4 -3
  96. package/src/runtime-mcp/config.ts +1 -0
  97. package/src/runtime-mcp/types.ts +4 -3
  98. package/src/sdk.ts +52 -1
  99. package/src/secrets/obfuscator.ts +4 -2
  100. package/src/session/agent-session.ts +513 -148
  101. package/src/session/cache-economics.ts +275 -0
  102. package/src/session/provider-safety-stop.ts +9 -0
  103. package/src/session/session-dump-format.ts +6 -0
  104. package/src/session/session-manager.ts +877 -79
  105. package/src/session/session-storage.ts +582 -38
  106. package/src/skc-runtime/session-state-sidecar.ts +756 -135
  107. package/src/skc-runtime/state-runtime.ts +105 -12
  108. package/src/skc-runtime/tmux-common.ts +26 -7
  109. package/src/skc-runtime/tmux-gc.ts +52 -9
  110. package/src/skc-runtime/tmux-owner-isolation-cli.ts +185 -0
  111. package/src/skc-runtime/tmux-owner-isolation.ts +2060 -0
  112. package/src/skc-runtime/tmux-sessions.ts +871 -68
  113. package/src/skc-runtime/workflow-manifest.generated.json +4 -28
  114. package/src/skc-runtime/workflow-manifest.ts +1 -7
  115. package/src/slash-commands/builtin-registry.ts +152 -13
  116. package/src/task/executor.ts +12 -3
  117. package/src/task/index.ts +8 -0
  118. package/src/task/receipt.ts +7 -2
  119. package/src/task/types.ts +26 -0
  120. package/src/tools/ask-answer-registry.ts +25 -0
  121. package/src/tools/bash-interactive.ts +9 -4
  122. package/src/tools/browser/readable.ts +2 -2
  123. package/src/tools/browser/tab-supervisor.ts +63 -6
  124. package/src/tools/browser.ts +8 -3
  125. package/src/tools/fetch.ts +5 -5
  126. package/src/tools/index.ts +81 -6
  127. package/src/tools/skill.ts +14 -11
  128. package/src/tools/sqlite-reader.ts +8 -4
  129. package/src/tui/output-block.ts +18 -6
  130. package/src/utils/external-editor.ts +6 -1
  131. package/src/utils/linkedom.ts +14 -0
  132. package/src/utils/pasted-image-path.ts +23 -9
  133. package/src/web/scrapers/arxiv.ts +2 -2
  134. package/src/web/scrapers/go-pkg.ts +2 -2
  135. package/src/web/scrapers/iacr.ts +2 -2
  136. package/src/web/scrapers/readthedocs.ts +2 -2
  137. package/src/web/scrapers/twitter.ts +3 -2
  138. package/src/web/scrapers/wikipedia.ts +2 -2
  139. package/dist/types/append-only-mode.d.ts +0 -31
  140. package/dist/types/async/index.d.ts +0 -2
  141. package/dist/types/async/job-manager.d.ts +0 -328
  142. package/dist/types/async/support.d.ts +0 -2
  143. package/dist/types/autoresearch/dashboard.d.ts +0 -4
  144. package/dist/types/autoresearch/git.d.ts +0 -36
  145. package/dist/types/autoresearch/helpers.d.ts +0 -24
  146. package/dist/types/autoresearch/index.d.ts +0 -2
  147. package/dist/types/autoresearch/state.d.ts +0 -17
  148. package/dist/types/autoresearch/storage.d.ts +0 -142
  149. package/dist/types/autoresearch/tools/init-experiment.d.ts +0 -31
  150. package/dist/types/autoresearch/tools/log-experiment.d.ts +0 -23
  151. package/dist/types/autoresearch/tools/run-experiment.d.ts +0 -8
  152. package/dist/types/autoresearch/tools/update-notes.d.ts +0 -12
  153. package/dist/types/autoresearch/types.d.ts +0 -154
  154. package/dist/types/capability/context-file.d.ts +0 -17
  155. package/dist/types/capability/extension-module.d.ts +0 -15
  156. package/dist/types/capability/extension.d.ts +0 -28
  157. package/dist/types/capability/fs.d.ts +0 -20
  158. package/dist/types/capability/hook.d.ts +0 -19
  159. package/dist/types/capability/index.d.ts +0 -80
  160. package/dist/types/capability/instruction.d.ts +0 -17
  161. package/dist/types/capability/mcp.d.ts +0 -47
  162. package/dist/types/capability/prompt.d.ts +0 -15
  163. package/dist/types/capability/rule.d.ts +0 -69
  164. package/dist/types/capability/settings.d.ts +0 -15
  165. package/dist/types/capability/skill.d.ts +0 -36
  166. package/dist/types/capability/slash-command.d.ts +0 -17
  167. package/dist/types/capability/ssh.d.ts +0 -23
  168. package/dist/types/capability/system-prompt.d.ts +0 -15
  169. package/dist/types/capability/tool.d.ts +0 -19
  170. package/dist/types/capability/types.d.ts +0 -154
  171. package/dist/types/cli/agents-cli.d.ts +0 -12
  172. package/dist/types/cli/args.d.ts +0 -57
  173. package/dist/types/cli/auth-broker-cli.d.ts +0 -25
  174. package/dist/types/cli/auth-gateway-cli.d.ts +0 -18
  175. package/dist/types/cli/classify-install-target.d.ts +0 -18
  176. package/dist/types/cli/commands/init-xdg.d.ts +0 -1
  177. package/dist/types/cli/completion-cli.d.ts +0 -41
  178. package/dist/types/cli/config-cli.d.ts +0 -23
  179. package/dist/types/cli/daemon-cli.d.ts +0 -25
  180. package/dist/types/cli/fast-help.d.ts +0 -1
  181. package/dist/types/cli/file-processor.d.ts +0 -11
  182. package/dist/types/cli/fixture-report.d.ts +0 -20
  183. package/dist/types/cli/fixture-report.test.d.ts +0 -1
  184. package/dist/types/cli/grep-cli.d.ts +0 -17
  185. package/dist/types/cli/initial-message.d.ts +0 -17
  186. package/dist/types/cli/list-models.d.ts +0 -36
  187. package/dist/types/cli/local-provider-smoke.d.ts +0 -59
  188. package/dist/types/cli/mcp-cli.d.ts +0 -25
  189. package/dist/types/cli/migrate-cli.d.ts +0 -20
  190. package/dist/types/cli/nofile-limit.d.ts +0 -11
  191. package/dist/types/cli/notify-cli.d.ts +0 -37
  192. package/dist/types/cli/plugin-cli.d.ts +0 -34
  193. package/dist/types/cli/read-cli.d.ts +0 -4
  194. package/dist/types/cli/session-picker.d.ts +0 -3
  195. package/dist/types/cli/setup-cli.d.ts +0 -73
  196. package/dist/types/cli/shell-cli.d.ts +0 -8
  197. package/dist/types/cli/skills-cli.d.ts +0 -9
  198. package/dist/types/cli/ssh-cli.d.ts +0 -21
  199. package/dist/types/cli/stats-cli.d.ts +0 -17
  200. package/dist/types/cli/telegram-cli.d.ts +0 -13
  201. package/dist/types/cli/update-cli.d.ts +0 -89
  202. package/dist/types/cli/web-search-cli.d.ts +0 -32
  203. package/dist/types/cli/worktree-cli.d.ts +0 -26
  204. package/dist/types/cli.d.ts +0 -135
  205. package/dist/types/commands/acp.d.ts +0 -12
  206. package/dist/types/commands/agents.d.ts +0 -34
  207. package/dist/types/commands/auth-broker.d.ts +0 -54
  208. package/dist/types/commands/auth-gateway.d.ts +0 -32
  209. package/dist/types/commands/codex-native-hook.d.ts +0 -6
  210. package/dist/types/commands/commit.d.ts +0 -27
  211. package/dist/types/commands/completion.d.ts +0 -29
  212. package/dist/types/commands/config.d.ts +0 -33
  213. package/dist/types/commands/contribution-prep.d.ts +0 -18
  214. package/dist/types/commands/coordinator.d.ts +0 -19
  215. package/dist/types/commands/daemon.d.ts +0 -41
  216. package/dist/types/commands/deep-interview.d.ts +0 -54
  217. package/dist/types/commands/gc.d.ts +0 -26
  218. package/dist/types/commands/grep.d.ts +0 -42
  219. package/dist/types/commands/harness.d.ts +0 -43
  220. package/dist/types/commands/launch.d.ts +0 -130
  221. package/dist/types/commands/local-provider.d.ts +0 -34
  222. package/dist/types/commands/mcp-serve.d.ts +0 -24
  223. package/dist/types/commands/mcp.d.ts +0 -70
  224. package/dist/types/commands/migrate.d.ts +0 -33
  225. package/dist/types/commands/notify.d.ts +0 -41
  226. package/dist/types/commands/plugin.d.ts +0 -58
  227. package/dist/types/commands/ralplan.d.ts +0 -7
  228. package/dist/types/commands/read.d.ts +0 -15
  229. package/dist/types/commands/rlm.d.ts +0 -10
  230. package/dist/types/commands/session.d.ts +0 -30
  231. package/dist/types/commands/setup.d.ts +0 -105
  232. package/dist/types/commands/shell.d.ts +0 -21
  233. package/dist/types/commands/skills.d.ts +0 -26
  234. package/dist/types/commands/ssh.d.ts +0 -48
  235. package/dist/types/commands/state.d.ts +0 -7
  236. package/dist/types/commands/stats.d.ts +0 -25
  237. package/dist/types/commands/team.d.ts +0 -24
  238. package/dist/types/commands/telegram.d.ts +0 -22
  239. package/dist/types/commands/ultragoal.d.ts +0 -8
  240. package/dist/types/commands/update.d.ts +0 -20
  241. package/dist/types/commands/web-search.d.ts +0 -87
  242. package/dist/types/commands/worktree.d.ts +0 -34
  243. package/dist/types/commit/agentic/agent.d.ts +0 -31
  244. package/dist/types/commit/agentic/fallback.d.ts +0 -5
  245. package/dist/types/commit/agentic/index.d.ts +0 -2
  246. package/dist/types/commit/agentic/state.d.ts +0 -58
  247. package/dist/types/commit/agentic/tools/analyze-file.d.ts +0 -19
  248. package/dist/types/commit/agentic/tools/git-file-diff.d.ts +0 -10
  249. package/dist/types/commit/agentic/tools/git-hunk.d.ts +0 -9
  250. package/dist/types/commit/agentic/tools/git-overview.d.ts +0 -9
  251. package/dist/types/commit/agentic/tools/index.d.ts +0 -16
  252. package/dist/types/commit/agentic/tools/propose-changelog.d.ts +0 -28
  253. package/dist/types/commit/agentic/tools/propose-commit.d.ts +0 -36
  254. package/dist/types/commit/agentic/tools/recent-commits.d.ts +0 -7
  255. package/dist/types/commit/agentic/tools/schemas.d.ts +0 -27
  256. package/dist/types/commit/agentic/tools/split-commit.d.ts +0 -53
  257. package/dist/types/commit/agentic/topo-sort.d.ts +0 -4
  258. package/dist/types/commit/agentic/trivial.d.ts +0 -7
  259. package/dist/types/commit/agentic/validation.d.ts +0 -20
  260. package/dist/types/commit/analysis/conventional.d.ts +0 -22
  261. package/dist/types/commit/analysis/index.d.ts +0 -4
  262. package/dist/types/commit/analysis/scope.d.ts +0 -6
  263. package/dist/types/commit/analysis/summary.d.ts +0 -19
  264. package/dist/types/commit/analysis/validation.d.ts +0 -8
  265. package/dist/types/commit/changelog/detect.d.ts +0 -2
  266. package/dist/types/commit/changelog/generate.d.ts +0 -30
  267. package/dist/types/commit/changelog/index.d.ts +0 -30
  268. package/dist/types/commit/changelog/parse.d.ts +0 -2
  269. package/dist/types/commit/cli.d.ts +0 -3
  270. package/dist/types/commit/git/diff.d.ts +0 -5
  271. package/dist/types/commit/index.d.ts +0 -4
  272. package/dist/types/commit/map-reduce/index.d.ts +0 -28
  273. package/dist/types/commit/map-reduce/map-phase.d.ts +0 -17
  274. package/dist/types/commit/map-reduce/reduce-phase.d.ts +0 -13
  275. package/dist/types/commit/map-reduce/utils.d.ts +0 -2
  276. package/dist/types/commit/message.d.ts +0 -2
  277. package/dist/types/commit/model-selection.d.ts +0 -15
  278. package/dist/types/commit/pipeline.d.ts +0 -5
  279. package/dist/types/commit/shared-llm.d.ts +0 -54
  280. package/dist/types/commit/types.d.ts +0 -78
  281. package/dist/types/commit/utils/exclusions.d.ts +0 -4
  282. package/dist/types/commit/utils.d.ts +0 -20
  283. package/dist/types/config/config-file.d.ts +0 -58
  284. package/dist/types/config/file-lock-gc.d.ts +0 -5
  285. package/dist/types/config/file-lock.d.ts +0 -36
  286. package/dist/types/config/keybindings.d.ts +0 -359
  287. package/dist/types/config/model-equivalence.d.ts +0 -24
  288. package/dist/types/config/model-profile-activation.d.ts +0 -64
  289. package/dist/types/config/model-profiles.d.ts +0 -39
  290. package/dist/types/config/model-registry.d.ts +0 -473
  291. package/dist/types/config/model-resolver.d.ts +0 -217
  292. package/dist/types/config/models-config-schema.d.ts +0 -700
  293. package/dist/types/config/prompt-templates.d.ts +0 -32
  294. package/dist/types/config/resolve-config-value.d.ts +0 -17
  295. package/dist/types/config/settings-schema.d.ts +0 -4183
  296. package/dist/types/config/settings.d.ts +0 -156
  297. package/dist/types/config/skill-settings-defaults.d.ts +0 -14
  298. package/dist/types/config/telegram-autostart.d.ts +0 -14
  299. package/dist/types/config/telegram-env-bridge.d.ts +0 -18
  300. package/dist/types/config.d.ts +0 -66
  301. package/dist/types/coordinator/contract.d.ts +0 -4
  302. package/dist/types/coordinator-mcp/policy.d.ts +0 -24
  303. package/dist/types/coordinator-mcp/safety.d.ts +0 -26
  304. package/dist/types/coordinator-mcp/server.d.ts +0 -66
  305. package/dist/types/cursor.d.ts +0 -24
  306. package/dist/types/daemon/builtin.d.ts +0 -20
  307. package/dist/types/daemon/control-types.d.ts +0 -57
  308. package/dist/types/daemon/runtime.d.ts +0 -25
  309. package/dist/types/dap/client.d.ts +0 -39
  310. package/dist/types/dap/config.d.ts +0 -6
  311. package/dist/types/dap/index.d.ts +0 -4
  312. package/dist/types/dap/session.d.ts +0 -108
  313. package/dist/types/dap/types.d.ts +0 -524
  314. package/dist/types/debug/crash-diagnostics.d.ts +0 -45
  315. package/dist/types/debug/index.d.ts +0 -15
  316. package/dist/types/debug/log-formatting.d.ts +0 -4
  317. package/dist/types/debug/log-viewer.d.ts +0 -68
  318. package/dist/types/debug/profiler.d.ts +0 -24
  319. package/dist/types/debug/raw-sse-buffer.d.ts +0 -44
  320. package/dist/types/debug/raw-sse.d.ts +0 -16
  321. package/dist/types/debug/report-bundle.d.ts +0 -55
  322. package/dist/types/debug/runtime-gauges.d.ts +0 -6
  323. package/dist/types/debug/system-info.d.ts +0 -26
  324. package/dist/types/deep-interview/plaintext-gate-guard.d.ts +0 -11
  325. package/dist/types/deep-interview/render-middleware.d.ts +0 -6
  326. package/dist/types/defaults/skc/extensions/grok-build/index.d.ts +0 -1
  327. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/index.d.ts +0 -1
  328. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.d.ts +0 -25
  329. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.d.ts +0 -27
  330. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/billing.d.ts +0 -8
  331. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/register.d.ts +0 -5
  332. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/stream.d.ts +0 -10
  333. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/usage.d.ts +0 -2
  334. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/base-url.d.ts +0 -2
  335. package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/errors.d.ts +0 -38
  336. package/dist/types/defaults/skc-defaults.d.ts +0 -64
  337. package/dist/types/defaults/skc-grok-cli.d.ts +0 -5
  338. package/dist/types/discovery/agents-md.d.ts +0 -1
  339. package/dist/types/discovery/agents.d.ts +0 -12
  340. package/dist/types/discovery/builtin.d.ts +0 -1
  341. package/dist/types/discovery/claude-plugins.d.ts +0 -1
  342. package/dist/types/discovery/claude.d.ts +0 -1
  343. package/dist/types/discovery/cline.d.ts +0 -1
  344. package/dist/types/discovery/codex.d.ts +0 -1
  345. package/dist/types/discovery/cursor.d.ts +0 -19
  346. package/dist/types/discovery/gemini.d.ts +0 -1
  347. package/dist/types/discovery/github.d.ts +0 -1
  348. package/dist/types/discovery/helpers.d.ts +0 -271
  349. package/dist/types/discovery/index.d.ts +0 -48
  350. package/dist/types/discovery/mcp-json.d.ts +0 -1
  351. package/dist/types/discovery/opencode.d.ts +0 -1
  352. package/dist/types/discovery/plugin-dir-roots.d.ts +0 -15
  353. package/dist/types/discovery/ssh.d.ts +0 -1
  354. package/dist/types/discovery/substitute-plugin-root.d.ts +0 -5
  355. package/dist/types/discovery/vscode.d.ts +0 -1
  356. package/dist/types/discovery/windsurf.d.ts +0 -15
  357. package/dist/types/edit/apply-patch/index.d.ts +0 -35
  358. package/dist/types/edit/apply-patch/parser.d.ts +0 -34
  359. package/dist/types/edit/diff.d.ts +0 -75
  360. package/dist/types/edit/file-read-cache.d.ts +0 -25
  361. package/dist/types/edit/index.d.ts +0 -58
  362. package/dist/types/edit/modes/apply-patch.d.ts +0 -24
  363. package/dist/types/edit/modes/patch.d.ts +0 -99
  364. package/dist/types/edit/modes/replace.d.ts +0 -149
  365. package/dist/types/edit/normalize.d.ts +0 -43
  366. package/dist/types/edit/notebook.d.ts +0 -26
  367. package/dist/types/edit/read-file.d.ts +0 -8
  368. package/dist/types/edit/renderer.d.ts +0 -110
  369. package/dist/types/edit/streaming.d.ts +0 -66
  370. package/dist/types/eval/backend.d.ts +0 -40
  371. package/dist/types/eval/index.d.ts +0 -4
  372. package/dist/types/eval/js/context-manager.d.ts +0 -27
  373. package/dist/types/eval/js/executor.d.ts +0 -29
  374. package/dist/types/eval/js/index.d.ts +0 -10
  375. package/dist/types/eval/js/shared/helpers.d.ts +0 -38
  376. package/dist/types/eval/js/shared/indirect-eval.d.ts +0 -14
  377. package/dist/types/eval/js/shared/prelude.d.ts +0 -1
  378. package/dist/types/eval/js/shared/rewrite-imports.d.ts +0 -6
  379. package/dist/types/eval/js/shared/runtime.d.ts +0 -47
  380. package/dist/types/eval/js/shared/types.d.ts +0 -24
  381. package/dist/types/eval/js/tool-bridge.d.ts +0 -18
  382. package/dist/types/eval/js/worker-core.d.ts +0 -5
  383. package/dist/types/eval/js/worker-entry.d.ts +0 -1
  384. package/dist/types/eval/js/worker-protocol.d.ts +0 -77
  385. package/dist/types/eval/py/display.d.ts +0 -25
  386. package/dist/types/eval/py/executor.d.ts +0 -88
  387. package/dist/types/eval/py/index.d.ts +0 -10
  388. package/dist/types/eval/py/kernel.d.ts +0 -65
  389. package/dist/types/eval/py/prelude.d.ts +0 -1
  390. package/dist/types/eval/py/runtime.d.ts +0 -29
  391. package/dist/types/eval/py/tool-bridge.d.ts +0 -20
  392. package/dist/types/eval/types.d.ts +0 -52
  393. package/dist/types/exa/factory.d.ts +0 -13
  394. package/dist/types/exa/index.d.ts +0 -20
  395. package/dist/types/exa/mcp-client.d.ts +0 -45
  396. package/dist/types/exa/render.d.ts +0 -19
  397. package/dist/types/exa/researcher.d.ts +0 -9
  398. package/dist/types/exa/search.d.ts +0 -9
  399. package/dist/types/exa/types.d.ts +0 -155
  400. package/dist/types/exa/websets.d.ts +0 -9
  401. package/dist/types/exec/bash-executor.d.ts +0 -64
  402. package/dist/types/exec/exec.d.ts +0 -25
  403. package/dist/types/exec/idle-timeout-watchdog.d.ts +0 -18
  404. package/dist/types/exec/non-interactive-env.d.ts +0 -1
  405. package/dist/types/export/custom-share.d.ts +0 -20
  406. package/dist/types/export/html/index.d.ts +0 -10
  407. package/dist/types/export/html/template.generated.d.ts +0 -1
  408. package/dist/types/export/html/template.macro.d.ts +0 -5
  409. package/dist/types/export/ttsr.d.ts +0 -55
  410. package/dist/types/extensibility/custom-commands/bundled/ci-green/index.d.ts +0 -9
  411. package/dist/types/extensibility/custom-commands/index.d.ts +0 -2
  412. package/dist/types/extensibility/custom-commands/loader.d.ts +0 -29
  413. package/dist/types/extensibility/custom-commands/types.d.ts +0 -106
  414. package/dist/types/extensibility/custom-tools/index.d.ts +0 -6
  415. package/dist/types/extensibility/custom-tools/loader.d.ts +0 -69
  416. package/dist/types/extensibility/custom-tools/types.d.ts +0 -229
  417. package/dist/types/extensibility/custom-tools/wrapper.d.ts +0 -24
  418. package/dist/types/extensibility/extensions/compact-handler.d.ts +0 -26
  419. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +0 -29
  420. package/dist/types/extensibility/extensions/index.d.ts +0 -9
  421. package/dist/types/extensibility/extensions/loader.d.ts +0 -43
  422. package/dist/types/extensibility/extensions/prefix-command-bridge.d.ts +0 -35
  423. package/dist/types/extensibility/extensions/runner.d.ts +0 -135
  424. package/dist/types/extensibility/extensions/types.d.ts +0 -918
  425. package/dist/types/extensibility/extensions/wrapper.d.ts +0 -55
  426. package/dist/types/extensibility/hooks/index.d.ts +0 -5
  427. package/dist/types/extensibility/hooks/loader.d.ts +0 -89
  428. package/dist/types/extensibility/hooks/runner.d.ts +0 -126
  429. package/dist/types/extensibility/hooks/tool-wrapper.d.ts +0 -25
  430. package/dist/types/extensibility/hooks/types.d.ts +0 -431
  431. package/dist/types/extensibility/plugins/doctor.d.ts +0 -3
  432. package/dist/types/extensibility/plugins/git-url.d.ts +0 -34
  433. package/dist/types/extensibility/plugins/index.d.ts +0 -8
  434. package/dist/types/extensibility/plugins/installer.d.ts +0 -5
  435. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +0 -2
  436. package/dist/types/extensibility/plugins/loader.d.ts +0 -31
  437. package/dist/types/extensibility/plugins/manager.d.ts +0 -65
  438. package/dist/types/extensibility/plugins/marketplace/cache.d.ts +0 -41
  439. package/dist/types/extensibility/plugins/marketplace/fetcher.d.ts +0 -48
  440. package/dist/types/extensibility/plugins/marketplace/index.d.ts +0 -6
  441. package/dist/types/extensibility/plugins/marketplace/manager.d.ts +0 -57
  442. package/dist/types/extensibility/plugins/marketplace/registry.d.ts +0 -34
  443. package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +0 -28
  444. package/dist/types/extensibility/plugins/marketplace/types.d.ts +0 -130
  445. package/dist/types/extensibility/plugins/parser.d.ts +0 -52
  446. package/dist/types/extensibility/plugins/security-scanner.d.ts +0 -31
  447. package/dist/types/extensibility/plugins/types.d.ts +0 -149
  448. package/dist/types/extensibility/runtime-skill-discovery.d.ts +0 -20
  449. package/dist/types/extensibility/shared-events.d.ts +0 -281
  450. package/dist/types/extensibility/skc-plugins/activation.d.ts +0 -14
  451. package/dist/types/extensibility/skc-plugins/compiler.d.ts +0 -19
  452. package/dist/types/extensibility/skc-plugins/constrained-hooks.d.ts +0 -29
  453. package/dist/types/extensibility/skc-plugins/index.d.ts +0 -18
  454. package/dist/types/extensibility/skc-plugins/injection.d.ts +0 -40
  455. package/dist/types/extensibility/skc-plugins/installer.d.ts +0 -13
  456. package/dist/types/extensibility/skc-plugins/loader.d.ts +0 -3
  457. package/dist/types/extensibility/skc-plugins/mcp-policy.d.ts +0 -26
  458. package/dist/types/extensibility/skc-plugins/observability.d.ts +0 -27
  459. package/dist/types/extensibility/skc-plugins/paths.d.ts +0 -8
  460. package/dist/types/extensibility/skc-plugins/prompt-appendix.d.ts +0 -16
  461. package/dist/types/extensibility/skc-plugins/registry.d.ts +0 -32
  462. package/dist/types/extensibility/skc-plugins/runtime-adapters.d.ts +0 -64
  463. package/dist/types/extensibility/skc-plugins/schema.d.ts +0 -3
  464. package/dist/types/extensibility/skc-plugins/session-validation.d.ts +0 -42
  465. package/dist/types/extensibility/skc-plugins/state.d.ts +0 -9
  466. package/dist/types/extensibility/skc-plugins/tools.d.ts +0 -8
  467. package/dist/types/extensibility/skc-plugins/types.d.ts +0 -220
  468. package/dist/types/extensibility/skc-plugins/validation.d.ts +0 -11
  469. package/dist/types/extensibility/skills.d.ts +0 -82
  470. package/dist/types/extensibility/slash-commands.d.ts +0 -48
  471. package/dist/types/extensibility/tool-proxy.d.ts +0 -4
  472. package/dist/types/extensibility/typebox.d.ts +0 -155
  473. package/dist/types/extensibility/utils.d.ts +0 -12
  474. package/dist/types/goals/index.d.ts +0 -3
  475. package/dist/types/goals/runtime.d.ts +0 -63
  476. package/dist/types/goals/state.d.ts +0 -32
  477. package/dist/types/goals/tools/goal-tool.d.ts +0 -62
  478. package/dist/types/harness-control-plane/classifier.d.ts +0 -13
  479. package/dist/types/harness-control-plane/control-endpoint.d.ts +0 -31
  480. package/dist/types/harness-control-plane/finalize.d.ts +0 -60
  481. package/dist/types/harness-control-plane/gc-adapter.d.ts +0 -3
  482. package/dist/types/harness-control-plane/operate.d.ts +0 -35
  483. package/dist/types/harness-control-plane/owner.d.ts +0 -53
  484. package/dist/types/harness-control-plane/phase-rollup.d.ts +0 -23
  485. package/dist/types/harness-control-plane/preserve.d.ts +0 -19
  486. package/dist/types/harness-control-plane/receipt-ingest.d.ts +0 -19
  487. package/dist/types/harness-control-plane/receipt-spool.d.ts +0 -19
  488. package/dist/types/harness-control-plane/receipts.d.ts +0 -149
  489. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  490. package/dist/types/harness-control-plane/seams.d.ts +0 -21
  491. package/dist/types/harness-control-plane/session-lease.d.ts +0 -65
  492. package/dist/types/harness-control-plane/state-machine.d.ts +0 -24
  493. package/dist/types/harness-control-plane/storage.d.ts +0 -81
  494. package/dist/types/harness-control-plane/types.d.ts +0 -187
  495. package/dist/types/hashline/anchors.d.ts +0 -20
  496. package/dist/types/hashline/apply.d.ts +0 -14
  497. package/dist/types/hashline/constants.d.ts +0 -19
  498. package/dist/types/hashline/diff-preview.d.ts +0 -2
  499. package/dist/types/hashline/diff.d.ts +0 -17
  500. package/dist/types/hashline/execute.d.ts +0 -4
  501. package/dist/types/hashline/hash.d.ts +0 -123
  502. package/dist/types/hashline/index.d.ts +0 -13
  503. package/dist/types/hashline/input.d.ts +0 -11
  504. package/dist/types/hashline/parser.d.ts +0 -7
  505. package/dist/types/hashline/prefixes.d.ts +0 -7
  506. package/dist/types/hashline/recovery.d.ts +0 -27
  507. package/dist/types/hashline/stream.d.ts +0 -2
  508. package/dist/types/hashline/types.d.ts +0 -77
  509. package/dist/types/hindsight/backend.d.ts +0 -13
  510. package/dist/types/hindsight/bank.d.ts +0 -54
  511. package/dist/types/hindsight/client.d.ts +0 -224
  512. package/dist/types/hindsight/config.d.ts +0 -51
  513. package/dist/types/hindsight/content.d.ts +0 -70
  514. package/dist/types/hindsight/index.d.ts +0 -8
  515. package/dist/types/hindsight/mental-models.d.ts +0 -125
  516. package/dist/types/hindsight/state.d.ts +0 -99
  517. package/dist/types/hindsight/transcript.d.ts +0 -28
  518. package/dist/types/hooks/codex-native-hooks-config.d.ts +0 -29
  519. package/dist/types/hooks/native-skill-hook.d.ts +0 -28
  520. package/dist/types/hooks/skill-keywords.d.ts +0 -18
  521. package/dist/types/hooks/skill-state.d.ts +0 -93
  522. package/dist/types/i18n/index.d.ts +0 -38
  523. package/dist/types/i18n/messages/de.d.ts +0 -2
  524. package/dist/types/i18n/messages/de.messages.d.ts +0 -1
  525. package/dist/types/i18n/messages/de.settings.d.ts +0 -1
  526. package/dist/types/i18n/messages/en.d.ts +0 -81
  527. package/dist/types/i18n/messages/es.d.ts +0 -2
  528. package/dist/types/i18n/messages/es.messages.d.ts +0 -1
  529. package/dist/types/i18n/messages/es.settings.d.ts +0 -1
  530. package/dist/types/i18n/messages/fr.d.ts +0 -2
  531. package/dist/types/i18n/messages/fr.messages.d.ts +0 -1
  532. package/dist/types/i18n/messages/fr.settings.d.ts +0 -1
  533. package/dist/types/i18n/messages/ja.d.ts +0 -2
  534. package/dist/types/i18n/messages/ja.messages.d.ts +0 -1
  535. package/dist/types/i18n/messages/ja.settings.d.ts +0 -1
  536. package/dist/types/i18n/messages/ko.d.ts +0 -2
  537. package/dist/types/i18n/messages/ko.messages.d.ts +0 -1
  538. package/dist/types/i18n/messages/ko.settings.d.ts +0 -1
  539. package/dist/types/i18n/messages/zh.d.ts +0 -2
  540. package/dist/types/i18n/messages/zh.messages.d.ts +0 -1
  541. package/dist/types/i18n/messages/zh.settings.d.ts +0 -1
  542. package/dist/types/index.d.ts +0 -33
  543. package/dist/types/internal-urls/agent-protocol.d.ts +0 -12
  544. package/dist/types/internal-urls/artifact-protocol.d.ts +0 -6
  545. package/dist/types/internal-urls/docs-index.generated.d.ts +0 -2
  546. package/dist/types/internal-urls/index.d.ts +0 -20
  547. package/dist/types/internal-urls/issue-pr-protocol.d.ts +0 -17
  548. package/dist/types/internal-urls/json-query.d.ts +0 -30
  549. package/dist/types/internal-urls/local-protocol.d.ts +0 -39
  550. package/dist/types/internal-urls/mcp-protocol.d.ts +0 -12
  551. package/dist/types/internal-urls/memory-protocol.d.ts +0 -23
  552. package/dist/types/internal-urls/parse.d.ts +0 -19
  553. package/dist/types/internal-urls/registry-helpers.d.ts +0 -11
  554. package/dist/types/internal-urls/router.d.ts +0 -14
  555. package/dist/types/internal-urls/rule-protocol.d.ts +0 -6
  556. package/dist/types/internal-urls/skc-protocol.d.ts +0 -12
  557. package/dist/types/internal-urls/skill-protocol.d.ts +0 -13
  558. package/dist/types/internal-urls/types.d.ts +0 -109
  559. package/dist/types/lsp/client.d.ts +0 -66
  560. package/dist/types/lsp/clients/biome-client.d.ts +0 -16
  561. package/dist/types/lsp/clients/index.d.ts +0 -19
  562. package/dist/types/lsp/clients/lsp-linter-client.d.ts +0 -16
  563. package/dist/types/lsp/clients/swiftlint-client.d.ts +0 -20
  564. package/dist/types/lsp/config.d.ts +0 -65
  565. package/dist/types/lsp/edits.d.ts +0 -23
  566. package/dist/types/lsp/index.d.ts +0 -130
  567. package/dist/types/lsp/lspmux.d.ts +0 -58
  568. package/dist/types/lsp/render.d.ts +0 -32
  569. package/dist/types/lsp/startup-events.d.ts +0 -12
  570. package/dist/types/lsp/types.d.ts +0 -306
  571. package/dist/types/lsp/utils.d.ts +0 -108
  572. package/dist/types/main.d.ts +0 -75
  573. package/dist/types/memories/index.d.ts +0 -28
  574. package/dist/types/memories/storage.d.ts +0 -110
  575. package/dist/types/memory-backend/index.d.ts +0 -4
  576. package/dist/types/memory-backend/local-backend.d.ts +0 -9
  577. package/dist/types/memory-backend/off-backend.d.ts +0 -7
  578. package/dist/types/memory-backend/resolve.d.ts +0 -15
  579. package/dist/types/memory-backend/types.d.ts +0 -61
  580. package/dist/types/migrate/action-planner.d.ts +0 -11
  581. package/dist/types/migrate/adapters/claude-code.d.ts +0 -2
  582. package/dist/types/migrate/adapters/codex.d.ts +0 -5
  583. package/dist/types/migrate/adapters/index.d.ts +0 -45
  584. package/dist/types/migrate/adapters/opencode.d.ts +0 -2
  585. package/dist/types/migrate/executor.d.ts +0 -2
  586. package/dist/types/migrate/mcp-mapper.d.ts +0 -20
  587. package/dist/types/migrate/report.d.ts +0 -18
  588. package/dist/types/migrate/skill-normalizer.d.ts +0 -27
  589. package/dist/types/migrate/types.d.ts +0 -126
  590. package/dist/types/modes/acp/acp-agent.d.ts +0 -61
  591. package/dist/types/modes/acp/acp-client-bridge.d.ts +0 -9
  592. package/dist/types/modes/acp/acp-event-mapper.d.ts +0 -34
  593. package/dist/types/modes/acp/acp-mode.d.ts +0 -5
  594. package/dist/types/modes/acp/index.d.ts +0 -2
  595. package/dist/types/modes/acp/terminal-auth.d.ts +0 -6
  596. package/dist/types/modes/bridge/auth.d.ts +0 -12
  597. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  598. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  599. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  600. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  601. package/dist/types/modes/components/agent-dashboard.d.ts +0 -21
  602. package/dist/types/modes/components/assistant-message.d.ts +0 -20
  603. package/dist/types/modes/components/bash-execution.d.ts +0 -29
  604. package/dist/types/modes/components/bordered-loader.d.ts +0 -11
  605. package/dist/types/modes/components/branch-summary-message.d.ts +0 -13
  606. package/dist/types/modes/components/btw-panel.d.ts +0 -16
  607. package/dist/types/modes/components/compaction-summary-message.d.ts +0 -13
  608. package/dist/types/modes/components/countdown-timer.d.ts +0 -14
  609. package/dist/types/modes/components/custom-editor.d.ts +0 -67
  610. package/dist/types/modes/components/custom-message.d.ts +0 -15
  611. package/dist/types/modes/components/custom-model-preset-wizard.d.ts +0 -12
  612. package/dist/types/modes/components/custom-provider-wizard.d.ts +0 -10
  613. package/dist/types/modes/components/diff.d.ts +0 -11
  614. package/dist/types/modes/components/dynamic-border.d.ts +0 -14
  615. package/dist/types/modes/components/eval-execution.d.ts +0 -23
  616. package/dist/types/modes/components/execution-shared.d.ts +0 -46
  617. package/dist/types/modes/components/extensions/extension-dashboard.d.ts +0 -26
  618. package/dist/types/modes/components/extensions/extension-list.d.ts +0 -39
  619. package/dist/types/modes/components/extensions/index.d.ts +0 -8
  620. package/dist/types/modes/components/extensions/inspector-panel.d.ts +0 -8
  621. package/dist/types/modes/components/extensions/state-manager.d.ts +0 -50
  622. package/dist/types/modes/components/extensions/types.d.ts +0 -151
  623. package/dist/types/modes/components/footer.d.ts +0 -30
  624. package/dist/types/modes/components/history-search.d.ts +0 -7
  625. package/dist/types/modes/components/hook-editor.d.ts +0 -18
  626. package/dist/types/modes/components/hook-input.d.ts +0 -15
  627. package/dist/types/modes/components/hook-message.d.ts +0 -15
  628. package/dist/types/modes/components/hook-selector.d.ts +0 -53
  629. package/dist/types/modes/components/index.d.ts +0 -35
  630. package/dist/types/modes/components/jobs-overlay-model.d.ts +0 -31
  631. package/dist/types/modes/components/jobs-overlay.d.ts +0 -30
  632. package/dist/types/modes/components/keybinding-hints.d.ts +0 -40
  633. package/dist/types/modes/components/login-dialog.d.ts +0 -32
  634. package/dist/types/modes/components/message-frame.d.ts +0 -42
  635. package/dist/types/modes/components/model-selector.d.ts +0 -60
  636. package/dist/types/modes/components/oauth-selector.d.ts +0 -17
  637. package/dist/types/modes/components/plugin-selector.d.ts +0 -26
  638. package/dist/types/modes/components/plugin-settings.d.ts +0 -66
  639. package/dist/types/modes/components/provider-onboarding-selector.d.ts +0 -7
  640. package/dist/types/modes/components/queue-mode-selector.d.ts +0 -9
  641. package/dist/types/modes/components/queued-message-selector.d.ts +0 -12
  642. package/dist/types/modes/components/read-tool-group.d.ts +0 -30
  643. package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +0 -26
  644. package/dist/types/modes/components/session-observer-overlay.d.ts +0 -11
  645. package/dist/types/modes/components/session-selector.d.ts +0 -30
  646. package/dist/types/modes/components/settings-defs.d.ts +0 -50
  647. package/dist/types/modes/components/settings-selector.d.ts +0 -62
  648. package/dist/types/modes/components/show-images-selector.d.ts +0 -9
  649. package/dist/types/modes/components/skill-hud/render.d.ts +0 -2
  650. package/dist/types/modes/components/skill-message.d.ts +0 -10
  651. package/dist/types/modes/components/status-line/context-thresholds.d.ts +0 -4
  652. package/dist/types/modes/components/status-line/git-utils.d.ts +0 -28
  653. package/dist/types/modes/components/status-line/index.d.ts +0 -4
  654. package/dist/types/modes/components/status-line/presets.d.ts +0 -3
  655. package/dist/types/modes/components/status-line/segments.d.ts +0 -5
  656. package/dist/types/modes/components/status-line/separators.d.ts +0 -3
  657. package/dist/types/modes/components/status-line/token-rate.d.ts +0 -10
  658. package/dist/types/modes/components/status-line/types.d.ts +0 -77
  659. package/dist/types/modes/components/status-line.d.ts +0 -103
  660. package/dist/types/modes/components/theme-selector.d.ts +0 -10
  661. package/dist/types/modes/components/thinking-selector.d.ts +0 -15
  662. package/dist/types/modes/components/todo-reminder.d.ts +0 -13
  663. package/dist/types/modes/components/tool-execution.d.ts +0 -54
  664. package/dist/types/modes/components/tree-selector.d.ts +0 -31
  665. package/dist/types/modes/components/ttsr-notification.d.ts +0 -13
  666. package/dist/types/modes/components/two-column-body.d.ts +0 -9
  667. package/dist/types/modes/components/user-message-selector.d.ts +0 -28
  668. package/dist/types/modes/components/user-message.d.ts +0 -7
  669. package/dist/types/modes/components/visual-truncate.d.ts +0 -19
  670. package/dist/types/modes/components/welcome.d.ts +0 -45
  671. package/dist/types/modes/controllers/btw-controller.d.ts +0 -10
  672. package/dist/types/modes/controllers/command-controller-shared.d.ts +0 -47
  673. package/dist/types/modes/controllers/command-controller.d.ts +0 -40
  674. package/dist/types/modes/controllers/event-controller.d.ts +0 -17
  675. package/dist/types/modes/controllers/extension-ui-controller.d.ts +0 -80
  676. package/dist/types/modes/controllers/input-controller.d.ts +0 -42
  677. package/dist/types/modes/controllers/runtime-mcp-command-controller.d.ts +0 -10
  678. package/dist/types/modes/controllers/selector-controller.d.ts +0 -67
  679. package/dist/types/modes/controllers/ssh-command-controller.d.ts +0 -10
  680. package/dist/types/modes/controllers/todo-command-controller.d.ts +0 -7
  681. package/dist/types/modes/emoji-autocomplete.d.ts +0 -16
  682. package/dist/types/modes/index.d.ts +0 -10
  683. package/dist/types/modes/interactive-mode.d.ts +0 -275
  684. package/dist/types/modes/jobs-observer.d.ts +0 -57
  685. package/dist/types/modes/oauth-manual-input.d.ts +0 -8
  686. package/dist/types/modes/print-mode.d.ts +0 -45
  687. package/dist/types/modes/prompt-action-autocomplete.d.ts +0 -50
  688. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  689. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  690. package/dist/types/modes/rpc/rpc-client.d.ts +0 -288
  691. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -85
  692. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  693. package/dist/types/modes/rpc/rpc-types.d.ts +0 -794
  694. package/dist/types/modes/runtime-init.d.ts +0 -21
  695. package/dist/types/modes/session-observer-registry.d.ts +0 -26
  696. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +0 -57
  697. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  698. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  699. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  700. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +0 -94
  701. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +0 -103
  702. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +0 -60
  703. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +0 -37
  704. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  705. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  706. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  707. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  708. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  709. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  710. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  711. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  712. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  713. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  714. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  715. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -161
  716. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -82
  717. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +0 -114
  718. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +0 -39
  719. package/dist/types/modes/shared.d.ts +0 -15
  720. package/dist/types/modes/slash-command-visibility.d.ts +0 -1
  721. package/dist/types/modes/theme/defaults/index.d.ts +0 -652
  722. package/dist/types/modes/theme/mermaid-cache.d.ts +0 -9
  723. package/dist/types/modes/theme/shimmer.d.ts +0 -38
  724. package/dist/types/modes/theme/theme.d.ts +0 -275
  725. package/dist/types/modes/tmux-scroll.d.ts +0 -18
  726. package/dist/types/modes/types.d.ts +0 -292
  727. package/dist/types/modes/utils/abort-message.d.ts +0 -4
  728. package/dist/types/modes/utils/context-usage.d.ts +0 -51
  729. package/dist/types/modes/utils/hotkeys-markdown.d.ts +0 -5
  730. package/dist/types/modes/utils/injected-user-submission.d.ts +0 -52
  731. package/dist/types/modes/utils/keybinding-matchers.d.ts +0 -10
  732. package/dist/types/modes/utils/terminal-bell.d.ts +0 -3
  733. package/dist/types/modes/utils/tools-markdown.d.ts +0 -5
  734. package/dist/types/modes/utils/ui-helpers.d.ts +0 -54
  735. package/dist/types/notifications/attachment-registry.d.ts +0 -17
  736. package/dist/types/notifications/chat-adapters.d.ts +0 -9
  737. package/dist/types/notifications/config-commands.d.ts +0 -64
  738. package/dist/types/notifications/config.d.ts +0 -98
  739. package/dist/types/notifications/daemon-paths.d.ts +0 -10
  740. package/dist/types/notifications/engine.d.ts +0 -59
  741. package/dist/types/notifications/helpers.d.ts +0 -55
  742. package/dist/types/notifications/html-format.d.ts +0 -75
  743. package/dist/types/notifications/index.d.ts +0 -192
  744. package/dist/types/notifications/lifecycle-commands.d.ts +0 -69
  745. package/dist/types/notifications/lifecycle-control-runtime.d.ts +0 -99
  746. package/dist/types/notifications/lifecycle-orchestrator.d.ts +0 -144
  747. package/dist/types/notifications/managed-daemon.d.ts +0 -48
  748. package/dist/types/notifications/operator-runtime.d.ts +0 -52
  749. package/dist/types/notifications/rate-limit-pool.d.ts +0 -95
  750. package/dist/types/notifications/recent-activity.d.ts +0 -39
  751. package/dist/types/notifications/reply-sent-store.d.ts +0 -53
  752. package/dist/types/notifications/rich-draft.d.ts +0 -68
  753. package/dist/types/notifications/rich-render.d.ts +0 -90
  754. package/dist/types/notifications/telegram-cli.d.ts +0 -19
  755. package/dist/types/notifications/telegram-daemon-cli.d.ts +0 -28
  756. package/dist/types/notifications/telegram-daemon-control.d.ts +0 -64
  757. package/dist/types/notifications/telegram-daemon.d.ts +0 -429
  758. package/dist/types/notifications/telegram-reference.d.ts +0 -119
  759. package/dist/types/notifications/threaded-inbound.d.ts +0 -77
  760. package/dist/types/notifications/threaded-render.d.ts +0 -88
  761. package/dist/types/notifications/topic-registry.d.ts +0 -69
  762. package/dist/types/plan-mode/approved-plan.d.ts +0 -49
  763. package/dist/types/plan-mode/state.d.ts +0 -6
  764. package/dist/types/registry/agent-registry.d.ts +0 -62
  765. package/dist/types/reminders/star-reminder.d.ts +0 -115
  766. package/dist/types/research-plan/index.d.ts +0 -1
  767. package/dist/types/research-plan/ledger.d.ts +0 -33
  768. package/dist/types/rlm/artifacts.d.ts +0 -9
  769. package/dist/types/rlm/complete-research-tool.d.ts +0 -35
  770. package/dist/types/rlm/data-context.d.ts +0 -6
  771. package/dist/types/rlm/index.d.ts +0 -47
  772. package/dist/types/rlm/notebook.d.ts +0 -12
  773. package/dist/types/rlm/preset.d.ts +0 -23
  774. package/dist/types/rlm/python-tool.d.ts +0 -16
  775. package/dist/types/rlm/report.d.ts +0 -14
  776. package/dist/types/rlm/types.d.ts +0 -37
  777. package/dist/types/runtime/process-lifecycle.d.ts +0 -108
  778. package/dist/types/runtime-api-key.d.ts +0 -7
  779. package/dist/types/runtime-credential-selector.d.ts +0 -7
  780. package/dist/types/runtime-mcp/client.d.ts +0 -74
  781. package/dist/types/runtime-mcp/config-writer.d.ts +0 -88
  782. package/dist/types/runtime-mcp/config.d.ts +0 -77
  783. package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +0 -7
  784. package/dist/types/runtime-mcp/index.d.ts +0 -18
  785. package/dist/types/runtime-mcp/json-rpc.d.ts +0 -22
  786. package/dist/types/runtime-mcp/loader.d.ts +0 -45
  787. package/dist/types/runtime-mcp/manager.d.ts +0 -195
  788. package/dist/types/runtime-mcp/oauth-discovery.d.ts +0 -40
  789. package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -59
  790. package/dist/types/runtime-mcp/render.d.ts +0 -25
  791. package/dist/types/runtime-mcp/smithery-auth.d.ts +0 -16
  792. package/dist/types/runtime-mcp/smithery-connect.d.ts +0 -38
  793. package/dist/types/runtime-mcp/smithery-registry.d.ts +0 -51
  794. package/dist/types/runtime-mcp/tool-bridge.d.ts +0 -86
  795. package/dist/types/runtime-mcp/tool-cache.d.ts +0 -8
  796. package/dist/types/runtime-mcp/transports/http.d.ts +0 -36
  797. package/dist/types/runtime-mcp/transports/index.d.ts +0 -5
  798. package/dist/types/runtime-mcp/transports/stdio.d.ts +0 -29
  799. package/dist/types/runtime-mcp/types.d.ts +0 -348
  800. package/dist/types/sdk.d.ts +0 -254
  801. package/dist/types/secrets/index.d.ts +0 -9
  802. package/dist/types/secrets/obfuscator.d.ts +0 -23
  803. package/dist/types/secrets/regex.d.ts +0 -2
  804. package/dist/types/session/agent-session.d.ts +0 -1185
  805. package/dist/types/session/agent-storage.d.ts +0 -101
  806. package/dist/types/session/artifacts.d.ts +0 -64
  807. package/dist/types/session/auth-broker-config.d.ts +0 -13
  808. package/dist/types/session/auth-storage.d.ts +0 -6
  809. package/dist/types/session/blob-store.d.ts +0 -160
  810. package/dist/types/session/client-bridge.d.ts +0 -88
  811. package/dist/types/session/contribution-prep.d.ts +0 -47
  812. package/dist/types/session/file-mention-pruning.d.ts +0 -8
  813. package/dist/types/session/history-storage.d.ts +0 -16
  814. package/dist/types/session/messages.d.ts +0 -169
  815. package/dist/types/session/session-dump-format.d.ts +0 -22
  816. package/dist/types/session/session-manager.d.ts +0 -660
  817. package/dist/types/session/session-storage.d.ts +0 -88
  818. package/dist/types/session/streaming-output.d.ts +0 -209
  819. package/dist/types/session/tool-choice-queue.d.ts +0 -84
  820. package/dist/types/session/yield-queue.d.ts +0 -24
  821. package/dist/types/setup/credential-auto-import.d.ts +0 -63
  822. package/dist/types/setup/credential-import.d.ts +0 -82
  823. package/dist/types/setup/hermes-setup.d.ts +0 -78
  824. package/dist/types/setup/host-plugin-setup.d.ts +0 -39
  825. package/dist/types/setup/model-onboarding-guidance.d.ts +0 -9
  826. package/dist/types/setup/provider-onboarding.d.ts +0 -52
  827. package/dist/types/skc-runtime/cli-write-receipt.d.ts +0 -24
  828. package/dist/types/skc-runtime/deep-interview-ambiguity.d.ts +0 -39
  829. package/dist/types/skc-runtime/deep-interview-recorder.d.ts +0 -114
  830. package/dist/types/skc-runtime/deep-interview-runtime.d.ts +0 -36
  831. package/dist/types/skc-runtime/deep-interview-state.d.ts +0 -127
  832. package/dist/types/skc-runtime/gc-render.d.ts +0 -6
  833. package/dist/types/skc-runtime/gc-runtime.d.ts +0 -134
  834. package/dist/types/skc-runtime/goal-mode-request.d.ts +0 -53
  835. package/dist/types/skc-runtime/launch-tmux.d.ts +0 -78
  836. package/dist/types/skc-runtime/launch-worktree.d.ts +0 -46
  837. package/dist/types/skc-runtime/ledger-event-renderer.d.ts +0 -68
  838. package/dist/types/skc-runtime/psmux-detect.d.ts +0 -78
  839. package/dist/types/skc-runtime/ralplan-runtime.d.ts +0 -26
  840. package/dist/types/skc-runtime/restricted-role-agent-bash.d.ts +0 -3
  841. package/dist/types/skc-runtime/session-layout.d.ts +0 -59
  842. package/dist/types/skc-runtime/session-resolution.d.ts +0 -47
  843. package/dist/types/skc-runtime/session-state-sidecar.d.ts +0 -39
  844. package/dist/types/skc-runtime/state-graph.d.ts +0 -4
  845. package/dist/types/skc-runtime/state-migrations.d.ts +0 -33
  846. package/dist/types/skc-runtime/state-renderer.d.ts +0 -70
  847. package/dist/types/skc-runtime/state-runtime.d.ts +0 -38
  848. package/dist/types/skc-runtime/state-schema.d.ts +0 -319
  849. package/dist/types/skc-runtime/state-validation.d.ts +0 -6
  850. package/dist/types/skc-runtime/state-writer.d.ts +0 -244
  851. package/dist/types/skc-runtime/team-gc.d.ts +0 -7
  852. package/dist/types/skc-runtime/team-runtime.d.ts +0 -355
  853. package/dist/types/skc-runtime/tmux-common.d.ts +0 -105
  854. package/dist/types/skc-runtime/tmux-gc.d.ts +0 -7
  855. package/dist/types/skc-runtime/tmux-sessions.d.ts +0 -62
  856. package/dist/types/skc-runtime/ultragoal-guard.d.ts +0 -93
  857. package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +0 -42
  858. package/dist/types/skc-runtime/ultragoal-runtime.d.ts +0 -410
  859. package/dist/types/skc-runtime/workflow-command-ref.d.ts +0 -43
  860. package/dist/types/skc-runtime/workflow-manifest.d.ts +0 -54
  861. package/dist/types/skill-state/active-state.d.ts +0 -126
  862. package/dist/types/skill-state/canonical-skills.d.ts +0 -3
  863. package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +0 -38
  864. package/dist/types/skill-state/initial-phase.d.ts +0 -12
  865. package/dist/types/skill-state/workflow-hud.d.ts +0 -83
  866. package/dist/types/skill-state/workflow-state-contract.d.ts +0 -57
  867. package/dist/types/skill-state/workflow-state-version.d.ts +0 -3
  868. package/dist/types/slash-commands/acp-builtins.d.ts +0 -18
  869. package/dist/types/slash-commands/builtin-registry.d.ts +0 -24
  870. package/dist/types/slash-commands/helpers/context-report.d.ts +0 -7
  871. package/dist/types/slash-commands/helpers/fast-status-report.d.ts +0 -82
  872. package/dist/types/slash-commands/helpers/format.d.ts +0 -10
  873. package/dist/types/slash-commands/helpers/mcp.d.ts +0 -3
  874. package/dist/types/slash-commands/helpers/parse.d.ts +0 -33
  875. package/dist/types/slash-commands/helpers/ssh.d.ts +0 -3
  876. package/dist/types/slash-commands/helpers/todo.d.ts +0 -3
  877. package/dist/types/slash-commands/helpers/usage-report.d.ts +0 -7
  878. package/dist/types/slash-commands/types.d.ts +0 -120
  879. package/dist/types/ssh/config-writer.d.ts +0 -49
  880. package/dist/types/ssh/connection-manager.d.ts +0 -33
  881. package/dist/types/ssh/ssh-executor.d.ts +0 -37
  882. package/dist/types/ssh/sshfs-mount.d.ts +0 -6
  883. package/dist/types/ssh/utils.d.ts +0 -2
  884. package/dist/types/stt/downloader.d.ts +0 -9
  885. package/dist/types/stt/index.d.ts +0 -3
  886. package/dist/types/stt/recorder.d.ts +0 -13
  887. package/dist/types/stt/setup.d.ts +0 -18
  888. package/dist/types/stt/stt-controller.d.ts +0 -16
  889. package/dist/types/stt/transcriber.d.ts +0 -16
  890. package/dist/types/system-prompt.d.ts +0 -118
  891. package/dist/types/task/agents.d.ts +0 -28
  892. package/dist/types/task/commands.d.ts +0 -35
  893. package/dist/types/task/discovery.d.ts +0 -19
  894. package/dist/types/task/executor.d.ts +0 -124
  895. package/dist/types/task/fork-context-advisory.d.ts +0 -13
  896. package/dist/types/task/fork-context-budget.d.ts +0 -7
  897. package/dist/types/task/id.d.ts +0 -7
  898. package/dist/types/task/index.d.ts +0 -43
  899. package/dist/types/task/name-generator.d.ts +0 -16
  900. package/dist/types/task/output-manager.d.ts +0 -36
  901. package/dist/types/task/parallel.d.ts +0 -34
  902. package/dist/types/task/receipt.d.ts +0 -87
  903. package/dist/types/task/render.d.ts +0 -28
  904. package/dist/types/task/roi-reconciliation.d.ts +0 -27
  905. package/dist/types/task/simple-mode.d.ts +0 -8
  906. package/dist/types/task/skc-command.d.ts +0 -7
  907. package/dist/types/task/spawn-gate.d.ts +0 -29
  908. package/dist/types/task/subprocess-tool-registry.d.ts +0 -72
  909. package/dist/types/task/token-log.d.ts +0 -30
  910. package/dist/types/task/token-log.test.d.ts +0 -1
  911. package/dist/types/task/types.d.ts +0 -508
  912. package/dist/types/task/worktree.d.ts +0 -94
  913. package/dist/types/thinking-metadata.d.ts +0 -16
  914. package/dist/types/thinking.d.ts +0 -22
  915. package/dist/types/tool-discovery/tool-index.d.ts +0 -112
  916. package/dist/types/tools/archive-reader.d.ts +0 -40
  917. package/dist/types/tools/ask-answer-registry.d.ts +0 -13
  918. package/dist/types/tools/ask.d.ts +0 -123
  919. package/dist/types/tools/ast-edit.d.ts +0 -77
  920. package/dist/types/tools/ast-grep.d.ts +0 -69
  921. package/dist/types/tools/auto-generated-guard.d.ts +0 -17
  922. package/dist/types/tools/bash-allowed-prefixes.d.ts +0 -10
  923. package/dist/types/tools/bash-command-fixup.d.ts +0 -11
  924. package/dist/types/tools/bash-interactive.d.ts +0 -16
  925. package/dist/types/tools/bash-interceptor.d.ts +0 -24
  926. package/dist/types/tools/bash-pty-selection.d.ts +0 -7
  927. package/dist/types/tools/bash-skill-urls.d.ts +0 -31
  928. package/dist/types/tools/bash.d.ts +0 -157
  929. package/dist/types/tools/bisect.d.ts +0 -81
  930. package/dist/types/tools/browser/actions.d.ts +0 -54
  931. package/dist/types/tools/browser/attach.d.ts +0 -50
  932. package/dist/types/tools/browser/launch.d.ts +0 -62
  933. package/dist/types/tools/browser/readable.d.ts +0 -17
  934. package/dist/types/tools/browser/registry.d.ts +0 -57
  935. package/dist/types/tools/browser/render.d.ts +0 -53
  936. package/dist/types/tools/browser/tab-protocol.d.ts +0 -144
  937. package/dist/types/tools/browser/tab-supervisor.d.ts +0 -103
  938. package/dist/types/tools/browser/tab-worker-entry.d.ts +0 -1
  939. package/dist/types/tools/browser/tab-worker.d.ts +0 -19
  940. package/dist/types/tools/browser.d.ts +0 -211
  941. package/dist/types/tools/calculator.d.ts +0 -76
  942. package/dist/types/tools/checkpoint.d.ts +0 -63
  943. package/dist/types/tools/composer-bash-policy.d.ts +0 -14
  944. package/dist/types/tools/computer/render.d.ts +0 -17
  945. package/dist/types/tools/computer-gc.d.ts +0 -23
  946. package/dist/types/tools/computer.d.ts +0 -465
  947. package/dist/types/tools/conflict-detect.d.ts +0 -205
  948. package/dist/types/tools/context.d.ts +0 -19
  949. package/dist/types/tools/cron.d.ts +0 -91
  950. package/dist/types/tools/debug.d.ts +0 -209
  951. package/dist/types/tools/eval.d.ts +0 -108
  952. package/dist/types/tools/fetch.d.ts +0 -84
  953. package/dist/types/tools/file-recorder.d.ts +0 -13
  954. package/dist/types/tools/find.d.ts +0 -95
  955. package/dist/types/tools/fs-cache-invalidation.d.ts +0 -15
  956. package/dist/types/tools/gh-format.d.ts +0 -6
  957. package/dist/types/tools/gh-renderer.d.ts +0 -25
  958. package/dist/types/tools/gh.d.ts +0 -356
  959. package/dist/types/tools/github-cache.d.ts +0 -103
  960. package/dist/types/tools/grouped-file-output.d.ts +0 -36
  961. package/dist/types/tools/hindsight-recall.d.ts +0 -21
  962. package/dist/types/tools/hindsight-reflect.d.ts +0 -23
  963. package/dist/types/tools/hindsight-retain.d.ts +0 -27
  964. package/dist/types/tools/image-gen.d.ts +0 -79
  965. package/dist/types/tools/index.d.ts +0 -319
  966. package/dist/types/tools/irc.d.ts +0 -79
  967. package/dist/types/tools/job.d.ts +0 -78
  968. package/dist/types/tools/json-tree.d.ts +0 -23
  969. package/dist/types/tools/jtd-to-json-schema.d.ts +0 -29
  970. package/dist/types/tools/jtd-to-typescript.d.ts +0 -26
  971. package/dist/types/tools/jtd-utils.d.ts +0 -42
  972. package/dist/types/tools/list-limit.d.ts +0 -12
  973. package/dist/types/tools/match-line-format.d.ts +0 -11
  974. package/dist/types/tools/monitor.d.ts +0 -54
  975. package/dist/types/tools/output-meta.d.ts +0 -204
  976. package/dist/types/tools/path-utils.d.ts +0 -147
  977. package/dist/types/tools/plan-mode-guard.d.ts +0 -18
  978. package/dist/types/tools/read.d.ts +0 -85
  979. package/dist/types/tools/recipe/index.d.ts +0 -45
  980. package/dist/types/tools/recipe/render.d.ts +0 -36
  981. package/dist/types/tools/recipe/runner.d.ts +0 -60
  982. package/dist/types/tools/recipe/runners/cargo.d.ts +0 -16
  983. package/dist/types/tools/recipe/runners/index.d.ts +0 -2
  984. package/dist/types/tools/recipe/runners/just.d.ts +0 -2
  985. package/dist/types/tools/recipe/runners/make.d.ts +0 -2
  986. package/dist/types/tools/recipe/runners/pkg.d.ts +0 -2
  987. package/dist/types/tools/recipe/runners/task.d.ts +0 -2
  988. package/dist/types/tools/render-mermaid.d.ts +0 -37
  989. package/dist/types/tools/render-utils.d.ts +0 -158
  990. package/dist/types/tools/renderers.d.ts +0 -26
  991. package/dist/types/tools/resolve.d.ts +0 -80
  992. package/dist/types/tools/resource-gc.d.ts +0 -54
  993. package/dist/types/tools/review.d.ts +0 -63
  994. package/dist/types/tools/search-tool-bm25.d.ts +0 -65
  995. package/dist/types/tools/search.d.ts +0 -93
  996. package/dist/types/tools/skill-discovery.d.ts +0 -40
  997. package/dist/types/tools/skill.d.ts +0 -47
  998. package/dist/types/tools/sqlite-reader.d.ts +0 -94
  999. package/dist/types/tools/ssh.d.ts +0 -67
  1000. package/dist/types/tools/subagent-render.d.ts +0 -31
  1001. package/dist/types/tools/subagent.d.ts +0 -117
  1002. package/dist/types/tools/telegram-send.d.ts +0 -32
  1003. package/dist/types/tools/todo-write.d.ts +0 -120
  1004. package/dist/types/tools/tool-errors.d.ts +0 -33
  1005. package/dist/types/tools/tool-result.d.ts +0 -30
  1006. package/dist/types/tools/tool-timeouts.d.ts +0 -56
  1007. package/dist/types/tools/ultragoal-ask-guard.d.ts +0 -12
  1008. package/dist/types/tools/vim.d.ts +0 -58
  1009. package/dist/types/tools/write.d.ts +0 -59
  1010. package/dist/types/tools/yield.d.ts +0 -25
  1011. package/dist/types/tui/code-cell.d.ts +0 -32
  1012. package/dist/types/tui/file-list.d.ts +0 -22
  1013. package/dist/types/tui/hyperlink.d.ts +0 -42
  1014. package/dist/types/tui/index.d.ts +0 -11
  1015. package/dist/types/tui/output-block.d.ts +0 -28
  1016. package/dist/types/tui/status-line.d.ts +0 -18
  1017. package/dist/types/tui/tree-list.d.ts +0 -19
  1018. package/dist/types/tui/types.d.ts +0 -13
  1019. package/dist/types/tui/utils.d.ts +0 -36
  1020. package/dist/types/utils/changelog.d.ts +0 -37
  1021. package/dist/types/utils/clipboard.d.ts +0 -22
  1022. package/dist/types/utils/cmux-workspace.d.ts +0 -52
  1023. package/dist/types/utils/command-args.d.ts +0 -9
  1024. package/dist/types/utils/commit-message-generator.d.ts +0 -7
  1025. package/dist/types/utils/edit-mode.d.ts +0 -13
  1026. package/dist/types/utils/event-bus.d.ts +0 -6
  1027. package/dist/types/utils/external-editor.d.ts +0 -17
  1028. package/dist/types/utils/file-display-mode.d.ts +0 -27
  1029. package/dist/types/utils/file-mentions.d.ts +0 -25
  1030. package/dist/types/utils/git.d.ts +0 -393
  1031. package/dist/types/utils/image-loading.d.ts +0 -26
  1032. package/dist/types/utils/image-resize.d.ts +0 -39
  1033. package/dist/types/utils/lang-from-path.d.ts +0 -8
  1034. package/dist/types/utils/markit.d.ts +0 -7
  1035. package/dist/types/utils/open.d.ts +0 -2
  1036. package/dist/types/utils/pasted-image-path.d.ts +0 -30
  1037. package/dist/types/utils/session-color.d.ts +0 -10
  1038. package/dist/types/utils/shell-snapshot.d.ts +0 -5
  1039. package/dist/types/utils/sixel.d.ts +0 -21
  1040. package/dist/types/utils/title-generator.d.ts +0 -31
  1041. package/dist/types/utils/tool-choice.d.ts +0 -20
  1042. package/dist/types/utils/tools-manager.d.ts +0 -9
  1043. package/dist/types/vim/buffer.d.ts +0 -41
  1044. package/dist/types/vim/commands.d.ts +0 -6
  1045. package/dist/types/vim/engine.d.ts +0 -47
  1046. package/dist/types/vim/parser.d.ts +0 -3
  1047. package/dist/types/vim/render.d.ts +0 -25
  1048. package/dist/types/vim/types.d.ts +0 -182
  1049. package/dist/types/web/insane/bridge.d.ts +0 -103
  1050. package/dist/types/web/insane/url-guard.d.ts +0 -25
  1051. package/dist/types/web/kagi.d.ts +0 -23
  1052. package/dist/types/web/parallel.d.ts +0 -58
  1053. package/dist/types/web/scrapers/artifacthub.d.ts +0 -6
  1054. package/dist/types/web/scrapers/arxiv.d.ts +0 -5
  1055. package/dist/types/web/scrapers/aur.d.ts +0 -5
  1056. package/dist/types/web/scrapers/biorxiv.d.ts +0 -5
  1057. package/dist/types/web/scrapers/bluesky.d.ts +0 -5
  1058. package/dist/types/web/scrapers/brew.d.ts +0 -5
  1059. package/dist/types/web/scrapers/cheatsh.d.ts +0 -8
  1060. package/dist/types/web/scrapers/chocolatey.d.ts +0 -5
  1061. package/dist/types/web/scrapers/choosealicense.d.ts +0 -2
  1062. package/dist/types/web/scrapers/cisa-kev.d.ts +0 -5
  1063. package/dist/types/web/scrapers/clojars.d.ts +0 -5
  1064. package/dist/types/web/scrapers/coingecko.d.ts +0 -5
  1065. package/dist/types/web/scrapers/crates-io.d.ts +0 -5
  1066. package/dist/types/web/scrapers/crossref.d.ts +0 -2
  1067. package/dist/types/web/scrapers/devto.d.ts +0 -5
  1068. package/dist/types/web/scrapers/discogs.d.ts +0 -8
  1069. package/dist/types/web/scrapers/discourse.d.ts +0 -5
  1070. package/dist/types/web/scrapers/dockerhub.d.ts +0 -5
  1071. package/dist/types/web/scrapers/docs-rs.d.ts +0 -2
  1072. package/dist/types/web/scrapers/fdroid.d.ts +0 -5
  1073. package/dist/types/web/scrapers/firefox-addons.d.ts +0 -2
  1074. package/dist/types/web/scrapers/flathub.d.ts +0 -2
  1075. package/dist/types/web/scrapers/github-gist.d.ts +0 -5
  1076. package/dist/types/web/scrapers/github.d.ts +0 -12
  1077. package/dist/types/web/scrapers/gitlab.d.ts +0 -5
  1078. package/dist/types/web/scrapers/go-pkg.d.ts +0 -5
  1079. package/dist/types/web/scrapers/hackage.d.ts +0 -5
  1080. package/dist/types/web/scrapers/hackernews.d.ts +0 -2
  1081. package/dist/types/web/scrapers/hex.d.ts +0 -5
  1082. package/dist/types/web/scrapers/huggingface.d.ts +0 -2
  1083. package/dist/types/web/scrapers/iacr.d.ts +0 -5
  1084. package/dist/types/web/scrapers/index.d.ts +0 -84
  1085. package/dist/types/web/scrapers/jetbrains-marketplace.d.ts +0 -2
  1086. package/dist/types/web/scrapers/lemmy.d.ts +0 -2
  1087. package/dist/types/web/scrapers/lobsters.d.ts +0 -5
  1088. package/dist/types/web/scrapers/mastodon.d.ts +0 -5
  1089. package/dist/types/web/scrapers/maven.d.ts +0 -6
  1090. package/dist/types/web/scrapers/mdn.d.ts +0 -2
  1091. package/dist/types/web/scrapers/metacpan.d.ts +0 -5
  1092. package/dist/types/web/scrapers/musicbrainz.d.ts +0 -5
  1093. package/dist/types/web/scrapers/npm.d.ts +0 -5
  1094. package/dist/types/web/scrapers/nuget.d.ts +0 -5
  1095. package/dist/types/web/scrapers/nvd.d.ts +0 -5
  1096. package/dist/types/web/scrapers/ollama.d.ts +0 -2
  1097. package/dist/types/web/scrapers/open-vsx.d.ts +0 -5
  1098. package/dist/types/web/scrapers/opencorporates.d.ts +0 -5
  1099. package/dist/types/web/scrapers/openlibrary.d.ts +0 -5
  1100. package/dist/types/web/scrapers/orcid.d.ts +0 -5
  1101. package/dist/types/web/scrapers/osv.d.ts +0 -5
  1102. package/dist/types/web/scrapers/packagist.d.ts +0 -5
  1103. package/dist/types/web/scrapers/pub-dev.d.ts +0 -5
  1104. package/dist/types/web/scrapers/pubmed.d.ts +0 -5
  1105. package/dist/types/web/scrapers/pypi.d.ts +0 -5
  1106. package/dist/types/web/scrapers/rawg.d.ts +0 -2
  1107. package/dist/types/web/scrapers/readthedocs.d.ts +0 -2
  1108. package/dist/types/web/scrapers/reddit.d.ts +0 -5
  1109. package/dist/types/web/scrapers/repology.d.ts +0 -5
  1110. package/dist/types/web/scrapers/rfc.d.ts +0 -5
  1111. package/dist/types/web/scrapers/rubygems.d.ts +0 -5
  1112. package/dist/types/web/scrapers/searchcode.d.ts +0 -2
  1113. package/dist/types/web/scrapers/sec-edgar.d.ts +0 -5
  1114. package/dist/types/web/scrapers/semantic-scholar.d.ts +0 -2
  1115. package/dist/types/web/scrapers/snapcraft.d.ts +0 -2
  1116. package/dist/types/web/scrapers/sourcegraph.d.ts +0 -2
  1117. package/dist/types/web/scrapers/spdx.d.ts +0 -5
  1118. package/dist/types/web/scrapers/spotify.d.ts +0 -8
  1119. package/dist/types/web/scrapers/stackoverflow.d.ts +0 -6
  1120. package/dist/types/web/scrapers/terraform.d.ts +0 -5
  1121. package/dist/types/web/scrapers/tldr.d.ts +0 -7
  1122. package/dist/types/web/scrapers/twitter.d.ts +0 -5
  1123. package/dist/types/web/scrapers/types.d.ts +0 -83
  1124. package/dist/types/web/scrapers/utils.d.ts +0 -32
  1125. package/dist/types/web/scrapers/vimeo.d.ts +0 -5
  1126. package/dist/types/web/scrapers/vscode-marketplace.d.ts +0 -5
  1127. package/dist/types/web/scrapers/w3c.d.ts +0 -2
  1128. package/dist/types/web/scrapers/wikidata.d.ts +0 -5
  1129. package/dist/types/web/scrapers/wikipedia.d.ts +0 -5
  1130. package/dist/types/web/scrapers/youtube.d.ts +0 -13
  1131. package/dist/types/web/search/index.d.ts +0 -118
  1132. package/dist/types/web/search/provider.d.ts +0 -55
  1133. package/dist/types/web/search/providers/anthropic.d.ts +0 -32
  1134. package/dist/types/web/search/providers/base.d.ts +0 -90
  1135. package/dist/types/web/search/providers/brave.d.ts +0 -27
  1136. package/dist/types/web/search/providers/codex.d.ts +0 -35
  1137. package/dist/types/web/search/providers/duckduckgo.d.ts +0 -57
  1138. package/dist/types/web/search/providers/exa.d.ts +0 -52
  1139. package/dist/types/web/search/providers/gemini.d.ts +0 -57
  1140. package/dist/types/web/search/providers/insane.d.ts +0 -53
  1141. package/dist/types/web/search/providers/jina.d.ts +0 -26
  1142. package/dist/types/web/search/providers/kagi.d.ts +0 -24
  1143. package/dist/types/web/search/providers/kimi.d.ts +0 -27
  1144. package/dist/types/web/search/providers/openai-compatible.d.ts +0 -9
  1145. package/dist/types/web/search/providers/parallel.d.ts +0 -15
  1146. package/dist/types/web/search/providers/perplexity.d.ts +0 -38
  1147. package/dist/types/web/search/providers/searxng.d.ts +0 -44
  1148. package/dist/types/web/search/providers/synthetic.d.ts +0 -21
  1149. package/dist/types/web/search/providers/tavily.d.ts +0 -29
  1150. package/dist/types/web/search/providers/text-citations.d.ts +0 -23
  1151. package/dist/types/web/search/providers/utils.d.ts +0 -88
  1152. package/dist/types/web/search/providers/xai.d.ts +0 -64
  1153. package/dist/types/web/search/providers/zai.d.ts +0 -28
  1154. package/dist/types/web/search/render.d.ts +0 -36
  1155. package/dist/types/web/search/types.d.ts +0 -372
  1156. package/dist/types/web/search/utils.d.ts +0 -4
  1157. package/dist/types/workflow/workflow-intent-diff.d.ts +0 -25
  1158. package/dist/types/workflow/workflow-intent-report-consumer.d.ts +0 -50
  1159. package/dist/types/workflow/workflow-intent-report-schema.d.ts +0 -2
  1160. package/dist/types/workflow/workflow-intent-report.d.ts +0 -48
  1161. package/dist/types/workspace-tree.d.ts +0 -42
@@ -10,6 +10,8 @@ import {
10
10
  type CloseSessionRequest,
11
11
  type CloseSessionResponse,
12
12
  type CreateElicitationResponse,
13
+ type DeleteSessionRequest,
14
+ type DeleteSessionResponse,
13
15
  type ElicitationContentValue,
14
16
  type ElicitationPropertySchema,
15
17
  type ForkSessionRequest,
@@ -30,14 +32,11 @@ import {
30
32
  type ResumeSessionResponse,
31
33
  type SessionConfigOption,
32
34
  type SessionInfo,
33
- type SessionModelState,
34
35
  type SessionModeState,
35
36
  type SessionNotification,
36
37
  type SessionUpdate,
37
38
  type SetSessionConfigOptionRequest,
38
39
  type SetSessionConfigOptionResponse,
39
- type SetSessionModelRequest,
40
- type SetSessionModelResponse,
41
40
  type SetSessionModeRequest,
42
41
  type SetSessionModeResponse,
43
42
  type Usage,
@@ -66,11 +65,19 @@ import { MCPManager } from "../../runtime-mcp/manager";
66
65
  import type { MCPServerConfig } from "../../runtime-mcp/types";
67
66
  import type { AgentSession, AgentSessionEvent } from "../../session/agent-session";
68
67
  import { isSilentAbort, SKILL_PROMPT_MESSAGE_TYPE } from "../../session/messages";
68
+ import { isLegacyProviderSafetyStopMessage } from "../../session/provider-safety-stop";
69
69
  import {
70
70
  SessionManager,
71
71
  type SessionInfo as StoredSessionInfo,
72
+ type StrictInventoryCandidate,
72
73
  type UsageStatistics,
73
74
  } from "../../session/session-manager";
75
+ import {
76
+ FileSessionStorage,
77
+ type SessionStorageFileIdentity,
78
+ type VerifiedSessionDeleteResult,
79
+ type VerifiedSessionDeleteTarget,
80
+ } from "../../session/session-storage";
74
81
  import { ACP_BUILTIN_SLASH_COMMANDS, executeAcpBuiltinSlashCommand } from "../../slash-commands/acp-builtins";
75
82
  import { parseThinkingLevel } from "../../thinking";
76
83
  import { toAgentWireEventPayload } from "../shared/agent-wire/event-envelope";
@@ -90,6 +97,36 @@ const MODEL_CONFIG_ID = "model";
90
97
  const THINKING_CONFIG_ID = "thinking";
91
98
  const THINKING_OFF = "off";
92
99
  const SESSION_PAGE_SIZE = 50;
100
+
101
+ /**
102
+ * One immutable authorization snapshot built from a complete strict scoped inventory.
103
+ * `entries` maps every discovered session id to either the single exact-identity
104
+ * candidate (authoritative) or a conflict tombstone (duplicate/unsafe). The snapshot
105
+ * is built once, before pagination, so a duplicate beyond page 1 is known before the
106
+ * first page response. Lifecycle changes bump {@link #authorityGeneration} and
107
+ * invalidate the snapshot.
108
+ */
109
+ type AcpAuthorityEntry =
110
+ | { kind: "candidate"; candidate: StrictInventoryCandidate }
111
+ | { kind: "conflict"; reason: string };
112
+ /**
113
+ * Phase-aware same-connection retry evidence for an incomplete verified delete.
114
+ * The transcript identity is always recorded and re-verified on retry; the
115
+ * artifacts identity is recorded only when the failure occurred at the
116
+ * artifacts phase (the artifact directory still existed at failure time).
117
+ */
118
+ type PendingDeleteEvidence = {
119
+ transcriptIdentity: SessionStorageFileIdentity;
120
+ artifactsIdentity?: SessionStorageFileIdentity;
121
+ };
122
+
123
+ type AcpAuthoritySnapshot = {
124
+ scope: string;
125
+ entries: Map<string, AcpAuthorityEntry>;
126
+ /** Ordered unique session ids (conflicts appear once at first sight) for paging. */
127
+ orderedIds: string[];
128
+ generation: number;
129
+ };
93
130
  /**
94
131
  * Delay between `session/new` (or `session/load` / `session/resume` /
95
132
  * `unstable_session/fork`) returning and the agent firing the first
@@ -143,6 +180,28 @@ function isPromptTurnInFlight(turn: PromptTurnState | undefined): turn is Prompt
143
180
  return turn !== undefined && (!turn.settled || turn.cleanup !== undefined);
144
181
  }
145
182
 
183
+ /**
184
+ * Per-record terminal state machine for session deletion.
185
+ * - `active`: normal operation; all lifecycle methods allowed.
186
+ * - `deleting`: a terminal delete has reserved the record; prompt/config/close/
187
+ * load/resume/fork reject, concurrent deletes join the terminal promise.
188
+ * - `pre_dispatch_retryable`: close_failed_retryable before verified-delete
189
+ * dispatch; normal ops rejected but a subsequent delete may retry.
190
+ * - `cleanup_pending`: verified delete returned cleanup_pending with identity
191
+ * evidence; normal ops rejected but a subsequent delete may retry.
192
+ * - `terminal_failure`: close_unknown or quiescence failure (or any unexpected
193
+ * failure); normal ops rejected and delete NEVER reopens — subsequent deletes
194
+ * share the settled terminal failure error.
195
+ * - `deleted`: verified delete succeeded; record removed from the active map.
196
+ */
197
+ type AcpSessionTerminalState =
198
+ | "active"
199
+ | "deleting"
200
+ | "pre_dispatch_retryable"
201
+ | "cleanup_pending"
202
+ | "terminal_failure"
203
+ | "deleted";
204
+
146
205
  type ManagedSessionRecord = {
147
206
  session: AgentSession;
148
207
  mcpManager: MCPManager | undefined;
@@ -152,9 +211,20 @@ type ManagedSessionRecord = {
152
211
  liveMessageProgress: { textEmitted: boolean; thoughtEmitted: boolean } | undefined;
153
212
  toolArgsById: Map<string, unknown>;
154
213
  extensionsConfigured: boolean;
155
- // Installed inside `#scheduleBootstrapUpdates` (post-race-guard); released
156
- // in `#disposeSessionRecord`. Lives independent of any prompt turn.
214
+ // Installed after the bootstrap race guard or eagerly when the client starts a prompt;
215
+ // released in `#disposeSessionRecord`. Lives independent of any prompt turn.
157
216
  lifetimeUnsubscribe: (() => void) | undefined;
217
+ // Per-record terminal state machine (see AcpSessionTerminalState). After ANY
218
+ // delete failure the record stays non-`active` so prompt/config/close/load/
219
+ // resume/fork remain rejected. Only `pre_dispatch_retryable` and
220
+ // `cleanup_pending` permit a retry delete; `terminal_failure` never reopens.
221
+ terminalState: AcpSessionTerminalState;
222
+ // The settled terminal failure error, shared with subsequent delete callers
223
+ // so a terminal_failure is observable without re-running the terminal op.
224
+ terminalFailure: Error | undefined;
225
+ // Resolves when an in-progress terminal delete settles. Concurrent delete
226
+ // callers and abort/shutdown join this promise.
227
+ terminalPromise: Promise<DeleteSessionResponse> | undefined;
158
228
  };
159
229
 
160
230
  type ReplayableMessage = {
@@ -276,10 +346,24 @@ async function elicitFromAcpClient(
276
346
  finish(undefined);
277
347
  });
278
348
  const response = await promise;
279
- if (response?.action !== "accept" || !response.content) {
349
+ if (
350
+ response?.action !== "accept" ||
351
+ typeof response.content !== "object" ||
352
+ response.content === null ||
353
+ !("value" in response.content)
354
+ ) {
280
355
  return undefined;
281
356
  }
282
- return response.content.value;
357
+ const value = response.content.value;
358
+ if (
359
+ typeof value === "string" ||
360
+ typeof value === "number" ||
361
+ typeof value === "boolean" ||
362
+ (Array.isArray(value) && value.every(item => typeof item === "string"))
363
+ ) {
364
+ return value;
365
+ }
366
+ return undefined;
283
367
  }
284
368
 
285
369
  /**
@@ -381,6 +465,23 @@ export class AcpAgent implements Agent {
381
465
  #cleanupRegistered = false;
382
466
  #clientCapabilities: ClientCapabilities | undefined;
383
467
  #cancelCleanupTimeoutMs = ACP_CANCEL_CLEANUP_TIMEOUT_MS;
468
+ /** Immutable canonical cwd locked by the first successful explicit-cwd lifecycle/list call. */
469
+ #canonicalCwdScope: string | undefined;
470
+ /** Authority snapshot from the last complete strict scoped inventory. Invalidation bumps this. */
471
+ #authorityGeneration = 0;
472
+ #authoritySnapshot: AcpAuthoritySnapshot | undefined;
473
+ /**
474
+ * Same-connection retry evidence for an incomplete verified delete. Keyed by
475
+ * session id. Phase-aware: every cleanup_pending carries the transcript
476
+ * identity at failure time, which is re-verified against the fresh candidate
477
+ * on retry so a replaced transcript cannot authorize a replacement; the
478
+ * artifacts-phase result additionally carries the artifact directory
479
+ * identity to re-accept. Cleared once a delete reaches `kind: "deleted"`.
480
+ */
481
+ #pendingDeleteEvidence = new Map<string, PendingDeleteEvidence>();
482
+ #shutdownPromise: Promise<void> | undefined;
483
+ #lifecycleOperations = new Set<Promise<unknown>>();
484
+ #shuttingDown = false;
384
485
 
385
486
  constructor(connection: AgentSideConnection, createSession: CreateAcpSession, initialSession?: AgentSession) {
386
487
  this.#connection = connection;
@@ -434,6 +535,7 @@ export class AcpAgent implements Agent {
434
535
  fork: {},
435
536
  resume: {},
436
537
  close: {},
538
+ delete: {},
437
539
  },
438
540
  },
439
541
  };
@@ -452,12 +554,17 @@ export class AcpAgent implements Agent {
452
554
  }
453
555
 
454
556
  async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {
455
- this.#assertAbsoluteCwd(params.cwd);
456
- const record = await this.#createNewSessionRecord(params.cwd, params.mcpServers);
557
+ this.#rejectIfShuttingDown();
558
+ // Stage scope before the lifecycle op; commit only after it succeeds so a
559
+ // failed first call does not pin the connection to a cwd it never served.
560
+ const canonical = this.#stageCanonicalScope(params.cwd);
561
+ const record = await this.#trackLifecycle(() => this.#createNewSessionRecord(params.cwd, params.mcpServers));
562
+ this.#rejectIfShuttingDown();
563
+ this.#commitCanonicalScope(canonical);
564
+ this.#invalidateAuthority();
457
565
  const response: NewSessionResponse = {
458
566
  sessionId: record.session.sessionId,
459
567
  configOptions: this.#buildConfigOptions(record.session),
460
- models: this.#buildModelState(record.session),
461
568
  modes: this.#buildModeState(record.session),
462
569
  };
463
570
  this.#scheduleBootstrapUpdates(record.session.sessionId);
@@ -465,41 +572,103 @@ export class AcpAgent implements Agent {
465
572
  }
466
573
 
467
574
  async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {
468
- this.#assertAbsoluteCwd(params.cwd);
469
- const record = await this.#loadManagedSession(params.sessionId, params.cwd, params.mcpServers);
470
- await this.#replaySessionHistory(record);
471
- const response: LoadSessionResponse = {
472
- configOptions: this.#buildConfigOptions(record.session),
473
- models: this.#buildModelState(record.session),
474
- modes: this.#buildModeState(record.session),
475
- };
476
- this.#scheduleBootstrapUpdates(record.session.sessionId);
477
- return response;
575
+ this.#rejectIfShuttingDown();
576
+ const canonical = this.#stageCanonicalScope(params.cwd);
577
+ const existingRecord = this.#sessions.get(params.sessionId);
578
+ const record = await this.#trackLifecycle(() =>
579
+ this.#loadManagedSession(params.sessionId, params.cwd, params.mcpServers),
580
+ );
581
+ try {
582
+ this.#rejectIfShuttingDown();
583
+ await this.#replaySessionHistory(record);
584
+ this.#rejectIfShuttingDown();
585
+ // Construct every fallible response/bootstrap value inside the
586
+ // transaction so a build/schedule failure rolls back the prepared
587
+ // record and never pins the connection.
588
+ const response: LoadSessionResponse = {
589
+ configOptions: this.#buildConfigOptions(record.session),
590
+ modes: this.#buildModeState(record.session),
591
+ };
592
+ this.#scheduleBootstrapUpdates(record.session.sessionId);
593
+ // Commit the cwd scope only after replay, response construction, and
594
+ // bootstrap scheduling all succeed — a failed first load leaves no
595
+ // half-loaded session and does not pin the connection.
596
+ this.#commitCanonicalScope(canonical);
597
+ this.#invalidateAuthority();
598
+ return response;
599
+ } catch (error) {
600
+ // Any pre-return failure: roll back the prepared record so a failed
601
+ // first load leaves no half-loaded session and does not pin the
602
+ // connection, and commit no cwd scope.
603
+ if (record !== existingRecord) {
604
+ this.#sessions.delete(record.session.sessionId);
605
+ await this.#disposeSessionRecord(record);
606
+ }
607
+ throw error;
608
+ }
478
609
  }
479
610
 
480
611
  async listSessions(params: ListSessionsRequest): Promise<ListSessionsResponse> {
481
- if (params.cwd) {
482
- this.#assertAbsoluteCwd(params.cwd);
483
- }
612
+ this.#rejectIfShuttingDown();
613
+ const scope = params.cwd ? this.#stageCanonicalScope(params.cwd) : undefined;
484
614
  for (const record of this.#sessions.values()) {
485
615
  await record.session.sessionManager.flush();
486
616
  }
487
- const sessions = await this.#listStoredSessions(params.cwd ?? undefined);
488
- const offset = this.#parseCursor(params.cursor ?? undefined);
489
- const paged = sessions.slice(offset, offset + SESSION_PAGE_SIZE);
490
- const nextOffset = offset + paged.length;
491
- return {
492
- sessions: paged.map(session => this.#toSessionInfo(session)),
493
- nextCursor: nextOffset < sessions.length ? String(nextOffset) : undefined,
617
+ this.#rejectIfShuttingDown();
618
+ // Cwd-less / global listing stays display-only and non-authorizing.
619
+ if (!scope) {
620
+ const sessions = await this.#listStoredSessions(undefined);
621
+ const offset = this.#parseCursor(params.cursor ?? undefined);
622
+ const paged = sessions.slice(offset, offset + SESSION_PAGE_SIZE);
623
+ const nextOffset = offset + paged.length;
624
+ return {
625
+ sessions: paged.map(session => this.#toSessionInfo(session)),
626
+ nextCursor: nextOffset < sessions.length ? String(nextOffset) : undefined,
627
+ };
628
+ }
629
+ // Explicit scoped list: stage scope, strict raw inventory, build the full
630
+ // authorization/conflict snapshot BEFORE page slicing so duplicate ids
631
+ // beyond page 1 are known before the first page response. Scope commits
632
+ // only after cursor validation, stored-session read, and full response
633
+ // construction succeed — a failed first list never pins the connection.
634
+ if (params.cursor === undefined) {
635
+ // A new first-page request is a new issuance event. Refresh the complete
636
+ // snapshot and invalidate cursors minted by the previous issuance.
637
+ this.#invalidateAuthority();
638
+ }
639
+ const snapshot = this.#buildAuthoritySnapshot(scope);
640
+ // Scoped cursors carry the authority generation at which they were minted
641
+ // (form `${generation}:${offset}`). A lifecycle change between page 1 and
642
+ // page 2 bumps the generation, so the old cursor is rejected instead of
643
+ // silently rebuilding at the new generation. The cwd-less display cursor
644
+ // stays a plain offset (see #parseCursor).
645
+ const offset = this.#parseScopedCursor(params.cursor ?? undefined, snapshot.generation);
646
+ const stored = await this.#listStoredSessions(scope);
647
+ const storedById = new Map(stored.map(s => [s.id, s] as const));
648
+ const pageIds = snapshot.orderedIds.slice(offset, offset + SESSION_PAGE_SIZE);
649
+ const nextOffset = offset + pageIds.length;
650
+ const pageSessions = pageIds.map(id => storedById.get(id)).filter((s): s is StoredSessionInfo => s !== undefined);
651
+ const response: ListSessionsResponse = {
652
+ sessions: pageSessions.map(session => this.#toSessionInfo(session)),
653
+ nextCursor: nextOffset < snapshot.orderedIds.length ? `${snapshot.generation}:${nextOffset}` : undefined,
494
654
  };
655
+ // Commit the scope only after cursor validation, stored-session read, and
656
+ // full response construction succeed.
657
+ this.#commitCanonicalScope(scope);
658
+ return response;
495
659
  }
496
660
 
497
661
  async resumeSession(params: ResumeSessionRequest): Promise<ResumeSessionResponse> {
498
- this.#assertAbsoluteCwd(params.cwd);
499
- const record = await this.#resumeManagedSession(params.sessionId, params.cwd, params.mcpServers ?? []);
662
+ this.#rejectIfShuttingDown();
663
+ const canonical = this.#stageCanonicalScope(params.cwd);
664
+ const record = await this.#trackLifecycle(() =>
665
+ this.#resumeManagedSession(params.sessionId, params.cwd, params.mcpServers ?? []),
666
+ );
667
+ this.#rejectIfShuttingDown();
668
+ this.#commitCanonicalScope(canonical);
669
+ this.#invalidateAuthority();
500
670
  const response: ResumeSessionResponse = {
501
671
  configOptions: this.#buildConfigOptions(record.session),
502
- models: this.#buildModelState(record.session),
503
672
  modes: this.#buildModeState(record.session),
504
673
  };
505
674
  this.#scheduleBootstrapUpdates(record.session.sessionId);
@@ -507,12 +676,15 @@ export class AcpAgent implements Agent {
507
676
  }
508
677
 
509
678
  async unstable_forkSession(params: ForkSessionRequest): Promise<ForkSessionResponse> {
510
- this.#assertAbsoluteCwd(params.cwd);
511
- const record = await this.#forkManagedSession(params);
679
+ this.#rejectIfShuttingDown();
680
+ const canonical = this.#stageCanonicalScope(params.cwd);
681
+ const record = await this.#trackLifecycle(() => this.#forkManagedSession(params));
682
+ this.#rejectIfShuttingDown();
683
+ this.#commitCanonicalScope(canonical);
684
+ this.#invalidateAuthority();
512
685
  const response: ForkSessionResponse = {
513
686
  sessionId: record.session.sessionId,
514
687
  configOptions: this.#buildConfigOptions(record.session),
515
- models: this.#buildModelState(record.session),
516
688
  modes: this.#buildModeState(record.session),
517
689
  };
518
690
  this.#scheduleBootstrapUpdates(record.session.sessionId);
@@ -524,12 +696,42 @@ export class AcpAgent implements Agent {
524
696
  if (!record) {
525
697
  return {};
526
698
  }
699
+ this.#rejectIfTerminal(record);
527
700
  await this.#closeManagedSession(params.sessionId, record);
701
+ this.#invalidateAuthority();
528
702
  return {};
529
703
  }
530
704
 
705
+ /**
706
+ * Hard delete an ACP session. `DeleteSessionRequest` carries only `sessionId`;
707
+ * the server owns authorization through the immutable canonical cwd scope and
708
+ * the complete strict scoped inventory snapshot.
709
+ *
710
+ * - No scope / unknown / already-deleted id → lookup-free `{}`.
711
+ * - Duplicate/conflict id → visible error; neither transcript nor artifacts change.
712
+ * - Active session → reserve `deleting`, drain/cancel prompt, flush, strict
713
+ * dispose/close, recheck identity/state, then verified artifact-first deletion.
714
+ * - Concurrent delete callers join the terminal promise.
715
+ */
716
+ async deleteSession(params: DeleteSessionRequest): Promise<DeleteSessionResponse> {
717
+ // Before scope: return {} without scanning/listing storage.
718
+ if (this.#canonicalCwdScope === undefined) {
719
+ return {};
720
+ }
721
+ if (this.#shuttingDown) {
722
+ throw new Error("ACP session delete is unavailable during shutdown");
723
+ }
724
+ const record = this.#sessions.get(params.sessionId);
725
+ if (record) {
726
+ return await this.#deleteActiveSession(params.sessionId, record);
727
+ }
728
+ // Inactive: read authority from the strict inventory snapshot.
729
+ return await this.#deleteInactiveSession(params.sessionId);
730
+ }
731
+
531
732
  async setSessionMode(params: SetSessionModeRequest): Promise<SetSessionModeResponse> {
532
733
  const record = this.#getSessionRecord(params.sessionId);
734
+ this.#rejectIfTerminal(record);
533
735
  this.#applyModeChange(record.session, params.modeId);
534
736
  await this.#connection.sessionUpdate({
535
737
  sessionId: record.session.sessionId,
@@ -541,6 +743,7 @@ export class AcpAgent implements Agent {
541
743
 
542
744
  async setSessionConfigOption(params: SetSessionConfigOptionRequest): Promise<SetSessionConfigOptionResponse> {
543
745
  const record = this.#getSessionRecord(params.sessionId);
746
+ this.#rejectIfTerminal(record);
544
747
  if (typeof params.value === "boolean") {
545
748
  throw new Error(`Unsupported boolean ACP config option: ${params.configId}`);
546
749
  }
@@ -580,15 +783,9 @@ export class AcpAgent implements Agent {
580
783
  return { configOptions: this.#buildConfigOptions(record.session) };
581
784
  }
582
785
 
583
- async unstable_setSessionModel(params: SetSessionModelRequest): Promise<SetSessionModelResponse> {
584
- const record = this.#getSessionRecord(params.sessionId);
585
- await this.#setModelById(record.session, params.modelId);
586
- await this.#pushConfigOptionUpdate(record);
587
- return {};
588
- }
589
-
590
786
  async prompt(params: PromptRequest): Promise<PromptResponse> {
591
787
  const record = this.#getSessionRecord(params.sessionId);
788
+ this.#rejectIfTerminal(record);
592
789
  const activeTurn = record.promptTurn;
593
790
  if (activeTurn && !activeTurn.settled && record.session.isStreaming) {
594
791
  throw new Error("ACP prompt already in progress for this session");
@@ -607,8 +804,9 @@ export class AcpAgent implements Agent {
607
804
 
608
805
  const converted = this.#convertPromptBlocks(params.prompt);
609
806
  const pendingPrompt = Promise.withResolvers<PromptResponse>();
807
+ const metaUserMessageId = params._meta?.userMessageId;
610
808
  record.promptTurn = {
611
- userMessageId: params.messageId ?? crypto.randomUUID(),
809
+ userMessageId: typeof metaUserMessageId === "string" ? metaUserMessageId : crypto.randomUUID(),
612
810
  cancelRequested: false,
613
811
  settled: false,
614
812
  cleanup: undefined,
@@ -619,6 +817,7 @@ export class AcpAgent implements Agent {
619
817
  promise: pendingPrompt.promise,
620
818
  };
621
819
 
820
+ this.#ensureLifetimeSubscription(record);
622
821
  record.promptTurn.unsubscribe = record.session.subscribe(event => {
623
822
  void this.#handlePromptEvent(record, event);
624
823
  });
@@ -693,7 +892,7 @@ export class AcpAgent implements Agent {
693
892
  this.#cloneUsageStatistics(record.session.sessionManager.getUsageStatistics()),
694
893
  record.session.sessionManager.getUsageStatistics(),
695
894
  ),
696
- userMessageId: promptTurn?.userMessageId,
895
+ _meta: promptTurn ? { userMessageId: promptTurn.userMessageId } : undefined,
697
896
  });
698
897
  return;
699
898
  }
@@ -813,6 +1012,11 @@ export class AcpAgent implements Agent {
813
1012
  try {
814
1013
  await cleanup;
815
1014
  } catch (error: unknown) {
1015
+ // A terminal delete owns the record; let the delete handle the failure
1016
+ // rather than racing it with an independent close.
1017
+ if (record.terminalState !== "active") {
1018
+ return;
1019
+ }
816
1020
  logger.warn("ACP cancel cleanup timed out; closing session", { sessionId: record.session.sessionId, error });
817
1021
  await this.#closeManagedSession(record.session.sessionId, record);
818
1022
  }
@@ -831,12 +1035,13 @@ export class AcpAgent implements Agent {
831
1035
  }
832
1036
  promptTurn.cancelRequested = true;
833
1037
  promptTurn.unsubscribe?.();
1038
+ void this.#emitCancelledPromptIdleUpdate(record);
834
1039
  const cleanup = this.#runCancelCleanup(record, promptTurn);
835
1040
  promptTurn.cleanup = cleanup;
836
1041
  this.#finishPrompt(record, {
837
1042
  stopReason: "cancelled",
838
1043
  usage: this.#buildTurnUsage(promptTurn.usageBaseline, record.session.sessionManager.getUsageStatistics()),
839
- userMessageId: promptTurn.userMessageId,
1044
+ _meta: { userMessageId: promptTurn.userMessageId },
840
1045
  });
841
1046
  return cleanup;
842
1047
  }
@@ -955,12 +1160,49 @@ export class AcpAgent implements Agent {
955
1160
  this.#connection.signal.addEventListener(
956
1161
  "abort",
957
1162
  () => {
958
- void this.#disposeAllSessions();
1163
+ this.#shuttingDown = true;
1164
+ // Mark shutdown under mutex (no actual mutex needed — single-threaded),
1165
+ // reject new scope/inventory/lifecycle work, then await terminal work.
1166
+ this.#shutdownPromise = (async () => {
1167
+ // Join lifecycle preparation that has not registered yet. Each tracked
1168
+ // operation rechecks shutdown and disposes its prepared session before settling.
1169
+ await Promise.allSettled(Array.from(this.#lifecycleOperations));
1170
+ const terminalPromises = Array.from(this.#sessions.values())
1171
+ .map(r => r.terminalPromise)
1172
+ .filter((p): p is Promise<DeleteSessionResponse> => p !== undefined);
1173
+ await Promise.allSettled(terminalPromises);
1174
+ await this.#disposeAllSessions();
1175
+ // Clear connection-local authority.
1176
+ this.#authoritySnapshot = undefined;
1177
+ this.#canonicalCwdScope = undefined;
1178
+ })();
959
1179
  },
960
1180
  { once: true },
961
1181
  );
962
1182
  }
963
1183
 
1184
+ /**
1185
+ * Connection-local shutdown promise. Resolves once all terminal work (dispose,
1186
+ * active deletes, abort cleanup) has settled. `acp-mode.ts` awaits this after
1187
+ * transport closure so `process.exit` never kills in-flight deletion/disposal.
1188
+ */
1189
+ get shutdownPromise(): Promise<void> {
1190
+ return this.#shutdownPromise ?? Promise.resolve();
1191
+ }
1192
+
1193
+ async #trackLifecycle<T>(operation: () => Promise<T>): Promise<T> {
1194
+ this.#rejectIfShuttingDown();
1195
+ const start = Promise.withResolvers<void>();
1196
+ const promise = start.promise.then(operation);
1197
+ this.#lifecycleOperations.add(promise);
1198
+ start.resolve();
1199
+ try {
1200
+ return await promise;
1201
+ } finally {
1202
+ this.#lifecycleOperations.delete(promise);
1203
+ }
1204
+ }
1205
+
964
1206
  async #createNewSessionRecord(cwd: string, mcpServers: McpServer[]): Promise<ManagedSessionRecord> {
965
1207
  const session = await this.#createSession(path.resolve(cwd));
966
1208
  try {
@@ -975,31 +1217,45 @@ export class AcpAgent implements Agent {
975
1217
  async #loadManagedSession(sessionId: string, cwd: string, mcpServers: McpServer[]): Promise<ManagedSessionRecord> {
976
1218
  const existing = this.#sessions.get(sessionId);
977
1219
  if (existing) {
1220
+ this.#rejectIfTerminal(existing);
978
1221
  this.#assertMatchingCwd(existing.session, cwd);
979
1222
  await this.#configureMcpServers(existing, mcpServers);
980
1223
  return existing;
981
1224
  }
982
1225
 
983
- const storedSession = await this.#findStoredSession(sessionId, cwd);
984
- if (!storedSession) {
985
- throw new Error(`ACP session not found: ${sessionId}`);
986
- }
987
- return await this.#openStoredSession(storedSession.path, cwd, mcpServers, sessionId);
1226
+ const candidate = this.#resolveStrictLifecycleCandidate(sessionId, cwd);
1227
+ return await this.#openStoredSession(candidate, cwd, mcpServers, sessionId);
988
1228
  }
989
1229
 
990
1230
  async #resumeManagedSession(sessionId: string, cwd: string, mcpServers: McpServer[]): Promise<ManagedSessionRecord> {
991
1231
  const existing = this.#sessions.get(sessionId);
992
1232
  if (existing) {
1233
+ this.#rejectIfTerminal(existing);
993
1234
  this.#assertMatchingCwd(existing.session, cwd);
994
1235
  await this.#configureMcpServers(existing, mcpServers);
995
1236
  return existing;
996
1237
  }
997
1238
 
998
- const storedSession = await this.#findStoredSession(sessionId, cwd);
999
- if (!storedSession) {
1239
+ const candidate = this.#resolveStrictLifecycleCandidate(sessionId, cwd);
1240
+ return await this.#openStoredSession(candidate, cwd, mcpServers, sessionId);
1241
+ }
1242
+
1243
+ /**
1244
+ * Resolve a single exact-one scoped candidate via a fresh strict inventory.
1245
+ * Rejects duplicates and inventory failures — never falls back to a forgiving
1246
+ * first-match lookup. Used by load/resume so authoritative lifecycle paths bind
1247
+ * exact identity before opening a stored session.
1248
+ */
1249
+ #resolveStrictLifecycleCandidate(sessionId: string, scope: string): StrictInventoryCandidate {
1250
+ const snapshot = this.#buildFreshAuthoritySnapshot(scope);
1251
+ const entry = snapshot.entries.get(sessionId);
1252
+ if (!entry) {
1000
1253
  throw new Error(`ACP session not found: ${sessionId}`);
1001
1254
  }
1002
- return await this.#openStoredSession(storedSession.path, cwd, mcpServers, sessionId);
1255
+ if (entry.kind !== "candidate") {
1256
+ throw new Error(`ACP session ${sessionId} load failed: ${entry.reason}`);
1257
+ }
1258
+ return entry.candidate;
1003
1259
  }
1004
1260
 
1005
1261
  async #forkManagedSession(params: ForkSessionRequest): Promise<ManagedSessionRecord> {
@@ -1022,14 +1278,23 @@ export class AcpAgent implements Agent {
1022
1278
  }
1023
1279
 
1024
1280
  async #openStoredSession(
1025
- sessionPath: string,
1281
+ issued: StrictInventoryCandidate,
1026
1282
  cwd: string,
1027
1283
  mcpServers: McpServer[],
1028
1284
  sessionId: string,
1029
1285
  ): Promise<ManagedSessionRecord> {
1030
1286
  const session = await this.#createSession(path.resolve(cwd));
1031
1287
  try {
1032
- const success = await session.switchSession(sessionPath);
1288
+ const current = this.#resolveStrictLifecycleCandidate(sessionId, cwd);
1289
+ if (
1290
+ current.path !== issued.path ||
1291
+ current.cwd !== issued.cwd ||
1292
+ current.identity.dev !== issued.identity.dev ||
1293
+ current.identity.ino !== issued.identity.ino
1294
+ ) {
1295
+ throw new Error(`ACP session ${sessionId} changed while opening`);
1296
+ }
1297
+ const success = await session.switchSession(current.path);
1033
1298
  if (!success) {
1034
1299
  throw new Error(`ACP session load was cancelled: ${sessionId}`);
1035
1300
  }
@@ -1043,11 +1308,15 @@ export class AcpAgent implements Agent {
1043
1308
  async #registerPreparedSession(session: AgentSession, mcpServers: McpServer[]): Promise<ManagedSessionRecord> {
1044
1309
  const record = this.#createManagedSessionRecord(session);
1045
1310
  session.setClientBridge(createAcpClientBridge(this.#connection, session.sessionId, this.#clientCapabilities));
1046
- // `record.lifetimeUnsubscribe` is installed in `#scheduleBootstrapUpdates`
1047
- // so it shares the bootstrap race guard — see that comment for why.
1311
+ // The lifetime subscription normally follows the bootstrap race guard, but
1312
+ // prompt() installs it eagerly once the client has demonstrated session ownership.
1048
1313
  try {
1049
1314
  await this.#configureExtensions(record);
1050
1315
  await this.#configureMcpServers(record, mcpServers);
1316
+ if (this.#shuttingDown) {
1317
+ await this.#disposeSessionRecord(record);
1318
+ throw new Error("ACP session lifecycle is unavailable during shutdown");
1319
+ }
1051
1320
  this.#sessions.set(session.sessionId, record);
1052
1321
  return record;
1053
1322
  } catch (error) {
@@ -1067,10 +1336,44 @@ export class AcpAgent implements Agent {
1067
1336
  toolArgsById: new Map(),
1068
1337
  extensionsConfigured: false,
1069
1338
  lifetimeUnsubscribe: undefined,
1339
+ terminalState: "active",
1340
+ terminalFailure: undefined,
1341
+ terminalPromise: undefined,
1070
1342
  };
1071
1343
  }
1072
1344
 
1345
+ #ensureLifetimeSubscription(record: ManagedSessionRecord): void {
1346
+ if (record.lifetimeUnsubscribe) {
1347
+ return;
1348
+ }
1349
+ record.lifetimeUnsubscribe = record.session.subscribe(event => {
1350
+ void this.#handleLifetimeEvent(record, event);
1351
+ });
1352
+ }
1353
+
1073
1354
  async #handleLifetimeEvent(record: ManagedSessionRecord, event: AgentSessionEvent): Promise<void> {
1355
+ if (event.type === "auto_compaction_start" || event.type === "auto_compaction_end") {
1356
+ // Prompt-bound compaction is normally forwarded by #handlePromptEvent. The lifetime
1357
+ // subscription covers idle maintenance and the end event after prompt cancellation.
1358
+ const promptTurn = record.promptTurn;
1359
+ if (
1360
+ isPromptTurnInFlight(promptTurn) &&
1361
+ (!promptTurn.cancelRequested || event.type === "auto_compaction_start")
1362
+ ) {
1363
+ return;
1364
+ }
1365
+ for (const notification of mapAgentWireEventPayloadToAcpSessionUpdates(
1366
+ toAgentWireEventPayload(event),
1367
+ record.session.sessionId,
1368
+ {
1369
+ cwd: record.session.sessionManager.getCwd(),
1370
+ compactionEndPhase: "idle",
1371
+ },
1372
+ )) {
1373
+ await this.#connection.sessionUpdate(notification);
1374
+ }
1375
+ return;
1376
+ }
1074
1377
  if (event.type !== "thinking_level_changed") {
1075
1378
  return;
1076
1379
  }
@@ -1103,6 +1406,9 @@ export class AcpAgent implements Agent {
1103
1406
  async #resolveForkSourceSessionPath(sessionId: string): Promise<string> {
1104
1407
  const loaded = this.#sessions.get(sessionId);
1105
1408
  if (loaded) {
1409
+ if (loaded.terminalState !== "active") {
1410
+ throw new Error(`ACP session fork is unavailable while it is in terminal state: ${sessionId}`);
1411
+ }
1106
1412
  if (isPromptTurnInFlight(loaded.promptTurn)) {
1107
1413
  throw new Error(`ACP session fork is unavailable while a prompt is in progress: ${sessionId}`);
1108
1414
  }
@@ -1114,11 +1420,21 @@ export class AcpAgent implements Agent {
1114
1420
  return sessionPath;
1115
1421
  }
1116
1422
 
1117
- const storedSession = await this.#findStoredSessionById(sessionId);
1118
- if (!storedSession) {
1423
+ // Inactive fork source: exact-one scoped lookup only. Never use global
1424
+ // listAll/first-match — that was the P1 data-loss path.
1425
+ const scope = this.#canonicalCwdScope;
1426
+ if (!scope) {
1427
+ throw new Error(`ACP session not found (no scope established): ${sessionId}`);
1428
+ }
1429
+ const snapshot = this.#buildFreshAuthoritySnapshot(scope);
1430
+ const entry = snapshot.entries.get(sessionId);
1431
+ if (!entry) {
1119
1432
  throw new Error(`ACP session not found: ${sessionId}`);
1120
1433
  }
1121
- return storedSession.path;
1434
+ if (entry.kind !== "candidate") {
1435
+ throw new Error(`ACP session fork failed: ${entry.reason}`);
1436
+ }
1437
+ return entry.candidate.path;
1122
1438
  }
1123
1439
 
1124
1440
  async #handlePromptEvent(record: ManagedSessionRecord, event: AgentSessionEvent): Promise<void> {
@@ -1140,6 +1456,7 @@ export class AcpAgent implements Agent {
1140
1456
  getMessageProgress: message => this.#getLiveMessageProgress(record, message),
1141
1457
  getToolArgs: toolCallId => record.toolArgsById.get(toolCallId),
1142
1458
  cwd: record.session.sessionManager.getCwd(),
1459
+ compactionEndPhase: "responding",
1143
1460
  },
1144
1461
  )) {
1145
1462
  await this.#connection.sessionUpdate(notification);
@@ -1155,7 +1472,7 @@ export class AcpAgent implements Agent {
1155
1472
  this.#finishPrompt(record, {
1156
1473
  stopReason: this.#resolveStopReason(event, promptTurn.cancelRequested),
1157
1474
  usage: this.#buildTurnUsage(promptTurn.usageBaseline, record.session.sessionManager.getUsageStatistics()),
1158
- userMessageId: promptTurn.userMessageId,
1475
+ _meta: { userMessageId: promptTurn.userMessageId },
1159
1476
  });
1160
1477
  }
1161
1478
  }
@@ -1247,8 +1564,10 @@ export class AcpAgent implements Agent {
1247
1564
  case "length":
1248
1565
  return "max_tokens";
1249
1566
  case "error": {
1250
- const errorMessage = lastAssistant?.errorMessage ?? "";
1251
- if (/content[_ ]?filter|refus(al|ed)/i.test(errorMessage)) {
1567
+ if (lastAssistant?.errorKind === "provider_safety_stop") {
1568
+ return "refusal";
1569
+ }
1570
+ if (isLegacyProviderSafetyStopMessage(lastAssistant?.errorMessage ?? "")) {
1252
1571
  return "refusal";
1253
1572
  }
1254
1573
  return "end_turn";
@@ -1278,6 +1597,281 @@ export class AcpAgent implements Agent {
1278
1597
  }
1279
1598
  }
1280
1599
 
1600
+ /**
1601
+ * Validate the cwd and reject cross-cwd calls against an already-committed scope,
1602
+ * WITHOUT committing. Returns the canonical (resolved) cwd. Pair with
1603
+ * {@link #commitCanonicalScope} after the lifecycle operation succeeds so a failed
1604
+ * first new/load/resume/fork/list never pins the connection to a cwd it never served.
1605
+ */
1606
+ #stageCanonicalScope(cwd: string): string {
1607
+ this.#assertAbsoluteCwd(cwd);
1608
+ const canonical = path.resolve(cwd);
1609
+ if (this.#canonicalCwdScope !== undefined && this.#canonicalCwdScope !== canonical) {
1610
+ throw new Error(`ACP connection is scoped to ${this.#canonicalCwdScope}, not ${canonical}`);
1611
+ }
1612
+ return canonical;
1613
+ }
1614
+
1615
+ /** Commit the canonical cwd scope on the first successful explicit-cwd call. */
1616
+ #commitCanonicalScope(canonical: string): void {
1617
+ if (this.#canonicalCwdScope === undefined) {
1618
+ this.#canonicalCwdScope = canonical;
1619
+ }
1620
+ }
1621
+
1622
+ /** Bump the generation and discard the authority snapshot on lifecycle changes. */
1623
+ #invalidateAuthority(): void {
1624
+ this.#authorityGeneration += 1;
1625
+ this.#authoritySnapshot = undefined;
1626
+ }
1627
+
1628
+ #rejectIfTerminal(record: ManagedSessionRecord): void {
1629
+ if (record.terminalState !== "active") {
1630
+ throw new Error(`ACP session ${record.session.sessionId} is in terminal state: ${record.terminalState}`);
1631
+ }
1632
+ }
1633
+
1634
+ #rejectIfShuttingDown(): void {
1635
+ if (this.#shuttingDown) {
1636
+ throw new Error("ACP session lifecycle is unavailable during shutdown");
1637
+ }
1638
+ }
1639
+
1640
+ /**
1641
+ * Build (or reuse) the complete authorization snapshot from a strict raw scoped
1642
+ * inventory. The cached pagination snapshot is reused for display/list paging.
1643
+ * Any inventory failure throws a sanitized error — it grants zero authority.
1644
+ * The snapshot binds every discovered id to its exact-identity candidate or a
1645
+ * conflict tombstone BEFORE pagination, so duplicates beyond page 1 are known
1646
+ * before the first page response.
1647
+ */
1648
+ #buildAuthoritySnapshot(scope: string): AcpAuthoritySnapshot {
1649
+ if (this.#authoritySnapshot?.scope === scope) {
1650
+ return this.#authoritySnapshot;
1651
+ }
1652
+ return this.#rebuildAuthoritySnapshot(scope, true);
1653
+ }
1654
+
1655
+ /**
1656
+ * Build a FRESH authorization snapshot, ignoring the cached pagination snapshot.
1657
+ * Destructive authority (delete, inactive fork) must read storage at mutation
1658
+ * time so an external create/remove/replace/duplicate between list and delete
1659
+ * cannot yield a stale no-op or wrong mutation. The result is NOT cached: it
1660
+ * must not poison the generation-aware pagination cursor contract.
1661
+ */
1662
+ #buildFreshAuthoritySnapshot(scope: string): AcpAuthoritySnapshot {
1663
+ return this.#rebuildAuthoritySnapshot(scope, false);
1664
+ }
1665
+
1666
+ #rebuildAuthoritySnapshot(scope: string, cache: boolean): AcpAuthoritySnapshot {
1667
+ const inventory = SessionManager.inventorySessionsStrict(scope);
1668
+ if (inventory.kind === "failure") {
1669
+ const messages = inventory.failures.map(f => `${f.kind}: ${f.message}`);
1670
+ throw new Error(`ACP scoped session inventory is incomplete: ${messages.join("; ")}`);
1671
+ }
1672
+ const entries = new Map<string, AcpAuthorityEntry>();
1673
+ const orderedIds: string[] = [];
1674
+ for (const candidate of inventory.candidates) {
1675
+ const existing = entries.get(candidate.id);
1676
+ if (existing) {
1677
+ entries.set(candidate.id, { kind: "conflict", reason: "Duplicate session id in scoped inventory" });
1678
+ } else {
1679
+ entries.set(candidate.id, { kind: "candidate", candidate });
1680
+ orderedIds.push(candidate.id);
1681
+ }
1682
+ }
1683
+ const snapshot: AcpAuthoritySnapshot = {
1684
+ scope,
1685
+ entries,
1686
+ orderedIds,
1687
+ generation: this.#authorityGeneration,
1688
+ };
1689
+ if (cache) {
1690
+ this.#authoritySnapshot = snapshot;
1691
+ }
1692
+ return snapshot;
1693
+ }
1694
+
1695
+ /**
1696
+ * Delete an active (loaded) session via the per-record terminal state machine.
1697
+ * Reserves `deleting` before the first await; concurrent deletes join the
1698
+ * terminal promise. On failure the state transitions to `pre_dispatch_retryable`
1699
+ * (close_failed_retryable), `cleanup_pending` (verified-delete partial), or
1700
+ * `terminal_failure` (close_unknown / quiescence / unexpected) — all non-`active`
1701
+ * states reject prompt/config/close/load/resume/fork. Only `pre_dispatch_retryable`
1702
+ * and `cleanup_pending` permit a retry delete; `terminal_failure` never reopens.
1703
+ */
1704
+ async #deleteActiveSession(sessionId: string, record: ManagedSessionRecord): Promise<DeleteSessionResponse> {
1705
+ // Concurrent delete joins the in-progress terminal promise.
1706
+ if (record.terminalPromise) {
1707
+ return await record.terminalPromise;
1708
+ }
1709
+ // terminal_failure: never reopen — share the settled error.
1710
+ if (record.terminalState === "terminal_failure") {
1711
+ throw record.terminalFailure ?? new Error(`ACP session ${sessionId} has a settled terminal failure`);
1712
+ }
1713
+ // Only active / pre_dispatch_retryable / cleanup_pending may start a delete.
1714
+ if (record.terminalState === "deleting") {
1715
+ throw new Error(`ACP session ${sessionId} is being deleted`);
1716
+ }
1717
+ record.terminalState = "deleting";
1718
+ const scope = this.#canonicalCwdScope!;
1719
+ const terminalPromise = (async (): Promise<DeleteSessionResponse> => {
1720
+ try {
1721
+ // Quiesce — failure is terminal (never swallow).
1722
+ try {
1723
+ await this.#quiesceForDelete(sessionId, record);
1724
+ } catch (quiesceError) {
1725
+ record.terminalState = "terminal_failure";
1726
+ record.terminalFailure = quiesceError instanceof Error ? quiesceError : new Error(String(quiesceError));
1727
+ throw quiesceError;
1728
+ }
1729
+ const manager = record.session.sessionManager;
1730
+ // Strict close — outcome determines retryability.
1731
+ const closeOutcome = await record.session.closeWriterStrict();
1732
+ if (closeOutcome.kind !== "closed") {
1733
+ if (closeOutcome.kind === "close_failed_retryable") {
1734
+ record.terminalState = "pre_dispatch_retryable";
1735
+ } else {
1736
+ record.terminalState = "terminal_failure";
1737
+ record.terminalFailure = closeOutcome.error;
1738
+ }
1739
+ const reason =
1740
+ closeOutcome.kind === "close_unknown"
1741
+ ? "writer close outcome is unknown"
1742
+ : "writer close failed before dispatch";
1743
+ throw new Error(`ACP session ${sessionId} cannot be deleted: ${reason}`);
1744
+ }
1745
+ // Recheck: the record must still own this exact session.
1746
+ if (this.#sessions.get(sessionId) !== record || record.terminalState !== "deleting") {
1747
+ record.terminalState = "terminal_failure";
1748
+ record.terminalFailure = new Error(`ACP session ${sessionId} state changed during deletion`);
1749
+ throw new Error(`ACP session ${sessionId} state changed during deletion`);
1750
+ }
1751
+ const sessionFile = manager.getSessionFile();
1752
+ const sessionDir = manager.getSessionDir();
1753
+ if (!sessionFile) {
1754
+ record.terminalState = "terminal_failure";
1755
+ record.terminalFailure = new Error(`ACP session ${sessionId} is not persisted and cannot be deleted`);
1756
+ throw new Error(`ACP session ${sessionId} is not persisted and cannot be deleted`);
1757
+ }
1758
+ const snapshot = this.#buildFreshAuthoritySnapshot(scope);
1759
+ const entry = snapshot.entries.get(sessionId);
1760
+ if (entry?.kind !== "candidate") {
1761
+ record.terminalState = "terminal_failure";
1762
+ record.terminalFailure = new Error(`ACP session ${sessionId} is not an exact-one scoped candidate`);
1763
+ throw new Error(`ACP session ${sessionId} is not an exact-one scoped candidate`);
1764
+ }
1765
+ if (entry.candidate.path !== sessionFile) {
1766
+ record.terminalState = "terminal_failure";
1767
+ record.terminalFailure = new Error(`ACP session ${sessionId} transcript path changed during deletion`);
1768
+ throw new Error(`ACP session ${sessionId} transcript path changed during deletion`);
1769
+ }
1770
+ this.#assertPendingTranscriptIdentity(sessionId, entry.candidate.identity);
1771
+ const sessionsRoot = path.dirname(sessionDir);
1772
+ const target: VerifiedSessionDeleteTarget = {
1773
+ sessionsRoot,
1774
+ transcriptPath: sessionFile,
1775
+ sessionId,
1776
+ cwd: manager.getCwd(),
1777
+ transcriptIdentity: {
1778
+ dev: entry.candidate.identity.dev,
1779
+ ino: entry.candidate.identity.ino,
1780
+ },
1781
+ ...this.#pendingArtifactsIdentity(sessionId),
1782
+ };
1783
+ const outcome = await manager.deleteSessionVerified(target);
1784
+ if (outcome.kind !== "deleted") {
1785
+ record.terminalState = "cleanup_pending";
1786
+ this.#recordPendingDeleteEvidence(sessionId, outcome);
1787
+ throw new Error(
1788
+ `ACP session ${sessionId} delete is incomplete: ${outcome.phase} cleanup pending (${outcome.error.message})`,
1789
+ );
1790
+ }
1791
+ // Fully deleted: clear retry evidence, remove from active map, dispose.
1792
+ record.terminalState = "deleted";
1793
+ this.#pendingDeleteEvidence.delete(sessionId);
1794
+ this.#sessions.delete(sessionId);
1795
+ this.#invalidateAuthority();
1796
+ await this.#disposeSessionRecord(record);
1797
+ return {};
1798
+ } catch (error) {
1799
+ // terminalState was set at the failure point above. For any
1800
+ // unexpected error that left the state as `deleting`, treat it
1801
+ // as terminal_failure so the record never silently reopens.
1802
+ if (record.terminalState === "deleting") {
1803
+ record.terminalState = "terminal_failure";
1804
+ record.terminalFailure = error instanceof Error ? error : new Error(String(error));
1805
+ }
1806
+ record.terminalPromise = undefined;
1807
+ this.#invalidateAuthority();
1808
+ throw error;
1809
+ }
1810
+ })();
1811
+ record.terminalPromise = terminalPromise;
1812
+ return await terminalPromise;
1813
+ }
1814
+
1815
+ /**
1816
+ * Delete an inactive (not currently loaded) session. The ID must have been
1817
+ * issued by the last complete scoped authority snapshot; an absent/unissued ID
1818
+ * returns lookup-free `{}` with NO inventory scan. Only after issuance may a
1819
+ * fresh strict inventory revalidate the same exact candidate before mutation.
1820
+ * A repeat-unknown (issued but gone from the fresh inventory) is also lookup-free `{}`.
1821
+ */
1822
+ async #deleteInactiveSession(sessionId: string): Promise<DeleteSessionResponse> {
1823
+ const scope = this.#canonicalCwdScope!;
1824
+ // Gate: only IDs issued by the last complete scoped authority snapshot
1825
+ // may trigger a fresh inventory scan. Absent/unissued → lookup-free {}.
1826
+ const issued = this.#authoritySnapshot?.entries.get(sessionId);
1827
+ if (!issued) {
1828
+ return {};
1829
+ }
1830
+ if (issued.kind === "conflict") {
1831
+ throw new Error(`ACP session delete failed: ${issued.reason}`);
1832
+ }
1833
+ // Fresh strict inventory to revalidate the same exact candidate.
1834
+ const snapshot = this.#buildFreshAuthoritySnapshot(scope);
1835
+ const entry = snapshot.entries.get(sessionId);
1836
+ if (!entry) {
1837
+ // Repeat unknown: issued but no longer present in the fresh inventory.
1838
+ return {};
1839
+ }
1840
+ if (entry.kind === "conflict") {
1841
+ throw new Error(`ACP session delete failed: ${entry.reason}`);
1842
+ }
1843
+ const candidate = entry.candidate;
1844
+ if (
1845
+ candidate.path !== issued.candidate.path ||
1846
+ candidate.cwd !== issued.candidate.cwd ||
1847
+ candidate.identity.dev !== issued.candidate.identity.dev ||
1848
+ candidate.identity.ino !== issued.candidate.identity.ino
1849
+ ) {
1850
+ throw new Error(`ACP session ${sessionId} changed since authority was issued`);
1851
+ }
1852
+ this.#assertPendingTranscriptIdentity(sessionId, candidate.identity);
1853
+ const sessionsRoot = path.dirname(candidate.path);
1854
+ const target: VerifiedSessionDeleteTarget = {
1855
+ sessionsRoot,
1856
+ transcriptPath: candidate.path,
1857
+ sessionId,
1858
+ cwd: candidate.cwd,
1859
+ transcriptIdentity: { dev: candidate.identity.dev, ino: candidate.identity.ino },
1860
+ ...this.#pendingArtifactsIdentity(sessionId),
1861
+ };
1862
+ const storage = new FileSessionStorage();
1863
+ const outcome = await storage.deleteSessionVerified(target);
1864
+ if (outcome.kind !== "deleted") {
1865
+ this.#recordPendingDeleteEvidence(sessionId, outcome);
1866
+ throw new Error(
1867
+ `ACP session ${sessionId} delete is incomplete: ${outcome.phase} cleanup pending (${outcome.error.message})`,
1868
+ );
1869
+ }
1870
+ this.#pendingDeleteEvidence.delete(sessionId);
1871
+ this.#invalidateAuthority();
1872
+ return {};
1873
+ }
1874
+
1281
1875
  #convertPromptBlocks(blocks: PromptRequest["prompt"]): { text: string; images: AgentImageContent[] } {
1282
1876
  const textParts: string[] = [];
1283
1877
  const images: AgentImageContent[] = [];
@@ -1372,28 +1966,6 @@ export class AcpAgent implements Agent {
1372
1966
  return configOptions;
1373
1967
  }
1374
1968
 
1375
- #buildModelState(session: AgentSession): SessionModelState | undefined {
1376
- const models = session.getAvailableModels();
1377
- if (models.length === 0) {
1378
- return undefined;
1379
- }
1380
-
1381
- const availableModels = models.map(model => ({
1382
- modelId: this.#toModelId(model),
1383
- name: model.name,
1384
- description: `${model.provider}/${model.id}`,
1385
- }));
1386
- const currentModelId = session.model ? this.#toModelId(session.model) : availableModels[0]?.modelId;
1387
- if (!currentModelId) {
1388
- return undefined;
1389
- }
1390
-
1391
- return {
1392
- availableModels,
1393
- currentModelId,
1394
- };
1395
- }
1396
-
1397
1969
  #buildThinkingOptions(session: AgentSession): Array<{ value: string; name: string; description?: string }> {
1398
1970
  return [
1399
1971
  { value: THINKING_OFF, name: "Off" },
@@ -1551,13 +2123,10 @@ export class AcpAgent implements Agent {
1551
2123
  // enough that the response future has scheduled before our timer fires
1552
2124
  // on stdio-only transports.
1553
2125
  //
1554
- // The session-lifetime subscription is installed inside the same timer
1555
- // so it shares this guard — without it, an extension's `session_start`
1556
- // handler (or any async work it schedules) calling `setThinkingLevel`
1557
- // would push a `config_option_update` for a session id the client
1558
- // hasn't been told about yet. The pre-bootstrap thinking level is
1559
- // reported in the response's `configOptions`, so deferring the
1560
- // notification loses no state.
2126
+ // The session-lifetime subscription normally shares this guard so extension
2127
+ // work cannot notify an unknown session id. prompt() may install it earlier:
2128
+ // receipt of a prompt proves the client already owns the returned session id,
2129
+ // and closes the cancellation window before this timer fires.
1561
2130
  setTimeout(() => {
1562
2131
  if (this.#connection.signal.aborted) {
1563
2132
  return;
@@ -1566,11 +2135,7 @@ export class AcpAgent implements Agent {
1566
2135
  if (!record) {
1567
2136
  return;
1568
2137
  }
1569
- if (!record.lifetimeUnsubscribe) {
1570
- record.lifetimeUnsubscribe = record.session.subscribe(event => {
1571
- void this.#handleLifetimeEvent(record, event);
1572
- });
1573
- }
2138
+ this.#ensureLifetimeSubscription(record);
1574
2139
  void this.#emitBootstrapUpdates(sessionId, record);
1575
2140
  }, ACP_BOOTSTRAP_RACE_GUARD_MS);
1576
2141
  }
@@ -1606,6 +2171,30 @@ export class AcpAgent implements Agent {
1606
2171
  });
1607
2172
  }
1608
2173
 
2174
+ /** Ensure cancellation clears a previously emitted busy/compacting phase even if abort never produces an end event. */
2175
+ async #emitCancelledPromptIdleUpdate(record: ManagedSessionRecord): Promise<void> {
2176
+ if (this.#connection.signal.aborted) {
2177
+ return;
2178
+ }
2179
+ try {
2180
+ await this.#connection.sessionUpdate({
2181
+ sessionId: record.session.sessionId,
2182
+ update: {
2183
+ sessionUpdate: "session_info_update",
2184
+ title: record.session.sessionName,
2185
+ updatedAt: new Date().toISOString(),
2186
+ _meta: {
2187
+ skcPhase: "idle",
2188
+ running: false,
2189
+ skcRunning: false,
2190
+ },
2191
+ },
2192
+ });
2193
+ } catch (error) {
2194
+ logger.warn("Failed to emit cancelled ACP prompt idle update", { error });
2195
+ }
2196
+ }
2197
+
1609
2198
  /**
1610
2199
  * Reload plugin/registry state for an ACP session. Mirrors the interactive
1611
2200
  * `/reload-plugins` and `/move` flows: invalidates the plugin-roots cache,
@@ -1647,6 +2236,11 @@ export class AcpAgent implements Agent {
1647
2236
  sessionUpdate: "session_info_update",
1648
2237
  title: record.session.sessionName,
1649
2238
  updatedAt: new Date().toISOString(),
2239
+ _meta: {
2240
+ skcPhase: "idle",
2241
+ running: false,
2242
+ skcRunning: false,
2243
+ },
1650
2244
  },
1651
2245
  });
1652
2246
  }
@@ -1692,16 +2286,6 @@ export class AcpAgent implements Agent {
1692
2286
  return sessions.sort((left, right) => right.modified.getTime() - left.modified.getTime());
1693
2287
  }
1694
2288
 
1695
- async #findStoredSession(sessionId: string, cwd: string): Promise<StoredSessionInfo | undefined> {
1696
- const sessions = await this.#listStoredSessions(cwd);
1697
- return sessions.find(session => session.id === sessionId);
1698
- }
1699
-
1700
- async #findStoredSessionById(sessionId: string): Promise<StoredSessionInfo | undefined> {
1701
- const sessions = await this.#listStoredSessions();
1702
- return sessions.find(session => session.id === sessionId);
1703
- }
1704
-
1705
2289
  #parseCursor(cursor: string | undefined): number {
1706
2290
  if (!cursor) {
1707
2291
  return 0;
@@ -1713,6 +2297,32 @@ export class AcpAgent implements Agent {
1713
2297
  return parsed;
1714
2298
  }
1715
2299
 
2300
+ /**
2301
+ * Parse a scoped cursor of the form `${generation}:${offset}` and reject it when
2302
+ * its embedded generation no longer matches the current authority generation.
2303
+ * Unlike the cwd-less display cursor, the scoped cursor binds the page offset to
2304
+ * the exact authority snapshot that produced it, so a lifecycle invalidation
2305
+ * between pages is observable instead of silently rebuilt.
2306
+ */
2307
+ #parseScopedCursor(cursor: string | undefined, currentGeneration: number): number {
2308
+ if (!cursor) {
2309
+ return 0;
2310
+ }
2311
+ const separator = cursor.indexOf(":");
2312
+ if (separator <= 0) {
2313
+ throw new Error(`Invalid ACP session cursor: ${cursor}`);
2314
+ }
2315
+ const generation = Number.parseInt(cursor.slice(0, separator), 10);
2316
+ const offset = Number.parseInt(cursor.slice(separator + 1), 10);
2317
+ if (!Number.isFinite(generation) || generation < 0 || !Number.isFinite(offset) || offset < 0) {
2318
+ throw new Error(`Invalid ACP session cursor: ${cursor}`);
2319
+ }
2320
+ if (generation !== currentGeneration) {
2321
+ throw new Error("ACP session list cursor is stale; the scoped session inventory changed");
2322
+ }
2323
+ return offset;
2324
+ }
2325
+
1716
2326
  async #replaySessionHistory(record: ManagedSessionRecord): Promise<void> {
1717
2327
  const cwd = record.session.sessionManager.getCwd();
1718
2328
  const replayedToolCallIds = new Set<string>();
@@ -2113,11 +2723,14 @@ export class AcpAgent implements Agent {
2113
2723
  headers: this.#toNameValueMap(server.headers),
2114
2724
  };
2115
2725
  }
2116
- return {
2117
- type: "sse",
2118
- url: server.url,
2119
- headers: this.#toNameValueMap(server.headers),
2120
- };
2726
+ if (server.type === "sse") {
2727
+ return {
2728
+ type: "sse",
2729
+ url: server.url,
2730
+ headers: this.#toNameValueMap(server.headers),
2731
+ };
2732
+ }
2733
+ throw new Error(`Unsupported ACP MCP transport: ${server.type}`);
2121
2734
  }
2122
2735
 
2123
2736
  #toNameValueMap(values: Array<{ name: string; value: string }>): { [name: string]: string } {
@@ -2146,6 +2759,79 @@ export class AcpAgent implements Agent {
2146
2759
  logger.warn("Failed to abort ACP prompt during session close", { error });
2147
2760
  }
2148
2761
  }
2762
+ /**
2763
+ * Delete-specific strict prompt quiescence barrier. Mirrors the cancel setup of
2764
+ * {@link #cancelPromptForClose} but NEVER swallows abort/timeout failures, then
2765
+ * waits for full idle + async-delivery drain. A quiescence failure blocks the
2766
+ * destructive mutation that follows — it is not catch-and-logged. The best-effort
2767
+ * close path is preserved separately for nondestructive shutdown.
2768
+ */
2769
+ async #quiesceForDelete(sessionId: string, record: ManagedSessionRecord): Promise<void> {
2770
+ const promptTurn = record.promptTurn;
2771
+ if (isPromptTurnInFlight(promptTurn)) {
2772
+ const cleanup = promptTurn.cleanup ?? this.#beginCancelCleanup(record, promptTurn);
2773
+ await cleanup;
2774
+ }
2775
+ await this.#waitForAcpPromptIdle(record);
2776
+ // Explicit post-drain status check: the drain loop's boolean return is
2777
+ // not trusted as proof. Treat a drain false/timeout/no-progress/max-pass
2778
+ // as unproven and verify the owner-scoped delivery state directly. Any
2779
+ // remaining queued/delivering work blocks the destructive mutation.
2780
+ const delivery = record.session.getAsyncDeliveryStateForAcp();
2781
+ if (delivery.queued > 0 || delivery.delivering) {
2782
+ throw new Error(`ACP session ${sessionId} cannot be deleted: async delivery is not quiesced`);
2783
+ }
2784
+ }
2785
+
2786
+ /**
2787
+ * Record phase-aware same-connection retry evidence for an incomplete verified
2788
+ * delete. The transcript identity (carried by every cleanup_pending) is always
2789
+ * recorded so a retry can reject a replaced transcript; the artifacts identity
2790
+ * is recorded only at the artifacts phase.
2791
+ */
2792
+ #recordPendingDeleteEvidence(sessionId: string, result: VerifiedSessionDeleteResult): void {
2793
+ if (result.kind !== "cleanup_pending") {
2794
+ return;
2795
+ }
2796
+ if (result.phase === "artifacts") {
2797
+ this.#pendingDeleteEvidence.set(sessionId, {
2798
+ transcriptIdentity: result.transcriptIdentity,
2799
+ artifactsIdentity: result.artifactsIdentity,
2800
+ });
2801
+ } else {
2802
+ // Transcript phase: artifacts were already removed successfully, so only
2803
+ // the transcript identity remains for retry binding.
2804
+ this.#pendingDeleteEvidence.set(sessionId, {
2805
+ transcriptIdentity: result.transcriptIdentity,
2806
+ });
2807
+ }
2808
+ }
2809
+
2810
+ /** Build the optional `expectedArtifactsIdentity` field for a retry target. */
2811
+ #pendingArtifactsIdentity(sessionId: string): { expectedArtifactsIdentity?: SessionStorageFileIdentity } {
2812
+ const pending = this.#pendingDeleteEvidence.get(sessionId);
2813
+ return pending?.artifactsIdentity ? { expectedArtifactsIdentity: pending.artifactsIdentity } : {};
2814
+ }
2815
+
2816
+ /**
2817
+ * Phase-aware retry gate: a preserved transcript identity must match the fresh
2818
+ * candidate's transcript identity before that candidate can authorize a
2819
+ * replacement. A mismatch (the transcript was externally replaced between the
2820
+ * cleanup_pending failure and the retry) fails closed — it never authorizes a
2821
+ * wrong mutation.
2822
+ */
2823
+ #assertPendingTranscriptIdentity(sessionId: string, candidateIdentity: { dev: bigint; ino: bigint }): void {
2824
+ const pending = this.#pendingDeleteEvidence.get(sessionId);
2825
+ if (
2826
+ pending &&
2827
+ (pending.transcriptIdentity.dev !== candidateIdentity.dev ||
2828
+ pending.transcriptIdentity.ino !== candidateIdentity.ino)
2829
+ ) {
2830
+ throw new Error(
2831
+ `ACP session ${sessionId} transcript identity changed since pending cleanup; replacement rejected`,
2832
+ );
2833
+ }
2834
+ }
2149
2835
 
2150
2836
  async #disposeSessionRecord(record: ManagedSessionRecord): Promise<void> {
2151
2837
  record.lifetimeUnsubscribe?.();