@revisium/orchestrator 0.0.0 → 0.1.0-alpha.10
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/README.md +202 -1
- package/control-plane/bootstrap.config.json +104 -2
- package/control-plane/default-playbook/catalog/pipelines.json +657 -0
- package/control-plane/default-playbook/catalog/roles.json +65 -0
- package/control-plane/default-playbook/package.json +5 -0
- package/control-plane/default-playbook/playbook.json +13 -0
- package/control-plane/default-playbook/prompts/analyst.md +29 -0
- package/control-plane/default-playbook/prompts/developer.md +26 -0
- package/control-plane/default-playbook/prompts/integrator.md +20 -0
- package/control-plane/default-playbook/prompts/orchestrator.md +23 -0
- package/control-plane/default-playbook/prompts/reviewer.md +28 -0
- package/control-plane/default-playbook/prompts/triager.md +51 -0
- package/control-plane/default-playbook/prompts/watcher.md +24 -0
- package/dist/api/graphql-api/filters/agent-observability-exception.filter.js +24 -0
- package/dist/api/graphql-api/filters/agent-observability-exception.filter.js.map +1 -0
- package/dist/api/graphql-api/filters/graphql-validation-exception.filter.js +36 -0
- package/dist/api/graphql-api/filters/graphql-validation-exception.filter.js.map +1 -0
- package/dist/api/graphql-api/graphql-api.module.js +77 -0
- package/dist/api/graphql-api/graphql-api.module.js.map +1 -0
- package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-bridge.service.js +296 -0
- package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-bridge.service.js.map +1 -0
- package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-mappers.js +64 -0
- package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-mappers.js.map +1 -0
- package/dist/api/graphql-api/graphql-ws/constants.js +11 -0
- package/dist/api/graphql-api/graphql-ws/constants.js.map +1 -0
- package/dist/api/graphql-api/graphql-ws/pubsub.module.js +32 -0
- package/dist/api/graphql-api/graphql-ws/pubsub.module.js.map +1 -0
- package/dist/api/graphql-api/graphql-ws/run-progress-subscription-poller.service.js +101 -0
- package/dist/api/graphql-api/graphql-ws/run-progress-subscription-poller.service.js.map +1 -0
- package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js +115 -0
- package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js.map +1 -0
- package/dist/api/graphql-api/graphql-ws/subscription-mappers.js +85 -0
- package/dist/api/graphql-api/graphql-ws/subscription-mappers.js.map +1 -0
- package/dist/api/graphql-api/graphql-ws/ws.js +22 -0
- package/dist/api/graphql-api/graphql-ws/ws.js.map +1 -0
- package/dist/api/graphql-api/inbox/inbox-subscription.resolver.js +56 -0
- package/dist/api/graphql-api/inbox/inbox-subscription.resolver.js.map +1 -0
- package/dist/api/graphql-api/inbox/inbox.resolver.js +125 -0
- package/dist/api/graphql-api/inbox/inbox.resolver.js.map +1 -0
- package/dist/api/graphql-api/inbox/inputs/answer-question.input.js +33 -0
- package/dist/api/graphql-api/inbox/inputs/answer-question.input.js.map +1 -0
- package/dist/api/graphql-api/inbox/inputs/gate-decision.input.js +27 -0
- package/dist/api/graphql-api/inbox/inputs/gate-decision.input.js.map +1 -0
- package/dist/api/graphql-api/inbox/inputs/list-inbox.input.js +28 -0
- package/dist/api/graphql-api/inbox/inputs/list-inbox.input.js.map +1 -0
- package/dist/api/graphql-api/inbox/inputs/resolve-inbox-item.input.js +38 -0
- package/dist/api/graphql-api/inbox/inputs/resolve-inbox-item.input.js.map +1 -0
- package/dist/api/graphql-api/inbox/model/gate-risk.model.js +53 -0
- package/dist/api/graphql-api/inbox/model/gate-risk.model.js.map +1 -0
- package/dist/api/graphql-api/inbox/model/inbox-connection.model.js +16 -0
- package/dist/api/graphql-api/inbox/model/inbox-connection.model.js.map +1 -0
- package/dist/api/graphql-api/inbox/model/inbox-item.model.js +88 -0
- package/dist/api/graphql-api/inbox/model/inbox-item.model.js.map +1 -0
- package/dist/api/graphql-api/inbox/model/inbox-resolution.model.js +48 -0
- package/dist/api/graphql-api/inbox/model/inbox-resolution.model.js.map +1 -0
- package/dist/api/graphql-api/method/inputs/list-method.input.js +15 -0
- package/dist/api/graphql-api/method/inputs/list-method.input.js.map +1 -0
- package/dist/api/graphql-api/method/method.resolver.js +90 -0
- package/dist/api/graphql-api/method/method.resolver.js.map +1 -0
- package/dist/api/graphql-api/method/model/alternative-role-group.model.js +32 -0
- package/dist/api/graphql-api/method/model/alternative-role-group.model.js.map +1 -0
- package/dist/api/graphql-api/method/model/pipeline-connection.model.js +16 -0
- package/dist/api/graphql-api/method/model/pipeline-connection.model.js.map +1 -0
- package/dist/api/graphql-api/method/model/pipeline.model.js +69 -0
- package/dist/api/graphql-api/method/model/pipeline.model.js.map +1 -0
- package/dist/api/graphql-api/method/model/playbook-connection.model.js +16 -0
- package/dist/api/graphql-api/method/model/playbook-connection.model.js.map +1 -0
- package/dist/api/graphql-api/method/model/playbook.model.js +47 -0
- package/dist/api/graphql-api/method/model/playbook.model.js.map +1 -0
- package/dist/api/graphql-api/method/model/role-connection.model.js +16 -0
- package/dist/api/graphql-api/method/model/role-connection.model.js.map +1 -0
- package/dist/api/graphql-api/method/model/role.model.js +98 -0
- package/dist/api/graphql-api/method/model/role.model.js.map +1 -0
- package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js +52 -0
- package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js.map +1 -0
- package/dist/api/graphql-api/pr/model/pr-readiness.model.js +403 -0
- package/dist/api/graphql-api/pr/model/pr-readiness.model.js.map +1 -0
- package/dist/api/graphql-api/pr/pr.resolver.js +76 -0
- package/dist/api/graphql-api/pr/pr.resolver.js.map +1 -0
- package/dist/api/graphql-api/registerGraphqlEnums.js +9 -0
- package/dist/api/graphql-api/registerGraphqlEnums.js.map +1 -0
- package/dist/api/graphql-api/runs/inputs/create-run.input.js +63 -0
- package/dist/api/graphql-api/runs/inputs/create-run.input.js.map +1 -0
- package/dist/api/graphql-api/runs/inputs/get-agent-log.input.js +48 -0
- package/dist/api/graphql-api/runs/inputs/get-agent-log.input.js.map +1 -0
- package/dist/api/graphql-api/runs/inputs/get-run-attempts.input.js +32 -0
- package/dist/api/graphql-api/runs/inputs/get-run-attempts.input.js.map +1 -0
- package/dist/api/graphql-api/runs/inputs/get-run-events.input.js +28 -0
- package/dist/api/graphql-api/runs/inputs/get-run-events.input.js.map +1 -0
- package/dist/api/graphql-api/runs/inputs/list-runs.input.js +23 -0
- package/dist/api/graphql-api/runs/inputs/list-runs.input.js.map +1 -0
- package/dist/api/graphql-api/runs/inputs/simulate-route.input.js +43 -0
- package/dist/api/graphql-api/runs/inputs/simulate-route.input.js.map +1 -0
- package/dist/api/graphql-api/runs/model/agent-activity.model.js +367 -0
- package/dist/api/graphql-api/runs/model/agent-activity.model.js.map +1 -0
- package/dist/api/graphql-api/runs/model/create-run-result.model.js +53 -0
- package/dist/api/graphql-api/runs/model/create-run-result.model.js.map +1 -0
- package/dist/api/graphql-api/runs/model/run-attempt.model.js +114 -0
- package/dist/api/graphql-api/runs/model/run-attempt.model.js.map +1 -0
- package/dist/api/graphql-api/runs/model/run-connection.model.js +16 -0
- package/dist/api/graphql-api/runs/model/run-connection.model.js.map +1 -0
- package/dist/api/graphql-api/runs/model/run-cost.model.js +67 -0
- package/dist/api/graphql-api/runs/model/run-cost.model.js.map +1 -0
- package/dist/api/graphql-api/runs/model/run-digest.model.js +41 -0
- package/dist/api/graphql-api/runs/model/run-digest.model.js.map +1 -0
- package/dist/api/graphql-api/runs/model/run-event-connection.model.js +16 -0
- package/dist/api/graphql-api/runs/model/run-event-connection.model.js.map +1 -0
- package/dist/api/graphql-api/runs/model/run-event.model.js +58 -0
- package/dist/api/graphql-api/runs/model/run-event.model.js.map +1 -0
- package/dist/api/graphql-api/runs/model/run-progress.model.js +33 -0
- package/dist/api/graphql-api/runs/model/run-progress.model.js.map +1 -0
- package/dist/api/graphql-api/runs/model/run-workflow.model.js +287 -0
- package/dist/api/graphql-api/runs/model/run-workflow.model.js.map +1 -0
- package/dist/api/graphql-api/runs/model/run.model.js +57 -0
- package/dist/api/graphql-api/runs/model/run.model.js.map +1 -0
- package/dist/api/graphql-api/runs/model/usage.model.js +32 -0
- package/dist/api/graphql-api/runs/model/usage.model.js.map +1 -0
- package/dist/api/graphql-api/runs/run-digest.resolver.js +40 -0
- package/dist/api/graphql-api/runs/run-digest.resolver.js.map +1 -0
- package/dist/api/graphql-api/runs/run-events.resolver.js +45 -0
- package/dist/api/graphql-api/runs/run-events.resolver.js.map +1 -0
- package/dist/api/graphql-api/runs/run-progress.resolver.js +53 -0
- package/dist/api/graphql-api/runs/run-progress.resolver.js.map +1 -0
- package/dist/api/graphql-api/runs/runs-subscription.resolver.js +124 -0
- package/dist/api/graphql-api/runs/runs-subscription.resolver.js.map +1 -0
- package/dist/api/graphql-api/runs/runs.resolver.js +165 -0
- package/dist/api/graphql-api/runs/runs.resolver.js.map +1 -0
- package/dist/api/graphql-api/share/graphql-param-types.js +6 -0
- package/dist/api/graphql-api/share/graphql-param-types.js.map +1 -0
- package/dist/api/graphql-api/share/inputs/connection.input.js +27 -0
- package/dist/api/graphql-api/share/inputs/connection.input.js.map +1 -0
- package/dist/api/graphql-api/share/inputs/run-subscription.input.js +22 -0
- package/dist/api/graphql-api/share/inputs/run-subscription.input.js.map +1 -0
- package/dist/api/graphql-api/share/model/paginated.model.js +75 -0
- package/dist/api/graphql-api/share/model/paginated.model.js.map +1 -0
- package/dist/api/graphql-api/system/model/daemon-status.model.js +47 -0
- package/dist/api/graphql-api/system/model/daemon-status.model.js.map +1 -0
- package/dist/api/graphql-api/system/model/doctor-result.model.js +33 -0
- package/dist/api/graphql-api/system/model/doctor-result.model.js.map +1 -0
- package/dist/api/graphql-api/system/model/project.model.js +37 -0
- package/dist/api/graphql-api/system/model/project.model.js.map +1 -0
- package/dist/api/graphql-api/system/model/repository-context.model.js +70 -0
- package/dist/api/graphql-api/system/model/repository-context.model.js.map +1 -0
- package/dist/api/graphql-api/system/model/repository-validation.model.js +62 -0
- package/dist/api/graphql-api/system/model/repository-validation.model.js.map +1 -0
- package/dist/api/graphql-api/system/model/system-status.model.js +29 -0
- package/dist/api/graphql-api/system/model/system-status.model.js.map +1 -0
- package/dist/api/graphql-api/system/system.resolver.js +83 -0
- package/dist/api/graphql-api/system/system.resolver.js.map +1 -0
- package/dist/cli/commands/doctor-report.js +70 -0
- package/dist/cli/commands/doctor-report.js.map +1 -0
- package/dist/cli/commands/lifecycle.js +463 -0
- package/dist/cli/commands/lifecycle.js.map +1 -0
- package/dist/cli/commands/mcp.js +53 -8
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/process-tree.js +87 -0
- package/dist/cli/commands/process-tree.js.map +1 -0
- package/dist/cli/commands/revisium-helpers.js +2 -2
- package/dist/cli/commands/rogue-reaper.js +63 -0
- package/dist/cli/commands/rogue-reaper.js.map +1 -0
- package/dist/cli/index.js +5 -29
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/program.js +7 -23
- package/dist/cli/program.js.map +1 -1
- package/dist/config.js +79 -1
- package/dist/config.js.map +1 -1
- package/dist/control-plane/bootstrap.js +101 -0
- package/dist/control-plane/bootstrap.js.map +1 -0
- package/dist/control-plane/change-notifications.js +35 -0
- package/dist/control-plane/change-notifications.js.map +1 -0
- package/dist/control-plane/client-transport.js +74 -41
- package/dist/control-plane/client-transport.js.map +1 -1
- package/dist/control-plane/data-access.js +13 -5
- package/dist/control-plane/data-access.js.map +1 -1
- package/dist/control-plane/definitions.js +1 -1
- package/dist/control-plane/definitions.js.map +1 -1
- package/dist/control-plane/inbox.js +5 -31
- package/dist/control-plane/inbox.js.map +1 -1
- package/dist/control-plane/index.js +1 -1
- package/dist/control-plane/index.js.map +1 -1
- package/dist/control-plane/json-fields.js +2 -0
- package/dist/control-plane/json-fields.js.map +1 -1
- package/dist/control-plane/resolve-cwd.js +76 -8
- package/dist/control-plane/resolve-cwd.js.map +1 -1
- package/dist/control-plane/schema-migration.js +82 -0
- package/dist/control-plane/schema-migration.js.map +1 -0
- package/dist/control-plane/seed-default-playbook.js +141 -0
- package/dist/control-plane/seed-default-playbook.js.map +1 -0
- package/dist/control-plane/steps.js +15 -349
- package/dist/control-plane/steps.js.map +1 -1
- package/dist/control-plane/tables.js +1 -0
- package/dist/control-plane/tables.js.map +1 -1
- package/dist/e2e/kit/agents.js +148 -0
- package/dist/e2e/kit/agents.js.map +1 -0
- package/dist/e2e/kit/assertions.js +163 -0
- package/dist/e2e/kit/assertions.js.map +1 -0
- package/dist/e2e/kit/crash.js +44 -0
- package/dist/e2e/kit/crash.js.map +1 -0
- package/dist/e2e/kit/drive.js +45 -0
- package/dist/e2e/kit/drive.js.map +1 -0
- package/dist/e2e/kit/env.js +16 -0
- package/dist/e2e/kit/env.js.map +1 -0
- package/dist/e2e/kit/fake-integrator.js +57 -0
- package/dist/e2e/kit/fake-integrator.js.map +1 -0
- package/dist/e2e/kit/gh-emulator.js +213 -0
- package/dist/e2e/kit/gh-emulator.js.map +1 -0
- package/dist/e2e/kit/git-target-repo.js +115 -0
- package/dist/e2e/kit/git-target-repo.js.map +1 -0
- package/dist/e2e/kit/harness.js +72 -0
- package/dist/e2e/kit/harness.js.map +1 -0
- package/dist/e2e/kit/index.js +14 -0
- package/dist/e2e/kit/index.js.map +1 -0
- package/dist/e2e/kit/mcp.js +32 -0
- package/dist/e2e/kit/mcp.js.map +1 -0
- package/dist/e2e/kit/scenarios.js +196 -0
- package/dist/e2e/kit/scenarios.js.map +1 -0
- package/dist/e2e/recovery-crash-child.js +29 -0
- package/dist/e2e/recovery-crash-child.js.map +1 -0
- package/dist/e2e/recovery-dd-crash-child.js +43 -0
- package/dist/e2e/recovery-dd-crash-child.js.map +1 -0
- package/dist/engine/dbos.module.js +2 -1
- package/dist/engine/dbos.module.js.map +1 -1
- package/dist/engine/dbos.service.js +89 -18
- package/dist/engine/dbos.service.js.map +1 -1
- package/dist/engine/ensure-postgres.js +18 -4
- package/dist/engine/ensure-postgres.js.map +1 -1
- package/dist/features/inbox/commands/handlers/inbox-command.handlers.js +80 -0
- package/dist/features/inbox/commands/handlers/inbox-command.handlers.js.map +1 -0
- package/dist/features/inbox/commands/impl/answer-question.command.js +7 -0
- package/dist/features/inbox/commands/impl/answer-question.command.js.map +1 -0
- package/dist/features/inbox/commands/impl/approve-gate.command.js +7 -0
- package/dist/features/inbox/commands/impl/approve-gate.command.js.map +1 -0
- package/dist/features/inbox/commands/impl/reject-gate.command.js +7 -0
- package/dist/features/inbox/commands/impl/reject-gate.command.js.map +1 -0
- package/dist/features/inbox/commands/impl/resolve-inbox-item.command.js +7 -0
- package/dist/features/inbox/commands/impl/resolve-inbox-item.command.js.map +1 -0
- package/dist/features/inbox/commands/index.js +8 -0
- package/dist/features/inbox/commands/index.js.map +1 -0
- package/dist/features/inbox/inbox-api.module.js +23 -0
- package/dist/features/inbox/inbox-api.module.js.map +1 -0
- package/dist/features/inbox/inbox-api.service.js +63 -0
- package/dist/features/inbox/inbox-api.service.js.map +1 -0
- package/dist/features/inbox/queries/handlers/inbox-query.handlers.js +111 -0
- package/dist/features/inbox/queries/handlers/inbox-query.handlers.js.map +1 -0
- package/dist/features/inbox/queries/impl/get-inbox-item.query.js +7 -0
- package/dist/features/inbox/queries/impl/get-inbox-item.query.js.map +1 -0
- package/dist/features/inbox/queries/impl/get-pending-decisions.query.js +7 -0
- package/dist/features/inbox/queries/impl/get-pending-decisions.query.js.map +1 -0
- package/dist/features/inbox/queries/impl/list-inbox.query.js +7 -0
- package/dist/features/inbox/queries/impl/list-inbox.query.js.map +1 -0
- package/dist/features/inbox/queries/impl/summarize-gate-risk.query.js +7 -0
- package/dist/features/inbox/queries/impl/summarize-gate-risk.query.js.map +1 -0
- package/dist/features/inbox/queries/index.js +8 -0
- package/dist/features/inbox/queries/index.js.map +1 -0
- package/dist/features/method/commands/index.js +2 -0
- package/dist/features/method/commands/index.js.map +1 -0
- package/dist/features/method/method-api.module.js +23 -0
- package/dist/features/method/method-api.module.js.map +1 -0
- package/dist/features/method/method-api.service.js +47 -0
- package/dist/features/method/method-api.service.js.map +1 -0
- package/dist/features/method/queries/handlers/method-query.handlers.js +115 -0
- package/dist/features/method/queries/handlers/method-query.handlers.js.map +1 -0
- package/dist/features/method/queries/impl/get-pipeline.query.js +7 -0
- package/dist/features/method/queries/impl/get-pipeline.query.js.map +1 -0
- package/dist/features/method/queries/impl/get-role.query.js +7 -0
- package/dist/features/method/queries/impl/get-role.query.js.map +1 -0
- package/dist/features/method/queries/impl/list-pipelines.query.js +7 -0
- package/dist/features/method/queries/impl/list-pipelines.query.js.map +1 -0
- package/dist/features/method/queries/impl/list-playbooks.query.js +7 -0
- package/dist/features/method/queries/impl/list-playbooks.query.js.map +1 -0
- package/dist/features/method/queries/impl/list-roles.query.js +7 -0
- package/dist/features/method/queries/impl/list-roles.query.js.map +1 -0
- package/dist/features/method/queries/index.js +9 -0
- package/dist/features/method/queries/index.js.map +1 -0
- package/dist/features/pr/commands/index.js +2 -0
- package/dist/features/pr/commands/index.js.map +1 -0
- package/dist/features/pr/pr-api.module.js +23 -0
- package/dist/features/pr/pr-api.module.js.map +1 -0
- package/dist/features/pr/pr-api.service.js +35 -0
- package/dist/features/pr/pr-api.service.js.map +1 -0
- package/dist/features/pr/queries/handlers/pr-query.handlers.js +48 -0
- package/dist/features/pr/queries/handlers/pr-query.handlers.js.map +1 -0
- package/dist/features/pr/queries/impl/get-pr-readiness.query.js +7 -0
- package/dist/features/pr/queries/impl/get-pr-readiness.query.js.map +1 -0
- package/dist/features/pr/queries/impl/list-pr-feedback.query.js +7 -0
- package/dist/features/pr/queries/impl/list-pr-feedback.query.js.map +1 -0
- package/dist/features/pr/queries/index.js +3 -0
- package/dist/features/pr/queries/index.js.map +1 -0
- package/dist/features/runs/commands/handlers/runs-command.handlers.js +32 -0
- package/dist/features/runs/commands/handlers/runs-command.handlers.js.map +1 -0
- package/dist/features/runs/commands/impl/create-run.command.js +7 -0
- package/dist/features/runs/commands/impl/create-run.command.js.map +1 -0
- package/dist/features/runs/commands/index.js +3 -0
- package/dist/features/runs/commands/index.js.map +1 -0
- package/dist/features/runs/queries/handlers/runs-query.handlers.js +359 -0
- package/dist/features/runs/queries/handlers/runs-query.handlers.js.map +1 -0
- package/dist/features/runs/queries/impl/get-agent-activity.query.js +7 -0
- package/dist/features/runs/queries/impl/get-agent-activity.query.js.map +1 -0
- package/dist/features/runs/queries/impl/get-agent-attempts.query.js +7 -0
- package/dist/features/runs/queries/impl/get-agent-attempts.query.js.map +1 -0
- package/dist/features/runs/queries/impl/get-agent-log.query.js +7 -0
- package/dist/features/runs/queries/impl/get-agent-log.query.js.map +1 -0
- package/dist/features/runs/queries/impl/get-run-attempts.query.js +7 -0
- package/dist/features/runs/queries/impl/get-run-attempts.query.js.map +1 -0
- package/dist/features/runs/queries/impl/get-run-digest.query.js +7 -0
- package/dist/features/runs/queries/impl/get-run-digest.query.js.map +1 -0
- package/dist/features/runs/queries/impl/get-run-events.query.js +7 -0
- package/dist/features/runs/queries/impl/get-run-events.query.js.map +1 -0
- package/dist/features/runs/queries/impl/get-run-progress.query.js +7 -0
- package/dist/features/runs/queries/impl/get-run-progress.query.js.map +1 -0
- package/dist/features/runs/queries/impl/get-run-workflow.query.js +7 -0
- package/dist/features/runs/queries/impl/get-run-workflow.query.js.map +1 -0
- package/dist/features/runs/queries/impl/get-run.query.js +7 -0
- package/dist/features/runs/queries/impl/get-run.query.js.map +1 -0
- package/dist/features/runs/queries/impl/list-runs.query.js +7 -0
- package/dist/features/runs/queries/impl/list-runs.query.js.map +1 -0
- package/dist/features/runs/queries/impl/simulate-route.query.js +7 -0
- package/dist/features/runs/queries/impl/simulate-route.query.js.map +1 -0
- package/dist/features/runs/queries/index.js +15 -0
- package/dist/features/runs/queries/index.js.map +1 -0
- package/dist/features/runs/runs-api.module.js +23 -0
- package/dist/features/runs/runs-api.module.js.map +1 -0
- package/dist/features/runs/runs-api.service.js +79 -0
- package/dist/features/runs/runs-api.service.js.map +1 -0
- package/dist/features/shared/connection.js +39 -0
- package/dist/features/shared/connection.js.map +1 -0
- package/dist/features/system/commands/index.js +2 -0
- package/dist/features/system/commands/index.js.map +1 -0
- package/dist/features/system/queries/handlers/system-query.handlers.js +96 -0
- package/dist/features/system/queries/handlers/system-query.handlers.js.map +1 -0
- package/dist/features/system/queries/impl/doctor.query.js +4 -0
- package/dist/features/system/queries/impl/doctor.query.js.map +1 -0
- package/dist/features/system/queries/impl/get-project.query.js +4 -0
- package/dist/features/system/queries/impl/get-project.query.js.map +1 -0
- package/dist/features/system/queries/impl/get-repository-context.query.js +7 -0
- package/dist/features/system/queries/impl/get-repository-context.query.js.map +1 -0
- package/dist/features/system/queries/impl/get-status.query.js +4 -0
- package/dist/features/system/queries/impl/get-status.query.js.map +1 -0
- package/dist/features/system/queries/impl/validate-repository.query.js +7 -0
- package/dist/features/system/queries/impl/validate-repository.query.js.map +1 -0
- package/dist/features/system/queries/index.js +9 -0
- package/dist/features/system/queries/index.js.map +1 -0
- package/dist/features/system/system-api.module.js +23 -0
- package/dist/features/system/system-api.module.js.map +1 -0
- package/dist/features/system/system-api.service.js +47 -0
- package/dist/features/system/system-api.service.js.map +1 -0
- package/dist/host/daemon.js +99 -0
- package/dist/host/daemon.js.map +1 -0
- package/dist/host/dbos-identity.js +42 -0
- package/dist/host/dbos-identity.js.map +1 -0
- package/dist/host/ensure-host.js +120 -0
- package/dist/host/ensure-host.js.map +1 -0
- package/dist/host/host-runtime.js +90 -0
- package/dist/host/host-runtime.js.map +1 -0
- package/dist/host/host.lifecycle.js +16 -3
- package/dist/host/host.lifecycle.js.map +1 -1
- package/dist/host/queue-ownership.js +70 -0
- package/dist/host/queue-ownership.js.map +1 -0
- package/dist/host/queue-poller-census.js +47 -0
- package/dist/host/queue-poller-census.js.map +1 -0
- package/dist/http/graphql-host.js +56 -0
- package/dist/http/graphql-host.js.map +1 -0
- package/dist/{mcp/mcp.module.js → http/graphql-host.module.js} +12 -10
- package/dist/http/graphql-host.module.js.map +1 -0
- package/dist/infrastructure/metrics/graphql/graphql-metrics.js +91 -0
- package/dist/infrastructure/metrics/graphql/graphql-metrics.js.map +1 -0
- package/dist/mcp/mcp-capabilities.js +9 -1
- package/dist/mcp/mcp-capabilities.js.map +1 -1
- package/dist/mcp/mcp-facade.service.js +68 -5
- package/dist/mcp/mcp-facade.service.js.map +1 -1
- package/dist/mcp/mcp-http.service.js +95 -0
- package/dist/mcp/mcp-http.service.js.map +1 -0
- package/dist/mcp/mcp-tools.js +93 -7
- package/dist/mcp/mcp-tools.js.map +1 -1
- package/dist/observability/agent-activity-reporter.js +185 -0
- package/dist/observability/agent-activity-reporter.js.map +1 -0
- package/dist/observability/agent-observability.service.js +1142 -0
- package/dist/observability/agent-observability.service.js.map +1 -0
- package/dist/observability/index.js +4 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/types.js +11 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/pipeline/await-human.js +8 -4
- package/dist/pipeline/await-human.js.map +1 -1
- package/dist/pipeline/data-driven-task.workflow.js +667 -0
- package/dist/pipeline/data-driven-task.workflow.js.map +1 -0
- package/dist/pipeline/data-driven-template.js +57 -0
- package/dist/pipeline/data-driven-template.js.map +1 -0
- package/dist/pipeline/pipeline.module.js +2 -2
- package/dist/pipeline/pipeline.module.js.map +1 -1
- package/dist/pipeline/pipeline.service.js +412 -0
- package/dist/pipeline/pipeline.service.js.map +1 -0
- package/dist/pipeline/route-contract.js +82 -0
- package/dist/pipeline/route-contract.js.map +1 -0
- package/dist/pipeline-core/index.js +16 -0
- package/dist/pipeline-core/index.js.map +1 -0
- package/dist/pipeline-core/interpret.js +353 -0
- package/dist/pipeline-core/interpret.js.map +1 -0
- package/dist/pipeline-core/kit/assertions.js +61 -0
- package/dist/pipeline-core/kit/assertions.js.map +1 -0
- package/dist/pipeline-core/kit/builders.js +138 -0
- package/dist/pipeline-core/kit/builders.js.map +1 -0
- package/dist/pipeline-core/kit/drive.js +96 -0
- package/dist/pipeline-core/kit/drive.js.map +1 -0
- package/dist/pipeline-core/kit/fixtures.js +342 -0
- package/dist/pipeline-core/kit/fixtures.js.map +1 -0
- package/dist/pipeline-core/kit/index.js +13 -0
- package/dist/pipeline-core/kit/index.js.map +1 -0
- package/dist/pipeline-core/types.js +134 -0
- package/dist/pipeline-core/types.js.map +1 -0
- package/dist/pipeline-core/validate-capability.js +23 -0
- package/dist/pipeline-core/validate-capability.js.map +1 -0
- package/dist/pipeline-core/validate-conflicts.js +37 -0
- package/dist/pipeline-core/validate-conflicts.js.map +1 -0
- package/dist/pipeline-core/validate-dataflow.js +212 -0
- package/dist/pipeline-core/validate-dataflow.js.map +1 -0
- package/dist/pipeline-core/validate-diff.js +158 -0
- package/dist/pipeline-core/validate-diff.js.map +1 -0
- package/dist/pipeline-core/validate-edges.js +44 -0
- package/dist/pipeline-core/validate-edges.js.map +1 -0
- package/dist/pipeline-core/validate-graph.js +123 -0
- package/dist/pipeline-core/validate-graph.js.map +1 -0
- package/dist/pipeline-core/validate-loops.js +226 -0
- package/dist/pipeline-core/validate-loops.js.map +1 -0
- package/dist/pipeline-core/validate-parallel.js +132 -0
- package/dist/pipeline-core/validate-parallel.js.map +1 -0
- package/dist/pipeline-core/validate-sink.js +27 -0
- package/dist/pipeline-core/validate-sink.js.map +1 -0
- package/dist/pipeline-core/validate-topology.js +140 -0
- package/dist/pipeline-core/validate-topology.js.map +1 -0
- package/dist/pipeline-core/validate-verdict.js +72 -0
- package/dist/pipeline-core/validate-verdict.js.map +1 -0
- package/dist/pipeline-core/validate.js +119 -0
- package/dist/pipeline-core/validate.js.map +1 -0
- package/dist/playbook/catalog-loader.js +14 -1
- package/dist/playbook/catalog-loader.js.map +1 -1
- package/dist/playbook/import-mapper.js +14 -38
- package/dist/playbook/import-mapper.js.map +1 -1
- package/dist/playbook/manifest.js +1 -1
- package/dist/revisium/playbooks.service.js +107 -19
- package/dist/revisium/playbooks.service.js.map +1 -1
- package/dist/revisium/roles.service.js +1 -1
- package/dist/revisium/roles.service.js.map +1 -1
- package/dist/revisium/run.service.js +55 -8
- package/dist/revisium/run.service.js.map +1 -1
- package/dist/run/append-event.js +24 -1
- package/dist/run/append-event.js.map +1 -1
- package/dist/run/block-run.js +17 -0
- package/dist/run/block-run.js.map +1 -0
- package/dist/run/complete-run.js +18 -0
- package/dist/run/complete-run.js.map +1 -0
- package/dist/run/create-run.js +33 -36
- package/dist/run/create-run.js.map +1 -1
- package/dist/run/inspect-run.js +31 -30
- package/dist/run/inspect-run.js.map +1 -1
- package/dist/run/run-outputs.js +88 -0
- package/dist/run/run-outputs.js.map +1 -0
- package/dist/run/terminal-run-status.js +66 -7
- package/dist/run/terminal-run-status.js.map +1 -1
- package/dist/runners/claude-code.service.js +5 -0
- package/dist/runners/claude-code.service.js.map +1 -1
- package/dist/runners/codex.service.js +51 -0
- package/dist/runners/codex.service.js.map +1 -0
- package/dist/runners/integrator-branch-naming.js +39 -0
- package/dist/runners/integrator-branch-naming.js.map +1 -0
- package/dist/runners/integrator-git.js +84 -0
- package/dist/runners/integrator-git.js.map +1 -0
- package/dist/runners/integrator-remote.js +34 -0
- package/dist/runners/integrator-remote.js.map +1 -0
- package/dist/runners/integrator-types.js +9 -0
- package/dist/runners/integrator-types.js.map +1 -0
- package/dist/runners/integrator.js +327 -147
- package/dist/runners/integrator.js.map +1 -1
- package/dist/runners/runner.module.js +7 -3
- package/dist/runners/runner.module.js.map +1 -1
- package/dist/runners/worktree.service.js +63 -0
- package/dist/runners/worktree.service.js.map +1 -0
- package/dist/smoke/cli.js +47 -0
- package/dist/smoke/cli.js.map +1 -0
- package/dist/smoke/isolation.js +113 -0
- package/dist/smoke/isolation.js.map +1 -0
- package/dist/task-control-plane/run-watch.service.js +281 -0
- package/dist/task-control-plane/run-watch.service.js.map +1 -0
- package/dist/task-control-plane/task-control-plane-api.service.js +569 -23
- package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -1
- package/dist/task-control-plane/task-control-plane.module.js +22 -3
- package/dist/task-control-plane/task-control-plane.module.js.map +1 -1
- package/dist/worker/artifact-store.js +116 -0
- package/dist/worker/artifact-store.js.map +1 -0
- package/dist/worker/build-context.js +169 -2
- package/dist/worker/build-context.js.map +1 -1
- package/dist/worker/claude-code-runner.js +159 -68
- package/dist/worker/claude-code-runner.js.map +1 -1
- package/dist/worker/codex-runner.js +474 -0
- package/dist/worker/codex-runner.js.map +1 -0
- package/dist/worker/git-worktree-manager.js +129 -65
- package/dist/worker/git-worktree-manager.js.map +1 -1
- package/dist/worker/process-executor.js +23 -2
- package/dist/worker/process-executor.js.map +1 -1
- package/dist/worker/result-envelope.js +115 -57
- package/dist/worker/result-envelope.js.map +1 -1
- package/dist/worker/runner-common.js +106 -0
- package/dist/worker/runner-common.js.map +1 -0
- package/dist/worker/runner-dispatch.js +4 -1
- package/dist/worker/runner-dispatch.js.map +1 -1
- package/dist/worker/runner.js +11 -1
- package/dist/worker/runner.js.map +1 -1
- package/dist/worker/stub-runner.js +7 -45
- package/dist/worker/stub-runner.js.map +1 -1
- package/package.json +32 -7
- package/dist/app.module.js +0 -28
- package/dist/app.module.js.map +0 -1
- package/dist/cli/commands/bootstrap.js +0 -39
- package/dist/cli/commands/bootstrap.js.map +0 -1
- package/dist/cli/commands/dev.js +0 -143
- package/dist/cli/commands/dev.js.map +0 -1
- package/dist/cli/commands/inbox.js +0 -288
- package/dist/cli/commands/inbox.js.map +0 -1
- package/dist/cli/commands/playbook.js +0 -74
- package/dist/cli/commands/playbook.js.map +0 -1
- package/dist/cli/commands/poll-workflow-state.js +0 -144
- package/dist/cli/commands/poll-workflow-state.js.map +0 -1
- package/dist/cli/commands/revisium-context.js +0 -23
- package/dist/cli/commands/revisium-context.js.map +0 -1
- package/dist/cli/commands/revisium.js +0 -89
- package/dist/cli/commands/revisium.js.map +0 -1
- package/dist/cli/commands/run.js +0 -426
- package/dist/cli/commands/run.js.map +0 -1
- package/dist/cli/commands/work.js +0 -149
- package/dist/cli/commands/work.js.map +0 -1
- package/dist/cli/live-guard.js +0 -49
- package/dist/cli/live-guard.js.map +0 -1
- package/dist/cli/needs-host.js +0 -78
- package/dist/cli/needs-host.js.map +0 -1
- package/dist/mcp/mcp-stdio.service.js +0 -48
- package/dist/mcp/mcp-stdio.service.js.map +0 -1
- package/dist/mcp/mcp.module.js.map +0 -1
- package/dist/pipeline/develop-task.workflow.js +0 -497
- package/dist/pipeline/develop-task.workflow.js.map +0 -1
- package/dist/worker/loop.js +0 -122
- package/dist/worker/loop.js.map +0 -1
- package/dist/worker/script-runner.js +0 -28
- package/dist/worker/script-runner.js.map +0 -1
- package/dist/worker/worker-id.js +0 -18
- package/dist/worker/worker-id.js.map +0 -1
- package/dist/worker/worktree-manager.js +0 -7
- package/dist/worker/worktree-manager.js.map +0 -1
|
@@ -1,497 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
-
};
|
|
13
|
-
/**
|
|
14
|
-
* PipelineService — the architect→developer→reviewer→integrator DBOS workflow.
|
|
15
|
-
*
|
|
16
|
-
* INVARIANT: `src/pipeline/*` imports NO `@dbos-inc/dbos-sdk` (M1 — DBOS sealed).
|
|
17
|
-
* All DBOS interaction goes through the generic DbosService verbs.
|
|
18
|
-
*
|
|
19
|
-
* Registration happens in the constructor, BEFORE DBOS.launch() (mirroring dev:ping).
|
|
20
|
-
*
|
|
21
|
-
* 0005 changes:
|
|
22
|
-
* - runnerMode (REQUIRED, durable): 'script' | 'live'. Replaces runnerOverride.
|
|
23
|
-
* Default/missing/invalid → 'script' (fail-safe). --live is the only path to real claude/git/gh.
|
|
24
|
-
* - ClaudeCodeService injected via RUN_AGENT token (replaces throwing stub dep).
|
|
25
|
-
* - IntegratorService injected: runIntegrate (live) + runStub (script) + runPreflight (live).
|
|
26
|
-
* - loadRunTaskContext called once in the workflow body (B6).
|
|
27
|
-
* - Live preflight as a memoized DBOS step (B5/B7): clean + base invariant.
|
|
28
|
-
* - Integrator dispatched on mode: live → integrateFn (DBOS step); script → runStub (pure).
|
|
29
|
-
* - integrate_succeeded event emitted on integrator success (observability MINOR).
|
|
30
|
-
* - Merge gate receives the real prUrl from the integrator result.
|
|
31
|
-
*
|
|
32
|
-
* C1 architecture: the step and workflow bodies are extracted as DBOS-free builder functions
|
|
33
|
-
* (`makeRunStep` / `makeDevelopTask`). PipelineService registers exactly those builders via
|
|
34
|
-
* the engine seam, so tests can import and exercise the SAME production logic directly.
|
|
35
|
-
*/
|
|
36
|
-
import { Injectable, Inject } from '@nestjs/common';
|
|
37
|
-
import { DbosService } from '../engine/dbos.service.js';
|
|
38
|
-
import { RolesService } from '../revisium/roles.service.js';
|
|
39
|
-
import { RunService } from '../revisium/run.service.js';
|
|
40
|
-
import { InboxService } from '../revisium/inbox.service.js';
|
|
41
|
-
import { IntegratorService } from '../runners/integrator.js';
|
|
42
|
-
import { RUN_AGENT } from '../runners/tokens.js';
|
|
43
|
-
import { buildContext } from '../worker/build-context.js';
|
|
44
|
-
import { fnv1a64Hex } from '../control-plane/steps.js';
|
|
45
|
-
import { makeAwaitHuman } from './await-human.js';
|
|
46
|
-
/** Queue name for the dev-tasks WorkflowQueue. */
|
|
47
|
-
const DEV_TASKS_QUEUE = 'dev-tasks';
|
|
48
|
-
/** Concurrency limit for the dev-tasks queue. */
|
|
49
|
-
const DEV_TASKS_CONCURRENCY = 2;
|
|
50
|
-
/**
|
|
51
|
-
* verdictOf — extract the reviewer verdict from an AttemptResult.
|
|
52
|
-
*
|
|
53
|
-
* M2 (COMMITTED): fail-closed — missing/unknown verdict returns 'BLOCKER'.
|
|
54
|
-
* Maps the seeded reviewer prompt vocabulary: APPROVE→PASS, REQUEST_CHANGES→MAJOR.
|
|
55
|
-
* Explicit BLOCKER passes through. PASS and MINOR proceed.
|
|
56
|
-
*
|
|
57
|
-
* 0008 dogfood fix: a real claude reviewer emits its verdict as a FREE-TEXT string that BEGINS
|
|
58
|
-
* with the verdict word (e.g. `"APPROVE — all gates pass…"`, `"REQUEST_CHANGES: …"`), not as a
|
|
59
|
-
* structured `{ verdict: … }` object. The original parser only read `output.verdict` and
|
|
60
|
-
* fail-closed every string output to BLOCKER — so genuine APPROVEs looped to the cap and the
|
|
61
|
-
* pipeline never reached the integrator. We now also recognize the leading token of a string
|
|
62
|
-
* output. Fail-closed is preserved: an object with no known verdict, or a string with no
|
|
63
|
-
* recognized LEADING token, still returns BLOCKER (don't integrate ambiguously-reviewed code).
|
|
64
|
-
*/
|
|
65
|
-
function mapVerdictToken(raw) {
|
|
66
|
-
switch (raw) {
|
|
67
|
-
case 'PASS':
|
|
68
|
-
case 'APPROVE': // seeded reviewer prompt vocabulary mapping
|
|
69
|
-
return 'PASS';
|
|
70
|
-
case 'MINOR':
|
|
71
|
-
return 'MINOR';
|
|
72
|
-
case 'MAJOR':
|
|
73
|
-
case 'REQUEST_CHANGES': // seeded reviewer prompt vocabulary mapping
|
|
74
|
-
return 'MAJOR';
|
|
75
|
-
case 'BLOCKER':
|
|
76
|
-
return 'BLOCKER';
|
|
77
|
-
default:
|
|
78
|
-
return null; // unrecognized
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Extract a verdict from the LEADING token of a free-text reviewer string.
|
|
83
|
-
* Anchored at the start (after trimming) so a verdict word merely *mentioned* mid-sentence
|
|
84
|
-
* (e.g. "REQUEST_CHANGES — the APPROVE criteria are unmet") resolves by the real leading verdict,
|
|
85
|
-
* not an incidental match. Returns null when the string does not start with a known verdict.
|
|
86
|
-
*/
|
|
87
|
-
function verdictFromText(text) {
|
|
88
|
-
const m = /^(APPROVE|REQUEST_CHANGES|BLOCKER|MAJOR|MINOR|PASS)\b/.exec(text.trimStart().toUpperCase());
|
|
89
|
-
return m ? mapVerdictToken(m[1]) : null;
|
|
90
|
-
}
|
|
91
|
-
export function verdictOf(result) {
|
|
92
|
-
const output = result.output;
|
|
93
|
-
// Structured form: { verdict: "…" }.
|
|
94
|
-
if (output !== null && typeof output === 'object') {
|
|
95
|
-
return mapVerdictToken(output.verdict) ?? 'BLOCKER';
|
|
96
|
-
}
|
|
97
|
-
// Free-text form: reviewer emitted a string whose leading token is the verdict.
|
|
98
|
-
if (typeof output === 'string') {
|
|
99
|
-
return verdictFromText(output) ?? 'BLOCKER';
|
|
100
|
-
}
|
|
101
|
-
// Missing/non-parseable output → fail-closed.
|
|
102
|
-
return 'BLOCKER';
|
|
103
|
-
}
|
|
104
|
-
function isBlocking(verdict) {
|
|
105
|
-
return verdict === 'MAJOR' || verdict === 'BLOCKER';
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* makeRunStep — DBOS-free factory for the runStep async function.
|
|
109
|
-
*
|
|
110
|
-
* Returns a plain async function with the same signature as the DBOS step.
|
|
111
|
-
* PipelineService passes this to `dbos.registerStep(...)` so tests can import
|
|
112
|
-
* and call it directly — exercising the SAME code path as production (C1).
|
|
113
|
-
*/
|
|
114
|
-
/** Parse the rework iteration from a stepKey (`developer#2` → 2; `developer` → 0). */
|
|
115
|
-
function iterationOf(stepKey) {
|
|
116
|
-
const hashIdx = stepKey.lastIndexOf('#');
|
|
117
|
-
if (hashIdx < 0)
|
|
118
|
-
return 0;
|
|
119
|
-
const n = Number.parseInt(stepKey.slice(hashIdx + 1), 10);
|
|
120
|
-
return Number.isFinite(n) && n > 0 ? n : 0;
|
|
121
|
-
}
|
|
122
|
-
export function makeRunStep(deps) {
|
|
123
|
-
const { loadRole, loadModelProfile, loadPipelineContext, appendEvent, appendCost, appendAttempt, runAgent } = deps;
|
|
124
|
-
const clock = deps.now ?? (() => Date.now());
|
|
125
|
-
return async function runStepImpl(runId, role, stepKey, stepInput, runnerMode) {
|
|
126
|
-
// 1. Load the canonical role (B1: role is NEVER mutated with #k).
|
|
127
|
-
const loadedRole = await loadRole(role);
|
|
128
|
-
// 2. Load the model profile from the role's modelLevel (B7: not hardcoded 'standard').
|
|
129
|
-
const profile = await loadModelProfile(loadedRole.modelLevel);
|
|
130
|
-
// 3. Build pipeline context: synthesize in-memory Step with real taskId (M3, B6).
|
|
131
|
-
const { da, step } = await loadPipelineContext(runId, role, stepKey, stepInput, profile.level);
|
|
132
|
-
// 4. Build the agent context string.
|
|
133
|
-
const context = await buildContext(da, step, loadedRole);
|
|
134
|
-
// 5. Deterministic, bounded attemptId (B2).
|
|
135
|
-
const attemptId = `attempt_${fnv1a64Hex(`${runId}|${stepKey}`)}`;
|
|
136
|
-
// 6. Apply durable runner mode (M1): live → use role.runner; script → force stub.
|
|
137
|
-
// Missing/invalid mode coerces to 'script' (NEVER live) — fail-safe.
|
|
138
|
-
const effectiveRunner = runnerMode === 'live' ? loadedRole.runner : 'script';
|
|
139
|
-
const dispatchRole = { ...loadedRole, runner: effectiveRunner };
|
|
140
|
-
// 7. Run the agent (timed for the attempt-row duration).
|
|
141
|
-
const startedAt = clock();
|
|
142
|
-
const result = await runAgent({ role: dispatchRole, profile, context, attemptId, step });
|
|
143
|
-
const durationMs = Math.max(0, clock() - startedAt);
|
|
144
|
-
// 8. Persist event to Revisium draft (idempotent — ROW_CONFLICT = no-op on replay).
|
|
145
|
-
await appendEvent({
|
|
146
|
-
runId,
|
|
147
|
-
taskId: step.taskId,
|
|
148
|
-
stepId: step.id,
|
|
149
|
-
stepKey,
|
|
150
|
-
type: 'step_succeeded',
|
|
151
|
-
payload: { output: result.output, role, stepKey, attemptId },
|
|
152
|
-
});
|
|
153
|
-
// 9. Persist cost rows (idempotent by index).
|
|
154
|
-
for (let i = 0; i < result.costs.length; i++) {
|
|
155
|
-
const cost = result.costs[i];
|
|
156
|
-
if (!cost)
|
|
157
|
-
continue;
|
|
158
|
-
await appendCost({
|
|
159
|
-
runId,
|
|
160
|
-
stepId: step.id,
|
|
161
|
-
stepKey,
|
|
162
|
-
attemptId,
|
|
163
|
-
cost,
|
|
164
|
-
index: i,
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
// 10. Persist the per-attempt observability row (0008 #4). Aggregate tokens/cost from the
|
|
168
|
-
// cost records; extract the verdict; redact secrets on store. Idempotent by attemptId.
|
|
169
|
-
// NON-FATAL: the attempts row is pure observability — a write failure (e.g. a control-plane
|
|
170
|
-
// whose attempts schema predates 0008's fields, additionalProperties:false → VALIDATION_FAILURE)
|
|
171
|
-
// must NEVER fail an otherwise-successful agent step. Log and continue.
|
|
172
|
-
const inputTokens = result.costs.reduce((sum, c) => sum + (c?.inputTokens ?? 0), 0);
|
|
173
|
-
const outputTokens = result.costs.reduce((sum, c) => sum + (c?.outputTokens ?? 0), 0);
|
|
174
|
-
const costAmount = result.costs.reduce((sum, c) => sum + (c?.costAmount ?? 0), 0);
|
|
175
|
-
try {
|
|
176
|
-
await appendAttempt({
|
|
177
|
-
runId,
|
|
178
|
-
stepId: step.id,
|
|
179
|
-
attemptId,
|
|
180
|
-
attemptNo: iterationOf(stepKey) + 1,
|
|
181
|
-
iteration: iterationOf(stepKey),
|
|
182
|
-
status: result.needsHuman ? 'awaiting_approval' : 'succeeded',
|
|
183
|
-
modelProfile: step.modelProfile,
|
|
184
|
-
verdict: verdictOf(result),
|
|
185
|
-
inputTokens,
|
|
186
|
-
outputTokens,
|
|
187
|
-
costAmount,
|
|
188
|
-
durationMs,
|
|
189
|
-
output: result.output,
|
|
190
|
-
lesson: result.lesson,
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
catch (err) {
|
|
194
|
-
console.warn(`[pipeline] attempt-row write failed for ${stepKey} (${attemptId}) — observability only, step still succeeds. ` +
|
|
195
|
-
`If this is a schema-drift error, migrate the control-plane attempts table to the 0008 fields. ${String(err)}`);
|
|
196
|
-
}
|
|
197
|
-
return result;
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* makeDevelopTask — DBOS-free factory for the developTask async function.
|
|
202
|
-
*
|
|
203
|
-
* Returns a plain async function with the same signature as the DBOS workflow.
|
|
204
|
-
* Receives the (potentially DBOS-wrapped) `runStepFn` so tests pass the plain builder
|
|
205
|
-
* while production passes the DBOS-registered step — the workflow body is IDENTICAL.
|
|
206
|
-
* PipelineService passes this to `dbos.registerWorkflow(...)` (C1).
|
|
207
|
-
*/
|
|
208
|
-
export function makeDevelopTask(runStepFn, deps) {
|
|
209
|
-
const { appendEvent, awaitHuman, cancelRun, failRun, loadRunTaskContext, loadPipelinePolicy, integrateFn, runStub, preflightFn } = deps;
|
|
210
|
-
return async function developTaskImpl(runId, opts) {
|
|
211
|
-
try {
|
|
212
|
-
return await runDevelopTaskBody(runId, opts);
|
|
213
|
-
}
|
|
214
|
-
catch (err) {
|
|
215
|
-
// TERMINAL step failure (0008 #2): a step threw and propagated to the workflow body. Before
|
|
216
|
-
// re-throwing (so DBOS still records the workflow as ERROR — progress truth is preserved),
|
|
217
|
-
// mark the Revisium run-row `failed` + write a run_failed event so the run-row stops lying.
|
|
218
|
-
// failRun is idempotent (event-first, deterministic id) so DBOS recovery replays are no-ops.
|
|
219
|
-
const reason = err instanceof Error ? err.message : String(err);
|
|
220
|
-
try {
|
|
221
|
-
await failRun(runId, reason);
|
|
222
|
-
}
|
|
223
|
-
catch (failErr) {
|
|
224
|
-
// Never let bookkeeping mask the original failure — log and re-throw the ORIGINAL error.
|
|
225
|
-
console.error(`[pipeline] failRun(${runId}) itself failed: ${String(failErr)}`);
|
|
226
|
-
}
|
|
227
|
-
throw err;
|
|
228
|
-
}
|
|
229
|
-
};
|
|
230
|
-
async function runDevelopTaskBody(runId, opts) {
|
|
231
|
-
// Coerce mode: missing/invalid → 'script' (NEVER 'live' — fail-safe, M1).
|
|
232
|
-
const mode = opts?.runnerMode === 'live' ? 'live' : 'script';
|
|
233
|
-
// B6: resolve task context once at workflow start (deterministic pure read).
|
|
234
|
-
const { taskId, title, base } = await loadRunTaskContext(runId);
|
|
235
|
-
// 0008 #5: pipeline limits are DATA (routing_policy), not hardcoded consts. Loaded once.
|
|
236
|
-
const policy = await loadPipelinePolicy();
|
|
237
|
-
// Run-level cost/token BUDGET (0008 #5): accrue each step's cost; a hard-stop blocks the run
|
|
238
|
-
// (pipeline_blocked, reason 'budget') rather than letting an unbounded loop burn the budget.
|
|
239
|
-
let spentUsd = 0;
|
|
240
|
-
let spentTokens = 0;
|
|
241
|
-
let iteration = 0;
|
|
242
|
-
const accrue = (r) => {
|
|
243
|
-
for (const c of r.costs) {
|
|
244
|
-
if (!c)
|
|
245
|
-
continue;
|
|
246
|
-
spentUsd += c.costAmount ?? 0;
|
|
247
|
-
spentTokens += (c.inputTokens ?? 0) + (c.outputTokens ?? 0);
|
|
248
|
-
}
|
|
249
|
-
};
|
|
250
|
-
const overBudget = () => (policy.budgetUsd > 0 && spentUsd > policy.budgetUsd) ||
|
|
251
|
-
(policy.budgetTokens > 0 && spentTokens > policy.budgetTokens);
|
|
252
|
-
const blockBudget = async () => {
|
|
253
|
-
await appendEvent({
|
|
254
|
-
runId,
|
|
255
|
-
taskId,
|
|
256
|
-
stepId: '',
|
|
257
|
-
stepKey: 'pipeline',
|
|
258
|
-
type: 'pipeline_blocked',
|
|
259
|
-
payload: {
|
|
260
|
-
reason: 'budget',
|
|
261
|
-
spentUsd,
|
|
262
|
-
spentTokens,
|
|
263
|
-
budgetUsd: policy.budgetUsd,
|
|
264
|
-
budgetTokens: policy.budgetTokens,
|
|
265
|
-
},
|
|
266
|
-
});
|
|
267
|
-
return { runId, blocked: true, iterations: iteration, verdict: 'BLOCKED', cancelled: false };
|
|
268
|
-
};
|
|
269
|
-
// runStep — wraps runStepFn to accrue cost so the budget guard sees every step's spend.
|
|
270
|
-
const runStep = async (role, stepKey, input) => {
|
|
271
|
-
const r = await runStepFn(runId, role, stepKey, input, mode);
|
|
272
|
-
accrue(r);
|
|
273
|
-
return r;
|
|
274
|
-
};
|
|
275
|
-
// B5/B7: live preflight — one memoized DBOS step, evaluated exactly once.
|
|
276
|
-
// Skipped entirely on script/stub runs (no git, no cost, no mutation beyond fetch).
|
|
277
|
-
if (mode === 'live') {
|
|
278
|
-
const pf = await preflightFn(taskId, base);
|
|
279
|
-
if ('needsHuman' in pf) {
|
|
280
|
-
await appendEvent({
|
|
281
|
-
runId,
|
|
282
|
-
taskId,
|
|
283
|
-
stepId: '',
|
|
284
|
-
stepKey: 'pipeline',
|
|
285
|
-
type: 'pipeline_blocked',
|
|
286
|
-
payload: { reason: 'preflight', lesson: pf.lesson },
|
|
287
|
-
});
|
|
288
|
-
return { runId, blocked: true, iterations: 0, verdict: 'BLOCKED', cancelled: false };
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
// architect step
|
|
292
|
-
const architectResult = await runStep('architect', 'architect', { phase: 'plan' });
|
|
293
|
-
if (overBudget())
|
|
294
|
-
return await blockBudget();
|
|
295
|
-
// ── PLAN GATE (after architect, before developer) ──────────────────────────
|
|
296
|
-
const planDecision = await awaitHuman(runId, 'plan', 'Plan approval', architectResult.output);
|
|
297
|
-
if (planDecision.decision === 'reject') {
|
|
298
|
-
await appendEvent({
|
|
299
|
-
runId,
|
|
300
|
-
taskId: '',
|
|
301
|
-
stepId: '',
|
|
302
|
-
stepKey: 'gate:plan',
|
|
303
|
-
type: 'gate_rejected',
|
|
304
|
-
payload: { topic: 'plan' },
|
|
305
|
-
});
|
|
306
|
-
await cancelRun(runId, { actor: 'pipeline', source: 'plan-gate-reject' });
|
|
307
|
-
return { runId, blocked: false, iterations: 0, verdict: 'CANCELLED', cancelled: true };
|
|
308
|
-
}
|
|
309
|
-
// ── end PLAN GATE ──────────────────────────────────────────────────────────
|
|
310
|
-
// developer step (first pass)
|
|
311
|
-
let developerResult = await runStep('developer', 'developer', {
|
|
312
|
-
phase: 'implement',
|
|
313
|
-
from: architectResult.output,
|
|
314
|
-
});
|
|
315
|
-
if (overBudget())
|
|
316
|
-
return await blockBudget();
|
|
317
|
-
// reviewer step (first pass)
|
|
318
|
-
let reviewResult = await runStep('reviewer', 'reviewer', {
|
|
319
|
-
phase: 'review',
|
|
320
|
-
from: developerResult.output,
|
|
321
|
-
});
|
|
322
|
-
if (overBudget())
|
|
323
|
-
return await blockBudget();
|
|
324
|
-
// bounded reviewer→developer loop (E5, E6); iteration cap is DATA (0008 #5).
|
|
325
|
-
// Budget is checked after EVERY step so a hard-stop fires before the NEXT agent call burns spend.
|
|
326
|
-
while (isBlocking(verdictOf(reviewResult)) && iteration < policy.maxReviewIterations) {
|
|
327
|
-
iteration++;
|
|
328
|
-
developerResult = await runStep('developer', `developer#${iteration}`, {
|
|
329
|
-
phase: 'rework',
|
|
330
|
-
feedback: reviewResult.output,
|
|
331
|
-
});
|
|
332
|
-
if (overBudget())
|
|
333
|
-
return await blockBudget();
|
|
334
|
-
reviewResult = await runStep('reviewer', `reviewer#${iteration}`, {
|
|
335
|
-
phase: 'review',
|
|
336
|
-
from: developerResult.output,
|
|
337
|
-
});
|
|
338
|
-
if (overBudget())
|
|
339
|
-
return await blockBudget();
|
|
340
|
-
}
|
|
341
|
-
// Cap exhausted — still blocking: write pipeline_blocked and stop (E6).
|
|
342
|
-
if (isBlocking(verdictOf(reviewResult))) {
|
|
343
|
-
await appendEvent({
|
|
344
|
-
runId,
|
|
345
|
-
taskId: '',
|
|
346
|
-
stepId: '',
|
|
347
|
-
stepKey: 'pipeline',
|
|
348
|
-
type: 'pipeline_blocked',
|
|
349
|
-
payload: { lastVerdict: verdictOf(reviewResult), iterations: iteration },
|
|
350
|
-
});
|
|
351
|
-
return {
|
|
352
|
-
runId,
|
|
353
|
-
blocked: true,
|
|
354
|
-
iterations: iteration,
|
|
355
|
-
verdict: verdictOf(reviewResult),
|
|
356
|
-
cancelled: false,
|
|
357
|
-
};
|
|
358
|
-
}
|
|
359
|
-
// B3 — mode-gated integrator step (core Round-4 fix).
|
|
360
|
-
// live → DBOS-registered integrateFn (real git/gh, resumable).
|
|
361
|
-
// script → runStub (pure, zero external effects — no git, no gh, no fs).
|
|
362
|
-
const integratorInput = { runId, taskId, title, base };
|
|
363
|
-
const integratorResult = mode === 'live'
|
|
364
|
-
? await integrateFn(integratorInput)
|
|
365
|
-
: runStub(integratorInput);
|
|
366
|
-
// On integrator blocked (live only — nothing to integrate / ambiguous PR / missing remote)
|
|
367
|
-
if ('needsHuman' in integratorResult) {
|
|
368
|
-
await appendEvent({
|
|
369
|
-
runId,
|
|
370
|
-
taskId,
|
|
371
|
-
stepId: '',
|
|
372
|
-
stepKey: 'pipeline',
|
|
373
|
-
type: 'pipeline_blocked',
|
|
374
|
-
payload: { reason: 'integrate', lesson: integratorResult.lesson },
|
|
375
|
-
});
|
|
376
|
-
return { runId, blocked: true, iterations: iteration, verdict: 'BLOCKED', cancelled: false };
|
|
377
|
-
}
|
|
378
|
-
// Observability MINOR: integrate_succeeded event (mirrors step_succeeded at makeRunStep).
|
|
379
|
-
await appendEvent({
|
|
380
|
-
runId,
|
|
381
|
-
taskId,
|
|
382
|
-
stepId: '',
|
|
383
|
-
stepKey: 'integrator',
|
|
384
|
-
type: 'integrate_succeeded',
|
|
385
|
-
payload: {
|
|
386
|
-
prUrl: integratorResult.prUrl,
|
|
387
|
-
branch: integratorResult.branch,
|
|
388
|
-
prNumber: integratorResult.prNumber,
|
|
389
|
-
},
|
|
390
|
-
});
|
|
391
|
-
// ── MERGE GATE (after integrator) ──────────────────────────────────────────
|
|
392
|
-
// Real prUrl from the integrator (live) or 'stub://pr/placeholder' (script).
|
|
393
|
-
const prUrl = integratorResult.prUrl ?? 'stub://pr/placeholder';
|
|
394
|
-
const mergeDecision = await awaitHuman(runId, 'merge', 'Merge approval', { prUrl });
|
|
395
|
-
if (mergeDecision.decision === 'reject') {
|
|
396
|
-
await appendEvent({
|
|
397
|
-
runId,
|
|
398
|
-
taskId: '',
|
|
399
|
-
stepId: '',
|
|
400
|
-
stepKey: 'gate:merge',
|
|
401
|
-
type: 'gate_rejected',
|
|
402
|
-
payload: { topic: 'merge' },
|
|
403
|
-
});
|
|
404
|
-
}
|
|
405
|
-
// ── end MERGE GATE ─────────────────────────────────────────────────────────
|
|
406
|
-
return {
|
|
407
|
-
runId,
|
|
408
|
-
blocked: false,
|
|
409
|
-
iterations: iteration,
|
|
410
|
-
verdict: verdictOf(reviewResult),
|
|
411
|
-
cancelled: false,
|
|
412
|
-
};
|
|
413
|
-
}
|
|
414
|
-
;
|
|
415
|
-
}
|
|
416
|
-
let PipelineService = class PipelineService {
|
|
417
|
-
dbos;
|
|
418
|
-
rolesService;
|
|
419
|
-
runService;
|
|
420
|
-
inboxService;
|
|
421
|
-
integratorService;
|
|
422
|
-
/** Registered DBOS-wrapped function types. */
|
|
423
|
-
runStepFn;
|
|
424
|
-
developTaskFn;
|
|
425
|
-
/** The single run-agent used by all steps. */
|
|
426
|
-
runAgent;
|
|
427
|
-
constructor(dbos, rolesService, runService, inboxService, integratorService, runAgentToken) {
|
|
428
|
-
this.dbos = dbos;
|
|
429
|
-
this.rolesService = rolesService;
|
|
430
|
-
this.runService = runService;
|
|
431
|
-
this.inboxService = inboxService;
|
|
432
|
-
this.integratorService = integratorService;
|
|
433
|
-
this.runAgent = runAgentToken;
|
|
434
|
-
// Capture bound dep methods (S7740: no `this`-aliasing in closures).
|
|
435
|
-
const stepDeps = {
|
|
436
|
-
loadRole: this.rolesService.loadRole.bind(this.rolesService),
|
|
437
|
-
loadModelProfile: this.rolesService.loadModelProfile.bind(this.rolesService),
|
|
438
|
-
loadPipelineContext: this.runService.loadPipelineContext.bind(this.runService),
|
|
439
|
-
appendEvent: this.runService.appendEvent.bind(this.runService),
|
|
440
|
-
appendCost: this.runService.appendCost.bind(this.runService),
|
|
441
|
-
appendAttempt: this.runService.appendAttempt.bind(this.runService),
|
|
442
|
-
runAgent: this.runAgent,
|
|
443
|
-
};
|
|
444
|
-
// Register the step using the production builder (must happen BEFORE DBOS.launch()).
|
|
445
|
-
this.runStepFn = this.dbos.registerStep('PipelineService.runStep', makeRunStep(stepDeps));
|
|
446
|
-
// Register the REAL integrator as a DBOS step (M6/B7: .bind so `this` survives registration).
|
|
447
|
-
const integrateFn = this.dbos.registerStep('PipelineService.integrate', this.integratorService.runIntegrate.bind(this.integratorService));
|
|
448
|
-
// Register the live preflight as a memoized DBOS step (B5/B7).
|
|
449
|
-
const preflightFn = this.dbos.registerStep('PipelineService.preflightLive', this.integratorService.runPreflight.bind(this.integratorService));
|
|
450
|
-
// Build the awaitHuman factory — DBOS-free, depends on injected service verbs.
|
|
451
|
-
const awaitHuman = makeAwaitHuman({
|
|
452
|
-
pushInbox: (item, id) => this.inboxService.pushInbox(item, { id }),
|
|
453
|
-
awaitDecision: (topic) => this.dbos.awaitDecision(topic),
|
|
454
|
-
appendEvent: stepDeps.appendEvent,
|
|
455
|
-
});
|
|
456
|
-
const workflowDeps = {
|
|
457
|
-
appendEvent: stepDeps.appendEvent,
|
|
458
|
-
awaitHuman,
|
|
459
|
-
cancelRun: (runId, cancelOpts) => this.runService.cancelRun(runId, cancelOpts),
|
|
460
|
-
failRun: (runId, reason) => this.runService.failRun(runId, reason),
|
|
461
|
-
loadRunTaskContext: this.runService.loadRunTaskContext.bind(this.runService),
|
|
462
|
-
loadPipelinePolicy: this.rolesService.loadPipelinePolicy.bind(this.rolesService),
|
|
463
|
-
integrateFn,
|
|
464
|
-
runStub: this.integratorService.runStub,
|
|
465
|
-
preflightFn,
|
|
466
|
-
};
|
|
467
|
-
// Register the workflow using the production builder with the DBOS-wrapped step.
|
|
468
|
-
this.developTaskFn = this.dbos.registerWorkflow('PipelineService.developTask', makeDevelopTask(this.runStepFn, workflowDeps));
|
|
469
|
-
// Register the WorkflowQueue (idempotent — Map-guarded in DbosService).
|
|
470
|
-
this.dbos.registerQueue(DEV_TASKS_QUEUE, { concurrency: DEV_TASKS_CONCURRENCY });
|
|
471
|
-
}
|
|
472
|
-
/**
|
|
473
|
-
* Enqueue the developTask workflow for the given runId.
|
|
474
|
-
*
|
|
475
|
-
* Idempotent by workflowID=runId: re-starting the same runId returns the existing handle.
|
|
476
|
-
* opts.runnerMode is required and forwarded as a durable workflow argument (M1/B11) —
|
|
477
|
-
* persisted in the DBOS workflow input row, re-supplied verbatim on crash recovery.
|
|
478
|
-
*
|
|
479
|
-
* B10: mode only takes effect on the FIRST start (idempotent-by-runId);
|
|
480
|
-
* a second `run start` on an already-started run returns the existing handle
|
|
481
|
-
* and does NOT switch the runner. To switch, create a NEW run.
|
|
482
|
-
*/
|
|
483
|
-
startDevelopTask(runId, opts) {
|
|
484
|
-
return this.dbos.startWorkflowOn(this.developTaskFn, runId, DEV_TASKS_QUEUE, runId, opts);
|
|
485
|
-
}
|
|
486
|
-
};
|
|
487
|
-
PipelineService = __decorate([
|
|
488
|
-
Injectable(),
|
|
489
|
-
__param(5, Inject(RUN_AGENT)),
|
|
490
|
-
__metadata("design:paramtypes", [DbosService,
|
|
491
|
-
RolesService,
|
|
492
|
-
RunService,
|
|
493
|
-
InboxService,
|
|
494
|
-
IntegratorService, Function])
|
|
495
|
-
], PipelineService);
|
|
496
|
-
export { PipelineService };
|
|
497
|
-
//# sourceMappingURL=develop-task.workflow.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"develop-task.workflow.js","sourceRoot":"","sources":["../../src/pipeline/develop-task.workflow.ts"],"names":[],"mappings":"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"}
|
package/dist/worker/loop.js
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { claimNextStep, startAttempt, writeResult, createSteps, failStep, recoverInFlight, compactStamp, } from '../control-plane/steps.js';
|
|
3
|
-
import { buildContext } from './build-context.js';
|
|
4
|
-
async function processClaimedStep(deps, workerId, step) {
|
|
5
|
-
const { da, loadRole, loadModelProfile, runAgent } = deps;
|
|
6
|
-
const role = await loadRole(step.role);
|
|
7
|
-
const profile = await loadModelProfile(role.modelLevel);
|
|
8
|
-
const context = await buildContext(da, step, role);
|
|
9
|
-
const { attemptId } = await startAttempt(da, step, { workerId, modelProfile: profile.modelId });
|
|
10
|
-
try {
|
|
11
|
-
const result = await runAgent({ role, profile, context, attemptId, step });
|
|
12
|
-
return { attemptId, result };
|
|
13
|
-
}
|
|
14
|
-
catch (err) {
|
|
15
|
-
await failStep(da, step, attemptId, {
|
|
16
|
-
lesson: err instanceof Error ? err.message : String(err),
|
|
17
|
-
error: err instanceof Error ? (err.stack ?? err.message) : String(err),
|
|
18
|
-
});
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
async function handleResult(da, step, attemptId, result) {
|
|
23
|
-
if (result.needsHuman) {
|
|
24
|
-
await parkForHuman(da, step, attemptId, result);
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
const nextSteps = result.nextSteps.map((ns) => ({ ...ns, runId: step.runId }));
|
|
28
|
-
// createSteps runs BEFORE writeResult makes the parent terminal. Child IDs are a bounded,
|
|
29
|
-
// deterministic hash of (parent id + index), so a retry regenerates the same IDs and
|
|
30
|
-
// createSteps' idempotency check skips existing rows.
|
|
31
|
-
//
|
|
32
|
-
// createSteps failures (e.g. Revisium rejecting an invalid next step) are pre-terminal and
|
|
33
|
-
// SAFE to fail gracefully: nothing has been finalized yet, so failStep lets the step back off
|
|
34
|
-
// / go dead instead of crashing the worker. writeResult is DIFFERENT — it mutates several rows
|
|
35
|
-
// (attempt close, event, cost, then the step), so a partial failure must NOT be routed through
|
|
36
|
-
// failStep (that would mark a half-written step failed). We let writeResult errors propagate:
|
|
37
|
-
// the step stays 'running' → recoverInFlight resets it on the next start → idempotent retry.
|
|
38
|
-
try {
|
|
39
|
-
await createSteps(da, nextSteps, { parentStepId: step.id });
|
|
40
|
-
}
|
|
41
|
-
catch (err) {
|
|
42
|
-
await failStep(da, step, attemptId, {
|
|
43
|
-
lesson: err instanceof Error ? err.message : String(err),
|
|
44
|
-
error: err instanceof Error ? (err.stack ?? err.message) : String(err),
|
|
45
|
-
});
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
await writeResult(da, step, attemptId, result.output, result.costs);
|
|
49
|
-
}
|
|
50
|
-
export function sleep(ms, signal) {
|
|
51
|
-
return new Promise((resolve) => {
|
|
52
|
-
const onAbort = () => { clearTimeout(timer); resolve(); };
|
|
53
|
-
const timer = setTimeout(() => {
|
|
54
|
-
signal?.removeEventListener('abort', onAbort);
|
|
55
|
-
resolve();
|
|
56
|
-
}, ms);
|
|
57
|
-
signal?.addEventListener('abort', onAbort, { once: true });
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
async function parkForHuman(da, step, attemptId, result) {
|
|
61
|
-
const now = new Date();
|
|
62
|
-
const nowIso = now.toISOString();
|
|
63
|
-
const st = compactStamp(now);
|
|
64
|
-
const sfx = randomUUID().replaceAll('-', '').slice(0, 8);
|
|
65
|
-
// Close the attempt so it is no longer 'running' while the step waits for a human.
|
|
66
|
-
await da.patchRow('attempts', attemptId, [
|
|
67
|
-
{ op: 'replace', path: 'status', value: 'paused' },
|
|
68
|
-
{ op: 'replace', path: 'finished_at', value: nowIso },
|
|
69
|
-
]);
|
|
70
|
-
// Minimal inbox parking: mark step awaiting_approval, clear lease, append event.
|
|
71
|
-
// Full pushInbox (inbox row creation + resolution workflow) is deferred.
|
|
72
|
-
await da.patchRow('steps', step.id, [
|
|
73
|
-
{ op: 'replace', path: 'status', value: 'awaiting_approval' },
|
|
74
|
-
{ op: 'replace', path: 'lease_owner', value: '' },
|
|
75
|
-
{ op: 'replace', path: 'lease_expires_at', value: '' },
|
|
76
|
-
{ op: 'replace', path: 'updated_at', value: nowIso },
|
|
77
|
-
]);
|
|
78
|
-
await da.createRow('events', `event_${st}_step-needs-human_${sfx}`, {
|
|
79
|
-
id: `event_${st}_step-needs-human_${sfx}`,
|
|
80
|
-
run_id: step.runId,
|
|
81
|
-
task_id: step.taskId,
|
|
82
|
-
step_id: step.id,
|
|
83
|
-
type: 'step_needs_human',
|
|
84
|
-
payload: { attempt_id: attemptId, lesson: result.lesson },
|
|
85
|
-
actor: 'orchestrator',
|
|
86
|
-
created_at: nowIso,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
async function runNextStep(deps, workerId, roles) {
|
|
90
|
-
const { da } = deps;
|
|
91
|
-
const step = await claimNextStep(da, workerId, roles);
|
|
92
|
-
if (!step)
|
|
93
|
-
return 'idle';
|
|
94
|
-
const processed = await processClaimedStep(deps, workerId, step);
|
|
95
|
-
if (!processed)
|
|
96
|
-
return 'failed';
|
|
97
|
-
await handleResult(da, step, processed.attemptId, processed.result);
|
|
98
|
-
return 'completed';
|
|
99
|
-
}
|
|
100
|
-
export async function runWorker(deps, opts) {
|
|
101
|
-
const { da } = deps;
|
|
102
|
-
const { workerId, roles, once, idleSleepMs = 5000, maxCycles, signal } = opts;
|
|
103
|
-
if (!Number.isFinite(idleSleepMs) || idleSleepMs < 0) {
|
|
104
|
-
throw new Error(`idleSleepMs must be a non-negative finite number, got: ${String(idleSleepMs)}`);
|
|
105
|
-
}
|
|
106
|
-
await recoverInFlight(da, workerId);
|
|
107
|
-
let cycles = 0;
|
|
108
|
-
while (true) {
|
|
109
|
-
if (signal?.aborted)
|
|
110
|
-
break;
|
|
111
|
-
if (maxCycles !== undefined && cycles >= maxCycles)
|
|
112
|
-
break;
|
|
113
|
-
const outcome = await runNextStep(deps, workerId, roles);
|
|
114
|
-
if (outcome !== 'idle')
|
|
115
|
-
cycles++;
|
|
116
|
-
if (once)
|
|
117
|
-
break;
|
|
118
|
-
if (outcome === 'idle')
|
|
119
|
-
await sleep(idleSleepMs, signal);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=loop.js.map
|
package/dist/worker/loop.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/worker/loop.ts"],"names":[],"mappings":"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"}
|