@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
@@ -4,6 +4,7 @@ import { logger, postmortem } from "@gajae-code/utils";
4
4
  import { YAML } from "bun";
5
5
  import { applyAtomicYamlPatches, setByPath } from "../../config/atomic-yaml-patch";
6
6
  import type { Settings } from "../../config/settings";
7
+ import { isProcessIncarnation, processIncarnation } from "../broker/process-incarnation";
7
8
  import {
8
9
  getNotificationConfig,
9
10
  isProviderEffectivelyEnabled,
@@ -12,9 +13,11 @@ import {
12
13
  parseNotificationSettingsSnapshot,
13
14
  } from "./config";
14
15
  import { daemonPaths, HEARTBEAT_TTL_MS } from "./daemon-paths";
16
+ import { type NotificationDebrisSweepReport, sweepNotificationDebris } from "./notification-service";
15
17
  import {
16
18
  type DaemonState,
17
19
  FilesystemTopicRegistryCasAuthority,
20
+ hasSafeDaemonStateShape,
18
21
  loadInstallationHostId,
19
22
  markDaemonOwnerStopped,
20
23
  readDaemonState,
@@ -41,6 +44,7 @@ export interface RunDaemonInternalDeps {
41
44
  DaemonImpl?: TelegramDaemonConstructor;
42
45
  processPid?: number;
43
46
  pidAlive?: (pid: number) => boolean;
47
+ pidIncarnation?: (pid: number) => string | undefined;
44
48
  /** Clock used by the ownership-progress watchdog; defaults to `Date.now`. */
45
49
  now?: () => number;
46
50
  /** Timer pair backing the ownership-progress watchdog; defaults to globals. */
@@ -50,6 +54,57 @@ export interface RunDaemonInternalDeps {
50
54
  readDaemonState?: (settings: Settings) => Promise<DaemonState | undefined>;
51
55
  /** Loads the verified machine-local identity; injectable so daemon tests do not touch the host. */
52
56
  loadInstallationHostId?: () => Promise<string>;
57
+ /**
58
+ * Startup hygiene sweep over the notifications dir; injectable so tests can
59
+ * prove it is fired, is never awaited by startup, and that a rejection is
60
+ * logged instead of failing the daemon.
61
+ */
62
+ sweepNotificationDebris?: (input: { dir: string }) => Promise<NotificationDebrisSweepReport>;
63
+ }
64
+
65
+ type DaemonOwnerTuple = {
66
+ ownerId: string;
67
+ acquisitionId: string;
68
+ pid: number;
69
+ incarnation: string;
70
+ };
71
+
72
+ function readyOwnerTuple(state: DaemonState | undefined): DaemonOwnerTuple | undefined {
73
+ if (
74
+ !state ||
75
+ !hasSafeDaemonStateShape(state) ||
76
+ state.stoppedAt !== undefined ||
77
+ typeof state.ownerId !== "string" ||
78
+ state.ownerId.length === 0 ||
79
+ typeof state.acquisitionId !== "string" ||
80
+ state.acquisitionId.length === 0 ||
81
+ !Number.isSafeInteger(state.pid) ||
82
+ state.pid <= 0 ||
83
+ !isProcessIncarnation(state.incarnation)
84
+ )
85
+ return undefined;
86
+ return {
87
+ ownerId: state.ownerId,
88
+ acquisitionId: state.acquisitionId,
89
+ pid: state.pid,
90
+ incarnation: state.incarnation,
91
+ };
92
+ }
93
+
94
+ function ownerTuplesEqual(left: DaemonOwnerTuple, right: DaemonOwnerTuple): boolean {
95
+ return (
96
+ left.ownerId === right.ownerId &&
97
+ left.acquisitionId === right.acquisitionId &&
98
+ left.pid === right.pid &&
99
+ left.incarnation === right.incarnation
100
+ );
101
+ }
102
+
103
+ function daemonOwnerTuple(ownerId: string, deps: RunDaemonInternalDeps): DaemonOwnerTuple | undefined {
104
+ const pid = deps.processPid ?? process.pid;
105
+ const incarnation = (deps.pidIncarnation ?? processIncarnation)(pid);
106
+ if (!Number.isSafeInteger(pid) || pid <= 0 || !isProcessIncarnation(incarnation)) return undefined;
107
+ return { ownerId, acquisitionId: ownerId, pid, incarnation };
53
108
  }
54
109
 
55
110
  /** Ownership-watchdog cadence while the daemon process is running. */
@@ -236,6 +291,22 @@ export async function runDaemonInternal(argv: string[], deps: RunDaemonInternalD
236
291
  const settings = await resolveDaemonSettings(resolvedAgentDir, deps);
237
292
  const cfg = getNotificationConfig(settings);
238
293
  if (!isProviderEffectivelyEnabled(cfg, "telegram") || !isTelegramComplete(cfg)) return;
294
+ // Startup hygiene: reclaim inert quarantine/staging debris left by crashed
295
+ // writers so the notifications dir cannot grow unboundedly and slow every
296
+ // later endpoint scan. Never awaited by startup; a rejection is logged and
297
+ // never fails the daemon, because hygiene must not own daemon availability.
298
+ void (deps.sweepNotificationDebris ?? sweepNotificationDebris)({
299
+ dir: daemonPaths(resolvedAgentDir).dir,
300
+ })
301
+ .then(report => {
302
+ // A resolved report can still carry operational failures; surfacing only
303
+ // a rejected promise would hide exactly the evidence the sweep records.
304
+ if (report.failures > 0 || report.scanFailed === true)
305
+ logger.warn(
306
+ `telegram-daemon: startup debris sweep incomplete: removed ${report.removed.length}, failed ${report.failures}${report.scanFailed ? ", scan failed" : ""}`,
307
+ );
308
+ })
309
+ .catch(error => logger.warn(`telegram-daemon: startup debris sweep failed: ${String(error)}`));
239
310
  const installationHostId = await (deps.loadInstallationHostId ?? loadInstallationHostId)();
240
311
  const topicRegistryAuthority = new FilesystemTopicRegistryCasAuthority(
241
312
  path.join(daemonPaths(resolvedAgentDir).dir, "telegram-topics.json"),
@@ -243,6 +314,71 @@ export async function runDaemonInternal(argv: string[], deps: RunDaemonInternalD
243
314
  );
244
315
  const Daemon: TelegramDaemonConstructor = deps.DaemonImpl ?? TelegramNotificationDaemon;
245
316
  const readState = deps.readDaemonState ?? readDaemonState;
317
+ // The daemon owns periodic orphan-owner reconciliation: it fences stale
318
+ // pollers before becoming poll-capable and re-runs the reap on a fixed
319
+ // cadence so late strays converge. The callback reads the current owner
320
+ // identity from the durable state (not from this process's volatile
321
+ // ownerId) so the reap targets only superseded owners, never itself.
322
+ const orphanReap = async (): Promise<void> => {
323
+ const { reapTelegramDaemonOrphans, writeTelegramOrphanRecoveryReceipt } = await import(
324
+ "./telegram-daemon-orphan-reap"
325
+ );
326
+ const snapshot = await readOwnerFreshnessSnapshot({ settings: settings as Settings });
327
+ const state = snapshot.state;
328
+ if (!state || !hasSafeDaemonStateShape(state) || state.ownershipPhase !== "ready") return;
329
+ const { nativeProcessBindings } = await import("@gajae-code/utils/native-process");
330
+ const incarnation = state.incarnation;
331
+ const { receipt } = await reapTelegramDaemonOrphans({
332
+ agentDir: resolvedAgentDir,
333
+ currentOwnerId: state.ownerId,
334
+ currentAcquisitionId: state.acquisitionId ?? state.ownerId,
335
+ currentPid: state.pid,
336
+ currentIncarnation: incarnation,
337
+ fsImpl: fs.promises as unknown as import("./telegram-daemon").TelegramDaemonFs,
338
+ deps: {
339
+ pidAlive:
340
+ deps.pidAlive ??
341
+ ((pid: number) => {
342
+ try {
343
+ process.kill(pid, 0);
344
+ return true;
345
+ } catch (e) {
346
+ return (e as NodeJS.ErrnoException).code !== "ESRCH";
347
+ }
348
+ }),
349
+ pidIncarnation: deps.pidIncarnation ?? processIncarnation,
350
+ processReference: (pid: number) => {
351
+ try {
352
+ const r = nativeProcessBindings().Process.fromPid(pid) as {
353
+ incarnation?: unknown;
354
+ killTree?: (signal?: number) => number;
355
+ } | null;
356
+ if (!r || typeof r.incarnation !== "string" || !isProcessIncarnation(r.incarnation)) return undefined;
357
+ return {
358
+ incarnation: r.incarnation,
359
+ terminateTree: (sig?: NodeJS.Signals) => {
360
+ const os = require("node:os") as typeof import("node:os");
361
+ const code = sig === "SIGKILL" ? os.constants.signals.SIGKILL : os.constants.signals.SIGTERM;
362
+ const count = (r as { killTree: (signal?: number) => number }).killTree(code);
363
+ return count > 0;
364
+ },
365
+ };
366
+ } catch {
367
+ return undefined;
368
+ }
369
+ },
370
+ now: deps.now,
371
+ },
372
+ });
373
+ if (receipt.refused > 0) {
374
+ logger.warn(`notifications: daemon orphan reap had ${receipt.refused} refused candidate(s)`);
375
+ }
376
+ await writeTelegramOrphanRecoveryReceipt(
377
+ fs.promises as unknown as import("./telegram-daemon").TelegramDaemonFs,
378
+ resolvedAgentDir,
379
+ receipt,
380
+ ).catch(() => undefined);
381
+ };
246
382
  const daemon = new Daemon({
247
383
  settings: settings as Settings,
248
384
  ownerId,
@@ -259,6 +395,8 @@ export async function runDaemonInternal(argv: string[], deps: RunDaemonInternalD
259
395
  control: createDaemonControlHooks(settings as Settings),
260
396
  topicRegistryAuthority,
261
397
  installationHostId,
398
+ requireTelegramTopicEligibility: true,
399
+ orphanReap,
262
400
  });
263
401
  // Signals are a process concern: install them at the daemon-internal boundary,
264
402
  // not inside the embeddable daemon class. SIGTERM is the reload wakeup path.
@@ -275,16 +413,65 @@ export async function runDaemonInternal(argv: string[], deps: RunDaemonInternalD
275
413
  if (!watchdogActive || watchdogTickInFlight || stopRequested) return;
276
414
  watchdogTickInFlight = true;
277
415
  try {
278
- const snapshot = deps.readDaemonState
279
- ? { state: await readState(settings as Settings), effectiveHeartbeatAt: undefined }
416
+ const isInjectedState = Boolean(deps.readDaemonState);
417
+ const snapshot = isInjectedState
418
+ ? {
419
+ state: await readState(settings as Settings),
420
+ effectiveHeartbeatAt: undefined,
421
+ ownerTag: undefined as unknown as {
422
+ ownerId: string;
423
+ acquisitionId: string;
424
+ pid: number;
425
+ incarnation: string;
426
+ } | null,
427
+ }
280
428
  : await readOwnerFreshnessSnapshot({ settings: settings as Settings });
281
429
  const state = snapshot.state;
282
- const heartbeatAt = snapshot.effectiveHeartbeatAt ?? state?.heartbeatAt;
430
+ const heartbeatAt = (snapshot as { effectiveHeartbeatAt?: number }).effectiveHeartbeatAt ?? state?.heartbeatAt;
283
431
  if (!watchdogActive || !state) return;
284
- if (state.ownerId !== ownerId) {
285
- stopRequested = true;
286
- daemon.requestStop("stop");
287
- return;
432
+ // Self-fencing: prove the complete lock/state tuple (ownerId, acquisitionId, pid, incarnation).
433
+ // Product-owned proof uses the lock/state tuple; a bare ownerId equality alone is not authorization.
434
+ const publishedOwner = readyOwnerTuple(state);
435
+ if (isInjectedState) {
436
+ // Test seam path: deps.readDaemonState injects state without lock. Prove full tuple against daemon's own stable identity.
437
+ const expectedOwner = daemonOwnerTuple(ownerId, deps);
438
+ // Without stable self incarnation authority, fail closed (Windows or unavailable probe).
439
+ if (!publishedOwner || !expectedOwner) return;
440
+ if (!ownerTuplesEqual(publishedOwner, expectedOwner)) {
441
+ stopRequested = true;
442
+ daemon.requestStop("stop");
443
+ return;
444
+ }
445
+ } else {
446
+ // Production path: prove the published state matches the lock-backed ownerTag; then prove supersession against current tuple.
447
+ if (!publishedOwner) return;
448
+ const snapshotTag = (
449
+ snapshot as {
450
+ ownerTag?: { ownerId: string; acquisitionId: string; pid: number; incarnation: string } | null;
451
+ }
452
+ ).ownerTag;
453
+ if (!snapshotTag) return;
454
+ // Lock/state mismatch or missing lock is ambiguous — fail closed, do not selfterminate on noise.
455
+ if (
456
+ snapshotTag.ownerId !== publishedOwner.ownerId ||
457
+ snapshotTag.acquisitionId !== publishedOwner.acquisitionId ||
458
+ snapshotTag.pid !== publishedOwner.pid ||
459
+ snapshotTag.incarnation !== publishedOwner.incarnation
460
+ )
461
+ return;
462
+ // Positive supersession: published authoritative tuple no longer matches this daemon's acquisition.
463
+ // We prove via exact tuple comparison; acquisitionId == ownerId for daemon-spawned owners.
464
+ const selfTuple = daemonOwnerTuple(ownerId, deps);
465
+ if (selfTuple && !ownerTuplesEqual(publishedOwner, selfTuple)) {
466
+ stopRequested = true;
467
+ daemon.requestStop("stop");
468
+ return;
469
+ }
470
+ // No stable self incarnation proof available (e.g. Windows native
471
+ // unavailable). Fail closed: do NOT self-terminate on ownerId alone.
472
+ // A bare ownerId equality is not sufficient authority to terminate a
473
+ // running daemon — a stale or reused PID could match, killing a
474
+ // foreign process. The stall watchdog below handles non-progress.
288
475
  }
289
476
  if (lastHeartbeatAt === undefined || heartbeatAt !== lastHeartbeatAt) {
290
477
  lastHeartbeatAt = heartbeatAt;
@@ -6,6 +6,15 @@
6
6
  /** Protocol version the daemon advertises in its ClientHello. */
7
7
  export const NOTIFICATION_PROTOCOL_VERSION = 3;
8
8
 
9
+ /** Telegram transport generation; independent from SDK lifecycle protocol changes. */
10
+ export const TELEGRAM_TRANSPORT_GENERATION = 1;
11
+
12
+ /** Notification event schema version; payload compatibility is versioned separately. */
13
+ export const NOTIFICATION_EVENT_SCHEMA_VERSION = 1;
14
+
15
+ /** SDK Router/lifecycle protocol negotiated by core, not by Telegram transport. */
16
+ export const SDK_LIFECYCLE_ROUTER_PROTOCOL_VERSION = 1;
17
+
9
18
  /**
10
19
  * Guarded behavior-inventory version for the current daemon build. Bump this
11
20
  * on every guarded daemon-behavior change independent of the wire version; it
@@ -93,26 +102,263 @@ export const NOTIFICATION_PROTOCOL_VERSION = 3;
93
102
  * later session from creating a topic or replaying notifications. Generation
94
103
  * 58 preserves that invariant during durable-fence load promotion and restores
95
104
  * the exact grace deadline when a failed archive publication rolls back.
96
- * Generation 59 publishes the owner's attached OPEN-socket count in the
97
- * heartbeat sidecar so `gjc notify health` can report a live daemon that is
98
- * attached to no registered endpoint (#4128). Generation 60 contains transient
99
- * heartbeat-sidecar publication failures: a Windows EPERM/EACCES/EBUSY on the
100
- * sidecar rename is retried bounded under the ownership-lock fence and an
101
- * exhausted publication keeps the daemon alive as `publish_failed` instead of
102
- * escaping as an uncaught exception, while only a proven state/lock mismatch
103
- * (`not_owner`) stops the owner (#4200). Generation 61 keeps authenticated
104
- * same-session transports attached while predecessor archival converges and
105
- * settles non-forum close responses. Generation 62 rejects replay-gap
106
- * authority claims that do not match the requested cursor, answer bounds,
107
- * and retained replay suffix.
108
- * Generation 63 contains transient steady-heartbeat state and ownership-lock
109
- * read failures and cleans every staged sidecar before retrying (#4200).
105
+ * Generation 59 moves lifecycle and attachment authority into SDK core,
106
+ * removes provider root scanning and direct endpoint credentials, and rebuilds
107
+ * Telegram presentation bindings from SessionRouter attachments. Generation 60
108
+ * persists Router publication receipts, awaits inbound attachment dispatch,
109
+ * restores actor-scoped create throttling, and exact-unlinks ownership locks.
110
+ * Generation 61 durably claims provider publication identities before dispatch
111
+ * and retains ambiguous claims across restart to prevent duplicate effects.
112
+ * Generation 62 confirms receipts only from accepted provider outcomes,
113
+ * retains queued/fallback claims, and quarantines legacy v1 confirmations.
114
+ * Generation 63 applies the same deferred confirmation boundary while draining
115
+ * replay-state and live-held frames during attachment recovery.
116
+ * Generation 64 additionally defers stale-lease frames, requires authoritative
117
+ * model message IDs, and retains claims when continuation admission fails.
118
+ * Generation 65 treats malformed or unknown Bot API responses as ambiguous
119
+ * rather than accepting them without a provider receipt.
120
+ * Generation 66 propagates publication identity through selected and ephemeral
121
+ * direct effects, retries definite pre-send route failures, and aggregates the
122
+ * worst continuation disposition before confirmation.
123
+ * Generation 67 quarantines oversized persisted receipt maps and retains claims
124
+ * for pending-topic frames evicted before provider delivery.
125
+ * Generation 68 releases claimed BTW publications when shutdown prevents dispatch.
126
+ * Generation 69 settles selected acknowledgements and queued BTW publications
127
+ * only from positive Telegram message receipts.
128
+ * Generation 70 separates queued claims from provider-attempt ambiguity so
129
+ * pre-send work remains replayable after daemon restart.
130
+ * Generation 71 preserves queued state through cooldown/shutdown suppression and
131
+ * never converts replay-suppressed ambiguity into delivered confirmation.
132
+ * Generation 72 keeps invalid selected publications queued and mirrors attempted
133
+ * BTW rejection outcomes across duplicate publication identities.
134
+ * Generation 73 reports queued publication disposition to SessionRouter so
135
+ * same-process reconnect retains the unadvanced replay cursor.
136
+ * Generation 74 serializes each Router frame until its durable publication state
137
+ * becomes attempted or delivered, preserving sequence order without cursor gaps.
138
+ * Generation 75 routes every direct effect through the suppression-aware adapter
139
+ * and gives each publication queue item a non-coalescing identity.
140
+ * Generation 76 adds durable terminal rejection for invalid direct frames and
141
+ * confirms accepted non-OK BTW status publications before returning.
142
+ * Generation 77 bounds terminal rejection receipts alongside delivered receipts.
143
+ * Generation 78 retries stale direct authority before dispatch and terminalizes
144
+ * intentionally superseded queued live publications.
145
+ * Generation 79 preserves rejected state through outer/replay confirmation and
146
+ * settles publication-level continuation and retry barriers.
147
+ * Generation 80 terminalizes every no-dispatch queue branch and revalidates
148
+ * terminal publication state after cooldown waits.
149
+ * Generation 81 terminalizes flat, pending, and stopped-pool no-dispatch work
150
+ * and removes the raw Router Broker mutation tunnel.
151
+ * Generation 82 terminalizes expired and out-of-band queue removals, defers BTW
152
+ * completion across all chunks, and classifies definitive direct rejections.
153
+ * Generation 83 terminalizes pending frames discarded during topic flush.
154
+ * Generation 84 closes policy/archive/selected direct waiter cleanup and routes
155
+ * pre-identity threaded output through flat delivery instead of a blocked queue.
156
+ * Generation 85 removes the obsolete pending-frame admission path entirely.
157
+ * Generation 86 terminalizes queued selected acknowledgements during shutdown.
158
+ * Generation 87 routes every run-loop exit through the publication stop boundary.
159
+ * Generation 88 rejects all queued publications before Router shutdown, disables
160
+ * implicit provider retries, and durably joins receipt persistence.
161
+ * Generation 89 rejects all pool submissions once a stop is requested.
162
+ * Generation 90 terminalizes replay-queued publications before Router shutdown.
163
+ * Generation 91 routes selected-ack retries through the stop admission fence.
164
+ * Generation 92 rejects Router waiters when terminal receipt persistence fails.
165
+ * Generation 93 aborts provider delivery immediately and resets failed settlement
166
+ * resolvers before same-daemon replay.
167
+ * Generation 94 wires the immediate delivery abort into every publication call.
168
+ * Generation 95 propagates selected-ack receipt persistence failure to Router.
169
+ * Generation 96 routes rich-draft delivery through the publication abort boundary.
170
+ * Generation 97 bounds strict tool terminalization with shutdown abort authority.
171
+ * Generation 98 applies delivery abort authority to every supervised Bot API call.
172
+ * Generation 99 propagates generic terminal receipt persistence failure to Router.
173
+ * Generation 100 centralizes terminal receipt failure propagation in state transitions.
174
+ * Generation 101 isolates batch terminal failures and replays rejected rollback.
175
+ * Generation 102 isolates expired and superseded pre-batch receipt failures.
176
+ * Generation 103 fences and joins Router reconciliation during stop.
177
+ * Generation 104 prevents Router timer installation after concurrent stop.
178
+ * Generation 105 revokes attachment capabilities immediately when Router stop begins.
179
+ * Generation 106 isolates every Router client close attempt during shutdown.
180
+ * Generation 107 joins reconnect replay within Router pending shutdown work.
181
+ * Generation 108 interrupts replay requests immediately when Router stop begins.
182
+ * Generation 109 isolates stale attachment client and provider cleanup failures.
183
+ * Generation 110 installs replay stop handling before starting the request.
184
+ * Generation 111 isolates replacement client and provider cleanup failures.
185
+ * Generation 112 preserves provider handoff while isolating replacement close failure.
186
+ * Generation 113 removes old provider authority when replacement races stop.
187
+ * Generation 114 removes successor provider authority when handoff races stop.
188
+ * Generation 115 removes provider authority for every attachment disposed by stop.
189
+ * Generation 116 creates publication waiters only after claim admission succeeds.
190
+ * Generation 117 exposes tentative claims to concurrent teardown and aborts revoked admission.
191
+ * Generation 118 prevents failed concurrent rejection from reviving tentative claims.
192
+ * Generation 119 bounds Router stop and preserves rejected failed continuations.
193
+ * Generation 120 awaits provisional rejection durability before replay suppression.
194
+ * Generation 121 fences bounded-stop continuations from later Router runs.
195
+ * Generation 122 fences every nested replay suppression on rejection durability.
196
+ * Generation 123 scopes stale Router errors to their originating run epoch.
197
+ * Generation 124 detaches restart tails and restores rejected rollback as replayable.
198
+ * Generation 125 prevents stale run cleanup from deleting restarted attachments.
199
+ * Generation 126 fences stale callback bookkeeping and distinguishes definitive rejection.
200
+ * Generation 127 keeps malformed accepted selected sends transport-ambiguous.
201
+ * Generation 128 bounds Discord provider work before Router revocation.
202
+ * Generation 129 bounds every Discord REST operation across retries.
203
+ * Generation 130 invalidates Discord effect lease renewal when shutdown drain expires.
204
+ * Generation 131 invalidates Discord effect leases at the journal mutation boundary.
205
+ * Generation 132 invalidates Discord create-intent leases at drain expiry.
206
+ * Generation 133 serializes Discord creator invalidation with in-flight admission.
207
+ * Generation 134 durably restores replay after definitive provider rejection.
208
+ * Generation 135 revokes attachments whose provider publication hook rejects.
209
+ * Generation 136 keeps provider attachment publication provisional until recovery succeeds.
210
+ * Generation 137 fences stale reconciliation, frame tails, and identity-less replay rejection.
211
+ * Generation 138 starts provider handshakes only after Router publication.
212
+ * Generation 139 privatizes raw SDK clients and removes the Python transport package.
213
+ * Generation 140 retires failed handshakes and holds provisional frames until publication.
214
+ * Generation 141 awaits the provider handshake before Router replay to prevent retained-event deadlock.
215
+ * Generation 142 migrates live adoption reservations and applies create throttling to topic adoption.
216
+ * Generation 143 preserves topic presentation continuity across exact Router endpoint replacement.
217
+ * Generation 144 revalidates endpoint authority before exact publication-time requests.
218
+ * Generation 145 distinguishes transport reconnect from a changed same-generation endpoint successor.
219
+ * Generation 146 revokes token-zero and callback leases before endpoint replacement while retaining topic presentation.
220
+ * Generation 147 uses a restart-stable opaque Router endpoint-incarnation identity.
221
+ * Generation 148 classifies reconnect-time endpoint successors before attachment retirement.
222
+ * Generation 149 serializes successor attachment behind predecessor provider retirement.
223
+ * Generation 150 version-fences attaches already in flight when retirement begins.
224
+ * Generation 151 preserves provider continuity for endpoint-before-index replacement cleanup.
225
+ * Generation 152 contains a thrown steady heartbeat renewal in the run loop
226
+ * (a transient EPERM/EACCES/EBUSY on the state or ownership-lock read) the
227
+ * same way instead of terminating the daemon (#4200).
228
+ * Generation 153 restricts Telegram forum-topic ownership, replay, routing, callbacks,
229
+ * and lease renewal to identities with coordinator or lifecycle provenance.
230
+ * Generation 154 archives private-chat topics through deleteForumTopic, settles
231
+ * TOPIC_ID_INVALID as definitive, and drains durable archive retries periodically.
232
+ * Generation 155 unifies the duplicated durable terminal-retention write path
233
+ * (bus and SDK-only host runtimes) into a single `boundTerminalRetentionState`
234
+ * helper in `session/terminal-abort.ts` (#4329).
235
+ * Generation 156 derives Telegram session eligibility from configuration
236
+ * (Telegram configured and effectively enabled) instead of coordinator or
237
+ * lifecycle launch provenance, and stops consulting a session's self-declared
238
+ * eligibility for topic admission: threaded mode always uses threads. Before
239
+ * this, every ordinary interactive session declared itself ineligible, the
240
+ * daemon rejected its identity header, no topic was created, and nothing was
241
+ * delivered while attachments still looked healthy.
242
+ * Generation 157 adds orphan-topic reconciliation: FORUM_TOPIC_NOT_FOUND is
243
+ * settled as definitive, and the unsupported-method fallback closes when
244
+ * deleteForumTopic is unavailable on older Bot API deployments.
245
+ * Generation 158 updates terminal-abort notification admission and cleanup semantics.
246
+ * Generation 159 fences the Windows process-incarnation authority: the native
247
+ * binding fallback no longer spawns powershell.exe when it cannot bind a pid,
248
+ * so older daemons that may still flash a console window during liveness polling
249
+ * are fenced off (#4362).
250
+ * Generation 160 introduces provider-local Telegram subscriptions, detached
251
+ * cleanup, stable topic bindings, and explicit archive authority. Older daemons
252
+ * retain attachment-level lifecycle coupling and may not serve this contract.
253
+ * Generation 161 completes that authority split: archive reasons and cleanup
254
+ * receipts are durable, topic recovery no longer reconstructs SDK endpoint
255
+ * authority, and replay generation cannot mutate lifecycle authority.
256
+ * Generation 162 removes chat-daemon ownership from the session-open critical
257
+ * path: the host acquires provider ownership only AFTER publishing its core
258
+ * endpoint, through a single-flight coordinator keyed to the full provider
259
+ * identity, and never awaits it on a lifecycle path. The daemon also sweeps
260
+ * inert notification-dir debris at startup. Older daemons assume ownership is
261
+ * proved before publication and do not perform that sweep. Generation 165
262
+ * preserves a bounded lean settlement window across autonomous continuations,
263
+ * so the Telegram terminal receipt cannot lose a prior user-request result.
264
+ * Generation 166 introduces complete owned process-group cleanup (killTree
265
+ * instead of root-only signalRoot), identity-fenced orphan-owner reconciliation
266
+ * in the daemon run loop, pre-poll stale-poller fencing, and fail-closed
267
+ * watchdog behavior when stable identity authority is unavailable (#4403).
268
+ * Generation 167 repairs the telegram daemon generation guard bootstrap so the
269
+ * generator's post-fix manifest check always byte-compares the regenerated disk
270
+ * manifest against the current tree, and auto-reaps pre-registry legacy stray
271
+ * Telegram daemons (#4533).
272
+ * Generation 168 adds per-update inbound acknowledgement authority and monotonic
273
+ * reaction settlement for Telegram notification delivery (#4528).
274
+ * Generation 169 delivers every ring-positioned session event live through the
275
+ * bounded, capability-gated directed subscriber leg used by replay.
110
276
  */
111
- export const DAEMON_GENERATION = 63;
277
+ export const DAEMON_GENERATION = 169;
112
278
 
113
279
  /**
114
- * Serving-compatibility boundary for daemon lifecycle requests. Epoch 5
115
- * requires the complete generation-36 topic authority contract, so older
116
- * epoch-4 daemons cannot keep serving across an upgrade.
280
+ * Serving-compatibility boundary for daemon lifecycle requests. Epoch 7
281
+ * requires durable publication receipts and acknowledged attachment dispatch,
282
+ * so epoch-6 daemons cannot serve across the delivery-safety cutover. Epoch 8
283
+ * requires the durable claimed/confirmed publication receipt format. Epoch 9
284
+ * requires accepted-only confirmation and legacy receipt quarantine. Epoch 10
285
+ * requires replay admission to retain deferred publication claims. Epoch 11
286
+ * requires strict direct receipts and fail-closed continuation admission. Epoch 12
287
+ * requires malformed provider responses to remain unconfirmed claims.
288
+ * Epoch 13 requires complete direct-effect identity and pre-send retry semantics.
289
+ * Epoch 14 requires bounded receipt loading and fail-closed pending eviction.
290
+ * Epoch 15 requires BTW shutdown to preserve Router replay authority.
291
+ * Epoch 16 requires accepted-only settlement for special provider queues.
292
+ * Epoch 17 requires durable queued/attempted/confirmed publication states.
293
+ * Epoch 18 requires suppression-aware attempt transitions and replay confirmation.
294
+ * Epoch 19 requires direct invalid/rejected outcomes to retain exact receipt state.
295
+ * Epoch 20 requires Router cursor advancement to follow settled publication state.
296
+ * Epoch 21 requires ordered Router settlement waiters for queued publications.
297
+ * Epoch 22 requires unified dispatch guards and non-coalescing publication work.
298
+ * Epoch 23 requires explicit rejected state and terminal direct settlement.
299
+ * Epoch 24 requires bounded terminal rejection retention.
300
+ * Epoch 25 requires stale-dispatch retry and superseded publication settlement.
301
+ * Epoch 26 requires terminal-state exclusivity and complete publication barriers.
302
+ * Epoch 27 requires no-dispatch terminalization and post-wait revalidation.
303
+ * Epoch 28 requires terminal flat/pending admission and list-only Broker routing.
304
+ * Epoch 29 requires complete removal terminalization and direct rejection state.
305
+ * Epoch 30 requires terminal settlement for pending-frame flush discards.
306
+ * Epoch 31 requires complete direct waiter closure and pre-identity delivery.
307
+ * Epoch 32 removes identity-gated pending publication admission.
308
+ * Epoch 33 requires selected-ack shutdown removal to settle publication state.
309
+ * Epoch 34 requires control-file exits to terminalize queued publications first.
310
+ * Epoch 35 requires complete publication teardown and single-attempt dispatch.
311
+ * Epoch 36 closes the retry-after-stop queue race.
312
+ * Epoch 37 closes replay-queue settlement during stop.
313
+ * Epoch 38 closes selected-ack retry-after-stop settlement.
314
+ * Epoch 39 propagates terminal receipt persistence failure to Router shutdown.
315
+ * Epoch 40 closes hanging-delivery shutdown and transient persistence replay.
316
+ * Epoch 41 closes ordinary publication hangs during shutdown.
317
+ * Epoch 42 closes selected terminal receipt persistence settlement.
318
+ * Epoch 43 closes rich-draft transport hangs during shutdown.
319
+ * Epoch 44 closes terminal tool transport hangs during shutdown.
320
+ * Epoch 45 closes raw topic and callback transport hangs during shutdown.
321
+ * Epoch 46 closes timer-finalized publication persistence settlement.
322
+ * Epoch 47 covers every delivered/rejected persistence rollback path.
323
+ * Epoch 48 preserves unrelated batch settlement and rejected replayability.
324
+ * Epoch 49 preserves every removed inventory settlement after individual failure.
325
+ * Epoch 50 prevents attachment resurrection after provider shutdown.
326
+ * Epoch 51 fully fences Router startup and reconciliation after stop.
327
+ * Epoch 52 prevents provider dispatch throughout the Router stop window.
328
+ * Epoch 53 prevents one transport close timeout from skipping later cleanup.
329
+ * Epoch 54 prevents Router return before replay callbacks complete.
330
+ * Epoch 55 closes pending reconnect replay without hanging Router shutdown.
331
+ * Epoch 56 guarantees provider authority cleanup despite transport close failure.
332
+ * Epoch 57 prevents orphaned replay request rejection during stop.
333
+ * Epoch 58 guarantees old authority cleanup before replacement attachment.
334
+ * Epoch 59 drops old provider authority only when replacement creation fails.
335
+ * Epoch 60 closes provider cleanup for replacement creation interrupted by stop.
336
+ * Epoch 61 closes provider cleanup after published replacement handoff.
337
+ * Epoch 62 covers stop during recovered-frame and replay awaits.
338
+ * Epoch 63 prevents capacity and claim-persistence waiter leaks.
339
+ * Epoch 64 closes attachment replacement during claim persistence.
340
+ * Epoch 65 closes dual persistence failure during tentative claim teardown.
341
+ * Epoch 66 prevents callback shutdown deadlock and false ambiguous rejection.
342
+ * Epoch 67 closes concurrent claim/rejection persistence cursor concession.
343
+ * Epoch 68 prevents pre-stop reconciliation authority after same-instance restart.
344
+ * Epoch 69 prevents provisional nested replay cursor concession.
345
+ * Epoch 70 prevents stale run failures from stopping a restarted Router.
346
+ * Epoch 71 restores bounded Router restart and rejected publication replay.
347
+ * Epoch 72 identity-fences provider cleanup after bounded restart.
348
+ * Epoch 73 preserves successor retry state and ambiguous dispatched cleanup.
349
+ * Epoch 74 prevents replay after accepted responses lacking message identity.
350
+ * Epoch 75 prevents hung Discord REST work from blocking daemon shutdown.
351
+ * Epoch 76 cancels hung Discord REST before active-work drain expires.
352
+ * Epoch 77 fences late Discord effect commits after Router revocation.
353
+ * Epoch 78 atomically marks timed-out Discord work uncertain before Router revocation.
354
+ * Epoch 79 releases timed-out Discord creator ownership for successor recovery.
355
+ * Epoch 80 terminalizes leases admitted after shutdown invalidator snapshot.
356
+ * Epoch 81 preserves definitive provider rejection across persistence failure and restart.
357
+ * Epoch 82 fails closed before exposing provider attachments after cleanup recovery failure.
358
+ * Epoch 83 binds provider commands to the exact opaque attachment identity.
359
+ * Epoch 84 prohibits provider lifecycle-equivalent controls and detaches replacement work.
360
+ * Epoch 85 removes direct relay attachment and prohibits lifecycle controls on every adapter.
361
+ * Epoch 86 removes public discovery/client exports and retires cross-process raw transports.
362
+ * Epoch 87 preserves accepted Telegram delivery ambiguity and advances poisoned poll cursors.
117
363
  */
118
- export const SERVING_EPOCH = 5;
364
+ export const SERVING_EPOCH = 87;
@@ -27,7 +27,6 @@ import { resolveGjcRuntimeSpawnInfo } from "../../daemon/runtime";
27
27
  import { isProcessIncarnation } from "../broker/process-incarnation";
28
28
 
29
29
  import { getNotificationConfig, isTelegramComplete, tokenFingerprint } from "./config";
30
- import { exactUnlinkNotificationFile, readNotificationEndpointFile } from "./notification-service";
31
30
  import {
32
31
  type AttestedLegacyDaemonOwner,
33
32
  confirmTelegramDaemonSpawn,
@@ -38,7 +37,6 @@ import {
38
37
  isFreshLiveOwner,
39
38
  isSignalableMatchingOwner,
40
39
  readAttestedLegacyDaemonOwner,
41
- readDaemonRoots,
42
40
  readDaemonState,
43
41
  readOwnerFreshnessSnapshot,
44
42
  spawnTelegramDaemonOwner,
@@ -49,9 +47,6 @@ import {
49
47
 
50
48
  const nodeFs: TelegramDaemonFs = {
51
49
  ...(fs.promises as unknown as TelegramDaemonFs),
52
- readEndpointFile: readNotificationEndpointFile,
53
- exactUnlink: async (file, identity) =>
54
- exactUnlinkNotificationFile(file, identity, `.gjc-delete-daemon-transition-${crypto.randomUUID()}.json`),
55
50
  };
56
51
  const DEFAULT_GRACEFUL_TIMEOUT_MS = 8_000;
57
52
  const DEFAULT_KILL_TIMEOUT_MS = 3_000;
@@ -227,7 +222,6 @@ export class TelegramDaemonController implements BuiltInDaemonController {
227
222
  }
228
223
  const snapshot = await readOwnerFreshnessSnapshot({ settings: this.settings, fs: this.fsImpl });
229
224
  const state = snapshot.state;
230
- const roots = await readDaemonRoots(this.settings, this.fsImpl);
231
225
  const health: DaemonHealth =
232
226
  !state || state.stoppedAt !== undefined || !this.pidAlive(state.pid)
233
227
  ? "stopped"
@@ -250,8 +244,6 @@ export class TelegramDaemonController implements BuiltInDaemonController {
250
244
  ownerId: state?.ownerId,
251
245
  startedAt: state?.startedAt,
252
246
  heartbeatAt: snapshot.effectiveHeartbeatAt,
253
- roots,
254
- rootCount: roots.length,
255
247
  runtime,
256
248
  };
257
249
  }
@@ -270,12 +262,11 @@ export class TelegramDaemonController implements BuiltInDaemonController {
270
262
  }
271
263
 
272
264
  private async spawnAndWait(
273
- roots: string[],
274
265
  token: string,
275
266
  chatId: string,
276
267
  ): Promise<{ spawned: TelegramSpawnOwnerResult; ready: boolean }> {
277
268
  const spawned = await spawnTelegramDaemonOwner(
278
- { settings: this.settings, roots, tokenFingerprint: token, chatId },
269
+ { settings: this.settings, tokenFingerprint: token, chatId },
279
270
  this.spawnDeps(),
280
271
  );
281
272
  const ready = await confirmTelegramDaemonSpawn({
@@ -479,7 +470,6 @@ export class TelegramDaemonController implements BuiltInDaemonController {
479
470
  const cfg = getNotificationConfig(this.settings);
480
471
  const fp = tokenFingerprint(cfg.botToken as string);
481
472
  const chatId = cfg.chatId as string;
482
- const roots = before.roots ?? (await readDaemonRoots(this.settings, this.fsImpl));
483
473
  const gracefulTimeoutMs = opts.gracefulTimeoutMs ?? DEFAULT_GRACEFUL_TIMEOUT_MS;
484
474
  const killTimeoutMs = opts.killTimeoutMs ?? DEFAULT_KILL_TIMEOUT_MS;
485
475
 
@@ -544,7 +534,7 @@ export class TelegramDaemonController implements BuiltInDaemonController {
544
534
  if (!(opts.spawnIfStopped ?? true)) {
545
535
  return this.result(action, true, "no running telegram daemon to reload", before, before, warnings);
546
536
  }
547
- const { spawned, ready } = await this.spawnAndWait(roots, fp, chatId);
537
+ const { spawned, ready } = await this.spawnAndWait(fp, chatId);
548
538
  warnings.push(...spawned.warnings);
549
539
  const after = await this.status();
550
540
  if (spawned.result === "blocked") {
@@ -704,7 +694,7 @@ export class TelegramDaemonController implements BuiltInDaemonController {
704
694
  warnings,
705
695
  );
706
696
  }
707
- const { spawned, ready } = await this.spawnAndWait(roots, fp, chatId);
697
+ const { spawned, ready } = await this.spawnAndWait(fp, chatId);
708
698
  warnings.push(...spawned.warnings);
709
699
  const after = await this.status();
710
700
  if (spawned.result === "attached") {