@openrig/cli 0.4.2 → 0.4.4

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 (499) hide show
  1. package/daemon/assets/guidance/openrig-start.md +6 -0
  2. package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +42 -2
  3. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +115 -0
  4. package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +12 -12
  5. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +46 -0
  6. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  7. package/daemon/dist/adapters/codex-runtime-adapter.js +167 -3
  8. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  9. package/daemon/dist/adapters/tmux.d.ts +31 -0
  10. package/daemon/dist/adapters/tmux.d.ts.map +1 -1
  11. package/daemon/dist/adapters/tmux.js +62 -0
  12. package/daemon/dist/adapters/tmux.js.map +1 -1
  13. package/daemon/dist/build-info.d.ts +12 -0
  14. package/daemon/dist/build-info.d.ts.map +1 -0
  15. package/daemon/dist/build-info.js +11 -0
  16. package/daemon/dist/build-info.js.map +1 -0
  17. package/daemon/dist/db/migrations/045_resume_verification.d.ts +29 -0
  18. package/daemon/dist/db/migrations/045_resume_verification.d.ts.map +1 -0
  19. package/daemon/dist/db/migrations/045_resume_verification.js +34 -0
  20. package/daemon/dist/db/migrations/045_resume_verification.js.map +1 -0
  21. package/daemon/dist/db/migrations/046_seat_identity_verdicts.d.ts +41 -0
  22. package/daemon/dist/db/migrations/046_seat_identity_verdicts.d.ts.map +1 -0
  23. package/daemon/dist/db/migrations/046_seat_identity_verdicts.js +56 -0
  24. package/daemon/dist/db/migrations/046_seat_identity_verdicts.js.map +1 -0
  25. package/daemon/dist/db/migrations/047_events_node_type_index.d.ts +48 -0
  26. package/daemon/dist/db/migrations/047_events_node_type_index.d.ts.map +1 -0
  27. package/daemon/dist/db/migrations/047_events_node_type_index.js +52 -0
  28. package/daemon/dist/db/migrations/047_events_node_type_index.js.map +1 -0
  29. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.d.ts +18 -0
  30. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.d.ts.map +1 -0
  31. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.js +22 -0
  32. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.js.map +1 -0
  33. package/daemon/dist/domain/activity-endpoint.d.ts +25 -0
  34. package/daemon/dist/domain/activity-endpoint.d.ts.map +1 -0
  35. package/daemon/dist/domain/activity-endpoint.js +91 -0
  36. package/daemon/dist/domain/activity-endpoint.js.map +1 -0
  37. package/daemon/dist/domain/claim-service.d.ts +36 -0
  38. package/daemon/dist/domain/claim-service.d.ts.map +1 -1
  39. package/daemon/dist/domain/claim-service.js +90 -0
  40. package/daemon/dist/domain/claim-service.js.map +1 -1
  41. package/daemon/dist/domain/claude-compaction-enforcer.d.ts +57 -0
  42. package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
  43. package/daemon/dist/domain/claude-compaction-enforcer.js +149 -3
  44. package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
  45. package/daemon/dist/domain/event-loop-monitor.d.ts +100 -0
  46. package/daemon/dist/domain/event-loop-monitor.d.ts.map +1 -0
  47. package/daemon/dist/domain/event-loop-monitor.js +127 -0
  48. package/daemon/dist/domain/event-loop-monitor.js.map +1 -0
  49. package/daemon/dist/domain/feed/attention-aggregator.d.ts +31 -0
  50. package/daemon/dist/domain/feed/attention-aggregator.d.ts.map +1 -0
  51. package/daemon/dist/domain/feed/attention-aggregator.js +119 -0
  52. package/daemon/dist/domain/feed/attention-aggregator.js.map +1 -0
  53. package/daemon/dist/domain/files/file-write-service.d.ts +11 -2
  54. package/daemon/dist/domain/files/file-write-service.d.ts.map +1 -1
  55. package/daemon/dist/domain/files/file-write-service.js +77 -0
  56. package/daemon/dist/domain/files/file-write-service.js.map +1 -1
  57. package/daemon/dist/domain/gate-predicate.d.ts +29 -0
  58. package/daemon/dist/domain/gate-predicate.d.ts.map +1 -0
  59. package/daemon/dist/domain/gate-predicate.js +73 -0
  60. package/daemon/dist/domain/gate-predicate.js.map +1 -0
  61. package/daemon/dist/domain/graph-projection.d.ts +7 -1
  62. package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
  63. package/daemon/dist/domain/graph-projection.js +19 -1
  64. package/daemon/dist/domain/graph-projection.js.map +1 -1
  65. package/daemon/dist/domain/hosts/fanout-contract.d.ts +33 -0
  66. package/daemon/dist/domain/hosts/fanout-contract.d.ts.map +1 -0
  67. package/daemon/dist/domain/hosts/fanout-contract.js +23 -0
  68. package/daemon/dist/domain/hosts/fanout-contract.js.map +1 -0
  69. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +49 -0
  70. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -0
  71. package/daemon/dist/domain/hosts/hosts-registry-reader.js +165 -0
  72. package/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -0
  73. package/daemon/dist/domain/hosts/remote-daemon-http.d.ts +35 -0
  74. package/daemon/dist/domain/hosts/remote-daemon-http.d.ts.map +1 -0
  75. package/daemon/dist/domain/hosts/remote-daemon-http.js +105 -0
  76. package/daemon/dist/domain/hosts/remote-daemon-http.js.map +1 -0
  77. package/daemon/dist/domain/human-route-enforcer.d.ts +71 -0
  78. package/daemon/dist/domain/human-route-enforcer.d.ts.map +1 -0
  79. package/daemon/dist/domain/human-route-enforcer.js +80 -0
  80. package/daemon/dist/domain/human-route-enforcer.js.map +1 -0
  81. package/daemon/dist/domain/mission-control/audit-browse.d.ts +8 -0
  82. package/daemon/dist/domain/mission-control/audit-browse.d.ts.map +1 -1
  83. package/daemon/dist/domain/mission-control/audit-browse.js +19 -0
  84. package/daemon/dist/domain/mission-control/audit-browse.js.map +1 -1
  85. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts +1 -1
  86. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts.map +1 -1
  87. package/daemon/dist/domain/mission-control/mission-control-action-log.js +4 -0
  88. package/daemon/dist/domain/mission-control/mission-control-action-log.js.map +1 -1
  89. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js +1 -1
  90. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js.map +1 -1
  91. package/daemon/dist/domain/mission-control/mission-control-read-layer.js +1 -1
  92. package/daemon/dist/domain/mission-control/mission-control-read-layer.js.map +1 -1
  93. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts +28 -0
  94. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -1
  95. package/daemon/dist/domain/mission-control/mission-control-write-contract.js +125 -0
  96. package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
  97. package/daemon/dist/domain/node-inventory.d.ts +7 -1
  98. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  99. package/daemon/dist/domain/node-inventory.js +84 -5
  100. package/daemon/dist/domain/node-inventory.js.map +1 -1
  101. package/daemon/dist/domain/periodic-snapshot-scheduler.d.ts +4 -0
  102. package/daemon/dist/domain/periodic-snapshot-scheduler.d.ts.map +1 -1
  103. package/daemon/dist/domain/periodic-snapshot-scheduler.js +11 -0
  104. package/daemon/dist/domain/periodic-snapshot-scheduler.js.map +1 -1
  105. package/daemon/dist/domain/policies/idle-gate-qitem.d.ts +14 -0
  106. package/daemon/dist/domain/policies/idle-gate-qitem.d.ts.map +1 -0
  107. package/daemon/dist/domain/policies/idle-gate-qitem.js +114 -0
  108. package/daemon/dist/domain/policies/idle-gate-qitem.js.map +1 -0
  109. package/daemon/dist/domain/ps-projection.d.ts +28 -1
  110. package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
  111. package/daemon/dist/domain/ps-projection.js +39 -0
  112. package/daemon/dist/domain/ps-projection.js.map +1 -1
  113. package/daemon/dist/domain/queue-repository.d.ts +25 -1
  114. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  115. package/daemon/dist/domain/queue-repository.js +111 -7
  116. package/daemon/dist/domain/queue-repository.js.map +1 -1
  117. package/daemon/dist/domain/restore-orchestrator.d.ts +8 -0
  118. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  119. package/daemon/dist/domain/restore-orchestrator.js +109 -27
  120. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  121. package/daemon/dist/domain/restore-plan-preview.d.ts +25 -1
  122. package/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
  123. package/daemon/dist/domain/restore-plan-preview.js +72 -4
  124. package/daemon/dist/domain/restore-plan-preview.js.map +1 -1
  125. package/daemon/dist/domain/resume-metadata-refresher.d.ts +44 -2
  126. package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
  127. package/daemon/dist/domain/resume-metadata-refresher.js +92 -6
  128. package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
  129. package/daemon/dist/domain/resume-token-capture.d.ts +50 -0
  130. package/daemon/dist/domain/resume-token-capture.d.ts.map +1 -0
  131. package/daemon/dist/domain/resume-token-capture.js +63 -0
  132. package/daemon/dist/domain/resume-token-capture.js.map +1 -0
  133. package/daemon/dist/domain/review/brief-spine.d.ts +19 -0
  134. package/daemon/dist/domain/review/brief-spine.d.ts.map +1 -0
  135. package/daemon/dist/domain/review/brief-spine.js +86 -0
  136. package/daemon/dist/domain/review/brief-spine.js.map +1 -0
  137. package/daemon/dist/domain/review/compose.d.ts +228 -0
  138. package/daemon/dist/domain/review/compose.d.ts.map +1 -0
  139. package/daemon/dist/domain/review/compose.js +773 -0
  140. package/daemon/dist/domain/review/compose.js.map +1 -0
  141. package/daemon/dist/domain/review/freeze.d.ts +31 -0
  142. package/daemon/dist/domain/review/freeze.d.ts.map +1 -0
  143. package/daemon/dist/domain/review/freeze.js +257 -0
  144. package/daemon/dist/domain/review/freeze.js.map +1 -0
  145. package/daemon/dist/domain/review/gather.d.ts +100 -0
  146. package/daemon/dist/domain/review/gather.d.ts.map +1 -0
  147. package/daemon/dist/domain/review/gather.js +676 -0
  148. package/daemon/dist/domain/review/gather.js.map +1 -0
  149. package/daemon/dist/domain/review/types.d.ts +258 -0
  150. package/daemon/dist/domain/review/types.d.ts.map +1 -0
  151. package/daemon/dist/domain/review/types.js +35 -0
  152. package/daemon/dist/domain/review/types.js.map +1 -0
  153. package/daemon/dist/domain/rig-status-compose.d.ts +62 -0
  154. package/daemon/dist/domain/rig-status-compose.d.ts.map +1 -0
  155. package/daemon/dist/domain/rig-status-compose.js +149 -0
  156. package/daemon/dist/domain/rig-status-compose.js.map +1 -0
  157. package/daemon/dist/domain/rig-teardown.d.ts +3 -1
  158. package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
  159. package/daemon/dist/domain/rig-teardown.js +4 -19
  160. package/daemon/dist/domain/rig-teardown.js.map +1 -1
  161. package/daemon/dist/domain/route-timing-recorder.d.ts +42 -0
  162. package/daemon/dist/domain/route-timing-recorder.d.ts.map +1 -0
  163. package/daemon/dist/domain/route-timing-recorder.js +62 -0
  164. package/daemon/dist/domain/route-timing-recorder.js.map +1 -0
  165. package/daemon/dist/domain/scope/scope-approve.d.ts +64 -0
  166. package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -0
  167. package/daemon/dist/domain/scope/scope-approve.js +153 -0
  168. package/daemon/dist/domain/scope/scope-approve.js.map +1 -0
  169. package/daemon/dist/domain/scope/scope-audit.d.ts +11 -1
  170. package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  171. package/daemon/dist/domain/scope/scope-audit.js +203 -2
  172. package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  173. package/daemon/dist/domain/seat-handover-service.d.ts +50 -7
  174. package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
  175. package/daemon/dist/domain/seat-handover-service.js +273 -33
  176. package/daemon/dist/domain/seat-handover-service.js.map +1 -1
  177. package/daemon/dist/domain/seat-identity-reconciler.d.ts +59 -0
  178. package/daemon/dist/domain/seat-identity-reconciler.d.ts.map +1 -0
  179. package/daemon/dist/domain/seat-identity-reconciler.js +207 -0
  180. package/daemon/dist/domain/seat-identity-reconciler.js.map +1 -0
  181. package/daemon/dist/domain/seat-identity-store.d.ts +27 -0
  182. package/daemon/dist/domain/seat-identity-store.d.ts.map +1 -0
  183. package/daemon/dist/domain/seat-identity-store.js +106 -0
  184. package/daemon/dist/domain/seat-identity-store.js.map +1 -0
  185. package/daemon/dist/domain/seat-switch-client-service.d.ts +57 -0
  186. package/daemon/dist/domain/seat-switch-client-service.d.ts.map +1 -0
  187. package/daemon/dist/domain/seat-switch-client-service.js +168 -0
  188. package/daemon/dist/domain/seat-switch-client-service.js.map +1 -0
  189. package/daemon/dist/domain/self-attach-service.d.ts +8 -0
  190. package/daemon/dist/domain/self-attach-service.d.ts.map +1 -1
  191. package/daemon/dist/domain/self-attach-service.js +20 -7
  192. package/daemon/dist/domain/self-attach-service.js.map +1 -1
  193. package/daemon/dist/domain/session-registry.d.ts +35 -4
  194. package/daemon/dist/domain/session-registry.d.ts.map +1 -1
  195. package/daemon/dist/domain/session-registry.js +89 -10
  196. package/daemon/dist/domain/session-registry.js.map +1 -1
  197. package/daemon/dist/domain/session-transport.d.ts +8 -1
  198. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  199. package/daemon/dist/domain/session-transport.js +143 -37
  200. package/daemon/dist/domain/session-transport.js.map +1 -1
  201. package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
  202. package/daemon/dist/domain/startup-orchestrator.js +34 -2
  203. package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
  204. package/daemon/dist/domain/startup-proof.d.ts +63 -0
  205. package/daemon/dist/domain/startup-proof.d.ts.map +1 -0
  206. package/daemon/dist/domain/startup-proof.js +165 -0
  207. package/daemon/dist/domain/startup-proof.js.map +1 -0
  208. package/daemon/dist/domain/successor-session-launcher.d.ts +103 -0
  209. package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -0
  210. package/daemon/dist/domain/successor-session-launcher.js +246 -0
  211. package/daemon/dist/domain/successor-session-launcher.js.map +1 -0
  212. package/daemon/dist/domain/topology/multi-rig-launcher.d.ts +49 -0
  213. package/daemon/dist/domain/topology/multi-rig-launcher.d.ts.map +1 -0
  214. package/daemon/dist/domain/topology/multi-rig-launcher.js +132 -0
  215. package/daemon/dist/domain/topology/multi-rig-launcher.js.map +1 -0
  216. package/daemon/dist/domain/topology/remote-up-leaf.d.ts +29 -0
  217. package/daemon/dist/domain/topology/remote-up-leaf.d.ts.map +1 -0
  218. package/daemon/dist/domain/topology/remote-up-leaf.js +60 -0
  219. package/daemon/dist/domain/topology/remote-up-leaf.js.map +1 -0
  220. package/daemon/dist/domain/topology/topology-manifest.d.ts +34 -0
  221. package/daemon/dist/domain/topology/topology-manifest.d.ts.map +1 -0
  222. package/daemon/dist/domain/topology/topology-manifest.js +195 -0
  223. package/daemon/dist/domain/topology/topology-manifest.js.map +1 -0
  224. package/daemon/dist/domain/types.d.ts +86 -0
  225. package/daemon/dist/domain/types.d.ts.map +1 -1
  226. package/daemon/dist/domain/types.js +8 -0
  227. package/daemon/dist/domain/types.js.map +1 -1
  228. package/daemon/dist/domain/up-command-router.d.ts +1 -1
  229. package/daemon/dist/domain/up-command-router.d.ts.map +1 -1
  230. package/daemon/dist/domain/up-command-router.js +34 -2
  231. package/daemon/dist/domain/up-command-router.js.map +1 -1
  232. package/daemon/dist/domain/user-settings/settings-store.d.ts +17 -0
  233. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  234. package/daemon/dist/domain/user-settings/settings-store.js +109 -0
  235. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  236. package/daemon/dist/domain/watchdog-jobs-repository.d.ts +2 -2
  237. package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
  238. package/daemon/dist/domain/watchdog-jobs-repository.js +4 -0
  239. package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
  240. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  241. package/daemon/dist/domain/watchdog-policy-engine.js +19 -0
  242. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  243. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
  244. package/daemon/dist/domain/workspace/default-workspace-scaffold.js +51 -6
  245. package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
  246. package/daemon/dist/domain/workspace/workspace-doctor.d.ts +11 -0
  247. package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
  248. package/daemon/dist/domain/workspace/workspace-doctor.js +82 -0
  249. package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
  250. package/daemon/dist/index.d.ts.map +1 -1
  251. package/daemon/dist/index.js +18 -1
  252. package/daemon/dist/index.js.map +1 -1
  253. package/daemon/dist/routes/activity.d.ts.map +1 -1
  254. package/daemon/dist/routes/activity.js +26 -0
  255. package/daemon/dist/routes/activity.js.map +1 -1
  256. package/daemon/dist/routes/agent-images.d.ts.map +1 -1
  257. package/daemon/dist/routes/agent-images.js +139 -0
  258. package/daemon/dist/routes/agent-images.js.map +1 -1
  259. package/daemon/dist/routes/compaction.d.ts +17 -0
  260. package/daemon/dist/routes/compaction.d.ts.map +1 -0
  261. package/daemon/dist/routes/compaction.js +125 -0
  262. package/daemon/dist/routes/compaction.js.map +1 -0
  263. package/daemon/dist/routes/config.d.ts.map +1 -1
  264. package/daemon/dist/routes/config.js +15 -6
  265. package/daemon/dist/routes/config.js.map +1 -1
  266. package/daemon/dist/routes/files.d.ts.map +1 -1
  267. package/daemon/dist/routes/files.js +45 -1
  268. package/daemon/dist/routes/files.js.map +1 -1
  269. package/daemon/dist/routes/mission-control.d.ts.map +1 -1
  270. package/daemon/dist/routes/mission-control.js +67 -2
  271. package/daemon/dist/routes/mission-control.js.map +1 -1
  272. package/daemon/dist/routes/queue.d.ts +8 -2
  273. package/daemon/dist/routes/queue.d.ts.map +1 -1
  274. package/daemon/dist/routes/queue.js +44 -4
  275. package/daemon/dist/routes/queue.js.map +1 -1
  276. package/daemon/dist/routes/restore-check.d.ts +10 -0
  277. package/daemon/dist/routes/restore-check.d.ts.map +1 -1
  278. package/daemon/dist/routes/restore-check.js +46 -37
  279. package/daemon/dist/routes/restore-check.js.map +1 -1
  280. package/daemon/dist/routes/review.d.ts +3 -0
  281. package/daemon/dist/routes/review.d.ts.map +1 -0
  282. package/daemon/dist/routes/review.js +169 -0
  283. package/daemon/dist/routes/review.js.map +1 -0
  284. package/daemon/dist/routes/rigs.d.ts.map +1 -1
  285. package/daemon/dist/routes/rigs.js +70 -1
  286. package/daemon/dist/routes/rigs.js.map +1 -1
  287. package/daemon/dist/routes/scope-approve.d.ts +3 -0
  288. package/daemon/dist/routes/scope-approve.d.ts.map +1 -0
  289. package/daemon/dist/routes/scope-approve.js +55 -0
  290. package/daemon/dist/routes/scope-approve.js.map +1 -0
  291. package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
  292. package/daemon/dist/routes/scope-audit.js +28 -1
  293. package/daemon/dist/routes/scope-audit.js.map +1 -1
  294. package/daemon/dist/routes/seat.d.ts.map +1 -1
  295. package/daemon/dist/routes/seat.js +53 -2
  296. package/daemon/dist/routes/seat.js.map +1 -1
  297. package/daemon/dist/routes/sessions.d.ts.map +1 -1
  298. package/daemon/dist/routes/sessions.js +44 -9
  299. package/daemon/dist/routes/sessions.js.map +1 -1
  300. package/daemon/dist/routes/slices.d.ts.map +1 -1
  301. package/daemon/dist/routes/slices.js +49 -9
  302. package/daemon/dist/routes/slices.js.map +1 -1
  303. package/daemon/dist/routes/snapshots.d.ts.map +1 -1
  304. package/daemon/dist/routes/snapshots.js +16 -1
  305. package/daemon/dist/routes/snapshots.js.map +1 -1
  306. package/daemon/dist/routes/terminal-ws.d.ts.map +1 -1
  307. package/daemon/dist/routes/terminal-ws.js +58 -21
  308. package/daemon/dist/routes/terminal-ws.js.map +1 -1
  309. package/daemon/dist/routes/transport.d.ts.map +1 -1
  310. package/daemon/dist/routes/transport.js +12 -5
  311. package/daemon/dist/routes/transport.js.map +1 -1
  312. package/daemon/dist/routes/up.d.ts.map +1 -1
  313. package/daemon/dist/routes/up.js +84 -0
  314. package/daemon/dist/routes/up.js.map +1 -1
  315. package/daemon/dist/routes/workspace.js +2 -2
  316. package/daemon/dist/server.d.ts +33 -0
  317. package/daemon/dist/server.d.ts.map +1 -1
  318. package/daemon/dist/server.js +41 -1
  319. package/daemon/dist/server.js.map +1 -1
  320. package/daemon/dist/startup.d.ts +1 -0
  321. package/daemon/dist/startup.d.ts.map +1 -1
  322. package/daemon/dist/startup.js +108 -20
  323. package/daemon/dist/startup.js.map +1 -1
  324. package/daemon/docs/reference/agent-startup-guide.md +1 -1
  325. package/daemon/docs/reference/product-factory-vps-runbook.md +132 -0
  326. package/daemon/docs/reference/sdlc-conventions.md +187 -0
  327. package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -1
  328. package/daemon/specs/agents/conveyor/builder/guidance/role.md +1 -0
  329. package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -1
  330. package/daemon/specs/agents/conveyor/lead/guidance/role.md +1 -0
  331. package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -1
  332. package/daemon/specs/agents/conveyor/planner/guidance/role.md +1 -0
  333. package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -1
  334. package/daemon/specs/agents/conveyor/reviewer/guidance/role.md +1 -0
  335. package/daemon/specs/agents/design/product-designer/agent.yaml +1 -1
  336. package/daemon/specs/agents/design/product-designer/guidance/role.md +1 -0
  337. package/daemon/specs/agents/development/implementer/agent.yaml +1 -1
  338. package/daemon/specs/agents/development/implementer/guidance/role.md +1 -0
  339. package/daemon/specs/agents/development/qa/agent.yaml +1 -1
  340. package/daemon/specs/agents/development/qa/guidance/role.md +1 -0
  341. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -1
  342. package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +1 -0
  343. package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
  344. package/daemon/specs/agents/product-management/pm/guidance/role.md +13 -0
  345. package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -1
  346. package/daemon/specs/agents/review/independent-reviewer/guidance/role.md +1 -0
  347. package/daemon/specs/agents/shared/agent.yaml +2 -0
  348. package/daemon/specs/agents/shared/skills/core/mission-slice-sop/SKILL.md +115 -0
  349. package/daemon/specs/agents/shared/skills/core/openrig-operator/SKILL.md +4 -4
  350. package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +69 -23
  351. package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +3 -3
  352. package/daemon/specs/rigs/focused/pm-team/CULTURE.md +4 -0
  353. package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +1 -1
  354. package/daemon/specs/rigs/launch/kernel/agents/operator/agent/startup/context.md +1 -1
  355. package/daemon/specs/rigs/preview/product-team/CULTURE.md +4 -0
  356. package/dist/build-info.d.ts +8 -0
  357. package/dist/build-info.d.ts.map +1 -0
  358. package/dist/build-info.js +11 -0
  359. package/dist/build-info.js.map +1 -0
  360. package/dist/commands/compact.d.ts +15 -0
  361. package/dist/commands/compact.d.ts.map +1 -0
  362. package/dist/commands/compact.js +62 -0
  363. package/dist/commands/compact.js.map +1 -0
  364. package/dist/commands/config-init-workspace.d.ts.map +1 -1
  365. package/dist/commands/config-init-workspace.js +20 -4
  366. package/dist/commands/config-init-workspace.js.map +1 -1
  367. package/dist/commands/daemon.d.ts.map +1 -1
  368. package/dist/commands/daemon.js +18 -2
  369. package/dist/commands/daemon.js.map +1 -1
  370. package/dist/commands/doctor.js +2 -2
  371. package/dist/commands/doctor.js.map +1 -1
  372. package/dist/commands/expand.js +1 -1
  373. package/dist/commands/expand.js.map +1 -1
  374. package/dist/commands/file.d.ts +7 -0
  375. package/dist/commands/file.d.ts.map +1 -0
  376. package/dist/commands/file.js +77 -0
  377. package/dist/commands/file.js.map +1 -0
  378. package/dist/commands/fork.d.ts +4 -0
  379. package/dist/commands/fork.d.ts.map +1 -0
  380. package/dist/commands/fork.js +101 -0
  381. package/dist/commands/fork.js.map +1 -0
  382. package/dist/commands/host.d.ts +34 -0
  383. package/dist/commands/host.d.ts.map +1 -0
  384. package/dist/commands/host.js +448 -0
  385. package/dist/commands/host.js.map +1 -0
  386. package/dist/commands/launch.d.ts.map +1 -1
  387. package/dist/commands/launch.js +34 -4
  388. package/dist/commands/launch.js.map +1 -1
  389. package/dist/commands/proof.d.ts +54 -0
  390. package/dist/commands/proof.d.ts.map +1 -0
  391. package/dist/commands/proof.js +311 -0
  392. package/dist/commands/proof.js.map +1 -0
  393. package/dist/commands/ps.d.ts +41 -7
  394. package/dist/commands/ps.d.ts.map +1 -1
  395. package/dist/commands/ps.js +357 -135
  396. package/dist/commands/ps.js.map +1 -1
  397. package/dist/commands/queue.d.ts +6 -0
  398. package/dist/commands/queue.d.ts.map +1 -1
  399. package/dist/commands/queue.js +154 -4
  400. package/dist/commands/queue.js.map +1 -1
  401. package/dist/commands/reconcile-session.d.ts.map +1 -1
  402. package/dist/commands/reconcile-session.js +2 -2
  403. package/dist/commands/reconcile-session.js.map +1 -1
  404. package/dist/commands/restore-check.d.ts.map +1 -1
  405. package/dist/commands/restore-check.js +93 -0
  406. package/dist/commands/restore-check.js.map +1 -1
  407. package/dist/commands/scope.d.ts.map +1 -1
  408. package/dist/commands/scope.js +191 -4
  409. package/dist/commands/scope.js.map +1 -1
  410. package/dist/commands/seat.d.ts +17 -0
  411. package/dist/commands/seat.d.ts.map +1 -1
  412. package/dist/commands/seat.js +145 -32
  413. package/dist/commands/seat.js.map +1 -1
  414. package/dist/commands/send.d.ts.map +1 -1
  415. package/dist/commands/send.js +161 -11
  416. package/dist/commands/send.js.map +1 -1
  417. package/dist/commands/start.d.ts +5 -0
  418. package/dist/commands/start.d.ts.map +1 -1
  419. package/dist/commands/start.js.map +1 -1
  420. package/dist/commands/startup-proof.d.ts +24 -0
  421. package/dist/commands/startup-proof.d.ts.map +1 -0
  422. package/dist/commands/startup-proof.js +100 -0
  423. package/dist/commands/startup-proof.js.map +1 -0
  424. package/dist/commands/unclaim.js +2 -2
  425. package/dist/commands/unclaim.js.map +1 -1
  426. package/dist/commands/up.d.ts +2 -0
  427. package/dist/commands/up.d.ts.map +1 -1
  428. package/dist/commands/up.js +79 -2
  429. package/dist/commands/up.js.map +1 -1
  430. package/dist/commands/watchdog.js +2 -2
  431. package/dist/commands/watchdog.js.map +1 -1
  432. package/dist/commands/workspace.js +6 -6
  433. package/dist/commands/workspace.js.map +1 -1
  434. package/dist/config-store.d.ts +4 -0
  435. package/dist/config-store.d.ts.map +1 -1
  436. package/dist/config-store.js +68 -0
  437. package/dist/config-store.js.map +1 -1
  438. package/dist/cross-host-executor.d.ts +1 -0
  439. package/dist/cross-host-executor.d.ts.map +1 -1
  440. package/dist/cross-host-executor.js +4 -1
  441. package/dist/cross-host-executor.js.map +1 -1
  442. package/dist/daemon-lifecycle.d.ts +23 -0
  443. package/dist/daemon-lifecycle.d.ts.map +1 -1
  444. package/dist/daemon-lifecycle.js +54 -6
  445. package/dist/daemon-lifecycle.js.map +1 -1
  446. package/dist/host-registry.d.ts +9 -0
  447. package/dist/host-registry.d.ts.map +1 -1
  448. package/dist/host-registry.js +32 -2
  449. package/dist/host-registry.js.map +1 -1
  450. package/dist/index.d.ts +5 -0
  451. package/dist/index.d.ts.map +1 -1
  452. package/dist/index.js +15 -1
  453. package/dist/index.js.map +1 -1
  454. package/dist/lib/codex-auth.d.ts +24 -0
  455. package/dist/lib/codex-auth.d.ts.map +1 -1
  456. package/dist/lib/codex-auth.js +89 -17
  457. package/dist/lib/codex-auth.js.map +1 -1
  458. package/dist/lib/file-transfer.d.ts +89 -0
  459. package/dist/lib/file-transfer.d.ts.map +1 -0
  460. package/dist/lib/file-transfer.js +300 -0
  461. package/dist/lib/file-transfer.js.map +1 -0
  462. package/dist/lib/hosts/fanout-contract.d.ts +33 -0
  463. package/dist/lib/hosts/fanout-contract.d.ts.map +1 -0
  464. package/dist/lib/hosts/fanout-contract.js +23 -0
  465. package/dist/lib/hosts/fanout-contract.js.map +1 -0
  466. package/dist/lib/scope/scope-audit.d.ts +11 -1
  467. package/dist/lib/scope/scope-audit.d.ts.map +1 -1
  468. package/dist/lib/scope/scope-audit.js +203 -2
  469. package/dist/lib/scope/scope-audit.js.map +1 -1
  470. package/dist/lib/scope/templates.d.ts +1 -0
  471. package/dist/lib/scope/templates.d.ts.map +1 -1
  472. package/dist/lib/scope/templates.js +9 -0
  473. package/dist/lib/scope/templates.js.map +1 -1
  474. package/dist/lib/scope-templates/backlog-deprecation.md +16 -0
  475. package/dist/lib/scope-templates/backlog-tech-debt.md +16 -0
  476. package/dist/lib/scope-templates/bug-fix.md +16 -0
  477. package/dist/lib/scope-templates/implementation-prd.md +33 -0
  478. package/dist/lib/scope-templates/mission-placeholder.md +41 -0
  479. package/dist/lib/scope-templates/mission-progress.md +2 -0
  480. package/dist/lib/scope-templates/mission-release.md +41 -0
  481. package/dist/lib/scope-templates/placeholder.md +12 -4
  482. package/dist/lib/scope-templates/proof.md +6 -0
  483. package/dist/lib/scope-templates/release-feature.md +14 -6
  484. package/dist/lib/scope-templates/research.md +16 -0
  485. package/dist/lib/scope-templates/slice-progress.md +2 -0
  486. package/dist/openrig-compat.d.ts +19 -0
  487. package/dist/openrig-compat.d.ts.map +1 -1
  488. package/dist/openrig-compat.js +31 -1
  489. package/dist/openrig-compat.js.map +1 -1
  490. package/dist/version.d.ts +5 -0
  491. package/dist/version.d.ts.map +1 -1
  492. package/dist/version.js +11 -1
  493. package/dist/version.js.map +1 -1
  494. package/package.json +1 -1
  495. package/ui/dist/assets/index-D69ZhNIr.js +598 -0
  496. package/ui/dist/assets/index-DJYun-8d.css +32 -0
  497. package/ui/dist/index.html +23 -2
  498. package/ui/dist/assets/index-CnqRX7A3.css +0 -32
  499. package/ui/dist/assets/index-CtL9jXFt.js +0 -582
@@ -0,0 +1,132 @@
1
+ // OPR.0.4.4.11 — MultiRigLauncher: the THIN walker (FR-3/FR-4/FR-5).
2
+ //
3
+ // It INVOKES the existing single-rig leaves — it never re-implements stages,
4
+ // locks, provenance, or result shapes. A local entry runs through the SAME
5
+ // public bootstrap() entry + tryAcquire/release lock pair routes/up.ts uses
6
+ // (guard G-2: the per-sourceRef lock is ROUTE-side today — bootstrap() never
7
+ // acquires; the launcher explicitly participates in that same lock set,
8
+ // acquire before the leaf, release in finally on success AND failure). A
9
+ // host-placed entry runs through the shipped remote POST /api/up leaf. Both
10
+ // leaves are injected so this module stays testable and the wiring in
11
+ // routes/up.ts (the ONLY production caller) binds the real seams.
12
+ //
13
+ // Aggregate contract (arch ruling 5, verbatim): status is the CLOSED enum
14
+ // {ok | failed | skipped}; entries after the failed one report `skipped`
15
+ // EXPLICITLY (never absent — omission-proof); `host` is present uniformly on
16
+ // every entry (the literal "local" for local entries); overall success =
17
+ // every entry ok. Stop-on-failure is the ONLY v0 behavior (FR-5): no new
18
+ // entry starts after a failure; already-started rigs are reported honestly
19
+ // (mixed state, no rollback ceremony).
20
+ import { resolvePlacementHost } from "../hosts/hosts-registry-reader.js";
21
+ /** Mirrors the route's 409 lock-conflict semantics for a topology entry. */
22
+ const LOCK_CONFLICT_ERROR = "Already in progress for this source (conflict): a concurrent up holds this rig's launch lock";
23
+ export class MultiRigLauncher {
24
+ deps;
25
+ constructor(deps) {
26
+ this.deps = deps;
27
+ }
28
+ async launch(manifest) {
29
+ const entries = manifest.rigs;
30
+ // Every entry starts explicitly skipped — an entry the walk never
31
+ // reaches is REPORTED, not absent (omission-proof aggregate).
32
+ const results = entries.map((e) => ({
33
+ rigRef: e.source,
34
+ host: e.host ?? "local",
35
+ status: "skipped",
36
+ }));
37
+ // ── Pre-launch placement validation (FR-1/FR-4: per-entry structured
38
+ // errors BEFORE any launch attempt). Registry is read once, only if a
39
+ // host-placed entry exists. Any placement failure aborts the whole run
40
+ // before the first leaf call: bad entries report failed, the rest stay
41
+ // skipped.
42
+ const placed = new Map();
43
+ if (entries.some((e) => e.host !== undefined)) {
44
+ const reg = this.deps.loadRegistry();
45
+ let placementFailed = false;
46
+ for (let i = 0; i < entries.length; i++) {
47
+ const hostId = entries[i].host;
48
+ if (hostId === undefined)
49
+ continue;
50
+ if (!reg.ok) {
51
+ results[i] = { ...results[i], status: "failed", error: reg.error };
52
+ placementFailed = true;
53
+ continue;
54
+ }
55
+ const res = resolvePlacementHost(reg.registry, hostId);
56
+ if (!res.ok) {
57
+ results[i] = { ...results[i], status: "failed", error: res.error };
58
+ placementFailed = true;
59
+ }
60
+ else {
61
+ placed.set(i, res.host);
62
+ }
63
+ }
64
+ if (placementFailed)
65
+ return { ok: false, entries: results };
66
+ }
67
+ // ── Staged walk: entries START in manifest order under the fixed cap
68
+ // (default 1 = strictly sequential); a failure stops all further starts
69
+ // while in-flight entries complete and report honestly.
70
+ let nextIndex = 0;
71
+ let stopped = false;
72
+ const runEntry = async (i) => {
73
+ const entry = entries[i];
74
+ const hostEntry = placed.get(i);
75
+ try {
76
+ if (hostEntry) {
77
+ const res = await this.deps.launchRemote(entry.source, hostEntry);
78
+ results[i] = {
79
+ rigRef: entry.source,
80
+ host: hostEntry.id,
81
+ status: res.ok ? "ok" : "failed",
82
+ ...(res.ok ? {} : { error: res.error ?? "remote up failed" }),
83
+ };
84
+ return;
85
+ }
86
+ // Local: the route-side lock discipline, explicitly (guard G-2).
87
+ // Lock key and launch ref are the SAME resolved string (guard F1) —
88
+ // the aggregate's rigRef stays the raw manifest string for display.
89
+ const launchRef = this.deps.resolveLocalRef ? this.deps.resolveLocalRef(entry.source) : entry.source;
90
+ if (!this.deps.tryAcquire(launchRef)) {
91
+ results[i] = { rigRef: entry.source, host: "local", status: "failed", error: LOCK_CONFLICT_ERROR };
92
+ return;
93
+ }
94
+ try {
95
+ const res = await this.deps.launchLocal(launchRef);
96
+ results[i] = {
97
+ rigRef: entry.source,
98
+ host: "local",
99
+ status: res.ok ? "ok" : "failed",
100
+ ...(res.ok ? {} : { error: res.error ?? "bootstrap failed" }),
101
+ };
102
+ }
103
+ finally {
104
+ this.deps.release(launchRef);
105
+ }
106
+ }
107
+ catch (err) {
108
+ results[i] = {
109
+ rigRef: entry.source,
110
+ host: hostEntry ? hostEntry.id : "local",
111
+ status: "failed",
112
+ error: err.message,
113
+ };
114
+ }
115
+ };
116
+ const cap = Math.max(1, manifest.concurrency);
117
+ const workers = Array.from({ length: Math.min(cap, entries.length) }, async () => {
118
+ while (!stopped) {
119
+ const i = nextIndex;
120
+ if (i >= entries.length)
121
+ return;
122
+ nextIndex += 1;
123
+ await runEntry(i);
124
+ if (results[i].status === "failed")
125
+ stopped = true; // FR-5: stop at the failed entry
126
+ }
127
+ });
128
+ await Promise.all(workers);
129
+ return { ok: results.every((r) => r.status === "ok"), entries: results };
130
+ }
131
+ }
132
+ //# sourceMappingURL=multi-rig-launcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-rig-launcher.js","sourceRoot":"","sources":["../../../src/domain/topology/multi-rig-launcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { HttpHostEntry } from "../hosts/hosts-registry-reader.js";
2
+ export interface RemoteUpLeafDeps {
3
+ /** Injected for tests; defaults to global fetch. */
4
+ fetchImpl?: typeof fetch;
5
+ env?: Record<string, string | undefined>;
6
+ readFile?: (path: string) => string;
7
+ /** Bounded remote-up deadline (rev1-r2 R2-B1). Defaults to the
8
+ * long-running rig-up budget — remote bootstrap legitimately runs
9
+ * minutes, but never forever. Passed EXPLICITLY to the shared core
10
+ * (the deadline class is this call-site's decision, per the arch
11
+ * required-argument sharpening). */
12
+ timeoutMs?: number;
13
+ }
14
+ /** Matches the CLI's LONG_RUNNING_UP_TIMEOUT_MS for standalone remote ups. */
15
+ export declare const REMOTE_UP_TIMEOUT_MS = 120000;
16
+ export interface RemoteUpBody {
17
+ sourceRef: string;
18
+ autoApprove?: boolean;
19
+ }
20
+ /** POST the placed entry to the remote daemon's shipped /api/up. Returns the
21
+ * launcher's normalized {ok, error?} shape; the remote daemon's own error
22
+ * text rides through verbatim where available. Never hangs: the shared
23
+ * core holds ONE deadline through request AND body parse (the G-R2B1-1
24
+ * class is structurally closed there). */
25
+ export declare function remoteUpLeaf(body: RemoteUpBody, host: HttpHostEntry, deps?: RemoteUpLeafDeps): Promise<{
26
+ ok: boolean;
27
+ error?: string;
28
+ }>;
29
+ //# sourceMappingURL=remote-up-leaf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-up-leaf.d.ts","sourceRoot":"","sources":["../../../src/domain/topology/remote-up-leaf.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAGvE,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC;;;;yCAIqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,SAAU,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;2CAI2C;AAC3C,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,aAAa,EACnB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsC1C"}
@@ -0,0 +1,60 @@
1
+ // OPR.0.4.4.11 — the daemon-side remote single-rig leaf (FR-4).
2
+ //
3
+ // A host-placed topology entry launches by POSTing the SHIPPED remote-up
4
+ // surface: POST {host.url}/api/up with the same body shape the CLI's
5
+ // --host path sends. Since OPR.0.4.4.15 this is a THIN CONSUMER of the
6
+ // shared daemon→daemon transport core (domain/hosts/remote-daemon-http.ts
7
+ // — arch cell 1: ONE copy of the security-adjacent bearer/bounded-abort/
8
+ // classification code for the whole P3/P4 family). This module keeps its
9
+ // shipped error-string surface byte-for-byte; only the transport plumbing
10
+ // moved. The failure classes remain the EXISTING ones ([permission-gate] /
11
+ // [remote-command-failed] / [remote-daemon-unreachable]) — no new taxonomy
12
+ // (FR-4 negative AC).
13
+ import { remoteJsonRequest } from "../hosts/remote-daemon-http.js";
14
+ /** Matches the CLI's LONG_RUNNING_UP_TIMEOUT_MS for standalone remote ups. */
15
+ export const REMOTE_UP_TIMEOUT_MS = 120_000;
16
+ /** POST the placed entry to the remote daemon's shipped /api/up. Returns the
17
+ * launcher's normalized {ok, error?} shape; the remote daemon's own error
18
+ * text rides through verbatim where available. Never hangs: the shared
19
+ * core holds ONE deadline through request AND body parse (the G-R2B1-1
20
+ * class is structurally closed there). */
21
+ export async function remoteUpLeaf(body, host, deps = {}) {
22
+ const timeoutMs = deps.timeoutMs ?? REMOTE_UP_TIMEOUT_MS;
23
+ const url = `${host.url.replace(/\/$/, "")}/api/up`;
24
+ const res = await remoteJsonRequest(host, "/api/up", {
25
+ method: "POST",
26
+ body,
27
+ timeoutMs,
28
+ fetchImpl: deps.fetchImpl,
29
+ env: deps.env,
30
+ readFile: deps.readFile,
31
+ });
32
+ if (res.ok)
33
+ return { ok: true };
34
+ switch (res.kind) {
35
+ case "bearer":
36
+ return { ok: false, error: `[permission-gate] ${res.detail}` };
37
+ case "timeout":
38
+ // R2-B1 / G-R2B1-1: a stalled remote /api/up — before OR after
39
+ // headers — is a STRUCTURED per-entry failure, never a hung walk.
40
+ return res.phase === "body"
41
+ ? {
42
+ ok: false,
43
+ error: `[remote-daemon-unreachable] POST ${url} timed out after ${timeoutMs}ms for host ${host.id}: response headers arrived (HTTP ${res.status}) but the error body never completed`,
44
+ }
45
+ : {
46
+ ok: false,
47
+ error: `[remote-daemon-unreachable] POST ${url} timed out after ${timeoutMs}ms for host ${host.id}: the remote daemon never settled the request within the rig-up budget`,
48
+ };
49
+ case "network":
50
+ return { ok: false, error: `[remote-daemon-unreachable] POST ${url} failed for host ${host.id}: ${res.detail}` };
51
+ case "http": {
52
+ // Same classification vocabulary as the CLI transport (classifyHttpFailedStep).
53
+ const status = res.status ?? 0;
54
+ const cls = status === 401 || status === 403 ? "permission-gate" : status >= 400 && status < 600 ? "remote-command-failed" : "remote-daemon-unreachable";
55
+ const detail = res.detail ? `HTTP ${res.status}: ${res.detail}` : `HTTP ${res.status}`;
56
+ return { ok: false, error: `[${cls}] remote up on host ${host.id} failed: ${detail}` };
57
+ }
58
+ }
59
+ }
60
+ //# sourceMappingURL=remote-up-leaf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-up-leaf.js","sourceRoot":"","sources":["../../../src/domain/topology/remote-up-leaf.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,EAAE;AACF,yEAAyE;AACzE,qEAAqE;AACrE,uEAAuE;AACvE,0EAA0E;AAC1E,yEAAyE;AACzE,yEAAyE;AACzE,0EAA0E;AAC1E,2EAA2E;AAC3E,2EAA2E;AAC3E,sBAAsB;AAGtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAenE,8EAA8E;AAC9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAO5C;;;;2CAI2C;AAC3C,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAkB,EAClB,IAAmB,EACnB,OAAyB,EAAE;IAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,oBAAoB,CAAC;IACzD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC;IACpD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE;QACnD,MAAM,EAAE,MAAM;QACd,IAAI;QACJ,SAAS;QACT,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAEhC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QACjE,KAAK,SAAS;YACZ,+DAA+D;YAC/D,kEAAkE;YAClE,OAAO,GAAG,CAAC,KAAK,KAAK,MAAM;gBACzB,CAAC,CAAC;oBACE,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,oCAAoC,GAAG,oBAAoB,SAAS,eAAe,IAAI,CAAC,EAAE,oCAAoC,GAAG,CAAC,MAAM,sCAAsC;iBACtL;gBACH,CAAC,CAAC;oBACE,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,oCAAoC,GAAG,oBAAoB,SAAS,eAAe,IAAI,CAAC,EAAE,wEAAwE;iBAC1K,CAAC;QACR,KAAK,SAAS;YACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,GAAG,oBAAoB,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QACnH,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,gFAAgF;YAChF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;YAC/B,MAAM,GAAG,GAAG,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,2BAA2B,CAAC;YACzJ,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACvF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,GAAG,uBAAuB,IAAI,CAAC,EAAE,YAAY,MAAM,EAAE,EAAE,CAAC;QACzF,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ export interface TopologyRigEntry {
2
+ source: string;
3
+ host?: string;
4
+ }
5
+ export interface TopologyManifest {
6
+ rigs: TopologyRigEntry[];
7
+ /** Normalized: the manifest's cap, or the default 1 (sequential). */
8
+ concurrency: number;
9
+ }
10
+ export type TopologyManifestResult = {
11
+ ok: true;
12
+ manifest: TopologyManifest;
13
+ } | {
14
+ ok: false;
15
+ errors: string[];
16
+ };
17
+ /** Validate an already-parsed YAML document as a topology manifest.
18
+ * Collects EVERY structural error (per-entry, what/why/fix) rather than
19
+ * failing fast — FR-1 reports them all before any launch. */
20
+ export declare function validateTopologyManifest(parsed: unknown, sourcePath: string): TopologyManifestResult;
21
+ /** Load + parse + validate a topology manifest file. Parse failures error AS
22
+ * a topology (arch ruling 1: the declared kind binds — no rig-spec
23
+ * fall-through). */
24
+ export declare function loadTopologyManifest(path: string): TopologyManifestResult;
25
+ /** Detection sniff (FR-1 + guard G-1/yaml folds): a parsed YAML document is
26
+ * topology-SHAPED iff it carries a top-level `rigs:` LIST. A rig spec never
27
+ * carries top-level `rigs`, so the sniff is unambiguous. Shape only — full
28
+ * validation still runs (and rejects) as a topology afterwards. */
29
+ export declare function hasTopLevelRigsList(parsed: unknown): boolean;
30
+ /** Raw-text form of the sniff for router branches that have not parsed yet
31
+ * (the extensionless path-form fallback). Unparseable YAML sniffs false —
32
+ * it then flows to the existing non-topology handling unchanged. */
33
+ export declare function yamlTextHasTopLevelRigsList(raw: string): boolean;
34
+ //# sourceMappingURL=topology-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topology-manifest.d.ts","sourceRoot":"","sources":["../../../src/domain/topology/topology-manifest.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzB,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,gBAAgB,CAAA;CAAE,GACxC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAoCpC;;8DAE8D;AAC9D,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,sBAAsB,CA+FpG;AAED;;qBAEqB;AACrB,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,CAsBzE;AAED;;;oEAGoE;AACpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAG5D;AAED;;qEAEqE;AACrE,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMhE"}
@@ -0,0 +1,195 @@
1
+ // OPR.0.4.4.11 — the topology manifest: the SHAREABLE artifact (FR-1).
2
+ //
3
+ // The key set is CLOSED (arch return R11-1 — this IS the thin-manifest
4
+ // enforcement): an ordered `rigs[]` of entries {source, host?} plus an
5
+ // optional manifest-level `concurrency` cap (default 1 = sequential).
6
+ // NOTHING ELSE. Unknown keys reject loudly — silently ignoring one would
7
+ // reopen the founder's ratified non-goal by stealth. Cross-rig
8
+ // edge/routing/dependency keys reject with a message NAMING that non-goal
9
+ // (thin manifest; inter-rig routing is deferred topology-Q1). `on_failure`
10
+ // was considered and REMOVED for v0 (spec-guard + arch fold): stop-on-failure
11
+ // is the only behavior; re-adding it is an explicit pm-lead decision.
12
+ //
13
+ // Detection contract (PRD FR-1 + guard G-1 folds; the router consumes the
14
+ // exported sniffs): `.rigtopology` extension OR a YAML document with a
15
+ // top-level `rigs:` LIST. Extension wins when both could apply (arch ruling
16
+ // 1 — declared kind binds); a `.rigtopology` file failing validation errors
17
+ // AS a topology, never falls through to rig-spec parsing.
18
+ //
19
+ // Unknown-host-id validation (the FR-1 fourth structural class) resolves
20
+ // against the hosts registry via the shared hosts-registry-reader at the
21
+ // launcher's pre-launch validation pass — still before any launch attempt;
22
+ // this module is filesystem/registry-free by design.
23
+ import { existsSync, readFileSync } from "node:fs";
24
+ import { parse as parseYaml } from "yaml";
25
+ /** The ratified non-goal family: any key that would smuggle cross-rig
26
+ * edges/routing/dependency semantics into the thin manifest. */
27
+ const EDGE_ROUTING_KEYS = new Set([
28
+ "edge",
29
+ "edges",
30
+ "route",
31
+ "routes",
32
+ "routing",
33
+ "dependency",
34
+ "dependencies",
35
+ "deps",
36
+ "depends_on",
37
+ "dependsOn",
38
+ "needs",
39
+ "after",
40
+ "links",
41
+ "wires",
42
+ "connections",
43
+ ]);
44
+ const MANIFEST_KEYS = new Set(["rigs", "concurrency"]);
45
+ const ENTRY_KEYS = new Set(["source", "host"]);
46
+ function edgeRoutingRejection(prefix, key) {
47
+ return `${prefix}: '${key}' is a cross-rig edge/routing/dependency key — REJECTED. The topology manifest is deliberately THIN (founder-ratified non-goal: no cross-rig edges, no routing semantics; inter-rig routing is the deferred topology-Q1 decision). Remove the key; the manifest carries only rigs[]{source, host?} + concurrency.`;
48
+ }
49
+ function unknownKeyRejection(prefix, key, allowed) {
50
+ if (key === "on_failure") {
51
+ return `${prefix}: 'on_failure' was removed for v0 — stop-on-failure is the only behavior (the walk stops at the first failed entry; already-started rigs are reported honestly). Re-adding the key is an explicit pm-lead decision. Remove it.`;
52
+ }
53
+ return `${prefix}: unknown key '${key}' — the manifest key set is CLOSED (${allowed}). Remove or fix the key.`;
54
+ }
55
+ /** Validate an already-parsed YAML document as a topology manifest.
56
+ * Collects EVERY structural error (per-entry, what/why/fix) rather than
57
+ * failing fast — FR-1 reports them all before any launch. */
58
+ export function validateTopologyManifest(parsed, sourcePath) {
59
+ const where = `topology manifest at ${sourcePath}`;
60
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
61
+ return { ok: false, errors: [`${where}: must be a YAML object with a top-level 'rigs' list`] };
62
+ }
63
+ const obj = parsed;
64
+ const errors = [];
65
+ for (const key of Object.keys(obj)) {
66
+ if (MANIFEST_KEYS.has(key))
67
+ continue;
68
+ if (EDGE_ROUTING_KEYS.has(key)) {
69
+ errors.push(edgeRoutingRejection(where, key));
70
+ }
71
+ else {
72
+ errors.push(unknownKeyRejection(where, key, "'rigs' + optional 'concurrency'"));
73
+ }
74
+ }
75
+ let concurrency = 1;
76
+ const rawConcurrency = obj["concurrency"];
77
+ if (rawConcurrency !== undefined) {
78
+ if (typeof rawConcurrency !== "number" || !Number.isInteger(rawConcurrency) || rawConcurrency < 1) {
79
+ errors.push(`${where}: 'concurrency' must be a positive integer (a fixed staged-launch cap; default 1 = sequential; adaptive throttling is out of scope) — got ${JSON.stringify(rawConcurrency)}`);
80
+ }
81
+ else {
82
+ concurrency = rawConcurrency;
83
+ }
84
+ }
85
+ const rigs = obj["rigs"];
86
+ if (!Array.isArray(rigs)) {
87
+ errors.push(`${where}: 'rigs' must be a list of entries {source, host?} — the ordered launch plan`);
88
+ return { ok: false, errors };
89
+ }
90
+ if (rigs.length === 0) {
91
+ errors.push(`${where}: 'rigs' is empty — a topology must name at least one rig to launch`);
92
+ return { ok: false, errors };
93
+ }
94
+ const validated = [];
95
+ for (let i = 0; i < rigs.length; i++) {
96
+ const raw = rigs[i];
97
+ const prefix = `${where}: rigs[${i}]`;
98
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
99
+ errors.push(`${prefix}: must be an object with a 'source' rig ref (spec path, library name, or .rigbundle path) and optional 'host'`);
100
+ continue;
101
+ }
102
+ const entry = raw;
103
+ for (const key of Object.keys(entry)) {
104
+ if (ENTRY_KEYS.has(key))
105
+ continue;
106
+ if (EDGE_ROUTING_KEYS.has(key)) {
107
+ errors.push(edgeRoutingRejection(prefix, key));
108
+ }
109
+ else {
110
+ errors.push(unknownKeyRejection(prefix, key, "'source' + optional 'host'"));
111
+ }
112
+ }
113
+ const source = entry["source"];
114
+ if (typeof source !== "string" || source.trim() === "") {
115
+ errors.push(`${prefix}.source: required non-empty string — a rig SPEC PATH (v0 boundary; see the per-form rejections below)`);
116
+ continue;
117
+ }
118
+ // ── v0 source-form boundary (arch ruling 2026-07-05, guard F2/F3 fold):
119
+ // topology entries are SPEC PATHS ONLY, rejected at PARSE time — uniform
120
+ // entry semantics beat mid-walk failure, and neither widening is free:
121
+ // bundle targetRoot is a pm-gated closed-key extension (R11-1); library
122
+ // names need a daemon resolution seam (P4-adjacent+). Both are NAMED
123
+ // DEFERRALS. Direct-to-rig-up forms are untouched (FR-2 stands).
124
+ if (/\.rigbundle$/i.test(source)) {
125
+ errors.push(`${prefix}.source: '.rigbundle' entries are not supported in v0 — topology entries are SPEC PATHS ONLY (a bundle entry needs an explicit per-entry targetRoot, a pm-gated extension of the closed key set; deferred). Workaround: launch that rig directly — single-rig 'rig up ${source}' accepts all source kinds unchanged.`);
126
+ continue;
127
+ }
128
+ if (/\.rigtopology$/i.test(source)) {
129
+ errors.push(`${prefix}.source: nested topology manifests are not supported — every entry must be a single-rig spec path.`);
130
+ continue;
131
+ }
132
+ if (!source.includes("/") && !/\.ya?ml$/i.test(source)) {
133
+ errors.push(`${prefix}.source: '${source}' is a bare library/rig name — v0 topology entries are SPEC PATHS ONLY (name entries need a daemon-side resolution seam; deferred). Workaround: run 'rig up ${source}' individually, or reference its spec file by path.`);
134
+ continue;
135
+ }
136
+ const host = entry["host"];
137
+ if (host !== undefined && (typeof host !== "string" || host.trim() === "")) {
138
+ errors.push(`${prefix}.host: optional, but if present must be a non-empty registered host id (per-entry 'host:' is the ONLY topology placement mechanism)`);
139
+ continue;
140
+ }
141
+ validated.push({ source, ...(host !== undefined ? { host: host } : {}) });
142
+ }
143
+ if (errors.length > 0)
144
+ return { ok: false, errors };
145
+ return { ok: true, manifest: { rigs: validated, concurrency } };
146
+ }
147
+ /** Load + parse + validate a topology manifest file. Parse failures error AS
148
+ * a topology (arch ruling 1: the declared kind binds — no rig-spec
149
+ * fall-through). */
150
+ export function loadTopologyManifest(path) {
151
+ if (!existsSync(path)) {
152
+ return {
153
+ ok: false,
154
+ errors: [
155
+ `topology manifest not found at ${path}. Create a .rigtopology YAML file with a top-level 'rigs:' list of {source, host?} entries (+ optional 'concurrency').`,
156
+ ],
157
+ };
158
+ }
159
+ let raw;
160
+ try {
161
+ raw = readFileSync(path, "utf-8");
162
+ }
163
+ catch (err) {
164
+ return { ok: false, errors: [`failed to read topology manifest at ${path}: ${err.message}`] };
165
+ }
166
+ let parsed;
167
+ try {
168
+ parsed = parseYaml(raw);
169
+ }
170
+ catch (err) {
171
+ return { ok: false, errors: [`failed to parse topology manifest YAML at ${path}: ${err.message}`] };
172
+ }
173
+ return validateTopologyManifest(parsed, path);
174
+ }
175
+ /** Detection sniff (FR-1 + guard G-1/yaml folds): a parsed YAML document is
176
+ * topology-SHAPED iff it carries a top-level `rigs:` LIST. A rig spec never
177
+ * carries top-level `rigs`, so the sniff is unambiguous. Shape only — full
178
+ * validation still runs (and rejects) as a topology afterwards. */
179
+ export function hasTopLevelRigsList(parsed) {
180
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
181
+ return false;
182
+ return Array.isArray(parsed["rigs"]);
183
+ }
184
+ /** Raw-text form of the sniff for router branches that have not parsed yet
185
+ * (the extensionless path-form fallback). Unparseable YAML sniffs false —
186
+ * it then flows to the existing non-topology handling unchanged. */
187
+ export function yamlTextHasTopLevelRigsList(raw) {
188
+ try {
189
+ return hasTopLevelRigsList(parseYaml(raw));
190
+ }
191
+ catch {
192
+ return false;
193
+ }
194
+ }
195
+ //# sourceMappingURL=topology-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topology-manifest.js","sourceRoot":"","sources":["../../../src/domain/topology/topology-manifest.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,uEAAuE;AACvE,uEAAuE;AACvE,sEAAsE;AACtE,yEAAyE;AACzE,+DAA+D;AAC/D,0EAA0E;AAC1E,2EAA2E;AAC3E,8EAA8E;AAC9E,sEAAsE;AACtE,EAAE;AACF,0EAA0E;AAC1E,uEAAuE;AACvE,4EAA4E;AAC5E,4EAA4E;AAC5E,0DAA0D;AAC1D,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,qDAAqD;AAErD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAiB1C;iEACiE;AACjE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,cAAc;IACd,MAAM;IACN,YAAY;IACZ,WAAW;IACX,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;AACvD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAE/C,SAAS,oBAAoB,CAAC,MAAc,EAAE,GAAW;IACvD,OAAO,GAAG,MAAM,MAAM,GAAG,mTAAmT,CAAC;AAC/U,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc,EAAE,GAAW,EAAE,OAAe;IACvE,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;QACzB,OAAO,GAAG,MAAM,gOAAgO,CAAC;IACnP,CAAC;IACD,OAAO,GAAG,MAAM,kBAAkB,GAAG,uCAAuC,OAAO,2BAA2B,CAAC;AACjH,CAAC;AAED;;8DAE8D;AAC9D,MAAM,UAAU,wBAAwB,CAAC,MAAe,EAAE,UAAkB;IAC1E,MAAM,KAAK,GAAG,wBAAwB,UAAU,EAAE,CAAC;IACnD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,sDAAsD,CAAC,EAAE,CAAC;IACjG,CAAC;IACD,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACrC,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,iCAAiC,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,cAAc,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;IAC1C,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YAClG,MAAM,CAAC,IAAI,CACT,GAAG,KAAK,6IAA6I,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CACtL,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,cAAc,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,8EAA8E,CAAC,CAAC;QACpG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,qEAAqE,CAAC,CAAC;QAC3F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,MAAM,GAAG,GAAG,KAAK,UAAU,CAAC,GAAG,CAAC;QACtC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,+GAA+G,CAAC,CAAC;YACtI,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,GAA8B,CAAC;QAE7C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAClC,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,4BAA4B,CAAC,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,uGAAuG,CAAC,CAAC;YAC9H,SAAS;QACX,CAAC;QACD,yEAAyE;QACzE,yEAAyE;QACzE,uEAAuE;QACvE,wEAAwE;QACxE,qEAAqE;QACrE,iEAAiE;QACjE,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CACT,GAAG,MAAM,yQAAyQ,MAAM,uCAAuC,CAChU,CAAC;YACF,SAAS;QACX,CAAC;QACD,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,oGAAoG,CAAC,CAAC;YAC3H,SAAS;QACX,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,MAAM,CAAC,IAAI,CACT,GAAG,MAAM,aAAa,MAAM,+JAA+J,MAAM,qDAAqD,CACvP,CAAC;YACF,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAC3E,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,qIAAqI,CAAC,CAAC;YAC5J,SAAS;QACX,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACpD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC;AAClE,CAAC;AAED;;qBAEqB;AACrB,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE;gBACN,kCAAkC,IAAI,wHAAwH;aAC/J;SACF,CAAC;IACJ,CAAC;IACD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,uCAAuC,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;IAC3G,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,6CAA6C,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;IACjH,CAAC;IACD,OAAO,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAChD,CAAC;AAED;;;oEAGoE;AACpE,MAAM,UAAU,mBAAmB,CAAC,MAAe;IACjD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACzF,OAAO,KAAK,CAAC,OAAO,CAAE,MAAkC,CAAC,MAAM,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;qEAEqE;AACrE,MAAM,UAAU,2BAA2B,CAAC,GAAW;IACrD,IAAI,CAAC;QACH,OAAO,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -75,6 +75,9 @@ export interface Session {
75
75
  status: string;
76
76
  resumeType: string | null;
77
77
  resumeToken: string | null;
78
+ resumeProvenance?: string | null;
79
+ resumeLastVerified?: string | null;
80
+ resumeLastProbeStatus?: string | null;
78
81
  restorePolicy: string;
79
82
  lastSeenAt: string | null;
80
83
  createdAt: string;
@@ -199,6 +202,18 @@ export type RigEvent = {
199
202
  reason?: string;
200
203
  operator?: string;
201
204
  redacted: true;
205
+ } | {
206
+ type: "session.resume_token_captured";
207
+ rigId: string;
208
+ nodeId: string;
209
+ sessionName: string;
210
+ sessionId: string;
211
+ runtime: string;
212
+ outcome: "captured" | "preserved" | "skipped";
213
+ resumeType?: string;
214
+ provenance?: "adoption";
215
+ reason?: "missing_sidecar" | "parse_error" | "probe_timeout" | "invalid_token" | "higher_rank_present";
216
+ redacted: true;
202
217
  } | {
203
218
  type: "seat.attention_cleared";
204
219
  rigId: string;
@@ -341,6 +356,25 @@ export type RigEvent = {
341
356
  rigId: string;
342
357
  nodeId: string;
343
358
  error: string;
359
+ } | {
360
+ type: "node.startup_challenged";
361
+ rigId: string;
362
+ nodeId: string;
363
+ challengeId: string;
364
+ contractHash: string;
365
+ } | {
366
+ type: "node.startup_proof_verified";
367
+ rigId: string;
368
+ nodeId: string;
369
+ sessionId: string;
370
+ challengeId: string;
371
+ contractHash: string;
372
+ } | {
373
+ type: "node.startup_proof_rejected";
374
+ rigId: string;
375
+ nodeId: string;
376
+ challengeId: string | null;
377
+ reason: "identity_unbound" | "identity_mismatch" | "challenge_stale" | "contract_mismatch" | "bare_ack";
344
378
  } | {
345
379
  type: "continuity.sync";
346
380
  rigId: string;
@@ -394,23 +428,27 @@ export type RigEvent = {
394
428
  destinationSession: string;
395
429
  priority: string;
396
430
  tier: string | null;
431
+ summary: string | null;
397
432
  } | {
398
433
  type: "queue.handed_off";
399
434
  qitemId: string;
400
435
  fromSession: string;
401
436
  toSession: string;
402
437
  closureReason: "handed_off_to";
438
+ summary: string | null;
403
439
  } | {
404
440
  type: "queue.claimed";
405
441
  qitemId: string;
406
442
  destinationSession: string;
407
443
  claimedAt: string;
408
444
  closureRequiredAt: string | null;
445
+ summary: string | null;
409
446
  } | {
410
447
  type: "queue.unclaimed";
411
448
  qitemId: string;
412
449
  destinationSession: string;
413
450
  reason: string;
451
+ summary: string | null;
414
452
  } | {
415
453
  type: "qitem.fallback_routed";
416
454
  qitemId: string;
@@ -443,6 +481,7 @@ export type RigEvent = {
443
481
  closureReason: string | null;
444
482
  closureTarget: string | null;
445
483
  actorSession: string;
484
+ summary: string | null;
446
485
  } | {
447
486
  type: "project.classified";
448
487
  projectId: string;
@@ -695,6 +734,7 @@ export type RestoreOutcome = {
695
734
  result: RestoreResult;
696
735
  };
697
736
  export type NodeRestoreOutcome = "resumed" | "rebuilt" | "fresh" | "fresh-primed" | "awaiting-decision" | "failed" | "attention_required" | "operator_recovered" | "n-a";
737
+ export type NodeOriented = "verified" | "missing" | "rejected" | "n-a";
698
738
  export type OccupantLifecycle = "active" | "retiring" | "retired" | "context_walled" | "compacted" | "crashed" | "unknown";
699
739
  export type ContinuityOutcome = "resumed" | "rebuilt" | "forked" | "fresh" | "failed";
700
740
  export type HandoverResult = "complete" | "unchanged" | "partial" | "failed" | null;
@@ -719,6 +759,41 @@ export interface NodeRecoveryGuidance {
719
759
  notes: string[];
720
760
  }
721
761
  export type NodeLifecycleState = "running" | "detached" | "recoverable" | "attention_required";
762
+ /**
763
+ * OPR.0.4.3.19 — the liveness identity verdict for a managed seat.
764
+ *
765
+ * A THIRD axis, orthogonal to slice-15's `terminalActive` (tmux output
766
+ * recency) and `hasAssignedWork` (queue-derived). It answers: does the process
767
+ * currently in the seat's registered tmux pane match the seat we are reporting?
768
+ * Computed by the periodic SeatIdentityReconciler from the pane PID/command vs
769
+ * the registered `bindings.tmux_pane`, NEVER from queue/classifier/hook
770
+ * heartbeats. Only `mismatch` and `pane_missing` down-rank a `running`
771
+ * projection; `verified` and `tmux_unavailable` (and an absent verdict) leave
772
+ * it unchanged.
773
+ */
774
+ export type SeatIdentityVerdictKind = "verified" | "mismatch" | "pane_missing" | "tmux_unavailable";
775
+ export interface SeatIdentityVerdict {
776
+ nodeId: string;
777
+ verdict: SeatIdentityVerdictKind;
778
+ /** Which observation axis produced the verdict. Null for `verified`. */
779
+ evidenceSource: "pane_process" | "tmux_session" | null;
780
+ /** The specific reason for a non-verified verdict. Null for `verified`. */
781
+ reason: "process_identity_mismatch" | "pane_pid_gone" | "session_missing" | "tmux_unavailable" | null;
782
+ evidence: {
783
+ registeredPane: string | null;
784
+ observedPid: number | null;
785
+ observedCommand: string | null;
786
+ matchedLayer: number | null;
787
+ };
788
+ sessionName: string | null;
789
+ observedAt: string;
790
+ }
791
+ /**
792
+ * OPR.0.4.3.19 — the two verdict kinds that down-rank a `running`/`active`
793
+ * projection to a non-green state. `verified`, `tmux_unavailable`, and an
794
+ * ABSENT verdict all leave the projection unchanged (fail-open on unknown).
795
+ */
796
+ export declare function identityVerdictDownranksRunning(verdict: SeatIdentityVerdictKind | null | undefined): boolean;
722
797
  export type RigLifecycleState = "running" | "recoverable" | "stopped" | "degraded" | "attention_required";
723
798
  export interface NodeInventoryEntry {
724
799
  rigId: string;
@@ -733,6 +808,7 @@ export interface NodeInventoryEntry {
733
808
  sessionStatus: string | null;
734
809
  startupStatus: "pending" | "ready" | "attention_required" | "failed" | null;
735
810
  restoreOutcome: NodeRestoreOutcome;
811
+ oriented: NodeOriented;
736
812
  lifecycleState: NodeLifecycleState;
737
813
  occupantLifecycle: OccupantLifecycle;
738
814
  continuityOutcome: ContinuityOutcome | null;
@@ -785,6 +861,16 @@ export interface NodeInventoryEntry {
785
861
  hasAssignedWork?: boolean;
786
862
  /** Optional count of pending qitems assigned to this seat (cheap aggregate). */
787
863
  pendingWorkCount?: number;
864
+ /**
865
+ * OPR.0.4.3.19 — liveness identity verdict (the THIRD axis). Present when
866
+ * the SeatIdentityReconciler has recorded a verdict for this node; absent
867
+ * (undefined) when never polled. A `mismatch`/`pane_missing` verdict
868
+ * down-ranks the node's `lifecycleState`/`occupantLifecycle` away from
869
+ * running/active and carries the evidence. MUST NOT be derived from
870
+ * `terminalActive`, `hasAssignedWork`, or any queue/classifier/hook
871
+ * heartbeat — process identity only.
872
+ */
873
+ identityVerdict?: SeatIdentityVerdict | null;
788
874
  /** OPR.0.3.4.11 — held reason derived from the latest `node.held` event.
789
875
  * Null when no held event, or superseded by a running session / later launch. */
790
876
  heldReason?: string | null;