@shipfox/api-workflows 11.0.0 → 12.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 +8 -8
- package/CHANGELOG.md +100 -0
- package/README.md +75 -0
- package/dist/core/agent-defaults.d.ts +2 -1
- package/dist/core/agent-defaults.d.ts.map +1 -1
- package/dist/core/agent-defaults.js.map +1 -1
- package/dist/core/checkout.d.ts +7 -21
- package/dist/core/checkout.d.ts.map +1 -1
- package/dist/core/checkout.js +122 -41
- package/dist/core/checkout.js.map +1 -1
- package/dist/core/entities/job-execution.d.ts +8 -0
- package/dist/core/entities/job-execution.d.ts.map +1 -1
- package/dist/core/entities/job-execution.js +13 -1
- package/dist/core/entities/job-execution.js.map +1 -1
- package/dist/core/entities/job-listener-event.d.ts +2 -0
- package/dist/core/entities/job-listener-event.d.ts.map +1 -1
- package/dist/core/entities/job-listener-event.js.map +1 -1
- package/dist/core/entities/step.d.ts +13 -3
- package/dist/core/entities/step.d.ts.map +1 -1
- package/dist/core/entities/step.js +6 -0
- package/dist/core/entities/step.js.map +1 -1
- package/dist/core/entities/workflow-run-attempt.d.ts +1 -0
- package/dist/core/entities/workflow-run-attempt.d.ts.map +1 -1
- package/dist/core/entities/workflow-run-attempt.js.map +1 -1
- package/dist/core/entities/workflow-run.d.ts +17 -0
- package/dist/core/entities/workflow-run.d.ts.map +1 -1
- package/dist/core/entities/workflow-run.js.map +1 -1
- package/dist/core/errors.d.ts +9 -2
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +10 -5
- package/dist/core/errors.js.map +1 -1
- package/dist/core/job-execution.d.ts.map +1 -1
- package/dist/core/job-execution.js +14 -8
- package/dist/core/job-execution.js.map +1 -1
- package/dist/core/job-transition/decide-job-activation.d.ts +1 -0
- package/dist/core/job-transition/decide-job-activation.d.ts.map +1 -1
- package/dist/core/job-transition/decide-job-activation.js +1 -0
- package/dist/core/job-transition/decide-job-activation.js.map +1 -1
- package/dist/core/job-transition/derive-job-success.d.ts +1 -0
- package/dist/core/job-transition/derive-job-success.d.ts.map +1 -1
- package/dist/core/job-transition/derive-job-success.js +5 -8
- package/dist/core/job-transition/derive-job-success.js.map +1 -1
- package/dist/core/listener-execution-materialization.d.ts +6 -3
- package/dist/core/listener-execution-materialization.d.ts.map +1 -1
- package/dist/core/listener-execution-materialization.js +44 -6
- package/dist/core/listener-execution-materialization.js.map +1 -1
- package/dist/core/resolve-trigger-reference.d.ts +11 -0
- package/dist/core/resolve-trigger-reference.d.ts.map +1 -0
- package/dist/core/resolve-trigger-reference.js +39 -0
- package/dist/core/resolve-trigger-reference.js.map +1 -0
- package/dist/core/run-workflow.d.ts +1 -0
- package/dist/core/run-workflow.d.ts.map +1 -1
- package/dist/core/run-workflow.js +1 -0
- package/dist/core/run-workflow.js.map +1 -1
- package/dist/core/step-config/agent.d.ts +1 -2
- package/dist/core/step-config/agent.d.ts.map +1 -1
- package/dist/core/step-config/agent.js +22 -7
- package/dist/core/step-config/agent.js.map +1 -1
- package/dist/core/step-config/assemble-run-context.d.ts +19 -8
- package/dist/core/step-config/assemble-run-context.d.ts.map +1 -1
- package/dist/core/step-config/assemble-run-context.js +51 -19
- package/dist/core/step-config/assemble-run-context.js.map +1 -1
- package/dist/core/step-config/complete-step-dispatch-config.d.ts.map +1 -1
- package/dist/core/step-config/complete-step-dispatch-config.js +72 -4
- package/dist/core/step-config/complete-step-dispatch-config.js.map +1 -1
- package/dist/core/step-config/index.d.ts +1 -0
- package/dist/core/step-config/index.d.ts.map +1 -1
- package/dist/core/step-config/index.js +1 -0
- package/dist/core/step-config/index.js.map +1 -1
- package/dist/core/step-config/materialize-job-execution-steps.d.ts +1 -1
- package/dist/core/step-config/materialize-job-execution-steps.d.ts.map +1 -1
- package/dist/core/step-config/materialize-job-execution-steps.js +49 -8
- package/dist/core/step-config/materialize-job-execution-steps.js.map +1 -1
- package/dist/core/step-config/materialize-workflow-model.d.ts +3 -3
- package/dist/core/step-config/materialize-workflow-model.d.ts.map +1 -1
- package/dist/core/step-config/materialize-workflow-model.js +9 -5
- package/dist/core/step-config/materialize-workflow-model.js.map +1 -1
- package/dist/core/step-config/resolve-job-execution-name.d.ts +3 -3
- package/dist/core/step-config/resolve-job-execution-name.d.ts.map +1 -1
- package/dist/core/step-config/resolve-job-execution-name.js +24 -13
- package/dist/core/step-config/resolve-job-execution-name.js.map +1 -1
- package/dist/core/step-config/resolve-step-config.d.ts.map +1 -1
- package/dist/core/step-config/resolve-step-config.js +174 -9
- package/dist/core/step-config/resolve-step-config.js.map +1 -1
- package/dist/core/step-config/resolve-workflow-run-name.d.ts +19 -0
- package/dist/core/step-config/resolve-workflow-run-name.d.ts.map +1 -0
- package/dist/core/step-config/resolve-workflow-run-name.js +73 -0
- package/dist/core/step-config/resolve-workflow-run-name.js.map +1 -0
- package/dist/core/step-transition/decide-step-transition.js.map +1 -1
- package/dist/core/step-transition/evaluate-gate.d.ts +2 -1
- package/dist/core/step-transition/evaluate-gate.d.ts.map +1 -1
- package/dist/core/step-transition/evaluate-gate.js +5 -3
- package/dist/core/step-transition/evaluate-gate.js.map +1 -1
- package/dist/core/workflow-run-creation.d.ts +3 -0
- package/dist/core/workflow-run-creation.d.ts.map +1 -1
- package/dist/core/workflow-run-creation.js +22 -7
- package/dist/core/workflow-run-creation.js.map +1 -1
- package/dist/db/db.d.ts +278 -10
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +2 -0
- package/dist/db/db.js.map +1 -1
- package/dist/db/index.d.ts +3 -2
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +2 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/job-listener-events.d.ts +2 -0
- package/dist/db/job-listener-events.d.ts.map +1 -1
- package/dist/db/job-listener-events.js +1 -0
- package/dist/db/job-listener-events.js.map +1 -1
- package/dist/db/job-listeners.d.ts +2 -0
- package/dist/db/job-listeners.d.ts.map +1 -1
- package/dist/db/job-listeners.js +81 -21
- package/dist/db/job-listeners.js.map +1 -1
- package/dist/db/schema/job-executions.d.ts +3 -3
- package/dist/db/schema/job-executions.d.ts.map +1 -1
- package/dist/db/schema/job-executions.js +8 -4
- package/dist/db/schema/job-executions.js.map +1 -1
- package/dist/db/schema/job-listener-events.d.ts +20 -0
- package/dist/db/schema/job-listener-events.d.ts.map +1 -1
- package/dist/db/schema/job-listener-events.js +2 -0
- package/dist/db/schema/job-listener-events.js.map +1 -1
- package/dist/db/schema/step-attempts.js +2 -2
- package/dist/db/schema/step-attempts.js.map +1 -1
- package/dist/db/schema/steps.d.ts +4 -2
- package/dist/db/schema/steps.d.ts.map +1 -1
- package/dist/db/schema/steps.js +1 -1
- package/dist/db/schema/steps.js.map +1 -1
- package/dist/db/schema/workflow-run-attempts.d.ts +21 -2
- package/dist/db/schema/workflow-run-attempts.d.ts.map +1 -1
- package/dist/db/schema/workflow-run-attempts.js +2 -0
- package/dist/db/schema/workflow-run-attempts.js.map +1 -1
- package/dist/db/schema/workflow-run-counters.d.ts +43 -0
- package/dist/db/schema/workflow-run-counters.d.ts.map +1 -0
- package/dist/db/schema/workflow-run-counters.js +10 -0
- package/dist/db/schema/workflow-run-counters.js.map +1 -0
- package/dist/db/schema/workflow-runs.d.ts +54 -1
- package/dist/db/schema/workflow-runs.d.ts.map +1 -1
- package/dist/db/schema/workflow-runs.js +10 -2
- package/dist/db/schema/workflow-runs.js.map +1 -1
- package/dist/db/workflow-runs/job-executions.d.ts.map +1 -1
- package/dist/db/workflow-runs/job-executions.js +35 -14
- package/dist/db/workflow-runs/job-executions.js.map +1 -1
- package/dist/db/workflow-runs/jobs.d.ts +2 -0
- package/dist/db/workflow-runs/jobs.d.ts.map +1 -1
- package/dist/db/workflow-runs/jobs.js +9 -5
- package/dist/db/workflow-runs/jobs.js.map +1 -1
- package/dist/db/workflow-runs/queries.d.ts +51 -0
- package/dist/db/workflow-runs/queries.d.ts.map +1 -1
- package/dist/db/workflow-runs/queries.js +82 -2
- package/dist/db/workflow-runs/queries.js.map +1 -1
- package/dist/db/workflow-runs/run-create.d.ts +1 -0
- package/dist/db/workflow-runs/run-create.d.ts.map +1 -1
- package/dist/db/workflow-runs/run-create.js +159 -32
- package/dist/db/workflow-runs/run-create.js.map +1 -1
- package/dist/db/workflow-runs/run-rerun.d.ts.map +1 -1
- package/dist/db/workflow-runs/run-rerun.js +13 -5
- package/dist/db/workflow-runs/run-rerun.js.map +1 -1
- package/dist/db/workflow-runs/shared.d.ts +1 -0
- package/dist/db/workflow-runs/shared.d.ts.map +1 -1
- package/dist/db/workflow-runs/shared.js +2 -1
- package/dist/db/workflow-runs/shared.js.map +1 -1
- package/dist/db/workflow-runs/steps.js +3 -3
- package/dist/db/workflow-runs/steps.js.map +1 -1
- package/dist/db/workflow-runs.d.ts +4 -3
- package/dist/db/workflow-runs.d.ts.map +1 -1
- package/dist/db/workflow-runs.js +3 -2
- package/dist/db/workflow-runs.js.map +1 -1
- package/dist/metrics/instance.d.ts +1 -0
- package/dist/metrics/instance.d.ts.map +1 -1
- package/dist/metrics/instance.js +9 -0
- package/dist/metrics/instance.js.map +1 -1
- package/dist/presentation/dto/checkout-token.d.ts +1 -0
- package/dist/presentation/dto/checkout-token.d.ts.map +1 -1
- package/dist/presentation/dto/checkout-token.js +1 -0
- package/dist/presentation/dto/checkout-token.js.map +1 -1
- package/dist/presentation/dto/index.d.ts +1 -1
- package/dist/presentation/dto/index.d.ts.map +1 -1
- package/dist/presentation/dto/index.js +1 -1
- package/dist/presentation/dto/index.js.map +1 -1
- package/dist/presentation/dto/step.d.ts.map +1 -1
- package/dist/presentation/dto/step.js +2 -2
- package/dist/presentation/dto/step.js.map +1 -1
- package/dist/presentation/dto/workflow-run.d.ts +3 -1
- package/dist/presentation/dto/workflow-run.d.ts.map +1 -1
- package/dist/presentation/dto/workflow-run.js +34 -0
- package/dist/presentation/dto/workflow-run.js.map +1 -1
- package/dist/presentation/inter-module.d.ts.map +1 -1
- package/dist/presentation/inter-module.js +31 -3
- package/dist/presentation/inter-module.js.map +1 -1
- package/dist/presentation/routes/checkout-token.d.ts +1 -1
- package/dist/presentation/routes/checkout-token.d.ts.map +1 -1
- package/dist/presentation/routes/checkout-token.js +32 -20
- package/dist/presentation/routes/checkout-token.js.map +1 -1
- package/dist/presentation/routes/leased-step.d.ts +2 -0
- package/dist/presentation/routes/leased-step.d.ts.map +1 -1
- package/dist/presentation/routes/leased-step.js +2 -1
- package/dist/presentation/routes/leased-step.js.map +1 -1
- package/dist/presentation/routes/list-runs.d.ts.map +1 -1
- package/dist/presentation/routes/list-runs.js +9 -3
- package/dist/presentation/routes/list-runs.js.map +1 -1
- package/dist/presentation/routes/project-access.d.ts +1 -0
- package/dist/presentation/routes/project-access.d.ts.map +1 -1
- package/dist/presentation/routes/report-step.d.ts.map +1 -1
- package/dist/presentation/routes/report-step.js +9 -2
- package/dist/presentation/routes/report-step.js.map +1 -1
- package/dist/presentation/subscribers/on-job-steps-settled.js +1 -1
- package/dist/presentation/subscribers/on-job-steps-settled.js.map +1 -1
- package/dist/presentation/subscribers/on-runner-job-claimed.d.ts.map +1 -1
- package/dist/presentation/subscribers/on-runner-job-claimed.js +21 -0
- package/dist/presentation/subscribers/on-runner-job-claimed.js.map +1 -1
- package/dist/temporal/activities/index.d.ts.map +1 -1
- package/dist/temporal/activities/index.js +2 -1
- package/dist/temporal/activities/index.js.map +1 -1
- package/dist/temporal/activities/orchestration-activities.d.ts +1 -0
- package/dist/temporal/activities/orchestration-activities.d.ts.map +1 -1
- package/dist/temporal/activities/orchestration-activities.js.map +1 -1
- package/dist/temporal/constants.d.ts +1 -0
- package/dist/temporal/constants.d.ts.map +1 -1
- package/dist/temporal/constants.js +1 -0
- package/dist/temporal/constants.js.map +1 -1
- package/dist/temporal/index.d.ts +1 -1
- package/dist/temporal/index.d.ts.map +1 -1
- package/dist/temporal/index.js +1 -1
- package/dist/temporal/index.js.map +1 -1
- package/dist/temporal/workflows/index.bundle.js +82 -43
- package/dist/temporal/workflows/index.d.ts +1 -1
- package/dist/temporal/workflows/index.d.ts.map +1 -1
- package/dist/temporal/workflows/index.js +1 -1
- package/dist/temporal/workflows/index.js.map +1 -1
- package/dist/temporal/workflows/job-execution-orchestration.d.ts +5 -0
- package/dist/temporal/workflows/job-execution-orchestration.d.ts.map +1 -1
- package/dist/temporal/workflows/job-execution-orchestration.js +77 -43
- package/dist/temporal/workflows/job-execution-orchestration.js.map +1 -1
- package/dist/temporal/workflows/test-env.d.ts +5 -1
- package/dist/temporal/workflows/test-env.d.ts.map +1 -1
- package/dist/temporal/workflows/test-env.js +32 -11
- package/dist/temporal/workflows/test-env.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/drizzle/0000_initial.sql +14 -2
- package/drizzle/0001_windy_sunfire.sql +1 -0
- package/drizzle/meta/0000_snapshot.json +93 -1
- package/drizzle/meta/0001_snapshot.json +1711 -0
- package/drizzle/meta/_journal.json +2 -2
- package/package.json +21 -21
- package/src/core/agent-defaults.ts +2 -1
- package/src/core/checkout.test.ts +378 -67
- package/src/core/checkout.ts +142 -59
- package/src/core/entities/job-execution.test.ts +21 -0
- package/src/core/entities/job-execution.ts +24 -0
- package/src/core/entities/job-listener-event.ts +3 -0
- package/src/core/entities/step.ts +15 -3
- package/src/core/entities/workflow-run-attempt.ts +1 -0
- package/src/core/entities/workflow-run.ts +16 -0
- package/src/core/errors.ts +21 -7
- package/src/core/job-execution.ts +27 -4
- package/src/core/job-transition/decide-job-activation.test.ts +4 -0
- package/src/core/job-transition/decide-job-activation.ts +2 -0
- package/src/core/job-transition/derive-job-success.test.ts +12 -0
- package/src/core/job-transition/derive-job-success.ts +6 -9
- package/src/core/listener-execution-materialization.test.ts +2 -0
- package/src/core/listener-execution-materialization.ts +57 -11
- package/src/core/resolve-trigger-reference.test.ts +160 -0
- package/src/core/resolve-trigger-reference.ts +53 -0
- package/src/core/run-workflow.ts +2 -0
- package/src/core/step-config/agent.ts +29 -12
- package/src/core/step-config/assemble-run-context.test.ts +149 -6
- package/src/core/step-config/assemble-run-context.ts +87 -25
- package/src/core/step-config/complete-step-dispatch-config.test.ts +125 -2
- package/src/core/step-config/complete-step-dispatch-config.ts +83 -1
- package/src/core/step-config/index.ts +7 -0
- package/src/core/step-config/materialize-job-execution-steps.test.ts +250 -1
- package/src/core/step-config/materialize-job-execution-steps.ts +57 -10
- package/src/core/step-config/materialize-workflow-model.test.ts +212 -4
- package/src/core/step-config/materialize-workflow-model.ts +33 -28
- package/src/core/step-config/resolve-job-execution-name.test.ts +37 -15
- package/src/core/step-config/resolve-job-execution-name.ts +30 -15
- package/src/core/step-config/resolve-step-config.ts +175 -10
- package/src/core/step-config/resolve-workflow-run-name.test.ts +115 -0
- package/src/core/step-config/resolve-workflow-run-name.ts +108 -0
- package/src/core/step-transition/decide-step-transition.ts +2 -2
- package/src/core/step-transition/evaluate-gate.test.ts +8 -0
- package/src/core/step-transition/evaluate-gate.ts +8 -1
- package/src/core/workflow-run-creation.test.ts +7 -4
- package/src/core/workflow-run-creation.ts +13 -7
- package/src/db/db.ts +2 -0
- package/src/db/index.ts +6 -0
- package/src/db/job-listener-events.test.ts +19 -0
- package/src/db/job-listener-events.ts +3 -0
- package/src/db/job-listeners.test.ts +187 -5
- package/src/db/job-listeners.ts +122 -30
- package/src/db/schema/job-executions.ts +12 -5
- package/src/db/schema/job-listener-events.ts +3 -0
- package/src/db/schema/step-attempts.ts +2 -2
- package/src/db/schema/steps.ts +2 -1
- package/src/db/schema/workflow-run-attempts.ts +2 -0
- package/src/db/schema/workflow-run-counters.ts +13 -0
- package/src/db/schema/workflow-runs.ts +11 -2
- package/src/db/workflow-runs/job-executions.ts +37 -15
- package/src/db/workflow-runs/jobs.ts +17 -4
- package/src/db/workflow-runs/queries.test.ts +206 -0
- package/src/db/workflow-runs/queries.ts +146 -2
- package/src/db/workflow-runs/run-create.test.ts +606 -8
- package/src/db/workflow-runs/run-create.ts +185 -40
- package/src/db/workflow-runs/run-rerun.test.ts +61 -2
- package/src/db/workflow-runs/run-rerun.ts +15 -5
- package/src/db/workflow-runs/shared.ts +2 -0
- package/src/db/workflow-runs/steps.ts +3 -3
- package/src/db/workflow-runs.ts +7 -0
- package/src/metrics/instance.ts +14 -0
- package/src/presentation/dto/checkout-token.test.ts +19 -9
- package/src/presentation/dto/checkout-token.ts +2 -1
- package/src/presentation/dto/index.ts +1 -1
- package/src/presentation/dto/job.test.ts +9 -0
- package/src/presentation/dto/step.test.ts +12 -0
- package/src/presentation/dto/step.ts +5 -2
- package/src/presentation/dto/workflow-run.ts +44 -2
- package/src/presentation/inter-module.test.ts +165 -0
- package/src/presentation/inter-module.ts +38 -4
- package/src/presentation/routes/checkout-token.test.ts +357 -142
- package/src/presentation/routes/checkout-token.ts +56 -26
- package/src/presentation/routes/get-run.test.ts +2 -0
- package/src/presentation/routes/get-step-secrets.test.ts +7 -2
- package/src/presentation/routes/leased-step.ts +9 -1
- package/src/presentation/routes/list-runs.test.ts +57 -0
- package/src/presentation/routes/list-runs.ts +8 -3
- package/src/presentation/routes/report-step.test.ts +25 -0
- package/src/presentation/routes/report-step.ts +10 -2
- package/src/presentation/subscribers/on-job-steps-settled.ts +1 -1
- package/src/presentation/subscribers/on-runner-job-claimed.test.ts +49 -0
- package/src/presentation/subscribers/on-runner-job-claimed.ts +22 -0
- package/src/temporal/activities/index.ts +1 -0
- package/src/temporal/activities/orchestration-activities.ts +1 -0
- package/src/temporal/constants.ts +1 -0
- package/src/temporal/index.ts +1 -0
- package/src/temporal/workflows/index.ts +1 -0
- package/src/temporal/workflows/job-execution-orchestration.test.ts +142 -6
- package/src/temporal/workflows/job-execution-orchestration.ts +99 -50
- package/src/temporal/workflows/run-orchestration.test.ts +1 -1
- package/src/temporal/workflows/test-env.ts +50 -13
- package/test/factories/project.ts +2 -0
- package/test/factories/workflow-model.ts +80 -26
- package/test/factories/workflow-run.ts +4 -1
- package/test/fixtures/agent-inter-module.ts +2 -1
- package/test/fixtures/job-with-steps.ts +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/drizzle/0001_agent_tool_materialization.sql +0 -1
|
@@ -1,12 +1,18 @@
|
|
|
1
|
+
import { WORKFLOW_MODEL_CHECKOUT_TARGET_FIELDS } from '@shipfox/api-definitions-dto';
|
|
2
|
+
import { assertWorkingDirectory } from '@shipfox/api-workflows-dto';
|
|
1
3
|
import { capTraceEntries } from '@shipfox/expression';
|
|
2
4
|
import { completeAgentConfig } from './agent.js';
|
|
5
|
+
import { completeStepFieldWithTrace } from './fields.js';
|
|
3
6
|
import { completeRunDispatchConfig } from './run.js';
|
|
4
7
|
export async function completeStepDispatchConfig(params) {
|
|
5
8
|
const plan = params.step.configPlan;
|
|
6
|
-
if (plan === null)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
if (plan === null) {
|
|
10
|
+
assertWorkingDirectoryIfPresent(params.step.config.working_directory);
|
|
11
|
+
return {
|
|
12
|
+
config: params.step.config,
|
|
13
|
+
trace: []
|
|
14
|
+
};
|
|
15
|
+
}
|
|
10
16
|
const config = {
|
|
11
17
|
...params.step.config
|
|
12
18
|
};
|
|
@@ -29,10 +35,72 @@ export async function completeStepDispatchConfig(params) {
|
|
|
29
35
|
definitionId: params.definitionId,
|
|
30
36
|
trace
|
|
31
37
|
});
|
|
38
|
+
completeWorkingDirectoryConfig({
|
|
39
|
+
config,
|
|
40
|
+
plan,
|
|
41
|
+
context: params.context,
|
|
42
|
+
definitionId: params.definitionId,
|
|
43
|
+
trace
|
|
44
|
+
});
|
|
45
|
+
completeCheckoutConfig({
|
|
46
|
+
config,
|
|
47
|
+
plan,
|
|
48
|
+
context: params.context,
|
|
49
|
+
definitionId: params.definitionId,
|
|
50
|
+
trace
|
|
51
|
+
});
|
|
52
|
+
assertWorkingDirectoryIfPresent(config.working_directory);
|
|
32
53
|
return {
|
|
33
54
|
config,
|
|
34
55
|
trace: capTraceEntries(trace)
|
|
35
56
|
};
|
|
36
57
|
}
|
|
58
|
+
function completeCheckoutConfig(params) {
|
|
59
|
+
const checkoutPlan = params.plan.checkout;
|
|
60
|
+
if (checkoutPlan === undefined) return;
|
|
61
|
+
const checkout = params.config.checkout;
|
|
62
|
+
if (checkout === null || typeof checkout !== 'object' || Array.isArray(checkout)) {
|
|
63
|
+
throw new Error('Checkout dispatch config is missing an object');
|
|
64
|
+
}
|
|
65
|
+
const resolvedCheckout = {
|
|
66
|
+
...checkout
|
|
67
|
+
};
|
|
68
|
+
params.config.checkout = resolvedCheckout;
|
|
69
|
+
for (const [key, fieldName] of WORKFLOW_MODEL_CHECKOUT_TARGET_FIELDS){
|
|
70
|
+
const field = checkoutPlan[key];
|
|
71
|
+
if (field === undefined) continue;
|
|
72
|
+
const resolved = completeStepFieldWithTrace({
|
|
73
|
+
field: fieldName,
|
|
74
|
+
template: field,
|
|
75
|
+
context: params.context,
|
|
76
|
+
definitionId: params.definitionId,
|
|
77
|
+
errorField: fieldName
|
|
78
|
+
});
|
|
79
|
+
resolvedCheckout[key] = resolved.value;
|
|
80
|
+
params.trace.push(...resolved.trace.map((entry)=>({
|
|
81
|
+
...entry,
|
|
82
|
+
field: fieldName
|
|
83
|
+
})));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function assertWorkingDirectoryIfPresent(value) {
|
|
87
|
+
if (value !== undefined) assertWorkingDirectory(value);
|
|
88
|
+
}
|
|
89
|
+
function completeWorkingDirectoryConfig(params) {
|
|
90
|
+
const field = params.plan.working_directory;
|
|
91
|
+
if (field === undefined) return;
|
|
92
|
+
const resolved = completeStepFieldWithTrace({
|
|
93
|
+
field: 'step.working_directory',
|
|
94
|
+
template: field,
|
|
95
|
+
context: params.context,
|
|
96
|
+
definitionId: params.definitionId,
|
|
97
|
+
errorField: 'step.working_directory'
|
|
98
|
+
});
|
|
99
|
+
params.config.working_directory = resolved.value;
|
|
100
|
+
params.trace.push(...resolved.trace.map((entry)=>({
|
|
101
|
+
...entry,
|
|
102
|
+
field: 'step.working_directory'
|
|
103
|
+
})));
|
|
104
|
+
}
|
|
37
105
|
|
|
38
106
|
//# sourceMappingURL=complete-step-dispatch-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/step-config/complete-step-dispatch-config.ts"],"sourcesContent":["import {capTraceEntries} from '@shipfox/expression';\nimport type {AgentDefaultsResolver} from '#core/agent-defaults.js';\nimport type {PersistedEvaluationTraceEntry, Step} from '#core/entities/step.js';\nimport {completeAgentConfig} from './agent.js';\nimport {completeRunDispatchConfig} from './run.js';\nimport type {WorkflowEvaluationContext} from './workflow-evaluation-context.js';\n\nexport async function completeStepDispatchConfig(params: {\n readonly step: Step;\n readonly context: WorkflowEvaluationContext;\n readonly resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n readonly definitionId: string;\n}): Promise<{\n readonly config: Record<string, unknown>;\n readonly trace: readonly PersistedEvaluationTraceEntry[];\n}> {\n const plan = params.step.configPlan;\n if (plan === null) return {config: params.step.config, trace: []};\n\n const config = {...params.step.config};\n delete config.secret_bindings;\n const trace: PersistedEvaluationTraceEntry[] = [...(plan.trace ?? [])];\n completeRunDispatchConfig({\n config,\n plan,\n context: params.context,\n definitionId: params.definitionId,\n trace,\n });\n await completeAgentConfig({\n config,\n plan,\n context: params.context,\n resolveAgentDefaults: params.resolveAgentDefaults,\n definitionId: params.definitionId,\n trace,\n });\n\n return {config, trace: capTraceEntries(trace)};\n}\n"],"names":["capTraceEntries","completeAgentConfig","completeRunDispatchConfig","completeStepDispatchConfig","params","plan","step","configPlan","config","trace","secret_bindings","context","definitionId","resolveAgentDefaults"],"mappings":"AAAA,SAAQA,eAAe,QAAO,sBAAsB;AAGpD,SAAQC,mBAAmB,QAAO,aAAa;AAC/C,SAAQC,yBAAyB,QAAO,WAAW;AAGnD,OAAO,eAAeC,2BAA2BC,MAKhD;IAIC,MAAMC,OAAOD,OAAOE,IAAI,CAACC,UAAU;IACnC,IAAIF,SAAS,MAAM,OAAO;
|
|
1
|
+
{"version":3,"sources":["../../../src/core/step-config/complete-step-dispatch-config.ts"],"sourcesContent":["import {WORKFLOW_MODEL_CHECKOUT_TARGET_FIELDS} from '@shipfox/api-definitions-dto';\nimport {assertWorkingDirectory} from '@shipfox/api-workflows-dto';\nimport {capTraceEntries} from '@shipfox/expression';\nimport type {AgentDefaultsResolver} from '#core/agent-defaults.js';\nimport type {PersistedEvaluationTraceEntry, Step} from '#core/entities/step.js';\nimport {completeAgentConfig} from './agent.js';\nimport {completeStepFieldWithTrace} from './fields.js';\nimport {completeRunDispatchConfig} from './run.js';\nimport type {WorkflowEvaluationContext} from './workflow-evaluation-context.js';\n\nexport async function completeStepDispatchConfig(params: {\n readonly step: Step;\n readonly context: WorkflowEvaluationContext;\n readonly resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n readonly definitionId: string;\n}): Promise<{\n readonly config: Record<string, unknown>;\n readonly trace: readonly PersistedEvaluationTraceEntry[];\n}> {\n const plan = params.step.configPlan;\n if (plan === null) {\n assertWorkingDirectoryIfPresent(params.step.config.working_directory);\n return {config: params.step.config, trace: []};\n }\n\n const config = {...params.step.config};\n delete config.secret_bindings;\n const trace: PersistedEvaluationTraceEntry[] = [...(plan.trace ?? [])];\n completeRunDispatchConfig({\n config,\n plan,\n context: params.context,\n definitionId: params.definitionId,\n trace,\n });\n await completeAgentConfig({\n config,\n plan,\n context: params.context,\n resolveAgentDefaults: params.resolveAgentDefaults,\n definitionId: params.definitionId,\n trace,\n });\n completeWorkingDirectoryConfig({\n config,\n plan,\n context: params.context,\n definitionId: params.definitionId,\n trace,\n });\n completeCheckoutConfig({\n config,\n plan,\n context: params.context,\n definitionId: params.definitionId,\n trace,\n });\n assertWorkingDirectoryIfPresent(config.working_directory);\n\n return {config, trace: capTraceEntries(trace)};\n}\n\nfunction completeCheckoutConfig(params: {\n readonly config: Record<string, unknown>;\n readonly plan: Step['configPlan'] & object;\n readonly context: WorkflowEvaluationContext;\n readonly definitionId: string;\n readonly trace: PersistedEvaluationTraceEntry[];\n}): void {\n const checkoutPlan = params.plan.checkout;\n if (checkoutPlan === undefined) return;\n\n const checkout = params.config.checkout;\n if (checkout === null || typeof checkout !== 'object' || Array.isArray(checkout)) {\n throw new Error('Checkout dispatch config is missing an object');\n }\n\n const resolvedCheckout = {...checkout} as Record<string, unknown>;\n params.config.checkout = resolvedCheckout;\n\n for (const [key, fieldName] of WORKFLOW_MODEL_CHECKOUT_TARGET_FIELDS) {\n const field = checkoutPlan[key];\n if (field === undefined) continue;\n\n const resolved = completeStepFieldWithTrace({\n field: fieldName,\n template: field,\n context: params.context,\n definitionId: params.definitionId,\n errorField: fieldName,\n });\n resolvedCheckout[key] = resolved.value;\n params.trace.push(...resolved.trace.map((entry) => ({...entry, field: fieldName})));\n }\n}\n\nfunction assertWorkingDirectoryIfPresent(value: unknown): void {\n if (value !== undefined) assertWorkingDirectory(value);\n}\n\nfunction completeWorkingDirectoryConfig(params: {\n readonly config: Record<string, unknown>;\n readonly plan: Step['configPlan'] & object;\n readonly context: WorkflowEvaluationContext;\n readonly definitionId: string;\n readonly trace: PersistedEvaluationTraceEntry[];\n}): void {\n const field = params.plan.working_directory;\n if (field === undefined) return;\n\n const resolved = completeStepFieldWithTrace({\n field: 'step.working_directory',\n template: field,\n context: params.context,\n definitionId: params.definitionId,\n errorField: 'step.working_directory',\n });\n params.config.working_directory = resolved.value;\n params.trace.push(\n ...resolved.trace.map((entry) => ({...entry, field: 'step.working_directory' as const})),\n );\n}\n"],"names":["WORKFLOW_MODEL_CHECKOUT_TARGET_FIELDS","assertWorkingDirectory","capTraceEntries","completeAgentConfig","completeStepFieldWithTrace","completeRunDispatchConfig","completeStepDispatchConfig","params","plan","step","configPlan","assertWorkingDirectoryIfPresent","config","working_directory","trace","secret_bindings","context","definitionId","resolveAgentDefaults","completeWorkingDirectoryConfig","completeCheckoutConfig","checkoutPlan","checkout","undefined","Array","isArray","Error","resolvedCheckout","key","fieldName","field","resolved","template","errorField","value","push","map","entry"],"mappings":"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"}
|
|
@@ -4,5 +4,6 @@ export { type MaterializedWorkflowStep, type MaterializeJobExecutionStepsParams,
|
|
|
4
4
|
export { type MaterializedWorkflowJob, type MaterializeWorkflowModelParams, materializeJobOutputs, materializeJobRunner, materializeWorkflowModel, modelHasAgentStep, } from './materialize-workflow-model.js';
|
|
5
5
|
export { type ResolveJobExecutionNameParams, resolveJobExecutionName, } from './resolve-job-execution-name.js';
|
|
6
6
|
export type { WorkflowStepTemplateDiagnostic } from './resolve-step-config.js';
|
|
7
|
+
export { type ResolveWorkflowRunNameResult, resolveWorkflowRunName, sanitizeWorkflowDisplayText, type WorkflowRunNameDegradation, type WorkflowRunNameResolutionCause, } from './resolve-workflow-run-name.js';
|
|
7
8
|
export type { WorkflowEvaluationContext } from './workflow-evaluation-context.js';
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/step-config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sCAAsC,EAC3C,KAAK,kCAAkC,EACvC,KAAK,gCAAgC,EACrC,4BAA4B,EAC5B,uBAAuB,EACvB,gCAAgC,EAChC,kCAAkC,EAClC,yBAAyB,EACzB,mBAAmB,EACnB,4BAA4B,EAC5B,4BAA4B,EAC5B,+BAA+B,EAC/B,2BAA2B,EAC3B,0BAA0B,EAC1B,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,2BAA2B,GAC5B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAC,0BAA0B,EAAC,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,kCAAkC,EACvC,4BAA4B,GAC7B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EACnC,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,KAAK,6BAA6B,EAClC,uBAAuB,GACxB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAC,8BAA8B,EAAC,MAAM,0BAA0B,CAAC;AAC7E,YAAY,EAAC,yBAAyB,EAAC,MAAM,kCAAkC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/step-config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sCAAsC,EAC3C,KAAK,kCAAkC,EACvC,KAAK,gCAAgC,EACrC,4BAA4B,EAC5B,uBAAuB,EACvB,gCAAgC,EAChC,kCAAkC,EAClC,yBAAyB,EACzB,mBAAmB,EACnB,4BAA4B,EAC5B,4BAA4B,EAC5B,+BAA+B,EAC/B,2BAA2B,EAC3B,0BAA0B,EAC1B,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,2BAA2B,GAC5B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAC,0BAA0B,EAAC,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,kCAAkC,EACvC,4BAA4B,GAC7B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EACnC,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,KAAK,6BAA6B,EAClC,uBAAuB,GACxB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAC,8BAA8B,EAAC,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EACL,KAAK,4BAA4B,EACjC,sBAAsB,EACtB,2BAA2B,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,8BAA8B,GACpC,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAC,yBAAyB,EAAC,MAAM,kCAAkC,CAAC"}
|
|
@@ -3,5 +3,6 @@ export { completeStepDispatchConfig } from './complete-step-dispatch-config.js';
|
|
|
3
3
|
export { materializeJobExecutionSteps } from './materialize-job-execution-steps.js';
|
|
4
4
|
export { materializeJobOutputs, materializeJobRunner, materializeWorkflowModel, modelHasAgentStep } from './materialize-workflow-model.js';
|
|
5
5
|
export { resolveJobExecutionName } from './resolve-job-execution-name.js';
|
|
6
|
+
export { resolveWorkflowRunName, sanitizeWorkflowDisplayText } from './resolve-workflow-run-name.js';
|
|
6
7
|
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/step-config/index.ts"],"sourcesContent":["export {\n type AssembleExecutionCreationContextParams,\n type AssembleJobActivationContextParams,\n type AssembleWorkflowRunContextParams,\n applyListenerFilterSnapshots,\n assembleCreationContext,\n assembleExecutionCreationContext,\n assembleExecutionResolutionContext,\n assembleExecutionsContext,\n assembleGateContext,\n assembleJobActivationContext,\n assembleJobResolutionContext,\n assembleListenerSnapshotContext,\n assembleStepDispatchContext,\n assembleWorkflowRunContext,\n type JobContextInput,\n type ListenerSnapshotPlan,\n type ListenerTriggerWithSnapshot,\n type MatcherSnapshotPlan,\n planListenerFilterSnapshots,\n} from './assemble-run-context.js';\nexport {completeStepDispatchConfig} from './complete-step-dispatch-config.js';\nexport {\n type MaterializedWorkflowStep,\n type MaterializeJobExecutionStepsParams,\n materializeJobExecutionSteps,\n} from './materialize-job-execution-steps.js';\nexport {\n type MaterializedWorkflowJob,\n type MaterializeWorkflowModelParams,\n materializeJobOutputs,\n materializeJobRunner,\n materializeWorkflowModel,\n modelHasAgentStep,\n} from './materialize-workflow-model.js';\nexport {\n type ResolveJobExecutionNameParams,\n resolveJobExecutionName,\n} from './resolve-job-execution-name.js';\nexport type {WorkflowStepTemplateDiagnostic} from './resolve-step-config.js';\nexport type {WorkflowEvaluationContext} from './workflow-evaluation-context.js';\n"],"names":["applyListenerFilterSnapshots","assembleCreationContext","assembleExecutionCreationContext","assembleExecutionResolutionContext","assembleExecutionsContext","assembleGateContext","assembleJobActivationContext","assembleJobResolutionContext","assembleListenerSnapshotContext","assembleStepDispatchContext","assembleWorkflowRunContext","planListenerFilterSnapshots","completeStepDispatchConfig","materializeJobExecutionSteps","materializeJobOutputs","materializeJobRunner","materializeWorkflowModel","modelHasAgentStep","resolveJobExecutionName"],"mappings":"AAAA,SAIEA,4BAA4B,EAC5BC,uBAAuB,EACvBC,gCAAgC,EAChCC,kCAAkC,EAClCC,yBAAyB,EACzBC,mBAAmB,EACnBC,4BAA4B,EAC5BC,4BAA4B,EAC5BC,+BAA+B,EAC/BC,2BAA2B,EAC3BC,0BAA0B,EAK1BC,2BAA2B,QACtB,4BAA4B;AACnC,SAAQC,0BAA0B,QAAO,qCAAqC;AAC9E,SAGEC,4BAA4B,QACvB,uCAAuC;AAC9C,SAGEC,qBAAqB,EACrBC,oBAAoB,EACpBC,wBAAwB,EACxBC,iBAAiB,QACZ,kCAAkC;AACzC,SAEEC,uBAAuB,QAClB,kCAAkC"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/step-config/index.ts"],"sourcesContent":["export {\n type AssembleExecutionCreationContextParams,\n type AssembleJobActivationContextParams,\n type AssembleWorkflowRunContextParams,\n applyListenerFilterSnapshots,\n assembleCreationContext,\n assembleExecutionCreationContext,\n assembleExecutionResolutionContext,\n assembleExecutionsContext,\n assembleGateContext,\n assembleJobActivationContext,\n assembleJobResolutionContext,\n assembleListenerSnapshotContext,\n assembleStepDispatchContext,\n assembleWorkflowRunContext,\n type JobContextInput,\n type ListenerSnapshotPlan,\n type ListenerTriggerWithSnapshot,\n type MatcherSnapshotPlan,\n planListenerFilterSnapshots,\n} from './assemble-run-context.js';\nexport {completeStepDispatchConfig} from './complete-step-dispatch-config.js';\nexport {\n type MaterializedWorkflowStep,\n type MaterializeJobExecutionStepsParams,\n materializeJobExecutionSteps,\n} from './materialize-job-execution-steps.js';\nexport {\n type MaterializedWorkflowJob,\n type MaterializeWorkflowModelParams,\n materializeJobOutputs,\n materializeJobRunner,\n materializeWorkflowModel,\n modelHasAgentStep,\n} from './materialize-workflow-model.js';\nexport {\n type ResolveJobExecutionNameParams,\n resolveJobExecutionName,\n} from './resolve-job-execution-name.js';\nexport type {WorkflowStepTemplateDiagnostic} from './resolve-step-config.js';\nexport {\n type ResolveWorkflowRunNameResult,\n resolveWorkflowRunName,\n sanitizeWorkflowDisplayText,\n type WorkflowRunNameDegradation,\n type WorkflowRunNameResolutionCause,\n} from './resolve-workflow-run-name.js';\nexport type {WorkflowEvaluationContext} from './workflow-evaluation-context.js';\n"],"names":["applyListenerFilterSnapshots","assembleCreationContext","assembleExecutionCreationContext","assembleExecutionResolutionContext","assembleExecutionsContext","assembleGateContext","assembleJobActivationContext","assembleJobResolutionContext","assembleListenerSnapshotContext","assembleStepDispatchContext","assembleWorkflowRunContext","planListenerFilterSnapshots","completeStepDispatchConfig","materializeJobExecutionSteps","materializeJobOutputs","materializeJobRunner","materializeWorkflowModel","modelHasAgentStep","resolveJobExecutionName","resolveWorkflowRunName","sanitizeWorkflowDisplayText"],"mappings":"AAAA,SAIEA,4BAA4B,EAC5BC,uBAAuB,EACvBC,gCAAgC,EAChCC,kCAAkC,EAClCC,yBAAyB,EACzBC,mBAAmB,EACnBC,4BAA4B,EAC5BC,4BAA4B,EAC5BC,+BAA+B,EAC/BC,2BAA2B,EAC3BC,0BAA0B,EAK1BC,2BAA2B,QACtB,4BAA4B;AACnC,SAAQC,0BAA0B,QAAO,qCAAqC;AAC9E,SAGEC,4BAA4B,QACvB,uCAAuC;AAC9C,SAGEC,qBAAqB,EACrBC,oBAAoB,EACpBC,wBAAwB,EACxBC,iBAAiB,QACZ,kCAAkC;AACzC,SAEEC,uBAAuB,QAClB,kCAAkC;AAEzC,SAEEC,sBAAsB,EACtBC,2BAA2B,QAGtB,iCAAiC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type WorkflowModel } from '@shipfox/api-definitions-dto';
|
|
2
2
|
import type { WorkflowExpression } from '@shipfox/expression';
|
|
3
3
|
import type { AgentDefaultsResolver } from '#core/agent-defaults.js';
|
|
4
4
|
import type { AgentToolMaterializationContext, AgentToolMaterializationSnapshot } from '#core/agent-tools.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materialize-job-execution-steps.d.ts","sourceRoot":"","sources":["../../../src/core/step-config/materialize-job-execution-steps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"materialize-job-execution-steps.d.ts","sourceRoot":"","sources":["../../../src/core/step-config/materialize-job-execution-steps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,aAAa,EAAC,MAAM,8BAA8B,CAAC;AACtF,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EACV,+BAA+B,EAC/B,gCAAgC,EACjC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAoB,KAAK,8BAA8B,EAAC,MAAM,0BAA0B,CAAC;AAChG,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,kCAAkC,CAAC;AAEhF,KAAK,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AACtD,KAAK,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3D,KAAK,sBAAsB,GAAG,WAAW,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAI/E,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACvD,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC;IAC7C,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAClE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,8BAA8B,EAAE,CAAC;IACjE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,+BAA+B,GAAG,SAAS,CAAC;IACxE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,gCAAgC,GAAG,IAAI,GAAG,SAAS,CAAC;CAClF;AAgBD,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,kCAAkC,GACzC,OAAO,CAAC,SAAS,wBAAwB,EAAE,CAAC,CAqD9C"}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
+
import { DEFAULT_JOB_CHECKOUT } from '@shipfox/api-definitions-dto';
|
|
1
2
|
import { resolveStepConfig } from './resolve-step-config.js';
|
|
2
3
|
const FIRST_LINE_PATTERN = /\r?\n/;
|
|
3
4
|
// Synthetic "Set up job" step prepended when a job execution's steps are materialized.
|
|
4
5
|
// The runner prepares the workspace here; failures report through the normal step
|
|
5
|
-
// protocol instead of hanging the job until the lease/timeout fires. Its config
|
|
6
|
-
// credential
|
|
6
|
+
// protocol instead of hanging the job until the lease/timeout fires. Its config carries
|
|
7
|
+
// checkout policy, never credential material.
|
|
7
8
|
const SETUP_STEP = {
|
|
8
9
|
key: null,
|
|
9
10
|
name: 'Set up job',
|
|
10
11
|
sourceLocation: null,
|
|
11
12
|
status: 'pending',
|
|
12
13
|
type: 'setup',
|
|
13
|
-
config: {},
|
|
14
14
|
authoredConfig: null,
|
|
15
15
|
position: 0
|
|
16
16
|
};
|
|
17
17
|
export async function materializeJobExecutionSteps(params) {
|
|
18
18
|
const { model, job, context, resolveAgentDefaults, definitionId = model.name, agentToolContext, agentToolSnapshot } = params;
|
|
19
19
|
return [
|
|
20
|
-
|
|
20
|
+
setupStepForJob(job),
|
|
21
21
|
...await Promise.all(job.steps.map(async (step, stepPosition)=>{
|
|
22
|
-
// The trusted context exposes the stable job key; the authored display field remains `job.name`.
|
|
23
22
|
const stepContext = {
|
|
24
23
|
...context.values,
|
|
25
24
|
job: {
|
|
26
|
-
key: job.key
|
|
25
|
+
key: job.key,
|
|
26
|
+
name: job.name ?? job.key
|
|
27
27
|
}
|
|
28
28
|
};
|
|
29
29
|
const resolved = await resolveStepConfig({
|
|
@@ -46,7 +46,11 @@ export async function materializeJobExecutionSteps(params) {
|
|
|
46
46
|
sourceLocation: step.sourceLocation ?? null,
|
|
47
47
|
status: 'pending',
|
|
48
48
|
type: step.kind,
|
|
49
|
-
config:
|
|
49
|
+
config: materializedStepConfig({
|
|
50
|
+
config: resolved.config,
|
|
51
|
+
step,
|
|
52
|
+
stepPosition
|
|
53
|
+
}),
|
|
50
54
|
...step.if === undefined ? {} : {
|
|
51
55
|
condition: step.if
|
|
52
56
|
},
|
|
@@ -60,6 +64,40 @@ export async function materializeJobExecutionSteps(params) {
|
|
|
60
64
|
}))
|
|
61
65
|
];
|
|
62
66
|
}
|
|
67
|
+
function setupStepForJob(job) {
|
|
68
|
+
if (job.checkout === false || job.steps[0]?.kind === 'checkout') {
|
|
69
|
+
return {
|
|
70
|
+
...SETUP_STEP,
|
|
71
|
+
config: {}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const checkout = job.checkout ?? DEFAULT_JOB_CHECKOUT;
|
|
75
|
+
return {
|
|
76
|
+
...SETUP_STEP,
|
|
77
|
+
config: {
|
|
78
|
+
checkout: {
|
|
79
|
+
permissions: checkout.permissions,
|
|
80
|
+
persist_credentials: checkout.persistCredentials
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function materializedStepConfig(params) {
|
|
86
|
+
if (params.step.kind !== 'checkout' || params.stepPosition !== 0 || params.step.checkout.path !== undefined) {
|
|
87
|
+
return params.config;
|
|
88
|
+
}
|
|
89
|
+
const checkout = params.config.checkout;
|
|
90
|
+
if (checkout === null || typeof checkout !== 'object' || Array.isArray(checkout)) {
|
|
91
|
+
throw new Error('Checkout materialization config is missing an object');
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
...params.config,
|
|
95
|
+
checkout: {
|
|
96
|
+
...checkout,
|
|
97
|
+
path: '.'
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
63
101
|
function materializedConfigPlan(configPlan, trace) {
|
|
64
102
|
if (configPlan === null && trace.length === 0) return {};
|
|
65
103
|
return {
|
|
@@ -72,11 +110,14 @@ function materializedConfigPlan(configPlan, trace) {
|
|
|
72
110
|
};
|
|
73
111
|
}
|
|
74
112
|
function stepDisplayName(step) {
|
|
75
|
-
|
|
113
|
+
const { kind } = step;
|
|
114
|
+
switch(kind){
|
|
76
115
|
case 'run':
|
|
77
116
|
return firstLine(step.command.value);
|
|
78
117
|
case 'agent':
|
|
79
118
|
return step.model === undefined ? firstLine(step.prompt) : `${step.model} · ${firstLine(step.prompt)}`;
|
|
119
|
+
case 'checkout':
|
|
120
|
+
return 'Checkout';
|
|
80
121
|
default:
|
|
81
122
|
return assertNever(step);
|
|
82
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/step-config/materialize-job-execution-steps.ts"],"sourcesContent":["import type {WorkflowModel} from '@shipfox/api-definitions-dto';\nimport type {WorkflowExpression} from '@shipfox/expression';\nimport type {AgentDefaultsResolver} from '#core/agent-defaults.js';\nimport type {\n AgentToolMaterializationContext,\n AgentToolMaterializationSnapshot,\n} from '#core/agent-tools.js';\nimport type {StepConfigDispatchPlan} from '#core/entities/step.js';\nimport {resolveStepConfig, type WorkflowStepTemplateDiagnostic} from './resolve-step-config.js';\nimport type {WorkflowEvaluationContext} from './workflow-evaluation-context.js';\n\ntype WorkflowModelJob = WorkflowModel['jobs'][number];\ntype WorkflowModelStep = WorkflowModelJob['steps'][number];\ntype WorkflowSourceLocation = NonNullable<WorkflowModelStep['sourceLocation']>;\n\nconst FIRST_LINE_PATTERN = /\\r?\\n/;\n\nexport interface MaterializedWorkflowStep {\n readonly key: string | null;\n readonly name: string;\n readonly sourceLocation: WorkflowSourceLocation | null;\n readonly status: 'pending';\n readonly type: WorkflowModelStep['kind'] | 'setup';\n readonly config: Readonly<Record<string, unknown>>;\n readonly condition?: WorkflowExpression;\n readonly configPlan?: StepConfigDispatchPlan;\n readonly authoredConfig: Readonly<Record<string, unknown>> | null;\n readonly diagnostics?: readonly WorkflowStepTemplateDiagnostic[];\n readonly position: number;\n}\n\nexport interface MaterializeJobExecutionStepsParams {\n readonly model: WorkflowModel;\n readonly job: WorkflowModelJob;\n readonly context: WorkflowEvaluationContext;\n readonly resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n readonly definitionId?: string | undefined;\n readonly agentToolContext?: AgentToolMaterializationContext | undefined;\n readonly agentToolSnapshot?: AgentToolMaterializationSnapshot | null | undefined;\n}\n\n// Synthetic \"Set up job\" step prepended when a job execution's steps are materialized.\n// The runner prepares the workspace here; failures report through the normal step\n// protocol instead of hanging the job until the lease/timeout fires. Its config is\n// credential-free.\nconst SETUP_STEP: MaterializedWorkflowStep = {\n key: null,\n name: 'Set up job',\n sourceLocation: null,\n status: 'pending',\n type: 'setup',\n config: {},\n authoredConfig: null,\n position: 0,\n};\n\nexport async function materializeJobExecutionSteps(\n params: MaterializeJobExecutionStepsParams,\n): Promise<readonly MaterializedWorkflowStep[]> {\n const {\n model,\n job,\n context,\n resolveAgentDefaults,\n definitionId = model.name,\n agentToolContext,\n agentToolSnapshot,\n } = params;\n\n return [\n SETUP_STEP,\n ...(await Promise.all(\n job.steps.map(async (step, stepPosition) => {\n // The trusted context exposes the stable job key; the authored display field remains `job.name`.\n const stepContext = {...context.values, job: {key: job.key}};\n const resolved = await resolveStepConfig({\n jobKey: job.key,\n step,\n workflowEnv: model.env,\n workflowEnvTemplates: model.templates?.env,\n jobEnv: job.env,\n jobEnvTemplates: job.templates?.env,\n context: stepContext,\n site: context.site,\n resolveAgentDefaults,\n definitionId,\n agentToolContext,\n agentToolSnapshot,\n });\n return {\n key: step.key ?? null,\n name: resolved.name ?? stepDisplayName(step),\n sourceLocation: step.sourceLocation ?? null,\n status: 'pending' as const,\n type: step.kind,\n config: resolved.config,\n ...(step.if === undefined ? {} : {condition: step.if}),\n authoredConfig: resolved.authoredConfig,\n ...materializedConfigPlan(resolved.configPlan, resolved.trace),\n ...(resolved.diagnostics.length === 0 ? {} : {diagnostics: resolved.diagnostics}),\n position: stepPosition + 1,\n };\n }),\n )),\n ];\n}\n\nfunction materializedConfigPlan(\n configPlan: StepConfigDispatchPlan | null,\n trace: NonNullable<StepConfigDispatchPlan['trace']>,\n): {readonly configPlan?: StepConfigDispatchPlan} {\n if (configPlan === null && trace.length === 0) return {};\n return {configPlan: {...(configPlan ?? {}), ...(trace.length === 0 ? {} : {trace})}};\n}\n\nfunction stepDisplayName(step: WorkflowModelStep): string {\n switch (step.kind) {\n case 'run':\n return firstLine(step.command.value);\n case 'agent':\n return step.model === undefined\n ? firstLine(step.prompt)\n : `${step.model} · ${firstLine(step.prompt)}`;\n default:\n return assertNever(step);\n }\n}\n\nfunction firstLine(value: string): string {\n return value.split(FIRST_LINE_PATTERN, 1)[0]?.trim() || value.trim();\n}\n\nfunction assertNever(value: never): never {\n throw new Error(`Unhandled workflow step kind: ${JSON.stringify(value)}`);\n}\n"],"names":["resolveStepConfig","FIRST_LINE_PATTERN","SETUP_STEP","key","name","sourceLocation","status","type","config","authoredConfig","position","materializeJobExecutionSteps","params","model","job","context","resolveAgentDefaults","definitionId","agentToolContext","agentToolSnapshot","Promise","all","steps","map","step","stepPosition","stepContext","values","resolved","jobKey","workflowEnv","env","workflowEnvTemplates","templates","jobEnv","jobEnvTemplates","site","stepDisplayName","kind","if","undefined","condition","materializedConfigPlan","configPlan","trace","diagnostics","length","firstLine","command","value","prompt","assertNever","split","trim","Error","JSON","stringify"],"mappings":"AAQA,SAAQA,iBAAiB,QAA4C,2BAA2B;AAOhG,MAAMC,qBAAqB;AA0B3B,uFAAuF;AACvF,kFAAkF;AAClF,mFAAmF;AACnF,mBAAmB;AACnB,MAAMC,aAAuC;IAC3CC,KAAK;IACLC,MAAM;IACNC,gBAAgB;IAChBC,QAAQ;IACRC,MAAM;IACNC,QAAQ,CAAC;IACTC,gBAAgB;IAChBC,UAAU;AACZ;AAEA,OAAO,eAAeC,6BACpBC,MAA0C;IAE1C,MAAM,EACJC,KAAK,EACLC,GAAG,EACHC,OAAO,EACPC,oBAAoB,EACpBC,eAAeJ,MAAMT,IAAI,EACzBc,gBAAgB,EAChBC,iBAAiB,EAClB,GAAGP;IAEJ,OAAO;QACLV;WACI,MAAMkB,QAAQC,GAAG,CACnBP,IAAIQ,KAAK,CAACC,GAAG,CAAC,OAAOC,MAAMC;YACzB,iGAAiG;YACjG,MAAMC,cAAc;gBAAC,GAAGX,QAAQY,MAAM;gBAAEb,KAAK;oBAACX,KAAKW,IAAIX,GAAG;gBAAA;YAAC;YAC3D,MAAMyB,WAAW,MAAM5B,kBAAkB;gBACvC6B,QAAQf,IAAIX,GAAG;gBACfqB;gBACAM,aAAajB,MAAMkB,GAAG;gBACtBC,sBAAsBnB,MAAMoB,SAAS,EAAEF;gBACvCG,QAAQpB,IAAIiB,GAAG;gBACfI,iBAAiBrB,IAAImB,SAAS,EAAEF;gBAChChB,SAASW;gBACTU,MAAMrB,QAAQqB,IAAI;gBAClBpB;gBACAC;gBACAC;gBACAC;YACF;YACA,OAAO;gBACLhB,KAAKqB,KAAKrB,GAAG,IAAI;gBACjBC,MAAMwB,SAASxB,IAAI,IAAIiC,gBAAgBb;gBACvCnB,gBAAgBmB,KAAKnB,cAAc,IAAI;gBACvCC,QAAQ;gBACRC,MAAMiB,KAAKc,IAAI;gBACf9B,QAAQoB,SAASpB,MAAM;gBACvB,GAAIgB,KAAKe,EAAE,KAAKC,YAAY,CAAC,IAAI;oBAACC,WAAWjB,KAAKe,EAAE;gBAAA,CAAC;gBACrD9B,gBAAgBmB,SAASnB,cAAc;gBACvC,GAAGiC,uBAAuBd,SAASe,UAAU,EAAEf,SAASgB,KAAK,CAAC;gBAC9D,GAAIhB,SAASiB,WAAW,CAACC,MAAM,KAAK,IAAI,CAAC,IAAI;oBAACD,aAAajB,SAASiB,WAAW;gBAAA,CAAC;gBAChFnC,UAAUe,eAAe;YAC3B;QACF;KAEH;AACH;AAEA,SAASiB,uBACPC,UAAyC,EACzCC,KAAmD;IAEnD,IAAID,eAAe,QAAQC,MAAME,MAAM,KAAK,GAAG,OAAO,CAAC;IACvD,OAAO;QAACH,YAAY;YAAC,GAAIA,cAAc,CAAC,CAAC;YAAG,GAAIC,MAAME,MAAM,KAAK,IAAI,CAAC,IAAI;gBAACF;YAAK,CAAC;QAAC;IAAC;AACrF;AAEA,SAASP,gBAAgBb,IAAuB;IAC9C,OAAQA,KAAKc,IAAI;QACf,KAAK;YACH,OAAOS,UAAUvB,KAAKwB,OAAO,CAACC,KAAK;QACrC,KAAK;YACH,OAAOzB,KAAKX,KAAK,KAAK2B,YAClBO,UAAUvB,KAAK0B,MAAM,IACrB,GAAG1B,KAAKX,KAAK,CAAC,GAAG,EAAEkC,UAAUvB,KAAK0B,MAAM,GAAG;QACjD;YACE,OAAOC,YAAY3B;IACvB;AACF;AAEA,SAASuB,UAAUE,KAAa;IAC9B,OAAOA,MAAMG,KAAK,CAACnD,oBAAoB,EAAE,CAAC,EAAE,EAAEoD,UAAUJ,MAAMI,IAAI;AACpE;AAEA,SAASF,YAAYF,KAAY;IAC/B,MAAM,IAAIK,MAAM,CAAC,8BAA8B,EAAEC,KAAKC,SAAS,CAACP,QAAQ;AAC1E"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/step-config/materialize-job-execution-steps.ts"],"sourcesContent":["import {DEFAULT_JOB_CHECKOUT, type WorkflowModel} from '@shipfox/api-definitions-dto';\nimport type {WorkflowExpression} from '@shipfox/expression';\nimport type {AgentDefaultsResolver} from '#core/agent-defaults.js';\nimport type {\n AgentToolMaterializationContext,\n AgentToolMaterializationSnapshot,\n} from '#core/agent-tools.js';\nimport type {StepConfigDispatchPlan} from '#core/entities/step.js';\nimport {resolveStepConfig, type WorkflowStepTemplateDiagnostic} from './resolve-step-config.js';\nimport type {WorkflowEvaluationContext} from './workflow-evaluation-context.js';\n\ntype WorkflowModelJob = WorkflowModel['jobs'][number];\ntype WorkflowModelStep = WorkflowModelJob['steps'][number];\ntype WorkflowSourceLocation = NonNullable<WorkflowModelStep['sourceLocation']>;\n\nconst FIRST_LINE_PATTERN = /\\r?\\n/;\n\nexport interface MaterializedWorkflowStep {\n readonly key: string | null;\n readonly name: string;\n readonly sourceLocation: WorkflowSourceLocation | null;\n readonly status: 'pending';\n readonly type: WorkflowModelStep['kind'] | 'setup';\n readonly config: Readonly<Record<string, unknown>>;\n readonly condition?: WorkflowExpression;\n readonly configPlan?: StepConfigDispatchPlan;\n readonly authoredConfig: Readonly<Record<string, unknown>> | null;\n readonly diagnostics?: readonly WorkflowStepTemplateDiagnostic[];\n readonly position: number;\n}\n\nexport interface MaterializeJobExecutionStepsParams {\n readonly model: WorkflowModel;\n readonly job: WorkflowModelJob;\n readonly context: WorkflowEvaluationContext;\n readonly resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n readonly definitionId?: string | undefined;\n readonly agentToolContext?: AgentToolMaterializationContext | undefined;\n readonly agentToolSnapshot?: AgentToolMaterializationSnapshot | null | undefined;\n}\n\n// Synthetic \"Set up job\" step prepended when a job execution's steps are materialized.\n// The runner prepares the workspace here; failures report through the normal step\n// protocol instead of hanging the job until the lease/timeout fires. Its config carries\n// checkout policy, never credential material.\nconst SETUP_STEP: Omit<MaterializedWorkflowStep, 'config'> = {\n key: null,\n name: 'Set up job',\n sourceLocation: null,\n status: 'pending',\n type: 'setup',\n authoredConfig: null,\n position: 0,\n};\n\nexport async function materializeJobExecutionSteps(\n params: MaterializeJobExecutionStepsParams,\n): Promise<readonly MaterializedWorkflowStep[]> {\n const {\n model,\n job,\n context,\n resolveAgentDefaults,\n definitionId = model.name,\n agentToolContext,\n agentToolSnapshot,\n } = params;\n\n return [\n setupStepForJob(job),\n ...(await Promise.all(\n job.steps.map(async (step, stepPosition) => {\n const stepContext = {\n ...context.values,\n job: {key: job.key, name: job.name ?? job.key},\n };\n const resolved = await resolveStepConfig({\n jobKey: job.key,\n step,\n workflowEnv: model.env,\n workflowEnvTemplates: model.templates?.env,\n jobEnv: job.env,\n jobEnvTemplates: job.templates?.env,\n context: stepContext,\n site: context.site,\n resolveAgentDefaults,\n definitionId,\n agentToolContext,\n agentToolSnapshot,\n });\n return {\n key: step.key ?? null,\n name: resolved.name ?? stepDisplayName(step),\n sourceLocation: step.sourceLocation ?? null,\n status: 'pending' as const,\n type: step.kind,\n config: materializedStepConfig({\n config: resolved.config,\n step,\n stepPosition,\n }),\n ...(step.if === undefined ? {} : {condition: step.if}),\n authoredConfig: resolved.authoredConfig,\n ...materializedConfigPlan(resolved.configPlan, resolved.trace),\n ...(resolved.diagnostics.length === 0 ? {} : {diagnostics: resolved.diagnostics}),\n position: stepPosition + 1,\n };\n }),\n )),\n ];\n}\n\nfunction setupStepForJob(job: WorkflowModelJob): MaterializedWorkflowStep {\n if (job.checkout === false || job.steps[0]?.kind === 'checkout') {\n return {...SETUP_STEP, config: {}};\n }\n\n const checkout = job.checkout ?? DEFAULT_JOB_CHECKOUT;\n\n return {\n ...SETUP_STEP,\n config: {\n checkout: {\n permissions: checkout.permissions,\n persist_credentials: checkout.persistCredentials,\n },\n },\n };\n}\n\nfunction materializedStepConfig(params: {\n readonly config: Readonly<Record<string, unknown>>;\n readonly step: WorkflowModelStep;\n readonly stepPosition: number;\n}): Readonly<Record<string, unknown>> {\n if (\n params.step.kind !== 'checkout' ||\n params.stepPosition !== 0 ||\n params.step.checkout.path !== undefined\n ) {\n return params.config;\n }\n\n const checkout = params.config.checkout;\n if (checkout === null || typeof checkout !== 'object' || Array.isArray(checkout)) {\n throw new Error('Checkout materialization config is missing an object');\n }\n\n return {...params.config, checkout: {...checkout, path: '.'}};\n}\n\nfunction materializedConfigPlan(\n configPlan: StepConfigDispatchPlan | null,\n trace: NonNullable<StepConfigDispatchPlan['trace']>,\n): {readonly configPlan?: StepConfigDispatchPlan} {\n if (configPlan === null && trace.length === 0) return {};\n return {configPlan: {...(configPlan ?? {}), ...(trace.length === 0 ? {} : {trace})}};\n}\n\nfunction stepDisplayName(step: WorkflowModelStep): string {\n const {kind} = step;\n switch (kind) {\n case 'run':\n return firstLine(step.command.value);\n case 'agent':\n return step.model === undefined\n ? firstLine(step.prompt)\n : `${step.model} · ${firstLine(step.prompt)}`;\n case 'checkout':\n return 'Checkout';\n default:\n return assertNever(step);\n }\n}\n\nfunction firstLine(value: string): string {\n return value.split(FIRST_LINE_PATTERN, 1)[0]?.trim() || value.trim();\n}\n\nfunction assertNever(value: never): never {\n throw new Error(`Unhandled workflow step kind: ${JSON.stringify(value)}`);\n}\n"],"names":["DEFAULT_JOB_CHECKOUT","resolveStepConfig","FIRST_LINE_PATTERN","SETUP_STEP","key","name","sourceLocation","status","type","authoredConfig","position","materializeJobExecutionSteps","params","model","job","context","resolveAgentDefaults","definitionId","agentToolContext","agentToolSnapshot","setupStepForJob","Promise","all","steps","map","step","stepPosition","stepContext","values","resolved","jobKey","workflowEnv","env","workflowEnvTemplates","templates","jobEnv","jobEnvTemplates","site","stepDisplayName","kind","config","materializedStepConfig","if","undefined","condition","materializedConfigPlan","configPlan","trace","diagnostics","length","checkout","permissions","persist_credentials","persistCredentials","path","Array","isArray","Error","firstLine","command","value","prompt","assertNever","split","trim","JSON","stringify"],"mappings":"AAAA,SAAQA,oBAAoB,QAA2B,+BAA+B;AAQtF,SAAQC,iBAAiB,QAA4C,2BAA2B;AAOhG,MAAMC,qBAAqB;AA0B3B,uFAAuF;AACvF,kFAAkF;AAClF,wFAAwF;AACxF,8CAA8C;AAC9C,MAAMC,aAAuD;IAC3DC,KAAK;IACLC,MAAM;IACNC,gBAAgB;IAChBC,QAAQ;IACRC,MAAM;IACNC,gBAAgB;IAChBC,UAAU;AACZ;AAEA,OAAO,eAAeC,6BACpBC,MAA0C;IAE1C,MAAM,EACJC,KAAK,EACLC,GAAG,EACHC,OAAO,EACPC,oBAAoB,EACpBC,eAAeJ,MAAMR,IAAI,EACzBa,gBAAgB,EAChBC,iBAAiB,EAClB,GAAGP;IAEJ,OAAO;QACLQ,gBAAgBN;WACZ,MAAMO,QAAQC,GAAG,CACnBR,IAAIS,KAAK,CAACC,GAAG,CAAC,OAAOC,MAAMC;YACzB,MAAMC,cAAc;gBAClB,GAAGZ,QAAQa,MAAM;gBACjBd,KAAK;oBAACV,KAAKU,IAAIV,GAAG;oBAAEC,MAAMS,IAAIT,IAAI,IAAIS,IAAIV,GAAG;gBAAA;YAC/C;YACA,MAAMyB,WAAW,MAAM5B,kBAAkB;gBACvC6B,QAAQhB,IAAIV,GAAG;gBACfqB;gBACAM,aAAalB,MAAMmB,GAAG;gBACtBC,sBAAsBpB,MAAMqB,SAAS,EAAEF;gBACvCG,QAAQrB,IAAIkB,GAAG;gBACfI,iBAAiBtB,IAAIoB,SAAS,EAAEF;gBAChCjB,SAASY;gBACTU,MAAMtB,QAAQsB,IAAI;gBAClBrB;gBACAC;gBACAC;gBACAC;YACF;YACA,OAAO;gBACLf,KAAKqB,KAAKrB,GAAG,IAAI;gBACjBC,MAAMwB,SAASxB,IAAI,IAAIiC,gBAAgBb;gBACvCnB,gBAAgBmB,KAAKnB,cAAc,IAAI;gBACvCC,QAAQ;gBACRC,MAAMiB,KAAKc,IAAI;gBACfC,QAAQC,uBAAuB;oBAC7BD,QAAQX,SAASW,MAAM;oBACvBf;oBACAC;gBACF;gBACA,GAAID,KAAKiB,EAAE,KAAKC,YAAY,CAAC,IAAI;oBAACC,WAAWnB,KAAKiB,EAAE;gBAAA,CAAC;gBACrDjC,gBAAgBoB,SAASpB,cAAc;gBACvC,GAAGoC,uBAAuBhB,SAASiB,UAAU,EAAEjB,SAASkB,KAAK,CAAC;gBAC9D,GAAIlB,SAASmB,WAAW,CAACC,MAAM,KAAK,IAAI,CAAC,IAAI;oBAACD,aAAanB,SAASmB,WAAW;gBAAA,CAAC;gBAChFtC,UAAUgB,eAAe;YAC3B;QACF;KAEH;AACH;AAEA,SAASN,gBAAgBN,GAAqB;IAC5C,IAAIA,IAAIoC,QAAQ,KAAK,SAASpC,IAAIS,KAAK,CAAC,EAAE,EAAEgB,SAAS,YAAY;QAC/D,OAAO;YAAC,GAAGpC,UAAU;YAAEqC,QAAQ,CAAC;QAAC;IACnC;IAEA,MAAMU,WAAWpC,IAAIoC,QAAQ,IAAIlD;IAEjC,OAAO;QACL,GAAGG,UAAU;QACbqC,QAAQ;YACNU,UAAU;gBACRC,aAAaD,SAASC,WAAW;gBACjCC,qBAAqBF,SAASG,kBAAkB;YAClD;QACF;IACF;AACF;AAEA,SAASZ,uBAAuB7B,MAI/B;IACC,IACEA,OAAOa,IAAI,CAACc,IAAI,KAAK,cACrB3B,OAAOc,YAAY,KAAK,KACxBd,OAAOa,IAAI,CAACyB,QAAQ,CAACI,IAAI,KAAKX,WAC9B;QACA,OAAO/B,OAAO4B,MAAM;IACtB;IAEA,MAAMU,WAAWtC,OAAO4B,MAAM,CAACU,QAAQ;IACvC,IAAIA,aAAa,QAAQ,OAAOA,aAAa,YAAYK,MAAMC,OAAO,CAACN,WAAW;QAChF,MAAM,IAAIO,MAAM;IAClB;IAEA,OAAO;QAAC,GAAG7C,OAAO4B,MAAM;QAAEU,UAAU;YAAC,GAAGA,QAAQ;YAAEI,MAAM;QAAG;IAAC;AAC9D;AAEA,SAAST,uBACPC,UAAyC,EACzCC,KAAmD;IAEnD,IAAID,eAAe,QAAQC,MAAME,MAAM,KAAK,GAAG,OAAO,CAAC;IACvD,OAAO;QAACH,YAAY;YAAC,GAAIA,cAAc,CAAC,CAAC;YAAG,GAAIC,MAAME,MAAM,KAAK,IAAI,CAAC,IAAI;gBAACF;YAAK,CAAC;QAAC;IAAC;AACrF;AAEA,SAAST,gBAAgBb,IAAuB;IAC9C,MAAM,EAACc,IAAI,EAAC,GAAGd;IACf,OAAQc;QACN,KAAK;YACH,OAAOmB,UAAUjC,KAAKkC,OAAO,CAACC,KAAK;QACrC,KAAK;YACH,OAAOnC,KAAKZ,KAAK,KAAK8B,YAClBe,UAAUjC,KAAKoC,MAAM,IACrB,GAAGpC,KAAKZ,KAAK,CAAC,GAAG,EAAE6C,UAAUjC,KAAKoC,MAAM,GAAG;QACjD,KAAK;YACH,OAAO;QACT;YACE,OAAOC,YAAYrC;IACvB;AACF;AAEA,SAASiC,UAAUE,KAAa;IAC9B,OAAOA,MAAMG,KAAK,CAAC7D,oBAAoB,EAAE,CAAC,EAAE,EAAE8D,UAAUJ,MAAMI,IAAI;AACpE;AAEA,SAASF,YAAYF,KAAY;IAC/B,MAAM,IAAIH,MAAM,CAAC,8BAA8B,EAAEQ,KAAKC,SAAS,CAACN,QAAQ;AAC1E"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type WorkflowModel } from '@shipfox/api-definitions-dto';
|
|
2
2
|
import type { AgentDefaultsResolver } from '#core/agent-defaults.js';
|
|
3
3
|
import type { AgentToolMaterializationContext, AgentToolMaterializationSnapshot } from '#core/agent-tools.js';
|
|
4
4
|
import { type MaterializedWorkflowStep } from './materialize-job-execution-steps.js';
|
|
@@ -9,9 +9,9 @@ export interface MaterializedWorkflowJob {
|
|
|
9
9
|
readonly mode: WorkflowModelJob['mode'];
|
|
10
10
|
readonly success?: string;
|
|
11
11
|
readonly executionTimeoutMs?: number;
|
|
12
|
-
readonly checkout: WorkflowModelJob['checkout']
|
|
12
|
+
readonly checkout: Exclude<WorkflowModelJob['checkout'], false>;
|
|
13
13
|
readonly listening?: WorkflowModelJob['listening'];
|
|
14
|
-
readonly name?:
|
|
14
|
+
readonly name?: string;
|
|
15
15
|
readonly outputs?: WorkflowModelJob['outputs'];
|
|
16
16
|
readonly dependencies: readonly string[];
|
|
17
17
|
readonly runner: readonly string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materialize-workflow-model.d.ts","sourceRoot":"","sources":["../../../src/core/step-config/materialize-workflow-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"materialize-workflow-model.d.ts","sourceRoot":"","sources":["../../../src/core/step-config/materialize-workflow-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAEtF,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EACV,+BAA+B,EAC/B,gCAAgC,EACjC,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,KAAK,wBAAwB,EAE9B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,kCAAkC,CAAC;AAEhF,KAAK,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AACtD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;IAChE,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC/C,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,wBAAwB,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,+BAA+B,GAAG,SAAS,CAAC;IACxE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,gCAAgC,GAAG,IAAI,GAAG,SAAS,CAAC;CAClF;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,8BAA8B,GACrC,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CA2C7C;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,GAAG,SAAS,MAAM,EAAE,CAgBpB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAgBhC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAE/D"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DEFAULT_JOB_CHECKOUT } from '@shipfox/api-definitions-dto';
|
|
1
2
|
import { canonicalizeLabels, findInvalidLabels, MAX_RUNNER_LABELS } from '@shipfox/runner-labels';
|
|
2
3
|
import { InvalidJobRunnerLabelsError } from '#core/errors.js';
|
|
3
4
|
import { completeStepField } from './fields.js';
|
|
@@ -11,7 +12,9 @@ export async function materializeWorkflowModel(params) {
|
|
|
11
12
|
job.id,
|
|
12
13
|
job
|
|
13
14
|
]));
|
|
14
|
-
return await Promise.all(model.jobs.map(async (job, position)=>
|
|
15
|
+
return await Promise.all(model.jobs.map(async (job, position)=>{
|
|
16
|
+
const name = job.name;
|
|
17
|
+
return {
|
|
15
18
|
key: job.key,
|
|
16
19
|
mode: job.mode,
|
|
17
20
|
...job.success === undefined ? {} : {
|
|
@@ -20,12 +23,12 @@ export async function materializeWorkflowModel(params) {
|
|
|
20
23
|
...job.executionTimeoutMs === undefined ? {} : {
|
|
21
24
|
executionTimeoutMs: job.executionTimeoutMs
|
|
22
25
|
},
|
|
23
|
-
checkout: job.checkout,
|
|
26
|
+
checkout: job.checkout === false ? DEFAULT_JOB_CHECKOUT : job.checkout,
|
|
24
27
|
...job.listening === undefined ? {} : {
|
|
25
28
|
listening: job.listening
|
|
26
29
|
},
|
|
27
|
-
...
|
|
28
|
-
name
|
|
30
|
+
...name === undefined ? {} : {
|
|
31
|
+
name
|
|
29
32
|
},
|
|
30
33
|
...job.outputs === undefined ? {} : {
|
|
31
34
|
outputs: job.outputs
|
|
@@ -42,7 +45,8 @@ export async function materializeWorkflowModel(params) {
|
|
|
42
45
|
agentToolContext,
|
|
43
46
|
agentToolSnapshot
|
|
44
47
|
})
|
|
45
|
-
}
|
|
48
|
+
};
|
|
49
|
+
}));
|
|
46
50
|
}
|
|
47
51
|
export function materializeJobRunner(params) {
|
|
48
52
|
const resolvedLabels = (params.job.runnerTemplates ?? []).map((template)=>completeStepField({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/step-config/materialize-workflow-model.ts"],"sourcesContent":["import type
|
|
1
|
+
{"version":3,"sources":["../../../src/core/step-config/materialize-workflow-model.ts"],"sourcesContent":["import {DEFAULT_JOB_CHECKOUT, type WorkflowModel} from '@shipfox/api-definitions-dto';\nimport {canonicalizeLabels, findInvalidLabels, MAX_RUNNER_LABELS} from '@shipfox/runner-labels';\nimport type {AgentDefaultsResolver} from '#core/agent-defaults.js';\nimport type {\n AgentToolMaterializationContext,\n AgentToolMaterializationSnapshot,\n} from '#core/agent-tools.js';\nimport {InvalidJobRunnerLabelsError} from '#core/errors.js';\nimport {completeStepField} from './fields.js';\nimport {\n type MaterializedWorkflowStep,\n materializeJobExecutionSteps,\n} from './materialize-job-execution-steps.js';\nimport type {WorkflowEvaluationContext} from './workflow-evaluation-context.js';\n\ntype WorkflowModelJob = WorkflowModel['jobs'][number];\nexport interface MaterializedWorkflowJob {\n readonly key: string;\n readonly mode: WorkflowModelJob['mode'];\n readonly success?: string;\n readonly executionTimeoutMs?: number;\n readonly checkout: Exclude<WorkflowModelJob['checkout'], false>;\n readonly listening?: WorkflowModelJob['listening'];\n readonly name?: string;\n readonly outputs?: WorkflowModelJob['outputs'];\n readonly dependencies: readonly string[];\n readonly runner: readonly string[];\n readonly position: number;\n readonly steps: readonly MaterializedWorkflowStep[];\n}\n\nexport interface MaterializeWorkflowModelParams {\n readonly model: WorkflowModel;\n readonly context?: WorkflowEvaluationContext | undefined;\n readonly resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n readonly definitionId?: string | undefined;\n readonly agentToolContext?: AgentToolMaterializationContext | undefined;\n readonly agentToolSnapshot?: AgentToolMaterializationSnapshot | null | undefined;\n}\n\nexport async function materializeWorkflowModel(\n params: MaterializeWorkflowModelParams,\n): Promise<readonly MaterializedWorkflowJob[]> {\n const {\n model,\n context = {site: 'run-creation', values: {}},\n resolveAgentDefaults,\n definitionId = model.name,\n agentToolContext,\n agentToolSnapshot,\n } = params;\n const jobsById = new Map(model.jobs.map((job) => [job.id, job]));\n\n return await Promise.all(\n model.jobs.map(async (job, position) => {\n const name = job.name;\n return {\n key: job.key,\n mode: job.mode,\n ...(job.success === undefined ? {} : {success: job.success}),\n ...(job.executionTimeoutMs === undefined\n ? {}\n : {executionTimeoutMs: job.executionTimeoutMs}),\n checkout: job.checkout === false ? DEFAULT_JOB_CHECKOUT : job.checkout,\n ...(job.listening === undefined ? {} : {listening: job.listening}),\n ...(name === undefined ? {} : {name}),\n ...(job.outputs === undefined ? {} : {outputs: job.outputs}),\n dependencies: dependencySourceNames(job, jobsById),\n runner: job.runner,\n position,\n steps:\n job.mode === 'listening'\n ? []\n : await materializeJobExecutionSteps({\n model,\n job,\n context,\n resolveAgentDefaults,\n definitionId,\n agentToolContext,\n agentToolSnapshot,\n }),\n };\n }),\n );\n}\n\nexport function materializeJobRunner(params: {\n readonly job: WorkflowModelJob;\n readonly context: WorkflowEvaluationContext;\n readonly definitionId: string;\n}): readonly string[] {\n const resolvedLabels = (params.job.runnerTemplates ?? []).map((template) =>\n completeStepField({\n field: 'job.runner',\n errorField: 'job.runner',\n template: {segments: template},\n context: params.context,\n definitionId: params.definitionId,\n }),\n );\n const labels = canonicalizeLabels([...params.job.runner, ...resolvedLabels]);\n const invalidLabels = findInvalidLabels(labels);\n if (labels.length === 0 || labels.length > MAX_RUNNER_LABELS || invalidLabels.length > 0) {\n throw new InvalidJobRunnerLabelsError(labels);\n }\n return labels;\n}\n\nexport function materializeJobOutputs(params: {\n readonly job: WorkflowModelJob;\n readonly context: WorkflowEvaluationContext;\n readonly definitionId: string;\n}): Record<string, string> | null {\n const outputs = params.job.outputs;\n if (outputs === undefined) return null;\n\n return Object.fromEntries(\n Object.entries(outputs).map(([key, template]) => [\n key,\n completeStepField({\n field: 'job.outputs',\n errorField: 'job.outputs',\n template: {segments: template},\n context: params.context,\n definitionId: params.definitionId,\n }),\n ]),\n );\n}\n\nexport function modelHasAgentStep(model: WorkflowModel): boolean {\n return model.jobs.some((job) => job.steps.some((step) => step.kind === 'agent'));\n}\n\nfunction dependencySourceNames(\n job: WorkflowModelJob,\n jobsById: ReadonlyMap<string, WorkflowModelJob>,\n): readonly string[] {\n return job.dependencies.map((dependencyId) => {\n const dependency = jobsById.get(dependencyId);\n if (!dependency) {\n throw new Error(`Unresolved workflow model dependency \"${dependencyId}\" for job \"${job.id}\"`);\n }\n return dependency.key;\n });\n}\n"],"names":["DEFAULT_JOB_CHECKOUT","canonicalizeLabels","findInvalidLabels","MAX_RUNNER_LABELS","InvalidJobRunnerLabelsError","completeStepField","materializeJobExecutionSteps","materializeWorkflowModel","params","model","context","site","values","resolveAgentDefaults","definitionId","name","agentToolContext","agentToolSnapshot","jobsById","Map","jobs","map","job","id","Promise","all","position","key","mode","success","undefined","executionTimeoutMs","checkout","listening","outputs","dependencies","dependencySourceNames","runner","steps","materializeJobRunner","resolvedLabels","runnerTemplates","template","field","errorField","segments","labels","invalidLabels","length","materializeJobOutputs","Object","fromEntries","entries","modelHasAgentStep","some","step","kind","dependencyId","dependency","get","Error"],"mappings":"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"}
|
|
@@ -2,16 +2,16 @@ import type { WorkflowModel } from '@shipfox/api-definitions-dto';
|
|
|
2
2
|
import { type WorkflowExpressionEvaluationContext } from '@shipfox/expression';
|
|
3
3
|
import type { PersistedEvaluationTraceEntry } from '#core/entities/step.js';
|
|
4
4
|
interface WorkflowModelJobName {
|
|
5
|
-
readonly
|
|
5
|
+
readonly executionName?: WorkflowModel['jobs'][number]['executionName'] | undefined;
|
|
6
6
|
}
|
|
7
7
|
export interface ResolveJobExecutionNameParams {
|
|
8
8
|
readonly definitionId: string;
|
|
9
9
|
readonly job: WorkflowModelJobName;
|
|
10
|
-
readonly fallbackName: string;
|
|
11
10
|
readonly context: WorkflowExpressionEvaluationContext;
|
|
12
11
|
}
|
|
13
12
|
export declare function resolveJobExecutionName(params: ResolveJobExecutionNameParams): {
|
|
14
|
-
|
|
13
|
+
/** The resolved override to persist. The static fallback is deliberately not persisted. */
|
|
14
|
+
readonly nameOverride: string | null;
|
|
15
15
|
readonly trace: readonly PersistedEvaluationTraceEntry[];
|
|
16
16
|
};
|
|
17
17
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-job-execution-name.d.ts","sourceRoot":"","sources":["../../../src/core/step-config/resolve-job-execution-name.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"resolve-job-execution-name.d.ts","sourceRoot":"","sources":["../../../src/core/step-config/resolve-job-execution-name.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAKL,KAAK,mCAAmC,EAEzC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAC,6BAA6B,EAAC,MAAM,wBAAwB,CAAC;AAE1E,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;CACrF;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,oBAAoB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,mCAAmC,CAAC;CACvD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,6BAA6B,GAAG;IAC9E,2FAA2F;IAC3F,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,6BAA6B,EAAE,CAAC;CAC1D,CAwCA"}
|
|
@@ -1,33 +1,44 @@
|
|
|
1
|
-
import { capTraceEntries, getWorkflowInterpolationFieldFailurePolicy, resolveFieldAtSite, WorkflowTemplateResolutionError } from '@shipfox/expression';
|
|
2
|
-
import { InterpolationUnresolvableError } from '#core/errors.js';
|
|
1
|
+
import { capTraceEntries, evaluationTraceEntry, getWorkflowInterpolationFieldFailurePolicy, resolveFieldAtSite, WorkflowTemplateResolutionError } from '@shipfox/expression';
|
|
3
2
|
export function resolveJobExecutionName(params) {
|
|
4
|
-
if (params.job.
|
|
5
|
-
|
|
3
|
+
if (params.job.executionName === undefined) return {
|
|
4
|
+
nameOverride: null,
|
|
6
5
|
trace: []
|
|
7
6
|
};
|
|
8
7
|
try {
|
|
9
8
|
const resolved = resolveFieldAtSite({
|
|
10
9
|
field: {
|
|
11
|
-
segments: params.job.
|
|
10
|
+
segments: params.job.executionName
|
|
12
11
|
},
|
|
13
12
|
site: 'execution-creation',
|
|
14
13
|
context: params.context,
|
|
15
|
-
failurePolicy: getWorkflowInterpolationFieldFailurePolicy('job.
|
|
14
|
+
failurePolicy: getWorkflowInterpolationFieldFailurePolicy('job.execution_name')
|
|
16
15
|
});
|
|
17
16
|
return {
|
|
18
|
-
|
|
17
|
+
nameOverride: resolved.kind === 'frozen' && resolved.value !== '' ? resolved.value : null,
|
|
19
18
|
trace: capTraceEntries(resolved.trace.map((entry)=>({
|
|
20
19
|
...entry,
|
|
21
|
-
field: 'job.
|
|
20
|
+
field: 'job.execution_name'
|
|
22
21
|
})))
|
|
23
22
|
};
|
|
24
23
|
} catch (error) {
|
|
25
24
|
if (error instanceof WorkflowTemplateResolutionError) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
const failedSegment = params.job.executionName.find((segment)=>segment.kind === 'deferred' && segment.expression.source === error.source);
|
|
26
|
+
const trace = failedSegment?.kind === 'deferred' ? [
|
|
27
|
+
{
|
|
28
|
+
...evaluationTraceEntry({
|
|
29
|
+
expression: failedSegment.expression.source,
|
|
30
|
+
roots: failedSegment.roots,
|
|
31
|
+
fillTarget: failedSegment.fillTarget,
|
|
32
|
+
evaluatedAt: 'execution-creation',
|
|
33
|
+
degraded: true
|
|
34
|
+
}),
|
|
35
|
+
field: 'job.execution_name'
|
|
36
|
+
}
|
|
37
|
+
] : [];
|
|
38
|
+
return {
|
|
39
|
+
nameOverride: null,
|
|
40
|
+
trace: capTraceEntries(trace)
|
|
41
|
+
};
|
|
31
42
|
}
|
|
32
43
|
throw error;
|
|
33
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/step-config/resolve-job-execution-name.ts"],"sourcesContent":["import type {WorkflowModel} from '@shipfox/api-definitions-dto';\nimport {\n capTraceEntries,\n getWorkflowInterpolationFieldFailurePolicy,\n resolveFieldAtSite,\n type WorkflowExpressionEvaluationContext,\n WorkflowTemplateResolutionError,\n} from '@shipfox/expression';\nimport type {PersistedEvaluationTraceEntry} from '#core/entities/step.js';\
|
|
1
|
+
{"version":3,"sources":["../../../src/core/step-config/resolve-job-execution-name.ts"],"sourcesContent":["import type {WorkflowModel} from '@shipfox/api-definitions-dto';\nimport {\n capTraceEntries,\n evaluationTraceEntry,\n getWorkflowInterpolationFieldFailurePolicy,\n resolveFieldAtSite,\n type WorkflowExpressionEvaluationContext,\n WorkflowTemplateResolutionError,\n} from '@shipfox/expression';\nimport type {PersistedEvaluationTraceEntry} from '#core/entities/step.js';\n\ninterface WorkflowModelJobName {\n readonly executionName?: WorkflowModel['jobs'][number]['executionName'] | undefined;\n}\n\nexport interface ResolveJobExecutionNameParams {\n readonly definitionId: string;\n readonly job: WorkflowModelJobName;\n readonly context: WorkflowExpressionEvaluationContext;\n}\n\nexport function resolveJobExecutionName(params: ResolveJobExecutionNameParams): {\n /** The resolved override to persist. The static fallback is deliberately not persisted. */\n readonly nameOverride: string | null;\n readonly trace: readonly PersistedEvaluationTraceEntry[];\n} {\n if (params.job.executionName === undefined) return {nameOverride: null, trace: []};\n\n try {\n const resolved = resolveFieldAtSite({\n field: {segments: params.job.executionName},\n site: 'execution-creation',\n context: params.context,\n failurePolicy: getWorkflowInterpolationFieldFailurePolicy('job.execution_name'),\n });\n return {\n nameOverride: resolved.kind === 'frozen' && resolved.value !== '' ? resolved.value : null,\n trace: capTraceEntries(\n resolved.trace.map((entry) => ({...entry, field: 'job.execution_name'})),\n ),\n };\n } catch (error) {\n if (error instanceof WorkflowTemplateResolutionError) {\n const failedSegment = params.job.executionName.find(\n (segment) => segment.kind === 'deferred' && segment.expression.source === error.source,\n );\n const trace =\n failedSegment?.kind === 'deferred'\n ? [\n {\n ...evaluationTraceEntry({\n expression: failedSegment.expression.source,\n roots: failedSegment.roots,\n fillTarget: failedSegment.fillTarget,\n evaluatedAt: 'execution-creation',\n degraded: true,\n }),\n field: 'job.execution_name',\n },\n ]\n : [];\n return {nameOverride: null, trace: capTraceEntries(trace)};\n }\n throw error;\n }\n}\n"],"names":["capTraceEntries","evaluationTraceEntry","getWorkflowInterpolationFieldFailurePolicy","resolveFieldAtSite","WorkflowTemplateResolutionError","resolveJobExecutionName","params","job","executionName","undefined","nameOverride","trace","resolved","field","segments","site","context","failurePolicy","kind","value","map","entry","error","failedSegment","find","segment","expression","source","roots","fillTarget","evaluatedAt","degraded"],"mappings":"AACA,SACEA,eAAe,EACfC,oBAAoB,EACpBC,0CAA0C,EAC1CC,kBAAkB,EAElBC,+BAA+B,QAC1B,sBAAsB;AAa7B,OAAO,SAASC,wBAAwBC,MAAqC;IAK3E,IAAIA,OAAOC,GAAG,CAACC,aAAa,KAAKC,WAAW,OAAO;QAACC,cAAc;QAAMC,OAAO,EAAE;IAAA;IAEjF,IAAI;QACF,MAAMC,WAAWT,mBAAmB;YAClCU,OAAO;gBAACC,UAAUR,OAAOC,GAAG,CAACC,aAAa;YAAA;YAC1CO,MAAM;YACNC,SAASV,OAAOU,OAAO;YACvBC,eAAef,2CAA2C;QAC5D;QACA,OAAO;YACLQ,cAAcE,SAASM,IAAI,KAAK,YAAYN,SAASO,KAAK,KAAK,KAAKP,SAASO,KAAK,GAAG;YACrFR,OAAOX,gBACLY,SAASD,KAAK,CAACS,GAAG,CAAC,CAACC,QAAW,CAAA;oBAAC,GAAGA,KAAK;oBAAER,OAAO;gBAAoB,CAAA;QAEzE;IACF,EAAE,OAAOS,OAAO;QACd,IAAIA,iBAAiBlB,iCAAiC;YACpD,MAAMmB,gBAAgBjB,OAAOC,GAAG,CAACC,aAAa,CAACgB,IAAI,CACjD,CAACC,UAAYA,QAAQP,IAAI,KAAK,cAAcO,QAAQC,UAAU,CAACC,MAAM,KAAKL,MAAMK,MAAM;YAExF,MAAMhB,QACJY,eAAeL,SAAS,aACpB;gBACE;oBACE,GAAGjB,qBAAqB;wBACtByB,YAAYH,cAAcG,UAAU,CAACC,MAAM;wBAC3CC,OAAOL,cAAcK,KAAK;wBAC1BC,YAAYN,cAAcM,UAAU;wBACpCC,aAAa;wBACbC,UAAU;oBACZ,EAAE;oBACFlB,OAAO;gBACT;aACD,GACD,EAAE;YACR,OAAO;gBAACH,cAAc;gBAAMC,OAAOX,gBAAgBW;YAAM;QAC3D;QACA,MAAMW;IACR;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-step-config.d.ts","sourceRoot":"","sources":["../../../src/core/step-config/resolve-step-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,oBAAoB,EAAE,aAAa,EAAC,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve-step-config.d.ts","sourceRoot":"","sources":["../../../src/core/step-config/resolve-step-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,oBAAoB,EAAE,aAAa,EAAC,MAAM,8BAA8B,CAAC;AAEtF,OAAO,EACL,KAAK,gBAAgB,EAErB,KAAK,yBAAyB,EAC9B,KAAK,mCAAmC,EACzC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EACV,+BAA+B,EAC/B,gCAAgC,EACjC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,gCAAgC,EACrC,KAAK,8BAA8B,EACpC,MAAM,aAAa,CAAC;AAIrB,KAAK,gBAAgB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AACtD,KAAK,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAK3D,YAAY,EAAC,eAAe,EAAE,8BAA8B,EAAC,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACnD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,SAAS,8BAA8B,EAAE,CAAC;IAChE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,gCAAgC,GAAG,yBAAyB,CAAC,EAAE,CAAC;CAC3F;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3C,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAChE,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,mCAAmC,CAAC;IACtD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAClE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,+BAA+B,GAAG,SAAS,CAAC;IACxE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,gCAAgC,GAAG,IAAI,GAAG,SAAS,CAAC;CAClF;AA4BD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,kBAAkB,CAAC,CAgB7B"}
|