@openrig/cli 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/daemon/assets/guidance/openrig-start.md +21 -64
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +11 -2
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +18 -10
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/domain/codex-thread-id.d.ts +5 -2
- package/daemon/dist/domain/codex-thread-id.d.ts.map +1 -1
- package/daemon/dist/domain/codex-thread-id.js +9 -4
- package/daemon/dist/domain/codex-thread-id.js.map +1 -1
- package/daemon/dist/domain/crash-cart-conductor.d.ts +173 -0
- package/daemon/dist/domain/crash-cart-conductor.d.ts.map +1 -0
- package/daemon/dist/domain/crash-cart-conductor.js +233 -0
- package/daemon/dist/domain/crash-cart-conductor.js.map +1 -0
- package/daemon/dist/domain/crash-cart-probes.d.ts +7 -6
- package/daemon/dist/domain/crash-cart-probes.d.ts.map +1 -1
- package/daemon/dist/domain/crash-cart-probes.js +57 -7
- package/daemon/dist/domain/crash-cart-probes.js.map +1 -1
- package/daemon/dist/domain/hosts/fanout-contract.d.ts +4 -0
- package/daemon/dist/domain/hosts/fanout-contract.d.ts.map +1 -1
- package/daemon/dist/domain/hosts/fanout-contract.js +15 -0
- package/daemon/dist/domain/hosts/fanout-contract.js.map +1 -1
- package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +11 -0
- package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -1
- package/daemon/dist/domain/hosts/hosts-registry-reader.js +34 -1
- package/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -1
- package/daemon/dist/domain/model-divergence/current-generation-record.d.ts +67 -0
- package/daemon/dist/domain/model-divergence/current-generation-record.d.ts.map +1 -0
- package/daemon/dist/domain/model-divergence/current-generation-record.js +204 -0
- package/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -0
- package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts +13 -0
- package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts.map +1 -0
- package/daemon/dist/domain/model-divergence/effective-model-readers.js +163 -0
- package/daemon/dist/domain/model-divergence/effective-model-readers.js.map +1 -0
- package/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts +113 -0
- package/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts.map +1 -0
- package/daemon/dist/domain/model-divergence/model-divergence-monitor.js +190 -0
- package/daemon/dist/domain/model-divergence/model-divergence-monitor.js.map +1 -0
- package/daemon/dist/domain/predecessor-recap-resolver.d.ts +10 -3
- package/daemon/dist/domain/predecessor-recap-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/predecessor-recap-resolver.js +61 -14
- package/daemon/dist/domain/predecessor-recap-resolver.js.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.d.ts +11 -2
- package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.js +17 -9
- package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
- package/daemon/dist/domain/review/gather.d.ts.map +1 -1
- package/daemon/dist/domain/review/gather.js +3 -2
- package/daemon/dist/domain/review/gather.js.map +1 -1
- package/daemon/dist/domain/{rig-policy/rig-policy-defaults.d.ts → rig-mode/rig-mode-defaults.d.ts} +2 -2
- package/daemon/dist/domain/rig-mode/rig-mode-defaults.d.ts.map +1 -0
- package/daemon/dist/domain/{rig-policy/rig-policy-defaults.js → rig-mode/rig-mode-defaults.js} +1 -1
- package/daemon/dist/domain/rig-mode/rig-mode-defaults.js.map +1 -0
- package/{node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-store.d.ts → daemon/dist/domain/rig-mode/rig-mode-store.d.ts} +6 -6
- package/daemon/dist/domain/rig-mode/rig-mode-store.d.ts.map +1 -0
- package/daemon/dist/domain/{rig-policy/rig-policy-store.js → rig-mode/rig-mode-store.js} +5 -5
- package/daemon/dist/domain/rig-mode/rig-mode-store.js.map +1 -0
- package/daemon/dist/domain/{rig-policy/rig-policy-types.d.ts → rig-mode/rig-mode-types.d.ts} +1 -1
- package/daemon/dist/domain/rig-mode/rig-mode-types.d.ts.map +1 -0
- package/{node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-types.js → daemon/dist/domain/rig-mode/rig-mode-types.js} +1 -1
- package/daemon/dist/domain/rig-mode/rig-mode-types.js.map +1 -0
- package/{node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-validator.d.ts → daemon/dist/domain/rig-mode/rig-mode-validator.d.ts} +2 -2
- package/daemon/dist/domain/rig-mode/rig-mode-validator.d.ts.map +1 -0
- package/daemon/dist/domain/{rig-policy/rig-policy-validator.js → rig-mode/rig-mode-validator.js} +3 -3
- package/daemon/dist/domain/rig-mode/rig-mode-validator.js.map +1 -0
- package/daemon/dist/domain/rigspec-schema.d.ts +7 -0
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +7 -0
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/scope/node-file.d.ts +37 -0
- package/daemon/dist/domain/scope/node-file.d.ts.map +1 -0
- package/daemon/dist/domain/scope/node-file.js +55 -0
- package/daemon/dist/domain/scope/node-file.js.map +1 -0
- package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +11 -0
- package/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -1
- package/daemon/dist/domain/scope/plan-lock-artifacts.js +40 -0
- package/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -1
- package/daemon/dist/domain/scope/scope-approve.d.ts +4 -0
- package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-approve.js +56 -7
- package/daemon/dist/domain/scope/scope-approve.js.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.d.ts +1 -1
- package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
- package/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-view-projection.js +5 -2
- package/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
- package/daemon/dist/domain/seat-handover-service.d.ts +32 -15
- package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-service.js +42 -17
- package/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/daemon/dist/domain/seat-identity-reconciler.d.ts +17 -0
- package/daemon/dist/domain/seat-identity-reconciler.d.ts.map +1 -1
- package/daemon/dist/domain/seat-identity-reconciler.js +22 -0
- package/daemon/dist/domain/seat-identity-reconciler.js.map +1 -1
- package/daemon/dist/domain/session-jsonl.js +1 -1
- package/daemon/dist/domain/session-jsonl.js.map +1 -1
- package/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -1
- package/daemon/dist/domain/slices/slice-detail-projector.js +14 -2
- package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
- package/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -1
- package/daemon/dist/domain/slices/slice-indexer.js +16 -3
- package/daemon/dist/domain/slices/slice-indexer.js.map +1 -1
- package/daemon/dist/domain/spec-live-conformance.d.ts +22 -0
- package/daemon/dist/domain/spec-live-conformance.d.ts.map +1 -1
- package/daemon/dist/domain/spec-live-conformance.js +35 -0
- package/daemon/dist/domain/spec-live-conformance.js.map +1 -1
- package/daemon/dist/domain/sync-site-wrap.d.ts +9 -0
- package/daemon/dist/domain/sync-site-wrap.d.ts.map +1 -1
- package/daemon/dist/domain/sync-site-wrap.js +11 -0
- package/daemon/dist/domain/sync-site-wrap.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +15 -0
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +20 -0
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/watchdog-auto-registration.d.ts +7 -0
- package/daemon/dist/domain/watchdog-auto-registration.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-auto-registration.js +27 -0
- package/daemon/dist/domain/watchdog-auto-registration.js.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.js +4 -3
- package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
- package/daemon/dist/routes/activity.js +11 -2
- package/daemon/dist/routes/activity.js.map +1 -1
- package/daemon/dist/routes/bundles.d.ts +27 -0
- package/daemon/dist/routes/bundles.d.ts.map +1 -1
- package/daemon/dist/routes/bundles.js +107 -26
- package/daemon/dist/routes/bundles.js.map +1 -1
- package/daemon/dist/routes/crash-cart.d.ts +4 -0
- package/daemon/dist/routes/crash-cart.d.ts.map +1 -0
- package/daemon/dist/routes/crash-cart.js +144 -0
- package/daemon/dist/routes/crash-cart.js.map +1 -0
- package/daemon/dist/routes/missions.d.ts.map +1 -1
- package/daemon/dist/routes/missions.js +10 -6
- package/daemon/dist/routes/missions.js.map +1 -1
- package/daemon/dist/routes/{rig-policy.d.ts → rig-mode.d.ts} +3 -3
- package/daemon/dist/routes/rig-mode.d.ts.map +1 -0
- package/{node_modules/@openrig/daemon/dist/routes/rig-policy.js → daemon/dist/routes/rig-mode.js} +13 -13
- package/daemon/dist/routes/rig-mode.js.map +1 -0
- package/daemon/dist/routes/scope-approve.d.ts.map +1 -1
- package/daemon/dist/routes/scope-approve.js +4 -0
- package/daemon/dist/routes/scope-approve.js.map +1 -1
- package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
- package/daemon/dist/routes/scope-audit.js +29 -2
- package/daemon/dist/routes/scope-audit.js.map +1 -1
- package/daemon/dist/routes/seat.js +7 -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 +11 -1
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/server.d.ts +3 -1
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +15 -5
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +134 -5
- package/daemon/dist/startup.js.map +1 -1
- package/dist/build-info.js +3 -3
- package/dist/commands/bundle.d.ts.map +1 -1
- package/dist/commands/bundle.js +6 -0
- package/dist/commands/bundle.js.map +1 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +2 -0
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/crash-cart.d.ts.map +1 -1
- package/dist/commands/crash-cart.js.map +1 -1
- package/dist/commands/host.d.ts +5 -0
- package/dist/commands/host.d.ts.map +1 -1
- package/dist/commands/host.js +59 -3
- package/dist/commands/host.js.map +1 -1
- package/dist/commands/policy.d.ts +5 -0
- package/dist/commands/policy.d.ts.map +1 -0
- package/dist/commands/policy.js +307 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/commands/ps.d.ts +4 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +4 -0
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/{rig-policy.d.ts → rig-mode.d.ts} +3 -3
- package/dist/commands/rig-mode.d.ts.map +1 -0
- package/dist/commands/{rig-policy.js → rig-mode.js} +17 -17
- package/dist/commands/rig-mode.js.map +1 -0
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +58 -16
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +2 -0
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/setup.d.ts +13 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +3 -3
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/transcript.d.ts.map +1 -1
- package/dist/commands/transcript.js +2 -0
- package/dist/commands/transcript.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +11 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/config-store.d.ts +3 -1
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +18 -0
- package/dist/config-store.js.map +1 -1
- package/dist/cross-host-target.d.ts +8 -1
- package/dist/cross-host-target.d.ts.map +1 -1
- package/dist/cross-host-target.js +23 -4
- package/dist/cross-host-target.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +10 -1
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +26 -1
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/front-door.d.ts.map +1 -1
- package/dist/front-door.js +11 -1
- package/dist/front-door.js.map +1 -1
- package/dist/host-bindings.d.ts +62 -0
- package/dist/host-bindings.d.ts.map +1 -0
- package/dist/host-bindings.js +147 -0
- package/dist/host-bindings.js.map +1 -0
- package/dist/host-registry.d.ts +14 -1
- package/dist/host-registry.d.ts.map +1 -1
- package/dist/host-registry.js +30 -2
- package/dist/host-registry.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/hosts/fanout-contract.d.ts +4 -0
- package/dist/lib/hosts/fanout-contract.d.ts.map +1 -1
- package/dist/lib/hosts/fanout-contract.js +15 -0
- package/dist/lib/hosts/fanout-contract.js.map +1 -1
- package/dist/lib/path-safety.d.ts +8 -0
- package/dist/lib/path-safety.d.ts.map +1 -0
- package/dist/lib/path-safety.js +24 -0
- package/dist/lib/path-safety.js.map +1 -0
- package/dist/lib/permission-policy/policy-ref.d.ts +89 -0
- package/dist/lib/permission-policy/policy-ref.d.ts.map +1 -0
- package/dist/lib/permission-policy/policy-ref.js +171 -0
- package/dist/lib/permission-policy/policy-ref.js.map +1 -0
- package/dist/lib/permission-policy/policy-spec.d.ts +34 -0
- package/dist/lib/permission-policy/policy-spec.d.ts.map +1 -0
- package/dist/lib/permission-policy/policy-spec.js +106 -0
- package/dist/lib/permission-policy/policy-spec.js.map +1 -0
- package/dist/lib/scope/scope-audit.d.ts +1 -1
- package/dist/lib/scope/scope-audit.d.ts.map +1 -1
- package/dist/lib/scope/scope-audit.js.map +1 -1
- package/dist/lib/scope/scope-fs.d.ts +19 -3
- package/dist/lib/scope/scope-fs.d.ts.map +1 -1
- package/dist/lib/scope/scope-fs.js +37 -17
- package/dist/lib/scope/scope-fs.js.map +1 -1
- package/dist/release-surface/extract-surface.js +1 -1
- package/dist/release-surface/extract-surface.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/adapters/codex-runtime-adapter.d.ts +11 -2
- package/node_modules/@openrig/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/adapters/codex-runtime-adapter.js +18 -10
- package/node_modules/@openrig/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/build-info.js +3 -3
- package/node_modules/@openrig/daemon/dist/domain/codex-thread-id.d.ts +5 -2
- package/node_modules/@openrig/daemon/dist/domain/codex-thread-id.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/codex-thread-id.js +9 -4
- package/node_modules/@openrig/daemon/dist/domain/codex-thread-id.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/crash-cart-conductor.d.ts +173 -0
- package/node_modules/@openrig/daemon/dist/domain/crash-cart-conductor.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/crash-cart-conductor.js +233 -0
- package/node_modules/@openrig/daemon/dist/domain/crash-cart-conductor.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/crash-cart-probes.d.ts +7 -6
- package/node_modules/@openrig/daemon/dist/domain/crash-cart-probes.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/crash-cart-probes.js +57 -7
- package/node_modules/@openrig/daemon/dist/domain/crash-cart-probes.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/hosts/fanout-contract.d.ts +4 -0
- package/node_modules/@openrig/daemon/dist/domain/hosts/fanout-contract.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/hosts/fanout-contract.js +15 -0
- package/node_modules/@openrig/daemon/dist/domain/hosts/fanout-contract.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +11 -0
- package/node_modules/@openrig/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/hosts/hosts-registry-reader.js +34 -1
- package/node_modules/@openrig/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/model-divergence/current-generation-record.d.ts +67 -0
- package/node_modules/@openrig/daemon/dist/domain/model-divergence/current-generation-record.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/model-divergence/current-generation-record.js +204 -0
- package/node_modules/@openrig/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/model-divergence/effective-model-readers.d.ts +13 -0
- package/node_modules/@openrig/daemon/dist/domain/model-divergence/effective-model-readers.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/model-divergence/effective-model-readers.js +163 -0
- package/node_modules/@openrig/daemon/dist/domain/model-divergence/effective-model-readers.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts +113 -0
- package/node_modules/@openrig/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/model-divergence/model-divergence-monitor.js +190 -0
- package/node_modules/@openrig/daemon/dist/domain/model-divergence/model-divergence-monitor.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/predecessor-recap-resolver.d.ts +10 -3
- package/node_modules/@openrig/daemon/dist/domain/predecessor-recap-resolver.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/predecessor-recap-resolver.js +61 -14
- package/node_modules/@openrig/daemon/dist/domain/predecessor-recap-resolver.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/resume-metadata-refresher.d.ts +11 -2
- package/node_modules/@openrig/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/resume-metadata-refresher.js +17 -9
- package/node_modules/@openrig/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/review/gather.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/review/gather.js +3 -2
- package/node_modules/@openrig/daemon/dist/domain/review/gather.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/{rig-policy/rig-policy-defaults.d.ts → rig-mode/rig-mode-defaults.d.ts} +2 -2
- package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-defaults.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/{rig-policy/rig-policy-defaults.js → rig-mode/rig-mode-defaults.js} +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-defaults.js.map +1 -0
- package/{daemon/dist/domain/rig-policy/rig-policy-store.d.ts → node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-store.d.ts} +6 -6
- package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-store.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/{rig-policy/rig-policy-store.js → rig-mode/rig-mode-store.js} +5 -5
- package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-store.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/{rig-policy/rig-policy-types.d.ts → rig-mode/rig-mode-types.d.ts} +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-types.d.ts.map +1 -0
- package/{daemon/dist/domain/rig-policy/rig-policy-types.js → node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-types.js} +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-types.js.map +1 -0
- package/{daemon/dist/domain/rig-policy/rig-policy-validator.d.ts → node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-validator.d.ts} +2 -2
- package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-validator.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/{rig-policy/rig-policy-validator.js → rig-mode/rig-mode-validator.js} +3 -3
- package/node_modules/@openrig/daemon/dist/domain/rig-mode/rig-mode-validator.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.d.ts +7 -0
- package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.js +7 -0
- package/node_modules/@openrig/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/node-file.d.ts +37 -0
- package/node_modules/@openrig/daemon/dist/domain/scope/node-file.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/scope/node-file.js +55 -0
- package/node_modules/@openrig/daemon/dist/domain/scope/node-file.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.d.ts +11 -0
- package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.js +40 -0
- package/node_modules/@openrig/daemon/dist/domain/scope/plan-lock-artifacts.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.d.ts +4 -0
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.js +56 -7
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-approve.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-audit.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js +5 -2
- package/node_modules/@openrig/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.d.ts +32 -15
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.js +42 -17
- package/node_modules/@openrig/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.d.ts +17 -0
- package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.js +22 -0
- package/node_modules/@openrig/daemon/dist/domain/seat-identity-reconciler.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/session-jsonl.js +1 -1
- package/node_modules/@openrig/daemon/dist/domain/session-jsonl.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/slices/slice-detail-projector.js +14 -2
- package/node_modules/@openrig/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/slices/slice-indexer.js +16 -3
- package/node_modules/@openrig/daemon/dist/domain/slices/slice-indexer.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/spec-live-conformance.d.ts +22 -0
- package/node_modules/@openrig/daemon/dist/domain/spec-live-conformance.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/spec-live-conformance.js +35 -0
- package/node_modules/@openrig/daemon/dist/domain/spec-live-conformance.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/sync-site-wrap.d.ts +9 -0
- package/node_modules/@openrig/daemon/dist/domain/sync-site-wrap.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/sync-site-wrap.js +11 -0
- package/node_modules/@openrig/daemon/dist/domain/sync-site-wrap.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/types.d.ts +15 -0
- package/node_modules/@openrig/daemon/dist/domain/types.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/types.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
- package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js +20 -0
- package/node_modules/@openrig/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/watchdog-auto-registration.d.ts +7 -0
- package/node_modules/@openrig/daemon/dist/domain/watchdog-auto-registration.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/watchdog-auto-registration.js +27 -0
- package/node_modules/@openrig/daemon/dist/domain/watchdog-auto-registration.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js +4 -3
- package/node_modules/@openrig/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/activity.js +11 -2
- package/node_modules/@openrig/daemon/dist/routes/activity.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/bundles.d.ts +27 -0
- package/node_modules/@openrig/daemon/dist/routes/bundles.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/bundles.js +107 -26
- package/node_modules/@openrig/daemon/dist/routes/bundles.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/crash-cart.d.ts +4 -0
- package/node_modules/@openrig/daemon/dist/routes/crash-cart.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/routes/crash-cart.js +144 -0
- package/node_modules/@openrig/daemon/dist/routes/crash-cart.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/routes/missions.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/missions.js +10 -6
- package/node_modules/@openrig/daemon/dist/routes/missions.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/{rig-policy.d.ts → rig-mode.d.ts} +3 -3
- package/node_modules/@openrig/daemon/dist/routes/rig-mode.d.ts.map +1 -0
- package/{daemon/dist/routes/rig-policy.js → node_modules/@openrig/daemon/dist/routes/rig-mode.js} +13 -13
- package/node_modules/@openrig/daemon/dist/routes/rig-mode.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/routes/scope-approve.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/scope-approve.js +4 -0
- package/node_modules/@openrig/daemon/dist/routes/scope-approve.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/scope-audit.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/scope-audit.js +29 -2
- package/node_modules/@openrig/daemon/dist/routes/scope-audit.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/seat.js +7 -2
- package/node_modules/@openrig/daemon/dist/routes/seat.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/sessions.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/sessions.js +11 -1
- package/node_modules/@openrig/daemon/dist/routes/sessions.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/server.d.ts +3 -1
- package/node_modules/@openrig/daemon/dist/server.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/server.js +15 -5
- package/node_modules/@openrig/daemon/dist/server.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/startup.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/startup.js +134 -5
- package/node_modules/@openrig/daemon/dist/startup.js.map +1 -1
- package/node_modules/@openrig/daemon/package.json +1 -1
- package/package.json +1 -1
- package/tui/dist/crash-cart/from-emit.d.ts +9 -0
- package/tui/dist/crash-cart/from-emit.d.ts.map +1 -1
- package/tui/dist/crash-cart/from-emit.js.map +1 -1
- package/tui/dist/crash-cart/keys.d.ts +1 -1
- package/tui/dist/crash-cart/keys.d.ts.map +1 -1
- package/tui/dist/crash-cart/keys.js +13 -2
- package/tui/dist/crash-cart/keys.js.map +1 -1
- package/tui/dist/crash-cart/one-click-gate.d.ts +5 -0
- package/tui/dist/crash-cart/one-click-gate.d.ts.map +1 -1
- package/tui/dist/crash-cart/one-click-gate.js +8 -0
- package/tui/dist/crash-cart/one-click-gate.js.map +1 -1
- package/tui/dist/crash-cart/render-crash-cart.d.ts +11 -0
- package/tui/dist/crash-cart/render-crash-cart.d.ts.map +1 -1
- package/tui/dist/crash-cart/render-crash-cart.js +113 -0
- package/tui/dist/crash-cart/render-crash-cart.js.map +1 -1
- package/tui/dist/crash-cart/restore-input.d.ts +32 -0
- package/tui/dist/crash-cart/restore-input.d.ts.map +1 -0
- package/tui/dist/crash-cart/restore-input.js +37 -0
- package/tui/dist/crash-cart/restore-input.js.map +1 -0
- package/tui/dist/crash-cart/restore-lifecycle.d.ts +66 -0
- package/tui/dist/crash-cart/restore-lifecycle.d.ts.map +1 -0
- package/tui/dist/crash-cart/restore-lifecycle.js +96 -0
- package/tui/dist/crash-cart/restore-lifecycle.js.map +1 -0
- package/tui/dist/crash-cart/restore-scroll.d.ts +14 -0
- package/tui/dist/crash-cart/restore-scroll.d.ts.map +1 -0
- package/tui/dist/crash-cart/restore-scroll.js +27 -0
- package/tui/dist/crash-cart/restore-scroll.js.map +1 -0
- package/tui/dist/daemon-client.d.ts +38 -0
- package/tui/dist/daemon-client.d.ts.map +1 -1
- package/tui/dist/daemon-client.js +15 -0
- package/tui/dist/daemon-client.js.map +1 -1
- package/tui/dist/main.js +146 -2
- package/tui/dist/main.js.map +1 -1
- package/tui/dist/render.d.ts +10 -0
- package/tui/dist/render.d.ts.map +1 -1
- package/tui/dist/render.js +63 -10
- package/tui/dist/render.js.map +1 -1
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.d.ts.map +0 -1
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.js.map +0 -1
- package/daemon/dist/domain/rig-policy/rig-policy-store.d.ts.map +0 -1
- package/daemon/dist/domain/rig-policy/rig-policy-store.js.map +0 -1
- package/daemon/dist/domain/rig-policy/rig-policy-types.d.ts.map +0 -1
- package/daemon/dist/domain/rig-policy/rig-policy-types.js.map +0 -1
- package/daemon/dist/domain/rig-policy/rig-policy-validator.d.ts.map +0 -1
- package/daemon/dist/domain/rig-policy/rig-policy-validator.js.map +0 -1
- package/daemon/dist/routes/rig-policy.d.ts.map +0 -1
- package/daemon/dist/routes/rig-policy.js.map +0 -1
- package/dist/commands/rig-policy.d.ts.map +0 -1
- package/dist/commands/rig-policy.js.map +0 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-defaults.d.ts.map +0 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-defaults.js.map +0 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-store.d.ts.map +0 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-store.js.map +0 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-types.d.ts.map +0 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-types.js.map +0 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-validator.d.ts.map +0 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-policy/rig-policy-validator.js.map +0 -1
- package/node_modules/@openrig/daemon/dist/routes/rig-policy.d.ts.map +0 -1
- package/node_modules/@openrig/daemon/dist/routes/rig-policy.js.map +0 -1
package/node_modules/@openrig/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
export interface PinnedSeat {
|
|
2
|
+
nodeId: string;
|
|
3
|
+
sessionName: string;
|
|
4
|
+
rigId: string;
|
|
5
|
+
rigName: string;
|
|
6
|
+
runtime: string | null;
|
|
7
|
+
pinnedModel: string;
|
|
8
|
+
/** Occupant generation (null = unknown; falls back to sessionName grain). */
|
|
9
|
+
generation: string | null;
|
|
10
|
+
}
|
|
11
|
+
export interface ChannelOutcome {
|
|
12
|
+
channel: "orchestrator" | "operator" | "oversight" | "slack";
|
|
13
|
+
target: string | null;
|
|
14
|
+
status: "delivered" | "failed" | "deferred";
|
|
15
|
+
detail?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ModelDivergenceProclamation {
|
|
18
|
+
nodeId: string;
|
|
19
|
+
sessionName: string;
|
|
20
|
+
rigId: string;
|
|
21
|
+
rigName: string;
|
|
22
|
+
runtime: string | null;
|
|
23
|
+
pinnedModel: string;
|
|
24
|
+
effectiveModel: string;
|
|
25
|
+
diagnosis: string | null;
|
|
26
|
+
detectedAt: string;
|
|
27
|
+
channels: ChannelOutcome[];
|
|
28
|
+
}
|
|
29
|
+
/** D-a — the effective read carries a NAMED reason on every no-answer outcome, and may be async
|
|
30
|
+
* (the current-generation join reads the live process table). */
|
|
31
|
+
export type EffectiveModelRead = {
|
|
32
|
+
ok: true;
|
|
33
|
+
model: string;
|
|
34
|
+
} | {
|
|
35
|
+
ok: false;
|
|
36
|
+
reason: string;
|
|
37
|
+
};
|
|
38
|
+
export interface ModelDivergenceMonitorDeps {
|
|
39
|
+
/** Every running canonical seat carrying a model pin (the detector's whole population). */
|
|
40
|
+
listPinnedSeats: () => PinnedSeat[];
|
|
41
|
+
/** Per-runtime effective read via the CURRENT GENERATION's own record (D-a: never a name/token
|
|
42
|
+
* lookup that can silently cross a generation boundary). No-answer = named reason = pending. */
|
|
43
|
+
readEffectiveModel: (seat: PinnedSeat) => Promise<EffectiveModelRead> | EffectiveModelRead;
|
|
44
|
+
/** In-daemon send to a session (the watchdog delivery seam). */
|
|
45
|
+
sendToSession: (sessionName: string, message: string) => Promise<{
|
|
46
|
+
ok: boolean;
|
|
47
|
+
error?: string;
|
|
48
|
+
}>;
|
|
49
|
+
/** The seat's own rig's orchestrator seats (session names). */
|
|
50
|
+
resolveOrchSeats: (rigName: string) => string[];
|
|
51
|
+
/** The configured operator seat (derived from config, never hardcoded). Null = unconfigured. */
|
|
52
|
+
resolveOperatorSeat: () => string | null;
|
|
53
|
+
/** The fleet oversight judgment seat (cross-host target), or null when unroutable. */
|
|
54
|
+
resolveOversightSeat: () => string | null;
|
|
55
|
+
/** Durable record of the proclamation + its per-channel outcomes. */
|
|
56
|
+
recordProclamation: (p: ModelDivergenceProclamation) => void;
|
|
57
|
+
/** Optional cause string when a rejection signal is known (diagnosis, NEVER the trigger). */
|
|
58
|
+
diagnose?: (seat: PinnedSeat) => string | null;
|
|
59
|
+
now?: () => Date;
|
|
60
|
+
warn?: (message: string) => void;
|
|
61
|
+
}
|
|
62
|
+
export declare const SLACK_DEFERRAL_LINE = "human-via-Slack: deferred: M1 not landed";
|
|
63
|
+
/** Polls a pinned generation may stay signal-less before it is loudly named as unchecked. */
|
|
64
|
+
export declare const PENDING_VISIBILITY_POLLS = 10;
|
|
65
|
+
export declare function formatProclamation(p: Omit<ModelDivergenceProclamation, "channels">): string;
|
|
66
|
+
export declare class ModelDivergenceMonitor {
|
|
67
|
+
private readonly deps;
|
|
68
|
+
/** Generations already given their one verdict (match or proclaimed divergence). */
|
|
69
|
+
private readonly settled;
|
|
70
|
+
/** r1 B8 finding — OBSERVABLE PENDING: consecutive no-signal polls per generation. Detection
|
|
71
|
+
* silence is the failure class one layer under channel silence: a seat whose effective model
|
|
72
|
+
* never reads must be VISIBLE as never-checked, not skipped by a bare continue forever. */
|
|
73
|
+
private readonly pendingPolls;
|
|
74
|
+
private readonly pendingReasons;
|
|
75
|
+
private readonly pendingWarned;
|
|
76
|
+
private timer;
|
|
77
|
+
private readonly warn;
|
|
78
|
+
constructor(deps: ModelDivergenceMonitorDeps);
|
|
79
|
+
startPolling(intervalMs: number): void;
|
|
80
|
+
stop(): void;
|
|
81
|
+
/** Pinned generations currently pending (no effective read yet) with their poll counts — the
|
|
82
|
+
* observable face of detection-pending (tests + any future status surface). */
|
|
83
|
+
pendingSeats(): Array<{
|
|
84
|
+
key: string;
|
|
85
|
+
polls: number;
|
|
86
|
+
reason: string | null;
|
|
87
|
+
}>;
|
|
88
|
+
/** One pass over the pinned population. Returns the proclamations fired this pass (for tests). */
|
|
89
|
+
checkOnce(): Promise<ModelDivergenceProclamation[]>;
|
|
90
|
+
private proclaim;
|
|
91
|
+
private deliver;
|
|
92
|
+
}
|
|
93
|
+
/** Pin comparison: EXACT, case-insensitive, after trimming. This ruling has now traveled the full
|
|
94
|
+
* arc and lands where it started, with the reasons on record: exact was ruled at build; this seat
|
|
95
|
+
* reversed it to whole-token alias matching when the live census showed alias pins ("fable") vs
|
|
96
|
+
* full effective ids ("claude-fable-5"); r2 REVERSED IT BACK — generic token containment lets one
|
|
97
|
+
* pin bless multiple distinct models ("codex" matched gpt-5.6-codex AND gpt-5.1-codex-mini), and
|
|
98
|
+
* the ruled remedy is DATA-side: canonicalize the fleet's three alias pins at the spec layer
|
|
99
|
+
* (orch's lane, in-wave). TRANSITION HAZARD, named loudly: until pins read canonical, an
|
|
100
|
+
* alias-pinned claude seat compares "fable" vs "claude-fable-5" and PROCLAIMS — the detector's
|
|
101
|
+
* claude leg must not roll ahead of pin canonicalization. If a transition tolerance is ever
|
|
102
|
+
* needed, it is an explicit provider-aware mapping with an expiry, never token containment. */
|
|
103
|
+
export declare function modelsMatch(pinned: string, effective: string): boolean;
|
|
104
|
+
/** MIGRATION BRIDGE (r2 addendum, desk-ruled 05:03Z) — provider-specific, ONE measured pair, with
|
|
105
|
+
* a BEHAVIORAL executable expiry (r2 round-4: a filename tripwire is not a coupling — the
|
|
106
|
+
* advisory can land inside an existing validator file):
|
|
107
|
+
* - condition 2 (dormancy): fires only while a nodes.model row still carries the alias pin.
|
|
108
|
+
* - condition 1 (removal): gated at RUNTIME on rigspec-schema's SPEC_VALIDATION_CAPABILITIES —
|
|
109
|
+
* when the 5.3 advisory registers "model-pin-canonicalization" there (its registry contract),
|
|
110
|
+
* modelsMatch stops consulting this map in code, and the pin test goes RED until the constant
|
|
111
|
+
* is deleted. The registry's own doc-comment carries the 5.3 obligation. */
|
|
112
|
+
export declare const CLAUDE_ALIAS_MIGRATION_BRIDGE: Record<string, string>;
|
|
113
|
+
//# sourceMappingURL=model-divergence-monitor.d.ts.map
|
package/node_modules/@openrig/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-divergence-monitor.d.ts","sourceRoot":"","sources":["../../../src/domain/model-divergence/model-divergence-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// B8 / slice-07 A3 — MODEL-DIVERGENCE DETECTOR + four-channel proclamation (founder-ruled).
|
|
2
|
+
//
|
|
3
|
+
// DETECT THE DIVERGENCE, NOT THE CAUSES (pm-ruled): the trigger is one comparison — the runtime's
|
|
4
|
+
// EFFECTIVE model vs the seat's PINNED model — at the earliest reliable read. No cause enumeration:
|
|
5
|
+
// specimen #1 was model-invalid (400 silently degraded), specimen #2 was environment-invalid (a
|
|
6
|
+
// missing --add-dir degraded the tier); a 400-handler catches one and misses the other, this
|
|
7
|
+
// comparison catches both. The cause string, when known, rides the proclamation as DIAGNOSIS only.
|
|
8
|
+
//
|
|
9
|
+
// "AT READINESS", operationally: the check ARMS when a pinned seat's occupant generation appears
|
|
10
|
+
// and FIRES at the first reliable effective-model read. A claude seat has no assistant turn at
|
|
11
|
+
// readiness (the effective signal does not exist yet), so the monitor polls and each generation
|
|
12
|
+
// stays PENDING until its runtime produces the signal — then exactly ONE verdict per generation.
|
|
13
|
+
// Every-occurrence semantics live at the generation grain: every new occupant of a diverged seat
|
|
14
|
+
// proclaims again (founder-classed every-occurrence, not digest), while one generation never spams.
|
|
15
|
+
//
|
|
16
|
+
// FOUR CHANNELS, per the desk's target ruling (2026-08-21): orchestrator = the seat's own rig's
|
|
17
|
+
// orch.* seats; operator = the seat resolved from the workspace operator config (derived, never
|
|
18
|
+
// hardcoded — may be cross-host); oversight = the fleet oversight judgment seat (cross-host via the
|
|
19
|
+
// registered route); human-via-Slack = NAMED DEFERRAL ("deferred: M1 not landed") until the M1
|
|
20
|
+
// gateway contract lands — no shadow path. Every channel's delivery OUTCOME is recorded on the
|
|
21
|
+
// proclamation event; an unreachable channel is a named failure/deferral, never a silence.
|
|
22
|
+
import { SPEC_VALIDATION_CAPABILITIES } from "../rigspec-schema.js";
|
|
23
|
+
export const SLACK_DEFERRAL_LINE = "human-via-Slack: deferred: M1 not landed";
|
|
24
|
+
/** Polls a pinned generation may stay signal-less before it is loudly named as unchecked. */
|
|
25
|
+
export const PENDING_VISIBILITY_POLLS = 10;
|
|
26
|
+
export function formatProclamation(p) {
|
|
27
|
+
return [
|
|
28
|
+
`MODEL DIVERGENCE on ${p.sessionName}: pinned=${p.pinnedModel} effective=${p.effectiveModel}`,
|
|
29
|
+
`The seat is RUNNING (graceful degrade held) but on a model nobody chose.`,
|
|
30
|
+
p.diagnosis ? `Diagnosis (informational): ${p.diagnosis}` : `Diagnosis: none captured — the divergence itself is the trigger.`,
|
|
31
|
+
`Detected ${p.detectedAt} (runtime ${p.runtime ?? "unknown"}, node ${p.nodeId}).`,
|
|
32
|
+
].join("\n");
|
|
33
|
+
}
|
|
34
|
+
export class ModelDivergenceMonitor {
|
|
35
|
+
deps;
|
|
36
|
+
/** Generations already given their one verdict (match or proclaimed divergence). */
|
|
37
|
+
settled = new Set();
|
|
38
|
+
/** r1 B8 finding — OBSERVABLE PENDING: consecutive no-signal polls per generation. Detection
|
|
39
|
+
* silence is the failure class one layer under channel silence: a seat whose effective model
|
|
40
|
+
* never reads must be VISIBLE as never-checked, not skipped by a bare continue forever. */
|
|
41
|
+
pendingPolls = new Map();
|
|
42
|
+
pendingReasons = new Map();
|
|
43
|
+
pendingWarned = new Set();
|
|
44
|
+
timer = null;
|
|
45
|
+
warn;
|
|
46
|
+
constructor(deps) {
|
|
47
|
+
this.deps = deps;
|
|
48
|
+
this.warn = deps.warn ?? ((m) => console.warn(m));
|
|
49
|
+
}
|
|
50
|
+
startPolling(intervalMs) {
|
|
51
|
+
if (this.timer)
|
|
52
|
+
return;
|
|
53
|
+
this.timer = setInterval(() => {
|
|
54
|
+
void this.checkOnce().catch((err) => this.warn(`[model-divergence] check failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
55
|
+
}, intervalMs);
|
|
56
|
+
this.timer.unref?.();
|
|
57
|
+
}
|
|
58
|
+
stop() {
|
|
59
|
+
if (this.timer)
|
|
60
|
+
clearInterval(this.timer);
|
|
61
|
+
this.timer = null;
|
|
62
|
+
}
|
|
63
|
+
/** Pinned generations currently pending (no effective read yet) with their poll counts — the
|
|
64
|
+
* observable face of detection-pending (tests + any future status surface). */
|
|
65
|
+
pendingSeats() {
|
|
66
|
+
return [...this.pendingPolls.entries()].map(([key, polls]) => ({ key, polls, reason: this.pendingReasons.get(key) ?? null }));
|
|
67
|
+
}
|
|
68
|
+
/** One pass over the pinned population. Returns the proclamations fired this pass (for tests). */
|
|
69
|
+
async checkOnce() {
|
|
70
|
+
const fired = [];
|
|
71
|
+
for (const seat of this.deps.listPinnedSeats()) {
|
|
72
|
+
const key = `${seat.nodeId}:${seat.generation ?? seat.sessionName}`;
|
|
73
|
+
if (this.settled.has(key))
|
|
74
|
+
continue;
|
|
75
|
+
const read = await this.deps.readEffectiveModel(seat);
|
|
76
|
+
if (!read.ok) {
|
|
77
|
+
// PENDING, never assumed — and never invisible: past the threshold this generation is
|
|
78
|
+
// named ONCE as never-checked (r1 measured real codex rollouts whose signal sat outside
|
|
79
|
+
// the bounded read; without this line such a seat would be skipped silently forever).
|
|
80
|
+
const polls = (this.pendingPolls.get(key) ?? 0) + 1;
|
|
81
|
+
this.pendingPolls.set(key, polls);
|
|
82
|
+
this.pendingReasons.set(key, read.reason);
|
|
83
|
+
if (polls >= PENDING_VISIBILITY_POLLS && !this.pendingWarned.has(key)) {
|
|
84
|
+
this.pendingWarned.add(key);
|
|
85
|
+
this.warn(`[model-divergence] ${seat.sessionName} (pin ${seat.pinnedModel}) has NO effective-model ` +
|
|
86
|
+
`read after ${polls} polls — this seat is pinned but UNCHECKED (${read.reason}). ` +
|
|
87
|
+
`A divergence here would currently be invisible.`);
|
|
88
|
+
}
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
this.pendingPolls.delete(key);
|
|
92
|
+
this.pendingReasons.delete(key);
|
|
93
|
+
if (modelsMatch(seat.pinnedModel, read.model)) {
|
|
94
|
+
this.settled.add(key);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const proclamation = await this.proclaim(seat, read.model);
|
|
98
|
+
this.settled.add(key);
|
|
99
|
+
fired.push(proclamation);
|
|
100
|
+
}
|
|
101
|
+
return fired;
|
|
102
|
+
}
|
|
103
|
+
async proclaim(seat, effectiveModel) {
|
|
104
|
+
const detectedAt = (this.deps.now?.() ?? new Date()).toISOString();
|
|
105
|
+
const base = {
|
|
106
|
+
nodeId: seat.nodeId,
|
|
107
|
+
sessionName: seat.sessionName,
|
|
108
|
+
rigId: seat.rigId,
|
|
109
|
+
rigName: seat.rigName,
|
|
110
|
+
runtime: seat.runtime,
|
|
111
|
+
pinnedModel: seat.pinnedModel,
|
|
112
|
+
effectiveModel,
|
|
113
|
+
diagnosis: this.deps.diagnose?.(seat) ?? null,
|
|
114
|
+
detectedAt,
|
|
115
|
+
};
|
|
116
|
+
const message = formatProclamation(base);
|
|
117
|
+
const channels = [];
|
|
118
|
+
const orchSeats = this.deps.resolveOrchSeats(seat.rigName);
|
|
119
|
+
if (orchSeats.length === 0) {
|
|
120
|
+
channels.push({ channel: "orchestrator", target: null, status: "failed", detail: `no orch seats found in rig ${seat.rigName}` });
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
for (const target of orchSeats)
|
|
124
|
+
channels.push(await this.deliver("orchestrator", target, message));
|
|
125
|
+
}
|
|
126
|
+
const operator = this.deps.resolveOperatorSeat();
|
|
127
|
+
channels.push(operator
|
|
128
|
+
? await this.deliver("operator", operator, message)
|
|
129
|
+
: { channel: "operator", target: null, status: "failed", detail: "no operator seat configured" });
|
|
130
|
+
const oversight = this.deps.resolveOversightSeat();
|
|
131
|
+
channels.push(oversight
|
|
132
|
+
? await this.deliver("oversight", oversight, message)
|
|
133
|
+
: { channel: "oversight", target: null, status: "deferred", detail: "deferred: no oversight route registered from this host" });
|
|
134
|
+
// DS2 (founder-locked transport): Slack rides ONLY the M1 gateway contract. Until M1 lands this
|
|
135
|
+
// channel refuses loudly with its named deferral — never an improvised shadow path.
|
|
136
|
+
channels.push({ channel: "slack", target: null, status: "deferred", detail: SLACK_DEFERRAL_LINE });
|
|
137
|
+
const proclamation = { ...base, channels };
|
|
138
|
+
try {
|
|
139
|
+
this.deps.recordProclamation(proclamation);
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
this.warn(`[model-divergence] proclamation record failed for ${seat.sessionName}: ${err instanceof Error ? err.message : String(err)}`);
|
|
143
|
+
}
|
|
144
|
+
return proclamation;
|
|
145
|
+
}
|
|
146
|
+
async deliver(channel, target, message) {
|
|
147
|
+
try {
|
|
148
|
+
const res = await this.deps.sendToSession(target, message);
|
|
149
|
+
return res.ok
|
|
150
|
+
? { channel, target, status: "delivered" }
|
|
151
|
+
: { channel, target, status: "failed", detail: res.error ?? "send failed" };
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
return { channel, target, status: "failed", detail: err instanceof Error ? err.message : String(err) };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Pin comparison: EXACT, case-insensitive, after trimming. This ruling has now traveled the full
|
|
159
|
+
* arc and lands where it started, with the reasons on record: exact was ruled at build; this seat
|
|
160
|
+
* reversed it to whole-token alias matching when the live census showed alias pins ("fable") vs
|
|
161
|
+
* full effective ids ("claude-fable-5"); r2 REVERSED IT BACK — generic token containment lets one
|
|
162
|
+
* pin bless multiple distinct models ("codex" matched gpt-5.6-codex AND gpt-5.1-codex-mini), and
|
|
163
|
+
* the ruled remedy is DATA-side: canonicalize the fleet's three alias pins at the spec layer
|
|
164
|
+
* (orch's lane, in-wave). TRANSITION HAZARD, named loudly: until pins read canonical, an
|
|
165
|
+
* alias-pinned claude seat compares "fable" vs "claude-fable-5" and PROCLAIMS — the detector's
|
|
166
|
+
* claude leg must not roll ahead of pin canonicalization. If a transition tolerance is ever
|
|
167
|
+
* needed, it is an explicit provider-aware mapping with an expiry, never token containment. */
|
|
168
|
+
export function modelsMatch(pinned, effective) {
|
|
169
|
+
const pin = pinned.trim().toLowerCase();
|
|
170
|
+
const eff = effective.trim().toLowerCase();
|
|
171
|
+
if (pin === eff)
|
|
172
|
+
return true;
|
|
173
|
+
// The bridge is DEAD CODE the moment the 5.3 advisory registers its capability — runtime-gated
|
|
174
|
+
// on the behavioral sentinel, not on anyone remembering a comment (r2 round-4 HIGH-2).
|
|
175
|
+
if (SPEC_VALIDATION_CAPABILITIES.has("model-pin-canonicalization"))
|
|
176
|
+
return false;
|
|
177
|
+
return CLAUDE_ALIAS_MIGRATION_BRIDGE[pin] === eff;
|
|
178
|
+
}
|
|
179
|
+
/** MIGRATION BRIDGE (r2 addendum, desk-ruled 05:03Z) — provider-specific, ONE measured pair, with
|
|
180
|
+
* a BEHAVIORAL executable expiry (r2 round-4: a filename tripwire is not a coupling — the
|
|
181
|
+
* advisory can land inside an existing validator file):
|
|
182
|
+
* - condition 2 (dormancy): fires only while a nodes.model row still carries the alias pin.
|
|
183
|
+
* - condition 1 (removal): gated at RUNTIME on rigspec-schema's SPEC_VALIDATION_CAPABILITIES —
|
|
184
|
+
* when the 5.3 advisory registers "model-pin-canonicalization" there (its registry contract),
|
|
185
|
+
* modelsMatch stops consulting this map in code, and the pin test goes RED until the constant
|
|
186
|
+
* is deleted. The registry's own doc-comment carries the 5.3 obligation. */
|
|
187
|
+
export const CLAUDE_ALIAS_MIGRATION_BRIDGE = {
|
|
188
|
+
fable: "claude-fable-5",
|
|
189
|
+
};
|
|
190
|
+
//# sourceMappingURL=model-divergence-monitor.js.map
|
package/node_modules/@openrig/daemon/dist/domain/model-divergence/model-divergence-monitor.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-divergence-monitor.js","sourceRoot":"","sources":["../../../src/domain/model-divergence/model-divergence-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
import { type JsonlExchange } from "./session-jsonl.js";
|
|
2
2
|
import type { PredecessorRecapResolver } from "./seat-handover-service.js";
|
|
3
3
|
export interface PredecessorRecapResolverDeps {
|
|
4
|
-
/** Claude:
|
|
5
|
-
|
|
4
|
+
/** Claude: the name-keyed sidecar carries `transcript_path` + `session_id`; both ride the read so
|
|
5
|
+
* the caller can verify WHOSE record the name currently points at. */
|
|
6
|
+
readClaudeRecord: (sessionName: string) => {
|
|
7
|
+
transcriptPath: string | null;
|
|
8
|
+
sessionId: string | null;
|
|
9
|
+
};
|
|
6
10
|
/** Codex: normalized usage carries `rollout_path`; resolve it from the thread id (resume token). */
|
|
7
11
|
readCodexTranscriptPath: (args: {
|
|
8
12
|
threadId: string | null;
|
|
9
13
|
sessionName: string;
|
|
10
14
|
}) => string | null;
|
|
11
|
-
/** Look up the departing session's
|
|
15
|
+
/** Look up the departing session's resume token by node + session name (codex thread id; for a
|
|
16
|
+
* claude row this is the predecessor's session uuid — the sidecar-ownership verifier). */
|
|
12
17
|
lookupResumeToken: (nodeId: string, sessionName: string) => string | null;
|
|
13
18
|
/** Injectable for tests; defaults to the real JSONL parser. */
|
|
14
19
|
parseExchanges?: (path: string, n: number) => JsonlExchange[];
|
|
15
20
|
/** Bounded recap size (default 6). */
|
|
16
21
|
maxExchanges?: number;
|
|
22
|
+
/** Per-exchange content cap in characters (default 500); over-cap content is visibly truncated. */
|
|
23
|
+
maxCharsPerExchange?: number;
|
|
17
24
|
}
|
|
18
25
|
export declare function makePredecessorRecapResolver(deps: PredecessorRecapResolverDeps): PredecessorRecapResolver;
|
|
19
26
|
//# sourceMappingURL=predecessor-recap-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"predecessor-recap-resolver.d.ts","sourceRoot":"","sources":["../../src/domain/predecessor-recap-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,KAAK,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"predecessor-recap-resolver.d.ts","sourceRoot":"","sources":["../../src/domain/predecessor-recap-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,KAAK,EAAE,wBAAwB,EAA8B,MAAM,4BAA4B,CAAC;AAiCvG,MAAM,WAAW,4BAA4B;IAC3C;2EACuE;IACvE,gBAAgB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK;QAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACvG,oGAAoG;IACpG,uBAAuB,EAAE,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,GAAG,IAAI,CAAC;IACnG;+FAC2F;IAC3F,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC1E,+DAA+D;IAC/D,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,aAAa,EAAE,CAAC;IAC9D,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mGAAmG;IACnG,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAOD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,4BAA4B,GAAG,wBAAwB,CAiCzG"}
|
|
@@ -1,26 +1,73 @@
|
|
|
1
1
|
import { parseJsonlExchanges } from "./session-jsonl.js";
|
|
2
2
|
/**
|
|
3
|
-
* Production resolver for the seat-handover
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
3
|
+
* Production resolver for the seat-handover boot recap: resolve the DEPARTING seat's provider record
|
|
4
|
+
* path — claude `transcript_path` (via the sidecar, keyed by session name) or codex `rollout_path`
|
|
5
|
+
* (via the thread, keyed by the departing resume token) — and parse the last N exchanges into a
|
|
6
|
+
* bounded from-record recap.
|
|
7
|
+
*
|
|
8
|
+
* The recap is the PERMANENT claude-runtime leg of scrollback-preserving handover, not an interim
|
|
9
|
+
* measure: claude-code seats run in the tmux alternate screen, which keeps no scrollback buffer, so
|
|
10
|
+
* a successor pane can never natively scroll into the predecessor conversation there. (Codex seats
|
|
11
|
+
* get native scrollback via the in-pane respawn; the recap still renders as a convenience.)
|
|
12
|
+
*
|
|
13
|
+
* B16 — the claude leg is RACE-GUARDED and every null is NAMED. The sidecar is keyed by SESSION
|
|
14
|
+
* NAME, and the cutover reuses the canonical name across generations, so a successor that has
|
|
15
|
+
* already booted overwrites the very sidecar this resolver queries (the live defect: the resolver
|
|
16
|
+
* read the successor's fresh sidecar and honestly returned nothing, silently). Two defenses:
|
|
17
|
+
* the SERVICE now resolves BEFORE the successor launches, and this resolver verifies the sidecar's
|
|
18
|
+
* session_id against the predecessor's recorded resume token when both are present — a mismatch is
|
|
19
|
+
* an UNAVAILABLE verdict naming the collision, never a silent null and never someone else's recap.
|
|
20
|
+
* Every no-recap outcome returns { unavailableReason } so the packet can say what happened
|
|
21
|
+
* (honest-degraded means LABELED, not silent).
|
|
22
|
+
*
|
|
23
|
+
* Bounded on BOTH axes: at most `maxExchanges` exchanges, and each exchange's content is capped at
|
|
24
|
+
* `maxCharsPerExchange` characters (a single pasted-file or long-form exchange must not flood the
|
|
25
|
+
* successor pane); truncation is visible and points the reader at the full record. Pure + injected
|
|
26
|
+
* deps so the runtime-branching + guard handling is unit-tested without a live daemon; startup
|
|
27
|
+
* wires the real reads.
|
|
9
28
|
*/
|
|
10
29
|
const DEFAULT_MAX_EXCHANGES = 6;
|
|
30
|
+
const DEFAULT_MAX_CHARS_PER_EXCHANGE = 500;
|
|
31
|
+
const TRUNCATION_MARKER = "… [truncated; full text in the predecessor record]";
|
|
32
|
+
function boundExchange(ex, maxChars) {
|
|
33
|
+
if (ex.content.length <= maxChars)
|
|
34
|
+
return ex;
|
|
35
|
+
return { role: ex.role, content: ex.content.slice(0, maxChars) + TRUNCATION_MARKER };
|
|
36
|
+
}
|
|
11
37
|
export function makePredecessorRecapResolver(deps) {
|
|
12
38
|
const parse = deps.parseExchanges ?? parseJsonlExchanges;
|
|
13
39
|
const max = deps.maxExchanges ?? DEFAULT_MAX_EXCHANGES;
|
|
40
|
+
const maxChars = deps.maxCharsPerExchange ?? DEFAULT_MAX_CHARS_PER_EXCHANGE;
|
|
14
41
|
return ({ nodeId, runtime, sessionName }) => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
42
|
+
let path;
|
|
43
|
+
if (runtime === "codex") {
|
|
44
|
+
const threadId = deps.lookupResumeToken(nodeId, sessionName);
|
|
45
|
+
if (!threadId)
|
|
46
|
+
return { unavailableReason: "no resume token recorded for the departing codex session" };
|
|
47
|
+
path = deps.readCodexTranscriptPath({ threadId, sessionName });
|
|
48
|
+
if (!path)
|
|
49
|
+
return { unavailableReason: `no rollout record found for codex thread ${threadId}` };
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const record = deps.readClaudeRecord(sessionName);
|
|
53
|
+
if (!record.transcriptPath) {
|
|
54
|
+
return { unavailableReason: "the name-keyed context sidecar is missing or carries no transcript_path" };
|
|
55
|
+
}
|
|
56
|
+
// Ownership guard: the sidecar must be the PREDECESSOR's, not a same-named successor's.
|
|
57
|
+
const predecessorToken = deps.lookupResumeToken(nodeId, sessionName);
|
|
58
|
+
if (predecessorToken && record.sessionId && record.sessionId !== predecessorToken) {
|
|
59
|
+
return {
|
|
60
|
+
unavailableReason: `the name-keyed sidecar belongs to session ${record.sessionId.slice(0, 8)}…, not the departing session ` +
|
|
61
|
+
`${predecessorToken.slice(0, 8)}… (canonical-name reuse race — the record path would be the wrong tenure's)`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
path = record.transcriptPath;
|
|
65
|
+
}
|
|
20
66
|
const recap = parse(path, max);
|
|
21
|
-
if (recap.length === 0)
|
|
22
|
-
return
|
|
23
|
-
|
|
67
|
+
if (recap.length === 0) {
|
|
68
|
+
return { unavailableReason: `the predecessor record at ${path} yielded no user/assistant exchanges (empty, unreadable, or too large to read)` };
|
|
69
|
+
}
|
|
70
|
+
return { recap: recap.map((ex) => boundExchange(ex, maxChars)), recordPath: path };
|
|
24
71
|
};
|
|
25
72
|
}
|
|
26
73
|
//# sourceMappingURL=predecessor-recap-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"predecessor-recap-resolver.js","sourceRoot":"","sources":["../../src/domain/predecessor-recap-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAsB,MAAM,oBAAoB,CAAC;AAG7E
|
|
1
|
+
{"version":3,"file":"predecessor-recap-resolver.js","sourceRoot":"","sources":["../../src/domain/predecessor-recap-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAsB,MAAM,oBAAoB,CAAC;AAG7E;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAChC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAC3C,MAAM,iBAAiB,GAAG,oDAAoD,CAAC;AAmB/E,SAAS,aAAa,CAAC,EAAiB,EAAE,QAAgB;IACxD,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC7C,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,iBAAiB,EAAE,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAAkC;IAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,IAAI,mBAAmB,CAAC;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,IAAI,qBAAqB,CAAC;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,IAAI,8BAA8B,CAAC;IAC5E,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,EAA8B,EAAE;QACtE,IAAI,IAAmB,CAAC;QACxB,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC7D,IAAI,CAAC,QAAQ;gBAAE,OAAO,EAAE,iBAAiB,EAAE,0DAA0D,EAAE,CAAC;YACxG,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;YAC/D,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,iBAAiB,EAAE,4CAA4C,QAAQ,EAAE,EAAE,CAAC;QAClG,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC3B,OAAO,EAAE,iBAAiB,EAAE,yEAAyE,EAAE,CAAC;YAC1G,CAAC;YACD,wFAAwF;YACxF,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACrE,IAAI,gBAAgB,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,gBAAgB,EAAE,CAAC;gBAClF,OAAO;oBACL,iBAAiB,EACf,6CAA6C,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,+BAA+B;wBACxG,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,6EAA6E;iBAC/G,CAAC;YACJ,CAAC;YACD,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC;QAC/B,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,IAAI,gFAAgF,EAAE,CAAC;QAClJ,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACrF,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -16,8 +16,12 @@ interface ResumeMetadataRefresherDeps {
|
|
|
16
16
|
pid: number;
|
|
17
17
|
ppid: number;
|
|
18
18
|
command: string;
|
|
19
|
-
}
|
|
20
|
-
|
|
19
|
+
}> | Promise<Array<{
|
|
20
|
+
pid: number;
|
|
21
|
+
ppid: number;
|
|
22
|
+
command: string;
|
|
23
|
+
}>>;
|
|
24
|
+
readCodexThreadIdByPid?: (pid: number) => Promise<string | undefined> | string | undefined;
|
|
21
25
|
probeClaudeResume?: (sessionName: string, resumeToken: string, cwd?: string | null) => Promise<"resumable" | "not_resumable" | "inconclusive">;
|
|
22
26
|
resolveHomeDirByPid?: ResolveHomeDirByPid;
|
|
23
27
|
sleep?: (ms: number) => Promise<void>;
|
|
@@ -80,5 +84,10 @@ export declare class ResumeMetadataRefresher {
|
|
|
80
84
|
private defaultProbeClaudeResume;
|
|
81
85
|
private waitForProbeShellReady;
|
|
82
86
|
}
|
|
87
|
+
export declare function defaultListProcesses(): Promise<Array<{
|
|
88
|
+
pid: number;
|
|
89
|
+
ppid: number;
|
|
90
|
+
command: string;
|
|
91
|
+
}>>;
|
|
83
92
|
export {};
|
|
84
93
|
//# sourceMappingURL=resume-metadata-refresher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume-metadata-refresher.d.ts","sourceRoot":"","sources":["../../src/domain/resume-metadata-refresher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resume-metadata-refresher.d.ts","sourceRoot":"","sources":["../../src/domain/resume-metadata-refresher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import os from "node:os";
|
|
2
2
|
import nodePath from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { execFile } from "node:child_process";
|
|
4
|
+
import { promisify } from "node:util";
|
|
4
5
|
import { defaultResolveHomeDirByPid, readCodexThreadIdFromCandidateHomes, } from "./codex-thread-id.js";
|
|
5
6
|
import { assessNativeResumeProbe, buildNativeResumeCommand, isProbeShellReady, } from "./native-resume-probe.js";
|
|
6
|
-
import {
|
|
7
|
+
import { runAsyncSite } from "./sync-site-wrap.js";
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
7
9
|
export class ResumeMetadataRefresher {
|
|
8
10
|
sessionRegistry;
|
|
9
11
|
tmuxAdapter;
|
|
@@ -19,7 +21,7 @@ export class ResumeMetadataRefresher {
|
|
|
19
21
|
this.tmuxAdapter = deps.tmuxAdapter;
|
|
20
22
|
this.listProcesses = deps.listProcesses ?? defaultListProcesses;
|
|
21
23
|
this.resolveHomeDirByPid = deps.resolveHomeDirByPid ?? defaultResolveHomeDirByPid;
|
|
22
|
-
this.readCodexThreadIdByPid = deps.readCodexThreadIdByPid ?? ((pid) => readCodexThreadIdFromLogs(pid, this.resolveHomeDirByPid, deps.homeDir ?? os.homedir()));
|
|
24
|
+
this.readCodexThreadIdByPid = deps.readCodexThreadIdByPid ?? (async (pid) => readCodexThreadIdFromLogs(pid, await this.resolveHomeDirByPid(pid), deps.homeDir ?? os.homedir()));
|
|
23
25
|
this.probeClaudeResume = deps.probeClaudeResume ?? ((sessionName, resumeToken, cwd) => this.defaultProbeClaudeResume(sessionName, resumeToken, cwd));
|
|
24
26
|
this.sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
25
27
|
this.homeDir = deps.homeDir ?? os.homedir();
|
|
@@ -134,9 +136,9 @@ export class ResumeMetadataRefresher {
|
|
|
134
136
|
for (let attempt = 0; attempt < 8; attempt++) {
|
|
135
137
|
const shellPid = await this.tmuxAdapter.getPanePid(sessionTarget);
|
|
136
138
|
if (shellPid) {
|
|
137
|
-
const codexPids = findCodexDescendantPids(this.listProcesses(), shellPid);
|
|
139
|
+
const codexPids = findCodexDescendantPids(await this.listProcesses(), shellPid);
|
|
138
140
|
for (const codexPid of codexPids) {
|
|
139
|
-
const threadId = this.readCodexThreadIdByPid(codexPid);
|
|
141
|
+
const threadId = await this.readCodexThreadIdByPid(codexPid);
|
|
140
142
|
if (threadId)
|
|
141
143
|
return threadId;
|
|
142
144
|
}
|
|
@@ -208,9 +210,15 @@ export class ResumeMetadataRefresher {
|
|
|
208
210
|
return false;
|
|
209
211
|
}
|
|
210
212
|
}
|
|
211
|
-
|
|
213
|
+
// Exported for unit test (B12-T): the REAL async sampling path — the anti-vacuity test drives
|
|
214
|
+
// this default directly (every other suite injects sync stubs) and asserts the non-blocking
|
|
215
|
+
// property that the pre-B12 sync implementation violated.
|
|
216
|
+
export async function defaultListProcesses() {
|
|
212
217
|
try {
|
|
213
|
-
const output =
|
|
218
|
+
const output = await runAsyncSite("resume_metadata.list_processes", async () => {
|
|
219
|
+
const { stdout } = await execFileAsync("ps", ["-Ao", "pid,ppid,command"], { encoding: "utf-8", maxBuffer: 8 * 1024 * 1024 });
|
|
220
|
+
return stdout;
|
|
221
|
+
});
|
|
214
222
|
return output
|
|
215
223
|
.split("\n")
|
|
216
224
|
.slice(1)
|
|
@@ -251,8 +259,8 @@ function findCodexDescendantPids(processes, parentPid) {
|
|
|
251
259
|
visit(parentPid);
|
|
252
260
|
return matches;
|
|
253
261
|
}
|
|
254
|
-
function readCodexThreadIdFromLogs(pid,
|
|
255
|
-
return readCodexThreadIdFromCandidateHomes(pid, [
|
|
262
|
+
function readCodexThreadIdFromLogs(pid, resolvedHome, homeDir) {
|
|
263
|
+
return readCodexThreadIdFromCandidateHomes(pid, [resolvedHome, homeDir, os.homedir()]);
|
|
256
264
|
}
|
|
257
265
|
function commandLooksLikeCodex(command) {
|
|
258
266
|
const tokens = command.trim().split(/\s+/).filter(Boolean);
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"resume-metadata-refresher.js","sourceRoot":"","sources":["../../src/domain/resume-metadata-refresher.ts"],"names":[],"mappings":"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"}
|