@pellux/goodvibes-sdk 0.38.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/contracts/artifacts/operator-contract.json +3171 -929
- package/dist/daemon.d.ts +2 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +4 -0
- 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 +13 -0
- package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator-runner.js +14 -0
- package/dist/platform/agents/orchestrator.d.ts +38 -6
- package/dist/platform/agents/orchestrator.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator.js +66 -18
- 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 +23 -0
- package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-controller.js +158 -32
- 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-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 +67 -20
- package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-manager.js +130 -144
- 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 +37 -4
- 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-types.d.ts +13 -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 +6 -1
- package/dist/platform/control-plane/index.d.ts.map +1 -1
- package/dist/platform/control-plane/index.js +4 -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 +133 -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-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-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 +32 -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 +29 -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 +57 -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/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 +21 -1
- 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 +8 -1
- package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-turn-loop.js +6 -0
- package/dist/platform/core/orchestrator.d.ts +6 -0
- package/dist/platform/core/orchestrator.d.ts.map +1 -1
- package/dist/platform/core/orchestrator.js +15 -0
- 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 +63 -0
- package/dist/platform/daemon/boot.d.ts.map +1 -0
- package/dist/platform/daemon/boot.js +60 -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 +18 -6
- package/dist/platform/daemon/facade.d.ts.map +1 -1
- package/dist/platform/daemon/facade.js +50 -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 +1 -1
- package/dist/platform/daemon/http/router.d.ts.map +1 -1
- package/dist/platform/daemon/http/router.js +7 -22
- 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/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/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/controller-compat.d.ts +14 -0
- package/dist/platform/orchestration/controller-compat.d.ts.map +1 -1
- package/dist/platform/orchestration/controller-compat.js +18 -4
- 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 +226 -21
- 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 +4 -1
- package/dist/platform/orchestration/phase-runner.d.ts +29 -2
- 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 +19 -0
- 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 +286 -1
- 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/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/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/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 +48 -1
- package/dist/platform/runtime/fleet/registry.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/registry.js +38 -4
- 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 +9 -7
- package/dist/platform/runtime/services.d.ts.map +1 -1
- package/dist/platform/runtime/services.js +19 -4
- 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-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 +10 -2
- 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 +63 -0
- package/dist/platform/state/memory-recall-contract.d.ts.map +1 -0
- package/dist/platform/state/memory-recall-contract.js +94 -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 +13 -2
- 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/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 +12 -0
- package/dist/platform/tools/agent/manager.d.ts.map +1 -1
- package/dist/platform/tools/agent/manager.js +6 -0
- 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 +22 -5
- package/dist/platform/tools/exec/schema.d.ts +1 -1
- package/dist/platform/tools/exec/schema.d.ts.map +1 -1
- package/dist/platform/tools/exec/schema.js +2 -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/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/version.js +1 -1
- package/package.json +21 -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,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* routes/fleet.ts
|
|
3
|
+
*
|
|
4
|
+
* W3-S2 — `fleet.snapshot` / `fleet.list` gateway-method handlers 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 (risk #1, W3-S2 brief): 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 (risk #1, W3-S2 brief): 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
|
+
* W3-S2 (fleet.*, checkpoints.*, sessions.search): 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
|
+
* W3-S2 (fleet.*, checkpoints.*, sessions.search): 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 Wave-1 spine integration cleanup (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
|
+
* W3-S2 (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/register-w3-s2.ts
|
|
3
|
+
*
|
|
4
|
+
* Single composite entry point for W3-S2's three verb-registration calls
|
|
5
|
+
* (fleet.*, checkpoints.*, sessions.search), so ../../runtime/services.ts —
|
|
6
|
+
* already at its line-cap ceiling — only needs one import and one call
|
|
7
|
+
* instead of three of each. See routes/fleet.ts, routes/checkpoints.ts, and
|
|
8
|
+
* routes/session-search.ts for what each registration actually does and why
|
|
9
|
+
* it's a catalog.register(descriptor, handler) call rather than a daemon-sdk
|
|
10
|
+
* REST route or a router.ts change.
|
|
11
|
+
*
|
|
12
|
+
* Call once, at RuntimeServices construction time, after processRegistry,
|
|
13
|
+
* workspaceCheckpointManager, and sessionBroker all exist (processRegistry
|
|
14
|
+
* is constructed last of the three, so the call site is right after it).
|
|
15
|
+
*/
|
|
16
|
+
import type { GatewayMethodCatalog } from '../method-catalog.js';
|
|
17
|
+
import { type FleetQueryOnlyRegistry } from './fleet.js';
|
|
18
|
+
import { type CheckpointsGatewayManager } from './checkpoints.js';
|
|
19
|
+
import { type SessionSearchBroker } from './session-search.js';
|
|
20
|
+
export interface W3S2GatewayDeps {
|
|
21
|
+
readonly processRegistry: FleetQueryOnlyRegistry;
|
|
22
|
+
readonly workspaceCheckpointManager: CheckpointsGatewayManager;
|
|
23
|
+
readonly sessionBroker: SessionSearchBroker;
|
|
24
|
+
}
|
|
25
|
+
export declare function registerW3S2GatewayMethods(catalog: GatewayMethodCatalog, deps: W3S2GatewayDeps): void;
|
|
26
|
+
//# sourceMappingURL=register-w3-s2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-w3-s2.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/register-w3-s2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAA+B,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAoC,KAAK,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAsC,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEnG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,eAAe,EAAE,sBAAsB,CAAC;IACjD,QAAQ,CAAC,0BAA0B,EAAE,yBAAyB,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;CAC7C;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAIrG"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { registerFleetGatewayMethods } from './fleet.js';
|
|
2
|
+
import { registerCheckpointGatewayMethods } from './checkpoints.js';
|
|
3
|
+
import { registerSessionSearchGatewayMethod } from './session-search.js';
|
|
4
|
+
export function registerW3S2GatewayMethods(catalog, deps) {
|
|
5
|
+
registerFleetGatewayMethods(catalog, deps.processRegistry);
|
|
6
|
+
registerCheckpointGatewayMethods(catalog, deps.workspaceCheckpointManager);
|
|
7
|
+
registerSessionSearchGatewayMethod(catalog, deps.sessionBroker);
|
|
8
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* routes/session-search.ts
|
|
3
|
+
*
|
|
4
|
+
* W3-S2 — `sessions.search`: a paginated/filtered query over the
|
|
5
|
+
* ALREADY-daemon-resident `SharedSessionBroker`'s home-scoped store,
|
|
6
|
+
* extending the Wave-1 list-filter shape (`ListSharedSessionsOptions`:
|
|
7
|
+
* project/kind/includeClosed) with a free-text `query`, `surfaceKind`,
|
|
8
|
+
* `status`, and opaque cursor pagination (mirrors the
|
|
9
|
+
* daemon-sdk `paginateItems` convention already used by
|
|
10
|
+
* automation-jobs/runs and knowledge listings).
|
|
11
|
+
*
|
|
12
|
+
* DELIBERATELY a standalone read-only helper, NOT a `SharedSessionBroker`
|
|
13
|
+
* method: the brief's file_ownership marks session-broker.ts read-only for
|
|
14
|
+
* S2 ("add a search method only if unavoidable — prefer a read-only query
|
|
15
|
+
* helper; coordinate with S3 which also reads the broker"). Everything here
|
|
16
|
+
* is built from the broker's existing public `listSessions()` — no new
|
|
17
|
+
* broker state, no new broker method.
|
|
18
|
+
*
|
|
19
|
+
* Bounded in-memory filter+sort (risk #3, W3-S2 brief): the store is
|
|
20
|
+
* single-user scale, so a full unbounded scan per call is intentional (no
|
|
21
|
+
* index) — see the brief's decision record for the documented ceiling.
|
|
22
|
+
*/
|
|
23
|
+
import type { GatewayMethodCatalog } from '../method-catalog.js';
|
|
24
|
+
import type { GatewayMethodHandler } from '../method-catalog-shared.js';
|
|
25
|
+
import type { SharedSessionBroker } from '../session-broker.js';
|
|
26
|
+
/** Structural dep — only the read surface `sessions.search` needs. */
|
|
27
|
+
export type SessionSearchBroker = Pick<SharedSessionBroker, 'listSessions'>;
|
|
28
|
+
export declare function createSessionsSearchHandler(broker: SessionSearchBroker): GatewayMethodHandler;
|
|
29
|
+
/**
|
|
30
|
+
* Attach the `sessions.search` handler to the descriptor already registered
|
|
31
|
+
* (without a handler) from ../method-catalog-control-core.ts's static
|
|
32
|
+
* builtin array. Call once, at RuntimeServices construction time. A missing
|
|
33
|
+
* descriptor is a silent no-op — see routes/fleet.ts's
|
|
34
|
+
* `registerFleetGatewayMethods` for the same rationale.
|
|
35
|
+
*/
|
|
36
|
+
export declare function registerSessionSearchGatewayMethod(catalog: GatewayMethodCatalog, broker: SessionSearchBroker): void;
|
|
37
|
+
//# sourceMappingURL=session-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-search.d.ts","sourceRoot":"","sources":["../../../../src/platform/control-plane/routes/session-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAkEhE,sEAAsE;AACtE,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;AAE5E,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,mBAAmB,GAAG,oBAAoB,CAuD7F;AAED;;;;;;GAMG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAKnH"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { SURFACE_KINDS } from '../../../events/surfaces.js';
|
|
2
|
+
import { paginateItems } from '@pellux/goodvibes-daemon-sdk';
|
|
3
|
+
import { GatewayVerbError } from './gateway-verb-error.js';
|
|
4
|
+
import { readInvocationParams } from './invocation-params.js';
|
|
5
|
+
const SHARED_SESSION_KINDS = [
|
|
6
|
+
'tui',
|
|
7
|
+
'agent',
|
|
8
|
+
'webui',
|
|
9
|
+
'companion-task',
|
|
10
|
+
'companion-chat',
|
|
11
|
+
'automation',
|
|
12
|
+
];
|
|
13
|
+
const SHARED_SESSION_STATUSES = ['active', 'closed'];
|
|
14
|
+
const SESSIONS_SEARCH_DEFAULT_LIMIT = 50;
|
|
15
|
+
const SESSIONS_SEARCH_MAX_LIMIT = 200;
|
|
16
|
+
function optionalString(value) {
|
|
17
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
18
|
+
}
|
|
19
|
+
function validateKind(value) {
|
|
20
|
+
if (value === undefined || value === null)
|
|
21
|
+
return undefined;
|
|
22
|
+
if (typeof value !== 'string' || !SHARED_SESSION_KINDS.includes(value)) {
|
|
23
|
+
throw new GatewayVerbError(`Invalid kind: ${String(value)} (expected one of ${SHARED_SESSION_KINDS.join(', ')})`, 'INVALID_ARGUMENT', 400);
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
function validateStatus(value) {
|
|
28
|
+
if (value === undefined || value === null)
|
|
29
|
+
return undefined;
|
|
30
|
+
if (typeof value !== 'string' || !SHARED_SESSION_STATUSES.includes(value)) {
|
|
31
|
+
throw new GatewayVerbError(`Invalid status: ${String(value)} (expected one of ${SHARED_SESSION_STATUSES.join(', ')})`, 'INVALID_ARGUMENT', 400);
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
function validateSurfaceKind(value) {
|
|
36
|
+
if (value === undefined || value === null)
|
|
37
|
+
return undefined;
|
|
38
|
+
if (typeof value !== 'string' || !SURFACE_KINDS.includes(value)) {
|
|
39
|
+
throw new GatewayVerbError(`Invalid surfaceKind: ${String(value)}`, 'INVALID_ARGUMENT', 400);
|
|
40
|
+
}
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
function clampLimit(raw) {
|
|
44
|
+
if (raw === undefined || raw === null)
|
|
45
|
+
return SESSIONS_SEARCH_DEFAULT_LIMIT;
|
|
46
|
+
const n = typeof raw === 'number' ? raw : Number(raw);
|
|
47
|
+
if (!Number.isFinite(n) || n <= 0) {
|
|
48
|
+
throw new GatewayVerbError(`Invalid limit: ${String(raw)}`, 'INVALID_ARGUMENT', 400);
|
|
49
|
+
}
|
|
50
|
+
return Math.min(Math.floor(n), SESSIONS_SEARCH_MAX_LIMIT);
|
|
51
|
+
}
|
|
52
|
+
export function createSessionsSearchHandler(broker) {
|
|
53
|
+
return (invocation) => {
|
|
54
|
+
const params = readInvocationParams(invocation);
|
|
55
|
+
const textQuery = optionalString(params.query)?.toLowerCase();
|
|
56
|
+
const project = optionalString(params.project);
|
|
57
|
+
const kind = validateKind(params.kind);
|
|
58
|
+
const surfaceKind = validateSurfaceKind(params.surfaceKind);
|
|
59
|
+
const status = validateStatus(params.status);
|
|
60
|
+
const includeClosed = params.includeClosed === true || params.includeClosed === 'true';
|
|
61
|
+
const limit = clampLimit(params.limit);
|
|
62
|
+
const rawCursor = typeof params.cursor === 'string' ? params.cursor : null;
|
|
63
|
+
// Always fetch WITH closed sessions from the broker (its own default),
|
|
64
|
+
// then apply the wire-level closed policy ourselves below: sessions.search
|
|
65
|
+
// deliberately defaults to EXCLUDING closed sessions unless
|
|
66
|
+
// includeClosed:true is explicit — the opposite of
|
|
67
|
+
// SharedSessionBroker.listSessions' own default — because a "search"
|
|
68
|
+
// surface should not surface dead sessions by default.
|
|
69
|
+
const all = broker.listSessions(Number.MAX_SAFE_INTEGER, {
|
|
70
|
+
project,
|
|
71
|
+
kind,
|
|
72
|
+
includeClosed: true,
|
|
73
|
+
});
|
|
74
|
+
const filtered = all.filter((session) => {
|
|
75
|
+
if (!includeClosed && session.status === 'closed')
|
|
76
|
+
return false;
|
|
77
|
+
if (status !== undefined && session.status !== status)
|
|
78
|
+
return false;
|
|
79
|
+
if (surfaceKind !== undefined && !session.surfaceKinds.includes(surfaceKind))
|
|
80
|
+
return false;
|
|
81
|
+
if (textQuery !== undefined) {
|
|
82
|
+
const haystack = `${session.id} ${session.title}`.toLowerCase();
|
|
83
|
+
if (!haystack.includes(textQuery))
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
return true;
|
|
87
|
+
});
|
|
88
|
+
// Mirrors sortSessions (session-broker-state.ts): updatedAt desc, id asc tiebreak.
|
|
89
|
+
const sorted = [...filtered].sort((a, b) => b.updatedAt - a.updatedAt || a.id.localeCompare(b.id));
|
|
90
|
+
const page = paginateItems(sorted, limit, rawCursor, (session) => session.id, (session) => session.updatedAt, { descending: true });
|
|
91
|
+
if ('error' in page) {
|
|
92
|
+
throw new GatewayVerbError(page.error, 'INVALID_CURSOR', 400);
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
sessions: page.items,
|
|
96
|
+
nextCursor: page.nextCursor,
|
|
97
|
+
hasMore: page.hasMore,
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Attach the `sessions.search` handler to the descriptor already registered
|
|
103
|
+
* (without a handler) from ../method-catalog-control-core.ts's static
|
|
104
|
+
* builtin array. Call once, at RuntimeServices construction time. A missing
|
|
105
|
+
* descriptor is a silent no-op — see routes/fleet.ts's
|
|
106
|
+
* `registerFleetGatewayMethods` for the same rationale.
|
|
107
|
+
*/
|
|
108
|
+
export function registerSessionSearchGatewayMethod(catalog, broker) {
|
|
109
|
+
const descriptor = catalog.get('sessions.search');
|
|
110
|
+
if (descriptor) {
|
|
111
|
+
catalog.register(descriptor, createSessionsSearchHandler(broker), { replace: true });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -8,6 +8,22 @@ export interface SharedSessionGcStore {
|
|
|
8
8
|
export interface SharedSessionGcOptions {
|
|
9
9
|
readonly idleEmptyMs: number;
|
|
10
10
|
readonly idleLongMs: number;
|
|
11
|
+
/**
|
|
12
|
+
* Age (ms since closedAt) at which a CLOSED session's record + bodies are
|
|
13
|
+
* PERMANENTLY deleted from the store. Closed sessions are HISTORY: by default
|
|
14
|
+
* this is `Number.POSITIVE_INFINITY` (retain indefinitely — a closed session
|
|
15
|
+
* is never swept off disk), and deletion happens only when a caller opts into
|
|
16
|
+
* a finite retention window or invokes an explicit delete verb.
|
|
17
|
+
*
|
|
18
|
+
* NOTE ON MEMORY vs PERSISTENCE (divergence from the companion manager):
|
|
19
|
+
* the broker's durable store is a FULL SNAPSHOT of these in-memory maps
|
|
20
|
+
* (createSessionBrokerSnapshot), so there is no separate "memory handle" to
|
|
21
|
+
* evict independently of disk — dropping a closed session's bodies from these
|
|
22
|
+
* maps would also drop them from the next persisted snapshot. Retention is
|
|
23
|
+
* therefore all-or-nothing here: retained closed sessions stay both listable
|
|
24
|
+
* and on disk; memory stays bounded by the per-session message cap
|
|
25
|
+
* (MAX_PERSISTED_MESSAGES_PER_SESSION) rather than by body eviction.
|
|
26
|
+
*/
|
|
11
27
|
readonly deletionRetentionMs: number;
|
|
12
28
|
readonly publishUpdate: (event: string, payload: unknown) => void;
|
|
13
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-broker-gc.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/session-broker-gc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-broker-gc.d.ts","sourceRoot":"","sources":["../../../src/platform/control-plane/session-broker-gc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGpF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACpD,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;IACvD,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACnE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAmCzG"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
import { withSessionCloseReason } from './session-broker-sessions.js';
|
|
1
2
|
export function sweepSharedSessions(store, options) {
|
|
2
3
|
const now = Date.now();
|
|
3
4
|
let anyChanged = false;
|
|
4
5
|
for (const [sessionId, session] of store.sessions.entries()) {
|
|
5
6
|
if (session.status === 'closed') {
|
|
7
|
+
// History by default. Only an explicit FINITE retention window authorizes
|
|
8
|
+
// permanent deletion; the default POSITIVE_INFINITY never trips this and
|
|
9
|
+
// the closed record stays listable (includeClosed) and on disk forever.
|
|
6
10
|
const closedAt = session.closedAt ?? session.updatedAt;
|
|
7
|
-
if (now - closedAt >= options.deletionRetentionMs) {
|
|
11
|
+
if (Number.isFinite(options.deletionRetentionMs) && now - closedAt >= options.deletionRetentionMs) {
|
|
8
12
|
store.sessions.delete(sessionId);
|
|
9
13
|
store.messages.delete(sessionId);
|
|
10
14
|
store.inputs.delete(sessionId);
|
|
@@ -12,8 +16,6 @@ export function sweepSharedSessions(store, options) {
|
|
|
12
16
|
}
|
|
13
17
|
continue;
|
|
14
18
|
}
|
|
15
|
-
if (!shouldCloseIdleSession(session, now, options))
|
|
16
|
-
continue;
|
|
17
19
|
const reason = idleCloseReason(session, now, options);
|
|
18
20
|
if (!reason)
|
|
19
21
|
continue;
|
|
@@ -23,6 +25,9 @@ export function sweepSharedSessions(store, options) {
|
|
|
23
25
|
activeAgentId: undefined,
|
|
24
26
|
updatedAt: now,
|
|
25
27
|
closedAt: now,
|
|
28
|
+
// Record that the SYSTEM reaper closed this (not a user/surface action) so a
|
|
29
|
+
// subsequent register heartbeat auto-reopens it (honest reopen semantics).
|
|
30
|
+
metadata: withSessionCloseReason(session.metadata, 'idle-reaped'),
|
|
26
31
|
};
|
|
27
32
|
store.sessions.set(sessionId, closed);
|
|
28
33
|
options.publishUpdate('session-closed', { ...closed, reason });
|
|
@@ -30,8 +35,15 @@ export function sweepSharedSessions(store, options) {
|
|
|
30
35
|
}
|
|
31
36
|
return anyChanged;
|
|
32
37
|
}
|
|
33
|
-
|
|
34
|
-
|
|
38
|
+
/**
|
|
39
|
+
* True when any participant was seen within the idle-empty window — i.e. a
|
|
40
|
+
* surface is actively holding this session open. A live participant IS activity,
|
|
41
|
+
* so an empty session with a fresh heartbeat must NOT be idle-empty reaped even
|
|
42
|
+
* if `lastActivityAt` has drifted (defense-in-depth alongside the register path
|
|
43
|
+
* advancing lastActivityAt).
|
|
44
|
+
*/
|
|
45
|
+
function hasFreshParticipant(session, now, idleEmptyMs) {
|
|
46
|
+
return session.participants.some((participant) => now - participant.lastSeenAt < idleEmptyMs);
|
|
35
47
|
}
|
|
36
48
|
function idleCloseReason(session, now, options) {
|
|
37
49
|
if (session.status !== 'active')
|
|
@@ -41,8 +53,13 @@ function idleCloseReason(session, now, options) {
|
|
|
41
53
|
if (session.pendingInputCount > 0)
|
|
42
54
|
return null;
|
|
43
55
|
const idle = now - session.lastActivityAt;
|
|
44
|
-
if (session.messageCount === 0 && idle >= options.idleEmptyMs)
|
|
56
|
+
if (session.messageCount === 0 && idle >= options.idleEmptyMs) {
|
|
57
|
+
// A surface holding the session open (fresh participant heartbeat) exempts it
|
|
58
|
+
// from idle-empty reaping — closing it would kill a LIVE, message-less session.
|
|
59
|
+
if (hasFreshParticipant(session, now, options.idleEmptyMs))
|
|
60
|
+
return null;
|
|
45
61
|
return 'idle-empty';
|
|
62
|
+
}
|
|
46
63
|
if (session.messageCount > 0 && idle >= options.idleLongMs)
|
|
47
64
|
return 'idle-long';
|
|
48
65
|
return null;
|