@pellux/goodvibes-sdk 0.37.2 → 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/communication.d.ts +21 -1
- package/dist/events/communication.d.ts.map +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/message-bus-core.d.ts +7 -0
- package/dist/platform/agents/message-bus-core.d.ts.map +1 -1
- package/dist/platform/agents/message-bus-core.js +2 -1
- package/dist/platform/agents/orchestrator-runner.d.ts +50 -1
- package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator-runner.js +172 -7
- package/dist/platform/agents/orchestrator.d.ts +78 -6
- package/dist/platform/agents/orchestrator.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator.js +95 -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 +192 -0
- package/dist/platform/agents/turn-knowledge-injection.d.ts.map +1 -0
- package/dist/platform/agents/turn-knowledge-injection.js +269 -0
- 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 +46 -0
- package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-controller.js +213 -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 +18 -0
- package/dist/platform/config/manager.d.ts.map +1 -1
- package/dist/platform/config/manager.js +36 -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/adaptive-planner.d.ts +50 -0
- package/dist/platform/core/adaptive-planner.d.ts.map +1 -1
- package/dist/platform/core/adaptive-planner.js +49 -0
- 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 +2 -0
- package/dist/platform/core/index.d.ts.map +1 -1
- package/dist/platform/core/index.js +2 -0
- package/dist/platform/core/orchestrator-runtime.d.ts +31 -0
- 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 +35 -1
- package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-turn-loop.js +121 -3
- package/dist/platform/core/orchestrator.d.ts +67 -0
- package/dist/platform/core/orchestrator.d.ts.map +1 -1
- package/dist/platform/core/orchestrator.js +89 -1
- 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 +204 -0
- package/dist/platform/core/plan-proposal.d.ts.map +1 -0
- package/dist/platform/core/plan-proposal.js +296 -0
- 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/knowledge-api.d.ts +26 -0
- package/dist/platform/knowledge/knowledge-api.d.ts.map +1 -1
- package/dist/platform/knowledge/knowledge-api.js +11 -0
- 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 +22 -0
- package/dist/platform/orchestration/budget.d.ts.map +1 -0
- package/dist/platform/orchestration/budget.js +35 -0
- package/dist/platform/orchestration/cancellation.d.ts +31 -0
- package/dist/platform/orchestration/cancellation.d.ts.map +1 -0
- package/dist/platform/orchestration/cancellation.js +25 -0
- package/dist/platform/orchestration/controller-compat.d.ts +46 -0
- package/dist/platform/orchestration/controller-compat.d.ts.map +1 -0
- package/dist/platform/orchestration/controller-compat.js +27 -0
- package/dist/platform/orchestration/dirty-guard.d.ts +32 -0
- package/dist/platform/orchestration/dirty-guard.d.ts.map +1 -0
- package/dist/platform/orchestration/dirty-guard.js +147 -0
- package/dist/platform/orchestration/engine.d.ts +82 -0
- package/dist/platform/orchestration/engine.d.ts.map +1 -0
- package/dist/platform/orchestration/engine.js +623 -0
- package/dist/platform/orchestration/index.d.ts +20 -0
- package/dist/platform/orchestration/index.d.ts.map +1 -0
- package/dist/platform/orchestration/index.js +11 -0
- package/dist/platform/orchestration/persistence.d.ts +24 -0
- package/dist/platform/orchestration/persistence.d.ts.map +1 -0
- package/dist/platform/orchestration/persistence.js +179 -0
- package/dist/platform/orchestration/phase-runner.d.ts +114 -0
- package/dist/platform/orchestration/phase-runner.d.ts.map +1 -0
- package/dist/platform/orchestration/phase-runner.js +347 -0
- 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 +64 -0
- package/dist/platform/orchestration/scheduler.d.ts.map +1 -0
- package/dist/platform/orchestration/scheduler.js +73 -0
- package/dist/platform/orchestration/types.d.ts +535 -0
- package/dist/platform/orchestration/types.d.ts.map +1 -0
- package/dist/platform/orchestration/types.js +47 -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/communication.d.ts +11 -0
- package/dist/platform/runtime/emitters/communication.d.ts.map +1 -1
- package/dist/platform/runtime/emitters/communication.js +9 -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 +56 -1
- package/dist/platform/runtime/fleet/adapters/agent.d.ts +56 -0
- package/dist/platform/runtime/fleet/adapters/agent.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/agent.js +143 -0
- package/dist/platform/runtime/fleet/adapters/automation.d.ts +30 -0
- package/dist/platform/runtime/fleet/adapters/automation.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/automation.js +41 -0
- package/dist/platform/runtime/fleet/adapters/background-process.d.ts +12 -0
- package/dist/platform/runtime/fleet/adapters/background-process.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/background-process.js +46 -0
- package/dist/platform/runtime/fleet/adapters/code-index.d.ts +21 -0
- package/dist/platform/runtime/fleet/adapters/code-index.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/code-index.js +44 -0
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts +69 -0
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/orchestration.js +329 -0
- package/dist/platform/runtime/fleet/adapters/schedule.d.ts +14 -0
- package/dist/platform/runtime/fleet/adapters/schedule.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/schedule.js +28 -0
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts +12 -0
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/trigger.js +22 -0
- package/dist/platform/runtime/fleet/adapters/watcher.d.ts +13 -0
- package/dist/platform/runtime/fleet/adapters/watcher.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/watcher.js +47 -0
- package/dist/platform/runtime/fleet/adapters/workflow.d.ts +11 -0
- package/dist/platform/runtime/fleet/adapters/workflow.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/workflow.js +34 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts +35 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.js +275 -0
- package/dist/platform/runtime/fleet/index.d.ts +10 -0
- package/dist/platform/runtime/fleet/index.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/index.js +6 -0
- package/dist/platform/runtime/fleet/registry.d.ts +113 -0
- package/dist/platform/runtime/fleet/registry.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/registry.js +664 -0
- package/dist/platform/runtime/fleet/types.d.ts +199 -0
- package/dist/platform/runtime/fleet/types.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/types.js +2 -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/runtime-knowledge-api.d.ts +1 -1
- package/dist/platform/runtime/runtime-knowledge-api.d.ts.map +1 -1
- package/dist/platform/runtime/runtime-knowledge-api.js +1 -0
- package/dist/platform/runtime/services.d.ts +48 -0
- package/dist/platform/runtime/services.d.ts.map +1 -1
- package/dist/platform/runtime/services.js +95 -2
- 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.d.ts +49 -0
- package/dist/platform/state/code-index-chunking.d.ts.map +1 -0
- package/dist/platform/state/code-index-chunking.js +111 -0
- package/dist/platform/state/code-index-db.d.ts +53 -0
- package/dist/platform/state/code-index-db.d.ts.map +1 -0
- package/dist/platform/state/code-index-db.js +101 -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 +175 -0
- package/dist/platform/state/code-index-store.d.ts.map +1 -0
- package/dist/platform/state/code-index-store.js +620 -0
- package/dist/platform/state/index.d.ts +12 -2
- package/dist/platform/state/index.d.ts.map +1 -1
- package/dist/platform/state/index.js +6 -1
- package/dist/platform/state/knowledge-injection.d.ts +23 -0
- package/dist/platform/state/knowledge-injection.d.ts.map +1 -1
- package/dist/platform/state/knowledge-injection.js +34 -19
- 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 +1 -13
- package/dist/platform/state/memory-vector-store.d.ts.map +1 -1
- package/dist/platform/state/memory-vector-store.js +18 -39
- 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 +25 -0
- package/dist/platform/state/sqlite-vec-loader.d.ts.map +1 -0
- package/dist/platform/state/sqlite-vec-loader.js +43 -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 +140 -1
- package/dist/platform/tools/agent/manager.d.ts.map +1 -1
- package/dist/platform/tools/agent/manager.js +143 -1
- 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 +161 -49
- package/dist/platform/tools/exec/schema.d.ts +3 -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/fetch/runtime.d.ts +7 -0
- package/dist/platform/tools/fetch/runtime.d.ts.map +1 -1
- package/dist/platform/tools/fetch/runtime.js +8 -6
- 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 +9 -3
- package/dist/platform/tools/registry.d.ts.map +1 -1
- package/dist/platform/tools/registry.js +9 -3
- 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 +14 -1
- package/dist/platform/types/tools.d.ts.map +1 -1
- package/dist/platform/version.js +1 -1
- package/package.json +29 -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,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan proposal types + pure assembler.
|
|
3
|
+
*
|
|
4
|
+
* This module turns a loose decomposition (produced by an LLM planning agent,
|
|
5
|
+
* or handed in directly by a caller) into a validated, typed `PlanProposal`.
|
|
6
|
+
* It is intentionally free of I/O and LLM calls: no filesystem access, no
|
|
7
|
+
* agent spawning, no network. It exists so `AdaptivePlanner` can stay a
|
|
8
|
+
* synchronous, deterministic, side-effect-free scorer while still producing
|
|
9
|
+
* a rich, structured artifact that an orchestration engine can render for
|
|
10
|
+
* human approval and (once approved) instantiate.
|
|
11
|
+
*
|
|
12
|
+
* A `PlanProposal` is DATA. It is never instantiated on its own — approval
|
|
13
|
+
* flows through the existing `ProjectPlanningState.executionApproved` gate
|
|
14
|
+
* (see `planProposalToPlanningState` below), and durable persistence reuses
|
|
15
|
+
* `ExecutionPlanManager` (see `planProposalToExecutionPlanItems` below).
|
|
16
|
+
* Neither adapter performs any I/O itself; they only shape data for callers
|
|
17
|
+
* that do.
|
|
18
|
+
*/
|
|
19
|
+
import { randomUUID } from 'node:crypto';
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Helpers
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
24
|
+
function normalizeKey(value) {
|
|
25
|
+
return value.toLowerCase().trim();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Detect dependency cycles in a resolved work-item graph without ever
|
|
29
|
+
* looping forever: each id is visited at most once per traversal state
|
|
30
|
+
* (`visiting` blocks re-entry into an in-progress path; `done` short-circuits
|
|
31
|
+
* repeat visits from other roots).
|
|
32
|
+
*/
|
|
33
|
+
function detectCycleTitles(workItems) {
|
|
34
|
+
const byId = new Map(workItems.map((item) => [item.id, item]));
|
|
35
|
+
const state = new Map();
|
|
36
|
+
const cyclic = new Set();
|
|
37
|
+
const visit = (id, stack) => {
|
|
38
|
+
const current = state.get(id);
|
|
39
|
+
if (current === 'done')
|
|
40
|
+
return;
|
|
41
|
+
if (current === 'visiting') {
|
|
42
|
+
const cycleStart = stack.indexOf(id);
|
|
43
|
+
const cycle = cycleStart === -1 ? stack : stack.slice(cycleStart);
|
|
44
|
+
for (const cycleId of cycle)
|
|
45
|
+
cyclic.add(cycleId);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
state.set(id, 'visiting');
|
|
49
|
+
const item = byId.get(id);
|
|
50
|
+
if (item) {
|
|
51
|
+
for (const dep of item.dependsOn) {
|
|
52
|
+
visit(dep, [...stack, id]);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
state.set(id, 'done');
|
|
56
|
+
};
|
|
57
|
+
for (const item of workItems)
|
|
58
|
+
visit(item.id, []);
|
|
59
|
+
return workItems.filter((item) => cyclic.has(item.id)).map((item) => item.title);
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Assembler
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
/**
|
|
65
|
+
* Turn a raw decomposition into a validated, typed `PlanProposal`.
|
|
66
|
+
*
|
|
67
|
+
* Never throws. Malformed input degrades to an honest partial result: an
|
|
68
|
+
* unresolved phase reference lands its work item in a synthesized "Unphased"
|
|
69
|
+
* bucket; an unresolved dependency reference is dropped; a dependency cycle
|
|
70
|
+
* is flagged but left in place (no silent edge removal). Every problem is
|
|
71
|
+
* reported via the returned `issues` list rather than an exception.
|
|
72
|
+
*
|
|
73
|
+
* Dependency resolution mirrors `ExecutionPlanManager.replaceItems` exactly:
|
|
74
|
+
* a dep that already looks like a UUID passes through unchecked, otherwise
|
|
75
|
+
* it is resolved by case-insensitive title match, otherwise it is dropped.
|
|
76
|
+
*
|
|
77
|
+
* `source` defaults to `'planner-agent'` (the expected majority caller —
|
|
78
|
+
* `AdaptivePlanner.proposeWorkstream`). Pass `'caller-supplied'` when a
|
|
79
|
+
* non-agent caller hands in its own decomposition directly.
|
|
80
|
+
*/
|
|
81
|
+
export function assemblePlanProposal(task, strategy, raw, source = 'planner-agent') {
|
|
82
|
+
const issues = [];
|
|
83
|
+
// Pass 1: assign phase ids + stable order, index by normalized title.
|
|
84
|
+
const phaseByTitle = new Map();
|
|
85
|
+
const phases = raw.phases.map((rawPhase, index) => {
|
|
86
|
+
const phase = {
|
|
87
|
+
id: randomUUID(),
|
|
88
|
+
title: rawPhase.title,
|
|
89
|
+
order: index,
|
|
90
|
+
...(rawPhase.description ? { description: rawPhase.description } : {}),
|
|
91
|
+
};
|
|
92
|
+
phaseByTitle.set(normalizeKey(rawPhase.title), phase);
|
|
93
|
+
return phase;
|
|
94
|
+
});
|
|
95
|
+
let unphased = null;
|
|
96
|
+
const resolvePhaseId = (title) => {
|
|
97
|
+
const found = phaseByTitle.get(normalizeKey(title));
|
|
98
|
+
if (found)
|
|
99
|
+
return { id: found.id, matched: true };
|
|
100
|
+
if (!unphased) {
|
|
101
|
+
unphased = { id: randomUUID(), title: 'Unphased', order: phases.length };
|
|
102
|
+
phases.push(unphased);
|
|
103
|
+
}
|
|
104
|
+
return { id: unphased.id, matched: false };
|
|
105
|
+
};
|
|
106
|
+
// Pass 2: assign work-item ids, index by normalized title (for dep resolution).
|
|
107
|
+
const idByTitle = new Map();
|
|
108
|
+
const provisional = raw.workItems.map((rawItem) => {
|
|
109
|
+
const id = randomUUID();
|
|
110
|
+
idByTitle.set(normalizeKey(rawItem.title), id);
|
|
111
|
+
return { id, rawItem };
|
|
112
|
+
});
|
|
113
|
+
const workItems = provisional.map(({ id, rawItem }) => {
|
|
114
|
+
const { id: phaseId, matched } = resolvePhaseId(rawItem.phase);
|
|
115
|
+
if (!matched) {
|
|
116
|
+
issues.push({
|
|
117
|
+
kind: 'unresolved-phase',
|
|
118
|
+
workItemTitle: rawItem.title,
|
|
119
|
+
message: `Work item "${rawItem.title}" referenced unknown phase "${rawItem.phase}"; placed in "Unphased".`,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
id,
|
|
124
|
+
title: rawItem.title,
|
|
125
|
+
brief: rawItem.brief,
|
|
126
|
+
phaseId,
|
|
127
|
+
dependsOn: [],
|
|
128
|
+
...(rawItem.suggestedArchetype ? { suggestedArchetype: rawItem.suggestedArchetype } : {}),
|
|
129
|
+
...(rawItem.likelyFiles ? { likelyFiles: rawItem.likelyFiles } : {}),
|
|
130
|
+
...(rawItem.verification ? { verification: rawItem.verification } : {}),
|
|
131
|
+
...(rawItem.canRunConcurrently !== undefined ? { canRunConcurrently: rawItem.canRunConcurrently } : {}),
|
|
132
|
+
...(rawItem.needsReview !== undefined ? { needsReview: rawItem.needsReview } : {}),
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
// Pass 3: resolve dependsOn — UUID passthrough, else case-insensitive title lookup, else drop.
|
|
136
|
+
for (let i = 0; i < workItems.length; i++) {
|
|
137
|
+
const rawDeps = raw.workItems[i]?.dependsOn;
|
|
138
|
+
if (!rawDeps || rawDeps.length === 0)
|
|
139
|
+
continue;
|
|
140
|
+
const item = workItems[i];
|
|
141
|
+
const resolved = [];
|
|
142
|
+
for (const dep of rawDeps) {
|
|
143
|
+
if (UUID_RE.test(dep)) {
|
|
144
|
+
resolved.push(dep);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const depId = idByTitle.get(normalizeKey(dep));
|
|
148
|
+
if (depId) {
|
|
149
|
+
resolved.push(depId);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
issues.push({
|
|
153
|
+
kind: 'dangling-dependency',
|
|
154
|
+
workItemTitle: item.title,
|
|
155
|
+
message: `Work item "${item.title}" depends on unresolved item "${dep}"; dependency dropped.`,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
item.dependsOn = resolved;
|
|
160
|
+
}
|
|
161
|
+
// Pass 4: flag (do not silently fix) dependency cycles.
|
|
162
|
+
for (const title of detectCycleTitles(workItems)) {
|
|
163
|
+
issues.push({
|
|
164
|
+
kind: 'dependency-cycle',
|
|
165
|
+
workItemTitle: title,
|
|
166
|
+
message: `Work item "${title}" is part of a dependency cycle.`,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
const proposal = {
|
|
170
|
+
id: randomUUID(),
|
|
171
|
+
task,
|
|
172
|
+
strategy,
|
|
173
|
+
rationale: `Decomposed "${task}" into ${phases.length} phase(s) and ${workItems.length} work item(s) for ${strategy} execution.`,
|
|
174
|
+
phases,
|
|
175
|
+
workItems,
|
|
176
|
+
createdAt: Date.now(),
|
|
177
|
+
source,
|
|
178
|
+
};
|
|
179
|
+
return { proposal, issues };
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The honest fallback: one phase ("Execute"), one work item whose title and
|
|
183
|
+
* brief both equal the task text, no dependencies. Used whenever decomposition
|
|
184
|
+
* was not warranted (see `AdaptivePlanner.shouldDecompose`) or no raw
|
|
185
|
+
* decomposition is available yet.
|
|
186
|
+
*/
|
|
187
|
+
export function singleItemProposal(task) {
|
|
188
|
+
const phaseId = randomUUID();
|
|
189
|
+
return {
|
|
190
|
+
id: randomUUID(),
|
|
191
|
+
task,
|
|
192
|
+
strategy: 'single',
|
|
193
|
+
rationale: `No decomposition applied; running "${task}" as a single work item.`,
|
|
194
|
+
phases: [{ id: phaseId, title: 'Execute', order: 0 }],
|
|
195
|
+
workItems: [{
|
|
196
|
+
id: randomUUID(),
|
|
197
|
+
title: task,
|
|
198
|
+
brief: task,
|
|
199
|
+
phaseId,
|
|
200
|
+
dependsOn: [],
|
|
201
|
+
}],
|
|
202
|
+
createdAt: Date.now(),
|
|
203
|
+
source: 'single-item-fallback',
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
// Approval-seam adapter: PlanProposal -> ProjectPlanningState
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
/**
|
|
210
|
+
* Project a `PlanProposal` into the existing `/plan approve` seam. This is
|
|
211
|
+
* data-only — no store is written here. The caller feeds the result into
|
|
212
|
+
* `ProjectPlanningService.upsertState` (or an equivalent), which is what
|
|
213
|
+
* actually persists it and evaluates readiness.
|
|
214
|
+
*
|
|
215
|
+
* Direction convention for the emitted `ProjectPlanningDependency` records
|
|
216
|
+
* (this type has no prior producer in the codebase to inherit a convention
|
|
217
|
+
* from, so it is fixed here): `fromTaskId` depends on `toTaskId`, i.e. the
|
|
218
|
+
* edge reads "fromTaskId depends on toTaskId" the same way `WorkItem.dependsOn`
|
|
219
|
+
* reads "this item depends on these ids".
|
|
220
|
+
*
|
|
221
|
+
* `ProjectPlanningTask` has no first-class phase concept, so phase
|
|
222
|
+
* membership is preserved in `metadata` rather than dropped silently.
|
|
223
|
+
*
|
|
224
|
+
* `executionApproved` is always `false` here — approval is a separate,
|
|
225
|
+
* explicit step owned by `/plan approve` (planning-runtime.ts), never implied
|
|
226
|
+
* by proposing.
|
|
227
|
+
*/
|
|
228
|
+
export function planProposalToPlanningState(proposal) {
|
|
229
|
+
const phaseTitleById = new Map(proposal.phases.map((phase) => [phase.id, phase.title]));
|
|
230
|
+
const tasks = proposal.workItems.map((item) => ({
|
|
231
|
+
id: item.id,
|
|
232
|
+
title: item.title,
|
|
233
|
+
why: item.brief,
|
|
234
|
+
status: 'pending',
|
|
235
|
+
...(item.dependsOn.length > 0 ? { dependencies: item.dependsOn } : {}),
|
|
236
|
+
...(item.likelyFiles ? { likelyFiles: item.likelyFiles } : {}),
|
|
237
|
+
...(item.verification ? { verification: item.verification } : {}),
|
|
238
|
+
...(item.canRunConcurrently !== undefined ? { canRunConcurrently: item.canRunConcurrently } : {}),
|
|
239
|
+
...(item.needsReview !== undefined ? { needsReview: item.needsReview } : {}),
|
|
240
|
+
...(item.suggestedArchetype ? { recommendedAgent: item.suggestedArchetype } : {}),
|
|
241
|
+
metadata: {
|
|
242
|
+
phaseId: item.phaseId,
|
|
243
|
+
...(phaseTitleById.has(item.phaseId) ? { phaseTitle: phaseTitleById.get(item.phaseId) } : {}),
|
|
244
|
+
},
|
|
245
|
+
}));
|
|
246
|
+
const dependencies = proposal.workItems.flatMap((item) => item.dependsOn.map((toTaskId) => ({ fromTaskId: item.id, toTaskId })));
|
|
247
|
+
const scope = proposal.phases.length > 0
|
|
248
|
+
? `Phases: ${proposal.phases.map((phase) => phase.title).join(', ')}`
|
|
249
|
+
: undefined;
|
|
250
|
+
return {
|
|
251
|
+
goal: proposal.task,
|
|
252
|
+
...(scope ? { scope } : {}),
|
|
253
|
+
...(proposal.rationale ? { assumptions: [proposal.rationale] } : {}),
|
|
254
|
+
tasks,
|
|
255
|
+
dependencies,
|
|
256
|
+
executionApproved: false,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
// ---------------------------------------------------------------------------
|
|
260
|
+
// Persistence adapter: PlanProposal -> ExecutionPlanManager's PlanItem shape
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
262
|
+
/**
|
|
263
|
+
* Project a `PlanProposal` into the plain items `ExecutionPlanManager` deals
|
|
264
|
+
* in. This is a deliberately lossy projection: `PlanItem` has no room for
|
|
265
|
+
* verification/likelyFiles/suggestedArchetype, and those stay in the
|
|
266
|
+
* full-fidelity `ProjectPlanningState` render above. It exists purely so a
|
|
267
|
+
* caller can hand a proposal's items to `ExecutionPlanManager` without
|
|
268
|
+
* re-deriving the phase/description/dependency shape by hand.
|
|
269
|
+
*
|
|
270
|
+
* Dependencies are expressed as WORK ITEM TITLES, not ids, because
|
|
271
|
+
* `ExecutionPlanManager.create()` does not resolve dependency references —
|
|
272
|
+
* only `ExecutionPlanManager.replaceItems()` does, by case-insensitive
|
|
273
|
+
* description match. The intended call sequence at instantiation is
|
|
274
|
+
* therefore:
|
|
275
|
+
*
|
|
276
|
+
* const plan = planManager.create(title, []);
|
|
277
|
+
* const { items } = planProposalToExecutionPlanItems(proposal);
|
|
278
|
+
* planManager.replaceItems(plan.id, items);
|
|
279
|
+
*
|
|
280
|
+
* which reuses `replaceItems`' existing dependency resolver end-to-end
|
|
281
|
+
* instead of re-implementing dependency resolution here. This module defines
|
|
282
|
+
* no scheduler of its own — ready-to-run item selection stays
|
|
283
|
+
* `ExecutionPlanManager.getNextItems`'s job.
|
|
284
|
+
*/
|
|
285
|
+
export function planProposalToExecutionPlanItems(proposal) {
|
|
286
|
+
const phaseTitleById = new Map(proposal.phases.map((phase) => [phase.id, phase.title]));
|
|
287
|
+
const titleById = new Map(proposal.workItems.map((item) => [item.id, item.title]));
|
|
288
|
+
const items = proposal.workItems.map((item) => ({
|
|
289
|
+
phase: phaseTitleById.get(item.phaseId) ?? 'Unphased',
|
|
290
|
+
description: item.title,
|
|
291
|
+
...(item.dependsOn.length > 0
|
|
292
|
+
? { dependencies: item.dependsOn.map((depId) => titleById.get(depId) ?? depId) }
|
|
293
|
+
: {}),
|
|
294
|
+
}));
|
|
295
|
+
return { title: proposal.task, items };
|
|
296
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ToolResult } from '../types/tools.js';
|
|
2
2
|
export declare function isWrfcWorkflowRequest(text: string): boolean;
|
|
3
|
+
export declare function userProhibitsDelegation(text: string): boolean;
|
|
3
4
|
export declare function buildWrfcWorkflowRoutingPrompt(text: string): string | null;
|
|
4
5
|
export declare function toolResultIndicatesAuthoritativeWrfcChain(result: ToolResult): boolean;
|
|
5
6
|
//# sourceMappingURL=wrfc-routing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrfc-routing.d.ts","sourceRoot":"","sources":["../../../src/platform/core/wrfc-routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM3D;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"wrfc-routing.d.ts","sourceRoot":"","sources":["../../../src/platform/core/wrfc-routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM3D;AAqCD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI7D;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa1E;AAsBD,wBAAgB,yCAAyC,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAQrF"}
|
|
@@ -8,10 +8,60 @@ export function isWrfcWorkflowRequest(text) {
|
|
|
8
8
|
return /\bwrfc\b.{0,80}\b(review|agent|build|make|implement|fix|test|verify|for)\b/.test(normalized)
|
|
9
9
|
|| /\b(review|agent|build|make|implement|fix|test|verify)\b.{0,80}\bwrfc\b/.test(normalized);
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* High-precision detector for an EXPLICIT user instruction not to delegate on this turn — do not
|
|
13
|
+
* spawn agents, do not start a WRFC/owner chain, or do the work directly/yourself. When true, the
|
|
14
|
+
* routing directive is suppressed entirely: the harness must never inject a "start a WRFC chain"
|
|
15
|
+
* nudge against a user who explicitly forbade it.
|
|
16
|
+
*
|
|
17
|
+
* Deliberately conservative. Every pattern pairs an explicit negation (do not / don't / never /
|
|
18
|
+
* no / without) with a delegation concept (spawn / agent(s) / delegate / wrfc / chain), or pairs a
|
|
19
|
+
* direct-action verb with "yourself"/"directly". A plain "build X with WRFC" request contains no
|
|
20
|
+
* such negation and is NOT treated as a prohibition. Precision over recall on purpose: a rare false
|
|
21
|
+
* positive only drops an advisory suggestion (the safe direction — never coerce), whereas a false
|
|
22
|
+
* negative would re-introduce the exact coercion this fixes.
|
|
23
|
+
*
|
|
24
|
+
* The documented pattern set:
|
|
25
|
+
* - "do not / don't / never spawn" → forbids spawning
|
|
26
|
+
* - "no agents" / "without agents" / "no sub-agents" → forbids agents
|
|
27
|
+
* - "no delegation" / "do not / don't / never delegate" → forbids delegation
|
|
28
|
+
* - "do not / don't / never start a wrfc|chain" / "no wrfc" → forbids starting a chain
|
|
29
|
+
* - "do not / don't / never use the agent tool|agents" → forbids the agent tool
|
|
30
|
+
* - "do|handle|implement|write|answer … yourself|directly" → asks for direct, non-delegated work
|
|
31
|
+
*/
|
|
32
|
+
const DELEGATION_PROHIBITION_PATTERNS = [
|
|
33
|
+
/\b(?:do not|don't|never) spawn\b/,
|
|
34
|
+
/\bno (?:sub-?)?agents?\b/,
|
|
35
|
+
/\bwithout (?:spawning )?(?:sub-?)?agents?\b/,
|
|
36
|
+
/\bno delegation\b/,
|
|
37
|
+
/\b(?:do not|don't|never) delegate\b/,
|
|
38
|
+
/\b(?:do not|don't|never) start (?:a |an )?(?:new )?wrfc\b/,
|
|
39
|
+
/\bno wrfc (?:chain|owner)\b/,
|
|
40
|
+
/\b(?:do not|don't|never) start (?:a |an )?(?:new )?chain\b/,
|
|
41
|
+
/\b(?:do not|don't|never) use (?:the )?agents?\b/,
|
|
42
|
+
/\b(?:do not|don't|never) use the agent tool\b/,
|
|
43
|
+
/\b(?:do|handle|implement|write|answer)(?: it| this)?(?: the \w+)? (?:yourself|directly)\b/,
|
|
44
|
+
];
|
|
45
|
+
export function userProhibitsDelegation(text) {
|
|
46
|
+
// Normalize curly apostrophes and whitespace so "don't"/"don’t"/"do not" all match one pattern.
|
|
47
|
+
const normalized = text.toLowerCase().replace(/[‘’]/g, "'").replace(/\s+/g, ' ');
|
|
48
|
+
return DELEGATION_PROHIBITION_PATTERNS.some((pattern) => pattern.test(normalized));
|
|
49
|
+
}
|
|
11
50
|
export function buildWrfcWorkflowRoutingPrompt(text) {
|
|
12
51
|
if (!isWrfcWorkflowRequest(text))
|
|
13
52
|
return null;
|
|
14
|
-
|
|
53
|
+
// The user's explicit intent for THIS turn wins over routing: if they forbade delegation, inject
|
|
54
|
+
// nothing at all rather than nudging them toward a chain they told us not to start.
|
|
55
|
+
if (userProhibitsDelegation(text))
|
|
56
|
+
return null;
|
|
57
|
+
// Advisory, not imperative: suggest the pipeline and, if chosen, how to enter it, while asserting
|
|
58
|
+
// that the user's explicit instructions always win. mode=spawn/template/reviewMode are retained
|
|
59
|
+
// as the how-to for when the model does choose the pipeline.
|
|
60
|
+
return '[WRFC routing] This looks like work the WRFC pipeline handles well. If you choose to use it, '
|
|
61
|
+
+ 'start exactly one WRFC owner chain via the agent tool (mode=spawn, template=engineer, reviewMode=wrfc) '
|
|
62
|
+
+ 'rather than spawning reviewer/tester/verifier roots directly. This is a suggestion, not a command — '
|
|
63
|
+
+ "the user's explicit instructions always win; if they asked you to do the work yourself or not to "
|
|
64
|
+
+ 'delegate, do that instead.';
|
|
15
65
|
}
|
|
16
66
|
function parseToolOutput(output) {
|
|
17
67
|
if (!output)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* boot.ts
|
|
3
|
+
*
|
|
4
|
+
* A thin public factory that wraps the daemon construction graph in ONE call.
|
|
5
|
+
*
|
|
6
|
+
* `DaemonServer` already self-composes its full runtime graph
|
|
7
|
+
* (ConfigManager → RuntimeEventBus → runtime store → createRuntimeServices →
|
|
8
|
+
* gateway/brokers/router) from a `DaemonConfig`, and installs the network
|
|
9
|
+
* transport + folds legacy session stores during `start()`. This factory just
|
|
10
|
+
* threads the caller's overrides in, enables the daemon with the given token,
|
|
11
|
+
* starts it, and hands back a stop handle — composition, not new behavior.
|
|
12
|
+
*
|
|
13
|
+
* It exists so embedders and tests do not have to hand-mirror cli.ts's graph to
|
|
14
|
+
* stand up a real daemon (isolated home, ephemeral port, auth round-trip).
|
|
15
|
+
*/
|
|
16
|
+
import type { ApprovalBroker } from '../control-plane/index.js';
|
|
17
|
+
import { DaemonServer } from './facade.js';
|
|
18
|
+
export interface BootDaemonOptions {
|
|
19
|
+
/** Injected home directory — the daemon stays entirely inside it. */
|
|
20
|
+
readonly homeDirectory: string;
|
|
21
|
+
/** Working directory (project root) the daemon operates against. */
|
|
22
|
+
readonly workingDir: string;
|
|
23
|
+
/** TCP port to bind. Default 0 → an OS-assigned ephemeral port. */
|
|
24
|
+
readonly port?: number | undefined;
|
|
25
|
+
/** Host/interface to bind. Default resolved from config (127.0.0.1). */
|
|
26
|
+
readonly host?: string | undefined;
|
|
27
|
+
/** Bearer token required by every route. Omit for session-based auth. */
|
|
28
|
+
readonly token?: string | undefined;
|
|
29
|
+
/** Daemon home dir (identity state). Defaults to the runtime resolution. */
|
|
30
|
+
readonly daemonHomeDir?: string | undefined;
|
|
31
|
+
/** Optional preconfigured ConfigManager; otherwise one is built from the dirs. */
|
|
32
|
+
readonly configManager?: import('../config/manager.js').ConfigManager | undefined;
|
|
33
|
+
/** Optional custom serve factory (tests inject Bun.serve stand-ins). */
|
|
34
|
+
readonly serveFactory?: typeof Bun.serve | undefined;
|
|
35
|
+
}
|
|
36
|
+
export interface BootedDaemon {
|
|
37
|
+
/** The running daemon server. */
|
|
38
|
+
readonly server: DaemonServer;
|
|
39
|
+
/**
|
|
40
|
+
* The daemon's shared approval broker (same instance the HTTP approvals routes
|
|
41
|
+
* resolve through). Lets a proof test seed a pending approval and then exercise
|
|
42
|
+
* approve/deny — including per-hunk selection — over the live wire.
|
|
43
|
+
*/
|
|
44
|
+
readonly approvals: ApprovalBroker;
|
|
45
|
+
/** The bound host. */
|
|
46
|
+
readonly host: string;
|
|
47
|
+
/** The bound TCP port (resolves an ephemeral 0 to the real port). */
|
|
48
|
+
readonly port: number;
|
|
49
|
+
/** Base URL for the daemon's HTTP surface. */
|
|
50
|
+
readonly url: string;
|
|
51
|
+
/** Stop the daemon and release the port. Idempotent. */
|
|
52
|
+
stop(): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Boot a fully-composed daemon in one call and return a stop handle.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* const daemon = await bootDaemon({ homeDirectory, workingDir, port: 0, token });
|
|
59
|
+
* // ... hit `${daemon.url}/api/...` with `Authorization: Bearer ${token}`
|
|
60
|
+
* await daemon.stop();
|
|
61
|
+
*/
|
|
62
|
+
export declare function bootDaemon(options: BootDaemonOptions): Promise<BootedDaemon>;
|
|
63
|
+
//# sourceMappingURL=boot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/boot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,iBAAiB;IAChC,qEAAqE;IACrE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,wEAAwE;IACxE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,4EAA4E;IAC5E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,kFAAkF;IAClF,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,sBAAsB,EAAE,aAAa,GAAG,SAAS,CAAC;IAClF,wEAAwE;IACxE,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC;CACtD;AAED,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAqClF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* boot.ts
|
|
3
|
+
*
|
|
4
|
+
* A thin public factory that wraps the daemon construction graph in ONE call.
|
|
5
|
+
*
|
|
6
|
+
* `DaemonServer` already self-composes its full runtime graph
|
|
7
|
+
* (ConfigManager → RuntimeEventBus → runtime store → createRuntimeServices →
|
|
8
|
+
* gateway/brokers/router) from a `DaemonConfig`, and installs the network
|
|
9
|
+
* transport + folds legacy session stores during `start()`. This factory just
|
|
10
|
+
* threads the caller's overrides in, enables the daemon with the given token,
|
|
11
|
+
* starts it, and hands back a stop handle — composition, not new behavior.
|
|
12
|
+
*
|
|
13
|
+
* It exists so embedders and tests do not have to hand-mirror cli.ts's graph to
|
|
14
|
+
* stand up a real daemon (isolated home, ephemeral port, auth round-trip).
|
|
15
|
+
*/
|
|
16
|
+
import { ConfigManager } from '../config/manager.js';
|
|
17
|
+
import { DaemonServer } from './facade.js';
|
|
18
|
+
/**
|
|
19
|
+
* Boot a fully-composed daemon in one call and return a stop handle.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* const daemon = await bootDaemon({ homeDirectory, workingDir, port: 0, token });
|
|
23
|
+
* // ... hit `${daemon.url}/api/...` with `Authorization: Bearer ${token}`
|
|
24
|
+
* await daemon.stop();
|
|
25
|
+
*/
|
|
26
|
+
export async function bootDaemon(options) {
|
|
27
|
+
// Build a ConfigManager rooted at the injected dirs when the caller did not
|
|
28
|
+
// supply one — this is what makes the graph self-compose from just the dirs.
|
|
29
|
+
const configManager = options.configManager ?? new ConfigManager({
|
|
30
|
+
workingDir: options.workingDir,
|
|
31
|
+
homeDir: options.homeDirectory,
|
|
32
|
+
surfaceRoot: 'goodvibes',
|
|
33
|
+
});
|
|
34
|
+
const server = new DaemonServer({
|
|
35
|
+
port: options.port ?? 0,
|
|
36
|
+
...(options.host !== undefined ? { host: options.host } : {}),
|
|
37
|
+
workingDir: options.workingDir,
|
|
38
|
+
homeDirectory: options.homeDirectory,
|
|
39
|
+
...(options.daemonHomeDir !== undefined ? { daemonHomeDir: options.daemonHomeDir } : {}),
|
|
40
|
+
configManager,
|
|
41
|
+
...(options.serveFactory !== undefined ? { serveFactory: options.serveFactory } : {}),
|
|
42
|
+
});
|
|
43
|
+
server.enable({ daemon: true }, options.token);
|
|
44
|
+
await server.start();
|
|
45
|
+
const host = server.boundHost;
|
|
46
|
+
const port = server.boundPort;
|
|
47
|
+
return {
|
|
48
|
+
server,
|
|
49
|
+
approvals: server.approvals,
|
|
50
|
+
host,
|
|
51
|
+
port,
|
|
52
|
+
url: `http://${host}:${port}`,
|
|
53
|
+
// Best-effort teardown, mirroring cli.ts's `Promise.allSettled` stance: a
|
|
54
|
+
// subsystem that refuses to stop (e.g. a feature-gated watcher) must not
|
|
55
|
+
// leave the caller unable to shut the daemon down.
|
|
56
|
+
stop: async () => {
|
|
57
|
+
await Promise.resolve(server.stop()).catch(() => { });
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { homedir } from 'node:os';
|
|
2
2
|
import { ConfigManager } from '../config/manager.js';
|
|
3
|
+
import { resolveDaemonEnabled } from '../config/index.js';
|
|
3
4
|
import { RuntimeEventBus } from '../runtime/events/index.js';
|
|
4
5
|
import { createRuntimeStore } from '../runtime/store/index.js';
|
|
5
6
|
import { createRuntimeServices } from '../runtime/services.js';
|
|
@@ -96,7 +97,7 @@ async function main() {
|
|
|
96
97
|
process.on('SIGINT', () => void shutdown());
|
|
97
98
|
process.on('SIGTERM', () => void shutdown());
|
|
98
99
|
logger.info('goodvibes daemon host started', {
|
|
99
|
-
daemon: config
|
|
100
|
+
daemon: resolveDaemonEnabled(config),
|
|
100
101
|
httpListener: config.get('danger.httpListener'),
|
|
101
102
|
workingDir,
|
|
102
103
|
daemonHomeDir,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-plane.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/control-plane.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAOhE,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,2BAA2B,CAAC;AAC1F,OAAO,KAAK,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAErE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"control-plane.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/control-plane.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,9 @@ import { isRuntimeEventDomain } from '../runtime/events/index.js';
|
|
|
3
3
|
import { extractForwardedClientIp } from '../runtime/network/index.js';
|
|
4
4
|
import { resolveGatewayPathTemplate } from './helpers.js';
|
|
5
5
|
import { summarizeError } from '../utils/error-display.js';
|
|
6
|
+
import { validateInvocationInput } from '../control-plane/invoke-input-validation.js';
|
|
7
|
+
import { isGatewayVerbError } from '../control-plane/routes/gateway-verb-error.js';
|
|
8
|
+
import { SDKErrorCodes } from '@pellux/goodvibes-errors';
|
|
6
9
|
import { buildMissingScopeBody, resolveAuthenticatedPrincipal, } from './http-policy.js';
|
|
7
10
|
export class DaemonControlPlaneHelper {
|
|
8
11
|
context;
|
|
@@ -97,6 +100,11 @@ export class DaemonControlPlaneHelper {
|
|
|
97
100
|
ok: false,
|
|
98
101
|
body: {
|
|
99
102
|
error: `Gateway method is cataloged but not invokable through method dispatch: ${descriptor.id}`,
|
|
103
|
+
// Machine-readable, following the SDKErrorCodes.SESSION_CLOSED precedent
|
|
104
|
+
// (session-broker.ts) — consumers match on `code`, never on the message
|
|
105
|
+
// string. See the `invokable` field's doc comment (method-catalog-shared.ts)
|
|
106
|
+
// for what this status does and does not mean.
|
|
107
|
+
code: SDKErrorCodes.NOT_INVOKABLE,
|
|
100
108
|
},
|
|
101
109
|
};
|
|
102
110
|
}
|
|
@@ -321,6 +329,14 @@ export class DaemonControlPlaneHelper {
|
|
|
321
329
|
const denied = this.validateGatewayInvocation(matchedDescriptor, input.context);
|
|
322
330
|
if (denied)
|
|
323
331
|
return denied;
|
|
332
|
+
// Same input gate for the method+path WS call path (no bypass of the HTTP
|
|
333
|
+
// methodId gate). Only POST/PATCH carry a validatable body here.
|
|
334
|
+
if (input.method === 'POST' || input.method === 'PATCH') {
|
|
335
|
+
const invalid = validateInvocationInput(matchedDescriptor, input.body);
|
|
336
|
+
if (invalid) {
|
|
337
|
+
return { status: 400, ok: false, body: { error: invalid.detail, code: invalid.code } };
|
|
338
|
+
}
|
|
339
|
+
}
|
|
324
340
|
}
|
|
325
341
|
const url = new URL(`http://${this.context.host}:${this.context.port}${input.path.startsWith('/') ? input.path : `/${input.path}`}`);
|
|
326
342
|
for (const [key, value] of Object.entries(input.query ?? {})) {
|
|
@@ -359,11 +375,33 @@ export class DaemonControlPlaneHelper {
|
|
|
359
375
|
async invokeGatewayMethodCall(input) {
|
|
360
376
|
const descriptor = this.context.gatewayMethods.get(input.methodId);
|
|
361
377
|
if (!descriptor) {
|
|
362
|
-
return {
|
|
378
|
+
return {
|
|
379
|
+
status: 404,
|
|
380
|
+
ok: false,
|
|
381
|
+
body: {
|
|
382
|
+
error: `Unknown gateway method: ${input.methodId}`,
|
|
383
|
+
// Machine-readable, mirroring the NOT_INVOKABLE convention just below
|
|
384
|
+
// (validateGatewayInvocation) — the uncataloged-id 404 gets its own code so
|
|
385
|
+
// no consumer has to string-match "Unknown gateway method".
|
|
386
|
+
code: SDKErrorCodes.METHOD_NOT_FOUND,
|
|
387
|
+
},
|
|
388
|
+
};
|
|
363
389
|
}
|
|
364
390
|
const denied = this.validateGatewayInvocation(descriptor, input.context);
|
|
365
391
|
if (denied)
|
|
366
392
|
return denied;
|
|
393
|
+
// Input validation gate: reject a wrong-typed / missing-required body against
|
|
394
|
+
// the verb's typed inputSchema before the handler runs (honest 400, not silent
|
|
395
|
+
// coercion). Only body-carrying invocations are checked — a handler method
|
|
396
|
+
// (no http binding) or a POST/PATCH verb receives its params in the body;
|
|
397
|
+
// GET/DELETE params arrive as query strings that cannot be soundly type-checked.
|
|
398
|
+
const carriesBody = !descriptor.http || descriptor.http.method === 'POST' || descriptor.http.method === 'PATCH';
|
|
399
|
+
if (carriesBody) {
|
|
400
|
+
const invalid = validateInvocationInput(descriptor, input.body);
|
|
401
|
+
if (invalid) {
|
|
402
|
+
return { status: 400, ok: false, body: { error: invalid.detail, code: invalid.code } };
|
|
403
|
+
}
|
|
404
|
+
}
|
|
367
405
|
if (this.context.gatewayMethods.hasHandler(input.methodId)) {
|
|
368
406
|
try {
|
|
369
407
|
const body = await this.context.gatewayMethods.invoke(input.methodId, {
|
|
@@ -381,6 +419,17 @@ export class DaemonControlPlaneHelper {
|
|
|
381
419
|
return { status: 200, ok: true, body };
|
|
382
420
|
}
|
|
383
421
|
catch (error) {
|
|
422
|
+
// A handler-registered verb (W3-S2: fleet.*, checkpoints.*,
|
|
423
|
+
// sessions.search) may throw a GatewayVerbError to report an honest
|
|
424
|
+
// caller-error status (400/404) instead of the blanket 500 below —
|
|
425
|
+
// see routes/gateway-verb-error.ts for why this seam is needed.
|
|
426
|
+
if (isGatewayVerbError(error)) {
|
|
427
|
+
return {
|
|
428
|
+
status: error.status,
|
|
429
|
+
ok: false,
|
|
430
|
+
body: { error: error.message, code: error.code },
|
|
431
|
+
};
|
|
432
|
+
}
|
|
384
433
|
return {
|
|
385
434
|
status: 500,
|
|
386
435
|
ok: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facade-composition.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/facade-composition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AA6BvD,OAAO,KAAK,EAAE,oBAAoB,EAA0B,MAAM,wCAAwC,CAAC;AAG3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,YAAY,CAAC;AAKpE,YAAY,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,sCAAsC,GACvC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,sCAAsC,EACvC,MAAM,mBAAmB,CAAC;AAiD3B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,oBAAoB,CA8HvG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,2BAA2B,
|
|
1
|
+
{"version":3,"file":"facade-composition.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/facade-composition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AA6BvD,OAAO,KAAK,EAAE,oBAAoB,EAA0B,MAAM,wCAAwC,CAAC;AAG3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,YAAY,CAAC;AAKpE,YAAY,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,sCAAsC,GACvC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,2BAA2B,EAC3B,yBAAyB,EACzB,sCAAsC,EACvC,MAAM,mBAAmB,CAAC;AAiD3B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,oBAAoB,CA8HvG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,GAAG,2BAA2B,CAwJ5F;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,sCAAsC,GAC9C,yBAAyB,CA4K3B;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE;IAC1D,QAAQ,CAAC,aAAa,EAAE,OAAO,2BAA2B,EAAE,mBAAmB,CAAC;IAChF,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,yBAAyB,EAAE,WAAW,GAAG,QAAQ,CAAC;IACzK,QAAQ,CAAC,4BAA4B,EAAE,CAAC,OAAO,EAAE,OAAO,yBAAyB,EAAE,sBAAsB,GAAG,SAAS,EAAE,KAAK,EAAE;QAC5H,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACxC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACzC,KAAK,IAAI,CAAC;CACZ,GAAG,IAAI,CAoBP"}
|
|
@@ -275,6 +275,12 @@ export function resolveDaemonFacadeRuntime(config) {
|
|
|
275
275
|
// Explicitly opt into disk persistence for the daemon. Default is false
|
|
276
276
|
// for tests and embedded hosts.
|
|
277
277
|
persist: true,
|
|
278
|
+
// Honor the runtime's injected home so an isolated-home daemon never reads
|
|
279
|
+
// or writes the real ~/.goodvibes/companion-chat.
|
|
280
|
+
sessionsDir: runtimeServices.shellPaths.resolveUserPath('companion-chat', 'sessions'),
|
|
281
|
+
// Live spine: companion sessions register INTO the shared broker at write
|
|
282
|
+
// time so /api/sessions reflects them same-process (no restart).
|
|
283
|
+
sessionBroker: runtimeServices.sessionBroker,
|
|
278
284
|
// Wire the full ToolRegistry so LLM-emitted tool calls are executed.
|
|
279
285
|
toolRegistry: runtimeServices.agentOrchestrator.getToolRegistry(),
|
|
280
286
|
permissionManager: new PermissionManager(undefined, createPermissionConfigReader(resolvedConfigManager), runtimeServices.policyRuntimeState, runtimeServices.hookDispatcher, runtimeServices.featureFlags),
|