@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,417 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-driven goal decomposition for the planner.
|
|
3
|
+
*
|
|
4
|
+
* This module is the model-decomposition counterpart to the deterministic
|
|
5
|
+
* heuristic path in `plan-proposal.ts`. Given a goal, it drives a bounded,
|
|
6
|
+
* READ-ONLY planning agent (through the injected `DecompositionRunner` seam —
|
|
7
|
+
* this module never imports the agent machinery, so it stays in `core` and is
|
|
8
|
+
* fully unit-testable with a stubbed runner), parses and STRICTLY validates
|
|
9
|
+
* the agent's structured output, and produces a `PlanProposal` tagged with
|
|
10
|
+
* honest provenance.
|
|
11
|
+
*
|
|
12
|
+
* Failure honesty is the whole point: a spawn error, a timeout/cancellation,
|
|
13
|
+
* or output that is still malformed after ONE repair attempt all fall back to
|
|
14
|
+
* the existing heuristic `singleItemProposal` path, tagged
|
|
15
|
+
* `decomposedBy: 'heuristic'` with a `fallbackReason`. The heuristic path is
|
|
16
|
+
* reused verbatim — `singleItemProposal`/`assemblePlanProposal` are never
|
|
17
|
+
* modified — so their existing byte-for-byte test expectations are preserved;
|
|
18
|
+
* provenance is layered on afterward.
|
|
19
|
+
*
|
|
20
|
+
* The module NEVER performs surgery on agent output to force it to validate:
|
|
21
|
+
* a proposal is accepted only when `assemblePlanProposal` reports ZERO issues
|
|
22
|
+
* (no dangling dependency, no dependency cycle, no unresolved phase). Anything
|
|
23
|
+
* short of that is one repair attempt and then an honest fallback — never a
|
|
24
|
+
* silent edit that drops or rewrites the agent's work items.
|
|
25
|
+
*/
|
|
26
|
+
import { AdaptivePlanner } from './adaptive-planner.js';
|
|
27
|
+
import { assemblePlanProposal, singleItemProposal, } from './plan-proposal.js';
|
|
28
|
+
/** Pull the first balanced JSON object out of arbitrary agent text (fenced or not). */
|
|
29
|
+
function extractJsonObject(text) {
|
|
30
|
+
const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/i);
|
|
31
|
+
const haystack = fenced?.[1] ?? text;
|
|
32
|
+
const start = haystack.indexOf('{');
|
|
33
|
+
if (start === -1)
|
|
34
|
+
return null;
|
|
35
|
+
let depth = 0;
|
|
36
|
+
let inString = false;
|
|
37
|
+
let escaped = false;
|
|
38
|
+
for (let i = start; i < haystack.length; i++) {
|
|
39
|
+
const ch = haystack[i];
|
|
40
|
+
if (inString) {
|
|
41
|
+
if (escaped) {
|
|
42
|
+
escaped = false;
|
|
43
|
+
}
|
|
44
|
+
else if (ch === '\\') {
|
|
45
|
+
escaped = true;
|
|
46
|
+
}
|
|
47
|
+
else if (ch === '"') {
|
|
48
|
+
inString = false;
|
|
49
|
+
}
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (ch === '"') {
|
|
53
|
+
inString = true;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (ch === '{')
|
|
57
|
+
depth++;
|
|
58
|
+
else if (ch === '}') {
|
|
59
|
+
depth--;
|
|
60
|
+
if (depth === 0)
|
|
61
|
+
return haystack.slice(start, i + 1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
function isNonEmptyString(value) {
|
|
67
|
+
return typeof value === 'string' && value.trim().length > 0;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Parse + strictly validate a planning agent's output text into a
|
|
71
|
+
* `RawDecomposition` the assembler can consume. Never throws; every problem is
|
|
72
|
+
* accumulated into `errors` so a single repair prompt can address them all at
|
|
73
|
+
* once. Structural rejects: unparseable JSON, empty/absent items array, empty
|
|
74
|
+
* item title/brief, non-finite ordinal, empty phase title.
|
|
75
|
+
*/
|
|
76
|
+
export function parseDecomposition(text) {
|
|
77
|
+
const errors = [];
|
|
78
|
+
const json = extractJsonObject(text ?? '');
|
|
79
|
+
if (!json) {
|
|
80
|
+
return { ok: false, errors: ['Output did not contain a JSON object.'] };
|
|
81
|
+
}
|
|
82
|
+
let parsed;
|
|
83
|
+
try {
|
|
84
|
+
parsed = JSON.parse(json);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
return { ok: false, errors: [`Output was not valid JSON: ${err.message}`] };
|
|
88
|
+
}
|
|
89
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
90
|
+
return { ok: false, errors: ['Top-level value must be a JSON object.'] };
|
|
91
|
+
}
|
|
92
|
+
const obj = parsed;
|
|
93
|
+
const rawItems = obj.items;
|
|
94
|
+
if (!Array.isArray(rawItems) || rawItems.length === 0) {
|
|
95
|
+
return { ok: false, errors: ['"items" must be a non-empty array.'] };
|
|
96
|
+
}
|
|
97
|
+
// Validate phases (optional).
|
|
98
|
+
const rawPhases = Array.isArray(obj.phases) ? obj.phases : [];
|
|
99
|
+
rawPhases.forEach((p, i) => {
|
|
100
|
+
if (typeof p !== 'object' || p === null || !isNonEmptyString(p.title)) {
|
|
101
|
+
errors.push(`phases[${i}] must have a non-empty "title".`);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
// Validate items.
|
|
105
|
+
const items = [];
|
|
106
|
+
rawItems.forEach((raw, i) => {
|
|
107
|
+
if (typeof raw !== 'object' || raw === null) {
|
|
108
|
+
errors.push(`items[${i}] must be an object.`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const item = raw;
|
|
112
|
+
if (!isNonEmptyString(item.title))
|
|
113
|
+
errors.push(`items[${i}].title must be a non-empty string.`);
|
|
114
|
+
if (!isNonEmptyString(item.brief))
|
|
115
|
+
errors.push(`items[${i}].brief must be a non-empty string.`);
|
|
116
|
+
if (typeof item.ordinal !== 'number' || !Number.isFinite(item.ordinal)) {
|
|
117
|
+
errors.push(`items[${i}].ordinal must be a finite number.`);
|
|
118
|
+
}
|
|
119
|
+
if (item.phase !== undefined && !isNonEmptyString(item.phase)) {
|
|
120
|
+
errors.push(`items[${i}].phase, when present, must be a non-empty string.`);
|
|
121
|
+
}
|
|
122
|
+
if (isNonEmptyString(item.title) && isNonEmptyString(item.brief) && typeof item.ordinal === 'number' && Number.isFinite(item.ordinal)) {
|
|
123
|
+
items.push({
|
|
124
|
+
title: item.title,
|
|
125
|
+
brief: item.brief,
|
|
126
|
+
ordinal: item.ordinal,
|
|
127
|
+
...(isNonEmptyString(item.phase) ? { phase: item.phase } : {}),
|
|
128
|
+
...(Array.isArray(item.dependsOn) ? { dependsOn: item.dependsOn.filter((d) => typeof d === 'string' || typeof d === 'number') } : {}),
|
|
129
|
+
...(isNonEmptyString(item.suggestedArchetype) ? { suggestedArchetype: item.suggestedArchetype } : {}),
|
|
130
|
+
...(Array.isArray(item.likelyFiles) ? { likelyFiles: item.likelyFiles.filter(isNonEmptyString) } : {}),
|
|
131
|
+
...(Array.isArray(item.verification) ? { verification: item.verification.filter(isNonEmptyString) } : {}),
|
|
132
|
+
...(typeof item.canRunConcurrently === 'boolean' ? { canRunConcurrently: item.canRunConcurrently } : {}),
|
|
133
|
+
...(typeof item.needsReview === 'boolean' ? { needsReview: item.needsReview } : {}),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
if (errors.length > 0) {
|
|
138
|
+
return { ok: false, errors };
|
|
139
|
+
}
|
|
140
|
+
const notes = [];
|
|
141
|
+
if (Array.isArray(obj.notes))
|
|
142
|
+
notes.push(...obj.notes.filter(isNonEmptyString));
|
|
143
|
+
if (Array.isArray(obj.risks))
|
|
144
|
+
notes.push(...obj.risks.filter(isNonEmptyString));
|
|
145
|
+
const output = {
|
|
146
|
+
items,
|
|
147
|
+
...(rawPhases.length > 0 ? { phases: rawPhases } : {}),
|
|
148
|
+
...(Array.isArray(obj.dependencies) ? { dependencies: obj.dependencies } : {}),
|
|
149
|
+
};
|
|
150
|
+
return { ok: true, raw: toRawDecomposition(output), ...(notes.length > 0 ? { notes } : {}), errors: [] };
|
|
151
|
+
}
|
|
152
|
+
const DEFAULT_PHASE_TITLE = 'Execute';
|
|
153
|
+
/**
|
|
154
|
+
* Map a validated `DecompositionAgentOutput` into the `RawDecomposition` shape
|
|
155
|
+
* `assemblePlanProposal` consumes. Items are ordered by `ordinal` (stable on
|
|
156
|
+
* ties). Every referenced phase is materialized so the assembler never has to
|
|
157
|
+
* synthesize an "Unphased" bucket — an unresolved phase from here would be a
|
|
158
|
+
* real bug, not agent sloppiness. Ordinal-based dependency references are
|
|
159
|
+
* resolved to titles so the assembler's title resolver handles them uniformly.
|
|
160
|
+
*/
|
|
161
|
+
export function toRawDecomposition(output) {
|
|
162
|
+
const ordered = [...output.items].sort((a, b) => a.ordinal - b.ordinal);
|
|
163
|
+
const ordinalToTitle = new Map();
|
|
164
|
+
for (const item of ordered) {
|
|
165
|
+
if (!ordinalToTitle.has(item.ordinal))
|
|
166
|
+
ordinalToTitle.set(item.ordinal, item.title);
|
|
167
|
+
}
|
|
168
|
+
const resolveRef = (ref) => {
|
|
169
|
+
if (typeof ref === 'number')
|
|
170
|
+
return ordinalToTitle.get(ref) ?? String(ref);
|
|
171
|
+
const asNum = Number(ref);
|
|
172
|
+
if (ref.trim() !== '' && Number.isFinite(asNum) && ordinalToTitle.has(asNum))
|
|
173
|
+
return ordinalToTitle.get(asNum);
|
|
174
|
+
return ref;
|
|
175
|
+
};
|
|
176
|
+
// Phase set: explicit phases first, then any item phase titles not covered,
|
|
177
|
+
// then the default shared phase if any item lacks one.
|
|
178
|
+
const phaseTitles = [];
|
|
179
|
+
const seenPhase = new Set();
|
|
180
|
+
const addPhase = (title) => {
|
|
181
|
+
const key = title.toLowerCase().trim();
|
|
182
|
+
if (!seenPhase.has(key)) {
|
|
183
|
+
seenPhase.add(key);
|
|
184
|
+
phaseTitles.push(title);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
const explicit = new Map();
|
|
188
|
+
for (const p of output.phases ?? []) {
|
|
189
|
+
explicit.set(p.title.toLowerCase().trim(), p);
|
|
190
|
+
addPhase(p.title);
|
|
191
|
+
}
|
|
192
|
+
let needsDefault = false;
|
|
193
|
+
for (const item of ordered) {
|
|
194
|
+
if (item.phase)
|
|
195
|
+
addPhase(item.phase);
|
|
196
|
+
else
|
|
197
|
+
needsDefault = true;
|
|
198
|
+
}
|
|
199
|
+
if (needsDefault)
|
|
200
|
+
addPhase(DEFAULT_PHASE_TITLE);
|
|
201
|
+
const phases = phaseTitles.map((title) => {
|
|
202
|
+
const meta = explicit.get(title.toLowerCase().trim());
|
|
203
|
+
return meta?.description ? { title, description: meta.description } : { title };
|
|
204
|
+
});
|
|
205
|
+
// Accumulate dependencies: inline dependsOn plus explicit edges.
|
|
206
|
+
const depsByTitle = new Map();
|
|
207
|
+
const addDep = (from, to) => {
|
|
208
|
+
const key = from.toLowerCase().trim();
|
|
209
|
+
if (!depsByTitle.has(key))
|
|
210
|
+
depsByTitle.set(key, new Set());
|
|
211
|
+
depsByTitle.get(key).add(to);
|
|
212
|
+
};
|
|
213
|
+
for (const item of ordered) {
|
|
214
|
+
for (const dep of item.dependsOn ?? [])
|
|
215
|
+
addDep(item.title, resolveRef(dep));
|
|
216
|
+
}
|
|
217
|
+
for (const edge of output.dependencies ?? [])
|
|
218
|
+
addDep(resolveRef(edge.from), resolveRef(edge.to));
|
|
219
|
+
const workItems = ordered.map((item) => {
|
|
220
|
+
const deps = depsByTitle.get(item.title.toLowerCase().trim());
|
|
221
|
+
return {
|
|
222
|
+
title: item.title,
|
|
223
|
+
brief: item.brief,
|
|
224
|
+
phase: item.phase ?? DEFAULT_PHASE_TITLE,
|
|
225
|
+
...(deps && deps.size > 0 ? { dependsOn: [...deps] } : {}),
|
|
226
|
+
...(item.suggestedArchetype ? { suggestedArchetype: item.suggestedArchetype } : {}),
|
|
227
|
+
...(item.likelyFiles ? { likelyFiles: item.likelyFiles } : {}),
|
|
228
|
+
...(item.verification ? { verification: item.verification } : {}),
|
|
229
|
+
...(item.canRunConcurrently !== undefined ? { canRunConcurrently: item.canRunConcurrently } : {}),
|
|
230
|
+
...(item.needsReview !== undefined ? { needsReview: item.needsReview } : {}),
|
|
231
|
+
};
|
|
232
|
+
});
|
|
233
|
+
return { phases, workItems };
|
|
234
|
+
}
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
// Planner agent prompt
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
/**
|
|
239
|
+
* Build the system prompt for the read-only planning agent. It is explicit
|
|
240
|
+
* about the exact JSON contract and about the read-only posture (the agent's
|
|
241
|
+
* tool set already excludes write/edit/exec; this reinforces intent).
|
|
242
|
+
*/
|
|
243
|
+
export function buildPlannerSystemPrompt() {
|
|
244
|
+
return [
|
|
245
|
+
'You are a READ-ONLY planning agent. You may read, search, and analyze the codebase',
|
|
246
|
+
'to understand it, but you MUST NOT modify anything and you have no write/edit/exec tools.',
|
|
247
|
+
'',
|
|
248
|
+
'Decompose the given goal into an ordered set of work items. Respond with a SINGLE JSON',
|
|
249
|
+
'object and NOTHING else (no prose, no markdown outside a single optional ```json fence).',
|
|
250
|
+
'',
|
|
251
|
+
'Schema:',
|
|
252
|
+
'{',
|
|
253
|
+
' "phases": [{ "title": string, "description"?: string }], // optional; shared phase template',
|
|
254
|
+
' "items": [{',
|
|
255
|
+
' "title": string, // required, non-empty, unique',
|
|
256
|
+
' "brief": string, // required, non-empty: what this item does',
|
|
257
|
+
' "ordinal": number, // required: execution order (0-based or 1-based, ascending)',
|
|
258
|
+
' "phase"?: string, // phase title this item belongs to',
|
|
259
|
+
' "dependsOn"?: (string|number)[], // item titles or ordinals this item depends on',
|
|
260
|
+
' "suggestedArchetype"?: "engineer"|"reviewer"|"tester"|"researcher"|"integrator",',
|
|
261
|
+
' "likelyFiles"?: string[],',
|
|
262
|
+
' "verification"?: string[],',
|
|
263
|
+
' "canRunConcurrently"?: boolean,',
|
|
264
|
+
' "needsReview"?: boolean',
|
|
265
|
+
' }],',
|
|
266
|
+
' "dependencies"?: [{ "from": string|number, "to": string|number }], // "from depends on to"',
|
|
267
|
+
' "notes"?: string[],',
|
|
268
|
+
' "risks"?: string[]',
|
|
269
|
+
'}',
|
|
270
|
+
'',
|
|
271
|
+
'Rules: dependencies must reference real items and must be acyclic. Every brief must be',
|
|
272
|
+
'non-empty. Keep the decomposition honest — if the goal is genuinely a single unit of work,',
|
|
273
|
+
'return exactly one item.',
|
|
274
|
+
].join('\n');
|
|
275
|
+
}
|
|
276
|
+
function buildUserPrompt(request, repairErrors) {
|
|
277
|
+
const lines = [`Goal: ${request.goal}`, `Working directory: ${request.workingDir}`];
|
|
278
|
+
if (request.constraints?.capacity !== undefined)
|
|
279
|
+
lines.push(`Concurrency capacity: ${request.constraints.capacity}`);
|
|
280
|
+
if (request.constraints?.budgetUsd !== undefined)
|
|
281
|
+
lines.push(`Budget (USD): ${request.constraints.budgetUsd}`);
|
|
282
|
+
if (request.userContext)
|
|
283
|
+
lines.push('', 'Additional context:', request.userContext);
|
|
284
|
+
if (repairErrors && repairErrors.length > 0) {
|
|
285
|
+
lines.push('', 'Your previous response was rejected for these reasons. Fix ALL of them and respond again', 'with a single corrected JSON object:', ...repairErrors.map((e) => ` - ${e}`));
|
|
286
|
+
}
|
|
287
|
+
return lines.join('\n');
|
|
288
|
+
}
|
|
289
|
+
// ---------------------------------------------------------------------------
|
|
290
|
+
// The service
|
|
291
|
+
// ---------------------------------------------------------------------------
|
|
292
|
+
/**
|
|
293
|
+
* Decompose a goal into a `PlanProposal`, honestly tagged with provenance.
|
|
294
|
+
*
|
|
295
|
+
* Control flow:
|
|
296
|
+
* 1. `config.mode === 'heuristic'` → the configured heuristic path (no agent).
|
|
297
|
+
* 2. The planner's decompose gate declines → honest single-item (no agent).
|
|
298
|
+
* 3. No runner available → heuristic fallback (reason: no runtime).
|
|
299
|
+
* 4. Agent path: run → parse → strict-validate → (assemble; issues===0 ?
|
|
300
|
+
* accept : ONE repair attempt) → accept-or-fallback. Spawn error,
|
|
301
|
+
* cancellation (kill / wall-timeout / token ceiling), or still-invalid
|
|
302
|
+
* output after repair all fall back to the heuristic path with a reason.
|
|
303
|
+
*/
|
|
304
|
+
export async function decomposeGoal(request, planner, inputs, config, runner, deps = {}) {
|
|
305
|
+
const gate = planner.shouldDecompose(inputs);
|
|
306
|
+
const heuristicResult = (outcome) => {
|
|
307
|
+
const base = singleItemProposal(request.goal);
|
|
308
|
+
const fallbackReason = outcome.kind === 'fallback' ? outcome.reason : undefined;
|
|
309
|
+
const usage = outcome.kind === 'fallback' ? outcome.usage : undefined;
|
|
310
|
+
const elapsedMs = outcome.kind === 'fallback' ? outcome.elapsedMs : undefined;
|
|
311
|
+
const proposal = {
|
|
312
|
+
...base,
|
|
313
|
+
decomposedBy: 'heuristic',
|
|
314
|
+
...(fallbackReason ? { fallbackReason } : {}),
|
|
315
|
+
...(usage ? { agentUsage: usage } : {}),
|
|
316
|
+
...(elapsedMs !== undefined ? { elapsedMs } : {}),
|
|
317
|
+
};
|
|
318
|
+
deps.onOutcome?.(outcome);
|
|
319
|
+
return { proposal, gate, issues: [], outcome };
|
|
320
|
+
};
|
|
321
|
+
if (config.mode === 'heuristic') {
|
|
322
|
+
return heuristicResult({ kind: 'heuristic-configured' });
|
|
323
|
+
}
|
|
324
|
+
if (!gate.decompose) {
|
|
325
|
+
return heuristicResult({ kind: 'gate-declined', reasonCode: gate.reasonCode });
|
|
326
|
+
}
|
|
327
|
+
if (!runner) {
|
|
328
|
+
return heuristicResult({ kind: 'fallback', reason: 'no planning agent runtime available' });
|
|
329
|
+
}
|
|
330
|
+
const systemPrompt = buildPlannerSystemPrompt();
|
|
331
|
+
let lastUsage;
|
|
332
|
+
let totalElapsedMs = 0;
|
|
333
|
+
const runOnce = async (attempt, repairErrors) => {
|
|
334
|
+
const result = await runner.run({
|
|
335
|
+
goal: request.goal,
|
|
336
|
+
workingDir: request.workingDir,
|
|
337
|
+
systemPrompt,
|
|
338
|
+
userPrompt: buildUserPrompt(request, repairErrors),
|
|
339
|
+
bounds: config.bounds,
|
|
340
|
+
attempt,
|
|
341
|
+
});
|
|
342
|
+
lastUsage = result.usage ?? lastUsage;
|
|
343
|
+
totalElapsedMs += result.elapsedMs;
|
|
344
|
+
return result;
|
|
345
|
+
};
|
|
346
|
+
// --- initial attempt ---
|
|
347
|
+
let run;
|
|
348
|
+
try {
|
|
349
|
+
run = await runOnce('initial');
|
|
350
|
+
}
|
|
351
|
+
catch (err) {
|
|
352
|
+
return heuristicResult({ kind: 'fallback', reason: `spawn error: ${err.message}`, usage: lastUsage, elapsedMs: totalElapsedMs });
|
|
353
|
+
}
|
|
354
|
+
if (run.status === 'cancelled') {
|
|
355
|
+
return heuristicResult({ kind: 'fallback', reason: `cancelled${run.detail ? ` (${run.detail})` : ''}`, usage: lastUsage, elapsedMs: totalElapsedMs });
|
|
356
|
+
}
|
|
357
|
+
if (run.status === 'failed') {
|
|
358
|
+
return heuristicResult({ kind: 'fallback', reason: `agent error: ${run.detail ?? 'unknown'}`, usage: lastUsage, elapsedMs: totalElapsedMs });
|
|
359
|
+
}
|
|
360
|
+
const accept = (proposal, issues, repaired) => {
|
|
361
|
+
const costUsd = lastUsage ? deps.estimateCostUsd?.(lastUsage) : undefined;
|
|
362
|
+
const decorated = {
|
|
363
|
+
...proposal,
|
|
364
|
+
decomposedBy: 'agent',
|
|
365
|
+
elapsedMs: totalElapsedMs,
|
|
366
|
+
...(lastUsage ? { agentUsage: lastUsage } : {}),
|
|
367
|
+
...(costUsd !== undefined ? { agentCostUsd: costUsd } : {}),
|
|
368
|
+
};
|
|
369
|
+
const outcome = {
|
|
370
|
+
kind: 'agent',
|
|
371
|
+
itemCount: decorated.workItems.length,
|
|
372
|
+
repaired,
|
|
373
|
+
...(lastUsage ? { usage: lastUsage } : {}),
|
|
374
|
+
...(costUsd !== undefined ? { costUsd } : {}),
|
|
375
|
+
elapsedMs: totalElapsedMs,
|
|
376
|
+
};
|
|
377
|
+
deps.onOutcome?.(outcome);
|
|
378
|
+
return { proposal: decorated, gate, issues, outcome };
|
|
379
|
+
};
|
|
380
|
+
// --- validate the initial output ---
|
|
381
|
+
const first = parseDecomposition(run.output);
|
|
382
|
+
if (first.ok && first.raw) {
|
|
383
|
+
const { proposal, issues } = assemblePlanProposal(request.goal, gate.strategy, first.raw);
|
|
384
|
+
if (issues.length === 0)
|
|
385
|
+
return accept(proposal, issues, false);
|
|
386
|
+
// Not clean — fall through to a single repair with the assembler's issues.
|
|
387
|
+
const repairErrors = issues.map((i) => i.message);
|
|
388
|
+
const repaired = await tryRepair(repairErrors);
|
|
389
|
+
if (repaired)
|
|
390
|
+
return repaired;
|
|
391
|
+
return heuristicResult({ kind: 'fallback', reason: `invalid agent decomposition after repair: ${issues.map((i) => i.kind).join(', ')}`, usage: lastUsage, elapsedMs: totalElapsedMs });
|
|
392
|
+
}
|
|
393
|
+
// Malformed structure — one repair attempt with the parser's errors.
|
|
394
|
+
const repaired = await tryRepair(first.errors);
|
|
395
|
+
if (repaired)
|
|
396
|
+
return repaired;
|
|
397
|
+
return heuristicResult({ kind: 'fallback', reason: `malformed agent output after repair: ${first.errors.slice(0, 3).join('; ')}`, usage: lastUsage, elapsedMs: totalElapsedMs });
|
|
398
|
+
// --- one repair attempt: returns an accepted result, or null to fall back ---
|
|
399
|
+
async function tryRepair(repairErrors) {
|
|
400
|
+
let repairRun;
|
|
401
|
+
try {
|
|
402
|
+
repairRun = await runOnce('repair', repairErrors);
|
|
403
|
+
}
|
|
404
|
+
catch {
|
|
405
|
+
return null;
|
|
406
|
+
}
|
|
407
|
+
if (repairRun.status !== 'completed')
|
|
408
|
+
return null;
|
|
409
|
+
const parsed = parseDecomposition(repairRun.output);
|
|
410
|
+
if (!parsed.ok || !parsed.raw)
|
|
411
|
+
return null;
|
|
412
|
+
const { proposal, issues } = assemblePlanProposal(request.goal, gate.strategy, parsed.raw);
|
|
413
|
+
if (issues.length !== 0)
|
|
414
|
+
return null;
|
|
415
|
+
return accept(proposal, issues, true);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
@@ -50,6 +50,26 @@ export interface Phase {
|
|
|
50
50
|
}
|
|
51
51
|
/** Where a proposal's decomposition came from. */
|
|
52
52
|
export type PlanProposalSource = 'planner-agent' | 'single-item-fallback' | 'caller-supplied';
|
|
53
|
+
/**
|
|
54
|
+
* Honest provenance for how a proposal's work items were produced.
|
|
55
|
+
*
|
|
56
|
+
* - `'agent'` — a read-only planning agent decomposed the goal, and its
|
|
57
|
+
* output validated cleanly (possibly after one repair attempt).
|
|
58
|
+
* - `'heuristic'` — the deterministic single-item path produced the proposal,
|
|
59
|
+
* either because `planner.decomposition` is configured to `'heuristic'`, the
|
|
60
|
+
* planner's gate declined to decompose, or the agent path failed and fell
|
|
61
|
+
* back. `fallbackReason` is set only in the failure case, never when the
|
|
62
|
+
* heuristic path was chosen deliberately by config or gate.
|
|
63
|
+
*/
|
|
64
|
+
export type DecomposedBy = 'agent' | 'heuristic';
|
|
65
|
+
/** Token usage reported by a planning-decomposition agent run. */
|
|
66
|
+
export interface DecompositionAgentUsage {
|
|
67
|
+
readonly inputTokens: number;
|
|
68
|
+
readonly outputTokens: number;
|
|
69
|
+
readonly cacheReadTokens?: number | undefined;
|
|
70
|
+
readonly cacheWriteTokens?: number | undefined;
|
|
71
|
+
readonly totalTokens: number;
|
|
72
|
+
}
|
|
53
73
|
export interface PlanProposal {
|
|
54
74
|
id: string;
|
|
55
75
|
task: string;
|
|
@@ -59,6 +79,25 @@ export interface PlanProposal {
|
|
|
59
79
|
workItems: WorkItem[];
|
|
60
80
|
createdAt: number;
|
|
61
81
|
source: PlanProposalSource;
|
|
82
|
+
/**
|
|
83
|
+
* Provenance overlay set by the decomposition service (plan-decomposition.ts).
|
|
84
|
+
* Absent on proposals produced directly by `assemblePlanProposal` /
|
|
85
|
+
* `singleItemProposal`, which stay byte-compatible with pre-provenance tests.
|
|
86
|
+
*/
|
|
87
|
+
decomposedBy?: DecomposedBy | undefined;
|
|
88
|
+
/** Token usage of the planning agent (present when the agent path ran, even on fallback). */
|
|
89
|
+
agentUsage?: DecompositionAgentUsage | undefined;
|
|
90
|
+
/** Estimated dollar cost of the planning agent run, when a pricing lookup was available. */
|
|
91
|
+
agentCostUsd?: number | undefined;
|
|
92
|
+
/** Wall-clock time the planning agent ran, in ms (present when the agent path ran). */
|
|
93
|
+
elapsedMs?: number | undefined;
|
|
94
|
+
/**
|
|
95
|
+
* Why the agent path fell back to the heuristic path. Set ONLY on honest
|
|
96
|
+
* failure fallbacks (spawn error, timeout, cancellation, or output that was
|
|
97
|
+
* still malformed after one repair attempt) — never when `'heuristic'` was
|
|
98
|
+
* chosen by config or by the planner's decompose gate.
|
|
99
|
+
*/
|
|
100
|
+
fallbackReason?: string | undefined;
|
|
62
101
|
}
|
|
63
102
|
/** The loose JSON shape a planning agent (or a caller) emits, pre-validation. */
|
|
64
103
|
export interface RawDecompositionPhase {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-proposal.d.ts","sourceRoot":"","sources":["../../../src/platform/core/plan-proposal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAEV,oBAAoB,EAErB,MAAM,wCAAwC,CAAC;AAMhD,wFAAwF;AACxF,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,MAAM,CAAC;AAE1G;;;;;;;;GAQG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kBAAkB,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACpC,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACzC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,kDAAkD;AAClD,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,sBAAsB,GAAG,iBAAiB,CAAC;AAE9F,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"plan-proposal.d.ts","sourceRoot":"","sources":["../../../src/platform/core/plan-proposal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAEV,oBAAoB,EAErB,MAAM,wCAAwC,CAAC;AAMhD,wFAAwF;AACxF,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,MAAM,CAAC;AAE1G;;;;;;;;GAQG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kBAAkB,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACpC,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACzC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,kDAAkD;AAClD,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,sBAAsB,GAAG,iBAAiB,CAAC;AAE9F;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,WAAW,CAAC;AAEjD,kEAAkE;AAClE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;IAC3B;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACxC,6FAA6F;IAC7F,UAAU,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACjD,4FAA4F;IAC5F,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,iFAAiF;AACjF,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACpC,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACzC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,SAAS,EAAE,wBAAwB,EAAE,CAAC;CACvC;AAED,uFAAuF;AACvF,MAAM,MAAM,qBAAqB,GAAG,qBAAqB,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AAEpG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAkDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,iBAAiB,EAC3B,GAAG,EAAE,gBAAgB,EACrB,MAAM,GAAE,OAAO,CAAC,kBAAkB,EAAE,eAAe,GAAG,iBAAiB,CAAmB,GACzF;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAwGzD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAkB7D;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoCjG;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,YAAY,GACrB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAA;CAAE,CAalE"}
|
|
@@ -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"}
|