@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,106 @@
|
|
|
1
|
+
// Slice-03 (OPR.0.4.8.3) Seam A — the permission-policy SPEC primitive: parse + validate-by-convention.
|
|
2
|
+
// A policy spec is a Markdown file with a leading YAML FRONTMATTER contract + an explanatory body.
|
|
3
|
+
// This module PARSES the whole contract from frontmatter (preserving the body verbatim) and
|
|
4
|
+
// VALIDATES it by convention — ADVISORY + fail-open (mirrors `rig scope audit`), never enforcement.
|
|
5
|
+
// It NEVER validates the semantic-action vocabulary (the taxonomy 668bb0d2 owns that) and NEVER
|
|
6
|
+
// resolves intent to a harness format (flag surface = deterministic code elsewhere; config surface =
|
|
7
|
+
// the skill). Schema authority: ARCH-POLICY-SPEC-SCHEMA sha256-8 92409094.
|
|
8
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
9
|
+
// Leading `---\n<yaml>\n---\n<body>` frontmatter block. Non-greedy YAML capture so the FIRST closing
|
|
10
|
+
// `---` ends the frontmatter; everything after is the body (preserved exactly).
|
|
11
|
+
const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/;
|
|
12
|
+
/** Parse a policy spec into its frontmatter contract + preserved body. Never throws. */
|
|
13
|
+
export function parsePolicySpec(raw) {
|
|
14
|
+
const m = FRONTMATTER_RE.exec(raw);
|
|
15
|
+
if (!m)
|
|
16
|
+
return { error: "policy spec must open with a '---' YAML frontmatter block" };
|
|
17
|
+
let frontmatter;
|
|
18
|
+
try {
|
|
19
|
+
frontmatter = parseYaml(m[1]);
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
return { error: `frontmatter is not valid YAML: ${e.message}` };
|
|
23
|
+
}
|
|
24
|
+
if (!frontmatter || typeof frontmatter !== "object" || Array.isArray(frontmatter)) {
|
|
25
|
+
return { error: "frontmatter must be a YAML object at the root" };
|
|
26
|
+
}
|
|
27
|
+
return { frontmatter: frontmatter, body: m[2] ?? "" };
|
|
28
|
+
}
|
|
29
|
+
const SOURCES = new Set(["builtin", "custom"]);
|
|
30
|
+
const SURFACES = new Set(["flag", "config"]);
|
|
31
|
+
const LAUNCH_POSTURES = new Set(["floor", "full_bypass"]);
|
|
32
|
+
const DEFAULT_POSTURES = new Set(["allow", "ask", "deny"]);
|
|
33
|
+
const ACTION_LIST_FIELDS = ["allow", "ask", "deny", "destructive_class"];
|
|
34
|
+
function isStringList(v) {
|
|
35
|
+
return Array.isArray(v) && v.every((x) => typeof x === "string");
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Validate-by-convention: required scalars, enum membership, surface-appropriate EXCLUSIVITY, and
|
|
39
|
+
* scalar/list SHAPES. ADVISORY + fail-open — returns {ok, errors[]}, never throws, never enforces.
|
|
40
|
+
* Does NOT validate the semantic-action vocabulary (taxonomy 668bb0d2 owns it) nor resolve to any
|
|
41
|
+
* harness format.
|
|
42
|
+
*/
|
|
43
|
+
export function validatePolicySpec(fm) {
|
|
44
|
+
const errors = [];
|
|
45
|
+
if (fm["policy_schema_version"] !== 1)
|
|
46
|
+
errors.push("policy_schema_version must be the number 1");
|
|
47
|
+
if (typeof fm["name"] !== "string" || fm["name"].length === 0)
|
|
48
|
+
errors.push("name must be a non-empty string");
|
|
49
|
+
if (typeof fm["source"] !== "string" || !SOURCES.has(fm["source"]))
|
|
50
|
+
errors.push("source must be 'builtin' or 'custom'");
|
|
51
|
+
if (typeof fm["description"] !== "string" || fm["description"].length === 0)
|
|
52
|
+
errors.push("description must be a non-empty string");
|
|
53
|
+
const surface = fm["surface"];
|
|
54
|
+
if (typeof surface !== "string" || !SURFACES.has(surface)) {
|
|
55
|
+
errors.push("surface must be 'flag' or 'config'");
|
|
56
|
+
return { ok: errors.length === 0, errors }; // can't check surface-appropriate fields without a valid surface
|
|
57
|
+
}
|
|
58
|
+
if (surface === "flag") {
|
|
59
|
+
if (!LAUNCH_POSTURES.has(fm["launch_posture"]))
|
|
60
|
+
errors.push("flag-surface policy requires launch_posture ('floor' or 'full_bypass')");
|
|
61
|
+
if (fm["default_posture"] !== undefined)
|
|
62
|
+
errors.push("flag-surface policy must NOT carry default_posture (config-surface field)");
|
|
63
|
+
for (const f of ACTION_LIST_FIELDS)
|
|
64
|
+
if (fm[f] !== undefined)
|
|
65
|
+
errors.push(`flag-surface policy must NOT carry '${f}' (config-surface field)`);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// config
|
|
69
|
+
if (fm["launch_posture"] !== undefined)
|
|
70
|
+
errors.push("config-surface policy must NOT carry launch_posture (flag-surface field)");
|
|
71
|
+
if (!DEFAULT_POSTURES.has(fm["default_posture"]))
|
|
72
|
+
errors.push("config-surface policy requires default_posture ('allow', 'ask' or 'deny')");
|
|
73
|
+
// The schema requires all four action-list fields present (use [] for none) — not optional.
|
|
74
|
+
for (const f of ACTION_LIST_FIELDS) {
|
|
75
|
+
if (fm[f] === undefined)
|
|
76
|
+
errors.push(`config-surface policy requires '${f}' (a list of strings; use [] for none)`);
|
|
77
|
+
else if (!isStringList(fm[f]))
|
|
78
|
+
errors.push(`${f} must be a list of strings`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return { ok: errors.length === 0, errors };
|
|
82
|
+
}
|
|
83
|
+
// Canonical field order for deterministic serialization (unknown keys appended stably after).
|
|
84
|
+
const CANONICAL_ORDER = [
|
|
85
|
+
"source", "name", "surface", "launch_posture", "policy_schema_version", "description",
|
|
86
|
+
"default_posture", "allow", "ask", "deny", "destructive_class",
|
|
87
|
+
];
|
|
88
|
+
/**
|
|
89
|
+
* Deterministic CANONICAL serialization: frontmatter re-emitted in canonical field order (unknown
|
|
90
|
+
* keys preserved, appended stably) + the body verbatim. Round-trip contract = serialize is STABLE
|
|
91
|
+
* (serialize∘parse is idempotent) + SEMANTIC equality (frontmatter deep-equal) + BODY preserved —
|
|
92
|
+
* NOT original-input byte identity.
|
|
93
|
+
*/
|
|
94
|
+
export function serializePolicySpec(parsed) {
|
|
95
|
+
const fm = parsed.frontmatter;
|
|
96
|
+
const ordered = {};
|
|
97
|
+
for (const k of CANONICAL_ORDER)
|
|
98
|
+
if (fm[k] !== undefined)
|
|
99
|
+
ordered[k] = fm[k];
|
|
100
|
+
for (const k of Object.keys(fm))
|
|
101
|
+
if (!(k in ordered))
|
|
102
|
+
ordered[k] = fm[k];
|
|
103
|
+
const yamlBlock = stringifyYaml(ordered).replace(/\n+$/, "");
|
|
104
|
+
return `---\n${yamlBlock}\n---\n${parsed.body}`;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=policy-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-spec.js","sourceRoot":"","sources":["../../../src/domain/permission-policy/policy-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,10 @@ export interface PluginVendorFs {
|
|
|
5
5
|
mkdirp(path: string): void;
|
|
6
6
|
listFiles(dir: string): string[];
|
|
7
7
|
rmrf?(path: string): void;
|
|
8
|
+
/** Source file permission bits (for mode-preserving vendor staging). Optional: no-op if absent. */
|
|
9
|
+
statMode?(path: string): number;
|
|
10
|
+
/** Apply permission bits to a file (for mode-preserving vendor staging). Optional: no-op if absent. */
|
|
11
|
+
chmod?(path: string, mode: number): void;
|
|
8
12
|
}
|
|
9
13
|
export interface HttpClientResponse {
|
|
10
14
|
ok: boolean;
|
|
@@ -37,6 +41,16 @@ export declare class PluginVendorService {
|
|
|
37
41
|
* No-op when the vendored asset doesn't exist (e.g. plugin not bundled).
|
|
38
42
|
*/
|
|
39
43
|
ensureVendored(pluginName: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Reapply the source file's permission bits to the staged/projected dest. Plain
|
|
46
|
+
* readFile+writeFile (writeFileSync) creates the dest with the process default mode,
|
|
47
|
+
* dropping executable bits on nested plugin helpers (e.g. claude-compaction-restore/
|
|
48
|
+
* scripts/*.mjs, 0755). This vendor-staging hop (assets -> ~/.openrig/plugins) runs
|
|
49
|
+
* UPSTREAM of the adapter CWD projection, so an unfixed mode here strands 0644 in the
|
|
50
|
+
* staged copy that the adapters then faithfully preserve. No-op when the fs adapter does
|
|
51
|
+
* not expose mode primitives (keeps existing mock-fs callers unaffected).
|
|
52
|
+
*/
|
|
53
|
+
private preserveMode;
|
|
40
54
|
/** Project one plugin skill into the harness-global skill roots. */
|
|
41
55
|
ensureSkillGlobally(pluginName: string, skillName: string, globalSkillRoots: string[]): void;
|
|
42
56
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-vendor-service.d.ts","sourceRoot":"","sources":["../../src/domain/plugin-vendor-service.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACjC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin-vendor-service.d.ts","sourceRoot":"","sources":["../../src/domain/plugin-vendor-service.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACjC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mGAAmG;IACnG,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,uGAAuG;IACvG,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf;mFAC+E;IAC/E,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAErG,MAAM,WAAW,uBAAuB;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,EAAE,EAAE,cAAc,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACvC;AAKD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAA+B;gBAEjC,IAAI,EAAE,uBAAuB;IAQzC;;;;;OAKG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BvD;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY;IAMpB,oEAAoE;IACpE,mBAAmB,CACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EAAE,GACzB,IAAI;IAmCP;;;;;OAKG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBzD;;;;OAIG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAItD"}
|
|
@@ -58,14 +58,33 @@ export class PluginVendorService {
|
|
|
58
58
|
const srcPath = nodePath.join(sourceDir, relPath);
|
|
59
59
|
const destPath = nodePath.join(targetDir, relPath);
|
|
60
60
|
const content = this.fs.readFile(srcPath);
|
|
61
|
-
// Hash-skip: only write if content differs (idempotent re-runs)
|
|
61
|
+
// Hash-skip: only write if content differs (idempotent re-runs). Reconcile mode even on
|
|
62
|
+
// skip — a byte-identical copy staged earlier may still carry the wrong (default) mode.
|
|
62
63
|
if (this.fs.exists(destPath) && hashContent(this.fs.readFile(destPath)) === hashContent(content)) {
|
|
64
|
+
this.preserveMode(srcPath, destPath);
|
|
63
65
|
continue;
|
|
64
66
|
}
|
|
65
67
|
this.fs.mkdirp(nodePath.dirname(destPath));
|
|
66
68
|
this.fs.writeFile(destPath, content);
|
|
69
|
+
this.preserveMode(srcPath, destPath);
|
|
67
70
|
}
|
|
68
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Reapply the source file's permission bits to the staged/projected dest. Plain
|
|
74
|
+
* readFile+writeFile (writeFileSync) creates the dest with the process default mode,
|
|
75
|
+
* dropping executable bits on nested plugin helpers (e.g. claude-compaction-restore/
|
|
76
|
+
* scripts/*.mjs, 0755). This vendor-staging hop (assets -> ~/.openrig/plugins) runs
|
|
77
|
+
* UPSTREAM of the adapter CWD projection, so an unfixed mode here strands 0644 in the
|
|
78
|
+
* staged copy that the adapters then faithfully preserve. No-op when the fs adapter does
|
|
79
|
+
* not expose mode primitives (keeps existing mock-fs callers unaffected).
|
|
80
|
+
*/
|
|
81
|
+
preserveMode(src, dest) {
|
|
82
|
+
if (!this.fs.statMode || !this.fs.chmod)
|
|
83
|
+
return;
|
|
84
|
+
const srcMode = this.fs.statMode(src) & 0o777;
|
|
85
|
+
if ((this.fs.statMode(dest) & 0o777) !== srcMode)
|
|
86
|
+
this.fs.chmod(dest, srcMode);
|
|
87
|
+
}
|
|
69
88
|
/** Project one plugin skill into the harness-global skill roots. */
|
|
70
89
|
ensureSkillGlobally(pluginName, skillName, globalSkillRoots) {
|
|
71
90
|
const sourceDir = nodePath.join(this.userPluginsDir, pluginName, "skills", skillName);
|
|
@@ -82,10 +101,12 @@ export class PluginVendorService {
|
|
|
82
101
|
const content = this.fs.readFile(srcPath);
|
|
83
102
|
if (this.fs.exists(destPath) &&
|
|
84
103
|
hashContent(this.fs.readFile(destPath)) === hashContent(content)) {
|
|
104
|
+
this.preserveMode(srcPath, destPath);
|
|
85
105
|
continue;
|
|
86
106
|
}
|
|
87
107
|
this.fs.mkdirp(nodePath.dirname(destPath));
|
|
88
108
|
this.fs.writeFile(destPath, content);
|
|
109
|
+
this.preserveMode(srcPath, destPath);
|
|
89
110
|
}
|
|
90
111
|
}
|
|
91
112
|
}
|
|
@@ -110,7 +131,10 @@ export class PluginVendorService {
|
|
|
110
131
|
}
|
|
111
132
|
// v0: tarball extraction NOT implemented — when slice 3.6 lands marketplace-
|
|
112
133
|
// consumption, this is where fetch-then-extract logic lives. For now,
|
|
113
|
-
// success path just logs.
|
|
134
|
+
// success path just logs. EXPLICIT MODE DECISION: v0 writes no files here, so there is
|
|
135
|
+
// no mode to preserve; the future extract path MUST route its writes through
|
|
136
|
+
// preserveMode() (or a tar extractor that preserves mode) so fetched executable helpers
|
|
137
|
+
// keep 0755 — same invariant as ensureVendored/ensureSkillGlobally.
|
|
114
138
|
this.logger(`[plugin-vendor] fetch ${pluginName} succeeded (${response.status}); v0 vendored copy still authoritative`);
|
|
115
139
|
}
|
|
116
140
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-vendor-service.js","sourceRoot":"","sources":["../../src/domain/plugin-vendor-service.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,EAAE;AACF,4EAA4E;AAC5E,EAAE;AACF,oBAAoB;AACpB,8EAA8E;AAC9E,qEAAqE;AACrE,2EAA2E;AAC3E,qCAAqC;AACrC,wDAAwD;AACxD,4EAA4E;AAC5E,wEAAwE;AACxE,sEAAsE;AACtE,mEAAmE;AACnE,uEAAuE;AACvE,uCAAuC;AACvC,EAAE;AACF,gBAAgB;AAChB,oEAAoE;AACpE,8BAA8B;AAC9B,4CAA4C;AAC5C,0EAA0E;AAC1E,sEAAsE;AACtE,6EAA6E;AAE7E,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin-vendor-service.js","sourceRoot":"","sources":["../../src/domain/plugin-vendor-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type ClaudeStatuslineReading } from "./provider-signals.js";
|
|
2
|
+
import type { ProviderSignal } from "./provider-types.js";
|
|
3
|
+
export interface ProviderUsageCacheFs {
|
|
4
|
+
readFile(path: string): string;
|
|
5
|
+
writeFile(path: string, content: string): void;
|
|
6
|
+
rename(from: string, to: string): void;
|
|
7
|
+
exists(path: string): boolean;
|
|
8
|
+
}
|
|
9
|
+
/** The on-disk provider_usage cache shape (authored by the Claude statusline sidecar). */
|
|
10
|
+
export interface ProviderUsageCache {
|
|
11
|
+
seatSession: string;
|
|
12
|
+
/** Present only when the statusline carried valid Pro/Max rate_limits. */
|
|
13
|
+
accountKind?: "subscription";
|
|
14
|
+
asOf: string;
|
|
15
|
+
/** Present only when the statusline carried a rate_limits object. */
|
|
16
|
+
rateLimits?: ClaudeStatuslineReading;
|
|
17
|
+
staleAfter?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Atomic write: serialize to a tmp sibling, then rename over the target. rename(2) is atomic on the
|
|
21
|
+
* same filesystem, so a concurrent reader sees EITHER the old file OR the fully-written new one —
|
|
22
|
+
* never a half-written (torn) read. The sidecar uses this so the daemon never parses a partial cache.
|
|
23
|
+
*/
|
|
24
|
+
export declare function writeProviderUsageCacheAtomic(fs: ProviderUsageCacheFs, path: string, cache: ProviderUsageCache): void;
|
|
25
|
+
export interface ClaudeSeatRef {
|
|
26
|
+
seatSession: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ClaudeUsageReaderDeps {
|
|
29
|
+
/** The live Claude seats to read provider_usage for. */
|
|
30
|
+
listClaudeSeats: () => ClaudeSeatRef[];
|
|
31
|
+
/** Raw cache JSON for a seat, or null if the cache file is absent (pre-first-response). Never throws. */
|
|
32
|
+
readCacheRaw: (seatSession: string) => string | null;
|
|
33
|
+
now: () => string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Read each Claude seat's provider_usage cache → provider_statusline rows via
|
|
37
|
+
* claudeStatuslineSignals. Explicit unknown rows for absent cache (no_statusline_cache_yet) and
|
|
38
|
+
* cache-present-but-no/-malformed windows (empty_reading).
|
|
39
|
+
* Never throws — a malformed cache is treated as present-with-no-windows, not a crash.
|
|
40
|
+
*/
|
|
41
|
+
export declare function collectClaudeStatuslineSignals(deps: ClaudeUsageReaderDeps): ProviderSignal[];
|
|
42
|
+
/** Read the seat-keyed cache directory using the same path consumed by daemon startup. */
|
|
43
|
+
export declare function collectClaudeSignalsFromProviderUsageDirectory(directory: string, now?: () => string): ProviderSignal[];
|
|
44
|
+
//# sourceMappingURL=claude-usage-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-usage-reader.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/claude-usage-reader.ts"],"names":[],"mappings":"AAYA,OAAO,EAA2B,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC9F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAED,0FAA0F;AAC1F,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,EAAE,EAAE,oBAAoB,EACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,kBAAkB,GACxB,IAAI,CAIN;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,wDAAwD;IACxD,eAAe,EAAE,MAAM,aAAa,EAAE,CAAC;IACvC,yGAAyG;IACzG,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACrD,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,qBAAqB,GAAG,cAAc,EAAE,CAmC5F;AAED,0FAA0F;AAC1F,wBAAgB,8CAA8C,CAC5D,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAM,MAAuC,GACjD,cAAc,EAAE,CAsBlB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// Slice-04 (OPR.0.5.0.4) seam C3 — the Claude statusline provider_usage cache LANE.
|
|
2
|
+
// A statusline sidecar writes a per-seat provider_usage cache with an atomic tmp+rename (so a
|
|
3
|
+
// concurrent daemon read never sees a torn file); the daemon reads it here and normalizes it into
|
|
4
|
+
// provider_statusline signal rows via the existing claudeStatuslineSignals. Absent cache
|
|
5
|
+
// (pre-first-response) and empty/malformed readings each become an EXPLICIT
|
|
6
|
+
// unknown row with an unknownReason — never a missing row and never a fabricated zero. Never throws.
|
|
7
|
+
//
|
|
8
|
+
// SCOPE: this atom is the cache producer/reader + collectSignals wiring ONLY. It does not touch the
|
|
9
|
+
// C4 reactive tap, C2 Codex app-server, activity-accurate precheck, D switch execution, or BR-1.
|
|
10
|
+
import fs from "node:fs";
|
|
11
|
+
import nodePath from "node:path";
|
|
12
|
+
import { claudeStatuslineSignals } from "./provider-signals.js";
|
|
13
|
+
/**
|
|
14
|
+
* Atomic write: serialize to a tmp sibling, then rename over the target. rename(2) is atomic on the
|
|
15
|
+
* same filesystem, so a concurrent reader sees EITHER the old file OR the fully-written new one —
|
|
16
|
+
* never a half-written (torn) read. The sidecar uses this so the daemon never parses a partial cache.
|
|
17
|
+
*/
|
|
18
|
+
export function writeProviderUsageCacheAtomic(fs, path, cache) {
|
|
19
|
+
const tmp = `${path}.tmp-${cache.asOf.replace(/[^0-9]/g, "")}`;
|
|
20
|
+
fs.writeFile(tmp, JSON.stringify(cache));
|
|
21
|
+
fs.rename(tmp, path);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Read each Claude seat's provider_usage cache → provider_statusline rows via
|
|
25
|
+
* claudeStatuslineSignals. Explicit unknown rows for absent cache (no_statusline_cache_yet) and
|
|
26
|
+
* cache-present-but-no/-malformed windows (empty_reading).
|
|
27
|
+
* Never throws — a malformed cache is treated as present-with-no-windows, not a crash.
|
|
28
|
+
*/
|
|
29
|
+
export function collectClaudeStatuslineSignals(deps) {
|
|
30
|
+
const now = deps.now();
|
|
31
|
+
const out = [];
|
|
32
|
+
for (const seat of deps.listClaudeSeats()) {
|
|
33
|
+
let cachePresent = false;
|
|
34
|
+
let reading;
|
|
35
|
+
let staleAfter;
|
|
36
|
+
let capturedAsOf;
|
|
37
|
+
const raw = deps.readCacheRaw(seat.seatSession);
|
|
38
|
+
if (raw !== null) {
|
|
39
|
+
cachePresent = true;
|
|
40
|
+
try {
|
|
41
|
+
const parsed = JSON.parse(raw);
|
|
42
|
+
if (parsed.seatSession === seat.seatSession && parsed.accountKind === "subscription") {
|
|
43
|
+
reading = validRateLimits(parsed.rateLimits);
|
|
44
|
+
}
|
|
45
|
+
staleAfter = parsed.staleAfter;
|
|
46
|
+
capturedAsOf = typeof parsed.asOf === "string" ? parsed.asOf : undefined;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Malformed cache → present-with-no-windows (empty_reading unknown), never a throw.
|
|
50
|
+
reading = undefined;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
out.push(...claudeStatuslineSignals({
|
|
54
|
+
seatSession: seat.seatSession,
|
|
55
|
+
cachePresent,
|
|
56
|
+
reading,
|
|
57
|
+
// Signal asOf = when the reading was captured (the cache's asOf) when present+valid; else now.
|
|
58
|
+
asOf: cachePresent && capturedAsOf ? capturedAsOf : now,
|
|
59
|
+
staleAfter,
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
/** Read the seat-keyed cache directory using the same path consumed by daemon startup. */
|
|
65
|
+
export function collectClaudeSignalsFromProviderUsageDirectory(directory, now = () => new Date().toISOString()) {
|
|
66
|
+
const seats = new Map();
|
|
67
|
+
try {
|
|
68
|
+
for (const file of fs.readdirSync(directory)) {
|
|
69
|
+
if (!file.endsWith(".json"))
|
|
70
|
+
continue;
|
|
71
|
+
try {
|
|
72
|
+
const parsed = JSON.parse(fs.readFileSync(nodePath.join(directory, file), "utf-8"));
|
|
73
|
+
if (typeof parsed.seatSession === "string") {
|
|
74
|
+
seats.set(parsed.seatSession, { seatSession: parsed.seatSession });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch { /* malformed cache cannot create a usable cache signal */ }
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch { /* absent cache directory */ }
|
|
81
|
+
return collectClaudeStatuslineSignals({
|
|
82
|
+
listClaudeSeats: () => [...seats.values()],
|
|
83
|
+
readCacheRaw: (seatSession) => {
|
|
84
|
+
const safe = seatSession.replace(/[^a-zA-Z0-9@._-]/g, "_");
|
|
85
|
+
try {
|
|
86
|
+
return fs.readFileSync(nodePath.join(directory, `${safe}.json`), "utf-8");
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
now,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function validRateLimits(value) {
|
|
96
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
97
|
+
return undefined;
|
|
98
|
+
const source = value;
|
|
99
|
+
const reading = {};
|
|
100
|
+
for (const key of ["five_hour", "seven_day"]) {
|
|
101
|
+
const raw = source[key];
|
|
102
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
103
|
+
continue;
|
|
104
|
+
const window = raw;
|
|
105
|
+
if (typeof window.usedPercent === "number" && Number.isFinite(window.usedPercent)
|
|
106
|
+
&& typeof window.resetsAt === "string") {
|
|
107
|
+
reading[key] = { usedPercent: window.usedPercent, resetsAt: window.resetsAt };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return reading.five_hour || reading.seven_day ? reading : undefined;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=claude-usage-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-usage-reader.js","sourceRoot":"","sources":["../../../src/domain/provider/claude-usage-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface CodexSeatRow {
|
|
2
|
+
seat: string;
|
|
3
|
+
rig: string;
|
|
4
|
+
runtime: string;
|
|
5
|
+
cwd: string;
|
|
6
|
+
/** The codex-auth profile name this seat is registered against (opaque, non-secret). */
|
|
7
|
+
authProfile: string;
|
|
8
|
+
updatedTs: string;
|
|
9
|
+
}
|
|
10
|
+
export interface CodexAuthMetadata {
|
|
11
|
+
/** Profile NAMES (opaque, non-secret refs) — never file contents. */
|
|
12
|
+
profiles: string[];
|
|
13
|
+
seats: CodexSeatRow[];
|
|
14
|
+
}
|
|
15
|
+
/** Read the codex-auth on-disk METADATA (profile names + seat registry). Never throws; never
|
|
16
|
+
* surfaces token-class content. Absent home/files yield empty arrays. */
|
|
17
|
+
export declare function readCodexAuthMetadata(env?: NodeJS.ProcessEnv): CodexAuthMetadata;
|
|
18
|
+
//# sourceMappingURL=codex-auth-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-auth-reader.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/codex-auth-reader.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,wFAAwF;IACxF,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,qEAAqE;IACrE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAgDD;0EAC0E;AAC1E,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,iBAAiB,CAM7F"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Slice-04 (OPR.0.5.0.4) seam C1 — a DAEMON-LOCAL, secret-safe reader of the codex-auth on-disk
|
|
2
|
+
// contract. The daemon cannot import packages/cli (no @openrig/cli dep); this re-reads the same
|
|
3
|
+
// documented format: $CODEX_HOME||~/.codex with auth-profiles/*.json (profile NAMES) and
|
|
4
|
+
// auth-seat-registry.tsv (6 tab columns: seat/rig/runtime/cwd/auth_profile/updated_ts — NO token
|
|
5
|
+
// column). It reads profile NAMES and the TSV ONLY — never the profile *.json contents, which hold
|
|
6
|
+
// token-class material (BR-6: no secret ever surfaces).
|
|
7
|
+
import fs from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
const SEAT_COLUMN_COUNT = 6;
|
|
10
|
+
function resolveCodexHome(env) {
|
|
11
|
+
const codexHome = typeof env.CODEX_HOME === "string" && env.CODEX_HOME.length > 0
|
|
12
|
+
? env.CODEX_HOME
|
|
13
|
+
: path.join(env.HOME ?? "", ".codex");
|
|
14
|
+
return {
|
|
15
|
+
profileDir: path.join(codexHome, "auth-profiles"),
|
|
16
|
+
registryPath: path.join(codexHome, "auth-seat-registry.tsv"),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// Profile NAMES only — the *.json file contents (token-class) are never opened.
|
|
20
|
+
function listProfiles(profileDir) {
|
|
21
|
+
try {
|
|
22
|
+
return fs
|
|
23
|
+
.readdirSync(profileDir)
|
|
24
|
+
.filter((n) => n.endsWith(".json"))
|
|
25
|
+
.map((n) => n.slice(0, -".json".length))
|
|
26
|
+
.sort();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function readSeats(registryPath) {
|
|
33
|
+
let raw;
|
|
34
|
+
try {
|
|
35
|
+
raw = fs.readFileSync(registryPath, "utf8");
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
const rows = [];
|
|
41
|
+
for (const line of raw.split("\n")) {
|
|
42
|
+
if (line.length === 0)
|
|
43
|
+
continue;
|
|
44
|
+
const cols = line.split("\t");
|
|
45
|
+
if (cols.length !== SEAT_COLUMN_COUNT)
|
|
46
|
+
continue; // skip malformed rows — never fabricate fields
|
|
47
|
+
// Length is exactly 6 above, so the tuple destructure is total (satisfies noUncheckedIndexedAccess).
|
|
48
|
+
const [seat, rig, runtime, cwd, authProfile, updatedTs] = cols;
|
|
49
|
+
if (seat === "seat")
|
|
50
|
+
continue; // the header row
|
|
51
|
+
rows.push({ seat, rig, runtime, cwd, authProfile, updatedTs });
|
|
52
|
+
}
|
|
53
|
+
return rows;
|
|
54
|
+
}
|
|
55
|
+
/** Read the codex-auth on-disk METADATA (profile names + seat registry). Never throws; never
|
|
56
|
+
* surfaces token-class content. Absent home/files yield empty arrays. */
|
|
57
|
+
export function readCodexAuthMetadata(env = process.env) {
|
|
58
|
+
const { profileDir, registryPath } = resolveCodexHome(env);
|
|
59
|
+
return {
|
|
60
|
+
profiles: listProfiles(profileDir),
|
|
61
|
+
seats: readSeats(registryPath),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=codex-auth-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-auth-reader.js","sourceRoot":"","sources":["../../../src/domain/provider/codex-auth-reader.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,gGAAgG;AAChG,yFAAyF;AACzF,iGAAiG;AACjG,mGAAmG;AACnG,wDAAwD;AAExD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAkB7B,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,SAAS,gBAAgB,CAAC,GAAsB;IAC9C,MAAM,SAAS,GACb,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QAC7D,CAAC,CAAC,GAAG,CAAC,UAAU;QAChB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC1C,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC;QACjD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,YAAY,CAAC,UAAkB;IACtC,IAAI,CAAC;QACH,OAAO,EAAE;aACN,WAAW,CAAC,UAAU,CAAC;aACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;aACvC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,YAAoB;IACrC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,iBAAiB;YAAE,SAAS,CAAC,+CAA+C;QAChG,qGAAqG;QACrG,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,GAAG,IAAwD,CAAC;QACnH,IAAI,IAAI,KAAK,MAAM;YAAE,SAAS,CAAC,iBAAiB;QAChD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;0EAC0E;AAC1E,MAAM,UAAU,qBAAqB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACxE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAO;QACL,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC;QAClC,KAAK,EAAE,SAAS,CAAC,YAAY,CAAC;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ProviderKind, ProviderSignal, SignalWindow } from "./provider-types.js";
|
|
2
|
+
/** Nearing = the shipped default advisory threshold on the C3-carried percentage. */
|
|
3
|
+
export declare const NEARING_THRESHOLD_PERCENT = 80;
|
|
4
|
+
/** Same-window resets_at spread tolerated as sampling skew before it is a CONFLICT.
|
|
5
|
+
* Two seats on ONE account can read the same window seconds apart; two different
|
|
6
|
+
* accounts' reset schedules differ by far more than this. */
|
|
7
|
+
export declare const CONFLICTING_RESETS_EPSILON_MS = 120000;
|
|
8
|
+
export type HostUsageState = "ok" | "nearing" | "limited" | "explicit_unknown";
|
|
9
|
+
export interface HostUsageWindowFact {
|
|
10
|
+
window: SignalWindow | "unknown";
|
|
11
|
+
usedPercent?: number;
|
|
12
|
+
resetsAt?: string;
|
|
13
|
+
asOf: string;
|
|
14
|
+
/** The contributing seat (topology identity, never an account identity). */
|
|
15
|
+
seatSession?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface HostUsageConflictAnomaly {
|
|
18
|
+
kind: "conflicting_seat_windows";
|
|
19
|
+
window: SignalWindow | "unknown";
|
|
20
|
+
seats: string[];
|
|
21
|
+
evidence: string;
|
|
22
|
+
asOf: string;
|
|
23
|
+
}
|
|
24
|
+
export interface HostUsageRow {
|
|
25
|
+
/** The reserved LOCAL host id — this daemon's own scope (MH aggregation is out of scope). */
|
|
26
|
+
host: "local";
|
|
27
|
+
provider: ProviderKind;
|
|
28
|
+
state: HostUsageState;
|
|
29
|
+
/** For `limited`: when the limit lifts, when the source carried it. Honest absence otherwise. */
|
|
30
|
+
resetsAt?: string;
|
|
31
|
+
/** (iii) exactly the C3-carried granularity — never normalized-away, never invented. */
|
|
32
|
+
windows: HostUsageWindowFact[];
|
|
33
|
+
provenance: {
|
|
34
|
+
basis: "one_account_per_host_deployment_invariant";
|
|
35
|
+
note: string;
|
|
36
|
+
};
|
|
37
|
+
anomalies: HostUsageConflictAnomaly[];
|
|
38
|
+
/** Contributing evidence refs: seat sessions (C3) / labeled reactive events (C4). */
|
|
39
|
+
evidenceSeats: string[];
|
|
40
|
+
unknownReason?: string;
|
|
41
|
+
asOf: string;
|
|
42
|
+
}
|
|
43
|
+
export interface HostUsageRollupInput {
|
|
44
|
+
signals: ProviderSignal[];
|
|
45
|
+
/** Deployment presence for codex (auth profiles on disk) — presence without a meter is an
|
|
46
|
+
* explicit unknown, never an omitted row (the blindside must be visible). */
|
|
47
|
+
codexProfilesPresent: boolean;
|
|
48
|
+
now: string;
|
|
49
|
+
}
|
|
50
|
+
export declare function rollupHostUsage(input: HostUsageRollupInput): HostUsageRow[];
|
|
51
|
+
//# sourceMappingURL=host-usage-rollup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-usage-rollup.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/host-usage-rollup.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEtF,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C;;8DAE8D;AAC9D,eAAO,MAAM,6BAA6B,SAAU,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,0BAA0B,CAAC;IACjC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC;IACjC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,6FAA6F;IAC7F,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,cAAc,CAAC;IACtB,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wFAAwF;IACxF,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,UAAU,EAAE;QACV,KAAK,EAAE,2CAA2C,CAAC;QACnD,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,SAAS,EAAE,wBAAwB,EAAE,CAAC;IACtC,qFAAqF;IACrF,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAMD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B;kFAC8E;IAC9E,oBAAoB,EAAE,OAAO,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,YAAY,EAAE,CAU3E"}
|