@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../src/control-plane/tables.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,WAAW;IACX,OAAO;IACP,OAAO;IACP,UAAU;IACV,QAAQ;IACR,OAAO;IACP,aAAa;CACL,CAAC;AAIX,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAQ,aAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC"}
|
|
1
|
+
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../src/control-plane/tables.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,WAAW;IACX,OAAO;IACP,OAAO;IACP,UAAU;IACV,QAAQ;IACR,OAAO;IACP,aAAa;IACb,aAAa;CACL,CAAC;AAIX,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAQ,aAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { existsSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { getConfig } from '../../config.js';
|
|
4
|
+
import { worktreePathFor, worktreeMarkerFor, isWorktreeDir } from '../../control-plane/resolve-cwd.js';
|
|
5
|
+
/**
|
|
6
|
+
* Worktree-aware developer write dir (plan 0017): when the run has an isolated worktree, the fake
|
|
7
|
+
* developer must write THERE (the integrator commits from the worktree), not the registered base
|
|
8
|
+
* checkout — otherwise the integrator sees no diff. Falls back to the registered path for non-live
|
|
9
|
+
* (stub) scenarios that have no worktree.
|
|
10
|
+
*/
|
|
11
|
+
export function resolveWriteDir(runId, registered) {
|
|
12
|
+
if (!registered)
|
|
13
|
+
return undefined;
|
|
14
|
+
const dataDir = getConfig().dataDir;
|
|
15
|
+
const wt = worktreePathFor(dataDir, runId);
|
|
16
|
+
if (isWorktreeDir(wt))
|
|
17
|
+
return wt;
|
|
18
|
+
// Mirror resolveRunCwd's fail-loud: a live marker with no worktree means isolation broke — refuse to
|
|
19
|
+
// dirty the shared base checkout (which would mask the failure) rather than silently falling back.
|
|
20
|
+
if (existsSync(worktreeMarkerFor(dataDir, runId))) {
|
|
21
|
+
throw new Error(`fake developer: live run ${runId} expects an isolated worktree at ${wt} but it is missing — ` +
|
|
22
|
+
`refusing to write into the shared base checkout`);
|
|
23
|
+
}
|
|
24
|
+
return registered;
|
|
25
|
+
}
|
|
26
|
+
function pickBehavior(spec, role, callIndex) {
|
|
27
|
+
const entry = spec.byRole?.[role];
|
|
28
|
+
if (Array.isArray(entry))
|
|
29
|
+
return entry[Math.min(callIndex, entry.length - 1)] ?? { kind: 'pass' };
|
|
30
|
+
return entry ?? spec.default ?? { kind: 'pass' };
|
|
31
|
+
}
|
|
32
|
+
function defaultVerdictFor(role) {
|
|
33
|
+
return role === 'watcher' ? 'clean' : 'approved';
|
|
34
|
+
}
|
|
35
|
+
function runBehavior(behavior, ctx, sink) {
|
|
36
|
+
if (behavior.kind === 'throw') {
|
|
37
|
+
throw new Error(behavior.message ?? `scripted failure from ${ctx.logicalRole}`);
|
|
38
|
+
}
|
|
39
|
+
const writeRepo = ctx.logicalRole === 'developer' ? resolveWriteDir(ctx.runId, sink.developerWrites.get(ctx.runId)) : undefined;
|
|
40
|
+
if (writeRepo && behavior.kind !== 'needsHuman') {
|
|
41
|
+
writeFileSync(join(writeRepo, `developer-${ctx.attemptId}.txt`), `change from ${ctx.attemptId}\n`);
|
|
42
|
+
}
|
|
43
|
+
if (behavior.kind === 'invalidNoVerdict') {
|
|
44
|
+
return {
|
|
45
|
+
output: behavior.output ?? '# Plan approved\nLooks good.',
|
|
46
|
+
nextSteps: [],
|
|
47
|
+
costs: [],
|
|
48
|
+
needsHuman: false,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const verdict = behavior.kind === 'verdict' || behavior.kind === 'domainVerdict' ? behavior.verdict : defaultVerdictFor(ctx.logicalRole);
|
|
52
|
+
const cost = behavior.kind === 'cost'
|
|
53
|
+
? { inputTokens: behavior.inputTokens, outputTokens: behavior.outputTokens, costAmount: behavior.costAmount }
|
|
54
|
+
: { inputTokens: 10, outputTokens: 5, costAmount: 0.001 };
|
|
55
|
+
return {
|
|
56
|
+
output: { role: ctx.logicalRole, runner: ctx.runner },
|
|
57
|
+
verdict,
|
|
58
|
+
artifacts: {
|
|
59
|
+
process: { ref: `test-artifacts/${ctx.attemptId}`, stdoutTail: `stdout from ${ctx.logicalRole}`, stderrTail: '' },
|
|
60
|
+
},
|
|
61
|
+
nextSteps: [],
|
|
62
|
+
costs: [{ modelProfile: ctx.level, currency: 'USD', ...cost }],
|
|
63
|
+
needsHuman: behavior.kind === 'needsHuman',
|
|
64
|
+
lesson: behavior.kind === 'needsHuman' ? behavior.lesson : undefined,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** Agent driven by a single {@link AgentSpec} (same plan for every run). Records into `sink`. */
|
|
68
|
+
export function scriptedAgent(spec, sink) {
|
|
69
|
+
const counts = new Map();
|
|
70
|
+
return async ({ role, profile, attemptId, step, context }) => {
|
|
71
|
+
const logicalRole = role.playbookRoleId ?? role.name;
|
|
72
|
+
sink.agentCalls.push({ role: logicalRole, runner: role.runner, attemptId, runId: step.runId, context });
|
|
73
|
+
const n = counts.get(logicalRole) ?? 0;
|
|
74
|
+
counts.set(logicalRole, n + 1);
|
|
75
|
+
return runBehavior(pickBehavior(spec, logicalRole, n), {
|
|
76
|
+
logicalRole,
|
|
77
|
+
runner: role.runner,
|
|
78
|
+
attemptId,
|
|
79
|
+
runId: step.runId,
|
|
80
|
+
level: profile.level,
|
|
81
|
+
}, sink);
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Agent that dispatches to a per-run {@link AgentSpec} from `specs` (keyed by runId), so one harness
|
|
86
|
+
* can drive many runs with different failure scripts. Create the run with `start:false`, register its
|
|
87
|
+
* spec in `specs`, then `startRun` — the workflow then reads this run's plan. Defaults to domain success.
|
|
88
|
+
*/
|
|
89
|
+
export function routedScriptedAgent(specs, sink) {
|
|
90
|
+
const counts = new Map();
|
|
91
|
+
return async ({ role, profile, attemptId, step, context }) => {
|
|
92
|
+
const logicalRole = role.playbookRoleId ?? role.name;
|
|
93
|
+
sink.agentCalls.push({ role: logicalRole, runner: role.runner, attemptId, runId: step.runId, context });
|
|
94
|
+
const key = `${step.runId}::${logicalRole}`;
|
|
95
|
+
const n = counts.get(key) ?? 0;
|
|
96
|
+
counts.set(key, n + 1);
|
|
97
|
+
const spec = specs.get(step.runId) ?? {};
|
|
98
|
+
return runBehavior(pickBehavior(spec, logicalRole, n), {
|
|
99
|
+
logicalRole,
|
|
100
|
+
runner: role.runner,
|
|
101
|
+
attemptId,
|
|
102
|
+
runId: step.runId,
|
|
103
|
+
level: profile.level,
|
|
104
|
+
}, sink);
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Deterministic test agent: records every call, returns a domain success verdict with fixed costs and a
|
|
109
|
+
* process artifact. When the logical role is `developer` and a worktree is registered for the run,
|
|
110
|
+
* it writes a file so the real integrator has a diff to commit.
|
|
111
|
+
*
|
|
112
|
+
* This is the default agent used by `createRunHarness()`; it replaces `claude-code` via
|
|
113
|
+
* `executionProfile.runnerOverrides`, so no real `claude` process is ever spawned in e2e.
|
|
114
|
+
*/
|
|
115
|
+
export function deterministicAgent(agentCalls, developerWrites) {
|
|
116
|
+
return async ({ role, profile, attemptId, step, context }) => {
|
|
117
|
+
const logicalRole = role.playbookRoleId ?? role.name;
|
|
118
|
+
agentCalls.push({ role: logicalRole, runner: role.runner, attemptId, runId: step.runId, context });
|
|
119
|
+
const writeRepo = logicalRole === 'developer' ? resolveWriteDir(step.runId, developerWrites.get(step.runId)) : undefined;
|
|
120
|
+
if (writeRepo) {
|
|
121
|
+
writeFileSync(join(writeRepo, `developer-${attemptId}.txt`), `change from ${attemptId}\n`);
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
output: {
|
|
125
|
+
role: logicalRole,
|
|
126
|
+
runner: role.runner,
|
|
127
|
+
},
|
|
128
|
+
verdict: defaultVerdictFor(logicalRole),
|
|
129
|
+
artifacts: {
|
|
130
|
+
process: {
|
|
131
|
+
ref: `test-artifacts/${attemptId}`,
|
|
132
|
+
stdoutTail: `stdout from ${logicalRole}`,
|
|
133
|
+
stderrTail: '',
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
nextSteps: [],
|
|
137
|
+
costs: [{
|
|
138
|
+
modelProfile: profile.level,
|
|
139
|
+
inputTokens: 10,
|
|
140
|
+
outputTokens: 5,
|
|
141
|
+
costAmount: 0.001,
|
|
142
|
+
currency: 'USD',
|
|
143
|
+
}],
|
|
144
|
+
needsHuman: false,
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/e2e/kit/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { taskBranchPrefix } from '../../runners/integrator-branch-naming.js';
|
|
3
|
+
/** Assert the run reached `completed`. Returns the detail. */
|
|
4
|
+
export async function assertCompleted(api, runId) {
|
|
5
|
+
// The run-row status patch can lag the workflow's terminal transition by a beat under load, so poll
|
|
6
|
+
// for the authoritative run status to settle rather than reading once. (There are no `steps` rows to
|
|
7
|
+
// settle — the data-driven engine writes none; progress lives in DBOS — audit §3.1.)
|
|
8
|
+
let detail = await api.getRun({ runId, includeEvents: true, includeLog: true });
|
|
9
|
+
for (let waited = 0; waited < 5_000 && detail.run.status !== 'completed'; waited += 250) {
|
|
10
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
11
|
+
detail = await api.getRun({ runId, includeEvents: true, includeLog: true });
|
|
12
|
+
}
|
|
13
|
+
assert.equal(detail.run.status, 'completed');
|
|
14
|
+
return detail;
|
|
15
|
+
}
|
|
16
|
+
/** Assert the recorded attempt verdicts (in order) and that each carries a process artifact ref. */
|
|
17
|
+
export async function assertAttemptVerdicts(api, runId, verdicts) {
|
|
18
|
+
const attempts = await api.getRunLog({ runId, limit: 50 });
|
|
19
|
+
assert.deepEqual(attempts.map((a) => a.verdict), verdicts);
|
|
20
|
+
assert.ok(attempts.every((a) => a.artifactRef?.startsWith('test-artifacts/')), 'attempts carry process artifact refs');
|
|
21
|
+
return attempts;
|
|
22
|
+
}
|
|
23
|
+
/** Assert every listed event type is visible for the run. Polls briefly: a terminal event such as
|
|
24
|
+
* `run_completed` is appended just AFTER the run-row status patch (same ordering `assertCompleted`
|
|
25
|
+
* guards — the run row settles first, the rest lags a beat), so a single read taken the instant
|
|
26
|
+
* `approveUntilTerminal` returns can race the append and miss it (the F1 recovery flake). A type that
|
|
27
|
+
* is genuinely never emitted still fails after the window — this hides propagation lag, not real gaps. */
|
|
28
|
+
export async function assertEventsPresent(api, runId, types) {
|
|
29
|
+
// limit 500 (not 50): a recovered/looped run (replay + the pollPr review tail) can accrue >50 events,
|
|
30
|
+
// and getRunEvents returns oldest-first — a 50-window would drop the terminal `run_completed`.
|
|
31
|
+
let events = await api.getRunEvents({ runId, limit: 500 });
|
|
32
|
+
const missing = () => types.filter((type) => !events.some((e) => e.type === type));
|
|
33
|
+
for (let waited = 0; waited < 8_000 && missing().length > 0; waited += 250) {
|
|
34
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
35
|
+
events = await api.getRunEvents({ runId, limit: 500 });
|
|
36
|
+
}
|
|
37
|
+
// Deterministic fallback for the terminal `run_completed` event: it is appended just AFTER the run-row
|
|
38
|
+
// status patch, so on a fast run it can still trail the read window. The run STATUS being `completed`
|
|
39
|
+
// (the authoritative signal `wait_for_run`/`approveUntilTerminal` already observed) proves completion,
|
|
40
|
+
// so accept `run_completed` when the run row is `completed` even if its event append hasn't surfaced.
|
|
41
|
+
let runCompleted = false;
|
|
42
|
+
if (types.includes('run_completed') && !events.some((e) => e.type === 'run_completed')) {
|
|
43
|
+
runCompleted = (await api.getRun({ runId })).run.status === 'completed';
|
|
44
|
+
}
|
|
45
|
+
for (const type of types) {
|
|
46
|
+
if (type === 'run_completed' && runCompleted)
|
|
47
|
+
continue;
|
|
48
|
+
assert.ok(events.some((e) => e.type === type), `event "${type}" must be visible`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Assert the run digest reports `completed`, no pending inbox, and the expected usage totals. */
|
|
52
|
+
export async function assertUsage(api, runId, usage) {
|
|
53
|
+
const digest = await api.getRunDigest(runId);
|
|
54
|
+
assert.equal(digest.run.status, 'completed');
|
|
55
|
+
assert.equal(digest.pendingInbox.length, 0);
|
|
56
|
+
assert.equal(digest.usage.inputTokens, usage.inputTokens);
|
|
57
|
+
assert.equal(digest.usage.outputTokens, usage.outputTokens);
|
|
58
|
+
assert.equal(digest.usage.costAmount, usage.costAmount);
|
|
59
|
+
}
|
|
60
|
+
/** Assert the run did not complete and emitted a `pipeline_blocked` event (preflight/integrate/etc.). */
|
|
61
|
+
export async function assertBlocked(api, runId) {
|
|
62
|
+
const events = await api.getRunEvents({ runId, limit: 50 });
|
|
63
|
+
assert.ok(events.some((e) => e.type === 'pipeline_blocked'), 'a blocked run must emit pipeline_blocked');
|
|
64
|
+
const detail = await api.getRun({ runId });
|
|
65
|
+
assert.notEqual(detail.run.status, 'completed', 'a blocked run must not be completed');
|
|
66
|
+
}
|
|
67
|
+
/** Assert no persisted event for the run carries the raw token (serialized scan over all events). */
|
|
68
|
+
export async function assertNoRawTokenInEvents(api, runId, rawToken) {
|
|
69
|
+
const events = await api.getRunEvents({ runId, limit: 50 });
|
|
70
|
+
assert.ok(!JSON.stringify(events).includes(rawToken), `a raw token must never reach persisted events: ${rawToken}`);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Assert a raw GitHub token never reaches the run's persisted events, and that the blocking
|
|
74
|
+
* `pipeline_blocked` lesson was redacted to `[REDACTED]`. Drives the token through a needsHuman
|
|
75
|
+
* integrator lesson; the persist boundary (appendRunEvent → redactEventPayload) must mask it.
|
|
76
|
+
*/
|
|
77
|
+
export async function assertLessonRedacted(api, runId, rawToken) {
|
|
78
|
+
const events = await api.getRunEvents({ runId, limit: 50 });
|
|
79
|
+
const serialized = JSON.stringify(events);
|
|
80
|
+
assert.ok(!serialized.includes(rawToken), `a raw token must never reach persisted events: ${rawToken}`);
|
|
81
|
+
const blocked = events.find((e) => e.type === 'pipeline_blocked');
|
|
82
|
+
assert.ok(blocked, 'a redaction case must still block (pipeline_blocked emitted)');
|
|
83
|
+
const lesson = String(blocked.payload?.lesson ?? '');
|
|
84
|
+
assert.ok(lesson.includes('[REDACTED]'), 'the surfaced lesson must show the redaction marker');
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Assert a recovered run's durable record is exactly-once — replay after crash recovery must not
|
|
88
|
+
* duplicate terminal or step events (deterministic ids + ROW_CONFLICT). Guards the idempotency the
|
|
89
|
+
* engine relies on so DBOS workflow replays are side-effect-free.
|
|
90
|
+
*/
|
|
91
|
+
export async function assertReplayIdempotent(api, runId) {
|
|
92
|
+
// Observation order (kills the false negative): FIRST confirm the run-row reached `completed` — the
|
|
93
|
+
// authoritative signal that recovery actually FINISHED — via the bounded status poll (`assertCompleted`).
|
|
94
|
+
// Counting `run_completed` before the run is terminal is the trap: a 0 then means "recovery still in
|
|
95
|
+
// flight", not "the append lagged". The recovery tests already drove the run terminal, so this
|
|
96
|
+
// re-confirms instantly; a run that never completes fails honestly there (drive.ts: >10s = stuck = bug).
|
|
97
|
+
await assertCompleted(api, runId);
|
|
98
|
+
// limit 500, oldest-first: a recovered/looped run can accrue >100 events, so a 100-row window would DROP
|
|
99
|
+
// the terminal `run_completed` (the newest event) entirely — the primary F2 flake (a dropped window, not
|
|
100
|
+
// append lag). Same reason assertEventsPresent reads 500. One read: the run is already confirmed completed.
|
|
101
|
+
const events = await api.getRunEvents({ runId, limit: 500 });
|
|
102
|
+
// Replay idempotency relaxes ONLY downward, never up — the duplicate guard is the load-bearing invariant:
|
|
103
|
+
// >= 2 → ALWAYS fail (a duplicated terminal event on DBOS replay is exactly the bug this guards);
|
|
104
|
+
// == 1 → the normal exactly-once;
|
|
105
|
+
// == 0 → accepted ONLY because the run is confirmed `completed` above — the append trails the status
|
|
106
|
+
// patch (propagation lag, not a real gap; mirrors assertEventsPresent's terminal fallback).
|
|
107
|
+
const runCompletedCount = events.filter((e) => e.type === 'run_completed').length;
|
|
108
|
+
assert.ok(runCompletedCount <= 1, `run_completed must not be duplicated after recovery (DBOS replay idempotency) — saw ${runCompletedCount}`);
|
|
109
|
+
const stepKeys = events
|
|
110
|
+
.filter((e) => e.type === 'step_succeeded')
|
|
111
|
+
.map((e) => String(e.payload?.stepKey ?? ''));
|
|
112
|
+
assert.equal(stepKeys.length, new Set(stepKeys).size, 'a replayed step must not emit a duplicate step_succeeded');
|
|
113
|
+
}
|
|
114
|
+
/** Assert a gh subcommand was NOT invoked for this run's branch (e.g. `pr create` when reusing a PR). */
|
|
115
|
+
export function assertGhNotCalled(h, taskId, sub) {
|
|
116
|
+
const prefix = taskBranchPrefix(taskId);
|
|
117
|
+
assert.ok(!h.ghCalls.some((c) => c[0] === sub[0] && c[1] === sub[1] && c.some((a) => a.startsWith(prefix))), `gh ${sub.join(' ')} must not be called for ${taskId}`);
|
|
118
|
+
}
|
|
119
|
+
/** Roles + runners that actually executed for a run (from the deterministic agent's recorded calls). */
|
|
120
|
+
export function executedRoles(h, runId) {
|
|
121
|
+
return h.agentCalls.filter((c) => c.runId === runId).map((c) => [c.role, c.runner]);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Assert a `step_succeeded` for `role` was emitted after `afterEventType`. The two operands differ in
|
|
125
|
+
* shape on purpose: an integrator is a stub runner that emits `integrate_succeeded` (an event type),
|
|
126
|
+
* never a step — so the ordering is checked across the two event shapes, not within one. The step's
|
|
127
|
+
* role is the resolved binding (playbook-prefixed), matched by suffix so the assertion is robust to
|
|
128
|
+
* the install prefix and the template's node naming.
|
|
129
|
+
*/
|
|
130
|
+
export async function assertRoleStepAfterEvent(api, runId, role, afterEventType) {
|
|
131
|
+
const events = await api.getRunEvents({ runId, limit: 500 });
|
|
132
|
+
const eventIdx = events.findIndex((e) => e.type === afterEventType);
|
|
133
|
+
const stepIdx = events.findIndex((e) => {
|
|
134
|
+
if (e.type !== 'step_succeeded')
|
|
135
|
+
return false;
|
|
136
|
+
const stepRole = e.payload?.role;
|
|
137
|
+
return typeof stepRole === 'string' && stepRole.endsWith(role);
|
|
138
|
+
});
|
|
139
|
+
assert.ok(eventIdx >= 0, `${afterEventType} was emitted`);
|
|
140
|
+
assert.ok(stepIdx >= 0, `${role}'s step_succeeded was emitted`);
|
|
141
|
+
assert.ok(eventIdx < stepIdx, `${role} ran after ${afterEventType}`);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Assert the fake gh opened a draft PR for the run's feature branch (list → create → view),
|
|
145
|
+
* scoped by `taskId` so it is robust to other runs' gh calls. Returns the head branch name.
|
|
146
|
+
*/
|
|
147
|
+
export function assertPrOpened(h, taskId, repo = 'e2e/repo') {
|
|
148
|
+
const prefix = taskBranchPrefix(taskId);
|
|
149
|
+
// Scope to THIS run's gh calls via the feature branch (robust if other runs share the harness).
|
|
150
|
+
const list = h.ghCalls.find((c) => c[0] === 'pr' && c[1] === 'list' && c.some((arg) => arg.startsWith(prefix)));
|
|
151
|
+
assert.ok(list, 'fake gh must list existing PRs for this branch before creating');
|
|
152
|
+
const repoIdx = list.indexOf('--repo');
|
|
153
|
+
assert.ok(repoIdx >= 0 && list[repoIdx + 1] === repo, `--repo ${repo} not found in pr list`);
|
|
154
|
+
const headIdx = list.indexOf('--head');
|
|
155
|
+
assert.ok(headIdx >= 0, '--head flag not found in pr list');
|
|
156
|
+
const branch = list[headIdx + 1];
|
|
157
|
+
assert.ok(branch, '--head value missing in pr list');
|
|
158
|
+
assert.ok(branch.startsWith(prefix), `unexpected PR head branch: ${branch}`);
|
|
159
|
+
assert.ok(h.ghCalls.some((c) => c[0] === 'pr' && c[1] === 'create' && c.includes(branch)), 'fake gh must create a draft PR for this branch');
|
|
160
|
+
assert.ok(h.ghCalls.some((c) => c[0] === 'pr' && c[1] === 'view' && c.includes(branch)), 'fake gh must read back created PR metadata for this branch');
|
|
161
|
+
return branch;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=assertions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.js","sourceRoot":"","sources":["../../../src/e2e/kit/assertions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { repoRoot } from '../../config.js';
|
|
4
|
+
// Run the crash child from SOURCE via tsx (matches how the e2e suite runs; honors the
|
|
5
|
+
// REVO_DATA_DIR/REVO_PORT env so the child targets the isolated test daemon).
|
|
6
|
+
const TSX_BIN = join(repoRoot, 'node_modules', '.bin', 'tsx');
|
|
7
|
+
const CHILD_ENTRY = join(repoRoot, 'src', 'e2e', 'recovery-crash-child.ts');
|
|
8
|
+
const DD_CHILD_ENTRY = join(repoRoot, 'src', 'e2e', 'recovery-dd-crash-child.ts');
|
|
9
|
+
/**
|
|
10
|
+
* Simulate a host crash: run a stubbed feature run in a SEPARATE process up to `stopAt`, then kill
|
|
11
|
+
* that process WITHOUT draining DBOS (the child calls process.exit() with no shutdown). The workflow
|
|
12
|
+
* is left PENDING in the shared test Postgres; the calling test then boots a fresh host that recovers
|
|
13
|
+
* it. Resolves with the crashed run's id. A separate process is mandatory — DBOS is a process-global,
|
|
14
|
+
* so a real crash + recovery cannot be faked in-process.
|
|
15
|
+
*/
|
|
16
|
+
export function crashRunAt(stopAt) {
|
|
17
|
+
return spawnCrashChild(CHILD_ENTRY, stopAt);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Group L counterpart: crash a DATA-DRIVEN run (the pipeline-core graph executed by the DBOS adapter)
|
|
21
|
+
* in a separate process up to `stopAt`, then kill it without draining DBOS. Same recovery contract as
|
|
22
|
+
* {@link crashRunAt} — the parent test boots a fresh host that recovers the PENDING data-driven workflow.
|
|
23
|
+
*/
|
|
24
|
+
export function crashDataDrivenRunAt(stopAt) {
|
|
25
|
+
return spawnCrashChild(DD_CHILD_ENTRY, stopAt);
|
|
26
|
+
}
|
|
27
|
+
function spawnCrashChild(entry, stopAt) {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const child = spawn(TSX_BIN, [entry, stopAt], { env: process.env, cwd: repoRoot });
|
|
30
|
+
let stdout = '';
|
|
31
|
+
let stderr = '';
|
|
32
|
+
child.stdout.on('data', (d) => (stdout += String(d)));
|
|
33
|
+
child.stderr.on('data', (d) => (stderr += String(d)));
|
|
34
|
+
child.on('error', reject);
|
|
35
|
+
child.on('exit', (code) => {
|
|
36
|
+
const match = stdout.match(/RUNID=(\S+)/);
|
|
37
|
+
if (match?.[1])
|
|
38
|
+
resolve({ runId: match[1] });
|
|
39
|
+
else
|
|
40
|
+
reject(new Error(`crash child did not emit RUNID (exit ${code}). stderr tail: ${stderr.slice(-400)}`));
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=crash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash.js","sourceRoot":"","sources":["../../../src/e2e/kit/crash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,sFAAsF;AACtF,8EAA8E;AAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,CAAC,CAAC;AAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,CAAC,CAAC;AAIlF;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,MAAsB;IAC/C,OAAO,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACzD,OAAO,eAAe,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,eAAe,CAAC,KAAa,EAAE,MAAsB;IAC5D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnF,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC1C,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;;gBACxC,MAAM,CAAC,IAAI,KAAK,CAAC,wCAAwC,IAAI,mBAAmB,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9G,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
// Poll at 500ms: tighter intervals can observe a run as terminal before its DBOS workflow status /
|
|
3
|
+
// step-status cascade settle, flaking `workflowStatus`/`no ready steps` assertions on slower CI.
|
|
4
|
+
// A real run settles in a few seconds — if a wait needs >10s the run is stuck (a bug), so fail fast.
|
|
5
|
+
const POLL_MS = 500;
|
|
6
|
+
const WAIT_TIMEOUT_MS = 10_000;
|
|
7
|
+
/** Poll until the run settles (terminal or parked at a gate). Returns the wait state. */
|
|
8
|
+
export function waitState(api, runId, timeoutMs = WAIT_TIMEOUT_MS) {
|
|
9
|
+
return api.waitForRun({ runId, timeoutMs, intervalMs: POLL_MS });
|
|
10
|
+
}
|
|
11
|
+
/** Wait until the run parks at a gate; assert it is a gate (optionally a specific topic). */
|
|
12
|
+
export async function waitForGate(api, runId, expectedTopic) {
|
|
13
|
+
const state = await api.waitForRun({ runId, timeoutMs: WAIT_TIMEOUT_MS, intervalMs: POLL_MS });
|
|
14
|
+
assert.equal(state.state, 'pending_gate', `expected pending_gate, got ${state.state}`);
|
|
15
|
+
const inbox = state.inbox;
|
|
16
|
+
assert.ok(inbox, 'pending_gate must include the inbox item to resolve');
|
|
17
|
+
const context = inbox.context;
|
|
18
|
+
assert.ok(context !== null && typeof context === 'object' && !Array.isArray(context));
|
|
19
|
+
const topic = context['topic'];
|
|
20
|
+
assert.equal(typeof topic, 'string');
|
|
21
|
+
if (expectedTopic)
|
|
22
|
+
assert.equal(topic, expectedTopic, `expected ${expectedTopic} gate, got ${String(topic)}`);
|
|
23
|
+
return { inboxId: inbox.id, topic: topic };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Drive a gated run to a terminal state by approving each gate as it opens.
|
|
27
|
+
* Returns the terminal `state` plus the ordered list of approved gate topics (e.g. `['plan','merge']`).
|
|
28
|
+
*/
|
|
29
|
+
export async function approveUntilTerminal(api, runId) {
|
|
30
|
+
const approvedTopics = [];
|
|
31
|
+
for (;;) {
|
|
32
|
+
const state = await api.waitForRun({ runId, timeoutMs: WAIT_TIMEOUT_MS, intervalMs: POLL_MS });
|
|
33
|
+
if (state.state !== 'pending_gate')
|
|
34
|
+
return { state: state.state, approvedTopics };
|
|
35
|
+
const inbox = state.inbox;
|
|
36
|
+
assert.ok(inbox, 'pending_gate must include the inbox item to resolve');
|
|
37
|
+
const context = inbox.context;
|
|
38
|
+
assert.ok(context !== null && typeof context === 'object' && !Array.isArray(context));
|
|
39
|
+
const topic = context['topic'];
|
|
40
|
+
assert.equal(typeof topic, 'string');
|
|
41
|
+
approvedTopics.push(topic);
|
|
42
|
+
await api.approveGate({ inboxId: inbox.id, resolvedBy: 'e2e' });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=drive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive.js","sourceRoot":"","sources":["../../../src/e2e/kit/drive.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAGxC,mGAAmG;AACnG,iGAAiG;AACjG,qGAAqG;AACrG,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,yFAAyF;AACzF,MAAM,UAAU,SAAS,CAAC,GAA+B,EAAE,KAAa,EAAE,SAAS,GAAG,eAAe;IACnG,OAAO,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAA+B,EAC/B,KAAa,EACb,aAAgC;IAEhC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/F,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,8BAA8B,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACvF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,qDAAqD,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACtF,MAAM,KAAK,GAAI,OAAmC,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrC,IAAI,aAAa;QAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,aAAa,cAAc,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9G,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAe,EAAE,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAA+B,EAC/B,KAAa;IAEb,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,SAAS,CAAC;QACR,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/F,IAAI,KAAK,CAAC,KAAK,KAAK,cAAc;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;QAClF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,qDAAqD,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACtF,MAAM,KAAK,GAAI,OAAmC,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrC,cAAc,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;QACrC,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { dirname, resolve } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
/** Real e2e gate: only run against real DBOS/Revisium when explicitly enabled. */
|
|
4
|
+
export const RUN_REAL_E2E = process.env['REVO_E2E_REAL'] === '1';
|
|
5
|
+
/** `node:test` skip option — a hint string unless REVO_E2E_REAL=1 (then `false` = run). */
|
|
6
|
+
export const e2eSkip = RUN_REAL_E2E
|
|
7
|
+
? false
|
|
8
|
+
: 'set REVO_E2E_REAL=1 to run real DBOS/Revisium E2E tests';
|
|
9
|
+
/**
|
|
10
|
+
* Playbook installed by the harness. Defaults to the SELF-CONTAINED fixture committed under
|
|
11
|
+
* `src/e2e/fixtures/playbook` (roles + pipelines catalog), so e2e runs are stable and independent
|
|
12
|
+
* of the external agent-playbook checkout. Module-relative (not cwd-dependent). Overridable via
|
|
13
|
+
* REVO_PLAYBOOK_SOURCE to install a different playbook.
|
|
14
|
+
*/
|
|
15
|
+
export const PLAYBOOK_SOURCE = process.env['REVO_PLAYBOOK_SOURCE'] ?? resolve(dirname(fileURLToPath(import.meta.url)), '../fixtures/playbook');
|
|
16
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/e2e/kit/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,kFAAkF;AAClF,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC;AAEjE,2FAA2F;AAC3F,MAAM,CAAC,MAAM,OAAO,GAAmB,YAAY;IACjD,CAAC,CAAC,KAAK;IACP,CAAC,CAAC,yDAAyD,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAC1B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { integrate, confirmMerge, preflightLive, pollPr, respondThreads, asTriage, stubIntegrate, } from '../../runners/integrator.js';
|
|
2
|
+
import { execGit } from './git-target-repo.js';
|
|
3
|
+
/**
|
|
4
|
+
* Build an `IntegratorService`-shaped object wired to the real `integrate`/`preflightLive`/
|
|
5
|
+
* `stubIntegrate` with a real git (on a temp repo) and a fake `gh`.
|
|
6
|
+
*
|
|
7
|
+
* Deliberately bypasses `IntegratorService.runIntegrate`'s `resolvePinnedGh()` step — tests have no
|
|
8
|
+
* real gh identity to pin. Scenarios that must exercise the fail-loud gh-account pinning (D7) should
|
|
9
|
+
* drive the real `IntegratorService` instead of this fake.
|
|
10
|
+
*/
|
|
11
|
+
export function createFakeIntegrator(runs, execGh) {
|
|
12
|
+
const deps = {
|
|
13
|
+
execGit,
|
|
14
|
+
execGh,
|
|
15
|
+
resolveTaskCwd: runs.makeResolveTaskCwd(),
|
|
16
|
+
resolveRunCwd: runs.makeResolveRunCwd(),
|
|
17
|
+
};
|
|
18
|
+
return {
|
|
19
|
+
runIntegrate: (input) => integrate(input, deps),
|
|
20
|
+
runStub: (input) => stubIntegrate(input),
|
|
21
|
+
runConfirmMerge: (input) => confirmMerge(input, deps),
|
|
22
|
+
runConfirmStub: (input) => ({ merged: true, prNumber: 0, prUrl: `stub://pr/${input.taskId}/merged` }),
|
|
23
|
+
runPreflight: (taskId, base) => preflightLive(taskId, base, deps),
|
|
24
|
+
// plan 0018 — pollPr/respondThreads against the fake gh. pollPr's sleep is a no-op + a small poll cap
|
|
25
|
+
// so the e2e gh emulator converges fast (CI/threads flip deterministically per call).
|
|
26
|
+
runPollPr: (input) => pollPr(input, { ...deps, sleep: () => Promise.resolve(), maxPolls: 30 }),
|
|
27
|
+
runPollStub: (_input) => ({ prNumber: null, headSha: 'stub', verdict: 'clean', ciFailures: [], reviewThreads: [] }),
|
|
28
|
+
runRespondThreads: (input) => respondThreads(asTriage(input.triage), deps),
|
|
29
|
+
runRespondStub: (_input) => ({ replied: 0, resolved: 0 }),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Wrap a base IntegratorService so runs whose taskId is registered in `outcomes` get a mocked
|
|
34
|
+
* integrate result (needsHuman or throw); all others delegate to `base` (real integrate/preflight).
|
|
35
|
+
* Mirrors the per-run gh/agent routers — the external boundary is mocked, the workflow is real.
|
|
36
|
+
*/
|
|
37
|
+
export function routedIntegrator(outcomes, base) {
|
|
38
|
+
return {
|
|
39
|
+
runIntegrate: (input) => {
|
|
40
|
+
const outcome = outcomes.get(input.taskId);
|
|
41
|
+
if (outcome?.kind === 'throw')
|
|
42
|
+
return Promise.reject(new Error(outcome.message));
|
|
43
|
+
if (outcome?.kind === 'needsHuman')
|
|
44
|
+
return Promise.resolve({ needsHuman: true, lesson: outcome.lesson });
|
|
45
|
+
return base.runIntegrate(input);
|
|
46
|
+
},
|
|
47
|
+
runStub: base.runStub,
|
|
48
|
+
runConfirmMerge: base.runConfirmMerge,
|
|
49
|
+
runConfirmStub: base.runConfirmStub,
|
|
50
|
+
runPreflight: base.runPreflight,
|
|
51
|
+
runPollPr: base.runPollPr,
|
|
52
|
+
runPollStub: base.runPollStub,
|
|
53
|
+
runRespondThreads: base.runRespondThreads,
|
|
54
|
+
runRespondStub: base.runRespondStub,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=fake-integrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-integrator.js","sourceRoot":"","sources":["../../../src/e2e/kit/fake-integrator.ts"],"names":[],"mappings":"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"}
|