@gajae-code/coding-agent 0.13.3 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (599) hide show
  1. package/CHANGELOG.md +184 -2
  2. package/README.md +2 -0
  3. package/bin/gajaessi.js +4 -0
  4. package/dist/types/async/job-manager.d.ts +55 -2
  5. package/dist/types/async/support.d.ts +14 -0
  6. package/dist/types/capability/mcp.d.ts +6 -0
  7. package/dist/types/capability/types.d.ts +6 -0
  8. package/dist/types/cli/accounts-cli.d.ts +19 -0
  9. package/dist/types/cli/args.d.ts +3 -0
  10. package/dist/types/cli/config-cli.d.ts +6 -0
  11. package/dist/types/cli/crash-cli.d.ts +10 -0
  12. package/dist/types/cli/customize-doctor.d.ts +145 -0
  13. package/dist/types/cli/daemon-cli.d.ts +3 -1
  14. package/dist/types/cli/mcp-cli.d.ts +11 -0
  15. package/dist/types/cli/notify-cli.d.ts +1 -1
  16. package/dist/types/cli/root-flags.d.ts +12 -0
  17. package/dist/types/cli/setup-cli.d.ts +3 -1
  18. package/dist/types/cli/skills-cli.d.ts +2 -1
  19. package/dist/types/cli/update-cli.d.ts +19 -1
  20. package/dist/types/cli.d.ts +6 -0
  21. package/dist/types/commands/accounts.d.ts +40 -0
  22. package/dist/types/commands/crash.d.ts +24 -0
  23. package/dist/types/commands/customize.d.ts +22 -0
  24. package/dist/types/commands/daemon.d.ts +1 -1
  25. package/dist/types/commands/launch.d.ts +6 -0
  26. package/dist/types/commands/setup.d.ts +6 -0
  27. package/dist/types/commands/skills.d.ts +6 -1
  28. package/dist/types/commands/update.d.ts +7 -0
  29. package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
  30. package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
  31. package/dist/types/config/config-schema-version.d.ts +10 -0
  32. package/dist/types/config/file-lock.d.ts +18 -0
  33. package/dist/types/config/model-profile-activation.d.ts +3 -1
  34. package/dist/types/config/model-registry.d.ts +9 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +70 -6
  37. package/dist/types/config/settings.d.ts +63 -0
  38. package/dist/types/config/skill-settings-defaults.d.ts +26 -0
  39. package/dist/types/config/task-delegation.d.ts +39 -0
  40. package/dist/types/config/update-channel.d.ts +10 -0
  41. package/dist/types/coordinator-mcp/server.d.ts +5 -1
  42. package/dist/types/crash/index-store.d.ts +87 -0
  43. package/dist/types/crash/nudge.d.ts +50 -0
  44. package/dist/types/crash/record-loader.d.ts +17 -0
  45. package/dist/types/crash/report.d.ts +134 -0
  46. package/dist/types/crash/sanitize.d.ts +25 -0
  47. package/dist/types/cursor.d.ts +13 -2
  48. package/dist/types/customization/import.d.ts +37 -0
  49. package/dist/types/customization/index.d.ts +4 -0
  50. package/dist/types/customization/inventory.d.ts +25 -0
  51. package/dist/types/customization/mutations.d.ts +32 -0
  52. package/dist/types/customization/types.d.ts +115 -0
  53. package/dist/types/daemon/control-types.d.ts +8 -1
  54. package/dist/types/daemon/operator-contract.d.ts +4 -4
  55. package/dist/types/discovery/claude.d.ts +39 -1
  56. package/dist/types/discovery/codex.d.ts +39 -1
  57. package/dist/types/discovery/index.d.ts +2 -0
  58. package/dist/types/discovery/mcp-compat.d.ts +30 -0
  59. package/dist/types/edit/renderer.d.ts +23 -0
  60. package/dist/types/extensibility/extensions/runner.d.ts +3 -0
  61. package/dist/types/extensibility/extensions/types.d.ts +21 -4
  62. package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
  63. package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
  64. package/dist/types/extensibility/hooks/loader.d.ts +19 -5
  65. package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
  66. package/dist/types/extensibility/skill-management.d.ts +107 -0
  67. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
  68. package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
  69. package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
  70. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
  71. package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
  72. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
  73. package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
  74. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
  75. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
  76. package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
  77. package/dist/types/hooks/events.d.ts +60 -0
  78. package/dist/types/hooks/normalize.d.ts +83 -0
  79. package/dist/types/hooks/skill-state.d.ts +9 -2
  80. package/dist/types/main.d.ts +1 -1
  81. package/dist/types/modes/acp/abort-scope.d.ts +13 -0
  82. package/dist/types/modes/acp/acp-agent.d.ts +7 -4
  83. package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
  84. package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
  85. package/dist/types/modes/components/customization/index.d.ts +1 -0
  86. package/dist/types/modes/components/gajae-pet-widget.d.ts +8 -30
  87. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  88. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  89. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  90. package/dist/types/modes/components/pet-capability.d.ts +11 -25
  91. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  92. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  93. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  94. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  95. package/dist/types/modes/interactive-mode.d.ts +1 -0
  96. package/dist/types/modes/types.d.ts +1 -0
  97. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  98. package/dist/types/runtime-mcp/config.d.ts +9 -0
  99. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  100. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  101. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  102. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  103. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  104. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  105. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  106. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  107. package/dist/types/runtime-mcp/types.d.ts +102 -10
  108. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  109. package/dist/types/sdk/broker/broker.d.ts +3 -55
  110. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  111. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  112. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  113. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  114. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  115. package/dist/types/sdk/bus/config.d.ts +11 -0
  116. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  117. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  118. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  119. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  120. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  121. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  122. package/dist/types/sdk/bus/index.d.ts +85 -99
  123. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  124. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  125. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  126. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  127. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  128. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  129. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  130. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  131. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  132. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  133. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  135. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  136. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  137. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  138. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  139. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  140. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  141. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  142. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  143. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  144. package/dist/types/sdk/cli/rows.d.ts +2 -11
  145. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  146. package/dist/types/sdk/client/client.d.ts +97 -1
  147. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  148. package/dist/types/sdk/host/control/index.d.ts +1 -1
  149. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  150. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  151. package/dist/types/sdk/host/host.d.ts +15 -1
  152. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  153. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  154. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  155. package/dist/types/sdk/host/types.d.ts +1 -1
  156. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  157. package/dist/types/sdk/index.d.ts +2 -1
  158. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  159. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  160. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  161. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  162. package/dist/types/sdk/mcp/server.d.ts +9 -6
  163. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  164. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  165. package/dist/types/sdk/prompt-status.d.ts +10 -3
  166. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  167. package/dist/types/sdk/receipt-state.d.ts +17 -0
  168. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  169. package/dist/types/sdk/router/index.d.ts +1 -0
  170. package/dist/types/sdk/router/session-router.d.ts +152 -0
  171. package/dist/types/sdk/session-list.d.ts +22 -0
  172. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  173. package/dist/types/sdk/session.d.ts +34 -1
  174. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  175. package/dist/types/session/account-inventory.d.ts +86 -0
  176. package/dist/types/session/agent-session.d.ts +145 -6
  177. package/dist/types/session/agent-storage.d.ts +10 -0
  178. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  179. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  180. package/dist/types/session/messages.d.ts +1 -1
  181. package/dist/types/session/secure-token-file.d.ts +3 -0
  182. package/dist/types/session/session-manager.d.ts +40 -1
  183. package/dist/types/session/startup-auth-config.d.ts +44 -0
  184. package/dist/types/session/terminal-abort.d.ts +378 -0
  185. package/dist/types/session/yield-queue.d.ts +7 -0
  186. package/dist/types/session-import/claude.d.ts +26 -0
  187. package/dist/types/session-import/codex.d.ts +88 -0
  188. package/dist/types/session-import/command.d.ts +35 -0
  189. package/dist/types/session-import/detect.d.ts +22 -0
  190. package/dist/types/session-import/index.d.ts +7 -0
  191. package/dist/types/session-import/provider-codex.d.ts +22 -0
  192. package/dist/types/session-import/provider-service.d.ts +38 -0
  193. package/dist/types/session-import/redact.d.ts +23 -0
  194. package/dist/types/session-import/service.d.ts +47 -0
  195. package/dist/types/session-import/types.d.ts +120 -0
  196. package/dist/types/setup/paseo/check.d.ts +16 -0
  197. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  198. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  199. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  200. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  201. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  202. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  203. package/dist/types/setup/paseo/remove.d.ts +14 -0
  204. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  205. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  206. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  207. package/dist/types/skill-state/active-state.d.ts +5 -1
  208. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  209. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  210. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  211. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  212. package/dist/types/slash-commands/types.d.ts +7 -1
  213. package/dist/types/task/executor.d.ts +10 -0
  214. package/dist/types/task/index.d.ts +3 -1
  215. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  216. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  217. package/dist/types/tools/bash.d.ts +2 -6
  218. package/dist/types/tools/browser/attach.d.ts +11 -0
  219. package/dist/types/tools/browser/launch.d.ts +20 -0
  220. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  221. package/dist/types/tools/browser/render.d.ts +1 -0
  222. package/dist/types/tools/browser.d.ts +3 -1
  223. package/dist/types/tools/image-gen.d.ts +9 -2
  224. package/dist/types/tools/index.d.ts +8 -0
  225. package/dist/types/tools/monitor.d.ts +1 -1
  226. package/dist/types/tools/skill-discovery.d.ts +8 -1
  227. package/dist/types/tools/subagent.d.ts +2 -0
  228. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  229. package/dist/types/utils/herdr-pane.d.ts +76 -0
  230. package/package.json +19 -9
  231. package/scripts/build-binary.ts +2 -1
  232. package/scripts/build-sdk-package-smoke.ts +2 -13
  233. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  234. package/scripts/compile-args.ts +2 -0
  235. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  236. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  237. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  238. package/scripts/generate-tool-catalog.ts +6 -4
  239. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  240. package/src/async/job-manager.ts +352 -17
  241. package/src/async/support.ts +25 -0
  242. package/src/autoresearch/dashboard.ts +28 -13
  243. package/src/capability/index.ts +3 -1
  244. package/src/capability/mcp.ts +6 -0
  245. package/src/capability/types.ts +6 -0
  246. package/src/cli/accounts-cli.ts +395 -0
  247. package/src/cli/args.ts +23 -0
  248. package/src/cli/auth-broker-cli.ts +136 -66
  249. package/src/cli/auth-gateway-cli.ts +94 -70
  250. package/src/cli/config-cli.ts +27 -2
  251. package/src/cli/crash-cli.ts +78 -0
  252. package/src/cli/customize-doctor.ts +1605 -0
  253. package/src/cli/daemon-cli.ts +12 -3
  254. package/src/cli/fast-help.ts +1 -0
  255. package/src/cli/mcp-cli.ts +128 -60
  256. package/src/cli/notify-cli.ts +8 -14
  257. package/src/cli/root-flags.ts +8 -0
  258. package/src/cli/setup-cli.ts +145 -0
  259. package/src/cli/skills-cli.ts +38 -2
  260. package/src/cli/update-cli.ts +167 -12
  261. package/src/cli.ts +4 -0
  262. package/src/commands/accounts.ts +71 -0
  263. package/src/commands/crash.ts +35 -0
  264. package/src/commands/customize.ts +84 -0
  265. package/src/commands/daemon.ts +2 -2
  266. package/src/commands/deep-interview.ts +2 -0
  267. package/src/commands/launch.ts +1 -0
  268. package/src/commands/mcp.ts +12 -7
  269. package/src/commands/ralplan.ts +2 -0
  270. package/src/commands/sdk.ts +65 -32
  271. package/src/commands/setup.ts +5 -0
  272. package/src/commands/skills.ts +14 -4
  273. package/src/commands/ultragoal.ts +10 -1
  274. package/src/commands/update.ts +26 -15
  275. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  276. package/src/config/atomic-yaml-patch.ts +769 -29
  277. package/src/config/config-schema-version.ts +10 -0
  278. package/src/config/file-lock.ts +70 -1
  279. package/src/config/mcp-schema.json +52 -14
  280. package/src/config/model-profile-activation.ts +20 -1
  281. package/src/config/model-profiles.ts +29 -19
  282. package/src/config/model-registry.ts +132 -21
  283. package/src/config/models-config-schema.ts +1 -1
  284. package/src/config/settings-schema.ts +76 -6
  285. package/src/config/settings.ts +4038 -199
  286. package/src/config/skill-settings-defaults.ts +41 -3
  287. package/src/config/task-delegation.ts +87 -0
  288. package/src/config/update-channel.ts +23 -0
  289. package/src/coordinator-mcp/server.ts +377 -308
  290. package/src/crash/index-store.ts +723 -0
  291. package/src/crash/nudge.ts +89 -0
  292. package/src/crash/record-loader.ts +149 -0
  293. package/src/crash/report.ts +551 -0
  294. package/src/crash/sanitize.ts +129 -0
  295. package/src/cursor.ts +36 -10
  296. package/src/customization/import.ts +946 -0
  297. package/src/customization/index.ts +4 -0
  298. package/src/customization/inventory.ts +335 -0
  299. package/src/customization/mutations.ts +141 -0
  300. package/src/customization/types.ts +223 -0
  301. package/src/daemon/control-types.ts +8 -1
  302. package/src/daemon/operator-contract.ts +6 -6
  303. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  304. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  305. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  306. package/src/discovery/claude-hooks.ts +38 -0
  307. package/src/discovery/claude.ts +142 -209
  308. package/src/discovery/codex-hooks.ts +38 -0
  309. package/src/discovery/codex.ts +132 -198
  310. package/src/discovery/helpers.ts +8 -1
  311. package/src/discovery/index.ts +2 -0
  312. package/src/discovery/mcp-compat.ts +234 -0
  313. package/src/discovery/mcp-json.ts +6 -0
  314. package/src/edit/renderer.ts +40 -0
  315. package/src/edit/streaming.ts +4 -2
  316. package/src/exec/bash-executor.ts +24 -20
  317. package/src/export/html/index.ts +51 -2
  318. package/src/extensibility/extensions/loader.ts +9 -1
  319. package/src/extensibility/extensions/runner.ts +17 -4
  320. package/src/extensibility/extensions/types.ts +31 -6
  321. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  322. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  323. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  324. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  325. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  326. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  327. package/src/extensibility/hooks/loader.ts +154 -10
  328. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  329. package/src/extensibility/skill-management.ts +368 -0
  330. package/src/extensibility/skills.ts +52 -16
  331. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  332. package/src/gjc-runtime/launch-worktree.ts +56 -2
  333. package/src/gjc-runtime/linux-proc.ts +7 -1
  334. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  335. package/src/gjc-runtime/session-state-lock.ts +992 -0
  336. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  337. package/src/gjc-runtime/state-writer.ts +39 -14
  338. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  339. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  340. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  341. package/src/gjc-runtime/workflow-settings.ts +596 -0
  342. package/src/goals/tools/goal-tool.ts +6 -1
  343. package/src/hooks/events.ts +291 -0
  344. package/src/hooks/native-skill-hook.ts +4 -0
  345. package/src/hooks/normalize.ts +369 -0
  346. package/src/hooks/skill-state.ts +165 -46
  347. package/src/internal-urls/docs-index.generated.ts +40 -32
  348. package/src/main.ts +32 -5
  349. package/src/migrate/mcp-mapper.ts +25 -2
  350. package/src/modes/acp/abort-scope.ts +29 -0
  351. package/src/modes/acp/acp-agent.ts +423 -98
  352. package/src/modes/components/assistant-message.ts +6 -1
  353. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  354. package/src/modes/components/customization/import-wizard.ts +372 -0
  355. package/src/modes/components/customization/index.ts +1 -0
  356. package/src/modes/components/gajae-pet-widget.ts +539 -213
  357. package/src/modes/components/irc-sidebar.ts +11 -0
  358. package/src/modes/components/iterm-pet-transport.ts +585 -0
  359. package/src/modes/components/oauth-selector.ts +277 -86
  360. package/src/modes/components/pet-capability.ts +39 -40
  361. package/src/modes/components/settings-selector.ts +9 -0
  362. package/src/modes/components/status-line/gh.ts +45 -1
  363. package/src/modes/components/status-line/segments.ts +16 -1
  364. package/src/modes/components/tool-status-header.ts +13 -3
  365. package/src/modes/controllers/command-controller.ts +20 -8
  366. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  367. package/src/modes/controllers/input-controller.ts +10 -0
  368. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  369. package/src/modes/controllers/selector-controller.ts +177 -72
  370. package/src/modes/controllers/stt-controller.ts +3 -3
  371. package/src/modes/interactive-mode.ts +88 -16
  372. package/src/modes/print-mode.ts +35 -6
  373. package/src/modes/runtime-init.ts +21 -68
  374. package/src/modes/types.ts +1 -0
  375. package/src/modes/utils/injected-user-submission.ts +25 -0
  376. package/src/modes/utils/terminal-bell.ts +15 -1
  377. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  378. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  379. package/src/prompts/agents/critic.md +1 -1
  380. package/src/prompts/system/rlm-research.md +1 -1
  381. package/src/prompts/system/system-prompt.md +0 -2
  382. package/src/prompts/tools/bash.md +7 -1
  383. package/src/prompts/tools/browser.md +1 -1
  384. package/src/prompts/tools/cron.md +6 -6
  385. package/src/prompts/tools/read.md +0 -2
  386. package/src/prompts/tools/skill-discovery.md +4 -2
  387. package/src/runtime-mcp/client.ts +427 -23
  388. package/src/runtime-mcp/config.ts +37 -5
  389. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  390. package/src/runtime-mcp/manager.ts +52 -2
  391. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  392. package/src/runtime-mcp/oauth-flow.ts +46 -1
  393. package/src/runtime-mcp/pool-key.ts +5 -1
  394. package/src/runtime-mcp/pool.test.ts +9 -0
  395. package/src/runtime-mcp/protocol.test.ts +353 -0
  396. package/src/runtime-mcp/protocol.ts +624 -0
  397. package/src/runtime-mcp/scope-config.ts +78 -0
  398. package/src/runtime-mcp/tool-bridge.ts +44 -10
  399. package/src/runtime-mcp/transports/http.ts +84 -13
  400. package/src/runtime-mcp/types.ts +123 -12
  401. package/src/sdk/acp/adapter.ts +328 -97
  402. package/src/sdk/broker/broker.ts +160 -741
  403. package/src/sdk/broker/ensure.ts +9 -1
  404. package/src/sdk/broker/lifecycle.ts +510 -116
  405. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  406. package/src/sdk/broker/process-incarnation.ts +19 -0
  407. package/src/sdk/broker/session-index.ts +516 -117
  408. package/src/sdk/broker/startup-failure.ts +28 -5
  409. package/src/sdk/broker/transport.ts +1 -13
  410. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  411. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  412. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  413. package/src/sdk/bus/config.ts +13 -0
  414. package/src/sdk/bus/conversation-store.ts +59 -171
  415. package/src/sdk/bus/daemon-paths.ts +20 -0
  416. package/src/sdk/bus/discord-conversation.ts +2 -0
  417. package/src/sdk/bus/discord-daemon.ts +524 -126
  418. package/src/sdk/bus/discord-live-provider.ts +206 -79
  419. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  420. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  421. package/src/sdk/bus/index.ts +2480 -456
  422. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  423. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  424. package/src/sdk/bus/managed-daemon.ts +2 -145
  425. package/src/sdk/bus/notification-service.ts +196 -0
  426. package/src/sdk/bus/operator-runtime.ts +1 -1
  427. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  428. package/src/sdk/bus/reconciliation-store.ts +553 -24
  429. package/src/sdk/bus/session-control.ts +49 -3
  430. package/src/sdk/bus/slack-conversation.ts +4 -0
  431. package/src/sdk/bus/slack-daemon.ts +733 -134
  432. package/src/sdk/bus/slack-live-provider.ts +65 -15
  433. package/src/sdk/bus/slack-provider.ts +4 -0
  434. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  435. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  436. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  437. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  438. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  439. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  440. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  441. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  442. package/src/sdk/bus/telegram-reference.ts +1 -226
  443. package/src/sdk/bus/telegram-setup.ts +2 -2
  444. package/src/sdk/bus/threaded-render.ts +1 -0
  445. package/src/sdk/bus/topic-registry.ts +279 -146
  446. package/src/sdk/cli/rows.ts +2 -35
  447. package/src/sdk/cli/session-cli.ts +776 -700
  448. package/src/sdk/client/client.ts +892 -1
  449. package/src/sdk/host/control/dispatch.ts +93 -58
  450. package/src/sdk/host/control/index.ts +1 -1
  451. package/src/sdk/host/control/operations.ts +18 -10
  452. package/src/sdk/host/control/runtime-gate.ts +40 -0
  453. package/src/sdk/host/host.ts +63 -12
  454. package/src/sdk/host/query/handlers.ts +66 -7
  455. package/src/sdk/host/reverse-leases.ts +2 -2
  456. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  457. package/src/sdk/host/session-runtime.test.ts +2787 -34
  458. package/src/sdk/host/session-runtime.ts +1489 -101
  459. package/src/sdk/host/surface-policy.ts +12 -8
  460. package/src/sdk/host/types.ts +1 -1
  461. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  462. package/src/sdk/host/websocket-transport.ts +85 -50
  463. package/src/sdk/index.ts +2 -1
  464. package/src/sdk/lifecycle/broker-client.ts +53 -0
  465. package/src/sdk/lifecycle/client.ts +234 -0
  466. package/src/sdk/lifecycle/index.ts +3 -0
  467. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  468. package/src/sdk/lifecycle/service.ts +720 -0
  469. package/src/sdk/mcp/server.ts +226 -188
  470. package/src/sdk/prompt-deadline-lease.ts +55 -0
  471. package/src/sdk/prompt-deadline-manager.ts +148 -0
  472. package/src/sdk/prompt-status.ts +11 -3
  473. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  474. package/src/sdk/protocol/operation-registry.ts +71 -8
  475. package/src/sdk/receipt-state.ts +43 -0
  476. package/src/sdk/reconciliation-extensions.ts +14 -0
  477. package/src/sdk/router/index.ts +1 -0
  478. package/src/sdk/router/session-router.ts +1658 -0
  479. package/src/sdk/session-list.ts +93 -0
  480. package/src/sdk/session-reconnect.ts +45 -1
  481. package/src/sdk/session.ts +716 -120
  482. package/src/sdk/transport/serve-cli.ts +18 -34
  483. package/src/session/account-inventory.ts +603 -0
  484. package/src/session/agent-session.ts +2857 -582
  485. package/src/session/agent-storage.ts +35 -0
  486. package/src/session/blob-store.ts +32 -1
  487. package/src/session/coordinator-tool-label.ts +40 -0
  488. package/src/session/internal/managed-session-scope.ts +4 -0
  489. package/src/session/internal/managed-session-storage.ts +173 -12
  490. package/src/session/messages.ts +1 -1
  491. package/src/session/secure-token-file.ts +80 -0
  492. package/src/session/session-manager.ts +730 -58
  493. package/src/session/session-storage.ts +25 -16
  494. package/src/session/startup-auth-config.ts +297 -0
  495. package/src/session/terminal-abort.ts +1253 -0
  496. package/src/session/yield-queue.ts +57 -15
  497. package/src/session-import/claude.ts +334 -0
  498. package/src/session-import/codex.ts +1033 -0
  499. package/src/session-import/command.ts +77 -0
  500. package/src/session-import/detect.ts +133 -0
  501. package/src/session-import/index.ts +7 -0
  502. package/src/session-import/provider-codex.ts +327 -0
  503. package/src/session-import/provider-service.ts +457 -0
  504. package/src/session-import/redact.ts +128 -0
  505. package/src/session-import/service.ts +1264 -0
  506. package/src/session-import/types.ts +148 -0
  507. package/src/setup/paseo/check.ts +213 -0
  508. package/src/setup/paseo/install-saga.ts +293 -0
  509. package/src/setup/paseo/json-publisher.ts +263 -0
  510. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  511. package/src/setup/paseo/paseo-ownership.ts +224 -0
  512. package/src/setup/paseo/paseo-setup.ts +253 -0
  513. package/src/setup/paseo/provider-config.ts +139 -0
  514. package/src/setup/paseo/remove.ts +183 -0
  515. package/src/setup/paseo/result-types.ts +79 -0
  516. package/src/setup/paseo/setup-deps.ts +175 -0
  517. package/src/setup/paseo/skills-bridge.ts +260 -0
  518. package/src/skill-state/active-state.ts +21 -11
  519. package/src/slash-commands/acp-builtins.ts +9 -1
  520. package/src/slash-commands/builtin-registry.ts +98 -16
  521. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  522. package/src/slash-commands/helpers/mcp.ts +9 -3
  523. package/src/slash-commands/helpers/usage-report.ts +61 -56
  524. package/src/slash-commands/types.ts +7 -2
  525. package/src/task/executor.ts +30 -11
  526. package/src/task/index.ts +66 -7
  527. package/src/task/render.ts +23 -9
  528. package/src/tools/ask-answer-registry.ts +23 -7
  529. package/src/tools/ask.ts +8 -4
  530. package/src/tools/bash-sleep-advisory.ts +115 -0
  531. package/src/tools/bash.ts +98 -18
  532. package/src/tools/browser/attach.ts +71 -3
  533. package/src/tools/browser/launch.ts +86 -13
  534. package/src/tools/browser/profile-discovery.ts +57 -7
  535. package/src/tools/browser/render.ts +8 -1
  536. package/src/tools/browser.ts +130 -21
  537. package/src/tools/computer.enforcement.test.ts +1 -1
  538. package/src/tools/computer.ts +3 -2
  539. package/src/tools/cron.ts +12 -1
  540. package/src/tools/image-gen.ts +27 -16
  541. package/src/tools/index.ts +8 -0
  542. package/src/tools/job.ts +33 -6
  543. package/src/tools/monitor.ts +41 -2
  544. package/src/tools/skill-discovery.ts +21 -29
  545. package/src/tools/subagent.ts +142 -24
  546. package/src/tools/tool-catalog.generated.ts +6 -6
  547. package/src/tools/ultragoal-ask-guard.ts +10 -3
  548. package/src/utils/herdr-pane.ts +345 -0
  549. package/src/utils/title-generator.ts +2 -0
  550. package/src/web/scrapers/index.ts +6 -4
  551. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  552. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  553. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  554. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  555. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  556. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  557. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  558. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  559. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  560. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  561. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  562. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  563. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  564. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  565. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  566. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  567. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  568. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  569. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  570. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  571. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  572. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  573. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  574. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  575. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  576. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  577. package/dist/types/session/auth-broker-config.d.ts +0 -13
  578. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  579. package/dist/types/skills/skills.test.d.ts +0 -1
  580. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  581. package/dist/types/task/token-log.test.d.ts +0 -1
  582. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  583. package/dist/types/tools/descriptors.test.d.ts +0 -1
  584. package/scripts/g005-daemon-smoke.ts +0 -180
  585. package/scripts/g011-daemon-path-smoke.ts +0 -153
  586. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  587. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  588. package/src/sdk/bus/telegram-cli.ts +0 -212
  589. package/src/sdk/elevation/allowlist.ts +0 -54
  590. package/src/sdk/elevation/audit.ts +0 -208
  591. package/src/sdk/elevation/capability.ts +0 -41
  592. package/src/sdk/elevation/digest.ts +0 -129
  593. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  594. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  595. package/src/sdk/elevation/owner.ts +0 -109
  596. package/src/session/auth-broker-config.ts +0 -109
  597. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  598. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  599. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -1,12 +1,8 @@
1
1
  import type { NativeDirectoryTreeSnapshot } from "@gajae-code/natives";
2
2
  import type { ModelProfileErrorDetails } from "../../config/model-profile-contract";
3
- import { type ElevationOperation } from "../elevation/digest";
4
- import { type ElevationAnswerAuthority, type ElevationDispatchOutcome } from "../elevation/dispatch-receipt";
5
- import { ElevationLedger, type ElevationRequester } from "../elevation/grant-ledger";
6
3
  import { type DirectoryMigrationPolicy } from "../session-directory";
7
4
  import { type BrokerDiscovery, type BrokerPublicationObservation, type RedactedBrokerDiscovery } from "./discovery";
8
5
  import { type LifecycleDurableEffectsReceipt, LifecycleLedger, type LifecycleStartupFailureReceipt } from "./lifecycle-ledger";
9
- import { OperationReceiptLedger } from "./operation-receipt-ledger";
10
6
  import { SessionIndex } from "./session-index";
11
7
  export interface BrokerSettings {
12
8
  agentDir: string;
@@ -23,7 +19,7 @@ type ResolvedBrokerSettings = {
23
19
  heartbeatTtlMs: number;
24
20
  resolveDirectoryMigration: (_cwd: string) => Promise<DirectoryMigrationPolicy>;
25
21
  };
26
- export type BrokerErrorCode = "idempotency_conflict" | "terminal_uncertain" | "broker_restarting" | "unavailable" | "endpoint_stale" | "resource_gone" | "invalid_input" | "spawn_failed" | "startup_admission_timeout" | "startup_admission_refused" | "readiness_timeout" | "close_refused" | "not_found" | "live_session" | "cleanup_pending" | "ambiguous_session" | (string & {});
22
+ export type BrokerErrorCode = "idempotency_conflict" | "terminal_uncertain" | "broker_restarting" | "unavailable" | "endpoint_stale" | "resource_gone" | "invalid_input" | "spawn_failed" | "startup_admission_timeout" | "startup_admission_refused" | "readiness_timeout" | "close_refused" | "not_found" | "live_session" | "cleanup_pending" | (string & {});
27
23
  export type BrokerCleanupIdentity = {
28
24
  dev: string;
29
25
  ino: string;
@@ -200,8 +196,6 @@ export declare class Broker {
200
196
  readonly settings: ResolvedBrokerSettings;
201
197
  readonly index: SessionIndex;
202
198
  readonly ledger: LifecycleLedger;
203
- readonly elevation: ElevationLedger;
204
- readonly operationReceipts: OperationReceiptLedger;
205
199
  discovery: BrokerDiscovery | null;
206
200
  constructor(settings: BrokerSettings);
207
201
  runStartup<T>(queueWaitMs: number, timing: StartupAdmissionTiming, task: (admittedAt: number) => Promise<T>): Promise<StartupAdmissionResult<T>>;
@@ -210,14 +204,7 @@ export declare class Broker {
210
204
  get completion(): Promise<void>;
211
205
  status(): RedactedBrokerDiscovery | null;
212
206
  heartbeat(): Promise<void>;
213
- /**
214
- * Production coalesced heartbeat checkpoint seam (C2): delegates to the session
215
- * index writer, which appends at most one `host_heartbeat` per session per
216
- * {@link SESSION_HEARTBEAT_INTERVAL_MS} for hosts that are alive and, when recorded,
217
- * still carry the same OS process incarnation. Returns the number of checkpoints
218
- * written. Used by the periodic publication watch, by session reads so a fresh
219
- * registration is observed as live, and by tests.
220
- */
207
+ /** Re-observes provably live session hosts and checkpoints their liveness. */
221
208
  heartbeatSessions(now?: number): Promise<number>;
222
209
  /**
223
210
  * Revalidate retained publication ownership and begin one synchronous effect in
@@ -238,46 +225,7 @@ export declare class Broker {
238
225
  * spawns a child the broker has no authority over.
239
226
  */
240
227
  stop(): Promise<void>;
241
- handleRequest(operation: string, input: Record<string, unknown>, idempotencyKey?: string, elevationRequestId?: string): Promise<BrokerResponse>;
242
- /**
243
- * Elevation issuance (internal). Binds the exact endpoint identity
244
- * (endpointStateRoot/generation/incarnation) from the live index record;
245
- * the request digest is broker-computed from the full `{kind,sdkId,input}`
246
- * triple with the top-level `elevationRequestId` excluded.
247
- */
248
- elevationIssue(params: {
249
- sessionId: string;
250
- operation: ElevationOperation;
251
- input: Record<string, unknown>;
252
- requester: ElevationRequester;
253
- elevationRequestId?: string;
254
- expiresInMs?: number;
255
- }): Promise<BrokerResponse>;
256
- /**
257
- * Elevation answer (internal, operator-only). There is no public
258
- * `elevation.answer` operation: this entry point is reserved for the local
259
- * operator approval surface and the separately authorized gate-answer
260
- * source, and the ledger enforces the distinct-answer-source boundary.
261
- */
262
- elevationAnswer(params: {
263
- elevationRequestId: string;
264
- answer: "approve" | "deny";
265
- presentedDigest: string;
266
- answerer: ElevationAnswerAuthority;
267
- }): Promise<BrokerResponse>;
268
- /** Single-use grant claim (internal): consumes the grant before dispatch. */
269
- elevationClaim(params: {
270
- elevationRequestId: string;
271
- }): Promise<BrokerResponse>;
272
- /** Records the dispatch outcome for a claimed grant (internal). */
273
- elevationDispatch(params: {
274
- elevationRequestId: string;
275
- outcome: ElevationDispatchOutcome;
276
- }): Promise<BrokerResponse>;
277
- /** Truthful elevation status read (internal; reconciles expiry and crash state). */
278
- elevationResolve(elevationRequestId: string): Promise<BrokerResponse>;
279
- /** Truthful elevation listing (internal). */
280
- elevationList(): Promise<BrokerResponse>;
228
+ handleRequest(operation: string, input: Record<string, unknown>, idempotencyKey?: string): Promise<BrokerResponse>;
281
229
  }
282
230
  /** Test-only hook for simulating a process crash after terminal persistence verification. */
283
231
  export declare function setTerminalPersistenceHookForTest(broker: Broker, hook: (() => void) | undefined): void;
@@ -94,6 +94,7 @@ export declare function sdkSessionCommandOverrideForTest(): {
94
94
  file: string;
95
95
  args: string[];
96
96
  } | undefined;
97
+ type BrokerIndex = Pick<Broker, "index">;
97
98
  export declare function setProcessIncarnationForTest(broker: Broker, value: ((pid: number) => string | undefined) | undefined): void;
98
99
  /** The child writes this only after its endpoint and semantic ready event are both live. */
99
100
  export declare function writeSessionLifecycleReady(root: string, id: string, effectMarker: string): Promise<void>;
@@ -165,14 +166,21 @@ export declare function sessionHostWorkInFlight(): boolean;
165
166
  * How often a live broker re-checks its own session registrations against OS
166
167
  * process liveness.
167
168
  *
168
- * This sweep can never disturb healthy work: a registration is only dropped
169
- * when `process.kill(pid, 0)` proves the exact published pid is gone, and a
170
- * working host answers that probe for its entire life no matter how long a turn
171
- * runs. One minute keeps `gjc_sessions`/`session.get_endpoint` from advertising
172
- * a corpse for longer than a single poll while costing one index refresh per
173
- * minute on an otherwise idle broker.
169
+ * This sweep can never disturb healthy work: a registration is dropped only when
170
+ * `observeProcess` proves its exact published process identity exited. A live
171
+ * replacement at the same pid retires the stale registration without being
172
+ * signaled. One minute keeps `gjc_sessions`/`session.get_endpoint` from
173
+ * advertising a corpse for longer than a single poll while costing one index
174
+ * refresh per minute on an otherwise idle broker.
174
175
  */
175
176
  export declare const BROKER_DEAD_REGISTRATION_SWEEP_MS = 60000;
177
+ /**
178
+ * Registrations reaped per sweep. Every reap is its own locked index transaction,
179
+ * so an uncapped sweep over a long-lived index turns one broker into a continuous
180
+ * holder of the shared session-index lock and starves unrelated `gjc` launches out
181
+ * of their bounded retry budget. Surplus dead rows are reaped by later sweeps.
182
+ */
183
+ export declare const BROKER_DEAD_REGISTRATION_SWEEP_LIMIT = 64;
176
184
  /** One reaped registration, as recorded by {@link reapDeadSessionRegistrations}. */
177
185
  export interface ReapedSessionRegistration {
178
186
  sessionId: string;
@@ -188,13 +196,11 @@ export interface ReapedSessionRegistration {
188
196
  * missing heartbeat merely makes a session read as not-live — the host may
189
197
  * still be running ahead of the next heartbeat checkpoint pass, so it is never
190
198
  * grounds for a reap. EPERM and unreadable incarnations stay "uncertain", so an
191
- * alien or unreadable process is never mistaken for a dead one. Registrations
192
- * already terminal or marked `terminalUncertain` are left alone: their
193
- * disposition belongs to the terminal-uncertainty reconciliation path, and
194
- * silently dropping them would turn a fail-closed `session.close`/
195
- * `session.delete` refusal into `not_found`.
199
+ * alien or unreadable process is never mistaken for a dead one. Terminal and
200
+ * terminal-uncertain identities are retained. Identity-level rows let the sweep
201
+ * retire a dead losing root without disturbing the surviving authority.
196
202
  */
197
- export declare function reapDeadSessionRegistrations(broker: Pick<Broker, "index">): Promise<ReapedSessionRegistration[]>;
203
+ export declare function reapDeadSessionRegistrations(broker: BrokerIndex, limit?: number): Promise<ReapedSessionRegistration[]>;
198
204
  /**
199
205
  * Runs {@link reapDeadSessionRegistrations} on {@link BROKER_DEAD_REGISTRATION_SWEEP_MS}.
200
206
  * The timer is unref'd, so it never keeps an otherwise idle broker process alive.
@@ -68,11 +68,13 @@ export interface IndexedSession {
68
68
  activity?: SessionActivity;
69
69
  /** Wall-clock timestamp of the latest admitted heartbeat, when one exists. */
70
70
  lastHeartbeatAt?: number;
71
- /** True when the same sessionId maps to more than one stateRoot (cross-repo duplicate). */
71
+ /** True when more than one unresolved authority-fencing state-root identity claims this session id. */
72
72
  ambiguous: boolean;
73
- /** True when the identity's latest event is host_unregistered or session_closed (DR-1: stopped rows are retained). */
73
+ /** True when the identity's latest event is terminal (DR-1 retains stopped rows for inspection/offline tail). */
74
74
  terminal: boolean;
75
75
  }
76
+ /** A session can grant endpoint or lifecycle authority only when one authority-fencing state root claims its id. */
77
+ export declare function isSessionAuthorityEligible(session: Pick<IndexedSession, "ambiguous">): boolean;
76
78
  export interface SessionList {
77
79
  indexSeq: number;
78
80
  sessions: IndexedSession[];
@@ -119,6 +121,7 @@ export declare class SessionIndex {
119
121
  refresh(): Promise<void>;
120
122
  get indexSeq(): number;
121
123
  append(input: Omit<SessionIndexEvent, "version" | "indexSeq" | "checksum" | "ts"> & Partial<Pick<SessionIndexEvent, "ts">>): Promise<SessionIndexEvent>;
124
+ unregisterIfCurrent(expected: IndexedSession): Promise<boolean>;
122
125
  /** Hold the canonical index lock across an authority-sensitive operation. */
123
126
  withLocked<T>(callback: () => Promise<T>): Promise<T>;
124
127
  snapshot(): Promise<void>;
@@ -128,19 +131,25 @@ export declare class SessionIndex {
128
131
  */
129
132
  compact(): Promise<void>;
130
133
  listSessions(): SessionList;
134
+ /**
135
+ * Broker-internal current composite-identity rows. Unlike {@link listSessions},
136
+ * this retains losing roots so an exact dead registration can be retired without
137
+ * disturbing the surviving authority.
138
+ */
139
+ listSessionIdentities(probedIncarnations?: ReadonlyMap<string, string | undefined>): IndexedSession[];
131
140
  /**
132
141
  * Production coalesced heartbeat checkpoint pass (C2): appends one
133
142
  * `host_heartbeat` per session at most once per {@link SESSION_HEARTBEAT_INTERVAL_MS}.
134
143
  * The pass observes liveness the same way the projection does — the host process
135
144
  * must be alive and, for composite identities, still carry the recorded OS process
136
- * incarnation (a reused PID is never checkpointed). Stopped/terminal rows and rows
137
- * whose heartbeat is still fresh are skipped. After a broker restart, sessions whose
145
+ * incarnation (a reused PID is never checkpointed). Stopped, terminal, and ambiguous rows
146
+ * and rows whose heartbeat is still fresh are skipped. After a broker restart, sessions whose
138
147
  * host survived are re-observed as live on the first pass; sessions whose host died
139
148
  * while the broker was down keep their stale or missing heartbeat and read as
140
149
  * unknown/not-live (never fresh forever). Returns the number of checkpoints written.
141
150
  */
142
151
  checkpointLiveHeartbeats(now?: number): Promise<number>;
143
- hostUnregisteredAfter(registration: Pick<IndexedSession, "sessionId" | "endpointGeneration" | "pid" | "indexSeq" | "lifecycleRequestId">): {
152
+ hostUnregisteredAfter(registration: Pick<IndexedSession, "sessionId" | "locator" | "endpointGeneration" | "pid" | "indexSeq" | "lifecycleRequestId" | "hostIncarnation" | "processIncarnation">): {
144
153
  indexSeq: number;
145
154
  lifecycleRequestId?: string;
146
155
  } | undefined;
@@ -4,13 +4,28 @@ export interface BrokerStartupFailureMarker {
4
4
  exitCode: number | null;
5
5
  signal: string | null;
6
6
  writtenAt: number;
7
+ /**
8
+ * pid of the exact broker process that wrote this marker. `ensureBroker`
9
+ * only trusts a marker whose pid matches the exact spawned child it just
10
+ * reaped -- a marker left behind by a stale or foreign broker process (for
11
+ * example a losing racer from a concurrent spawn, or a marker predating the
12
+ * pre-spawn clear) must never be misattributed to a different spawn's
13
+ * failure.
14
+ */
15
+ pid: number;
7
16
  }
8
17
  export declare function brokerStartupFailurePath(agentDir: string): string;
9
- /** Best-effort durable marker write; never throws (diagnostics must not mask the exit itself). */
18
+ /**
19
+ * Best-effort durable marker write; never throws (diagnostics must not mask the
20
+ * exit itself). `pid` must be the writing broker process's own pid
21
+ * (`process.pid`) so a later reader can bind the marker to the exact spawned
22
+ * child it is attributing the failure to.
23
+ */
10
24
  export declare function writeBrokerStartupFailureMarker(agentDir: string, failure: {
11
25
  reason: string;
12
26
  exitCode: number | null;
13
27
  signal: string | null;
28
+ pid: number;
14
29
  }): Promise<void>;
15
30
  /** Reads a bounded startup-failure marker; `undefined` when absent or malformed. */
16
31
  export declare function readBrokerStartupFailureMarker(agentDir: string): Promise<BrokerStartupFailureMarker | undefined>;
@@ -45,7 +45,57 @@ export type ChatDaemonAction = "stop" | "reload";
45
45
  * generation 29 / slack generation 28 advance the replay cursor only after a frame is
46
46
  * published, so an owner at an earlier generation acknowledges an event before delivering
47
47
  * it and loses that event for good the first time a surface refuses it. Discord generation 30 /
48
- * slack generation 29 invalidate existing owners after SDK discovery validation changes.
48
+ * slack generation 29 move lifecycle and attachment authority into SDK core; generation 30 also
49
+ * isolates per-session Router attachment failures so one stale endpoint cannot block healthy sessions.
50
+ * Discord generation 31 bounds one REST operation across response parsing and multi-request flows.
51
+ * Slack generation 30 bounds shutdown, tracks outbound work, and fences late effect commits.
52
+ * Slack generation 31 fences late post admission and tracks close-marker shutdown work.
53
+ * Slack generation 32 bounds provider teardown and preserves close markers after Router revocation.
54
+ * Slack generation 33 bounds lifecycle predecessors under the shutdown deadline.
55
+ * Slack generation 34 CAS-fences cleanup mapping commits against successors.
56
+ * Slack generation 35 identity-fences detached startup cleanup from restarted daemon state.
57
+ * Slack generation 36 retains stop ownership for every detached lifecycle generation.
58
+ * Discord generation 32 / Slack generation 37 bind cleanup to the removed attachment generation.
59
+ * Discord generation 33 / Slack generation 38 identity-fence cleanup callbacks on exact attachments.
60
+ * Discord generation 34 / Slack generation 39 clear stale attachment identity before provider reassignment.
61
+ * Discord generation 35 / Slack generation 40 capture provider ownership before cleanup awaits.
62
+ * Discord generation 36 / Slack generation 41 drain prior cleanup before provider restart.
63
+ * Discord generation 37 / Slack generation 42 serialize successor attachment visibility after cleanup.
64
+ * Discord generation 38 / Slack generation 43 hold successor frames behind cleanup settlement.
65
+ * Discord generation 39 / Slack generation 44 recover durable cleanup before attachment publication.
66
+ * Slack generation 45 persists exact pending cleanup intent through recovery.
67
+ * Discord generation 40 bounds provider lifecycle joins before Router revocation.
68
+ * Discord generation 41 / Slack generation 46 revoke Router authority despite provider shutdown failure.
69
+ * Discord generation 42 / Slack generation 47 retain daemon objects across restart to preserve detached lifecycle fences.
70
+ * Discord generation 43 / Slack generation 48 fence Router attachment publication and Broker-adopted endpoint authority.
71
+ * Discord generation 44 / Slack generation 49 retain provider shutdown tails and rejected lifecycle errors so no successor transport starts before ownership settles.
72
+ * Discord generation 45 / Slack generation 50 clean predecessor presentation authority before exact Router replacement and reject post-stop Discord callbacks.
73
+ * Discord generation 46 / Slack generation 51 establish replay barriers before reconnect awaits, distinguish replacement from terminal cleanup, and await lifecycle-fenced Discord inbound work.
74
+ * Discord generation 47 / Slack generation 52 preserve presentation continuity across replacement while exact opaque authority fences stale work.
75
+ * Discord generation 48 / Slack generation 53 allow exact publication-time requests without reconciliation deadlock.
76
+ * Discord generation 49 / Slack generation 54 revalidate endpoint authority before exact publication-time requests.
77
+ * Discord generation 50 / Slack generation 55 terminalize predecessor routes only for a changed same-generation endpoint incarnation.
78
+ * Slack generation 56 clears predecessor inbound receipts before same-generation successor publication.
79
+ * Discord generation 51 / Slack generation 57 persist restart-stable Router endpoint-incarnation authority in provider mappings.
80
+ * Discord generation 52 / Slack generation 58 classify reconnect-time endpoint changes before provider retirement.
81
+ * Discord generation 53 / Slack generation 59 serialize successor attach behind predecessor provider retirement.
82
+ * Discord generation 54 / Slack generation 60 version-fence attaches already in flight when retirement begins.
83
+ * Discord generation 55 / Slack generation 61 fence durable inbound work by exact attachment identity.
84
+ * Discord generation 56 / Slack generation 62 fence durable provider-post and thread-effect recovery by attachment identity.
85
+ * Discord generation 57 removes missing-authority wildcard behavior from durable binding checks.
86
+ * Discord generation 58 preserves exact authority through unarchive replacement fallback.
87
+ * Discord generation 59 / Slack generation 63 derive attachment authority ids from one Router function so persisted provider bindings and live attachments cannot drift apart.
88
+ * Discord generation 62 / Slack generation 65 fence the Windows process-incarnation
89
+ * authority change (#4362): the native binding fallback no longer spawns powershell.exe.
90
+ * Discord generation 63 / Slack generation 66 retain the shared ownership fence
91
+ * unless a zero-signal process probe returns ESRCH. EPERM and unknown failures are
92
+ * indeterminate, so earlier owners must not reclaim, replace, or spawn through them.
93
+ * Discord generation 64 / Slack generation 67 contain synchronous provider-
94
+ * subscription admission and ready-hook failures without revoking shared Router
95
+ * attachment authority.
96
+ * Discord generation 65 / Slack generation 68 fence the off-reconcile-tail
97
+ * initial attachment replay introduced by #4542 so pre-upgrade daemon owners
98
+ * cannot retain the earlier SessionRouter attachment contract.
49
99
  */
50
100
  export declare const CHAT_DAEMON_GENERATIONS: Readonly<Record<ChatDaemonKind, number>>;
51
101
  export declare function chatDaemonGeneration(kind: ChatDaemonKind): number;
@@ -1,5 +1,4 @@
1
- import { SessionIndex } from "../broker/session-index";
2
- import { type SdkSessionEndpoint } from "../client/discovery";
1
+ import type { SessionRouterDeps } from "../router";
3
2
  import type { ChatDaemonCommandBindInput, ChatDaemonCommandOutcome } from "./chat-daemon-command-channel";
4
3
  import type { ChatDaemonKind } from "./chat-daemon-control";
5
4
  import type { DiscordProvider } from "./discord-provider";
@@ -26,22 +25,6 @@ export interface ChatDaemonRuntimeConfig {
26
25
  verbosity: "lean" | "verbose";
27
26
  };
28
27
  }
29
- export interface ChatDaemonSdkClient {
30
- onFrame(handler: (frame: Record<string, unknown>) => void): () => void;
31
- /**
32
- * Announces that a replacement socket is live. Optional because command-scoped
33
- * clients (the broker client, one-shot doubles) never outlive one socket, while
34
- * every long-lived attachment's client carries it.
35
- */
36
- onReconnect?(handler: () => void): () => void;
37
- /** Re-dials a retired socket; a no-op on a live one. */
38
- connect?(): Promise<void>;
39
- request(frame: Record<string, unknown>, options?: {
40
- timeoutMs?: number;
41
- }): Promise<Record<string, unknown>>;
42
- close(): Promise<void>;
43
- send(frame: Record<string, unknown>): void;
44
- }
45
28
  export type ChatDeliveryPhase = "pre_send" | "ambiguous";
46
29
  /** An authorized SDK command could not be conclusively delivered. */
47
30
  export declare class ChatDeliveryError extends Error {
@@ -51,19 +34,11 @@ export declare class ChatDeliveryError extends Error {
51
34
  export interface ChatDaemonRuntimeDeps {
52
35
  createDiscordProvider?: (config: NonNullable<ChatDaemonRuntimeConfig["notifications"]["discord"]>) => DiscordProvider;
53
36
  createSlackProvider?: (config: NonNullable<ChatDaemonRuntimeConfig["notifications"]["slack"]>) => SlackProviderClient;
54
- createClient?: (endpoint: SdkSessionEndpoint) => Promise<ChatDaemonSdkClient>;
55
- createIndex?: (agentDir: string) => SessionIndex;
56
- createBrokerClient?: (endpoint: {
57
- url: string;
58
- token: string;
59
- }) => Promise<ChatDaemonSdkClient>;
60
- onReconciled?: () => void;
61
- setInterval?: typeof setInterval;
62
- clearInterval?: typeof clearInterval;
37
+ routerDeps?: SessionRouterDeps;
63
38
  }
64
39
  /**
65
40
  * Worker-owned session discovery and event fanout. It connects only through the
66
- * public SDK transport and retains endpoint tokens solely in live client objects.
41
+ * public SDK transport and retains SDK credentials solely in live client objects.
67
42
  */
68
43
  export declare class ChatDaemonRuntime {
69
44
  #private;
@@ -77,18 +52,6 @@ export declare class ChatDaemonRuntime {
77
52
  start(): Promise<void>;
78
53
  transportHealthy(): boolean;
79
54
  stop(): Promise<void>;
80
- private reconcile;
81
- private attach;
82
- private resolveEndpoint;
83
- /**
84
- * Adopt an operator-supplied Slack root for one attached session. Returns a
85
- * machine-readable rejection instead of throwing so the daemon control plane
86
- * can answer without exposing internal failure detail.
87
- */
55
+ /** Adopt an operator-supplied Slack root through the provider's presentation store. */
88
56
  bindExistingRoot(request: ChatDaemonCommandBindInput): Promise<ChatDaemonCommandOutcome>;
89
- private schedule;
90
- private enqueueFrame;
91
- private handleFrame;
92
- private close;
93
- private resume;
94
57
  }
@@ -10,6 +10,17 @@ import { type LoadResult } from "../../config/config-file";
10
10
  * site marks it, never by inheriting a marked ancestor's environment.
11
11
  */
12
12
  export declare const SPAWN_PROVENANCE_ENV = "GJC_SPAWNED_BY_SESSION";
13
+ /**
14
+ * Telegram session eligibility: whether a session may own a forum topic and be
15
+ * admitted by the notification daemon.
16
+ *
17
+ * This follows the user's configuration, never how the session was launched.
18
+ * Gating it on coordinator/lifecycle provenance made every ordinary
19
+ * interactive session declare itself ineligible, and the daemon refuses an
20
+ * identity header that does so — so no notification was ever delivered even
21
+ * though the daemon looked healthy and attached.
22
+ */
23
+ export declare function isTelegramSessionEligible(cfg: NotificationConfig): boolean;
13
24
  export type TelegramActivationState = "inactive" | "blocked";
14
25
  export type TelegramActivationReason = "saved_inactive" | "identity_mismatch";
15
26
  /** Non-secret, identity-specific durable Telegram activation state. */
@@ -24,7 +24,6 @@ export interface ConversationStoreFs {
24
24
  mode: number;
25
25
  }): Promise<void>;
26
26
  rename(from: string, to: string): Promise<void>;
27
- link(from: string, to: string): Promise<void>;
28
27
  unlink(file: string): Promise<void>;
29
28
  open(file: string, flags: string): Promise<ConversationStoreFileHandle>;
30
29
  stat?(file: string): Promise<{
@@ -16,5 +16,11 @@ export interface DaemonPaths {
16
16
  diagnostic: string;
17
17
  aliases: string;
18
18
  seenUpdates: string;
19
+ ownerRegistry: string;
20
+ recoveryReceipt: string;
19
21
  }
22
+ export declare function agentDirDigest(agentDir: string): string;
23
+ export declare function telegramDaemonOwnerMarkerPath(agentDir: string, acquisitionId: string): string;
24
+ export declare const daemonOwnerMarkerPath: typeof telegramDaemonOwnerMarkerPath;
25
+ export declare const telegramDaemonProcessMarkerPath: typeof telegramDaemonOwnerMarkerPath;
20
26
  export declare function daemonPaths(agentDir: string): DaemonPaths;
@@ -8,6 +8,7 @@ export interface DiscordInboundDispatchReceipt {
8
8
  actionId?: string;
9
9
  actionNonce?: string;
10
10
  endpointGeneration: number;
11
+ attachmentAuthorityId?: string;
11
12
  effectId: string;
12
13
  idempotencyKey: string;
13
14
  }
@@ -25,6 +26,7 @@ export interface DiscordConversation extends ConversationRecord {
25
26
  createOwner?: string;
26
27
  createLeaseExpiresAt?: number;
27
28
  endpointGeneration?: number;
29
+ attachmentAuthorityId?: string;
28
30
  /** Immutable lineage for archive and resume provider effects. */
29
31
  effectIncarnationId?: string;
30
32
  /** Current archive operation authority. */
@@ -1,32 +1,27 @@
1
+ import { type SessionAttachment } from "../router";
1
2
  import { type DiscordConversation } from "./discord-conversation";
2
3
  import type { DiscordInboundEvent, DiscordProvider } from "./discord-provider";
3
- export declare class DiscordEndpointBindingError extends Error {
4
+ export declare class DiscordAttachmentBindingError extends Error {
4
5
  constructor(message?: string);
5
6
  }
6
- /** A captured live SDK transport. `isCurrent` must fail closed after replacement or removal. */
7
- export interface DiscordEndpointBinding {
8
- generation: number;
9
- isCurrent(): boolean;
10
- send(frame: Record<string, unknown>): void | Promise<void>;
11
- }
12
7
  export interface DiscordLeaseRecoveryScheduler {
13
8
  setTimeout(callback: () => void | Promise<void>, delayMs: number): unknown;
14
9
  clearTimeout(handle: unknown): void;
15
10
  }
16
11
  export interface DiscordNotificationDaemonOptions {
17
12
  agentDir: string;
18
- repo: string;
19
13
  guildId: string;
20
14
  parentChannelId: string;
21
15
  provider: DiscordProvider;
22
16
  now?: () => number;
23
17
  leaseRecoveryScheduler?: DiscordLeaseRecoveryScheduler;
24
- resolveEndpoint: (sessionId: string, expectedGeneration?: number) => Promise<DiscordEndpointBinding | null>;
25
- onCommand?: (sessionId: string, content: string, endpoint: DiscordEndpointBinding, idempotencyKey: string) => Promise<boolean>;
18
+ resolveAttachment: (sessionId: string, expectedGeneration?: number) => SessionAttachment | null | Promise<SessionAttachment | null>;
19
+ onCommand?: (sessionId: string, content: string, attachment: SessionAttachment, idempotencyKey: string) => Promise<boolean>;
26
20
  }
27
21
  export interface DiscordNotificationInput {
28
22
  sessionId: string;
29
23
  endpointGeneration: number;
24
+ attachmentAuthorityId?: string;
30
25
  content: string;
31
26
  threadName?: string;
32
27
  actionId?: string;
@@ -38,14 +33,24 @@ export declare class DiscordNotificationDaemon {
38
33
  #private;
39
34
  private readonly options;
40
35
  constructor(options: DiscordNotificationDaemonOptions);
36
+ restartBlocked(): boolean;
41
37
  start(): Promise<void>;
42
38
  stop(): Promise<void>;
39
+ /**
40
+ * Frame-driven publication work is tracked like inbound events so that stop()
41
+ * drains it while the Router still holds attachment authority. A session
42
+ * replayed during teardown otherwise reaches its post-provider binding
43
+ * revalidation only after Router.stop() has revoked the attachment, turning a
44
+ * legitimate create into a spurious teardown rejection.
45
+ */
43
46
  notify(input: DiscordNotificationInput): Promise<DiscordConversation>;
44
47
  /** Posts a safe command outcome to the active mapped conversation. */
45
48
  postCommandResult(sessionId: string, content: string): Promise<boolean>;
46
- close(sessionId: string): Promise<void>;
49
+ close(sessionId: string, endpointGeneration?: number): Promise<void>;
50
+ recoverCleanup(sessionId: string, endpointGeneration: number): Promise<void>;
51
+ retireAttachment(sessionId: string, endpointGeneration: number): Promise<void>;
47
52
  archive(sessionId: string): Promise<void>;
48
- resume(sessionId: string, endpointGeneration: number): Promise<DiscordConversation | undefined>;
53
+ resume(sessionId: string, endpointGeneration: number, attachmentAuthorityId?: string): Promise<DiscordConversation | undefined>;
49
54
  resolveAction(sessionId: string, actionId: string): Promise<void>;
50
55
  handleInbound(event: DiscordInboundEvent): Promise<void>;
51
56
  }
@@ -4,19 +4,14 @@
4
4
  * Stock startup publishes a session's readiness immediately, so the running
5
5
  * chat daemon surfaces the session and creates its own root before an operator
6
6
  * could ever name an existing one. A session that opts in is *prepared*
7
- * instead: its id, endpoint, and broker registration are discoverable authority
8
- * while readiness stays withheld, which leaves exactly one root claim for
9
- * `gjc notify bind-thread` to fill. Activation then publishes readiness once,
10
- * and the daemon adopts the bound root instead of replacing it.
7
+ * instead: readiness stays withheld while the provider applies its one root
8
+ * claim. The SessionRouter owns endpoint authority and activation; this module
9
+ * only proves that the provider mapping authorizes readiness publication.
11
10
  *
12
11
  * Nothing here mutates a mapping. The gate only reads the daemon-owned store to
13
- * prove a binding exists, and the activation client only asks the session's own
14
- * host to publish the readiness it withheld.
12
+ * prove a binding exists for the exact session and endpoint generation.
15
13
  */
16
- import type { SessionIndex } from "../broker/session-index";
17
- import type { SdkSessionEndpoint, SdkSessionEndpointScope } from "../client/discovery";
18
14
  import type { SessionActivationGate } from "../host";
19
- import { type ActivatedPreparedSession, type PreparedSessionActivationClient } from "../session-activation";
20
15
  import type { ConversationStore } from "./conversation-store";
21
16
  import type { SlackConversation } from "./slack-conversation";
22
17
  /** Explicit, session-scoped opt-in for withholding readiness until a root is bound. */
@@ -44,28 +39,3 @@ export interface SlackBindingActivationInput {
44
39
  * caller reports unavailable authority instead of an authorization.
45
40
  */
46
41
  export declare function createSlackBindingActivationGate(input: SlackBindingActivationInput): SessionActivationGate;
47
- export type { ActivatedPreparedSession, PreparedSessionActivationClient, SessionActivationErrorCode, } from "../session-activation";
48
- export { requestPreparedSessionActivation, SessionActivationError } from "../session-activation";
49
- export interface PreparedSessionActivationInput {
50
- sessionIndex: SessionIndex;
51
- sessionId: string;
52
- }
53
- export interface PreparedSessionActivationDeps {
54
- readEndpoint?: (repo: string, sessionId: string, scope?: SdkSessionEndpointScope) => Promise<SdkSessionEndpoint | null>;
55
- connect?: (endpoint: {
56
- url: string;
57
- token: string;
58
- }) => Promise<PreparedSessionActivationClient>;
59
- }
60
- /**
61
- * Ask a prepared session to publish the readiness it withheld.
62
- *
63
- * The same discovery authority the binding requires is resolved first, so an
64
- * unindexed, terminated, or endpoint-rolled session is refused before any
65
- * connection is opened. The request names the exact session and endpoint
66
- * generation, and the answer is accepted only when it proves both, so a
67
- * replacement session can never be activated in place of the requested one.
68
- * Activation is idempotent: an exact retry answers `already` without a second
69
- * readiness signal.
70
- */
71
- export declare function activatePreparedSession(input: PreparedSessionActivationInput, deps?: PreparedSessionActivationDeps): Promise<ActivatedPreparedSession>;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Pure per-update inbound reaction transition ordering.
3
+ *
4
+ * Extracted from the Telegram daemon so the serialization and terminal-state
5
+ * contract is testable without daemon/attachment/topic-lease infrastructure.
6
+ * The production router dispatches notification frames without awaiting prior
7
+ * callbacks, so an `accepted` handler can still be in flight when the
8
+ * `consumed` handler runs. Chaining every transition for one update through a
9
+ * single promise keeps effects ordered, and skipping nonterminal transitions
10
+ * after a terminal one makes the terminal state monotonic: a late queued
11
+ * marker can never overwrite an already-sent consumed marker or retraction.
12
+ */
13
+ /** A single ordered Bot API reaction transition for one update id. */
14
+ export interface InboundReactionTransition {
15
+ /** Serialized in submission order per update id. */
16
+ readonly effect: () => Promise<void>;
17
+ /** Terminal transitions (consumed / retraction) close the update. */
18
+ readonly terminal: boolean;
19
+ }
20
+ /**
21
+ * Terminal tombstones are retained only for a bounded window of recent update
22
+ * ids. Telegram update ids are monotonically increasing per bot, so a stale
23
+ * `accepted` ack that could overwrite a terminal state always carries an id at
24
+ * or below the terminal one; ids far below the window are long-expired updates
25
+ * whose correction target no longer exists, so the daemon's own target lookup
26
+ * already ignores them.
27
+ */
28
+ export declare const INBOUND_REACTION_TOMBSTONE_WINDOW = 512;
29
+ export declare class InboundReactionSequencer {
30
+ #private;
31
+ /** True once a terminal transition completed for this update. */
32
+ isTerminal(updateId: number): boolean;
33
+ /**
34
+ * Enqueue one transition. The returned promise settles when the transition
35
+ * has run (or was skipped because a terminal state already closed it).
36
+ */
37
+ apply(updateId: number, transition: InboundReactionTransition): Promise<void>;
38
+ /** @internal Test-only: number of retained per-update chains. */
39
+ debugChainCount(): number;
40
+ /** @internal Test-only: number of retained terminal tombstones. */
41
+ debugTombstoneCount(): number;
42
+ }
43
+ /** Body for setting an emoji reaction on an inbound Telegram message. */
44
+ export declare function inboundReactionSetPayload(chatId: string, messageId: number, emoji: string): {
45
+ chat_id: string;
46
+ message_id: number;
47
+ reaction: Array<{
48
+ type: "emoji";
49
+ emoji: string;
50
+ }>;
51
+ };
52
+ /**
53
+ * Body for retracting a reaction. The Bot API clears a bot reaction with the
54
+ * empty reaction list; an empty `emoji` string is not a valid reaction and is
55
+ * silently rejected, leaving the stale queued marker visible.
56
+ */
57
+ export declare function inboundReactionRetractPayload(chatId: string, messageId: number): {
58
+ chat_id: string;
59
+ message_id: number;
60
+ reaction: [];
61
+ };