@openrig/cli 0.4.4 → 0.4.7

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 (678) hide show
  1. package/daemon/assets/guidance/CULTURE-default.md +19 -0
  2. package/daemon/assets/guidance/openrig-start.md +20 -5
  3. package/daemon/assets/plugins/openrig-core/README.md +1 -1
  4. package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/SKILL.md +9 -6
  5. package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/precompact-hook.mjs +11 -72
  6. package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +34 -22
  7. package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +108 -0
  8. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +11 -16
  9. package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +95 -0
  10. package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +819 -101
  11. package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +26 -9
  12. package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/SKILL.md +11 -9
  13. package/daemon/assets/plugins/openrig-core/skills/session-compaction-and-restore/SKILL.md +162 -0
  14. package/daemon/assets/plugins/openrig-core/skills/software-for-agents/SKILL.md +165 -0
  15. package/daemon/dist/adapters/cmux-transport.d.ts.map +1 -1
  16. package/daemon/dist/adapters/cmux-transport.js +8 -1
  17. package/daemon/dist/adapters/cmux-transport.js.map +1 -1
  18. package/daemon/dist/adapters/cmux.d.ts +9 -0
  19. package/daemon/dist/adapters/cmux.d.ts.map +1 -1
  20. package/daemon/dist/adapters/cmux.js +21 -0
  21. package/daemon/dist/adapters/cmux.js.map +1 -1
  22. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +3 -0
  23. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  24. package/daemon/dist/adapters/codex-runtime-adapter.js +32 -12
  25. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  26. package/daemon/dist/adapters/pi-resume.d.ts +32 -0
  27. package/daemon/dist/adapters/pi-resume.d.ts.map +1 -0
  28. package/daemon/dist/adapters/pi-resume.js +125 -0
  29. package/daemon/dist/adapters/pi-resume.js.map +1 -0
  30. package/daemon/dist/adapters/pi-runner-protocol.d.ts +88 -0
  31. package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -0
  32. package/daemon/dist/adapters/pi-runner-protocol.js +153 -0
  33. package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -0
  34. package/daemon/dist/adapters/pi-runner.d.ts +99 -0
  35. package/daemon/dist/adapters/pi-runner.d.ts.map +1 -0
  36. package/daemon/dist/adapters/pi-runner.js +519 -0
  37. package/daemon/dist/adapters/pi-runner.js.map +1 -0
  38. package/daemon/dist/adapters/pi-runtime-adapter.d.ts +61 -0
  39. package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -0
  40. package/daemon/dist/adapters/pi-runtime-adapter.js +356 -0
  41. package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -0
  42. package/daemon/dist/adapters/tmux.d.ts +22 -1
  43. package/daemon/dist/adapters/tmux.d.ts.map +1 -1
  44. package/daemon/dist/adapters/tmux.js +40 -1
  45. package/daemon/dist/adapters/tmux.js.map +1 -1
  46. package/daemon/dist/build-info.js +3 -3
  47. package/daemon/dist/builtins/workflow-specs/branched-remediation.yaml +31 -0
  48. package/daemon/dist/builtins/workflow-specs/factory-rsi.yaml +152 -0
  49. package/daemon/dist/builtins/workflow-specs/gated-release.yaml +26 -0
  50. package/daemon/dist/builtins/workflow-specs/linear-build.yaml +21 -0
  51. package/daemon/dist/db/migrations/049_workflow_instance_version.d.ts +20 -0
  52. package/daemon/dist/db/migrations/049_workflow_instance_version.d.ts.map +1 -0
  53. package/daemon/dist/db/migrations/049_workflow_instance_version.js +24 -0
  54. package/daemon/dist/db/migrations/049_workflow_instance_version.js.map +1 -0
  55. package/daemon/dist/db/migrations/050_workflow_spec_json.d.ts +22 -0
  56. package/daemon/dist/db/migrations/050_workflow_spec_json.d.ts.map +1 -0
  57. package/daemon/dist/db/migrations/050_workflow_spec_json.js +26 -0
  58. package/daemon/dist/db/migrations/050_workflow_spec_json.js.map +1 -0
  59. package/daemon/dist/db/migrations/051_workflow_resume.d.ts +22 -0
  60. package/daemon/dist/db/migrations/051_workflow_resume.d.ts.map +1 -0
  61. package/daemon/dist/db/migrations/051_workflow_resume.js +27 -0
  62. package/daemon/dist/db/migrations/051_workflow_resume.js.map +1 -0
  63. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.d.ts +26 -0
  64. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.d.ts.map +1 -0
  65. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.js +30 -0
  66. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.js.map +1 -0
  67. package/daemon/dist/db/migrations/053_sessions_node_id_index.d.ts +48 -0
  68. package/daemon/dist/db/migrations/053_sessions_node_id_index.d.ts.map +1 -0
  69. package/daemon/dist/db/migrations/053_sessions_node_id_index.js +53 -0
  70. package/daemon/dist/db/migrations/053_sessions_node_id_index.js.map +1 -0
  71. package/daemon/dist/db/migrations/054_queue_transitions_archive.d.ts +34 -0
  72. package/daemon/dist/db/migrations/054_queue_transitions_archive.d.ts.map +1 -0
  73. package/daemon/dist/db/migrations/054_queue_transitions_archive.js +49 -0
  74. package/daemon/dist/db/migrations/054_queue_transitions_archive.js.map +1 -0
  75. package/daemon/dist/domain/claim-service.d.ts +11 -0
  76. package/daemon/dist/domain/claim-service.d.ts.map +1 -1
  77. package/daemon/dist/domain/claim-service.js +3 -1
  78. package/daemon/dist/domain/claim-service.js.map +1 -1
  79. package/daemon/dist/domain/claude-compaction-enforcer.d.ts +3 -0
  80. package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
  81. package/daemon/dist/domain/claude-compaction-enforcer.js +19 -3
  82. package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
  83. package/daemon/dist/domain/cmux-layout-service.d.ts +36 -0
  84. package/daemon/dist/domain/cmux-layout-service.d.ts.map +1 -1
  85. package/daemon/dist/domain/cmux-layout-service.js +100 -28
  86. package/daemon/dist/domain/cmux-layout-service.js.map +1 -1
  87. package/daemon/dist/domain/context-monitor.d.ts +2 -0
  88. package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
  89. package/daemon/dist/domain/context-monitor.js +14 -0
  90. package/daemon/dist/domain/context-monitor.js.map +1 -1
  91. package/daemon/dist/domain/discovery-types.d.ts +1 -1
  92. package/daemon/dist/domain/discovery-types.d.ts.map +1 -1
  93. package/daemon/dist/domain/feed/attention-aggregator.js +1 -1
  94. package/daemon/dist/domain/feed/attention-aggregator.js.map +1 -1
  95. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +1 -0
  96. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -1
  97. package/daemon/dist/domain/hosts/hosts-registry-reader.js +31 -10
  98. package/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -1
  99. package/daemon/dist/domain/hosts/hosts-registry-writer.d.ts +11 -0
  100. package/daemon/dist/domain/hosts/hosts-registry-writer.d.ts.map +1 -0
  101. package/daemon/dist/domain/hosts/hosts-registry-writer.js +55 -0
  102. package/daemon/dist/domain/hosts/hosts-registry-writer.js.map +1 -0
  103. package/daemon/dist/domain/hosts/read-through.d.ts +28 -0
  104. package/daemon/dist/domain/hosts/read-through.d.ts.map +1 -0
  105. package/daemon/dist/domain/hosts/read-through.js +139 -0
  106. package/daemon/dist/domain/hosts/read-through.js.map +1 -0
  107. package/daemon/dist/domain/hosts/remote-daemon-http.d.ts +21 -0
  108. package/daemon/dist/domain/hosts/remote-daemon-http.d.ts.map +1 -1
  109. package/daemon/dist/domain/hosts/remote-daemon-http.js +56 -4
  110. package/daemon/dist/domain/hosts/remote-daemon-http.js.map +1 -1
  111. package/daemon/dist/domain/node-inventory.d.ts +10 -1
  112. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  113. package/daemon/dist/domain/node-inventory.js +250 -97
  114. package/daemon/dist/domain/node-inventory.js.map +1 -1
  115. package/daemon/dist/domain/node-launcher.d.ts +11 -0
  116. package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
  117. package/daemon/dist/domain/node-launcher.js +10 -0
  118. package/daemon/dist/domain/node-launcher.js.map +1 -1
  119. package/daemon/dist/domain/plugin-vendor-service.d.ts +2 -0
  120. package/daemon/dist/domain/plugin-vendor-service.d.ts.map +1 -1
  121. package/daemon/dist/domain/plugin-vendor-service.js +23 -0
  122. package/daemon/dist/domain/plugin-vendor-service.js.map +1 -1
  123. package/daemon/dist/domain/policies/workflow-keepalive.d.ts +7 -0
  124. package/daemon/dist/domain/policies/workflow-keepalive.d.ts.map +1 -1
  125. package/daemon/dist/domain/policies/workflow-keepalive.js +93 -13
  126. package/daemon/dist/domain/policies/workflow-keepalive.js.map +1 -1
  127. package/daemon/dist/domain/projection-lane.d.ts +7 -0
  128. package/daemon/dist/domain/projection-lane.d.ts.map +1 -0
  129. package/daemon/dist/domain/projection-lane.js +28 -0
  130. package/daemon/dist/domain/projection-lane.js.map +1 -0
  131. package/daemon/dist/domain/ps-projection.d.ts +19 -0
  132. package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
  133. package/daemon/dist/domain/ps-projection.js +81 -30
  134. package/daemon/dist/domain/ps-projection.js.map +1 -1
  135. package/daemon/dist/domain/queue-repository.d.ts +116 -7
  136. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  137. package/daemon/dist/domain/queue-repository.js +226 -16
  138. package/daemon/dist/domain/queue-repository.js.map +1 -1
  139. package/daemon/dist/domain/queue-retention.d.ts +130 -0
  140. package/daemon/dist/domain/queue-retention.d.ts.map +1 -0
  141. package/daemon/dist/domain/queue-retention.js +224 -0
  142. package/daemon/dist/domain/queue-retention.js.map +1 -0
  143. package/daemon/dist/domain/restore-orchestrator.d.ts +5 -0
  144. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  145. package/daemon/dist/domain/restore-orchestrator.js +29 -2
  146. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  147. package/daemon/dist/domain/resume-token-capture.d.ts +13 -0
  148. package/daemon/dist/domain/resume-token-capture.d.ts.map +1 -1
  149. package/daemon/dist/domain/resume-token-capture.js +14 -1
  150. package/daemon/dist/domain/resume-token-capture.js.map +1 -1
  151. package/daemon/dist/domain/resume-token-validation.d.ts +1 -1
  152. package/daemon/dist/domain/resume-token-validation.d.ts.map +1 -1
  153. package/daemon/dist/domain/resume-token-validation.js +58 -10
  154. package/daemon/dist/domain/resume-token-validation.js.map +1 -1
  155. package/daemon/dist/domain/review/compose.d.ts +127 -5
  156. package/daemon/dist/domain/review/compose.d.ts.map +1 -1
  157. package/daemon/dist/domain/review/compose.js +244 -19
  158. package/daemon/dist/domain/review/compose.js.map +1 -1
  159. package/daemon/dist/domain/review/fleet-compose.d.ts +52 -0
  160. package/daemon/dist/domain/review/fleet-compose.d.ts.map +1 -0
  161. package/daemon/dist/domain/review/fleet-compose.js +294 -0
  162. package/daemon/dist/domain/review/fleet-compose.js.map +1 -0
  163. package/daemon/dist/domain/review/gather.d.ts +17 -2
  164. package/daemon/dist/domain/review/gather.d.ts.map +1 -1
  165. package/daemon/dist/domain/review/gather.js +269 -108
  166. package/daemon/dist/domain/review/gather.js.map +1 -1
  167. package/daemon/dist/domain/review/proof-io.d.ts +2 -0
  168. package/daemon/dist/domain/review/proof-io.d.ts.map +1 -0
  169. package/daemon/dist/domain/review/proof-io.js +38 -0
  170. package/daemon/dist/domain/review/proof-io.js.map +1 -0
  171. package/daemon/dist/domain/review/types.d.ts +104 -1
  172. package/daemon/dist/domain/review/types.d.ts.map +1 -1
  173. package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
  174. package/daemon/dist/domain/rig-expansion-service.js +3 -0
  175. package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
  176. package/daemon/dist/domain/rig-repository.d.ts +7 -6
  177. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  178. package/daemon/dist/domain/rig-repository.js +33 -11
  179. package/daemon/dist/domain/rig-repository.js.map +1 -1
  180. package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
  181. package/daemon/dist/domain/rigspec-codec.js +3 -0
  182. package/daemon/dist/domain/rigspec-codec.js.map +1 -1
  183. package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
  184. package/daemon/dist/domain/rigspec-exporter.js +4 -0
  185. package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
  186. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  187. package/daemon/dist/domain/rigspec-instantiator.js +26 -2
  188. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  189. package/daemon/dist/domain/rigspec-preflight.d.ts +6 -0
  190. package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
  191. package/daemon/dist/domain/rigspec-preflight.js +26 -1
  192. package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
  193. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  194. package/daemon/dist/domain/rigspec-schema.js +20 -1
  195. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  196. package/daemon/dist/domain/runtime-verifier.d.ts +7 -1
  197. package/daemon/dist/domain/runtime-verifier.d.ts.map +1 -1
  198. package/daemon/dist/domain/runtime-verifier.js +39 -1
  199. package/daemon/dist/domain/runtime-verifier.js.map +1 -1
  200. package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +8 -0
  201. package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -0
  202. package/daemon/dist/domain/scope/plan-lock-artifacts.js +57 -0
  203. package/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -0
  204. package/daemon/dist/domain/scope/scaffold-placeholder.d.ts +38 -0
  205. package/daemon/dist/domain/scope/scaffold-placeholder.d.ts.map +1 -0
  206. package/daemon/dist/domain/scope/scaffold-placeholder.js +98 -0
  207. package/daemon/dist/domain/scope/scaffold-placeholder.js.map +1 -0
  208. package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
  209. package/daemon/dist/domain/scope/scope-approve.js +22 -1
  210. package/daemon/dist/domain/scope/scope-approve.js.map +1 -1
  211. package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  212. package/daemon/dist/domain/scope/scope-audit.js +57 -20
  213. package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  214. package/daemon/dist/domain/seat-handover-service.d.ts +9 -0
  215. package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
  216. package/daemon/dist/domain/seat-handover-service.js +2 -0
  217. package/daemon/dist/domain/seat-handover-service.js.map +1 -1
  218. package/daemon/dist/domain/seat-identity-store.d.ts +7 -0
  219. package/daemon/dist/domain/seat-identity-store.d.ts.map +1 -1
  220. package/daemon/dist/domain/seat-identity-store.js +27 -0
  221. package/daemon/dist/domain/seat-identity-store.js.map +1 -1
  222. package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
  223. package/daemon/dist/domain/seat-status-service.js +6 -4
  224. package/daemon/dist/domain/seat-status-service.js.map +1 -1
  225. package/daemon/dist/domain/session-name.d.ts +22 -0
  226. package/daemon/dist/domain/session-name.d.ts.map +1 -1
  227. package/daemon/dist/domain/session-name.js +29 -0
  228. package/daemon/dist/domain/session-name.js.map +1 -1
  229. package/daemon/dist/domain/session-transport.d.ts +17 -0
  230. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  231. package/daemon/dist/domain/session-transport.js +44 -0
  232. package/daemon/dist/domain/session-transport.js.map +1 -1
  233. package/daemon/dist/domain/slices/qitem-membership.d.ts +17 -0
  234. package/daemon/dist/domain/slices/qitem-membership.d.ts.map +1 -0
  235. package/daemon/dist/domain/slices/qitem-membership.js +60 -0
  236. package/daemon/dist/domain/slices/qitem-membership.js.map +1 -0
  237. package/daemon/dist/domain/slices/slice-detail-projector.d.ts +5 -0
  238. package/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -1
  239. package/daemon/dist/domain/slices/slice-detail-projector.js +161 -16
  240. package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
  241. package/daemon/dist/domain/slices/slice-indexer.d.ts +86 -0
  242. package/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -1
  243. package/daemon/dist/domain/slices/slice-indexer.js +422 -45
  244. package/daemon/dist/domain/slices/slice-indexer.js.map +1 -1
  245. package/daemon/dist/domain/spec-library-workflow-scanner.d.ts +18 -2
  246. package/daemon/dist/domain/spec-library-workflow-scanner.d.ts.map +1 -1
  247. package/daemon/dist/domain/spec-library-workflow-scanner.js +23 -1
  248. package/daemon/dist/domain/spec-library-workflow-scanner.js.map +1 -1
  249. package/daemon/dist/domain/startup-orchestrator.d.ts +9 -0
  250. package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
  251. package/daemon/dist/domain/startup-orchestrator.js +71 -3
  252. package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
  253. package/daemon/dist/domain/startup-proof.d.ts +10 -6
  254. package/daemon/dist/domain/startup-proof.d.ts.map +1 -1
  255. package/daemon/dist/domain/startup-proof.js +35 -7
  256. package/daemon/dist/domain/startup-proof.js.map +1 -1
  257. package/daemon/dist/domain/successor-session-launcher.d.ts +16 -0
  258. package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
  259. package/daemon/dist/domain/successor-session-launcher.js +13 -0
  260. package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  261. package/daemon/dist/domain/terminal/cmux-provider-adapter.d.ts +28 -0
  262. package/daemon/dist/domain/terminal/cmux-provider-adapter.d.ts.map +1 -0
  263. package/daemon/dist/domain/terminal/cmux-provider-adapter.js +100 -0
  264. package/daemon/dist/domain/terminal/cmux-provider-adapter.js.map +1 -0
  265. package/daemon/dist/domain/terminal/herdr-adapter.d.ts +94 -0
  266. package/daemon/dist/domain/terminal/herdr-adapter.d.ts.map +1 -0
  267. package/daemon/dist/domain/terminal/herdr-adapter.js +307 -0
  268. package/daemon/dist/domain/terminal/herdr-adapter.js.map +1 -0
  269. package/daemon/dist/domain/terminal/herdr-transport.d.ts +50 -0
  270. package/daemon/dist/domain/terminal/herdr-transport.d.ts.map +1 -0
  271. package/daemon/dist/domain/terminal/herdr-transport.js +145 -0
  272. package/daemon/dist/domain/terminal/herdr-transport.js.map +1 -0
  273. package/daemon/dist/domain/terminal/terminal-provider.d.ts +88 -0
  274. package/daemon/dist/domain/terminal/terminal-provider.d.ts.map +1 -0
  275. package/daemon/dist/domain/terminal/terminal-provider.js +17 -0
  276. package/daemon/dist/domain/terminal/terminal-provider.js.map +1 -0
  277. package/daemon/dist/domain/terminal/terminal-service.d.ts +60 -0
  278. package/daemon/dist/domain/terminal/terminal-service.d.ts.map +1 -0
  279. package/daemon/dist/domain/terminal/terminal-service.js +174 -0
  280. package/daemon/dist/domain/terminal/terminal-service.js.map +1 -0
  281. package/daemon/dist/domain/terminal/terminal-views-store.d.ts +77 -0
  282. package/daemon/dist/domain/terminal/terminal-views-store.d.ts.map +1 -0
  283. package/daemon/dist/domain/terminal/terminal-views-store.js +146 -0
  284. package/daemon/dist/domain/terminal/terminal-views-store.js.map +1 -0
  285. package/daemon/dist/domain/terminal/view-composer.d.ts +42 -0
  286. package/daemon/dist/domain/terminal/view-composer.d.ts.map +1 -0
  287. package/daemon/dist/domain/terminal/view-composer.js +137 -0
  288. package/daemon/dist/domain/terminal/view-composer.js.map +1 -0
  289. package/daemon/dist/domain/tmux-option-defaults.d.ts +89 -0
  290. package/daemon/dist/domain/tmux-option-defaults.d.ts.map +1 -0
  291. package/daemon/dist/domain/tmux-option-defaults.js +132 -0
  292. package/daemon/dist/domain/tmux-option-defaults.js.map +1 -0
  293. package/daemon/dist/domain/transcript-capture.d.ts +3 -0
  294. package/daemon/dist/domain/transcript-capture.d.ts.map +1 -1
  295. package/daemon/dist/domain/transcript-capture.js +28 -0
  296. package/daemon/dist/domain/transcript-capture.js.map +1 -1
  297. package/daemon/dist/domain/transcript-store.d.ts +10 -0
  298. package/daemon/dist/domain/transcript-store.d.ts.map +1 -1
  299. package/daemon/dist/domain/transcript-store.js +26 -0
  300. package/daemon/dist/domain/transcript-store.js.map +1 -1
  301. package/daemon/dist/domain/types.d.ts +38 -1
  302. package/daemon/dist/domain/types.d.ts.map +1 -1
  303. package/daemon/dist/domain/types.js.map +1 -1
  304. package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  305. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  306. package/daemon/dist/domain/user-settings/settings-store.js +92 -0
  307. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  308. package/daemon/dist/domain/workflow/slice-workflow-projection.d.ts.map +1 -1
  309. package/daemon/dist/domain/workflow/slice-workflow-projection.js +6 -2
  310. package/daemon/dist/domain/workflow/slice-workflow-projection.js.map +1 -1
  311. package/daemon/dist/domain/workflow-boot-sweep.d.ts +28 -0
  312. package/daemon/dist/domain/workflow-boot-sweep.d.ts.map +1 -0
  313. package/daemon/dist/domain/workflow-boot-sweep.js +102 -0
  314. package/daemon/dist/domain/workflow-boot-sweep.js.map +1 -0
  315. package/daemon/dist/domain/workflow-deadline.d.ts +74 -0
  316. package/daemon/dist/domain/workflow-deadline.d.ts.map +1 -0
  317. package/daemon/dist/domain/workflow-deadline.js +165 -0
  318. package/daemon/dist/domain/workflow-deadline.js.map +1 -0
  319. package/daemon/dist/domain/workflow-exception-escalation.d.ts +33 -0
  320. package/daemon/dist/domain/workflow-exception-escalation.d.ts.map +1 -0
  321. package/daemon/dist/domain/workflow-exception-escalation.js +104 -0
  322. package/daemon/dist/domain/workflow-exception-escalation.js.map +1 -0
  323. package/daemon/dist/domain/workflow-exception-router.d.ts +33 -0
  324. package/daemon/dist/domain/workflow-exception-router.d.ts.map +1 -0
  325. package/daemon/dist/domain/workflow-exception-router.js +96 -0
  326. package/daemon/dist/domain/workflow-exception-router.js.map +1 -0
  327. package/daemon/dist/domain/workflow-exception.d.ts +90 -0
  328. package/daemon/dist/domain/workflow-exception.d.ts.map +1 -0
  329. package/daemon/dist/domain/workflow-exception.js +122 -0
  330. package/daemon/dist/domain/workflow-exception.js.map +1 -0
  331. package/daemon/dist/domain/workflow-frontier-guard.d.ts +24 -0
  332. package/daemon/dist/domain/workflow-frontier-guard.d.ts.map +1 -0
  333. package/daemon/dist/domain/workflow-frontier-guard.js +30 -0
  334. package/daemon/dist/domain/workflow-frontier-guard.js.map +1 -0
  335. package/daemon/dist/domain/workflow-instance-store.d.ts +28 -0
  336. package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -1
  337. package/daemon/dist/domain/workflow-instance-store.js +66 -10
  338. package/daemon/dist/domain/workflow-instance-store.js.map +1 -1
  339. package/daemon/dist/domain/workflow-keepalive-arming.d.ts +35 -0
  340. package/daemon/dist/domain/workflow-keepalive-arming.d.ts.map +1 -0
  341. package/daemon/dist/domain/workflow-keepalive-arming.js +87 -0
  342. package/daemon/dist/domain/workflow-keepalive-arming.js.map +1 -0
  343. package/daemon/dist/domain/workflow-projector.d.ts +117 -2
  344. package/daemon/dist/domain/workflow-projector.d.ts.map +1 -1
  345. package/daemon/dist/domain/workflow-projector.js +672 -41
  346. package/daemon/dist/domain/workflow-projector.js.map +1 -1
  347. package/daemon/dist/domain/workflow-role-context.d.ts +57 -0
  348. package/daemon/dist/domain/workflow-role-context.d.ts.map +1 -0
  349. package/daemon/dist/domain/workflow-role-context.js +120 -0
  350. package/daemon/dist/domain/workflow-role-context.js.map +1 -0
  351. package/daemon/dist/domain/workflow-role-resolver.d.ts +65 -0
  352. package/daemon/dist/domain/workflow-role-resolver.d.ts.map +1 -0
  353. package/daemon/dist/domain/workflow-role-resolver.js +108 -0
  354. package/daemon/dist/domain/workflow-role-resolver.js.map +1 -0
  355. package/daemon/dist/domain/workflow-runtime.d.ts +157 -1
  356. package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
  357. package/daemon/dist/domain/workflow-runtime.js +718 -11
  358. package/daemon/dist/domain/workflow-runtime.js.map +1 -1
  359. package/daemon/dist/domain/workflow-spec-cache.d.ts +26 -1
  360. package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
  361. package/daemon/dist/domain/workflow-spec-cache.js +327 -13
  362. package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
  363. package/daemon/dist/domain/workflow-types.d.ts +143 -8
  364. package/daemon/dist/domain/workflow-types.d.ts.map +1 -1
  365. package/daemon/dist/domain/workflow-types.js +14 -1
  366. package/daemon/dist/domain/workflow-types.js.map +1 -1
  367. package/daemon/dist/domain/workflow-validator.d.ts +11 -1
  368. package/daemon/dist/domain/workflow-validator.d.ts.map +1 -1
  369. package/daemon/dist/domain/workflow-validator.js +246 -1
  370. package/daemon/dist/domain/workflow-validator.js.map +1 -1
  371. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
  372. package/daemon/dist/domain/workspace/default-workspace-scaffold.js +9 -4
  373. package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
  374. package/daemon/dist/domain/workspace/workspace-doctor.js +1 -1
  375. package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
  376. package/daemon/dist/index.d.ts +17 -0
  377. package/daemon/dist/index.d.ts.map +1 -1
  378. package/daemon/dist/index.js +44 -0
  379. package/daemon/dist/index.js.map +1 -1
  380. package/daemon/dist/routes/activity.js +22 -0
  381. package/daemon/dist/routes/activity.js.map +1 -1
  382. package/daemon/dist/routes/hosts.d.ts +5 -0
  383. package/daemon/dist/routes/hosts.d.ts.map +1 -0
  384. package/daemon/dist/routes/hosts.js +346 -0
  385. package/daemon/dist/routes/hosts.js.map +1 -0
  386. package/daemon/dist/routes/mission-control.js +1 -1
  387. package/daemon/dist/routes/mission-control.js.map +1 -1
  388. package/daemon/dist/routes/missions.d.ts +7 -0
  389. package/daemon/dist/routes/missions.d.ts.map +1 -1
  390. package/daemon/dist/routes/missions.js +6 -1
  391. package/daemon/dist/routes/missions.js.map +1 -1
  392. package/daemon/dist/routes/ps.d.ts.map +1 -1
  393. package/daemon/dist/routes/ps.js +5 -1
  394. package/daemon/dist/routes/ps.js.map +1 -1
  395. package/daemon/dist/routes/queue.d.ts +2 -7
  396. package/daemon/dist/routes/queue.d.ts.map +1 -1
  397. package/daemon/dist/routes/queue.js +272 -10
  398. package/daemon/dist/routes/queue.js.map +1 -1
  399. package/daemon/dist/routes/review.d.ts.map +1 -1
  400. package/daemon/dist/routes/review.js +26 -0
  401. package/daemon/dist/routes/review.js.map +1 -1
  402. package/daemon/dist/routes/rigs.d.ts.map +1 -1
  403. package/daemon/dist/routes/rigs.js +21 -10
  404. package/daemon/dist/routes/rigs.js.map +1 -1
  405. package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
  406. package/daemon/dist/routes/scope-audit.js +141 -135
  407. package/daemon/dist/routes/scope-audit.js.map +1 -1
  408. package/daemon/dist/routes/seat.js +13 -0
  409. package/daemon/dist/routes/seat.js.map +1 -1
  410. package/daemon/dist/routes/sessions.js +2 -1
  411. package/daemon/dist/routes/sessions.js.map +1 -1
  412. package/daemon/dist/routes/slices.d.ts.map +1 -1
  413. package/daemon/dist/routes/slices.js +48 -38
  414. package/daemon/dist/routes/slices.js.map +1 -1
  415. package/daemon/dist/routes/terminal.d.ts +11 -0
  416. package/daemon/dist/routes/terminal.d.ts.map +1 -0
  417. package/daemon/dist/routes/terminal.js +104 -0
  418. package/daemon/dist/routes/terminal.js.map +1 -0
  419. package/daemon/dist/routes/transcripts.d.ts.map +1 -1
  420. package/daemon/dist/routes/transcripts.js +62 -33
  421. package/daemon/dist/routes/transcripts.js.map +1 -1
  422. package/daemon/dist/routes/workflow.d.ts.map +1 -1
  423. package/daemon/dist/routes/workflow.js +102 -10
  424. package/daemon/dist/routes/workflow.js.map +1 -1
  425. package/daemon/dist/server.d.ts +5 -0
  426. package/daemon/dist/server.d.ts.map +1 -1
  427. package/daemon/dist/server.js +22 -0
  428. package/daemon/dist/server.js.map +1 -1
  429. package/daemon/dist/startup.d.ts.map +1 -1
  430. package/daemon/dist/startup.js +235 -12
  431. package/daemon/dist/startup.js.map +1 -1
  432. package/daemon/docs/reference/agent-startup-guide.md +1 -0
  433. package/daemon/specs/agents/apps/vault-specialist/agent.yaml +2 -1
  434. package/daemon/specs/agents/conveyor/builder/agent.yaml +2 -1
  435. package/daemon/specs/agents/conveyor/lead/agent.yaml +2 -1
  436. package/daemon/specs/agents/conveyor/planner/agent.yaml +2 -1
  437. package/daemon/specs/agents/conveyor/reviewer/agent.yaml +2 -1
  438. package/daemon/specs/agents/design/product-designer/agent.yaml +12 -2
  439. package/daemon/specs/agents/development/implementer/agent.yaml +12 -2
  440. package/daemon/specs/agents/development/qa/agent.yaml +12 -2
  441. package/daemon/specs/agents/development/qa/guidance/role.md +1 -0
  442. package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +30 -0
  443. package/daemon/specs/agents/factory-rsi/dogfood/guidance/role.md +37 -0
  444. package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +30 -0
  445. package/daemon/specs/agents/factory-rsi/release-manager/guidance/role.md +40 -0
  446. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +12 -2
  447. package/daemon/specs/agents/product-management/pm/agent.yaml +1 -2
  448. package/daemon/specs/agents/research/analyst/agent.yaml +2 -1
  449. package/daemon/specs/agents/research/synthesizer/agent.yaml +2 -1
  450. package/daemon/specs/agents/review/independent-reviewer/agent.yaml +12 -2
  451. package/daemon/specs/agents/shared/agent.yaml +5 -8
  452. package/daemon/specs/agents/shared/runtime/claude-settings.fragment.json +13 -1
  453. package/daemon/specs/agents/shared/skills/core/agent-starters/SKILL.md +132 -0
  454. package/daemon/{assets/plugins/openrig-core/skills → specs/agents/shared/skills/core}/agent-startup-and-context-ingestion/SKILL.md +27 -19
  455. package/daemon/specs/agents/shared/skills/core/attention-queue/SKILL.md +264 -0
  456. package/daemon/specs/agents/shared/skills/core/cross-host-rig-commands/SKILL.md +190 -0
  457. package/daemon/specs/agents/shared/skills/core/human-in-the-loop/SKILL.md +104 -0
  458. package/daemon/specs/agents/shared/skills/core/openrig-architect/SKILL.md +25 -8
  459. package/daemon/specs/agents/shared/skills/core/openrig-cmux/SKILL.md +81 -0
  460. package/daemon/specs/agents/shared/skills/core/openrig-herdr/SKILL.md +153 -0
  461. package/daemon/specs/agents/shared/skills/core/openrig-upgrade/SKILL.md +460 -0
  462. package/daemon/specs/agents/shared/skills/core/rig-bundles-and-shareable-artifacts/SKILL.md +101 -0
  463. package/daemon/specs/agents/shared/skills/core/rig-lifecycle/SKILL.md +22 -11
  464. package/daemon/specs/agents/shared/skills/core/session-source-fork/SKILL.md +160 -0
  465. package/daemon/specs/agents/shared/skills/core/specification-system/SKILL.md +103 -0
  466. package/daemon/specs/agents/shared/skills/core/topology-mutation-and-seat-management/SKILL.md +118 -0
  467. package/daemon/specs/agents/shared/skills/core/watchdog/SKILL.md +125 -0
  468. package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +4 -4
  469. package/daemon/specs/agents/shared/skills/pods/review-team/SKILL.md +3 -0
  470. package/daemon/specs/agents/shared/skills/process/brainstorming/OPENRIG.md +3 -3
  471. package/daemon/specs/agents/shared/skills/process/executing-plans/OPENRIG.md +1 -1
  472. package/daemon/specs/agents/shared/skills/process/frontend-design/SKILL.md +6 -3
  473. package/daemon/specs/agents/shared/skills/process/test-driven-development/SKILL.md +1 -1
  474. package/daemon/specs/agents/shared/skills/process/using-superpowers/OPENRIG.md +1 -1
  475. package/daemon/specs/agents/shared/skills/process/verification-before-completion/SKILL.md +12 -2
  476. package/daemon/specs/agents/shared/skills/process/writing-plans/OPENRIG.md +1 -1
  477. package/daemon/specs/rigs/focused/pm-team/CULTURE.md +1 -1
  478. package/daemon/specs/rigs/launch/factory-rsi/CULTURE.md +47 -0
  479. package/daemon/specs/rigs/launch/factory-rsi/rig.yaml +115 -0
  480. package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/agent.yaml +2 -2
  481. package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/guidance/role.md +5 -4
  482. package/daemon/specs/rigs/launch/kernel/agents/operator/agent/agent.yaml +2 -2
  483. package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +3 -5
  484. package/daemon/specs/rigs/launch/kernel/agents/queue/worker/agent.yaml +2 -2
  485. package/daemon/specs/rigs/launch/kernel/culture/CULTURE.md +3 -4
  486. package/daemon/specs/rigs/preview/product-team/CULTURE.md +1 -1
  487. package/dist/bin-wrapper.d.ts.map +1 -1
  488. package/dist/bin-wrapper.js +3 -1
  489. package/dist/bin-wrapper.js.map +1 -1
  490. package/dist/build-info.js +3 -3
  491. package/dist/cli-error.d.ts +33 -0
  492. package/dist/cli-error.d.ts.map +1 -0
  493. package/dist/cli-error.js +94 -0
  494. package/dist/cli-error.js.map +1 -0
  495. package/dist/commands/broadcast.d.ts +6 -1
  496. package/dist/commands/broadcast.d.ts.map +1 -1
  497. package/dist/commands/broadcast.js +101 -15
  498. package/dist/commands/broadcast.js.map +1 -1
  499. package/dist/commands/capture.d.ts.map +1 -1
  500. package/dist/commands/capture.js +99 -8
  501. package/dist/commands/capture.js.map +1 -1
  502. package/dist/commands/config-init-workspace.js +1 -1
  503. package/dist/commands/config.d.ts.map +1 -1
  504. package/dist/commands/config.js +4 -0
  505. package/dist/commands/config.js.map +1 -1
  506. package/dist/commands/doctor.d.ts +1 -1
  507. package/dist/commands/doctor.d.ts.map +1 -1
  508. package/dist/commands/doctor.js +17 -11
  509. package/dist/commands/doctor.js.map +1 -1
  510. package/dist/commands/down.d.ts.map +1 -1
  511. package/dist/commands/down.js +5 -0
  512. package/dist/commands/down.js.map +1 -1
  513. package/dist/commands/host.d.ts +14 -0
  514. package/dist/commands/host.d.ts.map +1 -1
  515. package/dist/commands/host.js +361 -23
  516. package/dist/commands/host.js.map +1 -1
  517. package/dist/commands/launch.d.ts.map +1 -1
  518. package/dist/commands/launch.js +5 -0
  519. package/dist/commands/launch.js.map +1 -1
  520. package/dist/commands/proof.js +1 -1
  521. package/dist/commands/proof.js.map +1 -1
  522. package/dist/commands/ps.d.ts.map +1 -1
  523. package/dist/commands/ps.js +26 -6
  524. package/dist/commands/ps.js.map +1 -1
  525. package/dist/commands/queue.d.ts +36 -0
  526. package/dist/commands/queue.d.ts.map +1 -1
  527. package/dist/commands/queue.js +176 -31
  528. package/dist/commands/queue.js.map +1 -1
  529. package/dist/commands/restore-packet.d.ts.map +1 -1
  530. package/dist/commands/restore-packet.js +13 -2
  531. package/dist/commands/restore-packet.js.map +1 -1
  532. package/dist/commands/rig.d.ts.map +1 -1
  533. package/dist/commands/rig.js +122 -0
  534. package/dist/commands/rig.js.map +1 -1
  535. package/dist/commands/scope.js +2 -2
  536. package/dist/commands/scope.js.map +1 -1
  537. package/dist/commands/send.d.ts.map +1 -1
  538. package/dist/commands/send.js +229 -30
  539. package/dist/commands/send.js.map +1 -1
  540. package/dist/commands/slack.d.ts +37 -0
  541. package/dist/commands/slack.d.ts.map +1 -0
  542. package/dist/commands/slack.js +274 -0
  543. package/dist/commands/slack.js.map +1 -0
  544. package/dist/commands/terminal.d.ts +6 -0
  545. package/dist/commands/terminal.d.ts.map +1 -0
  546. package/dist/commands/terminal.js +116 -0
  547. package/dist/commands/terminal.js.map +1 -0
  548. package/dist/commands/transcript.d.ts +6 -1
  549. package/dist/commands/transcript.d.ts.map +1 -1
  550. package/dist/commands/transcript.js +113 -30
  551. package/dist/commands/transcript.js.map +1 -1
  552. package/dist/commands/ui.d.ts +1 -0
  553. package/dist/commands/ui.d.ts.map +1 -1
  554. package/dist/commands/ui.js +2 -0
  555. package/dist/commands/ui.js.map +1 -1
  556. package/dist/commands/up.d.ts.map +1 -1
  557. package/dist/commands/up.js +10 -1
  558. package/dist/commands/up.js.map +1 -1
  559. package/dist/commands/whoami.d.ts.map +1 -1
  560. package/dist/commands/whoami.js +14 -3
  561. package/dist/commands/whoami.js.map +1 -1
  562. package/dist/commands/workflow-errors.d.ts +23 -0
  563. package/dist/commands/workflow-errors.d.ts.map +1 -0
  564. package/dist/commands/workflow-errors.js +100 -0
  565. package/dist/commands/workflow-errors.js.map +1 -0
  566. package/dist/commands/workflow-follow.d.ts +71 -0
  567. package/dist/commands/workflow-follow.d.ts.map +1 -0
  568. package/dist/commands/workflow-follow.js +259 -0
  569. package/dist/commands/workflow-follow.js.map +1 -0
  570. package/dist/commands/workflow-render.d.ts +114 -0
  571. package/dist/commands/workflow-render.d.ts.map +1 -0
  572. package/dist/commands/workflow-render.js +223 -0
  573. package/dist/commands/workflow-render.js.map +1 -0
  574. package/dist/commands/workflow.d.ts +1 -0
  575. package/dist/commands/workflow.d.ts.map +1 -1
  576. package/dist/commands/workflow.js +278 -14
  577. package/dist/commands/workflow.js.map +1 -1
  578. package/dist/config-store.d.ts +15 -1
  579. package/dist/config-store.d.ts.map +1 -1
  580. package/dist/config-store.js +103 -0
  581. package/dist/config-store.js.map +1 -1
  582. package/dist/cross-host-cli-helpers.d.ts +13 -0
  583. package/dist/cross-host-cli-helpers.d.ts.map +1 -1
  584. package/dist/cross-host-cli-helpers.js +27 -0
  585. package/dist/cross-host-cli-helpers.js.map +1 -1
  586. package/dist/cross-host-target.d.ts +49 -0
  587. package/dist/cross-host-target.d.ts.map +1 -0
  588. package/dist/cross-host-target.js +35 -0
  589. package/dist/cross-host-target.js.map +1 -0
  590. package/dist/daemon-lifecycle.d.ts.map +1 -1
  591. package/dist/daemon-lifecycle.js +45 -14
  592. package/dist/daemon-lifecycle.js.map +1 -1
  593. package/dist/host-registry.d.ts +14 -1
  594. package/dist/host-registry.d.ts.map +1 -1
  595. package/dist/host-registry.js +47 -6
  596. package/dist/host-registry.js.map +1 -1
  597. package/dist/host-selection.d.ts +13 -0
  598. package/dist/host-selection.d.ts.map +1 -0
  599. package/dist/host-selection.js +54 -0
  600. package/dist/host-selection.js.map +1 -0
  601. package/dist/index.d.ts +5 -0
  602. package/dist/index.d.ts.map +1 -1
  603. package/dist/index.js +8 -1
  604. package/dist/index.js.map +1 -1
  605. package/dist/lib/scope/scaffold-placeholder.d.ts +38 -0
  606. package/dist/lib/scope/scaffold-placeholder.d.ts.map +1 -0
  607. package/dist/lib/scope/scaffold-placeholder.js +98 -0
  608. package/dist/lib/scope/scaffold-placeholder.js.map +1 -0
  609. package/dist/lib/scope/scope-audit.d.ts.map +1 -1
  610. package/dist/lib/scope/scope-audit.js +57 -20
  611. package/dist/lib/scope/scope-audit.js.map +1 -1
  612. package/dist/lib/scope-templates/backlog-deprecation.md +1 -1
  613. package/dist/lib/scope-templates/backlog-tech-debt.md +1 -1
  614. package/dist/lib/scope-templates/bug-fix.md +1 -1
  615. package/dist/lib/scope-templates/implementation-prd.md +1 -1
  616. package/dist/lib/scope-templates/mission-notes.md +7 -2
  617. package/dist/lib/scope-templates/mission-placeholder.md +1 -1
  618. package/dist/lib/scope-templates/mission-progress.md +1 -1
  619. package/dist/lib/scope-templates/mission-release.md +1 -1
  620. package/dist/lib/scope-templates/placeholder.md +1 -1
  621. package/dist/lib/scope-templates/proof.md +1 -1
  622. package/dist/lib/scope-templates/release-feature.md +1 -1
  623. package/dist/lib/scope-templates/research.md +1 -1
  624. package/dist/lib/scope-templates/slice-progress.md +1 -1
  625. package/dist/remote-host-ops.d.ts +1 -0
  626. package/dist/remote-host-ops.d.ts.map +1 -1
  627. package/dist/remote-host-ops.js +13 -6
  628. package/dist/remote-host-ops.js.map +1 -1
  629. package/dist/session-name.d.ts +23 -0
  630. package/dist/session-name.d.ts.map +1 -0
  631. package/dist/session-name.js +61 -0
  632. package/dist/session-name.js.map +1 -0
  633. package/dist/slack/config.d.ts +41 -0
  634. package/dist/slack/config.d.ts.map +1 -0
  635. package/dist/slack/config.js +60 -0
  636. package/dist/slack/config.js.map +1 -0
  637. package/dist/slack/inbound.d.ts +75 -0
  638. package/dist/slack/inbound.d.ts.map +1 -0
  639. package/dist/slack/inbound.js +133 -0
  640. package/dist/slack/inbound.js.map +1 -0
  641. package/dist/slack/message.d.ts +26 -0
  642. package/dist/slack/message.d.ts.map +1 -0
  643. package/dist/slack/message.js +60 -0
  644. package/dist/slack/message.js.map +1 -0
  645. package/dist/slack/outbound.d.ts +39 -0
  646. package/dist/slack/outbound.d.ts.map +1 -0
  647. package/dist/slack/outbound.js +52 -0
  648. package/dist/slack/outbound.js.map +1 -0
  649. package/dist/slack/queue-bridge.d.ts +56 -0
  650. package/dist/slack/queue-bridge.d.ts.map +1 -0
  651. package/dist/slack/queue-bridge.js +114 -0
  652. package/dist/slack/queue-bridge.js.map +1 -0
  653. package/dist/slack/secrets.d.ts +21 -0
  654. package/dist/slack/secrets.d.ts.map +1 -0
  655. package/dist/slack/secrets.js +73 -0
  656. package/dist/slack/secrets.js.map +1 -0
  657. package/dist/slack/slack-api.d.ts +49 -0
  658. package/dist/slack/slack-api.d.ts.map +1 -0
  659. package/dist/slack/slack-api.js +110 -0
  660. package/dist/slack/slack-api.js.map +1 -0
  661. package/dist/slack/state-store.d.ts +62 -0
  662. package/dist/slack/state-store.d.ts.map +1 -0
  663. package/dist/slack/state-store.js +132 -0
  664. package/dist/slack/state-store.js.map +1 -0
  665. package/package.json +1 -1
  666. package/ui/dist/assets/index-DkNi0RT8.js +623 -0
  667. package/ui/dist/assets/index-N-SdPj-I.css +32 -0
  668. package/ui/dist/index.html +2 -2
  669. package/daemon/assets/plugins/openrig-core/skills/openrig-architect/SKILL.md +0 -361
  670. package/daemon/assets/plugins/openrig-core/skills/openrig-operator/SKILL.md +0 -222
  671. package/daemon/docs/reference/product-factory-vps-runbook.md +0 -132
  672. package/daemon/specs/agents/shared/skills/core/mission-slice-sop/SKILL.md +0 -115
  673. package/daemon/specs/agents/shared/skills/core/openrig-installer/SKILL.md +0 -142
  674. package/daemon/specs/agents/shared/skills/core/openrig-operator/SKILL.md +0 -110
  675. package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +0 -1245
  676. package/daemon/specs/agents/shared/skills/core/openrig-user-settings/SKILL.md +0 -153
  677. package/ui/dist/assets/index-D69ZhNIr.js +0 -598
  678. package/ui/dist/assets/index-DJYun-8d.css +0 -32
@@ -19,8 +19,11 @@
19
19
  // signal (a hand-built/proxied Response is not necessarily wired to the
20
20
  // controller — no trust in fetch internals).
21
21
  import { readFileSync } from "node:fs";
22
- /** Mirrors the CLI's resolveRemoteBearer (host-registry.ts): exactly-one of
23
- * bearer_env / bearer_file, resolved at call time. */
22
+ /** Mirrors the CLI's resolveRemoteBearer (host-registry.ts): at-most-one of
23
+ * bearer_env / bearer_file, resolved at call time. Neither configured is an
24
+ * anonymous (URL-only) host — a tokenless daemon; ok with no token, so no
25
+ * Authorization header is sent. A configured-but-unresolvable pointer still
26
+ * fails (fail-closed). */
24
27
  function resolveBearer(host, deps) {
25
28
  const env = deps.env ?? process.env;
26
29
  const readFile = deps.readFile ?? ((p) => readFileSync(p, "utf-8"));
@@ -41,7 +44,7 @@ function resolveBearer(host, deps) {
41
44
  return { ok: false, detail: `bearer file ${host.bearer_file} not readable for host ${host.id}` };
42
45
  }
43
46
  }
44
- return { ok: false, detail: `host ${host.id} has no bearer_env or bearer_file configured` };
47
+ return { ok: true };
45
48
  }
46
49
  /** One bounded daemon→daemon JSON exchange. The single deadline covers
47
50
  * request + body; every outcome is structured — this function never hangs
@@ -60,7 +63,7 @@ export async function remoteJsonRequest(host, path, opts) {
60
63
  method: opts.method,
61
64
  headers: {
62
65
  ...(opts.body !== undefined ? { "Content-Type": "application/json" } : {}),
63
- Authorization: `Bearer ${bearer.token}`,
66
+ ...(bearer.token ? { Authorization: `Bearer ${bearer.token}` } : {}),
64
67
  },
65
68
  ...(opts.body !== undefined ? { body: JSON.stringify(opts.body) } : {}),
66
69
  signal: controller.signal,
@@ -102,4 +105,53 @@ export async function remoteJsonRequest(host, path, opts) {
102
105
  : "";
103
106
  return { ok: false, kind: "http", status: res.status, detail: remoteError };
104
107
  }
108
+ /** One bounded daemon→daemon GET, body passed through as text for ANY origin
109
+ * status (arch P3 verbatim rule). Same bearer resolution + single-deadline +
110
+ * explicit body race discipline as remoteJsonRequest; never hangs, never
111
+ * throws. */
112
+ export async function remoteRawRequest(host, path, opts) {
113
+ const bearer = resolveBearer(host, opts);
114
+ if (!bearer.ok)
115
+ return { ok: false, kind: "bearer", detail: bearer.detail };
116
+ const fetchImpl = opts.fetchImpl ?? fetch;
117
+ const url = `${host.url.replace(/\/$/, "")}${path}`;
118
+ const controller = new AbortController();
119
+ const timer = setTimeout(() => controller.abort(), opts.timeoutMs);
120
+ let res;
121
+ try {
122
+ res = await fetchImpl(url, {
123
+ method: "GET",
124
+ headers: bearer.token ? { Authorization: `Bearer ${bearer.token}` } : {},
125
+ signal: controller.signal,
126
+ });
127
+ }
128
+ catch (err) {
129
+ clearTimeout(timer);
130
+ if (controller.signal.aborted)
131
+ return { ok: false, kind: "timeout", phase: "request", detail: "" };
132
+ return { ok: false, kind: "network", detail: err.message };
133
+ }
134
+ const abortRace = new Promise((_resolve, reject) => {
135
+ const onAbort = () => reject(new Error("body read aborted"));
136
+ if (controller.signal.aborted)
137
+ onAbort();
138
+ else
139
+ controller.signal.addEventListener("abort", onAbort, { once: true });
140
+ });
141
+ let bodyText = "";
142
+ let bodyTimedOut = false;
143
+ try {
144
+ bodyText = await Promise.race([res.text(), abortRace]);
145
+ }
146
+ catch {
147
+ if (controller.signal.aborted)
148
+ bodyTimedOut = true;
149
+ }
150
+ finally {
151
+ clearTimeout(timer);
152
+ }
153
+ if (bodyTimedOut)
154
+ return { ok: false, kind: "timeout", phase: "body", status: res.status, detail: "" };
155
+ return { ok: true, status: res.status, contentType: res.headers.get("content-type") ?? "application/json", bodyText };
156
+ }
105
157
  //# sourceMappingURL=remote-daemon-http.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"remote-daemon-http.js","sourceRoot":"","sources":["../../../src/domain/hosts/remote-daemon-http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remote-daemon-http.js","sourceRoot":"","sources":["../../../src/domain/hosts/remote-daemon-http.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import type Database from "better-sqlite3";
2
2
  import type { NodeInventoryEntry, NodeDetailEntry, NodeRestoreOutcome, NodeLifecycleState, Snapshot, SeatIdentityVerdictKind } from "./types.js";
3
3
  import type { RuntimeAdapter } from "./runtime-adapter.js";
4
4
  import type { ContextUsageStore } from "./context-usage-store.js";
5
+ import type { TranscriptStore } from "./transcript-store.js";
5
6
  import type { AgentActivityStore } from "./agent-activity-store.js";
6
7
  import type { SeatActivityService } from "./seat-activity-service.js";
7
8
  import type { TmuxAdapter } from "../adapters/tmux.js";
@@ -36,6 +37,8 @@ export declare function deriveNodeLifecycleState(input: {
36
37
  * Single source of truth consumed by CLI, UI, and MCP.
37
38
  */
38
39
  export declare function getNodeInventory(db: Database.Database, rigId: string): NodeInventoryEntry[];
40
+ export declare function getNodeInventoryForAllRigs(db: Database.Database): Map<string, NodeInventoryEntry[]>;
41
+ export declare function getNodeInventoryForRigs(db: Database.Database, rigIds: ReadonlySet<string>): Map<string, NodeInventoryEntry[]>;
39
42
  /**
40
43
  * Get detailed node information including startup files, resources, and events.
41
44
  * The adapter dependency is optional — when provided, uses live listInstalled;
@@ -54,7 +57,7 @@ export declare function getNodeDetail(db: Database.Database, rigId: string, logi
54
57
  * Context-aware wrapper: returns inventory with context usage attached.
55
58
  * Uses one daemon-owned ContextUsageStore for all reads.
56
59
  */
57
- export declare function getNodeInventoryWithContext(db: Database.Database, rigId: string, contextUsageStore: ContextUsageStore): NodeInventoryEntry[];
60
+ export declare function getNodeInventoryWithContext(db: Database.Database, rigId: string, contextUsageStore: ContextUsageStore, transcriptStore?: Pick<TranscriptStore, "getIngestHealth">): NodeInventoryEntry[];
58
61
  /**
59
62
  * Context-aware wrapper: returns node detail with context usage attached.
60
63
  */
@@ -76,6 +79,12 @@ export declare function attachTerminalActivityAndWork(entries: NodeInventoryEntr
76
79
  db: Database.Database;
77
80
  seatActivity?: SeatActivityService;
78
81
  }): NodeInventoryEntry[];
82
+ /** EXPORTED (OPR.0.4.6.FAC1): the derived canonical coordinate
83
+ * `{pod}-{member}@{rig}` for an inventory entry — the binding layer's
84
+ * ONE string rule (tiebreak key AND recorded destination) reuses
85
+ * exactly this dual-key derivation, never a parallel one. */
86
+ export declare function deriveCanonicalFromEntry(entry: NodeInventoryEntry): string | null;
87
+ export declare function readPendingWorkBySession(db: Database.Database): Map<string, number>;
79
88
  export declare function attachAgentActivity(entries: NodeInventoryEntry[], deps: {
80
89
  tmuxAdapter: TmuxAdapter;
81
90
  activityStore?: AgentActivityStore;
@@ -1 +1 @@
1
- {"version":3,"file":"node-inventory.d.ts","sourceRoot":"","sources":["../../src/domain/node-inventory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAyD,kBAAkB,EAAE,kBAAkB,EAAgD,QAAQ,EAAsC,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAI1R,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAwJvD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,kBAAkB,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChC;;;gEAG4D;IAC5D,eAAe,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;CAClD,GAAG,kBAAkB,CA2BrB;AA0KD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAqI3F;AAiBD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IACL,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,iGAAiG;IACjG,0BAA0B,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1F,GACA,eAAe,GAAG,IAAI,CA0JxB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,iBAAiB,GACnC,kBAAkB,EAAE,CA0BtB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,iBAAiB,EACpC,IAAI,CAAC,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,GACzC,eAAe,GAAG,IAAI,CAexB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,kBAAkB,EAAE,EAC7B,IAAI,EAAE;IAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAAC,YAAY,CAAC,EAAE,mBAAmB,CAAA;CAAE,GAClE,kBAAkB,EAAE,CAiBtB;AAqED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,kBAAkB,EAAE,EAC7B,IAAI,EAAE;IACJ,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,GAAG,CAAC,EAAE,IAAI,CAAC;IAaX,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GACA,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA2C/B"}
1
+ {"version":3,"file":"node-inventory.d.ts","sourceRoot":"","sources":["../../src/domain/node-inventory.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { identityVerdictDownranksRunning } from "./types.js";
2
2
  import { SeatIdentityStore } from "./seat-identity-store.js";
3
- import { deriveOriented } from "./startup-proof.js";
3
+ import { buildOrientedMap } from "./startup-proof.js";
4
4
  import { probeSessionActivity } from "./session-transport.js";
5
- import { findLatestUsableSnapshot } from "./rig-repository.js";
5
+ import { findLatestUsableSnapshot, findLatestUsableSnapshotsForAllRigs } from "./rig-repository.js";
6
6
  import { resolveNodeWorkspace } from "./workspace/workspace-resolver.js";
7
7
  import { deriveCanonicalSessionName } from "./session-name.js";
8
8
  import { buildNativeResumeCommand, buildCodexResumeCore } from "./native-resume-probe.js";
@@ -142,32 +142,47 @@ function deriveContinuityOutcome(row, restoreOutcome) {
142
142
  return null;
143
143
  return restoreOutcome;
144
144
  }
145
- function deriveRestoreOutcome(db, rigId, nodeId) {
146
- // OPR.0.3.4.11 + 0.4.0.16: per-node-latest across restore.completed,
147
- // restore.subset_completed, AND restore.outcome_reconciled.
148
- // restore.outcome_reconciled has a different shape: top-level nodeId/to,
149
- // not result.nodes[]. A newer reconcile overrides an older failure; an
150
- // older reconcile must not override a newer failure.
151
- const rows = db.prepare("SELECT type, payload, seq FROM events WHERE rig_id = ? AND type IN ('restore.completed', 'restore.subset_completed', 'restore.outcome_reconciled') ORDER BY seq DESC").all(rigId);
145
+ // FS-1 W1.3 S1 — hoist restore-outcome derivation to ONCE-PER-RIG.
146
+ // Prior shape: deriveRestoreOutcome(db, rigId, nodeId) fetched + JSON-parsed the
147
+ // rig's ENTIRE restore-event set once PER NODE inside buildInventoryEntry (K
148
+ // nodes x E events per rig per poll = the dominant W3 residual). This builds a
149
+ // nodeId->outcome map in ONE seq-DESC pass and buildInventoryEntry does an O(1)
150
+ // lookup.
151
+ // OPR.0.3.4.11 + 0.4.0.16: per-node-latest across restore.completed,
152
+ // restore.subset_completed, AND restore.outcome_reconciled. reconciled has a
153
+ // different shape (top-level nodeId/to, not result.nodes[]).
154
+ // BYTE-IDENTICAL BY CONSTRUCTION: the prior per-node reader returned the FIRST
155
+ // event in seq-DESC order that referenced the node. This single seq-DESC pass
156
+ // sets a node's outcome ONLY IF ABSENT — so the first (highest-seq) event
157
+ // referencing a node wins, reproducing exactly that (incl.
158
+ // newer-reconcile-overrides-older-failure). rigId given -> WHERE rig_id=? (the
159
+ // prior single-rig filter); rigId omitted -> all rigs in one pass (a nodeId is
160
+ // referenced only by its own rig's events, so the per-node value is identical).
161
+ // [GUARD AT CODE REVIEW: the only-if-absent set is the one load-bearing
162
+ // semantics cell — it is what preserves first/newest-wins.]
163
+ function buildRestoreOutcomeMap(db, rigId) {
164
+ const stmt = db.prepare(`SELECT type, payload, seq FROM events WHERE type IN ('restore.completed', 'restore.subset_completed', 'restore.outcome_reconciled')${rigId ? " AND rig_id = ?" : ""} ORDER BY seq DESC`);
165
+ const rows = (rigId ? stmt.all(rigId) : stmt.all());
166
+ const map = new Map();
152
167
  for (const row of rows) {
153
168
  try {
154
169
  if (row.type === "restore.outcome_reconciled") {
155
170
  const event = JSON.parse(row.payload);
156
- if (event.nodeId !== nodeId)
157
- continue;
158
- return mapStatus(event.to);
171
+ if (!map.has(event.nodeId))
172
+ map.set(event.nodeId, mapStatus(event.to));
173
+ continue;
159
174
  }
160
175
  const event = JSON.parse(row.payload);
161
- const nodeResult = event.result.nodes.find((n) => n.nodeId === nodeId);
162
- if (!nodeResult)
163
- continue;
164
- return mapStatus(nodeResult.status);
176
+ for (const nodeResult of event.result.nodes) {
177
+ if (!map.has(nodeResult.nodeId))
178
+ map.set(nodeResult.nodeId, mapStatus(nodeResult.status));
179
+ }
165
180
  }
166
181
  catch {
167
182
  continue;
168
183
  }
169
184
  }
170
- return "n-a";
185
+ return map;
171
186
  }
172
187
  function mapStatus(status) {
173
188
  if (status === "resumed")
@@ -288,6 +303,27 @@ export function getNodeInventory(db, rigId) {
288
303
  // per projection (cheap indexed read, defensive to a missing table). Gates
289
304
  // the running/active green derivations below.
290
305
  const identityVerdicts = new SeatIdentityStore(db).getForRig(rigId);
306
+ // FS-1 W1.3 S1/S2 — the per-node restore-outcome + oriented reads built ONCE
307
+ // for the rig (was a query per node inside the rows.map). rig-scoped restore
308
+ // map = the prior WHERE rig_id=? filter; oriented map is node-scoped/global.
309
+ const restoreOutcomes = buildRestoreOutcomeMap(db, rigId);
310
+ const orienteds = buildOrientedMap(db);
311
+ const rows = queryInventoryRows(db, rigId);
312
+ return rows.map((row) => buildInventoryEntry(db, row, { usableSnapshot, workspaceSpec, identityVerdicts, restoreOutcomes, orienteds }));
313
+ }
314
+ /**
315
+ * FS-1 W1.2 — the shared inventory-row query. Extracted verbatim from the prior
316
+ * inline `getNodeInventory` SELECT so the single-rig and all-rigs paths run the
317
+ * IDENTICAL query.
318
+ * - `rigId` given → one rig (`WHERE n.rig_id = ?`, `ORDER BY n.created_at`) —
319
+ * byte-identical to the prior per-rig read.
320
+ * - `rigId` omitted → ALL rigs in one pass (no WHERE; `ORDER BY n.rig_id,
321
+ * n.created_at` so JS grouping preserves each rig's `created_at` order,
322
+ * matching the per-rig ordering exactly).
323
+ * The latest-session subquery (`s2.node_id = n.id ORDER BY id DESC LIMIT 1`)
324
+ * rides the W1.1 index (051, idx_sessions_node_created_id).
325
+ */
326
+ function runInventoryRowQuery(db, whereClause, orderClause, params) {
291
327
  // Join nodes with newest session (max ULID = max session.id string comparison)
292
328
  // and the rig name
293
329
  const hasCodexConfigProfile = db.prepare("PRAGMA table_info(nodes)").all()
@@ -295,7 +331,7 @@ export function getNodeInventory(db, rigId) {
295
331
  const codexConfigProfileSelect = hasCodexConfigProfile
296
332
  ? "n.codex_config_profile"
297
333
  : "NULL";
298
- const rows = db.prepare(`
334
+ const stmt = db.prepare(`
299
335
  SELECT
300
336
  n.id as node_id,
301
337
  n.rig_id,
@@ -303,6 +339,7 @@ export function getNodeInventory(db, rigId) {
303
339
  n.logical_id,
304
340
  n.pod_id,
305
341
  p.namespace as pod_namespace,
342
+ n.role,
306
343
  n.runtime,
307
344
  n.model,
308
345
  ${codexConfigProfileSelect} as codex_config_profile,
@@ -332,82 +369,184 @@ export function getNodeInventory(db, rigId) {
332
369
  LEFT JOIN sessions s ON s.node_id = n.id
333
370
  AND s.id = (SELECT s2.id FROM sessions s2 WHERE s2.node_id = n.id ORDER BY s2.id DESC LIMIT 1)
334
371
  LEFT JOIN bindings b ON b.node_id = n.id
335
- WHERE n.rig_id = ?
336
- ORDER BY n.created_at
337
- `).all(rigId);
338
- return rows.map((row) => {
339
- const restoreOutcome = deriveRestoreOutcome(db, rigId, row.node_id);
340
- // OPR.0.4.3.19 rev1-r2 B1 a durable verdict is keyed only by node_id, so
341
- // after a rebind/relaunch (same node, NEW session + NEW pane) a stale
342
- // `verified` verdict for the OLD pane would otherwise be served for the new
343
- // pane until the next 5s reconcile tick, suppressing down-rank and rendering
344
- // a fresh squat/orphan false-green. Make applicability LOAD-BEARING at read
345
- // time: a stored verdict applies ONLY when it was computed against the
346
- // current binding (its sessionName === the latest session AND its
347
- // registeredPane === the current binding pane). Otherwise treat it as ABSENT
348
- // (null) — a STALE verdict becomes fail-open (never down-ranks a running
349
- // seat), it does NOT itself down-rank. Only a MATCHING mismatch/pane_missing
350
- // verdict down-ranks.
351
- const identityVerdict = applicableVerdict(identityVerdicts.get(row.node_id) ?? null, row);
352
- const lifecycleState = deriveNodeLifecycleState({
353
- sessionStatus: row.session_status,
354
- restoreOutcome,
355
- nodeId: row.node_id,
356
- usableSnapshot,
357
- identityVerdict: identityVerdict?.verdict ?? null,
358
- });
359
- return {
360
- rigId: row.rig_id,
361
- rigName: row.rig_name,
362
- logicalId: row.logical_id,
363
- podId: row.pod_id,
364
- podNamespace: row.pod_namespace,
365
- canonicalSessionName: row.session_name,
366
- attachmentType: row.binding_attachment_type ?? null,
367
- nodeKind: deriveNodeKind(row.runtime),
368
- runtime: row.runtime,
369
- sessionStatus: row.session_status,
370
- startupStatus: row.startup_status,
371
- restoreOutcome,
372
- oriented: deriveOriented(db, row.node_id),
373
- lifecycleState,
374
- occupantLifecycle: deriveOccupantLifecycle(row, identityVerdict?.verdict ?? null),
375
- continuityOutcome: deriveContinuityOutcome(row, restoreOutcome),
376
- handoverResult: row.handover_result ?? null,
377
- previousOccupant: row.previous_occupant,
378
- handoverAt: row.handover_at,
379
- tmuxAttachCommand: row.binding_attachment_type === "tmux" && row.session_name ? `tmux attach -t ${row.session_name}` : null,
380
- resumeCommand: computeResumeCommand(row.runtime, row.resume_token, row.codex_config_profile),
381
- // OPR.0.4.0.26: recoveryGuidance is NOT inlined per node in the LIST
382
- // payload. It duplicated ~47KB of templated prose across all nodes and
383
- // no node-list consumer reads it. The full guidance is recomputed on
384
- // the single-node detail path (getNodeDetail / GET
385
- // /api/rigs/:rigId/nodes/:logicalId) — relocation, not loss.
386
- recoveryGuidance: null,
387
- latestError: row.startup_status === "ready" ? null : getLatestError(db, rigId, row.node_id),
388
- // Extended fields
389
- model: row.model,
390
- agentRef: row.agent_ref,
391
- profile: row.profile,
392
- codexConfigProfile: row.codex_config_profile,
393
- resolvedSpecName: row.resolved_spec_name,
394
- resolvedSpecVersion: row.resolved_spec_version,
395
- resolvedSpecHash: row.resolved_spec_hash,
396
- cwd: row.cwd,
397
- restorePolicy: row.restore_policy,
398
- resumeType: row.resume_type,
399
- resumeToken: row.resume_token,
400
- startupCompletedAt: row.startup_completed_at,
401
- // PL-007 Workspace Primitive — per-node workspace summary derived
402
- // from cwd against the rig's typed workspace block. null when the
403
- // rig has no workspace declaration.
404
- workspace: resolveNodeWorkspace({ spec: workspaceSpec, cwd: row.cwd }),
405
- // OPR.0.4.3.19 — the liveness identity verdict (third axis). null when
406
- // never observed; carries evidence on mismatch/missing.
407
- identityVerdict,
408
- heldReason: deriveHeldReason(db, rigId, row.node_id, row.session_status),
409
- };
372
+ ${whereClause}
373
+ ORDER BY ${orderClause}
374
+ `);
375
+ return stmt.all(...params);
376
+ }
377
+ // Single-rig (WHERE n.rig_id=?) or ALL-rigs (no WHERE). Byte-identical SQL/order to
378
+ // the prior inline read; existing single-rig callers are unchanged.
379
+ function queryInventoryRows(db, rigId) {
380
+ return runInventoryRowQuery(db, rigId ? "WHERE n.rig_id = ?" : "", rigId ? "n.created_at" : "n.rig_id, n.created_at", rigId ? [rigId] : []);
381
+ }
382
+ // Scoped to a rig-id SET every IN value bound as a parameter; per-rig created_at
383
+ // order preserved (same ORDER BY as the all-rigs path). Callers guarantee a
384
+ // non-empty list (empty set getNodeInventoryForRigs returns early, no query run).
385
+ function queryInventoryRowsForRigs(db, rigIds) {
386
+ const placeholders = rigIds.map(() => "?").join(", ");
387
+ return runInventoryRowQuery(db, `WHERE n.rig_id IN (${placeholders})`, "n.rig_id, n.created_at", rigIds);
388
+ }
389
+ function buildInventoryEntry(db, row, ctx) {
390
+ const { usableSnapshot, workspaceSpec, identityVerdicts, restoreOutcomes, orienteds } = ctx;
391
+ // FS-1 W1.3 S1 — O(1) lookup into the once-per-rig restore-outcome map
392
+ // (byte-identical to the prior per-node deriveRestoreOutcome; "n-a" when a node
393
+ // is referenced by no restore event, matching the prior fall-through).
394
+ const restoreOutcome = restoreOutcomes.get(row.node_id) ?? "n-a";
395
+ // OPR.0.4.3.19 rev1-r2 B1 — a durable verdict is keyed only by node_id, so
396
+ // after a rebind/relaunch (same node, NEW session + NEW pane) a stale
397
+ // `verified` verdict for the OLD pane would otherwise be served for the new
398
+ // pane until the next 5s reconcile tick, suppressing down-rank and rendering
399
+ // a fresh squat/orphan false-green. Make applicability LOAD-BEARING at read
400
+ // time: a stored verdict applies ONLY when it was computed against the
401
+ // current binding (its sessionName === the latest session AND its
402
+ // registeredPane === the current binding pane). Otherwise treat it as ABSENT
403
+ // (null) a STALE verdict becomes fail-open (never down-ranks a running
404
+ // seat), it does NOT itself down-rank. Only a MATCHING mismatch/pane_missing
405
+ // verdict down-ranks.
406
+ const identityVerdict = applicableVerdict(identityVerdicts.get(row.node_id) ?? null, row);
407
+ const lifecycleState = deriveNodeLifecycleState({
408
+ sessionStatus: row.session_status,
409
+ restoreOutcome,
410
+ nodeId: row.node_id,
411
+ usableSnapshot,
412
+ identityVerdict: identityVerdict?.verdict ?? null,
410
413
  });
414
+ return {
415
+ rigId: row.rig_id,
416
+ rigName: row.rig_name,
417
+ logicalId: row.logical_id,
418
+ podId: row.pod_id,
419
+ podNamespace: row.pod_namespace,
420
+ // OPR.0.4.6.FAC1: the seat-side role dimension (nodes.role,
421
+ // declared in the pod-member spec) — the workflow binding layer's
422
+ // candidate filter. null = role-less (never role-resolved).
423
+ role: row.role,
424
+ canonicalSessionName: row.session_name,
425
+ attachmentType: row.binding_attachment_type ?? null,
426
+ nodeKind: deriveNodeKind(row.runtime),
427
+ runtime: row.runtime,
428
+ sessionStatus: row.session_status,
429
+ startupStatus: row.startup_status,
430
+ restoreOutcome,
431
+ // FS-1 W1.3 S2 — O(1) lookup into the fleet-batched oriented map
432
+ // (byte-identical to the prior per-node deriveOriented; "n-a" when a node has
433
+ // no proof events, matching deriveOriented's no-challenge branch).
434
+ oriented: orienteds.get(row.node_id) ?? "n-a",
435
+ lifecycleState,
436
+ occupantLifecycle: deriveOccupantLifecycle(row, identityVerdict?.verdict ?? null),
437
+ continuityOutcome: deriveContinuityOutcome(row, restoreOutcome),
438
+ handoverResult: row.handover_result ?? null,
439
+ previousOccupant: row.previous_occupant,
440
+ handoverAt: row.handover_at,
441
+ tmuxAttachCommand: row.binding_attachment_type === "tmux" && row.session_name ? `tmux attach -t ${row.session_name}` : null,
442
+ resumeCommand: computeResumeCommand(row.runtime, row.resume_token, row.codex_config_profile),
443
+ // OPR.0.4.0.26: recoveryGuidance is NOT inlined per node in the LIST
444
+ // payload. It duplicated ~47KB of templated prose across all nodes and
445
+ // no node-list consumer reads it. The full guidance is recomputed on
446
+ // the single-node detail path (getNodeDetail / GET
447
+ // /api/rigs/:rigId/nodes/:logicalId) — relocation, not loss.
448
+ recoveryGuidance: null,
449
+ latestError: row.startup_status === "ready" ? null : getLatestError(db, row.rig_id, row.node_id),
450
+ // Extended fields
451
+ model: row.model,
452
+ agentRef: row.agent_ref,
453
+ profile: row.profile,
454
+ codexConfigProfile: row.codex_config_profile,
455
+ resolvedSpecName: row.resolved_spec_name,
456
+ resolvedSpecVersion: row.resolved_spec_version,
457
+ resolvedSpecHash: row.resolved_spec_hash,
458
+ cwd: row.cwd,
459
+ restorePolicy: row.restore_policy,
460
+ resumeType: row.resume_type,
461
+ resumeToken: row.resume_token,
462
+ startupCompletedAt: row.startup_completed_at,
463
+ // PL-007 Workspace Primitive — per-node workspace summary derived
464
+ // from cwd against the rig's typed workspace block. null when the
465
+ // rig has no workspace declaration.
466
+ workspace: resolveNodeWorkspace({ spec: workspaceSpec, cwd: row.cwd }),
467
+ // OPR.0.4.3.19 — the liveness identity verdict (third axis). null when
468
+ // never observed; carries evidence on mismatch/missing.
469
+ identityVerdict,
470
+ heldReason: deriveHeldReason(db, row.rig_id, row.node_id, row.session_status),
471
+ };
472
+ }
473
+ /** FS-1 W1.2 — all-rigs batched form of `readRigWorkspaceJson`: one query,
474
+ * `rigId → WorkspaceSpec`. Rigs with no/malformed workspace are absent (callers
475
+ * default to null — byte-identical to `readRigWorkspaceJson`'s null return). */
476
+ function readAllRigWorkspaceJson(db) {
477
+ const out = new Map();
478
+ try {
479
+ const rows = db.prepare("SELECT id, workspace_json FROM rigs").all();
480
+ for (const row of rows) {
481
+ if (!row.workspace_json)
482
+ continue;
483
+ try {
484
+ out.set(row.id, JSON.parse(row.workspace_json));
485
+ }
486
+ catch { /* malformed → absent → caller null (matches per-rig) */ }
487
+ }
488
+ }
489
+ catch { /* column/table absent → empty → caller null (matches per-rig defensive path) */ }
490
+ return out;
491
+ }
492
+ /**
493
+ * FS-1 W1.2 — the rig-level N+1 collapse. Builds inventory for ALL rigs in a
494
+ * bounded, rig-count-INDEPENDENT set of queries: 3 batched setup reads
495
+ * (snapshots / workspaces / identity verdicts) + 1 all-rigs node SELECT, grouped
496
+ * by rig_id. Every entry is built through the SAME `buildInventoryEntry` that the
497
+ * per-rig `getNodeInventory` uses, so `getNodeInventoryForAllRigs(db).get(rigId)`
498
+ * is byte-identical to `getNodeInventory(db, rigId)` — the collapse changes only
499
+ * HOW the context + rows are fetched (batched vs per-rig), never how an entry is
500
+ * derived. Per-node reads inside `buildInventoryEntry` (`deriveRestoreOutcome`
501
+ * etc.) remain per-node and ride the 047 index — NOT the rig-level N+1 removed here.
502
+ */
503
+ // Shared batched builder — the common body of the all-rigs and scoped-rigs paths.
504
+ // Builds the fleet setup maps + EXACTLY one fleet startup-orientation
505
+ // (buildOrientedMap) and one fleet restore-outcome (buildRestoreOutcomeMap) scan
506
+ // ONCE, then builds a NodeInventoryEntry for each PROVIDED row via the SAME
507
+ // buildInventoryEntry, grouped by rig_id with per-rig created_at order preserved.
508
+ // `rows` decides the scope (all rigs vs a selected rig set); entry derivation is
509
+ // identical, so a rig's entries are byte-identical regardless of which caller ran.
510
+ function buildInventoryMapFromRows(db, rows) {
511
+ const snapshotByRig = findLatestUsableSnapshotsForAllRigs(db);
512
+ const workspaceByRig = readAllRigWorkspaceJson(db);
513
+ const verdictsByRig = new SeatIdentityStore(db).getForAllRigs();
514
+ // FS-1 W1.3 S1/S2 — the per-node reads built ONCE (O(1) queries, not O(nodes)).
515
+ // Restore map unscoped: a nodeId is referenced only by its own rig's restore
516
+ // events, so each node's value equals the single-rig path.
517
+ const restoreOutcomes = buildRestoreOutcomeMap(db); // one fleet restore-outcome scan
518
+ const orienteds = buildOrientedMap(db); // one fleet startup-orientation scan
519
+ const out = new Map();
520
+ for (const row of rows) {
521
+ const entry = buildInventoryEntry(db, row, {
522
+ usableSnapshot: snapshotByRig.get(row.rig_id) ?? null,
523
+ workspaceSpec: workspaceByRig.get(row.rig_id) ?? null,
524
+ identityVerdicts: verdictsByRig.get(row.rig_id) ?? new Map(),
525
+ restoreOutcomes,
526
+ orienteds,
527
+ });
528
+ let list = out.get(row.rig_id);
529
+ if (!list) {
530
+ list = [];
531
+ out.set(row.rig_id, list);
532
+ }
533
+ list.push(entry);
534
+ }
535
+ return out;
536
+ }
537
+ export function getNodeInventoryForAllRigs(db) {
538
+ return buildInventoryMapFromRows(db, queryInventoryRows(db));
539
+ }
540
+ // slice-04 — inventory for a SELECTED set of rigs only (e.g. the rigs a summary
541
+ // actually returns), so the per-node fold never widens to rigs the caller excluded
542
+ // (e.g. archived). Retains exactly one fleet startup-orientation + one fleet
543
+ // restore-outcome scan via the shared builder. Empty set → empty Map, NO scans and
544
+ // no invalid `IN ()`. getNodeInventoryForRigs(db, {r}).get(r) is byte-identical to
545
+ // the all-rigs path's entry list for r (same rows, same builder).
546
+ export function getNodeInventoryForRigs(db, rigIds) {
547
+ if (rigIds.size === 0)
548
+ return new Map();
549
+ return buildInventoryMapFromRows(db, queryInventoryRowsForRigs(db, [...rigIds]));
411
550
  }
412
551
  /** PL-007 — read the rig's typed workspace block from `rigs.workspace_json`
413
552
  * defensively. Migration 038 may not yet be applied in older test fixtures
@@ -577,7 +716,7 @@ export function getNodeDetail(db, rigId, logicalId, opts) {
577
716
  * Context-aware wrapper: returns inventory with context usage attached.
578
717
  * Uses one daemon-owned ContextUsageStore for all reads.
579
718
  */
580
- export function getNodeInventoryWithContext(db, rigId, contextUsageStore) {
719
+ export function getNodeInventoryWithContext(db, rigId, contextUsageStore, transcriptStore) {
581
720
  const entries = getNodeInventory(db, rigId);
582
721
  // Find node IDs for batch read
583
722
  const nodeRows = db.prepare("SELECT id, logical_id FROM nodes WHERE rig_id = ?").all(rigId);
@@ -595,7 +734,17 @@ export function getNodeInventoryWithContext(db, rigId, contextUsageStore) {
595
734
  // large fleet; no node-list consumer reads it). All scalars are kept so
596
735
  // the ring/table/filter consumers are unaffected. The full currentUsage
597
736
  // remains on the detail/whoami path (getNodeDetailWithContext, whoami).
598
- return { ...e, contextUsage: { ...usage, currentUsage: null } };
737
+ const transcriptIngest = transcriptStore && e.canonicalSessionName
738
+ ? {
739
+ ...transcriptStore.getIngestHealth(e.rigName, e.canonicalSessionName),
740
+ runtime: e.runtime,
741
+ }
742
+ : undefined;
743
+ return {
744
+ ...e,
745
+ contextUsage: { ...usage, currentUsage: null },
746
+ ...(transcriptIngest ? { transcriptIngest } : {}),
747
+ };
599
748
  });
600
749
  }
601
750
  /**
@@ -689,7 +838,11 @@ function countPendingForEntry(entry, pendingByDest) {
689
838
  }
690
839
  return count;
691
840
  }
692
- function deriveCanonicalFromEntry(entry) {
841
+ /** EXPORTED (OPR.0.4.6.FAC1): the derived canonical coordinate
842
+ * `{pod}-{member}@{rig}` for an inventory entry — the binding layer's
843
+ * ONE string rule (tiebreak key AND recorded destination) reuses
844
+ * exactly this dual-key derivation, never a parallel one. */
845
+ export function deriveCanonicalFromEntry(entry) {
693
846
  if (!entry.rigName || !entry.logicalId)
694
847
  return null;
695
848
  const dotIdx = entry.logicalId.indexOf(".");
@@ -699,7 +852,7 @@ function deriveCanonicalFromEntry(entry) {
699
852
  const member = entry.logicalId.slice(dotIdx + 1);
700
853
  return deriveCanonicalSessionName(pod, member, entry.rigName);
701
854
  }
702
- function readPendingWorkBySession(db) {
855
+ export function readPendingWorkBySession(db) {
703
856
  const rows = db.prepare(`
704
857
  SELECT destination_session, COUNT(*) as c
705
858
  FROM queue_items