@openrig/cli 0.4.3 → 0.4.6

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 (634) hide show
  1. package/daemon/assets/guidance/openrig-start.md +6 -0
  2. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +47 -21
  3. package/daemon/assets/plugins/openrig-core/skills/openrig-cmux/SKILL.md +86 -0
  4. package/daemon/assets/plugins/openrig-core/skills/openrig-herdr/SKILL.md +158 -0
  5. package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +742 -94
  6. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  7. package/daemon/dist/adapters/codex-runtime-adapter.js +12 -8
  8. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  9. package/daemon/dist/adapters/pi-resume.d.ts +32 -0
  10. package/daemon/dist/adapters/pi-resume.d.ts.map +1 -0
  11. package/daemon/dist/adapters/pi-resume.js +125 -0
  12. package/daemon/dist/adapters/pi-resume.js.map +1 -0
  13. package/daemon/dist/adapters/pi-runner-protocol.d.ts +88 -0
  14. package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -0
  15. package/daemon/dist/adapters/pi-runner-protocol.js +153 -0
  16. package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -0
  17. package/daemon/dist/adapters/pi-runner.d.ts +99 -0
  18. package/daemon/dist/adapters/pi-runner.d.ts.map +1 -0
  19. package/daemon/dist/adapters/pi-runner.js +519 -0
  20. package/daemon/dist/adapters/pi-runner.js.map +1 -0
  21. package/daemon/dist/adapters/pi-runtime-adapter.d.ts +61 -0
  22. package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -0
  23. package/daemon/dist/adapters/pi-runtime-adapter.js +356 -0
  24. package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -0
  25. package/daemon/dist/adapters/tmux.d.ts +22 -1
  26. package/daemon/dist/adapters/tmux.d.ts.map +1 -1
  27. package/daemon/dist/adapters/tmux.js +40 -1
  28. package/daemon/dist/adapters/tmux.js.map +1 -1
  29. package/daemon/dist/build-info.d.ts +12 -0
  30. package/daemon/dist/build-info.d.ts.map +1 -0
  31. package/daemon/dist/build-info.js +11 -0
  32. package/daemon/dist/build-info.js.map +1 -0
  33. package/daemon/dist/builtins/workflow-specs/branched-remediation.yaml +31 -0
  34. package/daemon/dist/builtins/workflow-specs/factory-rsi.yaml +152 -0
  35. package/daemon/dist/builtins/workflow-specs/gated-release.yaml +26 -0
  36. package/daemon/dist/builtins/workflow-specs/linear-build.yaml +21 -0
  37. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.d.ts +18 -0
  38. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.d.ts.map +1 -0
  39. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.js +22 -0
  40. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.js.map +1 -0
  41. package/daemon/dist/db/migrations/049_workflow_instance_version.d.ts +20 -0
  42. package/daemon/dist/db/migrations/049_workflow_instance_version.d.ts.map +1 -0
  43. package/daemon/dist/db/migrations/049_workflow_instance_version.js +24 -0
  44. package/daemon/dist/db/migrations/049_workflow_instance_version.js.map +1 -0
  45. package/daemon/dist/db/migrations/050_workflow_spec_json.d.ts +22 -0
  46. package/daemon/dist/db/migrations/050_workflow_spec_json.d.ts.map +1 -0
  47. package/daemon/dist/db/migrations/050_workflow_spec_json.js +26 -0
  48. package/daemon/dist/db/migrations/050_workflow_spec_json.js.map +1 -0
  49. package/daemon/dist/db/migrations/051_workflow_resume.d.ts +22 -0
  50. package/daemon/dist/db/migrations/051_workflow_resume.d.ts.map +1 -0
  51. package/daemon/dist/db/migrations/051_workflow_resume.js +27 -0
  52. package/daemon/dist/db/migrations/051_workflow_resume.js.map +1 -0
  53. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.d.ts +26 -0
  54. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.d.ts.map +1 -0
  55. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.js +30 -0
  56. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.js.map +1 -0
  57. package/daemon/dist/db/migrations/053_sessions_node_id_index.d.ts +48 -0
  58. package/daemon/dist/db/migrations/053_sessions_node_id_index.d.ts.map +1 -0
  59. package/daemon/dist/db/migrations/053_sessions_node_id_index.js +53 -0
  60. package/daemon/dist/db/migrations/053_sessions_node_id_index.js.map +1 -0
  61. package/daemon/dist/db/migrations/054_queue_transitions_archive.d.ts +34 -0
  62. package/daemon/dist/db/migrations/054_queue_transitions_archive.d.ts.map +1 -0
  63. package/daemon/dist/db/migrations/054_queue_transitions_archive.js +49 -0
  64. package/daemon/dist/db/migrations/054_queue_transitions_archive.js.map +1 -0
  65. package/daemon/dist/domain/claim-service.d.ts +11 -0
  66. package/daemon/dist/domain/claim-service.d.ts.map +1 -1
  67. package/daemon/dist/domain/claim-service.js +3 -1
  68. package/daemon/dist/domain/claim-service.js.map +1 -1
  69. package/daemon/dist/domain/discovery-types.d.ts +1 -1
  70. package/daemon/dist/domain/discovery-types.d.ts.map +1 -1
  71. package/daemon/dist/domain/feed/attention-aggregator.d.ts +31 -0
  72. package/daemon/dist/domain/feed/attention-aggregator.d.ts.map +1 -0
  73. package/daemon/dist/domain/feed/attention-aggregator.js +119 -0
  74. package/daemon/dist/domain/feed/attention-aggregator.js.map +1 -0
  75. package/daemon/dist/domain/files/file-write-service.d.ts +11 -2
  76. package/daemon/dist/domain/files/file-write-service.d.ts.map +1 -1
  77. package/daemon/dist/domain/files/file-write-service.js +77 -0
  78. package/daemon/dist/domain/files/file-write-service.js.map +1 -1
  79. package/daemon/dist/domain/hosts/fanout-contract.d.ts +33 -0
  80. package/daemon/dist/domain/hosts/fanout-contract.d.ts.map +1 -0
  81. package/daemon/dist/domain/hosts/fanout-contract.js +23 -0
  82. package/daemon/dist/domain/hosts/fanout-contract.js.map +1 -0
  83. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +50 -0
  84. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -0
  85. package/daemon/dist/domain/hosts/hosts-registry-reader.js +184 -0
  86. package/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -0
  87. package/daemon/dist/domain/hosts/hosts-registry-writer.d.ts +11 -0
  88. package/daemon/dist/domain/hosts/hosts-registry-writer.d.ts.map +1 -0
  89. package/daemon/dist/domain/hosts/hosts-registry-writer.js +54 -0
  90. package/daemon/dist/domain/hosts/hosts-registry-writer.js.map +1 -0
  91. package/daemon/dist/domain/hosts/read-through.d.ts +28 -0
  92. package/daemon/dist/domain/hosts/read-through.d.ts.map +1 -0
  93. package/daemon/dist/domain/hosts/read-through.js +139 -0
  94. package/daemon/dist/domain/hosts/read-through.js.map +1 -0
  95. package/daemon/dist/domain/hosts/remote-daemon-http.d.ts +56 -0
  96. package/daemon/dist/domain/hosts/remote-daemon-http.d.ts.map +1 -0
  97. package/daemon/dist/domain/hosts/remote-daemon-http.js +154 -0
  98. package/daemon/dist/domain/hosts/remote-daemon-http.js.map +1 -0
  99. package/daemon/dist/domain/human-route-enforcer.d.ts +71 -0
  100. package/daemon/dist/domain/human-route-enforcer.d.ts.map +1 -0
  101. package/daemon/dist/domain/human-route-enforcer.js +80 -0
  102. package/daemon/dist/domain/human-route-enforcer.js.map +1 -0
  103. package/daemon/dist/domain/mission-control/audit-browse.d.ts +8 -0
  104. package/daemon/dist/domain/mission-control/audit-browse.d.ts.map +1 -1
  105. package/daemon/dist/domain/mission-control/audit-browse.js +19 -0
  106. package/daemon/dist/domain/mission-control/audit-browse.js.map +1 -1
  107. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts +1 -1
  108. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts.map +1 -1
  109. package/daemon/dist/domain/mission-control/mission-control-action-log.js +4 -0
  110. package/daemon/dist/domain/mission-control/mission-control-action-log.js.map +1 -1
  111. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js +1 -1
  112. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js.map +1 -1
  113. package/daemon/dist/domain/mission-control/mission-control-read-layer.js +1 -1
  114. package/daemon/dist/domain/mission-control/mission-control-read-layer.js.map +1 -1
  115. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts +28 -0
  116. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -1
  117. package/daemon/dist/domain/mission-control/mission-control-write-contract.js +125 -0
  118. package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
  119. package/daemon/dist/domain/node-inventory.d.ts +18 -0
  120. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  121. package/daemon/dist/domain/node-inventory.js +206 -95
  122. package/daemon/dist/domain/node-inventory.js.map +1 -1
  123. package/daemon/dist/domain/node-launcher.d.ts +11 -0
  124. package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
  125. package/daemon/dist/domain/node-launcher.js +10 -0
  126. package/daemon/dist/domain/node-launcher.js.map +1 -1
  127. package/daemon/dist/domain/policies/workflow-keepalive.d.ts +7 -0
  128. package/daemon/dist/domain/policies/workflow-keepalive.d.ts.map +1 -1
  129. package/daemon/dist/domain/policies/workflow-keepalive.js +93 -13
  130. package/daemon/dist/domain/policies/workflow-keepalive.js.map +1 -1
  131. package/daemon/dist/domain/ps-projection.d.ts +28 -1
  132. package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
  133. package/daemon/dist/domain/ps-projection.js +76 -26
  134. package/daemon/dist/domain/ps-projection.js.map +1 -1
  135. package/daemon/dist/domain/queue-repository.d.ts +130 -1
  136. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  137. package/daemon/dist/domain/queue-repository.js +304 -11
  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/brief-spine.d.ts +19 -0
  156. package/daemon/dist/domain/review/brief-spine.d.ts.map +1 -0
  157. package/daemon/dist/domain/review/brief-spine.js +86 -0
  158. package/daemon/dist/domain/review/brief-spine.js.map +1 -0
  159. package/daemon/dist/domain/review/compose.d.ts +277 -0
  160. package/daemon/dist/domain/review/compose.d.ts.map +1 -0
  161. package/daemon/dist/domain/review/compose.js +862 -0
  162. package/daemon/dist/domain/review/compose.js.map +1 -0
  163. package/daemon/dist/domain/review/fleet-compose.d.ts +52 -0
  164. package/daemon/dist/domain/review/fleet-compose.d.ts.map +1 -0
  165. package/daemon/dist/domain/review/fleet-compose.js +294 -0
  166. package/daemon/dist/domain/review/fleet-compose.js.map +1 -0
  167. package/daemon/dist/domain/review/freeze.d.ts +31 -0
  168. package/daemon/dist/domain/review/freeze.d.ts.map +1 -0
  169. package/daemon/dist/domain/review/freeze.js +257 -0
  170. package/daemon/dist/domain/review/freeze.js.map +1 -0
  171. package/daemon/dist/domain/review/gather.d.ts +115 -0
  172. package/daemon/dist/domain/review/gather.d.ts.map +1 -0
  173. package/daemon/dist/domain/review/gather.js +812 -0
  174. package/daemon/dist/domain/review/gather.js.map +1 -0
  175. package/daemon/dist/domain/review/types.d.ts +361 -0
  176. package/daemon/dist/domain/review/types.d.ts.map +1 -0
  177. package/daemon/dist/domain/review/types.js +35 -0
  178. package/daemon/dist/domain/review/types.js.map +1 -0
  179. package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
  180. package/daemon/dist/domain/rig-expansion-service.js +3 -0
  181. package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
  182. package/daemon/dist/domain/rig-repository.d.ts +7 -6
  183. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  184. package/daemon/dist/domain/rig-repository.js +33 -11
  185. package/daemon/dist/domain/rig-repository.js.map +1 -1
  186. package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
  187. package/daemon/dist/domain/rigspec-codec.js +3 -0
  188. package/daemon/dist/domain/rigspec-codec.js.map +1 -1
  189. package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
  190. package/daemon/dist/domain/rigspec-exporter.js +4 -0
  191. package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
  192. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  193. package/daemon/dist/domain/rigspec-instantiator.js +11 -0
  194. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  195. package/daemon/dist/domain/rigspec-preflight.d.ts +6 -0
  196. package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
  197. package/daemon/dist/domain/rigspec-preflight.js +26 -1
  198. package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
  199. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  200. package/daemon/dist/domain/rigspec-schema.js +20 -1
  201. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  202. package/daemon/dist/domain/runtime-verifier.d.ts +7 -1
  203. package/daemon/dist/domain/runtime-verifier.d.ts.map +1 -1
  204. package/daemon/dist/domain/runtime-verifier.js +39 -1
  205. package/daemon/dist/domain/runtime-verifier.js.map +1 -1
  206. package/daemon/dist/domain/scope/scope-approve.d.ts +64 -0
  207. package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -0
  208. package/daemon/dist/domain/scope/scope-approve.js +153 -0
  209. package/daemon/dist/domain/scope/scope-approve.js.map +1 -0
  210. package/daemon/dist/domain/scope/scope-audit.d.ts +9 -1
  211. package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  212. package/daemon/dist/domain/scope/scope-audit.js +173 -1
  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/slices/slice-detail-projector.d.ts.map +1 -1
  230. package/daemon/dist/domain/slices/slice-detail-projector.js +4 -5
  231. package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
  232. package/daemon/dist/domain/spec-library-workflow-scanner.d.ts +18 -2
  233. package/daemon/dist/domain/spec-library-workflow-scanner.d.ts.map +1 -1
  234. package/daemon/dist/domain/spec-library-workflow-scanner.js +23 -1
  235. package/daemon/dist/domain/spec-library-workflow-scanner.js.map +1 -1
  236. package/daemon/dist/domain/startup-proof.d.ts +10 -6
  237. package/daemon/dist/domain/startup-proof.d.ts.map +1 -1
  238. package/daemon/dist/domain/startup-proof.js +35 -7
  239. package/daemon/dist/domain/startup-proof.js.map +1 -1
  240. package/daemon/dist/domain/successor-session-launcher.d.ts +16 -0
  241. package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
  242. package/daemon/dist/domain/successor-session-launcher.js +13 -0
  243. package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  244. package/daemon/dist/domain/terminal/cmux-provider-adapter.d.ts +27 -0
  245. package/daemon/dist/domain/terminal/cmux-provider-adapter.d.ts.map +1 -0
  246. package/daemon/dist/domain/terminal/cmux-provider-adapter.js +67 -0
  247. package/daemon/dist/domain/terminal/cmux-provider-adapter.js.map +1 -0
  248. package/daemon/dist/domain/terminal/herdr-adapter.d.ts +77 -0
  249. package/daemon/dist/domain/terminal/herdr-adapter.d.ts.map +1 -0
  250. package/daemon/dist/domain/terminal/herdr-adapter.js +266 -0
  251. package/daemon/dist/domain/terminal/herdr-adapter.js.map +1 -0
  252. package/daemon/dist/domain/terminal/herdr-transport.d.ts +50 -0
  253. package/daemon/dist/domain/terminal/herdr-transport.d.ts.map +1 -0
  254. package/daemon/dist/domain/terminal/herdr-transport.js +145 -0
  255. package/daemon/dist/domain/terminal/herdr-transport.js.map +1 -0
  256. package/daemon/dist/domain/terminal/terminal-provider.d.ts +88 -0
  257. package/daemon/dist/domain/terminal/terminal-provider.d.ts.map +1 -0
  258. package/daemon/dist/domain/terminal/terminal-provider.js +17 -0
  259. package/daemon/dist/domain/terminal/terminal-provider.js.map +1 -0
  260. package/daemon/dist/domain/terminal/terminal-service.d.ts +60 -0
  261. package/daemon/dist/domain/terminal/terminal-service.d.ts.map +1 -0
  262. package/daemon/dist/domain/terminal/terminal-service.js +174 -0
  263. package/daemon/dist/domain/terminal/terminal-service.js.map +1 -0
  264. package/daemon/dist/domain/terminal/terminal-views-store.d.ts +77 -0
  265. package/daemon/dist/domain/terminal/terminal-views-store.d.ts.map +1 -0
  266. package/daemon/dist/domain/terminal/terminal-views-store.js +146 -0
  267. package/daemon/dist/domain/terminal/terminal-views-store.js.map +1 -0
  268. package/daemon/dist/domain/terminal/view-composer.d.ts +42 -0
  269. package/daemon/dist/domain/terminal/view-composer.d.ts.map +1 -0
  270. package/daemon/dist/domain/terminal/view-composer.js +137 -0
  271. package/daemon/dist/domain/terminal/view-composer.js.map +1 -0
  272. package/daemon/dist/domain/tmux-option-defaults.d.ts +89 -0
  273. package/daemon/dist/domain/tmux-option-defaults.d.ts.map +1 -0
  274. package/daemon/dist/domain/tmux-option-defaults.js +132 -0
  275. package/daemon/dist/domain/tmux-option-defaults.js.map +1 -0
  276. package/daemon/dist/domain/topology/multi-rig-launcher.d.ts +49 -0
  277. package/daemon/dist/domain/topology/multi-rig-launcher.d.ts.map +1 -0
  278. package/daemon/dist/domain/topology/multi-rig-launcher.js +132 -0
  279. package/daemon/dist/domain/topology/multi-rig-launcher.js.map +1 -0
  280. package/daemon/dist/domain/topology/remote-up-leaf.d.ts +29 -0
  281. package/daemon/dist/domain/topology/remote-up-leaf.d.ts.map +1 -0
  282. package/daemon/dist/domain/topology/remote-up-leaf.js +60 -0
  283. package/daemon/dist/domain/topology/remote-up-leaf.js.map +1 -0
  284. package/daemon/dist/domain/topology/topology-manifest.d.ts +34 -0
  285. package/daemon/dist/domain/topology/topology-manifest.d.ts.map +1 -0
  286. package/daemon/dist/domain/topology/topology-manifest.js +195 -0
  287. package/daemon/dist/domain/topology/topology-manifest.js.map +1 -0
  288. package/daemon/dist/domain/types.d.ts +39 -1
  289. package/daemon/dist/domain/types.d.ts.map +1 -1
  290. package/daemon/dist/domain/types.js.map +1 -1
  291. package/daemon/dist/domain/up-command-router.d.ts +1 -1
  292. package/daemon/dist/domain/up-command-router.d.ts.map +1 -1
  293. package/daemon/dist/domain/up-command-router.js +34 -2
  294. package/daemon/dist/domain/up-command-router.js.map +1 -1
  295. package/daemon/dist/domain/user-settings/settings-store.d.ts +18 -1
  296. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  297. package/daemon/dist/domain/user-settings/settings-store.js +201 -0
  298. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  299. package/daemon/dist/domain/workflow/slice-workflow-projection.d.ts.map +1 -1
  300. package/daemon/dist/domain/workflow/slice-workflow-projection.js +6 -2
  301. package/daemon/dist/domain/workflow/slice-workflow-projection.js.map +1 -1
  302. package/daemon/dist/domain/workflow-boot-sweep.d.ts +28 -0
  303. package/daemon/dist/domain/workflow-boot-sweep.d.ts.map +1 -0
  304. package/daemon/dist/domain/workflow-boot-sweep.js +102 -0
  305. package/daemon/dist/domain/workflow-boot-sweep.js.map +1 -0
  306. package/daemon/dist/domain/workflow-deadline.d.ts +74 -0
  307. package/daemon/dist/domain/workflow-deadline.d.ts.map +1 -0
  308. package/daemon/dist/domain/workflow-deadline.js +165 -0
  309. package/daemon/dist/domain/workflow-deadline.js.map +1 -0
  310. package/daemon/dist/domain/workflow-exception-escalation.d.ts +33 -0
  311. package/daemon/dist/domain/workflow-exception-escalation.d.ts.map +1 -0
  312. package/daemon/dist/domain/workflow-exception-escalation.js +104 -0
  313. package/daemon/dist/domain/workflow-exception-escalation.js.map +1 -0
  314. package/daemon/dist/domain/workflow-exception-router.d.ts +33 -0
  315. package/daemon/dist/domain/workflow-exception-router.d.ts.map +1 -0
  316. package/daemon/dist/domain/workflow-exception-router.js +96 -0
  317. package/daemon/dist/domain/workflow-exception-router.js.map +1 -0
  318. package/daemon/dist/domain/workflow-exception.d.ts +90 -0
  319. package/daemon/dist/domain/workflow-exception.d.ts.map +1 -0
  320. package/daemon/dist/domain/workflow-exception.js +122 -0
  321. package/daemon/dist/domain/workflow-exception.js.map +1 -0
  322. package/daemon/dist/domain/workflow-frontier-guard.d.ts +24 -0
  323. package/daemon/dist/domain/workflow-frontier-guard.d.ts.map +1 -0
  324. package/daemon/dist/domain/workflow-frontier-guard.js +30 -0
  325. package/daemon/dist/domain/workflow-frontier-guard.js.map +1 -0
  326. package/daemon/dist/domain/workflow-instance-store.d.ts +28 -0
  327. package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -1
  328. package/daemon/dist/domain/workflow-instance-store.js +66 -10
  329. package/daemon/dist/domain/workflow-instance-store.js.map +1 -1
  330. package/daemon/dist/domain/workflow-keepalive-arming.d.ts +35 -0
  331. package/daemon/dist/domain/workflow-keepalive-arming.d.ts.map +1 -0
  332. package/daemon/dist/domain/workflow-keepalive-arming.js +87 -0
  333. package/daemon/dist/domain/workflow-keepalive-arming.js.map +1 -0
  334. package/daemon/dist/domain/workflow-projector.d.ts +117 -2
  335. package/daemon/dist/domain/workflow-projector.d.ts.map +1 -1
  336. package/daemon/dist/domain/workflow-projector.js +672 -41
  337. package/daemon/dist/domain/workflow-projector.js.map +1 -1
  338. package/daemon/dist/domain/workflow-role-context.d.ts +57 -0
  339. package/daemon/dist/domain/workflow-role-context.d.ts.map +1 -0
  340. package/daemon/dist/domain/workflow-role-context.js +120 -0
  341. package/daemon/dist/domain/workflow-role-context.js.map +1 -0
  342. package/daemon/dist/domain/workflow-role-resolver.d.ts +65 -0
  343. package/daemon/dist/domain/workflow-role-resolver.d.ts.map +1 -0
  344. package/daemon/dist/domain/workflow-role-resolver.js +108 -0
  345. package/daemon/dist/domain/workflow-role-resolver.js.map +1 -0
  346. package/daemon/dist/domain/workflow-runtime.d.ts +157 -1
  347. package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
  348. package/daemon/dist/domain/workflow-runtime.js +718 -11
  349. package/daemon/dist/domain/workflow-runtime.js.map +1 -1
  350. package/daemon/dist/domain/workflow-spec-cache.d.ts +26 -1
  351. package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
  352. package/daemon/dist/domain/workflow-spec-cache.js +327 -13
  353. package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
  354. package/daemon/dist/domain/workflow-types.d.ts +143 -8
  355. package/daemon/dist/domain/workflow-types.d.ts.map +1 -1
  356. package/daemon/dist/domain/workflow-types.js +14 -1
  357. package/daemon/dist/domain/workflow-types.js.map +1 -1
  358. package/daemon/dist/domain/workflow-validator.d.ts +11 -1
  359. package/daemon/dist/domain/workflow-validator.d.ts.map +1 -1
  360. package/daemon/dist/domain/workflow-validator.js +246 -1
  361. package/daemon/dist/domain/workflow-validator.js.map +1 -1
  362. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
  363. package/daemon/dist/domain/workspace/default-workspace-scaffold.js +51 -6
  364. package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
  365. package/daemon/dist/domain/workspace/workspace-doctor.d.ts +11 -0
  366. package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
  367. package/daemon/dist/domain/workspace/workspace-doctor.js +82 -0
  368. package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
  369. package/daemon/dist/index.d.ts +17 -0
  370. package/daemon/dist/index.d.ts.map +1 -1
  371. package/daemon/dist/index.js +44 -0
  372. package/daemon/dist/index.js.map +1 -1
  373. package/daemon/dist/routes/activity.js +22 -0
  374. package/daemon/dist/routes/activity.js.map +1 -1
  375. package/daemon/dist/routes/config.d.ts.map +1 -1
  376. package/daemon/dist/routes/config.js +15 -6
  377. package/daemon/dist/routes/config.js.map +1 -1
  378. package/daemon/dist/routes/files.d.ts.map +1 -1
  379. package/daemon/dist/routes/files.js +45 -1
  380. package/daemon/dist/routes/files.js.map +1 -1
  381. package/daemon/dist/routes/hosts.d.ts +5 -0
  382. package/daemon/dist/routes/hosts.d.ts.map +1 -0
  383. package/daemon/dist/routes/hosts.js +346 -0
  384. package/daemon/dist/routes/hosts.js.map +1 -0
  385. package/daemon/dist/routes/mission-control.d.ts.map +1 -1
  386. package/daemon/dist/routes/mission-control.js +67 -2
  387. package/daemon/dist/routes/mission-control.js.map +1 -1
  388. package/daemon/dist/routes/queue.d.ts +10 -9
  389. package/daemon/dist/routes/queue.d.ts.map +1 -1
  390. package/daemon/dist/routes/queue.js +305 -10
  391. package/daemon/dist/routes/queue.js.map +1 -1
  392. package/daemon/dist/routes/review.d.ts +3 -0
  393. package/daemon/dist/routes/review.d.ts.map +1 -0
  394. package/daemon/dist/routes/review.js +195 -0
  395. package/daemon/dist/routes/review.js.map +1 -0
  396. package/daemon/dist/routes/scope-approve.d.ts +3 -0
  397. package/daemon/dist/routes/scope-approve.d.ts.map +1 -0
  398. package/daemon/dist/routes/scope-approve.js +55 -0
  399. package/daemon/dist/routes/scope-approve.js.map +1 -0
  400. package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
  401. package/daemon/dist/routes/scope-audit.js +28 -1
  402. package/daemon/dist/routes/scope-audit.js.map +1 -1
  403. package/daemon/dist/routes/seat.js +13 -0
  404. package/daemon/dist/routes/seat.js.map +1 -1
  405. package/daemon/dist/routes/slices.d.ts.map +1 -1
  406. package/daemon/dist/routes/slices.js +49 -9
  407. package/daemon/dist/routes/slices.js.map +1 -1
  408. package/daemon/dist/routes/terminal-ws.d.ts.map +1 -1
  409. package/daemon/dist/routes/terminal-ws.js +58 -21
  410. package/daemon/dist/routes/terminal-ws.js.map +1 -1
  411. package/daemon/dist/routes/terminal.d.ts +11 -0
  412. package/daemon/dist/routes/terminal.d.ts.map +1 -0
  413. package/daemon/dist/routes/terminal.js +104 -0
  414. package/daemon/dist/routes/terminal.js.map +1 -0
  415. package/daemon/dist/routes/up.d.ts.map +1 -1
  416. package/daemon/dist/routes/up.js +84 -0
  417. package/daemon/dist/routes/up.js.map +1 -1
  418. package/daemon/dist/routes/workflow.d.ts.map +1 -1
  419. package/daemon/dist/routes/workflow.js +102 -10
  420. package/daemon/dist/routes/workflow.js.map +1 -1
  421. package/daemon/dist/routes/workspace.js +2 -2
  422. package/daemon/dist/server.d.ts +6 -0
  423. package/daemon/dist/server.d.ts.map +1 -1
  424. package/daemon/dist/server.js +36 -1
  425. package/daemon/dist/server.js.map +1 -1
  426. package/daemon/dist/startup.d.ts.map +1 -1
  427. package/daemon/dist/startup.js +238 -14
  428. package/daemon/dist/startup.js.map +1 -1
  429. package/daemon/docs/reference/agent-startup-guide.md +1 -1
  430. package/daemon/docs/reference/product-factory-vps-runbook.md +132 -0
  431. package/daemon/docs/reference/sdlc-conventions.md +187 -0
  432. package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -1
  433. package/daemon/specs/agents/conveyor/builder/guidance/role.md +1 -0
  434. package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -1
  435. package/daemon/specs/agents/conveyor/lead/guidance/role.md +1 -0
  436. package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -1
  437. package/daemon/specs/agents/conveyor/planner/guidance/role.md +1 -0
  438. package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -1
  439. package/daemon/specs/agents/conveyor/reviewer/guidance/role.md +1 -0
  440. package/daemon/specs/agents/design/product-designer/agent.yaml +1 -1
  441. package/daemon/specs/agents/design/product-designer/guidance/role.md +1 -0
  442. package/daemon/specs/agents/development/implementer/agent.yaml +1 -1
  443. package/daemon/specs/agents/development/implementer/guidance/role.md +1 -0
  444. package/daemon/specs/agents/development/qa/agent.yaml +1 -1
  445. package/daemon/specs/agents/development/qa/guidance/role.md +1 -0
  446. package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +29 -0
  447. package/daemon/specs/agents/factory-rsi/dogfood/guidance/role.md +37 -0
  448. package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +29 -0
  449. package/daemon/specs/agents/factory-rsi/release-manager/guidance/role.md +40 -0
  450. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -1
  451. package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +1 -0
  452. package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
  453. package/daemon/specs/agents/product-management/pm/guidance/role.md +13 -0
  454. package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -1
  455. package/daemon/specs/agents/review/independent-reviewer/guidance/role.md +1 -0
  456. package/daemon/specs/agents/shared/agent.yaml +2 -0
  457. package/daemon/specs/agents/shared/skills/core/mission-slice-sop/SKILL.md +113 -0
  458. package/daemon/specs/agents/shared/skills/core/openrig-cmux/SKILL.md +86 -0
  459. package/daemon/specs/agents/shared/skills/core/openrig-herdr/SKILL.md +158 -0
  460. package/daemon/specs/agents/shared/skills/core/openrig-operator/SKILL.md +4 -4
  461. package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +75 -29
  462. package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +2 -2
  463. package/daemon/specs/rigs/focused/pm-team/CULTURE.md +4 -0
  464. package/daemon/specs/rigs/launch/factory-rsi/CULTURE.md +47 -0
  465. package/daemon/specs/rigs/launch/factory-rsi/rig.yaml +115 -0
  466. package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +1 -1
  467. package/daemon/specs/rigs/launch/kernel/agents/operator/agent/startup/context.md +1 -1
  468. package/daemon/specs/rigs/preview/product-team/CULTURE.md +4 -0
  469. package/dist/build-info.d.ts +8 -0
  470. package/dist/build-info.d.ts.map +1 -0
  471. package/dist/build-info.js +11 -0
  472. package/dist/build-info.js.map +1 -0
  473. package/dist/commands/broadcast.d.ts +6 -1
  474. package/dist/commands/broadcast.d.ts.map +1 -1
  475. package/dist/commands/broadcast.js +101 -15
  476. package/dist/commands/broadcast.js.map +1 -1
  477. package/dist/commands/capture.d.ts.map +1 -1
  478. package/dist/commands/capture.js +99 -8
  479. package/dist/commands/capture.js.map +1 -1
  480. package/dist/commands/config-init-workspace.d.ts.map +1 -1
  481. package/dist/commands/config-init-workspace.js +20 -4
  482. package/dist/commands/config-init-workspace.js.map +1 -1
  483. package/dist/commands/config.d.ts.map +1 -1
  484. package/dist/commands/config.js +4 -0
  485. package/dist/commands/config.js.map +1 -1
  486. package/dist/commands/doctor.js +2 -2
  487. package/dist/commands/doctor.js.map +1 -1
  488. package/dist/commands/down.d.ts.map +1 -1
  489. package/dist/commands/down.js +5 -0
  490. package/dist/commands/down.js.map +1 -1
  491. package/dist/commands/expand.js +1 -1
  492. package/dist/commands/expand.js.map +1 -1
  493. package/dist/commands/file.d.ts +7 -0
  494. package/dist/commands/file.d.ts.map +1 -0
  495. package/dist/commands/file.js +77 -0
  496. package/dist/commands/file.js.map +1 -0
  497. package/dist/commands/host.d.ts +48 -0
  498. package/dist/commands/host.d.ts.map +1 -0
  499. package/dist/commands/host.js +772 -0
  500. package/dist/commands/host.js.map +1 -0
  501. package/dist/commands/launch.d.ts.map +1 -1
  502. package/dist/commands/launch.js +5 -0
  503. package/dist/commands/launch.js.map +1 -1
  504. package/dist/commands/proof.d.ts +54 -0
  505. package/dist/commands/proof.d.ts.map +1 -0
  506. package/dist/commands/proof.js +311 -0
  507. package/dist/commands/proof.js.map +1 -0
  508. package/dist/commands/ps.d.ts +41 -7
  509. package/dist/commands/ps.d.ts.map +1 -1
  510. package/dist/commands/ps.js +353 -135
  511. package/dist/commands/ps.js.map +1 -1
  512. package/dist/commands/queue.d.ts +36 -0
  513. package/dist/commands/queue.d.ts.map +1 -1
  514. package/dist/commands/queue.js +149 -7
  515. package/dist/commands/queue.js.map +1 -1
  516. package/dist/commands/restore-packet.d.ts.map +1 -1
  517. package/dist/commands/restore-packet.js +13 -2
  518. package/dist/commands/restore-packet.js.map +1 -1
  519. package/dist/commands/scope.d.ts.map +1 -1
  520. package/dist/commands/scope.js +140 -3
  521. package/dist/commands/scope.js.map +1 -1
  522. package/dist/commands/send.d.ts.map +1 -1
  523. package/dist/commands/send.js +127 -13
  524. package/dist/commands/send.js.map +1 -1
  525. package/dist/commands/terminal.d.ts +6 -0
  526. package/dist/commands/terminal.d.ts.map +1 -0
  527. package/dist/commands/terminal.js +116 -0
  528. package/dist/commands/terminal.js.map +1 -0
  529. package/dist/commands/transcript.d.ts +6 -1
  530. package/dist/commands/transcript.d.ts.map +1 -1
  531. package/dist/commands/transcript.js +113 -30
  532. package/dist/commands/transcript.js.map +1 -1
  533. package/dist/commands/up.d.ts +2 -0
  534. package/dist/commands/up.d.ts.map +1 -1
  535. package/dist/commands/up.js +78 -2
  536. package/dist/commands/up.js.map +1 -1
  537. package/dist/commands/whoami.d.ts.map +1 -1
  538. package/dist/commands/whoami.js +11 -0
  539. package/dist/commands/whoami.js.map +1 -1
  540. package/dist/commands/workflow-errors.d.ts +23 -0
  541. package/dist/commands/workflow-errors.d.ts.map +1 -0
  542. package/dist/commands/workflow-errors.js +100 -0
  543. package/dist/commands/workflow-errors.js.map +1 -0
  544. package/dist/commands/workflow-follow.d.ts +71 -0
  545. package/dist/commands/workflow-follow.d.ts.map +1 -0
  546. package/dist/commands/workflow-follow.js +259 -0
  547. package/dist/commands/workflow-follow.js.map +1 -0
  548. package/dist/commands/workflow-render.d.ts +114 -0
  549. package/dist/commands/workflow-render.d.ts.map +1 -0
  550. package/dist/commands/workflow-render.js +223 -0
  551. package/dist/commands/workflow-render.js.map +1 -0
  552. package/dist/commands/workflow.d.ts +1 -0
  553. package/dist/commands/workflow.d.ts.map +1 -1
  554. package/dist/commands/workflow.js +278 -14
  555. package/dist/commands/workflow.js.map +1 -1
  556. package/dist/commands/workspace.js +6 -6
  557. package/dist/commands/workspace.js.map +1 -1
  558. package/dist/config-store.d.ts +19 -1
  559. package/dist/config-store.d.ts.map +1 -1
  560. package/dist/config-store.js +171 -0
  561. package/dist/config-store.js.map +1 -1
  562. package/dist/cross-host-cli-helpers.d.ts +13 -0
  563. package/dist/cross-host-cli-helpers.d.ts.map +1 -1
  564. package/dist/cross-host-cli-helpers.js +27 -0
  565. package/dist/cross-host-cli-helpers.js.map +1 -1
  566. package/dist/cross-host-executor.d.ts +1 -0
  567. package/dist/cross-host-executor.d.ts.map +1 -1
  568. package/dist/cross-host-executor.js +4 -1
  569. package/dist/cross-host-executor.js.map +1 -1
  570. package/dist/cross-host-target.d.ts +49 -0
  571. package/dist/cross-host-target.d.ts.map +1 -0
  572. package/dist/cross-host-target.js +35 -0
  573. package/dist/cross-host-target.js.map +1 -0
  574. package/dist/daemon-lifecycle.d.ts.map +1 -1
  575. package/dist/daemon-lifecycle.js +4 -1
  576. package/dist/daemon-lifecycle.js.map +1 -1
  577. package/dist/host-registry.d.ts +17 -0
  578. package/dist/host-registry.d.ts.map +1 -1
  579. package/dist/host-registry.js +64 -2
  580. package/dist/host-registry.js.map +1 -1
  581. package/dist/host-selection.d.ts +13 -0
  582. package/dist/host-selection.d.ts.map +1 -0
  583. package/dist/host-selection.js +54 -0
  584. package/dist/host-selection.js.map +1 -0
  585. package/dist/index.d.ts +2 -0
  586. package/dist/index.d.ts.map +1 -1
  587. package/dist/index.js +9 -0
  588. package/dist/index.js.map +1 -1
  589. package/dist/lib/file-transfer.d.ts +89 -0
  590. package/dist/lib/file-transfer.d.ts.map +1 -0
  591. package/dist/lib/file-transfer.js +300 -0
  592. package/dist/lib/file-transfer.js.map +1 -0
  593. package/dist/lib/hosts/fanout-contract.d.ts +33 -0
  594. package/dist/lib/hosts/fanout-contract.d.ts.map +1 -0
  595. package/dist/lib/hosts/fanout-contract.js +23 -0
  596. package/dist/lib/hosts/fanout-contract.js.map +1 -0
  597. package/dist/lib/scope/scope-audit.d.ts +9 -1
  598. package/dist/lib/scope/scope-audit.d.ts.map +1 -1
  599. package/dist/lib/scope/scope-audit.js +173 -1
  600. package/dist/lib/scope/scope-audit.js.map +1 -1
  601. package/dist/lib/scope/templates.d.ts +1 -0
  602. package/dist/lib/scope/templates.d.ts.map +1 -1
  603. package/dist/lib/scope/templates.js +9 -0
  604. package/dist/lib/scope/templates.js.map +1 -1
  605. package/dist/lib/scope-templates/backlog-deprecation.md +16 -0
  606. package/dist/lib/scope-templates/backlog-tech-debt.md +16 -0
  607. package/dist/lib/scope-templates/bug-fix.md +16 -0
  608. package/dist/lib/scope-templates/implementation-prd.md +33 -0
  609. package/dist/lib/scope-templates/mission-placeholder.md +1 -1
  610. package/dist/lib/scope-templates/mission-progress.md +1 -1
  611. package/dist/lib/scope-templates/mission-release.md +1 -1
  612. package/dist/lib/scope-templates/placeholder.md +11 -7
  613. package/dist/lib/scope-templates/proof.md +5 -1
  614. package/dist/lib/scope-templates/release-feature.md +14 -6
  615. package/dist/lib/scope-templates/research.md +16 -0
  616. package/dist/lib/scope-templates/slice-progress.md +1 -1
  617. package/dist/remote-host-ops.d.ts +1 -0
  618. package/dist/remote-host-ops.d.ts.map +1 -1
  619. package/dist/remote-host-ops.js +11 -4
  620. package/dist/remote-host-ops.js.map +1 -1
  621. package/dist/session-name.d.ts +23 -0
  622. package/dist/session-name.d.ts.map +1 -0
  623. package/dist/session-name.js +61 -0
  624. package/dist/session-name.js.map +1 -0
  625. package/dist/version.d.ts +5 -0
  626. package/dist/version.d.ts.map +1 -1
  627. package/dist/version.js +11 -1
  628. package/dist/version.js.map +1 -1
  629. package/package.json +1 -1
  630. package/ui/dist/assets/index-CFqxa0zW.css +32 -0
  631. package/ui/dist/assets/index-zrFqS7gL.js +623 -0
  632. package/ui/dist/index.html +2 -2
  633. package/ui/dist/assets/index-DYZniQcc.js +0 -597
  634. package/ui/dist/assets/index-trcb4Yf_.css +0 -32
@@ -39,6 +39,7 @@
39
39
  // closure_target+handed_off_to=<destination>;
40
40
  // creates new qitem at destination (4-step canonical)
41
41
  import { MissionControlActionLogError, } from "./mission-control-action-log.js";
42
+ import { isHumanSeatSession } from "../human-route-enforcer.js";
42
43
  export class MissionControlWriteContractError extends Error {
43
44
  code;
44
45
  details;
@@ -71,6 +72,9 @@ export class MissionControlWriteContract {
71
72
  if (input.verb === "annotate") {
72
73
  return this.annotateOnly(input);
73
74
  }
75
+ if (input.verb === "resolve") {
76
+ return this.resolveParked(input);
77
+ }
74
78
  const source = this.requireMutableQitem(input.qitemId);
75
79
  if ((input.verb === "route" || input.verb === "handoff") && !input.destinationSession) {
76
80
  throw new MissionControlWriteContractError("destination_required", `verb=${input.verb} requires destinationSession`, { verb: input.verb });
@@ -104,6 +108,8 @@ export class MissionControlWriteContract {
104
108
  body: input.body ?? source.body,
105
109
  priority: source.priority,
106
110
  tier: source.tier ?? undefined,
111
+ summary: source.summary,
112
+ evidenceRef: source.evidenceRef,
107
113
  tags: source.tags
108
114
  ? [...source.tags, `mission-control:${input.verb}`]
109
115
  : [`mission-control:${input.verb}`],
@@ -227,6 +233,120 @@ export class MissionControlWriteContract {
227
233
  auditedAt: evaluatedAt,
228
234
  };
229
235
  }
236
+ /**
237
+ * OPR.0.4.4.19 FR-7 — resolve + unpark (all six arch rails encoded):
238
+ *
239
+ * 1. A verb in the mission-control family (this method), NOT an overload
240
+ * of annotate/route.
241
+ * 2. The decision text lands durably + queryably in
242
+ * queue_transitions.transition_note with actor_session = the
243
+ * resolving session (the composer reads it there forever).
244
+ * 3. Unpark = blocked → in-progress via the Phase-A enum-validated
245
+ * update (no state-machine change) + the existing nudge machinery.
246
+ * 4. Resolution routes BACK to the parked owner — the qitem keeps its
247
+ * destination; no new potato owner is ever created here.
248
+ * 5. Enforcement symmetry: park required summary + evidence_ref;
249
+ * resolve requires NON-EMPTY decision text, daemon-enforced.
250
+ * 6. The human acts on the surface/feed card; this is the ONE write
251
+ * path (POST /api/mission-control/action verb=resolve) — the CLI
252
+ * wrapper is a thin client of the same endpoint.
253
+ *
254
+ * NON-CLOSURE by contract: verbToClosure has NO resolve mapping — a
255
+ * resolved qitem is state=in-progress with closure_reason still null.
256
+ * One transaction: transition + decision note + audit row + events.
257
+ * The owner nudge (carrying the decision text) is post-commit
258
+ * best-effort — the unpark is never lost to a transport failure (BR-8).
259
+ */
260
+ async resolveParked(input) {
261
+ const decision = input.decision?.trim();
262
+ if (!decision) {
263
+ throw new MissionControlWriteContractError("decision_required", "verb=resolve requires non-empty decision text — a park without a recorded decision is exactly what this primitive exists to kill", { verb: input.verb });
264
+ }
265
+ const source = this.queueRepo.getById(input.qitemId);
266
+ if (!source) {
267
+ throw new MissionControlWriteContractError("qitem_not_found", `qitem ${input.qitemId} not found`, { qitemId: input.qitemId });
268
+ }
269
+ if (source.state !== "blocked" || !isHumanSeatSession(source.blockedOn)) {
270
+ throw new MissionControlWriteContractError("qitem_not_leg1_parked", `verb=resolve requires a leg-1 parked qitem (state=blocked with a human-seat blocked_on); ` +
271
+ `qitem ${input.qitemId} is state=${source.state}, blocked_on=${source.blockedOn ?? "null"}. ` +
272
+ `Re-resolving an already-resolved item is a no-op error, not a double transition.`, { qitemId: input.qitemId, state: source.state, blockedOn: source.blockedOn });
273
+ }
274
+ const evaluatedAt = this.now().toISOString();
275
+ const beforeSnapshot = snapshotQitem(source);
276
+ let actionEntry = null;
277
+ const persistedEvents = [];
278
+ const txn = this.db.transaction(() => {
279
+ // Rail 2+3: blocked → in-progress; decision text = transition_note;
280
+ // actor_session = the resolving human/relay session. Emits
281
+ // queue.updated (the P2 refresh-after-action contract). blocked_on is
282
+ // deliberately retained as provenance of whom it was parked on — the
283
+ // attention query keys on state='blocked', so the resolved item drops
284
+ // out of attention regardless.
285
+ const updateResult = this.queueRepo.updateWithinTransaction({
286
+ qitemId: input.qitemId,
287
+ actorSession: input.actorSession,
288
+ state: "in-progress",
289
+ transitionNote: decision,
290
+ });
291
+ persistedEvents.push(updateResult.persistedEvent);
292
+ const resolvedQitem = this.queueRepo.getById(input.qitemId);
293
+ actionEntry = this.actionLog.record({
294
+ actionVerb: "resolve",
295
+ qitemId: input.qitemId,
296
+ actorSession: input.actorSession,
297
+ actedAt: evaluatedAt,
298
+ beforeState: beforeSnapshot,
299
+ afterState: resolvedQitem ? snapshotQitem(resolvedQitem) : null,
300
+ reason: decision,
301
+ auditNotes: input.auditNotes ?? null,
302
+ });
303
+ persistedEvents.push(this.eventBus.persistWithinTransaction({
304
+ type: "mission_control.action_executed",
305
+ actionId: actionEntry.actionId,
306
+ actionVerb: "resolve",
307
+ qitemId: input.qitemId,
308
+ actorSession: input.actorSession,
309
+ }));
310
+ });
311
+ try {
312
+ txn();
313
+ }
314
+ catch (err) {
315
+ if (err instanceof MissionControlActionLogError) {
316
+ throw new MissionControlWriteContractError(err.code, err.message, err.details);
317
+ }
318
+ throw err;
319
+ }
320
+ for (const e of persistedEvents)
321
+ this.eventBus.notifySubscribers(e);
322
+ // Rail 3 + BR-8: best-effort nudge to the PARKED OWNER carrying the
323
+ // decision text, after the commit — nudge outcome recorded via the
324
+ // existing last_nudge_* mechanics; a failed nudge never unwinds the
325
+ // unpark.
326
+ let notifyAttempted = false;
327
+ let notifyResult = null;
328
+ if (input.notify !== false) {
329
+ try {
330
+ await this.queueRepo.maybeNudge(input.qitemId, source.destinationSession, input.notify, input.actorSession, `Decision resolved on ${input.qitemId}: ${decision} — unparked (blocked → in-progress); you still own it. Check your queue.`);
331
+ notifyAttempted = true;
332
+ notifyResult = "attempted-best-effort";
333
+ }
334
+ catch (err) {
335
+ notifyAttempted = true;
336
+ notifyResult = `failed:${err instanceof Error ? err.message : String(err)}`;
337
+ }
338
+ }
339
+ return {
340
+ actionId: actionEntry.actionId,
341
+ verb: "resolve",
342
+ qitemId: input.qitemId,
343
+ closedQitem: this.queueRepo.getById(input.qitemId),
344
+ createdQitemId: null,
345
+ notifyAttempted,
346
+ notifyResult,
347
+ auditedAt: evaluatedAt,
348
+ };
349
+ }
230
350
  requireMutableQitem(qitemId) {
231
351
  const source = this.queueRepo.getById(qitemId);
232
352
  if (!source) {
@@ -282,6 +402,11 @@ function verbToClosure(input) {
282
402
  case "annotate":
283
403
  // Should never reach here — annotate is handled by annotateOnly().
284
404
  throw new MissionControlWriteContractError("internal_invariant", "annotate verb should have been routed to annotateOnly");
405
+ case "resolve":
406
+ // OPR.0.4.4.19 FR-7 — resolve deliberately has NO closure mapping
407
+ // (a resolved qitem is state=in-progress, closure_reason null).
408
+ // Handled by resolveParked(); reaching here is a contract violation.
409
+ throw new MissionControlWriteContractError("internal_invariant", "resolve verb is non-closure and should have been routed to resolveParked");
285
410
  }
286
411
  }
287
412
  function snapshotQitem(q) {
@@ -1 +1 @@
1
- {"version":3,"file":"mission-control-write-contract.js","sourceRoot":"","sources":["../../../src/domain/mission-control/mission-control-write-contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mission-control-write-contract.js","sourceRoot":"","sources":["../../../src/domain/mission-control/mission-control-write-contract.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,mEAAmE;AACnE,sEAAsE;AACtE,mEAAmE;AACnE,oEAAoE;AACpE,kEAAkE;AAClE,qCAAqC;AACrC,EAAE;AACF,kDAAkD;AAClD,kEAAkE;AAClE,8DAA8D;AAC9D,kEAAkE;AAClE,kEAAkE;AAClE,sEAAsE;AACtE,4DAA4D;AAC5D,qEAAqE;AACrE,8BAA8B;AAC9B,0DAA0D;AAC1D,EAAE;AACF,oEAAoE;AACpE,kEAAkE;AAClE,kEAAkE;AAClE,4BAA4B;AAC5B,EAAE;AACF,iBAAiB;AACjB,mEAAmE;AACnE,6DAA6D;AAC7D,qEAAqE;AACrE,8DAA8D;AAC9D,+DAA+D;AAC/D,uEAAuE;AACvE,sDAAsD;AACtD,kEAAkE;AAClE,yDAAyD;AACzD,gEAAgE;AAChE,yCAAyC;AACzC,qEAAqE;AACrE,6DAA6D;AAC7D,qEAAqE;AAMrE,OAAO,EAEL,4BAA4B,GAE7B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,OAAO,gCAAiC,SAAQ,KAAK;IAEvC;IAEA;IAHlB,YACkB,IAAY,EAC5B,OAAe,EACC,OAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAQ;QAEZ,YAAO,GAAP,OAAO,CAA0B;QAGjD,IAAI,CAAC,IAAI,GAAG,kCAAkC,CAAC;IACjD,CAAC;CACF;AA8CD,MAAM,OAAO,2BAA2B;IACrB,EAAE,CAAoB;IACtB,QAAQ,CAAW;IACnB,SAAS,CAAkB;IAC3B,SAAS,CAA0B;IACnC,GAAG,CAAa;IAEjC,YAAY,IAAuB;QACjC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,GAAG,CAAC,KAAgC;QACxC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEvD,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;YACtF,MAAM,IAAI,gCAAgC,CACxC,sBAAsB,EACtB,QAAQ,KAAK,CAAC,IAAI,8BAA8B,EAChD,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CACrB,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,cAAc,GAAkB,IAAI,CAAC;QACzC,IAAI,kBAAsC,CAAC;QAC3C,IAAI,YAAiC,CAAC;QACtC,IAAI,WAAW,GAAyD,IAAI,CAAC;QAC7E,MAAM,eAAe,GAAqB,EAAE,CAAC;QAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACnC,wEAAwE;YACxE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC;gBACzD,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,SAAS;gBACjD,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,cAAc,EAAE,mBAAmB,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;aAC3F,CAAC,CAAC;YACH,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;YAEjD,mEAAmE;YACnE,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;gBACrF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC;oBACrD,aAAa,EAAE,KAAK,CAAC,YAAY;oBACjC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;oBAC5C,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI;oBAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,SAAS;oBAC9B,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;wBACf,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,mBAAmB,KAAK,CAAC,IAAI,EAAE,CAAC;wBACnD,CAAC,CAAC,CAAC,mBAAmB,KAAK,CAAC,IAAI,EAAE,CAAC;oBACrC,aAAa,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC;oBAC/D,yDAAyD;oBACzD,KAAK,EAAE,KAAK,CAAC,MAAM;iBACpB,CAAC,CAAC;gBACH,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;gBACjC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;gBAChD,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;gBAC7B,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC/C,CAAC;YAED,+DAA+D;YAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACtE,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAClC,UAAU,EAAE,KAAK,CAAC,IAAI;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,OAAO,EAAE,WAAW;gBACpB,WAAW,EAAE,cAAc;gBAC3B,UAAU,EAAE,aAAa;gBACzB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;gBACpC,eAAe,EAAE,KAAK;gBACtB,YAAY,EAAE,IAAI;gBAClB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;aACrC,CAAC,CAAC;YAEH,oEAAoE;YACpE,eAAe,CAAC,IAAI,CAClB,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC;gBACrC,IAAI,EAAE,iCAAiC;gBACvC,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,UAAU,EAAE,KAAK,CAAC,IAAI;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,GAAG,EAAE,CAAC;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,4BAA4B,EAAE,CAAC;gBAChD,MAAM,IAAI,gCAAgC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACjF,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,+BAA+B;QAC/B,KAAK,MAAM,CAAC,IAAI,eAAe;YAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAEpE,oEAAoE;QACpE,mEAAmE;QACnE,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,YAAY,GAAkB,IAAI,CAAC;QACvC,IAAI,cAAc,IAAI,kBAAkB,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;YACjG,IAAI,CAAC;gBACH,4DAA4D;gBAC5D,0DAA0D;gBAC1D,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;gBACtG,eAAe,GAAG,YAAY,KAAK,KAAK,CAAC;gBACzC,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC;YACvE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,eAAe,GAAG,IAAI,CAAC;gBACvB,YAAY,GAAG,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9E,CAAC;QACH,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,WAAY,CAAC,QAAQ;YAC/B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;YAClD,cAAc;YACd,eAAe;YACf,YAAY;YACZ,SAAS,EAAE,WAAW;SACvB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,YAAY,CAAC,KAAgC;QACzD,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,IAAI,gCAAgC,CACxC,qBAAqB,EACrB,mCAAmC,EACnC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CACrB,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,WAAW,GAAyD,IAAI,CAAC;QAC7E,MAAM,eAAe,GAAqB,EAAE,CAAC;QAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACnC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAClC,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,OAAO,EAAE,WAAW;gBACpB,WAAW,EAAE,QAAQ;gBACrB,UAAU,EAAE,QAAQ;gBACpB,UAAU,EAAE,KAAK,CAAC,UAAW;gBAC7B,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;aACrC,CAAC,CAAC;YACH,eAAe,CAAC,IAAI,CAClB,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC;gBACrC,IAAI,EAAE,iCAAiC;gBACvC,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,GAAG,EAAE,CAAC;QACN,KAAK,MAAM,CAAC,IAAI,eAAe;YAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAEpE,OAAO;YACL,QAAQ,EAAE,WAAY,CAAC,QAAQ;YAC/B,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;YAClD,cAAc,EAAE,IAAI;YACpB,eAAe,EAAE,KAAK;YACtB,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,WAAW;SACvB,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACK,KAAK,CAAC,aAAa,CAAC,KAAgC;QAC1D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,gCAAgC,CACxC,mBAAmB,EACnB,kIAAkI,EAClI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CACrB,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,gCAAgC,CACxC,iBAAiB,EACjB,SAAS,KAAK,CAAC,OAAO,YAAY,EAClC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAC3B,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,gCAAgC,CACxC,uBAAuB,EACvB,2FAA2F;gBACzF,SAAS,KAAK,CAAC,OAAO,aAAa,MAAM,CAAC,KAAK,gBAAgB,MAAM,CAAC,SAAS,IAAI,MAAM,IAAI;gBAC7F,kFAAkF,EACpF,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAC7E,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,WAAW,GAAyD,IAAI,CAAC;QAC7E,MAAM,eAAe,GAAqB,EAAE,CAAC;QAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACnC,oEAAoE;YACpE,2DAA2D;YAC3D,sEAAsE;YACtE,qEAAqE;YACrE,sEAAsE;YACtE,+BAA+B;YAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC;gBAC1D,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,KAAK,EAAE,aAAa;gBACpB,cAAc,EAAE,QAAQ;aACzB,CAAC,CAAC;YACH,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YAElD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5D,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAClC,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,OAAO,EAAE,WAAW;gBACpB,WAAW,EAAE,cAAc;gBAC3B,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;gBAC/D,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;aACrC,CAAC,CAAC;YAEH,eAAe,CAAC,IAAI,CAClB,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC;gBACrC,IAAI,EAAE,iCAAiC;gBACvC,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,GAAG,EAAE,CAAC;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,4BAA4B,EAAE,CAAC;gBAChD,MAAM,IAAI,gCAAgC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACjF,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,eAAe;YAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAEpE,oEAAoE;QACpE,mEAAmE;QACnE,oEAAoE;QACpE,UAAU;QACV,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,YAAY,GAAkB,IAAI,CAAC;QACvC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAC7B,KAAK,CAAC,OAAO,EACb,MAAM,CAAC,kBAAkB,EACzB,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,YAAY,EAClB,wBAAwB,KAAK,CAAC,OAAO,KAAK,QAAQ,0EAA0E,CAC7H,CAAC;gBACF,eAAe,GAAG,IAAI,CAAC;gBACvB,YAAY,GAAG,uBAAuB,CAAC;YACzC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,eAAe,GAAG,IAAI,CAAC;gBACvB,YAAY,GAAG,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9E,CAAC;QACH,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,WAAY,CAAC,QAAQ;YAC/B,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;YAClD,cAAc,EAAE,IAAI;YACpB,eAAe;YACf,YAAY;YACZ,SAAS,EAAE,WAAW;SACvB,CAAC;IACJ,CAAC;IAEO,mBAAmB,CAAC,OAAe;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,gCAAgC,CACxC,iBAAiB,EACjB,SAAS,OAAO,YAAY,EAC5B,EAAE,OAAO,EAAE,CACZ,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;YAC7D,MAAM,IAAI,gCAAgC,CACxC,wBAAwB,EACxB,SAAS,OAAO,+BAA+B,MAAM,CAAC,KAAK,iDAAiD,EAC5G,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CACjC,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAUD,SAAS,aAAa,CAAC,KAAgC;IACrD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO;gBACL,KAAK,EAAE,MAAM;gBACb,aAAa,EAAE,cAAc;gBAC7B,aAAa,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;aACpC,CAAC;QACJ,KAAK,MAAM;YACT,OAAO;gBACL,KAAK,EAAE,MAAM;gBACb,aAAa,EAAE,QAAQ;gBACvB,aAAa,EAAE,KAAK,CAAC,MAAM,IAAI,iBAAiB;aACjD,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,KAAK,EAAE,YAAY;gBACnB,aAAa,EAAE,eAAe;gBAC9B,aAAa,EAAE,KAAK,CAAC,kBAAmB;gBACxC,WAAW,EAAE,KAAK,CAAC,kBAAmB;aACvC,CAAC;QACJ,KAAK,MAAM;YACT,OAAO;gBACL,KAAK,EAAE,SAAS;gBAChB,aAAa,EAAE,YAAY;gBAC3B,aAAa,EAAE,KAAK,CAAC,MAAO;gBAC5B,SAAS,EAAE,KAAK,CAAC,MAAO;aACzB,CAAC;QACJ,KAAK,MAAM;YACT,OAAO;gBACL,KAAK,EAAE,MAAM;gBACb,aAAa,EAAE,UAAU;gBACzB,aAAa,EAAE,KAAK,CAAC,MAAO;aAC7B,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO;gBACL,KAAK,EAAE,YAAY;gBACnB,aAAa,EAAE,eAAe;gBAC9B,aAAa,EAAE,KAAK,CAAC,kBAAmB;gBACxC,WAAW,EAAE,KAAK,CAAC,kBAAmB;aACvC,CAAC;QACJ,KAAK,UAAU;YACb,mEAAmE;YACnE,MAAM,IAAI,gCAAgC,CACxC,oBAAoB,EACpB,uDAAuD,CACxD,CAAC;QACJ,KAAK,SAAS;YACZ,kEAAkE;YAClE,gEAAgE;YAChE,qEAAqE;YACrE,MAAM,IAAI,gCAAgC,CACxC,oBAAoB,EACpB,0EAA0E,CAC3E,CAAC;IACN,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,CAAY;IACjC,OAAO;QACL,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;QACxC,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,SAAS,EAAE,CAAC,CAAC,SAAS;KACvB,CAAC;AACJ,CAAC"}
@@ -36,6 +36,18 @@ export declare function deriveNodeLifecycleState(input: {
36
36
  * Single source of truth consumed by CLI, UI, and MCP.
37
37
  */
38
38
  export declare function getNodeInventory(db: Database.Database, rigId: string): NodeInventoryEntry[];
39
+ /**
40
+ * FS-1 W1.2 — the rig-level N+1 collapse. Builds inventory for ALL rigs in a
41
+ * bounded, rig-count-INDEPENDENT set of queries: 3 batched setup reads
42
+ * (snapshots / workspaces / identity verdicts) + 1 all-rigs node SELECT, grouped
43
+ * by rig_id. Every entry is built through the SAME `buildInventoryEntry` that the
44
+ * per-rig `getNodeInventory` uses, so `getNodeInventoryForAllRigs(db).get(rigId)`
45
+ * is byte-identical to `getNodeInventory(db, rigId)` — the collapse changes only
46
+ * HOW the context + rows are fetched (batched vs per-rig), never how an entry is
47
+ * derived. Per-node reads inside `buildInventoryEntry` (`deriveRestoreOutcome`
48
+ * etc.) remain per-node and ride the 047 index — NOT the rig-level N+1 removed here.
49
+ */
50
+ export declare function getNodeInventoryForAllRigs(db: Database.Database): Map<string, NodeInventoryEntry[]>;
39
51
  /**
40
52
  * Get detailed node information including startup files, resources, and events.
41
53
  * The adapter dependency is optional — when provided, uses live listInstalled;
@@ -76,6 +88,12 @@ export declare function attachTerminalActivityAndWork(entries: NodeInventoryEntr
76
88
  db: Database.Database;
77
89
  seatActivity?: SeatActivityService;
78
90
  }): NodeInventoryEntry[];
91
+ /** EXPORTED (OPR.0.4.6.FAC1): the derived canonical coordinate
92
+ * `{pod}-{member}@{rig}` for an inventory entry — the binding layer's
93
+ * ONE string rule (tiebreak key AND recorded destination) reuses
94
+ * exactly this dual-key derivation, never a parallel one. */
95
+ export declare function deriveCanonicalFromEntry(entry: NodeInventoryEntry): string | null;
96
+ export declare function readPendingWorkBySession(db: Database.Database): Map<string, number>;
79
97
  export declare function attachAgentActivity(entries: NodeInventoryEntry[], deps: {
80
98
  tmuxAdapter: TmuxAdapter;
81
99
  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 queryInventoryRows(db, rigId) {
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,152 @@ 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
+ ${rigId ? "WHERE n.rig_id = ?" : ""}
373
+ ORDER BY ${rigId ? "n.created_at" : "n.rig_id, n.created_at"}
374
+ `);
375
+ return (rigId ? stmt.all(rigId) : stmt.all());
376
+ }
377
+ function buildInventoryEntry(db, row, ctx) {
378
+ const { usableSnapshot, workspaceSpec, identityVerdicts, restoreOutcomes, orienteds } = ctx;
379
+ // FS-1 W1.3 S1 O(1) lookup into the once-per-rig restore-outcome map
380
+ // (byte-identical to the prior per-node deriveRestoreOutcome; "n-a" when a node
381
+ // is referenced by no restore event, matching the prior fall-through).
382
+ const restoreOutcome = restoreOutcomes.get(row.node_id) ?? "n-a";
383
+ // OPR.0.4.3.19 rev1-r2 B1 a durable verdict is keyed only by node_id, so
384
+ // after a rebind/relaunch (same node, NEW session + NEW pane) a stale
385
+ // `verified` verdict for the OLD pane would otherwise be served for the new
386
+ // pane until the next 5s reconcile tick, suppressing down-rank and rendering
387
+ // a fresh squat/orphan false-green. Make applicability LOAD-BEARING at read
388
+ // time: a stored verdict applies ONLY when it was computed against the
389
+ // current binding (its sessionName === the latest session AND its
390
+ // registeredPane === the current binding pane). Otherwise treat it as ABSENT
391
+ // (null) — a STALE verdict becomes fail-open (never down-ranks a running
392
+ // seat), it does NOT itself down-rank. Only a MATCHING mismatch/pane_missing
393
+ // verdict down-ranks.
394
+ const identityVerdict = applicableVerdict(identityVerdicts.get(row.node_id) ?? null, row);
395
+ const lifecycleState = deriveNodeLifecycleState({
396
+ sessionStatus: row.session_status,
397
+ restoreOutcome,
398
+ nodeId: row.node_id,
399
+ usableSnapshot,
400
+ identityVerdict: identityVerdict?.verdict ?? null,
410
401
  });
402
+ return {
403
+ rigId: row.rig_id,
404
+ rigName: row.rig_name,
405
+ logicalId: row.logical_id,
406
+ podId: row.pod_id,
407
+ podNamespace: row.pod_namespace,
408
+ // OPR.0.4.6.FAC1: the seat-side role dimension (nodes.role,
409
+ // declared in the pod-member spec) — the workflow binding layer's
410
+ // candidate filter. null = role-less (never role-resolved).
411
+ role: row.role,
412
+ canonicalSessionName: row.session_name,
413
+ attachmentType: row.binding_attachment_type ?? null,
414
+ nodeKind: deriveNodeKind(row.runtime),
415
+ runtime: row.runtime,
416
+ sessionStatus: row.session_status,
417
+ startupStatus: row.startup_status,
418
+ restoreOutcome,
419
+ // FS-1 W1.3 S2 — O(1) lookup into the fleet-batched oriented map
420
+ // (byte-identical to the prior per-node deriveOriented; "n-a" when a node has
421
+ // no proof events, matching deriveOriented's no-challenge branch).
422
+ oriented: orienteds.get(row.node_id) ?? "n-a",
423
+ lifecycleState,
424
+ occupantLifecycle: deriveOccupantLifecycle(row, identityVerdict?.verdict ?? null),
425
+ continuityOutcome: deriveContinuityOutcome(row, restoreOutcome),
426
+ handoverResult: row.handover_result ?? null,
427
+ previousOccupant: row.previous_occupant,
428
+ handoverAt: row.handover_at,
429
+ tmuxAttachCommand: row.binding_attachment_type === "tmux" && row.session_name ? `tmux attach -t ${row.session_name}` : null,
430
+ resumeCommand: computeResumeCommand(row.runtime, row.resume_token, row.codex_config_profile),
431
+ // OPR.0.4.0.26: recoveryGuidance is NOT inlined per node in the LIST
432
+ // payload. It duplicated ~47KB of templated prose across all nodes and
433
+ // no node-list consumer reads it. The full guidance is recomputed on
434
+ // the single-node detail path (getNodeDetail / GET
435
+ // /api/rigs/:rigId/nodes/:logicalId) — relocation, not loss.
436
+ recoveryGuidance: null,
437
+ latestError: row.startup_status === "ready" ? null : getLatestError(db, row.rig_id, row.node_id),
438
+ // Extended fields
439
+ model: row.model,
440
+ agentRef: row.agent_ref,
441
+ profile: row.profile,
442
+ codexConfigProfile: row.codex_config_profile,
443
+ resolvedSpecName: row.resolved_spec_name,
444
+ resolvedSpecVersion: row.resolved_spec_version,
445
+ resolvedSpecHash: row.resolved_spec_hash,
446
+ cwd: row.cwd,
447
+ restorePolicy: row.restore_policy,
448
+ resumeType: row.resume_type,
449
+ resumeToken: row.resume_token,
450
+ startupCompletedAt: row.startup_completed_at,
451
+ // PL-007 Workspace Primitive — per-node workspace summary derived
452
+ // from cwd against the rig's typed workspace block. null when the
453
+ // rig has no workspace declaration.
454
+ workspace: resolveNodeWorkspace({ spec: workspaceSpec, cwd: row.cwd }),
455
+ // OPR.0.4.3.19 — the liveness identity verdict (third axis). null when
456
+ // never observed; carries evidence on mismatch/missing.
457
+ identityVerdict,
458
+ heldReason: deriveHeldReason(db, row.rig_id, row.node_id, row.session_status),
459
+ };
460
+ }
461
+ /** FS-1 W1.2 — all-rigs batched form of `readRigWorkspaceJson`: one query,
462
+ * `rigId → WorkspaceSpec`. Rigs with no/malformed workspace are absent (callers
463
+ * default to null — byte-identical to `readRigWorkspaceJson`'s null return). */
464
+ function readAllRigWorkspaceJson(db) {
465
+ const out = new Map();
466
+ try {
467
+ const rows = db.prepare("SELECT id, workspace_json FROM rigs").all();
468
+ for (const row of rows) {
469
+ if (!row.workspace_json)
470
+ continue;
471
+ try {
472
+ out.set(row.id, JSON.parse(row.workspace_json));
473
+ }
474
+ catch { /* malformed → absent → caller null (matches per-rig) */ }
475
+ }
476
+ }
477
+ catch { /* column/table absent → empty → caller null (matches per-rig defensive path) */ }
478
+ return out;
479
+ }
480
+ /**
481
+ * FS-1 W1.2 — the rig-level N+1 collapse. Builds inventory for ALL rigs in a
482
+ * bounded, rig-count-INDEPENDENT set of queries: 3 batched setup reads
483
+ * (snapshots / workspaces / identity verdicts) + 1 all-rigs node SELECT, grouped
484
+ * by rig_id. Every entry is built through the SAME `buildInventoryEntry` that the
485
+ * per-rig `getNodeInventory` uses, so `getNodeInventoryForAllRigs(db).get(rigId)`
486
+ * is byte-identical to `getNodeInventory(db, rigId)` — the collapse changes only
487
+ * HOW the context + rows are fetched (batched vs per-rig), never how an entry is
488
+ * derived. Per-node reads inside `buildInventoryEntry` (`deriveRestoreOutcome`
489
+ * etc.) remain per-node and ride the 047 index — NOT the rig-level N+1 removed here.
490
+ */
491
+ export function getNodeInventoryForAllRigs(db) {
492
+ const snapshotByRig = findLatestUsableSnapshotsForAllRigs(db);
493
+ const workspaceByRig = readAllRigWorkspaceJson(db);
494
+ const verdictsByRig = new SeatIdentityStore(db).getForAllRigs();
495
+ // FS-1 W1.3 S1/S2 — the per-node reads built ONCE for ALL rigs (O(1) queries,
496
+ // not O(nodes)). Restore map unscoped: a nodeId is referenced only by its own
497
+ // rig's restore events, so each node's value equals the single-rig path.
498
+ const restoreOutcomes = buildRestoreOutcomeMap(db);
499
+ const orienteds = buildOrientedMap(db);
500
+ const rows = queryInventoryRows(db);
501
+ const out = new Map();
502
+ for (const row of rows) {
503
+ const entry = buildInventoryEntry(db, row, {
504
+ usableSnapshot: snapshotByRig.get(row.rig_id) ?? null,
505
+ workspaceSpec: workspaceByRig.get(row.rig_id) ?? null,
506
+ identityVerdicts: verdictsByRig.get(row.rig_id) ?? new Map(),
507
+ restoreOutcomes,
508
+ orienteds,
509
+ });
510
+ let list = out.get(row.rig_id);
511
+ if (!list) {
512
+ list = [];
513
+ out.set(row.rig_id, list);
514
+ }
515
+ list.push(entry);
516
+ }
517
+ return out;
411
518
  }
412
519
  /** PL-007 — read the rig's typed workspace block from `rigs.workspace_json`
413
520
  * defensively. Migration 038 may not yet be applied in older test fixtures
@@ -689,7 +796,11 @@ function countPendingForEntry(entry, pendingByDest) {
689
796
  }
690
797
  return count;
691
798
  }
692
- function deriveCanonicalFromEntry(entry) {
799
+ /** EXPORTED (OPR.0.4.6.FAC1): the derived canonical coordinate
800
+ * `{pod}-{member}@{rig}` for an inventory entry — the binding layer's
801
+ * ONE string rule (tiebreak key AND recorded destination) reuses
802
+ * exactly this dual-key derivation, never a parallel one. */
803
+ export function deriveCanonicalFromEntry(entry) {
693
804
  if (!entry.rigName || !entry.logicalId)
694
805
  return null;
695
806
  const dotIdx = entry.logicalId.indexOf(".");
@@ -699,7 +810,7 @@ function deriveCanonicalFromEntry(entry) {
699
810
  const member = entry.logicalId.slice(dotIdx + 1);
700
811
  return deriveCanonicalSessionName(pod, member, entry.rigName);
701
812
  }
702
- function readPendingWorkBySession(db) {
813
+ export function readPendingWorkBySession(db) {
703
814
  const rows = db.prepare(`
704
815
  SELECT destination_session, COUNT(*) as c
705
816
  FROM queue_items