@shipfox/api-workflows 2.0.0
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/.turbo/turbo-build.log +2 -0
- package/.turbo/turbo-type$colon$emit.log +1 -0
- package/.turbo/turbo-type.log +1 -0
- package/CHANGELOG.md +311 -0
- package/LICENSE +21 -0
- package/dist/core/agent-tool-capability-warning.d.ts +7 -0
- package/dist/core/agent-tool-capability-warning.d.ts.map +1 -0
- package/dist/core/agent-tool-capability-warning.js +149 -0
- package/dist/core/agent-tool-capability-warning.js.map +1 -0
- package/dist/core/agent-tools.d.ts +51 -0
- package/dist/core/agent-tools.d.ts.map +1 -0
- package/dist/core/agent-tools.js +296 -0
- package/dist/core/agent-tools.js.map +1 -0
- package/dist/core/checkout.d.ts +29 -0
- package/dist/core/checkout.d.ts.map +1 -0
- package/dist/core/checkout.js +42 -0
- package/dist/core/checkout.js.map +1 -0
- package/dist/core/condition-trace.d.ts +13 -0
- package/dist/core/condition-trace.d.ts.map +1 -0
- package/dist/core/condition-trace.js +51 -0
- package/dist/core/condition-trace.js.map +1 -0
- package/dist/core/entities/index.d.ts +5 -0
- package/dist/core/entities/index.d.ts.map +1 -0
- package/dist/core/entities/index.js +3 -0
- package/dist/core/entities/index.js.map +1 -0
- package/dist/core/entities/job-execution.d.ts +30 -0
- package/dist/core/entities/job-execution.d.ts.map +1 -0
- package/dist/core/entities/job-execution.js +3 -0
- package/dist/core/entities/job-execution.js.map +1 -0
- package/dist/core/entities/job-listener-event.d.ts +15 -0
- package/dist/core/entities/job-listener-event.d.ts.map +1 -0
- package/dist/core/entities/job-listener-event.js +3 -0
- package/dist/core/entities/job-listener-event.js.map +1 -0
- package/dist/core/entities/job.d.ts +54 -0
- package/dist/core/entities/job.d.ts.map +1 -0
- package/dist/core/entities/job.js +29 -0
- package/dist/core/entities/job.js.map +1 -0
- package/dist/core/entities/step.d.ts +86 -0
- package/dist/core/entities/step.d.ts.map +1 -0
- package/dist/core/entities/step.js +12 -0
- package/dist/core/entities/step.js.map +1 -0
- package/dist/core/entities/workflow-run-attempt.d.ts +20 -0
- package/dist/core/entities/workflow-run-attempt.d.ts.map +1 -0
- package/dist/core/entities/workflow-run-attempt.js +3 -0
- package/dist/core/entities/workflow-run-attempt.js.map +1 -0
- package/dist/core/entities/workflow-run.d.ts +66 -0
- package/dist/core/entities/workflow-run.d.ts.map +1 -0
- package/dist/core/entities/workflow-run.js +10 -0
- package/dist/core/entities/workflow-run.js.map +1 -0
- package/dist/core/errors.d.ts +85 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +134 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/job-execution-outcome.d.ts +29 -0
- package/dist/core/job-execution-outcome.d.ts.map +1 -0
- package/dist/core/job-execution-outcome.js +31 -0
- package/dist/core/job-execution-outcome.js.map +1 -0
- package/dist/core/job-execution.d.ts +37 -0
- package/dist/core/job-execution.d.ts.map +1 -0
- package/dist/core/job-execution.js +425 -0
- package/dist/core/job-execution.js.map +1 -0
- package/dist/core/job-transition/decide-job-activation.d.ts +29 -0
- package/dist/core/job-transition/decide-job-activation.d.ts.map +1 -0
- package/dist/core/job-transition/decide-job-activation.js +51 -0
- package/dist/core/job-transition/decide-job-activation.js.map +1 -0
- package/dist/core/job-transition/derive-job-execution-outputs.d.ts +18 -0
- package/dist/core/job-transition/derive-job-execution-outputs.d.ts.map +1 -0
- package/dist/core/job-transition/derive-job-execution-outputs.js +23 -0
- package/dist/core/job-transition/derive-job-execution-outputs.js.map +1 -0
- package/dist/core/job-transition/derive-job-success.d.ts +16 -0
- package/dist/core/job-transition/derive-job-success.d.ts.map +1 -0
- package/dist/core/job-transition/derive-job-success.js +47 -0
- package/dist/core/job-transition/derive-job-success.js.map +1 -0
- package/dist/core/job-transition/index.d.ts +5 -0
- package/dist/core/job-transition/index.d.ts.map +1 -0
- package/dist/core/job-transition/index.js +6 -0
- package/dist/core/job-transition/index.js.map +1 -0
- package/dist/core/job-transition/runtime-completion-status-for-job.d.ts +4 -0
- package/dist/core/job-transition/runtime-completion-status-for-job.d.ts.map +1 -0
- package/dist/core/job-transition/runtime-completion-status-for-job.js +8 -0
- package/dist/core/job-transition/runtime-completion-status-for-job.js.map +1 -0
- package/dist/core/listener-execution-materialization.d.ts +30 -0
- package/dist/core/listener-execution-materialization.d.ts.map +1 -0
- package/dist/core/listener-execution-materialization.js +87 -0
- package/dist/core/listener-execution-materialization.js.map +1 -0
- package/dist/core/run-workflow.d.ts +11 -0
- package/dist/core/run-workflow.d.ts.map +1 -0
- package/dist/core/run-workflow.js +28 -0
- package/dist/core/run-workflow.js.map +1 -0
- package/dist/core/source-control.d.ts +5 -0
- package/dist/core/source-control.d.ts.map +1 -0
- package/dist/core/source-control.js +19 -0
- package/dist/core/source-control.js.map +1 -0
- package/dist/core/step-config/agent.d.ts +49 -0
- package/dist/core/step-config/agent.d.ts.map +1 -0
- package/dist/core/step-config/agent.js +337 -0
- package/dist/core/step-config/agent.js.map +1 -0
- package/dist/core/step-config/assemble-run-context.d.ts +94 -0
- package/dist/core/step-config/assemble-run-context.d.ts.map +1 -0
- package/dist/core/step-config/assemble-run-context.js +393 -0
- package/dist/core/step-config/assemble-run-context.js.map +1 -0
- package/dist/core/step-config/complete-step-dispatch-config.d.ts +13 -0
- package/dist/core/step-config/complete-step-dispatch-config.d.ts.map +1 -0
- package/dist/core/step-config/complete-step-dispatch-config.js +38 -0
- package/dist/core/step-config/complete-step-dispatch-config.js.map +1 -0
- package/dist/core/step-config/fields.d.ts +38 -0
- package/dist/core/step-config/fields.d.ts.map +1 -0
- package/dist/core/step-config/fields.js +72 -0
- package/dist/core/step-config/fields.js.map +1 -0
- package/dist/core/step-config/index.d.ts +8 -0
- package/dist/core/step-config/index.d.ts.map +1 -0
- package/dist/core/step-config/index.js +7 -0
- package/dist/core/step-config/index.js.map +1 -0
- package/dist/core/step-config/materialize-job-execution-steps.d.ts +35 -0
- package/dist/core/step-config/materialize-job-execution-steps.d.ts.map +1 -0
- package/dist/core/step-config/materialize-job-execution-steps.js +92 -0
- package/dist/core/step-config/materialize-job-execution-steps.js.map +1 -0
- package/dist/core/step-config/materialize-workflow-model.d.ts +42 -0
- package/dist/core/step-config/materialize-workflow-model.d.ts.map +1 -0
- package/dist/core/step-config/materialize-workflow-model.js +96 -0
- package/dist/core/step-config/materialize-workflow-model.js.map +1 -0
- package/dist/core/step-config/resolve-job-execution-name.d.ts +18 -0
- package/dist/core/step-config/resolve-job-execution-name.d.ts.map +1 -0
- package/dist/core/step-config/resolve-job-execution-name.js +36 -0
- package/dist/core/step-config/resolve-job-execution-name.js.map +1 -0
- package/dist/core/step-config/resolve-step-config.d.ts +33 -0
- package/dist/core/step-config/resolve-step-config.d.ts.map +1 -0
- package/dist/core/step-config/resolve-step-config.js +164 -0
- package/dist/core/step-config/resolve-step-config.js.map +1 -0
- package/dist/core/step-config/run.d.ts +39 -0
- package/dist/core/step-config/run.d.ts.map +1 -0
- package/dist/core/step-config/run.js +360 -0
- package/dist/core/step-config/run.js.map +1 -0
- package/dist/core/step-config/workflow-evaluation-context.d.ts +6 -0
- package/dist/core/step-config/workflow-evaluation-context.d.ts.map +1 -0
- package/dist/core/step-config/workflow-evaluation-context.js +3 -0
- package/dist/core/step-config/workflow-evaluation-context.js.map +1 -0
- package/dist/core/step-transition/apply-step-transition.d.ts +26 -0
- package/dist/core/step-transition/apply-step-transition.d.ts.map +1 -0
- package/dist/core/step-transition/apply-step-transition.js +141 -0
- package/dist/core/step-transition/apply-step-transition.js.map +1 -0
- package/dist/core/step-transition/decide-step-transition.d.ts +71 -0
- package/dist/core/step-transition/decide-step-transition.d.ts.map +1 -0
- package/dist/core/step-transition/decide-step-transition.js +110 -0
- package/dist/core/step-transition/decide-step-transition.js.map +1 -0
- package/dist/core/step-transition/evaluate-gate.d.ts +28 -0
- package/dist/core/step-transition/evaluate-gate.d.ts.map +1 -0
- package/dist/core/step-transition/evaluate-gate.js +159 -0
- package/dist/core/step-transition/evaluate-gate.js.map +1 -0
- package/dist/core/step-transition/read-step-outputs.d.ts +3 -0
- package/dist/core/step-transition/read-step-outputs.d.ts.map +1 -0
- package/dist/core/step-transition/read-step-outputs.js +24 -0
- package/dist/core/step-transition/read-step-outputs.js.map +1 -0
- package/dist/core/workflow-run-creation.d.ts +43 -0
- package/dist/core/workflow-run-creation.d.ts.map +1 -0
- package/dist/core/workflow-run-creation.js +80 -0
- package/dist/core/workflow-run-creation.js.map +1 -0
- package/dist/core/workflow-scheduling/index.d.ts +5 -0
- package/dist/core/workflow-scheduling/index.d.ts.map +1 -0
- package/dist/core/workflow-scheduling/index.js +4 -0
- package/dist/core/workflow-scheduling/index.js.map +1 -0
- package/dist/core/workflow-scheduling/run-progress.d.ts +20 -0
- package/dist/core/workflow-scheduling/run-progress.d.ts.map +1 -0
- package/dist/core/workflow-scheduling/run-progress.js +40 -0
- package/dist/core/workflow-scheduling/run-progress.js.map +1 -0
- package/dist/core/workflow-scheduling/runtime-dag.d.ts +10 -0
- package/dist/core/workflow-scheduling/runtime-dag.d.ts.map +1 -0
- package/dist/core/workflow-scheduling/runtime-dag.js +3 -0
- package/dist/core/workflow-scheduling/runtime-dag.js.map +1 -0
- package/dist/core/workflow-scheduling/runtime-scheduling-command.d.ts +16 -0
- package/dist/core/workflow-scheduling/runtime-scheduling-command.d.ts.map +1 -0
- package/dist/core/workflow-scheduling/runtime-scheduling-command.js +3 -0
- package/dist/core/workflow-scheduling/runtime-scheduling-command.js.map +1 -0
- package/dist/core/workflow-scheduling/schedule-runtime-dag.d.ts +9 -0
- package/dist/core/workflow-scheduling/schedule-runtime-dag.d.ts.map +1 -0
- package/dist/core/workflow-scheduling/schedule-runtime-dag.js +72 -0
- package/dist/core/workflow-scheduling/schedule-runtime-dag.js.map +1 -0
- package/dist/db/db.d.ts +4959 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +37 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +10 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/job-listener-events.d.ts +18 -0
- package/dist/db/job-listener-events.d.ts.map +1 -0
- package/dist/db/job-listener-events.js +59 -0
- package/dist/db/job-listener-events.js.map +1 -0
- package/dist/db/job-listeners.d.ts +55 -0
- package/dist/db/job-listeners.d.ts.map +1 -0
- package/dist/db/job-listeners.js +358 -0
- package/dist/db/job-listeners.js.map +1 -0
- package/dist/db/outbox-writes.d.ts +12 -0
- package/dist/db/outbox-writes.d.ts.map +1 -0
- package/dist/db/outbox-writes.js +20 -0
- package/dist/db/outbox-writes.js.map +1 -0
- package/dist/db/runner-lease-table.d.ts +469 -0
- package/dist/db/runner-lease-table.d.ts.map +1 -0
- package/dist/db/runner-lease-table.js +42 -0
- package/dist/db/runner-lease-table.js.map +1 -0
- package/dist/db/schema/common.d.ts +2 -0
- package/dist/db/schema/common.d.ts.map +1 -0
- package/dist/db/schema/common.js +4 -0
- package/dist/db/schema/common.js.map +1 -0
- package/dist/db/schema/job-executions.d.ts +311 -0
- package/dist/db/schema/job-executions.d.ts.map +1 -0
- package/dist/db/schema/job-executions.js +76 -0
- package/dist/db/schema/job-executions.js.map +1 -0
- package/dist/db/schema/job-listener-events.d.ts +200 -0
- package/dist/db/schema/job-listener-events.d.ts.map +1 -0
- package/dist/db/schema/job-listener-events.js +50 -0
- package/dist/db/schema/job-listener-events.js.map +1 -0
- package/dist/db/schema/jobs.d.ts +542 -0
- package/dist/db/schema/jobs.d.ts.map +1 -0
- package/dist/db/schema/jobs.js +121 -0
- package/dist/db/schema/jobs.js.map +1 -0
- package/dist/db/schema/outbox.d.ts +195 -0
- package/dist/db/schema/outbox.d.ts.map +1 -0
- package/dist/db/schema/outbox.js +5 -0
- package/dist/db/schema/outbox.js.map +1 -0
- package/dist/db/schema/step-attempts.d.ts +330 -0
- package/dist/db/schema/step-attempts.d.ts.map +1 -0
- package/dist/db/schema/step-attempts.js +80 -0
- package/dist/db/schema/step-attempts.js.map +1 -0
- package/dist/db/schema/steps.d.ts +352 -0
- package/dist/db/schema/steps.d.ts.map +1 -0
- package/dist/db/schema/steps.js +80 -0
- package/dist/db/schema/steps.js.map +1 -0
- package/dist/db/schema/workflow-run-attempts.d.ts +239 -0
- package/dist/db/schema/workflow-run-attempts.d.ts.map +1 -0
- package/dist/db/schema/workflow-run-attempts.js +53 -0
- package/dist/db/schema/workflow-run-attempts.js.map +1 -0
- package/dist/db/schema/workflow-runs.d.ts +360 -0
- package/dist/db/schema/workflow-runs.d.ts.map +1 -0
- package/dist/db/schema/workflow-runs.js +85 -0
- package/dist/db/schema/workflow-runs.js.map +1 -0
- package/dist/db/workflow-runs/job-executions.d.ts +49 -0
- package/dist/db/workflow-runs/job-executions.d.ts.map +1 -0
- package/dist/db/workflow-runs/job-executions.js +271 -0
- package/dist/db/workflow-runs/job-executions.js.map +1 -0
- package/dist/db/workflow-runs/jobs.d.ts +60 -0
- package/dist/db/workflow-runs/jobs.d.ts.map +1 -0
- package/dist/db/workflow-runs/jobs.js +288 -0
- package/dist/db/workflow-runs/jobs.js.map +1 -0
- package/dist/db/workflow-runs/outbox.d.ts +20 -0
- package/dist/db/workflow-runs/outbox.d.ts.map +1 -0
- package/dist/db/workflow-runs/outbox.js +68 -0
- package/dist/db/workflow-runs/outbox.js.map +1 -0
- package/dist/db/workflow-runs/queries.d.ts +71 -0
- package/dist/db/workflow-runs/queries.d.ts.map +1 -0
- package/dist/db/workflow-runs/queries.js +253 -0
- package/dist/db/workflow-runs/queries.js.map +1 -0
- package/dist/db/workflow-runs/run-create.d.ts +32 -0
- package/dist/db/workflow-runs/run-create.d.ts.map +1 -0
- package/dist/db/workflow-runs/run-create.js +288 -0
- package/dist/db/workflow-runs/run-create.js.map +1 -0
- package/dist/db/workflow-runs/run-graph.d.ts +27 -0
- package/dist/db/workflow-runs/run-graph.d.ts.map +1 -0
- package/dist/db/workflow-runs/run-graph.js +63 -0
- package/dist/db/workflow-runs/run-graph.js.map +1 -0
- package/dist/db/workflow-runs/run-rerun.d.ts +8 -0
- package/dist/db/workflow-runs/run-rerun.d.ts.map +1 -0
- package/dist/db/workflow-runs/run-rerun.js +207 -0
- package/dist/db/workflow-runs/run-rerun.js.map +1 -0
- package/dist/db/workflow-runs/run-status.d.ts +24 -0
- package/dist/db/workflow-runs/run-status.d.ts.map +1 -0
- package/dist/db/workflow-runs/run-status.js +249 -0
- package/dist/db/workflow-runs/run-status.js.map +1 -0
- package/dist/db/workflow-runs/runs.d.ts +7 -0
- package/dist/db/workflow-runs/runs.d.ts.map +1 -0
- package/dist/db/workflow-runs/runs.js +5 -0
- package/dist/db/workflow-runs/runs.js.map +1 -0
- package/dist/db/workflow-runs/shared.d.ts +24 -0
- package/dist/db/workflow-runs/shared.d.ts.map +1 -0
- package/dist/db/workflow-runs/shared.js +50 -0
- package/dist/db/workflow-runs/shared.js.map +1 -0
- package/dist/db/workflow-runs/steps.d.ts +83 -0
- package/dist/db/workflow-runs/steps.d.ts.map +1 -0
- package/dist/db/workflow-runs/steps.js +246 -0
- package/dist/db/workflow-runs/steps.js.map +1 -0
- package/dist/db/workflow-runs.d.ts +12 -0
- package/dist/db/workflow-runs.d.ts.map +1 -0
- package/dist/db/workflow-runs.js +8 -0
- package/dist/db/workflow-runs.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +3 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/instance.d.ts +20 -0
- package/dist/metrics/instance.d.ts.map +1 -0
- package/dist/metrics/instance.js +127 -0
- package/dist/metrics/instance.js.map +1 -0
- package/dist/metrics/service.d.ts +2 -0
- package/dist/metrics/service.d.ts.map +1 -0
- package/dist/metrics/service.js +30 -0
- package/dist/metrics/service.js.map +1 -0
- package/dist/presentation/dto/checkout-token.d.ts +6 -0
- package/dist/presentation/dto/checkout-token.d.ts.map +1 -0
- package/dist/presentation/dto/checkout-token.js +74 -0
- package/dist/presentation/dto/checkout-token.js.map +1 -0
- package/dist/presentation/dto/index.d.ts +4 -0
- package/dist/presentation/dto/index.d.ts.map +1 -0
- package/dist/presentation/dto/index.js +5 -0
- package/dist/presentation/dto/index.js.map +1 -0
- package/dist/presentation/dto/job.d.ts +6 -0
- package/dist/presentation/dto/job.d.ts.map +1 -0
- package/dist/presentation/dto/job.js +59 -0
- package/dist/presentation/dto/job.js.map +1 -0
- package/dist/presentation/dto/step.d.ts +6 -0
- package/dist/presentation/dto/step.d.ts.map +1 -0
- package/dist/presentation/dto/step.js +162 -0
- package/dist/presentation/dto/step.js.map +1 -0
- package/dist/presentation/dto/workflow-run.d.ts +6 -0
- package/dist/presentation/dto/workflow-run.d.ts.map +1 -0
- package/dist/presentation/dto/workflow-run.js +35 -0
- package/dist/presentation/dto/workflow-run.js.map +1 -0
- package/dist/presentation/index.d.ts +3 -0
- package/dist/presentation/index.d.ts.map +1 -0
- package/dist/presentation/index.js +4 -0
- package/dist/presentation/index.js.map +1 -0
- package/dist/presentation/routes/agent-runtime-config.d.ts +2 -0
- package/dist/presentation/routes/agent-runtime-config.d.ts.map +1 -0
- package/dist/presentation/routes/agent-runtime-config.js +71 -0
- package/dist/presentation/routes/agent-runtime-config.js.map +1 -0
- package/dist/presentation/routes/cancel-run.d.ts +2 -0
- package/dist/presentation/routes/cancel-run.d.ts.map +1 -0
- package/dist/presentation/routes/cancel-run.js +46 -0
- package/dist/presentation/routes/cancel-run.js.map +1 -0
- package/dist/presentation/routes/checkout-token.d.ts +2 -0
- package/dist/presentation/routes/checkout-token.d.ts.map +1 -0
- package/dist/presentation/routes/checkout-token.js +64 -0
- package/dist/presentation/routes/checkout-token.js.map +1 -0
- package/dist/presentation/routes/get-run-aggregates.d.ts +2 -0
- package/dist/presentation/routes/get-run-aggregates.d.ts.map +1 -0
- package/dist/presentation/routes/get-run-aggregates.js +60 -0
- package/dist/presentation/routes/get-run-aggregates.js.map +1 -0
- package/dist/presentation/routes/get-run.d.ts +2 -0
- package/dist/presentation/routes/get-run.d.ts.map +1 -0
- package/dist/presentation/routes/get-run.js +60 -0
- package/dist/presentation/routes/get-run.js.map +1 -0
- package/dist/presentation/routes/get-step-secrets.d.ts +2 -0
- package/dist/presentation/routes/get-step-secrets.d.ts.map +1 -0
- package/dist/presentation/routes/get-step-secrets.js +115 -0
- package/dist/presentation/routes/get-step-secrets.js.map +1 -0
- package/dist/presentation/routes/index.d.ts +4 -0
- package/dist/presentation/routes/index.d.ts.map +1 -0
- package/dist/presentation/routes/index.js +41 -0
- package/dist/presentation/routes/index.js.map +1 -0
- package/dist/presentation/routes/leased-step.d.ts +14 -0
- package/dist/presentation/routes/leased-step.d.ts.map +1 -0
- package/dist/presentation/routes/leased-step.js +50 -0
- package/dist/presentation/routes/leased-step.js.map +1 -0
- package/dist/presentation/routes/list-run-attempts.d.ts +2 -0
- package/dist/presentation/routes/list-run-attempts.d.ts.map +1 -0
- package/dist/presentation/routes/list-run-attempts.js +35 -0
- package/dist/presentation/routes/list-run-attempts.js.map +1 -0
- package/dist/presentation/routes/list-runs.d.ts +2 -0
- package/dist/presentation/routes/list-runs.d.ts.map +1 -0
- package/dist/presentation/routes/list-runs.js +70 -0
- package/dist/presentation/routes/list-runs.js.map +1 -0
- package/dist/presentation/routes/next-step.d.ts +2 -0
- package/dist/presentation/routes/next-step.d.ts.map +1 -0
- package/dist/presentation/routes/next-step.js +65 -0
- package/dist/presentation/routes/next-step.js.map +1 -0
- package/dist/presentation/routes/report-step.d.ts +2 -0
- package/dist/presentation/routes/report-step.d.ts.map +1 -0
- package/dist/presentation/routes/report-step.js +73 -0
- package/dist/presentation/routes/report-step.js.map +1 -0
- package/dist/presentation/routes/require-accessible-run.d.ts +7 -0
- package/dist/presentation/routes/require-accessible-run.d.ts.map +1 -0
- package/dist/presentation/routes/require-accessible-run.js +25 -0
- package/dist/presentation/routes/require-accessible-run.js.map +1 -0
- package/dist/presentation/routes/rerun-run.d.ts +2 -0
- package/dist/presentation/routes/rerun-run.d.ts.map +1 -0
- package/dist/presentation/routes/rerun-run.js +56 -0
- package/dist/presentation/routes/rerun-run.js.map +1 -0
- package/dist/presentation/subscribers/index.d.ts +8 -0
- package/dist/presentation/subscribers/index.d.ts.map +1 -0
- package/dist/presentation/subscribers/index.js +9 -0
- package/dist/presentation/subscribers/index.js.map +1 -0
- package/dist/presentation/subscribers/on-job-event-delivered.d.ts +3 -0
- package/dist/presentation/subscribers/on-job-event-delivered.d.ts.map +1 -0
- package/dist/presentation/subscribers/on-job-event-delivered.js +24 -0
- package/dist/presentation/subscribers/on-job-event-delivered.js.map +1 -0
- package/dist/presentation/subscribers/on-job-steps-settled.d.ts +3 -0
- package/dist/presentation/subscribers/on-job-steps-settled.d.ts.map +1 -0
- package/dist/presentation/subscribers/on-job-steps-settled.js +36 -0
- package/dist/presentation/subscribers/on-job-steps-settled.js.map +1 -0
- package/dist/presentation/subscribers/on-runner-job-claimed.d.ts +3 -0
- package/dist/presentation/subscribers/on-runner-job-claimed.d.ts.map +1 -0
- package/dist/presentation/subscribers/on-runner-job-claimed.js +20 -0
- package/dist/presentation/subscribers/on-runner-job-claimed.js.map +1 -0
- package/dist/presentation/subscribers/on-runner-job-lease-expired.d.ts +3 -0
- package/dist/presentation/subscribers/on-runner-job-lease-expired.d.ts.map +1 -0
- package/dist/presentation/subscribers/on-runner-job-lease-expired.js +35 -0
- package/dist/presentation/subscribers/on-runner-job-lease-expired.js.map +1 -0
- package/dist/presentation/subscribers/on-runner-job-queued.d.ts +3 -0
- package/dist/presentation/subscribers/on-runner-job-queued.d.ts.map +1 -0
- package/dist/presentation/subscribers/on-runner-job-queued.js +20 -0
- package/dist/presentation/subscribers/on-runner-job-queued.js.map +1 -0
- package/dist/presentation/subscribers/on-workflow-run-attempt-created.d.ts +3 -0
- package/dist/presentation/subscribers/on-workflow-run-attempt-created.d.ts.map +1 -0
- package/dist/presentation/subscribers/on-workflow-run-attempt-created.js +35 -0
- package/dist/presentation/subscribers/on-workflow-run-attempt-created.js.map +1 -0
- package/dist/presentation/subscribers/on-workflow-run-cancelled.d.ts +3 -0
- package/dist/presentation/subscribers/on-workflow-run-cancelled.d.ts.map +1 -0
- package/dist/presentation/subscribers/on-workflow-run-cancelled.js +25 -0
- package/dist/presentation/subscribers/on-workflow-run-cancelled.js.map +1 -0
- package/dist/temporal/activities/index.d.ts +23 -0
- package/dist/temporal/activities/index.d.ts.map +1 -0
- package/dist/temporal/activities/index.js +26 -0
- package/dist/temporal/activities/index.js.map +1 -0
- package/dist/temporal/activities/orchestration-activities.d.ts +130 -0
- package/dist/temporal/activities/orchestration-activities.d.ts.map +1 -0
- package/dist/temporal/activities/orchestration-activities.js +188 -0
- package/dist/temporal/activities/orchestration-activities.js.map +1 -0
- package/dist/temporal/constants.d.ts +7 -0
- package/dist/temporal/constants.d.ts.map +1 -0
- package/dist/temporal/constants.js +8 -0
- package/dist/temporal/constants.js.map +1 -0
- package/dist/temporal/index.d.ts +3 -0
- package/dist/temporal/index.d.ts.map +1 -0
- package/dist/temporal/index.js +4 -0
- package/dist/temporal/index.js.map +1 -0
- package/dist/temporal/workflow-not-found.d.ts +2 -0
- package/dist/temporal/workflow-not-found.d.ts.map +1 -0
- package/dist/temporal/workflow-not-found.js +10 -0
- package/dist/temporal/workflow-not-found.js.map +1 -0
- package/dist/temporal/workflows/deadline.d.ts +3 -0
- package/dist/temporal/workflows/deadline.d.ts.map +1 -0
- package/dist/temporal/workflows/deadline.js +8 -0
- package/dist/temporal/workflows/deadline.js.map +1 -0
- package/dist/temporal/workflows/index.d.ts +4 -0
- package/dist/temporal/workflows/index.d.ts.map +1 -0
- package/dist/temporal/workflows/index.js +5 -0
- package/dist/temporal/workflows/index.js.map +1 -0
- package/dist/temporal/workflows/job-execution-orchestration.d.ts +27 -0
- package/dist/temporal/workflows/job-execution-orchestration.d.ts.map +1 -0
- package/dist/temporal/workflows/job-execution-orchestration.js +265 -0
- package/dist/temporal/workflows/job-execution-orchestration.js.map +1 -0
- package/dist/temporal/workflows/job-listener-orchestration.d.ts +40 -0
- package/dist/temporal/workflows/job-listener-orchestration.d.ts.map +1 -0
- package/dist/temporal/workflows/job-listener-orchestration.js +332 -0
- package/dist/temporal/workflows/job-listener-orchestration.js.map +1 -0
- package/dist/temporal/workflows/run-orchestration.d.ts +8 -0
- package/dist/temporal/workflows/run-orchestration.d.ts.map +1 -0
- package/dist/temporal/workflows/run-orchestration.js +243 -0
- package/dist/temporal/workflows/run-orchestration.js.map +1 -0
- package/dist/temporal/workflows/test-env.d.ts +114 -0
- package/dist/temporal/workflows/test-env.d.ts.map +1 -0
- package/dist/temporal/workflows/test-env.js +323 -0
- package/dist/temporal/workflows/test-env.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -0
- package/drizzle/0000_initial.sql +211 -0
- package/drizzle/0001_agent_tool_materialization.sql +1 -0
- package/drizzle/meta/0000_snapshot.json +1613 -0
- package/drizzle/meta/_journal.json +20 -0
- package/drizzle.config.ts +7 -0
- package/package.json +91 -0
- package/src/core/README.md +79 -0
- package/src/core/agent-tool-capability-warning.test.ts +280 -0
- package/src/core/agent-tool-capability-warning.ts +200 -0
- package/src/core/agent-tools.ts +422 -0
- package/src/core/checkout.test.ts +112 -0
- package/src/core/checkout.ts +63 -0
- package/src/core/condition-trace.ts +64 -0
- package/src/core/entities/index.ts +9 -0
- package/src/core/entities/job-execution.ts +32 -0
- package/src/core/entities/job-listener-event.ts +15 -0
- package/src/core/entities/job.ts +91 -0
- package/src/core/entities/step.ts +126 -0
- package/src/core/entities/workflow-run-attempt.ts +21 -0
- package/src/core/entities/workflow-run.ts +94 -0
- package/src/core/errors.test.ts +45 -0
- package/src/core/errors.ts +209 -0
- package/src/core/index.ts +54 -0
- package/src/core/job-execution-outcome.ts +64 -0
- package/src/core/job-execution.test.ts +1560 -0
- package/src/core/job-execution.ts +581 -0
- package/src/core/job-transition/decide-job-activation.test.ts +196 -0
- package/src/core/job-transition/decide-job-activation.ts +79 -0
- package/src/core/job-transition/derive-job-execution-outputs.ts +41 -0
- package/src/core/job-transition/derive-job-success.test.ts +133 -0
- package/src/core/job-transition/derive-job-success.ts +67 -0
- package/src/core/job-transition/index.ts +11 -0
- package/src/core/job-transition/runtime-completion-status-for-job.ts +14 -0
- package/src/core/listener-execution-materialization.test.ts +49 -0
- package/src/core/listener-execution-materialization.ts +162 -0
- package/src/core/run-workflow.test.ts +229 -0
- package/src/core/run-workflow.ts +41 -0
- package/src/core/source-control.test.ts +17 -0
- package/src/core/source-control.ts +22 -0
- package/src/core/step-config/agent.ts +459 -0
- package/src/core/step-config/assemble-run-context.test.ts +1021 -0
- package/src/core/step-config/assemble-run-context.ts +535 -0
- package/src/core/step-config/complete-step-dispatch-config.test.ts +354 -0
- package/src/core/step-config/complete-step-dispatch-config.ts +40 -0
- package/src/core/step-config/fields.ts +111 -0
- package/src/core/step-config/index.ts +41 -0
- package/src/core/step-config/materialize-job-execution-steps.test.ts +494 -0
- package/src/core/step-config/materialize-job-execution-steps.ts +136 -0
- package/src/core/step-config/materialize-workflow-model.test.ts +1214 -0
- package/src/core/step-config/materialize-workflow-model.ts +140 -0
- package/src/core/step-config/resolve-job-execution-name.test.ts +94 -0
- package/src/core/step-config/resolve-job-execution-name.ts +51 -0
- package/src/core/step-config/resolve-step-config.ts +199 -0
- package/src/core/step-config/run.ts +467 -0
- package/src/core/step-config/workflow-evaluation-context.ts +6 -0
- package/src/core/step-transition/apply-step-transition.ts +163 -0
- package/src/core/step-transition/decide-step-transition.test.ts +307 -0
- package/src/core/step-transition/decide-step-transition.ts +200 -0
- package/src/core/step-transition/evaluate-gate.test.ts +317 -0
- package/src/core/step-transition/evaluate-gate.ts +168 -0
- package/src/core/step-transition/read-step-outputs.ts +27 -0
- package/src/core/workflow-run-creation.test.ts +155 -0
- package/src/core/workflow-run-creation.ts +131 -0
- package/src/core/workflow-scheduling/index.ts +15 -0
- package/src/core/workflow-scheduling/run-progress.test.ts +46 -0
- package/src/core/workflow-scheduling/run-progress.ts +68 -0
- package/src/core/workflow-scheduling/runtime-dag.ts +10 -0
- package/src/core/workflow-scheduling/runtime-scheduling-command.ts +20 -0
- package/src/core/workflow-scheduling/schedule-runtime-dag.test.ts +197 -0
- package/src/core/workflow-scheduling/schedule-runtime-dag.ts +115 -0
- package/src/db/db.ts +40 -0
- package/src/db/index.ts +86 -0
- package/src/db/job-listener-events.test.ts +113 -0
- package/src/db/job-listener-events.ts +73 -0
- package/src/db/job-listeners.test.ts +865 -0
- package/src/db/job-listeners.ts +564 -0
- package/src/db/outbox-writes.ts +40 -0
- package/src/db/rerun-listener.test.ts +64 -0
- package/src/db/run-timeout.test.ts +102 -0
- package/src/db/runner-lease-table.ts +39 -0
- package/src/db/schema/common.ts +3 -0
- package/src/db/schema/job-executions.ts +85 -0
- package/src/db/schema/job-listener-events.ts +58 -0
- package/src/db/schema/jobs.ts +136 -0
- package/src/db/schema/outbox.ts +4 -0
- package/src/db/schema/step-attempts.ts +99 -0
- package/src/db/schema/steps.ts +99 -0
- package/src/db/schema/workflow-run-attempts.ts +59 -0
- package/src/db/schema/workflow-runs.ts +112 -0
- package/src/db/workflow-runs/job-executions.test.ts +99 -0
- package/src/db/workflow-runs/job-executions.ts +421 -0
- package/src/db/workflow-runs/job-status.test.ts +532 -0
- package/src/db/workflow-runs/jobs.test.ts +194 -0
- package/src/db/workflow-runs/jobs.ts +418 -0
- package/src/db/workflow-runs/outbox.ts +109 -0
- package/src/db/workflow-runs/queries.test.ts +256 -0
- package/src/db/workflow-runs/queries.ts +437 -0
- package/src/db/workflow-runs/run-create.test.ts +1281 -0
- package/src/db/workflow-runs/run-create.ts +373 -0
- package/src/db/workflow-runs/run-graph.ts +95 -0
- package/src/db/workflow-runs/run-rerun.test.ts +625 -0
- package/src/db/workflow-runs/run-rerun.ts +266 -0
- package/src/db/workflow-runs/run-status.test.ts +425 -0
- package/src/db/workflow-runs/run-status.ts +391 -0
- package/src/db/workflow-runs/runs.ts +17 -0
- package/src/db/workflow-runs/shared.ts +84 -0
- package/src/db/workflow-runs/steps.test.ts +191 -0
- package/src/db/workflow-runs/steps.ts +476 -0
- package/src/db/workflow-runs.ts +111 -0
- package/src/index.ts +99 -0
- package/src/metrics/index.ts +1 -0
- package/src/metrics/instance.ts +160 -0
- package/src/metrics/service.ts +30 -0
- package/src/presentation/dto/checkout-token.test.ts +107 -0
- package/src/presentation/dto/checkout-token.ts +85 -0
- package/src/presentation/dto/index.ts +3 -0
- package/src/presentation/dto/job.test.ts +108 -0
- package/src/presentation/dto/job.ts +64 -0
- package/src/presentation/dto/step.test.ts +307 -0
- package/src/presentation/dto/step.ts +145 -0
- package/src/presentation/dto/workflow-run.ts +38 -0
- package/src/presentation/index.ts +10 -0
- package/src/presentation/routes/agent-runtime-config.test.ts +478 -0
- package/src/presentation/routes/agent-runtime-config.ts +81 -0
- package/src/presentation/routes/cancel-run.test.ts +156 -0
- package/src/presentation/routes/cancel-run.ts +37 -0
- package/src/presentation/routes/checkout-token.test.ts +366 -0
- package/src/presentation/routes/checkout-token.ts +61 -0
- package/src/presentation/routes/get-run-aggregates.test.ts +114 -0
- package/src/presentation/routes/get-run-aggregates.ts +69 -0
- package/src/presentation/routes/get-run.test.ts +604 -0
- package/src/presentation/routes/get-run.ts +66 -0
- package/src/presentation/routes/get-step-secrets.test.ts +260 -0
- package/src/presentation/routes/get-step-secrets.ts +117 -0
- package/src/presentation/routes/index.test.ts +71 -0
- package/src/presentation/routes/index.ts +42 -0
- package/src/presentation/routes/leased-step.ts +54 -0
- package/src/presentation/routes/list-run-attempts.test.ts +163 -0
- package/src/presentation/routes/list-run-attempts.ts +27 -0
- package/src/presentation/routes/list-runs.test.ts +244 -0
- package/src/presentation/routes/list-runs.ts +83 -0
- package/src/presentation/routes/next-step.test.ts +366 -0
- package/src/presentation/routes/next-step.ts +62 -0
- package/src/presentation/routes/report-step.test.ts +374 -0
- package/src/presentation/routes/report-step.ts +61 -0
- package/src/presentation/routes/require-accessible-run.ts +27 -0
- package/src/presentation/routes/rerun-run.test.ts +202 -0
- package/src/presentation/routes/rerun-run.ts +48 -0
- package/src/presentation/subscribers/index.ts +7 -0
- package/src/presentation/subscribers/on-job-event-delivered.test.ts +71 -0
- package/src/presentation/subscribers/on-job-event-delivered.ts +30 -0
- package/src/presentation/subscribers/on-job-steps-settled.test.ts +75 -0
- package/src/presentation/subscribers/on-job-steps-settled.ts +42 -0
- package/src/presentation/subscribers/on-runner-job-claimed.test.ts +57 -0
- package/src/presentation/subscribers/on-runner-job-claimed.ts +23 -0
- package/src/presentation/subscribers/on-runner-job-lease-expired.test.ts +73 -0
- package/src/presentation/subscribers/on-runner-job-lease-expired.ts +36 -0
- package/src/presentation/subscribers/on-runner-job-queued.test.ts +57 -0
- package/src/presentation/subscribers/on-runner-job-queued.ts +23 -0
- package/src/presentation/subscribers/on-workflow-run-attempt-created.test.ts +69 -0
- package/src/presentation/subscribers/on-workflow-run-attempt-created.ts +40 -0
- package/src/presentation/subscribers/on-workflow-run-cancelled.test.ts +59 -0
- package/src/presentation/subscribers/on-workflow-run-cancelled.ts +29 -0
- package/src/temporal/activities/index.ts +45 -0
- package/src/temporal/activities/orchestration-activities.test.ts +115 -0
- package/src/temporal/activities/orchestration-activities.ts +305 -0
- package/src/temporal/constants.ts +6 -0
- package/src/temporal/index.ts +6 -0
- package/src/temporal/workflow-not-found.ts +9 -0
- package/src/temporal/workflows/deadline.ts +7 -0
- package/src/temporal/workflows/index.ts +11 -0
- package/src/temporal/workflows/job-execution-orchestration-timeout.test.ts +165 -0
- package/src/temporal/workflows/job-execution-orchestration.test.ts +311 -0
- package/src/temporal/workflows/job-execution-orchestration.ts +314 -0
- package/src/temporal/workflows/job-listener-orchestration-continuation.test.ts +93 -0
- package/src/temporal/workflows/job-listener-orchestration.test.ts +406 -0
- package/src/temporal/workflows/job-listener-orchestration.ts +490 -0
- package/src/temporal/workflows/run-orchestration.test.ts +409 -0
- package/src/temporal/workflows/run-orchestration.ts +283 -0
- package/src/temporal/workflows/test-env.ts +409 -0
- package/test/env.ts +11 -0
- package/test/factories/job.ts +83 -0
- package/test/factories/project.ts +16 -0
- package/test/factories/workflow-model.test.ts +26 -0
- package/test/factories/workflow-model.ts +268 -0
- package/test/factories/workflow-run.ts +58 -0
- package/test/fixtures/active-lease-token.ts +85 -0
- package/test/fixtures/job-with-steps.ts +42 -0
- package/test/fixtures/lease-token.ts +44 -0
- package/test/fixtures/strip-setup-step.ts +23 -0
- package/test/globalSetup.ts +54 -0
- package/test/helpers/workflow-runs.ts +210 -0
- package/test/index.ts +3 -0
- package/test/setup.ts +17 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +3 -0
- package/tsconfig.test.json +8 -0
- package/vitest.config.ts +12 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { AgentConfigUnresolvableError, AgentIntegrationMaterializationError, DefinitionNotFoundError, InterpolationUnresolvableError, isPermanentRunWorkflowError, JobNotFoundError, NoFailedJobsError, ProjectMismatchError, RunNotTerminalError, SourceRunNotFoundError, StepNotFoundError, StepNotRunningError, WorkflowRunNotCancellableError } from './errors.js';
|
|
2
|
+
export { nextStepForJob, recordStepResult } from './job-execution.js';
|
|
3
|
+
export { decideJobActivation, deriveJobExecutionOutputs, deriveJobSuccess } from './job-transition/index.js';
|
|
4
|
+
export { runWorkflow } from './run-workflow.js';
|
|
5
|
+
export { materializeWorkflowModel, modelHasAgentStep } from './step-config/index.js';
|
|
6
|
+
export { deriveInitialJobExecutionPlan, deriveJobExecutionRunner, materializeWorkflowRunJobs } from './workflow-run-creation.js';
|
|
7
|
+
export { scheduleRuntimeDag } from './workflow-scheduling/index.js';
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/index.ts"],"sourcesContent":["export type {Job, JobStatus} from './entities/job.js';\nexport type {\n JobListenerEvent,\n JobListenerEventDisposition,\n} from './entities/job-listener-event.js';\nexport type {Step, StepStatus} from './entities/step.js';\nexport type {\n TriggerPayload,\n WorkflowRun,\n WorkflowRunStatus,\n WorkflowSourceSnapshot,\n} from './entities/workflow-run.js';\nexport {\n AgentConfigUnresolvableError,\n AgentIntegrationMaterializationError,\n DefinitionNotFoundError,\n InterpolationUnresolvableError,\n isPermanentRunWorkflowError,\n JobNotFoundError,\n NoFailedJobsError,\n ProjectMismatchError,\n RunNotTerminalError,\n SourceRunNotFoundError,\n StepNotFoundError,\n StepNotRunningError,\n WorkflowRunNotCancellableError,\n} from './errors.js';\nexport type {NextStep, RecordStepResultOutcome, RecordStepResultParams} from './job-execution.js';\nexport {nextStepForJob, recordStepResult} from './job-execution.js';\nexport {\n type DecideJobActivationInput,\n type DeriveJobSuccessResult,\n decideJobActivation,\n deriveJobExecutionOutputs,\n deriveJobSuccess,\n type JobActivationDecision,\n} from './job-transition/index.js';\nexport type {RunWorkflowParams} from './run-workflow.js';\nexport {runWorkflow} from './run-workflow.js';\nexport {\n type MaterializedWorkflowJob,\n type MaterializedWorkflowStep,\n materializeWorkflowModel,\n modelHasAgentStep,\n} from './step-config/index.js';\nexport {\n deriveInitialJobExecutionPlan,\n deriveJobExecutionRunner,\n materializeWorkflowRunJobs,\n} from './workflow-run-creation.js';\nexport {\n type ScheduleRuntimeDagInput,\n scheduleRuntimeDag,\n} from './workflow-scheduling/index.js';\n"],"names":["AgentConfigUnresolvableError","AgentIntegrationMaterializationError","DefinitionNotFoundError","InterpolationUnresolvableError","isPermanentRunWorkflowError","JobNotFoundError","NoFailedJobsError","ProjectMismatchError","RunNotTerminalError","SourceRunNotFoundError","StepNotFoundError","StepNotRunningError","WorkflowRunNotCancellableError","nextStepForJob","recordStepResult","decideJobActivation","deriveJobExecutionOutputs","deriveJobSuccess","runWorkflow","materializeWorkflowModel","modelHasAgentStep","deriveInitialJobExecutionPlan","deriveJobExecutionRunner","materializeWorkflowRunJobs","scheduleRuntimeDag"],"mappings":"AAYA,SACEA,4BAA4B,EAC5BC,oCAAoC,EACpCC,uBAAuB,EACvBC,8BAA8B,EAC9BC,2BAA2B,EAC3BC,gBAAgB,EAChBC,iBAAiB,EACjBC,oBAAoB,EACpBC,mBAAmB,EACnBC,sBAAsB,EACtBC,iBAAiB,EACjBC,mBAAmB,EACnBC,8BAA8B,QACzB,cAAc;AAErB,SAAQC,cAAc,EAAEC,gBAAgB,QAAO,qBAAqB;AACpE,SAGEC,mBAAmB,EACnBC,yBAAyB,EACzBC,gBAAgB,QAEX,4BAA4B;AAEnC,SAAQC,WAAW,QAAO,oBAAoB;AAC9C,SAGEC,wBAAwB,EACxBC,iBAAiB,QACZ,yBAAyB;AAChC,SACEC,6BAA6B,EAC7BC,wBAAwB,EACxBC,0BAA0B,QACrB,6BAA6B;AACpC,SAEEC,kBAAkB,QACb,iCAAiC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { RuntimeCompletionStatus } from './workflow-scheduling/runtime-dag.js';
|
|
2
|
+
export interface JobExecutionOrchestrationResult {
|
|
3
|
+
status: RuntimeCompletionStatus;
|
|
4
|
+
jobVersion: number;
|
|
5
|
+
}
|
|
6
|
+
export type JobExecutionStartOutcome = {
|
|
7
|
+
kind: 'running';
|
|
8
|
+
runningVersion: number;
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'terminal';
|
|
11
|
+
result: JobExecutionOrchestrationResult;
|
|
12
|
+
};
|
|
13
|
+
export interface JobExecutionStatusWriteResult {
|
|
14
|
+
newVersion: number;
|
|
15
|
+
status?: string | undefined;
|
|
16
|
+
}
|
|
17
|
+
export interface JobExecutionOutcomeSignals {
|
|
18
|
+
finished: {
|
|
19
|
+
status: RuntimeCompletionStatus;
|
|
20
|
+
jobExecutionId?: string | undefined;
|
|
21
|
+
} | undefined;
|
|
22
|
+
leaseExpired: boolean;
|
|
23
|
+
}
|
|
24
|
+
export type JobExecutionOutcomeResolution = 'finished' | 'lease-expired' | 'timed-out';
|
|
25
|
+
export declare function hasNoRequiredRunnerLabels(labels: readonly string[]): boolean;
|
|
26
|
+
export declare function jobExecutionStartOutcome(result: JobExecutionStatusWriteResult): JobExecutionStartOutcome;
|
|
27
|
+
export declare function runtimeStatusForTerminalJobExecutionStatus(status: string): RuntimeCompletionStatus;
|
|
28
|
+
export declare function resolveJobExecutionOutcomeSignal(signals: JobExecutionOutcomeSignals): JobExecutionOutcomeResolution;
|
|
29
|
+
//# sourceMappingURL=job-execution-outcome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-execution-outcome.d.ts","sourceRoot":"","sources":["../../src/core/job-execution-outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,sCAAsC,CAAC;AAElF,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,uBAAuB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAC,IAAI,EAAE,SAAS,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAC,GACzC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,+BAA+B,CAAA;CAAC,CAAC;AAEhE,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE;QAAC,MAAM,EAAE,uBAAuB,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAC,GAAG,SAAS,CAAC;IAC7F,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,6BAA6B,GAAG,UAAU,GAAG,eAAe,GAAG,WAAW,CAAC;AAEvF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE5E;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,6BAA6B,GACpC,wBAAwB,CAY1B;AAED,wBAAgB,0CAA0C,CACxD,MAAM,EAAE,MAAM,GACb,uBAAuB,CAUzB;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,0BAA0B,GAClC,6BAA6B,CAI/B"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function hasNoRequiredRunnerLabels(labels) {
|
|
2
|
+
return labels.every((label)=>label.trim().length === 0);
|
|
3
|
+
}
|
|
4
|
+
export function jobExecutionStartOutcome(result) {
|
|
5
|
+
if (result.status !== undefined && result.status !== 'pending' && result.status !== 'running') {
|
|
6
|
+
return {
|
|
7
|
+
kind: 'terminal',
|
|
8
|
+
result: {
|
|
9
|
+
status: runtimeStatusForTerminalJobExecutionStatus(result.status),
|
|
10
|
+
jobVersion: result.newVersion
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
kind: 'running',
|
|
16
|
+
runningVersion: result.newVersion
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function runtimeStatusForTerminalJobExecutionStatus(status) {
|
|
20
|
+
if (status === 'succeeded' || status === 'failed' || status === 'cancelled' || status === 'skipped') {
|
|
21
|
+
return status;
|
|
22
|
+
}
|
|
23
|
+
return 'failed';
|
|
24
|
+
}
|
|
25
|
+
export function resolveJobExecutionOutcomeSignal(signals) {
|
|
26
|
+
if (signals.finished !== undefined) return 'finished';
|
|
27
|
+
if (signals.leaseExpired) return 'lease-expired';
|
|
28
|
+
return 'timed-out';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=job-execution-outcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/job-execution-outcome.ts"],"sourcesContent":["import type {RuntimeCompletionStatus} from './workflow-scheduling/runtime-dag.js';\n\nexport interface JobExecutionOrchestrationResult {\n status: RuntimeCompletionStatus;\n jobVersion: number;\n}\n\nexport type JobExecutionStartOutcome =\n | {kind: 'running'; runningVersion: number}\n | {kind: 'terminal'; result: JobExecutionOrchestrationResult};\n\nexport interface JobExecutionStatusWriteResult {\n newVersion: number;\n status?: string | undefined;\n}\n\nexport interface JobExecutionOutcomeSignals {\n finished: {status: RuntimeCompletionStatus; jobExecutionId?: string | undefined} | undefined;\n leaseExpired: boolean;\n}\n\nexport type JobExecutionOutcomeResolution = 'finished' | 'lease-expired' | 'timed-out';\n\nexport function hasNoRequiredRunnerLabels(labels: readonly string[]): boolean {\n return labels.every((label) => label.trim().length === 0);\n}\n\nexport function jobExecutionStartOutcome(\n result: JobExecutionStatusWriteResult,\n): JobExecutionStartOutcome {\n if (result.status !== undefined && result.status !== 'pending' && result.status !== 'running') {\n return {\n kind: 'terminal',\n result: {\n status: runtimeStatusForTerminalJobExecutionStatus(result.status),\n jobVersion: result.newVersion,\n },\n };\n }\n\n return {kind: 'running', runningVersion: result.newVersion};\n}\n\nexport function runtimeStatusForTerminalJobExecutionStatus(\n status: string,\n): RuntimeCompletionStatus {\n if (\n status === 'succeeded' ||\n status === 'failed' ||\n status === 'cancelled' ||\n status === 'skipped'\n ) {\n return status;\n }\n return 'failed';\n}\n\nexport function resolveJobExecutionOutcomeSignal(\n signals: JobExecutionOutcomeSignals,\n): JobExecutionOutcomeResolution {\n if (signals.finished !== undefined) return 'finished';\n if (signals.leaseExpired) return 'lease-expired';\n return 'timed-out';\n}\n"],"names":["hasNoRequiredRunnerLabels","labels","every","label","trim","length","jobExecutionStartOutcome","result","status","undefined","kind","runtimeStatusForTerminalJobExecutionStatus","jobVersion","newVersion","runningVersion","resolveJobExecutionOutcomeSignal","signals","finished","leaseExpired"],"mappings":"AAuBA,OAAO,SAASA,0BAA0BC,MAAyB;IACjE,OAAOA,OAAOC,KAAK,CAAC,CAACC,QAAUA,MAAMC,IAAI,GAAGC,MAAM,KAAK;AACzD;AAEA,OAAO,SAASC,yBACdC,MAAqC;IAErC,IAAIA,OAAOC,MAAM,KAAKC,aAAaF,OAAOC,MAAM,KAAK,aAAaD,OAAOC,MAAM,KAAK,WAAW;QAC7F,OAAO;YACLE,MAAM;YACNH,QAAQ;gBACNC,QAAQG,2CAA2CJ,OAAOC,MAAM;gBAChEI,YAAYL,OAAOM,UAAU;YAC/B;QACF;IACF;IAEA,OAAO;QAACH,MAAM;QAAWI,gBAAgBP,OAAOM,UAAU;IAAA;AAC5D;AAEA,OAAO,SAASF,2CACdH,MAAc;IAEd,IACEA,WAAW,eACXA,WAAW,YACXA,WAAW,eACXA,WAAW,WACX;QACA,OAAOA;IACT;IACA,OAAO;AACT;AAEA,OAAO,SAASO,iCACdC,OAAmC;IAEnC,IAAIA,QAAQC,QAAQ,KAAKR,WAAW,OAAO;IAC3C,IAAIO,QAAQE,YAAY,EAAE,OAAO;IACjC,OAAO;AACT"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { LogOutcomeDto } from '@shipfox/api-workflows-dto';
|
|
2
|
+
import type { Step } from './entities/step.js';
|
|
3
|
+
import { type StepProgressionOutcome } from './step-transition/apply-step-transition.js';
|
|
4
|
+
import type { RuntimeCompletionStatus } from './workflow-scheduling/runtime-dag.js';
|
|
5
|
+
type CompletionStatus = RuntimeCompletionStatus;
|
|
6
|
+
export type NextStep = {
|
|
7
|
+
kind: 'step';
|
|
8
|
+
step: Step;
|
|
9
|
+
dispatched: boolean;
|
|
10
|
+
} | {
|
|
11
|
+
kind: 'done';
|
|
12
|
+
status: CompletionStatus;
|
|
13
|
+
};
|
|
14
|
+
export interface NextStepForLeasedJobExecutionParams {
|
|
15
|
+
jobId: string;
|
|
16
|
+
jobExecutionId: string;
|
|
17
|
+
runnerSessionId: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function nextStepForLeasedJobExecution(params: NextStepForLeasedJobExecutionParams): Promise<NextStep>;
|
|
20
|
+
export declare function nextStepForJob(jobId: string): Promise<NextStep>;
|
|
21
|
+
export interface RecordStepResultParams {
|
|
22
|
+
jobExecutionId: string;
|
|
23
|
+
stepId: string;
|
|
24
|
+
status: 'succeeded' | 'failed';
|
|
25
|
+
error?: Record<string, unknown> | null;
|
|
26
|
+
output?: Record<string, unknown> | null;
|
|
27
|
+
response?: string | null;
|
|
28
|
+
exitCode?: number | null;
|
|
29
|
+
attempt?: number;
|
|
30
|
+
logOutcome?: LogOutcomeDto;
|
|
31
|
+
}
|
|
32
|
+
export type RecordStepResultOutcome = StepProgressionOutcome;
|
|
33
|
+
export declare function recordStepResult(params: RecordStepResultParams): Promise<RecordStepResultOutcome>;
|
|
34
|
+
export type ReportedStepClassification = 'proceed' | 'noop' | Error;
|
|
35
|
+
export declare function classifyReportedStep(target: Step, reportedAttempt: number, jobId: string): ReportedStepClassification;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=job-execution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-execution.d.ts","sourceRoot":"","sources":["../../src/core/job-execution.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AA6B9D,OAAO,KAAK,EAAgC,IAAI,EAAmB,MAAM,oBAAoB,CAAC;AAa9F,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,4CAA4C,CAAC;AAcpD,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,sCAAsC,CAAC;AAElF,KAAK,gBAAgB,GAAG,uBAAuB,CAAC;AAUhD,MAAM,MAAM,QAAQ,GAChB;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAC,GAC/C;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAC,CAAC;AAgQ7C,MAAM,WAAW,mCAAmC;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,mCAAmC,GAC1C,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAO/D;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAGvC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAED,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,CAAC;AAa7D,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,uBAAuB,CAAC,CAQlC;AAsGD,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;AAEpE,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,IAAI,EACZ,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,MAAM,GACZ,0BAA0B,CAU5B"}
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
import { catalogDefaultAgentResolver } from '@shipfox/api-agent/core/resolve-agent-config';
|
|
2
|
+
import { coerceStepOutputs, evaluatePlannedPredicateAtSite } from '@shipfox/expression';
|
|
3
|
+
import { withTransaction } from '#db/db.js';
|
|
4
|
+
import { countStepAttempts, dispatchStepWithCompletedConfig, finishStepAttempt, getDirectDependencyJobContexts, getJobExecutionById, getLatestJobExecutionByJobId, getStepAttemptsByJobExecutionId, getStepsByJobExecutionIdForUpdate, insertRunningStepAttempt, lockActiveJobExecutionLeaseForUpdate, markStepRunning, markStepSkipped, settleJobFailed, writeJobStepsSettledOutbox } from '#db/workflow-runs.js';
|
|
5
|
+
import { recordWorkflowJobExecutionStepsSettled, recordWorkflowStepRestartEnqueued } from '#metrics/instance.js';
|
|
6
|
+
import { defaultStepConditionTrace, explicitConditionTrace } from './condition-trace.js';
|
|
7
|
+
import { AgentConfigUnresolvableError, InterpolationUnresolvableError, JobLeaseNotActiveError, JobNotFoundError, StepAttemptAheadError, StepNotFoundError, StepNotRunningError } from './errors.js';
|
|
8
|
+
import { assembleStepDispatchContext } from './step-config/assemble-run-context.js';
|
|
9
|
+
import { completeStepDispatchConfig } from './step-config/complete-step-dispatch-config.js';
|
|
10
|
+
import { applyStepTransition } from './step-transition/apply-step-transition.js';
|
|
11
|
+
import { decideStepTransition, deriveCompletion, isTerminal } from './step-transition/decide-step-transition.js';
|
|
12
|
+
import { evaluateGate, evaluateGateFeedback, gateResultPayload, readStepGate } from './step-transition/evaluate-gate.js';
|
|
13
|
+
import { readStepOutputs } from './step-transition/read-step-outputs.js';
|
|
14
|
+
async function nextStepForJobExecutionInTransaction(jobExecutionId, tx) {
|
|
15
|
+
const steps = await getStepsByJobExecutionIdForUpdate(jobExecutionId, tx);
|
|
16
|
+
const hasNoSteps = steps.length === 0;
|
|
17
|
+
// An unknown or step-less execution has nothing to progress; rejecting it stops
|
|
18
|
+
// a bad id from deriving a vacuous 'succeeded' completion below.
|
|
19
|
+
if (hasNoSteps) throw new JobNotFoundError(jobExecutionId);
|
|
20
|
+
// Re-deliver the in-flight step rather than advancing, so a retried pull
|
|
21
|
+
// cannot skip a step.
|
|
22
|
+
const running = steps.find((step)=>step.status === 'running');
|
|
23
|
+
const hasRunningStep = running !== undefined;
|
|
24
|
+
if (hasRunningStep) return {
|
|
25
|
+
kind: 'step',
|
|
26
|
+
step: running,
|
|
27
|
+
dispatched: false
|
|
28
|
+
};
|
|
29
|
+
const firstPending = steps.find((step)=>step.status === 'pending');
|
|
30
|
+
const hasPendingStep = firstPending !== undefined;
|
|
31
|
+
if (!hasPendingStep) return {
|
|
32
|
+
kind: 'done',
|
|
33
|
+
status: deriveCompletion(steps)
|
|
34
|
+
};
|
|
35
|
+
const jobExecution = await getJobExecutionById(jobExecutionId, tx);
|
|
36
|
+
if (!jobExecution) throw new JobNotFoundError(jobExecutionId);
|
|
37
|
+
const attempts = await getStepAttemptsByJobExecutionId(jobExecutionId, tx);
|
|
38
|
+
const jobs = await getDirectDependencyJobContexts(jobExecution.jobId, tx);
|
|
39
|
+
return resolveNextPendingStep({
|
|
40
|
+
jobExecutionId,
|
|
41
|
+
steps,
|
|
42
|
+
jobExecution,
|
|
43
|
+
attempts,
|
|
44
|
+
jobs,
|
|
45
|
+
tx
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async function resolveNextPendingStep({ jobExecutionId, steps, jobExecution, attempts, jobs, tx }) {
|
|
49
|
+
let skippedAny = false;
|
|
50
|
+
let currentSteps = steps;
|
|
51
|
+
while(true){
|
|
52
|
+
const pending = currentSteps.find((step)=>step.status === 'pending');
|
|
53
|
+
if (pending === undefined) {
|
|
54
|
+
const status = deriveCompletion(currentSteps);
|
|
55
|
+
if (skippedAny) {
|
|
56
|
+
await writeJobStepsSettledOutbox(tx, {
|
|
57
|
+
jobId: jobExecution.jobId,
|
|
58
|
+
jobExecutionId,
|
|
59
|
+
status
|
|
60
|
+
});
|
|
61
|
+
recordWorkflowJobExecutionStepsSettled(status);
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
kind: 'done',
|
|
65
|
+
status
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const context = assembleStepDispatchContext({
|
|
69
|
+
steps: currentSteps,
|
|
70
|
+
attempts,
|
|
71
|
+
targetStepId: pending.id,
|
|
72
|
+
jobExecution,
|
|
73
|
+
jobs
|
|
74
|
+
});
|
|
75
|
+
const condition = evaluateStepCondition({
|
|
76
|
+
step: pending,
|
|
77
|
+
context
|
|
78
|
+
});
|
|
79
|
+
if (condition.kind === 'run') {
|
|
80
|
+
return dispatchPendingStep({
|
|
81
|
+
jobExecutionId,
|
|
82
|
+
pending,
|
|
83
|
+
jobExecution,
|
|
84
|
+
context,
|
|
85
|
+
tx
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const skipped = await markStepSkipped({
|
|
89
|
+
jobExecutionId,
|
|
90
|
+
stepId: pending.id,
|
|
91
|
+
statusReason: condition.statusReason,
|
|
92
|
+
evaluationTrace: condition.evaluationTrace
|
|
93
|
+
}, tx);
|
|
94
|
+
const skippedStep = skipped ?? {
|
|
95
|
+
...pending,
|
|
96
|
+
status: 'skipped',
|
|
97
|
+
statusReason: condition.statusReason,
|
|
98
|
+
evaluationTrace: condition.evaluationTrace,
|
|
99
|
+
error: null
|
|
100
|
+
};
|
|
101
|
+
currentSteps = currentSteps.map((step)=>step.id === pending.id ? skippedStep : step);
|
|
102
|
+
skippedAny = true;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function dispatchPendingStep(params) {
|
|
106
|
+
const hasConfigPlan = params.pending.configPlan !== null;
|
|
107
|
+
if (hasConfigPlan) return dispatchPendingStepWithConfigPlan(params);
|
|
108
|
+
const marked = await markStepRunning({
|
|
109
|
+
jobExecutionId: params.jobExecutionId,
|
|
110
|
+
stepId: params.pending.id
|
|
111
|
+
}, params.tx);
|
|
112
|
+
return {
|
|
113
|
+
kind: 'step',
|
|
114
|
+
step: marked ?? params.pending,
|
|
115
|
+
dispatched: true
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
async function dispatchPendingStepWithConfigPlan({ jobExecutionId, pending, jobExecution, context, tx }) {
|
|
119
|
+
try {
|
|
120
|
+
const completed = completeStepDispatchConfig({
|
|
121
|
+
step: pending,
|
|
122
|
+
context,
|
|
123
|
+
resolveAgentDefaults: catalogDefaultAgentResolver,
|
|
124
|
+
definitionId: jobExecution.jobId
|
|
125
|
+
});
|
|
126
|
+
const marked = await dispatchStepWithCompletedConfig({
|
|
127
|
+
jobExecutionId,
|
|
128
|
+
stepId: pending.id,
|
|
129
|
+
config: completed.config,
|
|
130
|
+
evaluationTrace: completed.trace
|
|
131
|
+
}, tx);
|
|
132
|
+
return {
|
|
133
|
+
kind: 'step',
|
|
134
|
+
step: marked ?? {
|
|
135
|
+
...pending,
|
|
136
|
+
config: completed.config
|
|
137
|
+
},
|
|
138
|
+
dispatched: true
|
|
139
|
+
};
|
|
140
|
+
} catch (error) {
|
|
141
|
+
const configError = toDispatchConfigError(error);
|
|
142
|
+
const isConfigError = configError !== null;
|
|
143
|
+
if (!isConfigError) throw error;
|
|
144
|
+
const failureError = dispatchConfigError(configError);
|
|
145
|
+
await insertRunningStepAttempt({
|
|
146
|
+
jobExecutionId,
|
|
147
|
+
stepId: pending.id,
|
|
148
|
+
attempt: pending.currentAttempt
|
|
149
|
+
}, tx);
|
|
150
|
+
await finishStepAttempt({
|
|
151
|
+
stepId: pending.id,
|
|
152
|
+
attempt: pending.currentAttempt,
|
|
153
|
+
status: 'failed',
|
|
154
|
+
error: failureError,
|
|
155
|
+
logOutcome: 'abandoned'
|
|
156
|
+
}, tx);
|
|
157
|
+
const status = await settleJobFailed(tx, {
|
|
158
|
+
jobId: jobExecution.jobId,
|
|
159
|
+
jobExecutionId,
|
|
160
|
+
failedStepId: pending.id,
|
|
161
|
+
error: failureError
|
|
162
|
+
});
|
|
163
|
+
if (status) recordWorkflowJobExecutionStepsSettled(status);
|
|
164
|
+
return status === null ? nextStepForJobExecutionInTransaction(jobExecutionId, tx) : {
|
|
165
|
+
kind: 'done',
|
|
166
|
+
status
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function evaluateStepCondition(params) {
|
|
171
|
+
const condition = params.step.condition;
|
|
172
|
+
if (condition === null) {
|
|
173
|
+
const execution = params.context.values.execution;
|
|
174
|
+
return execution?.failed === true ? {
|
|
175
|
+
kind: 'skip',
|
|
176
|
+
statusReason: 'default_gate_rejected',
|
|
177
|
+
evaluationTrace: defaultStepConditionTrace()
|
|
178
|
+
} : {
|
|
179
|
+
kind: 'run'
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
const outcome = evaluatePlannedPredicateAtSite({
|
|
183
|
+
expression: condition,
|
|
184
|
+
field: 'step.if',
|
|
185
|
+
site: params.context.site,
|
|
186
|
+
context: params.context.values
|
|
187
|
+
});
|
|
188
|
+
const evaluationTrace = explicitConditionTrace({
|
|
189
|
+
expression: condition,
|
|
190
|
+
field: 'step.if',
|
|
191
|
+
route: outcome.route,
|
|
192
|
+
site: params.context.site,
|
|
193
|
+
value: outcome.value,
|
|
194
|
+
degraded: outcome.evaluationFailed
|
|
195
|
+
});
|
|
196
|
+
if (outcome.evaluationFailed) {
|
|
197
|
+
return {
|
|
198
|
+
kind: 'skip',
|
|
199
|
+
statusReason: 'condition_errored',
|
|
200
|
+
evaluationTrace
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return outcome.value ? {
|
|
204
|
+
kind: 'run'
|
|
205
|
+
} : {
|
|
206
|
+
kind: 'skip',
|
|
207
|
+
statusReason: 'condition_rejected',
|
|
208
|
+
evaluationTrace
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function toDispatchConfigError(error) {
|
|
212
|
+
const isInterpolationError = error instanceof InterpolationUnresolvableError;
|
|
213
|
+
if (isInterpolationError) return error;
|
|
214
|
+
const isAgentConfigError = error instanceof AgentConfigUnresolvableError;
|
|
215
|
+
if (isAgentConfigError) return error;
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
function dispatchConfigError(error) {
|
|
219
|
+
if (error instanceof InterpolationUnresolvableError) {
|
|
220
|
+
return {
|
|
221
|
+
message: error.message,
|
|
222
|
+
reason: 'config_unresolvable',
|
|
223
|
+
field: error.envKey === undefined ? error.field : `${error.field}.${error.envKey}`,
|
|
224
|
+
source: error.source
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
message: error.message,
|
|
229
|
+
reason: 'config_unresolvable',
|
|
230
|
+
field: 'agent',
|
|
231
|
+
source: 'agent'
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
export function nextStepForLeasedJobExecution(params) {
|
|
235
|
+
return withTransaction(async (tx)=>{
|
|
236
|
+
const leaseIsActive = await lockActiveJobExecutionLeaseForUpdate(params, tx);
|
|
237
|
+
if (!leaseIsActive) throw new JobLeaseNotActiveError(params.jobExecutionId);
|
|
238
|
+
return nextStepForJobExecutionInTransaction(params.jobExecutionId, tx);
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
export function nextStepForJob(jobId) {
|
|
242
|
+
return withTransaction(async (tx)=>{
|
|
243
|
+
const jobExecution = await getLatestJobExecutionByJobId(jobId, tx);
|
|
244
|
+
if (!jobExecution) throw new JobNotFoundError(jobId);
|
|
245
|
+
return nextStepForJobExecutionInTransaction(jobExecution.id, tx);
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
function outcomeFromSteps(steps) {
|
|
249
|
+
return steps.every((step)=>isTerminal(step.status)) ? {
|
|
250
|
+
jobFinished: true,
|
|
251
|
+
status: deriveCompletion(steps)
|
|
252
|
+
} : {
|
|
253
|
+
jobFinished: false
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
export async function recordStepResult(params) {
|
|
257
|
+
const progression = await withTransaction((tx)=>recordStepResultInTransaction(params, tx));
|
|
258
|
+
recordStepProgressionMetrics(progression.metrics);
|
|
259
|
+
return progression.outcome;
|
|
260
|
+
}
|
|
261
|
+
async function recordStepResultInTransaction(params, tx) {
|
|
262
|
+
const jobExecutionId = params.jobExecutionId;
|
|
263
|
+
const jobExecution = await getJobExecutionById(jobExecutionId, tx);
|
|
264
|
+
if (!jobExecution) throw new JobNotFoundError(jobExecutionId);
|
|
265
|
+
const steps = await getStepsByJobExecutionIdForUpdate(jobExecutionId, tx);
|
|
266
|
+
const target = steps.find((step)=>step.id === params.stepId);
|
|
267
|
+
const hasTargetStep = target !== undefined;
|
|
268
|
+
if (!hasTargetStep) throw new StepNotFoundError(params.stepId, jobExecutionId);
|
|
269
|
+
const current = target.currentAttempt;
|
|
270
|
+
const reported = params.attempt ?? current;
|
|
271
|
+
const reportClassification = classifyReportedStep(target, reported, jobExecution.jobId);
|
|
272
|
+
if (reportClassification instanceof Error) throw reportClassification;
|
|
273
|
+
if (reportClassification === 'noop') return {
|
|
274
|
+
outcome: outcomeFromSteps(steps),
|
|
275
|
+
metrics: {}
|
|
276
|
+
};
|
|
277
|
+
// Migration/back-compat boundary: a running step may predate the
|
|
278
|
+
// step_attempts table or have been marked running by legacy code. Create
|
|
279
|
+
// the audit row just before finalization if dispatch did not already do it.
|
|
280
|
+
await insertRunningStepAttempt({
|
|
281
|
+
jobExecutionId,
|
|
282
|
+
stepId: params.stepId,
|
|
283
|
+
attempt: current,
|
|
284
|
+
config: target.config
|
|
285
|
+
}, tx);
|
|
286
|
+
let result = {
|
|
287
|
+
status: params.status,
|
|
288
|
+
error: params.error ?? null,
|
|
289
|
+
output: params.output ?? null,
|
|
290
|
+
response: params.response ?? null,
|
|
291
|
+
exitCode: params.exitCode ?? null
|
|
292
|
+
};
|
|
293
|
+
const outputCoercion = coerceReportedStepOutput(target.config, result);
|
|
294
|
+
if (outputCoercion.kind === 'coerced') {
|
|
295
|
+
result = {
|
|
296
|
+
...result,
|
|
297
|
+
output: outputCoercion.output
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
if (outputCoercion.kind === 'failed') {
|
|
301
|
+
result = {
|
|
302
|
+
status: 'failed',
|
|
303
|
+
error: outputInvalidError(outputCoercion.error),
|
|
304
|
+
output: null,
|
|
305
|
+
response: result.response,
|
|
306
|
+
exitCode: result.exitCode
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
// Evaluate the gate (if any) at the service boundary — the only place the CEL
|
|
310
|
+
// engine runs — and pass the precomputed outcome into the pure decision.
|
|
311
|
+
const shouldEvaluateGate = outputCoercion.kind !== 'failed';
|
|
312
|
+
const gate = shouldEvaluateGate ? readStepGate(target.config) : undefined;
|
|
313
|
+
const gateOutcome = shouldEvaluateGate ? evaluateGate(gate, result) : {
|
|
314
|
+
kind: 'no-gate'
|
|
315
|
+
};
|
|
316
|
+
const hasRestartPolicy = gate?.onFailure?.restartFrom !== undefined;
|
|
317
|
+
// The restart cap is bounded on the gating step's OWN attempts, not its
|
|
318
|
+
// current_attempt (which a rewind inflates for downstream steps).
|
|
319
|
+
const gatingAttemptCount = hasRestartPolicy ? await countStepAttempts(params.stepId, tx) : undefined;
|
|
320
|
+
const decision = decideStepTransition({
|
|
321
|
+
steps,
|
|
322
|
+
target,
|
|
323
|
+
reportedAttempt: reported,
|
|
324
|
+
result,
|
|
325
|
+
gateOutcome,
|
|
326
|
+
...gate?.onFailure ? {
|
|
327
|
+
gateOnFailure: gate.onFailure
|
|
328
|
+
} : {},
|
|
329
|
+
...gatingAttemptCount !== undefined ? {
|
|
330
|
+
gatingAttemptCount
|
|
331
|
+
} : {}
|
|
332
|
+
});
|
|
333
|
+
const resolvedDecision = resolveRestartFeedback({
|
|
334
|
+
decision,
|
|
335
|
+
gate,
|
|
336
|
+
result,
|
|
337
|
+
definitionId: jobExecution.jobId
|
|
338
|
+
});
|
|
339
|
+
return applyStepTransition(resolvedDecision, {
|
|
340
|
+
jobId: jobExecution.jobId,
|
|
341
|
+
jobExecutionId,
|
|
342
|
+
result,
|
|
343
|
+
logOutcome: params.logOutcome ?? 'drained',
|
|
344
|
+
gateResult: gateResultPayload(gateOutcome, result.exitCode)
|
|
345
|
+
}, tx);
|
|
346
|
+
}
|
|
347
|
+
export function classifyReportedStep(target, reportedAttempt, jobId) {
|
|
348
|
+
const currentAttempt = target.currentAttempt;
|
|
349
|
+
if (reportedAttempt > currentAttempt) {
|
|
350
|
+
return new StepAttemptAheadError(target.id, jobId, reportedAttempt, currentAttempt);
|
|
351
|
+
}
|
|
352
|
+
if (reportedAttempt < currentAttempt) return 'noop';
|
|
353
|
+
if (isTerminal(target.status)) return 'noop';
|
|
354
|
+
if (target.status === 'pending') return new StepNotRunningError(target.id, jobId);
|
|
355
|
+
return 'proceed';
|
|
356
|
+
}
|
|
357
|
+
function coerceReportedStepOutput(config, result) {
|
|
358
|
+
if (result.status !== 'succeeded') return {
|
|
359
|
+
kind: 'not-applicable'
|
|
360
|
+
};
|
|
361
|
+
const declarations = readStepOutputs(config);
|
|
362
|
+
if (declarations === undefined) return {
|
|
363
|
+
kind: 'not-applicable'
|
|
364
|
+
};
|
|
365
|
+
const coerced = coerceStepOutputs({
|
|
366
|
+
declarations,
|
|
367
|
+
output: result.output
|
|
368
|
+
});
|
|
369
|
+
if (!coerced.ok) return {
|
|
370
|
+
kind: 'failed',
|
|
371
|
+
error: coerced.error
|
|
372
|
+
};
|
|
373
|
+
return {
|
|
374
|
+
kind: 'coerced',
|
|
375
|
+
output: coerced.output
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
function outputInvalidError(error) {
|
|
379
|
+
return {
|
|
380
|
+
message: error.message,
|
|
381
|
+
reason: 'output_invalid',
|
|
382
|
+
field: `outputs.${error.key}`,
|
|
383
|
+
outputKey: error.key,
|
|
384
|
+
issue: error.reason,
|
|
385
|
+
...error.expectedType === undefined ? {} : {
|
|
386
|
+
expectedType: error.expectedType
|
|
387
|
+
},
|
|
388
|
+
...error.schemaError === undefined ? {} : {
|
|
389
|
+
schemaError: error.schemaError
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
function resolveRestartFeedback(params) {
|
|
394
|
+
if (params.decision.kind !== 'restart-job-from-step') return params.decision;
|
|
395
|
+
if (params.gate === undefined) return params.decision;
|
|
396
|
+
try {
|
|
397
|
+
return {
|
|
398
|
+
...params.decision,
|
|
399
|
+
feedback: evaluateGateFeedback({
|
|
400
|
+
gate: params.gate,
|
|
401
|
+
result: params.result,
|
|
402
|
+
definitionId: params.definitionId
|
|
403
|
+
})
|
|
404
|
+
};
|
|
405
|
+
} catch (error) {
|
|
406
|
+
if (error instanceof InterpolationUnresolvableError) {
|
|
407
|
+
return {
|
|
408
|
+
kind: 'fail-job',
|
|
409
|
+
failedStepId: params.decision.failedStepId,
|
|
410
|
+
attempt: params.decision.attempt,
|
|
411
|
+
failureError: dispatchConfigError(error)
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
throw error;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
function recordStepProgressionMetrics(metrics) {
|
|
418
|
+
const settledStatus = metrics.jobStepsSettledStatus;
|
|
419
|
+
const hasSettledStatus = settledStatus !== undefined;
|
|
420
|
+
if (hasSettledStatus) recordWorkflowJobExecutionStepsSettled(settledStatus);
|
|
421
|
+
const restartWasEnqueued = metrics.stepRestartEnqueued === true;
|
|
422
|
+
if (restartWasEnqueued) recordWorkflowStepRestartEnqueued();
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
//# sourceMappingURL=job-execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/job-execution.ts"],"sourcesContent":["import {catalogDefaultAgentResolver} from '@shipfox/api-agent/core/resolve-agent-config';\nimport type {LogOutcomeDto} from '@shipfox/api-workflows-dto';\nimport {\n coerceStepOutputs,\n evaluatePlannedPredicateAtSite,\n type StepOutputCoercionError,\n} from '@shipfox/expression';\nimport {type Tx, withTransaction} from '#db/db.js';\nimport {\n countStepAttempts,\n dispatchStepWithCompletedConfig,\n finishStepAttempt,\n getDirectDependencyJobContexts,\n getJobExecutionById,\n getLatestJobExecutionByJobId,\n getStepAttemptsByJobExecutionId,\n getStepsByJobExecutionIdForUpdate,\n insertRunningStepAttempt,\n lockActiveJobExecutionLeaseForUpdate,\n markStepRunning,\n markStepSkipped,\n settleJobFailed,\n writeJobStepsSettledOutbox,\n} from '#db/workflow-runs.js';\nimport {\n recordWorkflowJobExecutionStepsSettled,\n recordWorkflowStepRestartEnqueued,\n} from '#metrics/instance.js';\nimport {defaultStepConditionTrace, explicitConditionTrace} from './condition-trace.js';\nimport type {JobExecution} from './entities/job-execution.js';\nimport type {PersistedEvaluationTraceEntry, Step, StepStatusReason} from './entities/step.js';\nimport {\n AgentConfigUnresolvableError,\n InterpolationUnresolvableError,\n JobLeaseNotActiveError,\n JobNotFoundError,\n StepAttemptAheadError,\n StepNotFoundError,\n StepNotRunningError,\n} from './errors.js';\nimport {assembleStepDispatchContext} from './step-config/assemble-run-context.js';\nimport {completeStepDispatchConfig} from './step-config/complete-step-dispatch-config.js';\nimport type {WorkflowEvaluationContext} from './step-config/workflow-evaluation-context.js';\nimport {\n applyStepTransition,\n type StepProgressionMetrics,\n type StepProgressionOutcome,\n} from './step-transition/apply-step-transition.js';\nimport {\n decideStepTransition,\n deriveCompletion,\n isTerminal,\n type StepTransitionDecision,\n} from './step-transition/decide-step-transition.js';\nimport {\n evaluateGate,\n evaluateGateFeedback,\n gateResultPayload,\n readStepGate,\n} from './step-transition/evaluate-gate.js';\nimport {readStepOutputs} from './step-transition/read-step-outputs.js';\nimport type {RuntimeCompletionStatus} from './workflow-scheduling/runtime-dag.js';\n\ntype CompletionStatus = RuntimeCompletionStatus;\n\ntype ReportedStepResult = {\n readonly status: 'succeeded' | 'failed';\n readonly error: Record<string, unknown> | null;\n readonly output: Record<string, unknown> | null;\n readonly response: string | null;\n readonly exitCode: number | null;\n};\n\nexport type NextStep =\n | {kind: 'step'; step: Step; dispatched: boolean}\n | {kind: 'done'; status: CompletionStatus};\n\ntype DispatchConfigError = InterpolationUnresolvableError | AgentConfigUnresolvableError;\n\ninterface PendingStepDispatchParams {\n readonly jobExecutionId: string;\n readonly pending: Step;\n readonly jobExecution: JobExecution;\n readonly context: WorkflowEvaluationContext;\n readonly tx: Tx;\n}\n\ninterface ResolvePendingStepParams {\n readonly jobExecutionId: string;\n readonly steps: Step[];\n readonly jobExecution: JobExecution;\n readonly attempts: Awaited<ReturnType<typeof getStepAttemptsByJobExecutionId>>;\n readonly jobs: Awaited<ReturnType<typeof getDirectDependencyJobContexts>>;\n readonly tx: Tx;\n}\n\ntype StepConditionOutcome =\n | {kind: 'run'}\n | {\n kind: 'skip';\n statusReason: StepStatusReason;\n evaluationTrace: readonly PersistedEvaluationTraceEntry[];\n };\n\nasync function nextStepForJobExecutionInTransaction(\n jobExecutionId: string,\n tx: Tx,\n): Promise<NextStep> {\n const steps = await getStepsByJobExecutionIdForUpdate(jobExecutionId, tx);\n const hasNoSteps = steps.length === 0;\n\n // An unknown or step-less execution has nothing to progress; rejecting it stops\n // a bad id from deriving a vacuous 'succeeded' completion below.\n if (hasNoSteps) throw new JobNotFoundError(jobExecutionId);\n\n // Re-deliver the in-flight step rather than advancing, so a retried pull\n // cannot skip a step.\n const running = steps.find((step) => step.status === 'running');\n const hasRunningStep = running !== undefined;\n if (hasRunningStep) return {kind: 'step', step: running, dispatched: false};\n\n const firstPending = steps.find((step) => step.status === 'pending');\n const hasPendingStep = firstPending !== undefined;\n if (!hasPendingStep) return {kind: 'done', status: deriveCompletion(steps)};\n\n const jobExecution = await getJobExecutionById(jobExecutionId, tx);\n if (!jobExecution) throw new JobNotFoundError(jobExecutionId);\n\n const attempts = await getStepAttemptsByJobExecutionId(jobExecutionId, tx);\n const jobs = await getDirectDependencyJobContexts(jobExecution.jobId, tx);\n\n return resolveNextPendingStep({jobExecutionId, steps, jobExecution, attempts, jobs, tx});\n}\n\nasync function resolveNextPendingStep({\n jobExecutionId,\n steps,\n jobExecution,\n attempts,\n jobs,\n tx,\n}: ResolvePendingStepParams): Promise<NextStep> {\n let skippedAny = false;\n let currentSteps = steps;\n\n while (true) {\n const pending = currentSteps.find((step) => step.status === 'pending');\n if (pending === undefined) {\n const status = deriveCompletion(currentSteps);\n if (skippedAny) {\n await writeJobStepsSettledOutbox(tx, {\n jobId: jobExecution.jobId,\n jobExecutionId,\n status,\n });\n recordWorkflowJobExecutionStepsSettled(status);\n }\n return {kind: 'done', status};\n }\n\n const context = assembleStepDispatchContext({\n steps: currentSteps,\n attempts,\n targetStepId: pending.id,\n jobExecution,\n jobs,\n });\n const condition = evaluateStepCondition({step: pending, context});\n if (condition.kind === 'run') {\n return dispatchPendingStep({jobExecutionId, pending, jobExecution, context, tx});\n }\n\n const skipped = await markStepSkipped(\n {\n jobExecutionId,\n stepId: pending.id,\n statusReason: condition.statusReason,\n evaluationTrace: condition.evaluationTrace,\n },\n tx,\n );\n const skippedStep = skipped ?? {\n ...pending,\n status: 'skipped' as const,\n statusReason: condition.statusReason,\n evaluationTrace: condition.evaluationTrace,\n error: null,\n };\n currentSteps = currentSteps.map((step) => (step.id === pending.id ? skippedStep : step));\n skippedAny = true;\n }\n}\n\nasync function dispatchPendingStep(params: PendingStepDispatchParams): Promise<NextStep> {\n const hasConfigPlan = params.pending.configPlan !== null;\n if (hasConfigPlan) return dispatchPendingStepWithConfigPlan(params);\n\n const marked = await markStepRunning(\n {jobExecutionId: params.jobExecutionId, stepId: params.pending.id},\n params.tx,\n );\n return {kind: 'step', step: marked ?? params.pending, dispatched: true};\n}\n\nasync function dispatchPendingStepWithConfigPlan({\n jobExecutionId,\n pending,\n jobExecution,\n context,\n tx,\n}: PendingStepDispatchParams): Promise<NextStep> {\n try {\n const completed = completeStepDispatchConfig({\n step: pending,\n context,\n resolveAgentDefaults: catalogDefaultAgentResolver,\n definitionId: jobExecution.jobId,\n });\n const marked = await dispatchStepWithCompletedConfig(\n {\n jobExecutionId,\n stepId: pending.id,\n config: completed.config,\n evaluationTrace: completed.trace,\n },\n tx,\n );\n return {kind: 'step', step: marked ?? {...pending, config: completed.config}, dispatched: true};\n } catch (error) {\n const configError = toDispatchConfigError(error);\n const isConfigError = configError !== null;\n if (!isConfigError) throw error;\n\n const failureError = dispatchConfigError(configError);\n await insertRunningStepAttempt(\n {\n jobExecutionId,\n stepId: pending.id,\n attempt: pending.currentAttempt,\n },\n tx,\n );\n await finishStepAttempt(\n {\n stepId: pending.id,\n attempt: pending.currentAttempt,\n status: 'failed',\n error: failureError,\n logOutcome: 'abandoned',\n },\n tx,\n );\n const status = await settleJobFailed(tx, {\n jobId: jobExecution.jobId,\n jobExecutionId,\n failedStepId: pending.id,\n error: failureError,\n });\n if (status) recordWorkflowJobExecutionStepsSettled(status);\n return status === null\n ? nextStepForJobExecutionInTransaction(jobExecutionId, tx)\n : {kind: 'done', status};\n }\n}\n\nfunction evaluateStepCondition(params: {\n readonly step: Step;\n readonly context: WorkflowEvaluationContext;\n}): StepConditionOutcome {\n const condition = params.step.condition;\n if (condition === null) {\n const execution = params.context.values.execution as {failed?: unknown} | undefined;\n return execution?.failed === true\n ? {\n kind: 'skip',\n statusReason: 'default_gate_rejected',\n evaluationTrace: defaultStepConditionTrace(),\n }\n : {kind: 'run'};\n }\n\n const outcome = evaluatePlannedPredicateAtSite({\n expression: condition,\n field: 'step.if',\n site: params.context.site,\n context: params.context.values,\n });\n const evaluationTrace = explicitConditionTrace({\n expression: condition,\n field: 'step.if',\n route: outcome.route,\n site: params.context.site,\n value: outcome.value,\n degraded: outcome.evaluationFailed,\n });\n if (outcome.evaluationFailed) {\n return {kind: 'skip', statusReason: 'condition_errored', evaluationTrace};\n }\n return outcome.value\n ? {kind: 'run'}\n : {kind: 'skip', statusReason: 'condition_rejected', evaluationTrace};\n}\n\nfunction toDispatchConfigError(error: unknown): DispatchConfigError | null {\n const isInterpolationError = error instanceof InterpolationUnresolvableError;\n if (isInterpolationError) return error;\n\n const isAgentConfigError = error instanceof AgentConfigUnresolvableError;\n if (isAgentConfigError) return error;\n\n return null;\n}\n\nfunction dispatchConfigError(error: DispatchConfigError): Record<string, unknown> {\n if (error instanceof InterpolationUnresolvableError) {\n return {\n message: error.message,\n reason: 'config_unresolvable',\n field: error.envKey === undefined ? error.field : `${error.field}.${error.envKey}`,\n source: error.source,\n };\n }\n\n return {\n message: error.message,\n reason: 'config_unresolvable',\n field: 'agent',\n source: 'agent',\n };\n}\n\nexport interface NextStepForLeasedJobExecutionParams {\n jobId: string;\n jobExecutionId: string;\n runnerSessionId: string;\n}\n\nexport function nextStepForLeasedJobExecution(\n params: NextStepForLeasedJobExecutionParams,\n): Promise<NextStep> {\n return withTransaction(async (tx) => {\n const leaseIsActive = await lockActiveJobExecutionLeaseForUpdate(params, tx);\n if (!leaseIsActive) throw new JobLeaseNotActiveError(params.jobExecutionId);\n\n return nextStepForJobExecutionInTransaction(params.jobExecutionId, tx);\n });\n}\n\nexport function nextStepForJob(jobId: string): Promise<NextStep> {\n return withTransaction(async (tx) => {\n const jobExecution = await getLatestJobExecutionByJobId(jobId, tx);\n if (!jobExecution) throw new JobNotFoundError(jobId);\n\n return nextStepForJobExecutionInTransaction(jobExecution.id, tx);\n });\n}\n\nexport interface RecordStepResultParams {\n jobExecutionId: string;\n stepId: string;\n status: 'succeeded' | 'failed';\n error?: Record<string, unknown> | null;\n // Structured runner output feeds gate predicates and audit/history on the\n // attempt row; the current step projection keeps only status/error.\n output?: Record<string, unknown> | null;\n response?: string | null;\n exitCode?: number | null;\n // The attempt the runner was dispatched. Omitted = \"the step's current\n // attempt\" (back-compat for callers that don't track attempts yet).\n attempt?: number;\n logOutcome?: LogOutcomeDto;\n}\n\nexport type RecordStepResultOutcome = StepProgressionOutcome;\n\ninterface RecordStepResultTransactionResult {\n outcome: RecordStepResultOutcome;\n metrics: StepProgressionMetrics;\n}\n\nfunction outcomeFromSteps(steps: Step[]): RecordStepResultOutcome {\n return steps.every((step) => isTerminal(step.status))\n ? {jobFinished: true, status: deriveCompletion(steps)}\n : {jobFinished: false};\n}\n\nexport async function recordStepResult(\n params: RecordStepResultParams,\n): Promise<RecordStepResultOutcome> {\n const progression = await withTransaction<RecordStepResultTransactionResult>((tx) =>\n recordStepResultInTransaction(params, tx),\n );\n\n recordStepProgressionMetrics(progression.metrics);\n\n return progression.outcome;\n}\n\nasync function recordStepResultInTransaction(\n params: RecordStepResultParams,\n tx: Tx,\n): Promise<RecordStepResultTransactionResult> {\n const jobExecutionId = params.jobExecutionId;\n\n const jobExecution = await getJobExecutionById(jobExecutionId, tx);\n if (!jobExecution) throw new JobNotFoundError(jobExecutionId);\n\n const steps = await getStepsByJobExecutionIdForUpdate(jobExecutionId, tx);\n const target = steps.find((step) => step.id === params.stepId);\n const hasTargetStep = target !== undefined;\n\n if (!hasTargetStep) throw new StepNotFoundError(params.stepId, jobExecutionId);\n\n const current = target.currentAttempt;\n const reported = params.attempt ?? current;\n const reportClassification = classifyReportedStep(target, reported, jobExecution.jobId);\n if (reportClassification instanceof Error) throw reportClassification;\n if (reportClassification === 'noop') return {outcome: outcomeFromSteps(steps), metrics: {}};\n\n // Migration/back-compat boundary: a running step may predate the\n // step_attempts table or have been marked running by legacy code. Create\n // the audit row just before finalization if dispatch did not already do it.\n await insertRunningStepAttempt(\n {\n jobExecutionId,\n stepId: params.stepId,\n attempt: current,\n config: target.config,\n },\n tx,\n );\n\n let result: ReportedStepResult = {\n status: params.status,\n error: params.error ?? null,\n output: params.output ?? null,\n response: params.response ?? null,\n exitCode: params.exitCode ?? null,\n };\n const outputCoercion = coerceReportedStepOutput(target.config, result);\n if (outputCoercion.kind === 'coerced') {\n result = {...result, output: outputCoercion.output};\n }\n if (outputCoercion.kind === 'failed') {\n result = {\n status: 'failed',\n error: outputInvalidError(outputCoercion.error),\n output: null,\n response: result.response,\n exitCode: result.exitCode,\n };\n }\n\n // Evaluate the gate (if any) at the service boundary — the only place the CEL\n // engine runs — and pass the precomputed outcome into the pure decision.\n const shouldEvaluateGate = outputCoercion.kind !== 'failed';\n const gate = shouldEvaluateGate ? readStepGate(target.config) : undefined;\n const gateOutcome = shouldEvaluateGate ? evaluateGate(gate, result) : {kind: 'no-gate' as const};\n const hasRestartPolicy = gate?.onFailure?.restartFrom !== undefined;\n // The restart cap is bounded on the gating step's OWN attempts, not its\n // current_attempt (which a rewind inflates for downstream steps).\n const gatingAttemptCount = hasRestartPolicy\n ? await countStepAttempts(params.stepId, tx)\n : undefined;\n const decision = decideStepTransition({\n steps,\n target,\n reportedAttempt: reported,\n result,\n gateOutcome,\n ...(gate?.onFailure ? {gateOnFailure: gate.onFailure} : {}),\n ...(gatingAttemptCount !== undefined ? {gatingAttemptCount} : {}),\n });\n const resolvedDecision = resolveRestartFeedback({\n decision,\n gate,\n result,\n definitionId: jobExecution.jobId,\n });\n\n return applyStepTransition(\n resolvedDecision,\n {\n jobId: jobExecution.jobId,\n jobExecutionId,\n result,\n logOutcome: params.logOutcome ?? 'drained',\n gateResult: gateResultPayload(gateOutcome, result.exitCode),\n },\n tx,\n );\n}\n\ntype OutputCoercionResult =\n | {kind: 'not-applicable'}\n | {kind: 'coerced'; output: Record<string, unknown>}\n | {kind: 'failed'; error: StepOutputCoercionError};\n\nexport type ReportedStepClassification = 'proceed' | 'noop' | Error;\n\nexport function classifyReportedStep(\n target: Step,\n reportedAttempt: number,\n jobId: string,\n): ReportedStepClassification {\n const currentAttempt = target.currentAttempt;\n if (reportedAttempt > currentAttempt) {\n return new StepAttemptAheadError(target.id, jobId, reportedAttempt, currentAttempt);\n }\n\n if (reportedAttempt < currentAttempt) return 'noop';\n if (isTerminal(target.status)) return 'noop';\n if (target.status === 'pending') return new StepNotRunningError(target.id, jobId);\n return 'proceed';\n}\n\nfunction coerceReportedStepOutput(\n config: Record<string, unknown>,\n result: ReportedStepResult,\n): OutputCoercionResult {\n if (result.status !== 'succeeded') return {kind: 'not-applicable'};\n\n const declarations = readStepOutputs(config);\n if (declarations === undefined) return {kind: 'not-applicable'};\n\n const coerced = coerceStepOutputs({declarations, output: result.output});\n if (!coerced.ok) return {kind: 'failed', error: coerced.error};\n return {kind: 'coerced', output: coerced.output};\n}\n\nfunction outputInvalidError(error: StepOutputCoercionError): Record<string, unknown> {\n return {\n message: error.message,\n reason: 'output_invalid',\n field: `outputs.${error.key}`,\n outputKey: error.key,\n issue: error.reason,\n ...(error.expectedType === undefined ? {} : {expectedType: error.expectedType}),\n ...(error.schemaError === undefined ? {} : {schemaError: error.schemaError}),\n };\n}\n\nfunction resolveRestartFeedback(params: {\n decision: StepTransitionDecision;\n gate: ReturnType<typeof readStepGate>;\n result: ReportedStepResult;\n definitionId: string;\n}): StepTransitionDecision {\n if (params.decision.kind !== 'restart-job-from-step') return params.decision;\n if (params.gate === undefined) return params.decision;\n\n try {\n return {\n ...params.decision,\n feedback: evaluateGateFeedback({\n gate: params.gate,\n result: params.result,\n definitionId: params.definitionId,\n }),\n };\n } catch (error) {\n if (error instanceof InterpolationUnresolvableError) {\n return {\n kind: 'fail-job',\n failedStepId: params.decision.failedStepId,\n attempt: params.decision.attempt,\n failureError: dispatchConfigError(error),\n };\n }\n throw error;\n }\n}\n\nfunction recordStepProgressionMetrics(metrics: StepProgressionMetrics): void {\n const settledStatus = metrics.jobStepsSettledStatus;\n const hasSettledStatus = settledStatus !== undefined;\n if (hasSettledStatus) recordWorkflowJobExecutionStepsSettled(settledStatus);\n\n const restartWasEnqueued = metrics.stepRestartEnqueued === true;\n if (restartWasEnqueued) recordWorkflowStepRestartEnqueued();\n}\n"],"names":["catalogDefaultAgentResolver","coerceStepOutputs","evaluatePlannedPredicateAtSite","withTransaction","countStepAttempts","dispatchStepWithCompletedConfig","finishStepAttempt","getDirectDependencyJobContexts","getJobExecutionById","getLatestJobExecutionByJobId","getStepAttemptsByJobExecutionId","getStepsByJobExecutionIdForUpdate","insertRunningStepAttempt","lockActiveJobExecutionLeaseForUpdate","markStepRunning","markStepSkipped","settleJobFailed","writeJobStepsSettledOutbox","recordWorkflowJobExecutionStepsSettled","recordWorkflowStepRestartEnqueued","defaultStepConditionTrace","explicitConditionTrace","AgentConfigUnresolvableError","InterpolationUnresolvableError","JobLeaseNotActiveError","JobNotFoundError","StepAttemptAheadError","StepNotFoundError","StepNotRunningError","assembleStepDispatchContext","completeStepDispatchConfig","applyStepTransition","decideStepTransition","deriveCompletion","isTerminal","evaluateGate","evaluateGateFeedback","gateResultPayload","readStepGate","readStepOutputs","nextStepForJobExecutionInTransaction","jobExecutionId","tx","steps","hasNoSteps","length","running","find","step","status","hasRunningStep","undefined","kind","dispatched","firstPending","hasPendingStep","jobExecution","attempts","jobs","jobId","resolveNextPendingStep","skippedAny","currentSteps","pending","context","targetStepId","id","condition","evaluateStepCondition","dispatchPendingStep","skipped","stepId","statusReason","evaluationTrace","skippedStep","error","map","params","hasConfigPlan","configPlan","dispatchPendingStepWithConfigPlan","marked","completed","resolveAgentDefaults","definitionId","config","trace","configError","toDispatchConfigError","isConfigError","failureError","dispatchConfigError","attempt","currentAttempt","logOutcome","failedStepId","execution","values","failed","outcome","expression","field","site","route","value","degraded","evaluationFailed","isInterpolationError","isAgentConfigError","message","reason","envKey","source","nextStepForLeasedJobExecution","leaseIsActive","nextStepForJob","outcomeFromSteps","every","jobFinished","recordStepResult","progression","recordStepResultInTransaction","recordStepProgressionMetrics","metrics","target","hasTargetStep","current","reported","reportClassification","classifyReportedStep","Error","result","output","response","exitCode","outputCoercion","coerceReportedStepOutput","outputInvalidError","shouldEvaluateGate","gate","gateOutcome","hasRestartPolicy","onFailure","restartFrom","gatingAttemptCount","decision","reportedAttempt","gateOnFailure","resolvedDecision","resolveRestartFeedback","gateResult","declarations","coerced","ok","key","outputKey","issue","expectedType","schemaError","feedback","settledStatus","jobStepsSettledStatus","hasSettledStatus","restartWasEnqueued","stepRestartEnqueued"],"mappings":"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"}
|