@coool/opencode-adaptive 1.0.0 → 1.0.1
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/README.md +8 -7
- package/dist/adapters/codex-capacity/index.d.ts +0 -1
- package/dist/adapters/codex-capacity/index.js.map +1 -1
- package/dist/adapters/codex-capacity/parse.d.ts +2 -2
- package/dist/adapters/codex-capacity/parse.js +19 -3
- package/dist/adapters/codex-capacity/parse.js.map +1 -1
- package/dist/adapters/codex-capacity/reading.d.ts +0 -1
- package/dist/adapters/codex-capacity/reading.js.map +1 -1
- package/dist/adapters/codex-capacity/sensor.d.ts +0 -1
- package/dist/adapters/codex-capacity/sensor.js.map +1 -1
- package/dist/adapters/codex-capacity/types.d.ts +0 -4
- package/dist/adapters/codex-capacity/types.js +14 -0
- package/dist/adapters/codex-capacity/types.js.map +1 -1
- package/dist/adapters/opencode/escalation-tool.d.ts +0 -1
- package/dist/adapters/opencode/escalation-tool.js +5 -3
- package/dist/adapters/opencode/escalation-tool.js.map +1 -1
- package/dist/adapters/opencode/events.d.ts +0 -1
- package/dist/adapters/opencode/events.js.map +1 -1
- package/dist/adapters/opencode/hooks.d.ts +0 -1
- package/dist/adapters/opencode/hooks.js +24 -7
- package/dist/adapters/opencode/hooks.js.map +1 -1
- package/dist/adapters/opencode/index.d.ts +0 -1
- package/dist/adapters/opencode/index.js.map +1 -1
- package/dist/adapters/opencode/inventory.d.ts +0 -1
- package/dist/adapters/opencode/inventory.js.map +1 -1
- package/dist/adapters/opencode/report.d.ts +0 -1
- package/dist/adapters/opencode/report.js.map +1 -1
- package/dist/adapters/opencode/session-ops.d.ts +0 -1
- package/dist/adapters/opencode/session-ops.js.map +1 -1
- package/dist/adapters/opencode/storage.d.ts +0 -1
- package/dist/adapters/opencode/storage.js.map +1 -1
- package/dist/adapters/opencode/tier-tool.d.ts +0 -1
- package/dist/adapters/opencode/tier-tool.js.map +1 -1
- package/dist/adapters/opencode/types.d.ts +0 -1
- package/dist/adapters/opencode/types.js.map +1 -1
- package/dist/core/compatibility/gate.d.ts +0 -3
- package/dist/core/compatibility/gate.js +0 -4
- package/dist/core/compatibility/gate.js.map +1 -1
- package/dist/core/compatibility/index.d.ts +0 -1
- package/dist/core/compatibility/index.js.map +1 -1
- package/dist/core/compatibility/types.d.ts +0 -1
- package/dist/core/compatibility/types.js.map +1 -1
- package/dist/core/scheduler/admit.d.ts +0 -1
- package/dist/core/scheduler/admit.js +22 -21
- package/dist/core/scheduler/admit.js.map +1 -1
- package/dist/core/scheduler/escalate.d.ts +0 -1
- package/dist/core/scheduler/escalate.js +6 -17
- package/dist/core/scheduler/escalate.js.map +1 -1
- package/dist/core/scheduler/index.d.ts +0 -1
- package/dist/core/scheduler/index.js.map +1 -1
- package/dist/core/scheduler/mode.d.ts +0 -1
- package/dist/core/scheduler/mode.js.map +1 -1
- package/dist/core/scheduler/types.d.ts +2 -9
- package/dist/core/scheduler/types.js +2 -1
- package/dist/core/scheduler/types.js.map +1 -1
- package/dist/core/tier-policy/index.d.ts +0 -1
- package/dist/core/tier-policy/index.js.map +1 -1
- package/dist/core/tier-policy/resolve.d.ts +0 -1
- package/dist/core/tier-policy/resolve.js.map +1 -1
- package/dist/core/tier-policy/tier-list.d.ts +0 -1
- package/dist/core/tier-policy/tier-list.js.map +1 -1
- package/dist/core/tier-policy/types.d.ts +2 -1
- package/dist/core/tier-policy/types.js +4 -0
- package/dist/core/tier-policy/types.js.map +1 -1
- package/dist/core/work-unit/index.d.ts +0 -1
- package/dist/core/work-unit/index.js.map +1 -1
- package/dist/core/work-unit/interruption.d.ts +0 -1
- package/dist/core/work-unit/interruption.js.map +1 -1
- package/dist/core/work-unit/tracker.d.ts +11 -4
- package/dist/core/work-unit/tracker.js +26 -6
- package/dist/core/work-unit/tracker.js.map +1 -1
- package/dist/core/work-unit/types.d.ts +6 -1
- package/dist/core/work-unit/types.js.map +1 -1
- package/dist/execution/continuation/execute.d.ts +0 -1
- package/dist/execution/continuation/execute.js.map +1 -1
- package/dist/execution/continuation/index.d.ts +0 -2
- package/dist/execution/continuation/index.js +0 -1
- package/dist/execution/continuation/index.js.map +1 -1
- package/dist/execution/continuation/plan.d.ts +0 -1
- package/dist/execution/continuation/plan.js +1 -3
- package/dist/execution/continuation/plan.js.map +1 -1
- package/dist/execution/continuation/prompts.d.ts +0 -1
- package/dist/execution/continuation/prompts.js.map +1 -1
- package/dist/execution/continuation/types.d.ts +0 -2
- package/dist/execution/continuation/types.js.map +1 -1
- package/dist/execution/escalation/index.d.ts +0 -1
- package/dist/execution/escalation/index.js.map +1 -1
- package/dist/execution/escalation/types.d.ts +0 -1
- package/dist/execution/escalation/types.js.map +1 -1
- package/dist/execution/index.d.ts +0 -1
- package/dist/execution/index.js.map +1 -1
- package/dist/execution/parking/index.d.ts +0 -1
- package/dist/execution/parking/index.js.map +1 -1
- package/dist/execution/parking/plan.d.ts +0 -1
- package/dist/execution/parking/plan.js.map +1 -1
- package/dist/execution/retry/decide.d.ts +0 -1
- package/dist/execution/retry/decide.js +1 -2
- package/dist/execution/retry/decide.js.map +1 -1
- package/dist/execution/retry/index.d.ts +0 -1
- package/dist/execution/retry/index.js.map +1 -1
- package/dist/execution/retry/types.d.ts +0 -2
- package/dist/execution/retry/types.js.map +1 -1
- package/dist/gui-experimental.cjs +1 -1
- package/dist/gui.d.ts +0 -1
- package/dist/gui.js +6 -3
- package/dist/gui.js.map +1 -1
- package/dist/health/capacity/index.d.ts +0 -1
- package/dist/health/capacity/index.js.map +1 -1
- package/dist/health/capacity/merge.d.ts +0 -1
- package/dist/health/capacity/merge.js.map +1 -1
- package/dist/health/capacity/registry.d.ts +0 -1
- package/dist/health/capacity/registry.js.map +1 -1
- package/dist/health/capacity/types.d.ts +0 -1
- package/dist/health/capacity/types.js.map +1 -1
- package/dist/health/circuit-breaker/breaker.d.ts +8 -1
- package/dist/health/circuit-breaker/breaker.js +18 -0
- package/dist/health/circuit-breaker/breaker.js.map +1 -1
- package/dist/health/circuit-breaker/index.d.ts +0 -1
- package/dist/health/circuit-breaker/index.js.map +1 -1
- package/dist/health/circuit-breaker/types.d.ts +0 -1
- package/dist/health/circuit-breaker/types.js.map +1 -1
- package/dist/health/classifier/classify.d.ts +0 -1
- package/dist/health/classifier/classify.js.map +1 -1
- package/dist/health/classifier/index.d.ts +0 -1
- package/dist/health/classifier/index.js.map +1 -1
- package/dist/health/classifier/types.d.ts +0 -1
- package/dist/health/classifier/types.js.map +1 -1
- package/dist/health/index.d.ts +0 -1
- package/dist/health/index.js.map +1 -1
- package/dist/health/resource-health/index.d.ts +0 -1
- package/dist/health/resource-health/index.js.map +1 -1
- package/dist/health/resource-health/key.d.ts +0 -1
- package/dist/health/resource-health/key.js.map +1 -1
- package/dist/health/resource-health/registry.d.ts +6 -1
- package/dist/health/resource-health/registry.js +19 -1
- package/dist/health/resource-health/registry.js.map +1 -1
- package/dist/health/resource-health/transitions.d.ts +2 -4
- package/dist/health/resource-health/transitions.js +10 -18
- package/dist/health/resource-health/transitions.js.map +1 -1
- package/dist/health/resource-health/types.d.ts +7 -1
- package/dist/health/resource-health/types.js +1 -0
- package/dist/health/resource-health/types.js.map +1 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.js +44 -19
- package/dist/index.js.map +1 -1
- package/dist/plugin-id.d.ts +0 -1
- package/dist/plugin-id.js.map +1 -1
- package/dist/rpc/definition.d.ts +24 -1
- package/dist/rpc/definition.js +28 -2
- package/dist/rpc/definition.js.map +1 -1
- package/dist/rpc/handlers.d.ts +12 -24
- package/dist/rpc/handlers.js +22 -8
- package/dist/rpc/handlers.js.map +1 -1
- package/dist/rpc/status.d.ts +0 -1
- package/dist/rpc/status.js.map +1 -1
- package/dist/rpc.d.ts +0 -1
- package/dist/rpc.js.map +1 -1
- package/dist/state/capacity/index.d.ts +0 -1
- package/dist/state/capacity/index.js.map +1 -1
- package/dist/state/capacity/parse.d.ts +0 -1
- package/dist/state/capacity/parse.js +14 -2
- package/dist/state/capacity/parse.js.map +1 -1
- package/dist/state/capacity/store.d.ts +0 -1
- package/dist/state/capacity/store.js +16 -2
- package/dist/state/capacity/store.js.map +1 -1
- package/dist/state/capacity/types.d.ts +0 -1
- package/dist/state/capacity/types.js.map +1 -1
- package/dist/state/health/index.d.ts +0 -1
- package/dist/state/health/index.js.map +1 -1
- package/dist/state/health/parse.d.ts +0 -1
- package/dist/state/health/parse.js +20 -4
- package/dist/state/health/parse.js.map +1 -1
- package/dist/state/health/store.d.ts +0 -1
- package/dist/state/health/store.js +16 -2
- package/dist/state/health/store.js.map +1 -1
- package/dist/state/health/types.d.ts +0 -1
- package/dist/state/health/types.js.map +1 -1
- package/dist/state/parked-work/index.d.ts +0 -1
- package/dist/state/parked-work/index.js.map +1 -1
- package/dist/state/parked-work/parse.d.ts +0 -1
- package/dist/state/parked-work/parse.js.map +1 -1
- package/dist/state/parked-work/store.d.ts +0 -1
- package/dist/state/parked-work/store.js +20 -3
- package/dist/state/parked-work/store.js.map +1 -1
- package/dist/state/parked-work/types.d.ts +0 -1
- package/dist/state/parked-work/types.js.map +1 -1
- package/dist/state/receipts/bound.d.ts +0 -1
- package/dist/state/receipts/bound.js.map +1 -1
- package/dist/state/receipts/index.d.ts +0 -1
- package/dist/state/receipts/index.js.map +1 -1
- package/dist/state/receipts/parse.d.ts +0 -1
- package/dist/state/receipts/parse.js.map +1 -1
- package/dist/state/receipts/store.d.ts +0 -1
- package/dist/state/receipts/store.js +24 -4
- package/dist/state/receipts/store.js.map +1 -1
- package/dist/state/receipts/types.d.ts +0 -1
- package/dist/state/receipts/types.js.map +1 -1
- package/dist/state/session-modes/index.d.ts +0 -1
- package/dist/state/session-modes/index.js.map +1 -1
- package/dist/state/session-modes/parse.d.ts +0 -1
- package/dist/state/session-modes/parse.js.map +1 -1
- package/dist/state/session-modes/store.d.ts +0 -1
- package/dist/state/session-modes/store.js +15 -1
- package/dist/state/session-modes/store.js.map +1 -1
- package/dist/state/session-modes/types.d.ts +0 -1
- package/dist/state/session-modes/types.js.map +1 -1
- package/dist/state/settings/index.d.ts +0 -1
- package/dist/state/settings/index.js.map +1 -1
- package/dist/state/settings/parse.d.ts +0 -1
- package/dist/state/settings/parse.js.map +1 -1
- package/dist/state/settings/store.d.ts +0 -1
- package/dist/state/settings/store.js +9 -1
- package/dist/state/settings/store.js.map +1 -1
- package/dist/state/settings/types.d.ts +0 -1
- package/dist/state/settings/types.js.map +1 -1
- package/dist/state/tier-requests/index.d.ts +4 -0
- package/dist/state/tier-requests/index.js +4 -0
- package/dist/state/tier-requests/index.js.map +1 -0
- package/dist/state/tier-requests/parse.d.ts +3 -0
- package/dist/state/tier-requests/parse.js +53 -0
- package/dist/state/tier-requests/parse.js.map +1 -0
- package/dist/state/tier-requests/store.d.ts +27 -0
- package/dist/state/tier-requests/store.js +96 -0
- package/dist/state/tier-requests/store.js.map +1 -0
- package/dist/state/tier-requests/types.d.ts +30 -0
- package/dist/state/tier-requests/types.js +7 -0
- package/dist/state/tier-requests/types.js.map +1 -0
- package/dist/supervisor/index.d.ts +0 -1
- package/dist/supervisor/index.js.map +1 -1
- package/dist/supervisor/log.d.ts +0 -1
- package/dist/supervisor/log.js.map +1 -1
- package/dist/supervisor/supervisor.d.ts +23 -6
- package/dist/supervisor/supervisor.js +397 -111
- package/dist/supervisor/supervisor.js.map +1 -1
- package/dist/supervisor/types.d.ts +0 -1
- package/dist/supervisor/types.js.map +1 -1
- package/dist/supervisor/view.d.ts +0 -1
- package/dist/supervisor/view.js.map +1 -1
- package/dist/tui.d.ts +0 -1
- package/dist/tui.js +14 -10
- package/dist/tui.js.map +1 -1
- package/dist/ui/gui/api.d.ts +0 -1
- package/dist/ui/gui/api.js.map +1 -1
- package/dist/ui/gui/view.d.ts +0 -1
- package/dist/ui/gui/view.js.map +1 -1
- package/dist/ui/tui/controller.d.ts +0 -1
- package/dist/ui/tui/controller.js +28 -12
- package/dist/ui/tui/controller.js.map +1 -1
- package/dist/ui/tui/menu.d.ts +1 -2
- package/dist/ui/tui/menu.js +2 -2
- package/dist/ui/tui/menu.js.map +1 -1
- package/dist/ui/tui/options.d.ts +0 -1
- package/dist/ui/tui/options.js.map +1 -1
- package/dist/ui/tui/receipts.d.ts +0 -1
- package/dist/ui/tui/receipts.js +4 -1
- package/dist/ui/tui/receipts.js.map +1 -1
- package/dist/ui/tui/status.d.ts +1 -2
- package/dist/ui/tui/status.js +4 -2
- package/dist/ui/tui/status.js.map +1 -1
- package/dist/ui/tui/tiers.d.ts +0 -1
- package/dist/ui/tui/tiers.js.map +1 -1
- package/package.json +2 -2
- package/dist/adapters/codex-capacity/index.d.ts.map +0 -1
- package/dist/adapters/codex-capacity/parse.d.ts.map +0 -1
- package/dist/adapters/codex-capacity/reading.d.ts.map +0 -1
- package/dist/adapters/codex-capacity/sensor.d.ts.map +0 -1
- package/dist/adapters/codex-capacity/types.d.ts.map +0 -1
- package/dist/adapters/opencode/escalation-tool.d.ts.map +0 -1
- package/dist/adapters/opencode/events.d.ts.map +0 -1
- package/dist/adapters/opencode/hooks.d.ts.map +0 -1
- package/dist/adapters/opencode/index.d.ts.map +0 -1
- package/dist/adapters/opencode/inventory.d.ts.map +0 -1
- package/dist/adapters/opencode/report.d.ts.map +0 -1
- package/dist/adapters/opencode/session-ops.d.ts.map +0 -1
- package/dist/adapters/opencode/storage.d.ts.map +0 -1
- package/dist/adapters/opencode/tier-tool.d.ts.map +0 -1
- package/dist/adapters/opencode/types.d.ts.map +0 -1
- package/dist/core/compatibility/gate.d.ts.map +0 -1
- package/dist/core/compatibility/index.d.ts.map +0 -1
- package/dist/core/compatibility/types.d.ts.map +0 -1
- package/dist/core/scheduler/admit.d.ts.map +0 -1
- package/dist/core/scheduler/escalate.d.ts.map +0 -1
- package/dist/core/scheduler/index.d.ts.map +0 -1
- package/dist/core/scheduler/mode.d.ts.map +0 -1
- package/dist/core/scheduler/types.d.ts.map +0 -1
- package/dist/core/tier-policy/index.d.ts.map +0 -1
- package/dist/core/tier-policy/resolve.d.ts.map +0 -1
- package/dist/core/tier-policy/tier-list.d.ts.map +0 -1
- package/dist/core/tier-policy/types.d.ts.map +0 -1
- package/dist/core/work-unit/index.d.ts.map +0 -1
- package/dist/core/work-unit/interruption.d.ts.map +0 -1
- package/dist/core/work-unit/tracker.d.ts.map +0 -1
- package/dist/core/work-unit/types.d.ts.map +0 -1
- package/dist/execution/continuation/execute.d.ts.map +0 -1
- package/dist/execution/continuation/index.d.ts.map +0 -1
- package/dist/execution/continuation/ledger.d.ts +0 -20
- package/dist/execution/continuation/ledger.d.ts.map +0 -1
- package/dist/execution/continuation/ledger.js +0 -31
- package/dist/execution/continuation/ledger.js.map +0 -1
- package/dist/execution/continuation/plan.d.ts.map +0 -1
- package/dist/execution/continuation/prompts.d.ts.map +0 -1
- package/dist/execution/continuation/types.d.ts.map +0 -1
- package/dist/execution/escalation/index.d.ts.map +0 -1
- package/dist/execution/escalation/types.d.ts.map +0 -1
- package/dist/execution/index.d.ts.map +0 -1
- package/dist/execution/parking/index.d.ts.map +0 -1
- package/dist/execution/parking/plan.d.ts.map +0 -1
- package/dist/execution/recovery/gate.d.ts +0 -20
- package/dist/execution/recovery/gate.d.ts.map +0 -1
- package/dist/execution/recovery/gate.js +0 -23
- package/dist/execution/recovery/gate.js.map +0 -1
- package/dist/execution/recovery/index.d.ts +0 -3
- package/dist/execution/recovery/index.d.ts.map +0 -1
- package/dist/execution/recovery/index.js +0 -2
- package/dist/execution/recovery/index.js.map +0 -1
- package/dist/execution/retry/decide.d.ts.map +0 -1
- package/dist/execution/retry/index.d.ts.map +0 -1
- package/dist/execution/retry/types.d.ts.map +0 -1
- package/dist/gui.d.ts.map +0 -1
- package/dist/health/capacity/index.d.ts.map +0 -1
- package/dist/health/capacity/merge.d.ts.map +0 -1
- package/dist/health/capacity/registry.d.ts.map +0 -1
- package/dist/health/capacity/types.d.ts.map +0 -1
- package/dist/health/circuit-breaker/breaker.d.ts.map +0 -1
- package/dist/health/circuit-breaker/index.d.ts.map +0 -1
- package/dist/health/circuit-breaker/types.d.ts.map +0 -1
- package/dist/health/classifier/classify.d.ts.map +0 -1
- package/dist/health/classifier/index.d.ts.map +0 -1
- package/dist/health/classifier/types.d.ts.map +0 -1
- package/dist/health/index.d.ts.map +0 -1
- package/dist/health/resource-health/index.d.ts.map +0 -1
- package/dist/health/resource-health/key.d.ts.map +0 -1
- package/dist/health/resource-health/registry.d.ts.map +0 -1
- package/dist/health/resource-health/transitions.d.ts.map +0 -1
- package/dist/health/resource-health/types.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/plugin-id.d.ts.map +0 -1
- package/dist/rpc/definition.d.ts.map +0 -1
- package/dist/rpc/handlers.d.ts.map +0 -1
- package/dist/rpc/status.d.ts.map +0 -1
- package/dist/rpc.d.ts.map +0 -1
- package/dist/state/capacity/index.d.ts.map +0 -1
- package/dist/state/capacity/parse.d.ts.map +0 -1
- package/dist/state/capacity/store.d.ts.map +0 -1
- package/dist/state/capacity/types.d.ts.map +0 -1
- package/dist/state/health/index.d.ts.map +0 -1
- package/dist/state/health/parse.d.ts.map +0 -1
- package/dist/state/health/store.d.ts.map +0 -1
- package/dist/state/health/types.d.ts.map +0 -1
- package/dist/state/parked-work/index.d.ts.map +0 -1
- package/dist/state/parked-work/parse.d.ts.map +0 -1
- package/dist/state/parked-work/store.d.ts.map +0 -1
- package/dist/state/parked-work/types.d.ts.map +0 -1
- package/dist/state/receipts/bound.d.ts.map +0 -1
- package/dist/state/receipts/index.d.ts.map +0 -1
- package/dist/state/receipts/parse.d.ts.map +0 -1
- package/dist/state/receipts/store.d.ts.map +0 -1
- package/dist/state/receipts/types.d.ts.map +0 -1
- package/dist/state/session-modes/index.d.ts.map +0 -1
- package/dist/state/session-modes/parse.d.ts.map +0 -1
- package/dist/state/session-modes/store.d.ts.map +0 -1
- package/dist/state/session-modes/types.d.ts.map +0 -1
- package/dist/state/settings/index.d.ts.map +0 -1
- package/dist/state/settings/parse.d.ts.map +0 -1
- package/dist/state/settings/store.d.ts.map +0 -1
- package/dist/state/settings/types.d.ts.map +0 -1
- package/dist/supervisor/index.d.ts.map +0 -1
- package/dist/supervisor/log.d.ts.map +0 -1
- package/dist/supervisor/supervisor.d.ts.map +0 -1
- package/dist/supervisor/types.d.ts.map +0 -1
- package/dist/supervisor/view.d.ts.map +0 -1
- package/dist/tui.d.ts.map +0 -1
- package/dist/ui/gui/api.d.ts.map +0 -1
- package/dist/ui/gui/view.d.ts.map +0 -1
- package/dist/ui/tui/controller.d.ts.map +0 -1
- package/dist/ui/tui/menu.d.ts.map +0 -1
- package/dist/ui/tui/options.d.ts.map +0 -1
- package/dist/ui/tui/receipts.d.ts.map +0 -1
- package/dist/ui/tui/status.d.ts.map +0 -1
- package/dist/ui/tui/tiers.d.ts.map +0 -1
package/dist/index.js
CHANGED
|
@@ -6,11 +6,6 @@ import { adaptiveRpc } from "./rpc/definition.js";
|
|
|
6
6
|
import { adaptiveRpcHandlers } from "./rpc/handlers.js";
|
|
7
7
|
import { Supervisor, logFailOpen } from "./supervisor/index.js";
|
|
8
8
|
export { PLUGIN_ID } from "./plugin-id.js";
|
|
9
|
-
/**
|
|
10
|
-
* Plugin id as required by GOAL.md: must not collide with the `opencode.*`
|
|
11
|
-
* namespace and must stay stable across releases (referenced by settings
|
|
12
|
-
* storage keys and receipts).
|
|
13
|
-
*/
|
|
14
9
|
/**
|
|
15
10
|
* Entry point wired into OpenCode via `opencode.json(c)`. Setup glues the
|
|
16
11
|
* adapter touchpoints (session hooks, event subscription, storage) to the
|
|
@@ -49,14 +44,37 @@ export default Plugin.define({
|
|
|
49
44
|
}, (error) => {
|
|
50
45
|
logFailOpen("events", error);
|
|
51
46
|
});
|
|
47
|
+
// Every disposal settles independently: a failing dispose is logged, never
|
|
48
|
+
// allowed to mask the other disposals or (during rollback) the original
|
|
49
|
+
// setup error. Disposals are awaited so a late rejection cannot land after
|
|
50
|
+
// the host considers the plugin gone.
|
|
51
|
+
const disposals = [];
|
|
52
|
+
const settled = async (name, dispose) => {
|
|
53
|
+
try {
|
|
54
|
+
await dispose();
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
logFailOpen(name, error);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const settledAll = async () => {
|
|
61
|
+
for (const { name, dispose } of disposals) {
|
|
62
|
+
await settled(name, dispose);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
for (const [index, hookRegistration] of hooks.entries()) {
|
|
66
|
+
disposals.push({ name: `hook ${String(index)}`, dispose: () => hookRegistration.dispose() });
|
|
67
|
+
}
|
|
68
|
+
disposals.push({
|
|
69
|
+
name: "events",
|
|
70
|
+
dispose: () => {
|
|
71
|
+
subscription.dispose();
|
|
72
|
+
},
|
|
73
|
+
});
|
|
52
74
|
// The typed escalation tool (T-18, ADP-015): the agent's self-report
|
|
53
75
|
// surface for stronger capability, applied at the next safe boundary.
|
|
54
76
|
// The tier tool (ADP-055): the agent declares the task's tier; the
|
|
55
77
|
// declaration steers the session's next admissions until cleared.
|
|
56
|
-
const toolRegistration = await context.tool.transform((editor) => {
|
|
57
|
-
editor.add(escalationTool((sessionID, reason, evidence) => supervisor.noteEscalationRequest(sessionID, reason, evidence)));
|
|
58
|
-
editor.add(tierTool((sessionID, tier) => supervisor.noteTierRequest(sessionID, tier)));
|
|
59
|
-
});
|
|
60
78
|
// Typed RPC (ADP-034/036): the only channel to the control surfaces.
|
|
61
79
|
// The settings-changed emitter resolves the registration lazily: handlers
|
|
62
80
|
// only run after `register` resolves, so the holder is always populated.
|
|
@@ -65,16 +83,23 @@ export default Plugin.define({
|
|
|
65
83
|
// The correlated tuple pairing is checked by the handler types; the
|
|
66
84
|
// registration forwards it to the host emitter untouched.
|
|
67
85
|
rpcHolder.registration?.events.emit(...args);
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
86
|
+
try {
|
|
87
|
+
const toolRegistration = await context.tool.transform((editor) => {
|
|
88
|
+
editor.add(escalationTool((sessionID, reason, evidence) => supervisor.noteEscalationRequest(sessionID, reason, evidence)));
|
|
89
|
+
editor.add(tierTool((sessionID, tier) => supervisor.noteTierRequest(sessionID, tier)));
|
|
90
|
+
});
|
|
91
|
+
disposals.push({ name: "tools", dispose: () => toolRegistration.dispose() });
|
|
92
|
+
const rpcRegistration = await context.rpc.register(adaptiveRpc, adaptiveRpcHandlers(supervisor, emit));
|
|
93
|
+
rpcHolder.registration = rpcRegistration;
|
|
94
|
+
disposals.push({ name: "rpc", dispose: () => rpcRegistration.dispose() });
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
// Roll back everything already registered so a failure at the tool or
|
|
98
|
+
// rpc stage does not leak live hooks and the event pump.
|
|
99
|
+
await settledAll();
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
return () => settledAll();
|
|
78
103
|
},
|
|
79
104
|
});
|
|
80
105
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,QAAQ,GACT,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAGvD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Plugin } from \"@opencode/plugin\"\nimport { isCodexHeaderName } from \"./adapters/codex-capacity/index.js\"\nimport {\n escalationTool,\n registerSessionHooks,\n subscribeSessions,\n tierTool,\n} from \"./adapters/opencode/index.js\"\nimport { PLUGIN_ID } from \"./plugin-id.js\"\nimport { adaptiveRpc } from \"./rpc/definition.js\"\nimport { adaptiveRpcHandlers } from \"./rpc/handlers.js\"\nimport type { RpcRegistration } from \"@opencode/plugin/promise/rpc\"\nimport type { AdaptiveRpcEmit } from \"./rpc/handlers.js\"\nimport { Supervisor, logFailOpen } from \"./supervisor/index.js\"\n\nexport { PLUGIN_ID } from \"./plugin-id.js\"\n\n/**\n * Entry point wired into OpenCode via `opencode.json(c)`. Setup glues the\n * adapter touchpoints (session hooks, event subscription, storage) to the\n * supervisor and returns a cleanup that disposes every registration.\n * All supervision errors are fail-open (ADP-031): the supervisor's public\n * entry points never throw; the event pump's stream errors are logged.\n */\nexport default Plugin.define({\n id: PLUGIN_ID,\n async setup(context) {\n const supervisor = new Supervisor({\n session: context.session,\n model: context.model,\n storage: context.storage,\n clock: () => Date.now(),\n })\n const hooks = await registerSessionHooks(\n context.session,\n {\n onRetry: async (input) => {\n await supervisor.handleRetry(input)\n },\n onModelRequest: async (report) => {\n await supervisor.handleReport(report)\n },\n onHttpResponse: async (report) => {\n await supervisor.handleReport(report)\n },\n onIdle: async (report) => {\n await supervisor.handleReport(report)\n },\n onPrompt: async (report) => {\n await supervisor.handleReport(report)\n },\n },\n { capture: isCodexHeaderName },\n )\n const subscription = subscribeSessions(\n context.event,\n (report) => {\n void supervisor.handleReport(report)\n },\n (error) => {\n logFailOpen(\"events\", error)\n },\n )\n // Every disposal settles independently: a failing dispose is logged, never\n // allowed to mask the other disposals or (during rollback) the original\n // setup error. Disposals are awaited so a late rejection cannot land after\n // the host considers the plugin gone.\n const disposals: { name: string; dispose: () => void | Promise<void> }[] = []\n const settled = async (name: string, dispose: () => void | Promise<void>): Promise<void> => {\n try {\n await dispose()\n } catch (error) {\n logFailOpen(name, error)\n }\n }\n const settledAll = async (): Promise<void> => {\n for (const { name, dispose } of disposals) {\n await settled(name, dispose)\n }\n }\n for (const [index, hookRegistration] of hooks.entries()) {\n disposals.push({ name: `hook ${String(index)}`, dispose: () => hookRegistration.dispose() })\n }\n disposals.push({\n name: \"events\",\n dispose: () => {\n subscription.dispose()\n },\n })\n // The typed escalation tool (T-18, ADP-015): the agent's self-report\n // surface for stronger capability, applied at the next safe boundary.\n // The tier tool (ADP-055): the agent declares the task's tier; the\n // declaration steers the session's next admissions until cleared.\n // Typed RPC (ADP-034/036): the only channel to the control surfaces.\n // The settings-changed emitter resolves the registration lazily: handlers\n // only run after `register` resolves, so the holder is always populated.\n const rpcHolder: { registration?: RpcRegistration<typeof adaptiveRpc> } = {}\n const emit: AdaptiveRpcEmit = (...args) =>\n // The correlated tuple pairing is checked by the handler types; the\n // registration forwards it to the host emitter untouched.\n rpcHolder.registration?.events.emit(...args)\n try {\n const toolRegistration = await context.tool.transform((editor) => {\n editor.add(\n escalationTool((sessionID, reason, evidence) =>\n supervisor.noteEscalationRequest(sessionID, reason, evidence),\n ),\n )\n editor.add(tierTool((sessionID, tier) => supervisor.noteTierRequest(sessionID, tier)))\n })\n disposals.push({ name: \"tools\", dispose: () => toolRegistration.dispose() })\n const rpcRegistration = await context.rpc.register(\n adaptiveRpc,\n adaptiveRpcHandlers(supervisor, emit),\n )\n rpcHolder.registration = rpcRegistration\n disposals.push({ name: \"rpc\", dispose: () => rpcRegistration.dispose() })\n } catch (error) {\n // Roll back everything already registered so a failure at the tool or\n // rpc stage does not leak live hooks and the event pump.\n await settledAll()\n throw error\n }\n return () => settledAll()\n },\n})\n"]}
|
package/dist/plugin-id.d.ts
CHANGED
package/dist/plugin-id.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-id.js","sourceRoot":"","sources":["../src/plugin-id.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"plugin-id.js","sourceRoot":"","sources":["../src/plugin-id.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAA","sourcesContent":["/** The plugin identity shared by the server, TUI, and GUI entries. */\nexport const PLUGIN_ID = \"coool.adaptive\"\n"]}
|
package/dist/rpc/definition.d.ts
CHANGED
|
@@ -12,22 +12,37 @@ export declare const adaptiveRpc: {
|
|
|
12
12
|
readonly id: "coool.adaptive";
|
|
13
13
|
readonly methods: {
|
|
14
14
|
readonly "settings.get": {
|
|
15
|
+
readonly errors: {
|
|
16
|
+
internal: StandardSchemaV1<undefined, undefined>;
|
|
17
|
+
};
|
|
15
18
|
readonly input: StandardSchemaV1<undefined, undefined>;
|
|
16
19
|
readonly output: StandardSchemaV1<SettingsV1, SettingsV1>;
|
|
17
20
|
};
|
|
18
21
|
readonly "settings.set": {
|
|
22
|
+
readonly errors: {
|
|
23
|
+
internal: StandardSchemaV1<undefined, undefined>;
|
|
24
|
+
};
|
|
19
25
|
readonly input: StandardSchemaV1<SettingsPatch, SettingsPatch>;
|
|
20
26
|
readonly output: StandardSchemaV1<PatchResult, PatchResult>;
|
|
21
27
|
};
|
|
22
28
|
readonly "status.get": {
|
|
29
|
+
readonly errors: {
|
|
30
|
+
internal: StandardSchemaV1<undefined, undefined>;
|
|
31
|
+
};
|
|
23
32
|
readonly input: StandardSchemaV1<undefined, undefined>;
|
|
24
33
|
readonly output: StandardSchemaV1<StatusSnapshot, StatusSnapshot>;
|
|
25
34
|
};
|
|
26
35
|
readonly "receipts.list": {
|
|
36
|
+
readonly errors: {
|
|
37
|
+
internal: StandardSchemaV1<undefined, undefined>;
|
|
38
|
+
};
|
|
27
39
|
readonly input: StandardSchemaV1<undefined, undefined>;
|
|
28
40
|
readonly output: StandardSchemaV1<Receipt[], Receipt[]>;
|
|
29
41
|
};
|
|
30
42
|
readonly "session-mode.get": {
|
|
43
|
+
readonly errors: {
|
|
44
|
+
internal: StandardSchemaV1<undefined, undefined>;
|
|
45
|
+
};
|
|
31
46
|
readonly input: StandardSchemaV1<{
|
|
32
47
|
sessionID: string;
|
|
33
48
|
}, {
|
|
@@ -40,6 +55,9 @@ export declare const adaptiveRpc: {
|
|
|
40
55
|
}>;
|
|
41
56
|
};
|
|
42
57
|
readonly "session-mode.set": {
|
|
58
|
+
readonly errors: {
|
|
59
|
+
internal: StandardSchemaV1<undefined, undefined>;
|
|
60
|
+
};
|
|
43
61
|
readonly input: StandardSchemaV1<{
|
|
44
62
|
sessionID: string;
|
|
45
63
|
mode: OperatingMode | null;
|
|
@@ -50,6 +68,9 @@ export declare const adaptiveRpc: {
|
|
|
50
68
|
readonly output: StandardSchemaV1<SessionModeSetResult, SessionModeSetResult>;
|
|
51
69
|
};
|
|
52
70
|
readonly "tier-request.get": {
|
|
71
|
+
readonly errors: {
|
|
72
|
+
internal: StandardSchemaV1<undefined, undefined>;
|
|
73
|
+
};
|
|
53
74
|
readonly input: StandardSchemaV1<{
|
|
54
75
|
sessionID: string;
|
|
55
76
|
}, {
|
|
@@ -62,6 +83,9 @@ export declare const adaptiveRpc: {
|
|
|
62
83
|
}>;
|
|
63
84
|
};
|
|
64
85
|
readonly "tier-request.set": {
|
|
86
|
+
readonly errors: {
|
|
87
|
+
internal: StandardSchemaV1<undefined, undefined>;
|
|
88
|
+
};
|
|
65
89
|
readonly input: StandardSchemaV1<{
|
|
66
90
|
sessionID: string;
|
|
67
91
|
tier: string | null;
|
|
@@ -97,4 +121,3 @@ export declare const adaptiveRpc: {
|
|
|
97
121
|
};
|
|
98
122
|
};
|
|
99
123
|
export type AdaptiveRpc = typeof adaptiveRpc;
|
|
100
|
-
//# sourceMappingURL=definition.d.ts.map
|
package/dist/rpc/definition.js
CHANGED
|
@@ -11,10 +11,17 @@
|
|
|
11
11
|
* rejected as rpc.invalid_input); deeper validation happens in the handlers
|
|
12
12
|
* via the state parsers (`applyPatch` reports per-field errors instead), and
|
|
13
13
|
* output schemas are passthroughs over trusted server-side data.
|
|
14
|
+
*
|
|
15
|
+
* Every method declares one `internal` error with no data: handler failures
|
|
16
|
+
* are returned through the call context's error factory instead of thrown —
|
|
17
|
+
* a plain throw becomes a server defect and the client sees only the generic
|
|
18
|
+
* `rpc.internal` message (verified on the sibling @coool plugins).
|
|
14
19
|
*/
|
|
15
20
|
import { Rpc } from "@opencode/schema/rpc";
|
|
21
|
+
import { MAX_SESSION_ID_LENGTH } from "../state/session-modes/types.js";
|
|
16
22
|
export const ADAPTIVE_RPC_ID = "coool.adaptive";
|
|
17
23
|
const RPC_VENDOR = "coool.adaptive";
|
|
24
|
+
const INTERNAL_ERROR = { internal: voidSchema() };
|
|
18
25
|
/**
|
|
19
26
|
* Identity schema: the wire value passes through unchanged; the type
|
|
20
27
|
* parameters carry the transport contract. `gate` optionally rejects values
|
|
@@ -43,8 +50,19 @@ function voidSchema() {
|
|
|
43
50
|
}
|
|
44
51
|
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
45
52
|
const isString = (value) => typeof value === "string";
|
|
46
|
-
/**
|
|
47
|
-
|
|
53
|
+
/**
|
|
54
|
+
* `{ sessionID: string }` wire shape. Bounds checked here too: a session id
|
|
55
|
+
* beyond the bound cannot be a real host identifier and an empty string is
|
|
56
|
+
* never one, so neither reaches a handler or a store lookup.
|
|
57
|
+
*/
|
|
58
|
+
const hasSessionID = (value) => {
|
|
59
|
+
if (!(isRecord(value) && isString(value["sessionID"])))
|
|
60
|
+
return false;
|
|
61
|
+
const sessionID = value["sessionID"];
|
|
62
|
+
// A session id beyond the bound cannot be a real host identifier and an
|
|
63
|
+
// empty string is never one; neither reaches a handler or a store lookup.
|
|
64
|
+
return sessionID.length > 0 && sessionID.length <= MAX_SESSION_ID_LENGTH;
|
|
65
|
+
};
|
|
48
66
|
/** `{ sessionID: string, mode: OperatingMode | null }` wire shape. */
|
|
49
67
|
const isSessionModeSet = (value) => isRecord(value) &&
|
|
50
68
|
isString(value["sessionID"]) &&
|
|
@@ -57,34 +75,42 @@ export const adaptiveRpc = Rpc.define({
|
|
|
57
75
|
id: ADAPTIVE_RPC_ID,
|
|
58
76
|
methods: {
|
|
59
77
|
"settings.get": {
|
|
78
|
+
errors: INTERNAL_ERROR,
|
|
60
79
|
input: voidSchema(),
|
|
61
80
|
output: schema(isRecord, "output must be an object"),
|
|
62
81
|
},
|
|
63
82
|
"settings.set": {
|
|
83
|
+
errors: INTERNAL_ERROR,
|
|
64
84
|
input: schema(isRecord, "input must be an object"),
|
|
65
85
|
output: schema(isRecord, "output must be an object"),
|
|
66
86
|
},
|
|
67
87
|
"status.get": {
|
|
88
|
+
errors: INTERNAL_ERROR,
|
|
68
89
|
input: voidSchema(),
|
|
69
90
|
output: schema(isRecord, "output must be an object"),
|
|
70
91
|
},
|
|
71
92
|
"receipts.list": {
|
|
93
|
+
errors: INTERNAL_ERROR,
|
|
72
94
|
input: voidSchema(),
|
|
73
95
|
output: schema(Array.isArray, "output must be an array"),
|
|
74
96
|
},
|
|
75
97
|
"session-mode.get": {
|
|
98
|
+
errors: INTERNAL_ERROR,
|
|
76
99
|
input: schema(hasSessionID, "input must be an object with a sessionID string"),
|
|
77
100
|
output: schema(isRecord, "output must be an object"),
|
|
78
101
|
},
|
|
79
102
|
"session-mode.set": {
|
|
103
|
+
errors: INTERNAL_ERROR,
|
|
80
104
|
input: schema(isSessionModeSet, "input must be an object with a sessionID string and a mode string or null"),
|
|
81
105
|
output: schema(isRecord, "output must be an object"),
|
|
82
106
|
},
|
|
83
107
|
"tier-request.get": {
|
|
108
|
+
errors: INTERNAL_ERROR,
|
|
84
109
|
input: schema(hasSessionID, "input must be an object with a sessionID string"),
|
|
85
110
|
output: schema(isRecord, "output must be an object"),
|
|
86
111
|
},
|
|
87
112
|
"tier-request.set": {
|
|
113
|
+
errors: INTERNAL_ERROR,
|
|
88
114
|
input: schema(isTierRequestSet, "input must be an object with a sessionID string and a tier string or null"),
|
|
89
115
|
output: schema(isRecord, "output must be an object"),
|
|
90
116
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/rpc/definition.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/rpc/definition.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Typed RPC definition (ADP-034/036): the only channel between the server\n * plugin and the TUI/GUI surfaces. Surfaces hold no local settings state —\n * they fetch snapshots, patch settings, and re-fetch on the `settings-changed`\n * event (the server is the single source of truth). Session-mode overrides\n * follow the same contract via `session-mode.get/set` and the\n * `session-mode-changed` event (ADP-054); sticky per-session tier requests\n * follow it via `tier-request.get/set` and `tier-request-changed` (ADP-055).\n *\n * Schema note: input schemas gate the wire shape (non-object patches are\n * rejected as rpc.invalid_input); deeper validation happens in the handlers\n * via the state parsers (`applyPatch` reports per-field errors instead), and\n * output schemas are passthroughs over trusted server-side data.\n *\n * Every method declares one `internal` error with no data: handler failures\n * are returned through the call context's error factory instead of thrown —\n * a plain throw becomes a server defect and the client sees only the generic\n * `rpc.internal` message (verified on the sibling @coool plugins).\n */\nimport { Rpc } from \"@opencode/schema/rpc\"\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\"\nimport type { OperatingMode } from \"../core/scheduler/types.js\"\nimport type { SettingsPatch, SettingsV1 } from \"../state/settings/index.js\"\nimport type { PatchResult } from \"../state/settings/types.js\"\nimport type { SessionModeSetResult } from \"../state/session-modes/index.js\"\nimport type { TierRequestSetResult } from \"./handlers.js\"\nimport type { TierName } from \"../core/tier-policy/types.js\"\nimport { MAX_SESSION_ID_LENGTH } from \"../state/session-modes/types.js\"\nimport type { Receipt } from \"../state/receipts/types.js\"\nimport type { StatusSnapshot } from \"./status.js\"\n\nexport const ADAPTIVE_RPC_ID = \"coool.adaptive\"\nconst RPC_VENDOR = \"coool.adaptive\"\n\nconst INTERNAL_ERROR = { internal: voidSchema() }\n\n/**\n * Identity schema: the wire value passes through unchanged; the type\n * parameters carry the transport contract. `gate` optionally rejects values\n * before they reach a handler; the failure message names the expectation so a\n * rejected call is diagnosable from the wire error alone.\n */\nfunction schema<T>(gate: (value: unknown) => boolean, expectation: string): StandardSchemaV1<T, T> {\n return {\n \"~standard\": {\n version: 1,\n vendor: RPC_VENDOR,\n validate: (value) =>\n gate(value) ? { value: value as T } : { issues: [{ message: expectation }] },\n },\n }\n}\n\nfunction voidSchema(): StandardSchemaV1<undefined, undefined> {\n return {\n \"~standard\": {\n version: 1,\n vendor: RPC_VENDOR,\n validate: (value) =>\n value === undefined\n ? { value: undefined }\n : { issues: [{ message: \"unexpected input: no input expected\" }] },\n },\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst isString = (value: unknown): value is string => typeof value === \"string\"\n\n/**\n * `{ sessionID: string }` wire shape. Bounds checked here too: a session id\n * beyond the bound cannot be a real host identifier and an empty string is\n * never one, so neither reaches a handler or a store lookup.\n */\nconst hasSessionID = (value: unknown): boolean => {\n if (!(isRecord(value) && isString(value[\"sessionID\"]))) return false\n const sessionID = value[\"sessionID\"]\n // A session id beyond the bound cannot be a real host identifier and an\n // empty string is never one; neither reaches a handler or a store lookup.\n return sessionID.length > 0 && sessionID.length <= MAX_SESSION_ID_LENGTH\n}\n\n/** `{ sessionID: string, mode: OperatingMode | null }` wire shape. */\nconst isSessionModeSet = (value: unknown): boolean =>\n isRecord(value) &&\n isString(value[\"sessionID\"]) &&\n (value[\"mode\"] === null || isString(value[\"mode\"]))\n\n/** `{ sessionID: string, tier: string | null }` wire shape. */\nconst isTierRequestSet = (value: unknown): boolean =>\n isRecord(value) &&\n isString(value[\"sessionID\"]) &&\n (value[\"tier\"] === null || isString(value[\"tier\"]))\n\nexport const adaptiveRpc = Rpc.define({\n id: ADAPTIVE_RPC_ID,\n methods: {\n \"settings.get\": {\n errors: INTERNAL_ERROR,\n input: voidSchema(),\n output: schema<SettingsV1>(isRecord, \"output must be an object\"),\n },\n \"settings.set\": {\n errors: INTERNAL_ERROR,\n input: schema<SettingsPatch>(isRecord, \"input must be an object\"),\n output: schema<PatchResult>(isRecord, \"output must be an object\"),\n },\n \"status.get\": {\n errors: INTERNAL_ERROR,\n input: voidSchema(),\n output: schema<StatusSnapshot>(isRecord, \"output must be an object\"),\n },\n \"receipts.list\": {\n errors: INTERNAL_ERROR,\n input: voidSchema(),\n output: schema<Receipt[]>(Array.isArray, \"output must be an array\"),\n },\n \"session-mode.get\": {\n errors: INTERNAL_ERROR,\n input: schema<{ sessionID: string }>(\n hasSessionID,\n \"input must be an object with a sessionID string\",\n ),\n output: schema<{ mode: OperatingMode | null }>(isRecord, \"output must be an object\"),\n },\n \"session-mode.set\": {\n errors: INTERNAL_ERROR,\n input: schema<{ sessionID: string; mode: OperatingMode | null }>(\n isSessionModeSet,\n \"input must be an object with a sessionID string and a mode string or null\",\n ),\n output: schema<SessionModeSetResult>(isRecord, \"output must be an object\"),\n },\n \"tier-request.get\": {\n errors: INTERNAL_ERROR,\n input: schema<{ sessionID: string }>(\n hasSessionID,\n \"input must be an object with a sessionID string\",\n ),\n output: schema<{ tier: TierName | null }>(isRecord, \"output must be an object\"),\n },\n \"tier-request.set\": {\n errors: INTERNAL_ERROR,\n input: schema<{ sessionID: string; tier: string | null }>(\n isTierRequestSet,\n \"input must be an object with a sessionID string and a tier string or null\",\n ),\n output: schema<TierRequestSetResult>(isRecord, \"output must be an object\"),\n },\n },\n events: {\n \"settings-changed\": {\n schema: schema<{ version: number }>(isRecord, \"event data must be an object\"),\n },\n \"session-mode-changed\": {\n schema: schema<{ sessionID: string }>(\n hasSessionID,\n \"event data must be an object with a sessionID string\",\n ),\n },\n \"tier-request-changed\": {\n schema: schema<{ sessionID: string }>(\n hasSessionID,\n \"event data must be an object with a sessionID string\",\n ),\n },\n },\n})\n\nexport type AdaptiveRpc = typeof adaptiveRpc\n"]}
|
package/dist/rpc/handlers.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { OperatingMode } from "../core/scheduler/types.js";
|
|
2
2
|
import type { TierName } from "../core/tier-policy/types.js";
|
|
3
|
-
import type { SessionModeSetResult } from "../state/session-modes/index.js";
|
|
4
3
|
import type { PatchResult } from "../state/settings/types.js";
|
|
5
4
|
import type { SettingsPatch, SettingsV1 } from "../state/settings/index.js";
|
|
5
|
+
import type { Rpc } from "@opencode/schema/rpc";
|
|
6
6
|
import type { Receipt } from "../state/receipts/types.js";
|
|
7
7
|
import type { StatusSnapshot } from "./status.js";
|
|
8
|
+
import type { AdaptiveRpc } from "./definition.js";
|
|
8
9
|
export interface AdaptiveRpcSource {
|
|
9
10
|
settings(): Promise<SettingsV1>;
|
|
10
11
|
updateSettings(patch: SettingsPatch): Promise<PatchResult>;
|
|
@@ -38,28 +39,15 @@ export type TierRequestSetResult = {
|
|
|
38
39
|
readonly ok: false;
|
|
39
40
|
readonly errors: readonly string[];
|
|
40
41
|
};
|
|
42
|
+
type Methods = AdaptiveRpc["methods"];
|
|
43
|
+
type MethodName = Extract<keyof Methods, string>;
|
|
44
|
+
/** The subset of the host's RpcCallContext the handlers use (no plugin import). */
|
|
45
|
+
export interface AdaptiveRpcCallContext<Name extends MethodName> {
|
|
46
|
+
readonly error: Rpc.ErrorFactory<Methods[Name]>;
|
|
47
|
+
}
|
|
48
|
+
type HandlerErrorOf<Name extends MethodName> = Rpc.HandlerError<Methods[Name]>;
|
|
49
|
+
type HandlerOf<Name extends MethodName> = (input: Rpc.Output<Methods[Name]["input"]>, context: AdaptiveRpcCallContext<Name>) => Promise<Rpc.HandlerOutput<Methods[Name]["output"]> | HandlerErrorOf<Name>>;
|
|
41
50
|
export declare function adaptiveRpcHandlers(source: AdaptiveRpcSource, emit?: AdaptiveRpcEmit): {
|
|
42
|
-
|
|
43
|
-
"settings.set": (input: SettingsPatch) => Promise<PatchResult>;
|
|
44
|
-
"status.get": (input: undefined) => Promise<StatusSnapshot>;
|
|
45
|
-
"receipts.list": (input: undefined) => Promise<Receipt[]>;
|
|
46
|
-
"session-mode.get": (input: {
|
|
47
|
-
sessionID: string;
|
|
48
|
-
}) => Promise<{
|
|
49
|
-
mode: OperatingMode | null;
|
|
50
|
-
}>;
|
|
51
|
-
"session-mode.set": (input: {
|
|
52
|
-
sessionID: string;
|
|
53
|
-
mode: OperatingMode | null;
|
|
54
|
-
}) => Promise<SessionModeSetResult>;
|
|
55
|
-
"tier-request.get": (input: {
|
|
56
|
-
sessionID: string;
|
|
57
|
-
}) => Promise<{
|
|
58
|
-
tier: TierName | null;
|
|
59
|
-
}>;
|
|
60
|
-
"tier-request.set": (input: {
|
|
61
|
-
sessionID: string;
|
|
62
|
-
tier: string | null;
|
|
63
|
-
}) => Promise<TierRequestSetResult>;
|
|
51
|
+
[Name in MethodName]: HandlerOf<Name>;
|
|
64
52
|
};
|
|
65
|
-
|
|
53
|
+
export {};
|
package/dist/rpc/handlers.js
CHANGED
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
* RPC handler binding (ADP-034/036): adapts the supervisor's state API to the
|
|
3
3
|
* typed RPC methods. Handlers never throw for expected outcomes — an invalid
|
|
4
4
|
* patch is a per-field `PatchResult`, and an internal failure degrades to
|
|
5
|
-
* `{ ok: false }` (fail-open, ADP-031). Read methods
|
|
6
|
-
*
|
|
5
|
+
* `{ ok: false }` (fail-open, ADP-031). Read methods declare internal failures
|
|
6
|
+
* through the call context's error factory: a plain throw becomes a server
|
|
7
|
+
* defect whose generic `rpc.internal` message hides the cause (verified on the
|
|
8
|
+
* sibling @coool plugins).
|
|
7
9
|
*/
|
|
8
10
|
import { OPERATING_MODES } from "../core/scheduler/types.js";
|
|
9
11
|
import { TIERS } from "../core/tier-policy/types.js";
|
|
10
|
-
import { logFailOpen } from "../supervisor/log.js";
|
|
12
|
+
import { LOG_ERROR_LENGTH, logFailOpen } from "../supervisor/log.js";
|
|
11
13
|
import { isValidSessionID } from "../state/session-modes/index.js";
|
|
12
14
|
/** Per-field errors for a session-mode patch, mirroring the settings contract. */
|
|
13
15
|
function sessionModeSetError(input) {
|
|
@@ -31,7 +33,9 @@ function tierRequestSetError(input) {
|
|
|
31
33
|
}
|
|
32
34
|
export function adaptiveRpcHandlers(source, emit) {
|
|
33
35
|
return {
|
|
34
|
-
"settings.get": () => source
|
|
36
|
+
"settings.get": (_input, context) => source
|
|
37
|
+
.settings()
|
|
38
|
+
.catch((error) => context.error("internal", String(error).slice(0, LOG_ERROR_LENGTH))),
|
|
35
39
|
"settings.set": async (patch) => {
|
|
36
40
|
try {
|
|
37
41
|
const result = await source.updateSettings(patch);
|
|
@@ -50,9 +54,16 @@ export function adaptiveRpcHandlers(source, emit) {
|
|
|
50
54
|
return { ok: false, errors: ["internal error"] };
|
|
51
55
|
}
|
|
52
56
|
},
|
|
53
|
-
"status.get": () => source
|
|
54
|
-
|
|
55
|
-
|
|
57
|
+
"status.get": (_input, context) => source
|
|
58
|
+
.status()
|
|
59
|
+
.catch((error) => context.error("internal", String(error).slice(0, LOG_ERROR_LENGTH))),
|
|
60
|
+
"receipts.list": (_input, context) => source
|
|
61
|
+
.receipts()
|
|
62
|
+
.catch((error) => context.error("internal", String(error).slice(0, LOG_ERROR_LENGTH))),
|
|
63
|
+
"session-mode.get": (input, context) => source
|
|
64
|
+
.getSessionMode(input.sessionID)
|
|
65
|
+
.then((mode) => ({ mode }))
|
|
66
|
+
.catch((error) => context.error("internal", String(error).slice(0, LOG_ERROR_LENGTH))),
|
|
56
67
|
"session-mode.set": async (input) => {
|
|
57
68
|
const invalid = sessionModeSetError(input);
|
|
58
69
|
if (invalid !== undefined)
|
|
@@ -74,7 +85,10 @@ export function adaptiveRpcHandlers(source, emit) {
|
|
|
74
85
|
}
|
|
75
86
|
return { ok: true };
|
|
76
87
|
},
|
|
77
|
-
"tier-request.get": (input) => source
|
|
88
|
+
"tier-request.get": (input, context) => source
|
|
89
|
+
.getTierRequest(input.sessionID)
|
|
90
|
+
.then((tier) => ({ tier }))
|
|
91
|
+
.catch((error) => context.error("internal", String(error).slice(0, LOG_ERROR_LENGTH))),
|
|
78
92
|
"tier-request.set": async (input) => {
|
|
79
93
|
const invalid = tierRequestSetError(input);
|
|
80
94
|
if (invalid !== undefined)
|
package/dist/rpc/handlers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/rpc/handlers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/rpc/handlers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RPC handler binding (ADP-034/036): adapts the supervisor's state API to the\n * typed RPC methods. Handlers never throw for expected outcomes — an invalid\n * patch is a per-field `PatchResult`, and an internal failure degrades to\n * `{ ok: false }` (fail-open, ADP-031). Read methods declare internal failures\n * through the call context's error factory: a plain throw becomes a server\n * defect whose generic `rpc.internal` message hides the cause (verified on the\n * sibling @coool plugins).\n */\nimport { OPERATING_MODES } from \"../core/scheduler/types.js\"\nimport type { OperatingMode } from \"../core/scheduler/types.js\"\nimport { TIERS } from \"../core/tier-policy/types.js\"\nimport type { TierName } from \"../core/tier-policy/types.js\"\nimport { LOG_ERROR_LENGTH, logFailOpen } from \"../supervisor/log.js\"\nimport { isValidSessionID } from \"../state/session-modes/index.js\"\nimport type { PatchResult } from \"../state/settings/types.js\"\nimport type { SettingsPatch, SettingsV1 } from \"../state/settings/index.js\"\nimport type { Rpc } from \"@opencode/schema/rpc\"\nimport type { Receipt } from \"../state/receipts/types.js\"\nimport type { StatusSnapshot } from \"./status.js\"\nimport type { AdaptiveRpc } from \"./definition.js\"\n\nexport interface AdaptiveRpcSource {\n settings(): Promise<SettingsV1>\n updateSettings(patch: SettingsPatch): Promise<PatchResult>\n status(): Promise<StatusSnapshot>\n receipts(): Promise<Receipt[]>\n getSessionMode(sessionID: string): Promise<OperatingMode | null>\n setSessionMode(sessionID: string, mode: OperatingMode | null): Promise<void>\n getTierRequest(sessionID: string): Promise<TierName | null>\n noteTierRequest(sessionID: string, tier: string): boolean\n setTierRequest(sessionID: string, tier: TierName | null): Promise<void>\n}\n\nexport type SettingsChangedEmit = (name: \"settings-changed\", data: { version: number }) => unknown\n\n/**\n * Correlated emit: each call site pairs the event name with its own payload\n * shape — an invalid pairing is a type error, and the registration site can\n * forward the tuple to the host emitter untouched.\n */\nexport type AdaptiveRpcEmit = (\n ...args:\n | [\"settings-changed\", { version: number }]\n | [\"session-mode-changed\", { sessionID: string }]\n | [\"tier-request-changed\", { sessionID: string }]\n) => unknown\n\n/** A successful tier-request write; mirrors the SessionModeSetResult convention. */\nexport type TierRequestSetResult =\n { readonly ok: true } | { readonly ok: false; readonly errors: readonly string[] }\n\n/** Per-field errors for a session-mode patch, mirroring the settings contract. */\nfunction sessionModeSetError(input: {\n sessionID: string\n mode: OperatingMode | null\n}): string | undefined {\n if (!isValidSessionID(input.sessionID)) {\n return \"sessionID must be a non-empty string of at most 128 characters\"\n }\n if (input.mode !== null && !(OPERATING_MODES as readonly string[]).includes(input.mode)) {\n return `mode must be one of ${OPERATING_MODES.join(\", \")} or null`\n }\n return undefined\n}\n\n/** Same contract for a tier-request patch (ADP-055): vocabulary-gated tier. */\nfunction tierRequestSetError(input: {\n sessionID: string\n tier: string | null\n}): string | undefined {\n if (!isValidSessionID(input.sessionID)) {\n return \"sessionID must be a non-empty string of at most 128 characters\"\n }\n if (input.tier !== null && !(TIERS as readonly string[]).includes(input.tier)) {\n return `tier must be one of ${TIERS.join(\", \")} or null`\n }\n return undefined\n}\n\ntype Methods = AdaptiveRpc[\"methods\"]\ntype MethodName = Extract<keyof Methods, string>\n\n/** The subset of the host's RpcCallContext the handlers use (no plugin import). */\nexport interface AdaptiveRpcCallContext<Name extends MethodName> {\n readonly error: Rpc.ErrorFactory<Methods[Name]>\n}\n\ntype HandlerErrorOf<Name extends MethodName> = Rpc.HandlerError<Methods[Name]>\n\ntype HandlerOf<Name extends MethodName> = (\n input: Rpc.Output<Methods[Name][\"input\"]>,\n context: AdaptiveRpcCallContext<Name>,\n) => Promise<Rpc.HandlerOutput<Methods[Name][\"output\"]> | HandlerErrorOf<Name>>\n\nexport function adaptiveRpcHandlers(\n source: AdaptiveRpcSource,\n emit?: AdaptiveRpcEmit,\n): { [Name in MethodName]: HandlerOf<Name> } {\n return {\n \"settings.get\": (_input, context) =>\n source\n .settings()\n .catch((error: unknown) =>\n context.error(\"internal\", String(error).slice(0, LOG_ERROR_LENGTH)),\n ),\n \"settings.set\": async (patch) => {\n try {\n const result = await source.updateSettings(patch)\n if (result.ok && emit !== undefined) {\n try {\n await emit(\"settings-changed\", { version: result.settings.version })\n } catch (error) {\n logFailOpen(\"rpc-emit\", error)\n }\n }\n return result\n } catch (error) {\n logFailOpen(\"rpc-set\", error)\n return { ok: false, errors: [\"internal error\"] }\n }\n },\n \"status.get\": (_input, context) =>\n source\n .status()\n .catch((error: unknown) =>\n context.error(\"internal\", String(error).slice(0, LOG_ERROR_LENGTH)),\n ),\n \"receipts.list\": (_input, context) =>\n source\n .receipts()\n .catch((error: unknown) =>\n context.error(\"internal\", String(error).slice(0, LOG_ERROR_LENGTH)),\n ),\n \"session-mode.get\": (input, context) =>\n source\n .getSessionMode(input.sessionID)\n .then((mode) => ({ mode }))\n .catch((error: unknown) =>\n context.error(\"internal\", String(error).slice(0, LOG_ERROR_LENGTH)),\n ),\n \"session-mode.set\": async (input) => {\n const invalid = sessionModeSetError(input)\n if (invalid !== undefined) return { ok: false, errors: [invalid] }\n try {\n await source.setSessionMode(input.sessionID, input.mode)\n } catch (error) {\n logFailOpen(\"rpc-set\", error)\n return { ok: false, errors: [\"internal error\"] }\n }\n if (emit !== undefined) {\n try {\n await emit(\"session-mode-changed\", { sessionID: input.sessionID })\n } catch (error) {\n logFailOpen(\"rpc-emit\", error)\n }\n }\n return { ok: true }\n },\n \"tier-request.get\": (input, context) =>\n source\n .getTierRequest(input.sessionID)\n .then((tier) => ({ tier }))\n .catch((error: unknown) =>\n context.error(\"internal\", String(error).slice(0, LOG_ERROR_LENGTH)),\n ),\n \"tier-request.set\": async (input) => {\n const invalid = tierRequestSetError(input)\n if (invalid !== undefined) return { ok: false, errors: [invalid] }\n if (input.tier !== null) {\n // A non-null tier is a sticky record: noteTierRequest re-validates the\n // vocabulary (post-gate this cannot fail, so treat `false` as internal).\n if (!source.noteTierRequest(input.sessionID, input.tier)) {\n logFailOpen(\"rpc-set\", new Error(\"tier request rejected\"))\n return { ok: false, errors: [\"internal error\"] }\n }\n } else {\n try {\n await source.setTierRequest(input.sessionID, null)\n } catch (error) {\n logFailOpen(\"rpc-set\", error)\n return { ok: false, errors: [\"internal error\"] }\n }\n }\n if (emit !== undefined) {\n try {\n await emit(\"tier-request-changed\", { sessionID: input.sessionID })\n } catch (error) {\n logFailOpen(\"rpc-emit\", error)\n }\n }\n return { ok: true }\n },\n }\n}\n"]}
|
package/dist/rpc/status.d.ts
CHANGED
package/dist/rpc/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/rpc/status.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAG/D,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AA6BlE,MAAM,UAAU,WAAW,CAAC,KAM3B;IACC,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAA;IAC/C,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;IAC/E,MAAM,KAAK,GAAG,EAA4C,CAAA;IAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACnD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAA;YACjD,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAA;YACvE,OAAO;gBACL,GAAG;gBACH,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS;gBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,QAAQ;gBAC1C,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,SAAS;gBACtC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI;gBAC1C,WAAW,EAAE,mBAAmB,CAAC,eAAe,CAAC;gBACjD,OAAO,EAAE,eAAe,EAAE,OAAO,IAAI,IAAI;aAC1C,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;QACzB,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG;QACvB,KAAK;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,OAA+B;IAC1D,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC,CAAA;IAChF,IAAI,OAAO,EAAE,cAAc,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,CAAA;IAChG,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/rpc/status.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAG/D,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AA6BlE,MAAM,UAAU,WAAW,CAAC,KAM3B;IACC,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAA;IAC/C,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;IAC/E,MAAM,KAAK,GAAG,EAA4C,CAAA;IAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACnD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAA;YACjD,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAA;YACvE,OAAO;gBACL,GAAG;gBACH,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS;gBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,QAAQ;gBAC1C,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,SAAS;gBACtC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI;gBAC1C,WAAW,EAAE,mBAAmB,CAAC,eAAe,CAAC;gBACjD,OAAO,EAAE,eAAe,EAAE,OAAO,IAAI,IAAI;aAC1C,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;QACzB,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG;QACvB,KAAK;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,OAA+B;IAC1D,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC,CAAA;IAChF,IAAI,OAAO,EAAE,cAAc,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,CAAA;IAChG,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["/**\n * Status snapshot for the control surfaces (ADP-033): a bounded, secret-free\n * view of the settings and the resource-health state of every configured\n * resource. Pure — the supervisor (or any future caller) gathers the inputs.\n */\nimport type { OperatingMode } from \"../core/scheduler/types.js\"\nimport { schedulerHealthKey } from \"../core/scheduler/index.js\"\nimport type { ModelRef } from \"../core/work-unit/types.js\"\nimport type { TierName } from \"../core/tier-policy/types.js\"\nimport { TIERS } from \"../core/tier-policy/types.js\"\nimport type { ResourceRecord } from \"../health/resource-health/types.js\"\nimport type { CapacityReading } from \"../health/capacity/types.js\"\nimport { resourceKeyID } from \"../health/resource-health/index.js\"\nimport type { SettingsV1 } from \"../state/settings/index.js\"\n\nexport interface TierResourceStatus {\n ref: ModelRef\n health: ResourceRecord[\"health\"]\n breaker: ResourceRecord[\"breaker\"][\"state\"]\n windowed: boolean\n /**\n * Wall-clock deadline of the active window (ms epoch); null when unwindowed.\n * Null — not undefined: the host RPC encoder rejects JSON objects carrying a\n * present-but-undefined key (\"Expected JSON value\"), which 500'd every\n * status.get once any resource was configured.\n */\n windowUntil: number | null\n /** Used capacity as a rounded whole percent; null when no reading exists. */\n usedPercent: number | null\n /** Wall-clock capacity reset deadline (ms epoch); null when unread. */\n resetAt: number | null\n}\n\nexport interface StatusSnapshot {\n mode: OperatingMode\n pin: ModelRef | null\n tiers: Readonly<Record<TierName, readonly TierResourceStatus[]>>\n parked: number\n receipts: number\n}\n\nexport function buildStatus(input: {\n settings: SettingsV1\n health: readonly ResourceRecord[]\n capacity: Readonly<Record<string, CapacityReading | null>>\n parked: number\n receipts: number\n}): StatusSnapshot {\n const byKey = new Map<string, ResourceRecord>()\n for (const record of input.health) byKey.set(resourceKeyID(record.key), record)\n const tiers = {} as Record<TierName, TierResourceStatus[]>\n for (const tier of TIERS) {\n tiers[tier] = input.settings.tiers[tier].map((ref) => {\n const record = byKey.get(schedulerHealthKey(ref))\n const capacityReading = input.capacity[schedulerHealthKey(ref)] ?? null\n return {\n ref,\n health: record?.health ?? \"healthy\",\n breaker: record?.breaker.state ?? \"closed\",\n windowed: record?.window !== undefined,\n windowUntil: record?.window?.until ?? null,\n usedPercent: capacityUsedPercent(capacityReading),\n resetAt: capacityReading?.resetAt ?? null,\n }\n })\n }\n return {\n mode: input.settings.mode,\n pin: input.settings.pin,\n tiers,\n parked: input.parked,\n receipts: input.receipts,\n }\n}\n\n/**\n * Derives the used-capacity percentage from a reading. Readings may carry any\n * subset of the two ratios: usedRatio directly, or the remainder inferred from\n * remainingRatio. A reading with neither ratio is still present (confidence,\n * resetAt may be set) but yields no percentage — null, not undefined.\n */\nfunction capacityUsedPercent(reading: CapacityReading | null): number | null {\n if (reading?.usedRatio !== undefined) return Math.round(reading.usedRatio * 100)\n if (reading?.remainingRatio !== undefined) return Math.round((1 - reading.remainingRatio) * 100)\n return null\n}\n"]}
|
package/dist/rpc.d.ts
CHANGED
|
@@ -8,4 +8,3 @@ export { adaptiveRpcHandlers } from "./rpc/handlers.js";
|
|
|
8
8
|
export type { AdaptiveRpcSource, AdaptiveRpcEmit, SettingsChangedEmit, TierRequestSetResult, } from "./rpc/handlers.js";
|
|
9
9
|
export { buildStatus } from "./rpc/status.js";
|
|
10
10
|
export type { StatusSnapshot, TierResourceStatus } from "./rpc/status.js";
|
|
11
|
-
//# sourceMappingURL=rpc.d.ts.map
|
package/dist/rpc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAElE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAOvD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAElE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAOvD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA","sourcesContent":["/**\n * RPC entrypoint: the typed definition shared by the server plugin and the\n * control surfaces, plus the handler binding used server-side.\n */\nexport { adaptiveRpc, ADAPTIVE_RPC_ID } from \"./rpc/definition.js\"\nexport type { AdaptiveRpc } from \"./rpc/definition.js\"\nexport { adaptiveRpcHandlers } from \"./rpc/handlers.js\"\nexport type {\n AdaptiveRpcSource,\n AdaptiveRpcEmit,\n SettingsChangedEmit,\n TierRequestSetResult,\n} from \"./rpc/handlers.js\"\nexport { buildStatus } from \"./rpc/status.js\"\nexport type { StatusSnapshot, TierResourceStatus } from \"./rpc/status.js\"\n"]}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export { CAPACITY_KEY, CAPACITY_VERSION, MAX_CAPACITY_READINGS, type CapacityPayload, type CapacityStorage, type PersistedCapacityReading, } from "./types.js";
|
|
2
2
|
export { parseCapacityPayload } from "./parse.js";
|
|
3
3
|
export { CapacityReadingStore } from "./store.js";
|
|
4
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/state/capacity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,GAItB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/state/capacity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,GAItB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA","sourcesContent":["export {\n CAPACITY_KEY,\n CAPACITY_VERSION,\n MAX_CAPACITY_READINGS,\n type CapacityPayload,\n type CapacityStorage,\n type PersistedCapacityReading,\n} from \"./types.js\"\nexport { parseCapacityPayload } from \"./parse.js\"\nexport { CapacityReadingStore } from \"./store.js\"\n"]}
|
|
@@ -11,10 +11,15 @@ function isRecord(value) {
|
|
|
11
11
|
function isFiniteNumber(raw) {
|
|
12
12
|
return typeof raw === "number" && Number.isFinite(raw);
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* A non-empty bounded identifier. Over-long values are rejected, not
|
|
16
|
+
* truncated: the writer stores keys as-is, so a truncated key would name a
|
|
17
|
+
* different resource.
|
|
18
|
+
*/
|
|
14
19
|
function parseIdentifier(raw) {
|
|
15
|
-
if (typeof raw !== "string")
|
|
20
|
+
if (typeof raw !== "string" || raw === "" || raw.length > 128)
|
|
16
21
|
return undefined;
|
|
17
|
-
return raw
|
|
22
|
+
return raw;
|
|
18
23
|
}
|
|
19
24
|
function parseKey(raw) {
|
|
20
25
|
if (!isRecord(raw))
|
|
@@ -25,6 +30,13 @@ function parseKey(raw) {
|
|
|
25
30
|
const accountID = parseIdentifier(raw["accountID"]);
|
|
26
31
|
const modelID = parseIdentifier(raw["modelID"]);
|
|
27
32
|
const variantID = parseIdentifier(raw["variantID"]);
|
|
33
|
+
// A present-but-unusable scope field would silently widen the key.
|
|
34
|
+
if (raw["accountID"] !== undefined && accountID === undefined)
|
|
35
|
+
return undefined;
|
|
36
|
+
if (raw["modelID"] !== undefined && modelID === undefined)
|
|
37
|
+
return undefined;
|
|
38
|
+
if (raw["variantID"] !== undefined && variantID === undefined)
|
|
39
|
+
return undefined;
|
|
28
40
|
// Scope fields must form a valid prefix: a variant without a model is not
|
|
29
41
|
// addressable against a model inventory and is not a real resource.
|
|
30
42
|
if (variantID !== undefined && modelID === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/state/capacity/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAGlE,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAiC,MAAM,YAAY,CAAA;AAEnG,0EAA0E;AAC1E,4EAA4E;AAC5E,2EAA2E;AAC3E,8EAA8E;AAC9E,4BAA4B;AAE5B,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACxD,CAAC;AAED,SAAS,eAAe,CAAC,GAAY;IACnC,IAAI,OAAO,GAAG,KAAK,QAAQ
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/state/capacity/parse.ts"],"names":[],"mappings":"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","sourcesContent":["import { CONFIDENCE_LEVELS } from \"../../health/capacity/types.js\"\nimport type { CapacityReading } from \"../../health/capacity/types.js\"\nimport type { ResourceKey } from \"../../health/resource-health/types.js\"\nimport { CAPACITY_VERSION, MAX_CAPACITY_READINGS, type PersistedCapacityReading } from \"./types.js\"\n\n// Defensive readers: persisted data is untrusted. Every parser is total —\n// accepts unknown, returns typed records, and drops anything invalid — so a\n// corrupted file can never take the plugin down (ADP-031). An older plugin\n// reading a newer payload drops unknown-vocabulary entries; the version field\n// guards the schema itself.\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction isFiniteNumber(raw: unknown): raw is number {\n return typeof raw === \"number\" && Number.isFinite(raw)\n}\n\n/**\n * A non-empty bounded identifier. Over-long values are rejected, not\n * truncated: the writer stores keys as-is, so a truncated key would name a\n * different resource.\n */\nfunction parseIdentifier(raw: unknown): string | undefined {\n if (typeof raw !== \"string\" || raw === \"\" || raw.length > 128) return undefined\n return raw\n}\n\nfunction parseKey(raw: unknown): ResourceKey | undefined {\n if (!isRecord(raw)) return undefined\n const providerID = parseIdentifier(raw[\"providerID\"])\n if (providerID === undefined) return undefined\n const accountID = parseIdentifier(raw[\"accountID\"])\n const modelID = parseIdentifier(raw[\"modelID\"])\n const variantID = parseIdentifier(raw[\"variantID\"])\n // A present-but-unusable scope field would silently widen the key.\n if (raw[\"accountID\"] !== undefined && accountID === undefined) return undefined\n if (raw[\"modelID\"] !== undefined && modelID === undefined) return undefined\n if (raw[\"variantID\"] !== undefined && variantID === undefined) return undefined\n // Scope fields must form a valid prefix: a variant without a model is not\n // addressable against a model inventory and is not a real resource.\n if (variantID !== undefined && modelID === undefined) return undefined\n return {\n providerID,\n ...(accountID !== undefined ? { accountID } : {}),\n ...(modelID !== undefined ? { modelID } : {}),\n ...(variantID !== undefined ? { variantID } : {}),\n }\n}\n\nfunction parseRatio(raw: unknown): number | undefined {\n return isFiniteNumber(raw) && raw >= 0 && raw <= 1 ? raw : undefined\n}\n\nfunction parseReading(raw: unknown): CapacityReading | undefined {\n if (!isRecord(raw)) return undefined\n const confidence = CONFIDENCE_LEVELS.find((level) => level === raw[\"confidence\"])\n if (confidence === undefined) return undefined\n const observedAt = raw[\"observedAt\"]\n if (!isFiniteNumber(observedAt) || observedAt < 0) return undefined\n const usedRatio = parseRatio(raw[\"usedRatio\"])\n const remainingRatio = parseRatio(raw[\"remainingRatio\"])\n const retryAfterMs =\n isFiniteNumber(raw[\"retryAfterMs\"]) && raw[\"retryAfterMs\"] >= 0\n ? raw[\"retryAfterMs\"]\n : undefined\n const resetAt = isFiniteNumber(raw[\"resetAt\"]) && raw[\"resetAt\"] >= 0 ? raw[\"resetAt\"] : undefined\n // A reading with none of the measured fields carries no information and is\n // discarded (mirrors the domain rule in health/capacity/types.ts).\n if (\n usedRatio === undefined &&\n remainingRatio === undefined &&\n retryAfterMs === undefined &&\n resetAt === undefined\n ) {\n return undefined\n }\n const evidence = raw[\"evidence\"]\n return {\n ...(usedRatio !== undefined ? { usedRatio } : {}),\n ...(remainingRatio !== undefined ? { remainingRatio } : {}),\n ...(retryAfterMs !== undefined ? { retryAfterMs } : {}),\n ...(resetAt !== undefined ? { resetAt } : {}),\n confidence,\n observedAt,\n ...(typeof evidence === \"string\" && evidence.length > 0\n ? { evidence: evidence.slice(0, 128) }\n : {}),\n }\n}\n\nfunction parseEntry(raw: unknown): PersistedCapacityReading | undefined {\n if (!isRecord(raw)) return undefined\n const key = parseKey(raw[\"key\"])\n if (key === undefined) return undefined\n const reading = parseReading(raw[\"reading\"])\n if (reading === undefined) return undefined\n return { key, reading }\n}\n\n// Every parser is total: accepts unknown, returns typed records, and drops\n// anything invalid — a corrupted file can never take the plugin down\n// (ADP-031). An older plugin reading newer records may drop\n// unknown-vocabulary entries — records are bounded mirrors of an in-memory\n// registry, and the payload version guards the schema itself.\nexport function parseCapacityPayload(raw: unknown): PersistedCapacityReading[] {\n if (!isRecord(raw)) return []\n if (raw[\"version\"] !== CAPACITY_VERSION) return []\n if (!Array.isArray(raw[\"readings\"])) return []\n const list = raw[\"readings\"]\n const readings: PersistedCapacityReading[] = []\n for (const entry of list.slice(0, MAX_CAPACITY_READINGS)) {\n const parsed = parseEntry(entry)\n if (parsed !== undefined) readings.push(parsed)\n }\n return readings\n}\n"]}
|