@openrig/cli 0.5.1 → 0.5.2

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 (473) hide show
  1. package/daemon/assets/guidance/openrig-start.md +21 -64
  2. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +11 -2
  3. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  4. package/daemon/dist/adapters/codex-runtime-adapter.js +18 -10
  5. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  6. package/daemon/dist/build-info.js +3 -3
  7. package/daemon/dist/domain/codex-thread-id.d.ts +5 -2
  8. package/daemon/dist/domain/codex-thread-id.d.ts.map +1 -1
  9. package/daemon/dist/domain/codex-thread-id.js +9 -4
  10. package/daemon/dist/domain/codex-thread-id.js.map +1 -1
  11. package/daemon/dist/domain/crash-cart-conductor.d.ts +173 -0
  12. package/daemon/dist/domain/crash-cart-conductor.d.ts.map +1 -0
  13. package/daemon/dist/domain/crash-cart-conductor.js +233 -0
  14. package/daemon/dist/domain/crash-cart-conductor.js.map +1 -0
  15. package/daemon/dist/domain/crash-cart-probes.d.ts +7 -6
  16. package/daemon/dist/domain/crash-cart-probes.d.ts.map +1 -1
  17. package/daemon/dist/domain/crash-cart-probes.js +57 -7
  18. package/daemon/dist/domain/crash-cart-probes.js.map +1 -1
  19. package/daemon/dist/domain/hosts/fanout-contract.d.ts +4 -0
  20. package/daemon/dist/domain/hosts/fanout-contract.d.ts.map +1 -1
  21. package/daemon/dist/domain/hosts/fanout-contract.js +15 -0
  22. package/daemon/dist/domain/hosts/fanout-contract.js.map +1 -1
  23. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +11 -0
  24. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -1
  25. package/daemon/dist/domain/hosts/hosts-registry-reader.js +34 -1
  26. package/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -1
  27. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts +67 -0
  28. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts.map +1 -0
  29. package/daemon/dist/domain/model-divergence/current-generation-record.js +204 -0
  30. package/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -0
  31. package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts +13 -0
  32. package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts.map +1 -0
  33. package/daemon/dist/domain/model-divergence/effective-model-readers.js +163 -0
  34. package/daemon/dist/domain/model-divergence/effective-model-readers.js.map +1 -0
  35. package/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts +113 -0
  36. package/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts.map +1 -0
  37. package/daemon/dist/domain/model-divergence/model-divergence-monitor.js +190 -0
  38. package/daemon/dist/domain/model-divergence/model-divergence-monitor.js.map +1 -0
  39. package/daemon/dist/domain/predecessor-recap-resolver.d.ts +10 -3
  40. package/daemon/dist/domain/predecessor-recap-resolver.d.ts.map +1 -1
  41. package/daemon/dist/domain/predecessor-recap-resolver.js +61 -14
  42. package/daemon/dist/domain/predecessor-recap-resolver.js.map +1 -1
  43. package/daemon/dist/domain/resume-metadata-refresher.d.ts +11 -2
  44. package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
  45. package/daemon/dist/domain/resume-metadata-refresher.js +17 -9
  46. package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
  47. package/daemon/dist/domain/review/gather.d.ts.map +1 -1
  48. package/daemon/dist/domain/review/gather.js +3 -2
  49. package/daemon/dist/domain/review/gather.js.map +1 -1
  50. package/daemon/dist/domain/{rig-policy/rig-policy-defaults.d.ts → rig-mode/rig-mode-defaults.d.ts} +2 -2
  51. package/daemon/dist/domain/rig-mode/rig-mode-defaults.d.ts.map +1 -0
  52. package/daemon/dist/domain/{rig-policy/rig-policy-defaults.js → rig-mode/rig-mode-defaults.js} +1 -1
  53. package/daemon/dist/domain/rig-mode/rig-mode-defaults.js.map +1 -0
  54. package/{node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-store.d.ts → daemon/dist/domain/rig-mode/rig-mode-store.d.ts} +6 -6
  55. package/daemon/dist/domain/rig-mode/rig-mode-store.d.ts.map +1 -0
  56. package/daemon/dist/domain/{rig-policy/rig-policy-store.js → rig-mode/rig-mode-store.js} +5 -5
  57. package/daemon/dist/domain/rig-mode/rig-mode-store.js.map +1 -0
  58. package/daemon/dist/domain/{rig-policy/rig-policy-types.d.ts → rig-mode/rig-mode-types.d.ts} +1 -1
  59. package/daemon/dist/domain/rig-mode/rig-mode-types.d.ts.map +1 -0
  60. package/{node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-types.js → daemon/dist/domain/rig-mode/rig-mode-types.js} +1 -1
  61. package/daemon/dist/domain/rig-mode/rig-mode-types.js.map +1 -0
  62. package/{node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-validator.d.ts → daemon/dist/domain/rig-mode/rig-mode-validator.d.ts} +2 -2
  63. package/daemon/dist/domain/rig-mode/rig-mode-validator.d.ts.map +1 -0
  64. package/daemon/dist/domain/{rig-policy/rig-policy-validator.js → rig-mode/rig-mode-validator.js} +3 -3
  65. package/daemon/dist/domain/rig-mode/rig-mode-validator.js.map +1 -0
  66. package/daemon/dist/domain/rigspec-schema.d.ts +7 -0
  67. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  68. package/daemon/dist/domain/rigspec-schema.js +7 -0
  69. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  70. package/daemon/dist/domain/scope/node-file.d.ts +37 -0
  71. package/daemon/dist/domain/scope/node-file.d.ts.map +1 -0
  72. package/daemon/dist/domain/scope/node-file.js +55 -0
  73. package/daemon/dist/domain/scope/node-file.js.map +1 -0
  74. package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +11 -0
  75. package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -1
  76. package/daemon/dist/domain/scope/plan-lock-artifacts.js +40 -0
  77. package/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -1
  78. package/daemon/dist/domain/scope/scope-approve.d.ts +4 -0
  79. package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
  80. package/daemon/dist/domain/scope/scope-approve.js +56 -7
  81. package/daemon/dist/domain/scope/scope-approve.js.map +1 -1
  82. package/daemon/dist/domain/scope/scope-audit.d.ts +1 -1
  83. package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  84. package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  85. package/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
  86. package/daemon/dist/domain/scope/scope-view-projection.js +5 -2
  87. package/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
  88. package/daemon/dist/domain/seat-handover-service.d.ts +32 -15
  89. package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
  90. package/daemon/dist/domain/seat-handover-service.js +42 -17
  91. package/daemon/dist/domain/seat-handover-service.js.map +1 -1
  92. package/daemon/dist/domain/seat-identity-reconciler.d.ts +17 -0
  93. package/daemon/dist/domain/seat-identity-reconciler.d.ts.map +1 -1
  94. package/daemon/dist/domain/seat-identity-reconciler.js +22 -0
  95. package/daemon/dist/domain/seat-identity-reconciler.js.map +1 -1
  96. package/daemon/dist/domain/session-jsonl.js +1 -1
  97. package/daemon/dist/domain/session-jsonl.js.map +1 -1
  98. package/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -1
  99. package/daemon/dist/domain/slices/slice-detail-projector.js +14 -2
  100. package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
  101. package/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -1
  102. package/daemon/dist/domain/slices/slice-indexer.js +16 -3
  103. package/daemon/dist/domain/slices/slice-indexer.js.map +1 -1
  104. package/daemon/dist/domain/spec-live-conformance.d.ts +22 -0
  105. package/daemon/dist/domain/spec-live-conformance.d.ts.map +1 -1
  106. package/daemon/dist/domain/spec-live-conformance.js +35 -0
  107. package/daemon/dist/domain/spec-live-conformance.js.map +1 -1
  108. package/daemon/dist/domain/sync-site-wrap.d.ts +9 -0
  109. package/daemon/dist/domain/sync-site-wrap.d.ts.map +1 -1
  110. package/daemon/dist/domain/sync-site-wrap.js +11 -0
  111. package/daemon/dist/domain/sync-site-wrap.js.map +1 -1
  112. package/daemon/dist/domain/types.d.ts +15 -0
  113. package/daemon/dist/domain/types.d.ts.map +1 -1
  114. package/daemon/dist/domain/types.js.map +1 -1
  115. package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  116. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  117. package/daemon/dist/domain/user-settings/settings-store.js +20 -0
  118. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  119. package/daemon/dist/domain/watchdog-auto-registration.d.ts +7 -0
  120. package/daemon/dist/domain/watchdog-auto-registration.d.ts.map +1 -1
  121. package/daemon/dist/domain/watchdog-auto-registration.js +27 -0
  122. package/daemon/dist/domain/watchdog-auto-registration.js.map +1 -1
  123. package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
  124. package/daemon/dist/domain/workspace/workspace-doctor.js +4 -3
  125. package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
  126. package/daemon/dist/routes/activity.js +11 -2
  127. package/daemon/dist/routes/activity.js.map +1 -1
  128. package/daemon/dist/routes/bundles.d.ts +27 -0
  129. package/daemon/dist/routes/bundles.d.ts.map +1 -1
  130. package/daemon/dist/routes/bundles.js +107 -26
  131. package/daemon/dist/routes/bundles.js.map +1 -1
  132. package/daemon/dist/routes/crash-cart.d.ts +4 -0
  133. package/daemon/dist/routes/crash-cart.d.ts.map +1 -0
  134. package/daemon/dist/routes/crash-cart.js +144 -0
  135. package/daemon/dist/routes/crash-cart.js.map +1 -0
  136. package/daemon/dist/routes/missions.d.ts.map +1 -1
  137. package/daemon/dist/routes/missions.js +10 -6
  138. package/daemon/dist/routes/missions.js.map +1 -1
  139. package/daemon/dist/routes/{rig-policy.d.ts → rig-mode.d.ts} +3 -3
  140. package/daemon/dist/routes/rig-mode.d.ts.map +1 -0
  141. package/{node_modules/@openrig/daemon/dist/routes/rig-policy.js → daemon/dist/routes/rig-mode.js} +13 -13
  142. package/daemon/dist/routes/rig-mode.js.map +1 -0
  143. package/daemon/dist/routes/scope-approve.d.ts.map +1 -1
  144. package/daemon/dist/routes/scope-approve.js +4 -0
  145. package/daemon/dist/routes/scope-approve.js.map +1 -1
  146. package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
  147. package/daemon/dist/routes/scope-audit.js +29 -2
  148. package/daemon/dist/routes/scope-audit.js.map +1 -1
  149. package/daemon/dist/routes/seat.js +7 -2
  150. package/daemon/dist/routes/seat.js.map +1 -1
  151. package/daemon/dist/routes/sessions.d.ts.map +1 -1
  152. package/daemon/dist/routes/sessions.js +11 -1
  153. package/daemon/dist/routes/sessions.js.map +1 -1
  154. package/daemon/dist/server.d.ts +3 -1
  155. package/daemon/dist/server.d.ts.map +1 -1
  156. package/daemon/dist/server.js +15 -5
  157. package/daemon/dist/server.js.map +1 -1
  158. package/daemon/dist/startup.d.ts.map +1 -1
  159. package/daemon/dist/startup.js +134 -5
  160. package/daemon/dist/startup.js.map +1 -1
  161. package/dist/build-info.js +3 -3
  162. package/dist/commands/bundle.d.ts.map +1 -1
  163. package/dist/commands/bundle.js +6 -0
  164. package/dist/commands/bundle.js.map +1 -1
  165. package/dist/commands/capture.d.ts.map +1 -1
  166. package/dist/commands/capture.js +2 -0
  167. package/dist/commands/capture.js.map +1 -1
  168. package/dist/commands/crash-cart.d.ts.map +1 -1
  169. package/dist/commands/crash-cart.js.map +1 -1
  170. package/dist/commands/host.d.ts +5 -0
  171. package/dist/commands/host.d.ts.map +1 -1
  172. package/dist/commands/host.js +59 -3
  173. package/dist/commands/host.js.map +1 -1
  174. package/dist/commands/policy.d.ts +5 -0
  175. package/dist/commands/policy.d.ts.map +1 -0
  176. package/dist/commands/policy.js +307 -0
  177. package/dist/commands/policy.js.map +1 -0
  178. package/dist/commands/ps.d.ts +4 -0
  179. package/dist/commands/ps.d.ts.map +1 -1
  180. package/dist/commands/ps.js +4 -0
  181. package/dist/commands/ps.js.map +1 -1
  182. package/dist/commands/{rig-policy.d.ts → rig-mode.d.ts} +3 -3
  183. package/dist/commands/rig-mode.d.ts.map +1 -0
  184. package/dist/commands/{rig-policy.js → rig-mode.js} +17 -17
  185. package/dist/commands/rig-mode.js.map +1 -0
  186. package/dist/commands/scope.d.ts.map +1 -1
  187. package/dist/commands/scope.js +58 -16
  188. package/dist/commands/scope.js.map +1 -1
  189. package/dist/commands/send.d.ts.map +1 -1
  190. package/dist/commands/send.js +2 -0
  191. package/dist/commands/send.js.map +1 -1
  192. package/dist/commands/setup.d.ts +13 -0
  193. package/dist/commands/setup.d.ts.map +1 -1
  194. package/dist/commands/setup.js +3 -3
  195. package/dist/commands/setup.js.map +1 -1
  196. package/dist/commands/transcript.d.ts.map +1 -1
  197. package/dist/commands/transcript.js +2 -0
  198. package/dist/commands/transcript.js.map +1 -1
  199. package/dist/commands/whoami.d.ts.map +1 -1
  200. package/dist/commands/whoami.js +11 -1
  201. package/dist/commands/whoami.js.map +1 -1
  202. package/dist/config-store.d.ts +3 -1
  203. package/dist/config-store.d.ts.map +1 -1
  204. package/dist/config-store.js +18 -0
  205. package/dist/config-store.js.map +1 -1
  206. package/dist/cross-host-target.d.ts +8 -1
  207. package/dist/cross-host-target.d.ts.map +1 -1
  208. package/dist/cross-host-target.js +23 -4
  209. package/dist/cross-host-target.js.map +1 -1
  210. package/dist/daemon-lifecycle.d.ts +10 -1
  211. package/dist/daemon-lifecycle.d.ts.map +1 -1
  212. package/dist/daemon-lifecycle.js +26 -1
  213. package/dist/daemon-lifecycle.js.map +1 -1
  214. package/dist/front-door.d.ts.map +1 -1
  215. package/dist/front-door.js +11 -1
  216. package/dist/front-door.js.map +1 -1
  217. package/dist/host-bindings.d.ts +62 -0
  218. package/dist/host-bindings.d.ts.map +1 -0
  219. package/dist/host-bindings.js +147 -0
  220. package/dist/host-bindings.js.map +1 -0
  221. package/dist/host-registry.d.ts +14 -1
  222. package/dist/host-registry.d.ts.map +1 -1
  223. package/dist/host-registry.js +30 -2
  224. package/dist/host-registry.js.map +1 -1
  225. package/dist/index.d.ts +2 -2
  226. package/dist/index.d.ts.map +1 -1
  227. package/dist/index.js +5 -2
  228. package/dist/index.js.map +1 -1
  229. package/dist/lib/hosts/fanout-contract.d.ts +4 -0
  230. package/dist/lib/hosts/fanout-contract.d.ts.map +1 -1
  231. package/dist/lib/hosts/fanout-contract.js +15 -0
  232. package/dist/lib/hosts/fanout-contract.js.map +1 -1
  233. package/dist/lib/path-safety.d.ts +8 -0
  234. package/dist/lib/path-safety.d.ts.map +1 -0
  235. package/dist/lib/path-safety.js +24 -0
  236. package/dist/lib/path-safety.js.map +1 -0
  237. package/dist/lib/permission-policy/policy-ref.d.ts +89 -0
  238. package/dist/lib/permission-policy/policy-ref.d.ts.map +1 -0
  239. package/dist/lib/permission-policy/policy-ref.js +171 -0
  240. package/dist/lib/permission-policy/policy-ref.js.map +1 -0
  241. package/dist/lib/permission-policy/policy-spec.d.ts +34 -0
  242. package/dist/lib/permission-policy/policy-spec.d.ts.map +1 -0
  243. package/dist/lib/permission-policy/policy-spec.js +106 -0
  244. package/dist/lib/permission-policy/policy-spec.js.map +1 -0
  245. package/dist/lib/scope/scope-audit.d.ts +1 -1
  246. package/dist/lib/scope/scope-audit.d.ts.map +1 -1
  247. package/dist/lib/scope/scope-audit.js.map +1 -1
  248. package/dist/lib/scope/scope-fs.d.ts +19 -3
  249. package/dist/lib/scope/scope-fs.d.ts.map +1 -1
  250. package/dist/lib/scope/scope-fs.js +37 -17
  251. package/dist/lib/scope/scope-fs.js.map +1 -1
  252. package/dist/release-surface/extract-surface.js +1 -1
  253. package/dist/release-surface/extract-surface.js.map +1 -1
  254. package/node_modules/@openrig/daemon/dist/adapters/codex-runtime-adapter.d.ts +11 -2
  255. package/node_modules/@openrig/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  256. package/node_modules/@openrig/daemon/dist/adapters/codex-runtime-adapter.js +18 -10
  257. package/node_modules/@openrig/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  258. package/node_modules/@openrig/daemon/dist/build-info.js +3 -3
  259. package/node_modules/@openrig/daemon/dist/domain/codex-thread-id.d.ts +5 -2
  260. package/node_modules/@openrig/daemon/dist/domain/codex-thread-id.d.ts.map +1 -1
  261. package/node_modules/@openrig/daemon/dist/domain/codex-thread-id.js +9 -4
  262. package/node_modules/@openrig/daemon/dist/domain/codex-thread-id.js.map +1 -1
  263. package/node_modules/@openrig/daemon/dist/domain/crash-cart-conductor.d.ts +173 -0
  264. package/node_modules/@openrig/daemon/dist/domain/crash-cart-conductor.d.ts.map +1 -0
  265. package/node_modules/@openrig/daemon/dist/domain/crash-cart-conductor.js +233 -0
  266. package/node_modules/@openrig/daemon/dist/domain/crash-cart-conductor.js.map +1 -0
  267. package/node_modules/@openrig/daemon/dist/domain/crash-cart-probes.d.ts +7 -6
  268. package/node_modules/@openrig/daemon/dist/domain/crash-cart-probes.d.ts.map +1 -1
  269. package/node_modules/@openrig/daemon/dist/domain/crash-cart-probes.js +57 -7
  270. package/node_modules/@openrig/daemon/dist/domain/crash-cart-probes.js.map +1 -1
  271. package/node_modules/@openrig/daemon/dist/domain/hosts/fanout-contract.d.ts +4 -0
  272. package/node_modules/@openrig/daemon/dist/domain/hosts/fanout-contract.d.ts.map +1 -1
  273. package/node_modules/@openrig/daemon/dist/domain/hosts/fanout-contract.js +15 -0
  274. package/node_modules/@openrig/daemon/dist/domain/hosts/fanout-contract.js.map +1 -1
  275. package/node_modules/@openrig/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +11 -0
  276. package/node_modules/@openrig/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -1
  277. package/node_modules/@openrig/daemon/dist/domain/hosts/hosts-registry-reader.js +34 -1
  278. package/node_modules/@openrig/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -1
  279. package/node_modules/@openrig/daemon/dist/domain/model-divergence/current-generation-record.d.ts +67 -0
  280. package/node_modules/@openrig/daemon/dist/domain/model-divergence/current-generation-record.d.ts.map +1 -0
  281. package/node_modules/@openrig/daemon/dist/domain/model-divergence/current-generation-record.js +204 -0
  282. package/node_modules/@openrig/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -0
  283. package/node_modules/@openrig/daemon/dist/domain/model-divergence/effective-model-readers.d.ts +13 -0
  284. package/node_modules/@openrig/daemon/dist/domain/model-divergence/effective-model-readers.d.ts.map +1 -0
  285. package/node_modules/@openrig/daemon/dist/domain/model-divergence/effective-model-readers.js +163 -0
  286. package/node_modules/@openrig/daemon/dist/domain/model-divergence/effective-model-readers.js.map +1 -0
  287. package/node_modules/@openrig/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts +113 -0
  288. package/node_modules/@openrig/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts.map +1 -0
  289. package/node_modules/@openrig/daemon/dist/domain/model-divergence/model-divergence-monitor.js +190 -0
  290. package/node_modules/@openrig/daemon/dist/domain/model-divergence/model-divergence-monitor.js.map +1 -0
  291. package/node_modules/@openrig/daemon/dist/domain/predecessor-recap-resolver.d.ts +10 -3
  292. package/node_modules/@openrig/daemon/dist/domain/predecessor-recap-resolver.d.ts.map +1 -1
  293. package/node_modules/@openrig/daemon/dist/domain/predecessor-recap-resolver.js +61 -14
  294. package/node_modules/@openrig/daemon/dist/domain/predecessor-recap-resolver.js.map +1 -1
  295. package/node_modules/@openrig/daemon/dist/domain/resume-metadata-refresher.d.ts +11 -2
  296. package/node_modules/@openrig/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
  297. package/node_modules/@openrig/daemon/dist/domain/resume-metadata-refresher.js +17 -9
  298. package/node_modules/@openrig/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
  299. package/node_modules/@openrig/daemon/dist/domain/review/gather.d.ts.map +1 -1
  300. package/node_modules/@openrig/daemon/dist/domain/review/gather.js +3 -2
  301. package/node_modules/@openrig/daemon/dist/domain/review/gather.js.map +1 -1
  302. package/node_modules/@openrig/daemon/dist/domain/{rig-policy/rig-policy-defaults.d.ts → rig-mode/rig-mode-defaults.d.ts} +2 -2
  303. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-defaults.d.ts.map +1 -0
  304. package/node_modules/@openrig/daemon/dist/domain/{rig-policy/rig-policy-defaults.js → rig-mode/rig-mode-defaults.js} +1 -1
  305. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-defaults.js.map +1 -0
  306. package/{daemon/dist/domain/rig-policy/rig-policy-store.d.ts → node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-store.d.ts} +6 -6
  307. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-store.d.ts.map +1 -0
  308. package/node_modules/@openrig/daemon/dist/domain/{rig-policy/rig-policy-store.js → rig-mode/rig-mode-store.js} +5 -5
  309. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-store.js.map +1 -0
  310. package/node_modules/@openrig/daemon/dist/domain/{rig-policy/rig-policy-types.d.ts → rig-mode/rig-mode-types.d.ts} +1 -1
  311. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-types.d.ts.map +1 -0
  312. package/{daemon/dist/domain/rig-policy/rig-policy-types.js → node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-types.js} +1 -1
  313. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-types.js.map +1 -0
  314. package/{daemon/dist/domain/rig-policy/rig-policy-validator.d.ts → node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-validator.d.ts} +2 -2
  315. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-validator.d.ts.map +1 -0
  316. package/node_modules/@openrig/daemon/dist/domain/{rig-policy/rig-policy-validator.js → rig-mode/rig-mode-validator.js} +3 -3
  317. package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-validator.js.map +1 -0
  318. package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.d.ts +7 -0
  319. package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  320. package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.js +7 -0
  321. package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.js.map +1 -1
  322. package/node_modules/@openrig/daemon/dist/domain/scope/node-file.d.ts +37 -0
  323. package/node_modules/@openrig/daemon/dist/domain/scope/node-file.d.ts.map +1 -0
  324. package/node_modules/@openrig/daemon/dist/domain/scope/node-file.js +55 -0
  325. package/node_modules/@openrig/daemon/dist/domain/scope/node-file.js.map +1 -0
  326. package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +11 -0
  327. package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -1
  328. package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.js +40 -0
  329. package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -1
  330. package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.d.ts +4 -0
  331. package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
  332. package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.js +56 -7
  333. package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.js.map +1 -1
  334. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts +1 -1
  335. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  336. package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  337. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
  338. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js +5 -2
  339. package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
  340. package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.d.ts +32 -15
  341. package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
  342. package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.js +42 -17
  343. package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.js.map +1 -1
  344. package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.d.ts +17 -0
  345. package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.d.ts.map +1 -1
  346. package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.js +22 -0
  347. package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.js.map +1 -1
  348. package/node_modules/@openrig/daemon/dist/domain/session-jsonl.js +1 -1
  349. package/node_modules/@openrig/daemon/dist/domain/session-jsonl.js.map +1 -1
  350. package/node_modules/@openrig/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -1
  351. package/node_modules/@openrig/daemon/dist/domain/slices/slice-detail-projector.js +14 -2
  352. package/node_modules/@openrig/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
  353. package/node_modules/@openrig/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -1
  354. package/node_modules/@openrig/daemon/dist/domain/slices/slice-indexer.js +16 -3
  355. package/node_modules/@openrig/daemon/dist/domain/slices/slice-indexer.js.map +1 -1
  356. package/node_modules/@openrig/daemon/dist/domain/spec-live-conformance.d.ts +22 -0
  357. package/node_modules/@openrig/daemon/dist/domain/spec-live-conformance.d.ts.map +1 -1
  358. package/node_modules/@openrig/daemon/dist/domain/spec-live-conformance.js +35 -0
  359. package/node_modules/@openrig/daemon/dist/domain/spec-live-conformance.js.map +1 -1
  360. package/node_modules/@openrig/daemon/dist/domain/sync-site-wrap.d.ts +9 -0
  361. package/node_modules/@openrig/daemon/dist/domain/sync-site-wrap.d.ts.map +1 -1
  362. package/node_modules/@openrig/daemon/dist/domain/sync-site-wrap.js +11 -0
  363. package/node_modules/@openrig/daemon/dist/domain/sync-site-wrap.js.map +1 -1
  364. package/node_modules/@openrig/daemon/dist/domain/types.d.ts +15 -0
  365. package/node_modules/@openrig/daemon/dist/domain/types.d.ts.map +1 -1
  366. package/node_modules/@openrig/daemon/dist/domain/types.js.map +1 -1
  367. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  368. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  369. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js +20 -0
  370. package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  371. package/node_modules/@openrig/daemon/dist/domain/watchdog-auto-registration.d.ts +7 -0
  372. package/node_modules/@openrig/daemon/dist/domain/watchdog-auto-registration.d.ts.map +1 -1
  373. package/node_modules/@openrig/daemon/dist/domain/watchdog-auto-registration.js +27 -0
  374. package/node_modules/@openrig/daemon/dist/domain/watchdog-auto-registration.js.map +1 -1
  375. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
  376. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js +4 -3
  377. package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
  378. package/node_modules/@openrig/daemon/dist/routes/activity.js +11 -2
  379. package/node_modules/@openrig/daemon/dist/routes/activity.js.map +1 -1
  380. package/node_modules/@openrig/daemon/dist/routes/bundles.d.ts +27 -0
  381. package/node_modules/@openrig/daemon/dist/routes/bundles.d.ts.map +1 -1
  382. package/node_modules/@openrig/daemon/dist/routes/bundles.js +107 -26
  383. package/node_modules/@openrig/daemon/dist/routes/bundles.js.map +1 -1
  384. package/node_modules/@openrig/daemon/dist/routes/crash-cart.d.ts +4 -0
  385. package/node_modules/@openrig/daemon/dist/routes/crash-cart.d.ts.map +1 -0
  386. package/node_modules/@openrig/daemon/dist/routes/crash-cart.js +144 -0
  387. package/node_modules/@openrig/daemon/dist/routes/crash-cart.js.map +1 -0
  388. package/node_modules/@openrig/daemon/dist/routes/missions.d.ts.map +1 -1
  389. package/node_modules/@openrig/daemon/dist/routes/missions.js +10 -6
  390. package/node_modules/@openrig/daemon/dist/routes/missions.js.map +1 -1
  391. package/node_modules/@openrig/daemon/dist/routes/{rig-policy.d.ts → rig-mode.d.ts} +3 -3
  392. package/node_modules/@openrig/daemon/dist/routes/rig-mode.d.ts.map +1 -0
  393. package/{daemon/dist/routes/rig-policy.js → node_modules/@openrig/daemon/dist/routes/rig-mode.js} +13 -13
  394. package/node_modules/@openrig/daemon/dist/routes/rig-mode.js.map +1 -0
  395. package/node_modules/@openrig/daemon/dist/routes/scope-approve.d.ts.map +1 -1
  396. package/node_modules/@openrig/daemon/dist/routes/scope-approve.js +4 -0
  397. package/node_modules/@openrig/daemon/dist/routes/scope-approve.js.map +1 -1
  398. package/node_modules/@openrig/daemon/dist/routes/scope-audit.d.ts.map +1 -1
  399. package/node_modules/@openrig/daemon/dist/routes/scope-audit.js +29 -2
  400. package/node_modules/@openrig/daemon/dist/routes/scope-audit.js.map +1 -1
  401. package/node_modules/@openrig/daemon/dist/routes/seat.js +7 -2
  402. package/node_modules/@openrig/daemon/dist/routes/seat.js.map +1 -1
  403. package/node_modules/@openrig/daemon/dist/routes/sessions.d.ts.map +1 -1
  404. package/node_modules/@openrig/daemon/dist/routes/sessions.js +11 -1
  405. package/node_modules/@openrig/daemon/dist/routes/sessions.js.map +1 -1
  406. package/node_modules/@openrig/daemon/dist/server.d.ts +3 -1
  407. package/node_modules/@openrig/daemon/dist/server.d.ts.map +1 -1
  408. package/node_modules/@openrig/daemon/dist/server.js +15 -5
  409. package/node_modules/@openrig/daemon/dist/server.js.map +1 -1
  410. package/node_modules/@openrig/daemon/dist/startup.d.ts.map +1 -1
  411. package/node_modules/@openrig/daemon/dist/startup.js +134 -5
  412. package/node_modules/@openrig/daemon/dist/startup.js.map +1 -1
  413. package/node_modules/@openrig/daemon/package.json +1 -1
  414. package/package.json +1 -1
  415. package/tui/dist/crash-cart/from-emit.d.ts +9 -0
  416. package/tui/dist/crash-cart/from-emit.d.ts.map +1 -1
  417. package/tui/dist/crash-cart/from-emit.js.map +1 -1
  418. package/tui/dist/crash-cart/keys.d.ts +1 -1
  419. package/tui/dist/crash-cart/keys.d.ts.map +1 -1
  420. package/tui/dist/crash-cart/keys.js +13 -2
  421. package/tui/dist/crash-cart/keys.js.map +1 -1
  422. package/tui/dist/crash-cart/one-click-gate.d.ts +5 -0
  423. package/tui/dist/crash-cart/one-click-gate.d.ts.map +1 -1
  424. package/tui/dist/crash-cart/one-click-gate.js +8 -0
  425. package/tui/dist/crash-cart/one-click-gate.js.map +1 -1
  426. package/tui/dist/crash-cart/render-crash-cart.d.ts +11 -0
  427. package/tui/dist/crash-cart/render-crash-cart.d.ts.map +1 -1
  428. package/tui/dist/crash-cart/render-crash-cart.js +113 -0
  429. package/tui/dist/crash-cart/render-crash-cart.js.map +1 -1
  430. package/tui/dist/crash-cart/restore-input.d.ts +32 -0
  431. package/tui/dist/crash-cart/restore-input.d.ts.map +1 -0
  432. package/tui/dist/crash-cart/restore-input.js +37 -0
  433. package/tui/dist/crash-cart/restore-input.js.map +1 -0
  434. package/tui/dist/crash-cart/restore-lifecycle.d.ts +66 -0
  435. package/tui/dist/crash-cart/restore-lifecycle.d.ts.map +1 -0
  436. package/tui/dist/crash-cart/restore-lifecycle.js +96 -0
  437. package/tui/dist/crash-cart/restore-lifecycle.js.map +1 -0
  438. package/tui/dist/crash-cart/restore-scroll.d.ts +14 -0
  439. package/tui/dist/crash-cart/restore-scroll.d.ts.map +1 -0
  440. package/tui/dist/crash-cart/restore-scroll.js +27 -0
  441. package/tui/dist/crash-cart/restore-scroll.js.map +1 -0
  442. package/tui/dist/daemon-client.d.ts +38 -0
  443. package/tui/dist/daemon-client.d.ts.map +1 -1
  444. package/tui/dist/daemon-client.js +15 -0
  445. package/tui/dist/daemon-client.js.map +1 -1
  446. package/tui/dist/main.js +146 -2
  447. package/tui/dist/main.js.map +1 -1
  448. package/tui/dist/render.d.ts +10 -0
  449. package/tui/dist/render.d.ts.map +1 -1
  450. package/tui/dist/render.js +63 -10
  451. package/tui/dist/render.js.map +1 -1
  452. package/daemon/dist/domain/rig-policy/rig-policy-defaults.d.ts.map +0 -1
  453. package/daemon/dist/domain/rig-policy/rig-policy-defaults.js.map +0 -1
  454. package/daemon/dist/domain/rig-policy/rig-policy-store.d.ts.map +0 -1
  455. package/daemon/dist/domain/rig-policy/rig-policy-store.js.map +0 -1
  456. package/daemon/dist/domain/rig-policy/rig-policy-types.d.ts.map +0 -1
  457. package/daemon/dist/domain/rig-policy/rig-policy-types.js.map +0 -1
  458. package/daemon/dist/domain/rig-policy/rig-policy-validator.d.ts.map +0 -1
  459. package/daemon/dist/domain/rig-policy/rig-policy-validator.js.map +0 -1
  460. package/daemon/dist/routes/rig-policy.d.ts.map +0 -1
  461. package/daemon/dist/routes/rig-policy.js.map +0 -1
  462. package/dist/commands/rig-policy.d.ts.map +0 -1
  463. package/dist/commands/rig-policy.js.map +0 -1
  464. package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-defaults.d.ts.map +0 -1
  465. package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-defaults.js.map +0 -1
  466. package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-store.d.ts.map +0 -1
  467. package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-store.js.map +0 -1
  468. package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-types.d.ts.map +0 -1
  469. package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-types.js.map +0 -1
  470. package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-validator.d.ts.map +0 -1
  471. package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-validator.js.map +0 -1
  472. package/node_modules/@openrig/daemon/dist/routes/rig-policy.d.ts.map +0 -1
  473. package/node_modules/@openrig/daemon/dist/routes/rig-policy.js.map +0 -1
@@ -0,0 +1,173 @@
1
+ /** The shipped closed per-rig union (never widened at the fleet layer). `not_attempted`
2
+ * is first-class — a rig the conductor did not reach (no usable snapshot, or cancelled). */
3
+ export type PerRigOutcome = "fully_restored" | "partially_restored" | "failed" | "not_attempted";
4
+ /** One rig's conductor result. `receiptRef` references the durable restore event/attempt
5
+ * seq (the ledger lineage) — the conductor RENDERS receipts, it never re-authors them. */
6
+ export interface ConductorRigResult {
7
+ rigId: string;
8
+ outcome: PerRigOutcome;
9
+ receiptRef?: string | number;
10
+ /** Per-rig triage rows (seats needing operator action) — the fleet
11
+ * attention_required is the UNION of these across the sequence. */
12
+ attention?: AttentionRow[];
13
+ /** R3 — for a `not_attempted` rig, WHY it was skipped (no honest gap left blank). */
14
+ reason?: string;
15
+ /** R3 — the operator action that would let this rig be restored next time. */
16
+ remediation?: string;
17
+ }
18
+ export interface RestoreConductorDeps {
19
+ /** Rigs in restore order — KERNEL FIRST (the supervisor), then the rest. */
20
+ listRigsInOrder: () => Array<{
21
+ rigId: string;
22
+ isKernel: boolean;
23
+ }>;
24
+ /** Restore ONE rig. Default (wired at the route) = findLatestRestoreUsable(rigId) →
25
+ * RestoreOrchestrator.restore(snapshotId) → rollupRestoreRigResult; a rig with no
26
+ * usable snapshot returns `not_attempted` (never a silent older/partial substitute). */
27
+ restoreRig: (rigId: string) => Promise<{
28
+ outcome: PerRigOutcome;
29
+ receiptRef?: string | number;
30
+ attention?: AttentionRow[];
31
+ reason?: string;
32
+ remediation?: string;
33
+ }>;
34
+ /** Cancel signal, polled at each rig BOUNDARY (stop-before-next-rig). Optional. */
35
+ isCancelled?: () => boolean;
36
+ }
37
+ export declare class RestoreConductor {
38
+ private readonly deps;
39
+ constructor(deps: RestoreConductorDeps);
40
+ /** Restore the fleet, kernel-first, best-effort, honoring stop-before-next-rig cancel.
41
+ * Returns the ordered per-rig sequence (Atom C aggregates it into the FleetRollup). */
42
+ restoreFleet(opts?: {
43
+ onRigDone?: (result: ConductorRigResult) => void;
44
+ }): Promise<ConductorRigResult[]>;
45
+ }
46
+ /** Deps for the DEFAULT per-rig restore — structurally typed so the conductor stays
47
+ * decoupled from the full orchestrator (the real wiring passes
48
+ * `snapshotRepo.findLatestRestoreUsable` and `RestoreOrchestrator.restore`, whose
49
+ * RestoreOutcome satisfies this shape). */
50
+ export interface RestoreRigDeps {
51
+ /** Newest restore-usable snapshot for the rig, or null (→ `not_attempted`; never a silent substitute). */
52
+ findLatestRestoreUsable: (rigId: string) => {
53
+ id: string;
54
+ } | null;
55
+ /** The shipped per-rig restore. `onAttemptStarted` yields the restore-started event seq = the receipt ref. */
56
+ restore: (snapshotId: string, opts?: {
57
+ onAttemptStarted?: (attemptId: number) => void;
58
+ }) => Promise<{
59
+ ok: boolean;
60
+ result?: {
61
+ rigResult: PerRigOutcome;
62
+ nodes?: RestoreNodeLite[];
63
+ };
64
+ }>;
65
+ }
66
+ /** One seat of the subset-launch result, structurally the shipped RestoreNodeResult
67
+ * subset the triage mapper reads. */
68
+ export interface AdoptSubsetSeat extends RestoreNodeLite {
69
+ logicalId: string;
70
+ }
71
+ /** Structural slice of RestoreOrchestrator.launchNodeSubset's result — the shipped
72
+ * per-seat resume-verification machinery (FR-7: an unverifiable resume fail-closes
73
+ * to awaiting-decision carrying the exact `--fresh <logicalId>` remediation). */
74
+ export interface AdoptSubsetResult {
75
+ ok: boolean;
76
+ code?: string;
77
+ message?: string;
78
+ launched?: AdoptSubsetSeat[];
79
+ held?: Array<{
80
+ logicalId: string;
81
+ reason: string;
82
+ }>;
83
+ alreadyRunning?: Array<{
84
+ logicalId: string;
85
+ }>;
86
+ failedTargets?: Array<{
87
+ logicalId: string;
88
+ reason: string;
89
+ }>;
90
+ }
91
+ export interface AdoptRigDeps {
92
+ /** The rig's DB-running sessions whose tmux panes are ALIVE — the same
93
+ * classification restore's 409 guard runs (sessionRegistry rows ×
94
+ * tmuxAdapter.hasSession); the conductor never invents a probe. */
95
+ probeLiveSessions: (rigId: string) => Promise<Array<{
96
+ sessionName: string;
97
+ logicalId: string;
98
+ }>>;
99
+ /** The shipped no-launch adopt (ClaimService.reconcileSession — the
100
+ * `rig reconcile-session` precedent): session state only, never input. */
101
+ reconcileSession: (sessionName: string) => Promise<{
102
+ ok: boolean;
103
+ code?: string;
104
+ message?: string;
105
+ }>;
106
+ /** The rig's full seat roster (logical ids) — adoption's complement is what
107
+ * per-seat resume verification must cover. */
108
+ listRigSeats: (rigId: string) => string[];
109
+ /** The shipped subset launcher over the NOT-adopted seats. */
110
+ launchNodeSubset: (rigId: string, logicalIds: string[]) => Promise<AdoptSubsetResult>;
111
+ }
112
+ /** Build the default `restoreRig` dep: COMPOSE findLatestRestoreUsable → restore →
113
+ * rigResult. A rig with no usable snapshot is `not_attempted` (restore never runs);
114
+ * a restore that fails outright is `failed`. Never re-authors restore logic.
115
+ * With `adoptDeps` wired (Amendment 2), a rig whose panes survived takes the ADOPT
116
+ * branch above; DEAD panes (and callers without adoptDeps) run unchanged. */
117
+ export declare function createDefaultRestoreRig(_deps: RestoreRigDeps, adoptDeps?: AdoptRigDeps): (rigId: string) => Promise<{
118
+ outcome: PerRigOutcome;
119
+ receiptRef?: number;
120
+ attention?: AttentionRow[];
121
+ reason?: string;
122
+ remediation?: string;
123
+ }>;
124
+ export interface RigOrderDeps {
125
+ /** All (non-archived) rigs on this host — the conductor's fleet scope, v1. */
126
+ listRigs: () => Array<{
127
+ id: string;
128
+ name: string;
129
+ }>;
130
+ }
131
+ /** R2 — the founder's order: the KERNEL rig (the supervisor, name "kernel") restores
132
+ * FIRST, then the remaining rigs in listRigs order. No kernel rig → all rigs, none
133
+ * flagged kernel (honest, never fabricated). This is the `listRigsInOrder` source the
134
+ * conductor consumes. */
135
+ export declare function listRigsInKernelFirstOrder(deps: RigOrderDeps): Array<{
136
+ rigId: string;
137
+ isKernel: boolean;
138
+ }>;
139
+ /** A triage row: a seat + exactly what it needs (picker/auth/remediation), sourced
140
+ * from the shipped per-rig restore-check attention projection. The fleet
141
+ * `attention_required` is the UNION of these across rigs — a VIEW, not a parallel record. */
142
+ export interface AttentionRow {
143
+ rigId: string;
144
+ seat: string;
145
+ need: string;
146
+ }
147
+ /** Fleet rollup — PURE AGGREGATION over the conductor's per-rig sequence. The per-rig
148
+ * outcome stays the shipped CLOSED union (never widened). NO fleet verdict is stored
149
+ * here — a stored verdict could drift from the per-rig truth; derive it on demand via
150
+ * {@link deriveFleetVerdict}. `not_attempted` is first-class (never folded into failed). */
151
+ export interface FleetRollup {
152
+ counts: Record<PerRigOutcome, number>;
153
+ sequence: ConductorRigResult[];
154
+ attention_required: AttentionRow[];
155
+ }
156
+ /** The fleet verdict is a DERIVED function of the counts — never a stored field. */
157
+ export type FleetVerdict = "all_fully_restored" | "all_failed" | "none_attempted" | "mixed";
158
+ /** A restore node (structural subset of the shipped RestoreNodeResult) — enough to
159
+ * build a triage row from the seats that need operator action. */
160
+ export interface RestoreNodeLite {
161
+ logicalId: string;
162
+ status: string;
163
+ error?: string;
164
+ attentionEvidence?: string | null;
165
+ }
166
+ /** R5 — map a rig's restore nodes → triage rows: the seats needing operator action
167
+ * (a LIVE runtime prompt, an unresumable session, or a hard failure), each with its
168
+ * EXACT need. Running/resumed nodes are excluded. Never fabricates a need. */
169
+ export declare function attentionRowsFromNodes(rigId: string, nodes: RestoreNodeLite[]): AttentionRow[];
170
+ export declare function aggregateFleetRollup(sequence: ConductorRigResult[]): FleetRollup;
171
+ /** DERIVED f(counts) — computed, never stored (a stored verdict could drift). */
172
+ export declare function deriveFleetVerdict(counts: Record<PerRigOutcome, number>): FleetVerdict;
173
+ //# sourceMappingURL=crash-cart-conductor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crash-cart-conductor.d.ts","sourceRoot":"","sources":["../../src/domain/crash-cart-conductor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,233 @@
1
+ // B1 — Crash-cart RESTORE CONDUCTOR (daemon-side batch verb). Plan-locked
2
+ // (workspace/missions/release-0.5.2/B1-CRASH-CART-CONDUCTOR-PLAN-2026-08-21, content-hash 84401cd4).
3
+ //
4
+ // Atom B — the conductor CORE. It restores the fleet's rigs in the founder's
5
+ // order (kernel rig first, then the rest, sequential v1), COMPOSING the shipped
6
+ // per-rig restore (findLatestRestoreUsable + RestoreOrchestrator.restore) via an
7
+ // injectable `restoreRig` dep — it does NOT re-author restore logic. Best-effort:
8
+ // one rig's failure never halts the fleet. Cancel is STOP-BEFORE-NEXT-RIG: the
9
+ // in-flight rig runs to its own outcome; rigs not yet started become
10
+ // `not_attempted` (Atom A/C wire discovery + the fleet rollup; Atom D the TUI ⏎).
11
+ export class RestoreConductor {
12
+ deps;
13
+ constructor(deps) {
14
+ this.deps = deps;
15
+ }
16
+ /** Restore the fleet, kernel-first, best-effort, honoring stop-before-next-rig cancel.
17
+ * Returns the ordered per-rig sequence (Atom C aggregates it into the FleetRollup). */
18
+ async restoreFleet(opts) {
19
+ const rigs = this.deps.listRigsInOrder(); // kernel first, then the rest
20
+ const results = [];
21
+ // Progress "stream": each rig's result is emitted as it completes so the
22
+ // route can update a pollable rollup while the fleet restore continues
23
+ // (the locked async shape — the route answers on-commit, never blocks to
24
+ // completion). onRigDone stubbed until wired below (RED-first).
25
+ const record = (result) => {
26
+ results.push(result);
27
+ opts?.onRigDone?.(result); // emit progress as each rig completes
28
+ };
29
+ for (const rig of rigs) {
30
+ // Stop-before-next-rig: poll cancel at the rig BOUNDARY, before this rig
31
+ // starts. A rig already in flight is never interrupted; rigs not yet
32
+ // reached become `not_attempted` (honest, never silently dropped).
33
+ if (this.deps.isCancelled?.()) {
34
+ record({
35
+ rigId: rig.rigId,
36
+ outcome: "not_attempted",
37
+ reason: "cancelled before this rig started (stop-before-next-rig)",
38
+ remediation: "re-run the fleet restore to attempt this rig",
39
+ });
40
+ continue;
41
+ }
42
+ try {
43
+ const r = await this.deps.restoreRig(rig.rigId);
44
+ record({
45
+ rigId: rig.rigId,
46
+ outcome: r.outcome,
47
+ receiptRef: r.receiptRef,
48
+ attention: r.attention,
49
+ reason: r.reason,
50
+ remediation: r.remediation,
51
+ });
52
+ }
53
+ catch {
54
+ // Best-effort continue: one rig's failure never halts the fleet.
55
+ record({ rigId: rig.rigId, outcome: "failed" });
56
+ }
57
+ }
58
+ return results;
59
+ }
60
+ }
61
+ /** LIVE-panes branch: adopt every surviving session, then per-seat resume
62
+ * verification for the rest, folding into the UNCHANGED closed union. A seat is
63
+ * OK iff it yields no triage row (attentionRowsFromNodes is the single non-OK
64
+ * authority, so the fold cannot invent a fifth outcome or a second mapping). */
65
+ async function adoptLivePanesRig(rigId, live, deps) {
66
+ const nodes = [];
67
+ const adoptedIds = new Set();
68
+ for (const seat of live) {
69
+ const adopted = await deps.reconcileSession(seat.sessionName);
70
+ if (adopted.ok) {
71
+ adoptedIds.add(seat.logicalId);
72
+ nodes.push({ logicalId: seat.logicalId, status: "resumed" });
73
+ }
74
+ else {
75
+ nodes.push({
76
+ logicalId: seat.logicalId,
77
+ status: "failed",
78
+ error: `adopt failed for surviving session "${seat.sessionName}": ${adopted.message ?? adopted.code ?? "unknown"}`,
79
+ });
80
+ }
81
+ }
82
+ if (adoptedIds.size === 0) {
83
+ // The stamped mis-probe analysis: probe-says-LIVE on a dead rig → adopt fails
84
+ // EMPTY (honest). Never proceed to launches on a rig the adoption itself just
85
+ // proved has no surviving session — re-running takes the restore path.
86
+ return {
87
+ outcome: "not_attempted",
88
+ reason: "probe saw live panes but no surviving session could be adopted (panes likely died between probe and adopt)",
89
+ remediation: "re-run the fleet restore — a genuinely stopped rig takes the snapshot-restore path",
90
+ attention: attentionRowsFromNodes(rigId, nodes),
91
+ };
92
+ }
93
+ const remaining = deps.listRigSeats(rigId).filter((id) => !adoptedIds.has(id));
94
+ if (remaining.length > 0) {
95
+ const subset = await deps.launchNodeSubset(rigId, remaining);
96
+ if (subset.ok) {
97
+ for (const n of subset.launched ?? [])
98
+ nodes.push(n);
99
+ for (const a of subset.alreadyRunning ?? []) {
100
+ // r1 LOW: a seat whose ADOPT failed can still be proven LIVE by the launcher
101
+ // (it classifies targets against tmux itself). The seat is RUNNING — drop the
102
+ // stale adopt-failure node, or triage would name a running seat as its "need".
103
+ const staleFailed = nodes.findIndex((n) => n.logicalId === a.logicalId && n.status === "failed");
104
+ if (staleFailed >= 0)
105
+ nodes.splice(staleFailed, 1);
106
+ nodes.push({ logicalId: a.logicalId, status: "resumed" });
107
+ }
108
+ for (const f of subset.failedTargets ?? [])
109
+ nodes.push({ logicalId: f.logicalId, status: "failed", error: `resume verification could not run: ${f.reason}` });
110
+ for (const h of subset.held ?? [])
111
+ nodes.push({ logicalId: h.logicalId, status: "attention_required", attentionEvidence: `held from launch — ${h.reason}` });
112
+ }
113
+ else {
114
+ // A whole-subset refusal (e.g. no usable snapshot) leaves every remaining seat
115
+ // unverified — each gets a NAMED row; silence here would be the round-10 gap again.
116
+ for (const id of remaining)
117
+ nodes.push({ logicalId: id, status: "failed", error: `per-seat resume verification unavailable: ${subset.message ?? subset.code ?? "launch subset failed"}` });
118
+ }
119
+ }
120
+ const attention = attentionRowsFromNodes(rigId, nodes);
121
+ // R6 closed union, per the amendment: all seats re-attached+verified →
122
+ // fully_restored; some non-resumable → partially_restored (their exact needs ride
123
+ // the triage rows). adoptedIds.size > 0 guarantees at least one OK seat here.
124
+ return attention.length === 0
125
+ ? { outcome: "fully_restored", attention }
126
+ : { outcome: "partially_restored", attention };
127
+ }
128
+ /** Build the default `restoreRig` dep: COMPOSE findLatestRestoreUsable → restore →
129
+ * rigResult. A rig with no usable snapshot is `not_attempted` (restore never runs);
130
+ * a restore that fails outright is `failed`. Never re-authors restore logic.
131
+ * With `adoptDeps` wired (Amendment 2), a rig whose panes survived takes the ADOPT
132
+ * branch above; DEAD panes (and callers without adoptDeps) run unchanged. */
133
+ export function createDefaultRestoreRig(_deps, adoptDeps) {
134
+ return async (rigId) => {
135
+ if (adoptDeps) {
136
+ const live = await adoptDeps.probeLiveSessions(rigId);
137
+ // Adopt has NO restore-attempt receipt: its ledger lineage is the
138
+ // node.reconciled events the shipped adopt emits per seat.
139
+ if (live.length > 0)
140
+ return adoptLivePanesRig(rigId, live, adoptDeps);
141
+ }
142
+ const snapshot = _deps.findLatestRestoreUsable(rigId);
143
+ if (!snapshot)
144
+ // no usable snapshot — never a silent substitute; R3: carry WHY + the fix.
145
+ return {
146
+ outcome: "not_attempted",
147
+ reason: "no restore-usable snapshot for this rig",
148
+ remediation: "take a snapshot (rig snapshot create) or mark an existing one restore-usable",
149
+ };
150
+ let receiptRef;
151
+ const outcome = await _deps.restore(snapshot.id, {
152
+ onAttemptStarted: (attemptId) => {
153
+ receiptRef = attemptId;
154
+ },
155
+ });
156
+ // ok:true → result.rigResult; ok:false WITH a result (e.g. pre-restore validation
157
+ // fail → `not_attempted`) → its rigResult; ok:false with no result (a hard failure:
158
+ // snapshot/rig not found, rig not stopped, restore in progress) → `failed`.
159
+ const outcomeResult = outcome.result?.rigResult ?? "failed";
160
+ // Triage rows for this rig's seats that need operator action (from the restore
161
+ // result's nodes) — the shipped per-rig attention, unioned at the fleet layer.
162
+ const attention = outcome.result?.nodes ? attentionRowsFromNodes(rigId, outcome.result.nodes) : [];
163
+ return { outcome: outcomeResult, receiptRef, attention };
164
+ };
165
+ }
166
+ /** R2 — the founder's order: the KERNEL rig (the supervisor, name "kernel") restores
167
+ * FIRST, then the remaining rigs in listRigs order. No kernel rig → all rigs, none
168
+ * flagged kernel (honest, never fabricated). This is the `listRigsInOrder` source the
169
+ * conductor consumes. */
170
+ export function listRigsInKernelFirstOrder(deps) {
171
+ const all = deps.listRigs();
172
+ const kernel = all.filter((r) => r.name === "kernel");
173
+ const rest = all.filter((r) => r.name !== "kernel");
174
+ return [...kernel, ...rest].map((r) => ({ rigId: r.id, isKernel: r.name === "kernel" }));
175
+ }
176
+ /** R5 — map a rig's restore nodes → triage rows: the seats needing operator action
177
+ * (a LIVE runtime prompt, an unresumable session, or a hard failure), each with its
178
+ * EXACT need. Running/resumed nodes are excluded. Never fabricates a need. */
179
+ export function attentionRowsFromNodes(rigId, nodes) {
180
+ const rows = [];
181
+ for (const n of nodes) {
182
+ if (n.status === "attention_required") {
183
+ rows.push({
184
+ rigId,
185
+ seat: n.logicalId,
186
+ need: n.attentionEvidence
187
+ ? `live runtime prompt — ${n.attentionEvidence}`
188
+ : "live runtime prompt (resume selection / auth) — needs operator",
189
+ });
190
+ }
191
+ else if (n.status === "awaiting-decision") {
192
+ // BLOCKER 3 — preserve the shipped orchestrator's EXACT error/remediation (it carries the concrete
193
+ // `--fresh <logicalId>` command and reason); only fall back to the generic sentence when the node
194
+ // carried none. The exact need reaching the operator IS the door's "seat + exact need" acceptance.
195
+ rows.push({
196
+ rigId,
197
+ seat: n.logicalId,
198
+ need: n.error ? n.error : "original session not resumable and no --fresh — choose fresh-prime or skip",
199
+ });
200
+ }
201
+ else if (n.status === "failed") {
202
+ rows.push({ rigId, seat: n.logicalId, need: n.error ? `restore failed: ${n.error}` : "restore failed" });
203
+ }
204
+ }
205
+ return rows;
206
+ }
207
+ export function aggregateFleetRollup(sequence) {
208
+ // All four closed-union keys initialized — `not_attempted` is first-class, never
209
+ // absent and never folded into `failed`.
210
+ const counts = {
211
+ fully_restored: 0,
212
+ partially_restored: 0,
213
+ failed: 0,
214
+ not_attempted: 0,
215
+ };
216
+ for (const r of sequence)
217
+ counts[r.outcome] += 1;
218
+ // attention_required = the UNION of per-rig triage rows carried in the sequence (a view).
219
+ const attention_required = sequence.flatMap((r) => r.attention ?? []);
220
+ return { counts, sequence, attention_required };
221
+ }
222
+ /** DERIVED f(counts) — computed, never stored (a stored verdict could drift). */
223
+ export function deriveFleetVerdict(counts) {
224
+ const total = counts.fully_restored + counts.partially_restored + counts.failed + counts.not_attempted;
225
+ if (total === 0 || counts.not_attempted === total)
226
+ return "none_attempted";
227
+ if (counts.fully_restored === total)
228
+ return "all_fully_restored";
229
+ if (counts.failed === total)
230
+ return "all_failed";
231
+ return "mixed";
232
+ }
233
+ //# sourceMappingURL=crash-cart-conductor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crash-cart-conductor.js","sourceRoot":"","sources":["../../src/domain/crash-cart-conductor.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,qGAAqG;AACrG,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,+EAA+E;AAC/E,qEAAqE;AACrE,kFAAkF;AAkClF,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,IAA0B;QAA1B,SAAI,GAAJ,IAAI,CAAsB;IAAG,CAAC;IAE3D;4FACwF;IACxF,KAAK,CAAC,YAAY,CAAC,IAA2D;QAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,8BAA8B;QACxE,MAAM,OAAO,GAAyB,EAAE,CAAC;QACzC,yEAAyE;QACzE,uEAAuE;QACvE,yEAAyE;QACzE,gEAAgE;QAChE,MAAM,MAAM,GAAG,CAAC,MAA0B,EAAE,EAAE;YAC5C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,IAAI,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,sCAAsC;QACnE,CAAC,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,yEAAyE;YACzE,qEAAqE;YACrE,mEAAmE;YACnE,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;gBAC9B,MAAM,CAAC;oBACL,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,OAAO,EAAE,eAAe;oBACxB,MAAM,EAAE,0DAA0D;oBAClE,WAAW,EAAE,8CAA8C;iBAC5D,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAChD,MAAM,CAAC;oBACL,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,WAAW,EAAE,CAAC,CAAC,WAAW;iBAC3B,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,iEAAiE;gBACjE,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AA0DD;;;iFAGiF;AACjF,KAAK,UAAU,iBAAiB,CAC9B,KAAa,EACb,IAAuD,EACvD,IAAkB;IAElB,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9D,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACf,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC;gBACT,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,uCAAuC,IAAI,CAAC,WAAW,MAAM,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,SAAS,EAAE;aACnH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC1B,8EAA8E;QAC9E,8EAA8E;QAC9E,uEAAuE;QACvE,OAAO;YACL,OAAO,EAAE,eAAe;YACxB,MAAM,EAAE,4GAA4G;YACpH,WAAW,EAAE,oFAAoF;YACjG,SAAS,EAAE,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC;SAChD,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;gBAC5C,6EAA6E;gBAC7E,8EAA8E;gBAC9E,+EAA+E;gBAC/E,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;gBACjG,IAAI,WAAW,IAAI,CAAC;oBAAE,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gBACnD,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5D,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,IAAI,EAAE;gBACxC,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,sCAAsC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACpH,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE;gBAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,sBAAsB,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9H,CAAC;aAAM,CAAC;YACN,+EAA+E;YAC/E,oFAAoF;YACpF,KAAK,MAAM,EAAE,IAAI,SAAS;gBACxB,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,6CAA6C,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,sBAAsB,EAAE,EAAE,CAAC,CAAC;QACnK,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACvD,uEAAuE;IACvE,kFAAkF;IAClF,8EAA8E;IAC9E,OAAO,SAAS,CAAC,MAAM,KAAK,CAAC;QAC3B,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE;QAC1C,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC;AACnD,CAAC;AAED;;;;8EAI8E;AAC9E,MAAM,UAAU,uBAAuB,CACrC,KAAqB,EACrB,SAAwB;IAExB,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACtD,kEAAkE;YAClE,2DAA2D;YAC3D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ;YACX,2EAA2E;YAC3E,OAAO;gBACL,OAAO,EAAE,eAAe;gBACxB,MAAM,EAAE,yCAAyC;gBACjD,WAAW,EAAE,8EAA8E;aAC5F,CAAC;QACJ,IAAI,UAA8B,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE;YAC/C,gBAAgB,EAAE,CAAC,SAAS,EAAE,EAAE;gBAC9B,UAAU,GAAG,SAAS,CAAC;YACzB,CAAC;SACF,CAAC,CAAC;QACH,kFAAkF;QAClF,oFAAoF;QACpF,4EAA4E;QAC5E,MAAM,aAAa,GAAkB,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,QAAQ,CAAC;QAC3E,+EAA+E;QAC/E,+EAA+E;QAC/E,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnG,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAC3D,CAAC,CAAC;AACJ,CAAC;AAOD;;;0BAG0B;AAC1B,MAAM,UAAU,0BAA0B,CACxC,IAAkB;IAElB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC3F,CAAC;AAmCD;;+EAE+E;AAC/E,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,KAAwB;IAC5E,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,MAAM,KAAK,oBAAoB,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC;gBACR,KAAK;gBACL,IAAI,EAAE,CAAC,CAAC,SAAS;gBACjB,IAAI,EAAE,CAAC,CAAC,iBAAiB;oBACvB,CAAC,CAAC,yBAAyB,CAAC,CAAC,iBAAiB,EAAE;oBAChD,CAAC,CAAC,gEAAgE;aACrE,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;YAC5C,mGAAmG;YACnG,kGAAkG;YAClG,mGAAmG;YACnG,IAAI,CAAC,IAAI,CAAC;gBACR,KAAK;gBACL,IAAI,EAAE,CAAC,CAAC,SAAS;gBACjB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,4EAA4E;aACvG,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAA8B;IACjE,iFAAiF;IACjF,yCAAyC;IACzC,MAAM,MAAM,GAAkC;QAC5C,cAAc,EAAE,CAAC;QACjB,kBAAkB,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC;QACT,aAAa,EAAE,CAAC;KACjB,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,0FAA0F;IAC1F,MAAM,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACtE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;AAClD,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,kBAAkB,CAAC,MAAqC;IACtE,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,kBAAkB,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;IACvG,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK;QAAE,OAAO,gBAAgB,CAAC;IAC3E,IAAI,MAAM,CAAC,cAAc,KAAK,KAAK;QAAE,OAAO,oBAAoB,CAAC;IACjE,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK;QAAE,OAAO,YAAY,CAAC;IACjD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,10 +1,11 @@
1
1
  import type { DaemonStateFile, HealthzProbeResult } from "./crash-cart-detect.js";
2
- /** Classify a fetch REJECTION into a probe result. ECONNREFUSED = the only strong down signal; an
3
- * abort/timeout = unverified; anything else = timeout (conservative never a fabricated down). */
4
- export declare function classifyProbeError(err: {
5
- code?: string;
6
- name?: string;
7
- }): HealthzProbeResult;
2
+ /** Classify a fetch REJECTION into a probe result POSITIVE-FORM predicate (guard/orch rail):
3
+ * DOWN (refused) ONLY when (a) at least one terminal attempt exists AND (b) EVERY terminal attempt is
4
+ * recognizably ECONNREFUSED. Anything else — a timeout, an abort, another code, or a CODE-LESS /
5
+ * unrecognized failure — is ambiguous evidence and stays timeout/unverified (a timeout never promotes to
6
+ * a confirmed down; the cart never offers RESTORE on partial evidence). "No known-bad sibling" (a negated
7
+ * code-Set) erased a code-less sibling; "ALL known-good" (this positive form) closes the whole family. */
8
+ export declare function classifyProbeError(err: unknown): HealthzProbeResult;
8
9
  export interface ProbeDeps {
9
10
  fetch: (url: string, init?: {
10
11
  signal?: AbortSignal;
@@ -1 +1 @@
1
- {"version":3,"file":"crash-cart-probes.d.ts","sourceRoot":"","sources":["../../src/domain/crash-cart-probes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAElF;oGACoG;AACpG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,kBAAkB,CAI5F;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;8EAC8E;AAC9E,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAW5F;AAED;mDACmD;AACnD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED;8CAC8C;AAC9C,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAY/E"}
1
+ {"version":3,"file":"crash-cart-probes.d.ts","sourceRoot":"","sources":["../../src/domain/crash-cart-probes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAiDlF;;;;;2GAK2G;AAC3G,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAInE;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;8EAC8E;AAC9E,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAW5F;AAED;mDACmD;AACnD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED;8CAC8C;AAC9C,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAY/E"}
@@ -3,14 +3,64 @@
3
3
  // proven by the real-daemon-down run.
4
4
  import { existsSync, readFileSync } from "node:fs";
5
5
  import { join } from "node:path";
6
- /** Classify a fetch REJECTION into a probe result. ECONNREFUSED = the only strong down signal; an
7
- * abort/timeout = unverified; anything else = timeout (conservative never a fabricated down). */
6
+ /** Collect the TERMINAL ATTEMPTS from a rejection tree the leaf error nodes that represent an actual
7
+ * connect attempt. Node/Undici's global fetch wraps a refused socket as an OUTER `TypeError
8
+ * {message:"fetch failed", code:undefined}` → `cause` (single address), or an `AggregateError` whose
9
+ * `.errors[]` are the per-address attempts. A node WITH a `cause` or non-empty `errors[]` is a WRAPPER
10
+ * (it recurses, never counts as a terminal attempt); a node with neither is a terminal attempt — which
11
+ * may carry a `code` (ECONNREFUSED/ETIMEDOUT/…) or NONE at all. A code-less attempt is retained here,
12
+ * which a flattened code-Set would erase. Depth-bounded (cycle-safe); a node hit at the cap is treated
13
+ * as a terminal attempt (its code, typically absent, then counts — conservatively). */
14
+ const MAX_WALK_DEPTH = 10; // real Undici chains are 2–3 deep; this is generous. Beyond it = UNRESOLVED.
15
+ function collectTerminalAttempts(err) {
16
+ const attempts = [];
17
+ const onPath = new Set(); // cycle detection by IDENTITY (a back-edge cannot be resolved)
18
+ const visit = (e, depth) => {
19
+ // A non-object rejection (string/undefined/…) is not a resolvable terminal → unknown (non-refused).
20
+ if (!e || typeof e !== "object") {
21
+ attempts.push({ unresolved: true });
22
+ return;
23
+ }
24
+ const o = e;
25
+ // CYCLE: this exact object is already on the current path — it cannot be fully resolved → unknown.
26
+ if (onPath.has(o)) {
27
+ attempts.push({ unresolved: true });
28
+ return;
29
+ }
30
+ const children = [];
31
+ if (o.cause)
32
+ children.push(o.cause);
33
+ if (Array.isArray(o.errors))
34
+ children.push(...o.errors);
35
+ if (children.length === 0) {
36
+ // A FULLY-RESOLVED terminal attempt (no cause, no errors): its own code is real evidence.
37
+ attempts.push({ code: typeof o.code === "string" ? o.code : undefined, name: typeof o.name === "string" ? o.name : undefined });
38
+ return;
39
+ }
40
+ // A WRAPPER (has children). If depth is exhausted, we CANNOT resolve it → record an UNKNOWN attempt;
41
+ // NEVER reinterpret an unresolved wrapper's OWN code as terminal evidence (exhaustion is not evidence).
42
+ if (depth >= MAX_WALK_DEPTH) {
43
+ attempts.push({ unresolved: true });
44
+ return;
45
+ }
46
+ onPath.add(o);
47
+ for (const c of children)
48
+ visit(c, depth + 1);
49
+ onPath.delete(o);
50
+ };
51
+ visit(err, 0);
52
+ return attempts;
53
+ }
54
+ /** Classify a fetch REJECTION into a probe result — POSITIVE-FORM predicate (guard/orch rail):
55
+ * DOWN (refused) ONLY when (a) at least one terminal attempt exists AND (b) EVERY terminal attempt is
56
+ * recognizably ECONNREFUSED. Anything else — a timeout, an abort, another code, or a CODE-LESS /
57
+ * unrecognized failure — is ambiguous evidence and stays timeout/unverified (a timeout never promotes to
58
+ * a confirmed down; the cart never offers RESTORE on partial evidence). "No known-bad sibling" (a negated
59
+ * code-Set) erased a code-less sibling; "ALL known-good" (this positive form) closes the whole family. */
8
60
  export function classifyProbeError(err) {
9
- if (err.code === "ECONNREFUSED")
10
- return "refused";
11
- if (err.name === "AbortError" || err.code === "ETIMEDOUT" || err.code === "UND_ERR_CONNECT_TIMEOUT")
12
- return "timeout";
13
- return "timeout";
61
+ const attempts = collectTerminalAttempts(err);
62
+ const refusedUnanimous = attempts.length > 0 && attempts.every((a) => a.code === "ECONNREFUSED");
63
+ return refusedUnanimous ? "refused" : "timeout";
14
64
  }
15
65
  /** Probe `<url>` (a daemon /healthz): 2xx → answered; non-2xx (foreign occupant) → not-openrig; a
16
66
  * rejection is classified (refused/timeout). Bounded by an abort timeout. */
@@ -1 +1 @@
1
- {"version":3,"file":"crash-cart-probes.js","sourceRoot":"","sources":["../../src/domain/crash-cart-probes.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,kGAAkG;AAClG,sCAAsC;AACtC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC;oGACoG;AACpG,MAAM,UAAU,kBAAkB,CAAC,GAAqC;IACtE,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,SAAS,CAAC;IAClD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,yBAAyB;QAAE,OAAO,SAAS,CAAC;IACtH,OAAO,SAAS,CAAC;AACnB,CAAC;AAOD;8EAC8E;AAC9E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,IAAe;IAC7D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;IAC1E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC;IAC7C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAqC,CAAC,CAAC;IAC3E,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED;mDACmD;AACnD,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAQ,CAA2B,CAAC,IAAI,KAAK,OAAO,CAAC;IACvD,CAAC;AACH,CAAC;AAED;8CAC8C;AAC9C,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAsD,CAAC;QACnG,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5D,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QAC7F,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"crash-cart-probes.js","sourceRoot":"","sources":["../../src/domain/crash-cart-probes.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,10 @@ export declare const LOCAL_HOST_ID = "local";
6
6
  export declare function setSelfHostId(id: string | null): void;
7
7
  /** The boot-resolved self-host id, or null before boot has reconciled it. */
8
8
  export declare function getSelfHostId(): string | null;
9
+ /** Publish the boot-derived self-host id source (startup, once). null resets (tests). */
10
+ export declare function setSelfHostIdSource(source: string | null): void;
11
+ /** The boot-derived self-host id source, or null before boot has reconciled it. */
12
+ export declare function getSelfHostIdSource(): string | null;
9
13
  /**
10
14
  * The shared self-resolution convention: does a host token route to THIS host?
11
15
  * True for an absent/empty token, the `LOCAL_HOST_ID` positional sentinel, and
@@ -1 +1 @@
1
- {"version":3,"file":"fanout-contract.d.ts","sourceRoot":"","sources":["../../../src/domain/hosts/fanout-contract.ts"],"names":[],"mappings":"AAUA;;kCAEkC;AAClC,eAAO,MAAM,aAAa,UAAU,CAAC;AAerC,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAErD;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAE7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EACpC,MAAM,GAAE,MAAM,GAAG,IAAiB,GACjC,OAAO,CAIT;AAED;;;;gEAIgE;AAChE,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,aAAa,GAAG,uBAAuB,GAAG,aAAa,CAAC;AAE/F,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,iBAAiB,CAAC;IAC1B,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;kEAE8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;8BAG8B;AAC9B,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED;;iDAEiD;AACjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAIpG"}
1
+ {"version":3,"file":"fanout-contract.d.ts","sourceRoot":"","sources":["../../../src/domain/hosts/fanout-contract.ts"],"names":[],"mappings":"AAUA;;kCAEkC;AAClC,eAAO,MAAM,aAAa,UAAU,CAAC;AAerC,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAErD;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAE7C;AAUD,yFAAyF;AACzF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE/D;AAED,mFAAmF;AACnF,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAEnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EACpC,MAAM,GAAE,MAAM,GAAG,IAAiB,GACjC,OAAO,CAIT;AAED;;;;gEAIgE;AAChE,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,aAAa,GAAG,uBAAuB,GAAG,aAAa,CAAC;AAE/F,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,iBAAiB,CAAC;IAC1B,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;kEAE8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;8BAG8B;AAC9B,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED;;iDAEiD;AACjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAIpG"}
@@ -31,6 +31,21 @@ export function setSelfHostId(id) {
31
31
  export function getSelfHostId() {
32
32
  return selfHostId;
33
33
  }
34
+ // Slice 14 §2c — the id's PROVENANCE, resolved once at boot beside the id itself.
35
+ //
36
+ // Deliberately NOT derived per request: it needs the operator's configured `host.name`, and reading
37
+ // settings inside the /healthz handler put file I/O on the hottest path in the daemon and blew the
38
+ // ps+summary burst latency budget (caught by ps-summary-stall-red). Same lifecycle as the id: set
39
+ // once at boot, read for free thereafter.
40
+ let selfHostIdSource = null;
41
+ /** Publish the boot-derived self-host id source (startup, once). null resets (tests). */
42
+ export function setSelfHostIdSource(source) {
43
+ selfHostIdSource = source;
44
+ }
45
+ /** The boot-derived self-host id source, or null before boot has reconciled it. */
46
+ export function getSelfHostIdSource() {
47
+ return selfHostIdSource;
48
+ }
34
49
  /**
35
50
  * The shared self-resolution convention: does a host token route to THIS host?
36
51
  * True for an absent/empty token, the `LOCAL_HOST_ID` positional sentinel, and
@@ -1 +1 @@
1
- {"version":3,"file":"fanout-contract.js","sourceRoot":"","sources":["../../../src/domain/hosts/fanout-contract.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,0EAA0E;AAC1E,4EAA4E;AAC5E,uEAAuE;AACvE,0EAA0E;AAC1E,sEAAsE;AACtE,uEAAuE;AAEvE;;kCAEkC;AAClC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAErC,uEAAuE;AACvE,uEAAuE;AACvE,4DAA4D;AAC5D,uEAAuE;AACvE,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAC9E,6EAA6E;AAC7E,iEAAiE;AACjE,IAAI,UAAU,GAAkB,IAAI,CAAC;AAErC,mFAAmF;AACnF,MAAM,UAAU,aAAa,CAAC,EAAiB;IAC7C,UAAU,GAAG,EAAE,CAAC;AAClB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAoC,EACpC,SAAwB,UAAU;IAElC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACnF,IAAI,SAAS,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,MAAM,KAAK,IAAI,IAAI,SAAS,KAAK,MAAM,CAAC;AACjD,CAAC;AA6BD;;iDAEiD;AACjD,MAAM,UAAU,YAAY,CAAC,OAAmC,EAAE,eAAyB;IACzF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK;QAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,CAAC;AAC9G,CAAC"}
1
+ {"version":3,"file":"fanout-contract.js","sourceRoot":"","sources":["../../../src/domain/hosts/fanout-contract.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,0EAA0E;AAC1E,4EAA4E;AAC5E,uEAAuE;AACvE,0EAA0E;AAC1E,sEAAsE;AACtE,uEAAuE;AAEvE;;kCAEkC;AAClC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAErC,uEAAuE;AACvE,uEAAuE;AACvE,4DAA4D;AAC5D,uEAAuE;AACvE,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAC9E,6EAA6E;AAC7E,iEAAiE;AACjE,IAAI,UAAU,GAAkB,IAAI,CAAC;AAErC,mFAAmF;AACnF,MAAM,UAAU,aAAa,CAAC,EAAiB;IAC7C,UAAU,GAAG,EAAE,CAAC;AAClB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,kFAAkF;AAClF,EAAE;AACF,oGAAoG;AACpG,mGAAmG;AACnG,kGAAkG;AAClG,0CAA0C;AAC1C,IAAI,gBAAgB,GAAkB,IAAI,CAAC;AAE3C,yFAAyF;AACzF,MAAM,UAAU,mBAAmB,CAAC,MAAqB;IACvD,gBAAgB,GAAG,MAAM,CAAC;AAC5B,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,mBAAmB;IACjC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAoC,EACpC,SAAwB,UAAU;IAElC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACnF,IAAI,SAAS,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,MAAM,KAAK,IAAI,IAAI,SAAS,KAAK,MAAM,CAAC;AACjD,CAAC;AA6BD;;iDAEiD;AACjD,MAAM,UAAU,YAAY,CAAC,OAAmC,EAAE,eAAyB;IACzF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK;QAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,CAAC;AAC9G,CAAC"}
@@ -1,5 +1,14 @@
1
1
  export interface SshHostEntry {
2
2
  id: string;
3
+ /**
4
+ * The observed, immutable self-id of the host this entry points at — the JOIN KEY.
5
+ *
6
+ * `id` is MY label for that machine; `hostId` is what that machine calls itself and stamps into
7
+ * every envelope it sends. Optional because every entry that exists today predates the field:
8
+ * absent means "never learned", which resolves exactly as it does now. Nothing populates this
9
+ * automatically in this slice.
10
+ */
11
+ hostId?: string;
3
12
  transport: "ssh";
4
13
  target: string;
5
14
  user?: string;
@@ -7,6 +16,8 @@ export interface SshHostEntry {
7
16
  }
8
17
  export interface HttpHostEntry {
9
18
  id: string;
19
+ /** The observed self-id of the host this entry points at — the join key. See SshHostEntry.hostId. */
20
+ hostId?: string;
10
21
  transport: "http";
11
22
  url: string;
12
23
  bearer_env?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"hosts-registry-reader.d.ts","sourceRoot":"","sources":["../../../src/domain/hosts/hosts-registry-reader.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,aAAa,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAOjC,eAAO,MAAM,iBAAiB,aAAiE,CAAC;AAIhG,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;0EAC0E;AAC1E,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAkC,GAAG,sBAAsB,CAoBjG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,sBAAsB,CAsGhG;AAED;;sDAEsD;AACtD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,cAAc,CAW9E;AAED;;;;eAIe;AACf,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,cAAc,CAUvF"}
1
+ {"version":3,"file":"hosts-registry-reader.d.ts","sourceRoot":"","sources":["../../../src/domain/hosts/hosts-registry-reader.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,qGAAqG;IACrG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,aAAa,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAOjC,eAAO,MAAM,iBAAiB,aAAiE,CAAC;AAIhG,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;0EAC0E;AAC1E,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAkC,GAAG,sBAAsB,CAoBjG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,sBAAsB,CA4HhG;AAED;;sDAEsD;AACtD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,cAAc,CAsB9E;AAED;;;;eAIe;AACf,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,cAAc,CAUvF"}