@openrig/cli 0.4.4 → 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 (431) hide show
  1. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +6 -8
  2. package/daemon/assets/plugins/openrig-core/skills/openrig-cmux/SKILL.md +86 -0
  3. package/daemon/assets/plugins/openrig-core/skills/openrig-herdr/SKILL.md +158 -0
  4. package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +744 -96
  5. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  6. package/daemon/dist/adapters/codex-runtime-adapter.js +12 -8
  7. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  8. package/daemon/dist/adapters/pi-resume.d.ts +32 -0
  9. package/daemon/dist/adapters/pi-resume.d.ts.map +1 -0
  10. package/daemon/dist/adapters/pi-resume.js +125 -0
  11. package/daemon/dist/adapters/pi-resume.js.map +1 -0
  12. package/daemon/dist/adapters/pi-runner-protocol.d.ts +88 -0
  13. package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -0
  14. package/daemon/dist/adapters/pi-runner-protocol.js +153 -0
  15. package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -0
  16. package/daemon/dist/adapters/pi-runner.d.ts +99 -0
  17. package/daemon/dist/adapters/pi-runner.d.ts.map +1 -0
  18. package/daemon/dist/adapters/pi-runner.js +519 -0
  19. package/daemon/dist/adapters/pi-runner.js.map +1 -0
  20. package/daemon/dist/adapters/pi-runtime-adapter.d.ts +61 -0
  21. package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -0
  22. package/daemon/dist/adapters/pi-runtime-adapter.js +356 -0
  23. package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -0
  24. package/daemon/dist/adapters/tmux.d.ts +22 -1
  25. package/daemon/dist/adapters/tmux.d.ts.map +1 -1
  26. package/daemon/dist/adapters/tmux.js +40 -1
  27. package/daemon/dist/adapters/tmux.js.map +1 -1
  28. package/daemon/dist/build-info.js +3 -3
  29. package/daemon/dist/builtins/workflow-specs/branched-remediation.yaml +31 -0
  30. package/daemon/dist/builtins/workflow-specs/factory-rsi.yaml +152 -0
  31. package/daemon/dist/builtins/workflow-specs/gated-release.yaml +26 -0
  32. package/daemon/dist/builtins/workflow-specs/linear-build.yaml +21 -0
  33. package/daemon/dist/db/migrations/049_workflow_instance_version.d.ts +20 -0
  34. package/daemon/dist/db/migrations/049_workflow_instance_version.d.ts.map +1 -0
  35. package/daemon/dist/db/migrations/049_workflow_instance_version.js +24 -0
  36. package/daemon/dist/db/migrations/049_workflow_instance_version.js.map +1 -0
  37. package/daemon/dist/db/migrations/050_workflow_spec_json.d.ts +22 -0
  38. package/daemon/dist/db/migrations/050_workflow_spec_json.d.ts.map +1 -0
  39. package/daemon/dist/db/migrations/050_workflow_spec_json.js +26 -0
  40. package/daemon/dist/db/migrations/050_workflow_spec_json.js.map +1 -0
  41. package/daemon/dist/db/migrations/051_workflow_resume.d.ts +22 -0
  42. package/daemon/dist/db/migrations/051_workflow_resume.d.ts.map +1 -0
  43. package/daemon/dist/db/migrations/051_workflow_resume.js +27 -0
  44. package/daemon/dist/db/migrations/051_workflow_resume.js.map +1 -0
  45. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.d.ts +26 -0
  46. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.d.ts.map +1 -0
  47. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.js +30 -0
  48. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.js.map +1 -0
  49. package/daemon/dist/db/migrations/053_sessions_node_id_index.d.ts +48 -0
  50. package/daemon/dist/db/migrations/053_sessions_node_id_index.d.ts.map +1 -0
  51. package/daemon/dist/db/migrations/053_sessions_node_id_index.js +53 -0
  52. package/daemon/dist/db/migrations/053_sessions_node_id_index.js.map +1 -0
  53. package/daemon/dist/db/migrations/054_queue_transitions_archive.d.ts +34 -0
  54. package/daemon/dist/db/migrations/054_queue_transitions_archive.d.ts.map +1 -0
  55. package/daemon/dist/db/migrations/054_queue_transitions_archive.js +49 -0
  56. package/daemon/dist/db/migrations/054_queue_transitions_archive.js.map +1 -0
  57. package/daemon/dist/domain/claim-service.d.ts +11 -0
  58. package/daemon/dist/domain/claim-service.d.ts.map +1 -1
  59. package/daemon/dist/domain/claim-service.js +3 -1
  60. package/daemon/dist/domain/claim-service.js.map +1 -1
  61. package/daemon/dist/domain/discovery-types.d.ts +1 -1
  62. package/daemon/dist/domain/discovery-types.d.ts.map +1 -1
  63. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +1 -0
  64. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -1
  65. package/daemon/dist/domain/hosts/hosts-registry-reader.js +19 -0
  66. package/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -1
  67. package/daemon/dist/domain/hosts/hosts-registry-writer.d.ts +11 -0
  68. package/daemon/dist/domain/hosts/hosts-registry-writer.d.ts.map +1 -0
  69. package/daemon/dist/domain/hosts/hosts-registry-writer.js +54 -0
  70. package/daemon/dist/domain/hosts/hosts-registry-writer.js.map +1 -0
  71. package/daemon/dist/domain/hosts/read-through.d.ts +28 -0
  72. package/daemon/dist/domain/hosts/read-through.d.ts.map +1 -0
  73. package/daemon/dist/domain/hosts/read-through.js +139 -0
  74. package/daemon/dist/domain/hosts/read-through.js.map +1 -0
  75. package/daemon/dist/domain/hosts/remote-daemon-http.d.ts +21 -0
  76. package/daemon/dist/domain/hosts/remote-daemon-http.d.ts.map +1 -1
  77. package/daemon/dist/domain/hosts/remote-daemon-http.js +49 -0
  78. package/daemon/dist/domain/hosts/remote-daemon-http.js.map +1 -1
  79. package/daemon/dist/domain/node-inventory.d.ts +18 -0
  80. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  81. package/daemon/dist/domain/node-inventory.js +206 -95
  82. package/daemon/dist/domain/node-inventory.js.map +1 -1
  83. package/daemon/dist/domain/node-launcher.d.ts +11 -0
  84. package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
  85. package/daemon/dist/domain/node-launcher.js +10 -0
  86. package/daemon/dist/domain/node-launcher.js.map +1 -1
  87. package/daemon/dist/domain/policies/workflow-keepalive.d.ts +7 -0
  88. package/daemon/dist/domain/policies/workflow-keepalive.d.ts.map +1 -1
  89. package/daemon/dist/domain/policies/workflow-keepalive.js +93 -13
  90. package/daemon/dist/domain/policies/workflow-keepalive.js.map +1 -1
  91. package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
  92. package/daemon/dist/domain/ps-projection.js +37 -26
  93. package/daemon/dist/domain/ps-projection.js.map +1 -1
  94. package/daemon/dist/domain/queue-repository.d.ts +105 -0
  95. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  96. package/daemon/dist/domain/queue-repository.js +193 -4
  97. package/daemon/dist/domain/queue-repository.js.map +1 -1
  98. package/daemon/dist/domain/queue-retention.d.ts +130 -0
  99. package/daemon/dist/domain/queue-retention.d.ts.map +1 -0
  100. package/daemon/dist/domain/queue-retention.js +224 -0
  101. package/daemon/dist/domain/queue-retention.js.map +1 -0
  102. package/daemon/dist/domain/restore-orchestrator.d.ts +5 -0
  103. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  104. package/daemon/dist/domain/restore-orchestrator.js +29 -2
  105. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  106. package/daemon/dist/domain/resume-token-capture.d.ts +13 -0
  107. package/daemon/dist/domain/resume-token-capture.d.ts.map +1 -1
  108. package/daemon/dist/domain/resume-token-capture.js +14 -1
  109. package/daemon/dist/domain/resume-token-capture.js.map +1 -1
  110. package/daemon/dist/domain/resume-token-validation.d.ts +1 -1
  111. package/daemon/dist/domain/resume-token-validation.d.ts.map +1 -1
  112. package/daemon/dist/domain/resume-token-validation.js +58 -10
  113. package/daemon/dist/domain/resume-token-validation.js.map +1 -1
  114. package/daemon/dist/domain/review/compose.d.ts +50 -1
  115. package/daemon/dist/domain/review/compose.d.ts.map +1 -1
  116. package/daemon/dist/domain/review/compose.js +92 -3
  117. package/daemon/dist/domain/review/compose.js.map +1 -1
  118. package/daemon/dist/domain/review/fleet-compose.d.ts +52 -0
  119. package/daemon/dist/domain/review/fleet-compose.d.ts.map +1 -0
  120. package/daemon/dist/domain/review/fleet-compose.js +294 -0
  121. package/daemon/dist/domain/review/fleet-compose.js.map +1 -0
  122. package/daemon/dist/domain/review/gather.d.ts +16 -1
  123. package/daemon/dist/domain/review/gather.d.ts.map +1 -1
  124. package/daemon/dist/domain/review/gather.js +177 -41
  125. package/daemon/dist/domain/review/gather.js.map +1 -1
  126. package/daemon/dist/domain/review/types.d.ts +104 -1
  127. package/daemon/dist/domain/review/types.d.ts.map +1 -1
  128. package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
  129. package/daemon/dist/domain/rig-expansion-service.js +3 -0
  130. package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
  131. package/daemon/dist/domain/rig-repository.d.ts +7 -6
  132. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  133. package/daemon/dist/domain/rig-repository.js +33 -11
  134. package/daemon/dist/domain/rig-repository.js.map +1 -1
  135. package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
  136. package/daemon/dist/domain/rigspec-codec.js +3 -0
  137. package/daemon/dist/domain/rigspec-codec.js.map +1 -1
  138. package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
  139. package/daemon/dist/domain/rigspec-exporter.js +4 -0
  140. package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
  141. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  142. package/daemon/dist/domain/rigspec-instantiator.js +11 -0
  143. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  144. package/daemon/dist/domain/rigspec-preflight.d.ts +6 -0
  145. package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
  146. package/daemon/dist/domain/rigspec-preflight.js +26 -1
  147. package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
  148. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  149. package/daemon/dist/domain/rigspec-schema.js +20 -1
  150. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  151. package/daemon/dist/domain/runtime-verifier.d.ts +7 -1
  152. package/daemon/dist/domain/runtime-verifier.d.ts.map +1 -1
  153. package/daemon/dist/domain/runtime-verifier.js +39 -1
  154. package/daemon/dist/domain/runtime-verifier.js.map +1 -1
  155. package/daemon/dist/domain/seat-handover-service.d.ts +9 -0
  156. package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
  157. package/daemon/dist/domain/seat-handover-service.js +2 -0
  158. package/daemon/dist/domain/seat-handover-service.js.map +1 -1
  159. package/daemon/dist/domain/seat-identity-store.d.ts +7 -0
  160. package/daemon/dist/domain/seat-identity-store.d.ts.map +1 -1
  161. package/daemon/dist/domain/seat-identity-store.js +27 -0
  162. package/daemon/dist/domain/seat-identity-store.js.map +1 -1
  163. package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
  164. package/daemon/dist/domain/seat-status-service.js +6 -4
  165. package/daemon/dist/domain/seat-status-service.js.map +1 -1
  166. package/daemon/dist/domain/session-name.d.ts +22 -0
  167. package/daemon/dist/domain/session-name.d.ts.map +1 -1
  168. package/daemon/dist/domain/session-name.js +29 -0
  169. package/daemon/dist/domain/session-name.js.map +1 -1
  170. package/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -1
  171. package/daemon/dist/domain/slices/slice-detail-projector.js +4 -5
  172. package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
  173. package/daemon/dist/domain/spec-library-workflow-scanner.d.ts +18 -2
  174. package/daemon/dist/domain/spec-library-workflow-scanner.d.ts.map +1 -1
  175. package/daemon/dist/domain/spec-library-workflow-scanner.js +23 -1
  176. package/daemon/dist/domain/spec-library-workflow-scanner.js.map +1 -1
  177. package/daemon/dist/domain/startup-proof.d.ts +10 -6
  178. package/daemon/dist/domain/startup-proof.d.ts.map +1 -1
  179. package/daemon/dist/domain/startup-proof.js +35 -7
  180. package/daemon/dist/domain/startup-proof.js.map +1 -1
  181. package/daemon/dist/domain/successor-session-launcher.d.ts +16 -0
  182. package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
  183. package/daemon/dist/domain/successor-session-launcher.js +13 -0
  184. package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  185. package/daemon/dist/domain/terminal/cmux-provider-adapter.d.ts +27 -0
  186. package/daemon/dist/domain/terminal/cmux-provider-adapter.d.ts.map +1 -0
  187. package/daemon/dist/domain/terminal/cmux-provider-adapter.js +67 -0
  188. package/daemon/dist/domain/terminal/cmux-provider-adapter.js.map +1 -0
  189. package/daemon/dist/domain/terminal/herdr-adapter.d.ts +77 -0
  190. package/daemon/dist/domain/terminal/herdr-adapter.d.ts.map +1 -0
  191. package/daemon/dist/domain/terminal/herdr-adapter.js +266 -0
  192. package/daemon/dist/domain/terminal/herdr-adapter.js.map +1 -0
  193. package/daemon/dist/domain/terminal/herdr-transport.d.ts +50 -0
  194. package/daemon/dist/domain/terminal/herdr-transport.d.ts.map +1 -0
  195. package/daemon/dist/domain/terminal/herdr-transport.js +145 -0
  196. package/daemon/dist/domain/terminal/herdr-transport.js.map +1 -0
  197. package/daemon/dist/domain/terminal/terminal-provider.d.ts +88 -0
  198. package/daemon/dist/domain/terminal/terminal-provider.d.ts.map +1 -0
  199. package/daemon/dist/domain/terminal/terminal-provider.js +17 -0
  200. package/daemon/dist/domain/terminal/terminal-provider.js.map +1 -0
  201. package/daemon/dist/domain/terminal/terminal-service.d.ts +60 -0
  202. package/daemon/dist/domain/terminal/terminal-service.d.ts.map +1 -0
  203. package/daemon/dist/domain/terminal/terminal-service.js +174 -0
  204. package/daemon/dist/domain/terminal/terminal-service.js.map +1 -0
  205. package/daemon/dist/domain/terminal/terminal-views-store.d.ts +77 -0
  206. package/daemon/dist/domain/terminal/terminal-views-store.d.ts.map +1 -0
  207. package/daemon/dist/domain/terminal/terminal-views-store.js +146 -0
  208. package/daemon/dist/domain/terminal/terminal-views-store.js.map +1 -0
  209. package/daemon/dist/domain/terminal/view-composer.d.ts +42 -0
  210. package/daemon/dist/domain/terminal/view-composer.d.ts.map +1 -0
  211. package/daemon/dist/domain/terminal/view-composer.js +137 -0
  212. package/daemon/dist/domain/terminal/view-composer.js.map +1 -0
  213. package/daemon/dist/domain/tmux-option-defaults.d.ts +89 -0
  214. package/daemon/dist/domain/tmux-option-defaults.d.ts.map +1 -0
  215. package/daemon/dist/domain/tmux-option-defaults.js +132 -0
  216. package/daemon/dist/domain/tmux-option-defaults.js.map +1 -0
  217. package/daemon/dist/domain/types.d.ts +34 -1
  218. package/daemon/dist/domain/types.d.ts.map +1 -1
  219. package/daemon/dist/domain/types.js.map +1 -1
  220. package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  221. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  222. package/daemon/dist/domain/user-settings/settings-store.js +92 -0
  223. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  224. package/daemon/dist/domain/workflow/slice-workflow-projection.d.ts.map +1 -1
  225. package/daemon/dist/domain/workflow/slice-workflow-projection.js +6 -2
  226. package/daemon/dist/domain/workflow/slice-workflow-projection.js.map +1 -1
  227. package/daemon/dist/domain/workflow-boot-sweep.d.ts +28 -0
  228. package/daemon/dist/domain/workflow-boot-sweep.d.ts.map +1 -0
  229. package/daemon/dist/domain/workflow-boot-sweep.js +102 -0
  230. package/daemon/dist/domain/workflow-boot-sweep.js.map +1 -0
  231. package/daemon/dist/domain/workflow-deadline.d.ts +74 -0
  232. package/daemon/dist/domain/workflow-deadline.d.ts.map +1 -0
  233. package/daemon/dist/domain/workflow-deadline.js +165 -0
  234. package/daemon/dist/domain/workflow-deadline.js.map +1 -0
  235. package/daemon/dist/domain/workflow-exception-escalation.d.ts +33 -0
  236. package/daemon/dist/domain/workflow-exception-escalation.d.ts.map +1 -0
  237. package/daemon/dist/domain/workflow-exception-escalation.js +104 -0
  238. package/daemon/dist/domain/workflow-exception-escalation.js.map +1 -0
  239. package/daemon/dist/domain/workflow-exception-router.d.ts +33 -0
  240. package/daemon/dist/domain/workflow-exception-router.d.ts.map +1 -0
  241. package/daemon/dist/domain/workflow-exception-router.js +96 -0
  242. package/daemon/dist/domain/workflow-exception-router.js.map +1 -0
  243. package/daemon/dist/domain/workflow-exception.d.ts +90 -0
  244. package/daemon/dist/domain/workflow-exception.d.ts.map +1 -0
  245. package/daemon/dist/domain/workflow-exception.js +122 -0
  246. package/daemon/dist/domain/workflow-exception.js.map +1 -0
  247. package/daemon/dist/domain/workflow-frontier-guard.d.ts +24 -0
  248. package/daemon/dist/domain/workflow-frontier-guard.d.ts.map +1 -0
  249. package/daemon/dist/domain/workflow-frontier-guard.js +30 -0
  250. package/daemon/dist/domain/workflow-frontier-guard.js.map +1 -0
  251. package/daemon/dist/domain/workflow-instance-store.d.ts +28 -0
  252. package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -1
  253. package/daemon/dist/domain/workflow-instance-store.js +66 -10
  254. package/daemon/dist/domain/workflow-instance-store.js.map +1 -1
  255. package/daemon/dist/domain/workflow-keepalive-arming.d.ts +35 -0
  256. package/daemon/dist/domain/workflow-keepalive-arming.d.ts.map +1 -0
  257. package/daemon/dist/domain/workflow-keepalive-arming.js +87 -0
  258. package/daemon/dist/domain/workflow-keepalive-arming.js.map +1 -0
  259. package/daemon/dist/domain/workflow-projector.d.ts +117 -2
  260. package/daemon/dist/domain/workflow-projector.d.ts.map +1 -1
  261. package/daemon/dist/domain/workflow-projector.js +672 -41
  262. package/daemon/dist/domain/workflow-projector.js.map +1 -1
  263. package/daemon/dist/domain/workflow-role-context.d.ts +57 -0
  264. package/daemon/dist/domain/workflow-role-context.d.ts.map +1 -0
  265. package/daemon/dist/domain/workflow-role-context.js +120 -0
  266. package/daemon/dist/domain/workflow-role-context.js.map +1 -0
  267. package/daemon/dist/domain/workflow-role-resolver.d.ts +65 -0
  268. package/daemon/dist/domain/workflow-role-resolver.d.ts.map +1 -0
  269. package/daemon/dist/domain/workflow-role-resolver.js +108 -0
  270. package/daemon/dist/domain/workflow-role-resolver.js.map +1 -0
  271. package/daemon/dist/domain/workflow-runtime.d.ts +157 -1
  272. package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
  273. package/daemon/dist/domain/workflow-runtime.js +718 -11
  274. package/daemon/dist/domain/workflow-runtime.js.map +1 -1
  275. package/daemon/dist/domain/workflow-spec-cache.d.ts +26 -1
  276. package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
  277. package/daemon/dist/domain/workflow-spec-cache.js +327 -13
  278. package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
  279. package/daemon/dist/domain/workflow-types.d.ts +143 -8
  280. package/daemon/dist/domain/workflow-types.d.ts.map +1 -1
  281. package/daemon/dist/domain/workflow-types.js +14 -1
  282. package/daemon/dist/domain/workflow-types.js.map +1 -1
  283. package/daemon/dist/domain/workflow-validator.d.ts +11 -1
  284. package/daemon/dist/domain/workflow-validator.d.ts.map +1 -1
  285. package/daemon/dist/domain/workflow-validator.js +246 -1
  286. package/daemon/dist/domain/workflow-validator.js.map +1 -1
  287. package/daemon/dist/index.d.ts +17 -0
  288. package/daemon/dist/index.d.ts.map +1 -1
  289. package/daemon/dist/index.js +44 -0
  290. package/daemon/dist/index.js.map +1 -1
  291. package/daemon/dist/routes/activity.js +22 -0
  292. package/daemon/dist/routes/activity.js.map +1 -1
  293. package/daemon/dist/routes/hosts.d.ts +5 -0
  294. package/daemon/dist/routes/hosts.d.ts.map +1 -0
  295. package/daemon/dist/routes/hosts.js +346 -0
  296. package/daemon/dist/routes/hosts.js.map +1 -0
  297. package/daemon/dist/routes/queue.d.ts +2 -7
  298. package/daemon/dist/routes/queue.d.ts.map +1 -1
  299. package/daemon/dist/routes/queue.js +264 -9
  300. package/daemon/dist/routes/queue.js.map +1 -1
  301. package/daemon/dist/routes/review.d.ts.map +1 -1
  302. package/daemon/dist/routes/review.js +26 -0
  303. package/daemon/dist/routes/review.js.map +1 -1
  304. package/daemon/dist/routes/seat.js +13 -0
  305. package/daemon/dist/routes/seat.js.map +1 -1
  306. package/daemon/dist/routes/terminal.d.ts +11 -0
  307. package/daemon/dist/routes/terminal.d.ts.map +1 -0
  308. package/daemon/dist/routes/terminal.js +104 -0
  309. package/daemon/dist/routes/terminal.js.map +1 -0
  310. package/daemon/dist/routes/workflow.d.ts.map +1 -1
  311. package/daemon/dist/routes/workflow.js +102 -10
  312. package/daemon/dist/routes/workflow.js.map +1 -1
  313. package/daemon/dist/server.d.ts +5 -0
  314. package/daemon/dist/server.d.ts.map +1 -1
  315. package/daemon/dist/server.js +22 -0
  316. package/daemon/dist/server.js.map +1 -1
  317. package/daemon/dist/startup.d.ts.map +1 -1
  318. package/daemon/dist/startup.js +221 -12
  319. package/daemon/dist/startup.js.map +1 -1
  320. package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +29 -0
  321. package/daemon/specs/agents/factory-rsi/dogfood/guidance/role.md +37 -0
  322. package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +29 -0
  323. package/daemon/specs/agents/factory-rsi/release-manager/guidance/role.md +40 -0
  324. package/daemon/specs/agents/shared/skills/core/mission-slice-sop/SKILL.md +6 -8
  325. package/daemon/specs/agents/shared/skills/core/openrig-cmux/SKILL.md +86 -0
  326. package/daemon/specs/agents/shared/skills/core/openrig-herdr/SKILL.md +158 -0
  327. package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +6 -6
  328. package/daemon/specs/rigs/launch/factory-rsi/CULTURE.md +47 -0
  329. package/daemon/specs/rigs/launch/factory-rsi/rig.yaml +115 -0
  330. package/dist/build-info.js +3 -3
  331. package/dist/commands/broadcast.d.ts +6 -1
  332. package/dist/commands/broadcast.d.ts.map +1 -1
  333. package/dist/commands/broadcast.js +101 -15
  334. package/dist/commands/broadcast.js.map +1 -1
  335. package/dist/commands/capture.d.ts.map +1 -1
  336. package/dist/commands/capture.js +99 -8
  337. package/dist/commands/capture.js.map +1 -1
  338. package/dist/commands/config.d.ts.map +1 -1
  339. package/dist/commands/config.js +4 -0
  340. package/dist/commands/config.js.map +1 -1
  341. package/dist/commands/down.d.ts.map +1 -1
  342. package/dist/commands/down.js +5 -0
  343. package/dist/commands/down.js.map +1 -1
  344. package/dist/commands/host.d.ts +14 -0
  345. package/dist/commands/host.d.ts.map +1 -1
  346. package/dist/commands/host.js +338 -14
  347. package/dist/commands/host.js.map +1 -1
  348. package/dist/commands/launch.d.ts.map +1 -1
  349. package/dist/commands/launch.js +5 -0
  350. package/dist/commands/launch.js.map +1 -1
  351. package/dist/commands/ps.d.ts.map +1 -1
  352. package/dist/commands/ps.js +10 -4
  353. package/dist/commands/ps.js.map +1 -1
  354. package/dist/commands/queue.d.ts +36 -0
  355. package/dist/commands/queue.d.ts.map +1 -1
  356. package/dist/commands/queue.js +73 -7
  357. package/dist/commands/queue.js.map +1 -1
  358. package/dist/commands/restore-packet.d.ts.map +1 -1
  359. package/dist/commands/restore-packet.js +13 -2
  360. package/dist/commands/restore-packet.js.map +1 -1
  361. package/dist/commands/send.d.ts.map +1 -1
  362. package/dist/commands/send.js +114 -9
  363. package/dist/commands/send.js.map +1 -1
  364. package/dist/commands/terminal.d.ts +6 -0
  365. package/dist/commands/terminal.d.ts.map +1 -0
  366. package/dist/commands/terminal.js +116 -0
  367. package/dist/commands/terminal.js.map +1 -0
  368. package/dist/commands/transcript.d.ts +6 -1
  369. package/dist/commands/transcript.d.ts.map +1 -1
  370. package/dist/commands/transcript.js +113 -30
  371. package/dist/commands/transcript.js.map +1 -1
  372. package/dist/commands/up.d.ts.map +1 -1
  373. package/dist/commands/up.js +9 -0
  374. package/dist/commands/up.js.map +1 -1
  375. package/dist/commands/whoami.d.ts.map +1 -1
  376. package/dist/commands/whoami.js +11 -0
  377. package/dist/commands/whoami.js.map +1 -1
  378. package/dist/commands/workflow-errors.d.ts +23 -0
  379. package/dist/commands/workflow-errors.d.ts.map +1 -0
  380. package/dist/commands/workflow-errors.js +100 -0
  381. package/dist/commands/workflow-errors.js.map +1 -0
  382. package/dist/commands/workflow-follow.d.ts +71 -0
  383. package/dist/commands/workflow-follow.d.ts.map +1 -0
  384. package/dist/commands/workflow-follow.js +259 -0
  385. package/dist/commands/workflow-follow.js.map +1 -0
  386. package/dist/commands/workflow-render.d.ts +114 -0
  387. package/dist/commands/workflow-render.d.ts.map +1 -0
  388. package/dist/commands/workflow-render.js +223 -0
  389. package/dist/commands/workflow-render.js.map +1 -0
  390. package/dist/commands/workflow.d.ts +1 -0
  391. package/dist/commands/workflow.d.ts.map +1 -1
  392. package/dist/commands/workflow.js +278 -14
  393. package/dist/commands/workflow.js.map +1 -1
  394. package/dist/config-store.d.ts +15 -1
  395. package/dist/config-store.d.ts.map +1 -1
  396. package/dist/config-store.js +103 -0
  397. package/dist/config-store.js.map +1 -1
  398. package/dist/cross-host-cli-helpers.d.ts +13 -0
  399. package/dist/cross-host-cli-helpers.d.ts.map +1 -1
  400. package/dist/cross-host-cli-helpers.js +27 -0
  401. package/dist/cross-host-cli-helpers.js.map +1 -1
  402. package/dist/cross-host-target.d.ts +49 -0
  403. package/dist/cross-host-target.d.ts.map +1 -0
  404. package/dist/cross-host-target.js +35 -0
  405. package/dist/cross-host-target.js.map +1 -0
  406. package/dist/host-registry.d.ts +8 -0
  407. package/dist/host-registry.d.ts.map +1 -1
  408. package/dist/host-registry.js +32 -0
  409. package/dist/host-registry.js.map +1 -1
  410. package/dist/host-selection.d.ts +13 -0
  411. package/dist/host-selection.d.ts.map +1 -0
  412. package/dist/host-selection.js +54 -0
  413. package/dist/host-selection.js.map +1 -0
  414. package/dist/index.d.ts +2 -0
  415. package/dist/index.d.ts.map +1 -1
  416. package/dist/index.js +2 -0
  417. package/dist/index.js.map +1 -1
  418. package/dist/remote-host-ops.d.ts +1 -0
  419. package/dist/remote-host-ops.d.ts.map +1 -1
  420. package/dist/remote-host-ops.js +11 -4
  421. package/dist/remote-host-ops.js.map +1 -1
  422. package/dist/session-name.d.ts +23 -0
  423. package/dist/session-name.d.ts.map +1 -0
  424. package/dist/session-name.js +61 -0
  425. package/dist/session-name.js.map +1 -0
  426. package/package.json +1 -1
  427. package/ui/dist/assets/index-CFqxa0zW.css +32 -0
  428. package/ui/dist/assets/index-zrFqS7gL.js +623 -0
  429. package/ui/dist/index.html +2 -2
  430. package/ui/dist/assets/index-D69ZhNIr.js +0 -598
  431. package/ui/dist/assets/index-DJYun-8d.css +0 -32
@@ -0,0 +1,294 @@
1
+ // OPR.0.4.6.MH5 — the daemon-side FLEET composer (the ONE net-new core).
2
+ //
3
+ // Arch Q1 (ruled): each host's OWN composer is authoritative for its own
4
+ // time-derived ▲/● set — this module fans out each registered host's
5
+ // ALREADY-COMPOSED rig root (`GET /api/review/rig`, the parameterless
6
+ // host-wide altitude root) and only UNIONS + HOST-DIMENSIONS + COUNTS.
7
+ // It never recomputes exception truth (no clock, no thresholds, no random
8
+ // here — cross-host clock skew can never distort a ▲).
9
+ //
10
+ // Arch Q2/Q3 (ruled): FLEET is a SIBLING aggregate — the local composer
11
+ // files stay pure; THIS module is the ONLY review-domain place that
12
+ // imports hosts/transport (the C1 boundary, pinned mechanical by the C5
13
+ // import-audit test). One daemon-side composer; every consumer (UI now,
14
+ // TUI/CLI follow-ups) reads the same one.
15
+ //
16
+ // Arch Q4 (ruled): the one-count Set on `${hostId}|${identity}` lives HERE
17
+ // — the one place. Within-host N-altitude duplicates collapse to one fleet
18
+ // row (seenFrom records the altitudes actually read); two hosts' same-shaped
19
+ // identities stay two rows. An MH-3-forwarded qitem lives in its ORIGIN
20
+ // host's DB only (source closed on handoff), so no fleet double-count by
21
+ // construction.
22
+ //
23
+ // D-7: per-host reads run concurrently under the named read-class deadline
24
+ // (the attention-aggregator discipline) — a slow host degrades to its honest
25
+ // per-host status; the glance NEVER stalls on the slowest host. The LOCAL
26
+ // host joins via the in-process composer directly (D-1 — one fleet member
27
+ // with zero self-transport).
28
+ import { LOCAL_HOST_ID } from "../hosts/fanout-contract.js";
29
+ import { resolveHost } from "../hosts/hosts-registry-reader.js";
30
+ import { remoteJsonRequest } from "../hosts/remote-daemon-http.js";
31
+ /** The fleet aggregation READ deadline class (per-host bound) — same class
32
+ * as the shipped feed aggregation (a poll, not a bootstrap). Named here,
33
+ * passed explicitly at the call-site (D-7). */
34
+ export const FLEET_READ_TIMEOUT_MS = 5_000;
35
+ /** Fixed fan-out cap — a poll across a handful of hosts (the shipped
36
+ * aggregator's v1 posture; adaptive throttling out of scope). */
37
+ export const FLEET_FANOUT_CONCURRENCY = 4;
38
+ const PRIORITY_RANK = { urgent: 0, high: 1, normal: 2, low: 3 };
39
+ /** Total order over deduped fleet rows: priority rank, then age, then the
40
+ * fleet key — a TOTAL tiebreak, so permuting the inputs can never change
41
+ * the output order (the C5 permutation-stability vector). */
42
+ function compareFleetRows(a, b) {
43
+ const ra = PRIORITY_RANK[a.priority ?? "normal"] ?? 2;
44
+ const rb = PRIORITY_RANK[b.priority ?? "normal"] ?? 2;
45
+ if (ra !== rb)
46
+ return ra - rb;
47
+ const aa = a.ageIso ?? "9999";
48
+ const ba = b.ageIso ?? "9999";
49
+ if (aa !== ba)
50
+ return aa < ba ? -1 : 1;
51
+ return a.fleetKey < b.fleetKey ? -1 : a.fleetKey > b.fleetKey ? 1 : 0;
52
+ }
53
+ /** The BR-1 session grammar is member@rig (the @host form never exists in
54
+ * session strings) — distinct rig names across a host's agent rows is a
55
+ * structured parse of that grammar, never prose. */
56
+ function distinctRigCount(agents) {
57
+ const rigs = new Set();
58
+ for (const a of agents) {
59
+ const at = a.sessionName.lastIndexOf("@");
60
+ if (at > 0 && at < a.sessionName.length - 1)
61
+ rigs.add(a.sessionName.slice(at + 1));
62
+ }
63
+ return rigs.size;
64
+ }
65
+ /** The worst line for a host — spoken-aloud, derived deterministically from
66
+ * its own deduped rows (already in total order; row 0 is the worst). */
67
+ function hostTopLine(rows) {
68
+ if (rows.length === 0)
69
+ return "quiet";
70
+ const worst = rows[0];
71
+ return worst.derived ? `▲ ${worst.derived.kind} — ${worst.summary}` : `● ${worst.summary}`;
72
+ }
73
+ /** Union + host-dimension + count (the ONLY things the fleet root does).
74
+ * `statuses` must carry EVERY fleet member (omission-proof); `inputs`
75
+ * carries only the members whose composed set was actually read. */
76
+ export function unionFleet(inputs, statuses, composedAt, registryError) {
77
+ // The Q4 one-count Set — the one place. Key = `${hostId}|${identity}`.
78
+ const seen = new Map();
79
+ const perHostRows = new Map();
80
+ for (const host of inputs) {
81
+ for (const scoped of host.scopedNeedsYou) {
82
+ for (const item of scoped.items) {
83
+ const fleetKey = `${host.hostId}|${item.identity}`;
84
+ const existing = seen.get(fleetKey);
85
+ if (existing) {
86
+ if (!existing.seenFrom.includes(scoped.scope))
87
+ existing.seenFrom.push(scoped.scope);
88
+ continue;
89
+ }
90
+ const row = { ...item, hostId: host.hostId, fleetKey, seenFrom: [scoped.scope] };
91
+ seen.set(fleetKey, row);
92
+ if (!perHostRows.has(host.hostId))
93
+ perHostRows.set(host.hostId, []);
94
+ perHostRows.get(host.hostId).push(row);
95
+ }
96
+ }
97
+ }
98
+ const rows = [...seen.values()].sort(compareFleetRows);
99
+ for (const hostRows of perHostRows.values())
100
+ hostRows.sort(compareFleetRows);
101
+ // Rollup math computed FROM the deduped rows (header-math-checkable).
102
+ const byKind = new Map();
103
+ let needsYouCount = 0;
104
+ let exceptionCount = 0;
105
+ for (const r of rows) {
106
+ if (r.derived) {
107
+ exceptionCount += 1;
108
+ byKind.set(r.derived.kind, (byKind.get(r.derived.kind) ?? 0) + 1);
109
+ }
110
+ else {
111
+ needsYouCount += 1;
112
+ }
113
+ }
114
+ const rollup = {
115
+ needsYouCount,
116
+ exceptionCount,
117
+ exceptionsByKind: [...byKind.entries()].sort(([a], [b]) => (a < b ? -1 : 1)).map(([kind, count]) => ({ kind, count })),
118
+ hostCount: statuses.length,
119
+ unreachableCount: statuses.filter((s) => s.status !== "ok").length,
120
+ };
121
+ // HOSTS band rows: statuses order (local first, then registry order);
122
+ // counts present ONLY on read members (absent-not-zero on failures).
123
+ const inputByHost = new Map(inputs.map((h) => [h.hostId, h]));
124
+ const hosts = statuses.map((status) => {
125
+ const input = inputByHost.get(status.hostId);
126
+ const base = {
127
+ hostId: status.hostId,
128
+ kind: status.hostId === LOCAL_HOST_ID ? "local" : "remote",
129
+ status,
130
+ };
131
+ if (!input || status.status !== "ok")
132
+ return base;
133
+ const hostRows = perHostRows.get(status.hostId) ?? [];
134
+ const hostKinds = new Map();
135
+ let hostNeedsYou = 0;
136
+ for (const r of hostRows) {
137
+ if (r.derived)
138
+ hostKinds.set(r.derived.kind, (hostKinds.get(r.derived.kind) ?? 0) + 1);
139
+ else
140
+ hostNeedsYou += 1;
141
+ }
142
+ return {
143
+ ...base,
144
+ needsYouCount: hostNeedsYou,
145
+ exceptionsByKind: [...hostKinds.entries()].sort(([a], [b]) => (a < b ? -1 : 1)).map(([kind, count]) => ({ kind, count })),
146
+ seatCount: input.agents.length,
147
+ rigCount: distinctRigCount(input.agents),
148
+ topLine: hostTopLine(hostRows),
149
+ };
150
+ });
151
+ // SETTLED minimal (D-5), host-chipped, deterministic order (closed-at
152
+ // desc, then qitem id — a total tiebreak).
153
+ const settled = inputs
154
+ .flatMap((h) => h.settled.map((s) => ({ ...s, hostId: h.hostId })))
155
+ .sort((a, b) => (a.closedAtIso !== b.closedAtIso ? (a.closedAtIso > b.closedAtIso ? -1 : 1) : a.qitemId < b.qitemId ? -1 : 1));
156
+ const composingCount = statuses.filter((s) => s.status === "ok").length;
157
+ return {
158
+ rollup,
159
+ needsYou: {
160
+ items: rows,
161
+ provenance: `fleet union of each host's own composed set · counted once per identity+host · ${composingCount}/${statuses.length} hosts composing${rollup.unreachableCount > 0 ? " (a failed host's items are ABSENT, not zero)" : ""}`,
162
+ },
163
+ hosts,
164
+ settled,
165
+ settledProvenance: settled.length === 0 ? `0 settled handoffs across ${composingCount} composing hosts` : `today's closed handoffs across ${composingCount} composing hosts`,
166
+ ...(registryError !== undefined ? { registryError } : {}),
167
+ composedAt,
168
+ };
169
+ }
170
+ /** Minimal structural check on a remote's composed payload — a 200 carrying
171
+ * the wrong shape degrades to the honest per-host status, never a crash
172
+ * and never silently-empty "ok" data. */
173
+ function parseComposedRig(payload) {
174
+ if (payload === null || typeof payload !== "object")
175
+ return null;
176
+ const p = payload;
177
+ const needsYou = p["needsYou"];
178
+ const agents = p["agents"];
179
+ if (!needsYou || !Array.isArray(needsYou["items"]))
180
+ return null;
181
+ if (!agents || !Array.isArray(agents["rows"]))
182
+ return null;
183
+ if (!Array.isArray(p["settled"]))
184
+ return null;
185
+ return payload;
186
+ }
187
+ async function readHostComposedRig(hostId, reg, deps) {
188
+ if (!reg.ok) {
189
+ return { status: { hostId, status: "unreachable", error: reg.error }, input: null };
190
+ }
191
+ const resolved = resolveHost(reg.registry, hostId);
192
+ if (!resolved.ok) {
193
+ return { status: { hostId, status: "unreachable", error: resolved.error }, input: null };
194
+ }
195
+ if (resolved.host.transport !== "http") {
196
+ return {
197
+ status: { hostId, status: "unsupported-transport", error: `host '${hostId}' is SSH-declared; the fleet composed read requires an http-transport registry entry (url + bearer)` },
198
+ input: null,
199
+ };
200
+ }
201
+ const res = await remoteJsonRequest(resolved.host, "/api/review/rig", {
202
+ method: "GET",
203
+ timeoutMs: deps.timeoutMs ?? FLEET_READ_TIMEOUT_MS,
204
+ fetchImpl: deps.fetchImpl,
205
+ env: deps.env,
206
+ readFile: deps.readFile,
207
+ });
208
+ if (res.ok) {
209
+ const composed = parseComposedRig(res.payload);
210
+ if (!composed) {
211
+ return { status: { hostId, status: "unreachable", error: "remote /api/review/rig returned a malformed composed payload", failedStep: "remote-command-failed" }, input: null };
212
+ }
213
+ return {
214
+ status: { hostId, status: "ok" },
215
+ input: {
216
+ hostId,
217
+ kind: "remote",
218
+ scopedNeedsYou: [{ scope: "rig", items: composed.needsYou.items }],
219
+ agents: composed.agents.rows,
220
+ settled: composed.settled,
221
+ },
222
+ };
223
+ }
224
+ switch (res.kind) {
225
+ case "bearer":
226
+ return { status: { hostId, status: "auth-failed", error: res.detail, failedStep: "permission-gate" }, input: null };
227
+ case "http":
228
+ if (res.status === 401 || res.status === 403) {
229
+ return { status: { hostId, status: "auth-failed", error: `HTTP ${res.status}${res.detail ? `: ${res.detail}` : ""}`, failedStep: "permission-gate" }, input: null };
230
+ }
231
+ return { status: { hostId, status: "unreachable", error: `HTTP ${res.status}${res.detail ? `: ${res.detail}` : ""}`, failedStep: "remote-command-failed" }, input: null };
232
+ case "timeout":
233
+ return {
234
+ status: {
235
+ hostId,
236
+ status: "unreachable",
237
+ error: res.phase === "body" ? `read timed out: response headers arrived (HTTP ${res.status}) but the body never completed` : `read timed out after ${deps.timeoutMs ?? FLEET_READ_TIMEOUT_MS}ms`,
238
+ failedStep: "remote-daemon-unreachable",
239
+ },
240
+ input: null,
241
+ };
242
+ case "network":
243
+ return { status: { hostId, status: "unreachable", error: res.detail, failedStep: "remote-daemon-unreachable" }, input: null };
244
+ }
245
+ }
246
+ /** ONE composed fleet: local always included (in-process, D-1), every
247
+ * registered host fanned out concurrently under the named deadline (D-7),
248
+ * per-host status complete by construction, union deduped on the Q4 key. */
249
+ export async function composeFleet(deps) {
250
+ const local = deps.composeLocalRig();
251
+ const localInput = {
252
+ hostId: LOCAL_HOST_ID,
253
+ kind: "local",
254
+ scopedNeedsYou: [{ scope: "rig", items: local.needsYou.items }],
255
+ agents: local.agents.rows,
256
+ settled: local.settled,
257
+ };
258
+ const statuses = [{ hostId: LOCAL_HOST_ID, status: "ok" }];
259
+ const inputs = [localInput];
260
+ if (!deps.registryExists()) {
261
+ // No registry file = a single-host operator: a clean local-only fleet
262
+ // (the C4 band renders nothing new in this state).
263
+ return unionFleet(inputs, statuses, deps.nowIso);
264
+ }
265
+ const reg = deps.loadRegistry();
266
+ if (!reg.ok) {
267
+ // The registry EXISTS but cannot be read/parsed: there is no host list
268
+ // to attribute per-host statuses to — surface the error honestly at the
269
+ // payload level, never a silently-local-only fleet.
270
+ return unionFleet(inputs, statuses, deps.nowIso, reg.error);
271
+ }
272
+ const hostIds = reg.registry.hosts.map((h) => h.id);
273
+ const outcomes = new Array(hostIds.length);
274
+ let next = 0;
275
+ const cap = Math.max(1, Math.min(deps.concurrency ?? FLEET_FANOUT_CONCURRENCY, Math.max(hostIds.length, 1)));
276
+ const workers = Array.from({ length: cap }, async () => {
277
+ while (true) {
278
+ const i = next;
279
+ if (i >= hostIds.length)
280
+ return;
281
+ next += 1;
282
+ outcomes[i] = await readHostComposedRig(hostIds[i], reg, deps);
283
+ }
284
+ });
285
+ await Promise.all(workers);
286
+ // Registry order preserved (deterministic payload).
287
+ for (const outcome of outcomes) {
288
+ statuses.push(outcome.status);
289
+ if (outcome.input)
290
+ inputs.push(outcome.input);
291
+ }
292
+ return unionFleet(inputs, statuses, deps.nowIso);
293
+ }
294
+ //# sourceMappingURL=fleet-compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-compose.js","sourceRoot":"","sources":["../../../src/domain/review/fleet-compose.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type Database from "better-sqlite3";
2
2
  import type { SliceIndexer } from "../slices/slice-indexer.js";
3
3
  import { type SliceComposeInputs } from "./compose.js";
4
- import type { AgentsBand, AgentsScope, ComposedMissionReview, ComposedRigAgents, ComposedSliceReview } from "./types.js";
4
+ import type { AgentsBand, AgentsScope, ComposedMissionReview, ComposedRigAgents, ComposedSliceReview, WorkflowRowRef } from "./types.js";
5
5
  import type { AgentActivityStore } from "../agent-activity-store.js";
6
6
  export interface ReviewGathererDeps {
7
7
  db: Database.Database;
@@ -15,6 +15,14 @@ export interface ReviewGathererDeps {
15
15
  /** Injected clock so composition stays reproducible in tests. */
16
16
  now?: () => string;
17
17
  }
18
+ /** OPR.0.4.6.WF4 Q6 — the ● (agent-leg) workflow-identity stamp, derived from
19
+ * the item's OWN STRUCTURED TAGS (`workflow:<name>` / `instance:<id>` /
20
+ * `step:<id>` — the WF-5-ratified queryable identity), NEVER from summary /
21
+ * identity / evidenceRef prose. Returns the pointer only when BOTH required
22
+ * keys are present; a non-workflow row (no `instance:`/`workflow:` tag) →
23
+ * `undefined`, so its AttentionInput stays byte-identical (omit-when-absent).
24
+ * Pointer-only: the three identity keys, never status/deadline/class. */
25
+ export declare function workflowRefFromTags(tagsJson: string | null): WorkflowRowRef | undefined;
18
26
  export declare class ReviewGatherer {
19
27
  private readonly db;
20
28
  private readonly indexer;
@@ -63,6 +71,13 @@ export declare class ReviewGatherer {
63
71
  /** Human-routed attention rows carrying the given tag (the §5 predicate is
64
72
  * Packet 1's; until it lands, human-tier/human-dest/park-on-human rows are
65
73
  * selected with the same shape). */
74
+ /** OPR.0.4.6.WF5 FR-3 — recorded workflow-instance views for the ▲
75
+ * band: failed + in-flight instances, the WF-1 evaluator verdict
76
+ * (consumed, never recomputed — the module import IS the single
77
+ * home), the open exception item by TAG QUERY (never summary
78
+ * parsing), and the non-open-frontier anomaly check. Read-only;
79
+ * absent tables (pre-workflow DBs) return []. */
80
+ private gatherWorkflowExceptions;
66
81
  private attentionForTag;
67
82
  /** Sessions holding active work on the named slices (null = rig-wide).
68
83
  * Region membership derives from work-on-scope, never rig co-residency.
@@ -1 +1 @@
1
- {"version":3,"file":"gather.d.ts","sourceRoot":"","sources":["../../../src/domain/review/gather.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAcL,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,mBAAmB,EAA8B,MAAM,YAAY,CAAC;AAErJ,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGrE,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,OAAO,EAAE,YAAY,CAAC;IACtB,+FAA+F;IAC/F,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;4EAEwE;IACxE,aAAa,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC1C,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAkBD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4B;IAC1D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,IAAI,EAAE,kBAAkB;IAQpC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAKtD,6EAA6E;IAC7E,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,mBAAmB,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;IAOtH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI;IA2B7D;;;;;;OAMG;IACH,UAAU,IAAI,iBAAiB;IAmB/B,+EAA+E;IAC/E,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,IAAI;IAkBpD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAsCpD;;;mCAG+B;IAC/B,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,eAAe;IAkBvB,+EAA+E;IAC/E,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAQlF,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,kBAAkB;IAuB1B,gFAAgF;IAChF,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,YAAY;IASpB;;yCAEqC;IACrC,OAAO,CAAC,eAAe;IAyCvB;;+EAE2E;IAC3E,OAAO,CAAC,eAAe;IAmDvB;;;kCAG8B;IAC9B,OAAO,CAAC,SAAS;IAqDjB;;oEAEgE;IAChE,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,eAAe;IAkBvB,0EAA0E;IAC1E,OAAO,CAAC,YAAY;IA8BpB;;0CAEsC;IACtC,OAAO,CAAC,YAAY;IA6BpB;2EACuE;IACvE,OAAO,CAAC,WAAW;IAiCnB,OAAO,CAAC,cAAc;IAwBtB;;;;4CAIwC;IACxC,OAAO,CAAC,cAAc;IA8CtB,OAAO,CAAC,GAAG;IASX,OAAO,CAAC,cAAc;CAwBvB"}
1
+ {"version":3,"file":"gather.d.ts","sourceRoot":"","sources":["../../../src/domain/review/gather.ts"],"names":[],"mappings":"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"}
@@ -10,10 +10,44 @@ import * as fs from "node:fs";
10
10
  import * as path from "node:path";
11
11
  import { execFileSync } from "node:child_process";
12
12
  import YAML from "yaml";
13
+ import { sessionMemberLabel } from "../session-name.js";
13
14
  import { composeMissionReview, composeRecordedGreenForSlice, composeSliceReview, deriveCandidateSha, extractMediaRefs, extractSection, parseC1Header, } from "./compose.js";
14
15
  import { composeAgentsBand, composeRigAgents } from "./compose.js";
16
+ import { evaluateStepDeadline } from "../workflow-deadline.js";
15
17
  import { isHumanSeatSession } from "../human-route-enforcer.js";
16
18
  const ACTIVE_STATES = ["pending", "in-progress", "claimed", "blocked", "handed-off"];
19
+ /** OPR.0.4.6.WF4 Q6 — the ● (agent-leg) workflow-identity stamp, derived from
20
+ * the item's OWN STRUCTURED TAGS (`workflow:<name>` / `instance:<id>` /
21
+ * `step:<id>` — the WF-5-ratified queryable identity), NEVER from summary /
22
+ * identity / evidenceRef prose. Returns the pointer only when BOTH required
23
+ * keys are present; a non-workflow row (no `instance:`/`workflow:` tag) →
24
+ * `undefined`, so its AttentionInput stays byte-identical (omit-when-absent).
25
+ * Pointer-only: the three identity keys, never status/deadline/class. */
26
+ export function workflowRefFromTags(tagsJson) {
27
+ if (!tagsJson)
28
+ return undefined;
29
+ let tags;
30
+ try {
31
+ tags = JSON.parse(tagsJson) ?? [];
32
+ }
33
+ catch {
34
+ return undefined;
35
+ }
36
+ let instanceId;
37
+ let workflowName;
38
+ let stepId;
39
+ for (const t of tags) {
40
+ if (t.startsWith("instance:"))
41
+ instanceId = t.slice("instance:".length);
42
+ else if (t.startsWith("workflow:"))
43
+ workflowName = t.slice("workflow:".length);
44
+ else if (t.startsWith("step:"))
45
+ stepId = t.slice("step:".length);
46
+ }
47
+ if (!instanceId || !workflowName)
48
+ return undefined;
49
+ return { instanceId, workflowName, ...(stepId ? { stepId } : {}) };
50
+ }
17
51
  export class ReviewGatherer {
18
52
  db;
19
53
  indexer;
@@ -89,6 +123,7 @@ export class ReviewGatherer {
89
123
  handoffsToday,
90
124
  overdueCount: overdue.length,
91
125
  rosterWindow: "today",
126
+ workflows: this.gatherWorkflowExceptions(nowIso),
92
127
  nowIso,
93
128
  });
94
129
  }
@@ -140,6 +175,7 @@ export class ReviewGatherer {
140
175
  proofDirExists: fs.existsSync(path.join(slice.slicePath, "proof")),
141
176
  attention,
142
177
  agents,
178
+ workflows: this.gatherWorkflowExceptions(this.now()),
143
179
  activeQitemPresent: this.hasActiveQitem(name, slice),
144
180
  git: this.gatherGitFacts(frontmatter, candidateRef),
145
181
  approval,
@@ -270,6 +306,88 @@ export class ReviewGatherer {
270
306
  /** Human-routed attention rows carrying the given tag (the §5 predicate is
271
307
  * Packet 1's; until it lands, human-tier/human-dest/park-on-human rows are
272
308
  * selected with the same shape). */
309
+ /** OPR.0.4.6.WF5 FR-3 — recorded workflow-instance views for the ▲
310
+ * band: failed + in-flight instances, the WF-1 evaluator verdict
311
+ * (consumed, never recomputed — the module import IS the single
312
+ * home), the open exception item by TAG QUERY (never summary
313
+ * parsing), and the non-open-frontier anomaly check. Read-only;
314
+ * absent tables (pre-workflow DBs) return []. */
315
+ gatherWorkflowExceptions(nowIso) {
316
+ try {
317
+ const instances = this.db
318
+ .prepare(`SELECT instance_id, workflow_name, status, current_step_id, current_frontier_json
319
+ FROM workflow_instances WHERE status IN ('failed','active','waiting')`)
320
+ .all();
321
+ const now = new Date(nowIso);
322
+ const out = [];
323
+ for (const row of instances) {
324
+ let frontier = [];
325
+ try {
326
+ frontier = JSON.parse(row.current_frontier_json) ?? [];
327
+ }
328
+ catch {
329
+ frontier = [];
330
+ }
331
+ const packets = frontier.map((id) => this.db
332
+ .prepare(`SELECT qitem_id, state, destination_session, ts_created, claimed_at, closure_required_at
333
+ FROM queue_items WHERE qitem_id = ?`)
334
+ .get(id));
335
+ const frontierRefsNonOpenPacket = (row.status === "active" || row.status === "waiting") &&
336
+ packets.some((p) => p && !["pending", "in-progress", "blocked"].includes(p.state));
337
+ const verdict = evaluateStepDeadline({
338
+ instanceId: row.instance_id,
339
+ status: row.status,
340
+ currentFrontier: frontier,
341
+ currentStepId: row.current_step_id,
342
+ }, packets.map((p) => p
343
+ ? {
344
+ qitemId: p.qitem_id,
345
+ state: p.state,
346
+ destinationSession: p.destination_session,
347
+ tsCreated: p.ts_created,
348
+ claimedAt: p.claimed_at,
349
+ closureRequiredAt: p.closure_required_at,
350
+ }
351
+ : null), now);
352
+ const item = this.db
353
+ .prepare(`SELECT qitem_id, destination_session, tier, ts_created, summary
354
+ FROM queue_items
355
+ WHERE state IN ('pending','in-progress','blocked')
356
+ AND tags LIKE ? AND tags LIKE ?
357
+ ORDER BY ts_created DESC LIMIT 1`)
358
+ .get(`%"instance:${row.instance_id}"%`, `%"workflow-exception"%`);
359
+ out.push({
360
+ instanceId: row.instance_id,
361
+ workflowName: row.workflow_name,
362
+ status: row.status,
363
+ currentStepId: row.current_step_id,
364
+ deadlineState: verdict.state,
365
+ deadlineEvidence: verdict.evidence
366
+ ? `step ${verdict.evidence.stepId ?? "?"} packet ${verdict.evidence.packetId} held by ${verdict.evidence.ownerSession} — ${verdict.evidence.overdueBySeconds}s past the ${verdict.evidence.anchor} anchor`
367
+ : null,
368
+ frontierRefsNonOpenPacket,
369
+ openItem: item
370
+ ? {
371
+ qitemId: item.qitem_id,
372
+ destinationSession: item.destination_session,
373
+ humanRouted: item.tier === "human-gate" || /^human(?:-[A-Za-z0-9._-]+)?@(kernel|host)$/.test(item.destination_session),
374
+ createdAtIso: item.ts_created,
375
+ summary: item.summary,
376
+ }
377
+ : null,
378
+ });
379
+ }
380
+ return out;
381
+ }
382
+ catch (err) {
383
+ // Pre-workflow DBs (no tables) compose byte-identically to
384
+ // pre-WF-5; anything else fails LOUD (the WF-3 narrowed-catch
385
+ // lesson — a broad catch here would silently blind the band).
386
+ if (err instanceof Error && /no such table/i.test(err.message))
387
+ return [];
388
+ throw err;
389
+ }
390
+ }
273
391
  attentionForTag(tag, excludeTagPrefix) {
274
392
  if (!this.tableExists("queue_items"))
275
393
  return [];
@@ -297,19 +415,25 @@ export class ReviewGatherer {
297
415
  return true;
298
416
  }
299
417
  })
300
- .map((r) => ({
301
- qitemId: r.qitem_id,
302
- summary: r.summary,
303
- leg: r.state === "blocked" ? "park-on-human" : "human-routed",
304
- where: r.destination_session,
305
- createdAtIso: r.ts_created,
306
- priority: r.priority,
307
- tier: r.tier,
308
- evidenceRef: r.evidence_ref ?? null,
309
- unblocks: r.state === "blocked" ? r.qitem_id : null,
310
- destinationSession: r.destination_session,
311
- closureRequiredAtIso: r.closure_required_at,
312
- }));
418
+ .map((r) => {
419
+ // OPR.0.4.6.WF4 Q6 — stamp the ● workflow pointer from the item's own
420
+ // tags; OMITTED for non-workflow rows (byte-identity-by-omission).
421
+ const workflow = workflowRefFromTags(r.tags);
422
+ return {
423
+ qitemId: r.qitem_id,
424
+ summary: r.summary,
425
+ leg: r.state === "blocked" ? "park-on-human" : "human-routed",
426
+ where: r.destination_session,
427
+ createdAtIso: r.ts_created,
428
+ priority: r.priority,
429
+ tier: r.tier,
430
+ evidenceRef: r.evidence_ref ?? null,
431
+ unblocks: r.state === "blocked" ? r.qitem_id : null,
432
+ destinationSession: r.destination_session,
433
+ closureRequiredAtIso: r.closure_required_at,
434
+ ...(workflow ? { workflow } : {}),
435
+ };
436
+ });
313
437
  }
314
438
  /** Sessions holding active work on the named slices (null = rig-wide).
315
439
  * Region membership derives from work-on-scope, never rig co-residency.
@@ -352,7 +476,7 @@ export class ReviewGatherer {
352
476
  .filter((r) => !!r.blocked_on)
353
477
  .reduce((acc, r) => (!acc || r.ts_updated > acc.ts_updated ? r : acc), null);
354
478
  return {
355
- agentName: session.split("@")[0] ?? session,
479
+ agentName: sessionMemberLabel(session), // OPR.0.4.6.MH1 FR-8: shared contract
356
480
  sessionName: session,
357
481
  runtime: "unknown",
358
482
  parkedOn: parked?.blocked_on ?? null,
@@ -412,7 +536,7 @@ export class ReviewGatherer {
412
536
  const recentInputs = [...recent.entries()]
413
537
  .sort(([a], [b]) => a.localeCompare(b))
414
538
  .map(([session, e]) => ({
415
- agentName: session.split("@")[0] ?? session,
539
+ agentName: sessionMemberLabel(session), // OPR.0.4.6.MH1 FR-8: shared contract
416
540
  sessionName: session,
417
541
  runtime: "unknown",
418
542
  parkedOn: null,
@@ -491,19 +615,25 @@ export class ReviewGatherer {
491
615
  OR destination_session LIKE 'human%'
492
616
  OR (state = 'blocked' AND blocked_on LIKE 'human%'))`)
493
617
  .all(...ACTIVE_STATES);
494
- return rows.map((r) => ({
495
- qitemId: r.qitem_id,
496
- summary: r.summary,
497
- leg: r.state === "blocked" ? "park-on-human" : "human-routed",
498
- where: r.destination_session,
499
- createdAtIso: r.ts_created,
500
- priority: r.priority,
501
- tier: r.tier,
502
- evidenceRef: r.evidence_ref ?? null,
503
- unblocks: r.state === "blocked" ? r.qitem_id : null,
504
- destinationSession: r.destination_session,
505
- closureRequiredAtIso: r.closure_required_at,
506
- }));
618
+ return rows.map((r) => {
619
+ // OPR.0.4.6.WF4 Q6 — stamp the ● workflow pointer from the item's own
620
+ // tags; OMITTED for non-workflow rows (byte-identity-by-omission).
621
+ const workflow = workflowRefFromTags(r.tags);
622
+ return {
623
+ qitemId: r.qitem_id,
624
+ summary: r.summary,
625
+ leg: r.state === "blocked" ? "park-on-human" : "human-routed",
626
+ where: r.destination_session,
627
+ createdAtIso: r.ts_created,
628
+ priority: r.priority,
629
+ tier: r.tier,
630
+ evidenceRef: r.evidence_ref ?? null,
631
+ unblocks: r.state === "blocked" ? r.qitem_id : null,
632
+ destinationSession: r.destination_session,
633
+ closureRequiredAtIso: r.closure_required_at,
634
+ ...(workflow ? { workflow } : {}),
635
+ };
636
+ });
507
637
  }
508
638
  /** FR-4: today's closed handoffs from the transitions log — the SETTLED
509
639
  * band and the health line's handoff count come from the SAME query
@@ -552,19 +682,25 @@ export class ReviewGatherer {
552
682
  AND closure_required_at < ?
553
683
  AND tags LIKE '%"slice:%'`)
554
684
  .all(nowIso);
555
- return rows.map((r) => ({
556
- qitemId: r.qitem_id,
557
- summary: r.summary,
558
- leg: "overdue",
559
- where: r.destination_session,
560
- createdAtIso: r.ts_created,
561
- priority: r.priority,
562
- tier: r.tier,
563
- evidenceRef: null,
564
- unblocks: null,
565
- destinationSession: r.destination_session,
566
- closureRequiredAtIso: r.closure_required_at,
567
- }));
685
+ return rows.map((r) => {
686
+ // OPR.0.4.6.WF4 Q6 — stamp the ● workflow pointer from the item's own
687
+ // tags; OMITTED for non-workflow rows (byte-identity-by-omission).
688
+ const workflow = workflowRefFromTags(r.tags);
689
+ return {
690
+ qitemId: r.qitem_id,
691
+ summary: r.summary,
692
+ leg: "overdue",
693
+ where: r.destination_session,
694
+ createdAtIso: r.ts_created,
695
+ priority: r.priority,
696
+ tier: r.tier,
697
+ evidenceRef: null,
698
+ unblocks: null,
699
+ destinationSession: r.destination_session,
700
+ closureRequiredAtIso: r.closure_required_at,
701
+ ...(workflow ? { workflow } : {}),
702
+ };
703
+ });
568
704
  }
569
705
  catch {
570
706
  return [];