@openrig/cli 0.4.7 → 0.5.0
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/claude-statusline-context.cjs +40 -8
- package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +0 -0
- package/daemon/assets/plugins/openrig-core/skills/applying-a-permission-policy/SKILL.md +120 -0
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/precompact-hook.mjs +0 -0
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/restore-from-jsonl.mjs +0 -0
- package/daemon/assets/plugins/openrig-core/skills/delegating-work/SKILL.md +43 -0
- package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +2 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +50 -57
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +84 -19
- package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +2 -0
- package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/SKILL.md +2 -1
- package/daemon/assets/plugins/openrig-core/skills/session-compaction-and-restore/SKILL.md +1 -0
- package/daemon/dist/adapters/claude-code-adapter.d.ts +36 -9
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +216 -49
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/adapters/claude-resume.d.ts +1 -1
- package/daemon/dist/adapters/claude-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-resume.js +8 -2
- package/daemon/dist/adapters/claude-resume.js.map +1 -1
- package/daemon/dist/adapters/codex-resume.d.ts +1 -1
- package/daemon/dist/adapters/codex-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-resume.js +4 -2
- package/daemon/dist/adapters/codex-resume.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +12 -0
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +34 -7
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/pi-resume.d.ts +1 -1
- package/daemon/dist/adapters/pi-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-resume.js +7 -2
- package/daemon/dist/adapters/pi-resume.js.map +1 -1
- package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runtime-adapter.js +4 -1
- package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/yolo-mode.d.ts +23 -0
- package/daemon/dist/adapters/yolo-mode.d.ts.map +1 -0
- package/daemon/dist/adapters/yolo-mode.js +49 -0
- package/daemon/dist/adapters/yolo-mode.js.map +1 -0
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/db/migrations/055_node_permission_policy.d.ts +13 -0
- package/daemon/dist/db/migrations/055_node_permission_policy.d.ts.map +1 -0
- package/daemon/dist/db/migrations/055_node_permission_policy.js +17 -0
- package/daemon/dist/db/migrations/055_node_permission_policy.js.map +1 -0
- package/daemon/dist/db/migrations/056_rig_permission_policy.d.ts +13 -0
- package/daemon/dist/db/migrations/056_rig_permission_policy.d.ts.map +1 -0
- package/daemon/dist/db/migrations/056_rig_permission_policy.js +17 -0
- package/daemon/dist/db/migrations/056_rig_permission_policy.js.map +1 -0
- package/daemon/dist/db/migrations/057_node_policy_provenance.d.ts +19 -0
- package/daemon/dist/db/migrations/057_node_policy_provenance.d.ts.map +1 -0
- package/daemon/dist/db/migrations/057_node_policy_provenance.js +26 -0
- package/daemon/dist/db/migrations/057_node_policy_provenance.js.map +1 -0
- package/daemon/dist/db/migrations/058_rig_policy_provenance.d.ts +15 -0
- package/daemon/dist/db/migrations/058_rig_policy_provenance.d.ts.map +1 -0
- package/daemon/dist/db/migrations/058_rig_policy_provenance.js +22 -0
- package/daemon/dist/db/migrations/058_rig_policy_provenance.js.map +1 -0
- package/daemon/dist/domain/agent-activity-store.d.ts +1 -0
- package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -1
- package/daemon/dist/domain/agent-activity-store.js +2 -2
- package/daemon/dist/domain/agent-activity-store.js.map +1 -1
- package/daemon/dist/domain/builtin-policy-reference.d.ts +13 -0
- package/daemon/dist/domain/builtin-policy-reference.d.ts.map +1 -0
- package/daemon/dist/domain/builtin-policy-reference.js +58 -0
- package/daemon/dist/domain/builtin-policy-reference.js.map +1 -0
- package/daemon/dist/domain/claude-activity-hooks.d.ts +33 -0
- package/daemon/dist/domain/claude-activity-hooks.d.ts.map +1 -0
- package/daemon/dist/domain/claude-activity-hooks.js +60 -0
- package/daemon/dist/domain/claude-activity-hooks.js.map +1 -0
- package/daemon/dist/domain/context-packs/bundle-assembler.d.ts +30 -0
- package/daemon/dist/domain/context-packs/bundle-assembler.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/bundle-assembler.js +31 -1
- package/daemon/dist/domain/context-packs/bundle-assembler.js.map +1 -1
- package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts +69 -14
- package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/context-pack-library-service.js +263 -48
- package/daemon/dist/domain/context-packs/context-pack-library-service.js.map +1 -1
- package/daemon/dist/domain/context-packs/context-pack-types.d.ts +2 -2
- package/daemon/dist/domain/context-packs/context-pack-types.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/context-pack-types.js.map +1 -1
- package/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -1
- package/daemon/dist/domain/context-packs/manifest-parser.js +11 -0
- package/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -1
- package/daemon/dist/domain/context-packs/ref-safety.d.ts +11 -0
- package/daemon/dist/domain/context-packs/ref-safety.d.ts.map +1 -0
- package/daemon/dist/domain/context-packs/ref-safety.js +46 -0
- package/daemon/dist/domain/context-packs/ref-safety.js.map +1 -0
- package/daemon/dist/domain/context-packs/token-estimate.d.ts +3 -0
- package/daemon/dist/domain/context-packs/token-estimate.d.ts.map +1 -0
- package/daemon/dist/domain/context-packs/token-estimate.js +5 -0
- package/daemon/dist/domain/context-packs/token-estimate.js.map +1 -0
- package/daemon/dist/domain/native-resume-probe.d.ts +1 -1
- package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
- package/daemon/dist/domain/native-resume-probe.js +11 -4
- package/daemon/dist/domain/native-resume-probe.js.map +1 -1
- package/daemon/dist/domain/node-inventory.js +2 -2
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/permission-policy/policy-ref.d.ts +89 -0
- package/daemon/dist/domain/permission-policy/policy-ref.d.ts.map +1 -0
- package/daemon/dist/domain/permission-policy/policy-ref.js +171 -0
- package/daemon/dist/domain/permission-policy/policy-ref.js.map +1 -0
- package/daemon/dist/domain/permission-policy/policy-spec.d.ts +34 -0
- package/daemon/dist/domain/permission-policy/policy-spec.d.ts.map +1 -0
- package/daemon/dist/domain/permission-policy/policy-spec.js +106 -0
- package/daemon/dist/domain/permission-policy/policy-spec.js.map +1 -0
- package/daemon/dist/domain/plugin-vendor-service.d.ts +14 -0
- package/daemon/dist/domain/plugin-vendor-service.d.ts.map +1 -1
- package/daemon/dist/domain/plugin-vendor-service.js +26 -2
- package/daemon/dist/domain/plugin-vendor-service.js.map +1 -1
- package/daemon/dist/domain/provider/claude-usage-reader.d.ts +44 -0
- package/daemon/dist/domain/provider/claude-usage-reader.d.ts.map +1 -0
- package/daemon/dist/domain/provider/claude-usage-reader.js +112 -0
- package/daemon/dist/domain/provider/claude-usage-reader.js.map +1 -0
- package/daemon/dist/domain/provider/codex-auth-reader.d.ts +18 -0
- package/daemon/dist/domain/provider/codex-auth-reader.d.ts.map +1 -0
- package/daemon/dist/domain/provider/codex-auth-reader.js +64 -0
- package/daemon/dist/domain/provider/codex-auth-reader.js.map +1 -0
- package/daemon/dist/domain/provider/host-usage-rollup.d.ts +51 -0
- package/daemon/dist/domain/provider/host-usage-rollup.d.ts.map +1 -0
- package/daemon/dist/domain/provider/host-usage-rollup.js +162 -0
- package/daemon/dist/domain/provider/host-usage-rollup.js.map +1 -0
- package/daemon/dist/domain/provider/provider-collect.d.ts +22 -0
- package/daemon/dist/domain/provider/provider-collect.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-collect.js +74 -0
- package/daemon/dist/domain/provider/provider-collect.js.map +1 -0
- package/daemon/dist/domain/provider/provider-policy.d.ts +38 -0
- package/daemon/dist/domain/provider/provider-policy.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-policy.js +76 -0
- package/daemon/dist/domain/provider/provider-policy.js.map +1 -0
- package/daemon/dist/domain/provider/provider-read-model.d.ts +28 -0
- package/daemon/dist/domain/provider/provider-read-model.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-read-model.js +68 -0
- package/daemon/dist/domain/provider/provider-read-model.js.map +1 -0
- package/daemon/dist/domain/provider/provider-service-impl.d.ts +26 -0
- package/daemon/dist/domain/provider/provider-service-impl.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-service-impl.js +83 -0
- package/daemon/dist/domain/provider/provider-service-impl.js.map +1 -0
- package/daemon/dist/domain/provider/provider-service.d.ts +33 -0
- package/daemon/dist/domain/provider/provider-service.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-service.js +6 -0
- package/daemon/dist/domain/provider/provider-service.js.map +1 -0
- package/daemon/dist/domain/provider/provider-signals.d.ts +76 -0
- package/daemon/dist/domain/provider/provider-signals.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-signals.js +144 -0
- package/daemon/dist/domain/provider/provider-signals.js.map +1 -0
- package/daemon/dist/domain/provider/provider-types.d.ts +101 -0
- package/daemon/dist/domain/provider/provider-types.d.ts.map +1 -0
- package/daemon/dist/domain/provider/provider-types.js +7 -0
- package/daemon/dist/domain/provider/provider-types.js.map +1 -0
- package/daemon/dist/domain/provider/reactive-tap.d.ts +29 -0
- package/daemon/dist/domain/provider/reactive-tap.d.ts.map +1 -0
- package/daemon/dist/domain/provider/reactive-tap.js +80 -0
- package/daemon/dist/domain/provider/reactive-tap.js.map +1 -0
- package/daemon/dist/domain/restore-orchestrator.d.ts +14 -0
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +90 -6
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
- package/daemon/dist/domain/rig-expansion-service.js +10 -1
- package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
- package/daemon/dist/domain/rig-repository.d.ts +45 -0
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +75 -1
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-codec.js +6 -0
- package/daemon/dist/domain/rigspec-codec.js.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.js +8 -0
- package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts +25 -24
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +190 -69
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts +22 -0
- package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.js +76 -0
- package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +25 -0
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/runtime-adapter.d.ts +7 -11
- package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/runtime-adapter.js.map +1 -1
- package/daemon/dist/domain/scope/attestation-lineage.generated.d.ts +14 -0
- package/daemon/dist/domain/scope/attestation-lineage.generated.d.ts.map +1 -0
- package/daemon/dist/domain/scope/attestation-lineage.generated.js +26 -0
- package/daemon/dist/domain/scope/attestation-lineage.generated.js.map +1 -0
- package/daemon/dist/domain/scope/scope-approve.d.ts +13 -0
- package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-approve.js +50 -10
- package/daemon/dist/domain/scope/scope-approve.js.map +1 -1
- package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-service.js +7 -1
- package/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/daemon/dist/domain/startup-validation.d.ts.map +1 -1
- package/daemon/dist/domain/startup-validation.js +18 -54
- package/daemon/dist/domain/startup-validation.js.map +1 -1
- package/daemon/dist/domain/stream-store.d.ts +4 -0
- package/daemon/dist/domain/stream-store.d.ts.map +1 -1
- package/daemon/dist/domain/stream-store.js +15 -2
- package/daemon/dist/domain/stream-store.js.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.d.ts +4 -0
- package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.js +2 -0
- package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +19 -9
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js +1 -1
- package/daemon/dist/routes/agent-images.d.ts.map +1 -1
- package/daemon/dist/routes/agent-images.js +2 -0
- package/daemon/dist/routes/agent-images.js.map +1 -1
- package/daemon/dist/routes/context-packs.d.ts.map +1 -1
- package/daemon/dist/routes/context-packs.js +157 -75
- package/daemon/dist/routes/context-packs.js.map +1 -1
- package/daemon/dist/routes/provider.d.ts +3 -0
- package/daemon/dist/routes/provider.d.ts.map +1 -0
- package/daemon/dist/routes/provider.js +124 -0
- package/daemon/dist/routes/provider.js.map +1 -0
- package/daemon/dist/routes/rigs.js +8 -0
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/scope-approve.d.ts.map +1 -1
- package/daemon/dist/routes/scope-approve.js +6 -3
- 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 +4 -1
- package/daemon/dist/routes/scope-audit.js.map +1 -1
- package/daemon/dist/routes/stream.d.ts.map +1 -1
- package/daemon/dist/routes/stream.js +71 -1
- package/daemon/dist/routes/stream.js.map +1 -1
- package/daemon/dist/server.d.ts +3 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +5 -0
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +38 -12
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/developing.md +39 -0
- package/daemon/docs/reference/rig-spec.md +19 -0
- package/daemon/policies/builtin/locked.policy.md +24 -0
- package/daemon/policies/builtin/open.policy.md +24 -0
- package/daemon/policies/builtin/standard.policy.md +25 -0
- package/daemon/policies/builtin/yolo.policy.md +20 -0
- package/daemon/policies/examples/my-cautious-dev.policy.md +40 -0
- package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -1
- package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -1
- package/daemon/specs/agents/design/product-designer/agent.yaml +1 -1
- package/daemon/specs/agents/development/implementer/agent.yaml +1 -1
- package/daemon/specs/agents/development/qa/agent.yaml +1 -1
- package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +1 -1
- package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +1 -1
- package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -1
- package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
- package/daemon/specs/agents/research/analyst/agent.yaml +1 -1
- package/daemon/specs/agents/research/synthesizer/agent.yaml +1 -1
- package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -1
- package/daemon/specs/agents/shared/agent.yaml +6 -0
- package/daemon/specs/agents/shared/runtime/claude-activity-hooks.json +4 -0
- package/daemon/specs/agents/shared/runtime/claude-settings.fragment.json +1 -20
- package/daemon/specs/agents/shared/skills/core/openrig-architect/SKILL.md +0 -2
- package/daemon/specs/agents/shared/skills/core/watchdog/SKILL.md +1 -0
- package/daemon/specs/agents/shared/skills/process/systematic-debugging/find-polluter.sh +0 -0
- package/daemon/specs/agents/shared/skills/process/verification-before-completion/SKILL.md +1 -0
- package/dist/bin-wrapper.d.ts.map +1 -1
- package/dist/bin-wrapper.js +7 -0
- package/dist/bin-wrapper.js.map +1 -1
- package/dist/build-info.js +3 -3
- package/dist/commands/agent-image.d.ts.map +1 -1
- package/dist/commands/agent-image.js +2 -1
- package/dist/commands/agent-image.js.map +1 -1
- package/dist/commands/broadcast.d.ts.map +1 -1
- package/dist/commands/broadcast.js +37 -2
- package/dist/commands/broadcast.js.map +1 -1
- package/dist/commands/context.d.ts +2 -7
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +391 -213
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/provider.d.ts +4 -0
- package/dist/commands/provider.d.ts.map +1 -0
- package/dist/commands/provider.js +218 -0
- package/dist/commands/provider.js.map +1 -0
- package/dist/commands/ps.d.ts +7 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +34 -4
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +38 -8
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +48 -4
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +70 -11
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/setup.d.ts +14 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +131 -8
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/stream.d.ts +1 -0
- package/dist/commands/stream.d.ts.map +1 -1
- package/dist/commands/stream.js +93 -0
- package/dist/commands/stream.js.map +1 -1
- package/dist/commands/tui.d.ts +4 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +29 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/commands/walk.d.ts +19 -0
- package/dist/commands/walk.d.ts.map +1 -0
- package/dist/commands/walk.js +139 -0
- package/dist/commands/walk.js.map +1 -0
- package/dist/context-resolve.d.ts +14 -0
- package/dist/context-resolve.d.ts.map +1 -0
- package/dist/context-resolve.js +40 -0
- package/dist/context-resolve.js.map +1 -0
- package/dist/front-door.d.ts +31 -0
- package/dist/front-door.d.ts.map +1 -0
- package/dist/front-door.js +114 -0
- package/dist/front-door.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/scope/attestation-lineage.d.ts +14 -0
- package/dist/lib/scope/attestation-lineage.d.ts.map +1 -0
- package/dist/lib/scope/attestation-lineage.js +34 -0
- package/dist/lib/scope/attestation-lineage.js.map +1 -0
- package/package.json +4 -2
- package/tui/dist/daemon-client.d.ts +56 -0
- package/tui/dist/daemon-client.d.ts.map +1 -0
- package/tui/dist/daemon-client.js +99 -0
- package/tui/dist/daemon-client.js.map +1 -0
- package/tui/dist/demo-data.d.ts +3 -0
- package/tui/dist/demo-data.d.ts.map +1 -0
- package/tui/dist/demo-data.js +52 -0
- package/tui/dist/demo-data.js.map +1 -0
- package/tui/dist/detail.d.ts +34 -0
- package/tui/dist/detail.d.ts.map +1 -0
- package/tui/dist/detail.js +47 -0
- package/tui/dist/detail.js.map +1 -0
- package/tui/dist/grammar.d.ts +3 -0
- package/tui/dist/grammar.d.ts.map +1 -0
- package/tui/dist/grammar.js +66 -0
- package/tui/dist/grammar.js.map +1 -0
- package/tui/dist/hydrate.d.ts +78 -0
- package/tui/dist/hydrate.d.ts.map +1 -0
- package/tui/dist/hydrate.js +294 -0
- package/tui/dist/hydrate.js.map +1 -0
- package/tui/dist/index.d.ts +12 -0
- package/tui/dist/index.d.ts.map +1 -0
- package/tui/dist/index.js +12 -0
- package/tui/dist/index.js.map +1 -0
- package/tui/dist/input.d.ts +21 -0
- package/tui/dist/input.d.ts.map +1 -0
- package/tui/dist/input.js +128 -0
- package/tui/dist/input.js.map +1 -0
- package/tui/dist/live.d.ts +20 -0
- package/tui/dist/live.d.ts.map +1 -0
- package/tui/dist/live.js +67 -0
- package/tui/dist/live.js.map +1 -0
- package/tui/dist/main.d.ts +3 -0
- package/tui/dist/main.d.ts.map +1 -0
- package/tui/dist/main.js +184 -0
- package/tui/dist/main.js.map +1 -0
- package/tui/dist/motion.d.ts +13 -0
- package/tui/dist/motion.d.ts.map +1 -0
- package/tui/dist/motion.js +31 -0
- package/tui/dist/motion.js.map +1 -0
- package/tui/dist/navigator.d.ts +21 -0
- package/tui/dist/navigator.d.ts.map +1 -0
- package/tui/dist/navigator.js +168 -0
- package/tui/dist/navigator.js.map +1 -0
- package/tui/dist/refresh.d.ts +3 -0
- package/tui/dist/refresh.d.ts.map +1 -0
- package/tui/dist/refresh.js +9 -0
- package/tui/dist/refresh.js.map +1 -0
- package/tui/dist/render.d.ts +21 -0
- package/tui/dist/render.d.ts.map +1 -0
- package/tui/dist/render.js +807 -0
- package/tui/dist/render.js.map +1 -0
- package/tui/dist/sections.d.ts +4 -0
- package/tui/dist/sections.d.ts.map +1 -0
- package/tui/dist/sections.js +19 -0
- package/tui/dist/sections.js.map +1 -0
- package/tui/dist/socket-server.d.ts +24 -0
- package/tui/dist/socket-server.d.ts.map +1 -0
- package/tui/dist/socket-server.js +85 -0
- package/tui/dist/socket-server.js.map +1 -0
- package/tui/dist/state.d.ts +51 -0
- package/tui/dist/state.d.ts.map +1 -0
- package/tui/dist/state.js +480 -0
- package/tui/dist/state.js.map +1 -0
- package/tui/dist/stylize.d.ts +4 -0
- package/tui/dist/stylize.d.ts.map +1 -0
- package/tui/dist/stylize.js +248 -0
- package/tui/dist/stylize.js.map +1 -0
- package/tui/dist/theme.d.ts +19 -0
- package/tui/dist/theme.d.ts.map +1 -0
- package/tui/dist/theme.js +86 -0
- package/tui/dist/theme.js.map +1 -0
- package/tui/dist/topology/canvas.d.ts +43 -0
- package/tui/dist/topology/canvas.d.ts.map +1 -0
- package/tui/dist/topology/canvas.js +131 -0
- package/tui/dist/topology/canvas.js.map +1 -0
- package/tui/dist/topology/fixture.d.ts +4 -0
- package/tui/dist/topology/fixture.d.ts.map +1 -0
- package/tui/dist/topology/fixture.js +71 -0
- package/tui/dist/topology/fixture.js.map +1 -0
- package/tui/dist/topology/glyphs.d.ts +21 -0
- package/tui/dist/topology/glyphs.d.ts.map +1 -0
- package/tui/dist/topology/glyphs.js +49 -0
- package/tui/dist/topology/glyphs.js.map +1 -0
- package/tui/dist/topology/graph-types.d.ts +39 -0
- package/tui/dist/topology/graph-types.d.ts.map +1 -0
- package/tui/dist/topology/graph-types.js +2 -0
- package/tui/dist/topology/graph-types.js.map +1 -0
- package/tui/dist/topology/layout.d.ts +52 -0
- package/tui/dist/topology/layout.d.ts.map +1 -0
- package/tui/dist/topology/layout.js +118 -0
- package/tui/dist/topology/layout.js.map +1 -0
- package/tui/dist/topology/render-graph.d.ts +8 -0
- package/tui/dist/topology/render-graph.d.ts.map +1 -0
- package/tui/dist/topology/render-graph.js +20 -0
- package/tui/dist/topology/render-graph.js.map +1 -0
- package/tui/dist/topology/runtime-marks.d.ts +53 -0
- package/tui/dist/topology/runtime-marks.d.ts.map +1 -0
- package/tui/dist/topology/runtime-marks.js +185 -0
- package/tui/dist/topology/runtime-marks.js.map +1 -0
- package/tui/dist/topology/styles/braille.d.ts +5 -0
- package/tui/dist/topology/styles/braille.d.ts.map +1 -0
- package/tui/dist/topology/styles/braille.js +84 -0
- package/tui/dist/topology/styles/braille.js.map +1 -0
- package/tui/dist/topology/styles/hatchet.d.ts +41 -0
- package/tui/dist/topology/styles/hatchet.d.ts.map +1 -0
- package/tui/dist/topology/styles/hatchet.js +146 -0
- package/tui/dist/topology/styles/hatchet.js.map +1 -0
- package/tui/dist/types.d.ts +362 -0
- package/tui/dist/types.d.ts.map +1 -0
- package/tui/dist/types.js +6 -0
- package/tui/dist/types.js.map +1 -0
- package/ui/dist/assets/{index-DkNi0RT8.js → index-Dv5VaLCN.js} +135 -135
- package/ui/dist/index.html +1 -1
- package/daemon/specs/agents/shared/skills/pm/backlog-capture/SKILL.md +0 -43
- package/daemon/specs/agents/shared/skills/pm/context-builder/SKILL.md +0 -87
- package/daemon/specs/agents/shared/skills/pm/exec-summary/SKILL.md +0 -84
- package/daemon/specs/agents/shared/skills/pm/office-hours/SKILL.md +0 -129
- package/daemon/specs/agents/shared/skills/pm/plan-review/SKILL.md +0 -98
- package/daemon/specs/agents/shared/skills/pm/requirements-writer/SKILL.md +0 -113
- package/daemon/specs/agents/shared/skills/pm/ui-mockup/SKILL.md +0 -76
- package/daemon/specs/agents/shared/skills/pods/development-team/SKILL.md +0 -148
- package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +0 -266
- package/daemon/specs/agents/shared/skills/pods/review-team/SKILL.md +0 -213
- package/daemon/specs/agents/shared/skills/process/systematic-debugging/CREATION-LOG.md +0 -119
- package/daemon/specs/agents/shared/skills/process/systematic-debugging/test-academic.md +0 -14
- package/daemon/specs/agents/shared/skills/process/systematic-debugging/test-pressure-1.md +0 -58
- package/daemon/specs/agents/shared/skills/process/systematic-debugging/test-pressure-2.md +0 -68
- package/daemon/specs/agents/shared/skills/process/systematic-debugging/test-pressure-3.md +0 -69
- package/dist/commands/context-pack.d.ts +0 -4
- package/dist/commands/context-pack.d.ts.map +0 -1
- package/dist/commands/context-pack.js +0 -357
- package/dist/commands/context-pack.js.map +0 -1
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// Slice-04 S-A (OPR.0.5.0.4, founder re-center amendment A2) — HOST-LEVEL USAGE ROLLUP.
|
|
2
|
+
//
|
|
3
|
+
// Usage is metered per account and this deployment runs ONE account per host, so a
|
|
4
|
+
// usage-limit park is a HOST-level event. This module aggregates the seat-sourced
|
|
5
|
+
// signal rows (C3 Claude statusline lane, sealed 5b56a2a4 · C4 Codex reactive lane,
|
|
6
|
+
// sealed 6508330d) into ONE honest state row per (host, provider):
|
|
7
|
+
//
|
|
8
|
+
// ok | nearing | limited (until resets_at when known) | explicit_unknown
|
|
9
|
+
//
|
|
10
|
+
// THE THREE BINDING HONESTY CONDITIONS (PM pattern check, verbatim-class):
|
|
11
|
+
// (i) host==account is a DEPLOYMENT INVARIANT and every row SAYS so in its
|
|
12
|
+
// provenance — it is never presented as source-derived account
|
|
13
|
+
// classification (the C3 Option-A bar stands: the statusline carries no
|
|
14
|
+
// account identity and none is fabricated here). Rollup keys are
|
|
15
|
+
// (host, provider) ONLY; no account id/ref ever appears in a row.
|
|
16
|
+
// (ii) CONFLICTING seat windows on one host falsify the invariant for that
|
|
17
|
+
// host: they surface as a first-class `conflicting_seat_windows` anomaly
|
|
18
|
+
// plus an explicit_unknown host state — never a silent merge, never an
|
|
19
|
+
// averaged/fabricated number. The conflicting facts stay visible.
|
|
20
|
+
// (iii) usage-limit granularity rides ONLY what the C3 rows already carry
|
|
21
|
+
// (window / usedPercent / resetsAt / asOf) — nothing coerced, nothing
|
|
22
|
+
// invented. Codex has NO remaining-meter lane yet (C2 is a later seam),
|
|
23
|
+
// so codex state derives from fresh reactive EXHAUSTION evidence only,
|
|
24
|
+
// and its absence is an explicit unknown — never "ok" by silence.
|
|
25
|
+
//
|
|
26
|
+
// The single-daemon scope IS the host scope: rows carry host="local" (the
|
|
27
|
+
// reserved local host id). Multi-host aggregation is explicitly out of scope
|
|
28
|
+
// (the PRD's MH-lane later).
|
|
29
|
+
/** Nearing = the shipped default advisory threshold on the C3-carried percentage. */
|
|
30
|
+
export const NEARING_THRESHOLD_PERCENT = 80;
|
|
31
|
+
/** Same-window resets_at spread tolerated as sampling skew before it is a CONFLICT.
|
|
32
|
+
* Two seats on ONE account can read the same window seconds apart; two different
|
|
33
|
+
* accounts' reset schedules differ by far more than this. */
|
|
34
|
+
export const CONFLICTING_RESETS_EPSILON_MS = 120_000;
|
|
35
|
+
const PROVENANCE_NOTE = "host==account is a deployment invariant of this rig (one account per host), declared by the operator — " +
|
|
36
|
+
"it is not source-derived account classification, and no account identity is read or emitted.";
|
|
37
|
+
export function rollupHostUsage(input) {
|
|
38
|
+
const rows = [];
|
|
39
|
+
const claude = rollupClaude(input);
|
|
40
|
+
if (claude)
|
|
41
|
+
rows.push(claude);
|
|
42
|
+
const codex = rollupCodex(input);
|
|
43
|
+
if (codex)
|
|
44
|
+
rows.push(codex);
|
|
45
|
+
return rows;
|
|
46
|
+
}
|
|
47
|
+
// ——— Claude: the C3 seat-keyed statusline lane (meter rows + explicit-unknown rows) ———
|
|
48
|
+
function rollupClaude(input) {
|
|
49
|
+
const lane = input.signals.filter((s) => s.provider === "claude");
|
|
50
|
+
if (lane.length === 0)
|
|
51
|
+
return null; // no claude deployment presence → no row
|
|
52
|
+
const meterRows = lane.filter((s) => s.sourceClass === "provider_statusline" && typeof s.usedPercent === "number");
|
|
53
|
+
const windows = meterRows.map((s) => ({
|
|
54
|
+
window: s.window ?? "unknown",
|
|
55
|
+
usedPercent: s.usedPercent,
|
|
56
|
+
resetsAt: s.resetsAt,
|
|
57
|
+
asOf: s.asOf,
|
|
58
|
+
seatSession: s.seatSession,
|
|
59
|
+
}));
|
|
60
|
+
const evidenceSeats = [...new Set(lane.map((s) => s.seatSession).filter((x) => typeof x === "string"))];
|
|
61
|
+
const base = {
|
|
62
|
+
host: "local",
|
|
63
|
+
provider: "claude",
|
|
64
|
+
windows,
|
|
65
|
+
provenance: { basis: "one_account_per_host_deployment_invariant", note: PROVENANCE_NOTE },
|
|
66
|
+
anomalies: [],
|
|
67
|
+
evidenceSeats,
|
|
68
|
+
asOf: input.now,
|
|
69
|
+
};
|
|
70
|
+
if (meterRows.length === 0) {
|
|
71
|
+
// Only explicit-unknown seat rows (absent cache / pre-first-response / api-key):
|
|
72
|
+
// the host state is honestly unknown, carrying the lane's own reason.
|
|
73
|
+
const reason = lane.find((s) => s.unknownReason)?.unknownReason ?? "no_usable_claude_usage_rows";
|
|
74
|
+
return { ...base, state: "explicit_unknown", unknownReason: reason };
|
|
75
|
+
}
|
|
76
|
+
// (ii) conflict detection per window: under host==account, every seat reading the SAME
|
|
77
|
+
// window must see the SAME reset schedule (within sampling skew). A wider spread means
|
|
78
|
+
// the seats are watching DIFFERENT accounts — the invariant is falsified for this host.
|
|
79
|
+
const anomalies = [];
|
|
80
|
+
const byWindow = new Map();
|
|
81
|
+
for (const s of meterRows) {
|
|
82
|
+
const key = s.window ?? "unknown";
|
|
83
|
+
byWindow.set(key, [...(byWindow.get(key) ?? []), s]);
|
|
84
|
+
}
|
|
85
|
+
for (const [windowKey, group] of byWindow) {
|
|
86
|
+
const withResets = group.filter((s) => typeof s.resetsAt === "string");
|
|
87
|
+
if (withResets.length < 2)
|
|
88
|
+
continue;
|
|
89
|
+
const times = withResets.map((s) => Date.parse(s.resetsAt)).filter(Number.isFinite);
|
|
90
|
+
if (times.length < 2)
|
|
91
|
+
continue;
|
|
92
|
+
if (Math.max(...times) - Math.min(...times) > CONFLICTING_RESETS_EPSILON_MS) {
|
|
93
|
+
anomalies.push({
|
|
94
|
+
kind: "conflicting_seat_windows",
|
|
95
|
+
window: windowKey,
|
|
96
|
+
seats: [...new Set(withResets.map((s) => s.seatSession).filter((x) => typeof x === "string"))],
|
|
97
|
+
evidence: `seats report divergent ${windowKey} reset schedules on one host: ` +
|
|
98
|
+
withResets.map((s) => `${s.seatSession ?? "?"} resets_at=${s.resetsAt}`).join(" vs "),
|
|
99
|
+
asOf: input.now,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (anomalies.length > 0) {
|
|
104
|
+
return {
|
|
105
|
+
...base,
|
|
106
|
+
state: "explicit_unknown",
|
|
107
|
+
anomalies,
|
|
108
|
+
unknownReason: "conflicting_seat_windows: divergent reset schedules falsify the one-account-per-host invariant for this host",
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const maxUsed = Math.max(...meterRows.map((s) => s.usedPercent));
|
|
112
|
+
if (maxUsed >= 100) {
|
|
113
|
+
const exhausted = meterRows.filter((s) => s.usedPercent >= 100);
|
|
114
|
+
const resets = exhausted
|
|
115
|
+
.map((s) => s.resetsAt)
|
|
116
|
+
.filter((x) => typeof x === "string")
|
|
117
|
+
.sort();
|
|
118
|
+
return { ...base, state: "limited", ...(resets[0] !== undefined ? { resetsAt: resets[0] } : {}) };
|
|
119
|
+
}
|
|
120
|
+
if (maxUsed >= NEARING_THRESHOLD_PERCENT)
|
|
121
|
+
return { ...base, state: "nearing" };
|
|
122
|
+
return { ...base, state: "ok" };
|
|
123
|
+
}
|
|
124
|
+
// ——— Codex: the C4 reactive lane (exhaustion evidence only — no meter until C2) ———
|
|
125
|
+
function rollupCodex(input) {
|
|
126
|
+
const lane = input.signals.filter((s) => s.provider === "codex");
|
|
127
|
+
if (lane.length === 0 && !input.codexProfilesPresent)
|
|
128
|
+
return null; // no deployment presence
|
|
129
|
+
const nowMs = Date.parse(input.now);
|
|
130
|
+
// At-limit exhaustion evidence = a reactive_error event row the C4 tap marked as an
|
|
131
|
+
// actionable switch trigger (at_limit → allow_switch_decision; stream/stop errors are
|
|
132
|
+
// advisory and are NOT usage evidence). Freshness is inclusive-expiry (BR-2 class).
|
|
133
|
+
const freshAtLimit = lane.filter((s) => s.sourceClass === "provider_event" &&
|
|
134
|
+
s.authority === "reactive_error" &&
|
|
135
|
+
s.automationUse === "allow_switch_decision" &&
|
|
136
|
+
typeof s.staleAfter === "string" &&
|
|
137
|
+
Number.isFinite(Date.parse(s.staleAfter)) &&
|
|
138
|
+
Number.isFinite(nowMs) &&
|
|
139
|
+
nowMs < Date.parse(s.staleAfter));
|
|
140
|
+
const base = {
|
|
141
|
+
host: "local",
|
|
142
|
+
provider: "codex",
|
|
143
|
+
windows: [], // (iii): codex carries no remaining-meter granularity yet — nothing is invented
|
|
144
|
+
provenance: { basis: "one_account_per_host_deployment_invariant", note: PROVENANCE_NOTE },
|
|
145
|
+
anomalies: [],
|
|
146
|
+
evidenceSeats: freshAtLimit.map((s) => `reactive_event asOf=${s.asOf}`),
|
|
147
|
+
asOf: input.now,
|
|
148
|
+
};
|
|
149
|
+
if (freshAtLimit.length > 0) {
|
|
150
|
+
const resets = freshAtLimit
|
|
151
|
+
.map((s) => s.resetsAt)
|
|
152
|
+
.filter((x) => typeof x === "string")
|
|
153
|
+
.sort();
|
|
154
|
+
return { ...base, state: "limited", ...(resets[0] !== undefined ? { resetsAt: resets[0] } : {}) };
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
...base,
|
|
158
|
+
state: "explicit_unknown",
|
|
159
|
+
unknownReason: "no usage meter for codex on this host yet (the app-server read lane is a later seam); no fresh at-limit evidence either way",
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=host-usage-rollup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-usage-rollup.js","sourceRoot":"","sources":["../../../src/domain/provider/host-usage-rollup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CodexAuthMetadata } from "./codex-auth-reader.js";
|
|
2
|
+
import type { FourBlockReadModel, ProviderSignal } from "./provider-types.js";
|
|
3
|
+
import type { NodeLifecycleState } from "../types.js";
|
|
4
|
+
/** One seat in the fleet (the universe to bind), sourced from node-inventory across rigs. */
|
|
5
|
+
export interface ProviderSeat {
|
|
6
|
+
seatSession: string;
|
|
7
|
+
rigName: string;
|
|
8
|
+
runtime: string;
|
|
9
|
+
lifecycleState: NodeLifecycleState;
|
|
10
|
+
}
|
|
11
|
+
export interface ProviderCollectDeps {
|
|
12
|
+
/** Reads codex-auth on-disk METADATA (profile names + seat registry) — never token content. */
|
|
13
|
+
readCodexAuth: () => CodexAuthMetadata;
|
|
14
|
+
/** The current seat universe (node-inventory across all rigs). */
|
|
15
|
+
listSeats: () => ProviderSeat[];
|
|
16
|
+
/** signals[] — empty until the live Codex/Claude/reactive collection lane is wired. */
|
|
17
|
+
collectSignals?: () => ProviderSignal[];
|
|
18
|
+
/** A real caller-provided clock; the read model's asOf (anomalies borrow it, never invented). */
|
|
19
|
+
now: () => string;
|
|
20
|
+
}
|
|
21
|
+
export declare function collectFourBlockReadModel(deps: ProviderCollectDeps): FourBlockReadModel;
|
|
22
|
+
//# sourceMappingURL=provider-collect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-collect.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/provider-collect.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAIhE,OAAO,KAAK,EAAE,kBAAkB,EAAmB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,6FAA6F;AAC7F,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,kBAAkB,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,+FAA+F;IAC/F,aAAa,EAAE,MAAM,iBAAiB,CAAC;IACvC,kEAAkE;IAClE,SAAS,EAAE,MAAM,YAAY,EAAE,CAAC;IAChC,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,cAAc,EAAE,CAAC;IACxC,iGAAiG;IACjG,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,GAAG,kBAAkB,CAsEvF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// Slice-04 (OPR.0.5.0.4) seam C1 (resume) — the getReadModel COLLECTION seam. A pure function
|
|
2
|
+
// over injected inputs (the codex-auth metadata reader + a cross-rig seat lister + a clock), so the
|
|
3
|
+
// production read-model path is directly testable without a live daemon/db. It maps codex-auth
|
|
4
|
+
// profiles → accounts[] (authState="unknown" per BR-3 validate-at-use — NEVER assert active/
|
|
5
|
+
// needs_reauth from static disk), joins the seat universe to the codex seat-registry into
|
|
6
|
+
// rawBindings[] (unregistered/claude seats → unbound, so the assembler emits seat_with_no_account),
|
|
7
|
+
// carries signals through (empty until the live signal-collection lane), and delegates all anomaly
|
|
8
|
+
// computation to assembleFourBlock.
|
|
9
|
+
import { rollupHostUsage } from "./host-usage-rollup.js";
|
|
10
|
+
import { assembleFourBlock } from "./provider-read-model.js";
|
|
11
|
+
import { claudeStatuslineSignals } from "./provider-signals.js";
|
|
12
|
+
export function collectFourBlockReadModel(deps) {
|
|
13
|
+
const asOf = deps.now();
|
|
14
|
+
const { profiles, seats } = deps.readCodexAuth();
|
|
15
|
+
const seatUniverse = deps.listSeats();
|
|
16
|
+
// accounts[] — one row per known codex profile. BR-3: authState is "unknown" (validate-at-use);
|
|
17
|
+
// static disk presence proves the profile exists, NOT that its auth is currently valid.
|
|
18
|
+
const accounts = profiles.map((name) => ({
|
|
19
|
+
accountId: name,
|
|
20
|
+
label: name,
|
|
21
|
+
provider: "codex",
|
|
22
|
+
authState: "unknown",
|
|
23
|
+
profileRef: name,
|
|
24
|
+
asOf,
|
|
25
|
+
}));
|
|
26
|
+
// seat session → codex-auth registry row (the only binding source in this seam).
|
|
27
|
+
const registryBySeat = new Map(seats.map((s) => [s.seat, s]));
|
|
28
|
+
const rawBindings = seatUniverse.map((seat) => {
|
|
29
|
+
const reg = registryBySeat.get(seat.seatSession);
|
|
30
|
+
// Runtime-identity gate: bind ONLY when the LIVE inventory seat is actually a Codex seat. The
|
|
31
|
+
// codex auth-seat-registry is keyed by session name, so a STALE row whose session name was
|
|
32
|
+
// reused by a Claude seat must NOT bind that Claude seat to a Codex account — a Claude seat
|
|
33
|
+
// stays unbound (seat_with_no_account) regardless of any same-session registry row.
|
|
34
|
+
if (reg && seat.runtime === "codex") {
|
|
35
|
+
return {
|
|
36
|
+
accountId: reg.authProfile,
|
|
37
|
+
seatSession: seat.seatSession,
|
|
38
|
+
rigName: seat.rigName,
|
|
39
|
+
boundAt: reg.updatedTs,
|
|
40
|
+
bindingSource: "codex_auth_seat_registry",
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Unregistered/non-codex (claude seats, codex seats with no registry row) → unbound. The assembler
|
|
44
|
+
// attaches the required seat_with_no_account anomaly; we never fabricate a sentinel account.
|
|
45
|
+
return {
|
|
46
|
+
accountId: null,
|
|
47
|
+
seatSession: seat.seatSession,
|
|
48
|
+
rigName: seat.rigName,
|
|
49
|
+
boundAt: null,
|
|
50
|
+
bindingSource: null,
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
const liveClaudeSeats = new Set(seatUniverse
|
|
54
|
+
.filter((seat) => seat.runtime === "claude-code" && seat.lifecycleState === "running")
|
|
55
|
+
.map((seat) => seat.seatSession));
|
|
56
|
+
const signals = (deps.collectSignals ? [...deps.collectSignals()] : []).filter((signal) => signal.provider !== "claude" || !signal.seatSession || liveClaudeSeats.has(signal.seatSession));
|
|
57
|
+
const signaledClaudeSeats = new Set(signals.filter((signal) => signal.provider === "claude" && signal.seatSession).map((signal) => signal.seatSession));
|
|
58
|
+
// Cache discovery is never the seat-discovery authority. Every live Claude seat must have a
|
|
59
|
+
// row even before its first statusline payload (or when its cache is malformed/absent).
|
|
60
|
+
for (const seatSession of liveClaudeSeats) {
|
|
61
|
+
if (signaledClaudeSeats.has(seatSession))
|
|
62
|
+
continue;
|
|
63
|
+
signals.push(...claudeStatuslineSignals({ seatSession, cachePresent: false, asOf }));
|
|
64
|
+
}
|
|
65
|
+
const model = assembleFourBlock({ accounts, rawBindings, signals, asOf });
|
|
66
|
+
// Slice-04 S-A: the host-level rollup aggregates the SAME signals this collection produced.
|
|
67
|
+
// Codex deployment presence = auth profiles on disk (a host with codex accounts but no meter
|
|
68
|
+
// must surface an explicit unknown, never an omitted row).
|
|
69
|
+
return {
|
|
70
|
+
...model,
|
|
71
|
+
hostUsage: rollupHostUsage({ signals, codexProfilesPresent: profiles.length > 0, now: asOf }),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=provider-collect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-collect.js","sourceRoot":"","sources":["../../../src/domain/provider/provider-collect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AccountAuthState, PrecheckResult, ProviderKind, ProviderSignal } from "./provider-types.js";
|
|
2
|
+
export type AutomationRefusal = "sourceClass_unknown" | "authority_unknown" | "not_allow_switch_decision" | "no_freshness_bound" | "unparsable_freshness_bound" | "stale";
|
|
3
|
+
export interface AutomationEligibility {
|
|
4
|
+
eligible: boolean;
|
|
5
|
+
refusals: AutomationRefusal[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* BR-2 eligibility. Eligible ONLY when the signal is known (source + authority), explicitly
|
|
9
|
+
* `allow_switch_decision`, and provably fresh. Fail-closed on freshness: a missing `staleAfter`
|
|
10
|
+
* or an unparsable one is ineligible (NaN must never compare as fresh). Expiry is INCLUSIVE:
|
|
11
|
+
* `now >= staleAfter` is stale. An unparsable `now` also cannot prove freshness → stale.
|
|
12
|
+
*/
|
|
13
|
+
export declare function signalEligibleForAutomation(signal: ProviderSignal, nowIso: string): AutomationEligibility;
|
|
14
|
+
/** Fields common to a manual and an automated precheck. */
|
|
15
|
+
interface PrecheckBase {
|
|
16
|
+
/** The provider of the account being switched TO. */
|
|
17
|
+
targetProvider: ProviderKind;
|
|
18
|
+
/** Validate-at-use: the target's auth state, checked at precheck time (never assumed). */
|
|
19
|
+
targetAuthState: AccountAuthState;
|
|
20
|
+
/** Whether the seat currently has a live turn/conversation in flight. */
|
|
21
|
+
seatHasLiveConversation: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A manual precheck carries NEITHER a triggering signal nor a clock; an automated precheck
|
|
25
|
+
* requires BOTH. The paired union makes "trigger without now" unrepresentable for typed
|
|
26
|
+
* callers (the fail-closed hole is closed at the type level; a runtime guard below covers
|
|
27
|
+
* untyped/JS callers).
|
|
28
|
+
*/
|
|
29
|
+
export type PrecheckInput = PrecheckBase & ({
|
|
30
|
+
triggeringSignal?: undefined;
|
|
31
|
+
now?: undefined;
|
|
32
|
+
} | {
|
|
33
|
+
triggeringSignal: ProviderSignal;
|
|
34
|
+
now: string;
|
|
35
|
+
});
|
|
36
|
+
export declare function precheckSwitch(input: PrecheckInput): PrecheckResult;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=provider-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-policy.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/provider-policy.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,gBAAgB,EAEhB,cAAc,EACd,YAAY,EACZ,cAAc,EACf,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,iBAAiB,GACzB,qBAAqB,GACrB,mBAAmB,GACnB,2BAA2B,GAC3B,oBAAoB,GACpB,4BAA4B,GAC5B,OAAO,CAAC;AAEZ,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,GACb,qBAAqB,CAqBvB;AAiBD,2DAA2D;AAC3D,UAAU,YAAY;IACpB,qDAAqD;IACrD,cAAc,EAAE,YAAY,CAAC;IAC7B,0FAA0F;IAC1F,eAAe,EAAE,gBAAgB,CAAC;IAClC,yEAAyE;IACzE,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAED;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,YAAY,GACtC,CAAC;IAAE,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAAC,GAAG,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,gBAAgB,EAAE,cAAc,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE1G,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CA0BnE"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Slice-04 (OPR.0.5.0.4) — BR-2, the no-fire policy predicate (packet 3ffa3c22 §2 + BR-2).
|
|
2
|
+
// A PURE predicate (no side effects, no action execution, no orchestration): it only decides
|
|
3
|
+
// whether one signal is eligible to trigger an automated switch. Automation NEVER fires on a
|
|
4
|
+
// signal that is unknown, not allow_switch_decision, or not provably fresh. Every failing
|
|
5
|
+
// condition contributes an explicit, fail-visible refusal reason.
|
|
6
|
+
/**
|
|
7
|
+
* BR-2 eligibility. Eligible ONLY when the signal is known (source + authority), explicitly
|
|
8
|
+
* `allow_switch_decision`, and provably fresh. Fail-closed on freshness: a missing `staleAfter`
|
|
9
|
+
* or an unparsable one is ineligible (NaN must never compare as fresh). Expiry is INCLUSIVE:
|
|
10
|
+
* `now >= staleAfter` is stale. An unparsable `now` also cannot prove freshness → stale.
|
|
11
|
+
*/
|
|
12
|
+
export function signalEligibleForAutomation(signal, nowIso) {
|
|
13
|
+
const refusals = [];
|
|
14
|
+
if (signal.sourceClass === "unknown")
|
|
15
|
+
refusals.push("sourceClass_unknown");
|
|
16
|
+
if (signal.authority === "unknown")
|
|
17
|
+
refusals.push("authority_unknown");
|
|
18
|
+
if (signal.automationUse !== "allow_switch_decision")
|
|
19
|
+
refusals.push("not_allow_switch_decision");
|
|
20
|
+
if (signal.staleAfter === undefined) {
|
|
21
|
+
refusals.push("no_freshness_bound");
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const staleMs = Date.parse(signal.staleAfter);
|
|
25
|
+
if (Number.isNaN(staleMs)) {
|
|
26
|
+
refusals.push("unparsable_freshness_bound");
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const nowMs = Date.parse(nowIso);
|
|
30
|
+
// Fail-closed: an unparsable `now`, or reaching/passing the bound, is stale.
|
|
31
|
+
if (Number.isNaN(nowMs) || nowMs >= staleMs)
|
|
32
|
+
refusals.push("stale");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { eligible: refusals.length === 0, refusals };
|
|
36
|
+
}
|
|
37
|
+
// ── Precheck: the §1 switch-safety gate ─────────────────────────────────────────────────
|
|
38
|
+
// precheckSwitch decides whether switching a seat to a target account is SAFE, so the UI and
|
|
39
|
+
// automation never offer an unsafe action. Every unsafe condition is an explicit, fail-visible
|
|
40
|
+
// reason; reasons combine deterministically. A pure predicate — no side effects.
|
|
41
|
+
// The subset of BR-2 refusals that mean the triggering signal is unknown/stale (as opposed to
|
|
42
|
+
// merely advisory, which is a BR-2 concern, not a precheck unknown/stale concern).
|
|
43
|
+
const SIGNAL_UNKNOWN_OR_STALE_REFUSALS = [
|
|
44
|
+
"sourceClass_unknown",
|
|
45
|
+
"authority_unknown",
|
|
46
|
+
"no_freshness_bound",
|
|
47
|
+
"unparsable_freshness_bound",
|
|
48
|
+
"stale",
|
|
49
|
+
];
|
|
50
|
+
export function precheckSwitch(input) {
|
|
51
|
+
const reasons = [];
|
|
52
|
+
// rig auth is codex-only at the current switch substrate → a claude target can't be rebound.
|
|
53
|
+
if (input.targetProvider === "claude")
|
|
54
|
+
reasons.push("rebind_unsupported_for_runtime");
|
|
55
|
+
// Validate-at-use: only a confirmed-active target is safe. needs_reauth and unknown each fail
|
|
56
|
+
// closed under their OWN reason — unknown is never relabeled as a re-auth need.
|
|
57
|
+
if (input.targetAuthState === "needs_reauth")
|
|
58
|
+
reasons.push("target_needs_reauth");
|
|
59
|
+
else if (input.targetAuthState === "unknown")
|
|
60
|
+
reasons.push("target_auth_unknown");
|
|
61
|
+
if (input.seatHasLiveConversation)
|
|
62
|
+
reasons.push("would_strand_live_conversation");
|
|
63
|
+
// A triggering signal is present ONLY for an automated switch. Fail-closed for untyped/JS
|
|
64
|
+
// callers: if `now` is missing or unparsable it CANNOT prove freshness — the shared predicate
|
|
65
|
+
// maps an unparsable/absent now to NaN → stale, which is in the unknown/stale subset.
|
|
66
|
+
if (input.triggeringSignal !== undefined) {
|
|
67
|
+
const { refusals } = signalEligibleForAutomation(input.triggeringSignal, input.now);
|
|
68
|
+
if (refusals.some((r) => SIGNAL_UNKNOWN_OR_STALE_REFUSALS.includes(r))) {
|
|
69
|
+
reasons.push("signal_unknown_or_stale");
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Deterministic dedupe, insertion-order preserved.
|
|
73
|
+
const deduped = [...new Set(reasons)];
|
|
74
|
+
return deduped.length === 0 ? { safe: true } : { safe: false, reasons: deduped };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=provider-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-policy.js","sourceRoot":"","sources":["../../../src/domain/provider/provider-policy.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,6FAA6F;AAC7F,6FAA6F;AAC7F,0FAA0F;AAC1F,kEAAkE;AAuBlE;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAsB,EACtB,MAAc;IAEd,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC3E,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACvE,IAAI,MAAM,CAAC,aAAa,KAAK,uBAAuB;QAAE,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEjG,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjC,6EAA6E;YAC7E,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;AACvD,CAAC;AAED,2FAA2F;AAC3F,6FAA6F;AAC7F,+FAA+F;AAC/F,iFAAiF;AAEjF,8FAA8F;AAC9F,mFAAmF;AACnF,MAAM,gCAAgC,GAAiC;IACrE,qBAAqB;IACrB,mBAAmB;IACnB,oBAAoB;IACpB,4BAA4B;IAC5B,OAAO;CACR,CAAC;AAqBF,MAAM,UAAU,cAAc,CAAC,KAAoB;IACjD,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,6FAA6F;IAC7F,IAAI,KAAK,CAAC,cAAc,KAAK,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAEtF,8FAA8F;IAC9F,gFAAgF;IAChF,IAAI,KAAK,CAAC,eAAe,KAAK,cAAc;QAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;SAC7E,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAElF,IAAI,KAAK,CAAC,uBAAuB;QAAE,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAElF,0FAA0F;IAC1F,8FAA8F;IAC9F,sFAAsF;IACtF,IAAI,KAAK,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,EAAE,QAAQ,EAAE,GAAG,2BAA2B,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,GAAa,CAAC,CAAC;QAC9F,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gCAAgC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACtC,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { FourBlockReadModel, ProviderAccount, ProviderSignal } from "./provider-types.js";
|
|
2
|
+
/**
|
|
3
|
+
* A collected seat↔account fact — a discriminated bound/unbound union over the honest field
|
|
4
|
+
* set (no anomalies; the assembler computes those). Mirrors ProviderBinding so the collector
|
|
5
|
+
* never has to fabricate account/binding data for an unbound seat.
|
|
6
|
+
*/
|
|
7
|
+
export type RawSeatBinding = {
|
|
8
|
+
accountId: string;
|
|
9
|
+
seatSession: string;
|
|
10
|
+
rigName: string;
|
|
11
|
+
boundAt: string;
|
|
12
|
+
bindingSource: string;
|
|
13
|
+
} | {
|
|
14
|
+
accountId: null;
|
|
15
|
+
seatSession: string;
|
|
16
|
+
rigName: string;
|
|
17
|
+
boundAt: null;
|
|
18
|
+
bindingSource: null;
|
|
19
|
+
};
|
|
20
|
+
export interface AssembleInput {
|
|
21
|
+
accounts: ProviderAccount[];
|
|
22
|
+
rawBindings: RawSeatBinding[];
|
|
23
|
+
signals: ProviderSignal[];
|
|
24
|
+
/** The read model's asOf — a real caller-provided timestamp; anomalies borrow it (not invented). */
|
|
25
|
+
asOf: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function assembleFourBlock(input: AssembleInput): FourBlockReadModel;
|
|
28
|
+
//# sourceMappingURL=provider-read-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-read-model.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/provider-read-model.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,kBAAkB,EAClB,eAAe,EAEf,cAAc,EAGf,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACnG;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,IAAI,CAAA;CAAE,CAAC;AAElG,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,oGAAoG;IACpG,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,kBAAkB,CA+D1E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Slice-04 (OPR.0.5.0.4) — the four-block ASSEMBLY (packet 3ffa3c22 §1, proof item 4).
|
|
2
|
+
// A PURE assembler over already-collected inputs (no CLI/auth I/O — collection is a separate
|
|
3
|
+
// seam). It emits real bound rows + explicit unbound rows (seat_with_no_account), computes
|
|
4
|
+
// same_account_on_n_seats ONLY from repeated real account IDs, attaches anomalies
|
|
5
|
+
// deterministically, preserves signals unchanged, and invents no IDs/boundAt/asOf.
|
|
6
|
+
export function assembleFourBlock(input) {
|
|
7
|
+
const { accounts, rawBindings, signals, asOf } = input;
|
|
8
|
+
// Group DISTINCT seat sessions by REAL account id (unbound/null-account seats never
|
|
9
|
+
// contribute). A Set so duplicate raw rows for the same account+seat cannot inflate the count.
|
|
10
|
+
const seatsByAccount = new Map();
|
|
11
|
+
for (const rb of rawBindings) {
|
|
12
|
+
if (rb.accountId === null)
|
|
13
|
+
continue;
|
|
14
|
+
const set = seatsByAccount.get(rb.accountId) ?? new Set();
|
|
15
|
+
set.add(rb.seatSession);
|
|
16
|
+
seatsByAccount.set(rb.accountId, set);
|
|
17
|
+
}
|
|
18
|
+
// A same_account_on_n_seats anomaly per account genuinely shared across >= 2 DISTINCT seats.
|
|
19
|
+
const sharedAnomalyByAccount = new Map();
|
|
20
|
+
for (const [accountId, seats] of seatsByAccount) {
|
|
21
|
+
if (seats.size < 2)
|
|
22
|
+
continue;
|
|
23
|
+
const sortedSeats = [...seats].sort(); // deterministic
|
|
24
|
+
sharedAnomalyByAccount.set(accountId, {
|
|
25
|
+
kind: "same_account_on_n_seats",
|
|
26
|
+
count: sortedSeats.length,
|
|
27
|
+
seats: sortedSeats,
|
|
28
|
+
evidence: `account ${accountId} bound on ${sortedSeats.length} seats: ${sortedSeats.join(", ")}`,
|
|
29
|
+
asOf,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const bindings = rawBindings.map((rb) => {
|
|
33
|
+
if (rb.accountId === null) {
|
|
34
|
+
const anomaly = {
|
|
35
|
+
kind: "seat_with_no_account",
|
|
36
|
+
seat: rb.seatSession,
|
|
37
|
+
evidence: `seat ${rb.seatSession} in rig ${rb.rigName} has no bound account`,
|
|
38
|
+
asOf,
|
|
39
|
+
};
|
|
40
|
+
// Non-empty tuple: the seat_with_no_account anomaly is required and always first.
|
|
41
|
+
return {
|
|
42
|
+
accountId: null,
|
|
43
|
+
seatSession: rb.seatSession,
|
|
44
|
+
rigName: rb.rigName,
|
|
45
|
+
boundAt: null,
|
|
46
|
+
bindingSource: null,
|
|
47
|
+
anomalies: [anomaly],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const shared = sharedAnomalyByAccount.get(rb.accountId);
|
|
51
|
+
const anomalies = shared ? [shared] : [];
|
|
52
|
+
return {
|
|
53
|
+
accountId: rb.accountId,
|
|
54
|
+
seatSession: rb.seatSession,
|
|
55
|
+
rigName: rb.rigName,
|
|
56
|
+
boundAt: rb.boundAt,
|
|
57
|
+
bindingSource: rb.bindingSource,
|
|
58
|
+
anomalies,
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
accounts,
|
|
63
|
+
bindings,
|
|
64
|
+
signals, // preserved unchanged
|
|
65
|
+
asOf,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=provider-read-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-read-model.js","sourceRoot":"","sources":["../../../src/domain/provider/provider-read-model.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,6FAA6F;AAC7F,2FAA2F;AAC3F,kFAAkF;AAClF,mFAAmF;AA6BnF,MAAM,UAAU,iBAAiB,CAAC,KAAoB;IACpD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAEvD,oFAAoF;IACpF,+FAA+F;IAC/F,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;IACtD,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,SAAS,KAAK,IAAI;YAAE,SAAS;QACpC,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QAClE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;QACxB,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,6FAA6F;IAC7F,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAsC,CAAC;IAC7E,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,cAAc,EAAE,CAAC;QAChD,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;YAAE,SAAS;QAC7B,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,gBAAgB;QACvD,sBAAsB,CAAC,GAAG,CAAC,SAAS,EAAE;YACpC,IAAI,EAAE,yBAAyB;YAC/B,KAAK,EAAE,WAAW,CAAC,MAAM;YACzB,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,WAAW,SAAS,aAAa,WAAW,CAAC,MAAM,WAAW,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAChG,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAsB,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACzD,IAAI,EAAE,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,OAAO,GAA6B;gBACxC,IAAI,EAAE,sBAAsB;gBAC5B,IAAI,EAAE,EAAE,CAAC,WAAW;gBACpB,QAAQ,EAAE,QAAQ,EAAE,CAAC,WAAW,WAAW,EAAE,CAAC,OAAO,uBAAuB;gBAC5E,IAAI;aACL,CAAC;YACF,kFAAkF;YAClF,OAAO;gBACL,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,EAAE,CAAC,WAAW;gBAC3B,OAAO,EAAE,EAAE,CAAC,OAAO;gBACnB,OAAO,EAAE,IAAI;gBACb,aAAa,EAAE,IAAI;gBACnB,SAAS,EAAE,CAAC,OAAO,CAAC;aACrB,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,SAAS,GAAqB,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,OAAO;YACL,SAAS,EAAE,EAAE,CAAC,SAAS;YACvB,WAAW,EAAE,EAAE,CAAC,WAAW;YAC3B,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,aAAa,EAAE,EAAE,CAAC,aAAa;YAC/B,SAAS;SACV,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,OAAO,EAAE,sBAAsB;QAC/B,IAAI;KACL,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
import { type AgentActivityStore } from "../agent-activity-store.js";
|
|
3
|
+
import type { ProviderService, ProviderPrecheckInput, ProviderSwitchInput, ProviderSwitchResult } from "./provider-service.js";
|
|
4
|
+
import type { FourBlockReadModel, PrecheckResult, ProviderSignal } from "./provider-types.js";
|
|
5
|
+
export interface ProviderServiceImplDeps {
|
|
6
|
+
db: Database.Database;
|
|
7
|
+
/** The rig universe (rigRepo.listRigs()) — each rig's node-inventory contributes seats. */
|
|
8
|
+
listRigs: () => Array<{
|
|
9
|
+
id: string;
|
|
10
|
+
}>;
|
|
11
|
+
/** Slice-04 C3: the Claude statusline provider_usage signal source (undefined → signals []). */
|
|
12
|
+
collectClaudeSignals?: () => ProviderSignal[];
|
|
13
|
+
/** Slice-04 C4: the shipped structured activity detector. Undefined keeps the reactive lane empty. */
|
|
14
|
+
agentActivityStore?: Pick<AgentActivityStore, "getLatestForNode">;
|
|
15
|
+
env?: NodeJS.ProcessEnv;
|
|
16
|
+
now?: () => string;
|
|
17
|
+
}
|
|
18
|
+
export declare class ProviderServiceImpl implements ProviderService {
|
|
19
|
+
private readonly deps;
|
|
20
|
+
constructor(deps: ProviderServiceImplDeps);
|
|
21
|
+
getReadModel(): Promise<FourBlockReadModel>;
|
|
22
|
+
private listSeats;
|
|
23
|
+
precheck(input: ProviderPrecheckInput): Promise<PrecheckResult>;
|
|
24
|
+
switchAccount(input: ProviderSwitchInput): Promise<ProviderSwitchResult>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=provider-service-impl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-service-impl.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/provider-service-impl.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AAMpC,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE9F,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,2FAA2F;IAC3F,QAAQ,EAAE,MAAM,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtC,gGAAgG;IAChG,oBAAoB,CAAC,EAAE,MAAM,cAAc,EAAE,CAAC;IAC9C,sGAAsG;IACtG,kBAAkB,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,mBAAoB,YAAW,eAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,uBAAuB;IAEpD,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC;IA0BjD,OAAO,CAAC,SAAS;IAgBX,QAAQ,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC;IAc/D,aAAa,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAW/E"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Slice-04 (OPR.0.5.0.4) C1 (resume) — the production ProviderService. getReadModel is fully
|
|
2
|
+
// wired over the collection seam (real codex-auth reader + node-inventory across rigs + clock).
|
|
3
|
+
// precheck composes the pure precheckSwitch gate (fails closed on unknown auth per BR-3). switch
|
|
4
|
+
// is precheck-gated and NEVER fabricates success — the switch-execution + BR-1 action-record path
|
|
5
|
+
// is the D seam; until it lands, switch returns an honest failed_safely with an operational reason.
|
|
6
|
+
import { AGENT_ACTIVITY_FRESHNESS_MS, } from "../agent-activity-store.js";
|
|
7
|
+
import { getNodeInventory } from "../node-inventory.js";
|
|
8
|
+
import { readCodexAuthMetadata } from "./codex-auth-reader.js";
|
|
9
|
+
import { collectFourBlockReadModel } from "./provider-collect.js";
|
|
10
|
+
import { precheckSwitch } from "./provider-policy.js";
|
|
11
|
+
import { collectReactiveEventSignals } from "./reactive-tap.js";
|
|
12
|
+
export class ProviderServiceImpl {
|
|
13
|
+
deps;
|
|
14
|
+
constructor(deps) {
|
|
15
|
+
this.deps = deps;
|
|
16
|
+
}
|
|
17
|
+
async getReadModel() {
|
|
18
|
+
const env = this.deps.env ?? process.env;
|
|
19
|
+
const asOf = (this.deps.now ?? (() => new Date().toISOString()))();
|
|
20
|
+
let auth;
|
|
21
|
+
let seats;
|
|
22
|
+
const readAuth = () => auth ??= readCodexAuthMetadata(env);
|
|
23
|
+
const listSeats = () => seats ??= this.listSeats();
|
|
24
|
+
return collectFourBlockReadModel({
|
|
25
|
+
readCodexAuth: readAuth,
|
|
26
|
+
listSeats,
|
|
27
|
+
collectSignals: () => [
|
|
28
|
+
...(this.deps.collectClaudeSignals?.() ?? []),
|
|
29
|
+
...(this.deps.agentActivityStore
|
|
30
|
+
? collectReactiveEventSignals({
|
|
31
|
+
seats: listSeats(),
|
|
32
|
+
auth: readAuth(),
|
|
33
|
+
activity: this.deps.agentActivityStore,
|
|
34
|
+
now: asOf,
|
|
35
|
+
freshnessMs: AGENT_ACTIVITY_FRESHNESS_MS,
|
|
36
|
+
})
|
|
37
|
+
: []),
|
|
38
|
+
],
|
|
39
|
+
now: () => asOf,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
listSeats() {
|
|
43
|
+
const seats = [];
|
|
44
|
+
for (const rig of this.deps.listRigs()) {
|
|
45
|
+
for (const entry of getNodeInventory(this.deps.db, rig.id)) {
|
|
46
|
+
if (!entry.canonicalSessionName)
|
|
47
|
+
continue;
|
|
48
|
+
seats.push({
|
|
49
|
+
seatSession: entry.canonicalSessionName,
|
|
50
|
+
rigName: entry.rigName ?? "",
|
|
51
|
+
runtime: entry.runtime ?? "unknown",
|
|
52
|
+
lifecycleState: entry.lifecycleState,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return seats;
|
|
57
|
+
}
|
|
58
|
+
async precheck(input) {
|
|
59
|
+
const model = await this.getReadModel();
|
|
60
|
+
const target = model.accounts.find((a) => a.accountId === input.toAccount);
|
|
61
|
+
// Validate-at-use: an unknown target OR unknown auth fails closed (BR-3 — disk presence never
|
|
62
|
+
// asserts active). Live-conversation state is not yet wired (the C2 activity seam), so assume
|
|
63
|
+
// live — the conservative direction never strands a conversation silently. This is the MANUAL
|
|
64
|
+
// precheck variant (no triggeringSignal; that's for automated policy-driven switches).
|
|
65
|
+
return precheckSwitch({
|
|
66
|
+
targetProvider: target?.provider ?? "codex",
|
|
67
|
+
targetAuthState: target?.authState ?? "unknown",
|
|
68
|
+
seatHasLiveConversation: true,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
async switchAccount(input) {
|
|
72
|
+
// Precheck-gate: never switch past an unsafe verdict unless explicitly forced.
|
|
73
|
+
const verdict = await this.precheck({ seat: input.seat, toAccount: input.toAccount });
|
|
74
|
+
if (verdict.safe === false && !input.forceUnsafe) {
|
|
75
|
+
const reasons = verdict.reasons.length > 0 ? verdict.reasons : ["precheck_unsafe"];
|
|
76
|
+
return { outcome: "failed_safely", reasons: reasons };
|
|
77
|
+
}
|
|
78
|
+
// D seam (compose the rig-auth codex switch + BR-1 durable action record) is NOT yet wired.
|
|
79
|
+
// Honest operational failure — never fabricate a succeeded/rebind_in_progress outcome.
|
|
80
|
+
return { outcome: "failed_safely", reasons: ["switch_execution_not_yet_wired"] };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=provider-service-impl.js.map
|