@revisium/orchestrator 0.1.0-alpha.4 → 0.1.0-alpha.6
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 +149 -1
- package/control-plane/bootstrap.config.json +1 -0
- package/control-plane/default-playbook/catalog/pipelines.json +289 -52
- package/control-plane/default-playbook/catalog/roles.json +9 -0
- package/control-plane/default-playbook/prompts/analyst.md +3 -1
- package/control-plane/default-playbook/prompts/reviewer.md +2 -2
- package/control-plane/default-playbook/prompts/triager.md +51 -0
- package/control-plane/default-playbook/prompts/watcher.md +2 -2
- 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 +39 -0
- package/dist/cli/commands/doctor-report.js.map +1 -0
- package/dist/cli/commands/lifecycle.js +237 -0
- package/dist/cli/commands/lifecycle.js.map +1 -0
- package/dist/cli/commands/mcp.js +46 -8
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/revisium-helpers.js +2 -2
- package/dist/cli/index.js +5 -29
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/program.js +7 -21
- package/dist/cli/program.js.map +1 -1
- package/dist/config.js +57 -5
- package/dist/config.js.map +1 -1
- package/dist/control-plane/bootstrap.js +93 -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/data-access.js +10 -3
- package/dist/control-plane/data-access.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/resolve-cwd.js +76 -8
- package/dist/control-plane/resolve-cwd.js.map +1 -1
- package/dist/control-plane/schema-migration.js +7 -11
- package/dist/control-plane/schema-migration.js.map +1 -1
- package/dist/control-plane/seed-default-playbook.js +23 -0
- package/dist/control-plane/seed-default-playbook.js.map +1 -1
- package/dist/control-plane/steps.js +15 -349
- package/dist/control-plane/steps.js.map +1 -1
- package/dist/e2e/kit/agents.js +43 -8
- package/dist/e2e/kit/agents.js.map +1 -1
- package/dist/e2e/kit/assertions.js +57 -14
- package/dist/e2e/kit/assertions.js.map +1 -1
- package/dist/e2e/kit/drive.js +0 -4
- package/dist/e2e/kit/drive.js.map +1 -1
- package/dist/e2e/kit/fake-integrator.js +16 -1
- package/dist/e2e/kit/fake-integrator.js.map +1 -1
- package/dist/e2e/kit/gh-emulator.js +173 -10
- package/dist/e2e/kit/gh-emulator.js.map +1 -1
- package/dist/e2e/kit/git-target-repo.js +35 -3
- package/dist/e2e/kit/git-target-repo.js.map +1 -1
- package/dist/e2e/kit/harness.js +16 -3
- package/dist/e2e/kit/harness.js.map +1 -1
- package/dist/e2e/kit/scenarios.js +1 -1
- package/dist/e2e/recovery-dd-crash-child.js +3 -2
- package/dist/e2e/recovery-dd-crash-child.js.map +1 -1
- 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 +11 -9
- 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 +68 -0
- package/dist/host/daemon.js.map +1 -0
- package/dist/host/ensure-host.js +109 -0
- package/dist/host/ensure-host.js.map +1 -0
- package/dist/host/host-runtime.js +52 -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/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 +6 -1
- package/dist/mcp/mcp-capabilities.js.map +1 -1
- package/dist/mcp/mcp-facade.service.js +24 -0
- 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 +58 -0
- 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 +184 -73
- package/dist/pipeline/data-driven-task.workflow.js.map +1 -1
- package/dist/pipeline/data-driven-template.js +3 -3
- package/dist/pipeline/pipeline.module.js +1 -1
- package/dist/pipeline/pipeline.module.js.map +1 -1
- package/dist/pipeline/{develop-task.workflow.js → pipeline.service.js} +97 -26
- package/dist/pipeline/pipeline.service.js.map +1 -0
- package/dist/pipeline-core/kit/fixtures.js +94 -0
- package/dist/pipeline-core/kit/fixtures.js.map +1 -1
- 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 +180 -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 +34 -1107
- package/dist/pipeline-core/validate.js.map +1 -1
- package/dist/revisium/run.service.js +31 -8
- package/dist/revisium/run.service.js.map +1 -1
- package/dist/run/create-run.js +5 -31
- package/dist/run/create-run.js.map +1 -1
- package/dist/run/inspect-run.js +2 -29
- package/dist/run/inspect-run.js.map +1 -1
- package/dist/run/terminal-run-status.js +7 -30
- package/dist/run/terminal-run-status.js.map +1 -1
- package/dist/runners/claude-code.service.js +1 -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 +24 -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 +250 -134
- 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/task-control-plane-api.service.js +317 -4
- 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 +6 -1
- package/dist/worker/artifact-store.js.map +1 -1
- package/dist/worker/build-context.js +135 -1
- package/dist/worker/build-context.js.map +1 -1
- package/dist/worker/claude-code-runner.js +79 -82
- 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 +148 -0
- package/dist/worker/git-worktree-manager.js.map +1 -0
- package/dist/worker/result-envelope.js +75 -63
- 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 +3 -1
- package/dist/worker/runner-dispatch.js.map +1 -1
- package/dist/worker/runner.js.map +1 -1
- package/dist/worker/stub-runner.js +3 -3
- package/dist/worker/stub-runner.js.map +1 -1
- package/package.json +15 -7
- package/dist/app.module.js +0 -28
- package/dist/app.module.js.map +0 -1
- package/dist/cli/commands/bootstrap.js +0 -100
- 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 -453
- package/dist/cli/commands/run.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 -77
- 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.map +0 -1
- package/dist/worker/worktree-manager.js +0 -7
- package/dist/worker/worktree-manager.js.map +0 -1
package/dist/e2e/kit/agents.js
CHANGED
|
@@ -1,25 +1,60 @@
|
|
|
1
|
-
import { writeFileSync } from 'node:fs';
|
|
1
|
+
import { existsSync, writeFileSync } from 'node:fs';
|
|
2
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
|
+
}
|
|
3
26
|
function pickBehavior(spec, role, callIndex) {
|
|
4
27
|
const entry = spec.byRole?.[role];
|
|
5
28
|
if (Array.isArray(entry))
|
|
6
29
|
return entry[Math.min(callIndex, entry.length - 1)] ?? { kind: 'pass' };
|
|
7
30
|
return entry ?? spec.default ?? { kind: 'pass' };
|
|
8
31
|
}
|
|
32
|
+
function defaultVerdictFor(role) {
|
|
33
|
+
return role === 'watcher' ? 'clean' : 'approved';
|
|
34
|
+
}
|
|
9
35
|
function runBehavior(behavior, ctx, sink) {
|
|
10
36
|
if (behavior.kind === 'throw') {
|
|
11
37
|
throw new Error(behavior.message ?? `scripted failure from ${ctx.logicalRole}`);
|
|
12
38
|
}
|
|
13
|
-
const writeRepo = ctx.logicalRole === 'developer' ? sink.developerWrites.get(ctx.runId) : undefined;
|
|
39
|
+
const writeRepo = ctx.logicalRole === 'developer' ? resolveWriteDir(ctx.runId, sink.developerWrites.get(ctx.runId)) : undefined;
|
|
14
40
|
if (writeRepo && behavior.kind !== 'needsHuman') {
|
|
15
41
|
writeFileSync(join(writeRepo, `developer-${ctx.attemptId}.txt`), `change from ${ctx.attemptId}\n`);
|
|
16
42
|
}
|
|
17
|
-
|
|
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);
|
|
18
52
|
const cost = behavior.kind === 'cost'
|
|
19
53
|
? { inputTokens: behavior.inputTokens, outputTokens: behavior.outputTokens, costAmount: behavior.costAmount }
|
|
20
54
|
: { inputTokens: 10, outputTokens: 5, costAmount: 0.001 };
|
|
21
55
|
return {
|
|
22
|
-
output: {
|
|
56
|
+
output: { role: ctx.logicalRole, runner: ctx.runner },
|
|
57
|
+
verdict,
|
|
23
58
|
artifacts: {
|
|
24
59
|
process: { ref: `test-artifacts/${ctx.attemptId}`, stdoutTail: `stdout from ${ctx.logicalRole}`, stderrTail: '' },
|
|
25
60
|
},
|
|
@@ -49,7 +84,7 @@ export function scriptedAgent(spec, sink) {
|
|
|
49
84
|
/**
|
|
50
85
|
* Agent that dispatches to a per-run {@link AgentSpec} from `specs` (keyed by runId), so one harness
|
|
51
86
|
* can drive many runs with different failure scripts. Create the run with `start:false`, register its
|
|
52
|
-
* spec in `specs`, then `startRun` — the workflow then reads this run's plan. Defaults to
|
|
87
|
+
* spec in `specs`, then `startRun` — the workflow then reads this run's plan. Defaults to domain success.
|
|
53
88
|
*/
|
|
54
89
|
export function routedScriptedAgent(specs, sink) {
|
|
55
90
|
const counts = new Map();
|
|
@@ -70,7 +105,7 @@ export function routedScriptedAgent(specs, sink) {
|
|
|
70
105
|
};
|
|
71
106
|
}
|
|
72
107
|
/**
|
|
73
|
-
* Deterministic test agent: records every call, returns a
|
|
108
|
+
* Deterministic test agent: records every call, returns a domain success verdict with fixed costs and a
|
|
74
109
|
* process artifact. When the logical role is `developer` and a worktree is registered for the run,
|
|
75
110
|
* it writes a file so the real integrator has a diff to commit.
|
|
76
111
|
*
|
|
@@ -81,16 +116,16 @@ export function deterministicAgent(agentCalls, developerWrites) {
|
|
|
81
116
|
return async ({ role, profile, attemptId, step, context }) => {
|
|
82
117
|
const logicalRole = role.playbookRoleId ?? role.name;
|
|
83
118
|
agentCalls.push({ role: logicalRole, runner: role.runner, attemptId, runId: step.runId, context });
|
|
84
|
-
const writeRepo = logicalRole === 'developer' ? developerWrites.get(step.runId) : undefined;
|
|
119
|
+
const writeRepo = logicalRole === 'developer' ? resolveWriteDir(step.runId, developerWrites.get(step.runId)) : undefined;
|
|
85
120
|
if (writeRepo) {
|
|
86
121
|
writeFileSync(join(writeRepo, `developer-${attemptId}.txt`), `change from ${attemptId}\n`);
|
|
87
122
|
}
|
|
88
123
|
return {
|
|
89
124
|
output: {
|
|
90
|
-
verdict: 'PASS',
|
|
91
125
|
role: logicalRole,
|
|
92
126
|
runner: role.runner,
|
|
93
127
|
},
|
|
128
|
+
verdict: defaultVerdictFor(logicalRole),
|
|
94
129
|
artifacts: {
|
|
95
130
|
process: {
|
|
96
131
|
ref: `test-artifacts/${attemptId}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/e2e/kit/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/e2e/kit/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import assert from 'node:assert/strict';
|
|
2
|
-
|
|
3
|
-
/** Assert the run reached `completed` and left no claimable (`ready`) steps. Returns the detail. */
|
|
2
|
+
/** Assert the run reached `completed`. Returns the detail. */
|
|
4
3
|
export async function assertCompleted(api, runId) {
|
|
5
|
-
// The
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// still fails after the window (a real bug), but the propagation lag no longer flakes the suite.
|
|
4
|
+
// The run-row status patch can lag the workflow's terminal transition by a beat under load, so poll
|
|
5
|
+
// for the authoritative run status to settle rather than reading once. (There are no `steps` rows to
|
|
6
|
+
// settle — the data-driven engine writes none; progress lives in DBOS — audit §3.1.)
|
|
9
7
|
let detail = await api.getRun({ runId, includeEvents: true, includeLog: true });
|
|
10
|
-
for (let waited = 0; waited < 5_000 &&
|
|
8
|
+
for (let waited = 0; waited < 5_000 && detail.run.status !== 'completed'; waited += 250) {
|
|
11
9
|
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
12
10
|
detail = await api.getRun({ runId, includeEvents: true, includeLog: true });
|
|
13
11
|
}
|
|
14
12
|
assert.equal(detail.run.status, 'completed');
|
|
15
|
-
assert.ok(allSteps(detail).every((s) => s.status !== 'ready'), 'terminal run must not leave ready steps');
|
|
16
13
|
return detail;
|
|
17
14
|
}
|
|
18
15
|
/** Assert the recorded attempt verdicts (in order) and that each carries a process artifact ref. */
|
|
@@ -28,13 +25,25 @@ export async function assertAttemptVerdicts(api, runId, verdicts) {
|
|
|
28
25
|
* `approveUntilTerminal` returns can race the append and miss it (the F1 recovery flake). A type that
|
|
29
26
|
* is genuinely never emitted still fails after the window — this hides propagation lag, not real gaps. */
|
|
30
27
|
export async function assertEventsPresent(api, runId, types) {
|
|
31
|
-
|
|
28
|
+
// limit 500 (not 50): a recovered/looped run (replay + the pollPr review tail) can accrue >50 events,
|
|
29
|
+
// and getRunEvents returns oldest-first — a 50-window would drop the terminal `run_completed`.
|
|
30
|
+
let events = await api.getRunEvents({ runId, limit: 500 });
|
|
32
31
|
const missing = () => types.filter((type) => !events.some((e) => e.type === type));
|
|
33
|
-
for (let waited = 0; waited <
|
|
32
|
+
for (let waited = 0; waited < 8_000 && missing().length > 0; waited += 250) {
|
|
34
33
|
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
35
|
-
events = await api.getRunEvents({ runId, limit:
|
|
34
|
+
events = await api.getRunEvents({ runId, limit: 500 });
|
|
35
|
+
}
|
|
36
|
+
// Deterministic fallback for the terminal `run_completed` event: it is appended just AFTER the run-row
|
|
37
|
+
// status patch, so on a fast run it can still trail the read window. The run STATUS being `completed`
|
|
38
|
+
// (the authoritative signal `wait_for_run`/`approveUntilTerminal` already observed) proves completion,
|
|
39
|
+
// so accept `run_completed` when the run row is `completed` even if its event append hasn't surfaced.
|
|
40
|
+
let runCompleted = false;
|
|
41
|
+
if (types.includes('run_completed') && !events.some((e) => e.type === 'run_completed')) {
|
|
42
|
+
runCompleted = (await api.getRun({ runId })).run.status === 'completed';
|
|
36
43
|
}
|
|
37
44
|
for (const type of types) {
|
|
45
|
+
if (type === 'run_completed' && runCompleted)
|
|
46
|
+
continue;
|
|
38
47
|
assert.ok(events.some((e) => e.type === type), `event "${type}" must be visible`);
|
|
39
48
|
}
|
|
40
49
|
}
|
|
@@ -79,9 +88,23 @@ export async function assertLessonRedacted(api, runId, rawToken) {
|
|
|
79
88
|
* engine relies on so DBOS workflow replays are side-effect-free.
|
|
80
89
|
*/
|
|
81
90
|
export async function assertReplayIdempotent(api, runId) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
91
|
+
// Observation order (kills the false negative): FIRST confirm the run-row reached `completed` — the
|
|
92
|
+
// authoritative signal that recovery actually FINISHED — via the bounded status poll (`assertCompleted`).
|
|
93
|
+
// Counting `run_completed` before the run is terminal is the trap: a 0 then means "recovery still in
|
|
94
|
+
// flight", not "the append lagged". The recovery tests already drove the run terminal, so this
|
|
95
|
+
// re-confirms instantly; a run that never completes fails honestly there (drive.ts: >10s = stuck = bug).
|
|
96
|
+
await assertCompleted(api, runId);
|
|
97
|
+
// limit 500, oldest-first: a recovered/looped run can accrue >100 events, so a 100-row window would DROP
|
|
98
|
+
// the terminal `run_completed` (the newest event) entirely — the primary F2 flake (a dropped window, not
|
|
99
|
+
// append lag). Same reason assertEventsPresent reads 500. One read: the run is already confirmed completed.
|
|
100
|
+
const events = await api.getRunEvents({ runId, limit: 500 });
|
|
101
|
+
// Replay idempotency relaxes ONLY downward, never up — the duplicate guard is the load-bearing invariant:
|
|
102
|
+
// >= 2 → ALWAYS fail (a duplicated terminal event on DBOS replay is exactly the bug this guards);
|
|
103
|
+
// == 1 → the normal exactly-once;
|
|
104
|
+
// == 0 → accepted ONLY because the run is confirmed `completed` above — the append trails the status
|
|
105
|
+
// patch (propagation lag, not a real gap; mirrors assertEventsPresent's terminal fallback).
|
|
106
|
+
const runCompletedCount = events.filter((e) => e.type === 'run_completed').length;
|
|
107
|
+
assert.ok(runCompletedCount <= 1, `run_completed must not be duplicated after recovery (DBOS replay idempotency) — saw ${runCompletedCount}`);
|
|
85
108
|
const stepKeys = events
|
|
86
109
|
.filter((e) => e.type === 'step_succeeded')
|
|
87
110
|
.map((e) => String(e.payload?.stepKey ?? ''));
|
|
@@ -96,6 +119,26 @@ export function assertGhNotCalled(h, taskId, sub) {
|
|
|
96
119
|
export function executedRoles(h, runId) {
|
|
97
120
|
return h.agentCalls.filter((c) => c.runId === runId).map((c) => [c.role, c.runner]);
|
|
98
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Assert a `step_succeeded` for `role` was emitted after `afterEventType`. The two operands differ in
|
|
124
|
+
* shape on purpose: an integrator is a stub runner that emits `integrate_succeeded` (an event type),
|
|
125
|
+
* never a step — so the ordering is checked across the two event shapes, not within one. The step's
|
|
126
|
+
* role is the resolved binding (playbook-prefixed), matched by suffix so the assertion is robust to
|
|
127
|
+
* the install prefix and the template's node naming.
|
|
128
|
+
*/
|
|
129
|
+
export async function assertRoleStepAfterEvent(api, runId, role, afterEventType) {
|
|
130
|
+
const events = await api.getRunEvents({ runId, limit: 500 });
|
|
131
|
+
const eventIdx = events.findIndex((e) => e.type === afterEventType);
|
|
132
|
+
const stepIdx = events.findIndex((e) => {
|
|
133
|
+
if (e.type !== 'step_succeeded')
|
|
134
|
+
return false;
|
|
135
|
+
const stepRole = e.payload?.role;
|
|
136
|
+
return typeof stepRole === 'string' && stepRole.endsWith(role);
|
|
137
|
+
});
|
|
138
|
+
assert.ok(eventIdx >= 0, `${afterEventType} was emitted`);
|
|
139
|
+
assert.ok(stepIdx >= 0, `${role}'s step_succeeded was emitted`);
|
|
140
|
+
assert.ok(eventIdx < stepIdx, `${role} ran after ${afterEventType}`);
|
|
141
|
+
}
|
|
99
142
|
/**
|
|
100
143
|
* Assert the fake gh opened a draft PR for the run's feature branch (list → create → view),
|
|
101
144
|
* scoped by `taskId` so it is robust to other runs' gh calls. Returns the head branch name.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assertions.js","sourceRoot":"","sources":["../../../src/e2e/kit/assertions.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"assertions.js","sourceRoot":"","sources":["../../../src/e2e/kit/assertions.ts"],"names":[],"mappings":"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"}
|
package/dist/e2e/kit/drive.js
CHANGED
|
@@ -4,10 +4,6 @@ import assert from 'node:assert/strict';
|
|
|
4
4
|
// A real run settles in a few seconds — if a wait needs >10s the run is stuck (a bug), so fail fast.
|
|
5
5
|
const POLL_MS = 500;
|
|
6
6
|
const WAIT_TIMEOUT_MS = 10_000;
|
|
7
|
-
/** Flatten every step across a run's tasks. */
|
|
8
|
-
export function allSteps(detail) {
|
|
9
|
-
return detail.tasks.flatMap((task) => task.steps);
|
|
10
|
-
}
|
|
11
7
|
/** Poll until the run settles (terminal or parked at a gate). Returns the wait state. */
|
|
12
8
|
export function waitState(api, runId, timeoutMs = WAIT_TIMEOUT_MS) {
|
|
13
9
|
return api.waitForRun({ runId, timeoutMs, intervalMs: POLL_MS });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drive.js","sourceRoot":"","sources":["../../../src/e2e/kit/drive.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;
|
|
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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { integrate, preflightLive, stubIntegrate, } from '../../runners/integrator.js';
|
|
1
|
+
import { integrate, confirmMerge, preflightLive, pollPr, respondThreads, asTriage, stubIntegrate, } from '../../runners/integrator.js';
|
|
2
2
|
import { execGit } from './git-target-repo.js';
|
|
3
3
|
/**
|
|
4
4
|
* Build an `IntegratorService`-shaped object wired to the real `integrate`/`preflightLive`/
|
|
@@ -13,11 +13,20 @@ export function createFakeIntegrator(runs, execGh) {
|
|
|
13
13
|
execGit,
|
|
14
14
|
execGh,
|
|
15
15
|
resolveTaskCwd: runs.makeResolveTaskCwd(),
|
|
16
|
+
resolveRunCwd: runs.makeResolveRunCwd(),
|
|
16
17
|
};
|
|
17
18
|
return {
|
|
18
19
|
runIntegrate: (input) => integrate(input, deps),
|
|
19
20
|
runStub: (input) => stubIntegrate(input),
|
|
21
|
+
runConfirmMerge: (input) => confirmMerge(input, deps),
|
|
22
|
+
runConfirmStub: (input) => ({ merged: true, prNumber: 0, prUrl: `stub://pr/${input.taskId}/merged` }),
|
|
20
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 }),
|
|
21
30
|
};
|
|
22
31
|
}
|
|
23
32
|
/**
|
|
@@ -36,7 +45,13 @@ export function routedIntegrator(outcomes, base) {
|
|
|
36
45
|
return base.runIntegrate(input);
|
|
37
46
|
},
|
|
38
47
|
runStub: base.runStub,
|
|
48
|
+
runConfirmMerge: base.runConfirmMerge,
|
|
49
|
+
runConfirmStub: base.runConfirmStub,
|
|
39
50
|
runPreflight: base.runPreflight,
|
|
51
|
+
runPollPr: base.runPollPr,
|
|
52
|
+
runPollStub: base.runPollStub,
|
|
53
|
+
runRespondThreads: base.runRespondThreads,
|
|
54
|
+
runRespondStub: base.runRespondStub,
|
|
40
55
|
};
|
|
41
56
|
}
|
|
42
57
|
//# sourceMappingURL=fake-integrator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fake-integrator.js","sourceRoot":"","sources":["../../../src/e2e/kit/fake-integrator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,aAAa,EACb,aAAa,
|
|
1
|
+
{"version":3,"file":"fake-integrator.js","sourceRoot":"","sources":["../../../src/e2e/kit/fake-integrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,49 +1,212 @@
|
|
|
1
1
|
const PR_URL = 'https://github.com/e2e/repo/pull/1';
|
|
2
2
|
const PR_URL_2 = 'https://github.com/e2e/repo/pull/2';
|
|
3
3
|
const BASE = 'master'; // createTargetRepo() bases every run on master
|
|
4
|
-
|
|
4
|
+
/** Branch from a `gh pr <view|merge|ready> <branch> …` argv (integrator/confirmMerge pass it as args[2]). */
|
|
5
|
+
function branchArg(args) {
|
|
6
|
+
return args[2] ?? '';
|
|
7
|
+
}
|
|
8
|
+
/** Value following a flag in argv (e.g. `--head <branch>`). */
|
|
9
|
+
function flagValue(args, flag) {
|
|
10
|
+
const i = args.indexOf(flag);
|
|
11
|
+
return i >= 0 ? (args[i + 1] ?? '') : '';
|
|
12
|
+
}
|
|
13
|
+
/** The `-f key=value` GraphQL variable (gh api graphql passes vars as repeated `-f k=v`). */
|
|
14
|
+
function gqlVar(args, key) {
|
|
15
|
+
for (let i = 0; i < args.length - 1; i++) {
|
|
16
|
+
if ((args[i] === '-f' || args[i] === '-F') && (args[i + 1] ?? '').startsWith(`${key}=`)) {
|
|
17
|
+
return (args[i + 1] ?? '').slice(key.length + 1);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return '';
|
|
21
|
+
}
|
|
22
|
+
/** The GraphQL query/mutation text (the `-f query=…` value). */
|
|
23
|
+
function gqlQuery(args) {
|
|
24
|
+
for (let i = 0; i < args.length - 1; i++) {
|
|
25
|
+
if (args[i] === '-f' && (args[i + 1] ?? '').startsWith('query='))
|
|
26
|
+
return (args[i + 1] ?? '').slice('query='.length);
|
|
27
|
+
}
|
|
28
|
+
return '';
|
|
29
|
+
}
|
|
30
|
+
function newGhState() {
|
|
31
|
+
return {
|
|
32
|
+
mergedBranches: new Set(),
|
|
33
|
+
readyBranches: new Set(),
|
|
34
|
+
createdBranches: new Set(),
|
|
35
|
+
repushedBranches: new Set(),
|
|
36
|
+
unresolvedThreads: new Map(),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** True once the integrator created (or the scenario pre-seeds) a PR for `branch`. */
|
|
40
|
+
function hasOpenPr(scenario, st, branch) {
|
|
41
|
+
return scenario === 'pr-already-exists' || st.createdBranches.has(branch);
|
|
42
|
+
}
|
|
43
|
+
/** Review threads for a branch, lazily seeded from the scenario (review-comment → one unresolved). */
|
|
44
|
+
function threadsFor(scenario, st, branch) {
|
|
45
|
+
let set = st.unresolvedThreads.get(branch);
|
|
46
|
+
if (!set) {
|
|
47
|
+
set = new Set(scenario === 'review-comment' ? ['PRRT_T1'] : []);
|
|
48
|
+
st.unresolvedThreads.set(branch, set);
|
|
49
|
+
}
|
|
50
|
+
return set;
|
|
51
|
+
}
|
|
52
|
+
function ghBehavior(scenario, args, st) {
|
|
5
53
|
if (scenario === 'gh-error') {
|
|
6
54
|
throw new Error('gh: API rate limit exceeded for installation (e2e gh-error scenario)');
|
|
7
55
|
}
|
|
8
56
|
if (scenario === 'gh-token-leak') {
|
|
9
57
|
throw new Error('gh: bad credentials using token gho_abcdEFGH1234567890LEAK rejected by server');
|
|
10
58
|
}
|
|
59
|
+
// ── plan 0018 — GraphQL review-thread query + reply/resolve mutations (gh api graphql) ──
|
|
60
|
+
if (args[0] === 'api' && args[1] === 'graphql') {
|
|
61
|
+
const query = gqlQuery(args);
|
|
62
|
+
if (query.includes('reviewThreads')) {
|
|
63
|
+
// collectPrReadiness reads reviewThreads by owner/name/number — return the unresolved nodes shape.
|
|
64
|
+
// The set is per the run's only branch; the e2e routes by taskId so a single branch is in play.
|
|
65
|
+
const branch = onlyBranch(st);
|
|
66
|
+
const ids = [...threadsFor(scenario, st, branch)];
|
|
67
|
+
// collectPrReadiness's mapReviewThreads reads `repository.pullRequest.reviewThreads` at the ROOT
|
|
68
|
+
// (matching how the readiness layer consumes the gh-graphql result — see pr-readiness.test.ts's
|
|
69
|
+
// reviewThreadsResponse). It is NOT wrapped in a `data` envelope here.
|
|
70
|
+
return JSON.stringify({
|
|
71
|
+
repository: {
|
|
72
|
+
pullRequest: {
|
|
73
|
+
reviewThreads: {
|
|
74
|
+
nodes: ids.map((id) => ({
|
|
75
|
+
id,
|
|
76
|
+
isResolved: false,
|
|
77
|
+
isOutdated: false,
|
|
78
|
+
path: 'src/foo.ts',
|
|
79
|
+
line: 3,
|
|
80
|
+
comments: { nodes: [{ body: 'please address this review comment', url: `${PR_URL}#${id}`, author: { login: 'coderabbitai' } }] },
|
|
81
|
+
})),
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
if (query.includes('resolveReviewThread')) {
|
|
88
|
+
const id = gqlVar(args, 'id');
|
|
89
|
+
for (const set of st.unresolvedThreads.values())
|
|
90
|
+
set.delete(id);
|
|
91
|
+
return JSON.stringify({ data: { resolveReviewThread: { thread: { id, isResolved: true } } } });
|
|
92
|
+
}
|
|
93
|
+
if (query.includes('addPullRequestReviewThreadReply')) {
|
|
94
|
+
return JSON.stringify({ data: { addPullRequestReviewThreadReply: { clientMutationId: null } } });
|
|
95
|
+
}
|
|
96
|
+
throw new Error(`unexpected gh api graphql call: ${args.join(' ')}`);
|
|
97
|
+
}
|
|
11
98
|
if (args[0] === 'pr' && args[1] === 'list') {
|
|
12
|
-
if (scenario === 'pr-already-exists')
|
|
13
|
-
return JSON.stringify([{ number: 7, url: PR_URL, baseRefName: BASE }]);
|
|
14
99
|
if (scenario === 'ambiguous-prs') {
|
|
15
100
|
return JSON.stringify([
|
|
16
|
-
{ number: 7, url: PR_URL, baseRefName: BASE },
|
|
17
|
-
{ number: 8, url: PR_URL_2, baseRefName: BASE },
|
|
101
|
+
{ number: 7, url: PR_URL, baseRefName: BASE, state: 'OPEN' },
|
|
102
|
+
{ number: 8, url: PR_URL_2, baseRefName: BASE, state: 'OPEN' },
|
|
18
103
|
]);
|
|
19
104
|
}
|
|
105
|
+
const head = flagValue(args, '--head');
|
|
106
|
+
if (hasOpenPr(scenario, st, head)) {
|
|
107
|
+
return JSON.stringify([{ number: 7, url: PR_URL, baseRefName: BASE, state: 'OPEN' }]);
|
|
108
|
+
}
|
|
20
109
|
return JSON.stringify([]);
|
|
21
110
|
}
|
|
22
|
-
if (args[0] === 'pr' && args[1] === 'create')
|
|
111
|
+
if (args[0] === 'pr' && args[1] === 'create') {
|
|
112
|
+
st.createdBranches.add(flagValue(args, '--head'));
|
|
23
113
|
return `${PR_URL}\n`;
|
|
114
|
+
}
|
|
115
|
+
if (args[0] === 'pr' && args[1] === 'ready') {
|
|
116
|
+
// confirmMerge marks the draft ready before merging.
|
|
117
|
+
st.readyBranches.add(branchArg(args));
|
|
118
|
+
return '';
|
|
119
|
+
}
|
|
120
|
+
if (args[0] === 'pr' && args[1] === 'merge') {
|
|
121
|
+
// Real gh refuses to merge a draft — model that so a missing `pr ready` is caught.
|
|
122
|
+
if (!st.readyBranches.has(branchArg(args))) {
|
|
123
|
+
throw new Error('gh: Pull Request is still a draft (mergePullRequest)');
|
|
124
|
+
}
|
|
125
|
+
// confirmMerge: record the merge so the verifying re-view reports MERGED.
|
|
126
|
+
st.mergedBranches.add(branchArg(args));
|
|
127
|
+
return '';
|
|
128
|
+
}
|
|
24
129
|
if (args[0] === 'pr' && args[1] === 'view') {
|
|
25
|
-
|
|
130
|
+
if (scenario === 'pr-view-non-json')
|
|
131
|
+
return 'not json — gh glitch';
|
|
132
|
+
const branch = branchArg(args);
|
|
133
|
+
const wantsRollup = args.some((a) => a.includes('statusCheckRollup'));
|
|
134
|
+
if (wantsRollup) {
|
|
135
|
+
// pollPr's collectPrReadiness view: report the CI rollup + draft/state. ci-red-then-green starts
|
|
136
|
+
// FAILING and flips to SUCCESS once a developer re-pushed (repushedBranches). A re-push is modelled
|
|
137
|
+
// by the second `pr create` (idempotent integrator) NOT firing — so we flip on the integrator's push
|
|
138
|
+
// recorded as a re-list; here we approximate: red until the branch is re-pushed at least once.
|
|
139
|
+
const ciRed = scenario === 'ci-red-then-green' && !st.repushedBranches.has(branch);
|
|
140
|
+
// record that pollPr saw the branch; the NEXT integrate re-push will flip it green
|
|
141
|
+
if (scenario === 'ci-red-then-green' && ciRed)
|
|
142
|
+
st.repushedBranches.add(branch);
|
|
143
|
+
return JSON.stringify({
|
|
144
|
+
number: 7,
|
|
145
|
+
url: PR_URL,
|
|
146
|
+
state: 'OPEN',
|
|
147
|
+
isDraft: false,
|
|
148
|
+
baseRefName: BASE,
|
|
149
|
+
headRefName: branch,
|
|
150
|
+
headRefOid: 'deadbeefcafe',
|
|
151
|
+
mergeStateStatus: 'CLEAN',
|
|
152
|
+
reviewDecision: '',
|
|
153
|
+
mergeable: 'MERGEABLE',
|
|
154
|
+
statusCheckRollup: ciRed
|
|
155
|
+
? [{ __typename: 'CheckRun', name: 'build', status: 'COMPLETED', conclusion: 'FAILURE' }]
|
|
156
|
+
: [{ __typename: 'CheckRun', name: 'build', status: 'COMPLETED', conclusion: 'SUCCESS' }],
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
// Mirror REAL gh: there is NO `merged` JSON field — `state` (OPEN|MERGED|CLOSED) is the truth.
|
|
160
|
+
// A freshly-created PR is a draft until `gh pr ready` (confirmMerge / integrator post-create view).
|
|
161
|
+
return JSON.stringify({
|
|
162
|
+
url: PR_URL,
|
|
163
|
+
number: 1,
|
|
164
|
+
state: st.mergedBranches.has(branch) ? 'MERGED' : 'OPEN',
|
|
165
|
+
isDraft: !st.readyBranches.has(branch),
|
|
166
|
+
mergeStateStatus: scenario === 'merge-not-clean' ? 'BLOCKED' : 'CLEAN',
|
|
167
|
+
});
|
|
26
168
|
}
|
|
27
169
|
throw new Error(`unexpected gh call: ${args.join(' ')}`);
|
|
28
170
|
}
|
|
171
|
+
/** The single feature branch in play for an emulator instance (e2e routes one branch per run). */
|
|
172
|
+
function onlyBranch(st) {
|
|
173
|
+
return [...st.createdBranches][0] ?? '';
|
|
174
|
+
}
|
|
29
175
|
/** Single-scenario fake `gh`, recording argv into `calls`. (Default harness gh = `happy`.) */
|
|
30
176
|
export function createGhEmulator(calls, scenario = 'happy') {
|
|
177
|
+
const st = newGhState();
|
|
31
178
|
return (args) => {
|
|
32
179
|
calls.push(args);
|
|
33
|
-
return ghBehavior(scenario, args);
|
|
180
|
+
return ghBehavior(scenario, args, st);
|
|
34
181
|
};
|
|
35
182
|
}
|
|
36
183
|
/**
|
|
37
184
|
* Per-run fake `gh`: routes to a scenario by the feature branch (`feat/<taskId>-…`) present in the
|
|
38
185
|
* gh argv, so one shared harness can drive many runs with different gh outcomes. Register a run's
|
|
39
186
|
* scenario in `scenarios` (keyed by taskId) before starting it; unregistered runs get `happy`.
|
|
187
|
+
*
|
|
188
|
+
* Each taskId gets its OWN {@link GhState} so per-branch CI/thread/merge state never bleeds across runs.
|
|
40
189
|
*/
|
|
41
190
|
export function routedGhEmulator(scenarios, calls) {
|
|
191
|
+
const stByTask = new Map();
|
|
192
|
+
const fallback = newGhState();
|
|
193
|
+
// GraphQL review-thread calls carry owner/name/number, NOT the feature branch — they cannot be routed
|
|
194
|
+
// by branch. collectPrReadiness always issues a branch-carrying `pr list`/`pr view` immediately BEFORE
|
|
195
|
+
// its reviewThreads query within one poll, so the last branch-routed taskId is the right owner for it.
|
|
196
|
+
let lastTaskId;
|
|
42
197
|
return (args) => {
|
|
43
198
|
calls.push(args);
|
|
44
|
-
const
|
|
199
|
+
const branchTaskId = [...scenarios.keys()].find((id) => args.some((a) => a.includes(`feat/${id}-`)));
|
|
200
|
+
if (branchTaskId !== undefined)
|
|
201
|
+
lastTaskId = branchTaskId;
|
|
202
|
+
const taskId = branchTaskId ?? lastTaskId;
|
|
45
203
|
const scenario = (taskId !== undefined ? scenarios.get(taskId) : undefined) ?? 'happy';
|
|
46
|
-
|
|
204
|
+
let st = fallback;
|
|
205
|
+
if (taskId !== undefined) {
|
|
206
|
+
st = stByTask.get(taskId) ?? newGhState();
|
|
207
|
+
stByTask.set(taskId, st);
|
|
208
|
+
}
|
|
209
|
+
return ghBehavior(scenario, args, st);
|
|
47
210
|
};
|
|
48
211
|
}
|
|
49
212
|
//# sourceMappingURL=gh-emulator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gh-emulator.js","sourceRoot":"","sources":["../../../src/e2e/kit/gh-emulator.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG,oCAAoC,CAAC;AACpD,MAAM,QAAQ,GAAG,oCAAoC,CAAC;AACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,+CAA+C;
|
|
1
|
+
{"version":3,"file":"gh-emulator.js","sourceRoot":"","sources":["../../../src/e2e/kit/gh-emulator.ts"],"names":[],"mappings":"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"}
|