@openrig/cli 0.6.14 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (778) hide show
  1. package/README.md +10 -9
  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 +11 -4
  5. package/daemon/assets/plugins/openrig-core/hooks/codex.json +6 -6
  6. package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +13 -1
  7. package/daemon/assets/plugins/openrig-core/hooks/scripts/codex-hook-trust.cjs +49 -0
  8. package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +26 -5
  9. package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/SKILL.md +9 -2
  10. package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +3 -2
  11. package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +24 -0
  12. package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +2 -2
  13. package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +28 -18
  14. package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +10 -4
  15. package/daemon/assets/skills/rigs/SKILL.md +24 -5
  16. package/daemon/context-packs/help/manifest.yaml +1 -1
  17. package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
  18. package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +4 -6
  19. package/daemon/context-packs/reference/getting-started.md +87 -21
  20. package/daemon/context-packs/reference/manifest.yaml +1 -1
  21. package/daemon/context-packs/reference/rig-spec.md +1 -1
  22. package/daemon/context-packs/reference/whats-new.md +123 -68
  23. package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
  24. package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
  25. package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
  26. package/daemon/context-packs/skills/claude-compaction-restore/SKILL.md +9 -2
  27. package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
  28. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
  29. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
  30. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
  31. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
  32. package/daemon/context-packs/skills/core/messaging-the-human/SKILL.md +24 -0
  33. package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
  34. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
  35. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
  36. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
  37. package/daemon/context-packs/skills/core/openrig-skills/SKILL.md +2 -2
  38. package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
  39. package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
  40. package/daemon/context-packs/skills/core/openrig-upgrade/SKILL.md +11 -5
  41. package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
  42. package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
  43. package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
  44. package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
  45. package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
  46. package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
  47. package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
  48. package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
  49. package/daemon/context-packs/skills/forming-an-openrig-mental-model/SKILL.md +3 -2
  50. package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
  51. package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
  52. package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
  53. package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
  54. package/daemon/context-packs/skills/openrig-user/SKILL.md +28 -18
  55. package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
  56. package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
  57. package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
  58. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
  59. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
  60. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
  61. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
  62. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
  63. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
  64. package/daemon/context-packs/skills/pods/development-team/SKILL.md +2 -0
  65. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +3 -1
  66. package/daemon/context-packs/skills/pods/development-team/references/refactoring.md +11 -0
  67. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
  68. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
  69. package/daemon/context-packs/skills/pods/review-team/SKILL.md +46 -96
  70. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
  71. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
  72. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
  73. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
  74. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
  75. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
  76. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
  77. package/daemon/context-packs/skills/process/verification-before-completion/SKILL.md +17 -80
  78. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +5 -3
  79. package/daemon/context-packs/skills/process/verification-before-completion/references/performance-claims.md +12 -0
  80. package/daemon/context-packs/skills/queue-handoff/SKILL.md +10 -4
  81. package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
  82. package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
  83. package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
  84. package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
  85. package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
  86. package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
  87. package/daemon/context-packs/world-example/manifest.yaml +1 -1
  88. package/daemon/context-packs/world-public/manifest.yaml +1 -1
  89. package/daemon/dist/adapters/claude-code-adapter.d.ts +6 -2
  90. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  91. package/daemon/dist/adapters/claude-code-adapter.js +33 -6
  92. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  93. package/daemon/dist/adapters/codex-resume.d.ts.map +1 -1
  94. package/daemon/dist/adapters/codex-resume.js +2 -7
  95. package/daemon/dist/adapters/codex-resume.js.map +1 -1
  96. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +68 -2
  97. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  98. package/daemon/dist/adapters/codex-runtime-adapter.js +371 -60
  99. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  100. package/daemon/dist/adapters/compose-services-adapter.d.ts +16 -0
  101. package/daemon/dist/adapters/compose-services-adapter.d.ts.map +1 -1
  102. package/daemon/dist/adapters/compose-services-adapter.js +52 -9
  103. package/daemon/dist/adapters/compose-services-adapter.js.map +1 -1
  104. package/daemon/dist/adapters/kernel-authority.d.ts.map +1 -1
  105. package/daemon/dist/adapters/kernel-authority.js +9 -5
  106. package/daemon/dist/adapters/kernel-authority.js.map +1 -1
  107. package/daemon/dist/adapters/pi-runner.d.ts +2 -0
  108. package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
  109. package/daemon/dist/adapters/pi-runner.js +5 -0
  110. package/daemon/dist/adapters/pi-runner.js.map +1 -1
  111. package/daemon/dist/adapters/runtime-probe-exec.d.ts +11 -0
  112. package/daemon/dist/adapters/runtime-probe-exec.d.ts.map +1 -0
  113. package/daemon/dist/adapters/runtime-probe-exec.js +25 -0
  114. package/daemon/dist/adapters/runtime-probe-exec.js.map +1 -0
  115. package/daemon/dist/adapters/stub-runner.d.ts.map +1 -1
  116. package/daemon/dist/adapters/stub-runner.js +2 -0
  117. package/daemon/dist/adapters/stub-runner.js.map +1 -1
  118. package/daemon/dist/adapters/tmux.d.ts +21 -1
  119. package/daemon/dist/adapters/tmux.d.ts.map +1 -1
  120. package/daemon/dist/adapters/tmux.js +100 -13
  121. package/daemon/dist/adapters/tmux.js.map +1 -1
  122. package/daemon/dist/build-info.js +3 -3
  123. package/daemon/dist/db/all-migrations.d.ts.map +1 -1
  124. package/daemon/dist/db/all-migrations.js +12 -0
  125. package/daemon/dist/db/all-migrations.js.map +1 -1
  126. package/daemon/dist/db/migrations/116_queue_item_wake_input_box.d.ts +3 -0
  127. package/daemon/dist/db/migrations/116_queue_item_wake_input_box.d.ts.map +1 -0
  128. package/daemon/dist/db/migrations/116_queue_item_wake_input_box.js +8 -0
  129. package/daemon/dist/db/migrations/116_queue_item_wake_input_box.js.map +1 -0
  130. package/daemon/dist/db/migrations/118_human_quiet_windows.d.ts +3 -0
  131. package/daemon/dist/db/migrations/118_human_quiet_windows.d.ts.map +1 -0
  132. package/daemon/dist/db/migrations/118_human_quiet_windows.js +30 -0
  133. package/daemon/dist/db/migrations/118_human_quiet_windows.js.map +1 -0
  134. package/daemon/dist/db/migrations/119_seat_identity_pane_pid.d.ts +3 -0
  135. package/daemon/dist/db/migrations/119_seat_identity_pane_pid.d.ts.map +1 -0
  136. package/daemon/dist/db/migrations/119_seat_identity_pane_pid.js +7 -0
  137. package/daemon/dist/db/migrations/119_seat_identity_pane_pid.js.map +1 -0
  138. package/daemon/dist/db/migrations/121_rig_startup_layers.d.ts +13 -0
  139. package/daemon/dist/db/migrations/121_rig_startup_layers.d.ts.map +1 -0
  140. package/daemon/dist/db/migrations/121_rig_startup_layers.js +17 -0
  141. package/daemon/dist/db/migrations/121_rig_startup_layers.js.map +1 -0
  142. package/daemon/dist/db/migrations/122_human_operating_modes.d.ts +3 -0
  143. package/daemon/dist/db/migrations/122_human_operating_modes.d.ts.map +1 -0
  144. package/daemon/dist/db/migrations/122_human_operating_modes.js +55 -0
  145. package/daemon/dist/db/migrations/122_human_operating_modes.js.map +1 -0
  146. package/daemon/dist/db/migrations/123_queue_delegated_decision.d.ts +3 -0
  147. package/daemon/dist/db/migrations/123_queue_delegated_decision.d.ts.map +1 -0
  148. package/daemon/dist/db/migrations/123_queue_delegated_decision.js +10 -0
  149. package/daemon/dist/db/migrations/123_queue_delegated_decision.js.map +1 -0
  150. package/daemon/dist/domain/active-occupant.d.ts +5 -3
  151. package/daemon/dist/domain/active-occupant.d.ts.map +1 -1
  152. package/daemon/dist/domain/active-occupant.js +2 -2
  153. package/daemon/dist/domain/active-occupant.js.map +1 -1
  154. package/daemon/dist/domain/activity-taxonomy.d.ts +16 -1
  155. package/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -1
  156. package/daemon/dist/domain/activity-taxonomy.js +21 -0
  157. package/daemon/dist/domain/activity-taxonomy.js.map +1 -1
  158. package/daemon/dist/domain/agent-activity-store.d.ts +20 -0
  159. package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -1
  160. package/daemon/dist/domain/agent-activity-store.js +41 -5
  161. package/daemon/dist/domain/agent-activity-store.js.map +1 -1
  162. package/daemon/dist/domain/agent-images/evidence-guard.js +3 -3
  163. package/daemon/dist/domain/agent-images/evidence-guard.js.map +1 -1
  164. package/daemon/dist/domain/agent-images/resume-token-discovery.d.ts.map +1 -1
  165. package/daemon/dist/domain/agent-images/resume-token-discovery.js +2 -10
  166. package/daemon/dist/domain/agent-images/resume-token-discovery.js.map +1 -1
  167. package/daemon/dist/domain/ask-service.d.ts +1 -0
  168. package/daemon/dist/domain/ask-service.d.ts.map +1 -1
  169. package/daemon/dist/domain/ask-service.js +7 -1
  170. package/daemon/dist/domain/ask-service.js.map +1 -1
  171. package/daemon/dist/domain/bootstrap-orchestrator.d.ts +2 -0
  172. package/daemon/dist/domain/bootstrap-orchestrator.d.ts.map +1 -1
  173. package/daemon/dist/domain/bootstrap-orchestrator.js +5 -6
  174. package/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
  175. package/daemon/dist/domain/claim-service.d.ts +1 -1
  176. package/daemon/dist/domain/claim-service.d.ts.map +1 -1
  177. package/daemon/dist/domain/claim-service.js +7 -0
  178. package/daemon/dist/domain/claim-service.js.map +1 -1
  179. package/daemon/dist/domain/classification-sources.d.ts.map +1 -1
  180. package/daemon/dist/domain/classification-sources.js +2 -0
  181. package/daemon/dist/domain/classification-sources.js.map +1 -1
  182. package/daemon/dist/domain/claude-compaction-enforcer.d.ts +17 -4
  183. package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
  184. package/daemon/dist/domain/claude-compaction-enforcer.js +88 -24
  185. package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
  186. package/daemon/dist/domain/claude-core-plugin-env.d.ts +11 -0
  187. package/daemon/dist/domain/claude-core-plugin-env.d.ts.map +1 -1
  188. package/daemon/dist/domain/claude-core-plugin-env.js +15 -0
  189. package/daemon/dist/domain/claude-core-plugin-env.js.map +1 -1
  190. package/daemon/dist/domain/codex-core-plugin-install.d.ts +41 -0
  191. package/daemon/dist/domain/codex-core-plugin-install.d.ts.map +1 -0
  192. package/daemon/dist/domain/codex-core-plugin-install.js +126 -0
  193. package/daemon/dist/domain/codex-core-plugin-install.js.map +1 -0
  194. package/daemon/dist/domain/codex-thread-id.d.ts +23 -1
  195. package/daemon/dist/domain/codex-thread-id.d.ts.map +1 -1
  196. package/daemon/dist/domain/codex-thread-id.js +58 -17
  197. package/daemon/dist/domain/codex-thread-id.js.map +1 -1
  198. package/daemon/dist/domain/context-monitor.d.ts +13 -5
  199. package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
  200. package/daemon/dist/domain/context-monitor.js +47 -13
  201. package/daemon/dist/domain/context-monitor.js.map +1 -1
  202. package/daemon/dist/domain/context-usage-store.d.ts.map +1 -1
  203. package/daemon/dist/domain/context-usage-store.js +3 -0
  204. package/daemon/dist/domain/context-usage-store.js.map +1 -1
  205. package/daemon/dist/domain/current-work.d.ts +18 -0
  206. package/daemon/dist/domain/current-work.d.ts.map +1 -1
  207. package/daemon/dist/domain/current-work.js +17 -3
  208. package/daemon/dist/domain/current-work.js.map +1 -1
  209. package/daemon/dist/domain/draft-aware-delivery.d.ts +7 -7
  210. package/daemon/dist/domain/draft-aware-delivery.d.ts.map +1 -1
  211. package/daemon/dist/domain/draft-aware-delivery.js +61 -82
  212. package/daemon/dist/domain/draft-aware-delivery.js.map +1 -1
  213. package/daemon/dist/domain/execution-view.d.ts.map +1 -1
  214. package/daemon/dist/domain/execution-view.js +2 -1
  215. package/daemon/dist/domain/execution-view.js.map +1 -1
  216. package/daemon/dist/domain/existing-rig-restore.d.ts +110 -0
  217. package/daemon/dist/domain/existing-rig-restore.d.ts.map +1 -0
  218. package/daemon/dist/domain/existing-rig-restore.js +254 -0
  219. package/daemon/dist/domain/existing-rig-restore.js.map +1 -0
  220. package/daemon/dist/domain/fresh-occupant-relation.d.ts.map +1 -1
  221. package/daemon/dist/domain/fresh-occupant-relation.js +9 -2
  222. package/daemon/dist/domain/fresh-occupant-relation.js.map +1 -1
  223. package/daemon/dist/domain/gateway/channel-operations.d.ts +3 -4
  224. package/daemon/dist/domain/gateway/channel-operations.d.ts.map +1 -1
  225. package/daemon/dist/domain/gateway/channel-operations.js.map +1 -1
  226. package/daemon/dist/domain/gateway/connections-projection.d.ts +0 -5
  227. package/daemon/dist/domain/gateway/connections-projection.d.ts.map +1 -1
  228. package/daemon/dist/domain/gateway/connections-projection.js +3 -46
  229. package/daemon/dist/domain/gateway/connections-projection.js.map +1 -1
  230. package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts +11 -1
  231. package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts.map +1 -1
  232. package/daemon/dist/domain/gateway/delivery-rules-engine.js +12 -2
  233. package/daemon/dist/domain/gateway/delivery-rules-engine.js.map +1 -1
  234. package/daemon/dist/domain/gateway/dispatch-buffer.d.ts +4 -0
  235. package/daemon/dist/domain/gateway/dispatch-buffer.d.ts.map +1 -1
  236. package/daemon/dist/domain/gateway/dispatch-buffer.js +18 -0
  237. package/daemon/dist/domain/gateway/dispatch-buffer.js.map +1 -1
  238. package/daemon/dist/domain/gateway/human-mode-account.d.ts +61 -0
  239. package/daemon/dist/domain/gateway/human-mode-account.d.ts.map +1 -0
  240. package/daemon/dist/domain/gateway/human-mode-account.js +112 -0
  241. package/daemon/dist/domain/gateway/human-mode-account.js.map +1 -0
  242. package/daemon/dist/domain/gateway/human-operating-modes.d.ts +171 -0
  243. package/daemon/dist/domain/gateway/human-operating-modes.d.ts.map +1 -0
  244. package/daemon/dist/domain/gateway/human-operating-modes.js +422 -0
  245. package/daemon/dist/domain/gateway/human-operating-modes.js.map +1 -0
  246. package/daemon/dist/domain/gateway/human-quiet-windows.d.ts +121 -0
  247. package/daemon/dist/domain/gateway/human-quiet-windows.d.ts.map +1 -0
  248. package/daemon/dist/domain/gateway/human-quiet-windows.js +217 -0
  249. package/daemon/dist/domain/gateway/human-quiet-windows.js.map +1 -0
  250. package/daemon/dist/domain/gateway/human-registry.d.ts +23 -2
  251. package/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
  252. package/daemon/dist/domain/gateway/human-registry.js +67 -5
  253. package/daemon/dist/domain/gateway/human-registry.js.map +1 -1
  254. package/daemon/dist/domain/gateway/operator-delivery-engine.d.ts.map +1 -1
  255. package/daemon/dist/domain/gateway/operator-delivery-engine.js +9 -0
  256. package/daemon/dist/domain/gateway/operator-delivery-engine.js.map +1 -1
  257. package/daemon/dist/domain/gateway/slack/inbound.d.ts +10 -2
  258. package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
  259. package/daemon/dist/domain/gateway/slack/inbound.js +24 -2
  260. package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
  261. package/daemon/dist/domain/gateway/slack/message.d.ts +1 -0
  262. package/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -1
  263. package/daemon/dist/domain/gateway/slack/message.js +5 -1
  264. package/daemon/dist/domain/gateway/slack/message.js.map +1 -1
  265. package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +9 -3
  266. package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -1
  267. package/daemon/dist/domain/gateway/slack/outbound-driver.js +40 -6
  268. package/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -1
  269. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +19 -1
  270. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
  271. package/daemon/dist/domain/gateway/slack/slack-delivery.js +128 -41
  272. package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
  273. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +3 -2
  274. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  275. package/daemon/dist/domain/gateway/slack/slack-subsystem.js +268 -50
  276. package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  277. package/daemon/dist/domain/health-passive-ceremony.d.ts +4 -0
  278. package/daemon/dist/domain/health-passive-ceremony.d.ts.map +1 -1
  279. package/daemon/dist/domain/health-passive-ceremony.js +34 -4
  280. package/daemon/dist/domain/health-passive-ceremony.js.map +1 -1
  281. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +3 -1
  282. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -1
  283. package/daemon/dist/domain/hosts/hosts-registry-reader.js +9 -9
  284. package/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -1
  285. package/daemon/dist/domain/hosts/learned-host-bindings.d.ts +28 -0
  286. package/daemon/dist/domain/hosts/learned-host-bindings.d.ts.map +1 -0
  287. package/daemon/dist/domain/hosts/learned-host-bindings.js +77 -0
  288. package/daemon/dist/domain/hosts/learned-host-bindings.js.map +1 -0
  289. package/daemon/dist/domain/hot-potato-enforcer.d.ts +7 -5
  290. package/daemon/dist/domain/hot-potato-enforcer.d.ts.map +1 -1
  291. package/daemon/dist/domain/hot-potato-enforcer.js +19 -10
  292. package/daemon/dist/domain/hot-potato-enforcer.js.map +1 -1
  293. package/daemon/dist/domain/human-questions.d.ts +8 -1
  294. package/daemon/dist/domain/human-questions.d.ts.map +1 -1
  295. package/daemon/dist/domain/human-questions.js.map +1 -1
  296. package/daemon/dist/domain/kernel-boot-tracker.d.ts +17 -1
  297. package/daemon/dist/domain/kernel-boot-tracker.d.ts.map +1 -1
  298. package/daemon/dist/domain/kernel-boot-tracker.js +44 -3
  299. package/daemon/dist/domain/kernel-boot-tracker.js.map +1 -1
  300. package/daemon/dist/domain/kernel-boot.d.ts +21 -0
  301. package/daemon/dist/domain/kernel-boot.d.ts.map +1 -1
  302. package/daemon/dist/domain/kernel-boot.js +57 -2
  303. package/daemon/dist/domain/kernel-boot.js.map +1 -1
  304. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts +2 -1
  305. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts.map +1 -1
  306. package/daemon/dist/domain/model-divergence/current-generation-record.js +8 -3
  307. package/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -1
  308. package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
  309. package/daemon/dist/domain/native-process-lineage.js +43 -15
  310. package/daemon/dist/domain/native-process-lineage.js.map +1 -1
  311. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  312. package/daemon/dist/domain/node-inventory.js +26 -12
  313. package/daemon/dist/domain/node-inventory.js.map +1 -1
  314. package/daemon/dist/domain/node-launcher.d.ts +5 -3
  315. package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
  316. package/daemon/dist/domain/node-launcher.js +29 -25
  317. package/daemon/dist/domain/node-launcher.js.map +1 -1
  318. package/daemon/dist/domain/outbox-handler.d.ts +3 -5
  319. package/daemon/dist/domain/outbox-handler.d.ts.map +1 -1
  320. package/daemon/dist/domain/outbox-handler.js +9 -19
  321. package/daemon/dist/domain/outbox-handler.js.map +1 -1
  322. package/daemon/dist/domain/park-wake-text.d.ts +11 -0
  323. package/daemon/dist/domain/park-wake-text.d.ts.map +1 -0
  324. package/daemon/dist/domain/park-wake-text.js +26 -0
  325. package/daemon/dist/domain/park-wake-text.js.map +1 -0
  326. package/daemon/dist/domain/plugin-vendor-service.d.ts +4 -0
  327. package/daemon/dist/domain/plugin-vendor-service.d.ts.map +1 -1
  328. package/daemon/dist/domain/plugin-vendor-service.js +29 -6
  329. package/daemon/dist/domain/plugin-vendor-service.js.map +1 -1
  330. package/daemon/dist/domain/policies/delivery-digest-flush.d.ts +1 -0
  331. package/daemon/dist/domain/policies/delivery-digest-flush.d.ts.map +1 -1
  332. package/daemon/dist/domain/policies/delivery-digest-flush.js +25 -4
  333. package/daemon/dist/domain/policies/delivery-digest-flush.js.map +1 -1
  334. package/daemon/dist/domain/policies/mode-scheduled-end.d.ts +37 -0
  335. package/daemon/dist/domain/policies/mode-scheduled-end.d.ts.map +1 -0
  336. package/daemon/dist/domain/policies/mode-scheduled-end.js +161 -0
  337. package/daemon/dist/domain/policies/mode-scheduled-end.js.map +1 -0
  338. package/daemon/dist/domain/policies/parked-owner-consumer.d.ts +11 -7
  339. package/daemon/dist/domain/policies/parked-owner-consumer.d.ts.map +1 -1
  340. package/daemon/dist/domain/policies/parked-owner-consumer.js +82 -113
  341. package/daemon/dist/domain/policies/parked-owner-consumer.js.map +1 -1
  342. package/daemon/dist/domain/policies/quiet-release.d.ts +109 -0
  343. package/daemon/dist/domain/policies/quiet-release.d.ts.map +1 -0
  344. package/daemon/dist/domain/policies/quiet-release.js +213 -0
  345. package/daemon/dist/domain/policies/quiet-release.js.map +1 -0
  346. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  347. package/daemon/dist/domain/profile-resolver.js +8 -3
  348. package/daemon/dist/domain/profile-resolver.js.map +1 -1
  349. package/daemon/dist/domain/proof/source-watch.js +2 -2
  350. package/daemon/dist/domain/proof/source-watch.js.map +1 -1
  351. package/daemon/dist/domain/queue-destination-check.d.ts +6 -0
  352. package/daemon/dist/domain/queue-destination-check.d.ts.map +1 -0
  353. package/daemon/dist/domain/queue-destination-check.js +35 -0
  354. package/daemon/dist/domain/queue-destination-check.js.map +1 -0
  355. package/daemon/dist/domain/queue-owner.d.ts.map +1 -1
  356. package/daemon/dist/domain/queue-owner.js +2 -1
  357. package/daemon/dist/domain/queue-owner.js.map +1 -1
  358. package/daemon/dist/domain/queue-recovery.d.ts +1 -1
  359. package/daemon/dist/domain/queue-recovery.d.ts.map +1 -1
  360. package/daemon/dist/domain/queue-recovery.js +3 -2
  361. package/daemon/dist/domain/queue-recovery.js.map +1 -1
  362. package/daemon/dist/domain/queue-repository.d.ts +108 -67
  363. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  364. package/daemon/dist/domain/queue-repository.js +316 -140
  365. package/daemon/dist/domain/queue-repository.js.map +1 -1
  366. package/daemon/dist/domain/queue-stuck-sweep.d.ts +13 -1
  367. package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
  368. package/daemon/dist/domain/queue-stuck-sweep.js +95 -13
  369. package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
  370. package/daemon/dist/domain/queue-transition-log.d.ts +5 -0
  371. package/daemon/dist/domain/queue-transition-log.d.ts.map +1 -1
  372. package/daemon/dist/domain/queue-transition-log.js +25 -8
  373. package/daemon/dist/domain/queue-transition-log.js.map +1 -1
  374. package/daemon/dist/domain/queue-wake-ladder.d.ts +2 -0
  375. package/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -1
  376. package/daemon/dist/domain/queue-wake-ladder.js +94 -11
  377. package/daemon/dist/domain/queue-wake-ladder.js.map +1 -1
  378. package/daemon/dist/domain/quiet-hold-custody.d.ts +24 -0
  379. package/daemon/dist/domain/quiet-hold-custody.d.ts.map +1 -0
  380. package/daemon/dist/domain/quiet-hold-custody.js +85 -0
  381. package/daemon/dist/domain/quiet-hold-custody.js.map +1 -0
  382. package/daemon/dist/domain/rehydrate-eligibility.d.ts +12 -1
  383. package/daemon/dist/domain/rehydrate-eligibility.d.ts.map +1 -1
  384. package/daemon/dist/domain/rehydrate-eligibility.js +47 -9
  385. package/daemon/dist/domain/rehydrate-eligibility.js.map +1 -1
  386. package/daemon/dist/domain/restore-orchestrator.d.ts +11 -0
  387. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  388. package/daemon/dist/domain/restore-orchestrator.js +144 -15
  389. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  390. package/daemon/dist/domain/restore-plan-preview.d.ts +3 -1
  391. package/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
  392. package/daemon/dist/domain/restore-plan-preview.js +30 -13
  393. package/daemon/dist/domain/restore-plan-preview.js.map +1 -1
  394. package/daemon/dist/domain/review/gather.d.ts.map +1 -1
  395. package/daemon/dist/domain/review/gather.js +8 -5
  396. package/daemon/dist/domain/review/gather.js.map +1 -1
  397. package/daemon/dist/domain/rig-mode/operating-posture.d.ts.map +1 -1
  398. package/daemon/dist/domain/rig-mode/operating-posture.js +3 -1
  399. package/daemon/dist/domain/rig-mode/operating-posture.js.map +1 -1
  400. package/daemon/dist/domain/rig-repository.d.ts +11 -1
  401. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  402. package/daemon/dist/domain/rig-repository.js +27 -3
  403. package/daemon/dist/domain/rig-repository.js.map +1 -1
  404. package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
  405. package/daemon/dist/domain/rig-teardown.js +31 -4
  406. package/daemon/dist/domain/rig-teardown.js.map +1 -1
  407. package/daemon/dist/domain/rigspec-instantiator.d.ts +9 -0
  408. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  409. package/daemon/dist/domain/rigspec-instantiator.js +59 -28
  410. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  411. package/daemon/dist/domain/rigspec-schema.d.ts +5 -0
  412. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  413. package/daemon/dist/domain/rigspec-schema.js +30 -0
  414. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  415. package/daemon/dist/domain/runtime-adapter.d.ts +27 -2
  416. package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
  417. package/daemon/dist/domain/runtime-adapter.js.map +1 -1
  418. package/daemon/dist/domain/seat-activity-service.d.ts +18 -3
  419. package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
  420. package/daemon/dist/domain/seat-activity-service.js +124 -57
  421. package/daemon/dist/domain/seat-activity-service.js.map +1 -1
  422. package/daemon/dist/domain/seat-attention-reconciler.d.ts +8 -1
  423. package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
  424. package/daemon/dist/domain/seat-attention-reconciler.js +3 -1
  425. package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
  426. package/daemon/dist/domain/seat-delivery-guard.d.ts.map +1 -1
  427. package/daemon/dist/domain/seat-delivery-guard.js +21 -5
  428. package/daemon/dist/domain/seat-delivery-guard.js.map +1 -1
  429. package/daemon/dist/domain/seat-handover-service.d.ts +2 -2
  430. package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
  431. package/daemon/dist/domain/seat-handover-service.js +28 -2
  432. package/daemon/dist/domain/seat-handover-service.js.map +1 -1
  433. package/daemon/dist/domain/seat-identity-reconciler.js +1 -1
  434. package/daemon/dist/domain/seat-identity-reconciler.js.map +1 -1
  435. package/daemon/dist/domain/seat-identity-store.d.ts.map +1 -1
  436. package/daemon/dist/domain/seat-identity-store.js +5 -2
  437. package/daemon/dist/domain/seat-identity-store.js.map +1 -1
  438. package/daemon/dist/domain/seat-launch-environment.d.ts.map +1 -1
  439. package/daemon/dist/domain/seat-launch-environment.js +17 -1
  440. package/daemon/dist/domain/seat-launch-environment.js.map +1 -1
  441. package/daemon/dist/domain/seat-lifecycle-service.d.ts +4 -0
  442. package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
  443. package/daemon/dist/domain/seat-restart-in-place.d.ts +33 -14
  444. package/daemon/dist/domain/seat-restart-in-place.d.ts.map +1 -1
  445. package/daemon/dist/domain/seat-restart-in-place.js +102 -30
  446. package/daemon/dist/domain/seat-restart-in-place.js.map +1 -1
  447. package/daemon/dist/domain/self-attach-service.d.ts +3 -2
  448. package/daemon/dist/domain/self-attach-service.d.ts.map +1 -1
  449. package/daemon/dist/domain/self-attach-service.js +18 -1
  450. package/daemon/dist/domain/self-attach-service.js.map +1 -1
  451. package/daemon/dist/domain/services-readiness.d.ts.map +1 -1
  452. package/daemon/dist/domain/services-readiness.js +14 -3
  453. package/daemon/dist/domain/services-readiness.js.map +1 -1
  454. package/daemon/dist/domain/session-registry.d.ts +45 -0
  455. package/daemon/dist/domain/session-registry.d.ts.map +1 -1
  456. package/daemon/dist/domain/session-registry.js +124 -0
  457. package/daemon/dist/domain/session-registry.js.map +1 -1
  458. package/daemon/dist/domain/session-transport.d.ts +24 -6
  459. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  460. package/daemon/dist/domain/session-transport.js +58 -41
  461. package/daemon/dist/domain/session-transport.js.map +1 -1
  462. package/daemon/dist/domain/skill-discovery.d.ts +7 -1
  463. package/daemon/dist/domain/skill-discovery.d.ts.map +1 -1
  464. package/daemon/dist/domain/skill-discovery.js +41 -7
  465. package/daemon/dist/domain/skill-discovery.js.map +1 -1
  466. package/daemon/dist/domain/snapshot-repository.d.ts +1 -0
  467. package/daemon/dist/domain/snapshot-repository.d.ts.map +1 -1
  468. package/daemon/dist/domain/snapshot-repository.js +23 -10
  469. package/daemon/dist/domain/snapshot-repository.js.map +1 -1
  470. package/daemon/dist/domain/startup-orchestrator.d.ts +21 -3
  471. package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
  472. package/daemon/dist/domain/startup-orchestrator.js +66 -16
  473. package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
  474. package/daemon/dist/domain/startup-submission-evidence.d.ts +4 -11
  475. package/daemon/dist/domain/startup-submission-evidence.d.ts.map +1 -1
  476. package/daemon/dist/domain/startup-submission-evidence.js +11 -17
  477. package/daemon/dist/domain/startup-submission-evidence.js.map +1 -1
  478. package/daemon/dist/domain/successor-session-launcher.d.ts +2 -1
  479. package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
  480. package/daemon/dist/domain/successor-session-launcher.js +3 -1
  481. package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  482. package/daemon/dist/domain/terminal/herdr-adapter.d.ts +1 -1
  483. package/daemon/dist/domain/terminal/herdr-adapter.d.ts.map +1 -1
  484. package/daemon/dist/domain/terminal/herdr-adapter.js +22 -4
  485. package/daemon/dist/domain/terminal/herdr-adapter.js.map +1 -1
  486. package/daemon/dist/domain/types.d.ts +15 -4
  487. package/daemon/dist/domain/types.d.ts.map +1 -1
  488. package/daemon/dist/domain/types.js.map +1 -1
  489. package/daemon/dist/domain/user-settings/settings-browser.d.ts.map +1 -1
  490. package/daemon/dist/domain/user-settings/settings-browser.js +2 -0
  491. package/daemon/dist/domain/user-settings/settings-browser.js.map +1 -1
  492. package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  493. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  494. package/daemon/dist/domain/user-settings/settings-store.js +33 -7
  495. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  496. package/daemon/dist/domain/watchdog-delivery.d.ts +3 -23
  497. package/daemon/dist/domain/watchdog-delivery.d.ts.map +1 -1
  498. package/daemon/dist/domain/watchdog-delivery.js +12 -89
  499. package/daemon/dist/domain/watchdog-delivery.js.map +1 -1
  500. package/daemon/dist/domain/watchdog-history-log.d.ts +5 -2
  501. package/daemon/dist/domain/watchdog-history-log.d.ts.map +1 -1
  502. package/daemon/dist/domain/watchdog-history-log.js.map +1 -1
  503. package/daemon/dist/domain/watchdog-jobs-repository.d.ts +2 -2
  504. package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
  505. package/daemon/dist/domain/watchdog-jobs-repository.js +4 -0
  506. package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
  507. package/daemon/dist/domain/watchdog-policy-engine.d.ts +16 -24
  508. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  509. package/daemon/dist/domain/watchdog-policy-engine.js +44 -43
  510. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  511. package/daemon/dist/domain/whoami-service.d.ts +2 -0
  512. package/daemon/dist/domain/whoami-service.d.ts.map +1 -1
  513. package/daemon/dist/domain/whoami-service.js +23 -6
  514. package/daemon/dist/domain/whoami-service.js.map +1 -1
  515. package/daemon/dist/domain/workflow-boot-sweep.d.ts +2 -1
  516. package/daemon/dist/domain/workflow-boot-sweep.d.ts.map +1 -1
  517. package/daemon/dist/domain/workflow-boot-sweep.js +11 -5
  518. package/daemon/dist/domain/workflow-boot-sweep.js.map +1 -1
  519. package/daemon/dist/domain/workflow-exception-escalation.d.ts.map +1 -1
  520. package/daemon/dist/domain/workflow-exception-escalation.js +2 -1
  521. package/daemon/dist/domain/workflow-exception-escalation.js.map +1 -1
  522. package/daemon/dist/domain/workflow-projector.d.ts.map +1 -1
  523. package/daemon/dist/domain/workflow-projector.js +5 -2
  524. package/daemon/dist/domain/workflow-projector.js.map +1 -1
  525. package/daemon/dist/domain/workflow-role-context.js +2 -2
  526. package/daemon/dist/domain/workflow-role-context.js.map +1 -1
  527. package/daemon/dist/domain/workflow-runtime.d.ts +1 -1
  528. package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
  529. package/daemon/dist/domain/workflow-runtime.js +2 -0
  530. package/daemon/dist/domain/workflow-runtime.js.map +1 -1
  531. package/daemon/dist/routes/activity.d.ts +13 -1
  532. package/daemon/dist/routes/activity.d.ts.map +1 -1
  533. package/daemon/dist/routes/activity.js +67 -2
  534. package/daemon/dist/routes/activity.js.map +1 -1
  535. package/daemon/dist/routes/agent-images.d.ts.map +1 -1
  536. package/daemon/dist/routes/agent-images.js +2 -0
  537. package/daemon/dist/routes/agent-images.js.map +1 -1
  538. package/daemon/dist/routes/compaction.d.ts.map +1 -1
  539. package/daemon/dist/routes/compaction.js +7 -2
  540. package/daemon/dist/routes/compaction.js.map +1 -1
  541. package/daemon/dist/routes/discovery.js +3 -0
  542. package/daemon/dist/routes/discovery.js.map +1 -1
  543. package/daemon/dist/routes/down.js +9 -1
  544. package/daemon/dist/routes/down.js.map +1 -1
  545. package/daemon/dist/routes/gateway.d.ts +2 -0
  546. package/daemon/dist/routes/gateway.d.ts.map +1 -1
  547. package/daemon/dist/routes/gateway.js +181 -1
  548. package/daemon/dist/routes/gateway.js.map +1 -1
  549. package/daemon/dist/routes/kernel-status.js +6 -1
  550. package/daemon/dist/routes/kernel-status.js.map +1 -1
  551. package/daemon/dist/routes/provider.d.ts.map +1 -1
  552. package/daemon/dist/routes/provider.js +0 -73
  553. package/daemon/dist/routes/provider.js.map +1 -1
  554. package/daemon/dist/routes/queue.d.ts.map +1 -1
  555. package/daemon/dist/routes/queue.js +73 -13
  556. package/daemon/dist/routes/queue.js.map +1 -1
  557. package/daemon/dist/routes/rigs.d.ts.map +1 -1
  558. package/daemon/dist/routes/rigs.js +29 -10
  559. package/daemon/dist/routes/rigs.js.map +1 -1
  560. package/daemon/dist/routes/rigspec.js +2 -3
  561. package/daemon/dist/routes/rigspec.js.map +1 -1
  562. package/daemon/dist/routes/seat.js +2 -2
  563. package/daemon/dist/routes/seat.js.map +1 -1
  564. package/daemon/dist/routes/skills.js +2 -2
  565. package/daemon/dist/routes/skills.js.map +1 -1
  566. package/daemon/dist/routes/transcripts.d.ts.map +1 -1
  567. package/daemon/dist/routes/transcripts.js +7 -3
  568. package/daemon/dist/routes/transcripts.js.map +1 -1
  569. package/daemon/dist/routes/transport.js +1 -1
  570. package/daemon/dist/routes/transport.js.map +1 -1
  571. package/daemon/dist/routes/up.js +36 -52
  572. package/daemon/dist/routes/up.js.map +1 -1
  573. package/daemon/dist/startup.d.ts.map +1 -1
  574. package/daemon/dist/startup.js +102 -60
  575. package/daemon/dist/startup.js.map +1 -1
  576. package/daemon/docs/reference/agent-state-taxonomy.md +17 -2
  577. package/daemon/docs/reference/getting-started.md +87 -21
  578. package/daemon/docs/reference/quickstart.md +33 -20
  579. package/daemon/docs/reference/refocus-channel.md +9 -3
  580. package/daemon/docs/reference/rig-spec.md +1 -1
  581. package/daemon/docs/reference/seat-delivery.md +57 -18
  582. package/daemon/docs/reference/slack-app-setup.md +49 -2
  583. package/daemon/docs/reference/whats-new.md +123 -68
  584. package/daemon/specs/agents/shared/skills/core/messaging-the-human/SKILL.md +24 -0
  585. package/daemon/specs/agents/shared/skills/core/openrig-skills/SKILL.md +2 -2
  586. package/daemon/specs/agents/shared/skills/core/openrig-upgrade/SKILL.md +11 -5
  587. package/daemon/specs/agents/shared/skills/pods/development-team/SKILL.md +2 -0
  588. package/daemon/specs/agents/shared/skills/pods/development-team/references/refactoring.md +11 -0
  589. package/daemon/specs/agents/shared/skills/pods/review-team/SKILL.md +46 -96
  590. package/daemon/specs/agents/shared/skills/process/verification-before-completion/SKILL.md +17 -80
  591. package/daemon/specs/agents/shared/skills/process/verification-before-completion/references/performance-claims.md +12 -0
  592. package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +93 -14
  593. package/dist/build-info.js +3 -3
  594. package/dist/cli-error.d.ts +4 -0
  595. package/dist/cli-error.d.ts.map +1 -1
  596. package/dist/cli-error.js +6 -0
  597. package/dist/cli-error.js.map +1 -1
  598. package/dist/commands/agent-image.d.ts.map +1 -1
  599. package/dist/commands/agent-image.js +15 -7
  600. package/dist/commands/agent-image.js.map +1 -1
  601. package/dist/commands/archive.d.ts.map +1 -1
  602. package/dist/commands/archive.js +17 -3
  603. package/dist/commands/archive.js.map +1 -1
  604. package/dist/commands/attach.d.ts.map +1 -1
  605. package/dist/commands/attach.js +6 -4
  606. package/dist/commands/attach.js.map +1 -1
  607. package/dist/commands/broadcast.js +2 -0
  608. package/dist/commands/broadcast.js.map +1 -1
  609. package/dist/commands/community-harness.d.ts.map +1 -1
  610. package/dist/commands/community-harness.js +2 -1
  611. package/dist/commands/community-harness.js.map +1 -1
  612. package/dist/commands/compact-plan.d.ts.map +1 -1
  613. package/dist/commands/compact-plan.js +2 -1
  614. package/dist/commands/compact-plan.js.map +1 -1
  615. package/dist/commands/compact.d.ts.map +1 -1
  616. package/dist/commands/compact.js +10 -3
  617. package/dist/commands/compact.js.map +1 -1
  618. package/dist/commands/config.d.ts.map +1 -1
  619. package/dist/commands/config.js +10 -2
  620. package/dist/commands/config.js.map +1 -1
  621. package/dist/commands/context.d.ts.map +1 -1
  622. package/dist/commands/context.js +16 -9
  623. package/dist/commands/context.js.map +1 -1
  624. package/dist/commands/expand.d.ts.map +1 -1
  625. package/dist/commands/expand.js +16 -2
  626. package/dist/commands/expand.js.map +1 -1
  627. package/dist/commands/export.d.ts.map +1 -1
  628. package/dist/commands/export.js +9 -2
  629. package/dist/commands/export.js.map +1 -1
  630. package/dist/commands/fork.d.ts.map +1 -1
  631. package/dist/commands/fork.js +3 -1
  632. package/dist/commands/fork.js.map +1 -1
  633. package/dist/commands/gateway.d.ts +39 -0
  634. package/dist/commands/gateway.d.ts.map +1 -1
  635. package/dist/commands/gateway.js +310 -3
  636. package/dist/commands/gateway.js.map +1 -1
  637. package/dist/commands/health.js +3 -2
  638. package/dist/commands/health.js.map +1 -1
  639. package/dist/commands/host.d.ts +1 -1
  640. package/dist/commands/host.d.ts.map +1 -1
  641. package/dist/commands/host.js +2 -2
  642. package/dist/commands/host.js.map +1 -1
  643. package/dist/commands/launch.d.ts.map +1 -1
  644. package/dist/commands/launch.js +9 -2
  645. package/dist/commands/launch.js.map +1 -1
  646. package/dist/commands/plugin.d.ts.map +1 -1
  647. package/dist/commands/plugin.js +2 -1
  648. package/dist/commands/plugin.js.map +1 -1
  649. package/dist/commands/provider.d.ts.map +1 -1
  650. package/dist/commands/provider.js +0 -73
  651. package/dist/commands/provider.js.map +1 -1
  652. package/dist/commands/ps.d.ts +4 -0
  653. package/dist/commands/ps.d.ts.map +1 -1
  654. package/dist/commands/ps.js +95 -5
  655. package/dist/commands/ps.js.map +1 -1
  656. package/dist/commands/queue.d.ts +4 -0
  657. package/dist/commands/queue.d.ts.map +1 -1
  658. package/dist/commands/queue.js +78 -3
  659. package/dist/commands/queue.js.map +1 -1
  660. package/dist/commands/release.d.ts.map +1 -1
  661. package/dist/commands/release.js +16 -2
  662. package/dist/commands/release.js.map +1 -1
  663. package/dist/commands/restore-check.d.ts.map +1 -1
  664. package/dist/commands/restore-check.js +2 -1
  665. package/dist/commands/restore-check.js.map +1 -1
  666. package/dist/commands/restore-packet.d.ts.map +1 -1
  667. package/dist/commands/restore-packet.js +2 -1
  668. package/dist/commands/restore-packet.js.map +1 -1
  669. package/dist/commands/restore.d.ts.map +1 -1
  670. package/dist/commands/restore.js +23 -6
  671. package/dist/commands/restore.js.map +1 -1
  672. package/dist/commands/scope.d.ts.map +1 -1
  673. package/dist/commands/scope.js +5 -2
  674. package/dist/commands/scope.js.map +1 -1
  675. package/dist/commands/seat.js +0 -4
  676. package/dist/commands/seat.js.map +1 -1
  677. package/dist/commands/send.d.ts.map +1 -1
  678. package/dist/commands/send.js +27 -3
  679. package/dist/commands/send.js.map +1 -1
  680. package/dist/commands/setup.d.ts +3 -0
  681. package/dist/commands/setup.d.ts.map +1 -1
  682. package/dist/commands/setup.js +29 -9
  683. package/dist/commands/setup.js.map +1 -1
  684. package/dist/commands/shrink.d.ts.map +1 -1
  685. package/dist/commands/shrink.js +16 -2
  686. package/dist/commands/shrink.js.map +1 -1
  687. package/dist/commands/slack.d.ts.map +1 -1
  688. package/dist/commands/slack.js +11 -24
  689. package/dist/commands/slack.js.map +1 -1
  690. package/dist/commands/snapshot.d.ts.map +1 -1
  691. package/dist/commands/snapshot.js +36 -10
  692. package/dist/commands/snapshot.js.map +1 -1
  693. package/dist/commands/specs.d.ts.map +1 -1
  694. package/dist/commands/specs.js +11 -5
  695. package/dist/commands/specs.js.map +1 -1
  696. package/dist/commands/start.d.ts.map +1 -1
  697. package/dist/commands/start.js +36 -10
  698. package/dist/commands/start.js.map +1 -1
  699. package/dist/commands/status.d.ts.map +1 -1
  700. package/dist/commands/status.js +4 -1
  701. package/dist/commands/status.js.map +1 -1
  702. package/dist/commands/transcript.d.ts.map +1 -1
  703. package/dist/commands/transcript.js +12 -7
  704. package/dist/commands/transcript.js.map +1 -1
  705. package/dist/commands/unarchive.d.ts.map +1 -1
  706. package/dist/commands/unarchive.js +16 -2
  707. package/dist/commands/unarchive.js.map +1 -1
  708. package/dist/commands/up.d.ts.map +1 -1
  709. package/dist/commands/up.js +33 -7
  710. package/dist/commands/up.js.map +1 -1
  711. package/dist/commands/walk.d.ts.map +1 -1
  712. package/dist/commands/walk.js +2 -1
  713. package/dist/commands/walk.js.map +1 -1
  714. package/dist/commands/whoami.d.ts.map +1 -1
  715. package/dist/commands/whoami.js +3 -0
  716. package/dist/commands/whoami.js.map +1 -1
  717. package/dist/config-store.d.ts +4 -2
  718. package/dist/config-store.d.ts.map +1 -1
  719. package/dist/config-store.js +34 -7
  720. package/dist/config-store.js.map +1 -1
  721. package/dist/daemon-lifecycle.d.ts +9 -4
  722. package/dist/daemon-lifecycle.d.ts.map +1 -1
  723. package/dist/daemon-lifecycle.js +27 -9
  724. package/dist/daemon-lifecycle.js.map +1 -1
  725. package/dist/daemon-reachability.d.ts +13 -0
  726. package/dist/daemon-reachability.d.ts.map +1 -1
  727. package/dist/daemon-reachability.js +28 -0
  728. package/dist/daemon-reachability.js.map +1 -1
  729. package/dist/fetch-with-timeout.d.ts.map +1 -1
  730. package/dist/fetch-with-timeout.js +19 -16
  731. package/dist/fetch-with-timeout.js.map +1 -1
  732. package/dist/host-bindings.d.ts +6 -0
  733. package/dist/host-bindings.d.ts.map +1 -1
  734. package/dist/host-bindings.js +7 -4
  735. package/dist/host-bindings.js.map +1 -1
  736. package/dist/lib/bundle-check.d.ts.map +1 -1
  737. package/dist/lib/bundle-check.js +13 -5
  738. package/dist/lib/bundle-check.js.map +1 -1
  739. package/dist/mcp-server.d.ts.map +1 -1
  740. package/dist/mcp-server.js +57 -14
  741. package/dist/mcp-server.js.map +1 -1
  742. package/dist/rig-handle.d.ts +18 -1
  743. package/dist/rig-handle.d.ts.map +1 -1
  744. package/dist/rig-handle.js +19 -2
  745. package/dist/rig-handle.js.map +1 -1
  746. package/package.json +1 -1
  747. package/tui/dist/config/config-model.js +1 -1
  748. package/tui/dist/config/config-model.js.map +1 -1
  749. package/tui/dist/connections/connections-model.d.ts +0 -5
  750. package/tui/dist/connections/connections-model.d.ts.map +1 -1
  751. package/tui/dist/connections/connections-model.js +1 -1
  752. package/tui/dist/connections/connections-model.js.map +1 -1
  753. package/tui/dist/daemon-client.d.ts +2 -0
  754. package/tui/dist/daemon-client.d.ts.map +1 -1
  755. package/tui/dist/daemon-client.js +23 -0
  756. package/tui/dist/daemon-client.js.map +1 -1
  757. package/tui/dist/hydrate.d.ts.map +1 -1
  758. package/tui/dist/hydrate.js +13 -1
  759. package/tui/dist/hydrate.js.map +1 -1
  760. package/tui/dist/live.d.ts +10 -1
  761. package/tui/dist/live.d.ts.map +1 -1
  762. package/tui/dist/live.js +56 -7
  763. package/tui/dist/live.js.map +1 -1
  764. package/tui/dist/main.js +35 -2
  765. package/tui/dist/main.js.map +1 -1
  766. package/tui/dist/render.d.ts.map +1 -1
  767. package/tui/dist/render.js +111 -7
  768. package/tui/dist/render.js.map +1 -1
  769. package/tui/dist/types.d.ts +53 -0
  770. package/tui/dist/types.d.ts.map +1 -1
  771. package/tui/dist/version-skew.d.ts +24 -0
  772. package/tui/dist/version-skew.d.ts.map +1 -0
  773. package/tui/dist/version-skew.js +37 -0
  774. package/tui/dist/version-skew.js.map +1 -0
  775. package/daemon/dist/domain/provider/subscription-moves.d.ts +0 -77
  776. package/daemon/dist/domain/provider/subscription-moves.d.ts.map +0 -1
  777. package/daemon/dist/domain/provider/subscription-moves.js +0 -140
  778. package/daemon/dist/domain/provider/subscription-moves.js.map +0 -1
@@ -22,7 +22,7 @@ import { downloadPrivateFile, isSlackHost, lookupBotApp, postChatMessage } from
22
22
  import { botInboxProblems } from "./bot-inbox.js";
23
23
  import { loadConfig } from "./config.js";
24
24
  import { resolveSecret } from "./secrets.js";
25
- import { SeenStore, DeadLetterStore, InboundReceiptStore } from "./state-store.js";
25
+ import { SeenStore, DeadLetterStore, InboundReceiptStore, slackMicros } from "./state-store.js";
26
26
  import { makeQueuePorts } from "./queue-access.js";
27
27
  import { SlackOutboundDriver, OUTBOUND_OP } from "./outbound-driver.js";
28
28
  import { abortableSleep, subsystemSlackDeliver } from "./slack-delivery.js";
@@ -32,12 +32,14 @@ import { ThreadSeatMap, formatPostedStamp } from "./thread-seat-map.js";
32
32
  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
+ import { recoveryTag } from "../../queue-recovery.js";
35
36
  import { getSelfHostId } from "../../hosts/fanout-contract.js";
36
37
  import { envelopeChannel, forwardChannelProblems, makeEnvelopeForwarder } from "./forwarding.js";
37
38
  import { startSocketInbound } from "./socket-inbound.js";
38
39
  import { loadHumanRegistry, resolveSlackHandle } from "../human-registry.js";
39
40
  import { hasLiveHumanGate, isBlockerLive } from "../../queue-repository.js";
40
41
  import { formatReplyToChoice, REPLY_TO_CHOICE_ACTOR, REPLY_TO_CHAIN_LIMIT } from "../../reply-to-choice.js";
42
+ import { isHumanSeatSession } from "../../human-route-enforcer.js";
41
43
  import { ownerNotificationLevelAtLeast } from "../../queue-transition-log.js";
42
44
  // OPR.0.5.6.1 — the delivery rules engine: ONE decision per message replaces
43
45
  // the two dial-reads (the S14 default-decision stub). The legacy dial path
@@ -45,21 +47,50 @@ import { ownerNotificationLevelAtLeast } from "../../queue-transition-log.js";
45
47
  // registered human (no prefs -> no engine input).
46
48
  import { decideDelivery, resolveAvailability, isEscalationClass, formatDeliveryTermination, DELIVERY_TERMINATION_PREFIX, } from "../delivery-rules-engine.js";
47
49
  import { armDeliveryDeferral } from "../../policies/delivery-deferral.js";
50
+ import { confirmReleaseAtPost, holdForQuiet } from "../../policies/quiet-release.js";
51
+ import { quietHoldFor } from "../human-quiet-windows.js";
48
52
  import { WatchdogJobsRepository } from "../../watchdog-jobs-repository.js";
49
53
  const SECRET_BOT = "SLACK_BOT_TOKEN";
50
54
  const SECRET_APP = "SLACK_APP_TOKEN";
51
55
  /** Compose an inbound reply with Mission Control's existing human-park resolver.
52
56
  * A replay after the durable resolve but before inbound seen-mark is absorbed by
53
57
  * the typed transition, so the waiting owner is resumed exactly once. */
54
- export function makeHumanReplyResolver(queueRepo, contract) {
58
+ export function makeHumanReplyResolver(queueRepo, contract, home) {
55
59
  return async (input) => {
56
- if (queueRepo.getById(input.qitemId)?.humanIntent === "update")
60
+ const source = queueRepo.getById(input.qitemId);
61
+ if (source?.humanIntent === "update")
57
62
  return "not-applicable";
58
63
  if (!contract)
59
64
  return "not-applicable";
65
+ const uncertainDecision = `${input.decision}\n\n---\nOpenRig timing context (Slack reply ${JSON.stringify([input.actorSession, input.messageTs ?? null])}): This reply resumed the question, but its ordering against the posted question could not be confirmed. Resuming is not approval; read the person's words in context.`;
66
+ // An acknowledgement retry must not resolve again. Match this reply's durable
67
+ // context, not an older episode's generic resolved marker.
68
+ if (slackMicros(input.messageTs) !== null && queueRepo.transitionLog.listForQitem(input.qitemId)
69
+ .some((transition) => transition.ownerNotificationKind === "human-decision-resolved" && transition.transitionNote === uncertainDecision)) {
70
+ return "resolved-uncertain";
71
+ }
72
+ let uncertain = false;
73
+ if (source?.state === "blocked" && isHumanSeatSession(source.blockedOn)) {
74
+ const episode = queueRepo.transitionLog.listForQitem(input.qitemId)
75
+ .filter((transition) => transition.ownerNotificationKind === "human-required").at(-1);
76
+ if (!episode)
77
+ return "not-applicable";
78
+ const key = `${input.qitemId}:${episode.transitionId}`;
79
+ const receipt = queueRepo.transitionLog.getOwnerNotificationReceipt(input.qitemId, key);
80
+ // A final receipt attests delivery even when reconciliation lost its timestamp.
81
+ // Without one, ONLY a unique exact current-episode primary proves anything.
82
+ const primary = !receipt && home ? pendingPrimaryReceipt(home, input.qitemId, key) : null;
83
+ if (!receipt && !primary)
84
+ return "not-applicable";
85
+ const posted = slackMicros(receipt?.messageTs ?? primary?.messageTs);
86
+ const replied = slackMicros(input.messageTs);
87
+ if (posted !== null && replied !== null && replied <= posted)
88
+ return "not-applicable";
89
+ uncertain = Boolean(receipt?.digest) || posted === null || replied === null;
90
+ }
60
91
  try {
61
- await contract.act({ verb: "resolve", ...input });
62
- return "resolved";
92
+ await contract.act({ verb: "resolve", ...input, decision: uncertain ? uncertainDecision : input.decision });
93
+ return uncertain ? "resolved-uncertain" : "resolved";
63
94
  }
64
95
  catch (error) {
65
96
  if (error.code !== "qitem_not_leg1_parked")
@@ -77,6 +108,28 @@ export function makeHumanReplyResolver(queueRepo, contract) {
77
108
  }
78
109
  };
79
110
  }
111
+ /** Read positive multipart evidence without changing final receipt/ack ownership. */
112
+ function pendingPrimaryReceipt(home, qitemId, notificationKey) {
113
+ const pending = new DispatchBuffer(home).pending().filter((decision) => {
114
+ const p = decision.payload;
115
+ return decision.op === OUTBOUND_OP && p?.qitemId === qitemId
116
+ && p.notificationKey === notificationKey && p.ownerNotificationKind === "human-required";
117
+ });
118
+ if (pending.length !== 1)
119
+ return null;
120
+ const prefix = `${pending[0].decisionId}::primary-receipt::`;
121
+ const records = [...new SeenStore(path.join(stateDir(home), "slack-attempted-decisions.jsonl")).load()]
122
+ .filter((id) => id.startsWith(prefix));
123
+ if (records.length !== 1)
124
+ return null;
125
+ try {
126
+ const receipt = JSON.parse(Buffer.from(records[0].slice(prefix.length), "base64url").toString("utf8"));
127
+ return slackMicros(receipt?.messageTs) !== null ? { messageTs: receipt.messageTs } : null;
128
+ }
129
+ catch {
130
+ return null;
131
+ }
132
+ }
80
133
  /**
81
134
  * OPR.0.5.6.2 — the inbound file port: Slack `url_private` → authenticated
82
135
  * download → workspace-local media file → LOCAL path for the reply row.
@@ -144,19 +197,17 @@ function stateDir(home) {
144
197
  return path.join(home, "state");
145
198
  }
146
199
  /** The status fields for the retry pass's durable custody. Counts RECORDS across the
147
- * inbound-event and click dead-letter files — the event file also carries reactions,
200
+ * inbound-event, click and relay dead-letter files — the event file also carries reactions,
148
201
  * and a message that left more than one record is counted once per record, so the
149
202
  * retry pass owns exactly these records. When any file cannot be read the count is
150
203
  * `null`, not 0: a number (or a zero) beside an unknown state still reads as "nothing
151
204
  * stuck" to a consumer that only looks at the count, so the state and the reason tell
152
- * the truth and the number says it does not know. Absent when inbound is not configured
153
- * (no stores), keeping an inert connector silent. */
205
+ * the truth and the number says it does not know. An inert connector reports the same
206
+ * retained records without starting retries. */
154
207
  function deadLetterBacklogFields(dead, deadActions, deadForwards) {
155
- if (!dead || !deadActions)
156
- return {};
157
208
  let records = 0;
158
209
  let reason;
159
- for (const store of [dead, deadActions, ...(deadForwards ? [deadForwards] : [])]) {
210
+ for (const store of [dead, deadActions, deadForwards]) {
160
211
  const result = store.readResult();
161
212
  if (result.ok)
162
213
  records += result.entries.length;
@@ -180,6 +231,11 @@ export function buildSlackGatewayWire(opts) {
180
231
  const app = resolveSecret(SECRET_APP, { envFile });
181
232
  const outboundReady = cfg.enabled && bot !== null && cfg.channel !== null;
182
233
  const inboundReady = cfg.enabled && app !== null;
234
+ const inboundRouting = { fallback: "local", destination: cfg.inboundDestination };
235
+ const dead = new DeadLetterStore(path.join(stateDir(opts.home), "slack-inbound-deadletter.jsonl"));
236
+ const deadActions = new DeadLetterStore(path.join(stateDir(opts.home), "slack-inbound-action-deadletter.jsonl"));
237
+ // Retained relays belong to their original host, even after forwarding configuration changes.
238
+ const deadForwards = new DeadLetterStore(path.join(stateDir(opts.home), "slack-inbound-forward-deadletter.jsonl"));
183
239
  if (!outboundReady && !inboundReady) {
184
240
  const missing = !cfg.enabled ? "connector disabled (rig slack enable)" : !bot ? "SLACK_BOT_TOKEN unresolved" : "channel unconfigured";
185
241
  log(`slack delivery not configured (${missing}) — wire is inert; dispatches would be refused honestly`);
@@ -189,7 +245,7 @@ export function buildSlackGatewayWire(opts) {
189
245
  deliver: async () => ({ ok: false, class: "slack-not-configured", detail: missing }),
190
246
  log,
191
247
  });
192
- return { ...inert, status: () => ({ platform: "slack", configurationDigest: channelStateDigest(cfg), outboundReady: false, inboundReady: false, recovery: { state: "unavailable", reason: "inbound-not-configured" }, inbound: { state: "not-configured" } }) };
248
+ return { ...inert, status: () => ({ platform: "slack", configurationDigest: channelStateDigest(cfg), outboundReady: false, inboundReady: false, inboundRouting, recovery: { state: "unavailable", reason: "inbound-not-configured" }, inbound: { state: "not-configured" }, ...deadLetterBacklogFields(dead, deadActions, deadForwards) }) };
193
249
  }
194
250
  const registrySurface = opts.registry ?? { loadHumanRegistry, resolveSlackHandle };
195
251
  const ports = makeQueuePorts(opts.queueRepo, {
@@ -220,6 +276,7 @@ export function buildSlackGatewayWire(opts) {
220
276
  minimumLevelThatPosts: cfg.minimumLevelThatPosts,
221
277
  minimumLevelThatInterrupts: cfg.minimumLevelThatInterrupts,
222
278
  },
279
+ quiet: quietHoldFor(opts.queueRepo.db, human.entityId, new Date()),
223
280
  });
224
281
  };
225
282
  const outboundSeen = new SeenStore(path.join(stateDir(opts.home), "slack-outbound-seen.jsonl"));
@@ -239,13 +296,17 @@ export function buildSlackGatewayWire(opts) {
239
296
  // sees it. Tell the seat that asked, once: the notice's id derives from the ask's, so a replay
240
297
  // returns the same row instead of a second one.
241
298
  // A retry that can't post the rest of an ask some of which may already be in Slack says so.
242
- const notifySourceUndeliverable = (p, detail, partlyPosted = false) => {
299
+ const notifySourceUndeliverable = (p, detail, partlyPosted = false, invalidBlocks = false) => {
243
300
  const seat = p.sourceSession;
244
301
  if (!p.qitemId || !seat)
245
302
  return;
246
303
  const human = p.destinationSession ?? "the person";
304
+ // A prior episode's notice must not hide this explicit Slack rejection.
305
+ const noticeId = invalidBlocks
306
+ ? `${p.notificationKey ?? p.qitemId}-invalid-blocks-undeliverable`
307
+ : `${p.qitemId}-undeliverable`;
247
308
  opts.queueRepo.create({
248
- qitemId: `${p.qitemId}-undeliverable`,
309
+ qitemId: noticeId,
249
310
  sourceSession: seat,
250
311
  destinationSession: seat,
251
312
  summary: `Not delivered to ${human}: ${p.summary ?? p.qitemId}`,
@@ -256,22 +317,29 @@ export function buildSlackGatewayWire(opts) {
256
317
  "",
257
318
  `Reason: ${detail}`,
258
319
  "",
259
- partlyPosted
260
- ? "Check the thread in Slack and send what's missing as a new ask. The original row stays open until you close it."
261
- : "Shorten it and send it as a new ask. The original row stays open until you close it.",
320
+ invalidBlocks
321
+ ? "Slack rejected the message blocks. OpenRig will not retry this payload. Check its evidence links and message content, then send a corrected ask as a new queue item. The original row remains undelivered; close it when you have handled it."
322
+ : partlyPosted
323
+ ? "Check the thread in Slack and send what's missing as a new ask. The original row stays open until you close it."
324
+ : "Shorten it and send it as a new ask. The original row stays open until you close it.",
262
325
  ].join("\n"),
263
326
  evidenceRef: `rig queue show ${p.qitemId}`,
264
- tags: ["slack-undeliverable"],
327
+ tags: ["slack-undeliverable", recoveryTag(p.qitemId)],
265
328
  }).catch((e) => log(`undeliverable notice FAILED for ${p.qitemId}: ${e.message}`));
266
329
  };
267
330
  const recordTransportFailed = (p, failureClass, detail, partlyPosted) => {
268
331
  if (!p.qitemId)
269
332
  return;
270
- if (failureClass === "human-message-unrenderable")
271
- notifySourceUndeliverable(p, detail, partlyPosted);
333
+ if (failureClass === "human-message-unrenderable" || failureClass === "slack-invalid-blocks") {
334
+ notifySourceUndeliverable(p, detail, partlyPosted, failureClass === "slack-invalid-blocks");
335
+ }
272
336
  const key = p.notificationKey ?? p.qitemId;
273
- const alreadyRecorded = opts.queueRepo.transitionLog.listForQitem(p.qitemId).some((transition) => transition.transitionNote?.startsWith("slack-owner-notification-transport-failed ")
274
- && transition.transitionNote.split(/\s+/).includes(`notification_key=${key}`));
337
+ const previousFailure = opts.queueRepo.transitionLog.listForQitem(p.qitemId).filter((transition) => transition.transitionNote?.startsWith("slack-owner-notification-transport-failed ")
338
+ && transition.transitionNote.split(/\s+/).includes(`notification_key=${key}`)).at(-1);
339
+ // A corrected attempt can fail transiently after a permanent rejection, and a
340
+ // transient failure can be followed by a definite rejection. Preserve both changes.
341
+ const alreadyRecorded = previousFailure &&
342
+ previousFailure.transitionNote.includes("class=slack-invalid-blocks ") === (failureClass === "slack-invalid-blocks");
275
343
  if (alreadyRecorded)
276
344
  return;
277
345
  opts.queueRepo.update({
@@ -372,6 +440,8 @@ export function buildSlackGatewayWire(opts) {
372
440
  const runCtl = new AbortController();
373
441
  // Late-bound so deliver can release the driver's in-flight guard (built after the wire).
374
442
  let releaseRef = () => { };
443
+ // The wire's own dispatcher, bound once the wire exists: a delivery step that must mint a new durable decision.
444
+ let selfDispatch = () => ({ ok: false, error: "wire not built" });
375
445
  const deliver = outboundReady
376
446
  ? subsystemSlackDeliver({
377
447
  botToken: bot,
@@ -436,8 +506,17 @@ export function buildSlackGatewayWire(opts) {
436
506
  // registered humans; the dial pair remains only for the null degrade.
437
507
  if (p.deliveryDigestPost)
438
508
  return undefined; // notify-class aggregate, never a mention
509
+ if (p.quietRelease)
510
+ return undefined; // releasing a quiet hold: posted, never a mention
439
511
  const fire = p.deliveryDeferralFire === true;
440
- const decision = fire ? null : decideForPayload(p);
512
+ // At post time the decision was just made; if it can't be re-read now (quiet hours unreadable), no mention.
513
+ let decision;
514
+ try {
515
+ decision = fire ? null : decideForPayload(p);
516
+ }
517
+ catch {
518
+ return undefined;
519
+ }
441
520
  const eligible = fire
442
521
  ? true // the deferred interrupt mentions at fire time — that IS the deferral's promise
443
522
  : decision
@@ -588,6 +667,85 @@ export function buildSlackGatewayWire(opts) {
588
667
  outboundSeen.mark(key, "dropped-row-not-active");
589
668
  releaseRef(key);
590
669
  };
670
+ // An earlier attempt of this exact decision may be in Slack with its response lost. A gate that would hold, trim, defer
671
+ // or ack it (instead of handing it to delivery) resolves that first, through the reconciler. Found goes to delivery
672
+ // unchanged, which records receipts for what was posted and never posts it again in another form. A post confirmed
673
+ // partly in Slack (its first part found, the post not complete) also goes to delivery: only its own remaining parts
674
+ // post, under its own part ids and in its own thread and channel, even during quiet hours. A scan that can't be read
675
+ // retains the decision. Never-attempted and absent attempts, and a scan that couldn't finish, haven't started: they
676
+ // go on through the gate like any other post. Where the gate posts,
677
+ // delivery reconciles (keeping its at-least-once post for an unfinished scan); where it holds, the release posts it
678
+ // after quiet. A decision that goes straight to delivery skips this.
679
+ const resolveEarlierAttempt = async (decision) => {
680
+ const landing = "landing" in deliver ? await deliver.landing(decision) : "unattempted";
681
+ if (landing === "found" || landing === "partial")
682
+ return deliver(decision);
683
+ if (typeof landing === "object" && landing !== null) {
684
+ return { ok: false, class: "reconcile-unreadable", detail: landing.unreadable };
685
+ }
686
+ return null;
687
+ };
688
+ // A digest post was decided before it was posted. By the time it is delivered (a buffered post replayed after a
689
+ // restart, say), some members may already be owned elsewhere: posted (a receipt), or held for quiet hours (a hold
690
+ // note, so the window's release job posts it). And if the recipient's quiet hours began in between, its routine
691
+ // members are held now rather than posted into them; a member that has since become an escalation still posts.
692
+ // The original decision only ever carries its original payload: if what's left differs, it goes out as a new
693
+ // decision with its own id and receipts (enqueued before the original is acked), so a post under one id never has two
694
+ // contents, and receipts bind to exactly the members posted under it. An earlier attempt of the original that may
695
+ // have landed is resolved by the reconciler first. If the quiet state can't be read, nothing posts (see the catch).
696
+ const deliverDigestPost = async (decision, p) => {
697
+ const settled = await resolveEarlierAttempt(decision);
698
+ if (settled)
699
+ return settled;
700
+ const recipient = (p.destinationSession ?? "").split("@")[0] ?? "";
701
+ let quiet;
702
+ try {
703
+ quiet = recipient ? quietHoldFor(opts.queueRepo.db, recipient, new Date()) : null;
704
+ }
705
+ catch (error) {
706
+ // An attempted digest (it may be in Slack) is retained: acked, the next flush would mint the ask again from the
707
+ // row as it is now. A never-attempted one is acked: its members keep their digest notes, so the next flush
708
+ // selects them again. A store check only: no Slack read on a failure path.
709
+ if ("attempted" in deliver && deliver.attempted(decision)) {
710
+ log(`digest post ${decision.decisionId} retained: quiet hours couldn't be read: ${error.message}`);
711
+ return { ok: false, class: "quiet-unreadable", detail: error.message };
712
+ }
713
+ log(`digest post ${decision.decisionId} not posted: quiet hours couldn't be read: ${error.message}`);
714
+ return { ok: true };
715
+ }
716
+ const aggregate = p.memberReceipts;
717
+ const members = aggregate ?? (p.qitemId ? [{ qitemId: p.qitemId, notificationKey: p.notificationKey ?? p.qitemId }] : []);
718
+ const owned = (m) => opts.queueRepo.transitionLog.hasOwnerNotificationReceipt(m.qitemId, m.notificationKey)
719
+ || opts.queueRepo.listTransitions(m.qitemId).some((t) => (t.transitionNote ?? "").startsWith("delivery-decision: quiet-hold ")
720
+ && (t.transitionNote ?? "").split(/\s+/).includes(`notification_key=${m.notificationKey}`));
721
+ const jobsRepo = new WatchdogJobsRepository(opts.queueRepo.db);
722
+ const escalation = (m) => {
723
+ const row = opts.queueRepo.getById(m.qitemId);
724
+ return !!row && row.humanIntent !== "update" && isEscalationClass(row.tags);
725
+ };
726
+ const kept = members.filter((m) => {
727
+ if (owned(m))
728
+ return false;
729
+ if (!quiet)
730
+ return true;
731
+ if (escalation(m))
732
+ return true;
733
+ holdForQuiet({ queueRepo: opts.queueRepo, jobsRepo, qitemId: m.qitemId, entityId: recipient, hold: { ...quiet, notificationKey: m.notificationKey } });
734
+ return false;
735
+ });
736
+ if (kept.length === members.length)
737
+ return deliver(decision); // unchanged: the original, as it is
738
+ if (kept.length === 0 || !aggregate)
739
+ return { ok: true }; // nothing left to post under it
740
+ const keptIds = new Set(kept.map((m) => m.qitemId));
741
+ const body = String(p.body ?? "").split("\n").filter((line) => [...keptIds].some((id) => line.endsWith(`[${id}]`))).join("\n");
742
+ const summary = String(p.summary ?? "").replace(/— \d+ item\(s\)/, `— ${kept.length} item(s)`);
743
+ const keptId = `${decision.decisionId}:kept:${createHash("sha256").update(kept.map((m) => m.notificationKey).sort().join(",")).digest("hex").slice(0, 16)}`;
744
+ // Durable first: the new decision is in the buffer before the original is acked (returning ok). A crash between the
745
+ // two replays the original, which computes the same kept set and id; the dispatcher accepts the pending id once.
746
+ const res = selfDispatch(keptId, { ...p, memberReceipts: kept, body, summary });
747
+ return res.ok ? { ok: true } : { ok: false, class: "kept-dispatch-refused", detail: res.error };
748
+ };
591
749
  const engineDeliver = async (decision) => {
592
750
  const p = (decision.payload ?? {});
593
751
  // The decision-resolved notice is written at closure, so a closed row is its normal case.
@@ -606,7 +764,36 @@ export function buildSlackGatewayWire(opts) {
606
764
  // A digest post is an already-decided aggregate — never re-consulted
607
765
  // (member decisions were recorded at containment; receipts land in onPosted).
608
766
  if (p.deliveryDigestPost)
609
- return deliver(decision);
767
+ return deliverDigestPost(decision, p);
768
+ // Releasing an ask held for quiet hours: it posts as itself, never re-consulted (that would digest C and D again). A
769
+ // receipt means it already did. A release can wait in the buffer (and be replayed after a restart), so it is
770
+ // re-checked here, at post time, against the recipient's quiet, the row and the posting threshold as they are now.
771
+ if (p.quietRelease) {
772
+ const key = p.notificationKey ?? p.qitemId;
773
+ if (p.qitemId && opts.queueRepo.transitionLog.hasOwnerNotificationReceipt(p.qitemId, key)) {
774
+ releaseRef(p.qitemId);
775
+ return { ok: true };
776
+ }
777
+ const settled = await resolveEarlierAttempt(decision);
778
+ if (settled)
779
+ return settled;
780
+ const verdict = !p.qitemId ? "post" : await confirmReleaseAtPost({
781
+ queueRepo: opts.queueRepo,
782
+ jobsRepo: new WatchdogJobsRepository(opts.queueRepo.db),
783
+ home: opts.home,
784
+ registry: { loadHumanRegistry: () => registrySurface.loadHumanRegistry(opts.home) },
785
+ entityId: (p.destinationSession ?? "").split("@")[0] ?? "",
786
+ qitemId: p.qitemId,
787
+ notificationKey: key,
788
+ });
789
+ if (verdict === "post")
790
+ return deliver(decision);
791
+ // Declined (the row says why) or couldn't be checked (nothing written): either way nothing posts now. Acking is
792
+ // safe because the window's release job owns redelivery until the ask has a receipt or a disposition; keeping it
793
+ // buffered would wait for a restart and block the job's own re-dispatch of the same decision id.
794
+ releaseRef(p.qitemId);
795
+ return { ok: true };
796
+ }
610
797
  if (p.deliveryDeferralFire) {
611
798
  const fireKey = p.notificationKey ?? p.qitemId;
612
799
  if (p.qitemId && opts.queueRepo.transitionLog.hasOwnerNotificationReceipt(p.qitemId, fireKey)) {
@@ -615,7 +802,40 @@ export function buildSlackGatewayWire(opts) {
615
802
  }
616
803
  return deliver(decision);
617
804
  }
618
- const ruled = p.qitemId ? decideForPayload(p) : null;
805
+ // A post confirmed partly in Slack finishes without consulting quiet hours, so it is resolved before the decision
806
+ // (which reads them). Only a started multipart post is checked here, from the stores first, so an ordinary
807
+ // retry isn't scanned twice; any other attempted decision is resolved at the gate below.
808
+ const started = "unfinished" in deliver && deliver.unfinished(decision);
809
+ if (started) {
810
+ const settled = await resolveEarlierAttempt(decision);
811
+ if (settled)
812
+ return settled;
813
+ }
814
+ let ruled;
815
+ try {
816
+ ruled = p.qitemId ? decideForPayload(p) : null;
817
+ }
818
+ catch (error) {
819
+ // An attempted decision (it may be partly or wholly in Slack) is retained and nothing posts: acking it would drop
820
+ // the post's missing parts and let the sweep offer the ask again under a new id, posting it from the start. Its
821
+ // replay decides again once the quiet state reads. A store check only: no Slack read on a failure path.
822
+ if ("attempted" in deliver && deliver.attempted(decision)) {
823
+ log(`delivery decision for attempted ${decision.decisionId} couldn't be made; retained: ${error.message}`);
824
+ return { ok: false, class: "quiet-unreadable", detail: error.message };
825
+ }
826
+ // The decision couldn't be made (for example the person's quiet hours couldn't be read): post nothing and record
827
+ // nothing. Releasing the in-flight guard lets the outbound sweep offer this still-unseen ask again and decide afresh.
828
+ log(`delivery decision for ${p.qitemId} deferred: ${error.message}`);
829
+ // Released by notification key, the guard's own key: nothing marks this ask seen, so the next sweep must see it.
830
+ releaseRef(p.notificationKey ?? p.qitemId);
831
+ return { ok: true };
832
+ }
833
+ if (!started && ruled && (ruled.outcome === "log" || (ruled.outcome === "hold" && ruled.quietHold)
834
+ || ruled.outcome === "digest" || ruled.deferMinutes !== undefined)) {
835
+ const settled = await resolveEarlierAttempt(decision);
836
+ if (settled)
837
+ return settled;
838
+ }
619
839
  if (ruled) {
620
840
  recordTerminationOnce(p, ruled);
621
841
  const episodeKey = p.notificationKey ?? p.qitemId;
@@ -624,6 +844,19 @@ export function buildSlackGatewayWire(opts) {
624
844
  releaseRef(p.qitemId);
625
845
  return { ok: true };
626
846
  }
847
+ if (ruled.outcome === "hold" && ruled.quietHold) {
848
+ // Quiet hours: recorded on the row with its window, occurrence and revision; the release job posts it later.
849
+ holdForQuiet({
850
+ queueRepo: opts.queueRepo,
851
+ jobsRepo: new WatchdogJobsRepository(opts.queueRepo.db),
852
+ qitemId: p.qitemId,
853
+ entityId: (p.destinationSession ?? "").split("@")[0] ?? "unknown",
854
+ hold: { ...ruled.quietHold, notificationKey: episodeKey },
855
+ });
856
+ outboundSeen.mark(episodeKey, "quiet-held");
857
+ releaseRef(p.qitemId);
858
+ return { ok: true };
859
+ }
627
860
  if (ruled.outcome === "digest") {
628
861
  // R1 B-4: the MESSAGE-TIME decision is recorded on the row (with the
629
862
  // live dials already applied by the consult above); the flush consumes
@@ -669,6 +902,7 @@ export function buildSlackGatewayWire(opts) {
669
902
  deliver: outboundReady ? engineDeliver : deliver,
670
903
  log,
671
904
  });
905
+ selfDispatch = (decisionId, payload) => wire.dispatcher.dispatch(OUTBOUND_OP, String(payload.destinationSession ?? ""), payload, { decisionId });
672
906
  // Services are CONSTRUCTED here but started only via startServices() (post-bind, index.ts):
673
907
  // composing a daemon must never dial Slack or start pollers — the createDaemon-in-tests
674
908
  // hermeticity rule, same as every monitor in the supervision tree.
@@ -704,16 +938,6 @@ export function buildSlackGatewayWire(opts) {
704
938
  });
705
939
  stops.push(() => driver.stop());
706
940
  }
707
- // Hoisted out of the inbound block so status() can report the durable backlog.
708
- // Both files are the retry pass's custody: the event dead-letter
709
- // (`slack-inbound-deadletter.jsonl`) and the click dead-letter
710
- // (`slack-inbound-action-deadletter.jsonl`), which retryActionDeadLetters owns.
711
- // An inert wire omits the fields rather than inventing a count for a connector
712
- // that is not running.
713
- let dead;
714
- let deadActions;
715
- // The hub's relays that failed, kept with their host (forwarding.ts).
716
- let deadForwards;
717
941
  // A machine of a shared app receives its channels' events from the hub (routes/gateway.ts).
718
942
  let acceptForwarded;
719
943
  let relayedReceived = 0; // envelopes a hub relayed here since this wire was built
@@ -727,7 +951,6 @@ export function buildSlackGatewayWire(opts) {
727
951
  let router;
728
952
  if (inboundReady || outboundReady) {
729
953
  const inboundSeen = new SeenStore(path.join(stateDir(opts.home), "slack-inbound-seen.jsonl"));
730
- dead = new DeadLetterStore(path.join(stateDir(opts.home), "slack-inbound-deadletter.jsonl"));
731
954
  const registry = registrySurface;
732
955
  const built = (router = new InboundRouter({
733
956
  queue: ports,
@@ -764,7 +987,7 @@ export function buildSlackGatewayWire(opts) {
764
987
  // a failed hand-back is retried with the event dead-letters, and each click is confirmed
765
988
  // in the decision's thread (a bot post, so inbound never ingests it).
766
989
  recordHumanAnswer: (input) => opts.queueRepo.recordHumanAnswer(input),
767
- actionDeadLetter: (deadActions = new DeadLetterStore(path.join(stateDir(opts.home), "slack-inbound-action-deadletter.jsonl"))),
990
+ actionDeadLetter: deadActions,
768
991
  ...(bot ? {
769
992
  // A stopped run posts nothing, and its rate-limit wait ends with the run: after a restart the click's
770
993
  // redelivery belongs to the new router, which must not race a stale retry from this one.
@@ -799,13 +1022,11 @@ export function buildSlackGatewayWire(opts) {
799
1022
  lookupBot: (botId) => lookupBotApp(bot, botId, opts.fetchImpl),
800
1023
  },
801
1024
  } : {}),
802
- ...(forwarding ? {
803
- forward: {
804
- hostFor: (channel) => cfg.forwardChannels.find((f) => f.channel === channel)?.host ?? null,
805
- send: makeEnvelopeForwarder({ fetchImpl: opts.fetchImpl, loadRegistry: opts.loadHostRegistry }),
806
- },
807
- forwardDeadLetter: (deadForwards = new DeadLetterStore(path.join(stateDir(opts.home), "slack-inbound-forward-deadletter.jsonl"))),
808
- } : {}),
1025
+ forward: {
1026
+ hostFor: (channel) => forwarding ? cfg.forwardChannels.find((f) => f.channel === channel)?.host ?? null : null,
1027
+ send: makeEnvelopeForwarder({ fetchImpl: opts.fetchImpl, loadRegistry: opts.loadHostRegistry }),
1028
+ },
1029
+ forwardDeadLetter: deadForwards,
809
1030
  log,
810
1031
  }));
811
1032
  if (cfg.botInbox && (!bot || botInboxProblems(cfg).length > 0)) {
@@ -886,14 +1107,11 @@ export function buildSlackGatewayWire(opts) {
886
1107
  platform: "slack", configurationDigest: channelStateDigest(cfg),
887
1108
  outboundReady,
888
1109
  inboundReady,
1110
+ inboundRouting,
889
1111
  recovery: recovery?.status() ?? { state: "unavailable", reason: "inbound-not-configured" },
890
1112
  inbound: inboundHandle?.status() ?? { state: inboundReady ? "not-started" : "not-configured", generation: 0, reconnects: 0 },
891
- // The retry pass's durable custody, counted from both dead-letter files:
892
- // inbound events plus click answers. Records, not distinct messages — a
893
- // message that left more than one record is counted once per record, which
894
- // is why the field is named for records. Present iff inbound is configured;
895
- // an unreadable file reports state "unknown" with a reason instead of a
896
- // false zero.
1113
+ // Durable inbound custody across event, click and relay files, even when inert.
1114
+ // Count records, not distinct messages; unreadable storage is null/unknown.
897
1115
  ...deadLetterBacklogFields(dead, deadActions, deadForwards),
898
1116
  // A machine with no connection of its own can take events a hub relays here; whether a hub does is
899
1117
  // the hub's configuration, so this says only that it can, and how many have arrived.