@pellux/goodvibes-sdk 0.38.0 → 1.1.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/dist/contracts/artifacts/operator-contract.json +4468 -916
- package/dist/daemon.d.ts +2 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +4 -0
- package/dist/events/communication.d.ts +1 -1
- package/dist/events/surfaces.d.ts +25 -3
- package/dist/events/surfaces.d.ts.map +1 -1
- package/dist/events/surfaces.js +22 -1
- package/dist/events/workflows.d.ts +7 -6
- package/dist/events/workflows.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/platform/agents/archetypes.d.ts.map +1 -1
- package/dist/platform/agents/archetypes.js +7 -0
- package/dist/platform/agents/index.d.ts +1 -0
- package/dist/platform/agents/index.d.ts.map +1 -1
- package/dist/platform/agents/index.js +1 -0
- package/dist/platform/agents/orchestrator-runner.d.ts +16 -3
- package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator-runner.js +20 -6
- package/dist/platform/agents/orchestrator.d.ts +42 -10
- package/dist/platform/agents/orchestrator.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator.js +68 -20
- package/dist/platform/agents/planner-decomposition-runner.d.ts +38 -0
- package/dist/platform/agents/planner-decomposition-runner.d.ts.map +1 -0
- package/dist/platform/agents/planner-decomposition-runner.js +113 -0
- package/dist/platform/agents/turn-knowledge-injection.d.ts +88 -3
- package/dist/platform/agents/turn-knowledge-injection.d.ts.map +1 -1
- package/dist/platform/agents/turn-knowledge-injection.js +147 -30
- package/dist/platform/agents/worktree.d.ts +126 -8
- package/dist/platform/agents/worktree.d.ts.map +1 -1
- package/dist/platform/agents/worktree.js +240 -19
- package/dist/platform/agents/wrfc-controller.d.ts +24 -1
- package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-controller.js +161 -35
- package/dist/platform/agents/wrfc-gate-runtime.d.ts +9 -0
- package/dist/platform/agents/wrfc-gate-runtime.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-gate-runtime.js +7 -3
- package/dist/platform/agents/wrfc-gates.d.ts +1 -1
- package/dist/platform/agents/wrfc-gates.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-gates.js +7 -1
- package/dist/platform/agents/wrfc-types.d.ts +23 -3
- package/dist/platform/agents/wrfc-types.d.ts.map +1 -1
- package/dist/platform/automation/types.d.ts +9 -1
- package/dist/platform/automation/types.d.ts.map +1 -1
- package/dist/platform/calendar/calendar-api-shared.d.ts +25 -0
- package/dist/platform/calendar/calendar-api-shared.d.ts.map +1 -0
- package/dist/platform/calendar/calendar-api-shared.js +100 -0
- package/dist/platform/calendar/calendar-connector.d.ts +79 -0
- package/dist/platform/calendar/calendar-connector.d.ts.map +1 -0
- package/dist/platform/calendar/calendar-connector.js +155 -0
- package/dist/platform/calendar/google-calendar-api.d.ts +25 -0
- package/dist/platform/calendar/google-calendar-api.d.ts.map +1 -0
- package/dist/platform/calendar/google-calendar-api.js +89 -0
- package/dist/platform/calendar/http-fetch-adapter.d.ts +25 -0
- package/dist/platform/calendar/http-fetch-adapter.d.ts.map +1 -0
- package/dist/platform/calendar/http-fetch-adapter.js +25 -0
- package/dist/platform/calendar/ics-parser.d.ts +35 -0
- package/dist/platform/calendar/ics-parser.d.ts.map +1 -0
- package/dist/platform/calendar/ics-parser.js +236 -0
- package/dist/platform/calendar/index.d.ts +41 -0
- package/dist/platform/calendar/index.d.ts.map +1 -0
- package/dist/platform/calendar/index.js +49 -0
- package/dist/platform/calendar/merged-calendar-model.d.ts +67 -0
- package/dist/platform/calendar/merged-calendar-model.d.ts.map +1 -0
- package/dist/platform/calendar/merged-calendar-model.js +181 -0
- package/dist/platform/calendar/microsoft-graph-api.d.ts +25 -0
- package/dist/platform/calendar/microsoft-graph-api.d.ts.map +1 -0
- package/dist/platform/calendar/microsoft-graph-api.js +95 -0
- package/dist/platform/calendar/oauth-flow.d.ts +62 -0
- package/dist/platform/calendar/oauth-flow.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-flow.js +305 -0
- package/dist/platform/calendar/oauth-providers.d.ts +43 -0
- package/dist/platform/calendar/oauth-providers.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-providers.js +120 -0
- package/dist/platform/calendar/oauth-token-store.d.ts +72 -0
- package/dist/platform/calendar/oauth-token-store.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-token-store.js +189 -0
- package/dist/platform/calendar/oauth-types.d.ts +274 -0
- package/dist/platform/calendar/oauth-types.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-types.js +22 -0
- package/dist/platform/calendar/rrule.d.ts +39 -0
- package/dist/platform/calendar/rrule.d.ts.map +1 -0
- package/dist/platform/calendar/rrule.js +261 -0
- package/dist/platform/calendar/subscription-store.d.ts +118 -0
- package/dist/platform/calendar/subscription-store.d.ts.map +1 -0
- package/dist/platform/calendar/subscription-store.js +293 -0
- package/dist/platform/calendar/types.d.ts +170 -0
- package/dist/platform/calendar/types.d.ts.map +1 -0
- package/dist/platform/calendar/types.js +21 -0
- package/dist/platform/companion/companion-chat-attachments.d.ts +29 -0
- package/dist/platform/companion/companion-chat-attachments.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-attachments.js +121 -0
- package/dist/platform/companion/companion-chat-branching.d.ts +66 -0
- package/dist/platform/companion/companion-chat-branching.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-branching.js +142 -0
- package/dist/platform/companion/companion-chat-broker-bridge.d.ts +40 -0
- package/dist/platform/companion/companion-chat-broker-bridge.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-broker-bridge.js +14 -0
- package/dist/platform/companion/companion-chat-broker-sync.d.ts +38 -0
- package/dist/platform/companion/companion-chat-broker-sync.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-broker-sync.js +80 -0
- package/dist/platform/companion/companion-chat-gc.d.ts +63 -0
- package/dist/platform/companion/companion-chat-gc.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-gc.js +38 -0
- package/dist/platform/companion/companion-chat-manager.d.ts +91 -23
- package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-manager.js +195 -223
- package/dist/platform/companion/companion-chat-persistence.d.ts +9 -1
- package/dist/platform/companion/companion-chat-persistence.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-persistence.js +10 -2
- package/dist/platform/companion/companion-chat-routes.d.ts +2 -1
- package/dist/platform/companion/companion-chat-routes.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-routes.js +113 -4
- package/dist/platform/companion/companion-chat-turn-execution.d.ts +61 -0
- package/dist/platform/companion/companion-chat-turn-execution.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-turn-execution.js +107 -0
- package/dist/platform/companion/companion-chat-types.d.ts +67 -0
- package/dist/platform/companion/companion-chat-types.d.ts.map +1 -1
- package/dist/platform/config/credential-status.d.ts +28 -0
- package/dist/platform/config/credential-status.d.ts.map +1 -0
- package/dist/platform/config/credential-status.js +75 -0
- package/dist/platform/config/index.d.ts +25 -0
- package/dist/platform/config/index.d.ts.map +1 -1
- package/dist/platform/config/index.js +18 -0
- package/dist/platform/config/manager.d.ts +9 -0
- package/dist/platform/config/manager.d.ts.map +1 -1
- package/dist/platform/config/manager.js +21 -2
- package/dist/platform/config/migrations.d.ts +48 -0
- package/dist/platform/config/migrations.d.ts.map +1 -0
- package/dist/platform/config/migrations.js +54 -0
- package/dist/platform/config/schema-domain-core.d.ts +10 -1
- package/dist/platform/config/schema-domain-core.d.ts.map +1 -1
- package/dist/platform/config/schema-domain-core.js +46 -3
- package/dist/platform/config/schema-domain-runtime.d.ts +8 -0
- package/dist/platform/config/schema-domain-runtime.d.ts.map +1 -1
- package/dist/platform/config/schema-domain-runtime.js +32 -0
- package/dist/platform/config/schema-types.d.ts +21 -7
- package/dist/platform/config/schema-types.d.ts.map +1 -1
- package/dist/platform/config/schema.d.ts.map +1 -1
- package/dist/platform/config/schema.js +2 -0
- package/dist/platform/control-plane/approval-broker.d.ts +11 -0
- package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
- package/dist/platform/control-plane/approval-broker.js +17 -1
- package/dist/platform/control-plane/approval-hunk-apply.d.ts +77 -0
- package/dist/platform/control-plane/approval-hunk-apply.d.ts.map +1 -0
- package/dist/platform/control-plane/approval-hunk-apply.js +80 -0
- package/dist/platform/control-plane/gateway-disabled-response.d.ts +20 -0
- package/dist/platform/control-plane/gateway-disabled-response.d.ts.map +1 -0
- package/dist/platform/control-plane/gateway-disabled-response.js +24 -0
- package/dist/platform/control-plane/gateway-scope-enforcement.d.ts +68 -0
- package/dist/platform/control-plane/gateway-scope-enforcement.d.ts.map +1 -0
- package/dist/platform/control-plane/gateway-scope-enforcement.js +91 -0
- package/dist/platform/control-plane/gateway-utils.d.ts +17 -0
- package/dist/platform/control-plane/gateway-utils.d.ts.map +1 -1
- package/dist/platform/control-plane/gateway-utils.js +30 -0
- package/dist/platform/control-plane/gateway.d.ts +12 -2
- package/dist/platform/control-plane/gateway.d.ts.map +1 -1
- package/dist/platform/control-plane/gateway.js +27 -31
- package/dist/platform/control-plane/index.d.ts +8 -1
- package/dist/platform/control-plane/index.d.ts.map +1 -1
- package/dist/platform/control-plane/index.js +8 -0
- package/dist/platform/control-plane/invoke-input-validation.d.ts +56 -0
- package/dist/platform/control-plane/invoke-input-validation.d.ts.map +1 -0
- package/dist/platform/control-plane/invoke-input-validation.js +163 -0
- package/dist/platform/control-plane/method-catalog-admin.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-admin.js +12 -1
- package/dist/platform/control-plane/method-catalog-calendar.d.ts +16 -0
- package/dist/platform/control-plane/method-catalog-calendar.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-calendar.js +21 -0
- package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-channels.js +32 -3
- package/dist/platform/control-plane/method-catalog-control-automation.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-control-automation.js +19 -34
- package/dist/platform/control-plane/method-catalog-control-companion.d.ts +15 -0
- package/dist/platform/control-plane/method-catalog-control-companion.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-control-companion.js +176 -0
- package/dist/platform/control-plane/method-catalog-control-core.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-control-core.js +104 -122
- package/dist/platform/control-plane/method-catalog-control.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-control.js +4 -0
- package/dist/platform/control-plane/method-catalog-email.d.ts +17 -0
- package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-email.js +21 -0
- package/dist/platform/control-plane/method-catalog-events.d.ts +28 -0
- package/dist/platform/control-plane/method-catalog-events.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-events.js +74 -1
- package/dist/platform/control-plane/method-catalog-fleet.d.ts +24 -0
- package/dist/platform/control-plane/method-catalog-fleet.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-fleet.js +65 -0
- package/dist/platform/control-plane/method-catalog-push.d.ts +30 -0
- package/dist/platform/control-plane/method-catalog-push.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-push.js +80 -0
- package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts +84 -0
- package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-route-reconcile.js +103 -0
- package/dist/platform/control-plane/method-catalog-runtime.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-runtime.js +83 -1
- package/dist/platform/control-plane/method-catalog-shared.d.ts +29 -0
- package/dist/platform/control-plane/method-catalog-shared.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog.d.ts +9 -0
- package/dist/platform/control-plane/method-catalog.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog.js +34 -3
- package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts +8 -0
- package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-admin.js +22 -1
- package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts +18 -0
- package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts.map +1 -0
- package/dist/platform/control-plane/operator-contract-schemas-fleet.js +182 -0
- package/dist/platform/control-plane/operator-contract-schemas-permissions.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-permissions.js +5 -0
- package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts +37 -0
- package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-runtime.js +100 -3
- package/dist/platform/control-plane/operator-contract-schemas.d.ts +1 -0
- package/dist/platform/control-plane/operator-contract-schemas.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas.js +1 -0
- package/dist/platform/control-plane/operator-contract.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract.js +8 -0
- package/dist/platform/control-plane/routes/checkpoints.d.ts +39 -0
- package/dist/platform/control-plane/routes/checkpoints.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/checkpoints.js +166 -0
- package/dist/platform/control-plane/routes/fleet.d.ts +53 -0
- package/dist/platform/control-plane/routes/fleet.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/fleet.js +153 -0
- package/dist/platform/control-plane/routes/gateway-verb-error.d.ts +30 -0
- package/dist/platform/control-plane/routes/gateway-verb-error.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/gateway-verb-error.js +36 -0
- package/dist/platform/control-plane/routes/index.d.ts +0 -6
- package/dist/platform/control-plane/routes/index.d.ts.map +1 -1
- package/dist/platform/control-plane/routes/index.js +5 -5
- package/dist/platform/control-plane/routes/invocation-params.d.ts +23 -0
- package/dist/platform/control-plane/routes/invocation-params.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/invocation-params.js +9 -0
- package/dist/platform/control-plane/routes/push.d.ts +26 -0
- package/dist/platform/control-plane/routes/push.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/push.js +104 -0
- package/dist/platform/control-plane/routes/register-gateway-verb-groups.d.ts +31 -0
- package/dist/platform/control-plane/routes/register-gateway-verb-groups.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/register-gateway-verb-groups.js +16 -0
- package/dist/platform/control-plane/routes/register-w3-s2.d.ts +26 -0
- package/dist/platform/control-plane/routes/register-w3-s2.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/register-w3-s2.js +8 -0
- package/dist/platform/control-plane/routes/session-search.d.ts +37 -0
- package/dist/platform/control-plane/routes/session-search.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/session-search.js +113 -0
- package/dist/platform/control-plane/session-broker-gc.d.ts +16 -0
- package/dist/platform/control-plane/session-broker-gc.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-gc.js +23 -6
- package/dist/platform/control-plane/session-broker-helpers.d.ts +3 -3
- package/dist/platform/control-plane/session-broker-helpers.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-inputs.d.ts +18 -0
- package/dist/platform/control-plane/session-broker-inputs.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-inputs.js +34 -0
- package/dist/platform/control-plane/session-broker-sessions.d.ts +102 -3
- package/dist/platform/control-plane/session-broker-sessions.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-sessions.js +179 -5
- package/dist/platform/control-plane/session-broker-state.d.ts +20 -1
- package/dist/platform/control-plane/session-broker-state.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-state.js +67 -5
- package/dist/platform/control-plane/session-broker.d.ts +51 -38
- package/dist/platform/control-plane/session-broker.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker.js +183 -75
- package/dist/platform/control-plane/session-store-importer.d.ts +57 -0
- package/dist/platform/control-plane/session-store-importer.d.ts.map +1 -0
- package/dist/platform/control-plane/session-store-importer.js +227 -0
- package/dist/platform/control-plane/session-types.d.ts +142 -7
- package/dist/platform/control-plane/session-types.d.ts.map +1 -1
- package/dist/platform/core/execution-plan.d.ts +43 -1
- package/dist/platform/core/execution-plan.d.ts.map +1 -1
- package/dist/platform/core/execution-plan.js +46 -10
- package/dist/platform/core/index.d.ts +1 -0
- package/dist/platform/core/index.d.ts.map +1 -1
- package/dist/platform/core/index.js +1 -0
- package/dist/platform/core/orchestrator-runtime.d.ts +23 -3
- package/dist/platform/core/orchestrator-runtime.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-tool-runtime.d.ts +7 -0
- package/dist/platform/core/orchestrator-tool-runtime.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-tool-runtime.js +10 -0
- package/dist/platform/core/orchestrator-turn-loop.d.ts +13 -6
- package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-turn-loop.js +29 -22
- package/dist/platform/core/orchestrator.d.ts +16 -10
- package/dist/platform/core/orchestrator.d.ts.map +1 -1
- package/dist/platform/core/orchestrator.js +23 -8
- package/dist/platform/core/plan-decomposition.d.ts +196 -0
- package/dist/platform/core/plan-decomposition.d.ts.map +1 -0
- package/dist/platform/core/plan-decomposition.js +417 -0
- package/dist/platform/core/plan-proposal.d.ts +39 -0
- package/dist/platform/core/plan-proposal.d.ts.map +1 -1
- package/dist/platform/core/wrfc-routing.d.ts +1 -0
- package/dist/platform/core/wrfc-routing.d.ts.map +1 -1
- package/dist/platform/core/wrfc-routing.js +51 -1
- package/dist/platform/daemon/boot.d.ts +69 -0
- package/dist/platform/daemon/boot.d.ts.map +1 -0
- package/dist/platform/daemon/boot.js +61 -0
- package/dist/platform/daemon/cli.js +2 -1
- package/dist/platform/daemon/control-plane.d.ts.map +1 -1
- package/dist/platform/daemon/control-plane.js +50 -1
- package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
- package/dist/platform/daemon/facade-composition.js +6 -0
- package/dist/platform/daemon/facade.d.ts +15 -6
- package/dist/platform/daemon/facade.d.ts.map +1 -1
- package/dist/platform/daemon/facade.js +48 -43
- package/dist/platform/daemon/http/router-route-contexts.d.ts +1 -0
- package/dist/platform/daemon/http/router-route-contexts.d.ts.map +1 -1
- package/dist/platform/daemon/http/router-route-contexts.js +1 -0
- package/dist/platform/daemon/http/router-session-broker-adapter.d.ts +13 -0
- package/dist/platform/daemon/http/router-session-broker-adapter.d.ts.map +1 -0
- package/dist/platform/daemon/http/router-session-broker-adapter.js +27 -0
- package/dist/platform/daemon/http/router.d.ts +2 -1
- package/dist/platform/daemon/http/router.d.ts.map +1 -1
- package/dist/platform/daemon/http/router.js +42 -40
- package/dist/platform/daemon/http/runtime-route-types.d.ts +42 -4
- package/dist/platform/daemon/http/runtime-route-types.d.ts.map +1 -1
- package/dist/platform/daemon/http/webui-serving.d.ts +68 -0
- package/dist/platform/daemon/http/webui-serving.d.ts.map +1 -0
- package/dist/platform/daemon/http/webui-serving.js +230 -0
- package/dist/platform/daemon/index.d.ts +2 -0
- package/dist/platform/daemon/index.d.ts.map +1 -1
- package/dist/platform/daemon/index.js +1 -0
- package/dist/platform/daemon/service-manager.d.ts +16 -0
- package/dist/platform/daemon/service-manager.d.ts.map +1 -1
- package/dist/platform/daemon/service-manager.js +79 -15
- package/dist/platform/intelligence/tree-sitter/service.d.ts.map +1 -1
- package/dist/platform/intelligence/tree-sitter/service.js +16 -2
- package/dist/platform/knowledge/browser-history/readers.d.ts.map +1 -1
- package/dist/platform/knowledge/browser-history/readers.js +15 -5
- package/dist/platform/knowledge/knowledge-api.d.ts +1 -1
- package/dist/platform/knowledge/project-planning/service.d.ts +14 -1
- package/dist/platform/knowledge/project-planning/service.d.ts.map +1 -1
- package/dist/platform/knowledge/project-planning/service.js +77 -0
- package/dist/platform/knowledge/project-planning/types.d.ts +32 -0
- package/dist/platform/knowledge/project-planning/types.d.ts.map +1 -1
- package/dist/platform/orchestration/bookkeeping.d.ts +12 -0
- package/dist/platform/orchestration/bookkeeping.d.ts.map +1 -0
- package/dist/platform/orchestration/bookkeeping.js +91 -0
- package/dist/platform/orchestration/budget.d.ts +2 -2
- package/dist/platform/orchestration/cancellation.d.ts +2 -2
- package/dist/platform/orchestration/controller-compat.d.ts +16 -3
- package/dist/platform/orchestration/controller-compat.d.ts.map +1 -1
- package/dist/platform/orchestration/controller-compat.js +18 -4
- package/dist/platform/orchestration/dirty-guard.js +1 -1
- package/dist/platform/orchestration/engine.d.ts +26 -1
- package/dist/platform/orchestration/engine.d.ts.map +1 -1
- package/dist/platform/orchestration/engine.js +229 -25
- package/dist/platform/orchestration/index.d.ts +6 -4
- package/dist/platform/orchestration/index.d.ts.map +1 -1
- package/dist/platform/orchestration/index.js +3 -2
- package/dist/platform/orchestration/persistence.d.ts.map +1 -1
- package/dist/platform/orchestration/persistence.js +6 -3
- package/dist/platform/orchestration/phase-runner.d.ts +33 -6
- package/dist/platform/orchestration/phase-runner.d.ts.map +1 -1
- package/dist/platform/orchestration/phase-runner.js +98 -25
- package/dist/platform/orchestration/proposal-workstream.d.ts +56 -0
- package/dist/platform/orchestration/proposal-workstream.d.ts.map +1 -0
- package/dist/platform/orchestration/proposal-workstream.js +76 -0
- package/dist/platform/orchestration/scheduler.d.ts +20 -1
- package/dist/platform/orchestration/scheduler.d.ts.map +1 -1
- package/dist/platform/orchestration/scheduler.js +16 -0
- package/dist/platform/orchestration/types.d.ts +289 -4
- package/dist/platform/orchestration/types.d.ts.map +1 -1
- package/dist/platform/orchestration/types.js +32 -0
- package/dist/platform/orchestration/worktree-isolation.d.ts +33 -0
- package/dist/platform/orchestration/worktree-isolation.d.ts.map +1 -0
- package/dist/platform/orchestration/worktree-isolation.js +248 -0
- package/dist/platform/presentation/glyphs.d.ts +91 -0
- package/dist/platform/presentation/glyphs.d.ts.map +1 -0
- package/dist/platform/presentation/glyphs.js +93 -0
- package/dist/platform/presentation/index.d.ts +28 -0
- package/dist/platform/presentation/index.d.ts.map +1 -0
- package/dist/platform/presentation/index.js +27 -0
- package/dist/platform/presentation/thinking-phrases.d.ts +12 -0
- package/dist/platform/presentation/thinking-phrases.d.ts.map +1 -0
- package/dist/platform/presentation/thinking-phrases.js +32 -0
- package/dist/platform/presentation/tones.d.ts +121 -0
- package/dist/platform/presentation/tones.d.ts.map +1 -0
- package/dist/platform/presentation/tones.js +145 -0
- package/dist/platform/presentation/waiting-wording.d.ts +54 -0
- package/dist/platform/presentation/waiting-wording.d.ts.map +1 -0
- package/dist/platform/presentation/waiting-wording.js +51 -0
- package/dist/platform/providers/runtime-snapshot.d.ts.map +1 -1
- package/dist/platform/providers/runtime-snapshot.js +12 -2
- package/dist/platform/push/delivery.d.ts +48 -0
- package/dist/platform/push/delivery.d.ts.map +1 -0
- package/dist/platform/push/delivery.js +117 -0
- package/dist/platform/push/encryption.d.ts +41 -0
- package/dist/platform/push/encryption.d.ts.map +1 -0
- package/dist/platform/push/encryption.js +82 -0
- package/dist/platform/push/index.d.ts +17 -0
- package/dist/platform/push/index.d.ts.map +1 -0
- package/dist/platform/push/index.js +10 -0
- package/dist/platform/push/service.d.ts +75 -0
- package/dist/platform/push/service.d.ts.map +1 -0
- package/dist/platform/push/service.js +95 -0
- package/dist/platform/push/subscription-store.d.ts +50 -0
- package/dist/platform/push/subscription-store.d.ts.map +1 -0
- package/dist/platform/push/subscription-store.js +123 -0
- package/dist/platform/push/types.d.ts +68 -0
- package/dist/platform/push/types.d.ts.map +1 -0
- package/dist/platform/push/types.js +13 -0
- package/dist/platform/push/vapid.d.ts +54 -0
- package/dist/platform/push/vapid.d.ts.map +1 -0
- package/dist/platform/push/vapid.js +113 -0
- package/dist/platform/runtime/bootstrap-services.d.ts +62 -2
- package/dist/platform/runtime/bootstrap-services.d.ts.map +1 -1
- package/dist/platform/runtime/bootstrap-services.js +217 -50
- package/dist/platform/runtime/daemon-version-compat.d.ts +39 -0
- package/dist/platform/runtime/daemon-version-compat.d.ts.map +1 -0
- package/dist/platform/runtime/daemon-version-compat.js +75 -0
- package/dist/platform/runtime/detached-daemon-runtime.d.ts +26 -0
- package/dist/platform/runtime/detached-daemon-runtime.d.ts.map +1 -0
- package/dist/platform/runtime/detached-daemon-runtime.js +49 -0
- package/dist/platform/runtime/emitters/workflows.d.ts +1 -1
- package/dist/platform/runtime/emitters/workflows.d.ts.map +1 -1
- package/dist/platform/runtime/events/index.d.ts +13 -0
- package/dist/platform/runtime/events/index.d.ts.map +1 -1
- package/dist/platform/runtime/events/index.js +13 -0
- package/dist/platform/runtime/feature-flags/flags.d.ts.map +1 -1
- package/dist/platform/runtime/feature-flags/flags.js +39 -1
- package/dist/platform/runtime/fleet/adapters/agent.d.ts +2 -2
- package/dist/platform/runtime/fleet/adapters/agent.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/adapters/agent.js +4 -4
- package/dist/platform/runtime/fleet/adapters/automation.d.ts +1 -1
- package/dist/platform/runtime/fleet/adapters/automation.js +1 -1
- package/dist/platform/runtime/fleet/adapters/code-index.d.ts +1 -1
- package/dist/platform/runtime/fleet/adapters/code-index.js +1 -1
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts +40 -18
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/adapters/orchestration.js +138 -34
- package/dist/platform/runtime/fleet/adapters/schedule.d.ts +4 -4
- package/dist/platform/runtime/fleet/adapters/schedule.js +4 -4
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts +3 -4
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/adapters/trigger.js +3 -4
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts +13 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/adapters/wrfc.js +49 -2
- package/dist/platform/runtime/fleet/registry.d.ts +7 -7
- package/dist/platform/runtime/fleet/registry.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/registry.js +41 -7
- package/dist/platform/runtime/fleet/types.d.ts +9 -9
- package/dist/platform/runtime/fleet/types.d.ts.map +1 -1
- package/dist/platform/runtime/memory-spine/client.d.ts +127 -0
- package/dist/platform/runtime/memory-spine/client.d.ts.map +1 -0
- package/dist/platform/runtime/memory-spine/client.js +113 -0
- package/dist/platform/runtime/memory-spine/index.d.ts +11 -0
- package/dist/platform/runtime/memory-spine/index.d.ts.map +1 -0
- package/dist/platform/runtime/memory-spine/index.js +10 -0
- package/dist/platform/runtime/operator-client.d.ts +20 -2
- package/dist/platform/runtime/operator-client.d.ts.map +1 -1
- package/dist/platform/runtime/operator-client.js +11 -1
- package/dist/platform/runtime/provider-accounts/registry.d.ts.map +1 -1
- package/dist/platform/runtime/provider-accounts/registry.js +11 -1
- package/dist/platform/runtime/services.d.ts +11 -9
- package/dist/platform/runtime/services.d.ts.map +1 -1
- package/dist/platform/runtime/services.js +24 -9
- package/dist/platform/runtime/session-spine/client.d.ts +234 -0
- package/dist/platform/runtime/session-spine/client.d.ts.map +1 -0
- package/dist/platform/runtime/session-spine/client.js +449 -0
- package/dist/platform/runtime/session-spine/index.d.ts +12 -0
- package/dist/platform/runtime/session-spine/index.d.ts.map +1 -0
- package/dist/platform/runtime/session-spine/index.js +11 -0
- package/dist/platform/runtime/session-spine/union-cache.d.ts +225 -0
- package/dist/platform/runtime/session-spine/union-cache.d.ts.map +1 -0
- package/dist/platform/runtime/session-spine/union-cache.js +333 -0
- package/dist/platform/runtime/shell-command-ops.d.ts +3 -1
- package/dist/platform/runtime/shell-command-ops.d.ts.map +1 -1
- package/dist/platform/runtime/transports/daemon-http-client-validators.d.ts.map +1 -1
- package/dist/platform/runtime/transports/daemon-http-client-validators.js +22 -0
- package/dist/platform/runtime/transports/daemon-http-client.d.ts.map +1 -1
- package/dist/platform/runtime/transports/daemon-http-client.js +25 -2
- package/dist/platform/runtime/transports/http-types.d.ts +9 -2
- package/dist/platform/runtime/transports/http-types.d.ts.map +1 -1
- package/dist/platform/state/canonical-memory.d.ts +95 -0
- package/dist/platform/state/canonical-memory.d.ts.map +1 -0
- package/dist/platform/state/canonical-memory.js +155 -0
- package/dist/platform/state/code-index-chunking.js +1 -1
- package/dist/platform/state/code-index-db.d.ts +1 -1
- package/dist/platform/state/code-index-reindex.d.ts +73 -0
- package/dist/platform/state/code-index-reindex.d.ts.map +1 -0
- package/dist/platform/state/code-index-reindex.js +156 -0
- package/dist/platform/state/code-index-store.d.ts.map +1 -1
- package/dist/platform/state/code-index-store.js +11 -3
- package/dist/platform/state/index.d.ts +8 -0
- package/dist/platform/state/index.d.ts.map +1 -1
- package/dist/platform/state/index.js +4 -0
- package/dist/platform/state/memory-recall-contract.d.ts +118 -0
- package/dist/platform/state/memory-recall-contract.d.ts.map +1 -0
- package/dist/platform/state/memory-recall-contract.js +170 -0
- package/dist/platform/state/memory-registry.d.ts +8 -0
- package/dist/platform/state/memory-registry.d.ts.map +1 -1
- package/dist/platform/state/memory-registry.js +10 -0
- package/dist/platform/state/memory-store.d.ts +2 -0
- package/dist/platform/state/memory-store.d.ts.map +1 -1
- package/dist/platform/state/memory-store.js +4 -0
- package/dist/platform/state/memory-vector-store.d.ts.map +1 -1
- package/dist/platform/state/memory-vector-store.js +14 -3
- package/dist/platform/state/sqlite-store.d.ts +2 -0
- package/dist/platform/state/sqlite-store.d.ts.map +1 -1
- package/dist/platform/state/sqlite-store.js +4 -0
- package/dist/platform/state/sqlite-vec-loader.d.ts +1 -1
- package/dist/platform/state/sqlite-vec-loader.js +1 -1
- package/dist/platform/state/vibe-projection.d.ts +67 -0
- package/dist/platform/state/vibe-projection.d.ts.map +1 -0
- package/dist/platform/state/vibe-projection.js +115 -0
- package/dist/platform/tools/agent/index.d.ts.map +1 -1
- package/dist/platform/tools/agent/index.js +8 -0
- package/dist/platform/tools/agent/manager.d.ts +22 -10
- package/dist/platform/tools/agent/manager.d.ts.map +1 -1
- package/dist/platform/tools/agent/manager.js +13 -7
- package/dist/platform/tools/agent/schema.d.ts +26 -0
- package/dist/platform/tools/agent/schema.d.ts.map +1 -1
- package/dist/platform/tools/agent/schema.js +2 -2
- package/dist/platform/tools/agent/wrfc-batch-policy.d.ts +13 -0
- package/dist/platform/tools/agent/wrfc-batch-policy.d.ts.map +1 -1
- package/dist/platform/tools/agent/wrfc-batch-policy.js +60 -0
- package/dist/platform/tools/exec/runtime.d.ts +10 -0
- package/dist/platform/tools/exec/runtime.d.ts.map +1 -1
- package/dist/platform/tools/exec/runtime.js +27 -10
- package/dist/platform/tools/exec/schema.d.ts +2 -2
- package/dist/platform/tools/exec/schema.d.ts.map +1 -1
- package/dist/platform/tools/exec/schema.js +2 -1
- package/dist/platform/tools/fetch/runtime.d.ts +1 -1
- package/dist/platform/tools/index.d.ts +2 -0
- package/dist/platform/tools/index.d.ts.map +1 -1
- package/dist/platform/tools/index.js +2 -0
- package/dist/platform/tools/registry.d.ts +1 -1
- package/dist/platform/tools/registry.js +1 -1
- package/dist/platform/tools/state/index.d.ts +9 -0
- package/dist/platform/tools/state/index.d.ts.map +1 -1
- package/dist/platform/tools/state/index.js +60 -3
- package/dist/platform/types/foundation-contract.d.ts +1 -1
- package/dist/platform/types/foundation-contract.d.ts.map +1 -1
- package/dist/platform/types/index.d.ts +1 -1
- package/dist/platform/types/index.d.ts.map +1 -1
- package/dist/platform/types/tools.d.ts +1 -1
- package/dist/platform/utils/request-body.d.ts.map +1 -1
- package/dist/platform/utils/request-body.js +50 -5
- package/dist/platform/version.js +1 -1
- package/package.json +25 -9
- package/dist/platform/control-plane/routes/automation.d.ts +0 -3
- package/dist/platform/control-plane/routes/automation.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/automation.js +0 -63
- package/dist/platform/control-plane/routes/context.d.ts +0 -2
- package/dist/platform/control-plane/routes/context.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/context.js +0 -1
- package/dist/platform/control-plane/routes/operator.d.ts +0 -8
- package/dist/platform/control-plane/routes/operator.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/operator.js +0 -415
- package/dist/platform/control-plane/routes/remote.d.ts +0 -3
- package/dist/platform/control-plane/routes/remote.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/remote.js +0 -35
- package/dist/platform/control-plane/routes/sessions.d.ts +0 -3
- package/dist/platform/control-plane/routes/sessions.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/sessions.js +0 -43
- package/dist/platform/control-plane/routes/tasks.d.ts +0 -3
- package/dist/platform/control-plane/routes/tasks.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/tasks.js +0 -22
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { GatewayVerbError } from './gateway-verb-error.js';
|
|
2
|
+
import { readInvocationParams } from './invocation-params.js';
|
|
3
|
+
const CHECKPOINT_KINDS = ['turn', 'agent-run', 'manual'];
|
|
4
|
+
const RETENTION_CLASSES = ['short', 'standard', 'forensic'];
|
|
5
|
+
const CHECKPOINTS_LIST_DEFAULT_LIMIT = 100;
|
|
6
|
+
const CHECKPOINTS_LIST_MAX_LIMIT = 500;
|
|
7
|
+
/**
|
|
8
|
+
* `WorkspaceCheckpointManager.requireCheckpoint` (../../workspace/checkpoint/manager.ts:599-604,
|
|
9
|
+
* private) throws a plain `Error` with this exact message shape for an
|
|
10
|
+
* unknown/gc'd id. `diff`/`restore` both route through it. There is no
|
|
11
|
+
* public `get(id)` to pre-check existence without a second full manager
|
|
12
|
+
* call, so this handler matches the message text the manager already
|
|
13
|
+
* commits to (any manager.ts rewrite of that string is covered by the
|
|
14
|
+
* bootDaemon proof test — see test/w3-s2-*.test.ts — as a regression net,
|
|
15
|
+
* not by this string match alone).
|
|
16
|
+
*/
|
|
17
|
+
const NO_CHECKPOINT_FOUND_MARKER = 'no checkpoint found with id';
|
|
18
|
+
async function callOrHonestNotFound(fn) {
|
|
19
|
+
try {
|
|
20
|
+
return await fn();
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
24
|
+
if (message.includes(NO_CHECKPOINT_FOUND_MARKER)) {
|
|
25
|
+
// Preserve the manager's own message (it already names the specific
|
|
26
|
+
// missing id) — only the status/code are being upgraded from the
|
|
27
|
+
// blanket 500 a plain throw would collapse to.
|
|
28
|
+
throw new GatewayVerbError(message, 'NOT_FOUND', 404);
|
|
29
|
+
}
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function optionalString(value) {
|
|
34
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
35
|
+
}
|
|
36
|
+
function requiredString(value, field) {
|
|
37
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
38
|
+
throw new GatewayVerbError(`Missing required field: ${field}`, 'INVALID_ARGUMENT', 400);
|
|
39
|
+
}
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
function optionalNumber(value, field) {
|
|
43
|
+
if (value === undefined || value === null)
|
|
44
|
+
return undefined;
|
|
45
|
+
const n = typeof value === 'number' ? value : Number(value);
|
|
46
|
+
if (!Number.isFinite(n)) {
|
|
47
|
+
throw new GatewayVerbError(`Invalid number for field: ${field}`, 'INVALID_ARGUMENT', 400);
|
|
48
|
+
}
|
|
49
|
+
return n;
|
|
50
|
+
}
|
|
51
|
+
function optionalStringArray(value) {
|
|
52
|
+
if (value === undefined || value === null)
|
|
53
|
+
return undefined;
|
|
54
|
+
if (!Array.isArray(value) || !value.every((v) => typeof v === 'string')) {
|
|
55
|
+
throw new GatewayVerbError('Invalid field: paths must be a string array', 'INVALID_ARGUMENT', 400);
|
|
56
|
+
}
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
function optionalBoolean(value, field) {
|
|
60
|
+
if (value === undefined || value === null)
|
|
61
|
+
return undefined;
|
|
62
|
+
if (typeof value !== 'boolean') {
|
|
63
|
+
throw new GatewayVerbError(`Invalid boolean for field: ${field}`, 'INVALID_ARGUMENT', 400);
|
|
64
|
+
}
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
function validateCheckpointKind(value, required) {
|
|
68
|
+
if (value === undefined || value === null) {
|
|
69
|
+
if (required)
|
|
70
|
+
throw new GatewayVerbError('Missing required field: kind', 'INVALID_ARGUMENT', 400);
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
if (typeof value !== 'string' || !CHECKPOINT_KINDS.includes(value)) {
|
|
74
|
+
throw new GatewayVerbError(`Invalid kind: ${String(value)} (expected one of ${CHECKPOINT_KINDS.join(', ')})`, 'INVALID_ARGUMENT', 400);
|
|
75
|
+
}
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
function validateRetentionClass(value) {
|
|
79
|
+
if (value === undefined || value === null)
|
|
80
|
+
return undefined;
|
|
81
|
+
if (typeof value !== 'string' || !RETENTION_CLASSES.includes(value)) {
|
|
82
|
+
throw new GatewayVerbError(`Invalid retentionClass: ${String(value)} (expected one of ${RETENTION_CLASSES.join(', ')})`, 'INVALID_ARGUMENT', 400);
|
|
83
|
+
}
|
|
84
|
+
return value;
|
|
85
|
+
}
|
|
86
|
+
function clampLimit(raw) {
|
|
87
|
+
if (raw === undefined || raw === null)
|
|
88
|
+
return CHECKPOINTS_LIST_DEFAULT_LIMIT;
|
|
89
|
+
const n = typeof raw === 'number' ? raw : Number(raw);
|
|
90
|
+
if (!Number.isFinite(n) || n <= 0) {
|
|
91
|
+
throw new GatewayVerbError(`Invalid limit: ${String(raw)}`, 'INVALID_ARGUMENT', 400);
|
|
92
|
+
}
|
|
93
|
+
return Math.min(Math.floor(n), CHECKPOINTS_LIST_MAX_LIMIT);
|
|
94
|
+
}
|
|
95
|
+
export function createCheckpointsListHandler(manager) {
|
|
96
|
+
return async (invocation) => {
|
|
97
|
+
const params = readInvocationParams(invocation);
|
|
98
|
+
const kind = validateCheckpointKind(params.kind, false);
|
|
99
|
+
const since = optionalNumber(params.since, 'since');
|
|
100
|
+
const limit = clampLimit(params.limit);
|
|
101
|
+
const checkpoints = await manager.list({ kind, since, limit });
|
|
102
|
+
return { checkpoints };
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export function createCheckpointsCreateHandler(manager) {
|
|
106
|
+
return async (invocation) => {
|
|
107
|
+
const body = readInvocationParams(invocation);
|
|
108
|
+
const kind = validateCheckpointKind(body.kind, true);
|
|
109
|
+
if (!kind)
|
|
110
|
+
throw new GatewayVerbError('Missing required field: kind', 'INVALID_ARGUMENT', 400);
|
|
111
|
+
const checkpoint = await manager.create({
|
|
112
|
+
kind,
|
|
113
|
+
label: optionalString(body.label),
|
|
114
|
+
retentionClass: validateRetentionClass(body.retentionClass),
|
|
115
|
+
turnId: optionalString(body.turnId),
|
|
116
|
+
agentId: optionalString(body.agentId),
|
|
117
|
+
paths: optionalStringArray(body.paths),
|
|
118
|
+
});
|
|
119
|
+
// `create` returns null when the workspace tree is unchanged since the
|
|
120
|
+
// parent checkpoint (manager.ts:349-357) — an honest no-op, not an
|
|
121
|
+
// error and not a fabricated checkpoint record.
|
|
122
|
+
return { checkpoint, noop: checkpoint === null };
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
export function createCheckpointsDiffHandler(manager) {
|
|
126
|
+
return async (invocation) => {
|
|
127
|
+
const params = readInvocationParams(invocation);
|
|
128
|
+
const a = requiredString(params.a, 'a');
|
|
129
|
+
const b = optionalString(params.b);
|
|
130
|
+
const diff = await callOrHonestNotFound(() => manager.diff(a, b));
|
|
131
|
+
return { diff };
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export function createCheckpointsRestoreHandler(manager) {
|
|
135
|
+
return async (invocation) => {
|
|
136
|
+
const body = readInvocationParams(invocation);
|
|
137
|
+
const id = requiredString(body.id, 'id');
|
|
138
|
+
const result = await callOrHonestNotFound(() => manager.restore(id, {
|
|
139
|
+
paths: optionalStringArray(body.paths),
|
|
140
|
+
safetyCheckpoint: optionalBoolean(body.safetyCheckpoint, 'safetyCheckpoint'),
|
|
141
|
+
}));
|
|
142
|
+
return { result };
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Attach the `checkpoints.*` handlers to the descriptors already registered
|
|
147
|
+
* (without a handler) from ../method-catalog-control-core.ts's static
|
|
148
|
+
* builtin array. Call once, at RuntimeServices construction time, after
|
|
149
|
+
* `workspaceCheckpointManager` exists. A missing descriptor is a silent
|
|
150
|
+
* no-op — see routes/fleet.ts's `registerFleetGatewayMethods` for the same
|
|
151
|
+
* rationale.
|
|
152
|
+
*/
|
|
153
|
+
export function registerCheckpointGatewayMethods(catalog, manager) {
|
|
154
|
+
const listDescriptor = catalog.get('checkpoints.list');
|
|
155
|
+
if (listDescriptor)
|
|
156
|
+
catalog.register(listDescriptor, createCheckpointsListHandler(manager), { replace: true });
|
|
157
|
+
const createDescriptor = catalog.get('checkpoints.create');
|
|
158
|
+
if (createDescriptor)
|
|
159
|
+
catalog.register(createDescriptor, createCheckpointsCreateHandler(manager), { replace: true });
|
|
160
|
+
const diffDescriptor = catalog.get('checkpoints.diff');
|
|
161
|
+
if (diffDescriptor)
|
|
162
|
+
catalog.register(diffDescriptor, createCheckpointsDiffHandler(manager), { replace: true });
|
|
163
|
+
const restoreDescriptor = catalog.get('checkpoints.restore');
|
|
164
|
+
if (restoreDescriptor)
|
|
165
|
+
catalog.register(restoreDescriptor, createCheckpointsRestoreHandler(manager), { replace: true });
|
|
166
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* routes/fleet.ts
|
|
3
|
+
*
|
|
4
|
+
* `fleet.snapshot` / `fleet.list` gateway-method handlers (see CHANGELOG 1.0.0) over the
|
|
5
|
+
* ALREADY daemon-resident `ProcessRegistry` (createProcessRegistry(),
|
|
6
|
+
* ../../runtime/fleet/registry.ts:204, constructed + exposed on
|
|
7
|
+
* RuntimeServices at ../../runtime/services.ts:712/:242). This is thin verb
|
|
8
|
+
* registration, not new machinery: every call is a direct pass-through to
|
|
9
|
+
* `registry.query()`, the registry's own cheap aggregate-on-read scan.
|
|
10
|
+
*
|
|
11
|
+
* Wired via `GatewayMethodCatalog.register(descriptor, handler)` — the SAME
|
|
12
|
+
* mechanism the plugin API already uses (../../plugins/api.ts
|
|
13
|
+
* `registerGatewayMethod`) — rather than a new REST path in the external
|
|
14
|
+
* `@pellux/goodvibes-daemon-sdk` package or a change to
|
|
15
|
+
* ../../daemon/http/router.ts (both out of this brief's file ownership).
|
|
16
|
+
* The registered handler is reached over real HTTP today via the existing
|
|
17
|
+
* generic invoke endpoint `POST /api/control-plane/methods/{methodId}/invoke`
|
|
18
|
+
* (daemon-sdk/src/control-routes.ts `invokeGatewayMethod`).
|
|
19
|
+
*
|
|
20
|
+
* Descriptors live in ../method-catalog-control-core.ts (so
|
|
21
|
+
* `buildOperatorContract` / api.md / contract-artifact generation see them
|
|
22
|
+
* whether or not a handler has been attached yet); `registerFleetGatewayMethods`
|
|
23
|
+
* below attaches the handler at RuntimeServices construction time
|
|
24
|
+
* (../../runtime/services.ts, right after `processRegistry` exists).
|
|
25
|
+
*/
|
|
26
|
+
import type { GatewayMethodCatalog } from '../method-catalog.js';
|
|
27
|
+
import type { GatewayMethodHandler } from '../method-catalog-shared.js';
|
|
28
|
+
import type { ProcessRegistry } from '../../runtime/fleet/types.js';
|
|
29
|
+
/**
|
|
30
|
+
* `fleet.snapshot` payload cap: the registry's
|
|
31
|
+
* `query()` is a cheap O(n) in-memory scan, but the wire response must not
|
|
32
|
+
* grow unbounded with fleet size. Nodes beyond this cap are dropped (newest
|
|
33
|
+
* activity first is NOT guaranteed here — see `truncated`/`totalCount` so a
|
|
34
|
+
* caller that needs the full set knows to page via `fleet.list` instead).
|
|
35
|
+
*/
|
|
36
|
+
export declare const FLEET_SNAPSHOT_NODE_CAP = 2000;
|
|
37
|
+
export declare const FLEET_LIST_DEFAULT_LIMIT = 100;
|
|
38
|
+
export declare const FLEET_LIST_MAX_LIMIT = 500;
|
|
39
|
+
/** Structural dep — only the read surface `fleet.*` needs. */
|
|
40
|
+
export type FleetQueryOnlyRegistry = Pick<ProcessRegistry, 'query'>;
|
|
41
|
+
export declare function createFleetSnapshotHandler(registry: FleetQueryOnlyRegistry): GatewayMethodHandler;
|
|
42
|
+
export declare function createFleetListHandler(registry: FleetQueryOnlyRegistry): GatewayMethodHandler;
|
|
43
|
+
/**
|
|
44
|
+
* Attach the `fleet.snapshot` / `fleet.list` handlers to the descriptors
|
|
45
|
+
* already registered (without a handler) from
|
|
46
|
+
* ../method-catalog-control-core.ts's static builtin array. Call once, at
|
|
47
|
+
* RuntimeServices construction time, after `processRegistry` exists.
|
|
48
|
+
* A missing descriptor (contract/registration drift) is a silent no-op
|
|
49
|
+
* rather than a throw — construction must never fail because a wire verb
|
|
50
|
+
* failed to register; the operator-contract gates catch a real drift.
|
|
51
|
+
*/
|
|
52
|
+
export declare function registerFleetGatewayMethods(catalog: GatewayMethodCatalog, registry: FleetQueryOnlyRegistry): void;
|
|
53
|
+
//# sourceMappingURL=fleet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/fleet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAIV,eAAe,EAEhB,MAAM,8BAA8B,CAAC;AAKtC;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAyExC,8DAA8D;AAC9D,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;AAEpE,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,sBAAsB,GAAG,oBAAoB,CAejG;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,oBAAoB,CAuC7F;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CASjH"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { paginateItems } from '@pellux/goodvibes-daemon-sdk';
|
|
2
|
+
import { GatewayVerbError } from './gateway-verb-error.js';
|
|
3
|
+
import { readInvocationParams } from './invocation-params.js';
|
|
4
|
+
/**
|
|
5
|
+
* `fleet.snapshot` payload cap: the registry's
|
|
6
|
+
* `query()` is a cheap O(n) in-memory scan, but the wire response must not
|
|
7
|
+
* grow unbounded with fleet size. Nodes beyond this cap are dropped (newest
|
|
8
|
+
* activity first is NOT guaranteed here — see `truncated`/`totalCount` so a
|
|
9
|
+
* caller that needs the full set knows to page via `fleet.list` instead).
|
|
10
|
+
*/
|
|
11
|
+
export const FLEET_SNAPSHOT_NODE_CAP = 2000;
|
|
12
|
+
export const FLEET_LIST_DEFAULT_LIMIT = 100;
|
|
13
|
+
export const FLEET_LIST_MAX_LIMIT = 500;
|
|
14
|
+
const PROCESS_KINDS = [
|
|
15
|
+
'agent',
|
|
16
|
+
'wrfc-chain',
|
|
17
|
+
'wrfc-subtask',
|
|
18
|
+
'workflow',
|
|
19
|
+
'trigger',
|
|
20
|
+
'schedule',
|
|
21
|
+
'watcher',
|
|
22
|
+
'background-process',
|
|
23
|
+
'workstream',
|
|
24
|
+
'phase',
|
|
25
|
+
'work-item',
|
|
26
|
+
'code-index',
|
|
27
|
+
];
|
|
28
|
+
const PROCESS_STATES = [
|
|
29
|
+
'thinking',
|
|
30
|
+
'executing-tool',
|
|
31
|
+
'awaiting-approval',
|
|
32
|
+
'streaming',
|
|
33
|
+
'stalled',
|
|
34
|
+
'retrying',
|
|
35
|
+
'done',
|
|
36
|
+
'failed',
|
|
37
|
+
'killed',
|
|
38
|
+
'interrupted',
|
|
39
|
+
'idle',
|
|
40
|
+
'queued',
|
|
41
|
+
'paused',
|
|
42
|
+
];
|
|
43
|
+
function asStringArray(value) {
|
|
44
|
+
if (value === undefined || value === null)
|
|
45
|
+
return undefined;
|
|
46
|
+
if (Array.isArray(value))
|
|
47
|
+
return value.filter((v) => typeof v === 'string');
|
|
48
|
+
if (typeof value === 'string')
|
|
49
|
+
return value.split(',').map((v) => v.trim()).filter(Boolean);
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
function readFleetQueryFilter(query) {
|
|
53
|
+
if (!query)
|
|
54
|
+
return undefined;
|
|
55
|
+
const rawKinds = asStringArray(query.kinds);
|
|
56
|
+
const rawStates = asStringArray(query.states);
|
|
57
|
+
let kinds;
|
|
58
|
+
if (rawKinds) {
|
|
59
|
+
const invalid = rawKinds.filter((k) => !PROCESS_KINDS.includes(k));
|
|
60
|
+
if (invalid.length > 0) {
|
|
61
|
+
throw new GatewayVerbError(`Unknown fleet kind(s): ${invalid.join(', ')}`, 'INVALID_ARGUMENT', 400);
|
|
62
|
+
}
|
|
63
|
+
kinds = rawKinds;
|
|
64
|
+
}
|
|
65
|
+
let states;
|
|
66
|
+
if (rawStates) {
|
|
67
|
+
const invalid = rawStates.filter((s) => !PROCESS_STATES.includes(s));
|
|
68
|
+
if (invalid.length > 0) {
|
|
69
|
+
throw new GatewayVerbError(`Unknown fleet state(s): ${invalid.join(', ')}`, 'INVALID_ARGUMENT', 400);
|
|
70
|
+
}
|
|
71
|
+
states = rawStates;
|
|
72
|
+
}
|
|
73
|
+
if (!kinds && !states)
|
|
74
|
+
return undefined;
|
|
75
|
+
return { ...(kinds ? { kinds } : {}), ...(states ? { states } : {}) };
|
|
76
|
+
}
|
|
77
|
+
function clampLimit(raw, fallback, max) {
|
|
78
|
+
if (raw === undefined || raw === null)
|
|
79
|
+
return fallback;
|
|
80
|
+
const n = typeof raw === 'number' ? raw : Number(raw);
|
|
81
|
+
if (!Number.isFinite(n) || n <= 0) {
|
|
82
|
+
throw new GatewayVerbError(`Invalid limit: ${String(raw)}`, 'INVALID_ARGUMENT', 400);
|
|
83
|
+
}
|
|
84
|
+
return Math.min(Math.floor(n), max);
|
|
85
|
+
}
|
|
86
|
+
export function createFleetSnapshotHandler(registry) {
|
|
87
|
+
return (invocation) => {
|
|
88
|
+
const filter = readFleetQueryFilter(readInvocationParams(invocation));
|
|
89
|
+
const snapshot = registry.query(filter);
|
|
90
|
+
const truncated = snapshot.nodes.length > FLEET_SNAPSHOT_NODE_CAP;
|
|
91
|
+
const nodes = truncated
|
|
92
|
+
? snapshot.nodes.slice(0, FLEET_SNAPSHOT_NODE_CAP)
|
|
93
|
+
: snapshot.nodes;
|
|
94
|
+
return {
|
|
95
|
+
capturedAt: snapshot.capturedAt,
|
|
96
|
+
nodes,
|
|
97
|
+
truncated,
|
|
98
|
+
totalCount: snapshot.nodes.length,
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export function createFleetListHandler(registry) {
|
|
103
|
+
return (invocation) => {
|
|
104
|
+
const params = readInvocationParams(invocation);
|
|
105
|
+
const filter = readFleetQueryFilter(params);
|
|
106
|
+
const limit = clampLimit(params.limit, FLEET_LIST_DEFAULT_LIMIT, FLEET_LIST_MAX_LIMIT);
|
|
107
|
+
const rawCursor = typeof params.cursor === 'string' ? params.cursor : null;
|
|
108
|
+
const snapshot = registry.query(filter);
|
|
109
|
+
// Sort key and recovery key MUST agree (mirrors sessions.search's
|
|
110
|
+
// sortSessions-then-paginateItems pattern in session-search.ts): the array
|
|
111
|
+
// is sorted newest-first by startedAt (id tiebreak for determinism when
|
|
112
|
+
// two nodes share a timestamp, or neither has started), and paginateItems
|
|
113
|
+
// is handed that SAME startedAt extractor with { descending: true }. A
|
|
114
|
+
// node's `startedAt` is optional (not-yet-started processes), so absent
|
|
115
|
+
// values are normalized to 0 for both the sort and the recovery key —
|
|
116
|
+
// otherwise `paginateItems`' deleted-cursor recovery (which does a
|
|
117
|
+
// findIndex assuming the array is actually ordered by the field it is
|
|
118
|
+
// given) would search a startedAt-ordered predicate over an array that
|
|
119
|
+
// was really sorted by id, silently skipping or repeating nodes once a
|
|
120
|
+
// process is gc'd between pages.
|
|
121
|
+
const startedAtOf = (node) => node.startedAt ?? 0;
|
|
122
|
+
const sorted = [...snapshot.nodes].sort((a, b) => startedAtOf(b) - startedAtOf(a) || a.id.localeCompare(b.id));
|
|
123
|
+
const page = paginateItems(sorted, limit, rawCursor, (node) => node.id, startedAtOf, { descending: true });
|
|
124
|
+
if ('error' in page) {
|
|
125
|
+
throw new GatewayVerbError(page.error, 'INVALID_CURSOR', 400);
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
items: page.items,
|
|
129
|
+
nextCursor: page.nextCursor,
|
|
130
|
+
hasMore: page.hasMore,
|
|
131
|
+
capturedAt: snapshot.capturedAt,
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Attach the `fleet.snapshot` / `fleet.list` handlers to the descriptors
|
|
137
|
+
* already registered (without a handler) from
|
|
138
|
+
* ../method-catalog-control-core.ts's static builtin array. Call once, at
|
|
139
|
+
* RuntimeServices construction time, after `processRegistry` exists.
|
|
140
|
+
* A missing descriptor (contract/registration drift) is a silent no-op
|
|
141
|
+
* rather than a throw — construction must never fail because a wire verb
|
|
142
|
+
* failed to register; the operator-contract gates catch a real drift.
|
|
143
|
+
*/
|
|
144
|
+
export function registerFleetGatewayMethods(catalog, registry) {
|
|
145
|
+
const snapshotDescriptor = catalog.get('fleet.snapshot');
|
|
146
|
+
if (snapshotDescriptor) {
|
|
147
|
+
catalog.register(snapshotDescriptor, createFleetSnapshotHandler(registry), { replace: true });
|
|
148
|
+
}
|
|
149
|
+
const listDescriptor = catalog.get('fleet.list');
|
|
150
|
+
if (listDescriptor) {
|
|
151
|
+
catalog.register(listDescriptor, createFleetListHandler(registry), { replace: true });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gateway-verb-error.ts
|
|
3
|
+
*
|
|
4
|
+
* (fleet.*, checkpoints.*, sessions.search — see CHANGELOG 1.0.0): a structured error for
|
|
5
|
+
* gateway methods registered with a direct handler via
|
|
6
|
+
* `GatewayMethodCatalog.register(descriptor, handler)`.
|
|
7
|
+
*
|
|
8
|
+
* WHY THIS EXISTS: `invokeGatewayMethodCall` (../../daemon/control-plane.ts)
|
|
9
|
+
* dispatches a handler-bearing method via `catalog.invoke()` and, on ANY
|
|
10
|
+
* thrown error, collapses it to a blanket `{ status: 500 }` — there was no
|
|
11
|
+
* prior handler-registered verb that needed an honest non-500 status (the
|
|
12
|
+
* only prior consumer of `register(descriptor, handler)` is the plugin API,
|
|
13
|
+
* whose tool-call errors are swallowed into a `{success:false}` payload, not
|
|
14
|
+
* an HTTP status). checkpoints.diff/restore need an honest 404 for an
|
|
15
|
+
* unknown/gc'd checkpoint id (see routes/checkpoints.ts), and invalid
|
|
16
|
+
* pagination cursors need an honest 400 (fleet.list, sessions.search) — a
|
|
17
|
+
* blanket 500 would misreport caller error as server error.
|
|
18
|
+
*
|
|
19
|
+
* This mirrors the existing `SDKErrorCodes.SESSION_CLOSED` convention used by
|
|
20
|
+
* the plain-REST session routes (`callOrSessionClosed`,
|
|
21
|
+
* ../../../daemon-sdk/src/runtime-session-routes.ts), generalized to any
|
|
22
|
+
* status/code pair instead of one hardcoded to 409/SESSION_CLOSED.
|
|
23
|
+
*/
|
|
24
|
+
export declare class GatewayVerbError extends Error {
|
|
25
|
+
readonly code: string;
|
|
26
|
+
readonly status: number;
|
|
27
|
+
constructor(message: string, code: string, status: number);
|
|
28
|
+
}
|
|
29
|
+
export declare function isGatewayVerbError(error: unknown): error is GatewayVerbError;
|
|
30
|
+
//# sourceMappingURL=gateway-verb-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-verb-error.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/gateway-verb-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAM1D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAE5E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* gateway-verb-error.ts
|
|
3
|
+
*
|
|
4
|
+
* (fleet.*, checkpoints.*, sessions.search — see CHANGELOG 1.0.0): a structured error for
|
|
5
|
+
* gateway methods registered with a direct handler via
|
|
6
|
+
* `GatewayMethodCatalog.register(descriptor, handler)`.
|
|
7
|
+
*
|
|
8
|
+
* WHY THIS EXISTS: `invokeGatewayMethodCall` (../../daemon/control-plane.ts)
|
|
9
|
+
* dispatches a handler-bearing method via `catalog.invoke()` and, on ANY
|
|
10
|
+
* thrown error, collapses it to a blanket `{ status: 500 }` — there was no
|
|
11
|
+
* prior handler-registered verb that needed an honest non-500 status (the
|
|
12
|
+
* only prior consumer of `register(descriptor, handler)` is the plugin API,
|
|
13
|
+
* whose tool-call errors are swallowed into a `{success:false}` payload, not
|
|
14
|
+
* an HTTP status). checkpoints.diff/restore need an honest 404 for an
|
|
15
|
+
* unknown/gc'd checkpoint id (see routes/checkpoints.ts), and invalid
|
|
16
|
+
* pagination cursors need an honest 400 (fleet.list, sessions.search) — a
|
|
17
|
+
* blanket 500 would misreport caller error as server error.
|
|
18
|
+
*
|
|
19
|
+
* This mirrors the existing `SDKErrorCodes.SESSION_CLOSED` convention used by
|
|
20
|
+
* the plain-REST session routes (`callOrSessionClosed`,
|
|
21
|
+
* ../../../daemon-sdk/src/runtime-session-routes.ts), generalized to any
|
|
22
|
+
* status/code pair instead of one hardcoded to 409/SESSION_CLOSED.
|
|
23
|
+
*/
|
|
24
|
+
export class GatewayVerbError extends Error {
|
|
25
|
+
code;
|
|
26
|
+
status;
|
|
27
|
+
constructor(message, code, status) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.name = 'GatewayVerbError';
|
|
30
|
+
this.code = code;
|
|
31
|
+
this.status = status;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function isGatewayVerbError(error) {
|
|
35
|
+
return error instanceof GatewayVerbError;
|
|
36
|
+
}
|
|
@@ -1,8 +1,2 @@
|
|
|
1
|
-
export { dispatchAutomationRoutes } from './automation.js';
|
|
2
|
-
export { dispatchSessionRoutes } from './sessions.js';
|
|
3
|
-
export { dispatchTaskRoutes } from './tasks.js';
|
|
4
|
-
export { dispatchOperatorRoutes } from './operator.js';
|
|
5
|
-
export { dispatchRemoteRoutes } from './remote.js';
|
|
6
1
|
export { dispatchDaemonApiRoutes } from './api-router.js';
|
|
7
|
-
export type { DaemonApiRouteHandlers } from './context.js';
|
|
8
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
// The live daemon route dispatch is daemon-sdk's; this barrel re-exports it.
|
|
2
|
+
// The former sdk-local dispatcher copies (automation/tasks/operator/remote/
|
|
3
|
+
// sessions + their context types) were a superseded, unreachable parallel —
|
|
4
|
+
// deleted in the session-spine integration cleanup (see CHANGELOG 1.0.0; 0 callers, 0 api.md
|
|
5
|
+
// presence; every test imports the daemon-sdk originals). Pay-its-way rule.
|
|
6
6
|
export { dispatchDaemonApiRoutes } from './api-router.js';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* routes/invocation-params.ts
|
|
3
|
+
*
|
|
4
|
+
* (see CHANGELOG 1.0.0, post-S1 alignment) — one params view for the handler-registered
|
|
5
|
+
* verbs (fleet.*, checkpoints.*, sessions.search).
|
|
6
|
+
*
|
|
7
|
+
* S1's invoke-layer input gate (invoke-input-validation.ts, wired in
|
|
8
|
+
* daemon/control-plane.ts invokeGatewayMethodCall) validates the invoke BODY
|
|
9
|
+
* against a handler verb's typed inputSchema — a method with no http binding
|
|
10
|
+
* is body-carrying by that gate's definition. So the BODY is the canonical,
|
|
11
|
+
* schema-validated params channel for these verbs, and callers should put
|
|
12
|
+
* params there.
|
|
13
|
+
*
|
|
14
|
+
* The generic invoke envelope ({ query?, body }) still carries a `query`
|
|
15
|
+
* record, so this helper folds it in as a FALLBACK (body keys win). Query-
|
|
16
|
+
* supplied values bypass S1's schema gate, but every one of these handlers
|
|
17
|
+
* performs its own full validation with honest 400s (GatewayVerbError), so
|
|
18
|
+
* nothing unchecked reaches a manager either way.
|
|
19
|
+
*/
|
|
20
|
+
import type { GatewayMethodInvocation } from '../method-catalog-shared.js';
|
|
21
|
+
/** Merged params for a handler-registered verb: query as fallback, body wins. */
|
|
22
|
+
export declare function readInvocationParams(invocation: GatewayMethodInvocation): Record<string, unknown>;
|
|
23
|
+
//# sourceMappingURL=invocation-params.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invocation-params.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/invocation-params.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAQ3E,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEjG"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
function asRecord(value) {
|
|
2
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
3
|
+
? value
|
|
4
|
+
: {};
|
|
5
|
+
}
|
|
6
|
+
/** Merged params for a handler-registered verb: query as fallback, body wins. */
|
|
7
|
+
export function readInvocationParams(invocation) {
|
|
8
|
+
return { ...asRecord(invocation.query), ...asRecord(invocation.body) };
|
|
9
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* routes/push.ts
|
|
3
|
+
*
|
|
4
|
+
* Attaches the `push.*` gateway-method handlers to the descriptors declared in
|
|
5
|
+
* ../method-catalog-push.ts. Same mechanism fleet.* uses:
|
|
6
|
+
* `catalog.register(descriptor, handler)`, reached over real HTTP through the
|
|
7
|
+
* generic `/api/control-plane/methods/{id}/invoke` endpoint — no new REST route
|
|
8
|
+
* in the external daemon-sdk package, no router change.
|
|
9
|
+
*
|
|
10
|
+
* Every write is scoped to the authenticated principal (the operator identity
|
|
11
|
+
* the invoke layer resolved), so one operator can neither read, delete, nor
|
|
12
|
+
* test another operator's registered devices.
|
|
13
|
+
*/
|
|
14
|
+
import type { GatewayMethodCatalog } from '../method-catalog.js';
|
|
15
|
+
import type { PushService } from '../../push/index.js';
|
|
16
|
+
/** The narrow slice of PushService these verbs need. */
|
|
17
|
+
export type PushGatewayService = Pick<PushService, 'getPublicKey' | 'subscribe' | 'listSubscriptions' | 'unsubscribe' | 'verify'>;
|
|
18
|
+
/**
|
|
19
|
+
* Attach the `push.*` handlers to their already-cataloged descriptors. Call
|
|
20
|
+
* once, at RuntimeServices construction time, after the PushService exists. A
|
|
21
|
+
* missing descriptor (contract/registration drift) is a silent no-op rather
|
|
22
|
+
* than a throw — construction must never fail because one wire verb failed to
|
|
23
|
+
* register; the operator-contract gates catch a real drift.
|
|
24
|
+
*/
|
|
25
|
+
export declare function registerPushGatewayMethods(catalog: GatewayMethodCatalog, service: PushGatewayService): void;
|
|
26
|
+
//# sourceMappingURL=push.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/push.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD,wDAAwD;AACxD,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,WAAW,EACX,cAAc,GAAG,WAAW,GAAG,mBAAmB,GAAG,aAAa,GAAG,QAAQ,CAC9E,CAAC;AAkGF;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAO3G"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { GatewayVerbError } from './gateway-verb-error.js';
|
|
2
|
+
import { readInvocationParams } from './invocation-params.js';
|
|
3
|
+
function requirePrincipal(invocation) {
|
|
4
|
+
const principalId = invocation.context.principalId;
|
|
5
|
+
if (!principalId) {
|
|
6
|
+
throw new GatewayVerbError('Push verbs require an authenticated principal', 'UNAUTHENTICATED', 401);
|
|
7
|
+
}
|
|
8
|
+
return principalId;
|
|
9
|
+
}
|
|
10
|
+
function requireString(value, field) {
|
|
11
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
12
|
+
throw new GatewayVerbError(`Missing or invalid ${field}`, 'INVALID_ARGUMENT', 400);
|
|
13
|
+
}
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
function requireHttpsEndpoint(value) {
|
|
17
|
+
const endpoint = requireString(value, 'endpoint');
|
|
18
|
+
let parsed;
|
|
19
|
+
try {
|
|
20
|
+
parsed = new URL(endpoint);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw new GatewayVerbError('endpoint is not a valid URL', 'INVALID_ARGUMENT', 400);
|
|
24
|
+
}
|
|
25
|
+
if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {
|
|
26
|
+
throw new GatewayVerbError('endpoint must be an http(s) URL', 'INVALID_ARGUMENT', 400);
|
|
27
|
+
}
|
|
28
|
+
return endpoint;
|
|
29
|
+
}
|
|
30
|
+
function requireKeys(value) {
|
|
31
|
+
if (value === null || typeof value !== 'object') {
|
|
32
|
+
throw new GatewayVerbError('Missing subscription keys', 'INVALID_ARGUMENT', 400);
|
|
33
|
+
}
|
|
34
|
+
const keys = value;
|
|
35
|
+
return {
|
|
36
|
+
p256dh: requireString(keys.p256dh, 'keys.p256dh'),
|
|
37
|
+
auth: requireString(keys.auth, 'keys.auth'),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function createVapidGetHandler(service) {
|
|
41
|
+
return async () => ({ publicKey: await service.getPublicKey() });
|
|
42
|
+
}
|
|
43
|
+
function createSubscribeHandler(service) {
|
|
44
|
+
return async (invocation) => {
|
|
45
|
+
const principalId = requirePrincipal(invocation);
|
|
46
|
+
const params = readInvocationParams(invocation);
|
|
47
|
+
const endpoint = requireHttpsEndpoint(params.endpoint);
|
|
48
|
+
const keys = requireKeys(params.keys);
|
|
49
|
+
const subscription = await service.subscribe({ principalId, endpoint, keys });
|
|
50
|
+
return { subscription };
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function createListHandler(service) {
|
|
54
|
+
return async (invocation) => {
|
|
55
|
+
const principalId = requirePrincipal(invocation);
|
|
56
|
+
return { subscriptions: await service.listSubscriptions(principalId) };
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function createDeleteHandler(service) {
|
|
60
|
+
return async (invocation) => {
|
|
61
|
+
const principalId = requirePrincipal(invocation);
|
|
62
|
+
const params = readInvocationParams(invocation);
|
|
63
|
+
const subscriptionId = requireString(params.subscriptionId, 'subscriptionId');
|
|
64
|
+
const deleted = await service.unsubscribe(subscriptionId, principalId);
|
|
65
|
+
if (!deleted) {
|
|
66
|
+
throw new GatewayVerbError('Unknown push subscription', 'SUBSCRIPTION_NOT_FOUND', 404);
|
|
67
|
+
}
|
|
68
|
+
return { subscriptionId, deleted: true };
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function createVerifyHandler(service) {
|
|
72
|
+
return async (invocation) => {
|
|
73
|
+
const principalId = requirePrincipal(invocation);
|
|
74
|
+
const params = readInvocationParams(invocation);
|
|
75
|
+
const subscriptionId = requireString(params.subscriptionId, 'subscriptionId');
|
|
76
|
+
const receipt = await service.verify(subscriptionId, principalId);
|
|
77
|
+
if (!receipt) {
|
|
78
|
+
throw new GatewayVerbError('Unknown push subscription', 'SUBSCRIPTION_NOT_FOUND', 404);
|
|
79
|
+
}
|
|
80
|
+
return { receipt };
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const PUSH_HANDLER_FACTORIES = {
|
|
84
|
+
'push.vapid.get': createVapidGetHandler,
|
|
85
|
+
'push.subscriptions.create': createSubscribeHandler,
|
|
86
|
+
'push.subscriptions.list': createListHandler,
|
|
87
|
+
'push.subscriptions.delete': createDeleteHandler,
|
|
88
|
+
'push.subscriptions.verify': createVerifyHandler,
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Attach the `push.*` handlers to their already-cataloged descriptors. Call
|
|
92
|
+
* once, at RuntimeServices construction time, after the PushService exists. A
|
|
93
|
+
* missing descriptor (contract/registration drift) is a silent no-op rather
|
|
94
|
+
* than a throw — construction must never fail because one wire verb failed to
|
|
95
|
+
* register; the operator-contract gates catch a real drift.
|
|
96
|
+
*/
|
|
97
|
+
export function registerPushGatewayMethods(catalog, service) {
|
|
98
|
+
for (const [methodId, factory] of Object.entries(PUSH_HANDLER_FACTORIES)) {
|
|
99
|
+
const descriptor = catalog.get(methodId);
|
|
100
|
+
if (descriptor) {
|
|
101
|
+
catalog.register(descriptor, factory(service), { replace: true });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|