@openrig/cli 0.6.12 → 0.6.13

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 (432) hide show
  1. package/README.md +19 -12
  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/refocusing/scripts/trace-to-root.py +61 -16
  9. package/daemon/assets/skills/rigs/SKILL.md +8 -4
  10. package/daemon/context-packs/help/manifest.yaml +1 -1
  11. package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
  12. package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +60 -12
  13. package/daemon/context-packs/reference/getting-started.md +44 -14
  14. package/daemon/context-packs/reference/manifest.yaml +1 -1
  15. package/daemon/context-packs/reference/rig-spec.md +5 -5
  16. package/daemon/context-packs/reference/whats-new.md +90 -163
  17. package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
  18. package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
  19. package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
  20. package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
  21. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
  22. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
  23. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
  24. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
  25. package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
  26. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
  27. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
  28. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
  29. package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
  30. package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
  31. package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
  32. package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
  33. package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
  34. package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
  35. package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
  36. package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
  37. package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
  38. package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
  39. package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
  40. package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
  41. package/daemon/context-packs/skills/mission-slice-sop/SKILL.md +5 -0
  42. package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
  43. package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
  44. package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
  45. package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
  46. package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
  47. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
  48. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
  49. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
  50. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
  51. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
  52. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
  53. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
  54. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
  55. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
  56. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
  57. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
  58. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
  59. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
  60. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
  61. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
  62. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
  63. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
  64. package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
  65. package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
  66. package/daemon/context-packs/skills/refocusing/scripts/trace-to-root.py +61 -16
  67. package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
  68. package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
  69. package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
  70. package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
  71. package/daemon/context-packs/world-example/manifest.yaml +1 -1
  72. package/daemon/context-packs/world-public/manifest.yaml +1 -1
  73. package/daemon/dist/adapters/claude-code-adapter.d.ts +9 -1
  74. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  75. package/daemon/dist/adapters/claude-code-adapter.js +110 -52
  76. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  77. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  78. package/daemon/dist/adapters/codex-runtime-adapter.js +47 -6
  79. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  80. package/daemon/dist/adapters/pi-resume.d.ts +1 -1
  81. package/daemon/dist/adapters/pi-resume.d.ts.map +1 -1
  82. package/daemon/dist/adapters/pi-resume.js +4 -1
  83. package/daemon/dist/adapters/pi-resume.js.map +1 -1
  84. package/daemon/dist/adapters/pi-runner-protocol.d.ts +9 -0
  85. package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -1
  86. package/daemon/dist/adapters/pi-runner-protocol.js +16 -0
  87. package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -1
  88. package/daemon/dist/adapters/pi-runner.d.ts +5 -2
  89. package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
  90. package/daemon/dist/adapters/pi-runner.js +72 -15
  91. package/daemon/dist/adapters/pi-runner.js.map +1 -1
  92. package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -1
  93. package/daemon/dist/adapters/pi-runtime-adapter.js +2 -0
  94. package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -1
  95. package/daemon/dist/adapters/stub-compaction.d.ts +1 -0
  96. package/daemon/dist/adapters/stub-compaction.d.ts.map +1 -1
  97. package/daemon/dist/adapters/stub-compaction.js +2 -0
  98. package/daemon/dist/adapters/stub-compaction.js.map +1 -1
  99. package/daemon/dist/adapters/stub-refocus.d.ts +6 -0
  100. package/daemon/dist/adapters/stub-refocus.d.ts.map +1 -0
  101. package/daemon/dist/adapters/stub-refocus.js +22 -0
  102. package/daemon/dist/adapters/stub-refocus.js.map +1 -0
  103. package/daemon/dist/adapters/stub-runner.d.ts +6 -0
  104. package/daemon/dist/adapters/stub-runner.d.ts.map +1 -1
  105. package/daemon/dist/adapters/stub-runner.js +18 -1
  106. package/daemon/dist/adapters/stub-runner.js.map +1 -1
  107. package/daemon/dist/adapters/stub-script.d.ts +2 -2
  108. package/daemon/dist/adapters/stub-script.d.ts.map +1 -1
  109. package/daemon/dist/adapters/stub-script.js +2 -2
  110. package/daemon/dist/adapters/stub-script.js.map +1 -1
  111. package/daemon/dist/build-info.js +3 -3
  112. package/daemon/dist/db/all-migrations.d.ts.map +1 -1
  113. package/daemon/dist/db/all-migrations.js +2 -0
  114. package/daemon/dist/db/all-migrations.js.map +1 -1
  115. package/daemon/dist/db/migrations/117_provider_account_readings.d.ts +3 -0
  116. package/daemon/dist/db/migrations/117_provider_account_readings.d.ts.map +1 -0
  117. package/daemon/dist/db/migrations/117_provider_account_readings.js +32 -0
  118. package/daemon/dist/db/migrations/117_provider_account_readings.js.map +1 -0
  119. package/daemon/dist/domain/claude-activity-hooks.d.ts +6 -0
  120. package/daemon/dist/domain/claude-activity-hooks.d.ts.map +1 -1
  121. package/daemon/dist/domain/claude-activity-hooks.js +19 -1
  122. package/daemon/dist/domain/claude-activity-hooks.js.map +1 -1
  123. package/daemon/dist/domain/claude-core-plugin-env.d.ts +2 -0
  124. package/daemon/dist/domain/claude-core-plugin-env.d.ts.map +1 -1
  125. package/daemon/dist/domain/claude-core-plugin-env.js +6 -2
  126. package/daemon/dist/domain/claude-core-plugin-env.js.map +1 -1
  127. package/daemon/dist/domain/claude-managed-launch.d.ts +5 -0
  128. package/daemon/dist/domain/claude-managed-launch.d.ts.map +1 -1
  129. package/daemon/dist/domain/claude-managed-launch.js +48 -7
  130. package/daemon/dist/domain/claude-managed-launch.js.map +1 -1
  131. package/daemon/dist/domain/claude-mcp-menu.d.ts +5 -0
  132. package/daemon/dist/domain/claude-mcp-menu.d.ts.map +1 -0
  133. package/daemon/dist/domain/claude-mcp-menu.js +25 -0
  134. package/daemon/dist/domain/claude-mcp-menu.js.map +1 -0
  135. package/daemon/dist/domain/fresh-occupant-relation.d.ts +7 -0
  136. package/daemon/dist/domain/fresh-occupant-relation.d.ts.map +1 -1
  137. package/daemon/dist/domain/fresh-occupant-relation.js +44 -0
  138. package/daemon/dist/domain/fresh-occupant-relation.js.map +1 -1
  139. package/daemon/dist/domain/gateway/slack/channel-recovery.d.ts +14 -2
  140. package/daemon/dist/domain/gateway/slack/channel-recovery.d.ts.map +1 -1
  141. package/daemon/dist/domain/gateway/slack/channel-recovery.js +128 -89
  142. package/daemon/dist/domain/gateway/slack/channel-recovery.js.map +1 -1
  143. package/daemon/dist/domain/gateway/slack/inbound.d.ts +4 -0
  144. package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
  145. package/daemon/dist/domain/gateway/slack/inbound.js +5 -3
  146. package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
  147. package/daemon/dist/domain/gateway/slack/recovery-budget.d.ts +24 -0
  148. package/daemon/dist/domain/gateway/slack/recovery-budget.d.ts.map +1 -0
  149. package/daemon/dist/domain/gateway/slack/recovery-budget.js +18 -0
  150. package/daemon/dist/domain/gateway/slack/recovery-budget.js.map +1 -0
  151. package/daemon/dist/domain/gateway/slack/slack-recovery.d.ts +104 -0
  152. package/daemon/dist/domain/gateway/slack/slack-recovery.d.ts.map +1 -0
  153. package/daemon/dist/domain/gateway/slack/slack-recovery.js +236 -0
  154. package/daemon/dist/domain/gateway/slack/slack-recovery.js.map +1 -0
  155. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  156. package/daemon/dist/domain/gateway/slack/slack-subsystem.js +29 -6
  157. package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  158. package/daemon/dist/domain/gateway/slack/state-store.d.ts +34 -0
  159. package/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -1
  160. package/daemon/dist/domain/gateway/slack/state-store.js +67 -0
  161. package/daemon/dist/domain/gateway/slack/state-store.js.map +1 -1
  162. package/daemon/dist/domain/gateway/slack/thread-recovery.d.ts +37 -0
  163. package/daemon/dist/domain/gateway/slack/thread-recovery.d.ts.map +1 -0
  164. package/daemon/dist/domain/gateway/slack/thread-recovery.js +173 -0
  165. package/daemon/dist/domain/gateway/slack/thread-recovery.js.map +1 -0
  166. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +8 -0
  167. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -1
  168. package/daemon/dist/domain/gateway/slack/thread-seat-map.js +11 -0
  169. package/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -1
  170. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts +6 -1
  171. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts.map +1 -1
  172. package/daemon/dist/domain/model-divergence/current-generation-record.js +4 -1
  173. package/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -1
  174. package/daemon/dist/domain/model-divergence/current-model-reader.d.ts +74 -0
  175. package/daemon/dist/domain/model-divergence/current-model-reader.d.ts.map +1 -0
  176. package/daemon/dist/domain/model-divergence/current-model-reader.js +246 -0
  177. package/daemon/dist/domain/model-divergence/current-model-reader.js.map +1 -0
  178. package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts +18 -0
  179. package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts.map +1 -1
  180. package/daemon/dist/domain/model-divergence/effective-model-readers.js +24 -8
  181. package/daemon/dist/domain/model-divergence/effective-model-readers.js.map +1 -1
  182. package/daemon/dist/domain/native-process-lineage.d.ts +8 -1
  183. package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
  184. package/daemon/dist/domain/native-process-lineage.js +40 -26
  185. package/daemon/dist/domain/native-process-lineage.js.map +1 -1
  186. package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
  187. package/daemon/dist/domain/native-resume-probe.js +34 -8
  188. package/daemon/dist/domain/native-resume-probe.js.map +1 -1
  189. package/daemon/dist/domain/node-inventory.d.ts +1 -1
  190. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  191. package/daemon/dist/domain/node-inventory.js +84 -18
  192. package/daemon/dist/domain/node-inventory.js.map +1 -1
  193. package/daemon/dist/domain/process-census.d.ts +1 -1
  194. package/daemon/dist/domain/process-census.d.ts.map +1 -1
  195. package/daemon/dist/domain/process-table.d.ts +26 -0
  196. package/daemon/dist/domain/process-table.d.ts.map +1 -0
  197. package/daemon/dist/domain/process-table.js +185 -0
  198. package/daemon/dist/domain/process-table.js.map +1 -0
  199. package/daemon/dist/domain/profile-resolver.d.ts +8 -0
  200. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  201. package/daemon/dist/domain/profile-resolver.js +11 -0
  202. package/daemon/dist/domain/profile-resolver.js.map +1 -1
  203. package/daemon/dist/domain/projection-planner.js +1 -1
  204. package/daemon/dist/domain/projection-planner.js.map +1 -1
  205. package/daemon/dist/domain/provider/claude-usage-windows.d.ts +3 -1
  206. package/daemon/dist/domain/provider/claude-usage-windows.d.ts.map +1 -1
  207. package/daemon/dist/domain/provider/claude-usage-windows.js +48 -3
  208. package/daemon/dist/domain/provider/claude-usage-windows.js.map +1 -1
  209. package/daemon/dist/domain/provider/codex-usage-reader.d.ts +4 -1
  210. package/daemon/dist/domain/provider/codex-usage-reader.d.ts.map +1 -1
  211. package/daemon/dist/domain/provider/codex-usage-reader.js +3 -0
  212. package/daemon/dist/domain/provider/codex-usage-reader.js.map +1 -1
  213. package/daemon/dist/domain/provider/codex-usage-windows.d.ts +3 -1
  214. package/daemon/dist/domain/provider/codex-usage-windows.d.ts.map +1 -1
  215. package/daemon/dist/domain/provider/codex-usage-windows.js +1 -0
  216. package/daemon/dist/domain/provider/codex-usage-windows.js.map +1 -1
  217. package/daemon/dist/domain/provider/provider-account-readings.d.ts +42 -0
  218. package/daemon/dist/domain/provider/provider-account-readings.d.ts.map +1 -0
  219. package/daemon/dist/domain/provider/provider-account-readings.js +132 -0
  220. package/daemon/dist/domain/provider/provider-account-readings.js.map +1 -0
  221. package/daemon/dist/domain/provider/provider-types.d.ts +29 -0
  222. package/daemon/dist/domain/provider/provider-types.d.ts.map +1 -1
  223. package/daemon/dist/domain/provider/usage-across-hosts.d.ts.map +1 -1
  224. package/daemon/dist/domain/provider/usage-across-hosts.js +6 -0
  225. package/daemon/dist/domain/provider/usage-across-hosts.js.map +1 -1
  226. package/daemon/dist/domain/provider/usage-windows.d.ts +25 -0
  227. package/daemon/dist/domain/provider/usage-windows.d.ts.map +1 -1
  228. package/daemon/dist/domain/provider/usage-windows.js +100 -4
  229. package/daemon/dist/domain/provider/usage-windows.js.map +1 -1
  230. package/daemon/dist/domain/queue-repository.d.ts +23 -0
  231. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  232. package/daemon/dist/domain/queue-repository.js +59 -1
  233. package/daemon/dist/domain/queue-repository.js.map +1 -1
  234. package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
  235. package/daemon/dist/domain/queue-stuck-sweep.js +47 -4
  236. package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
  237. package/daemon/dist/domain/restore-check-service.d.ts +10 -0
  238. package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
  239. package/daemon/dist/domain/restore-check-service.js +73 -10
  240. package/daemon/dist/domain/restore-check-service.js.map +1 -1
  241. package/daemon/dist/domain/restore-guidance.d.ts +6 -0
  242. package/daemon/dist/domain/restore-guidance.d.ts.map +1 -1
  243. package/daemon/dist/domain/restore-guidance.js +21 -5
  244. package/daemon/dist/domain/restore-guidance.js.map +1 -1
  245. package/daemon/dist/domain/restore-orchestrator.js +1 -1
  246. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  247. package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
  248. package/daemon/dist/domain/resume-metadata-refresher.js +6 -29
  249. package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
  250. package/daemon/dist/domain/rig-repository.d.ts +3 -0
  251. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  252. package/daemon/dist/domain/rig-repository.js +6 -0
  253. package/daemon/dist/domain/rig-repository.js.map +1 -1
  254. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  255. package/daemon/dist/domain/rigspec-instantiator.js +4 -2
  256. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  257. package/daemon/dist/domain/rigspec-preflight.d.ts +4 -0
  258. package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
  259. package/daemon/dist/domain/rigspec-preflight.js +12 -2
  260. package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
  261. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  262. package/daemon/dist/domain/rigspec-schema.js +11 -0
  263. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  264. package/daemon/dist/domain/runtime-adapter.d.ts +13 -0
  265. package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
  266. package/daemon/dist/domain/runtime-adapter.js.map +1 -1
  267. package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
  268. package/daemon/dist/domain/seat-attention-reconciler.js +15 -1
  269. package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
  270. package/daemon/dist/domain/seat-cwd-preparation.d.ts +22 -0
  271. package/daemon/dist/domain/seat-cwd-preparation.d.ts.map +1 -0
  272. package/daemon/dist/domain/seat-cwd-preparation.js +107 -0
  273. package/daemon/dist/domain/seat-cwd-preparation.js.map +1 -0
  274. package/daemon/dist/domain/seat-effort.d.ts +4 -3
  275. package/daemon/dist/domain/seat-effort.d.ts.map +1 -1
  276. package/daemon/dist/domain/seat-effort.js +21 -3
  277. package/daemon/dist/domain/seat-effort.js.map +1 -1
  278. package/daemon/dist/domain/seat-lifecycle-service.d.ts +36 -2
  279. package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
  280. package/daemon/dist/domain/seat-lifecycle-service.js +206 -15
  281. package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
  282. package/daemon/dist/domain/seat-restart-in-place.d.ts +14 -0
  283. package/daemon/dist/domain/seat-restart-in-place.d.ts.map +1 -1
  284. package/daemon/dist/domain/seat-restart-in-place.js +59 -3
  285. package/daemon/dist/domain/seat-restart-in-place.js.map +1 -1
  286. package/daemon/dist/domain/seat-status-service.d.ts +2 -0
  287. package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
  288. package/daemon/dist/domain/seat-status-service.js +1 -0
  289. package/daemon/dist/domain/seat-status-service.js.map +1 -1
  290. package/daemon/dist/domain/seat-structural-activity-service.d.ts +7 -1
  291. package/daemon/dist/domain/seat-structural-activity-service.d.ts.map +1 -1
  292. package/daemon/dist/domain/seat-structural-activity-service.js +9 -3
  293. package/daemon/dist/domain/seat-structural-activity-service.js.map +1 -1
  294. package/daemon/dist/domain/session-name.d.ts +8 -0
  295. package/daemon/dist/domain/session-name.d.ts.map +1 -1
  296. package/daemon/dist/domain/session-name.js +12 -0
  297. package/daemon/dist/domain/session-name.js.map +1 -1
  298. package/daemon/dist/domain/session-transport.d.ts +78 -3
  299. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  300. package/daemon/dist/domain/session-transport.js +306 -15
  301. package/daemon/dist/domain/session-transport.js.map +1 -1
  302. package/daemon/dist/domain/successor-session-launcher.js +1 -1
  303. package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  304. package/daemon/dist/domain/types.d.ts +14 -0
  305. package/daemon/dist/domain/types.d.ts.map +1 -1
  306. package/daemon/dist/domain/types.js.map +1 -1
  307. package/daemon/dist/domain/watchdog-delivery.d.ts +29 -0
  308. package/daemon/dist/domain/watchdog-delivery.d.ts.map +1 -0
  309. package/daemon/dist/domain/watchdog-delivery.js +113 -0
  310. package/daemon/dist/domain/watchdog-delivery.js.map +1 -0
  311. package/daemon/dist/domain/watchdog-policy-engine.d.ts +60 -1
  312. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  313. package/daemon/dist/domain/watchdog-policy-engine.js +154 -28
  314. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  315. package/daemon/dist/domain/watchdog-scheduler.d.ts.map +1 -1
  316. package/daemon/dist/domain/watchdog-scheduler.js +6 -1
  317. package/daemon/dist/domain/watchdog-scheduler.js.map +1 -1
  318. package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -1
  319. package/daemon/dist/domain/workflow-instance-store.js +6 -2
  320. package/daemon/dist/domain/workflow-instance-store.js.map +1 -1
  321. package/daemon/dist/routes/attention.d.ts.map +1 -1
  322. package/daemon/dist/routes/attention.js +41 -1
  323. package/daemon/dist/routes/attention.js.map +1 -1
  324. package/daemon/dist/routes/compaction.js +1 -1
  325. package/daemon/dist/routes/compaction.js.map +1 -1
  326. package/daemon/dist/routes/queue.d.ts.map +1 -1
  327. package/daemon/dist/routes/queue.js +3 -1
  328. package/daemon/dist/routes/queue.js.map +1 -1
  329. package/daemon/dist/routes/restore-check.d.ts.map +1 -1
  330. package/daemon/dist/routes/restore-check.js +19 -1
  331. package/daemon/dist/routes/restore-check.js.map +1 -1
  332. package/daemon/dist/routes/seat.d.ts.map +1 -1
  333. package/daemon/dist/routes/seat.js +15 -2
  334. package/daemon/dist/routes/seat.js.map +1 -1
  335. package/daemon/dist/routes/sessions.d.ts.map +1 -1
  336. package/daemon/dist/routes/sessions.js +7 -1
  337. package/daemon/dist/routes/sessions.js.map +1 -1
  338. package/daemon/dist/routes/transport.d.ts.map +1 -1
  339. package/daemon/dist/routes/transport.js +13 -2
  340. package/daemon/dist/routes/transport.js.map +1 -1
  341. package/daemon/dist/server.d.ts +1 -0
  342. package/daemon/dist/server.d.ts.map +1 -1
  343. package/daemon/dist/server.js +1 -0
  344. package/daemon/dist/server.js.map +1 -1
  345. package/daemon/dist/startup.d.ts.map +1 -1
  346. package/daemon/dist/startup.js +39 -113
  347. package/daemon/dist/startup.js.map +1 -1
  348. package/daemon/docs/reference/agent-spec.md +1 -1
  349. package/daemon/docs/reference/agent-startup-guide.md +84 -0
  350. package/daemon/docs/reference/getting-started.md +44 -14
  351. package/daemon/docs/reference/publishing-a-rig-bundle.md +5 -2
  352. package/daemon/docs/reference/refocus-channel.md +11 -1
  353. package/daemon/docs/reference/rig-spec.md +5 -5
  354. package/daemon/docs/reference/rosters.md +29 -2
  355. package/daemon/docs/reference/slack-app-setup.md +47 -17
  356. package/daemon/docs/reference/whats-new.md +90 -163
  357. package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -0
  358. package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -0
  359. package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -0
  360. package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -0
  361. package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -0
  362. package/daemon/specs/agents/design/product-designer/agent.yaml +1 -0
  363. package/daemon/specs/agents/development/implementer/agent.yaml +1 -0
  364. package/daemon/specs/agents/development/qa/agent.yaml +1 -0
  365. package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +1 -0
  366. package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +1 -0
  367. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -0
  368. package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
  369. package/daemon/specs/agents/research/analyst/agent.yaml +1 -0
  370. package/daemon/specs/agents/research/synthesizer/agent.yaml +1 -0
  371. package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -0
  372. package/dist/build-info.js +3 -3
  373. package/dist/commands/capture.d.ts.map +1 -1
  374. package/dist/commands/capture.js +14 -0
  375. package/dist/commands/capture.js.map +1 -1
  376. package/dist/commands/config.d.ts.map +1 -1
  377. package/dist/commands/config.js +3 -2
  378. package/dist/commands/config.js.map +1 -1
  379. package/dist/commands/doctor.d.ts.map +1 -1
  380. package/dist/commands/doctor.js +8 -7
  381. package/dist/commands/doctor.js.map +1 -1
  382. package/dist/commands/grow.d.ts.map +1 -1
  383. package/dist/commands/grow.js +24 -7
  384. package/dist/commands/grow.js.map +1 -1
  385. package/dist/commands/provider.d.ts.map +1 -1
  386. package/dist/commands/provider.js +43 -7
  387. package/dist/commands/provider.js.map +1 -1
  388. package/dist/commands/ps.d.ts +2 -0
  389. package/dist/commands/ps.d.ts.map +1 -1
  390. package/dist/commands/ps.js +12 -1
  391. package/dist/commands/ps.js.map +1 -1
  392. package/dist/commands/remove.d.ts.map +1 -1
  393. package/dist/commands/remove.js +20 -1
  394. package/dist/commands/remove.js.map +1 -1
  395. package/dist/commands/roster.d.ts +2 -1
  396. package/dist/commands/roster.d.ts.map +1 -1
  397. package/dist/commands/roster.js +10 -5
  398. package/dist/commands/roster.js.map +1 -1
  399. package/dist/commands/scope.js +1 -1
  400. package/dist/commands/scope.js.map +1 -1
  401. package/dist/commands/seat.d.ts.map +1 -1
  402. package/dist/commands/seat.js +75 -8
  403. package/dist/commands/seat.js.map +1 -1
  404. package/dist/commands/slack.d.ts.map +1 -1
  405. package/dist/commands/slack.js +14 -1
  406. package/dist/commands/slack.js.map +1 -1
  407. package/dist/commands/usage.d.ts.map +1 -1
  408. package/dist/commands/usage.js +4 -3
  409. package/dist/commands/usage.js.map +1 -1
  410. package/dist/lib/model-observation.d.ts +13 -0
  411. package/dist/lib/model-observation.d.ts.map +1 -0
  412. package/dist/lib/model-observation.js +25 -0
  413. package/dist/lib/model-observation.js.map +1 -0
  414. package/dist/mcp-server.d.ts.map +1 -1
  415. package/dist/mcp-server.js +1 -0
  416. package/dist/mcp-server.js.map +1 -1
  417. package/package.json +1 -1
  418. package/tui/dist/attention/attention-model.js +6 -5
  419. package/tui/dist/attention/attention-model.js.map +1 -1
  420. package/tui/dist/attention/source-continuity.d.ts.map +1 -1
  421. package/tui/dist/attention/source-continuity.js +2 -0
  422. package/tui/dist/attention/source-continuity.js.map +1 -1
  423. package/tui/dist/terminals/open-window.d.ts +11 -1
  424. package/tui/dist/terminals/open-window.d.ts.map +1 -1
  425. package/tui/dist/terminals/open-window.js +47 -2
  426. package/tui/dist/terminals/open-window.js.map +1 -1
  427. package/tui/dist/usage/usage-model.d.ts +2 -0
  428. package/tui/dist/usage/usage-model.d.ts.map +1 -1
  429. package/tui/dist/usage/usage-model.js +38 -3
  430. package/tui/dist/usage/usage-model.js.map +1 -1
  431. package/ui/dist/assets/{index-Cfbtfd9G.js → index-CVgod3Pm.js} +1 -1
  432. package/ui/dist/index.html +1 -1
@@ -1,5 +1,5 @@
1
1
  import { execFile } from "node:child_process";
2
- import { accessSync, constants, realpathSync, statSync } from "node:fs";
2
+ import { accessSync, closeSync, constants, openSync, readSync, realpathSync, statSync } from "node:fs";
3
3
  import path from "node:path";
4
4
  import { publicSeatEnvironment } from "./seat-launch-environment.js";
5
5
  import { SEAT_ENV_KEYS_VAR, parseStoredSeatEnv, validateSeatEnvName } from "./seat-env.js";
@@ -8,12 +8,54 @@ import { shellQuote } from "../adapters/shell-quote.js";
8
8
  import { claudeClassicRendererEnvPrefix } from "../adapters/yolo-mode.js";
9
9
  import { parseClaudePermissionModes } from "./permission-drift.js";
10
10
  import { validateNativePermissionSelection } from "./native-permission-selection.js";
11
+ /** The kernel runs a file as a script only when its first two bytes are `#!`. A managed launch's frozen executable is
12
+ * then not the process that ends up running, so its path can't prove the launched Claude. Nothing past those two bytes
13
+ * is read; an unreadable, empty or one-byte file is not a script. */
14
+ export function fileStartsWithShebang(file) {
15
+ let fd;
16
+ try {
17
+ fd = openSync(file, "r");
18
+ const head = Buffer.alloc(2);
19
+ return readSync(fd, head, 0, 2, 0) === 2 && head[0] === 0x23 && head[1] === 0x21;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ finally {
25
+ if (fd !== undefined)
26
+ try {
27
+ closeSync(fd);
28
+ }
29
+ catch { /* nothing to release */ }
30
+ }
31
+ }
11
32
  /** Dynamic choices use the managed launch environment, not an interactive shell's
12
33
  * aliases or startup files. No cache and no persisted environment/credentials.
13
34
  * The help child has only the capability environment. Launch adds the existing
14
35
  * managed identity/auth channel by variable NAME, never secret values in text.
15
36
  */
16
37
  const MANAGED_LAUNCH_KEYS = ["PATH", "HOME", "CLAUDE_CONFIG_DIR", "CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN"];
38
+ const PANE_TERMINAL_KEYS = ["TERM", "COLORTERM", "TERM_PROGRAM", "TERM_PROGRAM_VERSION", "LANG", "LC_ALL", "LC_CTYPE", "LC_MESSAGES",
39
+ "LC_COLLATE", "LC_NUMERIC", "LC_TIME", "LC_MONETARY"];
40
+ /** The person's editor and display session, so a managed seat behaves like a plain one for Claude's external-editor
41
+ * action (EDITOR, VISUAL; Claude falls back to VS Code without them) and for image paste, which runs
42
+ * `xclip || wl-paste` (DISPLAY with XAUTHORITY reach X11; WAYLAND_DISPLAY reaches the compositor, see below). Names only:
43
+ * the pane supplies the values. Left out: XDG_RUNTIME_DIR, because sd-bus, GDBus and libdbus fall back to
44
+ * $XDG_RUNTIME_DIR/bus when DBUS_SESSION_BUS_ADDRESS is unset, so it would hand the seat the session bus (keyring,
45
+ * `systemctl --user`) that the cleared environment keeps out; and DBUS_SESSION_BUS_ADDRESS, XDG_SESSION_TYPE and
46
+ * XDG_CURRENT_DESKTOP, which neither path reads. */
47
+ const PANE_SESSION_KEYS = ["EDITOR", "VISUAL", "DISPLAY", "XAUTHORITY"];
48
+ /** WAYLAND_DISPLAY without XDG_RUNTIME_DIR: a client resolves a relative socket name against XDG_RUNTIME_DIR, but an
49
+ * absolute path needs nothing else. The pane shell computes the value into a variable ahead of `env -i`: an absolute
50
+ * value is kept, a relative one is joined to the pane's XDG_RUNTIME_DIR, and a relative one with no XDG_RUNTIME_DIR (or
51
+ * an unset or empty one) leaves the variable empty, so the name is never forwarded. An assignment is not word-split or
52
+ * globbed, so a value with a space or a `*` arrives whole. The case patterns are balanced `(…)` so that shells that
53
+ * mis-parse an unbalanced `)` inside `$(…)` (bash before 4.0, a macOS /bin/sh) accept it. The variable stays in the
54
+ * shell that runs the command, which is a staged `/bin/sh` script for a managed launch; `env -i` does not pass it on. */
55
+ const WAYLAND_DISPLAY_VAR = "__openrig_wayland_display";
56
+ const WAYLAND_DISPLAY_ASSIGNMENT = `${WAYLAND_DISPLAY_VAR}=$(case "\${WAYLAND_DISPLAY-}" in (/*) printf %s "$WAYLAND_DISPLAY";; `
57
+ + `(?*) if [ -n "\${XDG_RUNTIME_DIR-}" ]; then printf %s/%s "$XDG_RUNTIME_DIR" "$WAYLAND_DISPLAY"; fi;; esac)`;
58
+ const WAYLAND_DISPLAY_WORD = `\${${WAYLAND_DISPLAY_VAR}:+"WAYLAND_DISPLAY=$${WAYLAND_DISPLAY_VAR}"}`;
17
59
  export class ClaudeManagedLaunch {
18
60
  db;
19
61
  sessionEnv;
@@ -127,7 +169,7 @@ export class ClaudeManagedLaunch {
127
169
  const s = statSync(file);
128
170
  return [realpathSync(file), s.dev, s.ino, s.mode, s.size, s.mtimeMs, s.ctimeMs];
129
171
  };
130
- return Object.freeze({ env: Object.freeze(env), configDir, executable,
172
+ return Object.freeze({ env: Object.freeze(env), configDir, executable, executableIsScript: fileStartsWithShebang(executable),
131
173
  fileIdentity: Object.freeze(identity(executable)), cwdIdentity: Object.freeze(identity(cwd).slice(0, 3)) });
132
174
  }
133
175
  async prepare(request, mode) {
@@ -183,13 +225,12 @@ export class ClaudeManagedLaunch {
183
225
  // inside tmux; without it Claude never asks tmux for extended keys, and Shift+Enter reaches it
184
226
  // as a plain Enter. TMUX is left out on purpose: a bare `tmux` follows $TMUX ahead of
185
227
  // TMUX_TMPDIR, so tools the seat runs (and any daemon it starts) would follow the seat's own tmux server.
186
- const terminal = ["TERM", "COLORTERM", "TERM_PROGRAM", "TERM_PROGRAM_VERSION", "LANG", "LC_ALL", "LC_CTYPE", "LC_MESSAGES",
187
- "LC_COLLATE", "LC_NUMERIC", "LC_TIME", "LC_MONETARY"]
188
- .map(key => `\${${key}:+"${key}=$${key}"}`);
189
- return Object.freeze({ assertCurrent, configDir: context.configDir, executable: context.executable, command: (args, launchEnv = {}) => {
228
+ const terminal = [...PANE_TERMINAL_KEYS, ...PANE_SESSION_KEYS].map(key => `\${${key}:+"${key}=$${key}"}`);
229
+ terminal.push(WAYLAND_DISPLAY_WORD);
230
+ return Object.freeze({ assertCurrent, configDir: context.configDir, executable: context.executable, executableIsScript: context.executableIsScript, command: (args, launchEnv = {}) => {
190
231
  assertCurrent();
191
232
  const launch = Object.entries(launchEnv).map(([key, value]) => shellQuote(`${key}=${value}`));
192
- return `cd ${shellQuote(cwd)} && /usr/bin/env -i ${[...assignments, ...forwarded, ...seatForwarded, ...projectForwarded, ...terminal, ...launch, shellQuote(context.executable), ...args.map(shellQuote)].join(" ")}`;
233
+ return `${WAYLAND_DISPLAY_ASSIGNMENT}; cd ${shellQuote(cwd)} && /usr/bin/env -i ${[...assignments, ...forwarded, ...seatForwarded, ...projectForwarded, ...terminal, ...launch, shellQuote(context.executable), ...args.map(shellQuote)].join(" ")}`;
193
234
  } });
194
235
  }
195
236
  }
@@ -1 +1 @@
1
- {"version":3,"file":"claude-managed-launch.js","sourceRoot":"","sources":["../../src/domain/claude-managed-launch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC9G,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AAgBrF;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,sCAAsC,CAAC,CAAC;AAE1G,MAAM,OAAO,mBAAmB;IACD;IACV;IACA;IAEA;IAEA;IANnB,YAA6B,EAAqB,EAC/B,UAAwD,EACxD,WAAwC;IACzD,6FAA6F;IAC5E,cAA8E;IAC/F,iGAAiG;IAChF,UAAmB;QANT,OAAE,GAAF,EAAE,CAAmB;QAC/B,eAAU,GAAV,UAAU,CAA8C;QACxD,gBAAW,GAAX,WAAW,CAA6B;QAExC,mBAAc,GAAd,cAAc,CAAgE;QAE9E,eAAU,GAAV,UAAU,CAAS;IAAG,CAAC;IAE1C;;8FAE0F;IAClF,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,OAA2B;QACnE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;mEACiC,CAAC,CAAC,GAAG,CAAC,MAAM,CAA8D,CAAC;YACxI,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC;gBAAE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3H,CAAC;QAAC,MAAM,CAAC,CAAC,6DAA6D,CAAC,CAAC;QACzE,6GAA6G;QAC7G,+GAA+G;QAC/G,IAAI,iBAAiB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACrI,IAAI,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACnC,0FAA0F;YAC1F,gEAAgE;YAChE,IAAI,CAAC;gBACH,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3F,IAAI,GAAG;wBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1G,CAAC;IAEO,MAAM,CAAC,MAAc;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;uEAIuC,CAAC,CAAC,GAAG,CAAC,MAAM,CAA+B,CAAC;QAC/G,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,aAAa,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnF,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACrH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,4EAA4E;IAC5E,QAAQ,CAAC,MAAc;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAI,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,GAAW;QACrB,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;QACpD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;QAChI,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;QACrF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,CAAC;IACjH,CAAC;IAED;yFACqF;IACrF,iBAAiB,CAAC,GAAW;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,CAAC;IAEO,OAAO,CAAC,GAAW;QACzB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;QAC1D,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2FAA2F,CAAC,CAAC;QAC3J,wEAAwE;QACxE,sEAAsE;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,GAAG,GAA2B,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;QAChF,uEAAuE;QACvE,wEAAwE;QACxE,IAAI,iBAAiB,KAAK,SAAS;YAAE,GAAG,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACvE,IAAI,8BAA8B,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,GAAG,CAAC,oCAAoC,GAAG,GAAG,CAAC;QACrG,IAAI,UAA8B,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC;gBAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;oBAAE,SAAS;YAAC,CAAC;YAC3F,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YACnB,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;YAAC,MAAM;QAC9C,CAAC;QACD,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACpI,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;YAChC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YACzB,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAClF,CAAC,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,UAAU;YACnE,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA2B,EAAE,IAAY;QAGrD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAI,CAAC;QACxB,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,8FAA8F,CAAC,CAAC;QAClH,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC;eAC/C,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC;eACnE,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACrH,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,+EAA+E;QAC/E,gFAAgF;QAChF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,SAAS;eAC1F,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAChH,MAAM,aAAa,GAAG,GAAG,EAAE;YACzB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;mBACpE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;mBAC7D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,SAAS;uBAC1F,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,sCAAsC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpI,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;YAChH,CAAC;QACH,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzD,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,EACzH,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACzI,CAAC,CAAC,CAAC;QACH,aAAa,EAAE,CAAC;QAChB,iCAAiC,CAAC,aAAa,EAAE,IAAI,EAAE,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;QACzF,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC;QAC1D,MAAM,QAAQ,GAA2B,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa;YACvG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,2BAA2B,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;QACpF,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;QACvI,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC;QACxH,kGAAkG;QAClG,+FAA+F;QAC/F,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC;aAChH,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC;QAC7C,wHAAwH;QACxH,2HAA2H;QAC3H,MAAM,eAAe,GAAG,iBAAiB,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC;QAC5I,MAAM,gBAAgB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,oBAAoB,KAAK,oBAAoB,KAAK,oBAAoB,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnI,8EAA8E;QAC9E,+FAA+F;QAC/F,+FAA+F;QAC/F,sFAAsF;QACtF,0GAA0G;QAC1G,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa;YACxH,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,CAAC;aACpD,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,IAAuB,EAAE,YAA8C,EAAE,EAAE,EAAE;gBACzL,aAAa,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC9F,OAAO,MAAM,UAAU,CAAC,GAAG,CAAC,uBAAuB,CAAC,GAAG,WAAW,EAAE,GAAG,SAAS,EAAE,GAAG,aAAa,EAAE,GAAG,gBAAgB,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACxN,CAAC,EAAE,CAAC,CAAC;IACP,CAAC;CACF"}
1
+ {"version":3,"file":"claude-managed-launch.js","sourceRoot":"","sources":["../../src/domain/claude-managed-launch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Complete current MCP approval menus from supplied Claude captures. This is not
2
+ * a general checkbox detector: heading, instruction, warning, items and terminal
3
+ * footer must agree. A later composer (including a draft) ends this menu. */
4
+ export declare function currentClaudeMcpMenu(pane: string): string | null;
5
+ //# sourceMappingURL=claude-mcp-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-mcp-menu.d.ts","sourceRoot":"","sources":["../../src/domain/claude-mcp-menu.ts"],"names":[],"mappings":"AAAA;;6EAE6E;AAC7E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAehE"}
@@ -0,0 +1,25 @@
1
+ /** Complete current MCP approval menus from supplied Claude captures. This is not
2
+ * a general checkbox detector: heading, instruction, warning, items and terminal
3
+ * footer must agree. A later composer (including a draft) ends this menu. */
4
+ export function currentClaudeMcpMenu(pane) {
5
+ const lines = pane.split(/\r?\n/).map(line => line.trim()).filter(Boolean);
6
+ const footer = lines.at(-1);
7
+ if (footer !== "Space to select · Enter to confirm · Esc to reject all"
8
+ && footer !== "Space to select · Esc to reject all")
9
+ return null;
10
+ const header = lines.map(line => /^\d+ new MCP servers found in (?:\.mcp\.json|this project)$/.test(line)).lastIndexOf(true);
11
+ if (header < 0 || lines[header + 1] !== "Select any you wish to enable.")
12
+ return null;
13
+ const item = /^(?:❯\s+)?\[(?:✔| )\]\s+\S.*$/;
14
+ const firstItem = lines.findIndex((line, i) => i > header + 1 && item.test(line));
15
+ if (firstItem < 0 || lines.slice(header + 2, firstItem).join(" ") !==
16
+ "MCP servers may execute code or access system resources. All tool calls require approval. Learn more in the MCP documentation.")
17
+ return null;
18
+ const choices = lines.slice(firstItem, -1);
19
+ if (/^(?:❯\s+)?Enable selected$/.test(choices.at(-1) ?? ""))
20
+ choices.pop();
21
+ if (!choices.length || !choices.every(line => item.test(line)))
22
+ return null;
23
+ return lines[header];
24
+ }
25
+ //# sourceMappingURL=claude-mcp-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-mcp-menu.js","sourceRoot":"","sources":["../../src/domain/claude-mcp-menu.ts"],"names":[],"mappings":"AAAA;;6EAE6E;AAC7E,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,MAAM,KAAK,wDAAwD;WAClE,MAAM,KAAK,qCAAqC;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,6DAA6D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7H,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,gCAAgC;QAAE,OAAO,IAAI,CAAC;IACtF,MAAM,IAAI,GAAG,+BAA+B,CAAC;IAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClF,IAAI,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC/D,gIAAgI;QAAE,OAAO,IAAI,CAAC;IAChJ,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3E,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5E,OAAO,KAAK,CAAC,MAAM,CAAE,CAAC;AACxB,CAAC"}
@@ -5,4 +5,11 @@ import type Database from "better-sqlite3";
5
5
  * guesses are unnecessary. No history or native identity is rewritten here.
6
6
  */
7
7
  export declare function readFreshOccupantRelations(db: Database.Database, rigId: string): Record<string, string | null>;
8
+ /** The event seq of each node's current-generation fresh launch that reached
9
+ * ready. A restore attempt that started before it describes the retired
10
+ * occupant, not the current one. A launch that needed attention, failed,
11
+ * belongs to an older generation or contradicts another gives no fence, so
12
+ * the recorded restore outcome stands.
13
+ */
14
+ export declare function readReadyFreshLaunchFences(db: Database.Database, rigId?: string): Map<string, number>;
8
15
  //# sourceMappingURL=fresh-occupant-relation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fresh-occupant-relation.d.ts","sourceRoot":"","sources":["../../src/domain/fresh-occupant-relation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAqB9G"}
1
+ {"version":3,"file":"fresh-occupant-relation.d.ts","sourceRoot":"","sources":["../../src/domain/fresh-occupant-relation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAqB9G;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BrG"}
@@ -28,4 +28,48 @@ export function readFreshOccupantRelations(db, rigId) {
28
28
  }
29
29
  return relation;
30
30
  }
31
+ /** The event seq of each node's current-generation fresh launch that reached
32
+ * ready. A restore attempt that started before it describes the retired
33
+ * occupant, not the current one. A launch that needed attention, failed,
34
+ * belongs to an older generation or contradicts another gives no fence, so
35
+ * the recorded restore outcome stands.
36
+ */
37
+ export function readReadyFreshLaunchFences(db, rigId) {
38
+ // Indexed: from each node's current tenure into that node's fresh-launch events
39
+ // (idx_events_node_type_seq), not every event of the type. `rig ps` runs this on every call.
40
+ const events = db.prepare(`
41
+ SELECT e.seq AS seq, e.payload AS payload, t.node_id AS nodeId, t.generation_uuid AS generation
42
+ FROM occupant_tenures t
43
+ JOIN nodes n ON n.id = t.node_id
44
+ JOIN events e ON e.node_id = t.node_id AND e.type = 'seat.fresh_launched'
45
+ WHERE t.generation_ordinal =
46
+ (SELECT MAX(t2.generation_ordinal) FROM occupant_tenures t2 WHERE t2.node_id = t.node_id)${rigId ? " AND n.rig_id = ?" : ""}
47
+ ORDER BY e.seq
48
+ `).all(...(rigId ? [rigId] : []));
49
+ const launches = new Map();
50
+ for (const row of events) {
51
+ let event;
52
+ try {
53
+ event = JSON.parse(row.payload);
54
+ }
55
+ catch {
56
+ continue;
57
+ }
58
+ if (event.nodeId !== row.nodeId || event.newGeneration !== row.generation)
59
+ continue;
60
+ const sessionId = typeof event.sessionId === "string" && event.sessionId ? event.sessionId : null;
61
+ const prior = launches.get(row.nodeId);
62
+ if (prior === null)
63
+ continue;
64
+ launches.set(row.nodeId, prior && prior.sessionId !== sessionId
65
+ ? null // contradictory current effects give no fence
66
+ : { seq: row.seq, sessionId, ready: event.status === "ready" && (prior?.ready ?? true) });
67
+ }
68
+ const fences = new Map();
69
+ for (const [nodeId, launch] of launches) {
70
+ if (launch?.sessionId && launch.ready)
71
+ fences.set(nodeId, launch.seq);
72
+ }
73
+ return fences;
74
+ }
31
75
  //# sourceMappingURL=fresh-occupant-relation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fresh-occupant-relation.js","sourceRoot":"","sources":["../../src/domain/fresh-occupant-relation.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,EAAqB,EAAE,KAAa;IAC7E,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;GAK9B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAkD,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,2FAA2F,CAAC;SACnH,GAAG,CAAC,KAAK,CAA+B,CAAC;IAC5C,MAAM,QAAQ,GAAkC,EAAE,CAAC;IACnD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAA4B,CAAC;QACjE,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;eAC7D,KAAK,CAAC,aAAa,KAAK,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,SAAS;QACjE,MAAM,EAAE,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3F,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;YAClG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,mDAAmD;QACpF,CAAC;;YAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"fresh-occupant-relation.js","sourceRoot":"","sources":["../../src/domain/fresh-occupant-relation.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,EAAqB,EAAE,KAAa;IAC7E,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;GAK9B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAkD,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,2FAA2F,CAAC;SACnH,GAAG,CAAC,KAAK,CAA+B,CAAC;IAC5C,MAAM,QAAQ,GAAkC,EAAE,CAAC;IACnD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAA4B,CAAC;QACjE,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;eAC7D,KAAK,CAAC,aAAa,KAAK,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,SAAS;QACjE,MAAM,EAAE,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3F,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;YAClG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,mDAAmD;QACpF,CAAC;;YAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,EAAqB,EAAE,KAAc;IAC9E,gFAAgF;IAChF,6FAA6F;IAC7F,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;iGAMqE,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE;;GAE9H,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAgF,CAAC;IACjH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4E,CAAC;IACrG,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,KAA8B,CAAC;QACnC,IAAI,CAAC;YAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAA4B,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QACvF,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,GAAG,CAAC,UAAU;YAAE,SAAS;QACpF,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QAClG,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAC7B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;YAC7D,CAAC,CAAC,IAAI,CAAC,8CAA8C;YACrD,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACxC,IAAI,MAAM,EAAE,SAAS,IAAI,MAAM,CAAC,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { type FetchImpl } from "./slack-api.js";
2
2
  import { type InboundRouter } from "./inbound.js";
3
3
  import { ChannelCoverageStore, type ChannelCoverage } from "./state-store.js";
4
+ import { MethodBackoff, type RecoveryBudget, type RecoverySource } from "./recovery-budget.js";
4
5
  interface RecoveryOptions {
5
6
  channel: string | null;
6
7
  token: string | null;
@@ -9,13 +10,17 @@ interface RecoveryOptions {
9
10
  fetchImpl?: FetchImpl;
10
11
  store?: ChannelCoverageStore;
11
12
  now?: () => number;
13
+ /** "adoption": a channel recovery newly adopts starts its coverage then. Absent: the configured
14
+ * channel's established seed, its newest retained accepted landing, else adoption. */
15
+ seed?: "adoption";
12
16
  }
13
17
  /** One owner across socket generations. Stop fences admission and checkpoint writes;
14
18
  * already admitted I/O remains owned until it settles (no timeout/unlock race). */
15
- export declare class ChannelRecovery {
19
+ export declare class ChannelRecovery implements RecoverySource {
16
20
  private readonly opts;
17
21
  private readonly store;
18
22
  private readonly now;
23
+ private readonly backoff;
19
24
  private coverage?;
20
25
  private pass?;
21
26
  private stopped;
@@ -25,6 +30,8 @@ export declare class ChannelRecovery {
25
30
  private accepted;
26
31
  private deadLettered;
27
32
  constructor(opts: RecoveryOptions);
33
+ get key(): string;
34
+ get channel(): string | null;
28
35
  initialize(): void;
29
36
  status(): {
30
37
  state: string;
@@ -37,9 +44,14 @@ export declare class ChannelRecovery {
37
44
  limits: string[];
38
45
  };
39
46
  stop(): void;
47
+ /** A pass of this channel alone, with its own budget. */
40
48
  run(): Promise<void>;
49
+ /** At most one history page within the pass's budget. "more": this channel has more history to
50
+ * scan now. "done": scanned, waiting, refused or backing off; its status says which. */
51
+ step(budget: RecoveryBudget, backoff: MethodBackoff): Promise<"more" | "done">;
52
+ private ready;
41
53
  private save;
42
- private scan;
54
+ private page;
43
55
  }
44
56
  export {};
45
57
  //# sourceMappingURL=channel-recovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"channel-recovery.d.ts","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/channel-recovery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAkB,KAAK,aAAa,EAAmB,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAA+B,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE3G,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;mFACmF;AACnF,qBAAa,eAAe;IAYd,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,CAAkB;IACnC,OAAO,CAAC,IAAI,CAAC,CAAgB;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,YAAY,CAAK;gBAEI,IAAI,EAAE,eAAe;IAKlD,UAAU,IAAI,IAAI;IAUlB,MAAM;;;;;;;;;;IAWN,IAAI,IAAI,IAAI;IAEZ,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAWpB,OAAO,CAAC,IAAI;YAME,IAAI;CAuEnB"}
1
+ {"version":3,"file":"channel-recovery.d.ts","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/channel-recovery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAkB,KAAK,aAAa,EAAmB,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAA+B,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC3G,OAAO,EAAuB,aAAa,EAAqB,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEvI,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;2FACuF;IACvF,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED;mFACmF;AACnF,qBAAa,eAAgB,YAAW,cAAc;IAaxC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAZjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,CAAkB;IACnC,OAAO,CAAC,IAAI,CAAC,CAAgB;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,YAAY,CAAK;gBAEI,IAAI,EAAE,eAAe;IAKlD,IAAI,GAAG,IAAI,MAAM,CAAkD;IACnE,IAAI,OAAO,IAAI,MAAM,GAAG,IAAI,CAA8B;IAE1D,UAAU,IAAI,IAAI;IAalB,MAAM;;;;;;;;;;IAWN,IAAI,IAAI,IAAI;IAEZ,yDAAyD;IACzD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAUpB;6FACyF;IACnF,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IAUpF,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,IAAI;YAME,IAAI;CA2EnB"}
@@ -3,12 +3,14 @@ import path from "node:path";
3
3
  import { callWebApi } from "./slack-api.js";
4
4
  import { ingestDecision } from "./inbound.js";
5
5
  import { ChannelCoverageStore, slackMicros, slackTimestamp } from "./state-store.js";
6
+ import { budgetLeft, HISTORY, MethodBackoff, newRecoveryBudget } from "./recovery-budget.js";
6
7
  /** One owner across socket generations. Stop fences admission and checkpoint writes;
7
8
  * already admitted I/O remains owned until it settles (no timeout/unlock race). */
8
9
  export class ChannelRecovery {
9
10
  opts;
10
11
  store;
11
12
  now;
13
+ backoff = new MethodBackoff();
12
14
  coverage;
13
15
  pass;
14
16
  stopped = false;
@@ -22,6 +24,8 @@ export class ChannelRecovery {
22
24
  this.now = opts.now ?? Date.now;
23
25
  this.store = opts.store ?? new ChannelCoverageStore(path.join(opts.stateDir, "slack-channel-coverage.json"));
24
26
  }
27
+ get key() { return `channel:${this.opts.channel ?? "-"}`; }
28
+ get channel() { return this.opts.channel; }
25
29
  initialize() {
26
30
  if (!this.opts.channel) {
27
31
  this.state = "unavailable";
@@ -29,7 +33,10 @@ export class ChannelRecovery {
29
33
  return;
30
34
  }
31
35
  try {
32
- this.coverage = this.store.initialize(this.opts.channel, slackTimestamp(BigInt(this.now()) * 1000n), path.join(this.opts.stateDir, "slack-inbound-seen.jsonl"), path.join(this.opts.stateDir, "slack-inbound-receipts.jsonl"));
36
+ const at = slackTimestamp(BigInt(this.now()) * 1000n);
37
+ this.coverage = this.opts.seed === "adoption"
38
+ ? this.store.initializeAtAdoption(this.opts.channel, at)
39
+ : this.store.initialize(this.opts.channel, at, path.join(this.opts.stateDir, "slack-inbound-seen.jsonl"), path.join(this.opts.stateDir, "slack-inbound-receipts.jsonl"));
33
40
  this.state = this.opts.token ? "pending" : "unavailable";
34
41
  this.reason = this.opts.token ? undefined : "bot-token-unresolved";
35
42
  }
@@ -42,41 +49,61 @@ export class ChannelRecovery {
42
49
  return { state: this.state, reason: this.reason, channel: this.opts.channel, lastScanAt: this.lastScanAt,
43
50
  coverage: this.coverage ? structuredClone(this.coverage) : null,
44
51
  acceptedThisProcess: this.accepted, deadLetteredThisProcess: this.deadLettered,
45
- limits: ["older history unknown", "counts reset on connector rewire/restart", "configured-channel history, including broadcast replies; non-broadcast thread recovery deferred",
52
+ limits: ["older history unknown", "counts reset on connector rewire/restart", "this channel's history, including broadcast replies",
46
53
  ...(this.coverage?.historyLimited ? ["Slack plan limit excludes older history; only available messages were scanned"] : []),
47
54
  "coverage means scanned available history; dead letters are custody, not delivery",
48
55
  "five-second settle margin; larger clock skew or history visibility lag remains unverified",
49
56
  "four pages / 100 entries / 15 seconds admission per pass; no global chronological ordering"] };
50
57
  }
51
58
  stop() { this.stopped = true; this.state = "stopped"; }
59
+ /** A pass of this channel alone, with its own budget. */
52
60
  run() {
53
61
  if (this.pass)
54
62
  return this.pass;
55
- if (this.stopped || !this.coverage || !this.opts.token || !this.opts.channel)
63
+ if (!this.ready())
56
64
  return Promise.resolve();
57
- const pass = this.scan().catch(() => {
58
- if (!this.stopped) {
59
- this.state = "incomplete";
60
- this.reason = "storage-or-routing-failed";
61
- }
62
- });
65
+ const budget = newRecoveryBudget(this.now());
66
+ const pass = (async () => { while (await this.step(budget, this.backoff) === "more") { /* next page */ } })();
63
67
  this.pass = pass;
64
68
  void pass.finally(() => { if (this.pass === pass)
65
69
  this.pass = undefined; });
66
70
  return pass;
67
71
  }
72
+ /** At most one history page within the pass's budget. "more": this channel has more history to
73
+ * scan now. "done": scanned, waiting, refused or backing off; its status says which. */
74
+ async step(budget, backoff) {
75
+ if (!this.ready())
76
+ return "done";
77
+ try {
78
+ return await this.page(budget, backoff);
79
+ }
80
+ catch {
81
+ if (!this.stopped) {
82
+ this.state = "incomplete";
83
+ this.reason = "storage-or-routing-failed";
84
+ }
85
+ return "done";
86
+ }
87
+ }
88
+ ready() {
89
+ return !this.stopped && !!this.coverage && !!this.opts.token && !!this.opts.channel;
90
+ }
68
91
  save(next) {
69
92
  if (this.stopped)
70
93
  return;
71
94
  this.store.save(this.opts.channel, next);
72
95
  this.coverage = next; // publish only after the atomic write succeeds
73
96
  }
74
- async scan() {
97
+ async page(budget, backoff) {
98
+ if (backoff.blocked(HISTORY, this.now())) {
99
+ this.state = "backoff";
100
+ this.reason = "rate-limited";
101
+ return "done";
102
+ }
75
103
  if (this.coverage.nextRetryAt && this.coverage.nextRetryAt > this.now()) {
76
104
  this.state = "backoff";
77
- return;
105
+ return "done";
78
106
  }
79
- const deadline = this.now() + 15_000;
80
107
  this.lastScanAt = new Date(this.now()).toISOString();
81
108
  this.state = "scanning";
82
109
  this.reason = undefined;
@@ -86,92 +113,104 @@ export class ChannelRecovery {
86
113
  const upper = slackTimestamp(BigInt(Math.max(0, this.now() - 5000)) * 1000n);
87
114
  if (slackMicros(upper) <= slackMicros(this.coverage.coveredThrough)) {
88
115
  this.state = "pending";
89
- return;
116
+ return "done";
90
117
  }
91
- this.save({ ...this.coverage, nextRetryAt: undefined, pending: { upper, nextLatest: upper } });
118
+ if (!budgetLeft(budget, this.now())) {
119
+ this.state = "incomplete";
120
+ this.reason = "pass-budget";
121
+ return "done";
122
+ }
123
+ this.save({ ...this.coverage, nextRetryAt: undefined, rateLimited: undefined, pending: { upper, nextLatest: upper } });
124
+ }
125
+ else if (!budgetLeft(budget, this.now())) {
126
+ this.state = "incomplete";
127
+ this.reason = "pass-budget";
128
+ return "done";
129
+ }
130
+ const c = { ...this.coverage };
131
+ const lower = slackMicros(c.coveredThrough);
132
+ const latest = slackMicros(c.pending.nextLatest);
133
+ budget.calls++;
134
+ const r = await callWebApi(HISTORY, this.opts.token, {
135
+ channel: this.opts.channel, oldest: slackTimestamp(lower > 0n ? lower - 1n : 0n),
136
+ latest: c.pending.nextLatest, inclusive: false, limit: Math.min(25, 100 - budget.entries),
137
+ }, this.opts.fetchImpl, Math.min(5000, budget.deadline - this.now()), "get-query");
138
+ if (this.stopped)
139
+ return "done";
140
+ if (!r.ok) {
141
+ const known = ["missing_scope", "not_in_channel", "channel_not_found", "invalid_auth", "token_revoked"];
142
+ this.reason = r.status === 429 ? "rate-limited" : known.includes(r.error ?? "") ? r.error : "history-api-unavailable";
143
+ const retrySeconds = r.retryAfterSeconds ?? (r.status === 0 || r.status >= 500 ? 5 : 300);
144
+ if (r.status === 429)
145
+ backoff.hold(HISTORY, this.now() + retrySeconds * 1000);
146
+ this.save({ ...c, nextRetryAt: this.now() + retrySeconds * 1000, rateLimited: r.status === 429 });
147
+ this.state = "backoff";
148
+ return "done";
149
+ }
150
+ const messages = r.json.messages;
151
+ const cursor = r.json.response_metadata?.next_cursor;
152
+ if (!Array.isArray(messages) || (r.json.has_more !== undefined && typeof r.json.has_more !== "boolean") ||
153
+ (r.json.has_more === undefined && cursor === undefined) ||
154
+ (cursor !== undefined && typeof cursor !== "string") || messages.length > 25 ||
155
+ messages.some(m => !m || typeof m !== "object" || slackMicros(m.ts) === null ||
156
+ slackMicros(m.ts) < lower || slackMicros(m.ts) >= latest)) {
157
+ this.state = "incomplete";
158
+ this.reason = "invalid-history-page";
159
+ return "done";
92
160
  }
93
- let entries = 0;
94
- for (let pages = 0; pages < 4 && !this.stopped && this.now() < deadline; pages++) {
95
- const c = { ...this.coverage };
96
- const lower = slackMicros(c.coveredThrough);
97
- const latest = slackMicros(c.pending.nextLatest);
98
- const r = await callWebApi("conversations.history", this.opts.token, {
99
- channel: this.opts.channel, oldest: slackTimestamp(lower > 0n ? lower - 1n : 0n),
100
- latest: c.pending.nextLatest, inclusive: false, limit: Math.min(25, 100 - entries),
101
- }, this.opts.fetchImpl, Math.min(5000, deadline - this.now()), "get-query");
161
+ const ordered = [...messages].sort((a, b) => slackMicros(a.ts) < slackMicros(b.ts) ? -1 : 1);
162
+ const more = r.json.has_more === true || (typeof cursor === "string" && cursor.length > 0);
163
+ if (more && (!messages.length || slackMicros(ordered[0]?.ts) <= lower)) {
164
+ this.state = "incomplete";
165
+ this.reason = "history-page-no-progress";
166
+ return "done";
167
+ }
168
+ // The page is valid; the flag describes unreachable older history. Retain that
169
+ // qualification with the next durable page boundary rather than stalling forever.
170
+ if (r.json.is_limited === true)
171
+ c.historyLimited = true;
172
+ for (const message of ordered) {
102
173
  if (this.stopped)
103
- return;
104
- if (!r.ok) {
105
- const known = ["missing_scope", "not_in_channel", "channel_not_found", "invalid_auth", "token_revoked"];
106
- this.reason = r.status === 429 ? "rate-limited" : known.includes(r.error ?? "") ? r.error : "history-api-unavailable";
107
- const retrySeconds = r.retryAfterSeconds ?? (r.status === 0 || r.status >= 500 ? 5 : 300);
108
- this.save({ ...c, nextRetryAt: this.now() + retrySeconds * 1000 });
109
- this.state = "backoff";
110
- return;
111
- }
112
- const messages = r.json.messages;
113
- const cursor = r.json.response_metadata?.next_cursor;
114
- if (!Array.isArray(messages) || (r.json.has_more !== undefined && typeof r.json.has_more !== "boolean") ||
115
- (r.json.has_more === undefined && cursor === undefined) ||
116
- (cursor !== undefined && typeof cursor !== "string") || messages.length > 25 ||
117
- messages.some(m => !m || typeof m !== "object" || slackMicros(m.ts) === null ||
118
- slackMicros(m.ts) < lower || slackMicros(m.ts) >= latest)) {
174
+ return "done";
175
+ if (this.now() >= budget.deadline || budget.entries >= 100) {
119
176
  this.state = "incomplete";
120
- this.reason = "invalid-history-page";
121
- return;
177
+ this.reason = "pass-budget";
178
+ return "done";
122
179
  }
123
- const ordered = [...messages].sort((a, b) => slackMicros(a.ts) < slackMicros(b.ts) ? -1 : 1);
124
- const more = r.json.has_more === true || (typeof cursor === "string" && cursor.length > 0);
125
- if (more && (!messages.length || slackMicros(ordered[0]?.ts) <= lower)) {
180
+ budget.entries++;
181
+ const ev = { ...message, channel: this.opts.channel, recoveredAfterGap: true };
182
+ // Broadcast replies are channel history too; preserve their thread routing.
183
+ if (ev.thread_ts && ev.thread_ts !== ev.ts && ev.subtype !== "thread_broadcast")
184
+ continue;
185
+ // In a channel this recovery newly covers, a broadcast reply lands late and never answers a decision, like a thread
186
+ // reply. The configured default channel keeps its established broadcast behaviour.
187
+ if (this.opts.seed === "adoption" && ev.thread_ts && ev.thread_ts !== ev.ts)
188
+ ev.recoveredThreadReply = true;
189
+ if (!ingestDecision(ev).ingest)
190
+ continue;
191
+ const landed = await this.opts.router.route(ev, 0, () => !this.stopped);
192
+ if (this.stopped)
193
+ return "done";
194
+ if (landed.reason === "inflight" || landed.reason === "inactive") {
126
195
  this.state = "incomplete";
127
- this.reason = "history-page-no-progress";
128
- return;
196
+ this.reason = "landing-in-progress";
197
+ return "done";
129
198
  }
130
- // The page is valid; the flag describes unreachable older history. Retain that
131
- // qualification with the next durable page boundary rather than stalling forever.
132
- if (r.json.is_limited === true)
133
- c.historyLimited = true;
134
- for (const message of ordered) {
135
- if (this.stopped)
136
- return;
137
- if (this.now() >= deadline || entries >= 100) {
138
- this.state = "incomplete";
139
- this.reason = "pass-budget";
140
- return;
141
- }
142
- entries++;
143
- const ev = { ...message, channel: this.opts.channel, recoveredAfterGap: true };
144
- // Broadcast replies are channel history too; preserve their thread routing.
145
- if (ev.thread_ts && ev.thread_ts !== ev.ts && ev.subtype !== "thread_broadcast")
146
- continue;
147
- if (!ingestDecision(ev).ingest)
148
- continue;
149
- const landed = await this.opts.router.route(ev, 0, () => !this.stopped);
150
- if (this.stopped)
151
- return;
152
- if (landed.reason === "inflight" || landed.reason === "inactive") {
153
- this.state = "incomplete";
154
- this.reason = "landing-in-progress";
155
- return;
156
- }
157
- if (landed.disposition === "accepted")
158
- this.accepted++;
159
- if (landed.disposition === "dead-lettered")
160
- this.deadLettered++;
161
- }
162
- if (!more) {
163
- this.save({ ...c, coveredThrough: c.pending.upper, pending: undefined, nextRetryAt: undefined });
164
- this.state = "scanned";
165
- return;
166
- }
167
- this.save({ ...c, pending: { upper: c.pending.upper, nextLatest: ordered[0].ts }, nextRetryAt: undefined });
168
- if (entries >= 100)
169
- break;
199
+ if (landed.disposition === "accepted")
200
+ this.accepted++;
201
+ if (landed.disposition === "dead-lettered")
202
+ this.deadLettered++;
170
203
  }
171
- if (!this.stopped) {
172
- this.state = "incomplete";
173
- this.reason = "pass-budget";
204
+ if (!more) {
205
+ this.save({ ...c, coveredThrough: c.pending.upper, pending: undefined, nextRetryAt: undefined, rateLimited: undefined });
206
+ this.state = "scanned";
207
+ return "done";
174
208
  }
209
+ this.save({ ...c, pending: { upper: c.pending.upper, nextLatest: ordered[0].ts }, nextRetryAt: undefined, rateLimited: undefined });
210
+ // More history waits for this pass's next turn, or the next pass.
211
+ this.state = "incomplete";
212
+ this.reason = "pass-budget";
213
+ return "more";
175
214
  }
176
215
  }
177
216
  //# sourceMappingURL=channel-recovery.js.map