@gajae-code/coding-agent 0.13.2 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (610) hide show
  1. package/CHANGELOG.md +215 -8
  2. package/README.md +2 -0
  3. package/bin/gajaessi.js +4 -0
  4. package/dist/types/async/job-manager.d.ts +55 -2
  5. package/dist/types/async/support.d.ts +14 -0
  6. package/dist/types/capability/mcp.d.ts +6 -0
  7. package/dist/types/capability/types.d.ts +6 -0
  8. package/dist/types/cli/accounts-cli.d.ts +19 -0
  9. package/dist/types/cli/args.d.ts +3 -0
  10. package/dist/types/cli/config-cli.d.ts +6 -0
  11. package/dist/types/cli/crash-cli.d.ts +10 -0
  12. package/dist/types/cli/customize-doctor.d.ts +145 -0
  13. package/dist/types/cli/daemon-cli.d.ts +3 -1
  14. package/dist/types/cli/mcp-cli.d.ts +11 -0
  15. package/dist/types/cli/notify-cli.d.ts +1 -1
  16. package/dist/types/cli/root-flags.d.ts +12 -0
  17. package/dist/types/cli/setup-cli.d.ts +3 -1
  18. package/dist/types/cli/skills-cli.d.ts +2 -1
  19. package/dist/types/cli/update-cli.d.ts +19 -1
  20. package/dist/types/cli.d.ts +6 -0
  21. package/dist/types/commands/accounts.d.ts +40 -0
  22. package/dist/types/commands/crash.d.ts +24 -0
  23. package/dist/types/commands/customize.d.ts +22 -0
  24. package/dist/types/commands/daemon.d.ts +1 -1
  25. package/dist/types/commands/launch.d.ts +6 -0
  26. package/dist/types/commands/setup.d.ts +6 -0
  27. package/dist/types/commands/skills.d.ts +6 -1
  28. package/dist/types/commands/update.d.ts +7 -0
  29. package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
  30. package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
  31. package/dist/types/config/config-schema-version.d.ts +10 -0
  32. package/dist/types/config/file-lock.d.ts +18 -0
  33. package/dist/types/config/model-profile-activation.d.ts +3 -1
  34. package/dist/types/config/model-registry.d.ts +10 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +73 -9
  37. package/dist/types/config/settings.d.ts +63 -0
  38. package/dist/types/config/skill-settings-defaults.d.ts +26 -0
  39. package/dist/types/config/task-delegation.d.ts +39 -0
  40. package/dist/types/config/update-channel.d.ts +10 -0
  41. package/dist/types/coordinator-mcp/server.d.ts +5 -1
  42. package/dist/types/crash/index-store.d.ts +87 -0
  43. package/dist/types/crash/nudge.d.ts +50 -0
  44. package/dist/types/crash/record-loader.d.ts +17 -0
  45. package/dist/types/crash/report.d.ts +134 -0
  46. package/dist/types/crash/sanitize.d.ts +25 -0
  47. package/dist/types/cursor.d.ts +13 -2
  48. package/dist/types/customization/import.d.ts +37 -0
  49. package/dist/types/customization/index.d.ts +4 -0
  50. package/dist/types/customization/inventory.d.ts +25 -0
  51. package/dist/types/customization/mutations.d.ts +32 -0
  52. package/dist/types/customization/types.d.ts +115 -0
  53. package/dist/types/daemon/control-types.d.ts +8 -1
  54. package/dist/types/daemon/operator-contract.d.ts +4 -4
  55. package/dist/types/discovery/claude.d.ts +39 -1
  56. package/dist/types/discovery/codex.d.ts +39 -1
  57. package/dist/types/discovery/index.d.ts +2 -0
  58. package/dist/types/discovery/mcp-compat.d.ts +30 -0
  59. package/dist/types/edit/renderer.d.ts +23 -0
  60. package/dist/types/extensibility/extensions/runner.d.ts +3 -0
  61. package/dist/types/extensibility/extensions/types.d.ts +21 -4
  62. package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
  63. package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
  64. package/dist/types/extensibility/hooks/loader.d.ts +19 -5
  65. package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
  66. package/dist/types/extensibility/skill-management.d.ts +107 -0
  67. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
  68. package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
  69. package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
  70. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
  71. package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
  72. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
  73. package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
  74. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
  75. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
  76. package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
  77. package/dist/types/hooks/events.d.ts +60 -0
  78. package/dist/types/hooks/normalize.d.ts +83 -0
  79. package/dist/types/hooks/skill-state.d.ts +9 -2
  80. package/dist/types/main.d.ts +2 -1
  81. package/dist/types/modes/acp/abort-scope.d.ts +13 -0
  82. package/dist/types/modes/acp/acp-agent.d.ts +7 -4
  83. package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
  84. package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
  85. package/dist/types/modes/components/customization/index.d.ts +1 -0
  86. package/dist/types/modes/components/dynamic-theme-text.d.ts +9 -0
  87. package/dist/types/modes/components/gajae-pet-widget.d.ts +6 -28
  88. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  89. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  90. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  91. package/dist/types/modes/components/pet-capability.d.ts +7 -21
  92. package/dist/types/modes/components/settings-selector.d.ts +5 -0
  93. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  94. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  95. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  96. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  97. package/dist/types/modes/interactive-mode.d.ts +1 -0
  98. package/dist/types/modes/theme/defaults/index.d.ts +118 -0
  99. package/dist/types/modes/types.d.ts +1 -0
  100. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  101. package/dist/types/runtime-mcp/config.d.ts +9 -0
  102. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  103. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  104. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  105. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  106. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  107. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  108. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  109. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  110. package/dist/types/runtime-mcp/types.d.ts +102 -10
  111. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  112. package/dist/types/sdk/broker/broker.d.ts +3 -55
  113. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  114. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  115. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  116. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  117. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  118. package/dist/types/sdk/bus/config.d.ts +11 -0
  119. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  120. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  121. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  122. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  123. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  124. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  125. package/dist/types/sdk/bus/index.d.ts +85 -99
  126. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  127. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  128. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  129. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  130. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  131. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  132. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  133. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  135. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  136. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  137. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  138. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  139. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  140. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  141. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  142. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  143. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  144. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  145. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  146. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  147. package/dist/types/sdk/cli/rows.d.ts +2 -11
  148. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  149. package/dist/types/sdk/client/client.d.ts +97 -1
  150. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  151. package/dist/types/sdk/host/control/index.d.ts +1 -1
  152. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  153. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  154. package/dist/types/sdk/host/host.d.ts +15 -1
  155. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  156. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  157. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  158. package/dist/types/sdk/host/types.d.ts +1 -1
  159. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  160. package/dist/types/sdk/index.d.ts +2 -1
  161. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  162. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  163. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  164. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  165. package/dist/types/sdk/mcp/server.d.ts +9 -6
  166. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  167. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  168. package/dist/types/sdk/prompt-status.d.ts +10 -3
  169. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  170. package/dist/types/sdk/receipt-state.d.ts +17 -0
  171. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  172. package/dist/types/sdk/router/index.d.ts +1 -0
  173. package/dist/types/sdk/router/session-router.d.ts +152 -0
  174. package/dist/types/sdk/session-list.d.ts +22 -0
  175. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  176. package/dist/types/sdk/session.d.ts +34 -1
  177. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  178. package/dist/types/session/account-inventory.d.ts +86 -0
  179. package/dist/types/session/agent-session.d.ts +145 -6
  180. package/dist/types/session/agent-storage.d.ts +10 -0
  181. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  182. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  183. package/dist/types/session/messages.d.ts +1 -1
  184. package/dist/types/session/secure-token-file.d.ts +3 -0
  185. package/dist/types/session/session-manager.d.ts +47 -1
  186. package/dist/types/session/startup-auth-config.d.ts +44 -0
  187. package/dist/types/session/terminal-abort.d.ts +378 -0
  188. package/dist/types/session/yield-queue.d.ts +7 -0
  189. package/dist/types/session-import/claude.d.ts +26 -0
  190. package/dist/types/session-import/codex.d.ts +88 -0
  191. package/dist/types/session-import/command.d.ts +35 -0
  192. package/dist/types/session-import/detect.d.ts +22 -0
  193. package/dist/types/session-import/index.d.ts +7 -0
  194. package/dist/types/session-import/provider-codex.d.ts +22 -0
  195. package/dist/types/session-import/provider-service.d.ts +38 -0
  196. package/dist/types/session-import/redact.d.ts +23 -0
  197. package/dist/types/session-import/service.d.ts +47 -0
  198. package/dist/types/session-import/types.d.ts +120 -0
  199. package/dist/types/setup/paseo/check.d.ts +16 -0
  200. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  201. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  202. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  203. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  204. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  205. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  206. package/dist/types/setup/paseo/remove.d.ts +14 -0
  207. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  208. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  209. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  210. package/dist/types/skill-state/active-state.d.ts +5 -1
  211. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  212. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  213. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  214. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  215. package/dist/types/slash-commands/types.d.ts +7 -1
  216. package/dist/types/task/executor.d.ts +10 -0
  217. package/dist/types/task/index.d.ts +3 -1
  218. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  219. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  220. package/dist/types/tools/bash.d.ts +2 -6
  221. package/dist/types/tools/browser/attach.d.ts +11 -0
  222. package/dist/types/tools/browser/launch.d.ts +20 -0
  223. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  224. package/dist/types/tools/browser/render.d.ts +1 -0
  225. package/dist/types/tools/browser.d.ts +3 -1
  226. package/dist/types/tools/image-gen.d.ts +10 -2
  227. package/dist/types/tools/index.d.ts +8 -0
  228. package/dist/types/tools/monitor.d.ts +1 -1
  229. package/dist/types/tools/skill-discovery.d.ts +8 -1
  230. package/dist/types/tools/subagent.d.ts +2 -0
  231. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  232. package/dist/types/utils/herdr-pane.d.ts +76 -0
  233. package/package.json +19 -9
  234. package/scripts/build-binary.ts +2 -1
  235. package/scripts/build-sdk-package-smoke.ts +2 -13
  236. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  237. package/scripts/compile-args.ts +2 -0
  238. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  239. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  240. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  241. package/scripts/generate-tool-catalog.ts +6 -4
  242. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  243. package/src/async/job-manager.ts +352 -17
  244. package/src/async/support.ts +25 -0
  245. package/src/autoresearch/dashboard.ts +28 -13
  246. package/src/capability/index.ts +3 -1
  247. package/src/capability/mcp.ts +6 -0
  248. package/src/capability/types.ts +6 -0
  249. package/src/cli/accounts-cli.ts +395 -0
  250. package/src/cli/args.ts +23 -0
  251. package/src/cli/auth-broker-cli.ts +136 -66
  252. package/src/cli/auth-gateway-cli.ts +94 -70
  253. package/src/cli/config-cli.ts +27 -2
  254. package/src/cli/crash-cli.ts +78 -0
  255. package/src/cli/customize-doctor.ts +1605 -0
  256. package/src/cli/daemon-cli.ts +12 -3
  257. package/src/cli/fast-help.ts +1 -0
  258. package/src/cli/mcp-cli.ts +128 -60
  259. package/src/cli/notify-cli.ts +8 -14
  260. package/src/cli/root-flags.ts +8 -0
  261. package/src/cli/setup-cli.ts +145 -0
  262. package/src/cli/skills-cli.ts +38 -2
  263. package/src/cli/update-cli.ts +167 -12
  264. package/src/cli.ts +4 -0
  265. package/src/commands/accounts.ts +71 -0
  266. package/src/commands/crash.ts +35 -0
  267. package/src/commands/customize.ts +84 -0
  268. package/src/commands/daemon.ts +2 -2
  269. package/src/commands/deep-interview.ts +2 -0
  270. package/src/commands/launch.ts +1 -0
  271. package/src/commands/mcp.ts +12 -7
  272. package/src/commands/ralplan.ts +2 -0
  273. package/src/commands/sdk.ts +65 -32
  274. package/src/commands/setup.ts +5 -0
  275. package/src/commands/skills.ts +14 -4
  276. package/src/commands/ultragoal.ts +10 -1
  277. package/src/commands/update.ts +26 -15
  278. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  279. package/src/config/atomic-yaml-patch.ts +769 -29
  280. package/src/config/config-schema-version.ts +10 -0
  281. package/src/config/file-lock.ts +70 -1
  282. package/src/config/mcp-schema.json +52 -14
  283. package/src/config/model-profile-activation.ts +23 -2
  284. package/src/config/model-profiles.ts +88 -21
  285. package/src/config/model-registry.ts +147 -21
  286. package/src/config/models-config-schema.ts +1 -1
  287. package/src/config/settings-schema.ts +77 -7
  288. package/src/config/settings.ts +4038 -199
  289. package/src/config/skill-settings-defaults.ts +41 -3
  290. package/src/config/task-delegation.ts +87 -0
  291. package/src/config/update-channel.ts +23 -0
  292. package/src/coordinator-mcp/server.ts +377 -308
  293. package/src/crash/index-store.ts +723 -0
  294. package/src/crash/nudge.ts +89 -0
  295. package/src/crash/record-loader.ts +149 -0
  296. package/src/crash/report.ts +551 -0
  297. package/src/crash/sanitize.ts +129 -0
  298. package/src/cursor.ts +36 -10
  299. package/src/customization/import.ts +946 -0
  300. package/src/customization/index.ts +4 -0
  301. package/src/customization/inventory.ts +335 -0
  302. package/src/customization/mutations.ts +141 -0
  303. package/src/customization/types.ts +223 -0
  304. package/src/daemon/control-types.ts +8 -1
  305. package/src/daemon/operator-contract.ts +6 -6
  306. package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +31 -6
  307. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  308. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  309. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  310. package/src/discovery/claude-hooks.ts +38 -0
  311. package/src/discovery/claude.ts +142 -209
  312. package/src/discovery/codex-hooks.ts +38 -0
  313. package/src/discovery/codex.ts +132 -198
  314. package/src/discovery/helpers.ts +8 -1
  315. package/src/discovery/index.ts +2 -0
  316. package/src/discovery/mcp-compat.ts +234 -0
  317. package/src/discovery/mcp-json.ts +6 -0
  318. package/src/edit/renderer.ts +40 -0
  319. package/src/edit/streaming.ts +4 -2
  320. package/src/exec/bash-executor.ts +24 -20
  321. package/src/export/html/index.ts +51 -2
  322. package/src/extensibility/extensions/loader.ts +9 -1
  323. package/src/extensibility/extensions/runner.ts +17 -4
  324. package/src/extensibility/extensions/types.ts +31 -6
  325. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  326. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  327. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  328. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  329. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  330. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  331. package/src/extensibility/hooks/loader.ts +154 -10
  332. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  333. package/src/extensibility/skill-management.ts +368 -0
  334. package/src/extensibility/skills.ts +52 -16
  335. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  336. package/src/gjc-runtime/launch-worktree.ts +56 -2
  337. package/src/gjc-runtime/linux-proc.ts +7 -1
  338. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  339. package/src/gjc-runtime/session-state-lock.ts +992 -0
  340. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  341. package/src/gjc-runtime/state-writer.ts +39 -14
  342. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  343. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  344. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  345. package/src/gjc-runtime/workflow-settings.ts +596 -0
  346. package/src/goals/tools/goal-tool.ts +6 -1
  347. package/src/hooks/events.ts +291 -0
  348. package/src/hooks/native-skill-hook.ts +4 -0
  349. package/src/hooks/normalize.ts +369 -0
  350. package/src/hooks/skill-state.ts +165 -46
  351. package/src/internal-urls/docs-index.generated.ts +41 -32
  352. package/src/main.ts +36 -5
  353. package/src/migrate/mcp-mapper.ts +25 -2
  354. package/src/modes/acp/abort-scope.ts +29 -0
  355. package/src/modes/acp/acp-agent.ts +423 -98
  356. package/src/modes/components/assistant-message.ts +6 -1
  357. package/src/modes/components/chrome.ts +4 -3
  358. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  359. package/src/modes/components/customization/import-wizard.ts +372 -0
  360. package/src/modes/components/customization/index.ts +1 -0
  361. package/src/modes/components/dynamic-theme-text.ts +22 -0
  362. package/src/modes/components/gajae-pet-widget.ts +607 -193
  363. package/src/modes/components/irc-sidebar.ts +11 -0
  364. package/src/modes/components/iterm-pet-transport.ts +585 -0
  365. package/src/modes/components/model-selector.ts +1 -6
  366. package/src/modes/components/oauth-selector.ts +277 -86
  367. package/src/modes/components/pet-capability.ts +35 -31
  368. package/src/modes/components/settings-selector.ts +29 -5
  369. package/src/modes/components/status-line/gh.ts +45 -1
  370. package/src/modes/components/status-line/segments.ts +19 -4
  371. package/src/modes/components/tool-status-header.ts +13 -3
  372. package/src/modes/controllers/command-controller.ts +20 -8
  373. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  374. package/src/modes/controllers/input-controller.ts +10 -0
  375. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  376. package/src/modes/controllers/selector-controller.ts +238 -77
  377. package/src/modes/controllers/stt-controller.ts +3 -3
  378. package/src/modes/interactive-mode.ts +88 -16
  379. package/src/modes/print-mode.ts +35 -6
  380. package/src/modes/runtime-init.ts +21 -68
  381. package/src/modes/theme/defaults/index.ts +2 -0
  382. package/src/modes/theme/defaults/ouroboros.json +118 -0
  383. package/src/modes/types.ts +1 -0
  384. package/src/modes/utils/injected-user-submission.ts +25 -0
  385. package/src/modes/utils/terminal-bell.ts +15 -1
  386. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  387. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  388. package/src/prompts/agents/critic.md +1 -1
  389. package/src/prompts/system/rlm-research.md +1 -1
  390. package/src/prompts/system/system-prompt.md +0 -2
  391. package/src/prompts/tools/bash.md +7 -1
  392. package/src/prompts/tools/browser.md +1 -1
  393. package/src/prompts/tools/cron.md +6 -6
  394. package/src/prompts/tools/read.md +0 -2
  395. package/src/prompts/tools/skill-discovery.md +4 -2
  396. package/src/runtime-mcp/client.ts +427 -23
  397. package/src/runtime-mcp/config.ts +37 -5
  398. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  399. package/src/runtime-mcp/manager.ts +52 -2
  400. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  401. package/src/runtime-mcp/oauth-flow.ts +46 -1
  402. package/src/runtime-mcp/pool-key.ts +5 -1
  403. package/src/runtime-mcp/pool.test.ts +9 -0
  404. package/src/runtime-mcp/protocol.test.ts +353 -0
  405. package/src/runtime-mcp/protocol.ts +624 -0
  406. package/src/runtime-mcp/scope-config.ts +78 -0
  407. package/src/runtime-mcp/tool-bridge.ts +44 -10
  408. package/src/runtime-mcp/transports/http.ts +84 -13
  409. package/src/runtime-mcp/types.ts +123 -12
  410. package/src/sdk/acp/adapter.ts +328 -97
  411. package/src/sdk/broker/broker.ts +160 -741
  412. package/src/sdk/broker/ensure.ts +9 -1
  413. package/src/sdk/broker/lifecycle.ts +510 -116
  414. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  415. package/src/sdk/broker/process-incarnation.ts +19 -0
  416. package/src/sdk/broker/session-index.ts +516 -117
  417. package/src/sdk/broker/startup-failure.ts +28 -5
  418. package/src/sdk/broker/transport.ts +1 -13
  419. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  420. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  421. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  422. package/src/sdk/bus/config.ts +13 -0
  423. package/src/sdk/bus/conversation-store.ts +59 -171
  424. package/src/sdk/bus/daemon-paths.ts +20 -0
  425. package/src/sdk/bus/discord-conversation.ts +2 -0
  426. package/src/sdk/bus/discord-daemon.ts +524 -126
  427. package/src/sdk/bus/discord-live-provider.ts +206 -79
  428. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  429. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  430. package/src/sdk/bus/index.ts +2480 -456
  431. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  432. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  433. package/src/sdk/bus/managed-daemon.ts +2 -145
  434. package/src/sdk/bus/notification-service.ts +196 -0
  435. package/src/sdk/bus/operator-runtime.ts +1 -1
  436. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  437. package/src/sdk/bus/reconciliation-store.ts +553 -24
  438. package/src/sdk/bus/session-control.ts +49 -3
  439. package/src/sdk/bus/slack-conversation.ts +4 -0
  440. package/src/sdk/bus/slack-daemon.ts +733 -134
  441. package/src/sdk/bus/slack-live-provider.ts +65 -15
  442. package/src/sdk/bus/slack-provider.ts +4 -0
  443. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  444. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  445. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  446. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  447. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  448. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  449. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  450. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  451. package/src/sdk/bus/telegram-reference.ts +1 -226
  452. package/src/sdk/bus/telegram-setup.ts +2 -2
  453. package/src/sdk/bus/threaded-render.ts +1 -0
  454. package/src/sdk/bus/topic-registry.ts +279 -146
  455. package/src/sdk/cli/rows.ts +2 -35
  456. package/src/sdk/cli/session-cli.ts +776 -700
  457. package/src/sdk/client/client.ts +892 -1
  458. package/src/sdk/host/control/dispatch.ts +93 -58
  459. package/src/sdk/host/control/index.ts +1 -1
  460. package/src/sdk/host/control/operations.ts +18 -10
  461. package/src/sdk/host/control/runtime-gate.ts +40 -0
  462. package/src/sdk/host/host.ts +63 -12
  463. package/src/sdk/host/query/handlers.ts +66 -7
  464. package/src/sdk/host/reverse-leases.ts +2 -2
  465. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  466. package/src/sdk/host/session-runtime.test.ts +2787 -34
  467. package/src/sdk/host/session-runtime.ts +1489 -101
  468. package/src/sdk/host/surface-policy.ts +12 -8
  469. package/src/sdk/host/types.ts +1 -1
  470. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  471. package/src/sdk/host/websocket-transport.ts +85 -50
  472. package/src/sdk/index.ts +2 -1
  473. package/src/sdk/lifecycle/broker-client.ts +53 -0
  474. package/src/sdk/lifecycle/client.ts +234 -0
  475. package/src/sdk/lifecycle/index.ts +3 -0
  476. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  477. package/src/sdk/lifecycle/service.ts +720 -0
  478. package/src/sdk/mcp/server.ts +226 -188
  479. package/src/sdk/prompt-deadline-lease.ts +55 -0
  480. package/src/sdk/prompt-deadline-manager.ts +148 -0
  481. package/src/sdk/prompt-status.ts +11 -3
  482. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  483. package/src/sdk/protocol/operation-registry.ts +71 -8
  484. package/src/sdk/receipt-state.ts +43 -0
  485. package/src/sdk/reconciliation-extensions.ts +14 -0
  486. package/src/sdk/router/index.ts +1 -0
  487. package/src/sdk/router/session-router.ts +1658 -0
  488. package/src/sdk/session-list.ts +93 -0
  489. package/src/sdk/session-reconnect.ts +45 -1
  490. package/src/sdk/session.ts +716 -120
  491. package/src/sdk/transport/serve-cli.ts +18 -34
  492. package/src/session/account-inventory.ts +603 -0
  493. package/src/session/agent-session.ts +2873 -559
  494. package/src/session/agent-storage.ts +35 -0
  495. package/src/session/blob-store.ts +32 -1
  496. package/src/session/coordinator-tool-label.ts +40 -0
  497. package/src/session/internal/managed-session-scope.ts +4 -0
  498. package/src/session/internal/managed-session-storage.ts +199 -31
  499. package/src/session/messages.ts +1 -1
  500. package/src/session/secure-token-file.ts +80 -0
  501. package/src/session/session-manager.ts +757 -57
  502. package/src/session/session-storage.ts +25 -16
  503. package/src/session/startup-auth-config.ts +297 -0
  504. package/src/session/terminal-abort.ts +1253 -0
  505. package/src/session/yield-queue.ts +57 -15
  506. package/src/session-import/claude.ts +334 -0
  507. package/src/session-import/codex.ts +1033 -0
  508. package/src/session-import/command.ts +77 -0
  509. package/src/session-import/detect.ts +133 -0
  510. package/src/session-import/index.ts +7 -0
  511. package/src/session-import/provider-codex.ts +327 -0
  512. package/src/session-import/provider-service.ts +457 -0
  513. package/src/session-import/redact.ts +128 -0
  514. package/src/session-import/service.ts +1264 -0
  515. package/src/session-import/types.ts +148 -0
  516. package/src/setup/paseo/check.ts +213 -0
  517. package/src/setup/paseo/install-saga.ts +293 -0
  518. package/src/setup/paseo/json-publisher.ts +263 -0
  519. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  520. package/src/setup/paseo/paseo-ownership.ts +224 -0
  521. package/src/setup/paseo/paseo-setup.ts +253 -0
  522. package/src/setup/paseo/provider-config.ts +139 -0
  523. package/src/setup/paseo/remove.ts +183 -0
  524. package/src/setup/paseo/result-types.ts +79 -0
  525. package/src/setup/paseo/setup-deps.ts +175 -0
  526. package/src/setup/paseo/skills-bridge.ts +260 -0
  527. package/src/skill-state/active-state.ts +21 -11
  528. package/src/slash-commands/acp-builtins.ts +9 -1
  529. package/src/slash-commands/builtin-registry.ts +117 -19
  530. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  531. package/src/slash-commands/helpers/mcp.ts +9 -3
  532. package/src/slash-commands/helpers/usage-report.ts +61 -56
  533. package/src/slash-commands/types.ts +7 -2
  534. package/src/task/executor.ts +30 -11
  535. package/src/task/index.ts +66 -7
  536. package/src/task/render.ts +23 -9
  537. package/src/tools/ask-answer-registry.ts +23 -7
  538. package/src/tools/ask.ts +8 -4
  539. package/src/tools/bash-sleep-advisory.ts +115 -0
  540. package/src/tools/bash.ts +98 -18
  541. package/src/tools/browser/attach.ts +71 -3
  542. package/src/tools/browser/launch.ts +86 -13
  543. package/src/tools/browser/profile-discovery.ts +57 -7
  544. package/src/tools/browser/render.ts +8 -1
  545. package/src/tools/browser.ts +130 -21
  546. package/src/tools/computer.enforcement.test.ts +1 -1
  547. package/src/tools/computer.ts +3 -2
  548. package/src/tools/cron.ts +12 -1
  549. package/src/tools/image-gen.ts +349 -142
  550. package/src/tools/index.ts +8 -0
  551. package/src/tools/job.ts +33 -6
  552. package/src/tools/monitor.ts +41 -2
  553. package/src/tools/skill-discovery.ts +21 -29
  554. package/src/tools/subagent.ts +142 -24
  555. package/src/tools/todo-contract.ts +55 -3
  556. package/src/tools/todo-write.ts +4 -3
  557. package/src/tools/tool-catalog.generated.ts +6 -6
  558. package/src/tools/ultragoal-ask-guard.ts +10 -3
  559. package/src/utils/herdr-pane.ts +345 -0
  560. package/src/utils/title-generator.ts +2 -0
  561. package/src/web/scrapers/index.ts +6 -4
  562. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  563. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  564. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  565. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  566. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  567. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  568. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  569. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  570. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  571. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  572. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  573. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  574. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  575. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  576. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  577. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  578. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  579. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  580. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  581. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  582. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  583. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  584. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  585. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  586. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  587. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  588. package/dist/types/session/auth-broker-config.d.ts +0 -13
  589. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  590. package/dist/types/skills/skills.test.d.ts +0 -1
  591. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  592. package/dist/types/task/token-log.test.d.ts +0 -1
  593. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  594. package/dist/types/tools/descriptors.test.d.ts +0 -1
  595. package/scripts/g005-daemon-smoke.ts +0 -180
  596. package/scripts/g011-daemon-path-smoke.ts +0 -153
  597. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  598. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  599. package/src/sdk/bus/telegram-cli.ts +0 -212
  600. package/src/sdk/elevation/allowlist.ts +0 -54
  601. package/src/sdk/elevation/audit.ts +0 -208
  602. package/src/sdk/elevation/capability.ts +0 -41
  603. package/src/sdk/elevation/digest.ts +0 -129
  604. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  605. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  606. package/src/sdk/elevation/owner.ts +0 -109
  607. package/src/session/auth-broker-config.ts +0 -109
  608. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  609. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  610. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -1247,6 +1247,14 @@ export interface NotificationRecoveryReport {
1247
1247
  endpointsRetainedPlaceholders?: string[];
1248
1248
  /** Cleanup entries retained with unverified or mismatching identity. */
1249
1249
  endpointsRetainedUnknown?: string[];
1250
+ /** Stale quarantine/staging debris removed from the endpoint and daemon dirs. */
1251
+ debrisRemoved?: string[];
1252
+ /** Debris candidates retained by policy (young, live writer). */
1253
+ debrisKept?: number;
1254
+ /** Debris removals attempted without conclusive success (identity/unlink). */
1255
+ debrisFailures?: number;
1256
+ /** At least one debris directory listing failed; the sweep was not exhaustive. */
1257
+ debrisScanFailed?: boolean;
1250
1258
  daemon: {
1251
1259
  action: DaemonRecoveryAction;
1252
1260
  detail: string;
@@ -1478,6 +1486,168 @@ async function detachStaleTransitionMarker(input: {
1478
1486
  return await detachTransitionMarker(input.fs, input.path, snapshot);
1479
1487
  }
1480
1488
 
1489
+ // --- stale debris sweep ---------------------------------------------------
1490
+
1491
+ /**
1492
+ * Minimum age before age-based debris removal. Quarantine artifacts are inert
1493
+ * the moment they are detached, but the age bound keeps the sweep clear of any
1494
+ * recovery pass still holding a `detachedPath` reference in its report.
1495
+ */
1496
+ export const NOTIFICATION_DEBRIS_MIN_AGE_MS = 60 * 60 * 1_000;
1497
+
1498
+ const UUID_PATTERN = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
1499
+ /** Quarantine target of a detached daemon transition marker (telegram-daemon exact unlink). */
1500
+ const DEBRIS_TRANSITION_QUARANTINE = new RegExp(`^transition-${UUID_PATTERN}$`);
1501
+ /** Quarantine target of a detached notification endpoint file. */
1502
+ const DEBRIS_ENDPOINT_QUARANTINE = new RegExp(`^\\.gjc-delete-notification-endpoint-${UUID_PATTERN}\\.json$`);
1503
+ /** Native exact-unlink exchange placeholder left behind by a failed verified cleanup. */
1504
+ const DEBRIS_UNLINK_PLACEHOLDER = /^\.gjc-exact-unlink-placeholder-/;
1505
+ /** Atomic-write staging file: `<canonical>.<pid>.<epochMs>.<random>.tmp`. */
1506
+ const DEBRIS_STAGING_TMP = /\.([0-9]{1,10})\.[0-9]{1,16}\.[a-z0-9]{1,24}\.tmp$/;
1507
+
1508
+ export interface NotificationDebrisSweepReport {
1509
+ /** Basenames removed from the swept directory. */
1510
+ removed: string[];
1511
+ /** Debris candidates retained (young, live writer, or identity/unlink refusal). */
1512
+ kept: number;
1513
+ /**
1514
+ * Candidates whose removal was ATTEMPTED and did not conclusively succeed
1515
+ * (identity mismatch, unreadable candidate, unlink error). Distinct from
1516
+ * `kept`-by-policy so a caller can see that a sweep was not fully effective.
1517
+ */
1518
+ failures: number;
1519
+ /** The directory listing itself failed; nothing could be inspected. */
1520
+ scanFailed?: boolean;
1521
+ }
1522
+
1523
+ /**
1524
+ * Remove inert filesystem debris from a notification/state directory:
1525
+ * quarantine targets of already-detached markers and endpoints, exact-unlink
1526
+ * exchange placeholders, and leaked atomic-write staging files.
1527
+ *
1528
+ * Removal requires positive staleness proof — a dead recorded writer pid for
1529
+ * staging files, or an mtime older than {@link NOTIFICATION_DEBRIS_MIN_AGE_MS}
1530
+ * for everything else. Canonical files can never match the debris patterns, and
1531
+ * a young staging file with a live writer is kept.
1532
+ *
1533
+ * Age, terminal-scrub proof, and the delete identity all come from ONE
1534
+ * no-follow snapshot of the candidate. Judging age from a separate `stat` would
1535
+ * prove one pathname stale and then bind the delete to whatever occupied that
1536
+ * pathname afterwards, so a live successor could be removed on a predecessor's
1537
+ * staleness. A candidate replaced after the snapshot fails the identity match
1538
+ * and is retained; a symlinked, non-regular, or unreadable candidate is refused
1539
+ * outright. Every inconclusive attempt is counted in `failures` rather than
1540
+ * silently folded into `kept`.
1541
+ */
1542
+ export async function sweepNotificationDebris(input: {
1543
+ dir: string;
1544
+ deps?: NotificationServiceDeps;
1545
+ minAgeMs?: number;
1546
+ }): Promise<NotificationDebrisSweepReport> {
1547
+ const deps = input.deps ?? {};
1548
+ const fs = deps.fs ?? nodeServiceFs;
1549
+ const pidAlive = deps.pidAlive ?? defaultPidAlive;
1550
+ const now = deps.now ?? Date.now;
1551
+ const minAgeMs = input.minAgeMs ?? NOTIFICATION_DEBRIS_MIN_AGE_MS;
1552
+ const removed: string[] = [];
1553
+ let kept = 0;
1554
+ let failures = 0;
1555
+ let names: string[] = [];
1556
+ try {
1557
+ names = await fs.readdir(input.dir);
1558
+ } catch {
1559
+ return { removed, kept, failures, scanFailed: true };
1560
+ }
1561
+ for (const name of names) {
1562
+ const staging = DEBRIS_STAGING_TMP.exec(name);
1563
+ const placeholder = DEBRIS_UNLINK_PLACEHOLDER.test(name);
1564
+ const quarantineLike =
1565
+ DEBRIS_TRANSITION_QUARANTINE.test(name) || DEBRIS_ENDPOINT_QUARANTINE.test(name) || placeholder;
1566
+ if (!staging && !quarantineLike) continue;
1567
+ const file = path.join(input.dir, name);
1568
+ // ONE no-follow snapshot decides everything: age, terminal-scrub proof, and
1569
+ // the identity the delete is bound to. Reading mtime separately (e.g. via
1570
+ // `stat`) would judge the age of one pathname and then delete whatever
1571
+ // occupied it afterwards — the exact-unlink identity would faithfully bind
1572
+ // to a successor that was never proved stale.
1573
+ const candidate = await fs.readEndpointFile(file).catch(() => undefined);
1574
+ if (!candidate) {
1575
+ // Unreadable, symlinked, or non-regular: never a pathname unlink, and
1576
+ // an operational failure rather than silent policy retention.
1577
+ failures += 1;
1578
+ continue;
1579
+ }
1580
+ const mtimeMs = Number(candidate.identity.mtimeNs / 1_000_000n);
1581
+ const olderThanMinAge = Number.isFinite(mtimeMs) && now() - mtimeMs > minAgeMs;
1582
+ const deadWriter =
1583
+ staging !== null &&
1584
+ (() => {
1585
+ const writerPid = Number.parseInt(staging[1] ?? "", 10);
1586
+ return Number.isSafeInteger(writerPid) && writerPid > 0 && !pidAlive(writerPid);
1587
+ })();
1588
+ if (!deadWriter && !olderThanMinAge) {
1589
+ kept += 1;
1590
+ continue;
1591
+ }
1592
+ if (placeholder && candidate.bytes.length > 0) {
1593
+ // A native exchange placeholder is inert only once it is the terminal
1594
+ // scrubbed remnant. A NONEMPTY placeholder may still carry the retained
1595
+ // cleanup evidence for an endpoint whose verified removal failed.
1596
+ kept += 1;
1597
+ continue;
1598
+ }
1599
+ try {
1600
+ const result = await fs.exactUnlink(file, candidate.identity);
1601
+ if (result.ok) {
1602
+ removed.push(name);
1603
+ continue;
1604
+ }
1605
+ // A typed retained cleanup with the canonical path proven absent is a
1606
+ // completed removal; anything else keeps the file.
1607
+ const retainedRemoved =
1608
+ result.code === "cleanup_pending" &&
1609
+ typeof result.detachedPath === "string" &&
1610
+ result.detachedPath.length > 0 &&
1611
+ (await fs.readFile(file, "utf8").catch(() => undefined)) === undefined;
1612
+ if (retainedRemoved) removed.push(name);
1613
+ else failures += 1;
1614
+ } catch {
1615
+ failures += 1;
1616
+ }
1617
+ }
1618
+ return { removed, kept, failures };
1619
+ }
1620
+
1621
+ /**
1622
+ * Operator-authorized detach of a provenance-less blocking transition marker.
1623
+ *
1624
+ * The normal reclaim path (`detachStaleTransitionMarker`) refuses malformed and
1625
+ * empty markers because they carry no owner proof. `--force-daemon-lock` is the
1626
+ * documented operator confirmation that no legacy writer remains, so under that
1627
+ * flag a marker that is unparseable AND older than the transition grace window
1628
+ * may be detached through the identity-bound primitive. Valid markers are never
1629
+ * force-detached here — dead-owner reclaim already covers them, and a live
1630
+ * owner's marker must stay untouchable even under force.
1631
+ */
1632
+ async function forceDetachBlockedTransitionMarker(input: {
1633
+ fs: TransitionMarkerFs;
1634
+ path: string;
1635
+ now: number;
1636
+ }): Promise<boolean> {
1637
+ const snapshot = await readTransitionMarker(input.fs, input.path);
1638
+ if (!snapshot) return false;
1639
+ try {
1640
+ if (isDaemonTransitionLock(JSON.parse(snapshot.raw))) return false;
1641
+ } catch {
1642
+ // Unparseable marker: exactly the class force is for.
1643
+ }
1644
+ if (!input.fs.stat) return false;
1645
+ const st = await input.fs.stat(input.path).catch(() => undefined);
1646
+ if (!st || !Number.isFinite(st.mtimeMs)) return false;
1647
+ if (input.now - st.mtimeMs <= TRANSITION_MARKER_GRACE_MS) return false;
1648
+ return await detachTransitionMarker(input.fs, input.path, snapshot);
1649
+ }
1650
+
1481
1651
  /**
1482
1652
  * Owner-bound removal of a dead daemon's lock. Closes the classic
1483
1653
  * check-then-unlink TOCTOU: a naive `unlink(lock)` after observing a dead owner
@@ -1494,6 +1664,7 @@ async function removeDeadOwnerLock(
1494
1664
  expected: NormalizedDaemonState,
1495
1665
  now: () => number,
1496
1666
  pidIncarnation: (pid: number) => string | undefined,
1667
+ forceDaemonLock = false,
1497
1668
  ): Promise<"cleared" | "contended" | "superseded" | "now-alive" | "unlink-failed"> {
1498
1669
  let transition = await acquireDaemonTransitionLock({
1499
1670
  fs,
@@ -1510,6 +1681,7 @@ async function removeDeadOwnerLock(
1510
1681
  pidAlive,
1511
1682
  pidIncarnation,
1512
1683
  });
1684
+ if (forceDaemonLock) await forceDetachBlockedTransitionMarker({ fs, path: paths.steal, now: now() });
1513
1685
  transition = await acquireDaemonTransitionLock({
1514
1686
  fs,
1515
1687
  path: paths.steal,
@@ -1656,6 +1828,7 @@ export async function recoverNotifications(opts: RecoveryOptions): Promise<Notif
1656
1828
  state,
1657
1829
  now,
1658
1830
  deps.pidIncarnation ?? defaultTransitionPidIncarnation,
1831
+ opts.forceDaemonLock === true,
1659
1832
  );
1660
1833
  const action: DaemonRecoveryAction =
1661
1834
  outcome === "cleared"
@@ -1713,6 +1886,21 @@ export async function recoverNotifications(opts: RecoveryOptions): Promise<Notif
1713
1886
  };
1714
1887
  }
1715
1888
 
1889
+ // Stale debris (quarantine targets, exchange placeholders, leaked staging
1890
+ // tmp files) accumulates in both the endpoint dir and the daemon dir and
1891
+ // slows every later scan; sweep it with positive staleness proof only.
1892
+ const debrisRemoved: string[] = [];
1893
+ let debrisKept = 0;
1894
+ let debrisFailures = 0;
1895
+ let debrisScanFailed = false;
1896
+ for (const sweepDir of new Set([dir, paths.dir])) {
1897
+ const swept = await sweepNotificationDebris({ dir: sweepDir, deps });
1898
+ debrisRemoved.push(...swept.removed);
1899
+ debrisKept += swept.kept;
1900
+ debrisFailures += swept.failures;
1901
+ debrisScanFailed ||= swept.scanFailed === true;
1902
+ }
1903
+
1716
1904
  return {
1717
1905
  endpointsScanned: removed.length + kept + unreadable + recoveryFailures,
1718
1906
  endpointsRemoved: removed,
@@ -1722,6 +1910,10 @@ export async function recoverNotifications(opts: RecoveryOptions): Promise<Notif
1722
1910
  endpointsRetainedSuccessors: retainedSuccessors,
1723
1911
  endpointsRetainedPlaceholders: retainedPlaceholders,
1724
1912
  endpointsRetainedUnknown: retainedUnknown,
1913
+ debrisRemoved,
1914
+ debrisKept,
1915
+ debrisFailures,
1916
+ ...(debrisScanFailed ? { debrisScanFailed } : {}),
1725
1917
  daemon,
1726
1918
  };
1727
1919
  }
@@ -1742,6 +1934,10 @@ export function formatNotificationRecoveryReport(report: NotificationRecoveryRep
1742
1934
  lines.push(` - retained exchange placeholder cleanup path ${placeholder}`);
1743
1935
  for (const unknown of report.endpointsRetainedUnknown ?? [])
1744
1936
  lines.push(` - retained unverified cleanup path ${unknown}`);
1937
+ if (report.debrisRemoved !== undefined || report.debrisKept !== undefined)
1938
+ lines.push(
1939
+ ` debris: removed ${report.debrisRemoved?.length ?? 0}, kept ${report.debrisKept ?? 0}, failed ${report.debrisFailures ?? 0}${report.debrisScanFailed ? ", scan failed" : ""}`,
1940
+ );
1745
1941
  lines.push(` daemon: ${report.daemon.action} — ${report.daemon.detail}`);
1746
1942
  if (report.daemon.blockingReason) lines.push(` - blocking reason: ${report.daemon.blockingReason}`);
1747
1943
  if (report.daemon.markerAgeMs !== undefined)
@@ -1,6 +1,6 @@
1
1
  export interface NotificationOperatorTimerDeps {
2
2
  now?: () => number;
3
- setTimeoutImpl?: typeof setTimeout;
3
+ setTimeoutImpl?: (callback: () => void, ms?: number) => Timer | NodeJS.Timeout;
4
4
  clearTimeoutImpl?: typeof clearTimeout;
5
5
  setIntervalImpl?: typeof setInterval;
6
6
  clearIntervalImpl?: typeof clearInterval;
@@ -1,5 +1,6 @@
1
1
  /**
2
- * Bounded authoritative reconciliation state for Q26 `turn.prompt_status`.
2
+ * Bounded prompt reconciliation state for canonical Q26 `turn.result` with
3
+ * `kind: "prompt"`, plus the legacy `turn.prompt_status` alias.
3
4
  *
4
5
  * Separate from the lifecycle delivery buffers (promptSubmissions /
5
6
  * promptTerminalTombstones), which exist to deliver frames and intentionally
@@ -9,8 +10,8 @@
9
10
  *
10
11
  * Semantics (public contract, mirrored in sdk/prompt-status.ts):
11
12
  * - Active records are NEVER converted to terminal by age or capacity.
12
- * - Terminal records are retained for TERMINAL_TTL_MS and bounded to
13
- * TERMINAL_CAPACITY, evicted oldest-terminal-first by terminalAt; only then
13
+ * - Terminal records are bounded to TERMINAL_CAPACITY and evicted
14
+ * oldest-terminal-first by terminalAt; only then
14
15
  * does a lookup honestly report `unknown`.
15
16
  * - Process-local durability floor is the live session process: restart means `unknown`.
16
17
  * Session-scoped durable retention (kind-aware store) is provided by reconciliation-store.ts (#3032).
@@ -22,12 +23,11 @@
22
23
  */
23
24
 
24
25
  import { PROMPT_FAILURE_CODE_MAX, sanitizePromptFailure } from "../prompt-failure";
26
+ import type { ReceiptState } from "../receipt-state";
25
27
 
26
28
  export { PROMPT_FAILURE_CODE_MAX, sanitizePromptFailure };
27
-
28
29
  export const PROMPT_RECONCILIATION_ACTIVE_CAPACITY = 128;
29
30
  export const PROMPT_RECONCILIATION_TERMINAL_CAPACITY = 256;
30
- export const PROMPT_RECONCILIATION_TERMINAL_TTL_MS = 15 * 60_000;
31
31
 
32
32
  export type PromptReconciliationStatus = "accepted" | "in_flight" | "terminal_ok" | "failed";
33
33
 
@@ -43,11 +43,13 @@ export interface PromptReconciliationRecord extends PromptCorrelation {
43
43
  acceptedAt: number;
44
44
  startedAt?: number;
45
45
  terminalAt?: number;
46
+ receiptState?: Exclude<ReceiptState, "absent">;
46
47
  }
47
48
 
48
49
  export type TurnPromptReconciliation =
49
50
  | {
50
51
  status: "accepted";
52
+ receiptState: "absent";
51
53
  commandId: string;
52
54
  turnId: string;
53
55
  clientRef?: string;
@@ -55,6 +57,7 @@ export type TurnPromptReconciliation =
55
57
  }
56
58
  | {
57
59
  status: "in_flight";
60
+ receiptState: "absent";
58
61
  commandId: string;
59
62
  turnId: string;
60
63
  clientRef?: string;
@@ -63,6 +66,7 @@ export type TurnPromptReconciliation =
63
66
  }
64
67
  | {
65
68
  status: "terminal_ok";
69
+ receiptState: Exclude<ReceiptState, "absent">;
66
70
  commandId: string;
67
71
  turnId: string;
68
72
  clientRef?: string;
@@ -74,6 +78,7 @@ export type TurnPromptReconciliation =
74
78
  }
75
79
  | {
76
80
  status: "failed";
81
+ receiptState: Exclude<ReceiptState, "absent">;
77
82
  commandId: string;
78
83
  turnId: string;
79
84
  clientRef?: string;
@@ -82,7 +87,7 @@ export type TurnPromptReconciliation =
82
87
  terminalAt: number;
83
88
  error: { code: string; message: string };
84
89
  }
85
- | { status: "unknown" };
90
+ | { status: "unknown"; receiptState: "unknown" };
86
91
 
87
92
  export interface PromptReconciliation {
88
93
  /** Fail-closed admission BEFORE any execution; holds an identity-bound reservation. */
@@ -94,7 +99,10 @@ export interface PromptReconciliation {
94
99
  /** Lifecycle transition; terminal outcomes settle exactly once. */
95
100
  noteTransition(
96
101
  correlation: PromptCorrelation | undefined,
97
- frame: { type: "agent_start" | "agent_end" } | { type: "agent_failed"; error: unknown },
102
+ frame:
103
+ | { type: "agent_start" }
104
+ | { type: "agent_end"; finalText?: string }
105
+ | { type: "agent_failed"; error: unknown; finalText?: string },
98
106
  ): void;
99
107
  lookup(selector: { commandId?: string; turnId?: string; clientRef?: string }): TurnPromptReconciliation;
100
108
  cleanup(): void;
@@ -121,10 +129,6 @@ export function createPromptReconciliation(options: { now?: () => number } = {})
121
129
  };
122
130
 
123
131
  const cleanup = () => {
124
- const at = now();
125
- for (const [key, record] of records)
126
- if (record.terminalAt !== undefined && record.terminalAt + PROMPT_RECONCILIATION_TERMINAL_TTL_MS <= at)
127
- remove(key);
128
132
  const terminalEntries = [...records.entries()].filter(([, record]) => record.terminalAt !== undefined);
129
133
  if (terminalEntries.length <= PROMPT_RECONCILIATION_TERMINAL_CAPACITY) return;
130
134
  // Evict oldest-terminal-first by terminalAt, not acceptance/insertion
@@ -184,7 +188,10 @@ export function createPromptReconciliation(options: { now?: () => number } = {})
184
188
 
185
189
  const noteTransition = (
186
190
  correlation: PromptCorrelation | undefined,
187
- frame: { type: "agent_start" | "agent_end" } | { type: "agent_failed"; error: unknown },
191
+ frame:
192
+ | { type: "agent_start" }
193
+ | { type: "agent_end"; finalText?: string }
194
+ | { type: "agent_failed"; error: unknown; finalText?: string },
188
195
  ) => {
189
196
  if (!correlation) return;
190
197
  const record = records.get(keyOf(correlation));
@@ -207,6 +214,7 @@ export function createPromptReconciliation(options: { now?: () => number } = {})
207
214
  return;
208
215
  }
209
216
  record.terminalAt = now();
217
+ record.receiptState = frame.finalText?.trim() ? "present" : "missing";
210
218
  if (frame.type === "agent_failed") {
211
219
  record.status = "failed";
212
220
  record.error = sanitizePromptFailure(frame.error);
@@ -226,20 +234,21 @@ export function createPromptReconciliation(options: { now?: () => number } = {})
226
234
  ? keyOf({ commandId: selector.commandId, turnId: selector.turnId })
227
235
  : undefined;
228
236
  const record = key === undefined ? undefined : records.get(key);
229
- if (!record) return { status: "unknown" };
237
+ if (!record) return { status: "unknown", receiptState: "unknown" };
230
238
  const identity = {
231
239
  commandId: record.commandId,
232
240
  turnId: record.turnId,
233
241
  ...(record.clientRef !== undefined ? { clientRef: record.clientRef } : {}),
234
242
  acceptedAt: record.acceptedAt,
235
243
  };
236
- if (record.status === "accepted") return { status: "accepted", ...identity };
244
+ if (record.status === "accepted") return { status: "accepted", receiptState: "absent", ...identity };
237
245
  if (record.status === "in_flight")
238
- return { status: "in_flight", ...identity, startedAt: record.startedAt as number };
246
+ return { status: "in_flight", receiptState: "absent", ...identity, startedAt: record.startedAt as number };
239
247
  const terminal = {
240
248
  ...identity,
241
249
  ...(record.startedAt !== undefined ? { startedAt: record.startedAt } : {}),
242
250
  terminalAt: record.terminalAt as number,
251
+ receiptState: record.receiptState ?? "unknown",
243
252
  };
244
253
  if (record.status === "terminal_ok")
245
254
  return {