@pellux/goodvibes-sdk 0.38.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/contracts/artifacts/operator-contract.json +4468 -916
- package/dist/daemon.d.ts +2 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +4 -0
- package/dist/events/communication.d.ts +1 -1
- package/dist/events/surfaces.d.ts +25 -3
- package/dist/events/surfaces.d.ts.map +1 -1
- package/dist/events/surfaces.js +22 -1
- package/dist/events/workflows.d.ts +7 -6
- package/dist/events/workflows.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/platform/agents/archetypes.d.ts.map +1 -1
- package/dist/platform/agents/archetypes.js +7 -0
- package/dist/platform/agents/index.d.ts +1 -0
- package/dist/platform/agents/index.d.ts.map +1 -1
- package/dist/platform/agents/index.js +1 -0
- package/dist/platform/agents/orchestrator-runner.d.ts +16 -3
- package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator-runner.js +20 -6
- package/dist/platform/agents/orchestrator.d.ts +42 -10
- package/dist/platform/agents/orchestrator.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator.js +68 -20
- package/dist/platform/agents/planner-decomposition-runner.d.ts +38 -0
- package/dist/platform/agents/planner-decomposition-runner.d.ts.map +1 -0
- package/dist/platform/agents/planner-decomposition-runner.js +113 -0
- package/dist/platform/agents/turn-knowledge-injection.d.ts +88 -3
- package/dist/platform/agents/turn-knowledge-injection.d.ts.map +1 -1
- package/dist/platform/agents/turn-knowledge-injection.js +147 -30
- package/dist/platform/agents/worktree.d.ts +126 -8
- package/dist/platform/agents/worktree.d.ts.map +1 -1
- package/dist/platform/agents/worktree.js +240 -19
- package/dist/platform/agents/wrfc-controller.d.ts +24 -1
- package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-controller.js +161 -35
- package/dist/platform/agents/wrfc-gate-runtime.d.ts +9 -0
- package/dist/platform/agents/wrfc-gate-runtime.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-gate-runtime.js +7 -3
- package/dist/platform/agents/wrfc-gates.d.ts +1 -1
- package/dist/platform/agents/wrfc-gates.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-gates.js +7 -1
- package/dist/platform/agents/wrfc-types.d.ts +23 -3
- package/dist/platform/agents/wrfc-types.d.ts.map +1 -1
- package/dist/platform/automation/types.d.ts +9 -1
- package/dist/platform/automation/types.d.ts.map +1 -1
- package/dist/platform/calendar/calendar-api-shared.d.ts +25 -0
- package/dist/platform/calendar/calendar-api-shared.d.ts.map +1 -0
- package/dist/platform/calendar/calendar-api-shared.js +100 -0
- package/dist/platform/calendar/calendar-connector.d.ts +79 -0
- package/dist/platform/calendar/calendar-connector.d.ts.map +1 -0
- package/dist/platform/calendar/calendar-connector.js +155 -0
- package/dist/platform/calendar/google-calendar-api.d.ts +25 -0
- package/dist/platform/calendar/google-calendar-api.d.ts.map +1 -0
- package/dist/platform/calendar/google-calendar-api.js +89 -0
- package/dist/platform/calendar/http-fetch-adapter.d.ts +25 -0
- package/dist/platform/calendar/http-fetch-adapter.d.ts.map +1 -0
- package/dist/platform/calendar/http-fetch-adapter.js +25 -0
- package/dist/platform/calendar/ics-parser.d.ts +35 -0
- package/dist/platform/calendar/ics-parser.d.ts.map +1 -0
- package/dist/platform/calendar/ics-parser.js +236 -0
- package/dist/platform/calendar/index.d.ts +41 -0
- package/dist/platform/calendar/index.d.ts.map +1 -0
- package/dist/platform/calendar/index.js +49 -0
- package/dist/platform/calendar/merged-calendar-model.d.ts +67 -0
- package/dist/platform/calendar/merged-calendar-model.d.ts.map +1 -0
- package/dist/platform/calendar/merged-calendar-model.js +181 -0
- package/dist/platform/calendar/microsoft-graph-api.d.ts +25 -0
- package/dist/platform/calendar/microsoft-graph-api.d.ts.map +1 -0
- package/dist/platform/calendar/microsoft-graph-api.js +95 -0
- package/dist/platform/calendar/oauth-flow.d.ts +62 -0
- package/dist/platform/calendar/oauth-flow.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-flow.js +305 -0
- package/dist/platform/calendar/oauth-providers.d.ts +43 -0
- package/dist/platform/calendar/oauth-providers.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-providers.js +120 -0
- package/dist/platform/calendar/oauth-token-store.d.ts +72 -0
- package/dist/platform/calendar/oauth-token-store.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-token-store.js +189 -0
- package/dist/platform/calendar/oauth-types.d.ts +274 -0
- package/dist/platform/calendar/oauth-types.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-types.js +22 -0
- package/dist/platform/calendar/rrule.d.ts +39 -0
- package/dist/platform/calendar/rrule.d.ts.map +1 -0
- package/dist/platform/calendar/rrule.js +261 -0
- package/dist/platform/calendar/subscription-store.d.ts +118 -0
- package/dist/platform/calendar/subscription-store.d.ts.map +1 -0
- package/dist/platform/calendar/subscription-store.js +293 -0
- package/dist/platform/calendar/types.d.ts +170 -0
- package/dist/platform/calendar/types.d.ts.map +1 -0
- package/dist/platform/calendar/types.js +21 -0
- package/dist/platform/companion/companion-chat-attachments.d.ts +29 -0
- package/dist/platform/companion/companion-chat-attachments.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-attachments.js +121 -0
- package/dist/platform/companion/companion-chat-branching.d.ts +66 -0
- package/dist/platform/companion/companion-chat-branching.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-branching.js +142 -0
- package/dist/platform/companion/companion-chat-broker-bridge.d.ts +40 -0
- package/dist/platform/companion/companion-chat-broker-bridge.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-broker-bridge.js +14 -0
- package/dist/platform/companion/companion-chat-broker-sync.d.ts +38 -0
- package/dist/platform/companion/companion-chat-broker-sync.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-broker-sync.js +80 -0
- package/dist/platform/companion/companion-chat-gc.d.ts +63 -0
- package/dist/platform/companion/companion-chat-gc.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-gc.js +38 -0
- package/dist/platform/companion/companion-chat-manager.d.ts +91 -23
- package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-manager.js +195 -223
- package/dist/platform/companion/companion-chat-persistence.d.ts +9 -1
- package/dist/platform/companion/companion-chat-persistence.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-persistence.js +10 -2
- package/dist/platform/companion/companion-chat-routes.d.ts +2 -1
- package/dist/platform/companion/companion-chat-routes.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-routes.js +113 -4
- package/dist/platform/companion/companion-chat-turn-execution.d.ts +61 -0
- package/dist/platform/companion/companion-chat-turn-execution.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-turn-execution.js +107 -0
- package/dist/platform/companion/companion-chat-types.d.ts +67 -0
- package/dist/platform/companion/companion-chat-types.d.ts.map +1 -1
- package/dist/platform/config/credential-status.d.ts +28 -0
- package/dist/platform/config/credential-status.d.ts.map +1 -0
- package/dist/platform/config/credential-status.js +75 -0
- package/dist/platform/config/index.d.ts +25 -0
- package/dist/platform/config/index.d.ts.map +1 -1
- package/dist/platform/config/index.js +18 -0
- package/dist/platform/config/manager.d.ts +9 -0
- package/dist/platform/config/manager.d.ts.map +1 -1
- package/dist/platform/config/manager.js +21 -2
- package/dist/platform/config/migrations.d.ts +48 -0
- package/dist/platform/config/migrations.d.ts.map +1 -0
- package/dist/platform/config/migrations.js +54 -0
- package/dist/platform/config/schema-domain-core.d.ts +10 -1
- package/dist/platform/config/schema-domain-core.d.ts.map +1 -1
- package/dist/platform/config/schema-domain-core.js +46 -3
- package/dist/platform/config/schema-domain-runtime.d.ts +8 -0
- package/dist/platform/config/schema-domain-runtime.d.ts.map +1 -1
- package/dist/platform/config/schema-domain-runtime.js +32 -0
- package/dist/platform/config/schema-types.d.ts +21 -7
- package/dist/platform/config/schema-types.d.ts.map +1 -1
- package/dist/platform/config/schema.d.ts.map +1 -1
- package/dist/platform/config/schema.js +2 -0
- package/dist/platform/control-plane/approval-broker.d.ts +11 -0
- package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
- package/dist/platform/control-plane/approval-broker.js +17 -1
- package/dist/platform/control-plane/approval-hunk-apply.d.ts +77 -0
- package/dist/platform/control-plane/approval-hunk-apply.d.ts.map +1 -0
- package/dist/platform/control-plane/approval-hunk-apply.js +80 -0
- package/dist/platform/control-plane/gateway-disabled-response.d.ts +20 -0
- package/dist/platform/control-plane/gateway-disabled-response.d.ts.map +1 -0
- package/dist/platform/control-plane/gateway-disabled-response.js +24 -0
- package/dist/platform/control-plane/gateway-scope-enforcement.d.ts +68 -0
- package/dist/platform/control-plane/gateway-scope-enforcement.d.ts.map +1 -0
- package/dist/platform/control-plane/gateway-scope-enforcement.js +91 -0
- package/dist/platform/control-plane/gateway-utils.d.ts +17 -0
- package/dist/platform/control-plane/gateway-utils.d.ts.map +1 -1
- package/dist/platform/control-plane/gateway-utils.js +30 -0
- package/dist/platform/control-plane/gateway.d.ts +12 -2
- package/dist/platform/control-plane/gateway.d.ts.map +1 -1
- package/dist/platform/control-plane/gateway.js +27 -31
- package/dist/platform/control-plane/index.d.ts +8 -1
- package/dist/platform/control-plane/index.d.ts.map +1 -1
- package/dist/platform/control-plane/index.js +8 -0
- package/dist/platform/control-plane/invoke-input-validation.d.ts +56 -0
- package/dist/platform/control-plane/invoke-input-validation.d.ts.map +1 -0
- package/dist/platform/control-plane/invoke-input-validation.js +163 -0
- package/dist/platform/control-plane/method-catalog-admin.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-admin.js +12 -1
- package/dist/platform/control-plane/method-catalog-calendar.d.ts +16 -0
- package/dist/platform/control-plane/method-catalog-calendar.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-calendar.js +21 -0
- package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-channels.js +32 -3
- package/dist/platform/control-plane/method-catalog-control-automation.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-control-automation.js +19 -34
- package/dist/platform/control-plane/method-catalog-control-companion.d.ts +15 -0
- package/dist/platform/control-plane/method-catalog-control-companion.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-control-companion.js +176 -0
- package/dist/platform/control-plane/method-catalog-control-core.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-control-core.js +104 -122
- package/dist/platform/control-plane/method-catalog-control.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-control.js +4 -0
- package/dist/platform/control-plane/method-catalog-email.d.ts +17 -0
- package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-email.js +21 -0
- package/dist/platform/control-plane/method-catalog-events.d.ts +28 -0
- package/dist/platform/control-plane/method-catalog-events.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-events.js +74 -1
- package/dist/platform/control-plane/method-catalog-fleet.d.ts +24 -0
- package/dist/platform/control-plane/method-catalog-fleet.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-fleet.js +65 -0
- package/dist/platform/control-plane/method-catalog-push.d.ts +30 -0
- package/dist/platform/control-plane/method-catalog-push.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-push.js +80 -0
- package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts +84 -0
- package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-route-reconcile.js +103 -0
- package/dist/platform/control-plane/method-catalog-runtime.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-runtime.js +83 -1
- package/dist/platform/control-plane/method-catalog-shared.d.ts +29 -0
- package/dist/platform/control-plane/method-catalog-shared.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog.d.ts +9 -0
- package/dist/platform/control-plane/method-catalog.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog.js +34 -3
- package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts +8 -0
- package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-admin.js +22 -1
- package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts +18 -0
- package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts.map +1 -0
- package/dist/platform/control-plane/operator-contract-schemas-fleet.js +182 -0
- package/dist/platform/control-plane/operator-contract-schemas-permissions.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-permissions.js +5 -0
- package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts +37 -0
- package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-runtime.js +100 -3
- package/dist/platform/control-plane/operator-contract-schemas.d.ts +1 -0
- package/dist/platform/control-plane/operator-contract-schemas.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas.js +1 -0
- package/dist/platform/control-plane/operator-contract.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract.js +8 -0
- package/dist/platform/control-plane/routes/checkpoints.d.ts +39 -0
- package/dist/platform/control-plane/routes/checkpoints.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/checkpoints.js +166 -0
- package/dist/platform/control-plane/routes/fleet.d.ts +53 -0
- package/dist/platform/control-plane/routes/fleet.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/fleet.js +153 -0
- package/dist/platform/control-plane/routes/gateway-verb-error.d.ts +30 -0
- package/dist/platform/control-plane/routes/gateway-verb-error.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/gateway-verb-error.js +36 -0
- package/dist/platform/control-plane/routes/index.d.ts +0 -6
- package/dist/platform/control-plane/routes/index.d.ts.map +1 -1
- package/dist/platform/control-plane/routes/index.js +5 -5
- package/dist/platform/control-plane/routes/invocation-params.d.ts +23 -0
- package/dist/platform/control-plane/routes/invocation-params.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/invocation-params.js +9 -0
- package/dist/platform/control-plane/routes/push.d.ts +26 -0
- package/dist/platform/control-plane/routes/push.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/push.js +104 -0
- package/dist/platform/control-plane/routes/register-gateway-verb-groups.d.ts +31 -0
- package/dist/platform/control-plane/routes/register-gateway-verb-groups.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/register-gateway-verb-groups.js +16 -0
- package/dist/platform/control-plane/routes/register-w3-s2.d.ts +26 -0
- package/dist/platform/control-plane/routes/register-w3-s2.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/register-w3-s2.js +8 -0
- package/dist/platform/control-plane/routes/session-search.d.ts +37 -0
- package/dist/platform/control-plane/routes/session-search.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/session-search.js +113 -0
- package/dist/platform/control-plane/session-broker-gc.d.ts +16 -0
- package/dist/platform/control-plane/session-broker-gc.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-gc.js +23 -6
- package/dist/platform/control-plane/session-broker-helpers.d.ts +3 -3
- package/dist/platform/control-plane/session-broker-helpers.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-inputs.d.ts +18 -0
- package/dist/platform/control-plane/session-broker-inputs.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-inputs.js +34 -0
- package/dist/platform/control-plane/session-broker-sessions.d.ts +102 -3
- package/dist/platform/control-plane/session-broker-sessions.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-sessions.js +179 -5
- package/dist/platform/control-plane/session-broker-state.d.ts +20 -1
- package/dist/platform/control-plane/session-broker-state.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-state.js +67 -5
- package/dist/platform/control-plane/session-broker.d.ts +51 -38
- package/dist/platform/control-plane/session-broker.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker.js +183 -75
- package/dist/platform/control-plane/session-store-importer.d.ts +57 -0
- package/dist/platform/control-plane/session-store-importer.d.ts.map +1 -0
- package/dist/platform/control-plane/session-store-importer.js +227 -0
- package/dist/platform/control-plane/session-types.d.ts +142 -7
- package/dist/platform/control-plane/session-types.d.ts.map +1 -1
- package/dist/platform/core/execution-plan.d.ts +43 -1
- package/dist/platform/core/execution-plan.d.ts.map +1 -1
- package/dist/platform/core/execution-plan.js +46 -10
- package/dist/platform/core/index.d.ts +1 -0
- package/dist/platform/core/index.d.ts.map +1 -1
- package/dist/platform/core/index.js +1 -0
- package/dist/platform/core/orchestrator-runtime.d.ts +23 -3
- package/dist/platform/core/orchestrator-runtime.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-tool-runtime.d.ts +7 -0
- package/dist/platform/core/orchestrator-tool-runtime.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-tool-runtime.js +10 -0
- package/dist/platform/core/orchestrator-turn-loop.d.ts +13 -6
- package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-turn-loop.js +29 -22
- package/dist/platform/core/orchestrator.d.ts +16 -10
- package/dist/platform/core/orchestrator.d.ts.map +1 -1
- package/dist/platform/core/orchestrator.js +23 -8
- package/dist/platform/core/plan-decomposition.d.ts +196 -0
- package/dist/platform/core/plan-decomposition.d.ts.map +1 -0
- package/dist/platform/core/plan-decomposition.js +417 -0
- package/dist/platform/core/plan-proposal.d.ts +39 -0
- package/dist/platform/core/plan-proposal.d.ts.map +1 -1
- package/dist/platform/core/wrfc-routing.d.ts +1 -0
- package/dist/platform/core/wrfc-routing.d.ts.map +1 -1
- package/dist/platform/core/wrfc-routing.js +51 -1
- package/dist/platform/daemon/boot.d.ts +69 -0
- package/dist/platform/daemon/boot.d.ts.map +1 -0
- package/dist/platform/daemon/boot.js +61 -0
- package/dist/platform/daemon/cli.js +2 -1
- package/dist/platform/daemon/control-plane.d.ts.map +1 -1
- package/dist/platform/daemon/control-plane.js +50 -1
- package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
- package/dist/platform/daemon/facade-composition.js +6 -0
- package/dist/platform/daemon/facade.d.ts +15 -6
- package/dist/platform/daemon/facade.d.ts.map +1 -1
- package/dist/platform/daemon/facade.js +48 -43
- package/dist/platform/daemon/http/router-route-contexts.d.ts +1 -0
- package/dist/platform/daemon/http/router-route-contexts.d.ts.map +1 -1
- package/dist/platform/daemon/http/router-route-contexts.js +1 -0
- package/dist/platform/daemon/http/router-session-broker-adapter.d.ts +13 -0
- package/dist/platform/daemon/http/router-session-broker-adapter.d.ts.map +1 -0
- package/dist/platform/daemon/http/router-session-broker-adapter.js +27 -0
- package/dist/platform/daemon/http/router.d.ts +2 -1
- package/dist/platform/daemon/http/router.d.ts.map +1 -1
- package/dist/platform/daemon/http/router.js +42 -40
- package/dist/platform/daemon/http/runtime-route-types.d.ts +42 -4
- package/dist/platform/daemon/http/runtime-route-types.d.ts.map +1 -1
- package/dist/platform/daemon/http/webui-serving.d.ts +68 -0
- package/dist/platform/daemon/http/webui-serving.d.ts.map +1 -0
- package/dist/platform/daemon/http/webui-serving.js +230 -0
- package/dist/platform/daemon/index.d.ts +2 -0
- package/dist/platform/daemon/index.d.ts.map +1 -1
- package/dist/platform/daemon/index.js +1 -0
- package/dist/platform/daemon/service-manager.d.ts +16 -0
- package/dist/platform/daemon/service-manager.d.ts.map +1 -1
- package/dist/platform/daemon/service-manager.js +79 -15
- package/dist/platform/intelligence/tree-sitter/service.d.ts.map +1 -1
- package/dist/platform/intelligence/tree-sitter/service.js +16 -2
- package/dist/platform/knowledge/browser-history/readers.d.ts.map +1 -1
- package/dist/platform/knowledge/browser-history/readers.js +15 -5
- package/dist/platform/knowledge/knowledge-api.d.ts +1 -1
- package/dist/platform/knowledge/project-planning/service.d.ts +14 -1
- package/dist/platform/knowledge/project-planning/service.d.ts.map +1 -1
- package/dist/platform/knowledge/project-planning/service.js +77 -0
- package/dist/platform/knowledge/project-planning/types.d.ts +32 -0
- package/dist/platform/knowledge/project-planning/types.d.ts.map +1 -1
- package/dist/platform/orchestration/bookkeeping.d.ts +12 -0
- package/dist/platform/orchestration/bookkeeping.d.ts.map +1 -0
- package/dist/platform/orchestration/bookkeeping.js +91 -0
- package/dist/platform/orchestration/budget.d.ts +2 -2
- package/dist/platform/orchestration/cancellation.d.ts +2 -2
- package/dist/platform/orchestration/controller-compat.d.ts +16 -3
- package/dist/platform/orchestration/controller-compat.d.ts.map +1 -1
- package/dist/platform/orchestration/controller-compat.js +18 -4
- package/dist/platform/orchestration/dirty-guard.js +1 -1
- package/dist/platform/orchestration/engine.d.ts +26 -1
- package/dist/platform/orchestration/engine.d.ts.map +1 -1
- package/dist/platform/orchestration/engine.js +229 -25
- package/dist/platform/orchestration/index.d.ts +6 -4
- package/dist/platform/orchestration/index.d.ts.map +1 -1
- package/dist/platform/orchestration/index.js +3 -2
- package/dist/platform/orchestration/persistence.d.ts.map +1 -1
- package/dist/platform/orchestration/persistence.js +6 -3
- package/dist/platform/orchestration/phase-runner.d.ts +33 -6
- package/dist/platform/orchestration/phase-runner.d.ts.map +1 -1
- package/dist/platform/orchestration/phase-runner.js +98 -25
- package/dist/platform/orchestration/proposal-workstream.d.ts +56 -0
- package/dist/platform/orchestration/proposal-workstream.d.ts.map +1 -0
- package/dist/platform/orchestration/proposal-workstream.js +76 -0
- package/dist/platform/orchestration/scheduler.d.ts +20 -1
- package/dist/platform/orchestration/scheduler.d.ts.map +1 -1
- package/dist/platform/orchestration/scheduler.js +16 -0
- package/dist/platform/orchestration/types.d.ts +289 -4
- package/dist/platform/orchestration/types.d.ts.map +1 -1
- package/dist/platform/orchestration/types.js +32 -0
- package/dist/platform/orchestration/worktree-isolation.d.ts +33 -0
- package/dist/platform/orchestration/worktree-isolation.d.ts.map +1 -0
- package/dist/platform/orchestration/worktree-isolation.js +248 -0
- package/dist/platform/presentation/glyphs.d.ts +91 -0
- package/dist/platform/presentation/glyphs.d.ts.map +1 -0
- package/dist/platform/presentation/glyphs.js +93 -0
- package/dist/platform/presentation/index.d.ts +28 -0
- package/dist/platform/presentation/index.d.ts.map +1 -0
- package/dist/platform/presentation/index.js +27 -0
- package/dist/platform/presentation/thinking-phrases.d.ts +12 -0
- package/dist/platform/presentation/thinking-phrases.d.ts.map +1 -0
- package/dist/platform/presentation/thinking-phrases.js +32 -0
- package/dist/platform/presentation/tones.d.ts +121 -0
- package/dist/platform/presentation/tones.d.ts.map +1 -0
- package/dist/platform/presentation/tones.js +145 -0
- package/dist/platform/presentation/waiting-wording.d.ts +54 -0
- package/dist/platform/presentation/waiting-wording.d.ts.map +1 -0
- package/dist/platform/presentation/waiting-wording.js +51 -0
- package/dist/platform/providers/runtime-snapshot.d.ts.map +1 -1
- package/dist/platform/providers/runtime-snapshot.js +12 -2
- package/dist/platform/push/delivery.d.ts +48 -0
- package/dist/platform/push/delivery.d.ts.map +1 -0
- package/dist/platform/push/delivery.js +117 -0
- package/dist/platform/push/encryption.d.ts +41 -0
- package/dist/platform/push/encryption.d.ts.map +1 -0
- package/dist/platform/push/encryption.js +82 -0
- package/dist/platform/push/index.d.ts +17 -0
- package/dist/platform/push/index.d.ts.map +1 -0
- package/dist/platform/push/index.js +10 -0
- package/dist/platform/push/service.d.ts +75 -0
- package/dist/platform/push/service.d.ts.map +1 -0
- package/dist/platform/push/service.js +95 -0
- package/dist/platform/push/subscription-store.d.ts +50 -0
- package/dist/platform/push/subscription-store.d.ts.map +1 -0
- package/dist/platform/push/subscription-store.js +123 -0
- package/dist/platform/push/types.d.ts +68 -0
- package/dist/platform/push/types.d.ts.map +1 -0
- package/dist/platform/push/types.js +13 -0
- package/dist/platform/push/vapid.d.ts +54 -0
- package/dist/platform/push/vapid.d.ts.map +1 -0
- package/dist/platform/push/vapid.js +113 -0
- package/dist/platform/runtime/bootstrap-services.d.ts +62 -2
- package/dist/platform/runtime/bootstrap-services.d.ts.map +1 -1
- package/dist/platform/runtime/bootstrap-services.js +217 -50
- package/dist/platform/runtime/daemon-version-compat.d.ts +39 -0
- package/dist/platform/runtime/daemon-version-compat.d.ts.map +1 -0
- package/dist/platform/runtime/daemon-version-compat.js +75 -0
- package/dist/platform/runtime/detached-daemon-runtime.d.ts +26 -0
- package/dist/platform/runtime/detached-daemon-runtime.d.ts.map +1 -0
- package/dist/platform/runtime/detached-daemon-runtime.js +49 -0
- package/dist/platform/runtime/emitters/workflows.d.ts +1 -1
- package/dist/platform/runtime/emitters/workflows.d.ts.map +1 -1
- package/dist/platform/runtime/events/index.d.ts +13 -0
- package/dist/platform/runtime/events/index.d.ts.map +1 -1
- package/dist/platform/runtime/events/index.js +13 -0
- package/dist/platform/runtime/feature-flags/flags.d.ts.map +1 -1
- package/dist/platform/runtime/feature-flags/flags.js +39 -1
- package/dist/platform/runtime/fleet/adapters/agent.d.ts +2 -2
- package/dist/platform/runtime/fleet/adapters/agent.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/adapters/agent.js +4 -4
- package/dist/platform/runtime/fleet/adapters/automation.d.ts +1 -1
- package/dist/platform/runtime/fleet/adapters/automation.js +1 -1
- package/dist/platform/runtime/fleet/adapters/code-index.d.ts +1 -1
- package/dist/platform/runtime/fleet/adapters/code-index.js +1 -1
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts +40 -18
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/adapters/orchestration.js +138 -34
- package/dist/platform/runtime/fleet/adapters/schedule.d.ts +4 -4
- package/dist/platform/runtime/fleet/adapters/schedule.js +4 -4
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts +3 -4
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/adapters/trigger.js +3 -4
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts +13 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/adapters/wrfc.js +49 -2
- package/dist/platform/runtime/fleet/registry.d.ts +7 -7
- package/dist/platform/runtime/fleet/registry.d.ts.map +1 -1
- package/dist/platform/runtime/fleet/registry.js +41 -7
- package/dist/platform/runtime/fleet/types.d.ts +9 -9
- package/dist/platform/runtime/fleet/types.d.ts.map +1 -1
- package/dist/platform/runtime/memory-spine/client.d.ts +127 -0
- package/dist/platform/runtime/memory-spine/client.d.ts.map +1 -0
- package/dist/platform/runtime/memory-spine/client.js +113 -0
- package/dist/platform/runtime/memory-spine/index.d.ts +11 -0
- package/dist/platform/runtime/memory-spine/index.d.ts.map +1 -0
- package/dist/platform/runtime/memory-spine/index.js +10 -0
- package/dist/platform/runtime/operator-client.d.ts +20 -2
- package/dist/platform/runtime/operator-client.d.ts.map +1 -1
- package/dist/platform/runtime/operator-client.js +11 -1
- package/dist/platform/runtime/provider-accounts/registry.d.ts.map +1 -1
- package/dist/platform/runtime/provider-accounts/registry.js +11 -1
- package/dist/platform/runtime/services.d.ts +11 -9
- package/dist/platform/runtime/services.d.ts.map +1 -1
- package/dist/platform/runtime/services.js +24 -9
- package/dist/platform/runtime/session-spine/client.d.ts +234 -0
- package/dist/platform/runtime/session-spine/client.d.ts.map +1 -0
- package/dist/platform/runtime/session-spine/client.js +449 -0
- package/dist/platform/runtime/session-spine/index.d.ts +12 -0
- package/dist/platform/runtime/session-spine/index.d.ts.map +1 -0
- package/dist/platform/runtime/session-spine/index.js +11 -0
- package/dist/platform/runtime/session-spine/union-cache.d.ts +225 -0
- package/dist/platform/runtime/session-spine/union-cache.d.ts.map +1 -0
- package/dist/platform/runtime/session-spine/union-cache.js +333 -0
- package/dist/platform/runtime/shell-command-ops.d.ts +3 -1
- package/dist/platform/runtime/shell-command-ops.d.ts.map +1 -1
- package/dist/platform/runtime/transports/daemon-http-client-validators.d.ts.map +1 -1
- package/dist/platform/runtime/transports/daemon-http-client-validators.js +22 -0
- package/dist/platform/runtime/transports/daemon-http-client.d.ts.map +1 -1
- package/dist/platform/runtime/transports/daemon-http-client.js +25 -2
- package/dist/platform/runtime/transports/http-types.d.ts +9 -2
- package/dist/platform/runtime/transports/http-types.d.ts.map +1 -1
- package/dist/platform/state/canonical-memory.d.ts +95 -0
- package/dist/platform/state/canonical-memory.d.ts.map +1 -0
- package/dist/platform/state/canonical-memory.js +155 -0
- package/dist/platform/state/code-index-chunking.js +1 -1
- package/dist/platform/state/code-index-db.d.ts +1 -1
- package/dist/platform/state/code-index-reindex.d.ts +73 -0
- package/dist/platform/state/code-index-reindex.d.ts.map +1 -0
- package/dist/platform/state/code-index-reindex.js +156 -0
- package/dist/platform/state/code-index-store.d.ts.map +1 -1
- package/dist/platform/state/code-index-store.js +11 -3
- package/dist/platform/state/index.d.ts +8 -0
- package/dist/platform/state/index.d.ts.map +1 -1
- package/dist/platform/state/index.js +4 -0
- package/dist/platform/state/memory-recall-contract.d.ts +118 -0
- package/dist/platform/state/memory-recall-contract.d.ts.map +1 -0
- package/dist/platform/state/memory-recall-contract.js +170 -0
- package/dist/platform/state/memory-registry.d.ts +8 -0
- package/dist/platform/state/memory-registry.d.ts.map +1 -1
- package/dist/platform/state/memory-registry.js +10 -0
- package/dist/platform/state/memory-store.d.ts +2 -0
- package/dist/platform/state/memory-store.d.ts.map +1 -1
- package/dist/platform/state/memory-store.js +4 -0
- package/dist/platform/state/memory-vector-store.d.ts.map +1 -1
- package/dist/platform/state/memory-vector-store.js +14 -3
- package/dist/platform/state/sqlite-store.d.ts +2 -0
- package/dist/platform/state/sqlite-store.d.ts.map +1 -1
- package/dist/platform/state/sqlite-store.js +4 -0
- package/dist/platform/state/sqlite-vec-loader.d.ts +1 -1
- package/dist/platform/state/sqlite-vec-loader.js +1 -1
- package/dist/platform/state/vibe-projection.d.ts +67 -0
- package/dist/platform/state/vibe-projection.d.ts.map +1 -0
- package/dist/platform/state/vibe-projection.js +115 -0
- package/dist/platform/tools/agent/index.d.ts.map +1 -1
- package/dist/platform/tools/agent/index.js +8 -0
- package/dist/platform/tools/agent/manager.d.ts +22 -10
- package/dist/platform/tools/agent/manager.d.ts.map +1 -1
- package/dist/platform/tools/agent/manager.js +13 -7
- package/dist/platform/tools/agent/schema.d.ts +26 -0
- package/dist/platform/tools/agent/schema.d.ts.map +1 -1
- package/dist/platform/tools/agent/schema.js +2 -2
- package/dist/platform/tools/agent/wrfc-batch-policy.d.ts +13 -0
- package/dist/platform/tools/agent/wrfc-batch-policy.d.ts.map +1 -1
- package/dist/platform/tools/agent/wrfc-batch-policy.js +60 -0
- package/dist/platform/tools/exec/runtime.d.ts +10 -0
- package/dist/platform/tools/exec/runtime.d.ts.map +1 -1
- package/dist/platform/tools/exec/runtime.js +27 -10
- package/dist/platform/tools/exec/schema.d.ts +2 -2
- package/dist/platform/tools/exec/schema.d.ts.map +1 -1
- package/dist/platform/tools/exec/schema.js +2 -1
- package/dist/platform/tools/fetch/runtime.d.ts +1 -1
- package/dist/platform/tools/index.d.ts +2 -0
- package/dist/platform/tools/index.d.ts.map +1 -1
- package/dist/platform/tools/index.js +2 -0
- package/dist/platform/tools/registry.d.ts +1 -1
- package/dist/platform/tools/registry.js +1 -1
- package/dist/platform/tools/state/index.d.ts +9 -0
- package/dist/platform/tools/state/index.d.ts.map +1 -1
- package/dist/platform/tools/state/index.js +60 -3
- package/dist/platform/types/foundation-contract.d.ts +1 -1
- package/dist/platform/types/foundation-contract.d.ts.map +1 -1
- package/dist/platform/types/index.d.ts +1 -1
- package/dist/platform/types/index.d.ts.map +1 -1
- package/dist/platform/types/tools.d.ts +1 -1
- package/dist/platform/utils/request-body.d.ts.map +1 -1
- package/dist/platform/utils/request-body.js +50 -5
- package/dist/platform/version.js +1 -1
- package/package.json +25 -9
- package/dist/platform/control-plane/routes/automation.d.ts +0 -3
- package/dist/platform/control-plane/routes/automation.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/automation.js +0 -63
- package/dist/platform/control-plane/routes/context.d.ts +0 -2
- package/dist/platform/control-plane/routes/context.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/context.js +0 -1
- package/dist/platform/control-plane/routes/operator.d.ts +0 -8
- package/dist/platform/control-plane/routes/operator.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/operator.js +0 -415
- package/dist/platform/control-plane/routes/remote.d.ts +0 -3
- package/dist/platform/control-plane/routes/remote.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/remote.js +0 -35
- package/dist/platform/control-plane/routes/sessions.d.ts +0 -3
- package/dist/platform/control-plane/routes/sessions.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/sessions.js +0 -43
- package/dist/platform/control-plane/routes/tasks.d.ts +0 -3
- package/dist/platform/control-plane/routes/tasks.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/tasks.js +0 -22
|
@@ -0,0 +1,196 @@
|
|
|
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 type { PlannerInputs, DecompositionGate } from './adaptive-planner.js';
|
|
28
|
+
import { type PlanProposal, type PlanProposalIssue, type RawDecomposition, type DecompositionAgentUsage } from './plan-proposal.js';
|
|
29
|
+
/** A phase in the agent's decomposition. Optional across the contract — items
|
|
30
|
+
* may share an implicit single phase. */
|
|
31
|
+
export interface DecompositionAgentPhase {
|
|
32
|
+
title: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A single work item in the agent's decomposition.
|
|
37
|
+
*
|
|
38
|
+
* `ordinal` fixes a stable execution order independent of array position.
|
|
39
|
+
* `dependsOn` entries may be either other items' titles or their ordinals
|
|
40
|
+
* (as a number or numeric string) — both are resolved to titles before the
|
|
41
|
+
* proposal is assembled.
|
|
42
|
+
*/
|
|
43
|
+
export interface DecompositionAgentItem {
|
|
44
|
+
title: string;
|
|
45
|
+
brief: string;
|
|
46
|
+
ordinal: number;
|
|
47
|
+
phase?: string;
|
|
48
|
+
dependsOn?: Array<string | number>;
|
|
49
|
+
suggestedArchetype?: string;
|
|
50
|
+
likelyFiles?: string[];
|
|
51
|
+
verification?: string[];
|
|
52
|
+
canRunConcurrently?: boolean;
|
|
53
|
+
needsReview?: boolean;
|
|
54
|
+
}
|
|
55
|
+
/** The full JSON object a planning agent emits. */
|
|
56
|
+
export interface DecompositionAgentOutput {
|
|
57
|
+
phases?: DecompositionAgentPhase[];
|
|
58
|
+
items: DecompositionAgentItem[];
|
|
59
|
+
/** Extra explicit edges; `{from, to}` reads "from depends on to". */
|
|
60
|
+
dependencies?: Array<{
|
|
61
|
+
from: string | number;
|
|
62
|
+
to: string | number;
|
|
63
|
+
}>;
|
|
64
|
+
notes?: string[];
|
|
65
|
+
risks?: string[];
|
|
66
|
+
}
|
|
67
|
+
/** Hard bounds on a planning-agent run. */
|
|
68
|
+
export interface DecompositionBounds {
|
|
69
|
+
/** Maximum agent turns before the run is stopped. */
|
|
70
|
+
maxTurns: number;
|
|
71
|
+
/** Total token budget; exceeding it stops the run. */
|
|
72
|
+
tokenCeiling: number;
|
|
73
|
+
/** Wall-clock timeout in ms; exceeding it cancels the run. */
|
|
74
|
+
wallTimeoutMs: number;
|
|
75
|
+
}
|
|
76
|
+
export interface DecompositionRunnerRequest {
|
|
77
|
+
goal: string;
|
|
78
|
+
workingDir: string;
|
|
79
|
+
systemPrompt: string;
|
|
80
|
+
userPrompt: string;
|
|
81
|
+
bounds: DecompositionBounds;
|
|
82
|
+
/** Which attempt this is; `'repair'` prompts include prior validation errors. */
|
|
83
|
+
attempt: 'initial' | 'repair';
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Terminal status of a planning-agent run.
|
|
87
|
+
* - `completed` — the agent finished and produced final output text.
|
|
88
|
+
* - `cancelled` — the run was stopped: an external kill, the wall-clock
|
|
89
|
+
* timeout firing, or the token ceiling being crossed all collapse to this.
|
|
90
|
+
* - `failed` — the agent could not be spawned or errored mid-run.
|
|
91
|
+
*/
|
|
92
|
+
export type DecompositionRunStatus = 'completed' | 'cancelled' | 'failed';
|
|
93
|
+
export interface DecompositionRunResult {
|
|
94
|
+
status: DecompositionRunStatus;
|
|
95
|
+
/** The agent's final output text (empty when it never produced any). */
|
|
96
|
+
output: string;
|
|
97
|
+
usage?: DecompositionAgentUsage | undefined;
|
|
98
|
+
elapsedMs: number;
|
|
99
|
+
/** Error detail for `failed`, or a stop detail for `cancelled` (e.g. 'wall-timeout'). */
|
|
100
|
+
detail?: string | undefined;
|
|
101
|
+
agentId?: string | undefined;
|
|
102
|
+
}
|
|
103
|
+
export interface DecompositionRunner {
|
|
104
|
+
run(request: DecompositionRunnerRequest): Promise<DecompositionRunResult>;
|
|
105
|
+
}
|
|
106
|
+
export interface DecomposeGoalConstraints {
|
|
107
|
+
/** Concurrency capacity the plan should respect, if the caller set one. */
|
|
108
|
+
capacity?: number | undefined;
|
|
109
|
+
/** Dollar budget for the workstream, if the caller set one. */
|
|
110
|
+
budgetUsd?: number | undefined;
|
|
111
|
+
}
|
|
112
|
+
export interface DecomposeGoalRequest {
|
|
113
|
+
goal: string;
|
|
114
|
+
workingDir: string;
|
|
115
|
+
constraints?: DecomposeGoalConstraints | undefined;
|
|
116
|
+
/** Optional free-form user context handed to the planning agent. */
|
|
117
|
+
userContext?: string | undefined;
|
|
118
|
+
}
|
|
119
|
+
export interface DecompositionServiceConfig {
|
|
120
|
+
mode: 'agent' | 'heuristic';
|
|
121
|
+
bounds: DecompositionBounds;
|
|
122
|
+
}
|
|
123
|
+
/** An honest, machine-readable record of how a decomposition resolved. */
|
|
124
|
+
export type DecompositionOutcome = {
|
|
125
|
+
kind: 'agent';
|
|
126
|
+
itemCount: number;
|
|
127
|
+
repaired: boolean;
|
|
128
|
+
usage?: DecompositionAgentUsage | undefined;
|
|
129
|
+
costUsd?: number | undefined;
|
|
130
|
+
elapsedMs: number;
|
|
131
|
+
} | {
|
|
132
|
+
kind: 'heuristic-configured';
|
|
133
|
+
} | {
|
|
134
|
+
kind: 'gate-declined';
|
|
135
|
+
reasonCode: DecompositionGate['reasonCode'];
|
|
136
|
+
} | {
|
|
137
|
+
kind: 'fallback';
|
|
138
|
+
reason: string;
|
|
139
|
+
usage?: DecompositionAgentUsage | undefined;
|
|
140
|
+
elapsedMs?: number | undefined;
|
|
141
|
+
};
|
|
142
|
+
export interface DecomposeGoalDeps {
|
|
143
|
+
/** Optional token→dollars estimator; when absent, `agentCostUsd` stays undefined. */
|
|
144
|
+
estimateCostUsd?: ((usage: DecompositionAgentUsage) => number | undefined) | undefined;
|
|
145
|
+
/** Optional honest-event sink, invoked exactly once per decomposition. */
|
|
146
|
+
onOutcome?: ((outcome: DecompositionOutcome) => void) | undefined;
|
|
147
|
+
}
|
|
148
|
+
export interface DecomposeGoalResult {
|
|
149
|
+
proposal: PlanProposal;
|
|
150
|
+
gate: DecompositionGate;
|
|
151
|
+
issues: PlanProposalIssue[];
|
|
152
|
+
outcome: DecompositionOutcome;
|
|
153
|
+
}
|
|
154
|
+
export interface ParsedDecomposition {
|
|
155
|
+
ok: boolean;
|
|
156
|
+
raw?: RawDecomposition | undefined;
|
|
157
|
+
notes?: string[] | undefined;
|
|
158
|
+
errors: string[];
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Parse + strictly validate a planning agent's output text into a
|
|
162
|
+
* `RawDecomposition` the assembler can consume. Never throws; every problem is
|
|
163
|
+
* accumulated into `errors` so a single repair prompt can address them all at
|
|
164
|
+
* once. Structural rejects: unparseable JSON, empty/absent items array, empty
|
|
165
|
+
* item title/brief, non-finite ordinal, empty phase title.
|
|
166
|
+
*/
|
|
167
|
+
export declare function parseDecomposition(text: string): ParsedDecomposition;
|
|
168
|
+
/**
|
|
169
|
+
* Map a validated `DecompositionAgentOutput` into the `RawDecomposition` shape
|
|
170
|
+
* `assemblePlanProposal` consumes. Items are ordered by `ordinal` (stable on
|
|
171
|
+
* ties). Every referenced phase is materialized so the assembler never has to
|
|
172
|
+
* synthesize an "Unphased" bucket — an unresolved phase from here would be a
|
|
173
|
+
* real bug, not agent sloppiness. Ordinal-based dependency references are
|
|
174
|
+
* resolved to titles so the assembler's title resolver handles them uniformly.
|
|
175
|
+
*/
|
|
176
|
+
export declare function toRawDecomposition(output: DecompositionAgentOutput): RawDecomposition;
|
|
177
|
+
/**
|
|
178
|
+
* Build the system prompt for the read-only planning agent. It is explicit
|
|
179
|
+
* about the exact JSON contract and about the read-only posture (the agent's
|
|
180
|
+
* tool set already excludes write/edit/exec; this reinforces intent).
|
|
181
|
+
*/
|
|
182
|
+
export declare function buildPlannerSystemPrompt(): string;
|
|
183
|
+
/**
|
|
184
|
+
* Decompose a goal into a `PlanProposal`, honestly tagged with provenance.
|
|
185
|
+
*
|
|
186
|
+
* Control flow:
|
|
187
|
+
* 1. `config.mode === 'heuristic'` → the configured heuristic path (no agent).
|
|
188
|
+
* 2. The planner's decompose gate declines → honest single-item (no agent).
|
|
189
|
+
* 3. No runner available → heuristic fallback (reason: no runtime).
|
|
190
|
+
* 4. Agent path: run → parse → strict-validate → (assemble; issues===0 ?
|
|
191
|
+
* accept : ONE repair attempt) → accept-or-fallback. Spawn error,
|
|
192
|
+
* cancellation (kill / wall-timeout / token ceiling), or still-invalid
|
|
193
|
+
* output after repair all fall back to the heuristic path with a reason.
|
|
194
|
+
*/
|
|
195
|
+
export declare function decomposeGoal(request: DecomposeGoalRequest, planner: AdaptivePlanner, inputs: PlannerInputs, config: DecompositionServiceConfig, runner: DecompositionRunner | null, deps?: DecomposeGoalDeps): Promise<DecomposeGoalResult>;
|
|
196
|
+
//# sourceMappingURL=plan-decomposition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-decomposition.d.ts","sourceRoot":"","sources":["../../../src/platform/core/plan-decomposition.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 {
|