@coool/opencode-adaptive 0.0.0-stage → 1.0.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/LICENSE +21 -0
- package/README.md +98 -2
- package/dist/adapters/codex-capacity/index.d.ts +5 -0
- package/dist/adapters/codex-capacity/index.d.ts.map +1 -0
- package/dist/adapters/codex-capacity/index.js +5 -0
- package/dist/adapters/codex-capacity/index.js.map +1 -0
- package/dist/adapters/codex-capacity/parse.d.ts +28 -0
- package/dist/adapters/codex-capacity/parse.d.ts.map +1 -0
- package/dist/adapters/codex-capacity/parse.js +130 -0
- package/dist/adapters/codex-capacity/parse.js.map +1 -0
- package/dist/adapters/codex-capacity/reading.d.ts +10 -0
- package/dist/adapters/codex-capacity/reading.d.ts.map +1 -0
- package/dist/adapters/codex-capacity/reading.js +45 -0
- package/dist/adapters/codex-capacity/reading.js.map +1 -0
- package/dist/adapters/codex-capacity/sensor.d.ts +24 -0
- package/dist/adapters/codex-capacity/sensor.d.ts.map +1 -0
- package/dist/adapters/codex-capacity/sensor.js +30 -0
- package/dist/adapters/codex-capacity/sensor.js.map +1 -0
- package/dist/adapters/codex-capacity/types.d.ts +35 -0
- package/dist/adapters/codex-capacity/types.d.ts.map +1 -0
- package/dist/adapters/codex-capacity/types.js +4 -0
- package/dist/adapters/codex-capacity/types.js.map +1 -0
- package/dist/adapters/opencode/escalation-tool.d.ts +52 -0
- package/dist/adapters/opencode/escalation-tool.d.ts.map +1 -0
- package/dist/adapters/opencode/escalation-tool.js +59 -0
- package/dist/adapters/opencode/escalation-tool.js.map +1 -0
- package/dist/adapters/opencode/events.d.ts +24 -0
- package/dist/adapters/opencode/events.d.ts.map +1 -0
- package/dist/adapters/opencode/events.js +68 -0
- package/dist/adapters/opencode/events.js.map +1 -0
- package/dist/adapters/opencode/hooks.d.ts +35 -0
- package/dist/adapters/opencode/hooks.d.ts.map +1 -0
- package/dist/adapters/opencode/hooks.js +12 -0
- package/dist/adapters/opencode/hooks.js.map +1 -0
- package/dist/adapters/opencode/index.d.ts +17 -0
- package/dist/adapters/opencode/index.d.ts.map +1 -0
- package/dist/adapters/opencode/index.js +9 -0
- package/dist/adapters/opencode/index.js.map +1 -0
- package/dist/adapters/opencode/inventory.d.ts +31 -0
- package/dist/adapters/opencode/inventory.d.ts.map +1 -0
- package/dist/adapters/opencode/inventory.js +53 -0
- package/dist/adapters/opencode/inventory.js.map +1 -0
- package/dist/adapters/opencode/report.d.ts +92 -0
- package/dist/adapters/opencode/report.d.ts.map +1 -0
- package/dist/adapters/opencode/report.js +145 -0
- package/dist/adapters/opencode/report.js.map +1 -0
- package/dist/adapters/opencode/session-ops.d.ts +40 -0
- package/dist/adapters/opencode/session-ops.d.ts.map +1 -0
- package/dist/adapters/opencode/session-ops.js +32 -0
- package/dist/adapters/opencode/session-ops.js.map +1 -0
- package/dist/adapters/opencode/storage.d.ts +16 -0
- package/dist/adapters/opencode/storage.d.ts.map +1 -0
- package/dist/adapters/opencode/storage.js +8 -0
- package/dist/adapters/opencode/storage.js.map +1 -0
- package/dist/adapters/opencode/tier-tool.d.ts +38 -0
- package/dist/adapters/opencode/tier-tool.d.ts.map +1 -0
- package/dist/adapters/opencode/tier-tool.js +72 -0
- package/dist/adapters/opencode/tier-tool.js.map +1 -0
- package/dist/adapters/opencode/types.d.ts +102 -0
- package/dist/adapters/opencode/types.d.ts.map +1 -0
- package/dist/adapters/opencode/types.js +2 -0
- package/dist/adapters/opencode/types.js.map +1 -0
- package/dist/core/compatibility/gate.d.ts +10 -0
- package/dist/core/compatibility/gate.d.ts.map +1 -0
- package/dist/core/compatibility/gate.js +55 -0
- package/dist/core/compatibility/gate.js.map +1 -0
- package/dist/core/compatibility/index.d.ts +3 -0
- package/dist/core/compatibility/index.d.ts.map +1 -0
- package/dist/core/compatibility/index.js +3 -0
- package/dist/core/compatibility/index.js.map +1 -0
- package/dist/core/compatibility/types.d.ts +54 -0
- package/dist/core/compatibility/types.d.ts.map +1 -0
- package/dist/core/compatibility/types.js +27 -0
- package/dist/core/compatibility/types.js.map +1 -0
- package/dist/core/scheduler/admit.d.ts +7 -0
- package/dist/core/scheduler/admit.d.ts.map +1 -0
- package/dist/core/scheduler/admit.js +153 -0
- package/dist/core/scheduler/admit.js.map +1 -0
- package/dist/core/scheduler/escalate.d.ts +7 -0
- package/dist/core/scheduler/escalate.d.ts.map +1 -0
- package/dist/core/scheduler/escalate.js +56 -0
- package/dist/core/scheduler/escalate.js.map +1 -0
- package/dist/core/scheduler/index.d.ts +5 -0
- package/dist/core/scheduler/index.d.ts.map +1 -0
- package/dist/core/scheduler/index.js +5 -0
- package/dist/core/scheduler/index.js.map +1 -0
- package/dist/core/scheduler/mode.d.ts +9 -0
- package/dist/core/scheduler/mode.d.ts.map +1 -0
- package/dist/core/scheduler/mode.js +10 -0
- package/dist/core/scheduler/mode.js.map +1 -0
- package/dist/core/scheduler/types.d.ts +143 -0
- package/dist/core/scheduler/types.d.ts.map +1 -0
- package/dist/core/scheduler/types.js +74 -0
- package/dist/core/scheduler/types.js.map +1 -0
- package/dist/core/tier-policy/index.d.ts +4 -0
- package/dist/core/tier-policy/index.d.ts.map +1 -0
- package/dist/core/tier-policy/index.js +4 -0
- package/dist/core/tier-policy/index.js.map +1 -0
- package/dist/core/tier-policy/resolve.d.ts +19 -0
- package/dist/core/tier-policy/resolve.d.ts.map +1 -0
- package/dist/core/tier-policy/resolve.js +52 -0
- package/dist/core/tier-policy/resolve.js.map +1 -0
- package/dist/core/tier-policy/tier-list.d.ts +11 -0
- package/dist/core/tier-policy/tier-list.d.ts.map +1 -0
- package/dist/core/tier-policy/tier-list.js +23 -0
- package/dist/core/tier-policy/tier-list.js.map +1 -0
- package/dist/core/tier-policy/types.d.ts +85 -0
- package/dist/core/tier-policy/types.d.ts.map +1 -0
- package/dist/core/tier-policy/types.js +45 -0
- package/dist/core/tier-policy/types.js.map +1 -0
- package/dist/core/work-unit/index.d.ts +4 -0
- package/dist/core/work-unit/index.d.ts.map +1 -0
- package/dist/core/work-unit/index.js +4 -0
- package/dist/core/work-unit/index.js.map +1 -0
- package/dist/core/work-unit/interruption.d.ts +8 -0
- package/dist/core/work-unit/interruption.d.ts.map +1 -0
- package/dist/core/work-unit/interruption.js +12 -0
- package/dist/core/work-unit/interruption.js.map +1 -0
- package/dist/core/work-unit/tracker.d.ts +46 -0
- package/dist/core/work-unit/tracker.d.ts.map +1 -0
- package/dist/core/work-unit/tracker.js +136 -0
- package/dist/core/work-unit/tracker.js.map +1 -0
- package/dist/core/work-unit/types.d.ts +146 -0
- package/dist/core/work-unit/types.d.ts.map +1 -0
- package/dist/core/work-unit/types.js +23 -0
- package/dist/core/work-unit/types.js.map +1 -0
- package/dist/execution/continuation/execute.d.ts +19 -0
- package/dist/execution/continuation/execute.d.ts.map +1 -0
- package/dist/execution/continuation/execute.js +31 -0
- package/dist/execution/continuation/execute.js.map +1 -0
- package/dist/execution/continuation/index.d.ts +6 -0
- package/dist/execution/continuation/index.d.ts.map +1 -0
- package/dist/execution/continuation/index.js +5 -0
- package/dist/execution/continuation/index.js.map +1 -0
- package/dist/execution/continuation/ledger.d.ts +20 -0
- package/dist/execution/continuation/ledger.d.ts.map +1 -0
- package/dist/execution/continuation/ledger.js +31 -0
- package/dist/execution/continuation/ledger.js.map +1 -0
- package/dist/execution/continuation/plan.d.ts +13 -0
- package/dist/execution/continuation/plan.d.ts.map +1 -0
- package/dist/execution/continuation/plan.js +20 -0
- package/dist/execution/continuation/plan.js.map +1 -0
- package/dist/execution/continuation/prompts.d.ts +8 -0
- package/dist/execution/continuation/prompts.d.ts.map +1 -0
- package/dist/execution/continuation/prompts.js +8 -0
- package/dist/execution/continuation/prompts.js.map +1 -0
- package/dist/execution/continuation/types.d.ts +70 -0
- package/dist/execution/continuation/types.d.ts.map +1 -0
- package/dist/execution/continuation/types.js +15 -0
- package/dist/execution/continuation/types.js.map +1 -0
- package/dist/execution/escalation/index.d.ts +2 -0
- package/dist/execution/escalation/index.d.ts.map +1 -0
- package/dist/execution/escalation/index.js +2 -0
- package/dist/execution/escalation/index.js.map +1 -0
- package/dist/execution/escalation/types.d.ts +31 -0
- package/dist/execution/escalation/types.d.ts.map +1 -0
- package/dist/execution/escalation/types.js +49 -0
- package/dist/execution/escalation/types.js.map +1 -0
- package/dist/execution/index.d.ts +5 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +5 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/parking/index.d.ts +3 -0
- package/dist/execution/parking/index.d.ts.map +1 -0
- package/dist/execution/parking/index.js +2 -0
- package/dist/execution/parking/index.js.map +1 -0
- package/dist/execution/parking/plan.d.ts +40 -0
- package/dist/execution/parking/plan.d.ts.map +1 -0
- package/dist/execution/parking/plan.js +34 -0
- package/dist/execution/parking/plan.js.map +1 -0
- package/dist/execution/recovery/gate.d.ts +20 -0
- package/dist/execution/recovery/gate.d.ts.map +1 -0
- package/dist/execution/recovery/gate.js +23 -0
- package/dist/execution/recovery/gate.js.map +1 -0
- package/dist/execution/recovery/index.d.ts +3 -0
- package/dist/execution/recovery/index.d.ts.map +1 -0
- package/dist/execution/recovery/index.js +2 -0
- package/dist/execution/recovery/index.js.map +1 -0
- package/dist/execution/retry/decide.d.ts +30 -0
- package/dist/execution/retry/decide.d.ts.map +1 -0
- package/dist/execution/retry/decide.js +76 -0
- package/dist/execution/retry/decide.js.map +1 -0
- package/dist/execution/retry/index.d.ts +3 -0
- package/dist/execution/retry/index.d.ts.map +1 -0
- package/dist/execution/retry/index.js +3 -0
- package/dist/execution/retry/index.js.map +1 -0
- package/dist/execution/retry/types.d.ts +66 -0
- package/dist/execution/retry/types.d.ts.map +1 -0
- package/dist/execution/retry/types.js +9 -0
- package/dist/execution/retry/types.js.map +1 -0
- package/dist/gui-experimental.cjs +1 -0
- package/dist/gui.d.ts +17 -0
- package/dist/gui.d.ts.map +1 -0
- package/dist/gui.js +70 -0
- package/dist/gui.js.map +1 -0
- package/dist/health/capacity/index.d.ts +4 -0
- package/dist/health/capacity/index.d.ts.map +1 -0
- package/dist/health/capacity/index.js +4 -0
- package/dist/health/capacity/index.js.map +1 -0
- package/dist/health/capacity/merge.d.ts +58 -0
- package/dist/health/capacity/merge.d.ts.map +1 -0
- package/dist/health/capacity/merge.js +154 -0
- package/dist/health/capacity/merge.js.map +1 -0
- package/dist/health/capacity/registry.d.ts +41 -0
- package/dist/health/capacity/registry.d.ts.map +1 -0
- package/dist/health/capacity/registry.js +106 -0
- package/dist/health/capacity/registry.js.map +1 -0
- package/dist/health/capacity/types.d.ts +74 -0
- package/dist/health/capacity/types.d.ts.map +1 -0
- package/dist/health/capacity/types.js +6 -0
- package/dist/health/capacity/types.js.map +1 -0
- package/dist/health/circuit-breaker/breaker.d.ts +84 -0
- package/dist/health/circuit-breaker/breaker.d.ts.map +1 -0
- package/dist/health/circuit-breaker/breaker.js +132 -0
- package/dist/health/circuit-breaker/breaker.js.map +1 -0
- package/dist/health/circuit-breaker/index.d.ts +3 -0
- package/dist/health/circuit-breaker/index.d.ts.map +1 -0
- package/dist/health/circuit-breaker/index.js +3 -0
- package/dist/health/circuit-breaker/index.js.map +1 -0
- package/dist/health/circuit-breaker/types.d.ts +53 -0
- package/dist/health/circuit-breaker/types.d.ts.map +1 -0
- package/dist/health/circuit-breaker/types.js +13 -0
- package/dist/health/circuit-breaker/types.js.map +1 -0
- package/dist/health/classifier/classify.d.ts +9 -0
- package/dist/health/classifier/classify.d.ts.map +1 -0
- package/dist/health/classifier/classify.js +245 -0
- package/dist/health/classifier/classify.js.map +1 -0
- package/dist/health/classifier/index.d.ts +3 -0
- package/dist/health/classifier/index.d.ts.map +1 -0
- package/dist/health/classifier/index.js +3 -0
- package/dist/health/classifier/index.js.map +1 -0
- package/dist/health/classifier/types.d.ts +72 -0
- package/dist/health/classifier/types.d.ts.map +1 -0
- package/dist/health/classifier/types.js +27 -0
- package/dist/health/classifier/types.js.map +1 -0
- package/dist/health/index.d.ts +5 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +5 -0
- package/dist/health/index.js.map +1 -0
- package/dist/health/resource-health/index.d.ts +5 -0
- package/dist/health/resource-health/index.d.ts.map +1 -0
- package/dist/health/resource-health/index.js +5 -0
- package/dist/health/resource-health/index.js.map +1 -0
- package/dist/health/resource-health/key.d.ts +19 -0
- package/dist/health/resource-health/key.d.ts.map +1 -0
- package/dist/health/resource-health/key.js +54 -0
- package/dist/health/resource-health/key.js.map +1 -0
- package/dist/health/resource-health/registry.d.ts +41 -0
- package/dist/health/resource-health/registry.d.ts.map +1 -0
- package/dist/health/resource-health/registry.js +258 -0
- package/dist/health/resource-health/registry.js.map +1 -0
- package/dist/health/resource-health/transitions.d.ts +11 -0
- package/dist/health/resource-health/transitions.d.ts.map +1 -0
- package/dist/health/resource-health/transitions.js +165 -0
- package/dist/health/resource-health/transitions.js.map +1 -0
- package/dist/health/resource-health/types.d.ts +116 -0
- package/dist/health/resource-health/types.d.ts.map +1 -0
- package/dist/health/resource-health/types.js +43 -0
- package/dist/health/resource-health/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin-id.d.ts +3 -0
- package/dist/plugin-id.d.ts.map +1 -0
- package/dist/plugin-id.js +3 -0
- package/dist/plugin-id.js.map +1 -0
- package/dist/rpc/definition.d.ts +100 -0
- package/dist/rpc/definition.d.ts.map +1 -0
- package/dist/rpc/definition.js +104 -0
- package/dist/rpc/definition.js.map +1 -0
- package/dist/rpc/handlers.d.ts +65 -0
- package/dist/rpc/handlers.d.ts.map +1 -0
- package/dist/rpc/handlers.js +111 -0
- package/dist/rpc/handlers.js.map +1 -0
- package/dist/rpc/status.d.ts +43 -0
- package/dist/rpc/status.d.ts.map +1 -0
- package/dist/rpc/status.js +45 -0
- package/dist/rpc/status.js.map +1 -0
- package/dist/rpc.d.ts +11 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +8 -0
- package/dist/rpc.js.map +1 -0
- package/dist/state/capacity/index.d.ts +4 -0
- package/dist/state/capacity/index.d.ts.map +1 -0
- package/dist/state/capacity/index.js +4 -0
- package/dist/state/capacity/index.js.map +1 -0
- package/dist/state/capacity/parse.d.ts +3 -0
- package/dist/state/capacity/parse.d.ts.map +1 -0
- package/dist/state/capacity/parse.js +110 -0
- package/dist/state/capacity/parse.js.map +1 -0
- package/dist/state/capacity/store.d.ts +19 -0
- package/dist/state/capacity/store.d.ts.map +1 -0
- package/dist/state/capacity/store.js +64 -0
- package/dist/state/capacity/store.js.map +1 -0
- package/dist/state/capacity/types.d.ts +38 -0
- package/dist/state/capacity/types.d.ts.map +1 -0
- package/dist/state/capacity/types.js +11 -0
- package/dist/state/capacity/types.js.map +1 -0
- package/dist/state/health/index.d.ts +5 -0
- package/dist/state/health/index.d.ts.map +1 -0
- package/dist/state/health/index.js +4 -0
- package/dist/state/health/index.js.map +1 -0
- package/dist/state/health/parse.d.ts +3 -0
- package/dist/state/health/parse.d.ts.map +1 -0
- package/dist/state/health/parse.js +121 -0
- package/dist/state/health/parse.js.map +1 -0
- package/dist/state/health/store.d.ts +18 -0
- package/dist/state/health/store.d.ts.map +1 -0
- package/dist/state/health/store.js +55 -0
- package/dist/state/health/store.js.map +1 -0
- package/dist/state/health/types.d.ts +24 -0
- package/dist/state/health/types.d.ts.map +1 -0
- package/dist/state/health/types.js +5 -0
- package/dist/state/health/types.js.map +1 -0
- package/dist/state/parked-work/index.d.ts +5 -0
- package/dist/state/parked-work/index.d.ts.map +1 -0
- package/dist/state/parked-work/index.js +4 -0
- package/dist/state/parked-work/index.js.map +1 -0
- package/dist/state/parked-work/parse.d.ts +7 -0
- package/dist/state/parked-work/parse.d.ts.map +1 -0
- package/dist/state/parked-work/parse.js +83 -0
- package/dist/state/parked-work/parse.js.map +1 -0
- package/dist/state/parked-work/store.d.ts +18 -0
- package/dist/state/parked-work/store.d.ts.map +1 -0
- package/dist/state/parked-work/store.js +81 -0
- package/dist/state/parked-work/store.js.map +1 -0
- package/dist/state/parked-work/types.d.ts +42 -0
- package/dist/state/parked-work/types.d.ts.map +1 -0
- package/dist/state/parked-work/types.js +7 -0
- package/dist/state/parked-work/types.js.map +1 -0
- package/dist/state/receipts/bound.d.ts +15 -0
- package/dist/state/receipts/bound.d.ts.map +1 -0
- package/dist/state/receipts/bound.js +77 -0
- package/dist/state/receipts/bound.js.map +1 -0
- package/dist/state/receipts/index.d.ts +7 -0
- package/dist/state/receipts/index.d.ts.map +1 -0
- package/dist/state/receipts/index.js +5 -0
- package/dist/state/receipts/index.js.map +1 -0
- package/dist/state/receipts/parse.d.ts +7 -0
- package/dist/state/receipts/parse.d.ts.map +1 -0
- package/dist/state/receipts/parse.js +226 -0
- package/dist/state/receipts/parse.js.map +1 -0
- package/dist/state/receipts/store.d.ts +35 -0
- package/dist/state/receipts/store.d.ts.map +1 -0
- package/dist/state/receipts/store.js +128 -0
- package/dist/state/receipts/store.js.map +1 -0
- package/dist/state/receipts/types.d.ts +62 -0
- package/dist/state/receipts/types.d.ts.map +1 -0
- package/dist/state/receipts/types.js +12 -0
- package/dist/state/receipts/types.js.map +1 -0
- package/dist/state/session-modes/index.d.ts +5 -0
- package/dist/state/session-modes/index.d.ts.map +1 -0
- package/dist/state/session-modes/index.js +4 -0
- package/dist/state/session-modes/index.js.map +1 -0
- package/dist/state/session-modes/parse.d.ts +9 -0
- package/dist/state/session-modes/parse.d.ts.map +1 -0
- package/dist/state/session-modes/parse.js +62 -0
- package/dist/state/session-modes/parse.js.map +1 -0
- package/dist/state/session-modes/store.d.ts +21 -0
- package/dist/state/session-modes/store.d.ts.map +1 -0
- package/dist/state/session-modes/store.js +73 -0
- package/dist/state/session-modes/store.js.map +1 -0
- package/dist/state/session-modes/types.d.ts +42 -0
- package/dist/state/session-modes/types.d.ts.map +1 -0
- package/dist/state/session-modes/types.js +7 -0
- package/dist/state/session-modes/types.js.map +1 -0
- package/dist/state/settings/index.d.ts +5 -0
- package/dist/state/settings/index.d.ts.map +1 -0
- package/dist/state/settings/index.js +4 -0
- package/dist/state/settings/index.js.map +1 -0
- package/dist/state/settings/parse.d.ts +34 -0
- package/dist/state/settings/parse.d.ts.map +1 -0
- package/dist/state/settings/parse.js +261 -0
- package/dist/state/settings/parse.js.map +1 -0
- package/dist/state/settings/store.d.ts +22 -0
- package/dist/state/settings/store.d.ts.map +1 -0
- package/dist/state/settings/store.js +57 -0
- package/dist/state/settings/store.js.map +1 -0
- package/dist/state/settings/types.d.ts +63 -0
- package/dist/state/settings/types.d.ts.map +1 -0
- package/dist/state/settings/types.js +12 -0
- package/dist/state/settings/types.js.map +1 -0
- package/dist/supervisor/index.d.ts +5 -0
- package/dist/supervisor/index.d.ts.map +1 -0
- package/dist/supervisor/index.js +4 -0
- package/dist/supervisor/index.js.map +1 -0
- package/dist/supervisor/log.d.ts +11 -0
- package/dist/supervisor/log.d.ts.map +1 -0
- package/dist/supervisor/log.js +14 -0
- package/dist/supervisor/log.js.map +1 -0
- package/dist/supervisor/supervisor.d.ts +69 -0
- package/dist/supervisor/supervisor.d.ts.map +1 -0
- package/dist/supervisor/supervisor.js +1343 -0
- package/dist/supervisor/supervisor.js.map +1 -0
- package/dist/supervisor/types.d.ts +50 -0
- package/dist/supervisor/types.d.ts.map +1 -0
- package/dist/supervisor/types.js +3 -0
- package/dist/supervisor/types.js.map +1 -0
- package/dist/supervisor/view.d.ts +4 -0
- package/dist/supervisor/view.d.ts.map +1 -0
- package/dist/supervisor/view.js +4 -0
- package/dist/supervisor/view.js.map +1 -0
- package/dist/tui.d.ts +16 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +252 -0
- package/dist/tui.js.map +1 -0
- package/dist/ui/gui/api.d.ts +18 -0
- package/dist/ui/gui/api.d.ts.map +1 -0
- package/dist/ui/gui/api.js +21 -0
- package/dist/ui/gui/api.js.map +1 -0
- package/dist/ui/gui/view.d.ts +27 -0
- package/dist/ui/gui/view.d.ts.map +1 -0
- package/dist/ui/gui/view.js +49 -0
- package/dist/ui/gui/view.js.map +1 -0
- package/dist/ui/tui/controller.d.ts +98 -0
- package/dist/ui/tui/controller.d.ts.map +1 -0
- package/dist/ui/tui/controller.js +399 -0
- package/dist/ui/tui/controller.js.map +1 -0
- package/dist/ui/tui/menu.d.ts +56 -0
- package/dist/ui/tui/menu.d.ts.map +1 -0
- package/dist/ui/tui/menu.js +176 -0
- package/dist/ui/tui/menu.js.map +1 -0
- package/dist/ui/tui/options.d.ts +20 -0
- package/dist/ui/tui/options.d.ts.map +1 -0
- package/dist/ui/tui/options.js +17 -0
- package/dist/ui/tui/options.js.map +1 -0
- package/dist/ui/tui/receipts.d.ts +22 -0
- package/dist/ui/tui/receipts.d.ts.map +1 -0
- package/dist/ui/tui/receipts.js +109 -0
- package/dist/ui/tui/receipts.js.map +1 -0
- package/dist/ui/tui/status.d.ts +23 -0
- package/dist/ui/tui/status.d.ts.map +1 -0
- package/dist/ui/tui/status.js +90 -0
- package/dist/ui/tui/status.js.map +1 -0
- package/dist/ui/tui/tiers.d.ts +52 -0
- package/dist/ui/tui/tiers.d.ts.map +1 -0
- package/dist/ui/tui/tiers.js +108 -0
- package/dist/ui/tui/tiers.js.map +1 -0
- package/package.json +85 -4
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource health registry (ADP-007, ADP-019, ADP-021).
|
|
3
|
+
*
|
|
4
|
+
* Stateful façade over the pure transition layer: one record per resource
|
|
5
|
+
* key, an injected clock, and assessment that composes the record's chain of
|
|
6
|
+
* ancestor scopes. Time only advances through the injected clock — there are
|
|
7
|
+
* no timers; windows and breaker backoffs are evaluated (swept) lazily on
|
|
8
|
+
* every observation, assessment, and snapshot.
|
|
9
|
+
*
|
|
10
|
+
* The single-probe guarantee (ADP-019) lives here: `assess` synchronously
|
|
11
|
+
* flips a due open breaker to half-open and issues the probe ticket, so
|
|
12
|
+
* concurrent assessors can never observe two admissions.
|
|
13
|
+
*/
|
|
14
|
+
import { admitProbe, breakerBlockWait, expireProbe, recordProbeFailure, recordProbeSuccess, } from "../circuit-breaker/breaker.js";
|
|
15
|
+
import { resourceChain, resourceKeyID } from "./key.js";
|
|
16
|
+
import { applyHealthEvent, initialRecord, sweepRecord } from "./transitions.js";
|
|
17
|
+
import { DEFAULT_HEALTH_CONFIG, } from "./types.js";
|
|
18
|
+
/**
|
|
19
|
+
* Severity of the three hard resource states. Used only to choose which
|
|
20
|
+
* blocker a report names when several scopes in a chain are blocked at once;
|
|
21
|
+
* every candidate still blocks regardless of which wins the report.
|
|
22
|
+
*/
|
|
23
|
+
const HARD_BLOCK_SEVERITY = {
|
|
24
|
+
unavailable: 3,
|
|
25
|
+
"quota-exhausted": 2,
|
|
26
|
+
"rate-limited": 1,
|
|
27
|
+
};
|
|
28
|
+
function blocked(reason, key, retryAtMs) {
|
|
29
|
+
if (retryAtMs === undefined) {
|
|
30
|
+
return { kind: "blocked", reason, key };
|
|
31
|
+
}
|
|
32
|
+
return { kind: "blocked", reason, key, retryAtMs };
|
|
33
|
+
}
|
|
34
|
+
function hardBlocker(record, now) {
|
|
35
|
+
const retryAtMs = record.window === undefined ? undefined : record.window.until - now;
|
|
36
|
+
switch (record.health) {
|
|
37
|
+
case "unavailable":
|
|
38
|
+
return {
|
|
39
|
+
reason: "unavailable",
|
|
40
|
+
key: record.key,
|
|
41
|
+
retryAtMs: undefined,
|
|
42
|
+
severity: HARD_BLOCK_SEVERITY.unavailable,
|
|
43
|
+
};
|
|
44
|
+
case "quota_exhausted":
|
|
45
|
+
return {
|
|
46
|
+
reason: "quota-exhausted",
|
|
47
|
+
key: record.key,
|
|
48
|
+
retryAtMs,
|
|
49
|
+
severity: HARD_BLOCK_SEVERITY["quota-exhausted"],
|
|
50
|
+
};
|
|
51
|
+
case "rate_limited":
|
|
52
|
+
return {
|
|
53
|
+
reason: "rate-limited",
|
|
54
|
+
key: record.key,
|
|
55
|
+
retryAtMs,
|
|
56
|
+
severity: HARD_BLOCK_SEVERITY["rate-limited"],
|
|
57
|
+
};
|
|
58
|
+
default:
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** Most severe hard block across a chain; narrowest scope wins ties. */
|
|
63
|
+
function hardest(records, now) {
|
|
64
|
+
let hard;
|
|
65
|
+
for (const record of records) {
|
|
66
|
+
if (record === undefined) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const candidate = hardBlocker(record, now);
|
|
70
|
+
if (candidate === undefined) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (hard === undefined || candidate.severity >= hard.severity) {
|
|
74
|
+
hard = candidate;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return hard;
|
|
78
|
+
}
|
|
79
|
+
export class ResourceHealthRegistry {
|
|
80
|
+
#records = new Map();
|
|
81
|
+
#clock;
|
|
82
|
+
#config;
|
|
83
|
+
#probeCounter = 0;
|
|
84
|
+
constructor(clock, config = DEFAULT_HEALTH_CONFIG) {
|
|
85
|
+
this.#clock = clock;
|
|
86
|
+
this.#config = config;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Seeds the registry from persisted records (restart / cross-instance
|
|
90
|
+
* reload). Records are swept against the current clock and inserted
|
|
91
|
+
* without persisting — hydration must not write back what it just read.
|
|
92
|
+
* A hydrated half_open record cannot keep its probe (the ticket lived in
|
|
93
|
+
* the previous instance's memory), so it re-opens due immediately — its
|
|
94
|
+
* backoff window had already elapsed when it went half-open, and the next
|
|
95
|
+
* assessment admits exactly one probe as usual.
|
|
96
|
+
*/
|
|
97
|
+
hydrate(records) {
|
|
98
|
+
const now = this.#clock();
|
|
99
|
+
for (const record of records) {
|
|
100
|
+
const swept = sweepRecord(record, now);
|
|
101
|
+
const breaker = swept.breaker.state === "half_open"
|
|
102
|
+
? {
|
|
103
|
+
state: "open",
|
|
104
|
+
failures: swept.breaker.failures,
|
|
105
|
+
openCount: swept.breaker.openCount,
|
|
106
|
+
reopenAt: now,
|
|
107
|
+
}
|
|
108
|
+
: swept.breaker;
|
|
109
|
+
this.#records.set(resourceKeyID(swept.key), { ...swept, breaker, updatedAt: now });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
observe(event) {
|
|
113
|
+
const now = this.#clock();
|
|
114
|
+
const id = resourceKeyID(event.key);
|
|
115
|
+
const existing = this.#records.get(id);
|
|
116
|
+
const swept = existing === undefined ? initialRecord(event.key, now) : sweepRecord(existing, now);
|
|
117
|
+
const updated = applyHealthEvent(swept, event, now, this.#config);
|
|
118
|
+
this.#records.set(id, updated);
|
|
119
|
+
return updated;
|
|
120
|
+
}
|
|
121
|
+
#sweptRecord(key, now) {
|
|
122
|
+
const id = resourceKeyID(key);
|
|
123
|
+
const record = this.#records.get(id);
|
|
124
|
+
if (record === undefined) {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
const swept = sweepRecord(record, now);
|
|
128
|
+
if (swept !== record) {
|
|
129
|
+
this.#records.set(id, swept);
|
|
130
|
+
}
|
|
131
|
+
return swept;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Assesses whether the resource may take new work right now, composing the
|
|
135
|
+
* full ancestor chain. Precedence: the most severe hard resource state
|
|
136
|
+
* wins (narrowest scope on ties), then the breaker scan (widest scope
|
|
137
|
+
* first — a due wide breaker is probed before a narrow one), then draining,
|
|
138
|
+
* then available.
|
|
139
|
+
*/
|
|
140
|
+
assess(key) {
|
|
141
|
+
const now = this.#clock();
|
|
142
|
+
const records = resourceChain(key).map((chainKey) => this.#sweptRecord(chainKey, now));
|
|
143
|
+
const hard = hardest(records, now);
|
|
144
|
+
if (hard !== undefined) {
|
|
145
|
+
return blocked(hard.reason, hard.key, hard.retryAtMs);
|
|
146
|
+
}
|
|
147
|
+
for (const record of records) {
|
|
148
|
+
if (record === undefined) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
// A probe whose outcome report never arrived must not wedge the
|
|
152
|
+
// resource in half_open: expire it (same backoff window, no doubling)
|
|
153
|
+
// before attempting admission.
|
|
154
|
+
const expired = expireProbe(record.breaker, now, this.#config.breaker);
|
|
155
|
+
const current = expired === record.breaker ? record : { ...record, breaker: expired, updatedAt: now };
|
|
156
|
+
if (current !== record) {
|
|
157
|
+
this.#records.set(resourceKeyID(record.key), current);
|
|
158
|
+
}
|
|
159
|
+
const admission = admitProbe(current.breaker, now);
|
|
160
|
+
if (admission.kind === "closed") {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (admission.kind === "waiting") {
|
|
164
|
+
return blocked("breaker-open", record.key, admission.retryAtMs);
|
|
165
|
+
}
|
|
166
|
+
if (admission.kind === "in-flight") {
|
|
167
|
+
return blocked("probe-in-flight", record.key, undefined);
|
|
168
|
+
}
|
|
169
|
+
const probeId = String(++this.#probeCounter);
|
|
170
|
+
this.#records.set(resourceKeyID(record.key), {
|
|
171
|
+
...record,
|
|
172
|
+
breaker: { ...admission.record, probeId, probeAt: now },
|
|
173
|
+
updatedAt: now,
|
|
174
|
+
});
|
|
175
|
+
return { kind: "probe", ticket: { id: probeId, key: record.key } };
|
|
176
|
+
}
|
|
177
|
+
// Draining is the softest blocker; report the narrowest draining scope.
|
|
178
|
+
let draining;
|
|
179
|
+
for (const record of records) {
|
|
180
|
+
if (record?.health === "draining") {
|
|
181
|
+
draining = record;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (draining !== undefined) {
|
|
185
|
+
return blocked("draining", draining.key, undefined);
|
|
186
|
+
}
|
|
187
|
+
return { kind: "available" };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Non-mutating assessment for decisions that must not admit a probe
|
|
191
|
+
* (escalation-target gating): identical hard-state and draining walk, but
|
|
192
|
+
* an open or half-open breaker blocks without being flipped or ticketed.
|
|
193
|
+
*/
|
|
194
|
+
evaluate(key) {
|
|
195
|
+
const now = this.#clock();
|
|
196
|
+
const records = resourceChain(key).map((chainKey) => this.#sweptRecord(chainKey, now));
|
|
197
|
+
const hard = hardest(records, now);
|
|
198
|
+
if (hard !== undefined) {
|
|
199
|
+
return blocked(hard.reason, hard.key, hard.retryAtMs);
|
|
200
|
+
}
|
|
201
|
+
for (const record of records) {
|
|
202
|
+
if (record === undefined)
|
|
203
|
+
continue;
|
|
204
|
+
// Observer view (non-mutating): an open breaker blocks even when its
|
|
205
|
+
// backoff elapsed — assess is what flips it to half_open and issues
|
|
206
|
+
// the probe ticket.
|
|
207
|
+
const wait = breakerBlockWait(record.breaker, now);
|
|
208
|
+
if (wait !== undefined) {
|
|
209
|
+
return blocked("breaker-open", record.key, wait);
|
|
210
|
+
}
|
|
211
|
+
if (record.breaker.state === "half_open") {
|
|
212
|
+
return blocked("probe-in-flight", record.key, undefined);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
let draining;
|
|
216
|
+
for (const record of records) {
|
|
217
|
+
if (record?.health === "draining") {
|
|
218
|
+
draining = record;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (draining !== undefined) {
|
|
222
|
+
return blocked("draining", draining.key, undefined);
|
|
223
|
+
}
|
|
224
|
+
return { kind: "available" };
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Reports the outcome of an admitted probe. Only the ticket issued for the
|
|
228
|
+
* current half-open record is honored; stale tickets (probe already
|
|
229
|
+
* resolved, record reset, or unknown key) are rejected.
|
|
230
|
+
*/
|
|
231
|
+
reportProbe(ticket, outcome) {
|
|
232
|
+
const now = this.#clock();
|
|
233
|
+
const id = resourceKeyID(ticket.key);
|
|
234
|
+
const record = this.#records.get(id);
|
|
235
|
+
if (record === undefined) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
const breaker = record.breaker;
|
|
239
|
+
if (breaker.state !== "half_open" || breaker.probeId !== ticket.id) {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
const next = outcome.success
|
|
243
|
+
? recordProbeSuccess(breaker)
|
|
244
|
+
: recordProbeFailure(breaker, outcome.category, now, this.#config.breaker);
|
|
245
|
+
this.#records.set(id, { ...record, breaker: next, updatedAt: now });
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
/** Current (swept) record for one key, if the registry tracks it. */
|
|
249
|
+
recordFor(key) {
|
|
250
|
+
return this.#sweptRecord(key, this.#clock());
|
|
251
|
+
}
|
|
252
|
+
/** All tracked records, swept against the clock. */
|
|
253
|
+
snapshot() {
|
|
254
|
+
const now = this.#clock();
|
|
255
|
+
return [...this.#records.values()].map((record) => sweepRecord(record, now));
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/health/resource-health/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { HealthEvent, ResourceHealthConfig, ResourceKey, ResourceRecord } from "./types.js";
|
|
2
|
+
export declare function initialRecord(key: ResourceKey, now: number): ResourceRecord;
|
|
3
|
+
/**
|
|
4
|
+
* Elapses time-bounded windows: once a window's `until` passes, the windowed
|
|
5
|
+
* state (rate limited, quota exhausted with a known reset) lifts back to
|
|
6
|
+
* healthy. Records without a window, or with one still in the future, pass
|
|
7
|
+
* through unchanged.
|
|
8
|
+
*/
|
|
9
|
+
export declare function sweepRecord(record: ResourceRecord, now: number): ResourceRecord;
|
|
10
|
+
export declare function applyHealthEvent(record: ResourceRecord, event: HealthEvent, now: number, config: ResourceHealthConfig): ResourceRecord;
|
|
11
|
+
//# sourceMappingURL=transitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../../src/health/resource-health/transitions.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhG,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,CAE3E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,CAM/E;AAoFD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,oBAAoB,GAC3B,cAAc,CAgDhB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure resource health transitions (ADP-007, ADP-012, ADP-019, ADP-021).
|
|
3
|
+
*
|
|
4
|
+
* `applyHealthEvent` is the single authority for how evidence changes a
|
|
5
|
+
* resource record: total, synchronous, and clock-free (`now` is injected).
|
|
6
|
+
*
|
|
7
|
+
* Policy notes:
|
|
8
|
+
* - Rate limiting and quota exhaustion set their own windowed states;
|
|
9
|
+
* a windowed state is never downgraded by weaker evidence (a 429 while
|
|
10
|
+
* quota-exhausted does not erase the quota signal).
|
|
11
|
+
* - Outage, overload, and timeout count toward the circuit breaker and mark
|
|
12
|
+
* the resource degraded. They never hard-quarantine on their own: a single
|
|
13
|
+
* definitive outage signal can be a blip, so the breaker owns transient
|
|
14
|
+
* failure quarantine with backoff windows and probe recovery.
|
|
15
|
+
* - Definitive configuration failures (auth, invalid model) hard-quarantine
|
|
16
|
+
* the resource: the evidence proves the resource cannot work. Non-definitive
|
|
17
|
+
* evidence of the same categories (the textual last resort, ADP-008) is
|
|
18
|
+
* transient and breaker-owned instead — one fuzzy substring in an error
|
|
19
|
+
* body must never permanently blacklist a resource with no recovery path
|
|
20
|
+
* (ADP-012).
|
|
21
|
+
* - The `definitive` flag otherwise guides scheduling deference, not health:
|
|
22
|
+
* both definitive and non-definitive infra failures leave the resource
|
|
23
|
+
* degraded.
|
|
24
|
+
* - Ambiguous or request-level failures (context overflow, content policy,
|
|
25
|
+
* user cancellation, unknown) never change health: they say nothing about
|
|
26
|
+
* the resource.
|
|
27
|
+
* - Draining is a policy request (ADP-021), not degraded health: it applies
|
|
28
|
+
* on top of healthy/degraded and never masks a harder state.
|
|
29
|
+
*/
|
|
30
|
+
import { recordBreakerFailure, recordBreakerSuccess, initialBreaker, } from "../circuit-breaker/breaker.js";
|
|
31
|
+
import { resourceScope } from "./key.js";
|
|
32
|
+
export function initialRecord(key, now) {
|
|
33
|
+
return { key, health: "healthy", breaker: initialBreaker(), updatedAt: now };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Elapses time-bounded windows: once a window's `until` passes, the windowed
|
|
37
|
+
* state (rate limited, quota exhausted with a known reset) lifts back to
|
|
38
|
+
* healthy. Records without a window, or with one still in the future, pass
|
|
39
|
+
* through unchanged.
|
|
40
|
+
*/
|
|
41
|
+
export function sweepRecord(record, now) {
|
|
42
|
+
const window = record.window;
|
|
43
|
+
if (window === undefined || now < window.until) {
|
|
44
|
+
return record;
|
|
45
|
+
}
|
|
46
|
+
return { key: record.key, health: "healthy", breaker: record.breaker, updatedAt: now };
|
|
47
|
+
}
|
|
48
|
+
function touched(record, now) {
|
|
49
|
+
return { ...record, updatedAt: now };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Defensive re-validation of a parsed retry delay: the classifier already
|
|
53
|
+
* rejects malformed values, but the health layer never trusts a negative or
|
|
54
|
+
* fractional delay to compute a window.
|
|
55
|
+
*/
|
|
56
|
+
function validRetryAfterMs(value) {
|
|
57
|
+
return value !== undefined && Number.isInteger(value) && value >= 0 ? value : undefined;
|
|
58
|
+
}
|
|
59
|
+
function failureEvent(record, event, now, config) {
|
|
60
|
+
switch (event.category) {
|
|
61
|
+
case "rate_limited": {
|
|
62
|
+
if (record.health === "quota_exhausted" || record.health === "unavailable") {
|
|
63
|
+
return touched(record, now);
|
|
64
|
+
}
|
|
65
|
+
const retryAfterMs = validRetryAfterMs(event.retryAfterMs);
|
|
66
|
+
const until = now + (retryAfterMs ?? config.defaultRateLimitWindowMs);
|
|
67
|
+
return {
|
|
68
|
+
...record,
|
|
69
|
+
health: "rate_limited",
|
|
70
|
+
window: { kind: "rate-limit", until },
|
|
71
|
+
updatedAt: now,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
case "quota_exhausted": {
|
|
75
|
+
if (record.health === "unavailable") {
|
|
76
|
+
return touched(record, now);
|
|
77
|
+
}
|
|
78
|
+
const retryAfterMs = validRetryAfterMs(event.retryAfterMs);
|
|
79
|
+
return {
|
|
80
|
+
...record,
|
|
81
|
+
health: "quota_exhausted",
|
|
82
|
+
window: retryAfterMs === undefined ? undefined : { kind: "quota", until: now + retryAfterMs },
|
|
83
|
+
updatedAt: now,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
case "outage":
|
|
87
|
+
case "overload":
|
|
88
|
+
case "timeout": {
|
|
89
|
+
const breaker = recordBreakerFailure(record.breaker, event.category, now, config.breaker);
|
|
90
|
+
const health = record.health === "healthy" || record.health === "draining" ? "degraded" : record.health;
|
|
91
|
+
return { ...record, health, breaker: breaker.record, updatedAt: now };
|
|
92
|
+
}
|
|
93
|
+
case "auth_failure":
|
|
94
|
+
case "invalid_model": {
|
|
95
|
+
// An invalid model says nothing about the provider or account; only
|
|
96
|
+
// model-scoped and variant-scoped keys may be quarantined by it.
|
|
97
|
+
if (event.category === "invalid_model") {
|
|
98
|
+
const scope = resourceScope(record.key);
|
|
99
|
+
if (scope !== "model" && scope !== "variant") {
|
|
100
|
+
return touched(record, now);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (!event.definitive) {
|
|
104
|
+
// Non-definitive evidence (bounded-textual last resort) is not proof
|
|
105
|
+
// the resource cannot work: quarantine through the breaker's bounded
|
|
106
|
+
// failure counting instead of a windowless, unrecoverable state.
|
|
107
|
+
const breaker = recordBreakerFailure(record.breaker, event.category, now, config.breaker);
|
|
108
|
+
const health = record.health === "healthy" || record.health === "draining" ? "degraded" : record.health;
|
|
109
|
+
return { ...record, health, breaker: breaker.record, updatedAt: now };
|
|
110
|
+
}
|
|
111
|
+
return { ...record, health: "unavailable", updatedAt: now };
|
|
112
|
+
}
|
|
113
|
+
default:
|
|
114
|
+
// context_overflow, content_policy, user_cancelled, unknown:
|
|
115
|
+
// request-level evidence, not resource health.
|
|
116
|
+
return touched(record, now);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export function applyHealthEvent(record, event, now, config) {
|
|
120
|
+
switch (event.kind) {
|
|
121
|
+
case "failure":
|
|
122
|
+
return failureEvent(record, event, now, config);
|
|
123
|
+
case "success": {
|
|
124
|
+
const breaker = recordBreakerSuccess();
|
|
125
|
+
const health = record.health === "draining" || record.health === "quota_exhausted"
|
|
126
|
+
? record.health
|
|
127
|
+
: "healthy";
|
|
128
|
+
return {
|
|
129
|
+
...record,
|
|
130
|
+
health,
|
|
131
|
+
breaker,
|
|
132
|
+
window: health === record.health ? record.window : undefined,
|
|
133
|
+
updatedAt: now,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
case "drain": {
|
|
137
|
+
const health = record.health === "healthy" || record.health === "degraded" ? "draining" : record.health;
|
|
138
|
+
return { ...record, health, updatedAt: now };
|
|
139
|
+
}
|
|
140
|
+
case "capacity": {
|
|
141
|
+
if (event.exhausted) {
|
|
142
|
+
if (record.health === "unavailable") {
|
|
143
|
+
return touched(record, now);
|
|
144
|
+
}
|
|
145
|
+
const retryAfterMs = validRetryAfterMs(event.retryAfterMs);
|
|
146
|
+
return {
|
|
147
|
+
...record,
|
|
148
|
+
health: "quota_exhausted",
|
|
149
|
+
window: retryAfterMs === undefined ? undefined : { kind: "quota", until: now + retryAfterMs },
|
|
150
|
+
updatedAt: now,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const health = record.health === "quota_exhausted" ? "healthy" : record.health;
|
|
154
|
+
return {
|
|
155
|
+
...record,
|
|
156
|
+
health,
|
|
157
|
+
window: health === record.health ? record.window : undefined,
|
|
158
|
+
updatedAt: now,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
case "reset":
|
|
162
|
+
return { key: record.key, health: "healthy", breaker: initialBreaker(), updatedAt: now };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=transitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transitions.js","sourceRoot":"","sources":["../../../src/health/resource-health/transitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource health types (ADP-007, ADP-012, ADP-021).
|
|
3
|
+
*
|
|
4
|
+
* A resource is identified at the narrowest scope the evidence supports:
|
|
5
|
+
* provider → account → model → variant. Health states are a closed set and
|
|
6
|
+
* every transition between them is defined by the pure transition layer; the
|
|
7
|
+
* registry never invents states. The circuit breaker (ADP-019) is an
|
|
8
|
+
* orthogonal axis stored per resource record.
|
|
9
|
+
*/
|
|
10
|
+
import { type BreakerConfig, type BreakerRecord } from "../circuit-breaker/types.js";
|
|
11
|
+
import type { FailureCategory } from "../classifier/types.js";
|
|
12
|
+
export declare const RESOURCE_SCOPES: readonly ["provider", "account", "model", "variant"];
|
|
13
|
+
export type ResourceScope = (typeof RESOURCE_SCOPES)[number];
|
|
14
|
+
/**
|
|
15
|
+
* Hierarchical resource identity. The scope is derived from the most specific
|
|
16
|
+
* field present, so callers attribute evidence at exactly the level they can
|
|
17
|
+
* prove (e.g. a provider-wide outage without a model id stays at provider
|
|
18
|
+
* scope; a per-variant failure quarantines only that variant).
|
|
19
|
+
*/
|
|
20
|
+
export interface ResourceKey {
|
|
21
|
+
readonly providerID: string;
|
|
22
|
+
readonly accountID?: string | undefined;
|
|
23
|
+
readonly modelID?: string | undefined;
|
|
24
|
+
readonly variantID?: string | undefined;
|
|
25
|
+
}
|
|
26
|
+
export declare const HEALTH_STATES: readonly ["healthy", "draining", "degraded", "rate_limited", "quota_exhausted", "unavailable"];
|
|
27
|
+
export type HealthState = (typeof HEALTH_STATES)[number];
|
|
28
|
+
/**
|
|
29
|
+
* A time-bounded window during which the current state is known to hold
|
|
30
|
+
* (e.g. until a Retry-After delay or a quota reset elapses). Absent when no
|
|
31
|
+
* reset time is known — recovery then relies on probes, observed successes,
|
|
32
|
+
* or explicit resets.
|
|
33
|
+
*/
|
|
34
|
+
export interface ResourceWindow {
|
|
35
|
+
readonly kind: "rate-limit" | "quota";
|
|
36
|
+
readonly until: number;
|
|
37
|
+
}
|
|
38
|
+
export interface ResourceRecord {
|
|
39
|
+
readonly key: ResourceKey;
|
|
40
|
+
readonly health: HealthState;
|
|
41
|
+
readonly breaker: BreakerRecord;
|
|
42
|
+
readonly window?: ResourceWindow | undefined;
|
|
43
|
+
readonly updatedAt: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Health evidence events. `failure` carries an already-classified category
|
|
47
|
+
* (from the error classifier, ADP-009) plus the classification's
|
|
48
|
+
* definitiveness and parsed retry delay. `capacity` carries a CapacitySensor
|
|
49
|
+
* reading (ADP-020) — `exhausted: false` is positive evidence of capacity.
|
|
50
|
+
* `reset` is the manual Control-mode recovery op.
|
|
51
|
+
*/
|
|
52
|
+
export type HealthEvent = {
|
|
53
|
+
readonly kind: "failure";
|
|
54
|
+
readonly key: ResourceKey;
|
|
55
|
+
readonly category: FailureCategory;
|
|
56
|
+
readonly definitive: boolean;
|
|
57
|
+
readonly retryAfterMs?: number | undefined;
|
|
58
|
+
} | {
|
|
59
|
+
readonly kind: "success";
|
|
60
|
+
readonly key: ResourceKey;
|
|
61
|
+
} | {
|
|
62
|
+
readonly kind: "drain";
|
|
63
|
+
readonly key: ResourceKey;
|
|
64
|
+
} | {
|
|
65
|
+
readonly kind: "capacity";
|
|
66
|
+
readonly key: ResourceKey;
|
|
67
|
+
readonly exhausted: boolean;
|
|
68
|
+
readonly retryAfterMs?: number | undefined;
|
|
69
|
+
} | {
|
|
70
|
+
readonly kind: "reset";
|
|
71
|
+
readonly key: ResourceKey;
|
|
72
|
+
};
|
|
73
|
+
export interface ResourceHealthConfig {
|
|
74
|
+
readonly breaker: BreakerConfig;
|
|
75
|
+
/** Window applied to rate-limited evidence that carries no Retry-After. */
|
|
76
|
+
readonly defaultRateLimitWindowMs: number;
|
|
77
|
+
}
|
|
78
|
+
export declare const DEFAULT_HEALTH_CONFIG: ResourceHealthConfig;
|
|
79
|
+
/** Injected monotonic clock, milliseconds. */
|
|
80
|
+
export type Clock = () => number;
|
|
81
|
+
/**
|
|
82
|
+
* Why an assessment blocks new work. Ordered from hardest to softest fact:
|
|
83
|
+
* hard resource states (unavailable, quota, rate limit) are direct evidence;
|
|
84
|
+
* breaker reasons are inferred from failure counts; draining is a policy
|
|
85
|
+
* request, not a health fact.
|
|
86
|
+
*/
|
|
87
|
+
export declare const BLOCKED_REASONS: readonly ["unavailable", "quota-exhausted", "rate-limited", "breaker-open", "probe-in-flight", "draining"];
|
|
88
|
+
export type BlockedReason = (typeof BLOCKED_REASONS)[number];
|
|
89
|
+
/** Opaque single-probe admission token; validated on report. */
|
|
90
|
+
export interface ProbeTicket {
|
|
91
|
+
readonly id: string;
|
|
92
|
+
readonly key: ResourceKey;
|
|
93
|
+
}
|
|
94
|
+
export type ProbeOutcome = {
|
|
95
|
+
readonly success: true;
|
|
96
|
+
} | {
|
|
97
|
+
readonly success: false;
|
|
98
|
+
readonly category: FailureCategory;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Result of assessing whether a resource may take new work right now. The
|
|
102
|
+
* `blocked` variant reports the winning blocker's key (which may be a wider
|
|
103
|
+
* scope than the assessed key) and, when known, when the block can lift.
|
|
104
|
+
*/
|
|
105
|
+
export type Assessment = {
|
|
106
|
+
readonly kind: "available";
|
|
107
|
+
} | {
|
|
108
|
+
readonly kind: "probe";
|
|
109
|
+
readonly ticket: ProbeTicket;
|
|
110
|
+
} | {
|
|
111
|
+
readonly kind: "blocked";
|
|
112
|
+
readonly reason: BlockedReason;
|
|
113
|
+
readonly key: ResourceKey;
|
|
114
|
+
readonly retryAtMs?: number;
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/health/resource-health/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource health types (ADP-007, ADP-012, ADP-021).
|
|
3
|
+
*
|
|
4
|
+
* A resource is identified at the narrowest scope the evidence supports:
|
|
5
|
+
* provider → account → model → variant. Health states are a closed set and
|
|
6
|
+
* every transition between them is defined by the pure transition layer; the
|
|
7
|
+
* registry never invents states. The circuit breaker (ADP-019) is an
|
|
8
|
+
* orthogonal axis stored per resource record.
|
|
9
|
+
*/
|
|
10
|
+
import { DEFAULT_BREAKER_CONFIG, } from "../circuit-breaker/types.js";
|
|
11
|
+
export const RESOURCE_SCOPES = [
|
|
12
|
+
"provider",
|
|
13
|
+
"account",
|
|
14
|
+
"model",
|
|
15
|
+
"variant",
|
|
16
|
+
];
|
|
17
|
+
export const HEALTH_STATES = [
|
|
18
|
+
"healthy",
|
|
19
|
+
"draining",
|
|
20
|
+
"degraded",
|
|
21
|
+
"rate_limited",
|
|
22
|
+
"quota_exhausted",
|
|
23
|
+
"unavailable",
|
|
24
|
+
];
|
|
25
|
+
export const DEFAULT_HEALTH_CONFIG = {
|
|
26
|
+
breaker: DEFAULT_BREAKER_CONFIG,
|
|
27
|
+
defaultRateLimitWindowMs: 30_000,
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Why an assessment blocks new work. Ordered from hardest to softest fact:
|
|
31
|
+
* hard resource states (unavailable, quota, rate limit) are direct evidence;
|
|
32
|
+
* breaker reasons are inferred from failure counts; draining is a policy
|
|
33
|
+
* request, not a health fact.
|
|
34
|
+
*/
|
|
35
|
+
export const BLOCKED_REASONS = [
|
|
36
|
+
"unavailable",
|
|
37
|
+
"quota-exhausted",
|
|
38
|
+
"rate-limited",
|
|
39
|
+
"breaker-open",
|
|
40
|
+
"probe-in-flight",
|
|
41
|
+
"draining",
|
|
42
|
+
];
|
|
43
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/health/resource-health/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EACL,sBAAsB,GAGvB,MAAM,6BAA6B,CAAA;AAGpC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU;IACV,SAAS;IACT,OAAO;IACP,SAAS;CAC2B,CAAA;AAiBtC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS;IACT,UAAU;IACV,UAAU;IACV,cAAc;IACd,iBAAiB;IACjB,aAAa;CACuB,CAAA;AAsDtC,MAAM,CAAC,MAAM,qBAAqB,GAAyB;IACzD,OAAO,EAAE,sBAAsB;IAC/B,wBAAwB,EAAE,MAAM;CACjC,CAAA;AAKD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,aAAa;IACb,iBAAiB;IACjB,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,UAAU;CAC0B,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Plugin } from "@opencode/plugin";
|
|
2
|
+
export { PLUGIN_ID } from "./plugin-id.js";
|
|
3
|
+
/**
|
|
4
|
+
* Plugin id as required by GOAL.md: must not collide with the `opencode.*`
|
|
5
|
+
* namespace and must stay stable across releases (referenced by settings
|
|
6
|
+
* storage keys and receipts).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Entry point wired into OpenCode via `opencode.json(c)`. Setup glues the
|
|
10
|
+
* adapter touchpoints (session hooks, event subscription, storage) to the
|
|
11
|
+
* supervisor and returns a cleanup that disposes every registration.
|
|
12
|
+
* All supervision errors are fail-open (ADP-031): the supervisor's public
|
|
13
|
+
* entry points never throw; the event pump's stream errors are logged.
|
|
14
|
+
*/
|
|
15
|
+
declare const _default: Plugin.Plugin;
|
|
16
|
+
export default _default;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAezC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C;;;;GAIG;AAEH;;;;;;GAMG;;AACH,wBAyEE"}
|