@openrig/cli 0.6.12 → 0.6.14

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 (494) hide show
  1. package/README.md +69 -14
  2. package/daemon/assets/plugins/openrig-core/.claude-plugin/plugin.json +1 -1
  3. package/daemon/assets/plugins/openrig-core/.codex-plugin/plugin.json +1 -1
  4. package/daemon/assets/plugins/openrig-core/README.md +9 -2
  5. package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +25 -9
  6. package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +7 -4
  7. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +5 -0
  8. package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +11 -3
  9. package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +73 -48
  10. package/daemon/assets/skills/rigs/SKILL.md +8 -4
  11. package/daemon/context-packs/help/manifest.yaml +1 -1
  12. package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
  13. package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +76 -16
  14. package/daemon/context-packs/reference/getting-started.md +135 -28
  15. package/daemon/context-packs/reference/manifest.yaml +1 -1
  16. package/daemon/context-packs/reference/rig-spec.md +5 -5
  17. package/daemon/context-packs/reference/whats-new.md +65 -167
  18. package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
  19. package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
  20. package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
  21. package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
  22. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
  23. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
  24. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
  25. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
  26. package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
  27. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
  28. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
  29. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
  30. package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
  31. package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
  32. package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
  33. package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
  34. package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
  35. package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
  36. package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
  37. package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
  38. package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
  39. package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
  40. package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
  41. package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
  42. package/daemon/context-packs/skills/mission-slice-sop/SKILL.md +5 -0
  43. package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
  44. package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
  45. package/daemon/context-packs/skills/openrig-user/SKILL.md +11 -3
  46. package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
  47. package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
  48. package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
  49. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
  50. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
  51. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
  52. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
  53. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
  54. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
  55. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
  56. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
  57. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
  58. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
  59. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
  60. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
  61. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
  62. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
  63. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
  64. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
  65. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
  66. package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
  67. package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
  68. package/daemon/context-packs/skills/refocusing/scripts/trace-to-root.py +73 -48
  69. package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
  70. package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
  71. package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
  72. package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
  73. package/daemon/context-packs/world-example/manifest.yaml +1 -1
  74. package/daemon/context-packs/world-public/manifest.yaml +1 -1
  75. package/daemon/dist/adapters/claude-code-adapter.d.ts +9 -1
  76. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  77. package/daemon/dist/adapters/claude-code-adapter.js +110 -52
  78. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  79. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  80. package/daemon/dist/adapters/codex-runtime-adapter.js +47 -6
  81. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  82. package/daemon/dist/adapters/pi-resume.d.ts +1 -1
  83. package/daemon/dist/adapters/pi-resume.d.ts.map +1 -1
  84. package/daemon/dist/adapters/pi-resume.js +4 -1
  85. package/daemon/dist/adapters/pi-resume.js.map +1 -1
  86. package/daemon/dist/adapters/pi-runner-protocol.d.ts +9 -0
  87. package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -1
  88. package/daemon/dist/adapters/pi-runner-protocol.js +16 -0
  89. package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -1
  90. package/daemon/dist/adapters/pi-runner.d.ts +5 -2
  91. package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
  92. package/daemon/dist/adapters/pi-runner.js +72 -15
  93. package/daemon/dist/adapters/pi-runner.js.map +1 -1
  94. package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -1
  95. package/daemon/dist/adapters/pi-runtime-adapter.js +2 -0
  96. package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -1
  97. package/daemon/dist/adapters/stub-compaction.d.ts +1 -0
  98. package/daemon/dist/adapters/stub-compaction.d.ts.map +1 -1
  99. package/daemon/dist/adapters/stub-compaction.js +2 -0
  100. package/daemon/dist/adapters/stub-compaction.js.map +1 -1
  101. package/daemon/dist/adapters/stub-refocus.d.ts +6 -0
  102. package/daemon/dist/adapters/stub-refocus.d.ts.map +1 -0
  103. package/daemon/dist/adapters/stub-refocus.js +22 -0
  104. package/daemon/dist/adapters/stub-refocus.js.map +1 -0
  105. package/daemon/dist/adapters/stub-runner.d.ts +6 -0
  106. package/daemon/dist/adapters/stub-runner.d.ts.map +1 -1
  107. package/daemon/dist/adapters/stub-runner.js +18 -1
  108. package/daemon/dist/adapters/stub-runner.js.map +1 -1
  109. package/daemon/dist/adapters/stub-script.d.ts +2 -2
  110. package/daemon/dist/adapters/stub-script.d.ts.map +1 -1
  111. package/daemon/dist/adapters/stub-script.js +2 -2
  112. package/daemon/dist/adapters/stub-script.js.map +1 -1
  113. package/daemon/dist/adapters/tmux.js +1 -1
  114. package/daemon/dist/adapters/tmux.js.map +1 -1
  115. package/daemon/dist/build-info.js +3 -3
  116. package/daemon/dist/db/all-migrations.d.ts.map +1 -1
  117. package/daemon/dist/db/all-migrations.js +2 -0
  118. package/daemon/dist/db/all-migrations.js.map +1 -1
  119. package/daemon/dist/db/migrations/117_provider_account_readings.d.ts +3 -0
  120. package/daemon/dist/db/migrations/117_provider_account_readings.d.ts.map +1 -0
  121. package/daemon/dist/db/migrations/117_provider_account_readings.js +32 -0
  122. package/daemon/dist/db/migrations/117_provider_account_readings.js.map +1 -0
  123. package/daemon/dist/domain/claim-service.d.ts +9 -18
  124. package/daemon/dist/domain/claim-service.d.ts.map +1 -1
  125. package/daemon/dist/domain/claim-service.js +83 -0
  126. package/daemon/dist/domain/claim-service.js.map +1 -1
  127. package/daemon/dist/domain/claude-activity-hooks.d.ts +6 -0
  128. package/daemon/dist/domain/claude-activity-hooks.d.ts.map +1 -1
  129. package/daemon/dist/domain/claude-activity-hooks.js +19 -1
  130. package/daemon/dist/domain/claude-activity-hooks.js.map +1 -1
  131. package/daemon/dist/domain/claude-compaction-enforcer.d.ts +2 -2
  132. package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
  133. package/daemon/dist/domain/claude-compaction-enforcer.js +20 -14
  134. package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
  135. package/daemon/dist/domain/claude-core-plugin-env.d.ts +2 -0
  136. package/daemon/dist/domain/claude-core-plugin-env.d.ts.map +1 -1
  137. package/daemon/dist/domain/claude-core-plugin-env.js +6 -2
  138. package/daemon/dist/domain/claude-core-plugin-env.js.map +1 -1
  139. package/daemon/dist/domain/claude-managed-launch.d.ts +5 -0
  140. package/daemon/dist/domain/claude-managed-launch.d.ts.map +1 -1
  141. package/daemon/dist/domain/claude-managed-launch.js +48 -7
  142. package/daemon/dist/domain/claude-managed-launch.js.map +1 -1
  143. package/daemon/dist/domain/claude-mcp-menu.d.ts +5 -0
  144. package/daemon/dist/domain/claude-mcp-menu.d.ts.map +1 -0
  145. package/daemon/dist/domain/claude-mcp-menu.js +25 -0
  146. package/daemon/dist/domain/claude-mcp-menu.js.map +1 -0
  147. package/daemon/dist/domain/fresh-occupant-relation.d.ts +7 -0
  148. package/daemon/dist/domain/fresh-occupant-relation.d.ts.map +1 -1
  149. package/daemon/dist/domain/fresh-occupant-relation.js +45 -0
  150. package/daemon/dist/domain/fresh-occupant-relation.js.map +1 -1
  151. package/daemon/dist/domain/gateway/slack/channel-recovery.d.ts +14 -2
  152. package/daemon/dist/domain/gateway/slack/channel-recovery.d.ts.map +1 -1
  153. package/daemon/dist/domain/gateway/slack/channel-recovery.js +128 -89
  154. package/daemon/dist/domain/gateway/slack/channel-recovery.js.map +1 -1
  155. package/daemon/dist/domain/gateway/slack/inbound.d.ts +4 -0
  156. package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
  157. package/daemon/dist/domain/gateway/slack/inbound.js +5 -3
  158. package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
  159. package/daemon/dist/domain/gateway/slack/recovery-budget.d.ts +24 -0
  160. package/daemon/dist/domain/gateway/slack/recovery-budget.d.ts.map +1 -0
  161. package/daemon/dist/domain/gateway/slack/recovery-budget.js +18 -0
  162. package/daemon/dist/domain/gateway/slack/recovery-budget.js.map +1 -0
  163. package/daemon/dist/domain/gateway/slack/slack-recovery.d.ts +104 -0
  164. package/daemon/dist/domain/gateway/slack/slack-recovery.d.ts.map +1 -0
  165. package/daemon/dist/domain/gateway/slack/slack-recovery.js +236 -0
  166. package/daemon/dist/domain/gateway/slack/slack-recovery.js.map +1 -0
  167. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  168. package/daemon/dist/domain/gateway/slack/slack-subsystem.js +29 -6
  169. package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  170. package/daemon/dist/domain/gateway/slack/state-store.d.ts +34 -0
  171. package/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -1
  172. package/daemon/dist/domain/gateway/slack/state-store.js +67 -0
  173. package/daemon/dist/domain/gateway/slack/state-store.js.map +1 -1
  174. package/daemon/dist/domain/gateway/slack/thread-recovery.d.ts +37 -0
  175. package/daemon/dist/domain/gateway/slack/thread-recovery.d.ts.map +1 -0
  176. package/daemon/dist/domain/gateway/slack/thread-recovery.js +173 -0
  177. package/daemon/dist/domain/gateway/slack/thread-recovery.js.map +1 -0
  178. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +8 -0
  179. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -1
  180. package/daemon/dist/domain/gateway/slack/thread-seat-map.js +11 -0
  181. package/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -1
  182. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts +6 -1
  183. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts.map +1 -1
  184. package/daemon/dist/domain/model-divergence/current-generation-record.js +4 -1
  185. package/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -1
  186. package/daemon/dist/domain/model-divergence/current-model-reader.d.ts +74 -0
  187. package/daemon/dist/domain/model-divergence/current-model-reader.d.ts.map +1 -0
  188. package/daemon/dist/domain/model-divergence/current-model-reader.js +246 -0
  189. package/daemon/dist/domain/model-divergence/current-model-reader.js.map +1 -0
  190. package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts +18 -0
  191. package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts.map +1 -1
  192. package/daemon/dist/domain/model-divergence/effective-model-readers.js +24 -8
  193. package/daemon/dist/domain/model-divergence/effective-model-readers.js.map +1 -1
  194. package/daemon/dist/domain/native-process-lineage.d.ts +8 -1
  195. package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
  196. package/daemon/dist/domain/native-process-lineage.js +40 -26
  197. package/daemon/dist/domain/native-process-lineage.js.map +1 -1
  198. package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
  199. package/daemon/dist/domain/native-resume-probe.js +34 -8
  200. package/daemon/dist/domain/native-resume-probe.js.map +1 -1
  201. package/daemon/dist/domain/node-inventory.d.ts +1 -1
  202. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  203. package/daemon/dist/domain/node-inventory.js +84 -18
  204. package/daemon/dist/domain/node-inventory.js.map +1 -1
  205. package/daemon/dist/domain/process-census.d.ts +1 -1
  206. package/daemon/dist/domain/process-census.d.ts.map +1 -1
  207. package/daemon/dist/domain/process-table.d.ts +26 -0
  208. package/daemon/dist/domain/process-table.d.ts.map +1 -0
  209. package/daemon/dist/domain/process-table.js +185 -0
  210. package/daemon/dist/domain/process-table.js.map +1 -0
  211. package/daemon/dist/domain/profile-resolver.d.ts +8 -0
  212. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  213. package/daemon/dist/domain/profile-resolver.js +11 -0
  214. package/daemon/dist/domain/profile-resolver.js.map +1 -1
  215. package/daemon/dist/domain/projection-planner.js +1 -1
  216. package/daemon/dist/domain/projection-planner.js.map +1 -1
  217. package/daemon/dist/domain/provider/claude-usage-windows.d.ts +3 -1
  218. package/daemon/dist/domain/provider/claude-usage-windows.d.ts.map +1 -1
  219. package/daemon/dist/domain/provider/claude-usage-windows.js +48 -3
  220. package/daemon/dist/domain/provider/claude-usage-windows.js.map +1 -1
  221. package/daemon/dist/domain/provider/codex-usage-reader.d.ts +4 -1
  222. package/daemon/dist/domain/provider/codex-usage-reader.d.ts.map +1 -1
  223. package/daemon/dist/domain/provider/codex-usage-reader.js +3 -0
  224. package/daemon/dist/domain/provider/codex-usage-reader.js.map +1 -1
  225. package/daemon/dist/domain/provider/codex-usage-windows.d.ts +3 -1
  226. package/daemon/dist/domain/provider/codex-usage-windows.d.ts.map +1 -1
  227. package/daemon/dist/domain/provider/codex-usage-windows.js +1 -0
  228. package/daemon/dist/domain/provider/codex-usage-windows.js.map +1 -1
  229. package/daemon/dist/domain/provider/provider-account-readings.d.ts +42 -0
  230. package/daemon/dist/domain/provider/provider-account-readings.d.ts.map +1 -0
  231. package/daemon/dist/domain/provider/provider-account-readings.js +132 -0
  232. package/daemon/dist/domain/provider/provider-account-readings.js.map +1 -0
  233. package/daemon/dist/domain/provider/provider-types.d.ts +29 -0
  234. package/daemon/dist/domain/provider/provider-types.d.ts.map +1 -1
  235. package/daemon/dist/domain/provider/usage-across-hosts.d.ts.map +1 -1
  236. package/daemon/dist/domain/provider/usage-across-hosts.js +6 -0
  237. package/daemon/dist/domain/provider/usage-across-hosts.js.map +1 -1
  238. package/daemon/dist/domain/provider/usage-windows.d.ts +25 -0
  239. package/daemon/dist/domain/provider/usage-windows.d.ts.map +1 -1
  240. package/daemon/dist/domain/provider/usage-windows.js +100 -4
  241. package/daemon/dist/domain/provider/usage-windows.js.map +1 -1
  242. package/daemon/dist/domain/queue-repository.d.ts +23 -0
  243. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  244. package/daemon/dist/domain/queue-repository.js +59 -1
  245. package/daemon/dist/domain/queue-repository.js.map +1 -1
  246. package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
  247. package/daemon/dist/domain/queue-stuck-sweep.js +47 -4
  248. package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
  249. package/daemon/dist/domain/restore-check-service.d.ts +10 -0
  250. package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
  251. package/daemon/dist/domain/restore-check-service.js +73 -10
  252. package/daemon/dist/domain/restore-check-service.js.map +1 -1
  253. package/daemon/dist/domain/restore-guidance.d.ts +6 -0
  254. package/daemon/dist/domain/restore-guidance.d.ts.map +1 -1
  255. package/daemon/dist/domain/restore-guidance.js +21 -5
  256. package/daemon/dist/domain/restore-guidance.js.map +1 -1
  257. package/daemon/dist/domain/restore-orchestrator.js +1 -1
  258. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  259. package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
  260. package/daemon/dist/domain/resume-metadata-refresher.js +6 -29
  261. package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
  262. package/daemon/dist/domain/rig-repository.d.ts +3 -0
  263. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  264. package/daemon/dist/domain/rig-repository.js +6 -0
  265. package/daemon/dist/domain/rig-repository.js.map +1 -1
  266. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  267. package/daemon/dist/domain/rigspec-instantiator.js +4 -2
  268. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  269. package/daemon/dist/domain/rigspec-preflight.d.ts +4 -0
  270. package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
  271. package/daemon/dist/domain/rigspec-preflight.js +12 -2
  272. package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
  273. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  274. package/daemon/dist/domain/rigspec-schema.js +11 -0
  275. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  276. package/daemon/dist/domain/runtime-adapter.d.ts +13 -0
  277. package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
  278. package/daemon/dist/domain/runtime-adapter.js.map +1 -1
  279. package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
  280. package/daemon/dist/domain/seat-attention-reconciler.js +15 -1
  281. package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
  282. package/daemon/dist/domain/seat-cwd-preparation.d.ts +22 -0
  283. package/daemon/dist/domain/seat-cwd-preparation.d.ts.map +1 -0
  284. package/daemon/dist/domain/seat-cwd-preparation.js +107 -0
  285. package/daemon/dist/domain/seat-cwd-preparation.js.map +1 -0
  286. package/daemon/dist/domain/seat-effort.d.ts +4 -3
  287. package/daemon/dist/domain/seat-effort.d.ts.map +1 -1
  288. package/daemon/dist/domain/seat-effort.js +21 -3
  289. package/daemon/dist/domain/seat-effort.js.map +1 -1
  290. package/daemon/dist/domain/seat-lifecycle-service.d.ts +36 -2
  291. package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
  292. package/daemon/dist/domain/seat-lifecycle-service.js +206 -15
  293. package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
  294. package/daemon/dist/domain/seat-restart-in-place.d.ts +14 -0
  295. package/daemon/dist/domain/seat-restart-in-place.d.ts.map +1 -1
  296. package/daemon/dist/domain/seat-restart-in-place.js +59 -3
  297. package/daemon/dist/domain/seat-restart-in-place.js.map +1 -1
  298. package/daemon/dist/domain/seat-status-service.d.ts +2 -0
  299. package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
  300. package/daemon/dist/domain/seat-status-service.js +1 -0
  301. package/daemon/dist/domain/seat-status-service.js.map +1 -1
  302. package/daemon/dist/domain/seat-structural-activity-service.d.ts +7 -1
  303. package/daemon/dist/domain/seat-structural-activity-service.d.ts.map +1 -1
  304. package/daemon/dist/domain/seat-structural-activity-service.js +9 -3
  305. package/daemon/dist/domain/seat-structural-activity-service.js.map +1 -1
  306. package/daemon/dist/domain/session-name.d.ts +8 -0
  307. package/daemon/dist/domain/session-name.d.ts.map +1 -1
  308. package/daemon/dist/domain/session-name.js +12 -0
  309. package/daemon/dist/domain/session-name.js.map +1 -1
  310. package/daemon/dist/domain/session-transport.d.ts +78 -3
  311. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  312. package/daemon/dist/domain/session-transport.js +306 -15
  313. package/daemon/dist/domain/session-transport.js.map +1 -1
  314. package/daemon/dist/domain/successor-session-launcher.js +1 -1
  315. package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  316. package/daemon/dist/domain/topology-converge.d.ts +1 -0
  317. package/daemon/dist/domain/topology-converge.d.ts.map +1 -1
  318. package/daemon/dist/domain/topology-converge.js +1 -0
  319. package/daemon/dist/domain/topology-converge.js.map +1 -1
  320. package/daemon/dist/domain/types.d.ts +14 -0
  321. package/daemon/dist/domain/types.d.ts.map +1 -1
  322. package/daemon/dist/domain/types.js.map +1 -1
  323. package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  324. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  325. package/daemon/dist/domain/user-settings/settings-store.js +4 -0
  326. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  327. package/daemon/dist/domain/wake-resolve-service.d.ts +1 -0
  328. package/daemon/dist/domain/wake-resolve-service.d.ts.map +1 -1
  329. package/daemon/dist/domain/wake-resolve-service.js +10 -0
  330. package/daemon/dist/domain/wake-resolve-service.js.map +1 -1
  331. package/daemon/dist/domain/wake-resolver.d.ts.map +1 -1
  332. package/daemon/dist/domain/wake-resolver.js +7 -0
  333. package/daemon/dist/domain/wake-resolver.js.map +1 -1
  334. package/daemon/dist/domain/watchdog-delivery.d.ts +29 -0
  335. package/daemon/dist/domain/watchdog-delivery.d.ts.map +1 -0
  336. package/daemon/dist/domain/watchdog-delivery.js +113 -0
  337. package/daemon/dist/domain/watchdog-delivery.js.map +1 -0
  338. package/daemon/dist/domain/watchdog-policy-engine.d.ts +60 -1
  339. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  340. package/daemon/dist/domain/watchdog-policy-engine.js +154 -28
  341. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  342. package/daemon/dist/domain/watchdog-scheduler.d.ts.map +1 -1
  343. package/daemon/dist/domain/watchdog-scheduler.js +6 -1
  344. package/daemon/dist/domain/watchdog-scheduler.js.map +1 -1
  345. package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -1
  346. package/daemon/dist/domain/workflow-instance-store.js +6 -2
  347. package/daemon/dist/domain/workflow-instance-store.js.map +1 -1
  348. package/daemon/dist/routes/attention.d.ts.map +1 -1
  349. package/daemon/dist/routes/attention.js +41 -1
  350. package/daemon/dist/routes/attention.js.map +1 -1
  351. package/daemon/dist/routes/compaction.js +1 -1
  352. package/daemon/dist/routes/compaction.js.map +1 -1
  353. package/daemon/dist/routes/queue.d.ts.map +1 -1
  354. package/daemon/dist/routes/queue.js +3 -1
  355. package/daemon/dist/routes/queue.js.map +1 -1
  356. package/daemon/dist/routes/restore-check.d.ts.map +1 -1
  357. package/daemon/dist/routes/restore-check.js +19 -1
  358. package/daemon/dist/routes/restore-check.js.map +1 -1
  359. package/daemon/dist/routes/seat.d.ts.map +1 -1
  360. package/daemon/dist/routes/seat.js +15 -2
  361. package/daemon/dist/routes/seat.js.map +1 -1
  362. package/daemon/dist/routes/sessions.d.ts.map +1 -1
  363. package/daemon/dist/routes/sessions.js +42 -1
  364. package/daemon/dist/routes/sessions.js.map +1 -1
  365. package/daemon/dist/routes/transport.d.ts.map +1 -1
  366. package/daemon/dist/routes/transport.js +13 -2
  367. package/daemon/dist/routes/transport.js.map +1 -1
  368. package/daemon/dist/server.d.ts +1 -0
  369. package/daemon/dist/server.d.ts.map +1 -1
  370. package/daemon/dist/server.js +7 -4
  371. package/daemon/dist/server.js.map +1 -1
  372. package/daemon/dist/startup.d.ts.map +1 -1
  373. package/daemon/dist/startup.js +41 -118
  374. package/daemon/dist/startup.js.map +1 -1
  375. package/daemon/docs/reference/agent-spec.md +1 -1
  376. package/daemon/docs/reference/agent-startup-guide.md +84 -0
  377. package/daemon/docs/reference/getting-started.md +135 -28
  378. package/daemon/docs/reference/publishing-a-rig-bundle.md +5 -2
  379. package/daemon/docs/reference/quickstart.md +187 -0
  380. package/daemon/docs/reference/refocus-channel.md +11 -1
  381. package/daemon/docs/reference/rig-spec.md +5 -5
  382. package/daemon/docs/reference/rosters.md +29 -2
  383. package/daemon/docs/reference/slack-app-setup.md +47 -17
  384. package/daemon/docs/reference/whats-new.md +65 -167
  385. package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -0
  386. package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -0
  387. package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -0
  388. package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -0
  389. package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -0
  390. package/daemon/specs/agents/design/product-designer/agent.yaml +1 -0
  391. package/daemon/specs/agents/development/implementer/agent.yaml +1 -0
  392. package/daemon/specs/agents/development/qa/agent.yaml +1 -0
  393. package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +1 -0
  394. package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +1 -0
  395. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -0
  396. package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
  397. package/daemon/specs/agents/research/analyst/agent.yaml +1 -0
  398. package/daemon/specs/agents/research/synthesizer/agent.yaml +1 -0
  399. package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -0
  400. package/dist/build-info.js +3 -3
  401. package/dist/client.d.ts +7 -1
  402. package/dist/client.d.ts.map +1 -1
  403. package/dist/client.js +28 -0
  404. package/dist/client.js.map +1 -1
  405. package/dist/commands/ask.d.ts.map +1 -1
  406. package/dist/commands/ask.js +13 -3
  407. package/dist/commands/ask.js.map +1 -1
  408. package/dist/commands/capture.d.ts.map +1 -1
  409. package/dist/commands/capture.js +14 -0
  410. package/dist/commands/capture.js.map +1 -1
  411. package/dist/commands/chatroom.d.ts.map +1 -1
  412. package/dist/commands/chatroom.js +1 -0
  413. package/dist/commands/chatroom.js.map +1 -1
  414. package/dist/commands/compact.d.ts.map +1 -1
  415. package/dist/commands/compact.js +5 -4
  416. package/dist/commands/compact.js.map +1 -1
  417. package/dist/commands/config.d.ts.map +1 -1
  418. package/dist/commands/config.js +4 -2
  419. package/dist/commands/config.js.map +1 -1
  420. package/dist/commands/doctor.d.ts +3 -0
  421. package/dist/commands/doctor.d.ts.map +1 -1
  422. package/dist/commands/doctor.js +47 -23
  423. package/dist/commands/doctor.js.map +1 -1
  424. package/dist/commands/grow.d.ts.map +1 -1
  425. package/dist/commands/grow.js +24 -7
  426. package/dist/commands/grow.js.map +1 -1
  427. package/dist/commands/provider.d.ts.map +1 -1
  428. package/dist/commands/provider.js +43 -7
  429. package/dist/commands/provider.js.map +1 -1
  430. package/dist/commands/ps.d.ts +2 -0
  431. package/dist/commands/ps.d.ts.map +1 -1
  432. package/dist/commands/ps.js +12 -1
  433. package/dist/commands/ps.js.map +1 -1
  434. package/dist/commands/reconcile-session.d.ts.map +1 -1
  435. package/dist/commands/reconcile-session.js +25 -4
  436. package/dist/commands/reconcile-session.js.map +1 -1
  437. package/dist/commands/remove.d.ts.map +1 -1
  438. package/dist/commands/remove.js +20 -1
  439. package/dist/commands/remove.js.map +1 -1
  440. package/dist/commands/roster.d.ts +2 -1
  441. package/dist/commands/roster.d.ts.map +1 -1
  442. package/dist/commands/roster.js +10 -5
  443. package/dist/commands/roster.js.map +1 -1
  444. package/dist/commands/scope.js +1 -1
  445. package/dist/commands/scope.js.map +1 -1
  446. package/dist/commands/seat.d.ts.map +1 -1
  447. package/dist/commands/seat.js +75 -8
  448. package/dist/commands/seat.js.map +1 -1
  449. package/dist/commands/slack.d.ts.map +1 -1
  450. package/dist/commands/slack.js +14 -1
  451. package/dist/commands/slack.js.map +1 -1
  452. package/dist/commands/ui.d.ts.map +1 -1
  453. package/dist/commands/ui.js +8 -1
  454. package/dist/commands/ui.js.map +1 -1
  455. package/dist/commands/usage.d.ts.map +1 -1
  456. package/dist/commands/usage.js +4 -3
  457. package/dist/commands/usage.js.map +1 -1
  458. package/dist/config-store.d.ts +2 -1
  459. package/dist/config-store.d.ts.map +1 -1
  460. package/dist/config-store.js +5 -0
  461. package/dist/config-store.js.map +1 -1
  462. package/dist/daemon-lifecycle.d.ts.map +1 -1
  463. package/dist/daemon-lifecycle.js +11 -3
  464. package/dist/daemon-lifecycle.js.map +1 -1
  465. package/dist/front-door.d.ts.map +1 -1
  466. package/dist/front-door.js +3 -1
  467. package/dist/front-door.js.map +1 -1
  468. package/dist/lib/model-observation.d.ts +13 -0
  469. package/dist/lib/model-observation.d.ts.map +1 -0
  470. package/dist/lib/model-observation.js +25 -0
  471. package/dist/lib/model-observation.js.map +1 -0
  472. package/dist/local-daemon-owner.d.ts +28 -0
  473. package/dist/local-daemon-owner.d.ts.map +1 -0
  474. package/dist/local-daemon-owner.js +98 -0
  475. package/dist/local-daemon-owner.js.map +1 -0
  476. package/dist/mcp-server.d.ts.map +1 -1
  477. package/dist/mcp-server.js +1 -0
  478. package/dist/mcp-server.js.map +1 -1
  479. package/package.json +1 -1
  480. package/tui/dist/attention/attention-model.js +6 -5
  481. package/tui/dist/attention/attention-model.js.map +1 -1
  482. package/tui/dist/attention/source-continuity.d.ts.map +1 -1
  483. package/tui/dist/attention/source-continuity.js +2 -0
  484. package/tui/dist/attention/source-continuity.js.map +1 -1
  485. package/tui/dist/terminals/open-window.d.ts +11 -1
  486. package/tui/dist/terminals/open-window.d.ts.map +1 -1
  487. package/tui/dist/terminals/open-window.js +47 -2
  488. package/tui/dist/terminals/open-window.js.map +1 -1
  489. package/tui/dist/usage/usage-model.d.ts +2 -0
  490. package/tui/dist/usage/usage-model.d.ts.map +1 -1
  491. package/tui/dist/usage/usage-model.js +38 -3
  492. package/tui/dist/usage/usage-model.js.map +1 -1
  493. package/ui/dist/assets/{index-Cfbtfd9G.js → index-CVgod3Pm.js} +1 -1
  494. package/ui/dist/index.html +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-budget.d.ts","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/recovery-budget.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,eAAO,MAAM,OAAO,0BAA0B,CAAC;AAC/C,eAAO,MAAM,OAAO,0BAA0B,CAAC;AAE/C,MAAM,WAAW,cAAc;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAEpF,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAE7D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,sGAAsG;AACtG,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAC7C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;CACvC;AAED,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CAChF"}
@@ -0,0 +1,18 @@
1
+ // One recovery pass's work, shared in turn by every channel and thread it reaches.
2
+ /** The two Slack methods recovery calls; each has its own rate limit. */
3
+ export const HISTORY = "conversations.history";
4
+ export const REPLIES = "conversations.replies";
5
+ /** Four history calls, 100 entries and 15 seconds per pass, however many sources share it. */
6
+ export function newRecoveryBudget(now) {
7
+ return { deadline: now + 15_000, calls: 0, entries: 0 };
8
+ }
9
+ export function budgetLeft(budget, now) {
10
+ return budget.calls < 4 && budget.entries < 100 && now < budget.deadline;
11
+ }
12
+ /** Slack rate-limits each Web API method on its own, so a Retry-After holds back only that method. */
13
+ export class MethodBackoff {
14
+ until = new Map();
15
+ blocked(method, now) { return (this.until.get(method) ?? 0) > now; }
16
+ hold(method, at) { this.until.set(method, Math.max(at, this.until.get(method) ?? 0)); }
17
+ }
18
+ //# sourceMappingURL=recovery-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-budget.js","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/recovery-budget.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAEnF,yEAAyE;AACzE,MAAM,CAAC,MAAM,OAAO,GAAG,uBAAuB,CAAC;AAC/C,MAAM,CAAC,MAAM,OAAO,GAAG,uBAAuB,CAAC;AAI/C,8FAA8F;AAC9F,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,EAAE,QAAQ,EAAE,GAAG,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAsB,EAAE,GAAW;IAC5D,OAAO,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,GAAG,IAAI,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3E,CAAC;AAED,sGAAsG;AACtG,MAAM,OAAO,aAAa;IACP,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACnD,OAAO,CAAC,MAAc,EAAE,GAAW,IAAa,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC7F,IAAI,CAAC,MAAc,EAAE,EAAU,IAAU,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC9G"}
@@ -0,0 +1,104 @@
1
+ import type { FetchImpl } from "./slack-api.js";
2
+ import type { InboundRouter } from "./inbound.js";
3
+ import { ChannelCoverageStore, ThreadCoverageStore } from "./state-store.js";
4
+ /** A thread is tracked while its root was posted, or it closed, within this window. */
5
+ export declare const THREAD_WINDOW_MS: number;
6
+ export interface TrackedThread {
7
+ channel: string;
8
+ threadTs: string;
9
+ state?: string;
10
+ closedAt?: string | null;
11
+ }
12
+ /** The channels this machine recovers: its default channel and its channel map's, except a channel
13
+ * its configuration relays to the machine that owns it (that machine recovers it). */
14
+ export declare function ownedRecoveryChannels(cfg: {
15
+ channel: string | null;
16
+ channelMap?: Array<{
17
+ channel: string;
18
+ }>;
19
+ forwardChannels?: unknown;
20
+ }): string[];
21
+ interface SlackRecoveryOptions {
22
+ /** The machine's default channel first. "adoption" for a channel recovery newly covers. */
23
+ channels: Array<{
24
+ channel: string;
25
+ seed?: "adoption";
26
+ }>;
27
+ token: string | null;
28
+ stateDir: string;
29
+ router: InboundRouter;
30
+ /** Tracked thread roots in these channels posted, or closed, at or after `since` (ISO). */
31
+ trackedThreads?: (channels: string[], since: string) => TrackedThread[];
32
+ fetchImpl?: FetchImpl;
33
+ now?: () => number;
34
+ channelStore?: ChannelCoverageStore;
35
+ threadStore?: ThreadCoverageStore;
36
+ /** This machine has no connection of its own; the hub relays its channels' events. A configured channel is recovered
37
+ * only once the hub has relayed it here (adoptRelayed), from that moment, and across restarts. A machine nothing is
38
+ * relayed to never reads history. */
39
+ relayed?: boolean;
40
+ }
41
+ export declare class SlackRecovery {
42
+ private readonly opts;
43
+ private readonly channels;
44
+ private readonly channelStore;
45
+ private readonly threadStore;
46
+ private threads;
47
+ private readonly backoff;
48
+ private readonly now;
49
+ private pass?;
50
+ private stopped;
51
+ private lastChannel;
52
+ private lastThread;
53
+ private threadsUnavailable;
54
+ private initialized;
55
+ private readonly adoptedHere;
56
+ private readonly threadTotals;
57
+ constructor(opts: SlackRecoveryOptions);
58
+ initialize(): void;
59
+ /** The hub relayed an event for `channel` here, received at `atMs`. A configured channel is adopted the first time, with
60
+ * its coverage starting at that receipt; a channel this machine isn't configured for is never adopted. */
61
+ adoptRelayed(channel: string | undefined, atMs: number): void;
62
+ stop(): void;
63
+ run(): Promise<void>;
64
+ /** On a relayed machine, the configured channels the hub has relayed here (saved, so a restart keeps them). */
65
+ private relayAdopted;
66
+ private activeChannels;
67
+ /** Slack's rate limit holds a method for the whole workspace. Before any source is admitted, restore each method's hold
68
+ * from every saved rate-limit deadline, including one on a thread no longer tracked. A deadline saved without the
69
+ * marker, as an older daemon saved every backoff, may be a rate limit, so it holds the method too. */
70
+ private restoreMethodHolds;
71
+ private scan;
72
+ private trackedThreadSources;
73
+ status(): {
74
+ acceptedThisProcess: number;
75
+ deadLetteredThisProcess: number;
76
+ limits: string[];
77
+ channels: {
78
+ state: string;
79
+ reason: string | undefined;
80
+ channel: string | null;
81
+ lastScanAt: string | undefined;
82
+ coverage: import("./state-store.js").ChannelCoverage | null;
83
+ acceptedThisProcess: number;
84
+ deadLetteredThisProcess: number;
85
+ }[];
86
+ threads: {
87
+ tracked: number;
88
+ scanned: number;
89
+ pending: number;
90
+ oldestPendingSeconds: number | null;
91
+ backoff: Record<string, number>;
92
+ incomplete: Record<string, number>;
93
+ reason?: string | undefined;
94
+ state: string;
95
+ };
96
+ state: string;
97
+ reason: string | undefined;
98
+ channel: string | null;
99
+ lastScanAt: string | undefined;
100
+ coverage: import("./state-store.js").ChannelCoverage | null;
101
+ };
102
+ }
103
+ export {};
104
+ //# sourceMappingURL=slack-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-recovery.d.ts","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/slack-recovery.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAoD,MAAM,kBAAkB,CAAC;AAG/H,uFAAuF;AACvF,eAAO,MAAM,gBAAgB,QAA0B,CAAC;AAExD,MAAM,WAAW,aAAa;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAE9G;uFACuF;AACvF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,EAAE,CASnJ;AAED,UAAU,oBAAoB;IAC5B,2FAA2F;IAC3F,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IACxD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,2FAA2F;IAC3F,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,aAAa,EAAE,CAAC;IACxE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC;;0CAEsC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,qBAAa,aAAa;IAiBZ,OAAO,CAAC,QAAQ,CAAC,IAAI;IAhBjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,IAAI,CAAC,CAAgB;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IAEjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoC;gBAEpC,IAAI,EAAE,oBAAoB;IASvD,UAAU,IAAI,IAAI;IAQlB;+GAC2G;IAC3G,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAW7D,IAAI,IAAI,IAAI;IAKZ,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAUpB,+GAA+G;IAC/G,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,cAAc;IAKtB;;2GAEuG;IACvG,OAAO,CAAC,kBAAkB;YAcZ,IAAI;IAyBlB,OAAO,CAAC,oBAAoB;IA4B5B,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CP"}
@@ -0,0 +1,236 @@
1
+ // Missed-message recovery for the channels this machine owns and the threads it tracks in them.
2
+ // A pass shares one budget, taken alternately by channels and threads (each kind in rotation), so
3
+ // neither kind starves the other.
4
+ import path from "node:path";
5
+ import { ChannelRecovery } from "./channel-recovery.js";
6
+ import { ThreadRecovery, threadKey } from "./thread-recovery.js";
7
+ import { ChannelCoverageStore, ThreadCoverageStore, slackMicros, slackTimestamp } from "./state-store.js";
8
+ import { budgetLeft, HISTORY, MethodBackoff, newRecoveryBudget, REPLIES } from "./recovery-budget.js";
9
+ /** A thread is tracked while its root was posted, or it closed, within this window. */
10
+ export const THREAD_WINDOW_MS = 7 * 24 * 60 * 60 * 1000;
11
+ /** The channels this machine recovers: its default channel and its channel map's, except a channel
12
+ * its configuration relays to the machine that owns it (that machine recovers it). */
13
+ export function ownedRecoveryChannels(cfg) {
14
+ const relayed = new Set(Array.isArray(cfg.forwardChannels)
15
+ ? cfg.forwardChannels.flatMap((f) => (f && typeof f.channel === "string" ? [f.channel] : []))
16
+ : []);
17
+ const out = [];
18
+ for (const channel of [cfg.channel, ...(cfg.channelMap ?? []).map((e) => e.channel)]) {
19
+ if (channel && !relayed.has(channel) && !out.includes(channel))
20
+ out.push(channel);
21
+ }
22
+ return out;
23
+ }
24
+ export class SlackRecovery {
25
+ opts;
26
+ channels;
27
+ channelStore;
28
+ threadStore;
29
+ threads = new Map();
30
+ backoff = new MethodBackoff();
31
+ now;
32
+ pass;
33
+ stopped = false;
34
+ lastChannel;
35
+ lastThread;
36
+ threadsUnavailable;
37
+ initialized = false;
38
+ adoptedHere = new Set();
39
+ // Thread recoveries since the connector started, kept when a thread leaves the window.
40
+ threadTotals = { accepted: 0, deadLettered: 0 };
41
+ constructor(opts) {
42
+ this.opts = opts;
43
+ this.now = opts.now ?? Date.now;
44
+ this.channelStore = opts.channelStore ?? new ChannelCoverageStore(path.join(opts.stateDir, "slack-channel-coverage.json"));
45
+ const channels = opts.channels.length ? opts.channels : [{ channel: null }];
46
+ this.channels = channels.map((c) => new ChannelRecovery({ channel: c.channel, token: opts.token, stateDir: opts.stateDir,
47
+ router: opts.router, fetchImpl: opts.fetchImpl, store: this.channelStore, now: this.now, ...(c.seed ? { seed: c.seed } : {}) }));
48
+ this.threadStore = opts.threadStore ?? new ThreadCoverageStore(path.join(opts.stateDir, "slack-thread-coverage.json"));
49
+ }
50
+ initialize() {
51
+ this.initialized = true;
52
+ for (const channel of this.activeChannels()) {
53
+ channel.initialize();
54
+ if (channel.channel)
55
+ this.adoptedHere.add(channel.channel);
56
+ }
57
+ }
58
+ /** The hub relayed an event for `channel` here, received at `atMs`. A configured channel is adopted the first time, with
59
+ * its coverage starting at that receipt; a channel this machine isn't configured for is never adopted. */
60
+ adoptRelayed(channel, atMs) {
61
+ if (!this.opts.relayed || !channel || this.stopped || this.adoptedHere.has(channel))
62
+ return;
63
+ const source = this.channels.find((c) => c.channel === channel);
64
+ if (!source)
65
+ return;
66
+ try {
67
+ this.channelStore.adoptRelayed(channel, slackTimestamp(BigInt(atMs) * 1000n));
68
+ source.initialize();
69
+ this.adoptedHere.add(channel);
70
+ }
71
+ catch { /* an unreadable checkpoint file is never replaced; the channel keeps waiting */ }
72
+ }
73
+ stop() {
74
+ this.stopped = true;
75
+ for (const channel of this.channels)
76
+ channel.stop();
77
+ }
78
+ run() {
79
+ if (this.pass)
80
+ return this.pass;
81
+ if (this.stopped || !this.opts.token)
82
+ return Promise.resolve();
83
+ if (!this.initialized)
84
+ this.initialize();
85
+ const pass = this.scan();
86
+ this.pass = pass;
87
+ void pass.finally(() => { if (this.pass === pass)
88
+ this.pass = undefined; });
89
+ return pass;
90
+ }
91
+ /** On a relayed machine, the configured channels the hub has relayed here (saved, so a restart keeps them). */
92
+ relayAdopted() {
93
+ if (!this.opts.relayed)
94
+ return null;
95
+ try {
96
+ return new Set(Object.entries(this.channelStore.all()).flatMap(([channel, c]) => (c.relayAdoptedAt ? [channel] : [])));
97
+ }
98
+ catch {
99
+ return new Set();
100
+ }
101
+ }
102
+ activeChannels() {
103
+ const adopted = this.relayAdopted();
104
+ return adopted ? this.channels.filter((c) => c.channel !== null && adopted.has(c.channel)) : this.channels;
105
+ }
106
+ /** Slack's rate limit holds a method for the whole workspace. Before any source is admitted, restore each method's hold
107
+ * from every saved rate-limit deadline, including one on a thread no longer tracked. A deadline saved without the
108
+ * marker, as an older daemon saved every backoff, may be a rate limit, so it holds the method too. */
109
+ restoreMethodHolds() {
110
+ const now = this.now();
111
+ try {
112
+ for (const c of Object.values(this.channelStore.all())) {
113
+ if (c.rateLimited !== false && c.nextRetryAt && c.nextRetryAt > now)
114
+ this.backoff.hold(HISTORY, c.nextRetryAt);
115
+ }
116
+ }
117
+ catch { /* an unreadable channel file leaves its channels unavailable */ }
118
+ try {
119
+ for (const t of Object.values(this.threadStore.read())) {
120
+ if (t.rateLimited !== false && t.nextRetryAt && t.nextRetryAt > now)
121
+ this.backoff.hold(REPLIES, t.nextRetryAt);
122
+ }
123
+ }
124
+ catch { /* reported when threads are listed */ }
125
+ }
126
+ async scan() {
127
+ this.restoreMethodHolds();
128
+ // Channels and threads take turns one step at a time, each kind in its own rotation. A source with
129
+ // more to scan rejoins the back of its kind's queue; a kind with nothing left gives its turns away.
130
+ const queues = [rotate(this.activeChannels(), this.lastChannel), rotate(this.trackedThreadSources(), this.lastThread)];
131
+ const budget = newRecoveryBudget(this.now());
132
+ let kind = 0;
133
+ while (!this.stopped && budgetLeft(budget, this.now()) && (queues[0].length || queues[1].length)) {
134
+ if (!queues[kind].length)
135
+ kind = 1 - kind;
136
+ const source = queues[kind].shift();
137
+ if (source instanceof ThreadRecovery) {
138
+ this.lastThread = source.key;
139
+ const before = { accepted: source.accepted, deadLettered: source.deadLettered };
140
+ const more = await source.step(budget, this.backoff);
141
+ this.threadTotals.accepted += source.accepted - before.accepted;
142
+ this.threadTotals.deadLettered += source.deadLettered - before.deadLettered;
143
+ if (more === "more")
144
+ queues[kind].push(source);
145
+ }
146
+ else {
147
+ this.lastChannel = source.key;
148
+ if (await source.step(budget, this.backoff) === "more")
149
+ queues[kind].push(source);
150
+ }
151
+ kind = 1 - kind;
152
+ }
153
+ }
154
+ trackedThreadSources() {
155
+ if (!this.opts.trackedThreads || !this.opts.token)
156
+ return [];
157
+ let stored;
158
+ try {
159
+ stored = this.threadStore.read();
160
+ this.threadsUnavailable = undefined;
161
+ }
162
+ catch {
163
+ // Never replace an unreadable checkpoint file with fresh floors.
164
+ this.threadsUnavailable = "checkpoint-unreadable-or-unwritable";
165
+ return [];
166
+ }
167
+ const owned = this.activeChannels().flatMap((c) => (c.channel ? [c.channel] : []));
168
+ const since = new Date(this.now() - THREAD_WINDOW_MS).toISOString();
169
+ const next = new Map();
170
+ for (const t of this.opts.trackedThreads(owned, since)) {
171
+ if (!owned.includes(t.channel) || slackMicros(t.threadTs) === null)
172
+ continue;
173
+ const key = threadKey(t.channel, t.threadTs);
174
+ const mapping = `${t.state ?? ""}|${t.closedAt ?? ""}`;
175
+ const prior = this.threads.get(key);
176
+ // A changed mapping gets a fresh source (so a thread Slack couldn't find is asked again); saved coverage carries over.
177
+ next.set(key, prior && prior.mapping === mapping ? prior : { mapping, source: new ThreadRecovery({ channel: t.channel,
178
+ threadTs: t.threadTs, token: this.opts.token, store: this.threadStore, stored: stored[key], router: this.opts.router,
179
+ fetchImpl: this.opts.fetchImpl, now: this.now, stopped: () => this.stopped }) });
180
+ }
181
+ this.threads = next;
182
+ return [...next.values()].map((t) => t.source).sort((a, b) => (a.key < b.key ? -1 : 1));
183
+ }
184
+ status() {
185
+ const adopted = this.relayAdopted();
186
+ const channels = this.channels.map((c) => {
187
+ const s = c.status();
188
+ return adopted && c.channel && !adopted.has(c.channel) ? { ...s, state: "waiting", reason: "no-relayed-event-yet" } : s;
189
+ });
190
+ const [primary, ...others] = channels;
191
+ const threads = [...this.threads.values()].map((t) => t.source);
192
+ const count = (state) => threads.filter((t) => t.state === state).length;
193
+ const byReason = (states) => threads.reduce((acc, t) => {
194
+ if (states.includes(t.state))
195
+ acc[t.reason ?? "unknown"] = (acc[t.reason ?? "unknown"] ?? 0) + 1;
196
+ return acc;
197
+ }, {});
198
+ const now = this.now();
199
+ const behind = (t) => Math.max(0, Math.floor(now / 1000 - Number(slackMicros(t.coveredThrough) / 1000000n)));
200
+ const pending = threads.filter((t) => t.state === "pending");
201
+ const sum = (values) => values.reduce((n, v) => n + v, 0);
202
+ return {
203
+ ...primary,
204
+ // Every channel and thread recovered since the connector started, the default channel's included.
205
+ acceptedThisProcess: sum(channels.map((c) => c.acceptedThisProcess)) + this.threadTotals.accepted,
206
+ deadLetteredThisProcess: sum(channels.map((c) => c.deadLetteredThisProcess)) + this.threadTotals.deadLettered,
207
+ limits: [
208
+ "older history unknown",
209
+ "counts reset on connector rewire/restart",
210
+ "history of the channels this machine owns, including broadcast replies, and replies in tracked threads whose root was posted or which closed within seven days",
211
+ "missed replies in older open threads aren't recovered; live delivery is unchanged",
212
+ "a recovered thread reply, or a broadcast reply recovered in a newly covered channel, lands as a late reply row and never answers a decision",
213
+ ...(channels.some((c) => c.coverage?.historyLimited) ? ["Slack plan limit excludes older history; only available messages were scanned"] : []),
214
+ "coverage means scanned available history; dead letters are custody, not delivery",
215
+ "five-second settle margin; larger clock skew or history visibility lag remains unverified",
216
+ "four calls / 100 entries / 15 seconds per pass, taken in turn by channels and threads; no global chronological ordering",
217
+ ],
218
+ channels: others.map(({ limits: _limits, ...rest }) => rest),
219
+ threads: {
220
+ state: !this.opts.trackedThreads ? "not-configured" : this.threadsUnavailable ? "unavailable" : "available",
221
+ ...(this.threadsUnavailable ? { reason: this.threadsUnavailable } : {}),
222
+ tracked: threads.length,
223
+ scanned: count("scanned"),
224
+ pending: pending.length,
225
+ oldestPendingSeconds: pending.length ? Math.max(...pending.map(behind)) : null,
226
+ backoff: byReason(["backoff"]),
227
+ incomplete: byReason(["incomplete"]),
228
+ },
229
+ };
230
+ }
231
+ }
232
+ function rotate(sources, last) {
233
+ const start = last === undefined ? 0 : sources.findIndex((s) => s.key === last) + 1;
234
+ return [...sources.slice(start), ...sources.slice(0, start)];
235
+ }
236
+ //# sourceMappingURL=slack-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-recovery.js","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/slack-recovery.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"slack-subsystem.d.ts","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/slack-subsystem.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAsB,KAAK,WAAW,EAA2B,MAAM,yBAAyB,CAAC;AAUxG,OAAO,EAAsH,KAAK,eAAe,EAA0E,MAAM,cAAc,CAAC;AAChP,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAOzF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAgD,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAEhG,OAAO,EAAmC,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGlG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAoBhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,eAAe,CAAC;IAC3B,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,2FAA2F;IAC3F,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,sBAAsB,CAAC;IAChD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,UAAU,GAAG,kBAAkB,GAAG,gBAAgB,CAAC,CAAC;CACzJ;AAED,UAAU,oBAAoB;IAC5B,GAAG,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5G;AAED;;yEAEyE;AACzE,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,eAAe,EAC1B,QAAQ,EAAE,oBAAoB,GAAG,SAAS,GACzC,WAAW,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAqBjD;AAED;;;;;;;;;;;;GAYG;AACH;;;kCAGkC;AAClC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACnD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,eAAe,CA4ClB;AA+BD;wEACwE;AACxE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,WAAW,CA+qBtE"}
1
+ {"version":3,"file":"slack-subsystem.d.ts","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/slack-subsystem.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAsB,KAAK,WAAW,EAA2B,MAAM,yBAAyB,CAAC;AAUxG,OAAO,EAAsH,KAAK,eAAe,EAA0E,MAAM,cAAc,CAAC;AAChP,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAOzF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAgD,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAEhG,OAAO,EAAmC,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGlG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAoBhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,eAAe,CAAC;IAC3B,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,2FAA2F;IAC3F,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,sBAAsB,CAAC;IAChD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,UAAU,GAAG,kBAAkB,GAAG,gBAAgB,CAAC,CAAC;CACzJ;AAED,UAAU,oBAAoB;IAC5B,GAAG,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5G;AAED;;yEAEyE;AACzE,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,eAAe,EAC1B,QAAQ,EAAE,oBAAoB,GAAG,SAAS,GACzC,WAAW,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAqBjD;AAED;;;;;;;;;;;;GAYG;AACH;;;kCAGkC;AAClC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACnD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,eAAe,CA4ClB;AA+BD;wEACwE;AACxE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,WAAW,CAqsBtE"}
@@ -11,7 +11,7 @@
11
11
  // (slack-outbound-seen.jsonl, slack-inbound-seen.jsonl, slack-inbound-deadletter.jsonl), so
12
12
  // the relay's history IS the subsystem's history — enabling the subsystem replays nothing the
13
13
  // relay already delivered (the enable-time backlog rule survives the cutover by construction).
14
- import { ChannelRecovery } from "./channel-recovery.js";
14
+ import { SlackRecovery, ownedRecoveryChannels } from "./slack-recovery.js";
15
15
  import { channelStateDigest } from "../channel-operations.js";
16
16
  import path from "node:path";
17
17
  import { createHash } from "node:crypto";
@@ -33,7 +33,7 @@ import { makeThreadRouteResolver } from "./thread-routing.js";
33
33
  import { resolveInboundChannelDestination, resolveOutboundChannel, unsupportedChannelMapFields } from "./channel-map.js";
34
34
  import { resolveRigRepresentative } from "../../queue-owner.js";
35
35
  import { getSelfHostId } from "../../hosts/fanout-contract.js";
36
- import { forwardChannelProblems, makeEnvelopeForwarder } from "./forwarding.js";
36
+ import { envelopeChannel, forwardChannelProblems, makeEnvelopeForwarder } from "./forwarding.js";
37
37
  import { startSocketInbound } from "./socket-inbound.js";
38
38
  import { loadHumanRegistry, resolveSlackHandle } from "../human-registry.js";
39
39
  import { hasLiveHumanGate, isBlockerLive } from "../../queue-repository.js";
@@ -676,6 +676,17 @@ export function buildSlackGatewayWire(opts) {
676
676
  const starts = [];
677
677
  let inboundHandle;
678
678
  let recovery;
679
+ // Recovery covers the channels this machine owns and the threads tracked in them. The configured
680
+ // default channel keeps its established seed; a channel newly recovered starts at adoption.
681
+ const buildRecovery = (router, seedDefault, relayed = false) => new SlackRecovery({
682
+ channels: ownedRecoveryChannels(cfg).map((channel) => (seedDefault && channel === cfg.channel ? { channel } : { channel, seed: "adoption" })),
683
+ token: bot,
684
+ stateDir: stateDir(opts.home),
685
+ router,
686
+ trackedThreads: (channels, closedSince) => threadMap.trackedForRecovery(channels, closedSince),
687
+ fetchImpl: opts.fetchImpl,
688
+ ...(relayed ? { relayed: true } : {}),
689
+ });
679
690
  if (outboundReady) {
680
691
  const driver = new SlackOutboundDriver({
681
692
  home: opts.home,
@@ -801,25 +812,37 @@ export function buildSlackGatewayWire(opts) {
801
812
  log(`slack bot inbox OFF: ${!bot ? "SLACK_BOT_TOKEN unresolved (bots.info needs it)" : botInboxProblems(cfg).join("; ")}`);
802
813
  }
803
814
  // An envelope the hub relayed is handled here and never relayed again.
804
- acceptForwarded = (env) => { relayedReceived++; return handleEnvelope(env, () => { }, built, log, undefined, { relayed: true }); };
815
+ acceptForwarded = (env) => {
816
+ relayedReceived++;
817
+ // A relayed event adopts its channel for recovery, from this local receipt time (only a channel configured here).
818
+ if (!inboundReady)
819
+ recovery?.adoptRelayed(envelopeChannel(env), Date.now());
820
+ return handleEnvelope(env, () => { }, built, log, undefined, { relayed: true });
821
+ };
805
822
  if (!inboundReady) {
806
823
  // No socket here, so no socket-driven retry: drain this machine's own retained events on the
807
- // same five-minute cadence the socket uses, once services start.
824
+ // same five-minute cadence the socket uses, once services start. The hub relays this machine's
825
+ // channels' live events; each configured channel the hub has relayed here is also recovered,
826
+ // from its first relayed event, so this machine, which owns it, gets what nobody received.
827
+ const relayedRecovery = (recovery = buildRecovery(built, false, true));
828
+ const recover = () => { void relayedRecovery.run().catch(() => log("channel recovery failed; checkpoint retained")); };
808
829
  let retryTimer;
809
830
  starts.push(() => {
831
+ relayedRecovery.initialize(); // channels adopted before a restart resume from their saved coverage
810
832
  retryTimer = setInterval(() => {
833
+ recover();
811
834
  void built.retryDeadLetters().catch((e) => log(`slack dead-letter retry failed: ${e.message}`));
812
835
  }, opts.inboundRetryIntervalMs ?? 5 * 60 * 1000);
813
836
  retryTimer.unref?.();
814
837
  });
815
- stops.push(() => { if (retryTimer)
838
+ stops.push(() => { relayedRecovery.stop(); if (retryTimer)
816
839
  clearInterval(retryTimer); });
817
840
  }
818
841
  }
819
842
  if (inboundReady && router) {
820
843
  const socketRouter = router;
821
844
  const receipts = new InboundReceiptStore(path.join(stateDir(opts.home), "slack-inbound-receipts.jsonl"));
822
- recovery = new ChannelRecovery({ channel: cfg.channel, token: bot, stateDir: stateDir(opts.home), router: socketRouter, fetchImpl: opts.fetchImpl });
845
+ recovery = buildRecovery(socketRouter, true);
823
846
  starts.push(() => {
824
847
  recovery.initialize(); // persist the once-only floor before any live events
825
848
  inboundHandle = startSocketInbound(app, socketRouter, {