@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
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { RunAgentError } from './runner.js';
|
|
4
|
+
import { boundedPreview, boundedPreviewValue, buildAttemptResult, buildUsageCosts, runnerError, tail, } from './runner-common.js';
|
|
5
|
+
const DEFAULT_TIMEOUT_MS = 600_000;
|
|
6
|
+
const DEFAULT_COMMAND = 'codex';
|
|
7
|
+
export const CODEX_OUTPUT_SCHEMA = {
|
|
8
|
+
type: 'object',
|
|
9
|
+
additionalProperties: false,
|
|
10
|
+
properties: {
|
|
11
|
+
verdict: {
|
|
12
|
+
type: 'string',
|
|
13
|
+
minLength: 1,
|
|
14
|
+
description: 'the single routing token for the role, lowercase',
|
|
15
|
+
},
|
|
16
|
+
output: {
|
|
17
|
+
description: 'the structured or textual output consumed by the orchestrator',
|
|
18
|
+
},
|
|
19
|
+
artifacts: {
|
|
20
|
+
description: 'nullable JSON artifacts; use null when there are no artifacts',
|
|
21
|
+
},
|
|
22
|
+
nextSteps: {
|
|
23
|
+
anyOf: [
|
|
24
|
+
{
|
|
25
|
+
type: 'array',
|
|
26
|
+
description: 'follow-up step specs; use [] when no follow-up work is needed',
|
|
27
|
+
items: { type: 'object' },
|
|
28
|
+
},
|
|
29
|
+
{ type: 'null' },
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
needsHuman: {
|
|
33
|
+
anyOf: [{ type: 'boolean' }, { type: 'null' }],
|
|
34
|
+
description: 'true only when a human must intervene; null is normalized to false',
|
|
35
|
+
},
|
|
36
|
+
lesson: {
|
|
37
|
+
anyOf: [{ type: 'string' }, { type: 'null' }],
|
|
38
|
+
description: 'nullable one-line lesson for a future attempt',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
required: ['verdict', 'output', 'artifacts', 'nextSteps', 'needsHuman', 'lesson'],
|
|
42
|
+
};
|
|
43
|
+
const STRUCTURED_RESULT_NOTE = `
|
|
44
|
+
Return only JSON matching the provided output schema as your final answer.
|
|
45
|
+
All fields are required: verdict, output, artifacts, nextSteps, needsHuman, lesson.
|
|
46
|
+
Use null for nullable fields when they do not apply. Do not put the result only in prose.
|
|
47
|
+
`;
|
|
48
|
+
function writeCodexOutputSchema(processDir) {
|
|
49
|
+
mkdirSync(processDir, { recursive: true });
|
|
50
|
+
const schemaPath = join(processDir, 'codex-output.schema.json');
|
|
51
|
+
writeFileSync(schemaPath, JSON.stringify(CODEX_OUTPUT_SCHEMA, null, 2) + '\n', 'utf8');
|
|
52
|
+
return schemaPath;
|
|
53
|
+
}
|
|
54
|
+
function buildPrompt(context, attemptId) {
|
|
55
|
+
const idempotencyLine = `Attempt-Id: ${attemptId} - idempotency key. Reference it on any external effect you create.`;
|
|
56
|
+
return [context, idempotencyLine, STRUCTURED_RESULT_NOTE].join('\n');
|
|
57
|
+
}
|
|
58
|
+
function isOpenAiCompatibleProvider(provider) {
|
|
59
|
+
const normalized = provider.trim().toLowerCase();
|
|
60
|
+
return normalized.includes('openai') || normalized.includes('codex');
|
|
61
|
+
}
|
|
62
|
+
const WRITE_TOOL_NAMES = new Set(['edit', 'multiedit', 'notebookedit', 'write']);
|
|
63
|
+
const READ_ONLY_RIGHTS = new Set([
|
|
64
|
+
'',
|
|
65
|
+
'deploy-read',
|
|
66
|
+
'qa-live',
|
|
67
|
+
'read only',
|
|
68
|
+
'read-only',
|
|
69
|
+
'read-only pr inspection',
|
|
70
|
+
'readonly',
|
|
71
|
+
'state and routing only',
|
|
72
|
+
]);
|
|
73
|
+
const WORKSPACE_WRITE_RIGHTS = new Set([
|
|
74
|
+
'git and github writes',
|
|
75
|
+
'git-gh',
|
|
76
|
+
'write',
|
|
77
|
+
'write working tree',
|
|
78
|
+
'write-working-tree',
|
|
79
|
+
'working tree write',
|
|
80
|
+
'working-tree-write',
|
|
81
|
+
]);
|
|
82
|
+
function normalizedPolicyLabel(value) {
|
|
83
|
+
return (value ?? '').trim().toLowerCase().replaceAll('_', '-').replace(/\s+/g, ' ');
|
|
84
|
+
}
|
|
85
|
+
function isWriteToolName(tool) {
|
|
86
|
+
const normalized = tool.trim().toLowerCase();
|
|
87
|
+
return WRITE_TOOL_NAMES.has(normalized);
|
|
88
|
+
}
|
|
89
|
+
function sandboxForRole(role) {
|
|
90
|
+
if (role.allowedTools.some(isWriteToolName))
|
|
91
|
+
return 'workspace-write';
|
|
92
|
+
const rights = normalizedPolicyLabel(role.rights);
|
|
93
|
+
if (WORKSPACE_WRITE_RIGHTS.has(rights))
|
|
94
|
+
return 'workspace-write';
|
|
95
|
+
if (READ_ONLY_RIGHTS.has(rights))
|
|
96
|
+
return 'read-only';
|
|
97
|
+
if (rights.length > 0) {
|
|
98
|
+
throw new Error(`codex runner does not know how to map role rights "${role.rights}" to a sandbox`);
|
|
99
|
+
}
|
|
100
|
+
return 'read-only';
|
|
101
|
+
}
|
|
102
|
+
function buildArgs(modelId, sandbox, cwd, schemaPath) {
|
|
103
|
+
return [
|
|
104
|
+
'exec',
|
|
105
|
+
'--json',
|
|
106
|
+
'--output-schema',
|
|
107
|
+
schemaPath,
|
|
108
|
+
'-c',
|
|
109
|
+
'approval_policy="never"',
|
|
110
|
+
'--model',
|
|
111
|
+
modelId,
|
|
112
|
+
'--sandbox',
|
|
113
|
+
sandbox,
|
|
114
|
+
'--cd',
|
|
115
|
+
cwd,
|
|
116
|
+
'--ephemeral',
|
|
117
|
+
'--ignore-user-config',
|
|
118
|
+
'--color',
|
|
119
|
+
'never',
|
|
120
|
+
'-',
|
|
121
|
+
];
|
|
122
|
+
}
|
|
123
|
+
function requireCompatibleProfile(profile) {
|
|
124
|
+
if (profile.modelId.trim().length === 0) {
|
|
125
|
+
throw new Error('codex runner requires a non-empty model_profiles.model_id');
|
|
126
|
+
}
|
|
127
|
+
if (!isOpenAiCompatibleProvider(profile.provider)) {
|
|
128
|
+
throw new Error(`codex runner requires an OpenAI/Codex-compatible provider, got "${profile.provider}"`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function readNumber(value) {
|
|
132
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
133
|
+
}
|
|
134
|
+
function readString(value) {
|
|
135
|
+
return typeof value === 'string' && value.trim().length > 0 ? value : undefined;
|
|
136
|
+
}
|
|
137
|
+
function maybeObject(value) {
|
|
138
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
|
|
139
|
+
}
|
|
140
|
+
function isStructuredCandidate(value) {
|
|
141
|
+
const obj = maybeObject(value);
|
|
142
|
+
return Boolean(obj && 'verdict' in obj && 'output' in obj);
|
|
143
|
+
}
|
|
144
|
+
function parseJsonObjectText(value) {
|
|
145
|
+
const trimmed = value.trim();
|
|
146
|
+
if (!trimmed.startsWith('{') || !trimmed.endsWith('}'))
|
|
147
|
+
return undefined;
|
|
148
|
+
try {
|
|
149
|
+
return JSON.parse(trimmed);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function candidateFromContentArray(value) {
|
|
156
|
+
if (!Array.isArray(value))
|
|
157
|
+
return undefined;
|
|
158
|
+
for (const entry of value) {
|
|
159
|
+
const obj = maybeObject(entry);
|
|
160
|
+
const text = readString(obj?.text) ?? readString(obj?.content);
|
|
161
|
+
if (!text)
|
|
162
|
+
continue;
|
|
163
|
+
const parsed = parseJsonObjectText(text);
|
|
164
|
+
if (isStructuredCandidate(parsed))
|
|
165
|
+
return parsed;
|
|
166
|
+
}
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
const TERMINAL_STRUCTURED_KEYS = ['structured_output', 'structuredOutput', 'final_output', 'finalOutput'];
|
|
170
|
+
const TERMINAL_OBJECT_KEYS = ['output', 'result'];
|
|
171
|
+
const TERMINAL_CONTENT_HOLDER_KEYS = ['output'];
|
|
172
|
+
const TERMINAL_TEXT_KEYS = ['output_text', 'text', 'result'];
|
|
173
|
+
function structuredCandidateFromObjectKeys(source, keys) {
|
|
174
|
+
for (const key of keys) {
|
|
175
|
+
const candidate = source[key];
|
|
176
|
+
if (isStructuredCandidate(candidate))
|
|
177
|
+
return candidate;
|
|
178
|
+
}
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
function structuredCandidateFromContentHolder(value) {
|
|
182
|
+
const obj = maybeObject(value);
|
|
183
|
+
if (!obj)
|
|
184
|
+
return undefined;
|
|
185
|
+
const outputCandidate = structuredCandidateFromObjectKeys(obj, TERMINAL_CONTENT_HOLDER_KEYS);
|
|
186
|
+
return outputCandidate ?? candidateFromContentArray(obj.content);
|
|
187
|
+
}
|
|
188
|
+
function structuredCandidateFromTextKeys(source) {
|
|
189
|
+
for (const key of TERMINAL_TEXT_KEYS) {
|
|
190
|
+
const value = readString(source[key]);
|
|
191
|
+
if (!value)
|
|
192
|
+
continue;
|
|
193
|
+
const parsed = parseJsonObjectText(value);
|
|
194
|
+
if (isStructuredCandidate(parsed))
|
|
195
|
+
return parsed;
|
|
196
|
+
}
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
199
|
+
function structuredCandidateFromTerminalEvent(event) {
|
|
200
|
+
if (event.type !== 'turn.completed')
|
|
201
|
+
return undefined;
|
|
202
|
+
return structuredCandidateFromObjectKeys(event, TERMINAL_STRUCTURED_KEYS)
|
|
203
|
+
?? structuredCandidateFromObjectKeys(event, TERMINAL_OBJECT_KEYS)
|
|
204
|
+
?? structuredCandidateFromContentHolder(event.item)
|
|
205
|
+
?? structuredCandidateFromContentHolder(event.message)
|
|
206
|
+
?? structuredCandidateFromTextKeys(event);
|
|
207
|
+
}
|
|
208
|
+
function eventFailureMessage(event) {
|
|
209
|
+
if (event.type !== 'turn.failed')
|
|
210
|
+
return undefined;
|
|
211
|
+
const error = maybeObject(event.error);
|
|
212
|
+
return readString(event.message)
|
|
213
|
+
?? readString(event.reason)
|
|
214
|
+
?? readString(error?.message)
|
|
215
|
+
?? readString(error?.code)
|
|
216
|
+
?? JSON.stringify(boundedPreviewValue(event));
|
|
217
|
+
}
|
|
218
|
+
function permissionBlockedText(value) {
|
|
219
|
+
const text = typeof value === 'string' ? value : JSON.stringify(boundedPreviewValue(value));
|
|
220
|
+
return /\b(permission|approval|approve|sandbox|policy)\b/i.test(text)
|
|
221
|
+
&& /\b(denied|blocked|disallowed|not allowed|forbidden|rejected|never)\b/i.test(text);
|
|
222
|
+
}
|
|
223
|
+
function usageFromEvent(event) {
|
|
224
|
+
const usage = maybeObject(event.usage) ?? maybeObject(event.token_usage) ?? {};
|
|
225
|
+
return {
|
|
226
|
+
costUsd: readNumber(event.total_cost_usd) ?? readNumber(event.cost_usd) ?? readNumber(usage.cost_usd),
|
|
227
|
+
inputTokens: readNumber(event.input_tokens)
|
|
228
|
+
?? readNumber(event.inputTokens)
|
|
229
|
+
?? readNumber(usage.input_tokens)
|
|
230
|
+
?? readNumber(usage.inputTokens),
|
|
231
|
+
outputTokens: readNumber(event.output_tokens)
|
|
232
|
+
?? readNumber(event.outputTokens)
|
|
233
|
+
?? readNumber(usage.output_tokens)
|
|
234
|
+
?? readNumber(usage.outputTokens),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function parseJsonlEvent(line, lineNumber) {
|
|
238
|
+
let parsed;
|
|
239
|
+
try {
|
|
240
|
+
parsed = JSON.parse(line);
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
throw new Error(`codex exec returned malformed JSONL at line ${lineNumber}`);
|
|
244
|
+
}
|
|
245
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
246
|
+
throw new Error(`codex exec returned non-object JSONL at line ${lineNumber}`);
|
|
247
|
+
}
|
|
248
|
+
return parsed;
|
|
249
|
+
}
|
|
250
|
+
function reportJsonlEvent(event, reporter) {
|
|
251
|
+
reporter?.parsed({ type: readString(event.type) ?? 'event', preview: boundedPreview(event) });
|
|
252
|
+
}
|
|
253
|
+
function applyUsageSummary(summary, event) {
|
|
254
|
+
const usage = usageFromEvent(event);
|
|
255
|
+
summary.costUsd = usage.costUsd ?? summary.costUsd;
|
|
256
|
+
summary.inputTokens = usage.inputTokens ?? summary.inputTokens;
|
|
257
|
+
summary.outputTokens = usage.outputTokens ?? summary.outputTokens;
|
|
258
|
+
}
|
|
259
|
+
function applyFailureSummary(summary, event) {
|
|
260
|
+
const failure = eventFailureMessage(event);
|
|
261
|
+
if (!failure)
|
|
262
|
+
return;
|
|
263
|
+
summary.failedMessage = failure;
|
|
264
|
+
summary.permissionBlocked ||= permissionBlockedText(event);
|
|
265
|
+
}
|
|
266
|
+
function applyStructuredSummary(summary, event) {
|
|
267
|
+
const structured = structuredCandidateFromTerminalEvent(event);
|
|
268
|
+
if (structured !== undefined)
|
|
269
|
+
summary.finalStructured = structured;
|
|
270
|
+
}
|
|
271
|
+
function summarizeCodexEvents(events) {
|
|
272
|
+
if (events.length === 0)
|
|
273
|
+
throw new Error('codex exec did not return JSONL events');
|
|
274
|
+
const summary = { permissionBlocked: false };
|
|
275
|
+
for (const event of events) {
|
|
276
|
+
applyUsageSummary(summary, event);
|
|
277
|
+
applyFailureSummary(summary, event);
|
|
278
|
+
applyStructuredSummary(summary, event);
|
|
279
|
+
}
|
|
280
|
+
return summary;
|
|
281
|
+
}
|
|
282
|
+
function parseCodexJsonl(stdout, reporter) {
|
|
283
|
+
const lines = stdout.split(/\r?\n/).filter((line) => line.trim().length > 0);
|
|
284
|
+
const events = lines.map((line, index) => {
|
|
285
|
+
const event = parseJsonlEvent(line, index + 1);
|
|
286
|
+
reportJsonlEvent(event, reporter);
|
|
287
|
+
return event;
|
|
288
|
+
});
|
|
289
|
+
return summarizeCodexEvents(events);
|
|
290
|
+
}
|
|
291
|
+
function createStreamingJsonlCollector(reporter) {
|
|
292
|
+
let buffered = '';
|
|
293
|
+
let received = '';
|
|
294
|
+
const parsedEvents = [];
|
|
295
|
+
let parseError;
|
|
296
|
+
function parseLine(line) {
|
|
297
|
+
if (line.trim().length === 0)
|
|
298
|
+
return;
|
|
299
|
+
try {
|
|
300
|
+
const event = parseJsonlEvent(line, parsedEvents.length + 1);
|
|
301
|
+
parsedEvents.push(event);
|
|
302
|
+
reportJsonlEvent(event, reporter);
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
parseError = err instanceof Error ? err : new Error(String(err));
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
append(chunk) {
|
|
310
|
+
received += chunk;
|
|
311
|
+
buffered += chunk;
|
|
312
|
+
const parts = buffered.split(/\r?\n/);
|
|
313
|
+
buffered = parts.pop() ?? '';
|
|
314
|
+
for (const part of parts)
|
|
315
|
+
parseLine(part);
|
|
316
|
+
},
|
|
317
|
+
finish(fallbackStdout) {
|
|
318
|
+
if (received.length === 0)
|
|
319
|
+
return parseCodexJsonl(fallbackStdout, reporter);
|
|
320
|
+
parseLine(buffered);
|
|
321
|
+
if (parseError)
|
|
322
|
+
throw parseError;
|
|
323
|
+
return summarizeCodexEvents(parsedEvents);
|
|
324
|
+
},
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
function validateCodexOutputAgainstSchema(value) {
|
|
328
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
329
|
+
return [{ path: '$', message: 'must be an object' }];
|
|
330
|
+
}
|
|
331
|
+
const obj = value;
|
|
332
|
+
return [
|
|
333
|
+
...missingRequiredIssues(obj),
|
|
334
|
+
...additionalPropertyIssues(obj),
|
|
335
|
+
...fieldTypeIssues(obj),
|
|
336
|
+
...nextStepEntryIssues(obj),
|
|
337
|
+
];
|
|
338
|
+
}
|
|
339
|
+
function missingRequiredIssues(obj) {
|
|
340
|
+
return CODEX_OUTPUT_SCHEMA.required
|
|
341
|
+
.filter((key) => !(key in obj))
|
|
342
|
+
.map((key) => ({ path: `$.${key}`, message: 'is required' }));
|
|
343
|
+
}
|
|
344
|
+
function additionalPropertyIssues(obj) {
|
|
345
|
+
if (CODEX_OUTPUT_SCHEMA.additionalProperties === false) {
|
|
346
|
+
const allowed = new Set(Object.keys(CODEX_OUTPUT_SCHEMA.properties));
|
|
347
|
+
return Object.keys(obj)
|
|
348
|
+
.filter((key) => !allowed.has(key))
|
|
349
|
+
.map((key) => ({ path: `$.${key}`, message: 'is not allowed by schema' }));
|
|
350
|
+
}
|
|
351
|
+
return [];
|
|
352
|
+
}
|
|
353
|
+
function fieldTypeIssues(obj) {
|
|
354
|
+
const issues = [];
|
|
355
|
+
if ('verdict' in obj && (typeof obj.verdict !== 'string' || obj.verdict.trim().length === 0)) {
|
|
356
|
+
issues.push({ path: '$.verdict', message: 'must be a non-empty string' });
|
|
357
|
+
}
|
|
358
|
+
if ('nextSteps' in obj && obj.nextSteps !== null && !Array.isArray(obj.nextSteps)) {
|
|
359
|
+
issues.push({ path: '$.nextSteps', message: 'must be an array or null' });
|
|
360
|
+
}
|
|
361
|
+
if ('needsHuman' in obj && obj.needsHuman !== null && typeof obj.needsHuman !== 'boolean') {
|
|
362
|
+
issues.push({ path: '$.needsHuman', message: 'must be a boolean or null' });
|
|
363
|
+
}
|
|
364
|
+
if ('lesson' in obj && obj.lesson !== null && typeof obj.lesson !== 'string') {
|
|
365
|
+
issues.push({ path: '$.lesson', message: 'must be a string or null' });
|
|
366
|
+
}
|
|
367
|
+
return issues;
|
|
368
|
+
}
|
|
369
|
+
function nextStepEntryIssues(obj) {
|
|
370
|
+
if (!Array.isArray(obj.nextSteps))
|
|
371
|
+
return [];
|
|
372
|
+
return obj.nextSteps.flatMap((entry, index) => entry && typeof entry === 'object' && !Array.isArray(entry)
|
|
373
|
+
? []
|
|
374
|
+
: [{ path: `$.nextSteps[${index}]`, message: 'must be an object' }]);
|
|
375
|
+
}
|
|
376
|
+
function normalizeCodexResult(structured) {
|
|
377
|
+
if (structured === undefined)
|
|
378
|
+
throw new TypeError('codex structured result missing final schema output');
|
|
379
|
+
const issues = validateCodexOutputAgainstSchema(structured);
|
|
380
|
+
if (issues.length > 0) {
|
|
381
|
+
const detail = issues.map((issue) => `${issue.path} ${issue.message}`).join('; ');
|
|
382
|
+
throw new TypeError(`codex structured result violates output schema: ${detail}`);
|
|
383
|
+
}
|
|
384
|
+
const obj = structured;
|
|
385
|
+
return {
|
|
386
|
+
verdict: obj.verdict,
|
|
387
|
+
output: obj.output,
|
|
388
|
+
artifacts: obj.artifacts === null ? undefined : obj.artifacts,
|
|
389
|
+
nextSteps: Array.isArray(obj.nextSteps) ? obj.nextSteps : [],
|
|
390
|
+
needsHuman: obj.needsHuman === true,
|
|
391
|
+
lesson: typeof obj.lesson === 'string' ? obj.lesson : undefined,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
export function createCodexRunner(deps) {
|
|
395
|
+
const fallbackTimeoutMs = deps.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
396
|
+
const command = deps.command ?? DEFAULT_COMMAND;
|
|
397
|
+
return async ({ role, profile, context, attemptId, step, reporter }) => {
|
|
398
|
+
let processArtifact;
|
|
399
|
+
try {
|
|
400
|
+
requireCompatibleProfile(profile);
|
|
401
|
+
const timeoutMs = role.timeoutMs ?? fallbackTimeoutMs;
|
|
402
|
+
const cwd = await deps.resolveCwd(step);
|
|
403
|
+
const sandbox = sandboxForRole(role);
|
|
404
|
+
const schemaPath = writeCodexOutputSchema(deps.artifactStore.resolveAttemptDir(step.runId, attemptId));
|
|
405
|
+
const args = buildArgs(profile.modelId, sandbox, cwd, schemaPath);
|
|
406
|
+
processArtifact = deps.artifactStore.startProcess({
|
|
407
|
+
runId: step.runId,
|
|
408
|
+
attemptId,
|
|
409
|
+
stepId: step.id,
|
|
410
|
+
role: role.name,
|
|
411
|
+
command,
|
|
412
|
+
args,
|
|
413
|
+
cwd,
|
|
414
|
+
timeoutMs,
|
|
415
|
+
});
|
|
416
|
+
const collector = createStreamingJsonlCollector(reporter);
|
|
417
|
+
reporter?.started();
|
|
418
|
+
const req = {
|
|
419
|
+
command,
|
|
420
|
+
args,
|
|
421
|
+
cwd,
|
|
422
|
+
timeoutMs,
|
|
423
|
+
input: buildPrompt(context, attemptId),
|
|
424
|
+
onSpawn: (pid) => reporter?.spawned(pid),
|
|
425
|
+
onStdoutChunk: (chunk) => {
|
|
426
|
+
processArtifact?.appendStdout(chunk);
|
|
427
|
+
reporter?.output('stdout', chunk);
|
|
428
|
+
collector.append(chunk);
|
|
429
|
+
},
|
|
430
|
+
onStderrChunk: (chunk) => {
|
|
431
|
+
processArtifact?.appendStderr(chunk);
|
|
432
|
+
reporter?.output('stderr', chunk);
|
|
433
|
+
},
|
|
434
|
+
};
|
|
435
|
+
const result = await deps.executor(req);
|
|
436
|
+
const processSnapshot = processArtifact.finish({ code: result.code, timedOut: result.timedOut });
|
|
437
|
+
if (result.timedOut) {
|
|
438
|
+
reporter?.failed(`codex runner exceeded ${timeoutMs}ms`, { timedOut: true, exitCode: result.code });
|
|
439
|
+
throw runnerError(`codex runner exceeded ${timeoutMs}ms`, processSnapshot);
|
|
440
|
+
}
|
|
441
|
+
if (result.code !== 0) {
|
|
442
|
+
const message = `codex runner exited with code ${String(result.code)}: ${tail(result.stderr || result.stdout)}`;
|
|
443
|
+
if (permissionBlockedText(result.stderr) || permissionBlockedText(result.stdout)) {
|
|
444
|
+
reporter?.status('permission_blocked', { preview: tail(result.stderr || result.stdout) });
|
|
445
|
+
throw runnerError(message, processSnapshot);
|
|
446
|
+
}
|
|
447
|
+
reporter?.failed(`codex runner exited with code ${String(result.code)}`, { exitCode: result.code });
|
|
448
|
+
throw runnerError(message, processSnapshot);
|
|
449
|
+
}
|
|
450
|
+
const summary = collector.finish(result.stdout);
|
|
451
|
+
if (summary.failedMessage) {
|
|
452
|
+
const message = `codex runner reported turn.failed: ${tail(summary.failedMessage)}`;
|
|
453
|
+
if (summary.permissionBlocked) {
|
|
454
|
+
reporter?.status('permission_blocked', { preview: tail(summary.failedMessage) });
|
|
455
|
+
throw runnerError(message, processSnapshot);
|
|
456
|
+
}
|
|
457
|
+
reporter?.failed(message, { exitCode: result.code });
|
|
458
|
+
throw runnerError(message, processSnapshot);
|
|
459
|
+
}
|
|
460
|
+
const agent = normalizeCodexResult(summary.finalStructured);
|
|
461
|
+
const costs = buildUsageCosts(step, profile, summary);
|
|
462
|
+
reporter?.finished({ exitCode: result.code, timedOut: result.timedOut });
|
|
463
|
+
return buildAttemptResult(agent, step, costs, processSnapshot);
|
|
464
|
+
}
|
|
465
|
+
catch (err) {
|
|
466
|
+
if (err instanceof RunAgentError)
|
|
467
|
+
throw err;
|
|
468
|
+
const processSnapshot = processArtifact?.finish({ error: String(err) });
|
|
469
|
+
reporter?.failed(err);
|
|
470
|
+
throw runnerError(String(err), processSnapshot);
|
|
471
|
+
}
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
//# sourceMappingURL=codex-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-runner.js","sourceRoot":"","sources":["../../src/worker/codex-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* git-worktree-manager.ts — per-RUN git worktree lifecycle (plan 0017).
|
|
3
|
+
*
|
|
4
|
+
* DBOS-SEALED: zero @dbos-inc imports. Create/release are registered as memoized DBOS steps in
|
|
5
|
+
* PipelineService; this module is pure git side effects + deterministic paths.
|
|
6
|
+
*
|
|
7
|
+
* Each LIVE run gets ONE isolated worktree at `<dataDir>/worktrees/<runId>`, checked out on the run's
|
|
8
|
+
* feature branch (the SAME `feat/<taskId>-<slug>` the integrator computes) off a freshly-fetched
|
|
9
|
+
* `origin/<base>`. The developer (and rework) steps + the integrator all resolve their cwd to it
|
|
10
|
+
* (see resolveRunCwd), so the user's base checkout is never mutated and concurrent runs on one repo
|
|
11
|
+
* cannot collide. The durable artifact is the pushed branch; the worktree is execution scratch.
|
|
12
|
+
*
|
|
13
|
+
* Replay-safety: `createRunWorktree` is create-IF-ABSENT (a no-op returning the existing path when the
|
|
14
|
+
* worktree is already valid), so a DBOS replay / crash-recovery re-entry never errors and preserves
|
|
15
|
+
* in-flight uncommitted developer work. `releaseRunWorktree` is best-effort and no-ops if absent.
|
|
16
|
+
*/
|
|
17
|
+
import { execFileSync } from 'node:child_process';
|
|
18
|
+
import { existsSync, mkdirSync, rmSync, symlinkSync, writeFileSync, } from 'node:fs';
|
|
19
|
+
import { dirname, join } from 'node:path';
|
|
20
|
+
import { worktreePathFor, worktreeMarkerFor, isWorktreeDir, } from '../control-plane/resolve-cwd.js';
|
|
21
|
+
import { resolveExecutable } from '../runners/integrator.js';
|
|
22
|
+
const GIT_TIMEOUT_MS = 60_000;
|
|
23
|
+
// Resolve `git` to an ABSOLUTE path once (mirrors the integrator's defaultExecGit): execFileSync is
|
|
24
|
+
// never handed a bare command name resolved against a mutable PATH at spawn time.
|
|
25
|
+
let _gitAbsPath;
|
|
26
|
+
function gitAbsPath() {
|
|
27
|
+
if (_gitAbsPath === undefined)
|
|
28
|
+
_gitAbsPath = resolveExecutable('git');
|
|
29
|
+
return _gitAbsPath;
|
|
30
|
+
}
|
|
31
|
+
/** Default git executor — runs the absolute `git` binary in `cwd`. */
|
|
32
|
+
function defaultExecGit(args, cwd) {
|
|
33
|
+
return execFileSync(gitAbsPath(), args, { encoding: 'utf8', cwd, timeout: GIT_TIMEOUT_MS });
|
|
34
|
+
}
|
|
35
|
+
const INSTALL_TIMEOUT_MS = 300_000;
|
|
36
|
+
/** Default pnpm install executor — runs the absolute `pnpm` binary. Throws if pnpm is unavailable
|
|
37
|
+
* (the caller treats a throw as "fall back to the node_modules symlink"). */
|
|
38
|
+
function defaultExecInstall(args, cwd) {
|
|
39
|
+
execFileSync(resolveExecutable('pnpm'), args, { cwd, timeout: INSTALL_TIMEOUT_MS, stdio: 'ignore' });
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Provision the worktree's dependencies so the developer/tests can build & run.
|
|
43
|
+
*
|
|
44
|
+
* Why pnpm gets a real install (not the symlink): pnpm's `node_modules` is a virtual store of symlinks
|
|
45
|
+
* into `node_modules/.pnpm` wired to the project layout; symlinking the base's `node_modules` into a
|
|
46
|
+
* worktree at a different path shares a MUTABLE tree across runs (one install/postinstall leaks into
|
|
47
|
+
* the base and parallel runs). A `pnpm install --frozen-lockfile` in the worktree is cheap (hard-links
|
|
48
|
+
* from the global content-addressed store, no re-download) and yields a correct, ISOLATED tree from the
|
|
49
|
+
* committed `pnpm-lock.yaml`. Non-pnpm repos keep the best-effort base-`node_modules` symlink.
|
|
50
|
+
*/
|
|
51
|
+
function provisionDeps(worktreePath, baseRepoCwd, execInstall) {
|
|
52
|
+
if (existsSync(join(worktreePath, 'pnpm-lock.yaml'))) {
|
|
53
|
+
try {
|
|
54
|
+
execInstall(['install', '--frozen-lockfile'], worktreePath);
|
|
55
|
+
return; // isolated install succeeded — do NOT also symlink
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// pnpm unavailable / install failed — fall through to the symlink fallback below
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const baseModules = join(baseRepoCwd, 'node_modules');
|
|
63
|
+
const wtModules = join(worktreePath, 'node_modules');
|
|
64
|
+
if (existsSync(baseModules) && !existsSync(wtModules)) {
|
|
65
|
+
symlinkSync(baseModules, wtModules, 'dir');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// ignore — the developer simply runs without provisioned node_modules
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create the run's isolated worktree if absent (idempotent). Returns its path.
|
|
74
|
+
*
|
|
75
|
+
* 1. If a valid worktree already exists at the deterministic path → write the live marker and return
|
|
76
|
+
* it (replay / recovery: never clobber in-flight developer work).
|
|
77
|
+
* 2. Else: fetch `origin/<base>`, then `git worktree add -B <branch> <path> origin/<base>` (create-or-
|
|
78
|
+
* reset the feature branch and check it out in the new worktree).
|
|
79
|
+
* 3. Provision deps (provisionDeps): `pnpm install --frozen-lockfile` for a pnpm repo, else a
|
|
80
|
+
* best-effort base-`node_modules` symlink — so the developer can build/test in the isolated tree.
|
|
81
|
+
* 4. Write the `<runId>.live` marker (fail-loud signal for the resolver).
|
|
82
|
+
*/
|
|
83
|
+
export function createRunWorktree(opts) {
|
|
84
|
+
const { runId, baseRepoCwd, base, branch, dataDir } = opts;
|
|
85
|
+
const execGit = opts.execGit ?? defaultExecGit;
|
|
86
|
+
const execInstall = opts.execInstall ?? defaultExecInstall;
|
|
87
|
+
const worktreePath = worktreePathFor(dataDir, runId);
|
|
88
|
+
if (isWorktreeDir(worktreePath)) {
|
|
89
|
+
writeMarker(dataDir, runId);
|
|
90
|
+
return { worktreePath };
|
|
91
|
+
}
|
|
92
|
+
mkdirSync(dirname(worktreePath), { recursive: true });
|
|
93
|
+
// Fetch the base so the worktree is cut from fresh origin/<base>.
|
|
94
|
+
execGit(['fetch', 'origin', base], baseRepoCwd);
|
|
95
|
+
// -B: create-or-reset <branch> at origin/<base> and check it out in the new linked worktree.
|
|
96
|
+
execGit(['worktree', 'add', '-B', branch, worktreePath, `origin/${base}`], baseRepoCwd);
|
|
97
|
+
// Provision dependencies (pnpm install for a pnpm repo, else node_modules symlink) — best-effort.
|
|
98
|
+
provisionDeps(worktreePath, baseRepoCwd, execInstall);
|
|
99
|
+
writeMarker(dataDir, runId);
|
|
100
|
+
return { worktreePath };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Release the run's worktree (best-effort, idempotent). Removes the linked worktree + prunes stale
|
|
104
|
+
* administrative entries + drops the live marker. No-ops if the worktree is already gone. Called only
|
|
105
|
+
* at a TERMINAL state — never while parked at a gate (the workflow stays alive across `recv`, so the
|
|
106
|
+
* lifecycle `finally` does not run during a park).
|
|
107
|
+
*/
|
|
108
|
+
export function releaseRunWorktree(opts) {
|
|
109
|
+
const { runId, baseRepoCwd, dataDir } = opts;
|
|
110
|
+
const execGit = opts.execGit ?? defaultExecGit;
|
|
111
|
+
const worktreePath = worktreePathFor(dataDir, runId);
|
|
112
|
+
try {
|
|
113
|
+
if (existsSync(worktreePath)) {
|
|
114
|
+
execGit(['worktree', 'remove', '--force', worktreePath], baseRepoCwd);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// ignore — fall through to a best-effort dir removal, then prune the admin entry
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
if (existsSync(worktreePath))
|
|
122
|
+
rmSync(worktreePath, { recursive: true, force: true });
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// ignore
|
|
126
|
+
}
|
|
127
|
+
// Prune AFTER any manual removal so the `.git/worktrees/<id>` admin entry is cleaned in both the
|
|
128
|
+
// `git worktree remove` path and the manual-rm fallback path.
|
|
129
|
+
try {
|
|
130
|
+
execGit(['worktree', 'prune'], baseRepoCwd);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// ignore — prune is housekeeping only
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
rmSync(worktreeMarkerFor(dataDir, runId), { force: true });
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// ignore
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// The live marker is the signal that makes resolveRunCwd FAIL LOUD on a lost worktree. If it cannot be
|
|
143
|
+
// written we must NOT proceed silently (a later lost worktree would then fall back to the shared base
|
|
144
|
+
// checkout, masking the isolation failure) — throw so the create step fails and the run surfaces it.
|
|
145
|
+
function writeMarker(dataDir, runId) {
|
|
146
|
+
writeFileSync(worktreeMarkerFor(dataDir, runId), `${runId}\n`, 'utf8');
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=git-worktree-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-worktree-manager.js","sourceRoot":"","sources":["../../src/worker/git-worktree-manager.ts"],"names":[],"mappings":"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"}
|