@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
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { PLAYBOOK_SOURCE } from './env.js';
|
|
3
|
+
import { waitForGate } from './drive.js';
|
|
4
|
+
/** Playbook id installed by {@link givenInstalledPlaybook}. */
|
|
5
|
+
export const PLAYBOOK_ID = 'revisium-agent-playbook';
|
|
6
|
+
/**
|
|
7
|
+
* Playbook id of the BUILT-IN DEFAULT playbook (slice 5) that `revo bootstrap` seeds out-of-the-box.
|
|
8
|
+
* Distinct from {@link PLAYBOOK_ID} (the e2e fixture) — Group M targets THIS to prove the shipped default.
|
|
9
|
+
*/
|
|
10
|
+
export const DEFAULT_PLAYBOOK_ID = 'revisium-default';
|
|
11
|
+
const STUB_OVERRIDE = { runnerOverrides: { 'claude-code': 'stub-agent' } };
|
|
12
|
+
/** Stub BOTH the agent and the (script) integrator — a self-contained run with no real git/gh. */
|
|
13
|
+
const STUB_OVERRIDE_FULL = { runnerOverrides: { 'claude-code': 'stub-agent', 'revo-integrator': 'stub-agent' } };
|
|
14
|
+
/**
|
|
15
|
+
* Create + start a run on the SEEDED DEFAULT playbook's `feature-development` pipeline (slice 5). Both
|
|
16
|
+
* the agent and the integrator are stubbed so the run reaches the plan + merge gates without real
|
|
17
|
+
* claude/git/gh; the default `feature-development` routes top-level domain verdicts past both the
|
|
18
|
+
* code-review and post-integrator-watcher routers, so the deterministic agent drives it to completion.
|
|
19
|
+
*/
|
|
20
|
+
export async function startDefaultFeatureRun(h, repo = process.cwd()) {
|
|
21
|
+
const created = await h.api.createRun({
|
|
22
|
+
repo,
|
|
23
|
+
title: 'E2E seeded default feature-development run',
|
|
24
|
+
description: 'Group M — the bootstrap-SEEDED default pipeline on real DBOS/Revisium.',
|
|
25
|
+
scope: 'seeded-default e2e',
|
|
26
|
+
playbookId: DEFAULT_PLAYBOOK_ID,
|
|
27
|
+
pipelineId: 'feature-development',
|
|
28
|
+
executionProfile: STUB_OVERRIDE_FULL,
|
|
29
|
+
start: true,
|
|
30
|
+
});
|
|
31
|
+
if (!('workflow' in created))
|
|
32
|
+
throw new Error('start:true must return workflow metadata');
|
|
33
|
+
return created;
|
|
34
|
+
}
|
|
35
|
+
/** Create + start a run on the SEEDED DEFAULT playbook's `local-change` pipeline (developer-only, no gate). */
|
|
36
|
+
export async function startDefaultLocalChangeRun(h, repo = process.cwd()) {
|
|
37
|
+
const created = await h.api.createRun({
|
|
38
|
+
repo,
|
|
39
|
+
title: 'E2E seeded default local-change run',
|
|
40
|
+
description: 'Group M — the bootstrap-SEEDED local-change pipeline on real DBOS/Revisium.',
|
|
41
|
+
scope: 'seeded-default e2e',
|
|
42
|
+
playbookId: DEFAULT_PLAYBOOK_ID,
|
|
43
|
+
pipelineId: 'local-change',
|
|
44
|
+
executionProfile: STUB_OVERRIDE,
|
|
45
|
+
start: true,
|
|
46
|
+
});
|
|
47
|
+
if (!('workflow' in created))
|
|
48
|
+
throw new Error('start:true must return workflow metadata');
|
|
49
|
+
return created;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Install the agent playbook into the control-plane (roles + pipelines).
|
|
53
|
+
*
|
|
54
|
+
* The control-plane is shared across e2e files (and persists between local runs). On a fresh
|
|
55
|
+
* control-plane the first caller installs + commits it; a later caller re-committing the same
|
|
56
|
+
* playbook fails with "revision is not a draft" (a benign no-op), which we swallow. Any other
|
|
57
|
+
* failure is re-thrown. NB: a seeded pipeline is NOT proof the playbook is installed (bootstrap
|
|
58
|
+
* seeds pipeline rows), so we must not gate on getPipeline — we install and tolerate re-install.
|
|
59
|
+
*/
|
|
60
|
+
export async function givenInstalledPlaybook(h) {
|
|
61
|
+
// `listPlaybooks` is the accurate presence signal: bootstrap seeds pipeline/role rows but NOT a
|
|
62
|
+
// playbook record, so this is empty until installed. Shared control-plane + sequential files →
|
|
63
|
+
// the first run installs once, the rest skip (no redundant commit, no race).
|
|
64
|
+
const installed = await h.api.listPlaybooks();
|
|
65
|
+
if (installed.some((p) => p.id === PLAYBOOK_ID))
|
|
66
|
+
return;
|
|
67
|
+
try {
|
|
68
|
+
const install = await h.api.installPlaybook({ source: PLAYBOOK_SOURCE, name: PLAYBOOK_ID, commit: true });
|
|
69
|
+
assert.equal(install.playbookId, PLAYBOOK_ID);
|
|
70
|
+
assert.ok(install.roles > 0, 'playbook install must load roles');
|
|
71
|
+
assert.ok(install.pipelines > 0, 'playbook install must load pipelines');
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
// Belt-and-suspenders: tolerate a concurrent/duplicate commit ("revision is not a draft");
|
|
75
|
+
// re-throw anything that is not an already-installed signal.
|
|
76
|
+
if (!/not a draft|already|nothing to commit|ROW_CONFLICT/i.test(String(err)))
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Ensure the BUILT-IN DEFAULT playbook (slice 5) is installed. `revo bootstrap` seeds it
|
|
82
|
+
* out-of-the-box (so a fresh e2e control-plane already has it), but a REUSED test home that predates
|
|
83
|
+
* this slice may not — so this self-heals by installing from the committed source if absent. It does
|
|
84
|
+
* NOT install the e2e fixture: Group M tests the SHIPPED default, distinct from {@link PLAYBOOK_ID}.
|
|
85
|
+
*/
|
|
86
|
+
export async function givenSeededDefaultPlaybook(h) {
|
|
87
|
+
const installed = await h.api.listPlaybooks();
|
|
88
|
+
if (installed.some((p) => p.id === DEFAULT_PLAYBOOK_ID))
|
|
89
|
+
return;
|
|
90
|
+
const { repoRoot } = await import('../../config.js');
|
|
91
|
+
const { join } = await import('node:path');
|
|
92
|
+
const source = join(repoRoot, 'control-plane', 'default-playbook');
|
|
93
|
+
try {
|
|
94
|
+
const install = await h.api.installPlaybook({ source, name: DEFAULT_PLAYBOOK_ID, commit: true });
|
|
95
|
+
assert.equal(install.playbookId, DEFAULT_PLAYBOOK_ID);
|
|
96
|
+
assert.ok(install.pipelines >= 2, 'default playbook install must load the seeded pipelines');
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
if (!/not a draft|already|nothing to commit|ROW_CONFLICT/i.test(String(err)))
|
|
100
|
+
throw err;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Create + start a `local-change` run (developer-only, stub agent). Returns the started run. */
|
|
104
|
+
export async function startLocalChangeRun(h, repo = process.cwd()) {
|
|
105
|
+
const created = await h.api.createRun({
|
|
106
|
+
repo,
|
|
107
|
+
title: 'E2E local-change deterministic agent',
|
|
108
|
+
description: 'Real DBOS/Revisium run; deterministic test agent replaces claude-code only.',
|
|
109
|
+
scope: 'No source changes.',
|
|
110
|
+
playbookId: PLAYBOOK_ID,
|
|
111
|
+
pipelineId: 'local-change',
|
|
112
|
+
executionProfile: STUB_OVERRIDE,
|
|
113
|
+
start: true,
|
|
114
|
+
});
|
|
115
|
+
if (!('workflow' in created))
|
|
116
|
+
throw new Error('start:true must return workflow metadata');
|
|
117
|
+
return created;
|
|
118
|
+
}
|
|
119
|
+
/** Create + start a `feature-development` run against `target`, registering the developer write. */
|
|
120
|
+
export async function startFeatureRun(h, target) {
|
|
121
|
+
const created = await h.api.createRun({
|
|
122
|
+
repo: target.worktree,
|
|
123
|
+
title: 'E2E feature-development deterministic agent',
|
|
124
|
+
description: 'Real DBOS/Revisium gates, real git integrator, deterministic agent and fake GitHub.',
|
|
125
|
+
scope: 'Only mutate the temporary e2e target repository.',
|
|
126
|
+
playbookId: PLAYBOOK_ID,
|
|
127
|
+
pipelineId: 'feature-development',
|
|
128
|
+
executionProfile: STUB_OVERRIDE,
|
|
129
|
+
start: true,
|
|
130
|
+
});
|
|
131
|
+
if (!('workflow' in created))
|
|
132
|
+
throw new Error('start:true must return workflow metadata');
|
|
133
|
+
h.developerWrites.set(created.runId, target.worktree);
|
|
134
|
+
return created;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create + start a feature run with BOTH the agent and the integrator stubbed (script mode — no git
|
|
138
|
+
* or gh). Used by the durability/recovery suite where integration is irrelevant and the run must
|
|
139
|
+
* reach plan + merge gates and complete without external effects. `target` is only a valid repo path
|
|
140
|
+
* (the stub integrator never touches it). Does NOT register a developer write (stub integrate ignores it).
|
|
141
|
+
*/
|
|
142
|
+
export async function startStubbedFeatureRun(h, target) {
|
|
143
|
+
const created = await h.api.createRun({
|
|
144
|
+
repo: target.worktree,
|
|
145
|
+
title: 'E2E recovery feature run',
|
|
146
|
+
description: 'Group F — durability/crash-recovery (stubbed agent + integrator).',
|
|
147
|
+
scope: 'recovery e2e',
|
|
148
|
+
playbookId: PLAYBOOK_ID,
|
|
149
|
+
pipelineId: 'feature-development',
|
|
150
|
+
executionProfile: { runnerOverrides: { 'claude-code': 'stub-agent', 'revo-integrator': 'stub-agent' } },
|
|
151
|
+
start: true,
|
|
152
|
+
});
|
|
153
|
+
if (!('workflow' in created))
|
|
154
|
+
throw new Error('start:true must return workflow metadata');
|
|
155
|
+
return { runId: created.runId, taskId: created.taskId };
|
|
156
|
+
}
|
|
157
|
+
/** Pipeline id of the DATA-DRIVEN feature pipeline (0015 slice 2) — embeds a state-machine template. */
|
|
158
|
+
export const DATA_DRIVEN_PIPELINE = 'feature-development-dd';
|
|
159
|
+
/**
|
|
160
|
+
* Create + start a DATA-DRIVEN feature run (0015 slice 2) against `target`. Routes to the
|
|
161
|
+
* data-driven DBOS adapter (the pipeline carries a template_json), with the agent + integrator stubbed
|
|
162
|
+
* so the run reaches the plan + merge gates without real git/gh. `spec` is registered (when provided)
|
|
163
|
+
* BEFORE start so the scripted agent reads this run's per-node verdicts (needs a routedScriptedAgent
|
|
164
|
+
* harness). The data-driven watcher node routes on a `clean` DOMAIN verdict — the caller scripts it.
|
|
165
|
+
*/
|
|
166
|
+
export async function startDataDrivenRun(h, target, specs, spec) {
|
|
167
|
+
const created = await h.api.createRun({
|
|
168
|
+
repo: target.worktree,
|
|
169
|
+
title: 'E2E data-driven feature run',
|
|
170
|
+
description: 'Group L — data-driven pipeline (pipeline-core graph) on real DBOS.',
|
|
171
|
+
scope: 'data-driven e2e',
|
|
172
|
+
playbookId: PLAYBOOK_ID,
|
|
173
|
+
pipelineId: DATA_DRIVEN_PIPELINE,
|
|
174
|
+
executionProfile: { runnerOverrides: { 'claude-code': 'stub-agent', 'revo-integrator': 'stub-agent' } },
|
|
175
|
+
start: false,
|
|
176
|
+
});
|
|
177
|
+
if (specs && spec)
|
|
178
|
+
specs.set(created.runId, spec);
|
|
179
|
+
const started = await h.api.startRun({ runId: created.runId });
|
|
180
|
+
return { runId: created.runId, taskId: created.taskId, started };
|
|
181
|
+
}
|
|
182
|
+
/** Feature run driven to the `plan` gate (parked, awaiting decision). */
|
|
183
|
+
export async function givenFeatureRunAtPlanGate(h, target) {
|
|
184
|
+
const run = await startFeatureRun(h, target);
|
|
185
|
+
const gate = await waitForGate(h.api, run.runId, 'plan');
|
|
186
|
+
return { runId: run.runId, taskId: run.taskId, inboxId: gate.inboxId };
|
|
187
|
+
}
|
|
188
|
+
/** Feature run with `plan` approved, driven to the `merge` gate (parked, awaiting decision). */
|
|
189
|
+
export async function givenFeatureRunAtMergeGate(h, target) {
|
|
190
|
+
const run = await startFeatureRun(h, target);
|
|
191
|
+
const plan = await waitForGate(h.api, run.runId, 'plan');
|
|
192
|
+
await h.api.approveGate({ inboxId: plan.inboxId, resolvedBy: 'e2e' });
|
|
193
|
+
const merge = await waitForGate(h.api, run.runId, 'merge');
|
|
194
|
+
return { runId: run.runId, taskId: run.taskId, inboxId: merge.inboxId };
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=scenarios.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenarios.js","sourceRoot":"","sources":["../../../src/e2e/kit/scenarios.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// recovery-crash-child.ts — Group F crash simulator.
|
|
2
|
+
//
|
|
3
|
+
// Boots a host, starts a stubbed feature run, drives it to a durable stop point (plan or merge gate),
|
|
4
|
+
// prints `RUNID=<id>`, then exits ABRUPTLY without draining DBOS — exactly as if the host process
|
|
5
|
+
// were killed. The in-flight workflow is left PENDING in Postgres; the parent test then boots a fresh
|
|
6
|
+
// host whose DBOS.launch() recovers + replays it. A separate process is required: DBOS is a
|
|
7
|
+
// process-global singleton, so true crash-recovery cannot be simulated in-process.
|
|
8
|
+
//
|
|
9
|
+
// Spawned by `crashRunAt` (kit/crash.ts) via tsx, inheriting the REVO_DATA_DIR/REVO_PORT env so it
|
|
10
|
+
// targets the isolated test daemon. argv[2] = stop point: 'plan-gate' (default) | 'merge-gate'.
|
|
11
|
+
import 'reflect-metadata';
|
|
12
|
+
import { createRunHarness, givenInstalledPlaybook, createTargetRepo, startStubbedFeatureRun, waitForGate, } from './kit/index.js';
|
|
13
|
+
const stopAt = process.argv[2] ?? 'plan-gate';
|
|
14
|
+
const h = await createRunHarness();
|
|
15
|
+
await givenInstalledPlaybook(h);
|
|
16
|
+
// A clean throwaway repo path; the stub integrator never touches it. Intentionally NOT cleaned up —
|
|
17
|
+
// the process is about to "crash", and the OS reaps the temp dir. Leaking one /tmp dir per crash is
|
|
18
|
+
// cheaper than wiring a teardown that a crash would skip anyway.
|
|
19
|
+
const target = createTargetRepo();
|
|
20
|
+
const run = await startStubbedFeatureRun(h, target);
|
|
21
|
+
const plan = await waitForGate(h.api, run.runId, 'plan');
|
|
22
|
+
if (stopAt === 'merge-gate') {
|
|
23
|
+
await h.api.approveGate({ inboxId: plan.inboxId, resolvedBy: 'crash-child' });
|
|
24
|
+
await waitForGate(h.api, run.runId, 'merge');
|
|
25
|
+
}
|
|
26
|
+
// Flush the run id, then exit WITHOUT h.close() — no DBOS drain → the workflow stays PENDING in
|
|
27
|
+
// Postgres (the crash). exit(0) inside the write callback guarantees the parent reads RUNID first.
|
|
28
|
+
process.stdout.write(`RUNID=${run.runId}\n`, () => process.exit(0));
|
|
29
|
+
//# sourceMappingURL=recovery-crash-child.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-crash-child.js","sourceRoot":"","sources":["../../src/e2e/recovery-crash-child.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,EAAE;AACF,sGAAsG;AACtG,kGAAkG;AAClG,sGAAsG;AACtG,4FAA4F;AAC5F,mFAAmF;AACnF,EAAE;AACF,mGAAmG;AACnG,gGAAgG;AAChG,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;AAE9C,MAAM,CAAC,GAAG,MAAM,gBAAgB,EAAE,CAAC;AACnC,MAAM,sBAAsB,CAAC,CAAC,CAAC,CAAC;AAChC,oGAAoG;AACpG,oGAAoG;AACpG,iEAAiE;AACjE,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;AAClC,MAAM,GAAG,GAAG,MAAM,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAEpD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACzD,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;IAC5B,MAAM,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9E,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,gGAAgG;AAChG,mGAAmG;AACnG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// recovery-dd-crash-child.ts — Group L crash simulator for the DATA-DRIVEN pipeline (0015 slice 2).
|
|
2
|
+
//
|
|
3
|
+
// Mirrors recovery-crash-child.ts but starts a run on the data-driven `feature-development-dd` pipeline
|
|
4
|
+
// (the pipeline-core graph executed by the DBOS effect-adapter). Boots a host, drives the run to a
|
|
5
|
+
// durable stop point (plan or merge gate), prints `RUNID=<id>`, then exits ABRUPTLY without draining
|
|
6
|
+
// DBOS — exactly as if the host were killed. The in-flight DATA-DRIVEN workflow is left PENDING in
|
|
7
|
+
// Postgres; the parent test boots a fresh host whose DBOS.launch() recovers + replays it. A separate
|
|
8
|
+
// process is mandatory: DBOS is a process-global singleton, so a true crash cannot be faked in-process.
|
|
9
|
+
//
|
|
10
|
+
// Spawned by `crashDataDrivenRunAt` (kit/crash.ts) via tsx, inheriting REVO_DATA_DIR/REVO_PORT.
|
|
11
|
+
// argv[2] = stop point: 'plan-gate' (default) | 'merge-gate'.
|
|
12
|
+
//
|
|
13
|
+
// Uses a SINGLE scriptedAgent (not per-run routed) so the data-driven watcher node always emits the
|
|
14
|
+
// `clean` DOMAIN verdict it needs to reach the merge gate — independent of runId and process. The
|
|
15
|
+
// default agent may not carry the watcher-specific `clean` verdict across process boundaries; a per-run
|
|
16
|
+
// spec map cannot cross the crash->recovery process boundary, so a constant spec is the deterministic
|
|
17
|
+
// choice here.
|
|
18
|
+
import 'reflect-metadata';
|
|
19
|
+
import { createRunHarness, givenInstalledPlaybook, createTargetRepo, DATA_DRIVEN_PIPELINE, waitForGate, scriptedAgent, } from './kit/index.js';
|
|
20
|
+
const stopAt = process.argv[2] ?? 'plan-gate';
|
|
21
|
+
const CLEAN_WATCHER = { byRole: { watcher: { kind: 'domainVerdict', verdict: 'clean' } } };
|
|
22
|
+
const h = await createRunHarness({ agent: (sink) => scriptedAgent(CLEAN_WATCHER, sink) });
|
|
23
|
+
await givenInstalledPlaybook(h);
|
|
24
|
+
const target = createTargetRepo(); // clean throwaway repo; the stub integrator never touches it
|
|
25
|
+
const created = await h.api.createRun({
|
|
26
|
+
repo: target.worktree,
|
|
27
|
+
title: 'E2E data-driven recovery run',
|
|
28
|
+
description: 'Group L — data-driven crash-recovery (stubbed agent + integrator).',
|
|
29
|
+
scope: 'data-driven recovery e2e',
|
|
30
|
+
playbookId: 'revisium-agent-playbook',
|
|
31
|
+
pipelineId: DATA_DRIVEN_PIPELINE,
|
|
32
|
+
executionProfile: { runnerOverrides: { 'claude-code': 'stub-agent', 'revo-integrator': 'stub-agent' } },
|
|
33
|
+
start: true,
|
|
34
|
+
});
|
|
35
|
+
const runId = created.runId;
|
|
36
|
+
const plan = await waitForGate(h.api, runId, 'plan');
|
|
37
|
+
if (stopAt === 'merge-gate') {
|
|
38
|
+
await h.api.approveGate({ inboxId: plan.inboxId, resolvedBy: 'crash-child' });
|
|
39
|
+
await waitForGate(h.api, runId, 'merge');
|
|
40
|
+
}
|
|
41
|
+
// Flush the run id, then exit WITHOUT h.close() — no DBOS drain → the workflow stays PENDING (the crash).
|
|
42
|
+
process.stdout.write(`RUNID=${runId}\n`, () => process.exit(0));
|
|
43
|
+
//# sourceMappingURL=recovery-dd-crash-child.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-dd-crash-child.js","sourceRoot":"","sources":["../../src/e2e/recovery-dd-crash-child.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,EAAE;AACF,wGAAwG;AACxG,mGAAmG;AACnG,qGAAqG;AACrG,mGAAmG;AACnG,qGAAqG;AACrG,wGAAwG;AACxG,EAAE;AACF,gGAAgG;AAChG,8DAA8D;AAC9D,EAAE;AACF,oGAAoG;AACpG,kGAAkG;AAClG,wGAAwG;AACxG,sGAAsG;AACtG,eAAe;AACf,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,WAAW,EACX,aAAa,GAEd,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;AAE9C,MAAM,aAAa,GAAc,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAEtG,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1F,MAAM,sBAAsB,CAAC,CAAC,CAAC,CAAC;AAChC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC,CAAC,6DAA6D;AAEhG,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC,QAAQ;IACrB,KAAK,EAAE,8BAA8B;IACrC,WAAW,EAAE,oEAAoE;IACjF,KAAK,EAAE,0BAA0B;IACjC,UAAU,EAAE,yBAAyB;IACrC,UAAU,EAAE,oBAAoB;IAChC,gBAAgB,EAAE,EAAE,eAAe,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE;IACvG,KAAK,EAAE,IAAI;CACZ,CAAC,CAAC;AACH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AAE5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACrD,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;IAC5B,MAAM,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9E,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,0GAA0G;AAC1G,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -4,11 +4,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
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
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import { Module } from '@nestjs/common';
|
|
7
|
+
import { Global, Module } from '@nestjs/common';
|
|
8
8
|
import { DbosService } from './dbos.service.js';
|
|
9
9
|
let EngineModule = class EngineModule {
|
|
10
10
|
};
|
|
11
11
|
EngineModule = __decorate([
|
|
12
|
+
Global(),
|
|
12
13
|
Module({
|
|
13
14
|
providers: [DbosService],
|
|
14
15
|
exports: [DbosService],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dbos.module.js","sourceRoot":"","sources":["../../src/engine/dbos.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"dbos.module.js","sourceRoot":"","sources":["../../src/engine/dbos.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOzC,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,YAAY;IALxB,MAAM,EAAE;IACR,MAAM,CAAC;QACN,SAAS,EAAE,CAAC,WAAW,CAAC;QACxB,OAAO,EAAE,CAAC,WAAW,CAAC;KACvB,CAAC;GACW,YAAY,CAAG"}
|
|
@@ -42,6 +42,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
42
42
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
43
43
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
44
44
|
};
|
|
45
|
+
var DbosService_1;
|
|
45
46
|
import { Injectable } from '@nestjs/common';
|
|
46
47
|
import { DBOS, WorkflowQueue } from '@dbos-inc/dbos-sdk';
|
|
47
48
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
@@ -61,16 +62,22 @@ export const GATE_DEADLINE_EPOCH_MS = 4102444800000; // 2100-01-01T00:00:00Z
|
|
|
61
62
|
*/
|
|
62
63
|
export const SHUTDOWN_DRAIN_TIMEOUT_MS = 8_000;
|
|
63
64
|
let DbosService = class DbosService {
|
|
64
|
-
|
|
65
|
+
static { DbosService_1 = this; }
|
|
66
|
+
static launched = false;
|
|
67
|
+
static launchPromise = null;
|
|
68
|
+
static configured = null;
|
|
65
69
|
/** Registered WorkflowQueues — guarded map to ensure idempotent registration. */
|
|
66
|
-
queues = new Map();
|
|
70
|
+
static queues = new Map();
|
|
71
|
+
static queueOptions = new Map();
|
|
72
|
+
static steps = new Map();
|
|
73
|
+
static workflows = new Map();
|
|
67
74
|
// Registered DBOS functions — assigned in constructor before launch().
|
|
68
75
|
pingWorkflow;
|
|
69
76
|
markStep;
|
|
70
77
|
sleepStep;
|
|
71
78
|
constructor() {
|
|
72
79
|
// Register steps first (workflows may call them; all must be registered before launch).
|
|
73
|
-
this.markStep =
|
|
80
|
+
this.markStep = this.registerStep('DbosService.markStep', async function markStepImpl(workflowID, markerFile) {
|
|
74
81
|
// Idempotent marker (F12): write exactly-once per workflowID by using 'wx' (exclusive
|
|
75
82
|
// create). If the file already exists (step re-executed after a crash-before-checkpoint),
|
|
76
83
|
// writeFileSync throws with EEXIST — we catch that and skip the write, ensuring the
|
|
@@ -87,20 +94,20 @@ let DbosService = class DbosService {
|
|
|
87
94
|
}
|
|
88
95
|
const content = existsSync(markerFile) ? readFileSync(markerFile, 'utf8') : '';
|
|
89
96
|
return content.split('\n').filter((l) => l.trim() !== '').length;
|
|
90
|
-
}
|
|
91
|
-
this.sleepStep =
|
|
97
|
+
});
|
|
98
|
+
this.sleepStep = this.registerStep('DbosService.sleepStep', async function sleepStepImpl(ms) {
|
|
92
99
|
await DBOS.sleep(ms);
|
|
93
|
-
}
|
|
100
|
+
});
|
|
94
101
|
// Register the workflow (uses bound steps).
|
|
95
102
|
// Capture step references via .bind(this) so DBOS sees stable registered functions,
|
|
96
103
|
// not closures that close over `this` directly (avoids S7740 "do not assign this to self").
|
|
97
104
|
const markStepBound = this.markStep.bind(this);
|
|
98
105
|
const sleepStepBound = this.sleepStep.bind(this);
|
|
99
|
-
this.pingWorkflow =
|
|
106
|
+
this.pingWorkflow = this.registerWorkflow('DbosService.pingImpl', async function pingImpl(workflowID, sleepMs, markerFile) {
|
|
100
107
|
const markerCount = await markStepBound(workflowID, markerFile);
|
|
101
108
|
await sleepStepBound(sleepMs);
|
|
102
109
|
return { workflowID, markerCount };
|
|
103
|
-
}
|
|
110
|
+
});
|
|
104
111
|
}
|
|
105
112
|
// ── Generic engine verbs (M1 — DBOS seal, TASK 0003) ───────────────────────
|
|
106
113
|
//
|
|
@@ -118,10 +125,15 @@ let DbosService = class DbosService {
|
|
|
118
125
|
* Call in the consumer's constructor, BEFORE DBOS.launch().
|
|
119
126
|
*/
|
|
120
127
|
registerStep(name, fn) {
|
|
128
|
+
const cached = DbosService_1.steps.get(name);
|
|
129
|
+
if (cached)
|
|
130
|
+
return cached;
|
|
121
131
|
const lastDot = name.lastIndexOf('.');
|
|
122
132
|
const className = lastDot >= 0 ? name.slice(0, lastDot) : 'Pipeline';
|
|
123
133
|
const methodName = lastDot >= 0 ? name.slice(lastDot + 1) : name;
|
|
124
|
-
|
|
134
|
+
const registered = DBOS.registerStep(fn, { name: methodName, className });
|
|
135
|
+
DbosService_1.steps.set(name, registered);
|
|
136
|
+
return registered;
|
|
125
137
|
}
|
|
126
138
|
/**
|
|
127
139
|
* Register a plain async function as a DBOS workflow.
|
|
@@ -129,10 +141,15 @@ let DbosService = class DbosService {
|
|
|
129
141
|
* Call in the consumer's constructor, BEFORE DBOS.launch().
|
|
130
142
|
*/
|
|
131
143
|
registerWorkflow(name, fn) {
|
|
144
|
+
const cached = DbosService_1.workflows.get(name);
|
|
145
|
+
if (cached)
|
|
146
|
+
return cached;
|
|
132
147
|
const lastDot = name.lastIndexOf('.');
|
|
133
148
|
const className = lastDot >= 0 ? name.slice(0, lastDot) : 'Pipeline';
|
|
134
149
|
const methodName = lastDot >= 0 ? name.slice(lastDot + 1) : name;
|
|
135
|
-
|
|
150
|
+
const registered = DBOS.registerWorkflow(fn, { name: methodName, className });
|
|
151
|
+
DbosService_1.workflows.set(name, registered);
|
|
152
|
+
return registered;
|
|
136
153
|
}
|
|
137
154
|
/**
|
|
138
155
|
* Construct and register a WorkflowQueue (idempotent — Map-guarded).
|
|
@@ -140,9 +157,16 @@ let DbosService = class DbosService {
|
|
|
140
157
|
* Call before DBOS.launch().
|
|
141
158
|
*/
|
|
142
159
|
registerQueue(name, opts) {
|
|
143
|
-
|
|
144
|
-
|
|
160
|
+
const existing = DbosService_1.queueOptions.get(name);
|
|
161
|
+
if (existing) {
|
|
162
|
+
if (existing.concurrency !== opts.concurrency ||
|
|
163
|
+
existing.workerConcurrency !== opts.workerConcurrency) {
|
|
164
|
+
throw new Error(`WorkflowQueue ${name} already registered with different options.`);
|
|
165
|
+
}
|
|
166
|
+
return;
|
|
145
167
|
}
|
|
168
|
+
DbosService_1.queues.set(name, new WorkflowQueue(name, opts));
|
|
169
|
+
DbosService_1.queueOptions.set(name, { ...opts });
|
|
146
170
|
}
|
|
147
171
|
/**
|
|
148
172
|
* Enqueue a registered workflow with a stable workflowID and queue name.
|
|
@@ -181,27 +205,74 @@ let DbosService = class DbosService {
|
|
|
181
205
|
awaitDecision(topic, opts) {
|
|
182
206
|
return DBOS.recv(topic, { deadlineEpochMS: opts?.deadlineEpochMS ?? GATE_DEADLINE_EPOCH_MS });
|
|
183
207
|
}
|
|
208
|
+
setEvent(key, value) {
|
|
209
|
+
return DBOS.setEvent(key, value);
|
|
210
|
+
}
|
|
211
|
+
getEvent(workflowID, key, opts) {
|
|
212
|
+
return DBOS.getEvent(workflowID, key, opts);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Write a DBOS stream record. Valid from workflow bodies and DBOS steps; unlike setEvent,
|
|
216
|
+
* this is intentionally safe for the step-side agent observability bridge.
|
|
217
|
+
*/
|
|
218
|
+
writeStream(key, value) {
|
|
219
|
+
return DBOS.writeStream(key, value);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Close a DBOS stream. DBOS 4.19 only permits close from a workflow body, so step-side
|
|
223
|
+
* reporters must not call this after an attempt.
|
|
224
|
+
*/
|
|
225
|
+
closeStream(key) {
|
|
226
|
+
return DBOS.closeStream(key);
|
|
227
|
+
}
|
|
228
|
+
readStream(workflowID, key) {
|
|
229
|
+
return DBOS.readStream(workflowID, key);
|
|
230
|
+
}
|
|
184
231
|
// ── end generic engine verbs ────────────────────────────────────────────────
|
|
185
232
|
/**
|
|
186
233
|
* Configure DBOS with the pid-proven system database URL.
|
|
187
234
|
* Must be called before launch().
|
|
188
235
|
*/
|
|
189
236
|
setConfig(systemDatabaseUrl, options = {}) {
|
|
237
|
+
const nextConfig = { systemDatabaseUrl, logLevel: options.logLevel };
|
|
238
|
+
if (DbosService_1.configured) {
|
|
239
|
+
if (DbosService_1.configured.systemDatabaseUrl === nextConfig.systemDatabaseUrl &&
|
|
240
|
+
DbosService_1.configured.logLevel === nextConfig.logLevel) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (DbosService_1.launched) {
|
|
244
|
+
throw new Error('Cannot reconfigure DBOS after launch.');
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Admin server is unused (cancel patches a Revisium row, not the DBOS admin API); disabling it
|
|
248
|
+
// frees port 3001 so multiple profiles/hosts coexist without an admin-bind collision (ADR 0006).
|
|
190
249
|
DBOS.setConfig({
|
|
191
250
|
name: 'agent-orchestrator',
|
|
192
251
|
systemDatabaseUrl,
|
|
252
|
+
runAdminServer: false,
|
|
193
253
|
...(options.logLevel ? { logLevel: options.logLevel } : {}),
|
|
194
254
|
});
|
|
255
|
+
DbosService_1.configured = nextConfig;
|
|
195
256
|
}
|
|
196
257
|
/**
|
|
197
258
|
* Launch DBOS (idempotent — guarded by `launched` flag).
|
|
198
259
|
* Auto-recovers in-flight workflows.
|
|
199
260
|
*/
|
|
200
261
|
async launch() {
|
|
201
|
-
if (
|
|
262
|
+
if (DbosService_1.launched)
|
|
202
263
|
return;
|
|
203
|
-
|
|
204
|
-
|
|
264
|
+
if (DbosService_1.launchPromise)
|
|
265
|
+
return DbosService_1.launchPromise;
|
|
266
|
+
DbosService_1.launchPromise = (async () => {
|
|
267
|
+
await DBOS.launch();
|
|
268
|
+
DbosService_1.launched = true;
|
|
269
|
+
})();
|
|
270
|
+
try {
|
|
271
|
+
await DbosService_1.launchPromise;
|
|
272
|
+
}
|
|
273
|
+
finally {
|
|
274
|
+
DbosService_1.launchPromise = null;
|
|
275
|
+
}
|
|
205
276
|
}
|
|
206
277
|
/**
|
|
207
278
|
* Shut down DBOS (no-op if never launched — E9).
|
|
@@ -216,10 +287,10 @@ let DbosService = class DbosService {
|
|
|
216
287
|
* @param timeoutMs - drain bound (default SHUTDOWN_DRAIN_TIMEOUT_MS); pass 0/Infinity to disable.
|
|
217
288
|
*/
|
|
218
289
|
async shutdown(timeoutMs = SHUTDOWN_DRAIN_TIMEOUT_MS) {
|
|
219
|
-
if (!
|
|
290
|
+
if (!DbosService_1.launched)
|
|
220
291
|
return;
|
|
221
292
|
// Mark not-launched up front so a timed-out drain cannot leave a re-entrant launch confused.
|
|
222
|
-
|
|
293
|
+
DbosService_1.launched = false;
|
|
223
294
|
const drain = DBOS.shutdown();
|
|
224
295
|
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
225
296
|
await drain;
|
|
@@ -288,7 +359,7 @@ let DbosService = class DbosService {
|
|
|
288
359
|
return handle.getResult();
|
|
289
360
|
}
|
|
290
361
|
};
|
|
291
|
-
DbosService = __decorate([
|
|
362
|
+
DbosService = DbosService_1 = __decorate([
|
|
292
363
|
Injectable(),
|
|
293
364
|
__metadata("design:paramtypes", [])
|
|
294
365
|
], DbosService);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dbos.service.js","sourceRoot":"","sources":["../../src/engine/dbos.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG
|
|
1
|
+
{"version":3,"file":"dbos.service.js","sourceRoot":"","sources":["../../src/engine/dbos.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,20 @@
|
|
|
17
17
|
* live Postgres. The production default constructs a real `pg.Client`.
|
|
18
18
|
*/
|
|
19
19
|
import pg from 'pg';
|
|
20
|
-
|
|
20
|
+
import { PROFILES, resolveProfileName } from '../config.js';
|
|
21
|
+
/**
|
|
22
|
+
* DBOS system-database name. `REVO_DBOS_DB` overrides; otherwise it falls back to the active
|
|
23
|
+
* profile's db (default `dbos`, dev `dbos_dev`) so a profiled host keeps its DBOS progress separate.
|
|
24
|
+
* Validated to a safe identifier because the name is interpolated into a non-parameterizable
|
|
25
|
+
* `CREATE DATABASE` (CREATE DATABASE cannot bind params).
|
|
26
|
+
*/
|
|
27
|
+
export function resolveDbosDbName() {
|
|
28
|
+
const name = process.env['REVO_DBOS_DB'] ?? PROFILES[resolveProfileName()].dbosDb;
|
|
29
|
+
if (!/^[a-z_][a-z0-9_]*$/i.test(name)) {
|
|
30
|
+
throw new Error(`Invalid REVO_DBOS_DB '${name}': must be a SQL identifier (/^[a-z_][a-z0-9_]*$/i)`);
|
|
31
|
+
}
|
|
32
|
+
return name;
|
|
33
|
+
}
|
|
21
34
|
const MAINTENANCE_DB = 'postgres';
|
|
22
35
|
/** PostgreSQL SQLSTATE for "database already exists" (duplicate_database). */
|
|
23
36
|
const PG_SQLSTATE_DUPLICATE_DATABASE = '42P04';
|
|
@@ -33,6 +46,7 @@ const DEFAULT_CREDS = {
|
|
|
33
46
|
* @param deps - Optional injectable dependencies for testing (F20).
|
|
34
47
|
*/
|
|
35
48
|
export async function ensurePostgres(pgPort, opts = {}, deps = {}) {
|
|
49
|
+
const dbosDbName = resolveDbosDbName();
|
|
36
50
|
const { user, password, adminDb } = { ...DEFAULT_CREDS, ...opts };
|
|
37
51
|
// pg.Client.connect() returns Promise<Client> while ClientLike.connect() returns
|
|
38
52
|
// Promise<void>; they are structurally compatible at the call sites used here, but
|
|
@@ -42,7 +56,7 @@ export async function ensurePostgres(pgPort, opts = {}, deps = {}) {
|
|
|
42
56
|
const client = createClient();
|
|
43
57
|
try {
|
|
44
58
|
await client.connect();
|
|
45
|
-
const result = await client.query(`SELECT count(*)::text AS count FROM pg_database WHERE datname = $1`, [
|
|
59
|
+
const result = await client.query(`SELECT count(*)::text AS count FROM pg_database WHERE datname = $1`, [dbosDbName]);
|
|
46
60
|
const exists = result.rows[0]?.count !== '0';
|
|
47
61
|
if (!exists) {
|
|
48
62
|
// CREATE DATABASE cannot be parameterized; `dbos` is a fixed literal with no injection surface.
|
|
@@ -50,7 +64,7 @@ export async function ensurePostgres(pgPort, opts = {}, deps = {}) {
|
|
|
50
64
|
// PostgreSQL raises 42P04 (duplicate_database) for the loser. Treat it as success
|
|
51
65
|
// (idempotent — the database now exists). Re-throw any other error.
|
|
52
66
|
try {
|
|
53
|
-
await client.query(`CREATE DATABASE ${
|
|
67
|
+
await client.query(`CREATE DATABASE ${dbosDbName}`);
|
|
54
68
|
}
|
|
55
69
|
catch (err) {
|
|
56
70
|
if (err.code === PG_SQLSTATE_DUPLICATE_DATABASE) {
|
|
@@ -75,6 +89,6 @@ export async function ensurePostgres(pgPort, opts = {}, deps = {}) {
|
|
|
75
89
|
* and encode to themselves, so existing behaviour is unchanged.
|
|
76
90
|
*/
|
|
77
91
|
export function dbosSystemDatabaseUrl(pgPort, user = 'revisium', password = 'password') {
|
|
78
|
-
return `postgresql://${encodeURIComponent(user)}:${encodeURIComponent(password)}@localhost:${pgPort}/${
|
|
92
|
+
return `postgresql://${encodeURIComponent(user)}:${encodeURIComponent(password)}@localhost:${pgPort}/${resolveDbosDbName()}`;
|
|
79
93
|
}
|
|
80
94
|
//# sourceMappingURL=ensure-postgres.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure-postgres.js","sourceRoot":"","sources":["../../src/engine/ensure-postgres.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ensure-postgres.js","sourceRoot":"","sources":["../../src/engine/ensure-postgres.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC;IAClF,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,qDAAqD,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AACD,MAAM,cAAc,GAAG,UAAU,CAAC;AAElC,8EAA8E;AAC9E,MAAM,8BAA8B,GAAG,OAAO,CAAC;AAQ/C,MAAM,aAAa,GAAwB;IACzC,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,cAAc;CACxB,CAAC;AAkBF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,OAAqC,EAAE,EACvC,OAA2B,EAAE;IAE7B,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,IAAI,EAAE,CAAC;IAClE,iFAAiF;IACjF,mFAAmF;IACnF,yFAAyF;IACzF,MAAM,eAAe,GAAG,GAAe,EAAE,CACvC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAA0B,CAAC;IACjH,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,eAAe,CAAC;IAE1D,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B,oEAAoE,EACpE,CAAC,UAAU,CAAC,CACb,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,GAAG,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,gGAAgG;YAChG,0FAA0F;YAC1F,kFAAkF;YAClF,oEAAoE;YACpE,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAK,GAAyB,CAAC,IAAI,KAAK,8BAA8B,EAAE,CAAC;oBACvE,6DAA6D;oBAC7D,OAAO;gBACT,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAc,EACd,IAAI,GAAG,UAAU,EACjB,QAAQ,GAAG,UAAU;IAErB,OAAO,gBAAgB,kBAAkB,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,cAAc,MAAM,IAAI,iBAAiB,EAAE,EAAE,CAAC;AAC/H,CAAC"}
|