@openrig/cli 0.5.4 → 0.5.5

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 (747) hide show
  1. package/daemon/assets/guidance/openrig-start.md +7 -0
  2. package/daemon/assets/onboarding/01-world-and-purpose.md +52 -0
  3. package/daemon/assets/onboarding/02-self-and-competent-action.md +57 -0
  4. package/daemon/assets/plugins/openrig-core/README.md +5 -2
  5. package/daemon/assets/plugins/openrig-core/hooks/claude.json +3 -12
  6. package/daemon/assets/plugins/openrig-core/hooks/codex.json +5 -12
  7. package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +194 -124
  8. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +18 -23
  9. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/CHANGELOG.md +92 -0
  10. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/REVISION-GUIDE.md +34 -0
  11. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/ROADMAP.md +23 -0
  12. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/ROLLOUT.md +234 -0
  13. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/SKILL.md +404 -0
  14. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/compose.py +653 -0
  15. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/scaffold.sh +34 -0
  16. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/trace-due.sh +32 -0
  17. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/trace-stamp.sh +5 -0
  18. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/scripts/trunk-diff.sh +18 -0
  19. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/LEARNED.md +40 -0
  20. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/NOTES.md +9 -0
  21. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/PLAYBOOK.md +5 -0
  22. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/SOP.md +24 -0
  23. package/daemon/assets/plugins/openrig-core/skills/openrig-operating-model/templates/SPEC.md +54 -0
  24. package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +2 -0
  25. package/daemon/assets/plugins/openrig-core/skills/refocusing/SKILL.md +31 -0
  26. package/daemon/assets/plugins/openrig-core/skills/refocusing/references/refocus.md +22 -0
  27. package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +221 -0
  28. package/daemon/assets/plugins/openrig-core/skills/retiring-and-inheriting-a-seat/SKILL.md +3 -3
  29. package/daemon/context-packs/onboarding-width/manifest.yaml +11 -0
  30. package/daemon/context-packs/{world/install/reference-material.md → onboarding-width/public-reference-material.md} +4 -26
  31. package/daemon/context-packs/{world/install/what-you-can-do.md → onboarding-width/public-what-you-can-do.md} +13 -9
  32. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
  33. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/SKILL.md +1 -1
  34. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
  35. package/daemon/context-packs/skills/core/attention-queue/manifest.yaml +1 -1
  36. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
  37. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
  38. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
  39. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
  40. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
  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/pm/backlog-capture/manifest.yaml +1 -1
  49. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
  50. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
  51. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
  52. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
  53. package/daemon/context-packs/skills/pm/requirements-writer/SKILL.md +21 -15
  54. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +3 -3
  55. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
  56. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
  57. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
  58. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
  59. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
  60. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
  61. package/daemon/context-packs/skills/process/brainstorming/manifest.yaml +1 -1
  62. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
  63. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
  64. package/daemon/context-packs/skills/process/executing-plans/manifest.yaml +1 -1
  65. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
  66. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
  67. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
  68. package/daemon/context-packs/skills/process/using-superpowers/manifest.yaml +1 -1
  69. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
  70. package/daemon/context-packs/skills/process/writing-plans/manifest.yaml +1 -1
  71. package/daemon/context-packs/world-example/manifest.yaml +8 -0
  72. package/daemon/context-packs/world-example/your-world.md +37 -0
  73. package/daemon/dist/adapters/claude-code-adapter.d.ts +15 -0
  74. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  75. package/daemon/dist/adapters/claude-code-adapter.js +57 -0
  76. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  77. package/daemon/dist/build-info.js +3 -3
  78. package/daemon/dist/db/all-migrations.d.ts.map +1 -1
  79. package/daemon/dist/db/all-migrations.js +4 -0
  80. package/daemon/dist/db/all-migrations.js.map +1 -1
  81. package/daemon/dist/db/migrations/072_thread_seat_map.d.ts +3 -0
  82. package/daemon/dist/db/migrations/072_thread_seat_map.d.ts.map +1 -0
  83. package/daemon/dist/db/migrations/072_thread_seat_map.js +22 -0
  84. package/daemon/dist/db/migrations/072_thread_seat_map.js.map +1 -0
  85. package/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts +3 -0
  86. package/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts.map +1 -0
  87. package/daemon/dist/db/migrations/073_queue_transition_wakes.js +21 -0
  88. package/daemon/dist/db/migrations/073_queue_transition_wakes.js.map +1 -0
  89. package/daemon/dist/domain/activity-taxonomy.d.ts +112 -0
  90. package/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -0
  91. package/daemon/dist/domain/activity-taxonomy.js +99 -0
  92. package/daemon/dist/domain/activity-taxonomy.js.map +1 -0
  93. package/daemon/dist/domain/bind-plan.d.ts +19 -0
  94. package/daemon/dist/domain/bind-plan.d.ts.map +1 -0
  95. package/daemon/dist/domain/bind-plan.js +25 -0
  96. package/daemon/dist/domain/bind-plan.js.map +1 -0
  97. package/daemon/dist/domain/event-bus.d.ts +6 -0
  98. package/daemon/dist/domain/event-bus.d.ts.map +1 -1
  99. package/daemon/dist/domain/event-bus.js +15 -5
  100. package/daemon/dist/domain/event-bus.js.map +1 -1
  101. package/daemon/dist/domain/gateway/gateway-process-main.d.ts.map +1 -1
  102. package/daemon/dist/domain/gateway/gateway-process-main.js +9 -0
  103. package/daemon/dist/domain/gateway/gateway-process-main.js.map +1 -1
  104. package/daemon/dist/domain/gateway/gateway-process.d.ts.map +1 -1
  105. package/daemon/dist/domain/gateway/gateway-process.js +9 -0
  106. package/daemon/dist/domain/gateway/gateway-process.js.map +1 -1
  107. package/daemon/dist/domain/gateway/gateway-subsystem.d.ts +80 -0
  108. package/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -0
  109. package/daemon/dist/domain/gateway/gateway-subsystem.js +149 -0
  110. package/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -0
  111. package/daemon/dist/domain/gateway/human-registry.d.ts +109 -0
  112. package/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
  113. package/daemon/dist/domain/gateway/human-registry.js +250 -0
  114. package/daemon/dist/domain/gateway/human-registry.js.map +1 -1
  115. package/{dist → daemon/dist/domain/gateway}/slack/config.d.ts +8 -5
  116. package/daemon/dist/domain/gateway/slack/config.d.ts.map +1 -0
  117. package/{dist → daemon/dist/domain/gateway}/slack/config.js +8 -6
  118. package/daemon/dist/domain/gateway/slack/config.js.map +1 -0
  119. package/{dist → daemon/dist/domain/gateway}/slack/inbound-admission.d.ts +1 -1
  120. package/daemon/dist/domain/gateway/slack/inbound-admission.d.ts.map +1 -0
  121. package/daemon/dist/domain/gateway/slack/inbound-admission.js.map +1 -0
  122. package/{dist → daemon/dist/domain/gateway}/slack/inbound.d.ts +14 -3
  123. package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -0
  124. package/{dist → daemon/dist/domain/gateway}/slack/inbound.js +6 -5
  125. package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -0
  126. package/daemon/dist/domain/gateway/slack/message.d.ts +80 -0
  127. package/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -0
  128. package/daemon/dist/domain/gateway/slack/message.js +164 -0
  129. package/daemon/dist/domain/gateway/slack/message.js.map +1 -0
  130. package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +54 -0
  131. package/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -0
  132. package/daemon/dist/domain/gateway/slack/outbound-driver.js +96 -0
  133. package/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -0
  134. package/daemon/dist/domain/gateway/slack/queue-access.d.ts +53 -0
  135. package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -0
  136. package/daemon/dist/domain/gateway/slack/queue-access.js +72 -0
  137. package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -0
  138. package/daemon/dist/domain/gateway/slack/secrets.d.ts.map +1 -0
  139. package/daemon/dist/domain/gateway/slack/secrets.js.map +1 -0
  140. package/daemon/dist/domain/gateway/slack/slack-api.d.ts +106 -0
  141. package/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -0
  142. package/daemon/dist/domain/gateway/slack/slack-api.js +198 -0
  143. package/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -0
  144. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +47 -0
  145. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -0
  146. package/daemon/dist/domain/gateway/slack/slack-delivery.js +147 -0
  147. package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -0
  148. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +21 -0
  149. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -0
  150. package/daemon/dist/domain/gateway/slack/slack-subsystem.js +198 -0
  151. package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -0
  152. package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts +30 -0
  153. package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts.map +1 -0
  154. package/daemon/dist/domain/gateway/slack/socket-inbound.js +99 -0
  155. package/daemon/dist/domain/gateway/slack/socket-inbound.js.map +1 -0
  156. package/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -0
  157. package/daemon/dist/domain/gateway/slack/state-store.js.map +1 -0
  158. package/daemon/dist/domain/gateway/slack/thread-routing.d.ts +17 -0
  159. package/daemon/dist/domain/gateway/slack/thread-routing.d.ts.map +1 -0
  160. package/daemon/dist/domain/gateway/slack/thread-routing.js +35 -0
  161. package/daemon/dist/domain/gateway/slack/thread-routing.js.map +1 -0
  162. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +56 -0
  163. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -0
  164. package/daemon/dist/domain/gateway/slack/thread-seat-map.js +103 -0
  165. package/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -0
  166. package/daemon/dist/domain/gateway/spawn-gateway.d.ts.map +1 -1
  167. package/daemon/dist/domain/gateway/spawn-gateway.js +9 -0
  168. package/daemon/dist/domain/gateway/spawn-gateway.js.map +1 -1
  169. package/daemon/dist/domain/gateway/transport.d.ts.map +1 -1
  170. package/daemon/dist/domain/gateway/transport.js +9 -0
  171. package/daemon/dist/domain/gateway/transport.js.map +1 -1
  172. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  173. package/daemon/dist/domain/node-inventory.js +20 -0
  174. package/daemon/dist/domain/node-inventory.js.map +1 -1
  175. package/daemon/dist/domain/parked-query.d.ts +81 -0
  176. package/daemon/dist/domain/parked-query.d.ts.map +1 -0
  177. package/daemon/dist/domain/parked-query.js +126 -0
  178. package/daemon/dist/domain/parked-query.js.map +1 -0
  179. package/daemon/dist/domain/queue-pickup.d.ts +38 -0
  180. package/daemon/dist/domain/queue-pickup.d.ts.map +1 -0
  181. package/daemon/dist/domain/queue-pickup.js +67 -0
  182. package/daemon/dist/domain/queue-pickup.js.map +1 -0
  183. package/daemon/dist/domain/queue-repository.d.ts +38 -10
  184. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  185. package/daemon/dist/domain/queue-repository.js +267 -35
  186. package/daemon/dist/domain/queue-repository.js.map +1 -1
  187. package/daemon/dist/domain/queue-stuck-sweep.d.ts +77 -0
  188. package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -0
  189. package/daemon/dist/domain/queue-stuck-sweep.js +348 -0
  190. package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -0
  191. package/daemon/dist/domain/queue-wake-ladder.d.ts +96 -0
  192. package/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -0
  193. package/daemon/dist/domain/queue-wake-ladder.js +533 -0
  194. package/daemon/dist/domain/queue-wake-ladder.js.map +1 -0
  195. package/daemon/dist/domain/queue-wake-repository.d.ts +37 -0
  196. package/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -0
  197. package/daemon/dist/domain/queue-wake-repository.js +80 -0
  198. package/daemon/dist/domain/queue-wake-repository.js.map +1 -0
  199. package/daemon/dist/domain/rebuild-priming-chain.d.ts +28 -0
  200. package/daemon/dist/domain/rebuild-priming-chain.d.ts.map +1 -0
  201. package/daemon/dist/domain/rebuild-priming-chain.js +71 -0
  202. package/daemon/dist/domain/rebuild-priming-chain.js.map +1 -0
  203. package/daemon/dist/domain/review/compose.d.ts +3 -1
  204. package/daemon/dist/domain/review/compose.d.ts.map +1 -1
  205. package/daemon/dist/domain/review/compose.js +14 -8
  206. package/daemon/dist/domain/review/compose.js.map +1 -1
  207. package/daemon/dist/domain/review/gather.d.ts.map +1 -1
  208. package/daemon/dist/domain/review/gather.js +3 -1
  209. package/daemon/dist/domain/review/gather.js.map +1 -1
  210. package/daemon/dist/domain/rigspec-instantiator.d.ts +3 -0
  211. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  212. package/daemon/dist/domain/rigspec-instantiator.js +18 -0
  213. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  214. package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +6 -5
  215. package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -1
  216. package/daemon/dist/domain/scope/plan-lock-artifacts.js +23 -20
  217. package/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -1
  218. package/daemon/dist/domain/scope/scaffold-placeholder.d.ts +4 -5
  219. package/daemon/dist/domain/scope/scaffold-placeholder.d.ts.map +1 -1
  220. package/daemon/dist/domain/scope/scaffold-placeholder.js +6 -7
  221. package/daemon/dist/domain/scope/scaffold-placeholder.js.map +1 -1
  222. package/daemon/dist/domain/scope/scope-approve.d.ts +1 -1
  223. package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
  224. package/daemon/dist/domain/scope/scope-approve.js +5 -4
  225. package/daemon/dist/domain/scope/scope-approve.js.map +1 -1
  226. package/daemon/dist/domain/scope/scope-audit.d.ts +42 -3
  227. package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  228. package/daemon/dist/domain/scope/scope-audit.js +78 -93
  229. package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  230. package/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
  231. package/daemon/dist/domain/scope/scope-view-projection.js +7 -2
  232. package/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
  233. package/daemon/dist/domain/seat-activity-service.d.ts +91 -0
  234. package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
  235. package/daemon/dist/domain/seat-activity-service.js +416 -1
  236. package/daemon/dist/domain/seat-activity-service.js.map +1 -1
  237. package/daemon/dist/domain/seat-handover-planner.d.ts +14 -0
  238. package/daemon/dist/domain/seat-handover-planner.d.ts.map +1 -1
  239. package/daemon/dist/domain/seat-handover-planner.js +14 -1
  240. package/daemon/dist/domain/seat-handover-planner.js.map +1 -1
  241. package/daemon/dist/domain/seat-handover-service.d.ts +54 -1
  242. package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
  243. package/daemon/dist/domain/seat-handover-service.js +162 -19
  244. package/daemon/dist/domain/seat-handover-service.js.map +1 -1
  245. package/daemon/dist/domain/session-transport.js +1 -2
  246. package/daemon/dist/domain/session-transport.js.map +1 -1
  247. package/daemon/dist/domain/successor-session-launcher.d.ts +6 -1
  248. package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
  249. package/daemon/dist/domain/successor-session-launcher.js +3 -3
  250. package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  251. package/daemon/dist/domain/types.d.ts +33 -0
  252. package/daemon/dist/domain/types.d.ts.map +1 -1
  253. package/daemon/dist/domain/types.js.map +1 -1
  254. package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  255. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  256. package/daemon/dist/domain/user-settings/settings-store.js +48 -0
  257. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  258. package/daemon/dist/domain/view-projector.d.ts +1 -1
  259. package/daemon/dist/domain/view-projector.d.ts.map +1 -1
  260. package/daemon/dist/domain/view-projector.js +41 -2
  261. package/daemon/dist/domain/view-projector.js.map +1 -1
  262. package/daemon/dist/domain/watchdog-policy-engine.d.ts +7 -0
  263. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  264. package/daemon/dist/domain/watchdog-policy-engine.js +3 -0
  265. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  266. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +4 -3
  267. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
  268. package/daemon/dist/domain/workspace/default-workspace-scaffold.js +56 -196
  269. package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
  270. package/daemon/dist/domain/workspace/getting-started-narrative.js +1 -1
  271. package/daemon/dist/domain/workspace/getting-started-narrative.js.map +1 -1
  272. package/daemon/dist/domain/workspace/workspace-doctor.d.ts +8 -11
  273. package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
  274. package/daemon/dist/domain/workspace/workspace-doctor.js +23 -25
  275. package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
  276. package/daemon/dist/gateway-slack-surface.d.ts +4 -0
  277. package/daemon/dist/gateway-slack-surface.d.ts.map +1 -0
  278. package/daemon/dist/gateway-slack-surface.js +8 -0
  279. package/daemon/dist/gateway-slack-surface.js.map +1 -0
  280. package/daemon/dist/index.d.ts +29 -0
  281. package/daemon/dist/index.d.ts.map +1 -1
  282. package/daemon/dist/index.js +99 -4
  283. package/daemon/dist/index.js.map +1 -1
  284. package/daemon/dist/lib/pane-envelope.d.ts +1 -1
  285. package/daemon/dist/lib/pane-envelope.d.ts.map +1 -1
  286. package/daemon/dist/lib/pane-envelope.js +8 -14
  287. package/daemon/dist/lib/pane-envelope.js.map +1 -1
  288. package/daemon/dist/routes/activity.d.ts +13 -0
  289. package/daemon/dist/routes/activity.d.ts.map +1 -1
  290. package/daemon/dist/routes/activity.js +186 -0
  291. package/daemon/dist/routes/activity.js.map +1 -1
  292. package/daemon/dist/routes/config.js +2 -2
  293. package/daemon/dist/routes/config.js.map +1 -1
  294. package/daemon/dist/routes/gateway.d.ts +3 -0
  295. package/daemon/dist/routes/gateway.d.ts.map +1 -0
  296. package/daemon/dist/routes/gateway.js +46 -0
  297. package/daemon/dist/routes/gateway.js.map +1 -0
  298. package/daemon/dist/routes/health-summary.d.ts.map +1 -1
  299. package/daemon/dist/routes/health-summary.js +8 -0
  300. package/daemon/dist/routes/health-summary.js.map +1 -1
  301. package/daemon/dist/routes/queue.d.ts.map +1 -1
  302. package/daemon/dist/routes/queue.js +3 -1
  303. package/daemon/dist/routes/queue.js.map +1 -1
  304. package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
  305. package/daemon/dist/routes/scope-audit.js +72 -13
  306. package/daemon/dist/routes/scope-audit.js.map +1 -1
  307. package/daemon/dist/routes/seat.d.ts.map +1 -1
  308. package/daemon/dist/routes/seat.js +15 -0
  309. package/daemon/dist/routes/seat.js.map +1 -1
  310. package/daemon/dist/server.d.ts +17 -0
  311. package/daemon/dist/server.d.ts.map +1 -1
  312. package/daemon/dist/server.js +25 -4
  313. package/daemon/dist/server.js.map +1 -1
  314. package/daemon/dist/startup.d.ts +4 -0
  315. package/daemon/dist/startup.d.ts.map +1 -1
  316. package/daemon/dist/startup.js +33 -0
  317. package/daemon/dist/startup.js.map +1 -1
  318. package/daemon/docs/reference/agent-state-taxonomy.md +106 -0
  319. package/daemon/docs/reference/project-workspace.md +22 -14
  320. package/daemon/docs/reference/refocus-channel.md +27 -14
  321. package/daemon/docs/reference/sdlc-conventions.md +24 -13
  322. package/daemon/specs/agents/shared/skills/core/agent-startup-and-context-ingestion/SKILL.md +1 -1
  323. package/daemon/specs/agents/shared/skills/pm/requirements-writer/SKILL.md +21 -15
  324. package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/guidance/role.md +1 -1
  325. package/dist/build-info.js +3 -3
  326. package/dist/commands/config-init-workspace.d.ts.map +1 -1
  327. package/dist/commands/config-init-workspace.js +32 -57
  328. package/dist/commands/config-init-workspace.js.map +1 -1
  329. package/dist/commands/config.d.ts.map +1 -1
  330. package/dist/commands/config.js +5 -0
  331. package/dist/commands/config.js.map +1 -1
  332. package/dist/commands/daemon.d.ts.map +1 -1
  333. package/dist/commands/daemon.js +14 -4
  334. package/dist/commands/daemon.js.map +1 -1
  335. package/dist/commands/gateway.d.ts +19 -1
  336. package/dist/commands/gateway.d.ts.map +1 -1
  337. package/dist/commands/gateway.js +157 -33
  338. package/dist/commands/gateway.js.map +1 -1
  339. package/dist/commands/parked.d.ts +3 -0
  340. package/dist/commands/parked.d.ts.map +1 -0
  341. package/dist/commands/parked.js +83 -0
  342. package/dist/commands/parked.js.map +1 -0
  343. package/dist/commands/proof.d.ts +2 -1
  344. package/dist/commands/proof.d.ts.map +1 -1
  345. package/dist/commands/proof.js +8 -8
  346. package/dist/commands/proof.js.map +1 -1
  347. package/dist/commands/ps.d.ts +10 -0
  348. package/dist/commands/ps.d.ts.map +1 -1
  349. package/dist/commands/ps.js +14 -3
  350. package/dist/commands/ps.js.map +1 -1
  351. package/dist/commands/queue.d.ts.map +1 -1
  352. package/dist/commands/queue.js +31 -3
  353. package/dist/commands/queue.js.map +1 -1
  354. package/dist/commands/scope.d.ts.map +1 -1
  355. package/dist/commands/scope.js +255 -136
  356. package/dist/commands/scope.js.map +1 -1
  357. package/dist/commands/seat.d.ts.map +1 -1
  358. package/dist/commands/seat.js +40 -10
  359. package/dist/commands/seat.js.map +1 -1
  360. package/dist/commands/send.d.ts +1 -1
  361. package/dist/commands/send.d.ts.map +1 -1
  362. package/dist/commands/send.js +13 -14
  363. package/dist/commands/send.js.map +1 -1
  364. package/dist/commands/slack.d.ts +14 -28
  365. package/dist/commands/slack.d.ts.map +1 -1
  366. package/dist/commands/slack.js +73 -187
  367. package/dist/commands/slack.js.map +1 -1
  368. package/dist/commands/start.d.ts +3 -0
  369. package/dist/commands/start.d.ts.map +1 -1
  370. package/dist/commands/start.js +12 -5
  371. package/dist/commands/start.js.map +1 -1
  372. package/dist/commands/up.d.ts.map +1 -1
  373. package/dist/commands/up.js +11 -4
  374. package/dist/commands/up.js.map +1 -1
  375. package/dist/commands/view.d.ts +4 -2
  376. package/dist/commands/view.d.ts.map +1 -1
  377. package/dist/commands/view.js +1 -1
  378. package/dist/commands/view.js.map +1 -1
  379. package/dist/commands/watchdog.d.ts.map +1 -1
  380. package/dist/commands/watchdog.js +2 -1
  381. package/dist/commands/watchdog.js.map +1 -1
  382. package/dist/commands/workspace.js +1 -1
  383. package/dist/config-store.d.ts +15 -1
  384. package/dist/config-store.d.ts.map +1 -1
  385. package/dist/config-store.js +60 -0
  386. package/dist/config-store.js.map +1 -1
  387. package/dist/cross-host-target.d.ts.map +1 -1
  388. package/dist/cross-host-target.js +5 -4
  389. package/dist/cross-host-target.js.map +1 -1
  390. package/dist/daemon-lifecycle.d.ts +45 -3
  391. package/dist/daemon-lifecycle.d.ts.map +1 -1
  392. package/dist/daemon-lifecycle.js +126 -0
  393. package/dist/daemon-lifecycle.js.map +1 -1
  394. package/dist/index.d.ts.map +1 -1
  395. package/dist/index.js +2 -0
  396. package/dist/index.js.map +1 -1
  397. package/dist/lib/scope/capability-delta.d.ts +9 -0
  398. package/dist/lib/scope/capability-delta.d.ts.map +1 -0
  399. package/dist/lib/scope/capability-delta.js +73 -0
  400. package/dist/lib/scope/capability-delta.js.map +1 -0
  401. package/dist/lib/scope/scaffold-placeholder.d.ts +4 -5
  402. package/dist/lib/scope/scaffold-placeholder.d.ts.map +1 -1
  403. package/dist/lib/scope/scaffold-placeholder.js +6 -7
  404. package/dist/lib/scope/scaffold-placeholder.js.map +1 -1
  405. package/dist/lib/scope/scope-audit.d.ts +42 -3
  406. package/dist/lib/scope/scope-audit.d.ts.map +1 -1
  407. package/dist/lib/scope/scope-audit.js +78 -93
  408. package/dist/lib/scope/scope-audit.js.map +1 -1
  409. package/dist/lib/scope/scope-fs.d.ts +18 -14
  410. package/dist/lib/scope/scope-fs.d.ts.map +1 -1
  411. package/dist/lib/scope/scope-fs.js +60 -29
  412. package/dist/lib/scope/scope-fs.js.map +1 -1
  413. package/dist/lib/scope/templates.d.ts +17 -17
  414. package/dist/lib/scope/templates.d.ts.map +1 -1
  415. package/dist/lib/scope/templates.js +35 -39
  416. package/dist/lib/scope/templates.js.map +1 -1
  417. package/dist/lib/scope-templates/backlog-deprecation.md +3 -1
  418. package/dist/lib/scope-templates/backlog-tech-debt.md +3 -1
  419. package/dist/lib/scope-templates/bug-fix.md +3 -1
  420. package/dist/lib/scope-templates/capability-delta.md +60 -0
  421. package/dist/lib/scope-templates/mission-placeholder.md +9 -40
  422. package/dist/lib/scope-templates/mission-progress.md +5 -6
  423. package/dist/lib/scope-templates/mission-release.md +9 -40
  424. package/dist/lib/scope-templates/notes.md +14 -0
  425. package/dist/lib/scope-templates/placeholder.md +3 -1
  426. package/dist/lib/scope-templates/proof.md +1 -1
  427. package/dist/lib/scope-templates/release-feature.md +3 -1
  428. package/dist/lib/scope-templates/research.md +3 -1
  429. package/dist/lib/scope-templates/slice-progress.md +4 -5
  430. package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.d.ts +15 -0
  431. package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  432. package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.js +57 -0
  433. package/node_modules/@openrig/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  434. package/node_modules/@openrig/daemon/dist/build-info.js +3 -3
  435. package/node_modules/@openrig/daemon/dist/db/all-migrations.d.ts.map +1 -1
  436. package/node_modules/@openrig/daemon/dist/db/all-migrations.js +4 -0
  437. package/node_modules/@openrig/daemon/dist/db/all-migrations.js.map +1 -1
  438. package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.d.ts +3 -0
  439. package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.d.ts.map +1 -0
  440. package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.js +22 -0
  441. package/node_modules/@openrig/daemon/dist/db/migrations/072_thread_seat_map.js.map +1 -0
  442. package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts +3 -0
  443. package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.d.ts.map +1 -0
  444. package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.js +21 -0
  445. package/node_modules/@openrig/daemon/dist/db/migrations/073_queue_transition_wakes.js.map +1 -0
  446. package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.d.ts +112 -0
  447. package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -0
  448. package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.js +99 -0
  449. package/node_modules/@openrig/daemon/dist/domain/activity-taxonomy.js.map +1 -0
  450. package/node_modules/@openrig/daemon/dist/domain/bind-plan.d.ts +19 -0
  451. package/node_modules/@openrig/daemon/dist/domain/bind-plan.d.ts.map +1 -0
  452. package/node_modules/@openrig/daemon/dist/domain/bind-plan.js +25 -0
  453. package/node_modules/@openrig/daemon/dist/domain/bind-plan.js.map +1 -0
  454. package/node_modules/@openrig/daemon/dist/domain/event-bus.d.ts +6 -0
  455. package/node_modules/@openrig/daemon/dist/domain/event-bus.d.ts.map +1 -1
  456. package/node_modules/@openrig/daemon/dist/domain/event-bus.js +15 -5
  457. package/node_modules/@openrig/daemon/dist/domain/event-bus.js.map +1 -1
  458. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process-main.d.ts.map +1 -1
  459. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process-main.js +9 -0
  460. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process-main.js.map +1 -1
  461. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process.d.ts.map +1 -1
  462. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process.js +9 -0
  463. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-process.js.map +1 -1
  464. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.d.ts +80 -0
  465. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -0
  466. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js +149 -0
  467. package/node_modules/@openrig/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -0
  468. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.d.ts +109 -0
  469. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
  470. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.js +250 -0
  471. package/node_modules/@openrig/daemon/dist/domain/gateway/human-registry.js.map +1 -1
  472. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.d.ts +44 -0
  473. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.d.ts.map +1 -0
  474. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.js +62 -0
  475. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/config.js.map +1 -0
  476. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.d.ts +8 -0
  477. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.d.ts.map +1 -0
  478. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.js +20 -0
  479. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound-admission.js.map +1 -0
  480. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts +113 -0
  481. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -0
  482. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js +146 -0
  483. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/inbound.js.map +1 -0
  484. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.d.ts +80 -0
  485. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -0
  486. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.js +164 -0
  487. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/message.js.map +1 -0
  488. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts +54 -0
  489. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.d.ts.map +1 -0
  490. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js +96 -0
  491. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/outbound-driver.js.map +1 -0
  492. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts +53 -0
  493. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -0
  494. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js +72 -0
  495. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -0
  496. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.d.ts +21 -0
  497. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.d.ts.map +1 -0
  498. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.js +73 -0
  499. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/secrets.js.map +1 -0
  500. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.d.ts +106 -0
  501. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -0
  502. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.js +198 -0
  503. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -0
  504. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +47 -0
  505. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -0
  506. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js +147 -0
  507. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -0
  508. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +21 -0
  509. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -0
  510. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js +198 -0
  511. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -0
  512. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.d.ts +30 -0
  513. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.d.ts.map +1 -0
  514. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.js +99 -0
  515. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/socket-inbound.js.map +1 -0
  516. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.d.ts +62 -0
  517. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -0
  518. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.js +132 -0
  519. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/state-store.js.map +1 -0
  520. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.d.ts +17 -0
  521. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.d.ts.map +1 -0
  522. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.js +35 -0
  523. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-routing.js.map +1 -0
  524. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +56 -0
  525. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -0
  526. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.js +103 -0
  527. package/node_modules/@openrig/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -0
  528. package/node_modules/@openrig/daemon/dist/domain/gateway/spawn-gateway.d.ts.map +1 -1
  529. package/node_modules/@openrig/daemon/dist/domain/gateway/spawn-gateway.js +9 -0
  530. package/node_modules/@openrig/daemon/dist/domain/gateway/spawn-gateway.js.map +1 -1
  531. package/node_modules/@openrig/daemon/dist/domain/gateway/transport.d.ts.map +1 -1
  532. package/node_modules/@openrig/daemon/dist/domain/gateway/transport.js +9 -0
  533. package/node_modules/@openrig/daemon/dist/domain/gateway/transport.js.map +1 -1
  534. package/node_modules/@openrig/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  535. package/node_modules/@openrig/daemon/dist/domain/node-inventory.js +20 -0
  536. package/node_modules/@openrig/daemon/dist/domain/node-inventory.js.map +1 -1
  537. package/node_modules/@openrig/daemon/dist/domain/parked-query.d.ts +81 -0
  538. package/node_modules/@openrig/daemon/dist/domain/parked-query.d.ts.map +1 -0
  539. package/node_modules/@openrig/daemon/dist/domain/parked-query.js +126 -0
  540. package/node_modules/@openrig/daemon/dist/domain/parked-query.js.map +1 -0
  541. package/node_modules/@openrig/daemon/dist/domain/queue-pickup.d.ts +38 -0
  542. package/node_modules/@openrig/daemon/dist/domain/queue-pickup.d.ts.map +1 -0
  543. package/node_modules/@openrig/daemon/dist/domain/queue-pickup.js +67 -0
  544. package/node_modules/@openrig/daemon/dist/domain/queue-pickup.js.map +1 -0
  545. package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts +38 -10
  546. package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  547. package/node_modules/@openrig/daemon/dist/domain/queue-repository.js +267 -35
  548. package/node_modules/@openrig/daemon/dist/domain/queue-repository.js.map +1 -1
  549. package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.d.ts +77 -0
  550. package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -0
  551. package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.js +348 -0
  552. package/node_modules/@openrig/daemon/dist/domain/queue-stuck-sweep.js.map +1 -0
  553. package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.d.ts +96 -0
  554. package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -0
  555. package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.js +533 -0
  556. package/node_modules/@openrig/daemon/dist/domain/queue-wake-ladder.js.map +1 -0
  557. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts +37 -0
  558. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.d.ts.map +1 -0
  559. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js +80 -0
  560. package/node_modules/@openrig/daemon/dist/domain/queue-wake-repository.js.map +1 -0
  561. package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.d.ts +28 -0
  562. package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.d.ts.map +1 -0
  563. package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.js +71 -0
  564. package/node_modules/@openrig/daemon/dist/domain/rebuild-priming-chain.js.map +1 -0
  565. package/node_modules/@openrig/daemon/dist/domain/review/compose.d.ts +3 -1
  566. package/node_modules/@openrig/daemon/dist/domain/review/compose.d.ts.map +1 -1
  567. package/node_modules/@openrig/daemon/dist/domain/review/compose.js +14 -8
  568. package/node_modules/@openrig/daemon/dist/domain/review/compose.js.map +1 -1
  569. package/node_modules/@openrig/daemon/dist/domain/review/gather.d.ts.map +1 -1
  570. package/node_modules/@openrig/daemon/dist/domain/review/gather.js +3 -1
  571. package/node_modules/@openrig/daemon/dist/domain/review/gather.js.map +1 -1
  572. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts +3 -0
  573. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  574. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js +18 -0
  575. package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  576. package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +6 -5
  577. package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -1
  578. package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.js +23 -20
  579. package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -1
  580. package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.d.ts +4 -5
  581. package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.d.ts.map +1 -1
  582. package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.js +6 -7
  583. package/node_modules/@openrig/daemon/dist/domain/scope/scaffold-placeholder.js.map +1 -1
  584. package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.d.ts +1 -1
  585. package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
  586. package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.js +5 -4
  587. package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.js.map +1 -1
  588. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts +42 -3
  589. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  590. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.js +78 -93
  591. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  592. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
  593. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js +7 -2
  594. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
  595. package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.d.ts +91 -0
  596. package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
  597. package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.js +416 -1
  598. package/node_modules/@openrig/daemon/dist/domain/seat-activity-service.js.map +1 -1
  599. package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.d.ts +14 -0
  600. package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.d.ts.map +1 -1
  601. package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.js +14 -1
  602. package/node_modules/@openrig/daemon/dist/domain/seat-handover-planner.js.map +1 -1
  603. package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.d.ts +54 -1
  604. package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
  605. package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.js +162 -19
  606. package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.js.map +1 -1
  607. package/node_modules/@openrig/daemon/dist/domain/session-transport.js +1 -2
  608. package/node_modules/@openrig/daemon/dist/domain/session-transport.js.map +1 -1
  609. package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.d.ts +6 -1
  610. package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
  611. package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.js +3 -3
  612. package/node_modules/@openrig/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  613. package/node_modules/@openrig/daemon/dist/domain/types.d.ts +33 -0
  614. package/node_modules/@openrig/daemon/dist/domain/types.d.ts.map +1 -1
  615. package/node_modules/@openrig/daemon/dist/domain/types.js.map +1 -1
  616. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  617. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  618. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js +48 -0
  619. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  620. package/node_modules/@openrig/daemon/dist/domain/view-projector.d.ts +1 -1
  621. package/node_modules/@openrig/daemon/dist/domain/view-projector.d.ts.map +1 -1
  622. package/node_modules/@openrig/daemon/dist/domain/view-projector.js +41 -2
  623. package/node_modules/@openrig/daemon/dist/domain/view-projector.js.map +1 -1
  624. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.d.ts +7 -0
  625. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  626. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.js +3 -0
  627. package/node_modules/@openrig/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  628. package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +4 -3
  629. package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
  630. package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.js +56 -196
  631. package/node_modules/@openrig/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
  632. package/node_modules/@openrig/daemon/dist/domain/workspace/getting-started-narrative.js +1 -1
  633. package/node_modules/@openrig/daemon/dist/domain/workspace/getting-started-narrative.js.map +1 -1
  634. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.d.ts +8 -11
  635. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
  636. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js +23 -25
  637. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
  638. package/node_modules/@openrig/daemon/dist/gateway-slack-surface.d.ts +4 -0
  639. package/node_modules/@openrig/daemon/dist/gateway-slack-surface.d.ts.map +1 -0
  640. package/node_modules/@openrig/daemon/dist/gateway-slack-surface.js +8 -0
  641. package/node_modules/@openrig/daemon/dist/gateway-slack-surface.js.map +1 -0
  642. package/node_modules/@openrig/daemon/dist/index.d.ts +29 -0
  643. package/node_modules/@openrig/daemon/dist/index.d.ts.map +1 -1
  644. package/node_modules/@openrig/daemon/dist/index.js +99 -4
  645. package/node_modules/@openrig/daemon/dist/index.js.map +1 -1
  646. package/node_modules/@openrig/daemon/dist/lib/pane-envelope.d.ts +1 -1
  647. package/node_modules/@openrig/daemon/dist/lib/pane-envelope.d.ts.map +1 -1
  648. package/node_modules/@openrig/daemon/dist/lib/pane-envelope.js +8 -14
  649. package/node_modules/@openrig/daemon/dist/lib/pane-envelope.js.map +1 -1
  650. package/node_modules/@openrig/daemon/dist/routes/activity.d.ts +13 -0
  651. package/node_modules/@openrig/daemon/dist/routes/activity.d.ts.map +1 -1
  652. package/node_modules/@openrig/daemon/dist/routes/activity.js +186 -0
  653. package/node_modules/@openrig/daemon/dist/routes/activity.js.map +1 -1
  654. package/node_modules/@openrig/daemon/dist/routes/config.js +2 -2
  655. package/node_modules/@openrig/daemon/dist/routes/config.js.map +1 -1
  656. package/node_modules/@openrig/daemon/dist/routes/gateway.d.ts +3 -0
  657. package/node_modules/@openrig/daemon/dist/routes/gateway.d.ts.map +1 -0
  658. package/node_modules/@openrig/daemon/dist/routes/gateway.js +46 -0
  659. package/node_modules/@openrig/daemon/dist/routes/gateway.js.map +1 -0
  660. package/node_modules/@openrig/daemon/dist/routes/health-summary.d.ts.map +1 -1
  661. package/node_modules/@openrig/daemon/dist/routes/health-summary.js +8 -0
  662. package/node_modules/@openrig/daemon/dist/routes/health-summary.js.map +1 -1
  663. package/node_modules/@openrig/daemon/dist/routes/queue.d.ts.map +1 -1
  664. package/node_modules/@openrig/daemon/dist/routes/queue.js +3 -1
  665. package/node_modules/@openrig/daemon/dist/routes/queue.js.map +1 -1
  666. package/node_modules/@openrig/daemon/dist/routes/scope-audit.d.ts.map +1 -1
  667. package/node_modules/@openrig/daemon/dist/routes/scope-audit.js +72 -13
  668. package/node_modules/@openrig/daemon/dist/routes/scope-audit.js.map +1 -1
  669. package/node_modules/@openrig/daemon/dist/routes/seat.d.ts.map +1 -1
  670. package/node_modules/@openrig/daemon/dist/routes/seat.js +15 -0
  671. package/node_modules/@openrig/daemon/dist/routes/seat.js.map +1 -1
  672. package/node_modules/@openrig/daemon/dist/server.d.ts +17 -0
  673. package/node_modules/@openrig/daemon/dist/server.d.ts.map +1 -1
  674. package/node_modules/@openrig/daemon/dist/server.js +25 -4
  675. package/node_modules/@openrig/daemon/dist/server.js.map +1 -1
  676. package/node_modules/@openrig/daemon/dist/startup.d.ts +4 -0
  677. package/node_modules/@openrig/daemon/dist/startup.d.ts.map +1 -1
  678. package/node_modules/@openrig/daemon/dist/startup.js +33 -0
  679. package/node_modules/@openrig/daemon/dist/startup.js.map +1 -1
  680. package/node_modules/@openrig/daemon/package.json +5 -1
  681. package/package.json +1 -1
  682. package/tui/dist/daemon-client.d.ts +5 -0
  683. package/tui/dist/daemon-client.d.ts.map +1 -1
  684. package/tui/dist/daemon-client.js +17 -0
  685. package/tui/dist/daemon-client.js.map +1 -1
  686. package/tui/dist/hydrate.d.ts.map +1 -1
  687. package/tui/dist/hydrate.js +12 -4
  688. package/tui/dist/hydrate.js.map +1 -1
  689. package/tui/dist/live-events.d.ts +21 -0
  690. package/tui/dist/live-events.d.ts.map +1 -0
  691. package/tui/dist/live-events.js +88 -0
  692. package/tui/dist/live-events.js.map +1 -0
  693. package/tui/dist/live.js +1 -1
  694. package/tui/dist/main.js +27 -8
  695. package/tui/dist/main.js.map +1 -1
  696. package/tui/dist/refresh.d.ts +10 -1
  697. package/tui/dist/refresh.d.ts.map +1 -1
  698. package/tui/dist/refresh.js +22 -2
  699. package/tui/dist/refresh.js.map +1 -1
  700. package/daemon/context-packs/world/install/01-world-from-primitives.md +0 -97
  701. package/daemon/context-packs/world/install/02-permission-self-sleep.md +0 -141
  702. package/daemon/context-packs/world/install/03-what-this-is-for.md +0 -86
  703. package/daemon/context-packs/world/install/04-ontology.md +0 -790
  704. package/daemon/context-packs/world/install/05-harness-power-use.md +0 -355
  705. package/daemon/context-packs/world/install/06-a-competent-turn.md +0 -225
  706. package/daemon/context-packs/world/install/manifest.yaml +0 -125
  707. package/dist/lib/scope-templates/mission-brief.md +0 -20
  708. package/dist/lib/scope-templates/mission-notes.md +0 -102
  709. package/dist/slack/config.d.ts.map +0 -1
  710. package/dist/slack/config.js.map +0 -1
  711. package/dist/slack/connector-server.d.ts +0 -31
  712. package/dist/slack/connector-server.d.ts.map +0 -1
  713. package/dist/slack/connector-server.js +0 -108
  714. package/dist/slack/connector-server.js.map +0 -1
  715. package/dist/slack/inbound-admission.d.ts.map +0 -1
  716. package/dist/slack/inbound-admission.js.map +0 -1
  717. package/dist/slack/inbound.d.ts.map +0 -1
  718. package/dist/slack/inbound.js.map +0 -1
  719. package/dist/slack/message.d.ts +0 -39
  720. package/dist/slack/message.d.ts.map +0 -1
  721. package/dist/slack/message.js +0 -88
  722. package/dist/slack/message.js.map +0 -1
  723. package/dist/slack/outbound.d.ts +0 -39
  724. package/dist/slack/outbound.d.ts.map +0 -1
  725. package/dist/slack/outbound.js +0 -63
  726. package/dist/slack/outbound.js.map +0 -1
  727. package/dist/slack/queue-bridge.d.ts +0 -61
  728. package/dist/slack/queue-bridge.d.ts.map +0 -1
  729. package/dist/slack/queue-bridge.js +0 -114
  730. package/dist/slack/queue-bridge.js.map +0 -1
  731. package/dist/slack/secrets.d.ts.map +0 -1
  732. package/dist/slack/secrets.js.map +0 -1
  733. package/dist/slack/slack-api.d.ts +0 -49
  734. package/dist/slack/slack-api.d.ts.map +0 -1
  735. package/dist/slack/slack-api.js +0 -110
  736. package/dist/slack/slack-api.js.map +0 -1
  737. package/dist/slack/slack-delivery.d.ts +0 -14
  738. package/dist/slack/slack-delivery.d.ts.map +0 -1
  739. package/dist/slack/slack-delivery.js +0 -28
  740. package/dist/slack/slack-delivery.js.map +0 -1
  741. package/dist/slack/state-store.d.ts.map +0 -1
  742. package/dist/slack/state-store.js.map +0 -1
  743. /package/{dist → daemon/dist/domain/gateway}/slack/inbound-admission.js +0 -0
  744. /package/{dist → daemon/dist/domain/gateway}/slack/secrets.d.ts +0 -0
  745. /package/{dist → daemon/dist/domain/gateway}/slack/secrets.js +0 -0
  746. /package/{dist → daemon/dist/domain/gateway}/slack/state-store.d.ts +0 -0
  747. /package/{dist → daemon/dist/domain/gateway}/slack/state-store.js +0 -0
@@ -0,0 +1,106 @@
1
+ export type FetchImpl = (url: string, init?: RequestInit) => Promise<Response>;
2
+ export interface HttpResult {
3
+ ok: boolean;
4
+ status: number;
5
+ error?: string;
6
+ }
7
+ /**
8
+ * Post to a Slack incoming webhook. Fail-VISIBLE (item 3): any non-2xx or
9
+ * transport error returns ok:false with a bounded error string — the caller
10
+ * logs loudly and does NOT mark the alert seen (so it retries, never a silent drop).
11
+ *
12
+ * S10: RETIRED from the production path — outbound posts via postChatMessage on the in-daemon
13
+ * subsystem (a webhook cannot carry thread_ts). Kept as a tested generic client; no production
14
+ * caller remains.
15
+ */
16
+ export declare function postWebhook(url: string, payload: unknown, fetchImpl?: FetchImpl, timeoutMs?: number): Promise<HttpResult>;
17
+ export interface WebApiResult {
18
+ ok: boolean;
19
+ status: number;
20
+ grantedScopes: string[];
21
+ json: Record<string, unknown>;
22
+ error?: string;
23
+ }
24
+ /** S10 shape-fix — the per-method REQUEST SHAPE. Slack's read methods (conversations.info /
25
+ * history / replies) reject a JSON POST with `invalid_arguments` (operator-measured live);
26
+ * their supported shape is GET with URL-query args. Write/JSON methods (auth.test,
27
+ * apps.connections.open, chat.postMessage, files.completeUploadExternal) keep JSON POST
28
+ * byte-identically — the default, so no existing caller changes shape implicitly. */
29
+ export type WebApiRequestShape = "json-post" | "get-query";
30
+ /** Call a Slack Web API method (Bearer token) and surface the granted-scope header. */
31
+ export declare function callWebApi(method: string, token: string, body: Record<string, unknown>, fetchImpl?: FetchImpl, timeoutMs?: number, shape?: WebApiRequestShape): Promise<WebApiResult>;
32
+ /** Item 5: read the ACTUAL granted scopes from the response header (configured != granted). */
33
+ export declare function getGrantedScopes(token: string, fetchImpl?: FetchImpl, timeoutMs?: number): Promise<{
34
+ ok: boolean;
35
+ granted: string[];
36
+ error?: string;
37
+ }>;
38
+ export interface ScopeVerdict {
39
+ ok: boolean;
40
+ granted: string[];
41
+ missing: string[];
42
+ error?: string;
43
+ }
44
+ /** Item 5: verify the token actually HAS the required scopes (from the header, not config). */
45
+ export declare function verifyScopes(token: string, required: string[], fetchImpl?: FetchImpl, timeoutMs?: number): Promise<ScopeVerdict>;
46
+ /** Item 5: verify the bot is actually a MEMBER of the channel before inbound-ready. */
47
+ export declare function verifyChannelMembership(token: string, channel: string, fetchImpl?: FetchImpl, timeoutMs?: number): Promise<{
48
+ ok: boolean;
49
+ isMember: boolean;
50
+ name?: string;
51
+ error?: string;
52
+ }>;
53
+ /** Inbound Socket Mode: open a WebSocket URL via apps.connections.open (app-level xapp token). */
54
+ export declare function openSocketConnection(appToken: string, fetchImpl?: FetchImpl, timeoutMs?: number): Promise<{
55
+ ok: boolean;
56
+ url?: string;
57
+ error?: string;
58
+ }>;
59
+ export declare function getUploadURLExternal(token: string, filename: string, length: number, fetchImpl?: FetchImpl, timeoutMs?: number): Promise<{
60
+ ok: boolean;
61
+ uploadUrl?: string;
62
+ fileId?: string;
63
+ error?: string;
64
+ }>;
65
+ /** Leg 2: POST the raw bytes to the pre-signed upload URL (octet-stream, no auth header). */
66
+ export declare function uploadBytesExternal(uploadUrl: string, bytes: Uint8Array, fetchImpl?: FetchImpl, timeoutMs?: number): Promise<HttpResult>;
67
+ export declare function completeUploadExternal(token: string, input: {
68
+ files: {
69
+ id: string;
70
+ title?: string;
71
+ }[];
72
+ channelId: string;
73
+ threadTs?: string;
74
+ initialComment?: string;
75
+ }, fetchImpl?: FetchImpl, timeoutMs?: number): Promise<{
76
+ ok: boolean;
77
+ error?: string;
78
+ }>;
79
+ /** S10 (H) — read recent message TEXTS for reconcile-by-marker: a timeout is an AMBIGUOUS
80
+ * outcome (the post may have landed), so before any resend the sender searches for the
81
+ * embedded row-id marker. threadTs set → conversations.replies (a threaded reply lives in its
82
+ * thread, not channel history); absent → conversations.history. Read-only; bounded. */
83
+ export declare function fetchRecentMessageTexts(token: string, channel: string, threadTs: string | undefined, fetchImpl?: FetchImpl, limit?: number, timeoutMs?: number): Promise<{
84
+ ok: boolean;
85
+ texts: string[];
86
+ error?: string;
87
+ }>;
88
+ export interface PostChatMessageInput {
89
+ channel: string;
90
+ text: string;
91
+ blocks?: unknown[];
92
+ /** Thread reply: the PARENT message's ts (never a reply's ts — the affordance discriminator). */
93
+ thread_ts?: string;
94
+ }
95
+ /** S10 — outbound posting via the Web API (`chat.postMessage`). The R2 native shape needs
96
+ * thread_ts, which an incoming webhook cannot carry — the webhook path retires with the relay.
97
+ * A1.2 identity rail: this function NEVER accepts per-message `username`/`icon_*` overrides —
98
+ * the app's own identity is the only outbound identity (the customize-absence proof leg).
99
+ * Returns the posted message's ts (the thread anchor for a NEW conversation root). */
100
+ export declare function postChatMessage(token: string, input: PostChatMessageInput, fetchImpl?: FetchImpl, timeoutMs?: number): Promise<{
101
+ ok: boolean;
102
+ status: number;
103
+ ts?: string;
104
+ error?: string;
105
+ }>;
106
+ //# sourceMappingURL=slack-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-api.d.ts","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/slack-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,198 @@
1
+ // Slice-11 slack-connector — Slack HTTP client.
2
+ //
3
+ // `fetch`-based (http/https agnostic + injectable) matching the daemon's
4
+ // WebhookNotificationAdapter + its fake-fetch test pattern; every call is
5
+ // bounded by an explicit timeout with a structured failure result (never
6
+ // throws past the boundary, never hangs) — the remote-daemon-http discipline.
7
+ //
8
+ // Item 5 (the setup-scope trap): Slack's "Add New Webhook" grants ONLY the
9
+ // webhook scope; configured bot scopes are NOT granted until a full reinstall,
10
+ // with no warning. The ONLY proof of granted scopes is the `x-oauth-scopes`
11
+ // RESPONSE HEADER on a real API call — configured != granted. getGrantedScopes()
12
+ // reads exactly that header. Channel membership is likewise verified live
13
+ // (conversations.info.is_member) before declaring inbound ready.
14
+ const defaultFetch = (url, init) => fetch(url, init);
15
+ const DEFAULT_TIMEOUT_MS = 15000;
16
+ async function withTimeout(timeoutMs, run) {
17
+ const ctrl = new AbortController();
18
+ const timer = setTimeout(() => ctrl.abort(new Error(`timeout after ${timeoutMs}ms`)), timeoutMs);
19
+ try {
20
+ return await run(ctrl.signal);
21
+ }
22
+ finally {
23
+ clearTimeout(timer);
24
+ }
25
+ }
26
+ /**
27
+ * Post to a Slack incoming webhook. Fail-VISIBLE (item 3): any non-2xx or
28
+ * transport error returns ok:false with a bounded error string — the caller
29
+ * logs loudly and does NOT mark the alert seen (so it retries, never a silent drop).
30
+ *
31
+ * S10: RETIRED from the production path — outbound posts via postChatMessage on the in-daemon
32
+ * subsystem (a webhook cannot carry thread_ts). Kept as a tested generic client; no production
33
+ * caller remains.
34
+ */
35
+ export async function postWebhook(url, payload, fetchImpl = defaultFetch, timeoutMs = DEFAULT_TIMEOUT_MS) {
36
+ try {
37
+ return await withTimeout(timeoutMs, async (signal) => {
38
+ const res = await fetchImpl(url, {
39
+ method: "POST",
40
+ headers: { "content-type": "application/json" },
41
+ body: JSON.stringify(payload),
42
+ signal,
43
+ });
44
+ if (!res.ok) {
45
+ const text = await res.text().catch(() => "");
46
+ return { ok: false, status: res.status, error: `slack ${res.status}: ${text.slice(0, 160)}` };
47
+ }
48
+ return { ok: true, status: res.status };
49
+ });
50
+ }
51
+ catch (e) {
52
+ return { ok: false, status: 0, error: `webhook transport: ${e.message}` };
53
+ }
54
+ }
55
+ /** Call a Slack Web API method (Bearer token) and surface the granted-scope header. */
56
+ export async function callWebApi(method, token, body, fetchImpl = defaultFetch, timeoutMs = DEFAULT_TIMEOUT_MS, shape = "json-post") {
57
+ try {
58
+ return await withTimeout(timeoutMs, async (signal) => {
59
+ let res;
60
+ if (shape === "get-query") {
61
+ // The read shape: args in the query string, Authorization only — no body, no
62
+ // content-type (a body or JSON content-type is exactly what the endpoint rejects).
63
+ const url = new URL(`https://slack.com/api/${method}`);
64
+ for (const [k, v] of Object.entries(body)) {
65
+ if (v !== undefined && v !== null)
66
+ url.searchParams.set(k, String(v));
67
+ }
68
+ res = await fetchImpl(url.toString(), {
69
+ method: "GET",
70
+ headers: { authorization: `Bearer ${token}` },
71
+ signal,
72
+ });
73
+ }
74
+ else {
75
+ res = await fetchImpl(`https://slack.com/api/${method}`, {
76
+ method: "POST",
77
+ headers: { authorization: `Bearer ${token}`, "content-type": "application/json; charset=utf-8" },
78
+ body: JSON.stringify(body),
79
+ signal,
80
+ });
81
+ }
82
+ const scopeHeader = res.headers.get("x-oauth-scopes") ?? "";
83
+ const grantedScopes = scopeHeader
84
+ .split(",")
85
+ .map((s) => s.trim())
86
+ .filter(Boolean);
87
+ let json = {};
88
+ try {
89
+ json = (await res.json());
90
+ }
91
+ catch {
92
+ /* non-JSON */
93
+ }
94
+ const ok = res.ok && json.ok === true;
95
+ return { ok, status: res.status, grantedScopes, json, error: ok ? undefined : String(json.error ?? `http ${res.status}`) };
96
+ });
97
+ }
98
+ catch (e) {
99
+ return { ok: false, status: 0, grantedScopes: [], json: {}, error: `web-api transport: ${e.message}` };
100
+ }
101
+ }
102
+ /** Item 5: read the ACTUAL granted scopes from the response header (configured != granted). */
103
+ export async function getGrantedScopes(token, fetchImpl = defaultFetch, timeoutMs = DEFAULT_TIMEOUT_MS) {
104
+ const r = await callWebApi("auth.test", token, {}, fetchImpl, timeoutMs);
105
+ return { ok: r.ok, granted: r.grantedScopes, error: r.error };
106
+ }
107
+ /** Item 5: verify the token actually HAS the required scopes (from the header, not config). */
108
+ export async function verifyScopes(token, required, fetchImpl = defaultFetch, timeoutMs = DEFAULT_TIMEOUT_MS) {
109
+ const g = await getGrantedScopes(token, fetchImpl, timeoutMs);
110
+ if (!g.ok)
111
+ return { ok: false, granted: g.granted, missing: required, error: g.error };
112
+ const grantedSet = new Set(g.granted);
113
+ const missing = required.filter((s) => !grantedSet.has(s));
114
+ return { ok: missing.length === 0, granted: g.granted, missing };
115
+ }
116
+ /** Item 5: verify the bot is actually a MEMBER of the channel before inbound-ready. */
117
+ export async function verifyChannelMembership(token, channel, fetchImpl = defaultFetch, timeoutMs = DEFAULT_TIMEOUT_MS) {
118
+ const r = await callWebApi("conversations.info", token, { channel }, fetchImpl, timeoutMs, "get-query");
119
+ if (!r.ok)
120
+ return { ok: false, isMember: false, error: r.error };
121
+ const ch = (r.json.channel ?? {});
122
+ return { ok: true, isMember: ch.is_member === true, name: ch.name };
123
+ }
124
+ /** Inbound Socket Mode: open a WebSocket URL via apps.connections.open (app-level xapp token). */
125
+ export async function openSocketConnection(appToken, fetchImpl = defaultFetch, timeoutMs = DEFAULT_TIMEOUT_MS) {
126
+ const r = await callWebApi("apps.connections.open", appToken, {}, fetchImpl, timeoutMs);
127
+ if (!r.ok)
128
+ return { ok: false, error: r.error };
129
+ return { ok: true, url: r.json.url };
130
+ }
131
+ // ── S10 outbound images — the EXTERNAL-UPLOAD flow (the only living upload path) ────────────
132
+ // `files.upload` was sunset 2025-11-12 and no longer functions (affordance-verified). The flow:
133
+ // 1. files.getUploadURLExternal (filename, length) → { upload_url, file_id }
134
+ // 2. POST the raw bytes to upload_url (octet-stream)
135
+ // 3. files.completeUploadExternal ({ files, channel_id, thread_ts?, initial_comment? })
136
+ // Scope: files:write. thread_ts attaches the file INTO the conversation thread.
137
+ export async function getUploadURLExternal(token, filename, length, fetchImpl = defaultFetch, timeoutMs = DEFAULT_TIMEOUT_MS) {
138
+ const r = await callWebApi("files.getUploadURLExternal", token, { filename, length }, fetchImpl, timeoutMs);
139
+ if (!r.ok)
140
+ return { ok: false, error: r.error };
141
+ return { ok: true, uploadUrl: r.json.upload_url, fileId: r.json.file_id };
142
+ }
143
+ /** Leg 2: POST the raw bytes to the pre-signed upload URL (octet-stream, no auth header). */
144
+ export async function uploadBytesExternal(uploadUrl, bytes, fetchImpl = defaultFetch, timeoutMs = DEFAULT_TIMEOUT_MS) {
145
+ try {
146
+ return await withTimeout(timeoutMs, async (signal) => {
147
+ const res = await fetchImpl(uploadUrl, {
148
+ method: "POST",
149
+ headers: { "content-type": "application/octet-stream" },
150
+ body: bytes,
151
+ signal,
152
+ });
153
+ if (!res.ok)
154
+ return { ok: false, status: res.status, error: `upload ${res.status}` };
155
+ return { ok: true, status: res.status };
156
+ });
157
+ }
158
+ catch (e) {
159
+ return { ok: false, status: 0, error: `upload transport: ${e.message}` };
160
+ }
161
+ }
162
+ export async function completeUploadExternal(token, input, fetchImpl = defaultFetch, timeoutMs = DEFAULT_TIMEOUT_MS) {
163
+ const body = { files: input.files, channel_id: input.channelId };
164
+ if (input.threadTs)
165
+ body.thread_ts = input.threadTs;
166
+ if (input.initialComment)
167
+ body.initial_comment = input.initialComment;
168
+ const r = await callWebApi("files.completeUploadExternal", token, body, fetchImpl, timeoutMs);
169
+ return { ok: r.ok, error: r.error };
170
+ }
171
+ /** S10 (H) — read recent message TEXTS for reconcile-by-marker: a timeout is an AMBIGUOUS
172
+ * outcome (the post may have landed), so before any resend the sender searches for the
173
+ * embedded row-id marker. threadTs set → conversations.replies (a threaded reply lives in its
174
+ * thread, not channel history); absent → conversations.history. Read-only; bounded. */
175
+ export async function fetchRecentMessageTexts(token, channel, threadTs, fetchImpl = defaultFetch, limit = 100, timeoutMs = DEFAULT_TIMEOUT_MS) {
176
+ const method = threadTs ? "conversations.replies" : "conversations.history";
177
+ const body = threadTs ? { channel, ts: threadTs, limit } : { channel, limit };
178
+ const r = await callWebApi(method, token, body, fetchImpl, timeoutMs, "get-query");
179
+ if (!r.ok)
180
+ return { ok: false, texts: [], error: r.error };
181
+ const messages = (r.json.messages ?? []);
182
+ return { ok: true, texts: messages.map((m) => String(m.text ?? "")) };
183
+ }
184
+ /** S10 — outbound posting via the Web API (`chat.postMessage`). The R2 native shape needs
185
+ * thread_ts, which an incoming webhook cannot carry — the webhook path retires with the relay.
186
+ * A1.2 identity rail: this function NEVER accepts per-message `username`/`icon_*` overrides —
187
+ * the app's own identity is the only outbound identity (the customize-absence proof leg).
188
+ * Returns the posted message's ts (the thread anchor for a NEW conversation root). */
189
+ export async function postChatMessage(token, input, fetchImpl = defaultFetch, timeoutMs = DEFAULT_TIMEOUT_MS) {
190
+ const body = { channel: input.channel, text: input.text };
191
+ if (input.blocks?.length)
192
+ body.blocks = input.blocks;
193
+ if (input.thread_ts)
194
+ body.thread_ts = input.thread_ts;
195
+ const r = await callWebApi("chat.postMessage", token, body, fetchImpl, timeoutMs);
196
+ return { ok: r.ok, status: r.status, ts: typeof r.json.ts === "string" ? r.json.ts : undefined, error: r.error };
197
+ }
198
+ //# sourceMappingURL=slack-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-api.js","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/slack-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { type FetchImpl } from "./slack-api.js";
2
+ import type { SeenStore } from "./state-store.js";
3
+ import type { SubsystemDeliverFn } from "../gateway-subsystem.js";
4
+ import type { OutboundPostPayload } from "./outbound-driver.js";
5
+ export interface SubsystemSlackDeliveryOpts {
6
+ botToken: string;
7
+ channel: string;
8
+ sourceLabel: string;
9
+ bodyExcerpt?: number;
10
+ fetchImpl?: FetchImpl;
11
+ /** decisionId-keyed delivered-store (idempotent redelivery: replay re-acks, never re-posts). */
12
+ delivered: SeenStore;
13
+ /** H — decisionId-keyed ATTEMPTED-store, marked BEFORE the HTTP post. A retry of an attempted
14
+ * decision has an AMBIGUOUS prior outcome (a timeout may have landed), so it RECONCILES by
15
+ * marker before any resend — never a blind repost. Distinct from `delivered` (proven 2xx). */
16
+ attempted: SeenStore;
17
+ /** qitemId-keyed outbound seen-state (slice-11: marked ONLY after a successful post). */
18
+ outboundSeen: SeenStore;
19
+ /** Release the outbound driver's in-flight guard once a qitem is durably seen. */
20
+ release?: (qitemId: string) => void;
21
+ /** E (thread routing): resolve the thread anchor for this payload; undefined = new root.
22
+ * Wired by the thread-seat map; absent in the pre-routing composition. */
23
+ resolveThreadTs?: (payload: OutboundPostPayload) => string | undefined;
24
+ /** E: record a NEW root's ts so the conversation threads from here on. */
25
+ onPostedRoot?: (payload: OutboundPostPayload, ts: string) => void;
26
+ /** F (interim loudness rule): return the Slack USER ID to mention for an ESCALATION payload,
27
+ * undefined for everything else (quiet-threaded). The composition wires the registry lookup
28
+ * + the escalation predicate; delivery just renders what it is told. */
29
+ resolveMentionUserId?: (payload: OutboundPostPayload) => string | undefined;
30
+ /** G — read a LOCAL image the evidenceRef points at (the founder screenshot class: a seat's
31
+ * file has no public URL, so it rides the EXTERNAL-UPLOAD flow into the thread). Injectable
32
+ * for hermetic tests; default reads the filesystem, image extensions only. Return null =
33
+ * not an uploadable local image. */
34
+ readLocalImage?: (refPath: string) => {
35
+ bytes: Uint8Array;
36
+ filename: string;
37
+ } | null;
38
+ log?: (msg: string) => void;
39
+ }
40
+ /** Default local-image reader: absolute path, image extension, readable — else null. */
41
+ export declare function defaultReadLocalImage(refPath: string): {
42
+ bytes: Uint8Array;
43
+ filename: string;
44
+ } | null;
45
+ /** Build the subsystem DeliverFn. Contract mirrors the retired connector handleDecision. */
46
+ export declare function subsystemSlackDeliver(opts: SubsystemSlackDeliveryOpts): SubsystemDeliverFn;
47
+ //# sourceMappingURL=slack-delivery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-delivery.d.ts","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/slack-delivery.ts"],"names":[],"mappings":"AAiBA,OAAO,EAA+G,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE7J,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,kBAAkB,EAA4B,MAAM,yBAAyB,CAAC;AAC5F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,gGAAgG;IAChG,SAAS,EAAE,SAAS,CAAC;IACrB;;mGAE+F;IAC/F,SAAS,EAAE,SAAS,CAAC;IACrB,yFAAyF;IACzF,YAAY,EAAE,SAAS,CAAC;IACxB,kFAAkF;IAClF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC;+EAC2E;IAC3E,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,MAAM,GAAG,SAAS,CAAC;IACvE,0EAA0E;IAC1E,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE;;6EAEyE;IACzE,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,MAAM,GAAG,SAAS,CAAC;IAC5E;;;yCAGqC;IACrC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACrF,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAID,wFAAwF;AACxF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASrG;AAED,4FAA4F;AAC5F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,0BAA0B,GAAG,kBAAkB,CAyH1F"}
@@ -0,0 +1,147 @@
1
+ // S10 — the subsystem's Slack DELIVERY path (successor to the retired connector-server's
2
+ // slackDeliverFn; the proof-1 semantics carry over unchanged): render the OutboundDecision to a
3
+ // hygienic payload (slice-11 item 7 redaction + Block Kit via message.ts) and post it. A 2xx →
4
+ // ok (the in-process ack drains the durable buffer); any failure → a bounded failure class (the
5
+ // wire retains + replays — fail-visible, never a silent drop).
6
+ //
7
+ // Changes from the retired path, each contract-driven:
8
+ // - postWebhook → postChatMessage: the R2 thread shape needs thread_ts, which a webhook
9
+ // cannot carry. The webhook retires with the relay.
10
+ // - decisionId idempotent redelivery moved HERE from the connector: an already-delivered
11
+ // decisionId is re-acked WITHOUT re-posting (the delivered-store is the same SeenStore
12
+ // pattern, keyed by decisionId — distinct from the qitemId outbound seen-state).
13
+ // - delivered-ok additionally marks the qitemId seen (slice-11: seen ONLY after success) and
14
+ // releases the driver's in-flight guard.
15
+ import fs from "node:fs";
16
+ import path from "node:path";
17
+ import { postChatMessage, getUploadURLExternal, uploadBytesExternal, completeUploadExternal, fetchRecentMessageTexts } from "./slack-api.js";
18
+ import { buildOutboundMessage, attributionFromSession, reconcileToken } from "./message.js";
19
+ const LOCAL_IMAGE_EXT = new Set([".png", ".jpg", ".jpeg", ".gif", ".webp"]);
20
+ /** Default local-image reader: absolute path, image extension, readable — else null. */
21
+ export function defaultReadLocalImage(refPath) {
22
+ try {
23
+ if (!path.isAbsolute(refPath))
24
+ return null;
25
+ if (!LOCAL_IMAGE_EXT.has(path.extname(refPath).toLowerCase()))
26
+ return null;
27
+ const bytes = fs.readFileSync(refPath);
28
+ return { bytes: new Uint8Array(bytes), filename: path.basename(refPath) };
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ /** Build the subsystem DeliverFn. Contract mirrors the retired connector handleDecision. */
35
+ export function subsystemSlackDeliver(opts) {
36
+ const log = opts.log ?? (() => { });
37
+ return async (decision) => {
38
+ // Idempotent redelivery: an already-delivered decisionId is re-acked without re-posting.
39
+ if (opts.delivered.load().has(decision.decisionId)) {
40
+ log(`delivery: decision ${decision.decisionId} already delivered — re-ack, no re-post`);
41
+ return { ok: true };
42
+ }
43
+ const q = (decision.payload ?? {});
44
+ // M1 A5b (carried over from the retired sweep): an alert's evidenceRef IS the artifact the
45
+ // human judges — an https image URL rides as a Block Kit image. buildImageBlocks stays the
46
+ // single hygiene gate (drops non-https / secret-bearing), so the predicate lives in ONE place.
47
+ const mediaRefs = Array.isArray(q.media)
48
+ ? q.media
49
+ : q.evidenceRef
50
+ ? [{ imageUrl: String(q.evidenceRef), altText: q.summary ?? "attachment" }]
51
+ : undefined;
52
+ const payload = buildOutboundMessage({
53
+ qitemId: q.qitemId ?? decision.decisionId,
54
+ summary: q.summary,
55
+ body: q.body,
56
+ destinationSession: q.destinationSession ?? decision.entityBindingRef,
57
+ }, {
58
+ sourceLabel: opts.sourceLabel,
59
+ bodyExcerpt: opts.bodyExcerpt,
60
+ mediaRefs,
61
+ // A1.2 — attribution rides every post; identity stays the app's own (postChatMessage
62
+ // structurally cannot carry username/icon overrides — the customize-absence rail).
63
+ attribution: attributionFromSession(q.sourceSession),
64
+ mentionUserId: opts.resolveMentionUserId?.(q),
65
+ // fix-r3 — the reconcile identity, reserved outside the clamp budget (same function
66
+ // the scan below matches: one identity, same bytes, both sides).
67
+ reconcileMarker: reconcileToken(decision.decisionId),
68
+ });
69
+ const threadTs = opts.resolveThreadTs?.(q);
70
+ // H — RECONCILE-BY-MARKER before any RESEND: if this decision was attempted before, the
71
+ // prior outcome is ambiguous (a timeout may have posted). Search where the message would
72
+ // live (the thread, else channel history) for the message's STRUCTURAL identity; FOUND →
73
+ // already delivered, record + ack, never repost. Search failure = stay ambiguous = retain
74
+ // for the next replay (never a blind repost on an unreadable channel — a duplicate human
75
+ // notification is the red; a delay is not).
76
+ // fix-r3 (R2 exactly-once): the identity is reconcileToken(decisionId) — a bounded,
77
+ // decision-scoped token the renderer reserves OUTSIDE the clamp budget, so it is
78
+ // GUARANTEED present in the scanned top-level text at any ordinary length, and ordinary
79
+ // prose quoting a qitem id can never reproduce it (it embeds the daemon-minted
80
+ // decisionId in a delimited form). Producer and scanner call the same function: one
81
+ // identity, same bytes, both sides.
82
+ const marker = reconcileToken(decision.decisionId);
83
+ if (opts.attempted.load().has(decision.decisionId)) {
84
+ const scan = await fetchRecentMessageTexts(opts.botToken, opts.channel, threadTs, opts.fetchImpl);
85
+ if (!scan.ok) {
86
+ log(`reconcile scan failed for ${decision.decisionId} (${scan.error}) — retained, no blind repost`);
87
+ return { ok: false, class: "reconcile-unreadable", detail: scan.error };
88
+ }
89
+ if (scan.texts.some((t) => t.includes(marker))) {
90
+ log(`reconcile: marker "${marker}" FOUND — prior ambiguous post landed; ack without repost`);
91
+ opts.delivered.mark(decision.decisionId, "reconciled-delivered");
92
+ if (q.qitemId) {
93
+ opts.outboundSeen.mark(q.qitemId, "posted");
94
+ opts.release?.(q.qitemId);
95
+ }
96
+ return { ok: true };
97
+ }
98
+ log(`reconcile: marker "${marker}" absent — safe to send`);
99
+ }
100
+ // Marked ATTEMPTED durably BEFORE the post: from here any outcome is ambiguous until 2xx.
101
+ opts.attempted.mark(decision.decisionId, "attempted");
102
+ const res = await postChatMessage(opts.botToken, { channel: opts.channel, text: payload.text, blocks: payload.blocks, thread_ts: threadTs }, opts.fetchImpl);
103
+ if (!res.ok) {
104
+ return { ok: false, class: res.status === 0 ? "transport" : `http-${res.status}`, detail: res.error };
105
+ }
106
+ // Delivered: record decisionId BEFORE returning ok (a crash after this point re-acks via
107
+ // dedup — no double-post; before it, the wire retains + replays — at-least-once, never a drop).
108
+ opts.delivered.mark(decision.decisionId, "delivered");
109
+ if (q.qitemId) {
110
+ opts.outboundSeen.mark(q.qitemId, "posted"); // slice-11: seen ONLY after success
111
+ opts.release?.(q.qitemId);
112
+ }
113
+ if (res.ts && threadTs === undefined)
114
+ opts.onPostedRoot?.(q, res.ts);
115
+ // G — a LOCAL image evidenceRef (the founder screenshot) rides the EXTERNAL-UPLOAD flow
116
+ // into the conversation thread (files.upload is sunset). Upload failure is fail-VISIBLE
117
+ // but does NOT fail the decision: the text delivered; failing here would replay the whole
118
+ // post and duplicate the human notification (the H red). https refs already rode as Block
119
+ // Kit image blocks above; non-image/non-existent refs are a clean skip.
120
+ const local = q.evidenceRef && !/^https:\/\//.test(String(q.evidenceRef))
121
+ ? (opts.readLocalImage ?? defaultReadLocalImage)(String(q.evidenceRef))
122
+ : null;
123
+ if (local) {
124
+ const intoThread = threadTs ?? res.ts;
125
+ const up = await getUploadURLExternal(opts.botToken, local.filename, local.bytes.length, opts.fetchImpl);
126
+ if (up.ok && up.uploadUrl && up.fileId) {
127
+ const put = await uploadBytesExternal(up.uploadUrl, local.bytes, opts.fetchImpl);
128
+ if (put.ok) {
129
+ const done = await completeUploadExternal(opts.botToken, { files: [{ id: up.fileId, title: q.summary ?? local.filename }], channelId: opts.channel, threadTs: intoThread }, opts.fetchImpl);
130
+ if (done.ok)
131
+ log(`uploaded ${local.filename} into thread ${intoThread ?? "(root)"} for ${q.qitemId ?? decision.decisionId}`);
132
+ else
133
+ log(`ATTACHMENT upload complete FAILED for ${q.qitemId ?? decision.decisionId}: ${done.error} (text delivered; attachment missing)`);
134
+ }
135
+ else {
136
+ log(`ATTACHMENT byte upload FAILED for ${q.qitemId ?? decision.decisionId}: ${put.error} (text delivered; attachment missing)`);
137
+ }
138
+ }
139
+ else {
140
+ log(`ATTACHMENT upload-url FAILED for ${q.qitemId ?? decision.decisionId}: ${up.error} (text delivered; attachment missing)`);
141
+ }
142
+ }
143
+ log(`delivered ${decision.decisionId}${q.qitemId ? ` (qitem ${q.qitemId})` : ""}`);
144
+ return { ok: true };
145
+ };
146
+ }
147
+ //# sourceMappingURL=slack-delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-delivery.js","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/slack-delivery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type GatewayWire } from "../gateway-subsystem.js";
2
+ import { type RegistrySurface } from "./inbound-admission.js";
3
+ import { type WsLike } from "./socket-inbound.js";
4
+ import type { QueueRepository } from "../../queue-repository.js";
5
+ import type { FetchImpl } from "./slack-api.js";
6
+ export interface SlackWireOpts {
7
+ home: string;
8
+ queueRepo: QueueRepository;
9
+ log?: (msg: string) => void;
10
+ /** Injectable seams (tests): fetch, websocket factory, sweep cadence, registry surface. */
11
+ fetchImpl?: FetchImpl;
12
+ wsFactory?: (url: string) => WsLike;
13
+ outboundIntervalMs?: number;
14
+ inboundRetryIntervalMs?: number;
15
+ inboundMaxConnects?: number;
16
+ registry?: RegistrySurface;
17
+ }
18
+ /** Build the production Slack gateway wire from config + secrets. Never throws on a missing
19
+ * configuration — that is an honest inert wire, not a boot failure. */
20
+ export declare function buildSlackGatewayWire(opts: SlackWireOpts): GatewayWire;
21
+ //# sourceMappingURL=slack-subsystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-subsystem.d.ts","sourceRoot":"","sources":["../../../../src/domain/gateway/slack/slack-subsystem.ts"],"names":[],"mappings":"AAeA,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAQ/E,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzF,OAAO,EAAgD,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAEhG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,eAAe,CAAC;IAC3B,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,2FAA2F;IAC3F,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAMD;wEACwE;AACxE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,WAAW,CAiKtE"}