@openrig/cli 0.6.10 → 0.6.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +1 -1
- package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +6 -1
- package/daemon/assets/skills/rigs/SKILL.md +1 -1
- package/daemon/context-packs/help/manifest.yaml +1 -1
- package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
- package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +36 -11
- package/daemon/context-packs/reference/manifest.yaml +1 -1
- package/daemon/context-packs/reference/rig-spec.md +2 -2
- package/daemon/context-packs/reference/whats-new.md +135 -134
- package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
- package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
- package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
- package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-skills/SKILL.md +1 -1
- package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +3 -3
- package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
- package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
- package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
- package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
- package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
- package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
- package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
- package/daemon/context-packs/skills/refocusing/scripts/trace-to-root.py +6 -1
- package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
- package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
- package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
- package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
- package/daemon/context-packs/world-example/manifest.yaml +1 -1
- package/daemon/context-packs/world-public/manifest.yaml +1 -1
- package/daemon/dist/adapters/claude-code-adapter.d.ts +0 -14
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +27 -73
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +35 -0
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +94 -44
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runner.js +6 -3
- package/daemon/dist/adapters/pi-runner.js.map +1 -1
- package/daemon/dist/adapters/pi-runtime-adapter.js +1 -1
- package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts +23 -0
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +127 -6
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/db/all-migrations.d.ts.map +1 -1
- package/daemon/dist/db/all-migrations.js +2 -0
- package/daemon/dist/db/all-migrations.js.map +1 -1
- package/daemon/dist/db/migrations/103_session_stop_intent.d.ts +4 -0
- package/daemon/dist/db/migrations/103_session_stop_intent.d.ts.map +1 -0
- package/daemon/dist/db/migrations/103_session_stop_intent.js +9 -0
- package/daemon/dist/db/migrations/103_session_stop_intent.js.map +1 -0
- package/daemon/dist/domain/active-occupant.d.ts +14 -0
- package/daemon/dist/domain/active-occupant.d.ts.map +1 -1
- package/daemon/dist/domain/active-occupant.js +17 -0
- package/daemon/dist/domain/active-occupant.js.map +1 -1
- package/daemon/dist/domain/codex-network-default.d.ts +3 -0
- package/daemon/dist/domain/codex-network-default.d.ts.map +1 -1
- package/daemon/dist/domain/codex-network-default.js +1 -1
- package/daemon/dist/domain/codex-network-default.js.map +1 -1
- package/daemon/dist/domain/codex-pane-patterns.d.ts +2 -0
- package/daemon/dist/domain/codex-pane-patterns.d.ts.map +1 -0
- package/daemon/dist/domain/codex-pane-patterns.js +5 -0
- package/daemon/dist/domain/codex-pane-patterns.js.map +1 -0
- package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/context-monitor.js +46 -22
- package/daemon/dist/domain/context-monitor.js.map +1 -1
- package/daemon/dist/domain/cwd-resolution.d.ts +8 -0
- package/daemon/dist/domain/cwd-resolution.d.ts.map +1 -1
- package/daemon/dist/domain/cwd-resolution.js +24 -3
- package/daemon/dist/domain/cwd-resolution.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/channel-recovery.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/channel-recovery.js +4 -3
- package/daemon/dist/domain/gateway/slack/channel-recovery.js.map +1 -1
- package/daemon/dist/domain/native-process-lineage.d.ts +5 -0
- package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
- package/daemon/dist/domain/native-process-lineage.js +53 -15
- package/daemon/dist/domain/native-process-lineage.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +15 -7
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/node-launcher.js +2 -1
- package/daemon/dist/domain/node-launcher.js.map +1 -1
- package/daemon/dist/domain/pane-cutover.d.ts +27 -0
- package/daemon/dist/domain/pane-cutover.d.ts.map +1 -0
- package/daemon/dist/domain/pane-cutover.js +37 -0
- package/daemon/dist/domain/pane-cutover.js.map +1 -0
- package/daemon/dist/domain/parent-session-env.d.ts +8 -0
- package/daemon/dist/domain/parent-session-env.d.ts.map +1 -0
- package/daemon/dist/domain/parent-session-env.js +37 -0
- package/daemon/dist/domain/parent-session-env.js.map +1 -0
- package/daemon/dist/domain/policies/parked-owner-consumer.d.ts +11 -0
- package/daemon/dist/domain/policies/parked-owner-consumer.d.ts.map +1 -1
- package/daemon/dist/domain/policies/parked-owner-consumer.js +81 -11
- package/daemon/dist/domain/policies/parked-owner-consumer.js.map +1 -1
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +2 -3
- package/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/daemon/dist/domain/proof/judgments.d.ts +10 -5
- package/daemon/dist/domain/proof/judgments.d.ts.map +1 -1
- package/daemon/dist/domain/proof/judgments.js +27 -19
- package/daemon/dist/domain/proof/judgments.js.map +1 -1
- package/daemon/dist/domain/provider/codex-limit-banner.d.ts +2 -2
- package/daemon/dist/domain/provider/codex-limit-banner.d.ts.map +1 -1
- package/daemon/dist/domain/provider/codex-limit-banner.js +56 -9
- package/daemon/dist/domain/provider/codex-limit-banner.js.map +1 -1
- package/daemon/dist/domain/provider/codex-usage-reader.d.ts +31 -0
- package/daemon/dist/domain/provider/codex-usage-reader.d.ts.map +1 -0
- package/daemon/dist/domain/provider/codex-usage-reader.js +115 -0
- package/daemon/dist/domain/provider/codex-usage-reader.js.map +1 -0
- package/daemon/dist/domain/provider/codex-usage-windows.d.ts +78 -0
- package/daemon/dist/domain/provider/codex-usage-windows.d.ts.map +1 -0
- package/daemon/dist/domain/provider/codex-usage-windows.js +259 -0
- package/daemon/dist/domain/provider/codex-usage-windows.js.map +1 -0
- package/daemon/dist/domain/provider/provider-service-impl.d.ts +10 -0
- package/daemon/dist/domain/provider/provider-service-impl.d.ts.map +1 -1
- package/daemon/dist/domain/provider/provider-service-impl.js +27 -1
- package/daemon/dist/domain/provider/provider-service-impl.js.map +1 -1
- package/daemon/dist/domain/provider/provider-service.d.ts +5 -0
- package/daemon/dist/domain/provider/provider-service.d.ts.map +1 -1
- package/daemon/dist/domain/provider/provider-types.d.ts +65 -0
- package/daemon/dist/domain/provider/provider-types.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.d.ts +5 -2
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +27 -25
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +2 -0
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +16 -3
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.js +21 -7
- package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
- package/daemon/dist/domain/restore-check-service.d.ts +8 -0
- package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
- package/daemon/dist/domain/restore-check-service.js +12 -3
- package/daemon/dist/domain/restore-check-service.js.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.d.ts +4 -0
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +34 -5
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.d.ts +4 -0
- package/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.js +14 -3
- package/daemon/dist/domain/restore-plan-preview.js.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.js +7 -6
- package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
- package/daemon/dist/domain/runtime-adapter.d.ts +1 -0
- 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/scope-view-projection.d.ts +4 -2
- package/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-view-projection.js +6 -4
- package/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
- package/daemon/dist/domain/seat-lifecycle-service.d.ts +117 -2
- package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-lifecycle-service.js +335 -74
- package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
- package/daemon/dist/domain/seat-restart-in-place.d.ts +292 -0
- package/daemon/dist/domain/seat-restart-in-place.d.ts.map +1 -0
- package/daemon/dist/domain/seat-restart-in-place.js +895 -0
- package/daemon/dist/domain/seat-restart-in-place.js.map +1 -0
- package/daemon/dist/domain/seat-structural-activity-service.d.ts +1 -1
- package/daemon/dist/domain/seat-structural-activity-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-structural-activity-service.js +5 -6
- package/daemon/dist/domain/seat-structural-activity-service.js.map +1 -1
- package/daemon/dist/domain/session-fingerprinter.d.ts.map +1 -1
- package/daemon/dist/domain/session-fingerprinter.js +9 -5
- package/daemon/dist/domain/session-fingerprinter.js.map +1 -1
- package/daemon/dist/domain/session-registry.d.ts +3 -0
- package/daemon/dist/domain/session-registry.d.ts.map +1 -1
- package/daemon/dist/domain/session-registry.js +6 -1
- package/daemon/dist/domain/session-registry.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts +33 -3
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +391 -21
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.d.ts +2 -0
- package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.js +4 -3
- package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.d.ts +3 -7
- package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.js +6 -32
- package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +29 -0
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +31 -0
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/wake-resolver.js +2 -2
- package/daemon/dist/domain/wake-resolver.js.map +1 -1
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-jobs-repository.js +19 -3
- package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
- package/daemon/dist/domain/whoami-service.d.ts +4 -1
- package/daemon/dist/domain/whoami-service.d.ts.map +1 -1
- package/daemon/dist/domain/whoami-service.js +25 -19
- package/daemon/dist/domain/whoami-service.js.map +1 -1
- package/daemon/dist/domain/workspace/project-read.d.ts +2 -0
- package/daemon/dist/domain/workspace/project-read.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/project-read.js +19 -8
- package/daemon/dist/domain/workspace/project-read.js.map +1 -1
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +6 -0
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/routes/chat.d.ts.map +1 -1
- package/daemon/dist/routes/chat.js +23 -2
- package/daemon/dist/routes/chat.js.map +1 -1
- package/daemon/dist/routes/proof.d.ts.map +1 -1
- package/daemon/dist/routes/proof.js +99 -10
- package/daemon/dist/routes/proof.js.map +1 -1
- package/daemon/dist/routes/provider.d.ts.map +1 -1
- package/daemon/dist/routes/provider.js +31 -0
- package/daemon/dist/routes/provider.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +18 -6
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/rigs.js +5 -3
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/scopes.d.ts.map +1 -1
- package/daemon/dist/routes/scopes.js +5 -3
- package/daemon/dist/routes/scopes.js.map +1 -1
- package/daemon/dist/routes/seat.d.ts.map +1 -1
- package/daemon/dist/routes/seat.js +32 -0
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +12 -2
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/agent-startup-guide.md +19 -0
- package/daemon/docs/reference/keeping-a-watch.md +156 -0
- package/daemon/docs/reference/rig-spec.md +2 -2
- package/daemon/docs/reference/sdlc-conventions.md +11 -1
- package/daemon/docs/reference/slack-app-setup.md +6 -4
- package/daemon/docs/reference/whats-new.md +135 -134
- package/daemon/specs/agents/shared/skills/core/openrig-skills/SKILL.md +1 -1
- package/dist/build-info.js +3 -3
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +2 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +7 -0
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/proof.d.ts.map +1 -1
- package/dist/commands/proof.js +11 -5
- package/dist/commands/proof.js.map +1 -1
- package/dist/commands/provider.d.ts.map +1 -1
- package/dist/commands/provider.js +72 -0
- package/dist/commands/provider.js.map +1 -1
- package/dist/commands/ps.d.ts +4 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +13 -4
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts +15 -5
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +113 -37
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +57 -36
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/seat.d.ts.map +1 -1
- package/dist/commands/seat.js +161 -10
- package/dist/commands/seat.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +4 -3
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +10 -0
- package/dist/commands/up.js.map +1 -1
- package/dist/config-store.d.ts +7 -1
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +43 -0
- package/dist/config-store.js.map +1 -1
- package/dist/lib/scope/mission-composition.d.ts +5 -1
- package/dist/lib/scope/mission-composition.d.ts.map +1 -1
- package/dist/lib/scope/mission-composition.js +61 -1
- package/dist/lib/scope/mission-composition.js.map +1 -1
- package/dist/lib/scope/scope-fs.d.ts +2 -1
- package/dist/lib/scope/scope-fs.d.ts.map +1 -1
- package/dist/lib/scope/scope-fs.js +4 -4
- package/dist/lib/scope/scope-fs.js.map +1 -1
- package/dist/lib/scope/slice-claims.d.ts +8 -0
- package/dist/lib/scope/slice-claims.d.ts.map +1 -0
- package/dist/lib/scope/slice-claims.js +88 -0
- package/dist/lib/scope/slice-claims.js.map +1 -0
- package/dist/queue-receipt.d.ts +41 -0
- package/dist/queue-receipt.d.ts.map +1 -0
- package/dist/queue-receipt.js +272 -0
- package/dist/queue-receipt.js.map +1 -0
- package/package.json +1 -1
- package/tui/dist/config/config-model.d.ts.map +1 -1
- package/tui/dist/config/config-model.js +2 -0
- package/tui/dist/config/config-model.js.map +1 -1
- package/tui/dist/hydrate.d.ts.map +1 -1
- package/tui/dist/hydrate.js +11 -4
- package/tui/dist/hydrate.js.map +1 -1
- package/tui/dist/pulse/pulse-model.d.ts +1 -0
- package/tui/dist/pulse/pulse-model.d.ts.map +1 -1
- package/tui/dist/pulse/pulse-model.js +7 -3
- package/tui/dist/pulse/pulse-model.js.map +1 -1
- package/tui/dist/pulse/render-pulse.d.ts.map +1 -1
- package/tui/dist/pulse/render-pulse.js +3 -1
- package/tui/dist/pulse/render-pulse.js.map +1 -1
- package/tui/dist/render.d.ts.map +1 -1
- package/tui/dist/render.js +26 -11
- package/tui/dist/render.js.map +1 -1
- package/tui/dist/types.d.ts +3 -0
- package/tui/dist/types.d.ts.map +1 -1
- package/ui/dist/assets/{index-D5n8EwkG.js → index-DhmxKuZf.js} +159 -159
- package/ui/dist/index.html +1 -1
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
// Slice 01 (OPR.0.7.0.1) — Codex usage windows for the provider view. Holds the last reading of
|
|
2
|
+
// this daemon's Codex login in memory, refreshes it only on request (one bounded read; matching
|
|
3
|
+
// overlapping requests share it), and projects rows keyed by allowance identity with freshness
|
|
4
|
+
// kept separate from level. A failed refresh never replaces a reading: the reading stays, with its
|
|
5
|
+
// own time, marked old beside the failure. A daemon restart starts empty.
|
|
6
|
+
import { NEARING_THRESHOLD_PERCENT } from "./host-usage-rollup.js";
|
|
7
|
+
/** A reading is too old to claim current capacity after this (Ops' openrig.subscription-usage.v1 rule). */
|
|
8
|
+
export const USAGE_FRESH_FOR_MS = 15 * 60_000;
|
|
9
|
+
/** An observation up to this far in the future is clock skew within tolerance (same rule). */
|
|
10
|
+
export const USAGE_CLOCK_TOLERANCE_MS = 60_000;
|
|
11
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
12
|
+
const stringOrNull = (value) => (typeof value === "string" && value.length > 0 ? value : null);
|
|
13
|
+
function readWindow(window, raw) {
|
|
14
|
+
if (raw === null || raw === undefined)
|
|
15
|
+
return null;
|
|
16
|
+
if (!isRecord(raw) || typeof raw.usedPercent !== "number" || !Number.isFinite(raw.usedPercent))
|
|
17
|
+
return "bad";
|
|
18
|
+
const resetsAt = typeof raw.resetsAt === "number" && Number.isFinite(raw.resetsAt)
|
|
19
|
+
? new Date(raw.resetsAt * 1000).toISOString()
|
|
20
|
+
: null;
|
|
21
|
+
const durationMins = typeof raw.windowDurationMins === "number" && Number.isFinite(raw.windowDurationMins)
|
|
22
|
+
? raw.windowDurationMins
|
|
23
|
+
: null;
|
|
24
|
+
return { window, durationMins, usedPercent: raw.usedPercent, resetsAt };
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The workspace `account/read` reports, when it reports one: `workspaceRouting.chatgptAccountId` at the top
|
|
28
|
+
* level of the result (a sibling of `account`). Path and types from Codex 0.162.1's generated schema
|
|
29
|
+
* (GetAccountResponse.json), relayed by Build's reviewer: `workspaceRouting` is optional and nullable, and
|
|
30
|
+
* when present `chatgptAccountId` is a non-null string. Its siblings (backendOrigin, accountRoutingOverride)
|
|
31
|
+
* are not identity. Codex 0.153.4's answer has no `workspaceRouting`, so it yields null there.
|
|
32
|
+
*/
|
|
33
|
+
export function accountReadWorkspaceId(account) {
|
|
34
|
+
if (!isRecord(account) || !isRecord(account.workspaceRouting))
|
|
35
|
+
return null;
|
|
36
|
+
return stringOrNull(account.workspaceRouting.chatgptAccountId);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Normalize the two app-server answers (shapes from Codex 0.153.4's protocol: `GetAccountResponse`,
|
|
40
|
+
* `GetAccountRateLimitsResponse`). One reading per metered bucket (`rateLimitsByLimitId`, else the
|
|
41
|
+
* single-bucket `rateLimits`). Identity is the usage answer's `accountId`, else the workspace
|
|
42
|
+
* `account/read` reports, else unresolved; email and plan are labels and never part of identity.
|
|
43
|
+
*/
|
|
44
|
+
export function normalizeCodexUsage(account, rateLimits, observedAt) {
|
|
45
|
+
if (!isRecord(rateLimits))
|
|
46
|
+
return { ok: false, detail: "account/rateLimits/read returned an unrecognized shape" };
|
|
47
|
+
const accountInfo = isRecord(account) && isRecord(account.account) ? account.account : null;
|
|
48
|
+
const email = accountInfo ? stringOrNull(accountInfo.email) : null;
|
|
49
|
+
const accountPlan = accountInfo ? stringOrNull(accountInfo.planType) : null;
|
|
50
|
+
const accountId = stringOrNull(rateLimits.accountId);
|
|
51
|
+
const workspaceId = accountId === null ? accountReadWorkspaceId(account) : null;
|
|
52
|
+
const source = accountId !== null
|
|
53
|
+
? "account/rateLimits/read accountId"
|
|
54
|
+
: workspaceId !== null ? "account/read workspace routing" : "unresolved";
|
|
55
|
+
const buckets = isRecord(rateLimits.rateLimitsByLimitId)
|
|
56
|
+
? Object.entries(rateLimits.rateLimitsByLimitId)
|
|
57
|
+
: isRecord(rateLimits.rateLimits)
|
|
58
|
+
? [[stringOrNull(rateLimits.rateLimits.limitId) ?? "codex", rateLimits.rateLimits]]
|
|
59
|
+
: [];
|
|
60
|
+
if (buckets.length === 0)
|
|
61
|
+
return { ok: false, detail: "account/rateLimits/read returned no rate-limit buckets" };
|
|
62
|
+
const readings = [];
|
|
63
|
+
for (const [limitId, snapshot] of buckets) {
|
|
64
|
+
if (!isRecord(snapshot))
|
|
65
|
+
return { ok: false, detail: `bucket ${limitId} has an unrecognized shape` };
|
|
66
|
+
const windows = [];
|
|
67
|
+
for (const key of ["primary", "secondary"]) {
|
|
68
|
+
const w = readWindow(key, snapshot[key]);
|
|
69
|
+
if (w === "bad")
|
|
70
|
+
return { ok: false, detail: `bucket ${limitId} ${key} window has an unrecognized shape` };
|
|
71
|
+
if (w)
|
|
72
|
+
windows.push(w);
|
|
73
|
+
}
|
|
74
|
+
readings.push({
|
|
75
|
+
identity: {
|
|
76
|
+
accountId,
|
|
77
|
+
workspaceId,
|
|
78
|
+
limitId,
|
|
79
|
+
email,
|
|
80
|
+
planType: stringOrNull(snapshot.planType) ?? accountPlan,
|
|
81
|
+
source,
|
|
82
|
+
},
|
|
83
|
+
windows,
|
|
84
|
+
limitEvidence: stringOrNull(snapshot.rateLimitReachedType),
|
|
85
|
+
observedAt,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return { ok: true, readings };
|
|
89
|
+
}
|
|
90
|
+
/** Freshness is aged from the window's own observation, never from the time of the request. */
|
|
91
|
+
export function usageFreshness(observedAt, now, failedAfter) {
|
|
92
|
+
const observedMs = Date.parse(observedAt);
|
|
93
|
+
const nowMs = Date.parse(now);
|
|
94
|
+
if (!Number.isFinite(observedMs) || !Number.isFinite(nowMs)) {
|
|
95
|
+
return { freshness: "unavailable", freshnessReason: "observation time unreadable" };
|
|
96
|
+
}
|
|
97
|
+
if (observedMs - nowMs > USAGE_CLOCK_TOLERANCE_MS) {
|
|
98
|
+
return { freshness: "unavailable", freshnessReason: "observed in the future beyond the 60 s clock tolerance" };
|
|
99
|
+
}
|
|
100
|
+
if (failedAfter)
|
|
101
|
+
return { freshness: "stale", freshnessReason: `refresh failed at ${failedAfter.at}; this reading is older` };
|
|
102
|
+
if (nowMs - observedMs > USAGE_FRESH_FOR_MS) {
|
|
103
|
+
return { freshness: "stale", freshnessReason: `observed ${Math.round((nowMs - observedMs) / 60_000)} min ago (fresh for 15 min)` };
|
|
104
|
+
}
|
|
105
|
+
return { freshness: "fresh" };
|
|
106
|
+
}
|
|
107
|
+
/** Level of one window as of its observation. Absent data is never nearing or exhausted. */
|
|
108
|
+
export function usageLevel(window, limitEvidence, now) {
|
|
109
|
+
if (window.usedPercent === null)
|
|
110
|
+
return { level: "unknown", levelReason: "no usage reported for this window" };
|
|
111
|
+
const resetMs = window.resetsAt === null ? NaN : Date.parse(window.resetsAt);
|
|
112
|
+
const nowMs = Date.parse(now);
|
|
113
|
+
if (Number.isFinite(resetMs) && Number.isFinite(nowMs) && nowMs >= resetMs) {
|
|
114
|
+
return { level: "unknown", levelReason: `reset passed at ${window.resetsAt}; a new reading is needed` };
|
|
115
|
+
}
|
|
116
|
+
if (window.usedPercent >= 100)
|
|
117
|
+
return { level: "exhausted", levelReason: "at the limit" };
|
|
118
|
+
if (limitEvidence !== null)
|
|
119
|
+
return { level: "exhausted", levelReason: `provider limit evidence: ${limitEvidence}` };
|
|
120
|
+
if (window.usedPercent >= NEARING_THRESHOLD_PERCENT)
|
|
121
|
+
return { level: "nearing", levelReason: `${NEARING_THRESHOLD_PERCENT}% or more used` };
|
|
122
|
+
return { level: "ok" };
|
|
123
|
+
}
|
|
124
|
+
/** The replacement key of a resolved identity. Email is never part of it; an unresolved identity has none. */
|
|
125
|
+
const identityKey = (i) => i.accountId !== null ? `codex:account:${i.accountId}:${i.limitId}`
|
|
126
|
+
: i.workspaceId !== null ? `codex:workspace:${i.workspaceId}:${i.limitId}`
|
|
127
|
+
: null;
|
|
128
|
+
/** Unresolved observations can't be matched to earlier ones, so each read adds its own rows. Keep those
|
|
129
|
+
* from the most recent few reads: enough to compare the latest with the two before it, and bounded
|
|
130
|
+
* because nothing else ever removes them. */
|
|
131
|
+
export const UNRESOLVED_READS_KEPT = 3;
|
|
132
|
+
export class CodexUsageWindows {
|
|
133
|
+
deps;
|
|
134
|
+
now;
|
|
135
|
+
startedAt;
|
|
136
|
+
readings = new Map();
|
|
137
|
+
/** Unresolved observations, grouped by read, newest last; at most UNRESOLVED_READS_KEPT reads. */
|
|
138
|
+
unresolved = [];
|
|
139
|
+
unresolvedDropped = 0;
|
|
140
|
+
lastRefresh = null;
|
|
141
|
+
inflight = null;
|
|
142
|
+
constructor(deps) {
|
|
143
|
+
this.deps = deps;
|
|
144
|
+
this.now = deps.now ?? (() => new Date().toISOString());
|
|
145
|
+
this.startedAt = this.now();
|
|
146
|
+
}
|
|
147
|
+
/** One bounded read. A refresh asked for while one runs joins it; one asked for after it ends reads again. */
|
|
148
|
+
async refresh() {
|
|
149
|
+
if (this.inflight)
|
|
150
|
+
return { refresh: { ...(await this.inflight), coalesced: true } };
|
|
151
|
+
const run = this.runRead();
|
|
152
|
+
this.inflight = run;
|
|
153
|
+
try {
|
|
154
|
+
return { refresh: { ...(await run), coalesced: false } };
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
if (this.inflight === run)
|
|
158
|
+
this.inflight = null;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async runRead() {
|
|
162
|
+
let outcome;
|
|
163
|
+
try {
|
|
164
|
+
outcome = await this.deps.read();
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
outcome = { ok: false, at: this.now(), reason: "spawn_failed", detail: `the reader failed: ${error instanceof Error ? error.message : String(error)}` };
|
|
168
|
+
}
|
|
169
|
+
if (!outcome.ok)
|
|
170
|
+
return this.recordFailure(outcome.at, outcome.reason, outcome.detail);
|
|
171
|
+
const normalized = normalizeCodexUsage(outcome.account, outcome.rateLimits, outcome.observedAt);
|
|
172
|
+
if (!normalized.ok)
|
|
173
|
+
return this.recordFailure(outcome.observedAt, "unrecognized_shape", normalized.detail);
|
|
174
|
+
for (const reading of [...this.readings.values(), ...this.unresolved.flat()])
|
|
175
|
+
reading.latest = false;
|
|
176
|
+
const unresolvedNow = [];
|
|
177
|
+
for (const reading of normalized.readings) {
|
|
178
|
+
const key = identityKey(reading.identity);
|
|
179
|
+
if (key === null)
|
|
180
|
+
unresolvedNow.push({ ...reading, latest: true });
|
|
181
|
+
else
|
|
182
|
+
this.readings.set(key, { ...reading, latest: true });
|
|
183
|
+
}
|
|
184
|
+
if (unresolvedNow.length > 0) {
|
|
185
|
+
this.unresolved.push(unresolvedNow);
|
|
186
|
+
while (this.unresolved.length > UNRESOLVED_READS_KEPT) {
|
|
187
|
+
this.unresolved.shift();
|
|
188
|
+
this.unresolvedDropped += 1;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
this.lastRefresh = { at: outcome.observedAt, outcome: "ok" };
|
|
192
|
+
return this.lastRefresh;
|
|
193
|
+
}
|
|
194
|
+
recordFailure(at, reason, detail) {
|
|
195
|
+
this.lastRefresh = { at, outcome: "failed", reason, detail };
|
|
196
|
+
return this.lastRefresh;
|
|
197
|
+
}
|
|
198
|
+
/** The served rows. Reads memory only: it never starts a native read. */
|
|
199
|
+
project(now) {
|
|
200
|
+
const source = { kind: "codex_app_server", host: "local" };
|
|
201
|
+
const failure = this.lastRefresh?.outcome === "failed" ? this.lastRefresh : null;
|
|
202
|
+
if (this.readings.size === 0 && this.unresolved.length === 0) {
|
|
203
|
+
return [{
|
|
204
|
+
provider: "codex",
|
|
205
|
+
identity: null,
|
|
206
|
+
source,
|
|
207
|
+
observedAt: null,
|
|
208
|
+
seats: "unknown",
|
|
209
|
+
windows: [],
|
|
210
|
+
limitEvidence: null,
|
|
211
|
+
latestFromSource: false,
|
|
212
|
+
lastRefresh: this.lastRefresh,
|
|
213
|
+
currentAvailability: "unknown",
|
|
214
|
+
unavailableReason: failure
|
|
215
|
+
? `refresh failed at ${failure.at}: ${failure.reason}; no earlier reading since the daemon started at ${this.startedAt}`
|
|
216
|
+
: `no reading since the daemon started at ${this.startedAt}; refresh with rig provider status --refresh`,
|
|
217
|
+
}];
|
|
218
|
+
}
|
|
219
|
+
const rows = [];
|
|
220
|
+
const resolved = [...this.readings.entries()].sort(([a], [b]) => a.localeCompare(b)).map(([, reading]) => reading);
|
|
221
|
+
const unresolvedRows = this.unresolved.flat();
|
|
222
|
+
for (const reading of [...resolved, ...unresolvedRows]) {
|
|
223
|
+
const failedAfter = failure && Date.parse(failure.at) >= Date.parse(reading.observedAt) ? failure : null;
|
|
224
|
+
const windows = reading.windows.map((w) => ({
|
|
225
|
+
window: w.window,
|
|
226
|
+
durationMins: w.durationMins,
|
|
227
|
+
usedPercent: w.usedPercent,
|
|
228
|
+
remainingPercent: w.usedPercent === null ? null : Math.max(0, 100 - w.usedPercent),
|
|
229
|
+
resetsAt: w.resetsAt,
|
|
230
|
+
observedAt: reading.observedAt,
|
|
231
|
+
...usageLevel(w, reading.limitEvidence, now),
|
|
232
|
+
...usageFreshness(reading.observedAt, now, failedAfter),
|
|
233
|
+
}));
|
|
234
|
+
const known = reading.latest && failedAfter === null && windows.length > 0
|
|
235
|
+
&& windows.every((w) => w.freshness === "fresh" && w.level !== "unknown");
|
|
236
|
+
rows.push({
|
|
237
|
+
provider: "codex",
|
|
238
|
+
identity: reading.identity,
|
|
239
|
+
source,
|
|
240
|
+
observedAt: reading.observedAt,
|
|
241
|
+
seats: "unknown",
|
|
242
|
+
windows,
|
|
243
|
+
limitEvidence: reading.limitEvidence,
|
|
244
|
+
latestFromSource: reading.latest,
|
|
245
|
+
lastRefresh: this.lastRefresh,
|
|
246
|
+
currentAvailability: known ? "known" : "unknown",
|
|
247
|
+
...(reading.identity.source === "unresolved" ? {
|
|
248
|
+
unresolved: {
|
|
249
|
+
note: "identity unresolved: not matched to, merged with or replacing any other row",
|
|
250
|
+
keptReads: UNRESOLVED_READS_KEPT,
|
|
251
|
+
droppedReads: this.unresolvedDropped,
|
|
252
|
+
},
|
|
253
|
+
} : {}),
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
return rows;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=codex-usage-windows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-usage-windows.js","sourceRoot":"","sources":["../../../src/domain/provider/codex-usage-windows.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type Database from "better-sqlite3";
|
|
2
2
|
import { type AgentActivityStore } from "../agent-activity-store.js";
|
|
3
|
+
import type { CodexUsageWindows, UsageRefreshResult } from "./codex-usage-windows.js";
|
|
3
4
|
import type { ProviderService, ProviderPrecheckInput, ProviderSwitchInput, ProviderSwitchResult } from "./provider-service.js";
|
|
4
5
|
import type { FourBlockReadModel, PrecheckResult, ProviderSignal } from "./provider-types.js";
|
|
5
6
|
export interface ProviderServiceImplDeps {
|
|
@@ -16,11 +17,20 @@ export interface ProviderServiceImplDeps {
|
|
|
16
17
|
warn?: (message: string) => void;
|
|
17
18
|
env?: NodeJS.ProcessEnv;
|
|
18
19
|
now?: () => string;
|
|
20
|
+
/** Slice 01: Codex usage windows, served only while `enabled()` (provider.usage_windows) is true. */
|
|
21
|
+
usageWindows?: {
|
|
22
|
+
enabled: () => boolean;
|
|
23
|
+
windows: CodexUsageWindows;
|
|
24
|
+
};
|
|
19
25
|
}
|
|
20
26
|
export declare class ProviderServiceImpl implements ProviderService {
|
|
21
27
|
private readonly deps;
|
|
22
28
|
constructor(deps: ProviderServiceImplDeps);
|
|
23
29
|
getReadModel(): Promise<FourBlockReadModel>;
|
|
30
|
+
refreshUsage(_provider: "codex"): Promise<UsageRefreshResult | {
|
|
31
|
+
disabled: true;
|
|
32
|
+
}>;
|
|
33
|
+
private usageWindowsEnabled;
|
|
24
34
|
private listSeats;
|
|
25
35
|
precheck(input: ProviderPrecheckInput): Promise<PrecheckResult>;
|
|
26
36
|
switchAccount(input: ProviderSwitchInput): Promise<ProviderSwitchResult>;
|
|
@@ -1 +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,qGAAqG;IACrG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;
|
|
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,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACtF,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,qGAAqG;IACrG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,qGAAqG;IACrG,YAAY,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,OAAO,CAAC;QAAC,OAAO,EAAE,iBAAiB,CAAA;KAAE,CAAC;CACvE;AAED,qBAAa,mBAAoB,YAAW,eAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,uBAAuB;IAEpD,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC;IA2C3C,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,GAAG;QAAE,QAAQ,EAAE,IAAI,CAAA;KAAE,CAAC;IAKxF,OAAO,CAAC,mBAAmB;IAS3B,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"}
|
|
@@ -37,7 +37,7 @@ export class ProviderServiceImpl {
|
|
|
37
37
|
}
|
|
38
38
|
return result.signals;
|
|
39
39
|
};
|
|
40
|
-
|
|
40
|
+
const model = collectFourBlockReadModel({
|
|
41
41
|
readCodexAuth: readAuth,
|
|
42
42
|
listSeats,
|
|
43
43
|
collectSignals: () => [
|
|
@@ -46,6 +46,32 @@ export class ProviderServiceImpl {
|
|
|
46
46
|
],
|
|
47
47
|
now: () => asOf,
|
|
48
48
|
});
|
|
49
|
+
// Slice 01: memory only. A read never starts a native probe (the wake ladder reads this every tick).
|
|
50
|
+
const usage = this.usageWindowsEnabled() ? this.deps.usageWindows.windows.project(asOf) : null;
|
|
51
|
+
if (!usage)
|
|
52
|
+
return model;
|
|
53
|
+
// The read covers only the login active in the daemon's CODEX_HOME: say so whenever saved rig auth
|
|
54
|
+
// profiles exist, so a profile without a row never reads as fine.
|
|
55
|
+
const profiles = model.accounts.filter((a) => a.provider === "codex").map((a) => a.accountId);
|
|
56
|
+
const savedProfiles = profiles.length > 0
|
|
57
|
+
? { names: profiles, note: "saved rig auth profiles: not read (usage unknown); this reading is only the login active in the daemon's CODEX_HOME" }
|
|
58
|
+
: null;
|
|
59
|
+
return { ...model, usage: savedProfiles ? usage.map((row) => ({ ...row, savedProfiles })) : usage };
|
|
60
|
+
}
|
|
61
|
+
async refreshUsage(_provider) {
|
|
62
|
+
if (!this.usageWindowsEnabled())
|
|
63
|
+
return { disabled: true };
|
|
64
|
+
return this.deps.usageWindows.windows.refresh();
|
|
65
|
+
}
|
|
66
|
+
usageWindowsEnabled() {
|
|
67
|
+
if (!this.deps.usageWindows)
|
|
68
|
+
return false;
|
|
69
|
+
try {
|
|
70
|
+
return this.deps.usageWindows.enabled();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
49
75
|
}
|
|
50
76
|
listSeats() {
|
|
51
77
|
const seats = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-service-impl.js","sourceRoot":"","sources":["../../../src/domain/provider/provider-service-impl.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,gGAAgG;AAChG,iGAAiG;AACjG,kGAAkG;AAClG,oGAAoG;AAGpG,OAAO,EACL,2BAA2B,GAE5B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAA0B,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,yBAAyB,EAAqB,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"provider-service-impl.js","sourceRoot":"","sources":["../../../src/domain/provider/provider-service-impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { FourBlockReadModel, PrecheckResult } from "./provider-types.js";
|
|
2
|
+
import type { UsageRefreshResult } from "./codex-usage-windows.js";
|
|
2
3
|
export interface ProviderPrecheckInput {
|
|
3
4
|
seat: string;
|
|
4
5
|
toAccount: string;
|
|
@@ -29,5 +30,9 @@ export interface ProviderService {
|
|
|
29
30
|
precheck(input: ProviderPrecheckInput): Promise<PrecheckResult>;
|
|
30
31
|
/** Precheck-gated switch; returns an explicit business outcome (never a transport error). */
|
|
31
32
|
switchAccount(input: ProviderSwitchInput): Promise<ProviderSwitchResult>;
|
|
33
|
+
/** Slice 01: one bounded native read of the usage windows (coalesced); `disabled` while the switch is off. */
|
|
34
|
+
refreshUsage?(provider: "codex"): Promise<UsageRefreshResult | {
|
|
35
|
+
disabled: true;
|
|
36
|
+
}>;
|
|
32
37
|
}
|
|
33
38
|
//# sourceMappingURL=provider-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-service.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/provider-service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"provider-service.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/provider-service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IAAE,OAAO,EAAE,WAAW,CAAA;CAAE,GACxB;IAAE,OAAO,EAAE,oBAAoB,CAAA;CAAE,GACjC;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;CAAE,CAAC;AAEjE,MAAM,WAAW,eAAe;IAC9B,wFAAwF;IACxF,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5C,kGAAkG;IAClG,QAAQ,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAChE,6FAA6F;IAC7F,aAAa,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzE,8GAA8G;IAC9G,YAAY,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,GAAG;QAAE,QAAQ,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;CACpF"}
|
|
@@ -97,5 +97,70 @@ export interface FourBlockReadModel {
|
|
|
97
97
|
* row per (host, provider) aggregated from the seat-sourced signal rows. Optional so the
|
|
98
98
|
* sealed assembler stays untouched; the collect layer always populates it. */
|
|
99
99
|
hostUsage?: HostUsageRow[];
|
|
100
|
+
/** Slice 01 (OPR.0.7.0.1) — observed usage windows by allowance identity, ADDITIVE and present
|
|
101
|
+
* only while `provider.usage_windows` is on. Read from memory; never probed by a read. */
|
|
102
|
+
usage?: ProviderUsageAllowance[];
|
|
103
|
+
}
|
|
104
|
+
/** Slice 01 — allowance identity: the usage answer's accountId, else the workspace account/read
|
|
105
|
+
* reports, else unresolved; with the bucket (limitId). Email and plan are labels, never identity. */
|
|
106
|
+
export interface UsageAllowanceIdentity {
|
|
107
|
+
accountId: string | null;
|
|
108
|
+
workspaceId: string | null;
|
|
109
|
+
limitId: string;
|
|
110
|
+
email: string | null;
|
|
111
|
+
planType: string | null;
|
|
112
|
+
source: "account/rateLimits/read accountId" | "account/read workspace routing" | "unresolved";
|
|
113
|
+
}
|
|
114
|
+
export interface UsageWindowRow {
|
|
115
|
+
/** The provider-native window name (Codex: primary / secondary). */
|
|
116
|
+
window: string;
|
|
117
|
+
durationMins: number | null;
|
|
118
|
+
usedPercent: number | null;
|
|
119
|
+
/** 100 − usedPercent: a percentage; the provider reports no absolute amount. */
|
|
120
|
+
remainingPercent: number | null;
|
|
121
|
+
resetsAt: string | null;
|
|
122
|
+
/** When the native read answered: freshness ages from this. */
|
|
123
|
+
observedAt: string;
|
|
124
|
+
level: "ok" | "nearing" | "exhausted" | "unknown";
|
|
125
|
+
levelReason?: string;
|
|
126
|
+
freshness: "fresh" | "stale" | "unavailable";
|
|
127
|
+
freshnessReason?: string;
|
|
128
|
+
}
|
|
129
|
+
export interface UsageRefreshOutcome {
|
|
130
|
+
at: string;
|
|
131
|
+
outcome: "ok" | "failed";
|
|
132
|
+
reason?: string;
|
|
133
|
+
detail?: string;
|
|
134
|
+
}
|
|
135
|
+
export interface ProviderUsageAllowance {
|
|
136
|
+
provider: ProviderKind;
|
|
137
|
+
/** Null only for the explicit row of a source never read since the daemon started. */
|
|
138
|
+
identity: UsageAllowanceIdentity | null;
|
|
139
|
+
source: {
|
|
140
|
+
kind: "codex_app_server";
|
|
141
|
+
host: "local";
|
|
142
|
+
};
|
|
143
|
+
observedAt: string | null;
|
|
144
|
+
/** Seat links are not observed by this read. */
|
|
145
|
+
seats: "unknown";
|
|
146
|
+
windows: UsageWindowRow[];
|
|
147
|
+
/** The bucket's provider-reported limit evidence (Codex `rateLimitReachedType`), shown once. */
|
|
148
|
+
limitEvidence: string | null;
|
|
149
|
+
/** False when this row came from an earlier read than the latest one (kept; the latest read didn't match it). */
|
|
150
|
+
latestFromSource: boolean;
|
|
151
|
+
lastRefresh: UsageRefreshOutcome | null;
|
|
152
|
+
currentAvailability: "known" | "unknown";
|
|
153
|
+
unavailableReason?: string;
|
|
154
|
+
/** Present on an unresolved observation: never matched, merged or replaced; kept from the most recent reads. */
|
|
155
|
+
unresolved?: {
|
|
156
|
+
note: string;
|
|
157
|
+
keptReads: number;
|
|
158
|
+
droppedReads: number;
|
|
159
|
+
};
|
|
160
|
+
/** Present when rig auth profiles exist: this read covers only the login active in the daemon's CODEX_HOME. */
|
|
161
|
+
savedProfiles?: {
|
|
162
|
+
names: string[];
|
|
163
|
+
note: string;
|
|
164
|
+
};
|
|
100
165
|
}
|
|
101
166
|
//# sourceMappingURL=provider-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-types.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/provider-types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"provider-types.d.ts","sourceRoot":"","sources":["../../../src/domain/provider/provider-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,8 +35,8 @@ export interface PsEntry {
|
|
|
35
35
|
*/
|
|
36
36
|
hasWorkCount: number;
|
|
37
37
|
status: "running" | "partial" | "stopped";
|
|
38
|
-
/**
|
|
39
|
-
*
|
|
38
|
+
/** Folded from members not explicitly stopped. Empty rigs and rigs whose
|
|
39
|
+
* members are all intentionally stopped derive `stopped`. */
|
|
40
40
|
lifecycleState: RigLifecycleState;
|
|
41
41
|
uptime: string | null;
|
|
42
42
|
latestSnapshot: string | null;
|
|
@@ -109,6 +109,9 @@ export declare function arbitratedNeedsInputSignal(state: Pick<ArbitratedSeatSta
|
|
|
109
109
|
* for whether the rig's latest usable snapshot has a resume token for that node.
|
|
110
110
|
*/
|
|
111
111
|
export declare function deriveRigLifecycleState(nodeStates: NodeLifecycleState[]): RigLifecycleState;
|
|
112
|
+
/** Shared display rollup for ps and the rig summaries consumed by the TUI.
|
|
113
|
+
* Intentionally stopped seats remain in process counts and node diagnostics. */
|
|
114
|
+
export declare function deriveRigLifecycleFromInventory(inventory: readonly Pick<NodeInventoryEntry, "lifecycleState" | "intentionallyStopped">[]): RigLifecycleState;
|
|
112
115
|
/**
|
|
113
116
|
* Slice-05 item-5 (D5) — the SINGLE effective-running predicate for the ps
|
|
114
117
|
* running rollup. `sessions.status='running'` alone is verdict-blind: a seat
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ps-projection.d.ts","sourceRoot":"","sources":["../../src/domain/ps-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE3G,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,wBAAwB,CAAC;AAMlF,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;OAQG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C
|
|
1
|
+
{"version":3,"file":"ps-projection.d.ts","sourceRoot":"","sources":["../../src/domain/ps-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -83,6 +83,11 @@ export function deriveRigLifecycleState(nodeStates) {
|
|
|
83
83
|
}
|
|
84
84
|
return "degraded";
|
|
85
85
|
}
|
|
86
|
+
/** Shared display rollup for ps and the rig summaries consumed by the TUI.
|
|
87
|
+
* Intentionally stopped seats remain in process counts and node diagnostics. */
|
|
88
|
+
export function deriveRigLifecycleFromInventory(inventory) {
|
|
89
|
+
return deriveRigLifecycleState(inventory.filter((entry) => !entry.intentionallyStopped).map((entry) => entry.lifecycleState));
|
|
90
|
+
}
|
|
86
91
|
/**
|
|
87
92
|
* Slice-05 item-5 (D5) — the SINGLE effective-running predicate for the ps
|
|
88
93
|
* running rollup. `sessions.status='running'` alone is verdict-blind: a seat
|
|
@@ -141,14 +146,6 @@ export class PsProjectionService {
|
|
|
141
146
|
r.name,
|
|
142
147
|
r.archived_at as archived_at,
|
|
143
148
|
(SELECT COUNT(*) FROM nodes n WHERE n.rig_id = r.id) as node_count,
|
|
144
|
-
(SELECT COUNT(*) FROM nodes n WHERE n.rig_id = r.id AND
|
|
145
|
-
(SELECT status FROM sessions s WHERE s.node_id = n.id ORDER BY s.created_at DESC, s.id DESC LIMIT 1) = 'running'
|
|
146
|
-
) as running_count,
|
|
147
|
-
(SELECT MIN(s.created_at) FROM sessions s
|
|
148
|
-
JOIN nodes n ON n.id = s.node_id
|
|
149
|
-
WHERE n.rig_id = r.id AND s.status = 'running'
|
|
150
|
-
AND s.id = (SELECT s2.id FROM sessions s2 WHERE s2.node_id = s.node_id ORDER BY s2.created_at DESC, s2.id DESC LIMIT 1)
|
|
151
|
-
) as earliest_running_at,
|
|
152
149
|
(SELECT snap.created_at FROM snapshots snap WHERE snap.rig_id = r.id ORDER BY snap.created_at DESC, snap.id DESC LIMIT 1) as latest_snapshot_at,
|
|
153
150
|
(SELECT COUNT(*) FROM snapshots snap WHERE snap.rig_id = r.id AND snap.kind = 'auto-periodic') as auto_periodic_count
|
|
154
151
|
FROM rigs r
|
|
@@ -164,31 +161,36 @@ export class PsProjectionService {
|
|
|
164
161
|
// FS-1 W1.2: node inventory for ALL rigs built in ONE batched pass (was one
|
|
165
162
|
// getNodeInventory query-set PER RIG — the rig-level N+1); indexed per rig below.
|
|
166
163
|
const inventoryByRig = getNodeInventoryForAllRigs(this.db);
|
|
164
|
+
// Read the current registration's timestamp once per node, in one batch.
|
|
165
|
+
// Uptime membership comes from the same effective-running inventory below.
|
|
166
|
+
const sessionTimes = this.db.prepare(`
|
|
167
|
+
SELECT n.id as node_id,
|
|
168
|
+
(SELECT s.created_at FROM sessions s WHERE s.node_id = n.id ORDER BY s.id DESC LIMIT 1) as created_at
|
|
169
|
+
FROM nodes n JOIN rigs r ON r.id = n.rig_id
|
|
170
|
+
${where}
|
|
171
|
+
`).all();
|
|
172
|
+
const sessionCreatedAt = new Map(sessionTimes.map((row) => [row.node_id, row.created_at]));
|
|
167
173
|
return rows.map((r) => {
|
|
168
174
|
// Derive rig-level lifecycleState by folding per-node states. FS-1 W1.2:
|
|
169
175
|
// inventory for ALL rigs was built in ONE batched pass above (previously one
|
|
170
176
|
// getNodeInventory query-set per rig — the rig-level N+1); index it here.
|
|
171
177
|
const inventory = inventoryByRig.get(r.rig_id) ?? [];
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
//
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
// so the two counts never disagree on liveness. NEVER mutates
|
|
184
|
-
// `sessions.status`.
|
|
185
|
-
const sessionMissingRunning = inventory.filter((n) => n.storedSessionStatus === "running" && !isEffectivelyRunning(n)).length;
|
|
186
|
-
const effectiveRunningCount = Math.max(0, r.running_count - sessionMissingRunning);
|
|
178
|
+
// Count the same current registrations used for lifecycle and activity.
|
|
179
|
+
// Registry IDs stay monotonic through clock rollback within one daemon;
|
|
180
|
+
// created_at does not. Reusing inventory also avoids another per-node sort.
|
|
181
|
+
const running = inventory.filter(isEffectivelyRunning);
|
|
182
|
+
const effectiveRunningCount = running.length;
|
|
183
|
+
let earliestRunningAt = null;
|
|
184
|
+
for (const node of running) {
|
|
185
|
+
const createdAt = sessionCreatedAt.get(node.nodeId);
|
|
186
|
+
if (createdAt != null && (earliestRunningAt === null || createdAt < earliestRunningAt))
|
|
187
|
+
earliestRunningAt = createdAt;
|
|
188
|
+
}
|
|
187
189
|
const status = r.node_count === 0 ? "stopped"
|
|
188
190
|
: effectiveRunningCount === r.node_count ? "running"
|
|
189
191
|
: effectiveRunningCount > 0 ? "partial"
|
|
190
192
|
: "stopped";
|
|
191
|
-
const lifecycleState =
|
|
193
|
+
const lifecycleState = deriveRigLifecycleFromInventory(inventory);
|
|
192
194
|
// Slice 15 — `terminal-active` count. Subset of running tmux-bound
|
|
193
195
|
// seats whose latest SeatActivity observation says
|
|
194
196
|
// `isActiveWithinWindow === true`. Sourced ONLY from the activity
|
|
@@ -250,7 +252,7 @@ export class PsProjectionService {
|
|
|
250
252
|
hasWorkCount,
|
|
251
253
|
status,
|
|
252
254
|
lifecycleState,
|
|
253
|
-
uptime:
|
|
255
|
+
uptime: earliestRunningAt ? formatDuration(now - new Date(earliestRunningAt + "Z").getTime()) : null,
|
|
254
256
|
latestSnapshot: r.latest_snapshot_at ? formatAge(now - new Date(r.latest_snapshot_at + "Z").getTime()) : null,
|
|
255
257
|
archivedAt: r.archived_at,
|
|
256
258
|
isArchived: r.archived_at !== null,
|