@pellux/goodvibes-sdk 0.37.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/contracts/artifacts/operator-contract.json +3171 -929
- package/dist/daemon.d.ts +2 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +4 -0
- package/dist/events/communication.d.ts +21 -1
- package/dist/events/communication.d.ts.map +1 -1
- package/dist/events/surfaces.d.ts +25 -3
- package/dist/events/surfaces.d.ts.map +1 -1
- package/dist/events/surfaces.js +22 -1
- package/dist/events/workflows.d.ts +7 -6
- package/dist/events/workflows.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/platform/agents/archetypes.d.ts.map +1 -1
- package/dist/platform/agents/archetypes.js +7 -0
- package/dist/platform/agents/index.d.ts +1 -0
- package/dist/platform/agents/index.d.ts.map +1 -1
- package/dist/platform/agents/index.js +1 -0
- package/dist/platform/agents/message-bus-core.d.ts +7 -0
- package/dist/platform/agents/message-bus-core.d.ts.map +1 -1
- package/dist/platform/agents/message-bus-core.js +2 -1
- package/dist/platform/agents/orchestrator-runner.d.ts +50 -1
- package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator-runner.js +172 -7
- package/dist/platform/agents/orchestrator.d.ts +78 -6
- package/dist/platform/agents/orchestrator.d.ts.map +1 -1
- package/dist/platform/agents/orchestrator.js +95 -18
- package/dist/platform/agents/planner-decomposition-runner.d.ts +38 -0
- package/dist/platform/agents/planner-decomposition-runner.d.ts.map +1 -0
- package/dist/platform/agents/planner-decomposition-runner.js +113 -0
- package/dist/platform/agents/turn-knowledge-injection.d.ts +192 -0
- package/dist/platform/agents/turn-knowledge-injection.d.ts.map +1 -0
- package/dist/platform/agents/turn-knowledge-injection.js +269 -0
- package/dist/platform/agents/worktree.d.ts +126 -8
- package/dist/platform/agents/worktree.d.ts.map +1 -1
- package/dist/platform/agents/worktree.js +240 -19
- package/dist/platform/agents/wrfc-controller.d.ts +46 -0
- package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-controller.js +213 -32
- package/dist/platform/agents/wrfc-gate-runtime.d.ts +9 -0
- package/dist/platform/agents/wrfc-gate-runtime.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-gate-runtime.js +7 -3
- package/dist/platform/agents/wrfc-gates.d.ts +1 -1
- package/dist/platform/agents/wrfc-gates.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-gates.js +7 -1
- package/dist/platform/agents/wrfc-types.d.ts +23 -3
- package/dist/platform/agents/wrfc-types.d.ts.map +1 -1
- package/dist/platform/automation/types.d.ts +9 -1
- package/dist/platform/automation/types.d.ts.map +1 -1
- package/dist/platform/calendar/calendar-api-shared.d.ts +25 -0
- package/dist/platform/calendar/calendar-api-shared.d.ts.map +1 -0
- package/dist/platform/calendar/calendar-api-shared.js +100 -0
- package/dist/platform/calendar/calendar-connector.d.ts +79 -0
- package/dist/platform/calendar/calendar-connector.d.ts.map +1 -0
- package/dist/platform/calendar/calendar-connector.js +155 -0
- package/dist/platform/calendar/google-calendar-api.d.ts +25 -0
- package/dist/platform/calendar/google-calendar-api.d.ts.map +1 -0
- package/dist/platform/calendar/google-calendar-api.js +89 -0
- package/dist/platform/calendar/http-fetch-adapter.d.ts +25 -0
- package/dist/platform/calendar/http-fetch-adapter.d.ts.map +1 -0
- package/dist/platform/calendar/http-fetch-adapter.js +25 -0
- package/dist/platform/calendar/ics-parser.d.ts +35 -0
- package/dist/platform/calendar/ics-parser.d.ts.map +1 -0
- package/dist/platform/calendar/ics-parser.js +236 -0
- package/dist/platform/calendar/index.d.ts +41 -0
- package/dist/platform/calendar/index.d.ts.map +1 -0
- package/dist/platform/calendar/index.js +49 -0
- package/dist/platform/calendar/merged-calendar-model.d.ts +67 -0
- package/dist/platform/calendar/merged-calendar-model.d.ts.map +1 -0
- package/dist/platform/calendar/merged-calendar-model.js +181 -0
- package/dist/platform/calendar/microsoft-graph-api.d.ts +25 -0
- package/dist/platform/calendar/microsoft-graph-api.d.ts.map +1 -0
- package/dist/platform/calendar/microsoft-graph-api.js +95 -0
- package/dist/platform/calendar/oauth-flow.d.ts +62 -0
- package/dist/platform/calendar/oauth-flow.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-flow.js +305 -0
- package/dist/platform/calendar/oauth-providers.d.ts +43 -0
- package/dist/platform/calendar/oauth-providers.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-providers.js +120 -0
- package/dist/platform/calendar/oauth-token-store.d.ts +72 -0
- package/dist/platform/calendar/oauth-token-store.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-token-store.js +189 -0
- package/dist/platform/calendar/oauth-types.d.ts +274 -0
- package/dist/platform/calendar/oauth-types.d.ts.map +1 -0
- package/dist/platform/calendar/oauth-types.js +22 -0
- package/dist/platform/calendar/rrule.d.ts +39 -0
- package/dist/platform/calendar/rrule.d.ts.map +1 -0
- package/dist/platform/calendar/rrule.js +261 -0
- package/dist/platform/calendar/subscription-store.d.ts +118 -0
- package/dist/platform/calendar/subscription-store.d.ts.map +1 -0
- package/dist/platform/calendar/subscription-store.js +293 -0
- package/dist/platform/calendar/types.d.ts +170 -0
- package/dist/platform/calendar/types.d.ts.map +1 -0
- package/dist/platform/calendar/types.js +21 -0
- package/dist/platform/companion/companion-chat-attachments.d.ts +29 -0
- package/dist/platform/companion/companion-chat-attachments.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-attachments.js +121 -0
- package/dist/platform/companion/companion-chat-broker-bridge.d.ts +40 -0
- package/dist/platform/companion/companion-chat-broker-bridge.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-broker-bridge.js +14 -0
- package/dist/platform/companion/companion-chat-broker-sync.d.ts +38 -0
- package/dist/platform/companion/companion-chat-broker-sync.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-broker-sync.js +80 -0
- package/dist/platform/companion/companion-chat-gc.d.ts +63 -0
- package/dist/platform/companion/companion-chat-gc.d.ts.map +1 -0
- package/dist/platform/companion/companion-chat-gc.js +38 -0
- package/dist/platform/companion/companion-chat-manager.d.ts +67 -20
- package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-manager.js +130 -144
- package/dist/platform/companion/companion-chat-persistence.d.ts +9 -1
- package/dist/platform/companion/companion-chat-persistence.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-persistence.js +10 -2
- package/dist/platform/companion/companion-chat-routes.d.ts +2 -1
- package/dist/platform/companion/companion-chat-routes.d.ts.map +1 -1
- package/dist/platform/companion/companion-chat-routes.js +37 -4
- package/dist/platform/config/credential-status.d.ts +28 -0
- package/dist/platform/config/credential-status.d.ts.map +1 -0
- package/dist/platform/config/credential-status.js +75 -0
- package/dist/platform/config/index.d.ts +25 -0
- package/dist/platform/config/index.d.ts.map +1 -1
- package/dist/platform/config/index.js +18 -0
- package/dist/platform/config/manager.d.ts +18 -0
- package/dist/platform/config/manager.d.ts.map +1 -1
- package/dist/platform/config/manager.js +36 -2
- package/dist/platform/config/migrations.d.ts +48 -0
- package/dist/platform/config/migrations.d.ts.map +1 -0
- package/dist/platform/config/migrations.js +54 -0
- package/dist/platform/config/schema-domain-core.d.ts +10 -1
- package/dist/platform/config/schema-domain-core.d.ts.map +1 -1
- package/dist/platform/config/schema-domain-core.js +46 -3
- package/dist/platform/config/schema-types.d.ts +13 -7
- package/dist/platform/config/schema-types.d.ts.map +1 -1
- package/dist/platform/config/schema.d.ts.map +1 -1
- package/dist/platform/config/schema.js +2 -0
- package/dist/platform/control-plane/approval-broker.d.ts +11 -0
- package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
- package/dist/platform/control-plane/approval-broker.js +17 -1
- package/dist/platform/control-plane/approval-hunk-apply.d.ts +77 -0
- package/dist/platform/control-plane/approval-hunk-apply.d.ts.map +1 -0
- package/dist/platform/control-plane/approval-hunk-apply.js +80 -0
- package/dist/platform/control-plane/gateway-disabled-response.d.ts +20 -0
- package/dist/platform/control-plane/gateway-disabled-response.d.ts.map +1 -0
- package/dist/platform/control-plane/gateway-disabled-response.js +24 -0
- package/dist/platform/control-plane/gateway-scope-enforcement.d.ts +68 -0
- package/dist/platform/control-plane/gateway-scope-enforcement.d.ts.map +1 -0
- package/dist/platform/control-plane/gateway-scope-enforcement.js +91 -0
- package/dist/platform/control-plane/gateway-utils.d.ts +17 -0
- package/dist/platform/control-plane/gateway-utils.d.ts.map +1 -1
- package/dist/platform/control-plane/gateway-utils.js +30 -0
- package/dist/platform/control-plane/gateway.d.ts +12 -2
- package/dist/platform/control-plane/gateway.d.ts.map +1 -1
- package/dist/platform/control-plane/gateway.js +27 -31
- package/dist/platform/control-plane/index.d.ts +6 -1
- package/dist/platform/control-plane/index.d.ts.map +1 -1
- package/dist/platform/control-plane/index.js +4 -0
- package/dist/platform/control-plane/invoke-input-validation.d.ts +56 -0
- package/dist/platform/control-plane/invoke-input-validation.d.ts.map +1 -0
- package/dist/platform/control-plane/invoke-input-validation.js +163 -0
- package/dist/platform/control-plane/method-catalog-admin.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-admin.js +12 -1
- package/dist/platform/control-plane/method-catalog-calendar.d.ts +16 -0
- package/dist/platform/control-plane/method-catalog-calendar.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-calendar.js +21 -0
- package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-channels.js +32 -3
- package/dist/platform/control-plane/method-catalog-control-automation.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-control-automation.js +19 -34
- package/dist/platform/control-plane/method-catalog-control-companion.d.ts +15 -0
- package/dist/platform/control-plane/method-catalog-control-companion.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-control-companion.js +133 -0
- package/dist/platform/control-plane/method-catalog-control-core.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-control-core.js +104 -122
- package/dist/platform/control-plane/method-catalog-control.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-control.js +4 -0
- package/dist/platform/control-plane/method-catalog-email.d.ts +17 -0
- package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-email.js +21 -0
- package/dist/platform/control-plane/method-catalog-events.d.ts +28 -0
- package/dist/platform/control-plane/method-catalog-events.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-events.js +74 -1
- package/dist/platform/control-plane/method-catalog-fleet.d.ts +24 -0
- package/dist/platform/control-plane/method-catalog-fleet.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-fleet.js +65 -0
- package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts +84 -0
- package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-route-reconcile.js +103 -0
- package/dist/platform/control-plane/method-catalog-shared.d.ts +29 -0
- package/dist/platform/control-plane/method-catalog-shared.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog.d.ts +9 -0
- package/dist/platform/control-plane/method-catalog.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog.js +32 -3
- package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts +8 -0
- package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-admin.js +22 -1
- package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts +18 -0
- package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts.map +1 -0
- package/dist/platform/control-plane/operator-contract-schemas-fleet.js +182 -0
- package/dist/platform/control-plane/operator-contract-schemas-permissions.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-permissions.js +5 -0
- package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts +29 -0
- package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas-runtime.js +57 -3
- package/dist/platform/control-plane/operator-contract-schemas.d.ts +1 -0
- package/dist/platform/control-plane/operator-contract-schemas.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract-schemas.js +1 -0
- package/dist/platform/control-plane/operator-contract.d.ts.map +1 -1
- package/dist/platform/control-plane/operator-contract.js +8 -0
- package/dist/platform/control-plane/routes/checkpoints.d.ts +39 -0
- package/dist/platform/control-plane/routes/checkpoints.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/checkpoints.js +166 -0
- package/dist/platform/control-plane/routes/fleet.d.ts +53 -0
- package/dist/platform/control-plane/routes/fleet.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/fleet.js +153 -0
- package/dist/platform/control-plane/routes/gateway-verb-error.d.ts +30 -0
- package/dist/platform/control-plane/routes/gateway-verb-error.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/gateway-verb-error.js +36 -0
- package/dist/platform/control-plane/routes/index.d.ts +0 -6
- package/dist/platform/control-plane/routes/index.d.ts.map +1 -1
- package/dist/platform/control-plane/routes/index.js +5 -5
- package/dist/platform/control-plane/routes/invocation-params.d.ts +23 -0
- package/dist/platform/control-plane/routes/invocation-params.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/invocation-params.js +9 -0
- package/dist/platform/control-plane/routes/register-w3-s2.d.ts +26 -0
- package/dist/platform/control-plane/routes/register-w3-s2.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/register-w3-s2.js +8 -0
- package/dist/platform/control-plane/routes/session-search.d.ts +37 -0
- package/dist/platform/control-plane/routes/session-search.d.ts.map +1 -0
- package/dist/platform/control-plane/routes/session-search.js +113 -0
- package/dist/platform/control-plane/session-broker-gc.d.ts +16 -0
- package/dist/platform/control-plane/session-broker-gc.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-gc.js +23 -6
- package/dist/platform/control-plane/session-broker-helpers.d.ts +3 -3
- package/dist/platform/control-plane/session-broker-helpers.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-inputs.d.ts +18 -0
- package/dist/platform/control-plane/session-broker-inputs.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-inputs.js +34 -0
- package/dist/platform/control-plane/session-broker-sessions.d.ts +102 -3
- package/dist/platform/control-plane/session-broker-sessions.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-sessions.js +179 -5
- package/dist/platform/control-plane/session-broker-state.d.ts +20 -1
- package/dist/platform/control-plane/session-broker-state.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker-state.js +67 -5
- package/dist/platform/control-plane/session-broker.d.ts +51 -38
- package/dist/platform/control-plane/session-broker.d.ts.map +1 -1
- package/dist/platform/control-plane/session-broker.js +183 -75
- package/dist/platform/control-plane/session-store-importer.d.ts +57 -0
- package/dist/platform/control-plane/session-store-importer.d.ts.map +1 -0
- package/dist/platform/control-plane/session-store-importer.js +227 -0
- package/dist/platform/control-plane/session-types.d.ts +142 -7
- package/dist/platform/control-plane/session-types.d.ts.map +1 -1
- package/dist/platform/core/adaptive-planner.d.ts +50 -0
- package/dist/platform/core/adaptive-planner.d.ts.map +1 -1
- package/dist/platform/core/adaptive-planner.js +49 -0
- package/dist/platform/core/execution-plan.d.ts +43 -1
- package/dist/platform/core/execution-plan.d.ts.map +1 -1
- package/dist/platform/core/execution-plan.js +46 -10
- package/dist/platform/core/index.d.ts +2 -0
- package/dist/platform/core/index.d.ts.map +1 -1
- package/dist/platform/core/index.js +2 -0
- package/dist/platform/core/orchestrator-runtime.d.ts +31 -0
- package/dist/platform/core/orchestrator-runtime.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-tool-runtime.d.ts +7 -0
- package/dist/platform/core/orchestrator-tool-runtime.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-tool-runtime.js +10 -0
- package/dist/platform/core/orchestrator-turn-loop.d.ts +35 -1
- package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
- package/dist/platform/core/orchestrator-turn-loop.js +121 -3
- package/dist/platform/core/orchestrator.d.ts +67 -0
- package/dist/platform/core/orchestrator.d.ts.map +1 -1
- package/dist/platform/core/orchestrator.js +89 -1
- package/dist/platform/core/plan-decomposition.d.ts +196 -0
- package/dist/platform/core/plan-decomposition.d.ts.map +1 -0
- package/dist/platform/core/plan-decomposition.js +417 -0
- package/dist/platform/core/plan-proposal.d.ts +204 -0
- package/dist/platform/core/plan-proposal.d.ts.map +1 -0
- package/dist/platform/core/plan-proposal.js +296 -0
- package/dist/platform/core/wrfc-routing.d.ts +1 -0
- package/dist/platform/core/wrfc-routing.d.ts.map +1 -1
- package/dist/platform/core/wrfc-routing.js +51 -1
- package/dist/platform/daemon/boot.d.ts +63 -0
- package/dist/platform/daemon/boot.d.ts.map +1 -0
- package/dist/platform/daemon/boot.js +60 -0
- package/dist/platform/daemon/cli.js +2 -1
- package/dist/platform/daemon/control-plane.d.ts.map +1 -1
- package/dist/platform/daemon/control-plane.js +50 -1
- package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
- package/dist/platform/daemon/facade-composition.js +6 -0
- package/dist/platform/daemon/facade.d.ts +18 -6
- package/dist/platform/daemon/facade.d.ts.map +1 -1
- package/dist/platform/daemon/facade.js +50 -43
- package/dist/platform/daemon/http/router-route-contexts.d.ts +1 -0
- package/dist/platform/daemon/http/router-route-contexts.d.ts.map +1 -1
- package/dist/platform/daemon/http/router-route-contexts.js +1 -0
- package/dist/platform/daemon/http/router-session-broker-adapter.d.ts +13 -0
- package/dist/platform/daemon/http/router-session-broker-adapter.d.ts.map +1 -0
- package/dist/platform/daemon/http/router-session-broker-adapter.js +27 -0
- package/dist/platform/daemon/http/router.d.ts +1 -1
- package/dist/platform/daemon/http/router.d.ts.map +1 -1
- package/dist/platform/daemon/http/router.js +7 -22
- package/dist/platform/daemon/http/runtime-route-types.d.ts +42 -4
- package/dist/platform/daemon/http/runtime-route-types.d.ts.map +1 -1
- package/dist/platform/daemon/index.d.ts +2 -0
- package/dist/platform/daemon/index.d.ts.map +1 -1
- package/dist/platform/daemon/index.js +1 -0
- package/dist/platform/daemon/service-manager.d.ts +16 -0
- package/dist/platform/daemon/service-manager.d.ts.map +1 -1
- package/dist/platform/daemon/service-manager.js +79 -15
- package/dist/platform/intelligence/tree-sitter/service.d.ts.map +1 -1
- package/dist/platform/intelligence/tree-sitter/service.js +16 -2
- package/dist/platform/knowledge/browser-history/readers.d.ts.map +1 -1
- package/dist/platform/knowledge/browser-history/readers.js +15 -5
- package/dist/platform/knowledge/knowledge-api.d.ts +26 -0
- package/dist/platform/knowledge/knowledge-api.d.ts.map +1 -1
- package/dist/platform/knowledge/knowledge-api.js +11 -0
- package/dist/platform/knowledge/project-planning/service.d.ts +14 -1
- package/dist/platform/knowledge/project-planning/service.d.ts.map +1 -1
- package/dist/platform/knowledge/project-planning/service.js +77 -0
- package/dist/platform/knowledge/project-planning/types.d.ts +32 -0
- package/dist/platform/knowledge/project-planning/types.d.ts.map +1 -1
- package/dist/platform/orchestration/bookkeeping.d.ts +12 -0
- package/dist/platform/orchestration/bookkeeping.d.ts.map +1 -0
- package/dist/platform/orchestration/bookkeeping.js +91 -0
- package/dist/platform/orchestration/budget.d.ts +22 -0
- package/dist/platform/orchestration/budget.d.ts.map +1 -0
- package/dist/platform/orchestration/budget.js +35 -0
- package/dist/platform/orchestration/cancellation.d.ts +31 -0
- package/dist/platform/orchestration/cancellation.d.ts.map +1 -0
- package/dist/platform/orchestration/cancellation.js +25 -0
- package/dist/platform/orchestration/controller-compat.d.ts +46 -0
- package/dist/platform/orchestration/controller-compat.d.ts.map +1 -0
- package/dist/platform/orchestration/controller-compat.js +27 -0
- package/dist/platform/orchestration/dirty-guard.d.ts +32 -0
- package/dist/platform/orchestration/dirty-guard.d.ts.map +1 -0
- package/dist/platform/orchestration/dirty-guard.js +147 -0
- package/dist/platform/orchestration/engine.d.ts +82 -0
- package/dist/platform/orchestration/engine.d.ts.map +1 -0
- package/dist/platform/orchestration/engine.js +623 -0
- package/dist/platform/orchestration/index.d.ts +20 -0
- package/dist/platform/orchestration/index.d.ts.map +1 -0
- package/dist/platform/orchestration/index.js +11 -0
- package/dist/platform/orchestration/persistence.d.ts +24 -0
- package/dist/platform/orchestration/persistence.d.ts.map +1 -0
- package/dist/platform/orchestration/persistence.js +179 -0
- package/dist/platform/orchestration/phase-runner.d.ts +114 -0
- package/dist/platform/orchestration/phase-runner.d.ts.map +1 -0
- package/dist/platform/orchestration/phase-runner.js +347 -0
- package/dist/platform/orchestration/proposal-workstream.d.ts +56 -0
- package/dist/platform/orchestration/proposal-workstream.d.ts.map +1 -0
- package/dist/platform/orchestration/proposal-workstream.js +76 -0
- package/dist/platform/orchestration/scheduler.d.ts +64 -0
- package/dist/platform/orchestration/scheduler.d.ts.map +1 -0
- package/dist/platform/orchestration/scheduler.js +73 -0
- package/dist/platform/orchestration/types.d.ts +535 -0
- package/dist/platform/orchestration/types.d.ts.map +1 -0
- package/dist/platform/orchestration/types.js +47 -0
- package/dist/platform/orchestration/worktree-isolation.d.ts +33 -0
- package/dist/platform/orchestration/worktree-isolation.d.ts.map +1 -0
- package/dist/platform/orchestration/worktree-isolation.js +248 -0
- package/dist/platform/presentation/glyphs.d.ts +91 -0
- package/dist/platform/presentation/glyphs.d.ts.map +1 -0
- package/dist/platform/presentation/glyphs.js +93 -0
- package/dist/platform/presentation/index.d.ts +28 -0
- package/dist/platform/presentation/index.d.ts.map +1 -0
- package/dist/platform/presentation/index.js +27 -0
- package/dist/platform/presentation/thinking-phrases.d.ts +12 -0
- package/dist/platform/presentation/thinking-phrases.d.ts.map +1 -0
- package/dist/platform/presentation/thinking-phrases.js +32 -0
- package/dist/platform/presentation/tones.d.ts +121 -0
- package/dist/platform/presentation/tones.d.ts.map +1 -0
- package/dist/platform/presentation/tones.js +145 -0
- package/dist/platform/presentation/waiting-wording.d.ts +54 -0
- package/dist/platform/presentation/waiting-wording.d.ts.map +1 -0
- package/dist/platform/presentation/waiting-wording.js +51 -0
- package/dist/platform/providers/runtime-snapshot.d.ts.map +1 -1
- package/dist/platform/providers/runtime-snapshot.js +12 -2
- package/dist/platform/runtime/bootstrap-services.d.ts +62 -2
- package/dist/platform/runtime/bootstrap-services.d.ts.map +1 -1
- package/dist/platform/runtime/bootstrap-services.js +217 -50
- package/dist/platform/runtime/daemon-version-compat.d.ts +39 -0
- package/dist/platform/runtime/daemon-version-compat.d.ts.map +1 -0
- package/dist/platform/runtime/daemon-version-compat.js +75 -0
- package/dist/platform/runtime/detached-daemon-runtime.d.ts +26 -0
- package/dist/platform/runtime/detached-daemon-runtime.d.ts.map +1 -0
- package/dist/platform/runtime/detached-daemon-runtime.js +49 -0
- package/dist/platform/runtime/emitters/communication.d.ts +11 -0
- package/dist/platform/runtime/emitters/communication.d.ts.map +1 -1
- package/dist/platform/runtime/emitters/communication.js +9 -0
- package/dist/platform/runtime/emitters/workflows.d.ts +1 -1
- package/dist/platform/runtime/emitters/workflows.d.ts.map +1 -1
- package/dist/platform/runtime/events/index.d.ts +13 -0
- package/dist/platform/runtime/events/index.d.ts.map +1 -1
- package/dist/platform/runtime/events/index.js +13 -0
- package/dist/platform/runtime/feature-flags/flags.d.ts.map +1 -1
- package/dist/platform/runtime/feature-flags/flags.js +56 -1
- package/dist/platform/runtime/fleet/adapters/agent.d.ts +56 -0
- package/dist/platform/runtime/fleet/adapters/agent.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/agent.js +143 -0
- package/dist/platform/runtime/fleet/adapters/automation.d.ts +30 -0
- package/dist/platform/runtime/fleet/adapters/automation.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/automation.js +41 -0
- package/dist/platform/runtime/fleet/adapters/background-process.d.ts +12 -0
- package/dist/platform/runtime/fleet/adapters/background-process.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/background-process.js +46 -0
- package/dist/platform/runtime/fleet/adapters/code-index.d.ts +21 -0
- package/dist/platform/runtime/fleet/adapters/code-index.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/code-index.js +44 -0
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts +69 -0
- package/dist/platform/runtime/fleet/adapters/orchestration.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/orchestration.js +329 -0
- package/dist/platform/runtime/fleet/adapters/schedule.d.ts +14 -0
- package/dist/platform/runtime/fleet/adapters/schedule.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/schedule.js +28 -0
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts +12 -0
- package/dist/platform/runtime/fleet/adapters/trigger.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/trigger.js +22 -0
- package/dist/platform/runtime/fleet/adapters/watcher.d.ts +13 -0
- package/dist/platform/runtime/fleet/adapters/watcher.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/watcher.js +47 -0
- package/dist/platform/runtime/fleet/adapters/workflow.d.ts +11 -0
- package/dist/platform/runtime/fleet/adapters/workflow.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/workflow.js +34 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts +35 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/adapters/wrfc.js +275 -0
- package/dist/platform/runtime/fleet/index.d.ts +10 -0
- package/dist/platform/runtime/fleet/index.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/index.js +6 -0
- package/dist/platform/runtime/fleet/registry.d.ts +113 -0
- package/dist/platform/runtime/fleet/registry.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/registry.js +664 -0
- package/dist/platform/runtime/fleet/types.d.ts +199 -0
- package/dist/platform/runtime/fleet/types.d.ts.map +1 -0
- package/dist/platform/runtime/fleet/types.js +2 -0
- package/dist/platform/runtime/operator-client.d.ts +20 -2
- package/dist/platform/runtime/operator-client.d.ts.map +1 -1
- package/dist/platform/runtime/operator-client.js +11 -1
- package/dist/platform/runtime/provider-accounts/registry.d.ts.map +1 -1
- package/dist/platform/runtime/provider-accounts/registry.js +11 -1
- package/dist/platform/runtime/runtime-knowledge-api.d.ts +1 -1
- package/dist/platform/runtime/runtime-knowledge-api.d.ts.map +1 -1
- package/dist/platform/runtime/runtime-knowledge-api.js +1 -0
- package/dist/platform/runtime/services.d.ts +48 -0
- package/dist/platform/runtime/services.d.ts.map +1 -1
- package/dist/platform/runtime/services.js +95 -2
- package/dist/platform/runtime/session-spine/client.d.ts +234 -0
- package/dist/platform/runtime/session-spine/client.d.ts.map +1 -0
- package/dist/platform/runtime/session-spine/client.js +449 -0
- package/dist/platform/runtime/session-spine/index.d.ts +12 -0
- package/dist/platform/runtime/session-spine/index.d.ts.map +1 -0
- package/dist/platform/runtime/session-spine/index.js +11 -0
- package/dist/platform/runtime/session-spine/union-cache.d.ts +225 -0
- package/dist/platform/runtime/session-spine/union-cache.d.ts.map +1 -0
- package/dist/platform/runtime/session-spine/union-cache.js +333 -0
- package/dist/platform/runtime/shell-command-ops.d.ts +3 -1
- package/dist/platform/runtime/shell-command-ops.d.ts.map +1 -1
- package/dist/platform/runtime/transports/daemon-http-client-validators.d.ts.map +1 -1
- package/dist/platform/runtime/transports/daemon-http-client-validators.js +22 -0
- package/dist/platform/runtime/transports/daemon-http-client.d.ts.map +1 -1
- package/dist/platform/runtime/transports/daemon-http-client.js +25 -2
- package/dist/platform/runtime/transports/http-types.d.ts +9 -2
- package/dist/platform/runtime/transports/http-types.d.ts.map +1 -1
- package/dist/platform/state/canonical-memory.d.ts +95 -0
- package/dist/platform/state/canonical-memory.d.ts.map +1 -0
- package/dist/platform/state/canonical-memory.js +155 -0
- package/dist/platform/state/code-index-chunking.d.ts +49 -0
- package/dist/platform/state/code-index-chunking.d.ts.map +1 -0
- package/dist/platform/state/code-index-chunking.js +111 -0
- package/dist/platform/state/code-index-db.d.ts +53 -0
- package/dist/platform/state/code-index-db.d.ts.map +1 -0
- package/dist/platform/state/code-index-db.js +101 -0
- package/dist/platform/state/code-index-reindex.d.ts +73 -0
- package/dist/platform/state/code-index-reindex.d.ts.map +1 -0
- package/dist/platform/state/code-index-reindex.js +156 -0
- package/dist/platform/state/code-index-store.d.ts +175 -0
- package/dist/platform/state/code-index-store.d.ts.map +1 -0
- package/dist/platform/state/code-index-store.js +620 -0
- package/dist/platform/state/index.d.ts +12 -2
- package/dist/platform/state/index.d.ts.map +1 -1
- package/dist/platform/state/index.js +6 -1
- package/dist/platform/state/knowledge-injection.d.ts +23 -0
- package/dist/platform/state/knowledge-injection.d.ts.map +1 -1
- package/dist/platform/state/knowledge-injection.js +34 -19
- package/dist/platform/state/memory-recall-contract.d.ts +63 -0
- package/dist/platform/state/memory-recall-contract.d.ts.map +1 -0
- package/dist/platform/state/memory-recall-contract.js +94 -0
- package/dist/platform/state/memory-store.d.ts +2 -0
- package/dist/platform/state/memory-store.d.ts.map +1 -1
- package/dist/platform/state/memory-store.js +4 -0
- package/dist/platform/state/memory-vector-store.d.ts +1 -13
- package/dist/platform/state/memory-vector-store.d.ts.map +1 -1
- package/dist/platform/state/memory-vector-store.js +18 -39
- package/dist/platform/state/sqlite-store.d.ts +2 -0
- package/dist/platform/state/sqlite-store.d.ts.map +1 -1
- package/dist/platform/state/sqlite-store.js +4 -0
- package/dist/platform/state/sqlite-vec-loader.d.ts +25 -0
- package/dist/platform/state/sqlite-vec-loader.d.ts.map +1 -0
- package/dist/platform/state/sqlite-vec-loader.js +43 -0
- package/dist/platform/state/vibe-projection.d.ts +67 -0
- package/dist/platform/state/vibe-projection.d.ts.map +1 -0
- package/dist/platform/state/vibe-projection.js +115 -0
- package/dist/platform/tools/agent/index.d.ts.map +1 -1
- package/dist/platform/tools/agent/index.js +8 -0
- package/dist/platform/tools/agent/manager.d.ts +140 -1
- package/dist/platform/tools/agent/manager.d.ts.map +1 -1
- package/dist/platform/tools/agent/manager.js +143 -1
- package/dist/platform/tools/agent/schema.d.ts +26 -0
- package/dist/platform/tools/agent/schema.d.ts.map +1 -1
- package/dist/platform/tools/agent/schema.js +2 -2
- package/dist/platform/tools/agent/wrfc-batch-policy.d.ts +13 -0
- package/dist/platform/tools/agent/wrfc-batch-policy.d.ts.map +1 -1
- package/dist/platform/tools/agent/wrfc-batch-policy.js +60 -0
- package/dist/platform/tools/exec/runtime.d.ts +10 -0
- package/dist/platform/tools/exec/runtime.d.ts.map +1 -1
- package/dist/platform/tools/exec/runtime.js +161 -49
- package/dist/platform/tools/exec/schema.d.ts +3 -1
- package/dist/platform/tools/exec/schema.d.ts.map +1 -1
- package/dist/platform/tools/exec/schema.js +2 -1
- package/dist/platform/tools/fetch/runtime.d.ts +7 -0
- package/dist/platform/tools/fetch/runtime.d.ts.map +1 -1
- package/dist/platform/tools/fetch/runtime.js +8 -6
- package/dist/platform/tools/index.d.ts +2 -0
- package/dist/platform/tools/index.d.ts.map +1 -1
- package/dist/platform/tools/index.js +2 -0
- package/dist/platform/tools/registry.d.ts +9 -3
- package/dist/platform/tools/registry.d.ts.map +1 -1
- package/dist/platform/tools/registry.js +9 -3
- package/dist/platform/tools/state/index.d.ts +9 -0
- package/dist/platform/tools/state/index.d.ts.map +1 -1
- package/dist/platform/tools/state/index.js +60 -3
- package/dist/platform/types/foundation-contract.d.ts +1 -1
- package/dist/platform/types/foundation-contract.d.ts.map +1 -1
- package/dist/platform/types/index.d.ts +1 -1
- package/dist/platform/types/index.d.ts.map +1 -1
- package/dist/platform/types/tools.d.ts +14 -1
- package/dist/platform/types/tools.d.ts.map +1 -1
- package/dist/platform/version.js +1 -1
- package/package.json +29 -9
- package/dist/platform/control-plane/routes/automation.d.ts +0 -3
- package/dist/platform/control-plane/routes/automation.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/automation.js +0 -63
- package/dist/platform/control-plane/routes/context.d.ts +0 -2
- package/dist/platform/control-plane/routes/context.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/context.js +0 -1
- package/dist/platform/control-plane/routes/operator.d.ts +0 -8
- package/dist/platform/control-plane/routes/operator.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/operator.js +0 -415
- package/dist/platform/control-plane/routes/remote.d.ts +0 -3
- package/dist/platform/control-plane/routes/remote.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/remote.js +0 -35
- package/dist/platform/control-plane/routes/sessions.d.ts +0 -3
- package/dist/platform/control-plane/routes/sessions.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/sessions.js +0 -43
- package/dist/platform/control-plane/routes/tasks.d.ts +0 -3
- package/dist/platform/control-plane/routes/tasks.d.ts.map +0 -1
- package/dist/platform/control-plane/routes/tasks.js +0 -22
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/** SDK-owned platform module. This implementation is maintained in goodvibes-sdk. */
|
|
2
|
+
import { AgentWorktree } from '../agents/worktree.js';
|
|
3
|
+
import { parseCompletionReport, } from '../agents/completion-report.js';
|
|
4
|
+
import { verifyEngineerClaims } from '../agents/wrfc-reporting.js';
|
|
5
|
+
import { runWrfcGateChecks } from '../agents/wrfc-gate-runtime.js';
|
|
6
|
+
import { getWrfcTransportRetryDelayMs, getWrfcTransportRetryLimit } from '../agents/wrfc-config.js';
|
|
7
|
+
import { isTransportFailureMessage } from '../types/errors.js';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
import { summarizeError } from '../utils/error-display.js';
|
|
10
|
+
import { excludeUntouchedLaunchResidue } from './dirty-guard.js';
|
|
11
|
+
import { classifyBookkeepingFailure } from './bookkeeping.js';
|
|
12
|
+
import { mergeWorkItemUsage } from './types.js';
|
|
13
|
+
function templateForPhase(phase) {
|
|
14
|
+
return phase.kind === 'review' || phase.kind === 'gate' ? 'general' : 'engineer';
|
|
15
|
+
}
|
|
16
|
+
function buildPhaseTask(item, phase, priorReports) {
|
|
17
|
+
const priorContext = priorReports.length > 0
|
|
18
|
+
? `\n\nPrior phase reports for this work item:\n${priorReports.map((r) => `- ${r.phaseId}: ${r.report.summary}`).join('\n')}`
|
|
19
|
+
: '';
|
|
20
|
+
if (phase.kind === 'review' || phase.kind === 'gate') {
|
|
21
|
+
return `Assess the following work item's changes against its constraints and report findings. Do not modify files.\n\nWork item: ${item.title}\n${item.task}${priorContext}`;
|
|
22
|
+
}
|
|
23
|
+
if (phase.kind === 'fix') {
|
|
24
|
+
return `Address the following findings for this work item.\n\nWork item: ${item.title}\n${item.task}${priorContext}`;
|
|
25
|
+
}
|
|
26
|
+
return `${item.task}${priorContext}`;
|
|
27
|
+
}
|
|
28
|
+
function genericReport(summary) {
|
|
29
|
+
return { version: 1, archetype: 'generic', summary, result: summary };
|
|
30
|
+
}
|
|
31
|
+
function sleep(ms) {
|
|
32
|
+
return new Promise((resolve) => {
|
|
33
|
+
const timer = setTimeout(resolve, ms);
|
|
34
|
+
timer.unref?.();
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function awaitAgentTermination(runtimeBus, agentManager, agentId) {
|
|
38
|
+
return new Promise((resolve) => {
|
|
39
|
+
const unsubscribe = runtimeBus.onDomain('agents', (envelope) => {
|
|
40
|
+
const event = envelope.payload;
|
|
41
|
+
if (event.agentId !== agentId)
|
|
42
|
+
return;
|
|
43
|
+
if (event.type !== 'AGENT_COMPLETED' && event.type !== 'AGENT_FAILED' && event.type !== 'AGENT_CANCELLED')
|
|
44
|
+
return;
|
|
45
|
+
unsubscribe();
|
|
46
|
+
const status = event.type === 'AGENT_COMPLETED' ? 'completed' : event.type === 'AGENT_CANCELLED' ? 'cancelled' : 'failed';
|
|
47
|
+
resolve({ status, record: agentManager.getStatus(agentId) });
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function usageFromRecord(record, priceUsage) {
|
|
52
|
+
const u = record?.usage;
|
|
53
|
+
const base = {
|
|
54
|
+
inputTokens: u?.inputTokens ?? 0,
|
|
55
|
+
outputTokens: u?.outputTokens ?? 0,
|
|
56
|
+
cacheReadTokens: u?.cacheReadTokens ?? 0,
|
|
57
|
+
cacheWriteTokens: u?.cacheWriteTokens ?? 0,
|
|
58
|
+
reasoningTokens: u?.reasoningTokens,
|
|
59
|
+
llmCallCount: u?.llmCallCount ?? 0,
|
|
60
|
+
turnCount: u?.turnCount ?? 0,
|
|
61
|
+
toolCallCount: record?.toolCallCount ?? 0,
|
|
62
|
+
};
|
|
63
|
+
let costUsd = null;
|
|
64
|
+
let costState = 'unpriced';
|
|
65
|
+
if (u && priceUsage) {
|
|
66
|
+
try {
|
|
67
|
+
const priced = priceUsage(record?.model, { ...base, costUsd: null, costState: 'unpriced' });
|
|
68
|
+
if (priced !== null) {
|
|
69
|
+
costUsd = priced;
|
|
70
|
+
costState = 'priced';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// stays unpriced — never fabricate a cost from a throwing pricer.
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { ...base, costUsd, costState };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Combines a new phase's usage into a work item's running total. Single-source
|
|
81
|
+
* cost (never independently re-priced here). Thin alias over the canonical
|
|
82
|
+
* {@link mergeWorkItemUsage} (types.ts) so the phase-runner, the engine, and
|
|
83
|
+
* the fleet rollup adapters all fold usage through exactly one implementation.
|
|
84
|
+
*/
|
|
85
|
+
export function mergeUsage(a, b) {
|
|
86
|
+
return mergeWorkItemUsage(a, b);
|
|
87
|
+
}
|
|
88
|
+
/** Quality gates (global-config-driven, reused VERBATIM) + phase-required-gate assertion + phantom guard + reviewer constraint findings. */
|
|
89
|
+
async function evaluateGate(workstream, phase, report, deps) {
|
|
90
|
+
const results = [...await runWrfcGateChecks({
|
|
91
|
+
configManager: deps.configManager,
|
|
92
|
+
projectRoot: deps.projectRoot,
|
|
93
|
+
runtimeBus: deps.runtimeBus,
|
|
94
|
+
sessionId: deps.sessionId,
|
|
95
|
+
chainId: workstream.id,
|
|
96
|
+
// Worktree mode (BIG-3 item 5): run the configured quality gates INSIDE the
|
|
97
|
+
// item's isolated worktree, the same way the phantom-work guard above
|
|
98
|
+
// verifies claims against that worktree path. BIG-1 fixed only the phantom
|
|
99
|
+
// check; without this, gates (typecheck/lint/test) would run against the
|
|
100
|
+
// shared projectRoot and never see the item's isolated changes. Absent
|
|
101
|
+
// (shared mode) ⇒ runWrfcGateChecks defaults cwd to projectRoot — unchanged.
|
|
102
|
+
...(deps.itemWorktree ? { cwd: deps.itemWorktree.path } : {}),
|
|
103
|
+
})];
|
|
104
|
+
const ranNames = new Set(results.map((r) => r.gate));
|
|
105
|
+
const missingRequired = phase.gate.gates.filter((name) => !ranNames.has(name));
|
|
106
|
+
for (const name of missingRequired) {
|
|
107
|
+
results.push({ gate: name, passed: false, output: 'required gate is not configured/enabled', durationMs: 0 });
|
|
108
|
+
}
|
|
109
|
+
if (report.archetype === 'engineer' && !deps.skipClaimVerification) {
|
|
110
|
+
// Worktree mode: the agent's files landed in the item's OWN worktree, not
|
|
111
|
+
// the shared projectRoot — verify claims (existence + `git diff`) against
|
|
112
|
+
// that worktree path, or every real change would be falsely flagged as
|
|
113
|
+
// phantom work (nothing to find at projectRoot).
|
|
114
|
+
const verification = verifyEngineerClaims(report, deps.itemWorktree?.path ?? deps.projectRoot);
|
|
115
|
+
if (verification.kind === 'unverified' || verification.kind === 'unverifiable_no_claims') {
|
|
116
|
+
results.push({ gate: 'phantom-work-guard', passed: false, output: verification.summary, durationMs: 0 });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
let constraintFindings;
|
|
120
|
+
let unsatisfiedConstraintIds;
|
|
121
|
+
if (report.archetype === 'reviewer') {
|
|
122
|
+
const reviewer = report;
|
|
123
|
+
constraintFindings = reviewer.constraintFindings ?? [];
|
|
124
|
+
const unsatisfied = constraintFindings.filter((f) => !f.satisfied);
|
|
125
|
+
unsatisfiedConstraintIds = unsatisfied.map((f) => f.constraintId);
|
|
126
|
+
if (!reviewer.passed || unsatisfied.length > 0) {
|
|
127
|
+
results.push({
|
|
128
|
+
gate: 'reviewer-verdict',
|
|
129
|
+
passed: false,
|
|
130
|
+
output: unsatisfied.length > 0
|
|
131
|
+
? `${unsatisfied.length} unsatisfied constraint(s): ${unsatisfied.map((f) => f.constraintId).join(', ')}`
|
|
132
|
+
: 'reviewer did not pass',
|
|
133
|
+
durationMs: 0,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
passed: results.every((r) => r.passed),
|
|
139
|
+
results,
|
|
140
|
+
constraintFindings,
|
|
141
|
+
unsatisfiedConstraintIds,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Runs the POST-gate scoped-commit + merge for a passed phase and reports its
|
|
146
|
+
* outcome HONESTLY rather than swallowing failures. The gate has already
|
|
147
|
+
* decided the phase passed; this step only records the changes, so its result
|
|
148
|
+
* is bookkeeping: a failure surfaces to the engine as a warning on a passed
|
|
149
|
+
* item (or, for the narrow negating set — workspace corruption, see
|
|
150
|
+
* bookkeeping.ts — as an item failure), never as a silent no-op that lets the
|
|
151
|
+
* fleet imply a commit happened when it did not (DEBT-4 item 1).
|
|
152
|
+
*/
|
|
153
|
+
async function commitPhaseWork(item, phase, agentId, worktree, deps) {
|
|
154
|
+
if (phase.gate.scope === 'off') {
|
|
155
|
+
return { commit: { status: 'skipped', reason: 'commit disabled for this phase (gate scope: off)' } };
|
|
156
|
+
}
|
|
157
|
+
let paths = phase.gate.scope === 'scoped' ? item.touchedPaths : undefined;
|
|
158
|
+
let exclusion;
|
|
159
|
+
// Worktree mode: the item commits onto its own branch INSIDE its dedicated
|
|
160
|
+
// worktree, which the engine created fresh (and therefore clean) at claim.
|
|
161
|
+
// The launch-dirty snapshot is taken against the SHARED projectRoot, so it
|
|
162
|
+
// has nothing to say about a just-created worktree — a fresh worktree starts
|
|
163
|
+
// clean, so its launch-dirty residue is trivially empty. Skip the residue
|
|
164
|
+
// exclusion entirely and commit straight onto the item branch; NO merge to
|
|
165
|
+
// base (the sequential integration lane owns that at item termination).
|
|
166
|
+
if (deps.itemWorktree) {
|
|
167
|
+
try {
|
|
168
|
+
const result = await deps.itemWorktree.commit(`orchestration: ${item.title} — ${phase.kind} phase`, paths);
|
|
169
|
+
const ignoredNote = result.skippedIgnored.length > 0
|
|
170
|
+
? `${result.skippedIgnored.length} ignored path${result.skippedIgnored.length === 1 ? '' : 's'} skipped`
|
|
171
|
+
: undefined;
|
|
172
|
+
if (result.hash === null) {
|
|
173
|
+
return { commit: { status: 'skipped', reason: ignoredNote ? `nothing to stage (${ignoredNote})` : 'nothing to stage' } };
|
|
174
|
+
}
|
|
175
|
+
return { commit: { status: 'committed', hash: result.hash, ...(ignoredNote ? { reason: ignoredNote } : {}) } };
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
const reason = summarizeError(error);
|
|
179
|
+
const negating = classifyBookkeepingFailure(error) === 'negating';
|
|
180
|
+
logger.warn('orchestration phase-runner: worktree scoped commit did not complete', {
|
|
181
|
+
itemId: item.id, phaseId: phase.id, worktreePath: deps.itemWorktree.path, error: reason, negating,
|
|
182
|
+
});
|
|
183
|
+
return { commit: { status: 'failed', reason, negating } };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (paths && paths.length > 0 && deps.launchDirtySnapshot) {
|
|
187
|
+
const launchSnapshot = deps.launchDirtySnapshot;
|
|
188
|
+
if (launchSnapshot.size > 0) {
|
|
189
|
+
const { included, excluded } = excludeUntouchedLaunchResidue(deps.projectRoot, paths, launchSnapshot);
|
|
190
|
+
if (excluded.length > 0) {
|
|
191
|
+
exclusion = { excludedPaths: excluded, skipped: included.length === 0 };
|
|
192
|
+
if (included.length === 0) {
|
|
193
|
+
// Every candidate path is untouched launch-dirty residue — an
|
|
194
|
+
// honest "nothing this phase did needs committing", not a silent
|
|
195
|
+
// no-op AND not a fallback to sweeping the whole working tree.
|
|
196
|
+
logger.info('orchestration phase-runner: scoped commit skipped — every candidate path is untouched launch-dirty residue', {
|
|
197
|
+
itemId: item.id,
|
|
198
|
+
phaseId: phase.id,
|
|
199
|
+
excludedPaths: excluded,
|
|
200
|
+
});
|
|
201
|
+
return { exclusion, commit: { status: 'skipped', reason: 'every candidate path was untouched launch-dirty residue' } };
|
|
202
|
+
}
|
|
203
|
+
logger.info('orchestration phase-runner: excluded untouched launch-dirty residue from scoped commit', {
|
|
204
|
+
itemId: item.id,
|
|
205
|
+
phaseId: phase.id,
|
|
206
|
+
excludedPaths: excluded,
|
|
207
|
+
});
|
|
208
|
+
paths = [...included];
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
const result = await worktree.commitWorkingTree(`orchestration: ${item.title} — ${phase.kind} phase`, paths);
|
|
214
|
+
await worktree.merge(agentId);
|
|
215
|
+
const ignoredNote = result.skippedIgnored.length > 0
|
|
216
|
+
? `${result.skippedIgnored.length} ignored path${result.skippedIgnored.length === 1 ? '' : 's'} skipped`
|
|
217
|
+
: undefined;
|
|
218
|
+
if (result.hash === null) {
|
|
219
|
+
// A null hash is "nothing was staged" — an honest skip, not a landed commit.
|
|
220
|
+
return { exclusion, commit: { status: 'skipped', reason: ignoredNote ? `nothing to stage (${ignoredNote})` : 'nothing to stage' } };
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
exclusion,
|
|
224
|
+
commit: { status: 'committed', hash: result.hash, ...(ignoredNote ? { reason: ignoredNote } : {}) },
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
const reason = summarizeError(error);
|
|
229
|
+
const negating = classifyBookkeepingFailure(error) === 'negating';
|
|
230
|
+
// Non-fatal by default: the gate already passed, so the engine treats this
|
|
231
|
+
// as a warning on a passed item. Only a NEGATING failure (workspace
|
|
232
|
+
// corruption — bookkeeping.ts) flips the item to failed.
|
|
233
|
+
logger.warn('orchestration phase-runner: scoped commit/merge did not complete', {
|
|
234
|
+
itemId: item.id, phaseId: phase.id, error: reason, negating,
|
|
235
|
+
});
|
|
236
|
+
return { exclusion, commit: { status: 'failed', reason, negating } };
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/** Runs one WorkItem through one Phase to completion (or cancellation/failure). Recurses (bounded by transportRetryLimit) on a transport-classified spawn failure. */
|
|
240
|
+
export async function runPhase(workstream, item, phase, priorReports, deps) {
|
|
241
|
+
const startedAt = Date.now();
|
|
242
|
+
const createWorktree = deps.createWorktree ?? (() => new AgentWorktree(deps.projectRoot));
|
|
243
|
+
const worktree = createWorktree();
|
|
244
|
+
const record = deps.agentManager.spawn({
|
|
245
|
+
mode: 'spawn',
|
|
246
|
+
task: buildPhaseTask(item, phase, priorReports),
|
|
247
|
+
template: templateForPhase(phase),
|
|
248
|
+
dangerously_disable_wrfc: true,
|
|
249
|
+
// Worktree mode: run the agent's tools with their working directory set to
|
|
250
|
+
// the item's isolated worktree, so its file edits land there instead of the
|
|
251
|
+
// shared projectRoot. Omitted (undefined) in shared mode ⇒ agent uses the
|
|
252
|
+
// orchestrator's default working directory exactly as before.
|
|
253
|
+
...(deps.itemWorktree ? { workingDirectory: deps.itemWorktree.path } : {}),
|
|
254
|
+
});
|
|
255
|
+
record.workItemId = item.id;
|
|
256
|
+
item.agentId = record.id;
|
|
257
|
+
item.allAgentIds.push(record.id);
|
|
258
|
+
item.branch ??= `agent/${item.id}`;
|
|
259
|
+
const signal = deps.cancellation.start(item.id);
|
|
260
|
+
deps.agentManager.registerCancellationSignal(record.id, signal);
|
|
261
|
+
let outcome;
|
|
262
|
+
try {
|
|
263
|
+
outcome = await awaitAgentTermination(deps.runtimeBus, deps.agentManager, record.id);
|
|
264
|
+
}
|
|
265
|
+
finally {
|
|
266
|
+
deps.agentManager.releaseCancellationSignal(record.id);
|
|
267
|
+
deps.cancellation.release(item.id);
|
|
268
|
+
}
|
|
269
|
+
const usage = usageFromRecord(outcome.record, deps.priceUsage);
|
|
270
|
+
if (outcome.status === 'cancelled') {
|
|
271
|
+
await worktree.cleanup(record.id).catch(() => undefined);
|
|
272
|
+
return {
|
|
273
|
+
agentStatus: 'cancelled',
|
|
274
|
+
result: {
|
|
275
|
+
itemId: item.id,
|
|
276
|
+
phaseId: phase.id,
|
|
277
|
+
agentId: record.id,
|
|
278
|
+
report: genericReport('cancelled by operator'),
|
|
279
|
+
gate: { passed: false, results: [] },
|
|
280
|
+
startedAt,
|
|
281
|
+
completedAt: Date.now(),
|
|
282
|
+
usage,
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
if (outcome.status === 'failed') {
|
|
287
|
+
const transportFailure = isTransportFailureMessage(outcome.record?.error ?? '');
|
|
288
|
+
const retryLimit = getWrfcTransportRetryLimit(deps.configManager);
|
|
289
|
+
if (transportFailure && item.transportRetryCount < retryLimit) {
|
|
290
|
+
item.transportRetryCount += 1;
|
|
291
|
+
await worktree.cleanup(record.id).catch(() => undefined);
|
|
292
|
+
await sleep(getWrfcTransportRetryDelayMs(deps.configManager));
|
|
293
|
+
return runPhase(workstream, item, phase, priorReports, deps);
|
|
294
|
+
}
|
|
295
|
+
await worktree.cleanup(record.id).catch(() => undefined);
|
|
296
|
+
return {
|
|
297
|
+
agentStatus: 'failed',
|
|
298
|
+
result: {
|
|
299
|
+
itemId: item.id,
|
|
300
|
+
phaseId: phase.id,
|
|
301
|
+
agentId: record.id,
|
|
302
|
+
report: genericReport(outcome.record?.error ?? 'agent failed'),
|
|
303
|
+
gate: { passed: false, results: [] },
|
|
304
|
+
startedAt,
|
|
305
|
+
completedAt: Date.now(),
|
|
306
|
+
usage,
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
const report = parseCompletionReport(outcome.record?.fullOutput ?? '') ?? genericReport(outcome.record?.fullOutput ?? '');
|
|
311
|
+
if (report.archetype === 'engineer') {
|
|
312
|
+
const engineerReport = report;
|
|
313
|
+
for (const path of [...engineerReport.filesCreated, ...engineerReport.filesModified, ...engineerReport.filesDeleted]) {
|
|
314
|
+
if (!item.touchedPaths.includes(path))
|
|
315
|
+
item.touchedPaths.push(path);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
const gate = await evaluateGate(workstream, phase, report, deps);
|
|
319
|
+
let commitExclusion;
|
|
320
|
+
let commit;
|
|
321
|
+
if (gate.passed) {
|
|
322
|
+
const committed = await commitPhaseWork(item, phase, record.id, worktree, deps);
|
|
323
|
+
commitExclusion = committed.exclusion;
|
|
324
|
+
commit = committed.commit;
|
|
325
|
+
}
|
|
326
|
+
// In worktree mode the item worktree persists across phases (the engine's
|
|
327
|
+
// integration lane owns its teardown), so only the shared-mode transient
|
|
328
|
+
// worktree gets cleaned up here.
|
|
329
|
+
if (!deps.itemWorktree) {
|
|
330
|
+
await worktree.cleanup(record.id).catch(() => undefined);
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
agentStatus: 'completed',
|
|
334
|
+
result: {
|
|
335
|
+
itemId: item.id,
|
|
336
|
+
phaseId: phase.id,
|
|
337
|
+
agentId: record.id,
|
|
338
|
+
report,
|
|
339
|
+
gate,
|
|
340
|
+
startedAt,
|
|
341
|
+
completedAt: Date.now(),
|
|
342
|
+
usage,
|
|
343
|
+
...(commitExclusion ? { commitExclusion } : {}),
|
|
344
|
+
...(commit ? { commit } : {}),
|
|
345
|
+
},
|
|
346
|
+
};
|
|
347
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** SDK-owned platform module. This implementation is maintained in goodvibes-sdk. */
|
|
2
|
+
/**
|
|
3
|
+
* Proposal → workstream assembly (BIG-3 item 1) — the final stage of the
|
|
4
|
+
* WRFC→orchestration migration. `fromPlanProposal()` maps an APPROVED
|
|
5
|
+
* PlanProposal (platform/core/plan-proposal.ts, produced by the BIG-2 planner
|
|
6
|
+
* decomposition pipeline) into a `CreateWorkstreamInput` the engine can run
|
|
7
|
+
* directly, so `/workstream launch` executes the REAL multi-item plan instead
|
|
8
|
+
* of flattening it through the `fromChainSpec` compat path.
|
|
9
|
+
*
|
|
10
|
+
* The mapping, one honest step at a time:
|
|
11
|
+
* - ONE work item per proposal work item. The proposal item's `title` becomes
|
|
12
|
+
* the work item's title and its `brief` becomes the work item's `task` — the
|
|
13
|
+
* prompt/context the phase agents actually run against (the phase-runner
|
|
14
|
+
* prepends "Work item: <title>" to review/fix prompts, so both survive into
|
|
15
|
+
* the agent's context). The proposal item's id is preserved so provenance,
|
|
16
|
+
* dependencies, and fleet nodes all line up 1:1.
|
|
17
|
+
* - Every item runs the SAME standard role-phase pipeline — engineer→review,
|
|
18
|
+
* the exact `engineerReviewPhases` template `fromChainSpec` uses
|
|
19
|
+
* (controller-compat.ts). The only per-assembly parameter is phase
|
|
20
|
+
* `capacity`: it defaults to the item count so independent items run
|
|
21
|
+
* concurrently (bounded only by their dependencies), where a single compat
|
|
22
|
+
* chain stays at capacity 1. Callers may cap concurrency via `opts.capacity`.
|
|
23
|
+
* - Inter-item dependencies carry over verbatim: `workItem.dependsOn` (already
|
|
24
|
+
* resolved to item ids by assemblePlanProposal) becomes the engine work
|
|
25
|
+
* item's `dependsOn`, which the scheduler gates the claim path on (an item
|
|
26
|
+
* is not claimable until every dependency reaches 'passed'; see the
|
|
27
|
+
* 'blocked-dependency' state and applyDependencyGates).
|
|
28
|
+
* - Workstream-level provenance records where the plan came from
|
|
29
|
+
* (decomposedBy, proposalId, strategy, agent cost/elapsed).
|
|
30
|
+
*
|
|
31
|
+
* ASSERT-AT-ASSEMBLY (BIG-3 item 2): even though `assemblePlanProposal` already
|
|
32
|
+
* rejects dangling dependencies and cycles, this function re-checks both and
|
|
33
|
+
* THROWS on violation rather than quietly building a broken workstream — a
|
|
34
|
+
* dangling dependency would gate an item on nothing, and a cycle would deadlock
|
|
35
|
+
* every item in it forever in 'blocked-dependency'. Belt-and-braces, because a
|
|
36
|
+
* caller could hand us a hand-built or mutated proposal that never went through
|
|
37
|
+
* the assembler.
|
|
38
|
+
*/
|
|
39
|
+
import type { ConfigManager } from '../config/manager.js';
|
|
40
|
+
import type { PlanProposal } from '../core/plan-proposal.js';
|
|
41
|
+
import type { CreateWorkstreamInput } from './engine.js';
|
|
42
|
+
export interface FromPlanProposalOptions {
|
|
43
|
+
/**
|
|
44
|
+
* Per-phase capacity for the engineer/review phases. Defaults to the number
|
|
45
|
+
* of work items, so all independent items can run concurrently (dependencies
|
|
46
|
+
* still gate the rest). Set a lower value to cap concurrency; clamped to at
|
|
47
|
+
* least 1.
|
|
48
|
+
*/
|
|
49
|
+
readonly capacity?: number | undefined;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Assemble a `CreateWorkstreamInput` from an approved multi-item PlanProposal.
|
|
53
|
+
* See the module doc for the full mapping and the assembly-time assertions.
|
|
54
|
+
*/
|
|
55
|
+
export declare function fromPlanProposal(proposal: PlanProposal, configManager: Pick<ConfigManager, 'get' | 'getCategory'>, opts?: FromPlanProposalOptions): CreateWorkstreamInput;
|
|
56
|
+
//# sourceMappingURL=proposal-workstream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal-workstream.d.ts","sourceRoot":"","sources":["../../../src/platform/orchestration/proposal-workstream.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AA8CD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,EACtB,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,aAAa,CAAC,EACzD,IAAI,GAAE,uBAA4B,GACjC,qBAAqB,CA8BvB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/** SDK-owned platform module. This implementation is maintained in goodvibes-sdk. */
|
|
2
|
+
import { getWrfcCommitScope } from '../agents/wrfc-config.js';
|
|
3
|
+
import { engineerReviewPhases } from './controller-compat.js';
|
|
4
|
+
/** Throws if any item's `dependsOn` references an unknown item, or if the dependency graph contains a cycle. */
|
|
5
|
+
function assertAcyclicAndResolved(proposal) {
|
|
6
|
+
const ids = new Set(proposal.workItems.map((wi) => wi.id));
|
|
7
|
+
const byId = new Map(proposal.workItems.map((wi) => [wi.id, wi]));
|
|
8
|
+
for (const wi of proposal.workItems) {
|
|
9
|
+
for (const dep of wi.dependsOn) {
|
|
10
|
+
if (!ids.has(dep)) {
|
|
11
|
+
throw new Error(`fromPlanProposal: work item "${wi.title}" (${wi.id}) depends on unknown item id "${dep}" — the proposal is not internally consistent`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
// Iterative DFS cycle detection over ids (white/grey/black).
|
|
16
|
+
const state = new Map();
|
|
17
|
+
const onCycle = (id) => {
|
|
18
|
+
const title = byId.get(id)?.title ?? id;
|
|
19
|
+
throw new Error(`fromPlanProposal: dependency cycle detected involving work item "${title}" (${id}) — cannot assemble a workstream that would deadlock`);
|
|
20
|
+
};
|
|
21
|
+
const visit = (start) => {
|
|
22
|
+
const stack = [{ id: start, deps: byId.get(start)?.dependsOn ?? [], i: 0 }];
|
|
23
|
+
state.set(start, 'visiting');
|
|
24
|
+
while (stack.length > 0) {
|
|
25
|
+
const frame = stack[stack.length - 1];
|
|
26
|
+
if (frame.i >= frame.deps.length) {
|
|
27
|
+
state.set(frame.id, 'done');
|
|
28
|
+
stack.pop();
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const next = frame.deps[frame.i++];
|
|
32
|
+
const seen = state.get(next);
|
|
33
|
+
if (seen === 'visiting')
|
|
34
|
+
onCycle(next);
|
|
35
|
+
if (seen === 'done')
|
|
36
|
+
continue;
|
|
37
|
+
state.set(next, 'visiting');
|
|
38
|
+
stack.push({ id: next, deps: byId.get(next)?.dependsOn ?? [], i: 0 });
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
for (const wi of proposal.workItems) {
|
|
42
|
+
if (!state.has(wi.id))
|
|
43
|
+
visit(wi.id);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Assemble a `CreateWorkstreamInput` from an approved multi-item PlanProposal.
|
|
48
|
+
* See the module doc for the full mapping and the assembly-time assertions.
|
|
49
|
+
*/
|
|
50
|
+
export function fromPlanProposal(proposal, configManager, opts = {}) {
|
|
51
|
+
assertAcyclicAndResolved(proposal);
|
|
52
|
+
const commitScope = getWrfcCommitScope(configManager);
|
|
53
|
+
const capacity = Math.max(1, opts.capacity ?? proposal.workItems.length);
|
|
54
|
+
const items = proposal.workItems.map((wi) => ({
|
|
55
|
+
id: wi.id,
|
|
56
|
+
title: wi.title,
|
|
57
|
+
// The brief IS the actionable prompt context; the engineer phase runs it
|
|
58
|
+
// verbatim as the item's task, and review/fix phases see it alongside the
|
|
59
|
+
// title (buildPhaseTask, phase-runner.ts).
|
|
60
|
+
task: wi.brief,
|
|
61
|
+
...(wi.dependsOn.length > 0 ? { dependsOn: [...wi.dependsOn] } : {}),
|
|
62
|
+
}));
|
|
63
|
+
const provenance = {
|
|
64
|
+
...(proposal.decomposedBy ? { decomposedBy: proposal.decomposedBy } : {}),
|
|
65
|
+
proposalId: proposal.id,
|
|
66
|
+
strategy: proposal.strategy,
|
|
67
|
+
...(proposal.agentCostUsd !== undefined ? { agentCostUsd: proposal.agentCostUsd } : {}),
|
|
68
|
+
...(proposal.elapsedMs !== undefined ? { elapsedMs: proposal.elapsedMs } : {}),
|
|
69
|
+
};
|
|
70
|
+
return {
|
|
71
|
+
title: proposal.task,
|
|
72
|
+
phases: engineerReviewPhases(commitScope, capacity),
|
|
73
|
+
items,
|
|
74
|
+
provenance,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/** SDK-owned platform module. This implementation is maintained in goodvibes-sdk. */
|
|
2
|
+
/**
|
|
3
|
+
* Scheduler (Wave 4, wo701) — pure capacity-matching helpers, no side
|
|
4
|
+
* effects. The hard departure from WrfcController's pairwise
|
|
5
|
+
* engineer<->reviewer binding (startReview:883/startFix:1042): each tick,
|
|
6
|
+
* for every phase in ordinal order, free capacity slots (capacity minus
|
|
7
|
+
* in-flight) are filled from whichever waiting items are queued for that
|
|
8
|
+
* phase — an item advances the instant ITS gate passes, claimed by
|
|
9
|
+
* whatever slot happens to be free, never bound to a specific sibling item.
|
|
10
|
+
*/
|
|
11
|
+
import type { Phase, WorkItem, Workstream } from './types.js';
|
|
12
|
+
export declare function sortedPhases(workstream: Workstream): Phase[];
|
|
13
|
+
export declare function firstPhase(workstream: Workstream): Phase | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* The next phase in ORDINARY forward progression. Deliberately skips
|
|
16
|
+
* 'fix'-kind phases: a dynamically-inserted fix phase sits at an ordinal
|
|
17
|
+
* after its review (see engine.ts findOrInsertFixPhase) but is reachable
|
|
18
|
+
* ONLY via the explicit review-failure re-route, never as "what comes next"
|
|
19
|
+
* for an item whose review already passed — otherwise a later item that
|
|
20
|
+
* never needed fixing would wrongly detour through it.
|
|
21
|
+
*/
|
|
22
|
+
export declare function nextPhaseAfter(workstream: Workstream, ordinal: number): Phase | undefined;
|
|
23
|
+
export declare function phaseById(workstream: Workstream, phaseId: string): Phase | undefined;
|
|
24
|
+
/** The nearest preceding review-kind phase — the return target after a dynamically-inserted fix phase's gate passes. Purely structural (survives serialization with zero extra bookkeeping). */
|
|
25
|
+
export declare function reviewPhaseBefore(workstream: Workstream, phase: Phase): Phase | undefined;
|
|
26
|
+
export interface PhaseClaim {
|
|
27
|
+
readonly item: WorkItem;
|
|
28
|
+
readonly phase: Phase;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Whether an item's inter-item dependencies (BIG-3 item 2) are all satisfied,
|
|
32
|
+
* and — when not — WHY, split into dependencies still in flight vs. ones that
|
|
33
|
+
* have terminally failed. Pure (no side effects): the engine's per-tick
|
|
34
|
+
* dependency pre-pass (applyDependencyGates, engine.ts) calls this and applies
|
|
35
|
+
* the state/blockedReason transition. Missing dependency ids (no item in the
|
|
36
|
+
* workstream matches) are ignored here — assembly (fromPlanProposal) already
|
|
37
|
+
* asserts referential integrity, so a dangling id at runtime is treated as
|
|
38
|
+
* "not blocking" rather than an eternal block.
|
|
39
|
+
*/
|
|
40
|
+
export interface DependencyStatus {
|
|
41
|
+
/** True when every dependency has reached 'passed' (or there are none). */
|
|
42
|
+
readonly ready: boolean;
|
|
43
|
+
/** Titles of dependencies still pending/in flight (neither passed nor failed). */
|
|
44
|
+
readonly waiting: string[];
|
|
45
|
+
/** Titles of dependencies that have terminally FAILED — a recoverable block, not a terminal one for the dependent. */
|
|
46
|
+
readonly failed: string[];
|
|
47
|
+
}
|
|
48
|
+
export declare function dependencyStatus(workstream: Workstream, item: WorkItem): DependencyStatus;
|
|
49
|
+
/**
|
|
50
|
+
* Which (item, phase) pairs have free capacity to claim RIGHT NOW. Pure —
|
|
51
|
+
* no side effects, no budget check (the caller applies budget.checkBudget
|
|
52
|
+
* before actually claiming, since budget is a *decision*, not a capacity
|
|
53
|
+
* fact this function should own).
|
|
54
|
+
*
|
|
55
|
+
* 'blocked-budget' items are deliberately included in the waiting set, not
|
|
56
|
+
* just 'pending'/'awaiting-capacity': a budget block is a recoverable
|
|
57
|
+
* decision (see BudgetCeiling/WorkItemState docs, types.ts), never a
|
|
58
|
+
* capacity fact, so a previously-blocked item must be reconsidered on every
|
|
59
|
+
* tick the instant a slot is free — the caller's budget.checkBudget call
|
|
60
|
+
* re-decides it fresh each time, honestly re-blocking it if the ceiling
|
|
61
|
+
* still refuses.
|
|
62
|
+
*/
|
|
63
|
+
export declare function computeClaims(workstream: Workstream): PhaseClaim[];
|
|
64
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/platform/orchestration/scheduler.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,KAAK,EAAE,CAE5D;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,KAAK,GAAG,SAAS,CAEpE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAEzF;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAEpF;AAED,gMAAgM;AAChM,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,CAEzF;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,sHAAsH;IACtH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,gBAAgB,CAWzF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE,CAiBlE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** SDK-owned platform module. This implementation is maintained in goodvibes-sdk. */
|
|
2
|
+
export function sortedPhases(workstream) {
|
|
3
|
+
return [...workstream.phases].sort((a, b) => a.ordinal - b.ordinal);
|
|
4
|
+
}
|
|
5
|
+
export function firstPhase(workstream) {
|
|
6
|
+
return sortedPhases(workstream)[0];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The next phase in ORDINARY forward progression. Deliberately skips
|
|
10
|
+
* 'fix'-kind phases: a dynamically-inserted fix phase sits at an ordinal
|
|
11
|
+
* after its review (see engine.ts findOrInsertFixPhase) but is reachable
|
|
12
|
+
* ONLY via the explicit review-failure re-route, never as "what comes next"
|
|
13
|
+
* for an item whose review already passed — otherwise a later item that
|
|
14
|
+
* never needed fixing would wrongly detour through it.
|
|
15
|
+
*/
|
|
16
|
+
export function nextPhaseAfter(workstream, ordinal) {
|
|
17
|
+
return sortedPhases(workstream).find((p) => p.ordinal > ordinal && p.kind !== 'fix');
|
|
18
|
+
}
|
|
19
|
+
export function phaseById(workstream, phaseId) {
|
|
20
|
+
return workstream.phases.find((p) => p.id === phaseId);
|
|
21
|
+
}
|
|
22
|
+
/** The nearest preceding review-kind phase — the return target after a dynamically-inserted fix phase's gate passes. Purely structural (survives serialization with zero extra bookkeeping). */
|
|
23
|
+
export function reviewPhaseBefore(workstream, phase) {
|
|
24
|
+
return sortedPhases(workstream).filter((p) => p.ordinal < phase.ordinal && p.kind === 'review').pop();
|
|
25
|
+
}
|
|
26
|
+
export function dependencyStatus(workstream, item) {
|
|
27
|
+
const waiting = [];
|
|
28
|
+
const failed = [];
|
|
29
|
+
for (const depId of item.dependsOn) {
|
|
30
|
+
const dep = workstream.items.find((i) => i.id === depId);
|
|
31
|
+
if (!dep)
|
|
32
|
+
continue; // dangling id — assembly guarantees this can't happen; ignore rather than block forever
|
|
33
|
+
if (dep.state === 'passed')
|
|
34
|
+
continue;
|
|
35
|
+
if (dep.state === 'failed')
|
|
36
|
+
failed.push(dep.title);
|
|
37
|
+
else
|
|
38
|
+
waiting.push(dep.title);
|
|
39
|
+
}
|
|
40
|
+
return { ready: waiting.length === 0 && failed.length === 0, waiting, failed };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Which (item, phase) pairs have free capacity to claim RIGHT NOW. Pure —
|
|
44
|
+
* no side effects, no budget check (the caller applies budget.checkBudget
|
|
45
|
+
* before actually claiming, since budget is a *decision*, not a capacity
|
|
46
|
+
* fact this function should own).
|
|
47
|
+
*
|
|
48
|
+
* 'blocked-budget' items are deliberately included in the waiting set, not
|
|
49
|
+
* just 'pending'/'awaiting-capacity': a budget block is a recoverable
|
|
50
|
+
* decision (see BudgetCeiling/WorkItemState docs, types.ts), never a
|
|
51
|
+
* capacity fact, so a previously-blocked item must be reconsidered on every
|
|
52
|
+
* tick the instant a slot is free — the caller's budget.checkBudget call
|
|
53
|
+
* re-decides it fresh each time, honestly re-blocking it if the ceiling
|
|
54
|
+
* still refuses.
|
|
55
|
+
*/
|
|
56
|
+
export function computeClaims(workstream) {
|
|
57
|
+
const claims = [];
|
|
58
|
+
for (const phase of sortedPhases(workstream)) {
|
|
59
|
+
const inFlight = workstream.items.filter((item) => item.currentPhaseId === phase.id && item.state === 'in-phase').length;
|
|
60
|
+
let free = phase.capacity - inFlight;
|
|
61
|
+
if (free <= 0)
|
|
62
|
+
continue;
|
|
63
|
+
const waiting = workstream.items.filter((item) => item.currentPhaseId === phase.id
|
|
64
|
+
&& (item.state === 'pending' || item.state === 'awaiting-capacity' || item.state === 'blocked-budget'));
|
|
65
|
+
for (const item of waiting) {
|
|
66
|
+
if (free <= 0)
|
|
67
|
+
break;
|
|
68
|
+
claims.push({ item, phase });
|
|
69
|
+
free -= 1;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return claims;
|
|
73
|
+
}
|