@openrig/cli 0.4.2 → 0.4.3

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 (264) hide show
  1. package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +42 -2
  2. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +87 -0
  3. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +46 -0
  4. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  5. package/daemon/dist/adapters/codex-runtime-adapter.js +167 -3
  6. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  7. package/daemon/dist/adapters/tmux.d.ts +31 -0
  8. package/daemon/dist/adapters/tmux.d.ts.map +1 -1
  9. package/daemon/dist/adapters/tmux.js +62 -0
  10. package/daemon/dist/adapters/tmux.js.map +1 -1
  11. package/daemon/dist/db/migrations/045_resume_verification.d.ts +29 -0
  12. package/daemon/dist/db/migrations/045_resume_verification.d.ts.map +1 -0
  13. package/daemon/dist/db/migrations/045_resume_verification.js +34 -0
  14. package/daemon/dist/db/migrations/045_resume_verification.js.map +1 -0
  15. package/daemon/dist/db/migrations/046_seat_identity_verdicts.d.ts +41 -0
  16. package/daemon/dist/db/migrations/046_seat_identity_verdicts.d.ts.map +1 -0
  17. package/daemon/dist/db/migrations/046_seat_identity_verdicts.js +56 -0
  18. package/daemon/dist/db/migrations/046_seat_identity_verdicts.js.map +1 -0
  19. package/daemon/dist/db/migrations/047_events_node_type_index.d.ts +48 -0
  20. package/daemon/dist/db/migrations/047_events_node_type_index.d.ts.map +1 -0
  21. package/daemon/dist/db/migrations/047_events_node_type_index.js +52 -0
  22. package/daemon/dist/db/migrations/047_events_node_type_index.js.map +1 -0
  23. package/daemon/dist/domain/activity-endpoint.d.ts +25 -0
  24. package/daemon/dist/domain/activity-endpoint.d.ts.map +1 -0
  25. package/daemon/dist/domain/activity-endpoint.js +91 -0
  26. package/daemon/dist/domain/activity-endpoint.js.map +1 -0
  27. package/daemon/dist/domain/claim-service.d.ts +36 -0
  28. package/daemon/dist/domain/claim-service.d.ts.map +1 -1
  29. package/daemon/dist/domain/claim-service.js +90 -0
  30. package/daemon/dist/domain/claim-service.js.map +1 -1
  31. package/daemon/dist/domain/claude-compaction-enforcer.d.ts +57 -0
  32. package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
  33. package/daemon/dist/domain/claude-compaction-enforcer.js +149 -3
  34. package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
  35. package/daemon/dist/domain/event-loop-monitor.d.ts +100 -0
  36. package/daemon/dist/domain/event-loop-monitor.d.ts.map +1 -0
  37. package/daemon/dist/domain/event-loop-monitor.js +127 -0
  38. package/daemon/dist/domain/event-loop-monitor.js.map +1 -0
  39. package/daemon/dist/domain/gate-predicate.d.ts +29 -0
  40. package/daemon/dist/domain/gate-predicate.d.ts.map +1 -0
  41. package/daemon/dist/domain/gate-predicate.js +73 -0
  42. package/daemon/dist/domain/gate-predicate.js.map +1 -0
  43. package/daemon/dist/domain/graph-projection.d.ts +7 -1
  44. package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
  45. package/daemon/dist/domain/graph-projection.js +19 -1
  46. package/daemon/dist/domain/graph-projection.js.map +1 -1
  47. package/daemon/dist/domain/node-inventory.d.ts +7 -1
  48. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  49. package/daemon/dist/domain/node-inventory.js +84 -5
  50. package/daemon/dist/domain/node-inventory.js.map +1 -1
  51. package/daemon/dist/domain/periodic-snapshot-scheduler.d.ts +4 -0
  52. package/daemon/dist/domain/periodic-snapshot-scheduler.d.ts.map +1 -1
  53. package/daemon/dist/domain/periodic-snapshot-scheduler.js +11 -0
  54. package/daemon/dist/domain/periodic-snapshot-scheduler.js.map +1 -1
  55. package/daemon/dist/domain/policies/idle-gate-qitem.d.ts +14 -0
  56. package/daemon/dist/domain/policies/idle-gate-qitem.d.ts.map +1 -0
  57. package/daemon/dist/domain/policies/idle-gate-qitem.js +114 -0
  58. package/daemon/dist/domain/policies/idle-gate-qitem.js.map +1 -0
  59. package/daemon/dist/domain/restore-orchestrator.d.ts +8 -0
  60. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  61. package/daemon/dist/domain/restore-orchestrator.js +109 -27
  62. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  63. package/daemon/dist/domain/restore-plan-preview.d.ts +25 -1
  64. package/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
  65. package/daemon/dist/domain/restore-plan-preview.js +72 -4
  66. package/daemon/dist/domain/restore-plan-preview.js.map +1 -1
  67. package/daemon/dist/domain/resume-metadata-refresher.d.ts +44 -2
  68. package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
  69. package/daemon/dist/domain/resume-metadata-refresher.js +92 -6
  70. package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
  71. package/daemon/dist/domain/resume-token-capture.d.ts +50 -0
  72. package/daemon/dist/domain/resume-token-capture.d.ts.map +1 -0
  73. package/daemon/dist/domain/resume-token-capture.js +63 -0
  74. package/daemon/dist/domain/resume-token-capture.js.map +1 -0
  75. package/daemon/dist/domain/rig-status-compose.d.ts +62 -0
  76. package/daemon/dist/domain/rig-status-compose.d.ts.map +1 -0
  77. package/daemon/dist/domain/rig-status-compose.js +149 -0
  78. package/daemon/dist/domain/rig-status-compose.js.map +1 -0
  79. package/daemon/dist/domain/rig-teardown.d.ts +3 -1
  80. package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
  81. package/daemon/dist/domain/rig-teardown.js +4 -19
  82. package/daemon/dist/domain/rig-teardown.js.map +1 -1
  83. package/daemon/dist/domain/route-timing-recorder.d.ts +42 -0
  84. package/daemon/dist/domain/route-timing-recorder.d.ts.map +1 -0
  85. package/daemon/dist/domain/route-timing-recorder.js +62 -0
  86. package/daemon/dist/domain/route-timing-recorder.js.map +1 -0
  87. package/daemon/dist/domain/scope/scope-audit.d.ts +3 -1
  88. package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  89. package/daemon/dist/domain/scope/scope-audit.js +30 -1
  90. package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  91. package/daemon/dist/domain/seat-handover-service.d.ts +50 -7
  92. package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
  93. package/daemon/dist/domain/seat-handover-service.js +273 -33
  94. package/daemon/dist/domain/seat-handover-service.js.map +1 -1
  95. package/daemon/dist/domain/seat-identity-reconciler.d.ts +59 -0
  96. package/daemon/dist/domain/seat-identity-reconciler.d.ts.map +1 -0
  97. package/daemon/dist/domain/seat-identity-reconciler.js +207 -0
  98. package/daemon/dist/domain/seat-identity-reconciler.js.map +1 -0
  99. package/daemon/dist/domain/seat-identity-store.d.ts +27 -0
  100. package/daemon/dist/domain/seat-identity-store.d.ts.map +1 -0
  101. package/daemon/dist/domain/seat-identity-store.js +106 -0
  102. package/daemon/dist/domain/seat-identity-store.js.map +1 -0
  103. package/daemon/dist/domain/seat-switch-client-service.d.ts +57 -0
  104. package/daemon/dist/domain/seat-switch-client-service.d.ts.map +1 -0
  105. package/daemon/dist/domain/seat-switch-client-service.js +168 -0
  106. package/daemon/dist/domain/seat-switch-client-service.js.map +1 -0
  107. package/daemon/dist/domain/self-attach-service.d.ts +8 -0
  108. package/daemon/dist/domain/self-attach-service.d.ts.map +1 -1
  109. package/daemon/dist/domain/self-attach-service.js +20 -7
  110. package/daemon/dist/domain/self-attach-service.js.map +1 -1
  111. package/daemon/dist/domain/session-registry.d.ts +35 -4
  112. package/daemon/dist/domain/session-registry.d.ts.map +1 -1
  113. package/daemon/dist/domain/session-registry.js +89 -10
  114. package/daemon/dist/domain/session-registry.js.map +1 -1
  115. package/daemon/dist/domain/session-transport.d.ts +8 -1
  116. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  117. package/daemon/dist/domain/session-transport.js +143 -37
  118. package/daemon/dist/domain/session-transport.js.map +1 -1
  119. package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
  120. package/daemon/dist/domain/startup-orchestrator.js +34 -2
  121. package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
  122. package/daemon/dist/domain/startup-proof.d.ts +63 -0
  123. package/daemon/dist/domain/startup-proof.d.ts.map +1 -0
  124. package/daemon/dist/domain/startup-proof.js +165 -0
  125. package/daemon/dist/domain/startup-proof.js.map +1 -0
  126. package/daemon/dist/domain/successor-session-launcher.d.ts +103 -0
  127. package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -0
  128. package/daemon/dist/domain/successor-session-launcher.js +246 -0
  129. package/daemon/dist/domain/successor-session-launcher.js.map +1 -0
  130. package/daemon/dist/domain/types.d.ts +81 -0
  131. package/daemon/dist/domain/types.d.ts.map +1 -1
  132. package/daemon/dist/domain/types.js +8 -0
  133. package/daemon/dist/domain/types.js.map +1 -1
  134. package/daemon/dist/domain/watchdog-jobs-repository.d.ts +2 -2
  135. package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
  136. package/daemon/dist/domain/watchdog-jobs-repository.js +4 -0
  137. package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
  138. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  139. package/daemon/dist/domain/watchdog-policy-engine.js +19 -0
  140. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  141. package/daemon/dist/index.d.ts.map +1 -1
  142. package/daemon/dist/index.js +18 -1
  143. package/daemon/dist/index.js.map +1 -1
  144. package/daemon/dist/routes/activity.d.ts.map +1 -1
  145. package/daemon/dist/routes/activity.js +26 -0
  146. package/daemon/dist/routes/activity.js.map +1 -1
  147. package/daemon/dist/routes/agent-images.d.ts.map +1 -1
  148. package/daemon/dist/routes/agent-images.js +139 -0
  149. package/daemon/dist/routes/agent-images.js.map +1 -1
  150. package/daemon/dist/routes/compaction.d.ts +17 -0
  151. package/daemon/dist/routes/compaction.d.ts.map +1 -0
  152. package/daemon/dist/routes/compaction.js +125 -0
  153. package/daemon/dist/routes/compaction.js.map +1 -0
  154. package/daemon/dist/routes/restore-check.d.ts +10 -0
  155. package/daemon/dist/routes/restore-check.d.ts.map +1 -1
  156. package/daemon/dist/routes/restore-check.js +46 -37
  157. package/daemon/dist/routes/restore-check.js.map +1 -1
  158. package/daemon/dist/routes/rigs.d.ts.map +1 -1
  159. package/daemon/dist/routes/rigs.js +70 -1
  160. package/daemon/dist/routes/rigs.js.map +1 -1
  161. package/daemon/dist/routes/seat.d.ts.map +1 -1
  162. package/daemon/dist/routes/seat.js +53 -2
  163. package/daemon/dist/routes/seat.js.map +1 -1
  164. package/daemon/dist/routes/sessions.d.ts.map +1 -1
  165. package/daemon/dist/routes/sessions.js +44 -9
  166. package/daemon/dist/routes/sessions.js.map +1 -1
  167. package/daemon/dist/routes/snapshots.d.ts.map +1 -1
  168. package/daemon/dist/routes/snapshots.js +16 -1
  169. package/daemon/dist/routes/snapshots.js.map +1 -1
  170. package/daemon/dist/routes/transport.d.ts.map +1 -1
  171. package/daemon/dist/routes/transport.js +12 -5
  172. package/daemon/dist/routes/transport.js.map +1 -1
  173. package/daemon/dist/server.d.ts +32 -0
  174. package/daemon/dist/server.d.ts.map +1 -1
  175. package/daemon/dist/server.js +28 -1
  176. package/daemon/dist/server.js.map +1 -1
  177. package/daemon/dist/startup.d.ts +1 -0
  178. package/daemon/dist/startup.d.ts.map +1 -1
  179. package/daemon/dist/startup.js +91 -18
  180. package/daemon/dist/startup.js.map +1 -1
  181. package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +1 -1
  182. package/dist/commands/compact.d.ts +15 -0
  183. package/dist/commands/compact.d.ts.map +1 -0
  184. package/dist/commands/compact.js +62 -0
  185. package/dist/commands/compact.js.map +1 -0
  186. package/dist/commands/daemon.d.ts.map +1 -1
  187. package/dist/commands/daemon.js +18 -2
  188. package/dist/commands/daemon.js.map +1 -1
  189. package/dist/commands/fork.d.ts +4 -0
  190. package/dist/commands/fork.d.ts.map +1 -0
  191. package/dist/commands/fork.js +101 -0
  192. package/dist/commands/fork.js.map +1 -0
  193. package/dist/commands/launch.d.ts.map +1 -1
  194. package/dist/commands/launch.js +34 -4
  195. package/dist/commands/launch.js.map +1 -1
  196. package/dist/commands/ps.d.ts.map +1 -1
  197. package/dist/commands/ps.js +14 -4
  198. package/dist/commands/ps.js.map +1 -1
  199. package/dist/commands/queue.d.ts +6 -0
  200. package/dist/commands/queue.d.ts.map +1 -1
  201. package/dist/commands/queue.js +78 -4
  202. package/dist/commands/queue.js.map +1 -1
  203. package/dist/commands/reconcile-session.d.ts.map +1 -1
  204. package/dist/commands/reconcile-session.js +2 -2
  205. package/dist/commands/reconcile-session.js.map +1 -1
  206. package/dist/commands/restore-check.d.ts.map +1 -1
  207. package/dist/commands/restore-check.js +93 -0
  208. package/dist/commands/restore-check.js.map +1 -1
  209. package/dist/commands/scope.d.ts.map +1 -1
  210. package/dist/commands/scope.js +51 -1
  211. package/dist/commands/scope.js.map +1 -1
  212. package/dist/commands/seat.d.ts +17 -0
  213. package/dist/commands/seat.d.ts.map +1 -1
  214. package/dist/commands/seat.js +145 -32
  215. package/dist/commands/seat.js.map +1 -1
  216. package/dist/commands/send.d.ts.map +1 -1
  217. package/dist/commands/send.js +151 -10
  218. package/dist/commands/send.js.map +1 -1
  219. package/dist/commands/start.d.ts +5 -0
  220. package/dist/commands/start.d.ts.map +1 -1
  221. package/dist/commands/start.js.map +1 -1
  222. package/dist/commands/startup-proof.d.ts +24 -0
  223. package/dist/commands/startup-proof.d.ts.map +1 -0
  224. package/dist/commands/startup-proof.js +100 -0
  225. package/dist/commands/startup-proof.js.map +1 -0
  226. package/dist/commands/unclaim.js +2 -2
  227. package/dist/commands/unclaim.js.map +1 -1
  228. package/dist/commands/up.d.ts.map +1 -1
  229. package/dist/commands/up.js +10 -0
  230. package/dist/commands/up.js.map +1 -1
  231. package/dist/commands/watchdog.js +2 -2
  232. package/dist/commands/watchdog.js.map +1 -1
  233. package/dist/daemon-lifecycle.d.ts +23 -0
  234. package/dist/daemon-lifecycle.d.ts.map +1 -1
  235. package/dist/daemon-lifecycle.js +50 -5
  236. package/dist/daemon-lifecycle.js.map +1 -1
  237. package/dist/index.d.ts +5 -0
  238. package/dist/index.d.ts.map +1 -1
  239. package/dist/index.js +8 -1
  240. package/dist/index.js.map +1 -1
  241. package/dist/lib/codex-auth.d.ts +24 -0
  242. package/dist/lib/codex-auth.d.ts.map +1 -1
  243. package/dist/lib/codex-auth.js +89 -17
  244. package/dist/lib/codex-auth.js.map +1 -1
  245. package/dist/lib/scope/scope-audit.d.ts +3 -1
  246. package/dist/lib/scope/scope-audit.d.ts.map +1 -1
  247. package/dist/lib/scope/scope-audit.js +30 -1
  248. package/dist/lib/scope/scope-audit.js.map +1 -1
  249. package/dist/lib/scope-templates/mission-placeholder.md +41 -0
  250. package/dist/lib/scope-templates/mission-progress.md +2 -0
  251. package/dist/lib/scope-templates/mission-release.md +41 -0
  252. package/dist/lib/scope-templates/placeholder.md +4 -0
  253. package/dist/lib/scope-templates/proof.md +2 -0
  254. package/dist/lib/scope-templates/slice-progress.md +2 -0
  255. package/dist/openrig-compat.d.ts +19 -0
  256. package/dist/openrig-compat.d.ts.map +1 -1
  257. package/dist/openrig-compat.js +31 -1
  258. package/dist/openrig-compat.js.map +1 -1
  259. package/package.json +1 -1
  260. package/ui/dist/assets/index-DYZniQcc.js +597 -0
  261. package/ui/dist/assets/index-trcb4Yf_.css +32 -0
  262. package/ui/dist/index.html +23 -2
  263. package/ui/dist/assets/index-CnqRX7A3.css +0 -32
  264. package/ui/dist/assets/index-CtL9jXFt.js +0 -582
@@ -22,6 +22,17 @@ interface ResumeMetadataRefresherDeps {
22
22
  resolveHomeDirByPid?: ResolveHomeDirByPid;
23
23
  sleep?: (ms: number) => Promise<void>;
24
24
  homeDir?: string;
25
+ contextUsageStore?: {
26
+ readSidecar(sessionName: string): {
27
+ ok: true;
28
+ data: {
29
+ session_id?: string;
30
+ };
31
+ } | {
32
+ ok: false;
33
+ reason: string;
34
+ };
35
+ };
25
36
  }
26
37
  export declare class ResumeMetadataRefresher {
27
38
  private sessionRegistry;
@@ -32,9 +43,40 @@ export declare class ResumeMetadataRefresher {
32
43
  private resolveHomeDirByPid;
33
44
  private sleep;
34
45
  private homeDir;
46
+ private contextUsageStore;
35
47
  constructor(deps: ResumeMetadataRefresherDeps);
36
- refresh(sessions: ResumeRefreshSession[]): Promise<void>;
37
- private captureCodexThreadId;
48
+ /**
49
+ * Refresh the live per-seat resume ledger.
50
+ *
51
+ * OPR.0.4.3.20 FR-4 (rev1 fix) — `opts.fillNullOnly` is the **snapshot-refresh**
52
+ * mode used by the RECURRING snapshot paths (periodic scheduler every ~5min +
53
+ * manual route). It does exactly two things, both LIGHTWEIGHT (file reads only,
54
+ * like FR-3's capture — Claude sidecar `readSidecar` + Codex `captureCodexThreadId`
55
+ * over pid-logs), and NOTHING heavy:
56
+ * 1. FILL-NULL ONLY — populate a null token from live state; NEVER clear an
57
+ * already-present token (rev1-r2). A present-but-not-currently-resumable
58
+ * Claude token SURVIVES the routine snapshot (stays in the ledger for FR-6 to
59
+ * surface as `stale/unverified — re-verify`) instead of being nulled before
60
+ * FR-6 exists. Invariant: **a snapshot refresh never clears a present token.**
61
+ * 2. NO heavyweight resumability PROBE — it never runs `probeClaudeResume`
62
+ * (which spawns a real `claude --resume` tmux session per present Claude seat).
63
+ * Spawning N probe processes every periodic tick, forever, against live seats
64
+ * is unacceptable recurring blast radius (rev1-r1). Resumability VERIFICATION
65
+ * is FR-6's on-demand job, not a recurring-snapshot op.
66
+ *
67
+ * Default (`fillNullOnly` falsy) preserves the legacy validate-and-probe-and-clear
68
+ * behavior for the non-snapshot / teardown auto-pre-down path (a one-time
69
+ * at-shutdown check — unchanged here; FR-6 §2.1b owns unifying the clear semantics
70
+ * across all callers).
71
+ */
72
+ refresh(sessions: ResumeRefreshSession[], opts?: {
73
+ fillNullOnly?: boolean;
74
+ }): Promise<void>;
75
+ /** Best-effort derive a Codex thread id from live pane state (getPanePid →
76
+ * codex descendant pids → pid-keyed logs sqlite). Async, returns undefined
77
+ * on timeout/absence. Public for reuse by adoption-boundary capture
78
+ * (OPR.0.4.3.20 FR-3) — no behavior change to the teardown-path scrape. */
79
+ captureCodexThreadId(sessionTarget: string): Promise<string | undefined>;
38
80
  private defaultProbeClaudeResume;
39
81
  private waitForProbeShellReady;
40
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resume-metadata-refresher.d.ts","sourceRoot":"","sources":["../../src/domain/resume-metadata-refresher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;AAO9B,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,UAAU,2BAA2B;IACnC,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,sBAAsB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC7D,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,WAAW,GAAG,eAAe,GAAG,cAAc,CAAC,CAAC;IAC/I,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAA8D;IACnF,OAAO,CAAC,sBAAsB,CAAsC;IACpE,OAAO,CAAC,iBAAiB,CAA6H;IACtJ,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,EAAE,2BAA2B;IAevC,OAAO,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAqBhD,oBAAoB;YAkBpB,wBAAwB;YA2DxB,sBAAsB;CAgBrC"}
1
+ {"version":3,"file":"resume-metadata-refresher.d.ts","sourceRoot":"","sources":["../../src/domain/resume-metadata-refresher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,sBAAsB,CAAC;AAO9B,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,UAAU,2BAA2B;IACnC,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,sBAAsB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC7D,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,WAAW,GAAG,eAAe,GAAG,cAAc,CAAC,CAAC;IAC/I,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IAKjB,iBAAiB,CAAC,EAAE;QAClB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG;YAAE,EAAE,EAAE,IAAI,CAAC;YAAC,IAAI,EAAE;gBAAE,UAAU,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,GAAG;YAAE,EAAE,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/G,CAAC;CACH;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAA8D;IACnF,OAAO,CAAC,sBAAsB,CAAsC;IACpE,OAAO,CAAC,iBAAiB,CAA6H;IACtJ,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAA0D;gBAEvE,IAAI,EAAE,2BAA2B;IAgB7C;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACG,OAAO,CAAC,QAAQ,EAAE,oBAAoB,EAAE,EAAE,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8EjG;;;gFAG4E;IACtE,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAkBhE,wBAAwB;YA2DxB,sBAAsB;CAgBrC"}
@@ -12,6 +12,7 @@ export class ResumeMetadataRefresher {
12
12
  resolveHomeDirByPid;
13
13
  sleep;
14
14
  homeDir;
15
+ contextUsageStore;
15
16
  constructor(deps) {
16
17
  this.sessionRegistry = deps.sessionRegistry;
17
18
  this.tmuxAdapter = deps.tmuxAdapter;
@@ -21,26 +22,111 @@ export class ResumeMetadataRefresher {
21
22
  this.probeClaudeResume = deps.probeClaudeResume ?? ((sessionName, resumeToken, cwd) => this.defaultProbeClaudeResume(sessionName, resumeToken, cwd));
22
23
  this.sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
23
24
  this.homeDir = deps.homeDir ?? os.homedir();
25
+ this.contextUsageStore = deps.contextUsageStore ?? null;
24
26
  }
25
- async refresh(sessions) {
27
+ /**
28
+ * Refresh the live per-seat resume ledger.
29
+ *
30
+ * OPR.0.4.3.20 FR-4 (rev1 fix) — `opts.fillNullOnly` is the **snapshot-refresh**
31
+ * mode used by the RECURRING snapshot paths (periodic scheduler every ~5min +
32
+ * manual route). It does exactly two things, both LIGHTWEIGHT (file reads only,
33
+ * like FR-3's capture — Claude sidecar `readSidecar` + Codex `captureCodexThreadId`
34
+ * over pid-logs), and NOTHING heavy:
35
+ * 1. FILL-NULL ONLY — populate a null token from live state; NEVER clear an
36
+ * already-present token (rev1-r2). A present-but-not-currently-resumable
37
+ * Claude token SURVIVES the routine snapshot (stays in the ledger for FR-6 to
38
+ * surface as `stale/unverified — re-verify`) instead of being nulled before
39
+ * FR-6 exists. Invariant: **a snapshot refresh never clears a present token.**
40
+ * 2. NO heavyweight resumability PROBE — it never runs `probeClaudeResume`
41
+ * (which spawns a real `claude --resume` tmux session per present Claude seat).
42
+ * Spawning N probe processes every periodic tick, forever, against live seats
43
+ * is unacceptable recurring blast radius (rev1-r1). Resumability VERIFICATION
44
+ * is FR-6's on-demand job, not a recurring-snapshot op.
45
+ *
46
+ * Default (`fillNullOnly` falsy) preserves the legacy validate-and-probe-and-clear
47
+ * behavior for the non-snapshot / teardown auto-pre-down path (a one-time
48
+ * at-shutdown check — unchanged here; FR-6 §2.1b owns unifying the clear semantics
49
+ * across all callers).
50
+ */
51
+ async refresh(sessions, opts) {
52
+ const fillNullOnly = opts?.fillNullOnly === true;
26
53
  for (const session of sessions) {
27
54
  if (session.runtime === "codex") {
28
- if (session.resumeToken)
55
+ if (session.resumeToken) {
56
+ // OPR.0.4.3.20 FR-6.1 — lightweight equal-value freshness RE-STAMP on the
57
+ // periodic (fill-null) path so a present-and-still-valid token does not age
58
+ // to a FALSE `stale — re-verify` after the FR-6 threshold. Re-derive via the
59
+ // SAME pure-read helper FR-3 uses (getPanePid → pid-keyed logs; NO probe/spawn,
60
+ // NO `claude --resume`, NO launch) and refresh freshness ONLY on an EXACT match.
61
+ if (fillNullOnly) {
62
+ const derived = await this.captureCodexThreadId(session.sessionName);
63
+ if (derived && derived === session.resumeToken) {
64
+ // Present + matching = genuine positive evidence; stamp freshness via the
65
+ // FR-6 marker (never updateResumeToken → no token/provenance clobber).
66
+ this.sessionRegistry.markResumeProbeResult(session.sessionId, "resumable");
67
+ }
68
+ // DIFFERENT / ABSENT (rolled or underivable) → no-op: no re-stamp, no clobber.
69
+ // Left honest for FR-6 (stale — re-verify) + FR-7 restore-time rollback.
70
+ }
29
71
  continue;
72
+ }
30
73
  const threadId = await this.captureCodexThreadId(session.sessionName);
31
74
  if (threadId) {
32
75
  this.sessionRegistry.updateResumeToken(session.sessionId, "codex_id", threadId, "scrape");
33
76
  }
34
77
  continue;
35
78
  }
36
- if (session.runtime === "claude-code" && session.resumeToken) {
37
- const probe = await this.probeClaudeResume(session.sessionName, session.resumeToken, session.cwd ?? null);
38
- if (probe === "not_resumable") {
39
- this.sessionRegistry.clearResumeToken(session.sessionId);
79
+ if (session.runtime === "claude-code") {
80
+ if (!session.resumeToken) {
81
+ // OPR.0.4.3.20 FR-4 null-fill from the Claude status-line sidecar
82
+ // (best-effort; missing/parse-error/empty leaves null, never throws).
83
+ // `scrape` provenance (rank 0) fills a null slot and never clobbers a
84
+ // higher-trust adoption/hook/operator token (the FR-3 rank guard).
85
+ const sidecar = this.contextUsageStore?.readSidecar(session.sessionName);
86
+ if (sidecar?.ok) {
87
+ const token = sidecar.data.session_id;
88
+ if (typeof token === "string" && token.trim().length > 0) {
89
+ this.sessionRegistry.updateResumeToken(session.sessionId, "claude_id", token.trim(), "scrape");
90
+ }
91
+ }
92
+ continue;
40
93
  }
94
+ // Present token.
95
+ // OPR.0.4.3.20 FR-4 (rev1 fix) — in snapshot-refresh (fill-null-only) mode,
96
+ // return BEFORE the probe: never spawn the heavyweight `claude --resume`
97
+ // probe on the recurring snapshot path (rev1-r1), and never clear a present
98
+ // token (rev1-r2). A present-but-not-resumable token stays in the ledger for
99
+ // FR-6 to surface as `stale/unverified — re-verify`. Only the legacy/teardown
100
+ // default path probes + clears (a one-time at-shutdown check).
101
+ if (fillNullOnly) {
102
+ // OPR.0.4.3.20 FR-6.1 — equal-value freshness RE-STAMP on the periodic path
103
+ // (NO probe; never spawns `claude --resume`). Re-derive via the pure-read
104
+ // status-line sidecar and refresh freshness ONLY on an EXACT match to the
105
+ // stored token. Different / absent / parse-error / unreadable → no-op: no
106
+ // re-stamp and no token clobber (left honest for FR-6 + FR-7).
107
+ const sidecar = this.contextUsageStore?.readSidecar(session.sessionName);
108
+ if (sidecar?.ok) {
109
+ const derived = sidecar.data.session_id;
110
+ if (typeof derived === "string" && derived.trim().length > 0 && derived.trim() === session.resumeToken) {
111
+ this.sessionRegistry.markResumeProbeResult(session.sessionId, "resumable");
112
+ }
113
+ }
114
+ continue;
115
+ }
116
+ const probe = await this.probeClaudeResume(session.sessionName, session.resumeToken, session.cwd ?? null);
117
+ // OPR.0.4.3.20 FR-6 §2.1b — record the probe result WITHOUT clearing:
118
+ // `not_resumable`/`inconclusive` marks the present token stale (the plan
119
+ // surfaces it as `stale — re-verify`), `resumable` stamps freshness. The
120
+ // token stays put — a rolled-but-present token is no longer silently
121
+ // nulled; FR-7's rollback catches an actually-unresumable token at restore.
122
+ this.sessionRegistry.markResumeProbeResult(session.sessionId, probe);
41
123
  }
42
124
  }
43
125
  }
126
+ /** Best-effort derive a Codex thread id from live pane state (getPanePid →
127
+ * codex descendant pids → pid-keyed logs sqlite). Async, returns undefined
128
+ * on timeout/absence. Public for reuse by adoption-boundary capture
129
+ * (OPR.0.4.3.20 FR-3) — no behavior change to the teardown-path scrape. */
44
130
  async captureCodexThreadId(sessionTarget) {
45
131
  if (!this.tmuxAdapter.getPanePid)
46
132
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"resume-metadata-refresher.js","sourceRoot":"","sources":["../../src/domain/resume-metadata-refresher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resume-metadata-refresher.js","sourceRoot":"","sources":["../../src/domain/resume-metadata-refresher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { type ResumeType } from "./resume-token-validation.js";
2
+ export interface ResumeTokenCaptureDeps {
3
+ contextUsageStore?: {
4
+ readSidecar(sessionName: string): {
5
+ ok: true;
6
+ data: {
7
+ session_id?: string;
8
+ };
9
+ } | {
10
+ ok: false;
11
+ reason: string;
12
+ };
13
+ } | null;
14
+ resumeTokenCapturer?: {
15
+ captureCodexThreadId(sessionName: string): Promise<string | undefined>;
16
+ } | null;
17
+ }
18
+ export type ResumeTokenDeriveResult =
19
+ /** Runtime has no resume token (terminal / unknown) — not a failure, no event. */
20
+ {
21
+ outcome: "exempt";
22
+ }
23
+ /** A required derive dependency is absent (older wiring / test) — silent no-op. */
24
+ | {
25
+ outcome: "noop";
26
+ }
27
+ /** A live token was derived + format-validated. The caller persists it. */
28
+ | {
29
+ outcome: "captured";
30
+ resumeType: ResumeType;
31
+ token: string;
32
+ }
33
+ /** Derivation ran but produced no usable token — the caller emits a skip event. */
34
+ | {
35
+ outcome: "skipped";
36
+ reason: "missing_sidecar" | "parse_error" | "probe_timeout" | "invalid_token";
37
+ };
38
+ /**
39
+ * Derive a runtime's resume token from live, read-only sources:
40
+ * claude-code → the status-line sidecar's session_id (a file read)
41
+ * codex → the thread id derived from live pid-keyed logs
42
+ * Returns a structured outcome; never throws for a missing/invalid token
43
+ * (those are honest skips). ANY unexpected throw from a dependency is the
44
+ * caller's to swallow (capture must never fail or block its lifecycle op).
45
+ */
46
+ export declare function deriveResumeToken(input: {
47
+ runtime: string | null;
48
+ sessionName: string;
49
+ }, deps: ResumeTokenCaptureDeps): Promise<ResumeTokenDeriveResult>;
50
+ //# sourceMappingURL=resume-token-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-token-capture.d.ts","sourceRoot":"","sources":["../../src/domain/resume-token-capture.ts"],"names":[],"mappings":"AAkBA,OAAO,EAA6C,KAAK,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1G,MAAM,WAAW,sBAAsB;IACrC,iBAAiB,CAAC,EAAE;QAClB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG;YAAE,EAAE,EAAE,IAAI,CAAC;YAAC,IAAI,EAAE;gBAAE,UAAU,CAAC,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,GAAG;YAAE,EAAE,EAAE,KAAK,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/G,GAAG,IAAI,CAAC;IACT,mBAAmB,CAAC,EAAE;QACpB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;KACxE,GAAG,IAAI,CAAC;CACV;AAED,MAAM,MAAM,uBAAuB;AACjC,kFAAkF;AAChF;IAAE,OAAO,EAAE,QAAQ,CAAA;CAAE;AACvB,mFAAmF;GACjF;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE;AACrB,2EAA2E;GACzE;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAChE,mFAAmF;GACjF;IAAE,OAAO,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,iBAAiB,GAAG,aAAa,GAAG,eAAe,GAAG,eAAe,CAAA;CAAE,CAAC;AAE1G;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACtD,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,uBAAuB,CAAC,CA8BlC"}
@@ -0,0 +1,63 @@
1
+ // OPR.0.4.3.04 B2 — the PURE, reusable resume-token DERIVE helper.
2
+ //
3
+ // This is the shared derivation core behind FR-3's adoption-boundary capture
4
+ // (ClaimService.captureResumeTokenOnAdoption) AND the seat-handover discovered-
5
+ // mode capture. It performs REUSE-ONLY, PURE READ derivation — no pane writes,
6
+ // no launch, no persistence, no event emission. The CALLER owns persistence
7
+ // (updateResumeToken) and event emission (captured / preserved / skipped), so
8
+ // each caller keeps its own provenance + audit semantics.
9
+ //
10
+ // The derived token is credential-class: it is NEVER logged, echoed, or placed
11
+ // in any returned message/error. Only the caller's redacted persistence path
12
+ // ever touches it. Honest failure = a structured skip reason (no token), never
13
+ // a fabricated value.
14
+ //
15
+ // FR-3's scope is UNCHANGED: this helper is derive-only and does not alter
16
+ // which lifecycle ops adopt. It only removes the duplication between the two
17
+ // derive sites the ruling asked us to share.
18
+ import { resumeTypeForRuntime, validateResumeToken } from "./resume-token-validation.js";
19
+ /**
20
+ * Derive a runtime's resume token from live, read-only sources:
21
+ * claude-code → the status-line sidecar's session_id (a file read)
22
+ * codex → the thread id derived from live pid-keyed logs
23
+ * Returns a structured outcome; never throws for a missing/invalid token
24
+ * (those are honest skips). ANY unexpected throw from a dependency is the
25
+ * caller's to swallow (capture must never fail or block its lifecycle op).
26
+ */
27
+ export async function deriveResumeToken(input, deps) {
28
+ const resumeType = resumeTypeForRuntime(input.runtime);
29
+ if (!resumeType)
30
+ return { outcome: "exempt" }; // terminal / unknown — exempt, not a failure
31
+ const runtime = input.runtime; // non-null: resumeType is set only for claude-code / codex
32
+ let token;
33
+ if (runtime === "claude-code") {
34
+ if (!deps.contextUsageStore)
35
+ return { outcome: "noop" }; // dep absent — silent no-op
36
+ const sidecar = deps.contextUsageStore.readSidecar(input.sessionName);
37
+ if (!sidecar.ok) {
38
+ return { outcome: "skipped", reason: sidecar.reason === "parse_error" ? "parse_error" : "missing_sidecar" };
39
+ }
40
+ const sid = sidecar.data.session_id;
41
+ if (typeof sid === "string" && sid.trim().length > 0)
42
+ token = sid.trim();
43
+ else
44
+ return { outcome: "skipped", reason: "missing_sidecar" };
45
+ }
46
+ else if (runtime === "codex") {
47
+ if (!deps.resumeTokenCapturer)
48
+ return { outcome: "noop" }; // dep absent — silent no-op
49
+ token = await deps.resumeTokenCapturer.captureCodexThreadId(input.sessionName);
50
+ if (!token)
51
+ return { outcome: "skipped", reason: "probe_timeout" };
52
+ }
53
+ else {
54
+ return { outcome: "noop" }; // resumeType set but runtime is not one we derive — defensive
55
+ }
56
+ // Defensive format validation before the caller persists — a malformed token
57
+ // is an honest skip, never a bad write (validity-before-rank).
58
+ const validation = validateResumeToken(runtime, token);
59
+ if (!validation.ok)
60
+ return { outcome: "skipped", reason: "invalid_token" };
61
+ return { outcome: "captured", resumeType: validation.resumeType, token: validation.token };
62
+ }
63
+ //# sourceMappingURL=resume-token-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-token-capture.js","sourceRoot":"","sources":["../../src/domain/resume-token-capture.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,+EAA+E;AAC/E,4EAA4E;AAC5E,8EAA8E;AAC9E,0DAA0D;AAC1D,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,+EAA+E;AAC/E,sBAAsB;AACtB,EAAE;AACF,2EAA2E;AAC3E,6EAA6E;AAC7E,6CAA6C;AAE7C,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAmB,MAAM,8BAA8B,CAAC;AAqB1G;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAsD,EACtD,IAA4B;IAE5B,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,6CAA6C;IAE5F,MAAM,OAAO,GAAG,KAAK,CAAC,OAAiB,CAAC,CAAC,2DAA2D;IAEpG,IAAI,KAAyB,CAAC;IAC9B,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,4BAA4B;QACrF,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;QAC9G,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QACpC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;;YACpE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAChE,CAAC;SAAM,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,4BAA4B;QACvF,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/E,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,8DAA8D;IAC5F,CAAC;IAED,6EAA6E;IAC7E,+DAA+D;IAC/D,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IAE3E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;AAC7F,CAAC"}
@@ -0,0 +1,62 @@
1
+ import type { NodeLifecycleState } from "./types.js";
2
+ import type { RestorePlanPreview } from "./restore-plan-preview.js";
3
+ import type { ResumeTokenState } from "./restore-plan-preview.js";
4
+ import type { RecoveryPlan } from "./restore-check-service.js";
5
+ import type { KernelState } from "./kernel-boot-tracker.js";
6
+ /** The composed rig-level aggregate. A pure fold — never a verdict that
7
+ * overwrites per-seat truth. */
8
+ export type RigAggStatus = "up" | "partial" | "down" | "blocked" | "unknown";
9
+ export interface RigStatusSeat {
10
+ logicalId: string;
11
+ runtime: string | null;
12
+ /** Live process lifecycle (ps-projection). */
13
+ lifecycleState: NodeLifecycleState;
14
+ /** Read-only restore-plan forecast (restore-plan-preview). */
15
+ tokenState: ResumeTokenState;
16
+ intendedAction: "resume-original" | "fresh-primed" | "awaiting-decision";
17
+ freshRequired: boolean;
18
+ /** True when THIS seat blocks a restore-original (awaiting-decision) — the
19
+ * per-seat blocker that folds up to the aggregate `blocked`. */
20
+ blocked: boolean;
21
+ provenance?: string | null;
22
+ lastVerified?: string | null;
23
+ reason?: string;
24
+ runtimePrompt?: string;
25
+ }
26
+ export interface RigStatusObject {
27
+ rigId: string;
28
+ rigName: string;
29
+ isKernel: boolean;
30
+ status: RigAggStatus;
31
+ seatsTotal: number;
32
+ seatsRunning: number;
33
+ /** true when the rig can be recovered without operator action (down/partial);
34
+ * false when blocked (needs a decision) or already up. */
35
+ recoverable: boolean;
36
+ perSeat: RigStatusSeat[];
37
+ /** Composed provenance — the folded signals + their values. Visible in the UI
38
+ * `src:` line and in debug/test output (the non-inference contract). */
39
+ src: string[];
40
+ }
41
+ export interface SeatLifecycleInput {
42
+ logicalId: string;
43
+ runtime: string | null;
44
+ lifecycleState: NodeLifecycleState;
45
+ }
46
+ export interface ComposeRigStatusInput {
47
+ rigId: string;
48
+ rigName: string;
49
+ isKernel?: boolean;
50
+ /** Per-node ps-lifecycle truth (from node-inventory). */
51
+ nodes: SeatLifecycleInput[];
52
+ /** Read-only restore-plan forecast (buildRestorePlanPreview) — NOT mutated. */
53
+ plan: RestorePlanPreview;
54
+ /** restore-check recovery readiness for this rig (optional; folded when present). */
55
+ recovery?: RecoveryPlan | null;
56
+ /** kernel-status state — folded ONLY for the kernel rig (never /healthz). */
57
+ kernelState?: KernelState | null;
58
+ }
59
+ /** Fold the four backend signals into a single rig-status object. Pure — does
60
+ * NOT mutate the input plan (the resumable seats stay resume-original). */
61
+ export declare function composeRigStatus(input: ComposeRigStatusInput): RigStatusObject;
62
+ //# sourceMappingURL=rig-status-compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rig-status-compose.d.ts","sourceRoot":"","sources":["../../src/domain/rig-status-compose.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D;iCACiC;AACjC,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,8CAA8C;IAC9C,cAAc,EAAE,kBAAkB,CAAC;IACnC,8DAA8D;IAC9D,UAAU,EAAE,gBAAgB,CAAC;IAC7B,cAAc,EAAE,iBAAiB,GAAG,cAAc,GAAG,mBAAmB,CAAC;IACzE,aAAa,EAAE,OAAO,CAAC;IACvB;qEACiE;IACjE,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB;+DAC2D;IAC3D,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB;6EACyE;IACzE,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,kBAAkB,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,+EAA+E;IAC/E,IAAI,EAAE,kBAAkB,CAAC;IACzB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAClC;AA0BD;4EAC4E;AAC5E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,eAAe,CA6E9E"}
@@ -0,0 +1,149 @@
1
+ // OPR.0.4.3.22 — rig-status compose (a pure FOLD of per-seat backend truths).
2
+ //
3
+ // This is the daemon side of the rig-status + launch-control UI. It is NOT a new
4
+ // restore pipeline and NOT slice-20's ledger. It folds four SHIPPED signals into
5
+ // a single `{ status, perSeat[], src[] }` object the UI renders:
6
+ //
7
+ // 1. ps-lifecycle — per-node `lifecycleState` (running/detached/recoverable/attention).
8
+ // 2. restore-plan — `buildRestorePlanPreview` per-seat forecast (tokenState + intendedAction).
9
+ // 3. restore-check — `RecoveryPlan.status` readiness (blocked / actionable / unknown).
10
+ // 4. kernel-status — `KernelState` (folded only for the kernel rig; NEVER daemon /healthz).
11
+ //
12
+ // THE LOCK (founder/PM): the aggregate is a pure FOLD of per-seat truths — a rig
13
+ // NEVER globally flips to `fresh`. "fresh" is only ever `freshLogicalIds` (a
14
+ // per-seat list threaded by the backend). This module derives an aggregate that
15
+ // READS `blocked`/`partial` BECAUSE individual seats are blocked; it never
16
+ // repaints the per-seat truths (a global-fresh flip would be the UI form of the
17
+ // silent-fresh-prime behavior FR-7 just removed). The compose function does NOT
18
+ // mutate its input plan — the seats that WOULD resume stay `resume-original`.
19
+ //
20
+ // `src[]` is the composed provenance (which signals folded, with their values) —
21
+ // the "composed, not inferred; source state visible in debug/test" contract. It
22
+ // is derived from real backend data, never from pane text.
23
+ import { deriveRigLifecycleState } from "./ps-projection.js";
24
+ /** Kernel states that require an explicit operator action (a real blocker). */
25
+ function kernelIsBlocked(state) {
26
+ return state === "auth_blocked" || state === "spec_missing" || state === "bootstrap_failed";
27
+ }
28
+ /** Map a kernel state to an aggregate (used only for the kernel rig). Returns
29
+ * null for `skipped` — the caller then folds the lifecycle instead. */
30
+ function kernelAggregate(state) {
31
+ switch (state) {
32
+ case "ready":
33
+ return "up";
34
+ case "booting":
35
+ case "partial_ready":
36
+ case "degraded":
37
+ return "partial";
38
+ case "auth_blocked":
39
+ case "spec_missing":
40
+ case "bootstrap_failed":
41
+ return "blocked";
42
+ case "skipped":
43
+ return null;
44
+ }
45
+ }
46
+ /** Fold the four backend signals into a single rig-status object. Pure — does
47
+ * NOT mutate the input plan (the resumable seats stay resume-original). */
48
+ export function composeRigStatus(input) {
49
+ const { rigId, rigName, nodes, plan, recovery, kernelState } = input;
50
+ const isKernel = input.isKernel ?? false;
51
+ // Join ps-lifecycle nodes with the restore-plan forecast (per logicalId).
52
+ const planByLogicalId = new Map(plan.nodes.map((n) => [n.logicalId, n]));
53
+ const perSeat = nodes.map((node) => {
54
+ const p = planByLogicalId.get(node.logicalId);
55
+ const intendedAction = p?.intendedAction ?? "awaiting-decision";
56
+ const tokenState = p?.tokenState ?? "unverified";
57
+ const blocked = intendedAction === "awaiting-decision";
58
+ return {
59
+ logicalId: node.logicalId,
60
+ runtime: node.runtime,
61
+ lifecycleState: node.lifecycleState,
62
+ tokenState,
63
+ intendedAction,
64
+ freshRequired: p?.freshRequired ?? false,
65
+ blocked,
66
+ provenance: p?.provenance ?? null,
67
+ lastVerified: p?.lastVerified ?? null,
68
+ ...(p?.reason ? { reason: p.reason } : {}),
69
+ ...(p?.runtimePrompt ? { runtimePrompt: p.runtimePrompt } : {}),
70
+ };
71
+ });
72
+ const seatsTotal = nodes.length;
73
+ const seatsRunning = nodes.filter((n) => n.lifecycleState === "running").length;
74
+ const lifecycle = deriveRigLifecycleState(nodes.map((n) => n.lifecycleState));
75
+ // --- Aggregate fold (precedence: blocked > unknown > lifecycle/kernel) ------
76
+ // ANY blocked seat (awaiting-decision / restore-check blocker / kernel auth/spec/
77
+ // bootstrap failure) → aggregate `blocked`. This is the LOCK's money case: a
78
+ // rig with resumable AND blocked seats reads `blocked` BECAUSE seats are
79
+ // blocked — the resumable seats remain resume-original in perSeat.
80
+ const anySeatBlocked = perSeat.some((s) => s.blocked);
81
+ const recoveryBlocked = recovery?.status === "blocked";
82
+ const kernelBlocked = isKernel && kernelState != null && kernelIsBlocked(kernelState);
83
+ let status;
84
+ if (anySeatBlocked || recoveryBlocked || kernelBlocked) {
85
+ status = "blocked";
86
+ }
87
+ else if (recovery?.status === "unknown") {
88
+ status = "unknown";
89
+ }
90
+ else {
91
+ // Kernel rig: kernel-status drives the non-blocked aggregate (never lifecycle
92
+ // alone, never /healthz). Falls back to the lifecycle fold when skipped.
93
+ const kernelAgg = isKernel && kernelState != null ? kernelAggregate(kernelState) : null;
94
+ if (kernelAgg) {
95
+ status = kernelAgg;
96
+ }
97
+ else {
98
+ status = lifecycleToAggregate(lifecycle);
99
+ }
100
+ }
101
+ const recoverable = status === "down" || status === "partial";
102
+ // --- src[] provenance (composed, not inferred) -----------------------------
103
+ const actionCounts = countActions(perSeat);
104
+ const src = [
105
+ `ps: ${seatsRunning}/${seatsTotal} running · lifecycle=${lifecycle}`,
106
+ `restore-plan: ${actionCounts}`,
107
+ ];
108
+ if (recovery)
109
+ src.push(`restore-check: ${recovery.status}`);
110
+ if (isKernel && kernelState != null)
111
+ src.push(`kernel-status.kernel_state=${kernelState}`);
112
+ return {
113
+ rigId,
114
+ rigName,
115
+ isKernel,
116
+ status,
117
+ seatsTotal,
118
+ seatsRunning,
119
+ recoverable,
120
+ perSeat,
121
+ src,
122
+ };
123
+ }
124
+ function lifecycleToAggregate(lifecycle) {
125
+ switch (lifecycle) {
126
+ case "running":
127
+ return "up";
128
+ case "degraded":
129
+ case "attention_required":
130
+ return "partial";
131
+ case "recoverable":
132
+ case "stopped":
133
+ return "down";
134
+ }
135
+ }
136
+ function countActions(perSeat) {
137
+ const counts = { "resume-original": 0, "fresh-primed": 0, "awaiting-decision": 0 };
138
+ for (const s of perSeat)
139
+ counts[s.intendedAction] += 1;
140
+ const parts = [];
141
+ if (counts["resume-original"])
142
+ parts.push(`${counts["resume-original"]} resume-original`);
143
+ if (counts["fresh-primed"])
144
+ parts.push(`${counts["fresh-primed"]} fresh-primed`);
145
+ if (counts["awaiting-decision"])
146
+ parts.push(`${counts["awaiting-decision"]} awaiting-decision`);
147
+ return parts.length > 0 ? parts.join(", ") : "no seats";
148
+ }
149
+ //# sourceMappingURL=rig-status-compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rig-status-compose.js","sourceRoot":"","sources":["../../src/domain/rig-status-compose.ts"],"names":[],"mappings":"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"}
@@ -45,7 +45,9 @@ export declare class RigTeardownOrchestrator {
45
45
  private atomicNodeCleanup;
46
46
  /** Atomically delete rig + persist rig.deleted event */
47
47
  private atomicDelete;
48
- /** Get latest session per node, filtered to live statuses */
48
+ /** Get latest session per node, filtered to live statuses.
49
+ * OPR.0.4.3.20 FR-4 — delegates to the shared SessionRegistry method so the
50
+ * teardown pre-down path and the periodic/manual snapshot refresh share ONE query. */
49
51
  private getLatestLiveSessions;
50
52
  private cleanupManagedGuidanceFiles;
51
53
  private cleanupManagedGuidanceFileForNode;
@@ -1 +1 @@
1
- {"version":3,"file":"rig-teardown.d.ts","sourceRoot":"","sources":["../../src/domain/rig-teardown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAM9E,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;sFACkF;IAClF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,EAAE,QAAQ,CAAC;IACnB,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAClD,mBAAmB,CAAC,EAAE,OAAO,2BAA2B,EAAE,mBAAmB,CAAC;CAC/E;AAaD;;;;GAIG;AACH,qBAAa,uBAAuB;IAClC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAe;gBAEf,IAAI,EAAE,YAAY;IASxB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAkG9E,qEAAqE;IACrE,OAAO,CAAC,iBAAiB;IAQzB,wDAAwD;IACxD,OAAO,CAAC,YAAY;IAepB,6DAA6D;IAC7D,OAAO,CAAC,qBAAqB;IAsB7B,OAAO,CAAC,2BAA2B;IAWnC,OAAO,CAAC,iCAAiC;CAmB1C"}
1
+ {"version":3,"file":"rig-teardown.d.ts","sourceRoot":"","sources":["../../src/domain/rig-teardown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAM9E,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;sFACkF;IAClF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,EAAE,QAAQ,CAAC;IACnB,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAClD,mBAAmB,CAAC,EAAE,OAAO,2BAA2B,EAAE,mBAAmB,CAAC;CAC/E;AAaD;;;;GAIG;AACH,qBAAa,uBAAuB;IAClC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAe;gBAEf,IAAI,EAAE,YAAY;IASxB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAkG9E,qEAAqE;IACrE,OAAO,CAAC,iBAAiB;IAQzB,wDAAwD;IACxD,OAAO,CAAC,YAAY;IAepB;;2FAEuF;IACvF,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,2BAA2B;IAWnC,OAAO,CAAC,iCAAiC;CAmB1C"}