@gajae-code/coding-agent 0.13.3 → 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 (599) hide show
  1. package/CHANGELOG.md +184 -2
  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 +9 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +70 -6
  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 +1 -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/gajae-pet-widget.d.ts +8 -30
  87. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  88. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  89. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  90. package/dist/types/modes/components/pet-capability.d.ts +11 -25
  91. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  92. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  93. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  94. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  95. package/dist/types/modes/interactive-mode.d.ts +1 -0
  96. package/dist/types/modes/types.d.ts +1 -0
  97. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  98. package/dist/types/runtime-mcp/config.d.ts +9 -0
  99. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  100. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  101. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  102. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  103. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  104. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  105. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  106. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  107. package/dist/types/runtime-mcp/types.d.ts +102 -10
  108. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  109. package/dist/types/sdk/broker/broker.d.ts +3 -55
  110. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  111. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  112. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  113. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  114. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  115. package/dist/types/sdk/bus/config.d.ts +11 -0
  116. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  117. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  118. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  119. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  120. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  121. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  122. package/dist/types/sdk/bus/index.d.ts +85 -99
  123. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  124. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  125. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  126. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  127. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  128. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  129. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  130. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  131. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  132. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  133. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  135. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  136. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  137. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  138. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  139. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  140. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  141. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  142. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  143. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  144. package/dist/types/sdk/cli/rows.d.ts +2 -11
  145. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  146. package/dist/types/sdk/client/client.d.ts +97 -1
  147. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  148. package/dist/types/sdk/host/control/index.d.ts +1 -1
  149. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  150. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  151. package/dist/types/sdk/host/host.d.ts +15 -1
  152. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  153. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  154. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  155. package/dist/types/sdk/host/types.d.ts +1 -1
  156. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  157. package/dist/types/sdk/index.d.ts +2 -1
  158. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  159. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  160. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  161. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  162. package/dist/types/sdk/mcp/server.d.ts +9 -6
  163. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  164. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  165. package/dist/types/sdk/prompt-status.d.ts +10 -3
  166. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  167. package/dist/types/sdk/receipt-state.d.ts +17 -0
  168. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  169. package/dist/types/sdk/router/index.d.ts +1 -0
  170. package/dist/types/sdk/router/session-router.d.ts +152 -0
  171. package/dist/types/sdk/session-list.d.ts +22 -0
  172. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  173. package/dist/types/sdk/session.d.ts +34 -1
  174. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  175. package/dist/types/session/account-inventory.d.ts +86 -0
  176. package/dist/types/session/agent-session.d.ts +145 -6
  177. package/dist/types/session/agent-storage.d.ts +10 -0
  178. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  179. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  180. package/dist/types/session/messages.d.ts +1 -1
  181. package/dist/types/session/secure-token-file.d.ts +3 -0
  182. package/dist/types/session/session-manager.d.ts +40 -1
  183. package/dist/types/session/startup-auth-config.d.ts +44 -0
  184. package/dist/types/session/terminal-abort.d.ts +378 -0
  185. package/dist/types/session/yield-queue.d.ts +7 -0
  186. package/dist/types/session-import/claude.d.ts +26 -0
  187. package/dist/types/session-import/codex.d.ts +88 -0
  188. package/dist/types/session-import/command.d.ts +35 -0
  189. package/dist/types/session-import/detect.d.ts +22 -0
  190. package/dist/types/session-import/index.d.ts +7 -0
  191. package/dist/types/session-import/provider-codex.d.ts +22 -0
  192. package/dist/types/session-import/provider-service.d.ts +38 -0
  193. package/dist/types/session-import/redact.d.ts +23 -0
  194. package/dist/types/session-import/service.d.ts +47 -0
  195. package/dist/types/session-import/types.d.ts +120 -0
  196. package/dist/types/setup/paseo/check.d.ts +16 -0
  197. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  198. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  199. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  200. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  201. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  202. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  203. package/dist/types/setup/paseo/remove.d.ts +14 -0
  204. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  205. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  206. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  207. package/dist/types/skill-state/active-state.d.ts +5 -1
  208. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  209. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  210. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  211. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  212. package/dist/types/slash-commands/types.d.ts +7 -1
  213. package/dist/types/task/executor.d.ts +10 -0
  214. package/dist/types/task/index.d.ts +3 -1
  215. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  216. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  217. package/dist/types/tools/bash.d.ts +2 -6
  218. package/dist/types/tools/browser/attach.d.ts +11 -0
  219. package/dist/types/tools/browser/launch.d.ts +20 -0
  220. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  221. package/dist/types/tools/browser/render.d.ts +1 -0
  222. package/dist/types/tools/browser.d.ts +3 -1
  223. package/dist/types/tools/image-gen.d.ts +9 -2
  224. package/dist/types/tools/index.d.ts +8 -0
  225. package/dist/types/tools/monitor.d.ts +1 -1
  226. package/dist/types/tools/skill-discovery.d.ts +8 -1
  227. package/dist/types/tools/subagent.d.ts +2 -0
  228. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  229. package/dist/types/utils/herdr-pane.d.ts +76 -0
  230. package/package.json +19 -9
  231. package/scripts/build-binary.ts +2 -1
  232. package/scripts/build-sdk-package-smoke.ts +2 -13
  233. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  234. package/scripts/compile-args.ts +2 -0
  235. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  236. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  237. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  238. package/scripts/generate-tool-catalog.ts +6 -4
  239. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  240. package/src/async/job-manager.ts +352 -17
  241. package/src/async/support.ts +25 -0
  242. package/src/autoresearch/dashboard.ts +28 -13
  243. package/src/capability/index.ts +3 -1
  244. package/src/capability/mcp.ts +6 -0
  245. package/src/capability/types.ts +6 -0
  246. package/src/cli/accounts-cli.ts +395 -0
  247. package/src/cli/args.ts +23 -0
  248. package/src/cli/auth-broker-cli.ts +136 -66
  249. package/src/cli/auth-gateway-cli.ts +94 -70
  250. package/src/cli/config-cli.ts +27 -2
  251. package/src/cli/crash-cli.ts +78 -0
  252. package/src/cli/customize-doctor.ts +1605 -0
  253. package/src/cli/daemon-cli.ts +12 -3
  254. package/src/cli/fast-help.ts +1 -0
  255. package/src/cli/mcp-cli.ts +128 -60
  256. package/src/cli/notify-cli.ts +8 -14
  257. package/src/cli/root-flags.ts +8 -0
  258. package/src/cli/setup-cli.ts +145 -0
  259. package/src/cli/skills-cli.ts +38 -2
  260. package/src/cli/update-cli.ts +167 -12
  261. package/src/cli.ts +4 -0
  262. package/src/commands/accounts.ts +71 -0
  263. package/src/commands/crash.ts +35 -0
  264. package/src/commands/customize.ts +84 -0
  265. package/src/commands/daemon.ts +2 -2
  266. package/src/commands/deep-interview.ts +2 -0
  267. package/src/commands/launch.ts +1 -0
  268. package/src/commands/mcp.ts +12 -7
  269. package/src/commands/ralplan.ts +2 -0
  270. package/src/commands/sdk.ts +65 -32
  271. package/src/commands/setup.ts +5 -0
  272. package/src/commands/skills.ts +14 -4
  273. package/src/commands/ultragoal.ts +10 -1
  274. package/src/commands/update.ts +26 -15
  275. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  276. package/src/config/atomic-yaml-patch.ts +769 -29
  277. package/src/config/config-schema-version.ts +10 -0
  278. package/src/config/file-lock.ts +70 -1
  279. package/src/config/mcp-schema.json +52 -14
  280. package/src/config/model-profile-activation.ts +20 -1
  281. package/src/config/model-profiles.ts +29 -19
  282. package/src/config/model-registry.ts +132 -21
  283. package/src/config/models-config-schema.ts +1 -1
  284. package/src/config/settings-schema.ts +76 -6
  285. package/src/config/settings.ts +4038 -199
  286. package/src/config/skill-settings-defaults.ts +41 -3
  287. package/src/config/task-delegation.ts +87 -0
  288. package/src/config/update-channel.ts +23 -0
  289. package/src/coordinator-mcp/server.ts +377 -308
  290. package/src/crash/index-store.ts +723 -0
  291. package/src/crash/nudge.ts +89 -0
  292. package/src/crash/record-loader.ts +149 -0
  293. package/src/crash/report.ts +551 -0
  294. package/src/crash/sanitize.ts +129 -0
  295. package/src/cursor.ts +36 -10
  296. package/src/customization/import.ts +946 -0
  297. package/src/customization/index.ts +4 -0
  298. package/src/customization/inventory.ts +335 -0
  299. package/src/customization/mutations.ts +141 -0
  300. package/src/customization/types.ts +223 -0
  301. package/src/daemon/control-types.ts +8 -1
  302. package/src/daemon/operator-contract.ts +6 -6
  303. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  304. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  305. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  306. package/src/discovery/claude-hooks.ts +38 -0
  307. package/src/discovery/claude.ts +142 -209
  308. package/src/discovery/codex-hooks.ts +38 -0
  309. package/src/discovery/codex.ts +132 -198
  310. package/src/discovery/helpers.ts +8 -1
  311. package/src/discovery/index.ts +2 -0
  312. package/src/discovery/mcp-compat.ts +234 -0
  313. package/src/discovery/mcp-json.ts +6 -0
  314. package/src/edit/renderer.ts +40 -0
  315. package/src/edit/streaming.ts +4 -2
  316. package/src/exec/bash-executor.ts +24 -20
  317. package/src/export/html/index.ts +51 -2
  318. package/src/extensibility/extensions/loader.ts +9 -1
  319. package/src/extensibility/extensions/runner.ts +17 -4
  320. package/src/extensibility/extensions/types.ts +31 -6
  321. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  322. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  323. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  324. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  325. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  326. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  327. package/src/extensibility/hooks/loader.ts +154 -10
  328. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  329. package/src/extensibility/skill-management.ts +368 -0
  330. package/src/extensibility/skills.ts +52 -16
  331. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  332. package/src/gjc-runtime/launch-worktree.ts +56 -2
  333. package/src/gjc-runtime/linux-proc.ts +7 -1
  334. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  335. package/src/gjc-runtime/session-state-lock.ts +992 -0
  336. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  337. package/src/gjc-runtime/state-writer.ts +39 -14
  338. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  339. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  340. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  341. package/src/gjc-runtime/workflow-settings.ts +596 -0
  342. package/src/goals/tools/goal-tool.ts +6 -1
  343. package/src/hooks/events.ts +291 -0
  344. package/src/hooks/native-skill-hook.ts +4 -0
  345. package/src/hooks/normalize.ts +369 -0
  346. package/src/hooks/skill-state.ts +165 -46
  347. package/src/internal-urls/docs-index.generated.ts +40 -32
  348. package/src/main.ts +32 -5
  349. package/src/migrate/mcp-mapper.ts +25 -2
  350. package/src/modes/acp/abort-scope.ts +29 -0
  351. package/src/modes/acp/acp-agent.ts +423 -98
  352. package/src/modes/components/assistant-message.ts +6 -1
  353. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  354. package/src/modes/components/customization/import-wizard.ts +372 -0
  355. package/src/modes/components/customization/index.ts +1 -0
  356. package/src/modes/components/gajae-pet-widget.ts +539 -213
  357. package/src/modes/components/irc-sidebar.ts +11 -0
  358. package/src/modes/components/iterm-pet-transport.ts +585 -0
  359. package/src/modes/components/oauth-selector.ts +277 -86
  360. package/src/modes/components/pet-capability.ts +39 -40
  361. package/src/modes/components/settings-selector.ts +9 -0
  362. package/src/modes/components/status-line/gh.ts +45 -1
  363. package/src/modes/components/status-line/segments.ts +16 -1
  364. package/src/modes/components/tool-status-header.ts +13 -3
  365. package/src/modes/controllers/command-controller.ts +20 -8
  366. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  367. package/src/modes/controllers/input-controller.ts +10 -0
  368. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  369. package/src/modes/controllers/selector-controller.ts +177 -72
  370. package/src/modes/controllers/stt-controller.ts +3 -3
  371. package/src/modes/interactive-mode.ts +88 -16
  372. package/src/modes/print-mode.ts +35 -6
  373. package/src/modes/runtime-init.ts +21 -68
  374. package/src/modes/types.ts +1 -0
  375. package/src/modes/utils/injected-user-submission.ts +25 -0
  376. package/src/modes/utils/terminal-bell.ts +15 -1
  377. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  378. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  379. package/src/prompts/agents/critic.md +1 -1
  380. package/src/prompts/system/rlm-research.md +1 -1
  381. package/src/prompts/system/system-prompt.md +0 -2
  382. package/src/prompts/tools/bash.md +7 -1
  383. package/src/prompts/tools/browser.md +1 -1
  384. package/src/prompts/tools/cron.md +6 -6
  385. package/src/prompts/tools/read.md +0 -2
  386. package/src/prompts/tools/skill-discovery.md +4 -2
  387. package/src/runtime-mcp/client.ts +427 -23
  388. package/src/runtime-mcp/config.ts +37 -5
  389. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  390. package/src/runtime-mcp/manager.ts +52 -2
  391. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  392. package/src/runtime-mcp/oauth-flow.ts +46 -1
  393. package/src/runtime-mcp/pool-key.ts +5 -1
  394. package/src/runtime-mcp/pool.test.ts +9 -0
  395. package/src/runtime-mcp/protocol.test.ts +353 -0
  396. package/src/runtime-mcp/protocol.ts +624 -0
  397. package/src/runtime-mcp/scope-config.ts +78 -0
  398. package/src/runtime-mcp/tool-bridge.ts +44 -10
  399. package/src/runtime-mcp/transports/http.ts +84 -13
  400. package/src/runtime-mcp/types.ts +123 -12
  401. package/src/sdk/acp/adapter.ts +328 -97
  402. package/src/sdk/broker/broker.ts +160 -741
  403. package/src/sdk/broker/ensure.ts +9 -1
  404. package/src/sdk/broker/lifecycle.ts +510 -116
  405. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  406. package/src/sdk/broker/process-incarnation.ts +19 -0
  407. package/src/sdk/broker/session-index.ts +516 -117
  408. package/src/sdk/broker/startup-failure.ts +28 -5
  409. package/src/sdk/broker/transport.ts +1 -13
  410. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  411. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  412. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  413. package/src/sdk/bus/config.ts +13 -0
  414. package/src/sdk/bus/conversation-store.ts +59 -171
  415. package/src/sdk/bus/daemon-paths.ts +20 -0
  416. package/src/sdk/bus/discord-conversation.ts +2 -0
  417. package/src/sdk/bus/discord-daemon.ts +524 -126
  418. package/src/sdk/bus/discord-live-provider.ts +206 -79
  419. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  420. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  421. package/src/sdk/bus/index.ts +2480 -456
  422. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  423. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  424. package/src/sdk/bus/managed-daemon.ts +2 -145
  425. package/src/sdk/bus/notification-service.ts +196 -0
  426. package/src/sdk/bus/operator-runtime.ts +1 -1
  427. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  428. package/src/sdk/bus/reconciliation-store.ts +553 -24
  429. package/src/sdk/bus/session-control.ts +49 -3
  430. package/src/sdk/bus/slack-conversation.ts +4 -0
  431. package/src/sdk/bus/slack-daemon.ts +733 -134
  432. package/src/sdk/bus/slack-live-provider.ts +65 -15
  433. package/src/sdk/bus/slack-provider.ts +4 -0
  434. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  435. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  436. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  437. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  438. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  439. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  440. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  441. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  442. package/src/sdk/bus/telegram-reference.ts +1 -226
  443. package/src/sdk/bus/telegram-setup.ts +2 -2
  444. package/src/sdk/bus/threaded-render.ts +1 -0
  445. package/src/sdk/bus/topic-registry.ts +279 -146
  446. package/src/sdk/cli/rows.ts +2 -35
  447. package/src/sdk/cli/session-cli.ts +776 -700
  448. package/src/sdk/client/client.ts +892 -1
  449. package/src/sdk/host/control/dispatch.ts +93 -58
  450. package/src/sdk/host/control/index.ts +1 -1
  451. package/src/sdk/host/control/operations.ts +18 -10
  452. package/src/sdk/host/control/runtime-gate.ts +40 -0
  453. package/src/sdk/host/host.ts +63 -12
  454. package/src/sdk/host/query/handlers.ts +66 -7
  455. package/src/sdk/host/reverse-leases.ts +2 -2
  456. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  457. package/src/sdk/host/session-runtime.test.ts +2787 -34
  458. package/src/sdk/host/session-runtime.ts +1489 -101
  459. package/src/sdk/host/surface-policy.ts +12 -8
  460. package/src/sdk/host/types.ts +1 -1
  461. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  462. package/src/sdk/host/websocket-transport.ts +85 -50
  463. package/src/sdk/index.ts +2 -1
  464. package/src/sdk/lifecycle/broker-client.ts +53 -0
  465. package/src/sdk/lifecycle/client.ts +234 -0
  466. package/src/sdk/lifecycle/index.ts +3 -0
  467. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  468. package/src/sdk/lifecycle/service.ts +720 -0
  469. package/src/sdk/mcp/server.ts +226 -188
  470. package/src/sdk/prompt-deadline-lease.ts +55 -0
  471. package/src/sdk/prompt-deadline-manager.ts +148 -0
  472. package/src/sdk/prompt-status.ts +11 -3
  473. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  474. package/src/sdk/protocol/operation-registry.ts +71 -8
  475. package/src/sdk/receipt-state.ts +43 -0
  476. package/src/sdk/reconciliation-extensions.ts +14 -0
  477. package/src/sdk/router/index.ts +1 -0
  478. package/src/sdk/router/session-router.ts +1658 -0
  479. package/src/sdk/session-list.ts +93 -0
  480. package/src/sdk/session-reconnect.ts +45 -1
  481. package/src/sdk/session.ts +716 -120
  482. package/src/sdk/transport/serve-cli.ts +18 -34
  483. package/src/session/account-inventory.ts +603 -0
  484. package/src/session/agent-session.ts +2857 -582
  485. package/src/session/agent-storage.ts +35 -0
  486. package/src/session/blob-store.ts +32 -1
  487. package/src/session/coordinator-tool-label.ts +40 -0
  488. package/src/session/internal/managed-session-scope.ts +4 -0
  489. package/src/session/internal/managed-session-storage.ts +173 -12
  490. package/src/session/messages.ts +1 -1
  491. package/src/session/secure-token-file.ts +80 -0
  492. package/src/session/session-manager.ts +730 -58
  493. package/src/session/session-storage.ts +25 -16
  494. package/src/session/startup-auth-config.ts +297 -0
  495. package/src/session/terminal-abort.ts +1253 -0
  496. package/src/session/yield-queue.ts +57 -15
  497. package/src/session-import/claude.ts +334 -0
  498. package/src/session-import/codex.ts +1033 -0
  499. package/src/session-import/command.ts +77 -0
  500. package/src/session-import/detect.ts +133 -0
  501. package/src/session-import/index.ts +7 -0
  502. package/src/session-import/provider-codex.ts +327 -0
  503. package/src/session-import/provider-service.ts +457 -0
  504. package/src/session-import/redact.ts +128 -0
  505. package/src/session-import/service.ts +1264 -0
  506. package/src/session-import/types.ts +148 -0
  507. package/src/setup/paseo/check.ts +213 -0
  508. package/src/setup/paseo/install-saga.ts +293 -0
  509. package/src/setup/paseo/json-publisher.ts +263 -0
  510. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  511. package/src/setup/paseo/paseo-ownership.ts +224 -0
  512. package/src/setup/paseo/paseo-setup.ts +253 -0
  513. package/src/setup/paseo/provider-config.ts +139 -0
  514. package/src/setup/paseo/remove.ts +183 -0
  515. package/src/setup/paseo/result-types.ts +79 -0
  516. package/src/setup/paseo/setup-deps.ts +175 -0
  517. package/src/setup/paseo/skills-bridge.ts +260 -0
  518. package/src/skill-state/active-state.ts +21 -11
  519. package/src/slash-commands/acp-builtins.ts +9 -1
  520. package/src/slash-commands/builtin-registry.ts +98 -16
  521. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  522. package/src/slash-commands/helpers/mcp.ts +9 -3
  523. package/src/slash-commands/helpers/usage-report.ts +61 -56
  524. package/src/slash-commands/types.ts +7 -2
  525. package/src/task/executor.ts +30 -11
  526. package/src/task/index.ts +66 -7
  527. package/src/task/render.ts +23 -9
  528. package/src/tools/ask-answer-registry.ts +23 -7
  529. package/src/tools/ask.ts +8 -4
  530. package/src/tools/bash-sleep-advisory.ts +115 -0
  531. package/src/tools/bash.ts +98 -18
  532. package/src/tools/browser/attach.ts +71 -3
  533. package/src/tools/browser/launch.ts +86 -13
  534. package/src/tools/browser/profile-discovery.ts +57 -7
  535. package/src/tools/browser/render.ts +8 -1
  536. package/src/tools/browser.ts +130 -21
  537. package/src/tools/computer.enforcement.test.ts +1 -1
  538. package/src/tools/computer.ts +3 -2
  539. package/src/tools/cron.ts +12 -1
  540. package/src/tools/image-gen.ts +27 -16
  541. package/src/tools/index.ts +8 -0
  542. package/src/tools/job.ts +33 -6
  543. package/src/tools/monitor.ts +41 -2
  544. package/src/tools/skill-discovery.ts +21 -29
  545. package/src/tools/subagent.ts +142 -24
  546. package/src/tools/tool-catalog.generated.ts +6 -6
  547. package/src/tools/ultragoal-ask-guard.ts +10 -3
  548. package/src/utils/herdr-pane.ts +345 -0
  549. package/src/utils/title-generator.ts +2 -0
  550. package/src/web/scrapers/index.ts +6 -4
  551. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  552. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  553. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  554. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  555. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  556. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  557. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  558. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  559. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  560. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  561. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  562. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  563. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  564. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  565. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  566. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  567. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  568. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  569. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  570. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  571. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  572. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  573. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  574. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  575. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  576. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  577. package/dist/types/session/auth-broker-config.d.ts +0 -13
  578. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  579. package/dist/types/skills/skills.test.d.ts +0 -1
  580. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  581. package/dist/types/task/token-log.test.d.ts +0 -1
  582. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  583. package/dist/types/tools/descriptors.test.d.ts +0 -1
  584. package/scripts/g005-daemon-smoke.ts +0 -180
  585. package/scripts/g011-daemon-path-smoke.ts +0 -153
  586. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  587. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  588. package/src/sdk/bus/telegram-cli.ts +0 -212
  589. package/src/sdk/elevation/allowlist.ts +0 -54
  590. package/src/sdk/elevation/audit.ts +0 -208
  591. package/src/sdk/elevation/capability.ts +0 -41
  592. package/src/sdk/elevation/digest.ts +0 -129
  593. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  594. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  595. package/src/sdk/elevation/owner.ts +0 -109
  596. package/src/session/auth-broker-config.ts +0 -109
  597. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  598. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  599. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -1,11 +1,14 @@
1
1
  import type { PromptReconciliationStatus, SdkPromptTerminalOutcome } from "../prompt-status";
2
+ import type { ReceiptState } from "../receipt-state";
2
3
  import { type TurnResultContent } from "../turn-result";
3
4
  import type { PromptCorrelation } from "./prompt-reconciliation";
4
- export declare const RECONCILIATION_STORE_VERSION = 1;
5
+ export declare const RECONCILIATION_STORE_VERSION = 2;
6
+ export declare const RECONCILIATION_STORE_VERSION_V1 = 1;
5
7
  export declare const RECONCILIATION_SESSION_ID_PATTERN: RegExp;
6
8
  export declare const RECONCILIATION_DIR_NAME = ".sdk-reconciliation";
7
- export type ReconciliationKind = "prompt" | "skill";
8
- export interface DurableReconciliationRecord extends PromptCorrelation {
9
+ export declare function resolveReconciliationSessionFile(sessionFile: string | undefined | null, stateRoot: string, sessionId: string): string;
10
+ export type ReconciliationKind = "prompt" | "skill" | "terminal";
11
+ export interface DurableExecutionReconciliationRecord extends PromptCorrelation {
9
12
  kind: ReconciliationKind;
10
13
  clientRef?: string;
11
14
  status: PromptReconciliationStatus;
@@ -17,15 +20,98 @@ export interface DurableReconciliationRecord extends PromptCorrelation {
17
20
  startedAt?: number;
18
21
  terminalAt?: number;
19
22
  outcome?: SdkPromptTerminalOutcome;
23
+ receiptState?: Exclude<ReceiptState, "absent">;
20
24
  pendingOutcome?: SdkPromptTerminalOutcome;
25
+ pendingReceiptState?: Extract<ReceiptState, "present" | "missing">;
21
26
  /** Skill-only safe token; never skill args bodies. */
22
27
  skillName?: string;
23
28
  content?: TurnResultContent;
24
29
  }
30
+ /**
31
+ * Durable terminal scope record (approved abort-SDK plan, v2 document).
32
+ * Bounded origin/fence and owned-settlement fields only; no prompt text and no
33
+ * suppressed/deferred receipts for left-running turn work.
34
+ */
35
+ export interface DurableTerminalScopeRecord {
36
+ selection: "turn" | "owned";
37
+ /** SHA-256 of the bounded idempotency key; the raw key is never persisted. */
38
+ idempotencyKeyHash?: string;
39
+ /** SHA-256 of the canonicalized normalized input; raw input is never persisted. */
40
+ idempotencyInputHash?: string;
41
+ turnDisposition: "pending" | "stopped" | "uncertain" | "no_effect" | "no_effect_reserved" | "no_effect_marker_failure";
42
+ /** Whether the correlated agent_end event was published (AC 19). */
43
+ terminalPublished?: boolean;
44
+ ownedWorkDisposition: "not_requested" | "left_running" | "stopped" | "uncertain";
45
+ automaticDeliveryDisposition: "enabled" | "none";
46
+ resumeOnOwnedCompletion: boolean;
47
+ turnContinuationFence: {
48
+ state: "retained" | "released";
49
+ abortedAttemptEpoch: number;
50
+ blockedContinuationIds: string[];
51
+ predecessorTombstones: string[];
52
+ ownedCompletionPolicy: "enabled" | "disabled";
53
+ };
54
+ ownedDeliverySettlements?: Array<{
55
+ keyHash: string;
56
+ entryIdHash: string;
57
+ status: "settled" | "absent" | "uncertain";
58
+ observedAt: number;
59
+ }>;
60
+ responseState: "pending" | "sent" | "delivered" | "failed";
61
+ responsePayloadHash: string;
62
+ /** Hash of the replay-shaped public result a same-key retry delivers, when
63
+ * it differs from the original response (the replay appends metadata). */
64
+ replayPayloadHash?: string;
65
+ acceptedAt: number;
66
+ terminalAt?: number;
67
+ }
68
+ /** Compact evicted-key tombstone with enough disposition metadata to
69
+ * reconstruct the original terminal replay result (review thread P2). */
70
+ export interface EvictedTerminalKeyEntry {
71
+ keyHash: string;
72
+ inputHash: string;
73
+ turnDisposition?: "stopped" | "uncertain" | "no_effect" | "no_effect_reserved" | "no_effect_marker_failure";
74
+ ownedWorkDisposition?: "not_requested" | "left_running" | "stopped" | "uncertain";
75
+ responseState?: "pending" | "sent" | "delivered" | "failed";
76
+ responsePayloadHash?: string;
77
+ replayPayloadHash?: string;
78
+ terminalPublished?: boolean;
79
+ }
80
+ export interface DurableSteerReconciliationRecord {
81
+ kind: "steer";
82
+ clientRef: string;
83
+ textDigest: string;
84
+ createdAt: number;
85
+ status: "dispatching" | "accepted" | "rejected" | "uncertain";
86
+ settledAt?: number;
87
+ error?: {
88
+ code: string;
89
+ message: string;
90
+ };
91
+ commandId: string;
92
+ turnId: string;
93
+ acceptedAt: number;
94
+ startedAt?: never;
95
+ terminalAt?: never;
96
+ outcome?: never;
97
+ receiptState?: never;
98
+ pendingOutcome?: never;
99
+ pendingReceiptState?: never;
100
+ skillName?: never;
101
+ }
102
+ export type DurableReconciliationRecord = DurableExecutionReconciliationRecord | DurableSteerReconciliationRecord;
25
103
  export interface ReconciliationStoreDocument {
26
104
  version: typeof RECONCILIATION_STORE_VERSION;
27
105
  sessionId: string;
28
106
  records: DurableReconciliationRecord[];
107
+ terminalScopes?: DurableTerminalScopeRecord[];
108
+ /**
109
+ * Compact key tombstones for completed terminal rows evicted by the
110
+ * retention cap: the key hash is retained durably so a same-key retry
111
+ * after dispatch-cache expiry/restart still replays instead of aborting an
112
+ * unrelated later prompt (review thread P2).
113
+ */
114
+ evictedTerminalKeys?: EvictedTerminalKeyEntry[];
29
115
  }
30
116
  export interface ReconciliationStoreFs {
31
117
  mkdir(directory: string, options: {
@@ -49,9 +135,15 @@ export declare function isSafeReconciliationSessionId(sessionId: string): boolea
49
135
  export declare function reconciliationStorePath(sessionFile: string, sessionId: string): string;
50
136
  /**
51
137
  * Settle non-terminal durable records after process death.
52
- * Prompt records preserve a durable pending outcome; skills retain the existing
53
- * reconciliation-incomplete result.
138
+ * Any record with a durable pending outcome preserves that exact terminal claim;
139
+ * outcome-less skills retain the existing reconciliation-incomplete result.
140
+ */
141
+ /**
142
+ * Settle incomplete terminal scopes (turnDisposition "pending") to safe
143
+ * uncertainty after process death. A terminal scope that never finalized its
144
+ * semantic CAS replays as uncertainty, never as success.
54
145
  */
146
+ export declare function settleTerminalScopeRestart(scopes: DurableTerminalScopeRecord[], now: number): DurableTerminalScopeRecord[];
55
147
  export declare function settleProcessRestart(records: DurableReconciliationRecord[], now: number): DurableReconciliationRecord[];
56
148
  export interface ReconciliationStore {
57
149
  readonly path: string | null;
@@ -61,6 +153,22 @@ export interface ReconciliationStore {
61
153
  load(): Promise<DurableReconciliationRecord[]>;
62
154
  /** Snapshot currently held in memory after last load/transact. */
63
155
  snapshot(): DurableReconciliationRecord[];
156
+ /** Terminal-scope mutations through the same serialized full-document owner. */
157
+ transactTerminalScopes(mutator: (scopes: DurableTerminalScopeRecord[]) => DurableTerminalScopeRecord[]): Promise<void>;
158
+ transactTerminalState(mutator: (state: {
159
+ scopes: DurableTerminalScopeRecord[];
160
+ keys: EvictedTerminalKeyEntry[];
161
+ }) => {
162
+ scopes: DurableTerminalScopeRecord[];
163
+ keys: EvictedTerminalKeyEntry[];
164
+ }): Promise<void>;
165
+ /** Wait until every previously admitted reconciliation transaction settles. */
166
+ drain?(): Promise<void>;
167
+ transactTerminalKeys(mutator: (keys: EvictedTerminalKeyEntry[]) => EvictedTerminalKeyEntry[]): Promise<void>;
168
+ snapshotTerminalKeys(): EvictedTerminalKeyEntry[];
169
+ loadTerminalScopes(): Promise<DurableTerminalScopeRecord[]>;
170
+ /** Snapshot of terminal scopes currently held in memory. */
171
+ snapshotTerminalScopes(): DurableTerminalScopeRecord[];
64
172
  delete(): Promise<void>;
65
173
  }
66
174
  export declare function createReconciliationStore(options: {
@@ -14,7 +14,17 @@ export interface BoundNotificationSession<Context extends NotificationSessionCon
14
14
  unbind(): void;
15
15
  }
16
16
  export type NotificationEndpointStartResult = "started" | "already" | "disabled" | "failed";
17
- export type TelegramDaemonPreflightResult = "ready" | "blocked_identity" | "failed";
17
+ /**
18
+ * Outcome of the Telegram daemon preflight.
19
+ *
20
+ * `pending` means ownership acquisition is in flight and was deliberately NOT
21
+ * awaited: chat daemons are optional notification adapters, never session
22
+ * authority, so reconciliation on an awaited session-lifecycle path must never
23
+ * block on one. A pending preflight neither stops the runtime nor marks it
24
+ * blocked — the runtime starts, adapters stay withheld while the owner state is
25
+ * not ready, and the ensure's settle callback re-reconciles.
26
+ */
27
+ export type TelegramDaemonPreflightResult = "ready" | "pending" | "blocked_identity" | "failed";
18
28
  /**
19
29
  * The endpoint implementation is deliberately injected. The controller owns
20
30
  * policy and session-local state while the extension continues to own its
@@ -24,6 +34,20 @@ export interface NotificationSessionRuntime<Context extends NotificationSessionC
24
34
  isRunning(binding: BoundNotificationSession<Context>): boolean;
25
35
  start(binding: BoundNotificationSession<Context>): Promise<NotificationEndpointStartResult>;
26
36
  stop(binding: BoundNotificationSession<Context>): Promise<boolean>;
37
+ /**
38
+ * Provider-neutral ownership re-proof, called for ANY effective chat
39
+ * provider before the Telegram-specific preflight.
40
+ *
41
+ * A credential, destination, or actor-authorization change invalidates the
42
+ * ownership proof that authorized this runtime's adapters. The runtime must
43
+ * withhold its LOCAL adapters until the new identity is proved. It does NOT
44
+ * revoke an already-attached external chat daemon's SessionRouter
45
+ * attachment, so such a daemon can still observe host events and reach the
46
+ * host's inbound/control paths during the window; closing that requires an
47
+ * authenticated chat-attachment authority boundary at the Router layer.
48
+ * Implementations must not await the daemon ensure itself.
49
+ */
50
+ reproveOwnership?(binding: BoundNotificationSession<Context>): Promise<void>;
27
51
  /**
28
52
  * Proves the complete Telegram owner identity before a generic endpoint can
29
53
  * emit a frame. `blocked_identity` is fail-closed and starts nothing.
@@ -9,6 +9,7 @@ export interface SlackInboundDispatchReceipt {
9
9
  actionId?: string;
10
10
  /** The endpoint generation and SDK effect captured before Socket Mode ACK. */
11
11
  endpointGeneration: number;
12
+ attachmentAuthorityId?: string;
12
13
  /** Identifier of the protected journal payload; mappings never retain message bodies. */
13
14
  effectId: string;
14
15
  idempotencyKey: string;
@@ -22,7 +23,10 @@ export interface SlackConversation extends ConversationRecord {
22
23
  rootTs?: string;
23
24
  sessionId?: string;
24
25
  endpointGeneration?: number;
26
+ attachmentAuthorityId?: string;
25
27
  clientMsgId?: string;
28
+ /** Exact pending Router-removal cleanup; cleared only after the mapping close CAS commits. */
29
+ cleanupEffectId?: string;
26
30
  /** Exclusive, expiring authority for provider reconciliation/publication of the root intent. */
27
31
  rootPublicationOwner?: string;
28
32
  rootPublicationLeaseExpiresAt?: number;
@@ -1,4 +1,4 @@
1
- import { type SdkSessionEndpoint } from "../client/discovery";
1
+ import { type SessionAttachment } from "../router";
2
2
  import { ConversationStore } from "./conversation-store";
3
3
  import { type SlackConversation } from "./slack-conversation";
4
4
  export type { SlackThreadBindingErrorCode } from "./slack-thread-binding";
@@ -7,16 +7,10 @@ export declare class SlackEndpointBindingError extends Error {
7
7
  constructor(message?: string);
8
8
  }
9
9
  import type { SlackProvider, SlackSocketEnvelope } from "./slack-provider";
10
- export interface SlackEndpoint extends SdkSessionEndpoint {
11
- generation: number;
12
- }
13
- export interface SlackSdkClient {
14
- send(frame: Record<string, unknown>): void;
15
- }
16
- /** Proven right to bind one session at one endpoint generation. */
17
10
  export interface SlackBindingAuthority {
18
11
  sessionId: string;
19
12
  endpointGeneration: number;
13
+ attachmentAuthorityId?: string;
20
14
  }
21
15
  export interface SlackNotificationDaemonOptions {
22
16
  agentDir: string;
@@ -33,15 +27,10 @@ export interface SlackNotificationDaemonOptions {
33
27
  /** Stable identity for the process attempting durable provider publication. */
34
28
  publicationOwnerId?: string;
35
29
  publicationLeaseMs?: number;
36
- resolveEndpoint?: (sessionId: string) => Promise<SlackEndpoint | null>;
37
- /**
38
- * Exact discovery/attachment authority for adopting an existing root. The
39
- * runtime supplies index, endpoint, and attachment proof; without it only the
40
- * resolvable endpoint generation can be proven.
41
- */
30
+ resolveAttachment: (sessionId: string) => Promise<SessionAttachment | null>;
31
+ /** Exact Router proof for adopting an existing root. */
42
32
  resolveBindingAuthority?: (sessionId: string) => Promise<SlackBindingAuthority | undefined>;
43
- createClient: (endpoint: SlackEndpoint) => SlackSdkClient;
44
- onCommand?: (sessionId: string, content: string, endpoint: SlackEndpoint, idempotencyKey: string) => Promise<boolean>;
33
+ onCommand?: (sessionId: string, content: string, attachment: SessionAttachment, idempotencyKey: string) => Promise<boolean>;
45
34
  }
46
35
  /**
47
36
  * Slack Socket Mode notification daemon. Accepted inbound SDK effects are
@@ -54,6 +43,7 @@ export declare class SlackNotificationDaemon {
54
43
  private readonly options;
55
44
  readonly store: ConversationStore<SlackConversation>;
56
45
  constructor(options: SlackNotificationDaemonOptions);
46
+ restartBlocked(): boolean;
57
47
  start(): Promise<void>;
58
48
  stop(): Promise<void>;
59
49
  /** Accepted inbound effects are durably claimed before their Socket Mode ACK. */
@@ -78,7 +68,9 @@ export declare class SlackNotificationDaemon {
78
68
  /** Posts a safe command outcome to the active mapped root thread. */
79
69
  postCommandResult(sessionId: string, content: string): Promise<boolean>;
80
70
  resolveAction(sessionId: string, actionId: string): Promise<void>;
81
- close(sessionId: string, marker?: string): Promise<boolean>;
71
+ close(sessionId: string, marker?: string, endpointGeneration?: number): Promise<boolean>;
72
+ recoverCleanup(sessionId: string, endpointGeneration: number): Promise<void>;
73
+ retireAttachment(sessionId: string, endpointGeneration: number): Promise<void>;
82
74
  resume(sessionId: string, body: string, endpointGeneration?: number, publicationId?: string): Promise<SlackConversation>;
83
75
  findSession(sessionId: string, includeInactive: boolean): Promise<{
84
76
  key: string;
@@ -28,7 +28,7 @@ export interface SlackLiveProviderOptions {
28
28
  fetch?: (input: string, init?: RequestInit) => Promise<Response>;
29
29
  webSocket?: (url: string) => SlackWebSocket;
30
30
  now?: () => number;
31
- sleep?: (milliseconds: number) => Promise<void>;
31
+ sleep?: (milliseconds: number, signal?: AbortSignal) => Promise<void>;
32
32
  reconnectDelayMs?: number;
33
33
  maxRateLimitRetries?: number;
34
34
  maxRetryAfterMs?: number;
@@ -57,11 +57,13 @@ export declare class SlackLiveProvider implements SlackProviderClient, SlackDiag
57
57
  text: string;
58
58
  threadTs?: string;
59
59
  clientMsgId: string;
60
+ signal?: AbortSignal;
60
61
  }): Promise<SlackPostedMessage>;
61
62
  findMessageByClientMsgId(input: {
62
63
  channel: string;
63
64
  clientMsgId: string;
64
65
  threadTs?: string;
66
+ signal?: AbortSignal;
65
67
  }): Promise<SlackMessageSearchResult | null>;
66
68
  /**
67
69
  * Confirm that `ts` addresses a real message in `channel`. Slack answers
@@ -44,11 +44,13 @@ export interface SlackProviderClient {
44
44
  text: string;
45
45
  threadTs?: string;
46
46
  clientMsgId: string;
47
+ signal?: AbortSignal;
47
48
  }): Promise<SlackPostedMessage>;
48
49
  findMessageByClientMsgId?(input: {
49
50
  channel: string;
50
51
  clientMsgId: string;
51
52
  threadTs?: string;
53
+ signal?: AbortSignal;
52
54
  }): Promise<SlackMessageSearchResult | null>;
53
55
  /**
54
56
  * Prove that an operator-supplied timestamp addresses a real message in the
@@ -77,11 +79,13 @@ export declare class SlackProvider {
77
79
  text: string;
78
80
  threadTs?: string;
79
81
  clientMsgId: string;
82
+ signal?: AbortSignal;
80
83
  }): Promise<SlackPostedMessage>;
81
84
  findMessageByClientMsgId(input: {
82
85
  channel: string;
83
86
  clientMsgId: string;
84
87
  threadTs?: string;
88
+ signal?: AbortSignal;
85
89
  }): Promise<SlackMessageSearchResult | null>;
86
90
  /** Fail-closed root verification: a client without this capability can never confirm a root. */
87
91
  findMessageByTimestamp(input: {
@@ -7,17 +7,15 @@
7
7
  * 2. *Daemon*: only the running owner may mutate mappings, and only while it is
8
8
  * still the exact owner (`ownerId`/`pid`/`incarnation`/daemon generation)
9
9
  * captured before the request was published.
10
- * 3. *Session*: the SDK session must be attachable right now — indexed, live,
11
- * non-terminal, with a readable, non-stale endpoint whose pid matches the
12
- * indexed host and whose generation has not rolled.
10
+ * 3. *Session*: the running daemon supplies a redacted Router authority proving
11
+ * the exact session and endpoint generation; this module never resolves an
12
+ * endpoint or retains its credentials.
13
13
  *
14
14
  * Provider verification happens before any lock is taken, and the mapping commit
15
- * re-proves session authority inside the store lock, so an authority that
16
- * changes mid-flight leaves no mapping behind.
15
+ * re-proves daemon and session authority inside the store lock, so an authority
16
+ * that changes mid-flight leaves no mapping behind.
17
17
  */
18
18
  import type { Settings } from "../../config/settings";
19
- import type { SessionIndex } from "../broker/session-index";
20
- import { type SdkSessionEndpoint, type SdkSessionEndpointScope } from "../client/discovery";
21
19
  import { type EnsureChatDaemonResult } from "./chat-daemon-control";
22
20
  import { ConversationStore } from "./conversation-store";
23
21
  import { type SlackConversation } from "./slack-conversation";
@@ -30,39 +28,6 @@ export declare class SlackThreadBindingError extends Error {
30
28
  export declare function isBoundedSlackRootTs(value: string): boolean;
31
29
  /** Reject a non-addressable root before any authority read or persistence. */
32
30
  export declare function assertBoundedSlackRootTs(rootTs: string): void;
33
- export interface SlackSessionBindingAuthority {
34
- sessionId: string;
35
- endpointGeneration: number;
36
- pid: number;
37
- repo: string;
38
- /**
39
- * The exact endpoint this authority was proven against. Callers must use it
40
- * rather than re-reading discovery: a second read can observe a different
41
- * process whose endpoint generation happens to repeat, and the numeric
42
- * generation alone cannot tell the two apart.
43
- */
44
- endpoint: SdkSessionEndpoint;
45
- scope: SdkSessionEndpointScope;
46
- endpointMtimeMs: number;
47
- }
48
- export interface SessionBindingAuthorityInput {
49
- sessionIndex: SessionIndex;
50
- sessionId: string;
51
- readEndpoint?: (repo: string, sessionId: string, scope?: SdkSessionEndpointScope) => Promise<SdkSessionEndpoint | null>;
52
- statEndpoint?: (endpointPath: string) => Promise<{
53
- mtimeMs: number;
54
- } | undefined>;
55
- }
56
- /**
57
- * Resolve exact discovery/attachment authority for one session.
58
- *
59
- * `IndexedSession.live` alone is only pid liveness, which a terminated or
60
- * unregistered session can still satisfy through pid reuse or a stale record.
61
- * Adoption additionally requires an intact index replay, a non-terminal record,
62
- * and a discovery endpoint that is present, well-formed, not marked stale, and
63
- * owned by the same host pid the index recorded.
64
- */
65
- export declare function resolveSessionBindingAuthority(input: SessionBindingAuthorityInput): Promise<SlackSessionBindingAuthority | undefined>;
66
31
  export interface SlackThreadClaimInput {
67
32
  store: ConversationStore<SlackConversation>;
68
33
  /** The session root-claim key shared with stock root publication. */
@@ -72,6 +37,7 @@ export interface SlackThreadClaimInput {
72
37
  sessionId: string;
73
38
  rootTs: string;
74
39
  endpointGeneration: number;
40
+ attachmentAuthorityId?: string;
75
41
  /**
76
42
  * Re-proves session authority inside the store lock, immediately before
77
43
  * commit. It may be invoked more than once for one claim: authority here is
@@ -1,41 +1,17 @@
1
1
  /**
2
- * Durable, non-routable sidecar store for "adopt a user-created Telegram forum
3
- * topic into a preallocated session" intents.
2
+ * Durable provider-local reservations for Telegram topic adoption.
4
3
  *
5
- * When a user creates a new forum topic, the daemon first records durable
6
- * pending-topic authorization. After folder selection it preallocates an
7
- * `intendedSessionId` and records an adoption intent here *before* spawning.
8
- * Later, the authenticated `ensureTopic` create callback reads that intent and
9
- * returns the user's existing topicId to `TopicRegistry.getOrCreateTopic`, which
10
- * is the only authority that commits a topic binding. This keeps the intent out
11
- * of routing/endpoint authority until commit, so a failed spawn or a late socket
12
- * never deletes the user's topic and never strands a duplicate.
13
- *
14
- * Invariants (see `pending-approval.md`):
15
- * - One file per intent, named `<intendedSessionId>.adoption-intent.json` under
16
- * the daemon notifications dir. Sweep touches files only; never the Telegram API.
17
- * - Only `{ intendedSessionId, topicId, chatId, target, createdAt, expiresAt }`
18
- * is persisted. Bot/control tokens and endpoint digests are never stored.
19
- * - Owner-only dir (0o700) and 0o600 files; atomic temp→fsync→chmod→rename→parent sync.
20
- * - `tryClaim` is a synchronous, in-memory claim keyed by topicId; it excludes a
21
- * second `intendedSessionId` from winning the same topic across awaits. It
22
- * does not delete the sidecar; `releaseClaim` re-enables retry on commit failure.
4
+ * A reservation is keyed by the stable provider request identity, never by a
5
+ * preallocated Broker SessionId. Broker allocates the SessionId; the daemon
6
+ * CAS-binds that opaque value only after the lifecycle service returns it.
7
+ * This store owns only presentation mappings and pending-topic authorization.
23
8
  */
24
9
  import type { SessionCreateTarget } from "./index";
25
- /** Persisted document version. */
26
- export declare const TELEGRAM_ADOPTION_INTENT_VERSION = 1;
10
+ export declare const TELEGRAM_ADOPTION_INTENT_VERSION = 2;
27
11
  export type TelegramAdoptionTarget = Extract<SessionCreateTarget, {
28
12
  kind: "existing_path";
29
13
  }>;
30
- /** Default intent TTL (configurable at write time). Plan starts at 10 minutes. */
31
14
  export declare const DEFAULT_ADOPTION_INTENT_TTL_MS: number;
32
- /**
33
- * Minimal async filesystem surface the store needs. Structurally a subset of the
34
- * daemon's `TelegramDaemonFs` / `ConversationStoreFs`, so the daemon can pass its
35
- * own `fs` straight through and tests can inject a fake. `open`/`sync`/`close`
36
- * mirror `ConversationStoreFileHandle` so the atomic fsync path reuses the same
37
- * shape as the conversation store.
38
- */
39
15
  export interface AdoptionIntentFs {
40
16
  mkdir(directory: string, options: {
41
17
  recursive: true;
@@ -55,43 +31,34 @@ export interface AdoptionIntentFileHandle {
55
31
  sync(): Promise<void>;
56
32
  close(): Promise<void>;
57
33
  }
58
- /** What gets persisted per intent. No tokens, no digests. */
34
+ /** Persisted before create; `sessionId` is added only by bindSession. */
59
35
  export interface TelegramAdoptionIntent {
60
- intendedSessionId: string;
61
- topicId: number;
62
- chatId: string;
63
- target: TelegramAdoptionTarget;
64
- createdAt: number;
65
- expiresAt: number;
36
+ readonly providerRequestKey: string;
37
+ readonly topicId: number;
38
+ readonly chatId: string;
39
+ readonly target: TelegramAdoptionTarget;
40
+ readonly createdAt: number;
41
+ readonly expiresAt: number;
42
+ readonly sessionId?: string;
66
43
  }
67
- /** Durable authorization that a topic was observed through forum_topic_created. */
68
44
  export interface TelegramPendingTopic {
69
- topicId: number;
70
- chatId: string;
71
- createdAt: number;
72
- expiresAt: number;
45
+ readonly topicId: number;
46
+ readonly chatId: string;
47
+ readonly createdAt: number;
48
+ readonly expiresAt: number;
73
49
  }
74
- /** Compose the per-intent sidecar path. Public so callers/tests can inspect it. */
75
- export declare function adoptionIntentFilePath(agentDir: string, intendedSessionId: string): string;
76
- /** Compose the sidecar path for a user-created topic awaiting a folder choice. */
50
+ export declare function adoptionIntentFilePath(agentDir: string, providerRequestKey: string): string;
77
51
  export declare function pendingTopicFilePath(agentDir: string, topicId: number): string;
78
- /** Build a fresh intent with `createdAt`/`expiresAt` derived from `now`/`ttlMs`. */
79
52
  export declare function buildAdoptionIntent(input: {
80
- intendedSessionId: string;
53
+ providerRequestKey: string;
81
54
  topicId: number;
82
55
  chatId: string;
83
56
  target: TelegramAdoptionTarget;
84
57
  now?: number;
85
58
  ttlMs?: number;
86
59
  }): TelegramAdoptionIntent;
87
- /** Test-only: filename suffix used to recognize intent sidecars in a directory listing. */
88
60
  export declare const ADOPTION_INTENT_FILENAME_SUFFIX = ".adoption-intent.json";
89
61
  export declare const PENDING_TOPIC_FILENAME_SUFFIX = ".pending-topic.json";
90
- /**
91
- * Durable, non-routable adoption-intent store. Owns durable sidecar files and
92
- * the synchronous in-memory topicId claim table. The daemon owns Telegram and
93
- * lifecycle wiring; this store never calls the Telegram API.
94
- */
95
62
  export declare class TelegramAdoptionIntentStore {
96
63
  #private;
97
64
  constructor(input: {
@@ -100,66 +67,25 @@ export declare class TelegramAdoptionIntentStore {
100
67
  now?: () => number;
101
68
  platform?: NodeJS.Platform;
102
69
  });
103
- /** Directory holding the sidecar files. */
104
70
  get directory(): string;
105
- /** In-memory lookup by intendedSessionId (no disk read). undefined if absent/expired. */
106
- bySession(intendedSessionId: string): TelegramAdoptionIntent | undefined;
107
- /** In-memory lookup of the (single) non-expired intent for a topicId. */
71
+ byProviderRequestKey(providerRequestKey: string): TelegramAdoptionIntent | undefined;
72
+ /** Only a post-create CAS binding makes a reservation visible by SessionId. */
73
+ bySession(sessionId: string): TelegramAdoptionIntent | undefined;
108
74
  byTopic(topicId: number): TelegramAdoptionIntent | undefined;
109
- /** `true` if a non-expired intent already references `topicId`. */
110
75
  hasNonExpiredTopic(topicId: number): boolean;
111
- /** Durable authorization for an observed user-created topic, if still live. */
112
76
  pendingTopic(topicId: number): TelegramPendingTopic | undefined;
113
77
  hasPendingTopic(topicId: number, chatId: string): boolean;
114
- /**
115
- * Synchronously claim `topicId` for `intendedSessionId`. Returns false if a
116
- * *different* non-expired intendedSessionId already holds the claim (or has a
117
- * non-expired intent for the topic). Same intendedSessionId re-claiming its
118
- * own topic is idempotent and succeeds. The claim is in-memory only; it never
119
- * deletes the sidecar, so a commit failure can `releaseClaim` and retry.
120
- */
121
- tryClaim(topicId: number, intendedSessionId: string): boolean;
122
- /** Release a claim held by `intendedSessionId` on `topicId`. No-op otherwise. */
123
- releaseClaim(topicId: number, intendedSessionId: string): void;
124
- /**
125
- * Durable write of one intent: temp→write→fsync→chmod(0600)→atomic rename→
126
- * chmod(final, 0600)→parent-dir fsync, then track it in memory. The dir is
127
- * created owner-only (0700). chmod-ing the final path after the rename makes
128
- * the 0600 contract durable regardless of whether the platform's rename
129
- * preserves the source mode (POSIX does; some test/network filesystems and
130
- * the in-memory test double model rename as copy+delete and would otherwise
131
- * drop it). The rename is still the atomic commit point; the final chmod only
132
- * tightens permissions on the already-durable file. The in-memory map is only
133
- * mutated after the atomic persist succeeds. Rejects (does not swallow) so the
134
- * daemon can decide fail-closed behavior.
135
- */
78
+ /** Synchronous fail-closed topic claim keyed by provider request identity. */
79
+ tryClaim(topicId: number, providerRequestKey: string): boolean;
80
+ releaseClaim(topicId: number, providerRequestKey: string): void;
136
81
  put(intent: TelegramAdoptionIntent): Promise<void>;
137
- /** Persist authorization for a topic observed through forum_topic_created. */
82
+ /** CAS-bind the Broker-returned opaque SessionId exactly once. */
83
+ bindSession(providerRequestKey: string, sessionId: string): Promise<boolean>;
138
84
  putPendingTopic(pendingTopic: TelegramPendingTopic): Promise<void>;
139
- /**
140
- * Read a single intent sidecar from disk and track it if it is non-expired
141
- * and well-formed. Returns the parsed intent (or undefined). Used by
142
- * `rehydrate`; callers normally use `rehydrate` / `bySession`.
143
- */
144
- readIntent(intendedSessionId: string): Promise<TelegramAdoptionIntent | undefined>;
85
+ readIntent(providerRequestKey: string): Promise<TelegramAdoptionIntent | undefined>;
145
86
  readPendingTopic(topicId: number): Promise<TelegramPendingTopic | undefined>;
146
- /**
147
- * Rehydrate all non-expired intents from the notifications dir. Files are the
148
- * only source: missing/corrupt/expired entries are skipped (never thrown).
149
- * Returns the count of live intents loaded.
150
- */
151
87
  rehydrate(): Promise<number>;
152
- /**
153
- * Remove a single intent sidecar and drop its in-memory entry. Safe to call
154
- * after a successful registry commit or a definite spawn failure. Missing
155
- * files are not an error. Never calls the Telegram API.
156
- */
157
- remove(intendedSessionId: string): Promise<void>;
158
- /** Remove a pending-topic authorization after an adoption intent is durable. */
88
+ remove(providerRequestKey: string): Promise<void>;
159
89
  removePendingTopic(topicId: number): Promise<void>;
160
- /**
161
- * Sweep expired intent sidecars from disk. Touches files only. Returns the
162
- * count of expired sidecars removed. Safe to run at startup and periodically.
163
- */
164
90
  sweepExpired(): Promise<number>;
165
91
  }
@@ -1,5 +1,6 @@
1
1
  import type { Settings } from "../../config/settings";
2
2
  import { type NotificationSettingsReader } from "./config";
3
+ import { type NotificationDebrisSweepReport } from "./notification-service";
3
4
  import { type DaemonState, type TelegramDaemonOptions } from "./telegram-daemon";
4
5
  type TelegramDaemonRunner = {
5
6
  run(): Promise<void>;
@@ -16,6 +17,7 @@ export interface RunDaemonInternalDeps {
16
17
  DaemonImpl?: TelegramDaemonConstructor;
17
18
  processPid?: number;
18
19
  pidAlive?: (pid: number) => boolean;
20
+ pidIncarnation?: (pid: number) => string | undefined;
19
21
  /** Clock used by the ownership-progress watchdog; defaults to `Date.now`. */
20
22
  now?: () => number;
21
23
  /** Timer pair backing the ownership-progress watchdog; defaults to globals. */
@@ -25,6 +27,14 @@ export interface RunDaemonInternalDeps {
25
27
  readDaemonState?: (settings: Settings) => Promise<DaemonState | undefined>;
26
28
  /** Loads the verified machine-local identity; injectable so daemon tests do not touch the host. */
27
29
  loadInstallationHostId?: () => Promise<string>;
30
+ /**
31
+ * Startup hygiene sweep over the notifications dir; injectable so tests can
32
+ * prove it is fired, is never awaited by startup, and that a rejection is
33
+ * logged instead of failing the daemon.
34
+ */
35
+ sweepNotificationDebris?: (input: {
36
+ dir: string;
37
+ }) => Promise<NotificationDebrisSweepReport>;
28
38
  }
29
39
  export declare function createLightweightDaemonSettings(input: {
30
40
  agentDir: string;