@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
@@ -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;
@@ -4,6 +4,12 @@
4
4
  */
5
5
  /** Protocol version the daemon advertises in its ClientHello. */
6
6
  export declare const NOTIFICATION_PROTOCOL_VERSION = 3;
7
+ /** Telegram transport generation; independent from SDK lifecycle protocol changes. */
8
+ export declare const TELEGRAM_TRANSPORT_GENERATION = 1;
9
+ /** Notification event schema version; payload compatibility is versioned separately. */
10
+ export declare const NOTIFICATION_EVENT_SCHEMA_VERSION = 1;
11
+ /** SDK Router/lifecycle protocol negotiated by core, not by Telegram transport. */
12
+ export declare const SDK_LIFECYCLE_ROUTER_PROTOCOL_VERSION = 1;
7
13
  /**
8
14
  * Guarded behavior-inventory version for the current daemon build. Bump this
9
15
  * on every guarded daemon-behavior change independent of the wire version; it
@@ -91,25 +97,262 @@ export declare const NOTIFICATION_PROTOCOL_VERSION = 3;
91
97
  * later session from creating a topic or replaying notifications. Generation
92
98
  * 58 preserves that invariant during durable-fence load promotion and restores
93
99
  * the exact grace deadline when a failed archive publication rolls back.
94
- * Generation 59 publishes the owner's attached OPEN-socket count in the
95
- * heartbeat sidecar so `gjc notify health` can report a live daemon that is
96
- * attached to no registered endpoint (#4128). Generation 60 contains transient
97
- * heartbeat-sidecar publication failures: a Windows EPERM/EACCES/EBUSY on the
98
- * sidecar rename is retried bounded under the ownership-lock fence and an
99
- * exhausted publication keeps the daemon alive as `publish_failed` instead of
100
- * escaping as an uncaught exception, while only a proven state/lock mismatch
101
- * (`not_owner`) stops the owner (#4200). Generation 61 keeps authenticated
102
- * same-session transports attached while predecessor archival converges and
103
- * settles non-forum close responses. Generation 62 rejects replay-gap
104
- * authority claims that do not match the requested cursor, answer bounds,
105
- * and retained replay suffix.
106
- * Generation 63 contains transient steady-heartbeat state and ownership-lock
107
- * read failures and cleans every staged sidecar before retrying (#4200).
100
+ * Generation 59 moves lifecycle and attachment authority into SDK core,
101
+ * removes provider root scanning and direct endpoint credentials, and rebuilds
102
+ * Telegram presentation bindings from SessionRouter attachments. Generation 60
103
+ * persists Router publication receipts, awaits inbound attachment dispatch,
104
+ * restores actor-scoped create throttling, and exact-unlinks ownership locks.
105
+ * Generation 61 durably claims provider publication identities before dispatch
106
+ * and retains ambiguous claims across restart to prevent duplicate effects.
107
+ * Generation 62 confirms receipts only from accepted provider outcomes,
108
+ * retains queued/fallback claims, and quarantines legacy v1 confirmations.
109
+ * Generation 63 applies the same deferred confirmation boundary while draining
110
+ * replay-state and live-held frames during attachment recovery.
111
+ * Generation 64 additionally defers stale-lease frames, requires authoritative
112
+ * model message IDs, and retains claims when continuation admission fails.
113
+ * Generation 65 treats malformed or unknown Bot API responses as ambiguous
114
+ * rather than accepting them without a provider receipt.
115
+ * Generation 66 propagates publication identity through selected and ephemeral
116
+ * direct effects, retries definite pre-send route failures, and aggregates the
117
+ * worst continuation disposition before confirmation.
118
+ * Generation 67 quarantines oversized persisted receipt maps and retains claims
119
+ * for pending-topic frames evicted before provider delivery.
120
+ * Generation 68 releases claimed BTW publications when shutdown prevents dispatch.
121
+ * Generation 69 settles selected acknowledgements and queued BTW publications
122
+ * only from positive Telegram message receipts.
123
+ * Generation 70 separates queued claims from provider-attempt ambiguity so
124
+ * pre-send work remains replayable after daemon restart.
125
+ * Generation 71 preserves queued state through cooldown/shutdown suppression and
126
+ * never converts replay-suppressed ambiguity into delivered confirmation.
127
+ * Generation 72 keeps invalid selected publications queued and mirrors attempted
128
+ * BTW rejection outcomes across duplicate publication identities.
129
+ * Generation 73 reports queued publication disposition to SessionRouter so
130
+ * same-process reconnect retains the unadvanced replay cursor.
131
+ * Generation 74 serializes each Router frame until its durable publication state
132
+ * becomes attempted or delivered, preserving sequence order without cursor gaps.
133
+ * Generation 75 routes every direct effect through the suppression-aware adapter
134
+ * and gives each publication queue item a non-coalescing identity.
135
+ * Generation 76 adds durable terminal rejection for invalid direct frames and
136
+ * confirms accepted non-OK BTW status publications before returning.
137
+ * Generation 77 bounds terminal rejection receipts alongside delivered receipts.
138
+ * Generation 78 retries stale direct authority before dispatch and terminalizes
139
+ * intentionally superseded queued live publications.
140
+ * Generation 79 preserves rejected state through outer/replay confirmation and
141
+ * settles publication-level continuation and retry barriers.
142
+ * Generation 80 terminalizes every no-dispatch queue branch and revalidates
143
+ * terminal publication state after cooldown waits.
144
+ * Generation 81 terminalizes flat, pending, and stopped-pool no-dispatch work
145
+ * and removes the raw Router Broker mutation tunnel.
146
+ * Generation 82 terminalizes expired and out-of-band queue removals, defers BTW
147
+ * completion across all chunks, and classifies definitive direct rejections.
148
+ * Generation 83 terminalizes pending frames discarded during topic flush.
149
+ * Generation 84 closes policy/archive/selected direct waiter cleanup and routes
150
+ * pre-identity threaded output through flat delivery instead of a blocked queue.
151
+ * Generation 85 removes the obsolete pending-frame admission path entirely.
152
+ * Generation 86 terminalizes queued selected acknowledgements during shutdown.
153
+ * Generation 87 routes every run-loop exit through the publication stop boundary.
154
+ * Generation 88 rejects all queued publications before Router shutdown, disables
155
+ * implicit provider retries, and durably joins receipt persistence.
156
+ * Generation 89 rejects all pool submissions once a stop is requested.
157
+ * Generation 90 terminalizes replay-queued publications before Router shutdown.
158
+ * Generation 91 routes selected-ack retries through the stop admission fence.
159
+ * Generation 92 rejects Router waiters when terminal receipt persistence fails.
160
+ * Generation 93 aborts provider delivery immediately and resets failed settlement
161
+ * resolvers before same-daemon replay.
162
+ * Generation 94 wires the immediate delivery abort into every publication call.
163
+ * Generation 95 propagates selected-ack receipt persistence failure to Router.
164
+ * Generation 96 routes rich-draft delivery through the publication abort boundary.
165
+ * Generation 97 bounds strict tool terminalization with shutdown abort authority.
166
+ * Generation 98 applies delivery abort authority to every supervised Bot API call.
167
+ * Generation 99 propagates generic terminal receipt persistence failure to Router.
168
+ * Generation 100 centralizes terminal receipt failure propagation in state transitions.
169
+ * Generation 101 isolates batch terminal failures and replays rejected rollback.
170
+ * Generation 102 isolates expired and superseded pre-batch receipt failures.
171
+ * Generation 103 fences and joins Router reconciliation during stop.
172
+ * Generation 104 prevents Router timer installation after concurrent stop.
173
+ * Generation 105 revokes attachment capabilities immediately when Router stop begins.
174
+ * Generation 106 isolates every Router client close attempt during shutdown.
175
+ * Generation 107 joins reconnect replay within Router pending shutdown work.
176
+ * Generation 108 interrupts replay requests immediately when Router stop begins.
177
+ * Generation 109 isolates stale attachment client and provider cleanup failures.
178
+ * Generation 110 installs replay stop handling before starting the request.
179
+ * Generation 111 isolates replacement client and provider cleanup failures.
180
+ * Generation 112 preserves provider handoff while isolating replacement close failure.
181
+ * Generation 113 removes old provider authority when replacement races stop.
182
+ * Generation 114 removes successor provider authority when handoff races stop.
183
+ * Generation 115 removes provider authority for every attachment disposed by stop.
184
+ * Generation 116 creates publication waiters only after claim admission succeeds.
185
+ * Generation 117 exposes tentative claims to concurrent teardown and aborts revoked admission.
186
+ * Generation 118 prevents failed concurrent rejection from reviving tentative claims.
187
+ * Generation 119 bounds Router stop and preserves rejected failed continuations.
188
+ * Generation 120 awaits provisional rejection durability before replay suppression.
189
+ * Generation 121 fences bounded-stop continuations from later Router runs.
190
+ * Generation 122 fences every nested replay suppression on rejection durability.
191
+ * Generation 123 scopes stale Router errors to their originating run epoch.
192
+ * Generation 124 detaches restart tails and restores rejected rollback as replayable.
193
+ * Generation 125 prevents stale run cleanup from deleting restarted attachments.
194
+ * Generation 126 fences stale callback bookkeeping and distinguishes definitive rejection.
195
+ * Generation 127 keeps malformed accepted selected sends transport-ambiguous.
196
+ * Generation 128 bounds Discord provider work before Router revocation.
197
+ * Generation 129 bounds every Discord REST operation across retries.
198
+ * Generation 130 invalidates Discord effect lease renewal when shutdown drain expires.
199
+ * Generation 131 invalidates Discord effect leases at the journal mutation boundary.
200
+ * Generation 132 invalidates Discord create-intent leases at drain expiry.
201
+ * Generation 133 serializes Discord creator invalidation with in-flight admission.
202
+ * Generation 134 durably restores replay after definitive provider rejection.
203
+ * Generation 135 revokes attachments whose provider publication hook rejects.
204
+ * Generation 136 keeps provider attachment publication provisional until recovery succeeds.
205
+ * Generation 137 fences stale reconciliation, frame tails, and identity-less replay rejection.
206
+ * Generation 138 starts provider handshakes only after Router publication.
207
+ * Generation 139 privatizes raw SDK clients and removes the Python transport package.
208
+ * Generation 140 retires failed handshakes and holds provisional frames until publication.
209
+ * Generation 141 awaits the provider handshake before Router replay to prevent retained-event deadlock.
210
+ * Generation 142 migrates live adoption reservations and applies create throttling to topic adoption.
211
+ * Generation 143 preserves topic presentation continuity across exact Router endpoint replacement.
212
+ * Generation 144 revalidates endpoint authority before exact publication-time requests.
213
+ * Generation 145 distinguishes transport reconnect from a changed same-generation endpoint successor.
214
+ * Generation 146 revokes token-zero and callback leases before endpoint replacement while retaining topic presentation.
215
+ * Generation 147 uses a restart-stable opaque Router endpoint-incarnation identity.
216
+ * Generation 148 classifies reconnect-time endpoint successors before attachment retirement.
217
+ * Generation 149 serializes successor attachment behind predecessor provider retirement.
218
+ * Generation 150 version-fences attaches already in flight when retirement begins.
219
+ * Generation 151 preserves provider continuity for endpoint-before-index replacement cleanup.
220
+ * Generation 152 contains a thrown steady heartbeat renewal in the run loop
221
+ * (a transient EPERM/EACCES/EBUSY on the state or ownership-lock read) the
222
+ * same way instead of terminating the daemon (#4200).
223
+ * Generation 153 restricts Telegram forum-topic ownership, replay, routing, callbacks,
224
+ * and lease renewal to identities with coordinator or lifecycle provenance.
225
+ * Generation 154 archives private-chat topics through deleteForumTopic, settles
226
+ * TOPIC_ID_INVALID as definitive, and drains durable archive retries periodically.
227
+ * Generation 155 unifies the duplicated durable terminal-retention write path
228
+ * (bus and SDK-only host runtimes) into a single `boundTerminalRetentionState`
229
+ * helper in `session/terminal-abort.ts` (#4329).
230
+ * Generation 156 derives Telegram session eligibility from configuration
231
+ * (Telegram configured and effectively enabled) instead of coordinator or
232
+ * lifecycle launch provenance, and stops consulting a session's self-declared
233
+ * eligibility for topic admission: threaded mode always uses threads. Before
234
+ * this, every ordinary interactive session declared itself ineligible, the
235
+ * daemon rejected its identity header, no topic was created, and nothing was
236
+ * delivered while attachments still looked healthy.
237
+ * Generation 157 adds orphan-topic reconciliation: FORUM_TOPIC_NOT_FOUND is
238
+ * settled as definitive, and the unsupported-method fallback closes when
239
+ * deleteForumTopic is unavailable on older Bot API deployments.
240
+ * Generation 158 updates terminal-abort notification admission and cleanup semantics.
241
+ * Generation 159 fences the Windows process-incarnation authority: the native
242
+ * binding fallback no longer spawns powershell.exe when it cannot bind a pid,
243
+ * so older daemons that may still flash a console window during liveness polling
244
+ * are fenced off (#4362).
245
+ * Generation 160 introduces provider-local Telegram subscriptions, detached
246
+ * cleanup, stable topic bindings, and explicit archive authority. Older daemons
247
+ * retain attachment-level lifecycle coupling and may not serve this contract.
248
+ * Generation 161 completes that authority split: archive reasons and cleanup
249
+ * receipts are durable, topic recovery no longer reconstructs SDK endpoint
250
+ * authority, and replay generation cannot mutate lifecycle authority.
251
+ * Generation 162 removes chat-daemon ownership from the session-open critical
252
+ * path: the host acquires provider ownership only AFTER publishing its core
253
+ * endpoint, through a single-flight coordinator keyed to the full provider
254
+ * identity, and never awaits it on a lifecycle path. The daemon also sweeps
255
+ * inert notification-dir debris at startup. Older daemons assume ownership is
256
+ * proved before publication and do not perform that sweep. Generation 165
257
+ * preserves a bounded lean settlement window across autonomous continuations,
258
+ * so the Telegram terminal receipt cannot lose a prior user-request result.
259
+ * Generation 166 introduces complete owned process-group cleanup (killTree
260
+ * instead of root-only signalRoot), identity-fenced orphan-owner reconciliation
261
+ * in the daemon run loop, pre-poll stale-poller fencing, and fail-closed
262
+ * watchdog behavior when stable identity authority is unavailable (#4403).
263
+ * Generation 167 repairs the telegram daemon generation guard bootstrap so the
264
+ * generator's post-fix manifest check always byte-compares the regenerated disk
265
+ * manifest against the current tree, and auto-reaps pre-registry legacy stray
266
+ * Telegram daemons (#4533).
267
+ * Generation 168 adds per-update inbound acknowledgement authority and monotonic
268
+ * reaction settlement for Telegram notification delivery (#4528).
269
+ * Generation 169 delivers every ring-positioned session event live through the
270
+ * bounded, capability-gated directed subscriber leg used by replay.
108
271
  */
109
- export declare const DAEMON_GENERATION = 63;
272
+ export declare const DAEMON_GENERATION = 169;
110
273
  /**
111
- * Serving-compatibility boundary for daemon lifecycle requests. Epoch 5
112
- * requires the complete generation-36 topic authority contract, so older
113
- * epoch-4 daemons cannot keep serving across an upgrade.
274
+ * Serving-compatibility boundary for daemon lifecycle requests. Epoch 7
275
+ * requires durable publication receipts and acknowledged attachment dispatch,
276
+ * so epoch-6 daemons cannot serve across the delivery-safety cutover. Epoch 8
277
+ * requires the durable claimed/confirmed publication receipt format. Epoch 9
278
+ * requires accepted-only confirmation and legacy receipt quarantine. Epoch 10
279
+ * requires replay admission to retain deferred publication claims. Epoch 11
280
+ * requires strict direct receipts and fail-closed continuation admission. Epoch 12
281
+ * requires malformed provider responses to remain unconfirmed claims.
282
+ * Epoch 13 requires complete direct-effect identity and pre-send retry semantics.
283
+ * Epoch 14 requires bounded receipt loading and fail-closed pending eviction.
284
+ * Epoch 15 requires BTW shutdown to preserve Router replay authority.
285
+ * Epoch 16 requires accepted-only settlement for special provider queues.
286
+ * Epoch 17 requires durable queued/attempted/confirmed publication states.
287
+ * Epoch 18 requires suppression-aware attempt transitions and replay confirmation.
288
+ * Epoch 19 requires direct invalid/rejected outcomes to retain exact receipt state.
289
+ * Epoch 20 requires Router cursor advancement to follow settled publication state.
290
+ * Epoch 21 requires ordered Router settlement waiters for queued publications.
291
+ * Epoch 22 requires unified dispatch guards and non-coalescing publication work.
292
+ * Epoch 23 requires explicit rejected state and terminal direct settlement.
293
+ * Epoch 24 requires bounded terminal rejection retention.
294
+ * Epoch 25 requires stale-dispatch retry and superseded publication settlement.
295
+ * Epoch 26 requires terminal-state exclusivity and complete publication barriers.
296
+ * Epoch 27 requires no-dispatch terminalization and post-wait revalidation.
297
+ * Epoch 28 requires terminal flat/pending admission and list-only Broker routing.
298
+ * Epoch 29 requires complete removal terminalization and direct rejection state.
299
+ * Epoch 30 requires terminal settlement for pending-frame flush discards.
300
+ * Epoch 31 requires complete direct waiter closure and pre-identity delivery.
301
+ * Epoch 32 removes identity-gated pending publication admission.
302
+ * Epoch 33 requires selected-ack shutdown removal to settle publication state.
303
+ * Epoch 34 requires control-file exits to terminalize queued publications first.
304
+ * Epoch 35 requires complete publication teardown and single-attempt dispatch.
305
+ * Epoch 36 closes the retry-after-stop queue race.
306
+ * Epoch 37 closes replay-queue settlement during stop.
307
+ * Epoch 38 closes selected-ack retry-after-stop settlement.
308
+ * Epoch 39 propagates terminal receipt persistence failure to Router shutdown.
309
+ * Epoch 40 closes hanging-delivery shutdown and transient persistence replay.
310
+ * Epoch 41 closes ordinary publication hangs during shutdown.
311
+ * Epoch 42 closes selected terminal receipt persistence settlement.
312
+ * Epoch 43 closes rich-draft transport hangs during shutdown.
313
+ * Epoch 44 closes terminal tool transport hangs during shutdown.
314
+ * Epoch 45 closes raw topic and callback transport hangs during shutdown.
315
+ * Epoch 46 closes timer-finalized publication persistence settlement.
316
+ * Epoch 47 covers every delivered/rejected persistence rollback path.
317
+ * Epoch 48 preserves unrelated batch settlement and rejected replayability.
318
+ * Epoch 49 preserves every removed inventory settlement after individual failure.
319
+ * Epoch 50 prevents attachment resurrection after provider shutdown.
320
+ * Epoch 51 fully fences Router startup and reconciliation after stop.
321
+ * Epoch 52 prevents provider dispatch throughout the Router stop window.
322
+ * Epoch 53 prevents one transport close timeout from skipping later cleanup.
323
+ * Epoch 54 prevents Router return before replay callbacks complete.
324
+ * Epoch 55 closes pending reconnect replay without hanging Router shutdown.
325
+ * Epoch 56 guarantees provider authority cleanup despite transport close failure.
326
+ * Epoch 57 prevents orphaned replay request rejection during stop.
327
+ * Epoch 58 guarantees old authority cleanup before replacement attachment.
328
+ * Epoch 59 drops old provider authority only when replacement creation fails.
329
+ * Epoch 60 closes provider cleanup for replacement creation interrupted by stop.
330
+ * Epoch 61 closes provider cleanup after published replacement handoff.
331
+ * Epoch 62 covers stop during recovered-frame and replay awaits.
332
+ * Epoch 63 prevents capacity and claim-persistence waiter leaks.
333
+ * Epoch 64 closes attachment replacement during claim persistence.
334
+ * Epoch 65 closes dual persistence failure during tentative claim teardown.
335
+ * Epoch 66 prevents callback shutdown deadlock and false ambiguous rejection.
336
+ * Epoch 67 closes concurrent claim/rejection persistence cursor concession.
337
+ * Epoch 68 prevents pre-stop reconciliation authority after same-instance restart.
338
+ * Epoch 69 prevents provisional nested replay cursor concession.
339
+ * Epoch 70 prevents stale run failures from stopping a restarted Router.
340
+ * Epoch 71 restores bounded Router restart and rejected publication replay.
341
+ * Epoch 72 identity-fences provider cleanup after bounded restart.
342
+ * Epoch 73 preserves successor retry state and ambiguous dispatched cleanup.
343
+ * Epoch 74 prevents replay after accepted responses lacking message identity.
344
+ * Epoch 75 prevents hung Discord REST work from blocking daemon shutdown.
345
+ * Epoch 76 cancels hung Discord REST before active-work drain expires.
346
+ * Epoch 77 fences late Discord effect commits after Router revocation.
347
+ * Epoch 78 atomically marks timed-out Discord work uncertain before Router revocation.
348
+ * Epoch 79 releases timed-out Discord creator ownership for successor recovery.
349
+ * Epoch 80 terminalizes leases admitted after shutdown invalidator snapshot.
350
+ * Epoch 81 preserves definitive provider rejection across persistence failure and restart.
351
+ * Epoch 82 fails closed before exposing provider attachments after cleanup recovery failure.
352
+ * Epoch 83 binds provider commands to the exact opaque attachment identity.
353
+ * Epoch 84 prohibits provider lifecycle-equivalent controls and detaches replacement work.
354
+ * Epoch 85 removes direct relay attachment and prohibits lifecycle controls on every adapter.
355
+ * Epoch 86 removes public discovery/client exports and retires cross-process raw transports.
356
+ * Epoch 87 preserves accepted Telegram delivery ambiguity and advances poisoned poll cursors.
114
357
  */
115
- export declare const SERVING_EPOCH = 5;
358
+ export declare const SERVING_EPOCH = 87;
@@ -0,0 +1,125 @@
1
+ import type { TelegramDaemonFs } from "./telegram-daemon";
2
+ import { type TelegramOwnerMarker } from "./telegram-daemon-owner-registry";
3
+ /**
4
+ * A stable, identity-bound reference to a process opened BEFORE the incarnation
5
+ * check and used for ALL subsequent operations. This closes the PID-reuse race:
6
+ * the native handle pins the exact process incarnation, so a reused PID cannot
7
+ * be signaled through a stale reference — the OS will reject the operation.
8
+ *
9
+ * `signalRoot` signals only the pinned root process (root-only).
10
+ * `terminateTree` signals the process AND its descendants / process group.
11
+ */
12
+ export interface TelegramOrphanProcessRef {
13
+ /** The incarnation of the process this reference was opened against. */
14
+ incarnation: string;
15
+ /**
16
+ * Gracefully terminate this process and its entire descendant tree / process
17
+ * group (TERM → wait → KILL escalation). Returns true if the process (and
18
+ * its children) exited within the bounded wait.
19
+ */
20
+ terminateTree(signal?: NodeJS.Signals): boolean;
21
+ }
22
+ /**
23
+ * A pinned reference that can additionally prove the process's kernel-derived
24
+ * launch arguments. Used only by the legacy-stray sweep: candidate PIDs come
25
+ * from an untrusted enumeration, but every authorization fact (incarnation,
26
+ * argv) is read from this pinned reference, never from the enumeration.
27
+ */
28
+ export interface TelegramStrayProcessRef extends TelegramOrphanProcessRef {
29
+ /** Launch arguments reported by the kernel for the pinned incarnation. */
30
+ args(): string[];
31
+ }
32
+ export interface TelegramOrphanReapDeps {
33
+ fs?: TelegramDaemonFs;
34
+ now?: () => number;
35
+ pidAlive: (pid: number) => boolean;
36
+ pidIncarnation: (pid: number) => string | undefined;
37
+ /**
38
+ * Opens a stable process reference bound to the exact process incarnation at
39
+ * open time. The reference must be opened BEFORE the incarnation check so
40
+ * that termination operates on the same identity that was proven stale.
41
+ */
42
+ processReference?: (pid: number) => TelegramOrphanProcessRef | undefined;
43
+ platform?: NodeJS.Platform;
44
+ /**
45
+ * Enumerates candidate PIDs for the legacy-stray sweep. The list is
46
+ * untrusted discovery input only; authorization derives exclusively from
47
+ * the pinned {@link TelegramStrayProcessRef}. Defaults to a bounded POSIX
48
+ * `ps` listing; returns nothing on Windows or enumeration failure.
49
+ */
50
+ listCandidatePids?: () => Promise<number[]>;
51
+ /** Opens a pinned argv-capable reference for stray verification. */
52
+ strayReference?: (pid: number) => TelegramStrayProcessRef | undefined;
53
+ /**
54
+ * First-sighting ledger for stray confirmation, keyed by
55
+ * `pid|incarnation` with the first-seen timestamp. Injectable for tests;
56
+ * defaults to a process-lifetime module ledger.
57
+ */
58
+ straySightings?: Map<string, number>;
59
+ }
60
+ export interface TelegramOrphanCandidate {
61
+ marker: TelegramOwnerMarker;
62
+ executablePath?: string;
63
+ argv?: string[];
64
+ }
65
+ export type OrphanReapDecision = {
66
+ kind: "reaped";
67
+ pid: number;
68
+ acquisitionId: string;
69
+ } | {
70
+ kind: "refused";
71
+ pid: number;
72
+ acquisitionId: string;
73
+ reason: string;
74
+ } | {
75
+ kind: "inert";
76
+ pid: number;
77
+ acquisitionId: string;
78
+ };
79
+ export interface TelegramOrphanRecoveryReceipt {
80
+ version: 1;
81
+ agentDir: string;
82
+ currentOwnerId: string;
83
+ currentAcquisitionId: string;
84
+ currentPid: number;
85
+ createdAt: number;
86
+ candidates: number;
87
+ terminated: number;
88
+ refused: number;
89
+ inert: number;
90
+ reasons: Record<string, number>;
91
+ }
92
+ /**
93
+ * Exact invocation-signature test for a legacy Telegram daemon owner:
94
+ * a `notify daemon-internal` subcommand bound to exactly this agent dir.
95
+ * This is deliberately an exact-token match on kernel-reported argv from a
96
+ * pinned reference — never a substring similarity over an untrusted dump.
97
+ */
98
+ export declare function isLegacyStrayDaemonArgs(args: readonly string[], agentDir: string): boolean;
99
+ /**
100
+ * Bounded stale-owner sweep. Authorizes termination only from product-owned
101
+ * marker registry bound to exact agentDir digest + acquisitionId + pid + incarnation.
102
+ * Never authorizes from bare /proc cmdline similarity; markers are the trust anchor.
103
+ *
104
+ * Safety invariants:
105
+ * 1. The stable process reference is opened BEFORE the incarnation check and
106
+ * used for termination, so a reused PID cannot be signaled through a stale
107
+ * handle.
108
+ * 2. Process-group termination (not root-only signal) ensures reparented
109
+ * descendants of an orphaned daemon are also cleaned up.
110
+ * 3. Zombies and dead processes are classified inert without any signaling.
111
+ * 4. The sweep is bounded: at most MAX_REAP_CANDIDATES markers are inspected.
112
+ */
113
+ export declare function reapTelegramDaemonOrphans(input: {
114
+ agentDir: string;
115
+ currentOwnerId: string;
116
+ currentAcquisitionId: string;
117
+ currentPid: number;
118
+ currentIncarnation: string;
119
+ fsImpl: TelegramDaemonFs;
120
+ deps: TelegramOrphanReapDeps;
121
+ }): Promise<{
122
+ decisions: OrphanReapDecision[];
123
+ receipt: TelegramOrphanRecoveryReceipt;
124
+ }>;
125
+ export declare function writeTelegramOrphanRecoveryReceipt(fsImpl: TelegramDaemonFs, agentDir: string, receipt: TelegramOrphanRecoveryReceipt): Promise<void>;