@openrig/cli 0.4.1 → 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.
- package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +42 -2
- package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +87 -0
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +46 -0
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +167 -3
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts +31 -0
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +62 -0
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/db/migrations/045_resume_verification.d.ts +29 -0
- package/daemon/dist/db/migrations/045_resume_verification.d.ts.map +1 -0
- package/daemon/dist/db/migrations/045_resume_verification.js +34 -0
- package/daemon/dist/db/migrations/045_resume_verification.js.map +1 -0
- package/daemon/dist/db/migrations/046_seat_identity_verdicts.d.ts +41 -0
- package/daemon/dist/db/migrations/046_seat_identity_verdicts.d.ts.map +1 -0
- package/daemon/dist/db/migrations/046_seat_identity_verdicts.js +56 -0
- package/daemon/dist/db/migrations/046_seat_identity_verdicts.js.map +1 -0
- package/daemon/dist/db/migrations/047_events_node_type_index.d.ts +48 -0
- package/daemon/dist/db/migrations/047_events_node_type_index.d.ts.map +1 -0
- package/daemon/dist/db/migrations/047_events_node_type_index.js +52 -0
- package/daemon/dist/db/migrations/047_events_node_type_index.js.map +1 -0
- package/daemon/dist/domain/activity-endpoint.d.ts +25 -0
- package/daemon/dist/domain/activity-endpoint.d.ts.map +1 -0
- package/daemon/dist/domain/activity-endpoint.js +91 -0
- package/daemon/dist/domain/activity-endpoint.js.map +1 -0
- package/daemon/dist/domain/claim-service.d.ts +36 -0
- package/daemon/dist/domain/claim-service.d.ts.map +1 -1
- package/daemon/dist/domain/claim-service.js +90 -0
- package/daemon/dist/domain/claim-service.js.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts +57 -0
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.js +149 -3
- package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
- package/daemon/dist/domain/event-loop-monitor.d.ts +100 -0
- package/daemon/dist/domain/event-loop-monitor.d.ts.map +1 -0
- package/daemon/dist/domain/event-loop-monitor.js +127 -0
- package/daemon/dist/domain/event-loop-monitor.js.map +1 -0
- package/daemon/dist/domain/gate-predicate.d.ts +29 -0
- package/daemon/dist/domain/gate-predicate.d.ts.map +1 -0
- package/daemon/dist/domain/gate-predicate.js +73 -0
- package/daemon/dist/domain/gate-predicate.js.map +1 -0
- package/daemon/dist/domain/graph-projection.d.ts +7 -1
- package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
- package/daemon/dist/domain/graph-projection.js +19 -1
- package/daemon/dist/domain/graph-projection.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts +7 -1
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +84 -5
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/periodic-snapshot-scheduler.d.ts +4 -0
- package/daemon/dist/domain/periodic-snapshot-scheduler.d.ts.map +1 -1
- package/daemon/dist/domain/periodic-snapshot-scheduler.js +11 -0
- package/daemon/dist/domain/periodic-snapshot-scheduler.js.map +1 -1
- package/daemon/dist/domain/policies/idle-gate-qitem.d.ts +14 -0
- package/daemon/dist/domain/policies/idle-gate-qitem.d.ts.map +1 -0
- package/daemon/dist/domain/policies/idle-gate-qitem.js +114 -0
- package/daemon/dist/domain/policies/idle-gate-qitem.js.map +1 -0
- package/daemon/dist/domain/restore-orchestrator.d.ts +8 -0
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +109 -27
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.d.ts +25 -1
- package/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.js +72 -4
- package/daemon/dist/domain/restore-plan-preview.js.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.d.ts +44 -2
- package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.js +92 -6
- package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
- package/daemon/dist/domain/resume-token-capture.d.ts +50 -0
- package/daemon/dist/domain/resume-token-capture.d.ts.map +1 -0
- package/daemon/dist/domain/resume-token-capture.js +63 -0
- package/daemon/dist/domain/resume-token-capture.js.map +1 -0
- package/daemon/dist/domain/rig-status-compose.d.ts +62 -0
- package/daemon/dist/domain/rig-status-compose.d.ts.map +1 -0
- package/daemon/dist/domain/rig-status-compose.js +149 -0
- package/daemon/dist/domain/rig-status-compose.js.map +1 -0
- package/daemon/dist/domain/rig-teardown.d.ts +3 -1
- package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
- package/daemon/dist/domain/rig-teardown.js +4 -19
- package/daemon/dist/domain/rig-teardown.js.map +1 -1
- package/daemon/dist/domain/route-timing-recorder.d.ts +42 -0
- package/daemon/dist/domain/route-timing-recorder.d.ts.map +1 -0
- package/daemon/dist/domain/route-timing-recorder.js +62 -0
- package/daemon/dist/domain/route-timing-recorder.js.map +1 -0
- package/daemon/dist/domain/scope/scope-audit.d.ts +3 -1
- package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.js +30 -1
- package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
- package/daemon/dist/domain/seat-handover-service.d.ts +50 -7
- package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-service.js +273 -33
- package/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/daemon/dist/domain/seat-identity-reconciler.d.ts +59 -0
- package/daemon/dist/domain/seat-identity-reconciler.d.ts.map +1 -0
- package/daemon/dist/domain/seat-identity-reconciler.js +207 -0
- package/daemon/dist/domain/seat-identity-reconciler.js.map +1 -0
- package/daemon/dist/domain/seat-identity-store.d.ts +27 -0
- package/daemon/dist/domain/seat-identity-store.d.ts.map +1 -0
- package/daemon/dist/domain/seat-identity-store.js +106 -0
- package/daemon/dist/domain/seat-identity-store.js.map +1 -0
- package/daemon/dist/domain/seat-switch-client-service.d.ts +57 -0
- package/daemon/dist/domain/seat-switch-client-service.d.ts.map +1 -0
- package/daemon/dist/domain/seat-switch-client-service.js +168 -0
- package/daemon/dist/domain/seat-switch-client-service.js.map +1 -0
- package/daemon/dist/domain/self-attach-service.d.ts +8 -0
- package/daemon/dist/domain/self-attach-service.d.ts.map +1 -1
- package/daemon/dist/domain/self-attach-service.js +20 -7
- package/daemon/dist/domain/self-attach-service.js.map +1 -1
- package/daemon/dist/domain/session-registry.d.ts +35 -4
- package/daemon/dist/domain/session-registry.d.ts.map +1 -1
- package/daemon/dist/domain/session-registry.js +89 -10
- package/daemon/dist/domain/session-registry.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts +8 -1
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +143 -37
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.js +34 -2
- package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
- package/daemon/dist/domain/startup-proof.d.ts +63 -0
- package/daemon/dist/domain/startup-proof.d.ts.map +1 -0
- package/daemon/dist/domain/startup-proof.js +165 -0
- package/daemon/dist/domain/startup-proof.js.map +1 -0
- package/daemon/dist/domain/successor-session-launcher.d.ts +103 -0
- package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -0
- package/daemon/dist/domain/successor-session-launcher.js +246 -0
- package/daemon/dist/domain/successor-session-launcher.js.map +1 -0
- package/daemon/dist/domain/types.d.ts +81 -0
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js +8 -0
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts +2 -2
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-jobs-repository.js +4 -0
- package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.js +19 -0
- package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +18 -1
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/routes/activity.d.ts.map +1 -1
- package/daemon/dist/routes/activity.js +26 -0
- package/daemon/dist/routes/activity.js.map +1 -1
- package/daemon/dist/routes/agent-images.d.ts.map +1 -1
- package/daemon/dist/routes/agent-images.js +139 -0
- package/daemon/dist/routes/agent-images.js.map +1 -1
- package/daemon/dist/routes/compaction.d.ts +17 -0
- package/daemon/dist/routes/compaction.d.ts.map +1 -0
- package/daemon/dist/routes/compaction.js +125 -0
- package/daemon/dist/routes/compaction.js.map +1 -0
- package/daemon/dist/routes/restore-check.d.ts +10 -0
- package/daemon/dist/routes/restore-check.d.ts.map +1 -1
- package/daemon/dist/routes/restore-check.js +46 -37
- package/daemon/dist/routes/restore-check.js.map +1 -1
- package/daemon/dist/routes/rigs.d.ts.map +1 -1
- package/daemon/dist/routes/rigs.js +70 -1
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/seat.d.ts.map +1 -1
- package/daemon/dist/routes/seat.js +53 -2
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/routes/sessions.d.ts.map +1 -1
- package/daemon/dist/routes/sessions.js +44 -9
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/routes/snapshots.d.ts.map +1 -1
- package/daemon/dist/routes/snapshots.js +16 -1
- package/daemon/dist/routes/snapshots.js.map +1 -1
- package/daemon/dist/routes/transport.d.ts.map +1 -1
- package/daemon/dist/routes/transport.js +12 -5
- package/daemon/dist/routes/transport.js.map +1 -1
- package/daemon/dist/server.d.ts +32 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +28 -1
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts +1 -0
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +91 -18
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +1 -1
- package/dist/commands/compact.d.ts +15 -0
- package/dist/commands/compact.d.ts.map +1 -0
- package/dist/commands/compact.js +62 -0
- package/dist/commands/compact.js.map +1 -0
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +18 -2
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/fork.d.ts +4 -0
- package/dist/commands/fork.d.ts.map +1 -0
- package/dist/commands/fork.js +101 -0
- package/dist/commands/fork.js.map +1 -0
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +34 -4
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +14 -4
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts +6 -0
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +78 -4
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/reconcile-session.d.ts.map +1 -1
- package/dist/commands/reconcile-session.js +2 -2
- package/dist/commands/reconcile-session.js.map +1 -1
- package/dist/commands/restore-check.d.ts.map +1 -1
- package/dist/commands/restore-check.js +93 -0
- package/dist/commands/restore-check.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +51 -1
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/seat.d.ts +17 -0
- package/dist/commands/seat.d.ts.map +1 -1
- package/dist/commands/seat.js +145 -32
- package/dist/commands/seat.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +151 -10
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/start.d.ts +5 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/startup-proof.d.ts +24 -0
- package/dist/commands/startup-proof.d.ts.map +1 -0
- package/dist/commands/startup-proof.js +100 -0
- package/dist/commands/startup-proof.js.map +1 -0
- package/dist/commands/unclaim.js +2 -2
- package/dist/commands/unclaim.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +10 -0
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/watchdog.js +2 -2
- package/dist/commands/watchdog.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +24 -0
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +85 -8
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/codex-auth.d.ts +24 -0
- package/dist/lib/codex-auth.d.ts.map +1 -1
- package/dist/lib/codex-auth.js +89 -17
- package/dist/lib/codex-auth.js.map +1 -1
- package/dist/lib/scope/scope-audit.d.ts +3 -1
- package/dist/lib/scope/scope-audit.d.ts.map +1 -1
- package/dist/lib/scope/scope-audit.js +30 -1
- package/dist/lib/scope/scope-audit.js.map +1 -1
- package/dist/lib/scope-templates/mission-placeholder.md +41 -0
- package/dist/lib/scope-templates/mission-progress.md +2 -0
- package/dist/lib/scope-templates/mission-release.md +41 -0
- package/dist/lib/scope-templates/placeholder.md +4 -0
- package/dist/lib/scope-templates/proof.md +2 -0
- package/dist/lib/scope-templates/slice-progress.md +2 -0
- package/dist/openrig-compat.d.ts +19 -0
- package/dist/openrig-compat.d.ts.map +1 -1
- package/dist/openrig-compat.js +31 -1
- package/dist/openrig-compat.js.map +1 -1
- package/package.json +1 -1
- package/ui/dist/assets/index-DYZniQcc.js +597 -0
- package/ui/dist/assets/index-trcb4Yf_.css +32 -0
- package/ui/dist/index.html +23 -2
- package/ui/dist/assets/index-CnqRX7A3.css +0 -32
- 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
|
-
|
|
37
|
-
|
|
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;
|
|
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
|
-
|
|
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"
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EACL,0BAA0B,EAC1B,mCAAmC,GAEpC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;
|
|
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
|
|
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"}
|