@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
@@ -5,8 +5,10 @@ import { bindingsSessionsSchema } from "./db/migrations/002_bindings_sessions.js
5
5
  import { eventsSchema } from "./db/migrations/003_events.js";
6
6
  import { RigRepository } from "./domain/rig-repository.js";
7
7
  import { SessionRegistry } from "./domain/session-registry.js";
8
+ import { isHumanSeatSessionRef, parseSessionName } from "./domain/session-name.js";
8
9
  import { EventBus } from "./domain/event-bus.js";
9
10
  import { NodeLauncher } from "./domain/node-launcher.js";
11
+ import { TmuxOptionDefaultsApplier } from "./domain/tmux-option-defaults.js";
10
12
  import { TmuxAdapter } from "./adapters/tmux.js";
11
13
  import { CmuxAdapter } from "./adapters/cmux.js";
12
14
  import { execCommand } from "./adapters/tmux-exec.js";
@@ -17,6 +19,7 @@ import { SnapshotCapture } from "./domain/snapshot-capture.js";
17
19
  import { RestoreOrchestrator } from "./domain/restore-orchestrator.js";
18
20
  import { ClaudeResumeAdapter } from "./adapters/claude-resume.js";
19
21
  import { CodexResumeAdapter } from "./adapters/codex-resume.js";
22
+ import { PiResumeAdapter } from "./adapters/pi-resume.js";
20
23
  import { RigSpecExporter } from "./domain/rigspec-exporter.js";
21
24
  import { PodRepository } from "./domain/pod-repository.js";
22
25
  import { RigSpecPreflight } from "./domain/rigspec-preflight.js";
@@ -59,6 +62,7 @@ import { AskService } from "./domain/ask-service.js";
59
62
  import { ChatRepository } from "./domain/chat-repository.js";
60
63
  import { StreamStore } from "./domain/stream-store.js";
61
64
  import { QueueRepository } from "./domain/queue-repository.js";
65
+ import { createWorkflowFrontierPredicate } from "./domain/workflow-frontier-guard.js";
62
66
  import { InboxHandler } from "./domain/inbox-handler.js";
63
67
  import { OutboxHandler } from "./domain/outbox-handler.js";
64
68
  import { ProjectClassifier } from "./domain/project-classifier.js";
@@ -137,6 +141,12 @@ import { resumeVerificationSchema } from "./db/migrations/045_resume_verificatio
137
141
  import { seatIdentityVerdictsSchema } from "./db/migrations/046_seat_identity_verdicts.js";
138
142
  import { eventsNodeTypeIndexSchema } from "./db/migrations/047_events_node_type_index.js";
139
143
  import { queueItemEvidenceRefSchema } from "./db/migrations/048_queue_item_evidence_ref.js";
144
+ import { workflowInstanceVersionSchema } from "./db/migrations/049_workflow_instance_version.js";
145
+ import { workflowSpecJsonSchema } from "./db/migrations/050_workflow_spec_json.js";
146
+ import { workflowResumeSchema } from "./db/migrations/051_workflow_resume.js";
147
+ import { workflowInstanceBoundRigSchema } from "./db/migrations/052_workflow_instance_bound_rig.js";
148
+ import { sessionsNodeIdIndexSchema } from "./db/migrations/053_sessions_node_id_index.js";
149
+ import { queueTransitionsArchiveSchema } from "./db/migrations/054_queue_transitions_archive.js";
140
150
  import { RigPolicyStore } from "./domain/rig-policy/rig-policy-store.js";
141
151
  import { MissionControlActionLog } from "./domain/mission-control/mission-control-action-log.js";
142
152
  import { MissionControlWriteContract } from "./domain/mission-control/mission-control-write-contract.js";
@@ -157,6 +167,15 @@ const KNOWN_PROVIDER_AUTH_ENV = new Set([
157
167
  "OPENAI_BASE_URL",
158
168
  "OPENAI_ORG_ID",
159
169
  "OPENAI_PROJECT_ID",
170
+ // OPR.0.4.6.PI1 FR-7 — Pi seat providers. Without these in the KNOWN set,
171
+ // a daemon-launched Pi seat can never receive its provider key (the
172
+ // pi-runner's own deny-by-default allowlist then has nothing to pass
173
+ // through). Double opt-in preserved: the operator must still name each var
174
+ // in recovery.provider_auth_env_allowlist. OpenRouter is the founder-ruled
175
+ // preferred path (2026-07-06); zai/kimi-coding are the secondary natives.
176
+ "OPENROUTER_API_KEY",
177
+ "ZAI_API_KEY",
178
+ "KIMI_API_KEY",
160
179
  ]);
161
180
  export function collectAllowlistedProviderAuthEnv(raw, env) {
162
181
  const out = {};
@@ -178,7 +197,7 @@ export function collectAllowlistedProviderAuthEnv(raw, env) {
178
197
  export async function createDaemon(opts) {
179
198
  const dbPath = opts?.dbPath ?? ":memory:";
180
199
  const db = createDb(dbPath);
181
- migrate(db, [coreSchema, bindingsSessionsSchema, eventsSchema, snapshotsSchema, checkpointsSchema, resumeMetadataSchema, nodeSpecFieldsSchema, packagesSchema, installJournalSchema, journalSeqSchema, bootstrapSchema, discoverySchema, discoveryFkFix, agentspecRebootSchema, startupContextSchema, chatMessagesSchema, podNamespaceSchema, contextUsageSchema, externalCliAttachmentSchema, rigServicesSchema, seatHandoverObservabilitySchema, nodeCodexConfigProfileSchema, streamItemsSchema, queueItemsSchema, queueTransitionsSchema, inboxEntriesSchema, outboxEntriesSchema, projectClassificationsSchema, classifierLeasesSchema, viewsCustomSchema, watchdogJobsSchema, watchdogHistorySchema, workflowSpecsSchema, workflowInstancesSchema, workflowStepTrailsSchema, watchdogPolicyEnumExtensionSchema, missionControlActionsSchema, workspacePrimitiveSchema, queueTargetRepoSchema, workflowSpecsDiagnosticSchema, rigPolicySchema, rigArchiveSchema, resumeProvenanceSchema, queueItemSummarySchema, resumeVerificationSchema, seatIdentityVerdictsSchema, eventsNodeTypeIndexSchema, queueItemEvidenceRefSchema]);
200
+ migrate(db, [coreSchema, bindingsSessionsSchema, eventsSchema, snapshotsSchema, checkpointsSchema, resumeMetadataSchema, nodeSpecFieldsSchema, packagesSchema, installJournalSchema, journalSeqSchema, bootstrapSchema, discoverySchema, discoveryFkFix, agentspecRebootSchema, startupContextSchema, chatMessagesSchema, podNamespaceSchema, contextUsageSchema, externalCliAttachmentSchema, rigServicesSchema, seatHandoverObservabilitySchema, nodeCodexConfigProfileSchema, streamItemsSchema, queueItemsSchema, queueTransitionsSchema, inboxEntriesSchema, outboxEntriesSchema, projectClassificationsSchema, classifierLeasesSchema, viewsCustomSchema, watchdogJobsSchema, watchdogHistorySchema, workflowSpecsSchema, workflowInstancesSchema, workflowStepTrailsSchema, watchdogPolicyEnumExtensionSchema, missionControlActionsSchema, workspacePrimitiveSchema, queueTargetRepoSchema, workflowSpecsDiagnosticSchema, rigPolicySchema, rigArchiveSchema, resumeProvenanceSchema, queueItemSummarySchema, resumeVerificationSchema, seatIdentityVerdictsSchema, eventsNodeTypeIndexSchema, queueItemEvidenceRefSchema, workflowInstanceVersionSchema, workflowSpecJsonSchema, workflowResumeSchema, workflowInstanceBoundRigSchema, sessionsNodeIdIndexSchema, queueTransitionsArchiveSchema]);
182
201
  const rigRepo = new RigRepository(db);
183
202
  const sessionRegistry = new SessionRegistry(db);
184
203
  const eventBus = new EventBus(db);
@@ -186,17 +205,17 @@ export async function createDaemon(opts) {
186
205
  // Reject `<member>@<unknown-rig>` shapes by checking the rig portion
187
206
  // against the rig registry. Bare ids without `@` are also rejected
188
207
  // (no canonical rig binding).
189
- const isHumanSeatSessionRef = (sessionRef) => {
190
- return /^human(?:-[A-Za-z0-9._-]+)?@(kernel|host)$/.test(sessionRef);
191
- };
208
+ // OPR.0.4.6.MH1 FR-8: this gate is the ARCHETYPE consumer of the shared
209
+ // parse contract — human-seat classification BEFORE parse, then the
210
+ // greedy first-@ rig (so "member@rig@x" looks up rig "rig@x", misses,
211
+ // and rejects with the same unknown_destination_rig as ever — BR-1).
192
212
  const topologyValidateRig = (sessionRef) => {
193
213
  if (isHumanSeatSessionRef(sessionRef))
194
214
  return true;
195
- const m = /^[^@]+@(.+)$/.exec(sessionRef);
196
- if (!m)
215
+ const parsed = parseSessionName(sessionRef);
216
+ if (parsed.kind !== "canonical")
197
217
  return false;
198
- const rigName = m[1];
199
- return rigRepo.findRigsByName(rigName).length > 0;
218
+ return rigRepo.findRigsByName(parsed.rig).length > 0;
200
219
  };
201
220
  // PL-004 Phase A — shared coordination services. Constructed early so
202
221
  // both the queueRepo dep slot and inboxHandler can share one instance.
@@ -204,6 +223,10 @@ export async function createDaemon(opts) {
204
223
  // attachTransport().
205
224
  const queueRepoInstance = new QueueRepository(db, eventBus, {
206
225
  validateRig: topologyValidateRig,
226
+ // OPR.0.4.6.WF3 FR-6 — the frontier close-path guard's predicate,
227
+ // INJECTED here (arch layering pin: the queue never imports the
228
+ // workflow domain; startup wires them — the validateRig precedent).
229
+ workflowFrontierPredicate: createWorkflowFrontierPredicate(db),
207
230
  });
208
231
  // PL-004 Phase B — classifier lease manager. Constructed early so both
209
232
  // the leaseManager dep slot and project-classifier can share one instance.
@@ -286,6 +309,26 @@ export async function createDaemon(opts) {
286
309
  OPENRIG_ACTIVITY_HOOK_TOKEN: resolvedActivityHookToken,
287
310
  ...providerAuthEnv,
288
311
  };
312
+ // OPR.0.4.6.02 S1 — ONE shared tmux option-defaults applier, injected into
313
+ // BOTH NodeLauncher and (via AppDeps → the seat-handover route) the fresh
314
+ // successor launcher, so every fresh seat gets the same mouse/status/
315
+ // clipboard defaults and the server-scope defaults assert once per daemon
316
+ // lifetime (shared memo). The status-bar read resolves `terminal.status_bar`
317
+ // FRESH per launch (resolveOne re-reads the config file) so an operator flip
318
+ // applies to the NEXT launch without a daemon restart; a resolution failure
319
+ // falls back to off (bar hidden).
320
+ const tmuxOptionSettings = new ContextPackSettingsStore();
321
+ const tmuxOptionDefaults = new TmuxOptionDefaultsApplier({
322
+ tmuxAdapter,
323
+ readTmuxOptionDefaults: () => {
324
+ try {
325
+ return { statusBar: tmuxOptionSettings.resolveOne("terminal.status_bar").value === true };
326
+ }
327
+ catch {
328
+ return { statusBar: false };
329
+ }
330
+ },
331
+ });
289
332
  const nodeLauncher = new NodeLauncher({
290
333
  db,
291
334
  rigRepo,
@@ -294,12 +337,19 @@ export async function createDaemon(opts) {
294
337
  tmuxAdapter,
295
338
  transcriptStore,
296
339
  sessionEnv: launchSessionEnv,
340
+ tmuxOptionDefaults,
297
341
  });
298
342
  const snapshotRepo = new SnapshotRepository(db);
299
343
  const checkpointStore = new CheckpointStore(db);
300
344
  const snapshotCapture = new SnapshotCapture({ db, rigRepo, sessionRegistry, eventBus, snapshotRepo, checkpointStore });
301
345
  const claudeResume = new ClaudeResumeAdapter(tmuxAdapter);
302
346
  const codexResume = new CodexResumeAdapter(tmuxAdapter);
347
+ // OPR.0.4.6.PI1 — the Pi seat-state root + the compiled runner entry (daemon
348
+ // dist). Shared by the Pi runtime adapter, the resume adapter, and the
349
+ // resume-token capture sidecar reader.
350
+ const piStateRoot = nodePath.join(OPENRIG_HOME, "state", "pi");
351
+ const piRunnerEntryPath = nodePath.resolve(import.meta.dirname, "./adapters/pi-runner.js");
352
+ const piResume = new PiResumeAdapter(tmuxAdapter, { readFile: (p) => fs.readFileSync(p, "utf-8"), writeFile: (p, c) => fs.writeFileSync(p, c, "utf-8"), exists: (p) => fs.existsSync(p), mkdirp: (p) => fs.mkdirSync(p, { recursive: true }) }, { stateRoot: piStateRoot, runnerEntryPath: piRunnerEntryPath });
303
353
  // Services infrastructure (RigEnv) — created early so restore/bootstrap can use it
304
354
  const { ComposeServicesAdapter } = await import("./adapters/compose-services-adapter.js");
305
355
  const { ServiceOrchestrator } = await import("./domain/service-orchestrator.js");
@@ -307,7 +357,7 @@ export async function createDaemon(opts) {
307
357
  const serviceOrchestrator = new ServiceOrchestrator({ rigRepo, composeAdapter });
308
358
  const restoreOrchestrator = new RestoreOrchestrator({
309
359
  db, rigRepo, sessionRegistry, eventBus, snapshotRepo, snapshotCapture,
310
- checkpointStore, nodeLauncher, tmuxAdapter, claudeResume, codexResume,
360
+ checkpointStore, nodeLauncher, tmuxAdapter, claudeResume, codexResume, piResume,
311
361
  transcriptStore, serviceOrchestrator,
312
362
  });
313
363
  // Connect to cmux at startup — degrades gracefully if absent
@@ -404,6 +454,7 @@ export async function createDaemon(opts) {
404
454
  const { StartupOrchestrator } = await import("./domain/startup-orchestrator.js");
405
455
  const { ClaudeCodeAdapter } = await import("./adapters/claude-code-adapter.js");
406
456
  const { CodexRuntimeAdapter } = await import("./adapters/codex-runtime-adapter.js");
457
+ const { PiRuntimeAdapter } = await import("./adapters/pi-runtime-adapter.js");
407
458
  const startupOrchestrator = new StartupOrchestrator({ db, sessionRegistry, eventBus, tmuxAdapter, readFile: (p) => fs.readFileSync(p, "utf-8") });
408
459
  const runtimeSettings = new ContextPackSettingsStore().resolveConfig();
409
460
  const claudeAdapter = new ClaudeCodeAdapter({ tmux: tmuxAdapter, fsOps: { readFile: (p) => fs.readFileSync(p, "utf-8"), writeFile: (p, c) => fs.writeFileSync(p, c, "utf-8"), exists: (p) => fs.existsSync(p), mkdirp: (p) => fs.mkdirSync(p, { recursive: true }), copyFile: (src, dest) => fs.copyFileSync(src, dest), listFiles: (dir) => { const r = []; function w(d, pre) { for (const e of fs.readdirSync(d, { withFileTypes: true })) {
@@ -418,6 +469,14 @@ export async function createDaemon(opts) {
418
469
  else
419
470
  r.push(pre ? nodePath.join(pre, e.name) : e.name);
420
471
  } } w(dir, ""); return r; }, homedir: os.homedir() }, activityRelayPath: nodePath.resolve(import.meta.dirname, "../assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs") });
472
+ // OPR.0.4.6.PI1 — the RPC-first Pi adapter (runner-in-a-pane). Same fsOps
473
+ // shape as the Codex adapter; seat isolation roots under piStateRoot.
474
+ const piAdapter = new PiRuntimeAdapter({ tmux: tmuxAdapter, fsOps: { readFile: (p) => fs.readFileSync(p, "utf-8"), writeFile: (p, c) => fs.writeFileSync(p, c, "utf-8"), exists: (p) => fs.existsSync(p), mkdirp: (p) => fs.mkdirSync(p, { recursive: true }), listFiles: (dir) => { const r = []; function w(d, pre) { for (const e of fs.readdirSync(d, { withFileTypes: true })) {
475
+ if (e.isDirectory())
476
+ w(nodePath.join(d, e.name), nodePath.join(pre, e.name));
477
+ else
478
+ r.push(pre ? nodePath.join(pre, e.name) : e.name);
479
+ } } w(dir, ""); return r; } }, stateRoot: piStateRoot, runnerEntryPath: piRunnerEntryPath });
421
480
  // plugin-primitive Phase 3a slice 3.5 — ensure Codex feature flag
422
481
  // codex_hooks = true is set in ~/.codex/config.toml so plugin-shipped
423
482
  // hooks fire on Codex runtime. Slice 27 also creates the default
@@ -579,7 +638,7 @@ export async function createDaemon(opts) {
579
638
  db, rigRepo, podRepo,
580
639
  sessionRegistry, eventBus, nodeLauncher, startupOrchestrator,
581
640
  fsOps: { readFile: (p) => fs.readFileSync(p, "utf-8"), exists: (p) => fs.existsSync(p) },
582
- adapters: { "claude-code": claudeAdapter, "codex": codexAdapter, "terminal": new (await import("./adapters/terminal-adapter.js")).TerminalAdapter() },
641
+ adapters: { "claude-code": claudeAdapter, "codex": codexAdapter, "pi": piAdapter, "terminal": new (await import("./adapters/terminal-adapter.js")).TerminalAdapter() },
583
642
  tmuxAdapter,
584
643
  contextPackLibrary,
585
644
  agentImageLibrary,
@@ -672,6 +731,8 @@ export async function createDaemon(opts) {
672
731
  // (Claude sidecar reader + Codex thread-id capturer, both reuse).
673
732
  contextUsageStore,
674
733
  resumeTokenCapturer: resumeMetadataRefresher,
734
+ // OPR.0.4.6.PI1 FR-6 — pi-runner sidecar reader (the adapter exposes it).
735
+ piRunnerStateStore: piAdapter,
675
736
  });
676
737
  const selfAttachService = new SelfAttachService({
677
738
  db, rigRepo, podRepo, sessionRegistry, eventBus, tmuxAdapter, transcriptStore,
@@ -709,6 +770,7 @@ export async function createDaemon(opts) {
709
770
  eventBus,
710
771
  nodeLauncher,
711
772
  tmuxAdapter,
773
+ tmuxOptionDefaults,
712
774
  sessionEnv: launchSessionEnv,
713
775
  cmuxAdapter,
714
776
  snapshotCapture,
@@ -751,7 +813,7 @@ export async function createDaemon(opts) {
751
813
  }),
752
814
  podInstantiator,
753
815
  podBundleSourceResolver,
754
- runtimeAdapters: { "claude-code": claudeAdapter, "codex": codexAdapter, "terminal": new (await import("./adapters/terminal-adapter.js")).TerminalAdapter() },
816
+ runtimeAdapters: { "claude-code": claudeAdapter, "codex": codexAdapter, "pi": piAdapter, "terminal": new (await import("./adapters/terminal-adapter.js")).TerminalAdapter() },
755
817
  transcriptStore,
756
818
  sessionTransport: (() => {
757
819
  const t = new SessionTransport({ db, rigRepo, sessionRegistry, tmuxAdapter, agentActivityStore, eventBus });
@@ -932,13 +994,40 @@ export async function createDaemon(opts) {
932
994
  // slice IMPL § Write Set / § Driver Handoff Contract).
933
995
  const queueRepoForWorkflow = deps.queueRepo;
934
996
  let workflowRuntime;
997
+ let workflowExceptionEnsurer;
935
998
  if (queueRepoForWorkflow) {
936
999
  workflowRuntime = new WorkflowRuntime({
937
1000
  db,
938
1001
  eventBus,
939
1002
  queueRepo: queueRepoForWorkflow,
1003
+ // OPR.0.4.6.WF1 FR-3: instantiate/handoff auto-arm the
1004
+ // per-instance workflow-keepalive job in-txn; terminal disarms.
1005
+ watchdogJobsRepo: watchdogJobsRepoInstance,
1006
+ // OPR.0.4.6.WF5 FR-2: the maturity dial — host default read LIVE
1007
+ // per exception from the settings twin (dial flips affect future
1008
+ // items only, never retroactive re-routing).
1009
+ exceptionDial: {
1010
+ hostDefault: () => {
1011
+ const v = new ContextPackSettingsStore().resolveOne("workflow.exception_routing")
1012
+ .value;
1013
+ return v === "orchestrator" || v === "human_only" ? v : null;
1014
+ },
1015
+ humanFallbackSeat: "human@host",
1016
+ },
940
1017
  });
941
1018
  deps.workflowRuntime = workflowRuntime;
1019
+ // OPR.0.4.6.WF5 FR-2 class (b): the shared detection-time exception
1020
+ // ensurer — sweep + keepalive both call it; dedup by occurrence tags.
1021
+ {
1022
+ const { makeEnsureStuckExceptionItem } = await import("./domain/workflow-exception-escalation.js");
1023
+ workflowExceptionEnsurer = makeEnsureStuckExceptionItem({
1024
+ db,
1025
+ queueRepo: queueRepoForWorkflow,
1026
+ resolveRoute: (name, version, cls, boundRig) => workflowRuntime.resolveExceptionRouteFor(name, version, cls, boundRig),
1027
+ humanFallbackSeat: "human@host",
1028
+ log: (line) => console.log(line),
1029
+ });
1030
+ }
942
1031
  // Seed built-in starter workflow_specs into the cache. Idempotent
943
1032
  // + workspace-surface-respecting — operator
944
1033
  // overrides at workspace paths are preserved (skip-if-cached).
@@ -1180,6 +1269,97 @@ export async function createDaemon(opts) {
1180
1269
  activityStore: agentActivityStore,
1181
1270
  });
1182
1271
  }
1272
+ // OPR.0.4.6.02 C3 — the terminal-provider-ride service (ONE composer for
1273
+ // every view kind). Built here (post-hoc) so it can read the lazily-built
1274
+ // reviewGatherer for derived mission/slice views; if the gatherer never
1275
+ // built, those scopes honestly return not-found rather than throwing.
1276
+ {
1277
+ const { TerminalService } = await import("./domain/terminal/terminal-service.js");
1278
+ const { HerdrAdapter } = await import("./domain/terminal/herdr-adapter.js");
1279
+ const { createHerdrSocketRpc, createHerdrSocketTransport } = await import("./domain/terminal/herdr-transport.js");
1280
+ const { CmuxProviderAdapter } = await import("./domain/terminal/cmux-provider-adapter.js");
1281
+ const { TerminalViewsStore } = await import("./domain/terminal/terminal-views-store.js");
1282
+ const { getNodeInventory } = await import("./domain/node-inventory.js");
1283
+ const { loadHostRegistry, resolveHost: resolveHostInRegistry } = await import("./domain/hosts/hosts-registry-reader.js");
1284
+ // NodeInventoryEntry → the composer's minimal LiveSeatRow (single-host
1285
+ // inventory: the canonical session name IS the tmux session; no host field).
1286
+ const toLiveSeatRow = (e) => ({
1287
+ canonicalSessionName: e.canonicalSessionName,
1288
+ attachmentType: e.attachmentType ?? null,
1289
+ tmuxSession: e.canonicalSessionName,
1290
+ rigName: e.rigName,
1291
+ logicalId: e.logicalId,
1292
+ });
1293
+ // Resolve a seat (canonical session name) → its rig + node, for the cmux facade.
1294
+ const resolveSeatNode = (seat) => {
1295
+ for (const rig of rigRepo.listRigs()) {
1296
+ for (const e of getNodeInventory(db, rig.id)) {
1297
+ if (e.canonicalSessionName === seat)
1298
+ return { rigId: rig.id, logicalId: e.logicalId };
1299
+ }
1300
+ }
1301
+ return null;
1302
+ };
1303
+ const herdrProvider = new HerdrAdapter({
1304
+ // FB4: herdr speaks its unix control socket (there is no `layout` CLI).
1305
+ transportFactory: createHerdrSocketTransport(createHerdrSocketRpc()),
1306
+ });
1307
+ const cmuxProvider = new CmuxProviderAdapter({ cmuxAdapter, nodeCmuxService, resolveSeatNode });
1308
+ const providerMap = {
1309
+ herdr: herdrProvider,
1310
+ cmux: cmuxProvider,
1311
+ };
1312
+ deps.terminalService = new TerminalService({
1313
+ resolveProvider: (name) => providerMap[name] ?? null,
1314
+ viewsStore: new TerminalViewsStore(),
1315
+ listRigSeats: (rigArg) => {
1316
+ const rigs = rigRepo.listRigs();
1317
+ const rig = rigs.find((r) => r.name === rigArg) ?? rigs.find((r) => r.id === rigArg);
1318
+ if (!rig)
1319
+ return null;
1320
+ return getNodeInventory(db, rig.id).map(toLiveSeatRow);
1321
+ },
1322
+ listPodSeats: (rigArg, pod) => {
1323
+ const rigs = rigRepo.listRigs();
1324
+ const rig = rigs.find((r) => r.name === rigArg) ?? rigs.find((r) => r.id === rigArg);
1325
+ if (!rig)
1326
+ return null;
1327
+ const rows = getNodeInventory(db, rig.id)
1328
+ .filter((e) => e.podNamespace === pod)
1329
+ .map(toLiveSeatRow);
1330
+ // No node carries that pod namespace → an unknown pod (not an empty view).
1331
+ return rows.length > 0 ? rows : null;
1332
+ },
1333
+ listScopeSeats: (scope) => {
1334
+ const gatherer = deps.reviewGatherer;
1335
+ if (!gatherer)
1336
+ return null;
1337
+ // N1 (dev44-driver2 pre-guard): cast to the real AgentsScope union (not
1338
+ // `never`) so the compile guard on the scope grammar is restored.
1339
+ const band = gatherer.composeAgents(scope);
1340
+ if (!band)
1341
+ return null;
1342
+ const wanted = new Set(band.rows.map((r) => r.sessionName));
1343
+ const rows = [];
1344
+ for (const rig of rigRepo.listRigs()) {
1345
+ for (const e of getNodeInventory(db, rig.id)) {
1346
+ if (e.canonicalSessionName && wanted.has(e.canonicalSessionName))
1347
+ rows.push(toLiveSeatRow(e));
1348
+ }
1349
+ }
1350
+ return rows;
1351
+ },
1352
+ listRigNames: () => rigRepo.listRigs().map((r) => r.name),
1353
+ resolveHost: (id) => {
1354
+ const res = loadHostRegistry();
1355
+ if (!res.ok)
1356
+ return null;
1357
+ const r = resolveHostInRegistry(res.registry, id);
1358
+ return r.ok ? r.host : null;
1359
+ },
1360
+ hasSession: (session) => tmuxAdapter.hasSession(session),
1361
+ });
1362
+ }
1183
1363
  // UI Enhancement Pack v0:
1184
1364
  // - file allowlist (item 3) from OPENRIG_FILES_ALLOWLIST
1185
1365
  // - atomic write service (item 4) wired only when allowlist non-empty
@@ -1270,7 +1450,13 @@ export async function createDaemon(opts) {
1270
1450
  // shared AgentActivityStore (constructed above, before the engine)
1271
1451
  // into one bounded wake. Wakes/flags only; cooldown via engine throttle.
1272
1452
  additionalPolicies: [
1273
- makeWorkflowKeepalivePolicy({ db }),
1453
+ makeWorkflowKeepalivePolicy({
1454
+ db,
1455
+ // OPR.0.4.6.WF5 FR-2 class (b): detection-time exception items,
1456
+ // dedup by occurrence; dial resolved via the runtime's cached
1457
+ // spec (never-lost fallback inside the helper).
1458
+ ensureStuckExceptionItem: workflowExceptionEnsurer,
1459
+ }),
1274
1460
  makeIdleGateQitemPolicy({ db, agentActivityStore }),
1275
1461
  ],
1276
1462
  });
@@ -1280,6 +1466,28 @@ export async function createDaemon(opts) {
1280
1466
  });
1281
1467
  deps.watchdogPolicyEngine = watchdogPolicyEngine;
1282
1468
  deps.watchdogScheduler = watchdogScheduler;
1469
+ // OPR.0.4.6.WF1 FR-4: the workflow startup resume sweep — re-arm
1470
+ // keepalives, reissue lost post-commit nudges (pending frontier
1471
+ // packets never nudged), surface stuck instances. Runs after the
1472
+ // watchdog + transport are wired so re-nudges actually deliver.
1473
+ // Failures are logged, never fatal: a sweep problem must not
1474
+ // bring the daemon down.
1475
+ if (workflowRuntime && queueRepoForWorkflow) {
1476
+ try {
1477
+ const { runWorkflowBootSweep } = await import("./domain/workflow-boot-sweep.js");
1478
+ await runWorkflowBootSweep({
1479
+ instanceStore: workflowRuntime.instanceStore,
1480
+ queueRepo: queueRepoForWorkflow,
1481
+ watchdogJobsRepo: watchdogJobsRepoInstance,
1482
+ log: (line) => console.log(line),
1483
+ // OPR.0.4.6.WF5 FR-2 class (b): the sweep leg of detection.
1484
+ ensureStuckExceptionItem: workflowExceptionEnsurer,
1485
+ });
1486
+ }
1487
+ catch (err) {
1488
+ console.warn(`workflow boot sweep: failed (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
1489
+ }
1490
+ }
1283
1491
  }
1284
1492
  // Context monitor — constructed before createApp so routes can access pollOnce for refresh.
1285
1493
  // Caller (index.ts) starts polling after listen.
@@ -1294,6 +1502,7 @@ export async function createDaemon(opts) {
1294
1502
  const contextMonitor = new ContextMonitor(db, contextUsageStore, claudeAdapter, compactionEnforcer, {
1295
1503
  "claude-code": claudeAdapter,
1296
1504
  codex: codexAdapter,
1505
+ pi: piAdapter,
1297
1506
  });
1298
1507
  deps.contextMonitor = contextMonitor;
1299
1508
  // OPR.0.4.3.14 — expose the SAME enforcer instance to routes for the manual