@shipfox/api-workflows 7.1.0 → 9.0.1
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 +4 -4
- package/CHANGELOG.md +80 -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/agent-tools.d.ts +5 -2
- package/dist/core/agent-tools.d.ts.map +1 -1
- package/dist/core/agent-tools.js.map +1 -1
- package/dist/core/checkout.d.ts +2 -2
- package/dist/core/checkout.d.ts.map +1 -1
- package/dist/core/checkout.js.map +1 -1
- package/dist/core/entities/step.d.ts +2 -1
- package/dist/core/entities/step.d.ts.map +1 -1
- package/dist/core/entities/step.js.map +1 -1
- package/dist/core/errors.d.ts +0 -4
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +0 -6
- package/dist/core/errors.js.map +1 -1
- package/dist/core/job-execution.d.ts +0 -2
- package/dist/core/job-execution.d.ts.map +1 -1
- package/dist/core/job-execution.js +3 -7
- package/dist/core/job-execution.js.map +1 -1
- package/dist/core/run-workflow.d.ts +2 -2
- package/dist/core/run-workflow.d.ts.map +1 -1
- package/dist/core/run-workflow.js.map +1 -1
- package/dist/core/step-config/agent.d.ts +1 -1
- package/dist/core/step-config/agent.d.ts.map +1 -1
- package/dist/core/step-config/agent.js.map +1 -1
- package/dist/db/job-listeners.d.ts +2 -2
- package/dist/db/job-listeners.d.ts.map +1 -1
- package/dist/db/job-listeners.js.map +1 -1
- package/dist/db/workflow-runs/job-executions.d.ts +0 -5
- package/dist/db/workflow-runs/job-executions.d.ts.map +1 -1
- package/dist/db/workflow-runs/job-executions.js +0 -7
- package/dist/db/workflow-runs/job-executions.js.map +1 -1
- package/dist/db/workflow-runs/run-create.d.ts +2 -2
- package/dist/db/workflow-runs/run-create.d.ts.map +1 -1
- package/dist/db/workflow-runs/run-create.js.map +1 -1
- package/dist/db/workflow-runs.d.ts +1 -1
- package/dist/db/workflow-runs.d.ts.map +1 -1
- package/dist/db/workflow-runs.js +1 -1
- package/dist/db/workflow-runs.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/presentation/inter-module.d.ts +2 -2
- package/dist/presentation/inter-module.d.ts.map +1 -1
- package/dist/presentation/inter-module.js +2 -1
- package/dist/presentation/inter-module.js.map +1 -1
- package/dist/presentation/routes/cancel-run.d.ts +1 -1
- package/dist/presentation/routes/cancel-run.d.ts.map +1 -1
- package/dist/presentation/routes/cancel-run.js.map +1 -1
- package/dist/presentation/routes/checkout-token.d.ts +2 -2
- package/dist/presentation/routes/checkout-token.d.ts.map +1 -1
- package/dist/presentation/routes/checkout-token.js +1 -1
- package/dist/presentation/routes/checkout-token.js.map +1 -1
- package/dist/presentation/routes/get-run-aggregates.d.ts +1 -1
- package/dist/presentation/routes/get-run-aggregates.d.ts.map +1 -1
- package/dist/presentation/routes/get-run-aggregates.js.map +1 -1
- package/dist/presentation/routes/get-run.d.ts +1 -1
- package/dist/presentation/routes/get-run.d.ts.map +1 -1
- package/dist/presentation/routes/get-run.js.map +1 -1
- package/dist/presentation/routes/index.d.ts +2 -2
- package/dist/presentation/routes/index.d.ts.map +1 -1
- package/dist/presentation/routes/index.js.map +1 -1
- package/dist/presentation/routes/list-run-attempts.d.ts +1 -1
- package/dist/presentation/routes/list-run-attempts.d.ts.map +1 -1
- package/dist/presentation/routes/list-run-attempts.js.map +1 -1
- package/dist/presentation/routes/list-runs.d.ts +1 -1
- package/dist/presentation/routes/list-runs.d.ts.map +1 -1
- package/dist/presentation/routes/list-runs.js.map +1 -1
- package/dist/presentation/routes/next-step.d.ts.map +1 -1
- package/dist/presentation/routes/next-step.js +11 -8
- package/dist/presentation/routes/next-step.js.map +1 -1
- package/dist/presentation/routes/project-access.d.ts +1 -1
- package/dist/presentation/routes/project-access.d.ts.map +1 -1
- package/dist/presentation/routes/project-access.js.map +1 -1
- package/dist/presentation/routes/require-accessible-run.d.ts +1 -1
- package/dist/presentation/routes/require-accessible-run.d.ts.map +1 -1
- package/dist/presentation/routes/require-accessible-run.js.map +1 -1
- package/dist/presentation/routes/rerun-run.d.ts +1 -1
- package/dist/presentation/routes/rerun-run.d.ts.map +1 -1
- package/dist/presentation/routes/rerun-run.js.map +1 -1
- package/dist/temporal/activities/index.d.ts +2 -2
- package/dist/temporal/activities/index.d.ts.map +1 -1
- package/dist/temporal/activities/index.js.map +1 -1
- package/dist/temporal/activities/orchestration-activities.d.ts +2 -2
- package/dist/temporal/activities/orchestration-activities.d.ts.map +1 -1
- package/dist/temporal/activities/orchestration-activities.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +26 -28
- package/src/core/agent-defaults.ts +2 -1
- package/src/core/agent-tool-capability-warning.test.ts +26 -56
- package/src/core/agent-tools.ts +9 -7
- package/src/core/checkout.test.ts +2 -2
- package/src/core/checkout.ts +2 -2
- package/src/core/entities/step.ts +1 -2
- package/src/core/errors.ts +0 -7
- package/src/core/job-execution.ts +3 -10
- package/src/core/run-workflow.test.ts +22 -55
- package/src/core/run-workflow.ts +2 -2
- package/src/core/step-config/agent.ts +1 -1
- package/src/core/step-config/materialize-job-execution-steps.test.ts +1 -2
- package/src/core/step-config/materialize-workflow-model.test.ts +10 -13
- package/src/db/job-listeners.ts +2 -2
- package/src/db/workflow-runs/job-executions.ts +0 -21
- package/src/db/workflow-runs/run-create.test.ts +30 -23
- package/src/db/workflow-runs/run-create.ts +2 -2
- package/src/db/workflow-runs.ts +0 -1
- package/src/index.ts +3 -3
- package/src/presentation/dto/checkout-token.test.ts +7 -1
- package/src/presentation/inter-module.ts +4 -7
- package/src/presentation/routes/agent-runtime-config.test.ts +40 -132
- package/src/presentation/routes/cancel-run.test.ts +1 -1
- package/src/presentation/routes/cancel-run.ts +1 -1
- package/src/presentation/routes/checkout-token.test.ts +4 -37
- package/src/presentation/routes/checkout-token.ts +2 -2
- package/src/presentation/routes/get-run-aggregates.test.ts +1 -1
- package/src/presentation/routes/get-run-aggregates.ts +1 -1
- package/src/presentation/routes/get-run.test.ts +1 -1
- package/src/presentation/routes/get-run.ts +1 -1
- package/src/presentation/routes/get-step-secrets.test.ts +2 -2
- package/src/presentation/routes/index.test.ts +3 -3
- package/src/presentation/routes/index.ts +2 -2
- package/src/presentation/routes/list-run-attempts.test.ts +1 -1
- package/src/presentation/routes/list-run-attempts.ts +1 -1
- package/src/presentation/routes/list-runs.test.ts +1 -1
- package/src/presentation/routes/list-runs.ts +1 -1
- package/src/presentation/routes/next-step.test.ts +27 -69
- package/src/presentation/routes/next-step.ts +9 -5
- package/src/presentation/routes/project-access.ts +1 -1
- package/src/presentation/routes/report-step.test.ts +2 -3
- package/src/presentation/routes/require-accessible-run.ts +1 -1
- package/src/presentation/routes/rerun-run.test.ts +1 -1
- package/src/presentation/routes/rerun-run.ts +1 -1
- package/src/temporal/activities/index.ts +2 -2
- package/src/temporal/activities/orchestration-activities.ts +2 -2
- package/test/factories/workflow-model.ts +3 -1
- package/test/fixtures/active-lease-token.ts +5 -32
- package/test/fixtures/agent-inter-module.ts +32 -1
- package/test/fixtures/auth-inter-module.ts +2 -13
- package/test/fixtures/lease-token.ts +43 -29
- package/test/fixtures/projects-inter-module.ts +1 -1
- package/test/fixtures/runners-inter-module.ts +40 -48
- package/test/globalSetup.ts +0 -38
- package/test/setup.ts +2 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/dist/db/runner-lease-table.d.ts +0 -469
- package/dist/db/runner-lease-table.d.ts.map +0 -1
- package/dist/db/runner-lease-table.js +0 -43
- package/dist/db/runner-lease-table.js.map +0 -1
- package/src/db/runner-lease-table.ts +0 -39
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/job-execution.ts"],"sourcesContent":["import type {AgentInterModuleClient} from '@shipfox/api-agent-dto/inter-module';\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 {createAgentDefaultsResolver} from './agent-defaults.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 readonly agent?: AgentInterModuleClient | undefined;\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 readonly agent?: AgentInterModuleClient | undefined;\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 agent?: AgentInterModuleClient | undefined,\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, agent});\n}\n\nasync function resolveNextPendingStep({\n jobExecutionId,\n steps,\n jobExecution,\n attempts,\n jobs,\n tx,\n agent,\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, agent});\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 agent,\n}: PendingStepDispatchParams): Promise<NextStep> {\n try {\n const completed = await completeStepDispatchConfig({\n step: pending,\n context,\n resolveAgentDefaults: agent ? createAgentDefaultsResolver(agent, null) : undefined,\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, agent)\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 agent?: AgentInterModuleClient | undefined;\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, params.agent);\n });\n}\n\nexport function nextStepForJob(\n jobId: string,\n agent?: AgentInterModuleClient | undefined,\n): 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, agent);\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":["coerceStepOutputs","evaluatePlannedPredicateAtSite","withTransaction","countStepAttempts","dispatchStepWithCompletedConfig","finishStepAttempt","getDirectDependencyJobContexts","getJobExecutionById","getLatestJobExecutionByJobId","getStepAttemptsByJobExecutionId","getStepsByJobExecutionIdForUpdate","insertRunningStepAttempt","lockActiveJobExecutionLeaseForUpdate","markStepRunning","markStepSkipped","settleJobFailed","writeJobStepsSettledOutbox","recordWorkflowJobExecutionStepsSettled","recordWorkflowStepRestartEnqueued","createAgentDefaultsResolver","defaultStepConditionTrace","explicitConditionTrace","AgentConfigUnresolvableError","InterpolationUnresolvableError","JobLeaseNotActiveError","JobNotFoundError","StepAttemptAheadError","StepNotFoundError","StepNotRunningError","assembleStepDispatchContext","completeStepDispatchConfig","applyStepTransition","decideStepTransition","deriveCompletion","isTerminal","evaluateGate","evaluateGateFeedback","gateResultPayload","readStepGate","readStepOutputs","nextStepForJobExecutionInTransaction","jobExecutionId","tx","agent","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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"}
|
|
1
|
+
{"version":3,"sources":["../../src/core/job-execution.ts"],"sourcesContent":["import type {AgentInterModuleClient} from '@shipfox/api-agent-dto/inter-module';\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 markStepRunning,\n markStepSkipped,\n settleJobFailed,\n writeJobStepsSettledOutbox,\n} from '#db/workflow-runs.js';\nimport {\n recordWorkflowJobExecutionStepsSettled,\n recordWorkflowStepRestartEnqueued,\n} from '#metrics/instance.js';\nimport {createAgentDefaultsResolver} from './agent-defaults.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 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 readonly agent?: AgentInterModuleClient | undefined;\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 readonly agent?: AgentInterModuleClient | undefined;\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 agent?: AgentInterModuleClient | undefined,\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, agent});\n}\n\nasync function resolveNextPendingStep({\n jobExecutionId,\n steps,\n jobExecution,\n attempts,\n jobs,\n tx,\n agent,\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, agent});\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 agent,\n}: PendingStepDispatchParams): Promise<NextStep> {\n try {\n const completed = await completeStepDispatchConfig({\n step: pending,\n context,\n resolveAgentDefaults: agent ? createAgentDefaultsResolver(agent, null) : undefined,\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, agent)\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 jobExecutionId: string;\n agent?: AgentInterModuleClient | undefined;\n}\n\nexport function nextStepForLeasedJobExecution(\n params: NextStepForLeasedJobExecutionParams,\n): Promise<NextStep> {\n return withTransaction((tx) =>\n nextStepForJobExecutionInTransaction(params.jobExecutionId, tx, params.agent),\n );\n}\n\nexport function nextStepForJob(\n jobId: string,\n agent?: AgentInterModuleClient | undefined,\n): 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, agent);\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":["coerceStepOutputs","evaluatePlannedPredicateAtSite","withTransaction","countStepAttempts","dispatchStepWithCompletedConfig","finishStepAttempt","getDirectDependencyJobContexts","getJobExecutionById","getLatestJobExecutionByJobId","getStepAttemptsByJobExecutionId","getStepsByJobExecutionIdForUpdate","insertRunningStepAttempt","markStepRunning","markStepSkipped","settleJobFailed","writeJobStepsSettledOutbox","recordWorkflowJobExecutionStepsSettled","recordWorkflowStepRestartEnqueued","createAgentDefaultsResolver","defaultStepConditionTrace","explicitConditionTrace","AgentConfigUnresolvableError","InterpolationUnresolvableError","JobNotFoundError","StepAttemptAheadError","StepNotFoundError","StepNotRunningError","assembleStepDispatchContext","completeStepDispatchConfig","applyStepTransition","decideStepTransition","deriveCompletion","isTerminal","evaluateGate","evaluateGateFeedback","gateResultPayload","readStepGate","readStepOutputs","nextStepForJobExecutionInTransaction","jobExecutionId","tx","agent","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","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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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AgentInterModuleClient } from '@shipfox/api-agent-dto/inter-module';
|
|
2
2
|
import type { DefinitionsInterModuleClient } from '@shipfox/api-definitions-dto/inter-module';
|
|
3
|
-
import type { IntegrationsModuleClient } from '@shipfox/api-integration-core-dto';
|
|
4
|
-
import type { ProjectsModuleClient } from '@shipfox/api-projects-dto';
|
|
3
|
+
import type { IntegrationsModuleClient } from '@shipfox/api-integration-core-dto/inter-module';
|
|
4
|
+
import type { ProjectsModuleClient } from '@shipfox/api-projects-dto/inter-module';
|
|
5
5
|
import type { SecretsInterModuleClient } from '@shipfox/api-secrets-dto/inter-module';
|
|
6
6
|
import type { TriggerPayload, WorkflowRun } from './entities/workflow-run.js';
|
|
7
7
|
export interface RunWorkflowParams {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-workflow.d.ts","sourceRoot":"","sources":["../../src/core/run-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAEhF,OAAO,KAAK,EAAC,4BAA4B,EAAC,MAAM,2CAA2C,CAAC;AAC5F,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"run-workflow.d.ts","sourceRoot":"","sources":["../../src/core/run-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAEhF,OAAO,KAAK,EAAC,4BAA4B,EAAC,MAAM,2CAA2C,CAAC;AAC5F,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,gDAAgD,CAAC;AAC7F,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AACjF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAGpF,OAAO,KAAK,EAAC,cAAc,EAAE,WAAW,EAAC,MAAM,4BAA4B,CAAC;AAI5E,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC7C,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,YAAY,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;CAC7C;AAED,wBAAsB,WAAW,CAC/B,WAAW,EAAE,4BAA4B,EACzC,MAAM,EAAE,iBAAiB,GAAG;IAAC,KAAK,EAAE,sBAAsB,CAAA;CAAC,EAC3D,OAAO,GAAE;IAAC,OAAO,CAAC,EAAE,IAAI,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,CAAA;CAAM,GAClF,OAAO,CAAC,WAAW,CAAC,CA8BtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/run-workflow.ts"],"sourcesContent":["import type {AgentInterModuleClient} from '@shipfox/api-agent-dto/inter-module';\nimport {workflowModelFromSnapshot} from '@shipfox/api-definitions-dto';\nimport type {DefinitionsInterModuleClient} from '@shipfox/api-definitions-dto/inter-module';\nimport type {IntegrationsModuleClient} from '@shipfox/api-integration-core-dto';\nimport type {ProjectsModuleClient} from '@shipfox/api-projects-dto';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {createWorkflowRun} from '#db/workflow-runs.js';\nimport {createAgentDefaultsResolver} from './agent-defaults.js';\nimport type {TriggerPayload, WorkflowRun} from './entities/workflow-run.js';\nimport {DefinitionNotFoundError, ProjectMismatchError} from './errors.js';\nimport {modelHasAgentStep} from './step-config/materialize-workflow-model.js';\n\nexport interface RunWorkflowParams {\n workspaceId: string;\n projectId: string;\n definitionId: string;\n triggerPayload: TriggerPayload;\n inputs?: Record<string, unknown> | undefined;\n triggerIdempotencyKey?: string | undefined;\n integrations?: IntegrationsModuleClient | undefined;\n projects?: ProjectsModuleClient | undefined;\n}\n\nexport async function runWorkflow(\n definitions: DefinitionsInterModuleClient,\n params: RunWorkflowParams & {agent: AgentInterModuleClient},\n options: {secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'>} = {},\n): Promise<WorkflowRun> {\n const {definition} = await definitions.getDefinitionForWorkflowRun({\n definitionId: params.definitionId,\n });\n if (!definition) throw new DefinitionNotFoundError(params.definitionId);\n\n if (definition.projectId !== params.projectId) {\n throw new ProjectMismatchError(definition.projectId, params.projectId);\n }\n const model = workflowModelFromSnapshot(definition.model);\n const resolveAgentDefaults = createAgentDefaultsResolver(\n params.agent,\n modelHasAgentStep(model) ? params.workspaceId : null,\n );\n\n return createWorkflowRun({\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n definitionId: definition.id,\n name: definition.name,\n model,\n triggerPayload: params.triggerPayload,\n inputs: params.inputs,\n sourceSnapshot: definition.sourceSnapshot,\n triggerIdempotencyKey: params.triggerIdempotencyKey,\n resolveAgentDefaults,\n secrets: options.secrets,\n integrations: params.integrations,\n projects: params.projects,\n });\n}\n"],"names":["workflowModelFromSnapshot","createWorkflowRun","createAgentDefaultsResolver","DefinitionNotFoundError","ProjectMismatchError","modelHasAgentStep","runWorkflow","definitions","params","options","definition","getDefinitionForWorkflowRun","definitionId","projectId","model","resolveAgentDefaults","agent","workspaceId","id","name","triggerPayload","inputs","sourceSnapshot","triggerIdempotencyKey","secrets","integrations","projects"],"mappings":"AACA,SAAQA,yBAAyB,QAAO,+BAA+B;AAKvE,SAAQC,iBAAiB,QAAO,uBAAuB;AACvD,SAAQC,2BAA2B,QAAO,sBAAsB;AAEhE,SAAQC,uBAAuB,EAAEC,oBAAoB,QAAO,cAAc;AAC1E,SAAQC,iBAAiB,QAAO,8CAA8C;AAa9E,OAAO,eAAeC,YACpBC,WAAyC,EACzCC,MAA2D,EAC3DC,UAAiF,CAAC,CAAC;IAEnF,MAAM,EAACC,UAAU,EAAC,GAAG,MAAMH,YAAYI,2BAA2B,CAAC;QACjEC,cAAcJ,OAAOI,YAAY;IACnC;IACA,IAAI,CAACF,YAAY,MAAM,IAAIP,wBAAwBK,OAAOI,YAAY;IAEtE,IAAIF,WAAWG,SAAS,KAAKL,OAAOK,SAAS,EAAE;QAC7C,MAAM,IAAIT,qBAAqBM,WAAWG,SAAS,EAAEL,OAAOK,SAAS;IACvE;IACA,MAAMC,QAAQd,0BAA0BU,WAAWI,KAAK;IACxD,MAAMC,uBAAuBb,4BAC3BM,OAAOQ,KAAK,EACZX,kBAAkBS,SAASN,OAAOS,WAAW,GAAG;IAGlD,OAAOhB,kBAAkB;QACvBgB,aAAaT,OAAOS,WAAW;QAC/BJ,WAAWL,OAAOK,SAAS;QAC3BD,cAAcF,WAAWQ,EAAE;QAC3BC,MAAMT,WAAWS,IAAI;QACrBL;QACAM,gBAAgBZ,OAAOY,cAAc;QACrCC,QAAQb,OAAOa,MAAM;QACrBC,gBAAgBZ,WAAWY,cAAc;QACzCC,uBAAuBf,OAAOe,qBAAqB;QACnDR;QACAS,SAASf,QAAQe,OAAO;QACxBC,cAAcjB,OAAOiB,YAAY;QACjCC,UAAUlB,OAAOkB,QAAQ;IAC3B;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../src/core/run-workflow.ts"],"sourcesContent":["import type {AgentInterModuleClient} from '@shipfox/api-agent-dto/inter-module';\nimport {workflowModelFromSnapshot} from '@shipfox/api-definitions-dto';\nimport type {DefinitionsInterModuleClient} from '@shipfox/api-definitions-dto/inter-module';\nimport type {IntegrationsModuleClient} from '@shipfox/api-integration-core-dto/inter-module';\nimport type {ProjectsModuleClient} from '@shipfox/api-projects-dto/inter-module';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {createWorkflowRun} from '#db/workflow-runs.js';\nimport {createAgentDefaultsResolver} from './agent-defaults.js';\nimport type {TriggerPayload, WorkflowRun} from './entities/workflow-run.js';\nimport {DefinitionNotFoundError, ProjectMismatchError} from './errors.js';\nimport {modelHasAgentStep} from './step-config/materialize-workflow-model.js';\n\nexport interface RunWorkflowParams {\n workspaceId: string;\n projectId: string;\n definitionId: string;\n triggerPayload: TriggerPayload;\n inputs?: Record<string, unknown> | undefined;\n triggerIdempotencyKey?: string | undefined;\n integrations?: IntegrationsModuleClient | undefined;\n projects?: ProjectsModuleClient | undefined;\n}\n\nexport async function runWorkflow(\n definitions: DefinitionsInterModuleClient,\n params: RunWorkflowParams & {agent: AgentInterModuleClient},\n options: {secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'>} = {},\n): Promise<WorkflowRun> {\n const {definition} = await definitions.getDefinitionForWorkflowRun({\n definitionId: params.definitionId,\n });\n if (!definition) throw new DefinitionNotFoundError(params.definitionId);\n\n if (definition.projectId !== params.projectId) {\n throw new ProjectMismatchError(definition.projectId, params.projectId);\n }\n const model = workflowModelFromSnapshot(definition.model);\n const resolveAgentDefaults = createAgentDefaultsResolver(\n params.agent,\n modelHasAgentStep(model) ? params.workspaceId : null,\n );\n\n return createWorkflowRun({\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n definitionId: definition.id,\n name: definition.name,\n model,\n triggerPayload: params.triggerPayload,\n inputs: params.inputs,\n sourceSnapshot: definition.sourceSnapshot,\n triggerIdempotencyKey: params.triggerIdempotencyKey,\n resolveAgentDefaults,\n secrets: options.secrets,\n integrations: params.integrations,\n projects: params.projects,\n });\n}\n"],"names":["workflowModelFromSnapshot","createWorkflowRun","createAgentDefaultsResolver","DefinitionNotFoundError","ProjectMismatchError","modelHasAgentStep","runWorkflow","definitions","params","options","definition","getDefinitionForWorkflowRun","definitionId","projectId","model","resolveAgentDefaults","agent","workspaceId","id","name","triggerPayload","inputs","sourceSnapshot","triggerIdempotencyKey","secrets","integrations","projects"],"mappings":"AACA,SAAQA,yBAAyB,QAAO,+BAA+B;AAKvE,SAAQC,iBAAiB,QAAO,uBAAuB;AACvD,SAAQC,2BAA2B,QAAO,sBAAsB;AAEhE,SAAQC,uBAAuB,EAAEC,oBAAoB,QAAO,cAAc;AAC1E,SAAQC,iBAAiB,QAAO,8CAA8C;AAa9E,OAAO,eAAeC,YACpBC,WAAyC,EACzCC,MAA2D,EAC3DC,UAAiF,CAAC,CAAC;IAEnF,MAAM,EAACC,UAAU,EAAC,GAAG,MAAMH,YAAYI,2BAA2B,CAAC;QACjEC,cAAcJ,OAAOI,YAAY;IACnC;IACA,IAAI,CAACF,YAAY,MAAM,IAAIP,wBAAwBK,OAAOI,YAAY;IAEtE,IAAIF,WAAWG,SAAS,KAAKL,OAAOK,SAAS,EAAE;QAC7C,MAAM,IAAIT,qBAAqBM,WAAWG,SAAS,EAAEL,OAAOK,SAAS;IACvE;IACA,MAAMC,QAAQd,0BAA0BU,WAAWI,KAAK;IACxD,MAAMC,uBAAuBb,4BAC3BM,OAAOQ,KAAK,EACZX,kBAAkBS,SAASN,OAAOS,WAAW,GAAG;IAGlD,OAAOhB,kBAAkB;QACvBgB,aAAaT,OAAOS,WAAW;QAC/BJ,WAAWL,OAAOK,SAAS;QAC3BD,cAAcF,WAAWQ,EAAE;QAC3BC,MAAMT,WAAWS,IAAI;QACrBL;QACAM,gBAAgBZ,OAAOY,cAAc;QACrCC,QAAQb,OAAOa,MAAM;QACrBC,gBAAgBZ,WAAWY,cAAc;QACzCC,uBAAuBf,OAAOe,qBAAqB;QACnDR;QACAS,SAASf,QAAQe,OAAO;QACxBC,cAAcjB,OAAOiB,YAAY;QACjCC,UAAUlB,OAAOkB,QAAQ;IAC3B;AACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type AgentThinking } from '@shipfox/api-agent-dto';
|
|
2
1
|
import type { WorkflowModel } from '@shipfox/api-definitions-dto';
|
|
2
|
+
import type { AgentThinking } from '@shipfox/workflow-document';
|
|
3
3
|
import type { AgentDefaultsResolver, ResolvedAgentDefaults } from '#core/agent-defaults.js';
|
|
4
4
|
import { type AgentToolMaterializationContext, type AgentToolMaterializationSnapshot } from '#core/agent-tools.js';
|
|
5
5
|
import type { PersistedEvaluationTraceEntry, StepConfigDispatchPlan } from '#core/entities/step.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/core/step-config/agent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/core/step-config/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/step-config/agent.ts"],"sourcesContent":["import {\n AGENT_INTEGRATION_MCP_AUTH,\n AGENT_INTEGRATION_MCP_ENDPOINT,\n AGENT_INTEGRATION_MCP_SERVER_NAME,\n AGENT_INTEGRATION_MCP_TRANSPORT,\n type AgentIntegrationMcpServerConfigDto,\n type AgentThinking,\n type MaterializedAgentIntegrationConfigDto,\n} from '@shipfox/api-agent-dto';\nimport {agentInterModuleContract} from '@shipfox/api-agent-dto/inter-module';\nimport type {WorkflowModel} from '@shipfox/api-definitions-dto';\nimport type {ResolvedField, SiteResolvedField} from '@shipfox/expression';\nimport {isInterModuleKnownError} from '@shipfox/inter-module';\nimport type {AgentDefaultsResolver, ResolvedAgentDefaults} from '#core/agent-defaults.js';\nimport {\n type AgentToolMaterializationContext,\n type AgentToolMaterializationSnapshot,\n materializeAgentIntegrations,\n} from '#core/agent-tools.js';\nimport type {PersistedEvaluationTraceEntry, StepConfigDispatchPlan} from '#core/entities/step.js';\nimport {AgentConfigUnresolvableError} from '#core/errors.js';\nimport {\n completeStepFieldWithTrace,\n literalField,\n resolveStepField,\n type WorkflowStepEvaluationTraceEntry,\n type WorkflowStepTemplateDiagnostic,\n} from './fields.js';\nimport type {WorkflowEvaluationContext} from './workflow-evaluation-context.js';\n\ntype WorkflowModelJob = WorkflowModel['jobs'][number];\ntype WorkflowModelStep = WorkflowModelJob['steps'][number];\ntype WorkflowModelAgentStep = Extract<WorkflowModelStep, {kind: 'agent'}>;\ntype StepConfigMode = 'effective' | 'authored';\ntype FieldResolution =\n | {readonly kind: 'frozen'; readonly value: string}\n | {readonly kind: 'residual'; readonly field: ResolvedField};\n\ninterface AgentFieldResolutions {\n readonly diagnostics: WorkflowStepTemplateDiagnostic[];\n readonly trace: WorkflowStepEvaluationTraceEntry[];\n readonly prompt: FieldResolution;\n readonly model: FieldResolution | undefined;\n readonly provider: FieldResolution | undefined;\n readonly hasTemplates: boolean;\n}\n\nexport interface ResolveAgentStepConfigParams {\n readonly jobKey: string;\n readonly step: WorkflowModelAgentStep;\n readonly context: WorkflowEvaluationContext;\n readonly mode: StepConfigMode;\n readonly definitionId: string;\n readonly resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n readonly agentToolContext?: AgentToolMaterializationContext | undefined;\n readonly agentToolSnapshot?: AgentToolMaterializationSnapshot | null | undefined;\n}\n\nexport interface AgentStepConfig {\n readonly config: Record<string, unknown>;\n readonly configPlan: StepConfigDispatchPlan | null;\n readonly diagnostics: readonly WorkflowStepTemplateDiagnostic[];\n readonly trace: readonly WorkflowStepEvaluationTraceEntry[];\n readonly hasTemplates: boolean;\n}\n\nexport async function resolveAgentStepConfig(\n params: ResolveAgentStepConfigParams,\n): Promise<AgentStepConfig> {\n const fields = resolveAgentFields(params);\n const usesAuthoredMode = params.mode === 'authored';\n\n if (usesAuthoredMode) return authoredAgentStepConfig(params.step, fields);\n\n const hasDeferredModelOrProvider =\n fields.model?.kind === 'residual' || fields.provider?.kind === 'residual';\n if (hasDeferredModelOrProvider) return deferredAgentStepConfig(params, fields);\n\n return await agentStepConfigWithDefaults(params.step, params, fields);\n}\n\nexport async function completeAgentConfig(params: {\n readonly config: Record<string, unknown>;\n readonly plan: StepConfigDispatchPlan;\n readonly context: WorkflowEvaluationContext;\n readonly resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n readonly definitionId: string;\n readonly trace: PersistedEvaluationTraceEntry[];\n}): Promise<void> {\n const agent = params.plan.agent;\n if (agent === undefined) return;\n\n const prompt =\n agent.prompt === undefined\n ? readConfigString(params.config, 'prompt')\n : completeAgentField({\n field: 'agent.prompt',\n template: agent.prompt,\n params,\n });\n const model =\n agent.model === undefined\n ? readConfigString(params.config, 'model')\n : completeAgentField({\n field: 'agent.model',\n template: agent.model,\n params,\n });\n const provider =\n agent.provider === undefined\n ? readConfigString(params.config, 'provider')\n : completeAgentField({\n field: 'agent.provider',\n template: agent.provider,\n params,\n });\n\n const defaults = await completeAgentDefaults({\n harness: agent.harness ?? readConfigHarness(params.config),\n provider,\n model,\n thinking: agent.thinking ?? readConfigThinking(params.config),\n resolveAgentDefaults: params.resolveAgentDefaults,\n definitionId: params.definitionId,\n });\n params.config.harness = defaults.harness;\n params.config.provider = defaults.provider;\n params.config.model = defaults.model;\n params.config.thinking = defaults.thinking;\n params.config.prompt = prompt;\n if (agent.tools !== undefined) params.config.tools = [...agent.tools];\n const integrations = agent.integrations === undefined ? undefined : [...agent.integrations];\n if (integrations !== undefined) params.config.integrations = integrations;\n const mcpServers =\n agent.mcpServers ??\n (integrations === undefined ? undefined : agentIntegrationMcpServers(integrations));\n if (mcpServers !== undefined) params.config.mcpServers = [...mcpServers];\n}\n\nfunction completeAgentField(args: {\n readonly field: 'agent.prompt' | 'agent.model' | 'agent.provider';\n readonly template: ResolvedField;\n readonly params: {\n readonly context: WorkflowEvaluationContext;\n readonly definitionId: string;\n readonly trace: PersistedEvaluationTraceEntry[];\n };\n}): string {\n const resolved = completeStepFieldWithTrace({\n field: args.field,\n errorField: args.field,\n template: args.template,\n context: args.params.context,\n definitionId: args.params.definitionId,\n });\n args.params.trace.push(...resolved.trace.map((entry) => ({...entry, field: args.field})));\n return resolved.value;\n}\n\nexport async function completeAgentDefaults(params: {\n readonly harness: WorkflowModelAgentStep['harness'] | undefined;\n readonly provider: string | undefined;\n readonly model: string | undefined;\n readonly thinking: AgentThinking | undefined;\n readonly resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n readonly definitionId: string;\n}): Promise<ResolvedAgentDefaults> {\n if (!params.resolveAgentDefaults) throw new Error('Agent defaults resolver is required');\n\n try {\n return await params.resolveAgentDefaults({\n harness: params.harness,\n provider: params.provider,\n model: params.model,\n thinking: params.thinking,\n });\n } catch (error) {\n if (\n isInterModuleKnownError(agentInterModuleContract.methods.resolveAgentConfig, error) &&\n error.code === 'agent-config-invalid'\n ) {\n throw new AgentConfigUnresolvableError(params.definitionId, {cause: error});\n }\n throw error;\n }\n}\n\nfunction resolveAgentFields(params: ResolveAgentStepConfigParams): AgentFieldResolutions {\n const diagnostics: WorkflowStepTemplateDiagnostic[] = [];\n const trace: WorkflowStepEvaluationTraceEntry[] = [];\n const prompt = resolveAgentField({\n field: 'agent.prompt',\n value: params.step.prompt,\n template: params.step.templates?.prompt,\n context: params.context,\n mode: params.mode,\n diagnostics,\n trace,\n definitionId: params.definitionId,\n });\n const model = resolveOptionalAgentField({\n field: 'agent.model',\n value: params.step.model,\n template: params.step.templates?.model,\n context: params.context,\n mode: params.mode,\n diagnostics,\n trace,\n definitionId: params.definitionId,\n });\n const provider = resolveOptionalAgentField({\n field: 'agent.provider',\n value: params.step.provider,\n template: params.step.templates?.provider,\n context: params.context,\n mode: params.mode,\n diagnostics,\n trace,\n definitionId: params.definitionId,\n });\n const hasTemplates =\n params.step.templates?.prompt !== undefined ||\n params.step.templates?.model !== undefined ||\n params.step.templates?.provider !== undefined;\n\n return {diagnostics, trace, prompt, model, provider, hasTemplates};\n}\n\nfunction authoredAgentStepConfig(\n step: WorkflowModelAgentStep,\n fields: AgentFieldResolutions,\n): AgentStepConfig {\n return {\n config: {\n ...(step.provider === undefined ? {} : {provider: step.provider}),\n ...(step.model === undefined ? {} : {model: step.model}),\n ...(step.harness === undefined ? {} : {harness: step.harness}),\n ...(step.thinking === undefined ? {} : {thinking: step.thinking}),\n ...agentToolsConfig(step),\n ...authoredAgentIntegrationsConfig(step),\n prompt: step.prompt,\n },\n configPlan: null,\n diagnostics: fields.diagnostics,\n trace: fields.trace,\n hasTemplates: fields.hasTemplates,\n };\n}\n\nfunction deferredAgentStepConfig(\n params: ResolveAgentStepConfigParams,\n fields: AgentFieldResolutions,\n): AgentStepConfig {\n const {step} = params;\n return {\n config: {},\n configPlan: {\n agent: {\n prompt: dispatchPlanField(fields.prompt),\n ...(fields.model === undefined ? {} : {model: dispatchPlanField(fields.model)}),\n ...(fields.provider === undefined ? {} : {provider: dispatchPlanField(fields.provider)}),\n ...(step.harness === undefined ? {} : {harness: step.harness}),\n ...(step.thinking === undefined ? {} : {thinking: step.thinking}),\n ...agentToolsConfig(step),\n ...materializedAgentIntegrationsConfig(params),\n },\n },\n diagnostics: fields.diagnostics,\n trace: fields.trace,\n hasTemplates: fields.hasTemplates,\n };\n}\n\nasync function agentStepConfigWithDefaults(\n step: WorkflowModelAgentStep,\n params: ResolveAgentStepConfigParams,\n fields: AgentFieldResolutions,\n): Promise<AgentStepConfig> {\n const providerValue = frozenFieldValue(fields.provider);\n const modelValue = frozenFieldValue(fields.model);\n const promptIsDeferred = fields.prompt.kind === 'residual';\n\n const resolved = await completeAgentDefaults({\n harness: step.harness,\n provider: providerValue,\n model: modelValue,\n thinking: step.thinking,\n resolveAgentDefaults: params.resolveAgentDefaults,\n definitionId: params.definitionId,\n });\n if (promptIsDeferred) {\n return {\n config: {\n provider: resolved.provider,\n model: resolved.model,\n harness: resolved.harness,\n thinking: resolved.thinking,\n },\n configPlan: {\n agent: {\n prompt: dispatchPlanField(fields.prompt),\n ...agentToolsConfig(step),\n ...materializedAgentIntegrationsConfig(params),\n },\n },\n diagnostics: fields.diagnostics,\n trace: fields.trace,\n hasTemplates: fields.hasTemplates,\n };\n }\n\n const promptValue = frozenFieldValue(fields.prompt) ?? step.prompt;\n return {\n config: {\n provider: resolved.provider,\n model: resolved.model,\n harness: resolved.harness,\n thinking: resolved.thinking,\n ...agentToolsConfig(step),\n ...materializedAgentIntegrationsConfig(params),\n prompt: promptValue,\n },\n configPlan: null,\n diagnostics: fields.diagnostics,\n trace: fields.trace,\n hasTemplates: fields.hasTemplates,\n };\n}\n\nfunction agentToolsConfig(\n step: WorkflowModelAgentStep,\n): {readonly tools: readonly string[]} | Record<string, never> {\n return step.tools === undefined ? {} : {tools: [...step.tools]};\n}\n\nfunction authoredAgentIntegrationsConfig(\n step: WorkflowModelAgentStep,\n):\n | {readonly integrations: NonNullable<WorkflowModelAgentStep['integrations']>}\n | Record<string, never> {\n return step.integrations === undefined ? {} : {integrations: step.integrations};\n}\n\nfunction materializedAgentIntegrationsConfig(params: ResolveAgentStepConfigParams):\n | {\n readonly integrations: readonly MaterializedAgentIntegrationConfigDto[];\n readonly mcpServers: readonly AgentIntegrationMcpServerConfigDto[];\n }\n | Record<string, never> {\n const integrations = materializeAgentIntegrations({\n jobKey: params.jobKey,\n stepId: params.step.id,\n integrations: params.step.integrations,\n context: params.agentToolContext,\n snapshot: params.agentToolSnapshot,\n });\n return integrations === undefined\n ? {}\n : {integrations, mcpServers: agentIntegrationMcpServers(integrations)};\n}\n\nfunction agentIntegrationMcpServers(\n integrations: readonly MaterializedAgentIntegrationConfigDto[],\n): readonly AgentIntegrationMcpServerConfigDto[] {\n return [\n {\n name: AGENT_INTEGRATION_MCP_SERVER_NAME,\n transport: AGENT_INTEGRATION_MCP_TRANSPORT,\n endpoint: AGENT_INTEGRATION_MCP_ENDPOINT,\n auth: AGENT_INTEGRATION_MCP_AUTH,\n integrations: [...integrations],\n },\n ];\n}\n\nfunction dispatchPlanField(field: FieldResolution): ResolvedField {\n const isResidual = field.kind === 'residual';\n return isResidual ? field.field : literalField(field.value);\n}\n\nfunction frozenFieldValue(field: FieldResolution | undefined): string | undefined {\n const isFrozen = field?.kind === 'frozen';\n return isFrozen ? field.value : undefined;\n}\n\nfunction resolveAgentField(params: {\n readonly field: 'agent.prompt' | 'agent.model' | 'agent.provider';\n readonly value: string;\n readonly template: ResolvedField['segments'] | undefined;\n readonly context: WorkflowEvaluationContext;\n readonly mode: StepConfigMode;\n readonly diagnostics: WorkflowStepTemplateDiagnostic[];\n readonly trace: WorkflowStepEvaluationTraceEntry[];\n readonly definitionId: string;\n}): FieldResolution {\n const hasTemplate = params.template !== undefined;\n const usesAuthoredMode = params.mode === 'authored';\n if (!hasTemplate || usesAuthoredMode) {\n return {kind: 'frozen', value: params.value};\n }\n\n const resolved = resolveStepField({\n field: params.field,\n template: {segments: params.template},\n context: params.context,\n definitionId: params.definitionId,\n errorField: params.field,\n });\n params.diagnostics.push(\n ...resolved.diagnostics.map((diagnostic) => ({...diagnostic, field: params.field})),\n );\n params.trace.push(...resolved.trace.map((entry) => ({...entry, field: params.field})));\n return fieldResolution(resolved);\n}\n\nfunction resolveOptionalAgentField(params: {\n readonly field: 'agent.prompt' | 'agent.model' | 'agent.provider';\n readonly value: string | undefined;\n readonly template: ResolvedField['segments'] | undefined;\n readonly context: WorkflowEvaluationContext;\n readonly mode: StepConfigMode;\n readonly diagnostics: WorkflowStepTemplateDiagnostic[];\n readonly trace: WorkflowStepEvaluationTraceEntry[];\n readonly definitionId: string;\n}): FieldResolution | undefined {\n const hasValue = params.value !== undefined;\n if (!hasValue) return undefined;\n return resolveAgentField({...params, value: params.value});\n}\n\nfunction fieldResolution(resolved: SiteResolvedField): FieldResolution {\n if (resolved.kind === 'residual') return {kind: 'residual', field: resolved.field};\n return {kind: 'frozen', value: resolved.value};\n}\n\nfunction readConfigString(config: Record<string, unknown>, key: string): string | undefined {\n const value = config[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction readConfigThinking(config: Record<string, unknown>): AgentThinking | undefined {\n const value = config.thinking;\n return value === 'off' ||\n value === 'minimal' ||\n value === 'low' ||\n value === 'medium' ||\n value === 'high' ||\n value === 'xhigh'\n ? value\n : undefined;\n}\n\nfunction readConfigHarness(\n config: Record<string, unknown>,\n): WorkflowModelAgentStep['harness'] | undefined {\n return config.harness === 'pi' || config.harness === 'claude' ? config.harness : undefined;\n}\n"],"names":["AGENT_INTEGRATION_MCP_AUTH","AGENT_INTEGRATION_MCP_ENDPOINT","AGENT_INTEGRATION_MCP_SERVER_NAME","AGENT_INTEGRATION_MCP_TRANSPORT","agentInterModuleContract","isInterModuleKnownError","materializeAgentIntegrations","AgentConfigUnresolvableError","completeStepFieldWithTrace","literalField","resolveStepField","resolveAgentStepConfig","params","fields","resolveAgentFields","usesAuthoredMode","mode","authoredAgentStepConfig","step","hasDeferredModelOrProvider","model","kind","provider","deferredAgentStepConfig","agentStepConfigWithDefaults","completeAgentConfig","agent","plan","undefined","prompt","readConfigString","config","completeAgentField","field","template","defaults","completeAgentDefaults","harness","readConfigHarness","thinking","readConfigThinking","resolveAgentDefaults","definitionId","tools","integrations","mcpServers","agentIntegrationMcpServers","args","resolved","errorField","context","trace","push","map","entry","value","Error","error","methods","resolveAgentConfig","code","cause","diagnostics","resolveAgentField","templates","resolveOptionalAgentField","hasTemplates","agentToolsConfig","authoredAgentIntegrationsConfig","configPlan","dispatchPlanField","materializedAgentIntegrationsConfig","providerValue","frozenFieldValue","modelValue","promptIsDeferred","promptValue","jobKey","stepId","id","agentToolContext","snapshot","agentToolSnapshot","name","transport","endpoint","auth","isResidual","isFrozen","hasTemplate","segments","diagnostic","fieldResolution","hasValue","key"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/step-config/agent.ts"],"sourcesContent":["import {\n AGENT_INTEGRATION_MCP_AUTH,\n AGENT_INTEGRATION_MCP_ENDPOINT,\n AGENT_INTEGRATION_MCP_SERVER_NAME,\n AGENT_INTEGRATION_MCP_TRANSPORT,\n type AgentIntegrationMcpServerConfigDto,\n type MaterializedAgentIntegrationConfigDto,\n} from '@shipfox/api-agent-dto';\nimport {agentInterModuleContract} from '@shipfox/api-agent-dto/inter-module';\nimport type {WorkflowModel} from '@shipfox/api-definitions-dto';\nimport type {ResolvedField, SiteResolvedField} from '@shipfox/expression';\nimport {isInterModuleKnownError} from '@shipfox/inter-module';\nimport type {AgentThinking} from '@shipfox/workflow-document';\nimport type {AgentDefaultsResolver, ResolvedAgentDefaults} from '#core/agent-defaults.js';\nimport {\n type AgentToolMaterializationContext,\n type AgentToolMaterializationSnapshot,\n materializeAgentIntegrations,\n} from '#core/agent-tools.js';\nimport type {PersistedEvaluationTraceEntry, StepConfigDispatchPlan} from '#core/entities/step.js';\nimport {AgentConfigUnresolvableError} from '#core/errors.js';\nimport {\n completeStepFieldWithTrace,\n literalField,\n resolveStepField,\n type WorkflowStepEvaluationTraceEntry,\n type WorkflowStepTemplateDiagnostic,\n} from './fields.js';\nimport type {WorkflowEvaluationContext} from './workflow-evaluation-context.js';\n\ntype WorkflowModelJob = WorkflowModel['jobs'][number];\ntype WorkflowModelStep = WorkflowModelJob['steps'][number];\ntype WorkflowModelAgentStep = Extract<WorkflowModelStep, {kind: 'agent'}>;\ntype StepConfigMode = 'effective' | 'authored';\ntype FieldResolution =\n | {readonly kind: 'frozen'; readonly value: string}\n | {readonly kind: 'residual'; readonly field: ResolvedField};\n\ninterface AgentFieldResolutions {\n readonly diagnostics: WorkflowStepTemplateDiagnostic[];\n readonly trace: WorkflowStepEvaluationTraceEntry[];\n readonly prompt: FieldResolution;\n readonly model: FieldResolution | undefined;\n readonly provider: FieldResolution | undefined;\n readonly hasTemplates: boolean;\n}\n\nexport interface ResolveAgentStepConfigParams {\n readonly jobKey: string;\n readonly step: WorkflowModelAgentStep;\n readonly context: WorkflowEvaluationContext;\n readonly mode: StepConfigMode;\n readonly definitionId: string;\n readonly resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n readonly agentToolContext?: AgentToolMaterializationContext | undefined;\n readonly agentToolSnapshot?: AgentToolMaterializationSnapshot | null | undefined;\n}\n\nexport interface AgentStepConfig {\n readonly config: Record<string, unknown>;\n readonly configPlan: StepConfigDispatchPlan | null;\n readonly diagnostics: readonly WorkflowStepTemplateDiagnostic[];\n readonly trace: readonly WorkflowStepEvaluationTraceEntry[];\n readonly hasTemplates: boolean;\n}\n\nexport async function resolveAgentStepConfig(\n params: ResolveAgentStepConfigParams,\n): Promise<AgentStepConfig> {\n const fields = resolveAgentFields(params);\n const usesAuthoredMode = params.mode === 'authored';\n\n if (usesAuthoredMode) return authoredAgentStepConfig(params.step, fields);\n\n const hasDeferredModelOrProvider =\n fields.model?.kind === 'residual' || fields.provider?.kind === 'residual';\n if (hasDeferredModelOrProvider) return deferredAgentStepConfig(params, fields);\n\n return await agentStepConfigWithDefaults(params.step, params, fields);\n}\n\nexport async function completeAgentConfig(params: {\n readonly config: Record<string, unknown>;\n readonly plan: StepConfigDispatchPlan;\n readonly context: WorkflowEvaluationContext;\n readonly resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n readonly definitionId: string;\n readonly trace: PersistedEvaluationTraceEntry[];\n}): Promise<void> {\n const agent = params.plan.agent;\n if (agent === undefined) return;\n\n const prompt =\n agent.prompt === undefined\n ? readConfigString(params.config, 'prompt')\n : completeAgentField({\n field: 'agent.prompt',\n template: agent.prompt,\n params,\n });\n const model =\n agent.model === undefined\n ? readConfigString(params.config, 'model')\n : completeAgentField({\n field: 'agent.model',\n template: agent.model,\n params,\n });\n const provider =\n agent.provider === undefined\n ? readConfigString(params.config, 'provider')\n : completeAgentField({\n field: 'agent.provider',\n template: agent.provider,\n params,\n });\n\n const defaults = await completeAgentDefaults({\n harness: agent.harness ?? readConfigHarness(params.config),\n provider,\n model,\n thinking: agent.thinking ?? readConfigThinking(params.config),\n resolveAgentDefaults: params.resolveAgentDefaults,\n definitionId: params.definitionId,\n });\n params.config.harness = defaults.harness;\n params.config.provider = defaults.provider;\n params.config.model = defaults.model;\n params.config.thinking = defaults.thinking;\n params.config.prompt = prompt;\n if (agent.tools !== undefined) params.config.tools = [...agent.tools];\n const integrations = agent.integrations === undefined ? undefined : [...agent.integrations];\n if (integrations !== undefined) params.config.integrations = integrations;\n const mcpServers =\n agent.mcpServers ??\n (integrations === undefined ? undefined : agentIntegrationMcpServers(integrations));\n if (mcpServers !== undefined) params.config.mcpServers = [...mcpServers];\n}\n\nfunction completeAgentField(args: {\n readonly field: 'agent.prompt' | 'agent.model' | 'agent.provider';\n readonly template: ResolvedField;\n readonly params: {\n readonly context: WorkflowEvaluationContext;\n readonly definitionId: string;\n readonly trace: PersistedEvaluationTraceEntry[];\n };\n}): string {\n const resolved = completeStepFieldWithTrace({\n field: args.field,\n errorField: args.field,\n template: args.template,\n context: args.params.context,\n definitionId: args.params.definitionId,\n });\n args.params.trace.push(...resolved.trace.map((entry) => ({...entry, field: args.field})));\n return resolved.value;\n}\n\nexport async function completeAgentDefaults(params: {\n readonly harness: WorkflowModelAgentStep['harness'] | undefined;\n readonly provider: string | undefined;\n readonly model: string | undefined;\n readonly thinking: AgentThinking | undefined;\n readonly resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n readonly definitionId: string;\n}): Promise<ResolvedAgentDefaults> {\n if (!params.resolveAgentDefaults) throw new Error('Agent defaults resolver is required');\n\n try {\n return await params.resolveAgentDefaults({\n harness: params.harness,\n provider: params.provider,\n model: params.model,\n thinking: params.thinking,\n });\n } catch (error) {\n if (\n isInterModuleKnownError(agentInterModuleContract.methods.resolveAgentConfig, error) &&\n error.code === 'agent-config-invalid'\n ) {\n throw new AgentConfigUnresolvableError(params.definitionId, {cause: error});\n }\n throw error;\n }\n}\n\nfunction resolveAgentFields(params: ResolveAgentStepConfigParams): AgentFieldResolutions {\n const diagnostics: WorkflowStepTemplateDiagnostic[] = [];\n const trace: WorkflowStepEvaluationTraceEntry[] = [];\n const prompt = resolveAgentField({\n field: 'agent.prompt',\n value: params.step.prompt,\n template: params.step.templates?.prompt,\n context: params.context,\n mode: params.mode,\n diagnostics,\n trace,\n definitionId: params.definitionId,\n });\n const model = resolveOptionalAgentField({\n field: 'agent.model',\n value: params.step.model,\n template: params.step.templates?.model,\n context: params.context,\n mode: params.mode,\n diagnostics,\n trace,\n definitionId: params.definitionId,\n });\n const provider = resolveOptionalAgentField({\n field: 'agent.provider',\n value: params.step.provider,\n template: params.step.templates?.provider,\n context: params.context,\n mode: params.mode,\n diagnostics,\n trace,\n definitionId: params.definitionId,\n });\n const hasTemplates =\n params.step.templates?.prompt !== undefined ||\n params.step.templates?.model !== undefined ||\n params.step.templates?.provider !== undefined;\n\n return {diagnostics, trace, prompt, model, provider, hasTemplates};\n}\n\nfunction authoredAgentStepConfig(\n step: WorkflowModelAgentStep,\n fields: AgentFieldResolutions,\n): AgentStepConfig {\n return {\n config: {\n ...(step.provider === undefined ? {} : {provider: step.provider}),\n ...(step.model === undefined ? {} : {model: step.model}),\n ...(step.harness === undefined ? {} : {harness: step.harness}),\n ...(step.thinking === undefined ? {} : {thinking: step.thinking}),\n ...agentToolsConfig(step),\n ...authoredAgentIntegrationsConfig(step),\n prompt: step.prompt,\n },\n configPlan: null,\n diagnostics: fields.diagnostics,\n trace: fields.trace,\n hasTemplates: fields.hasTemplates,\n };\n}\n\nfunction deferredAgentStepConfig(\n params: ResolveAgentStepConfigParams,\n fields: AgentFieldResolutions,\n): AgentStepConfig {\n const {step} = params;\n return {\n config: {},\n configPlan: {\n agent: {\n prompt: dispatchPlanField(fields.prompt),\n ...(fields.model === undefined ? {} : {model: dispatchPlanField(fields.model)}),\n ...(fields.provider === undefined ? {} : {provider: dispatchPlanField(fields.provider)}),\n ...(step.harness === undefined ? {} : {harness: step.harness}),\n ...(step.thinking === undefined ? {} : {thinking: step.thinking}),\n ...agentToolsConfig(step),\n ...materializedAgentIntegrationsConfig(params),\n },\n },\n diagnostics: fields.diagnostics,\n trace: fields.trace,\n hasTemplates: fields.hasTemplates,\n };\n}\n\nasync function agentStepConfigWithDefaults(\n step: WorkflowModelAgentStep,\n params: ResolveAgentStepConfigParams,\n fields: AgentFieldResolutions,\n): Promise<AgentStepConfig> {\n const providerValue = frozenFieldValue(fields.provider);\n const modelValue = frozenFieldValue(fields.model);\n const promptIsDeferred = fields.prompt.kind === 'residual';\n\n const resolved = await completeAgentDefaults({\n harness: step.harness,\n provider: providerValue,\n model: modelValue,\n thinking: step.thinking,\n resolveAgentDefaults: params.resolveAgentDefaults,\n definitionId: params.definitionId,\n });\n if (promptIsDeferred) {\n return {\n config: {\n provider: resolved.provider,\n model: resolved.model,\n harness: resolved.harness,\n thinking: resolved.thinking,\n },\n configPlan: {\n agent: {\n prompt: dispatchPlanField(fields.prompt),\n ...agentToolsConfig(step),\n ...materializedAgentIntegrationsConfig(params),\n },\n },\n diagnostics: fields.diagnostics,\n trace: fields.trace,\n hasTemplates: fields.hasTemplates,\n };\n }\n\n const promptValue = frozenFieldValue(fields.prompt) ?? step.prompt;\n return {\n config: {\n provider: resolved.provider,\n model: resolved.model,\n harness: resolved.harness,\n thinking: resolved.thinking,\n ...agentToolsConfig(step),\n ...materializedAgentIntegrationsConfig(params),\n prompt: promptValue,\n },\n configPlan: null,\n diagnostics: fields.diagnostics,\n trace: fields.trace,\n hasTemplates: fields.hasTemplates,\n };\n}\n\nfunction agentToolsConfig(\n step: WorkflowModelAgentStep,\n): {readonly tools: readonly string[]} | Record<string, never> {\n return step.tools === undefined ? {} : {tools: [...step.tools]};\n}\n\nfunction authoredAgentIntegrationsConfig(\n step: WorkflowModelAgentStep,\n):\n | {readonly integrations: NonNullable<WorkflowModelAgentStep['integrations']>}\n | Record<string, never> {\n return step.integrations === undefined ? {} : {integrations: step.integrations};\n}\n\nfunction materializedAgentIntegrationsConfig(params: ResolveAgentStepConfigParams):\n | {\n readonly integrations: readonly MaterializedAgentIntegrationConfigDto[];\n readonly mcpServers: readonly AgentIntegrationMcpServerConfigDto[];\n }\n | Record<string, never> {\n const integrations = materializeAgentIntegrations({\n jobKey: params.jobKey,\n stepId: params.step.id,\n integrations: params.step.integrations,\n context: params.agentToolContext,\n snapshot: params.agentToolSnapshot,\n });\n return integrations === undefined\n ? {}\n : {integrations, mcpServers: agentIntegrationMcpServers(integrations)};\n}\n\nfunction agentIntegrationMcpServers(\n integrations: readonly MaterializedAgentIntegrationConfigDto[],\n): readonly AgentIntegrationMcpServerConfigDto[] {\n return [\n {\n name: AGENT_INTEGRATION_MCP_SERVER_NAME,\n transport: AGENT_INTEGRATION_MCP_TRANSPORT,\n endpoint: AGENT_INTEGRATION_MCP_ENDPOINT,\n auth: AGENT_INTEGRATION_MCP_AUTH,\n integrations: [...integrations],\n },\n ];\n}\n\nfunction dispatchPlanField(field: FieldResolution): ResolvedField {\n const isResidual = field.kind === 'residual';\n return isResidual ? field.field : literalField(field.value);\n}\n\nfunction frozenFieldValue(field: FieldResolution | undefined): string | undefined {\n const isFrozen = field?.kind === 'frozen';\n return isFrozen ? field.value : undefined;\n}\n\nfunction resolveAgentField(params: {\n readonly field: 'agent.prompt' | 'agent.model' | 'agent.provider';\n readonly value: string;\n readonly template: ResolvedField['segments'] | undefined;\n readonly context: WorkflowEvaluationContext;\n readonly mode: StepConfigMode;\n readonly diagnostics: WorkflowStepTemplateDiagnostic[];\n readonly trace: WorkflowStepEvaluationTraceEntry[];\n readonly definitionId: string;\n}): FieldResolution {\n const hasTemplate = params.template !== undefined;\n const usesAuthoredMode = params.mode === 'authored';\n if (!hasTemplate || usesAuthoredMode) {\n return {kind: 'frozen', value: params.value};\n }\n\n const resolved = resolveStepField({\n field: params.field,\n template: {segments: params.template},\n context: params.context,\n definitionId: params.definitionId,\n errorField: params.field,\n });\n params.diagnostics.push(\n ...resolved.diagnostics.map((diagnostic) => ({...diagnostic, field: params.field})),\n );\n params.trace.push(...resolved.trace.map((entry) => ({...entry, field: params.field})));\n return fieldResolution(resolved);\n}\n\nfunction resolveOptionalAgentField(params: {\n readonly field: 'agent.prompt' | 'agent.model' | 'agent.provider';\n readonly value: string | undefined;\n readonly template: ResolvedField['segments'] | undefined;\n readonly context: WorkflowEvaluationContext;\n readonly mode: StepConfigMode;\n readonly diagnostics: WorkflowStepTemplateDiagnostic[];\n readonly trace: WorkflowStepEvaluationTraceEntry[];\n readonly definitionId: string;\n}): FieldResolution | undefined {\n const hasValue = params.value !== undefined;\n if (!hasValue) return undefined;\n return resolveAgentField({...params, value: params.value});\n}\n\nfunction fieldResolution(resolved: SiteResolvedField): FieldResolution {\n if (resolved.kind === 'residual') return {kind: 'residual', field: resolved.field};\n return {kind: 'frozen', value: resolved.value};\n}\n\nfunction readConfigString(config: Record<string, unknown>, key: string): string | undefined {\n const value = config[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction readConfigThinking(config: Record<string, unknown>): AgentThinking | undefined {\n const value = config.thinking;\n return value === 'off' ||\n value === 'minimal' ||\n value === 'low' ||\n value === 'medium' ||\n value === 'high' ||\n value === 'xhigh'\n ? value\n : undefined;\n}\n\nfunction readConfigHarness(\n config: Record<string, unknown>,\n): WorkflowModelAgentStep['harness'] | undefined {\n return config.harness === 'pi' || config.harness === 'claude' ? config.harness : undefined;\n}\n"],"names":["AGENT_INTEGRATION_MCP_AUTH","AGENT_INTEGRATION_MCP_ENDPOINT","AGENT_INTEGRATION_MCP_SERVER_NAME","AGENT_INTEGRATION_MCP_TRANSPORT","agentInterModuleContract","isInterModuleKnownError","materializeAgentIntegrations","AgentConfigUnresolvableError","completeStepFieldWithTrace","literalField","resolveStepField","resolveAgentStepConfig","params","fields","resolveAgentFields","usesAuthoredMode","mode","authoredAgentStepConfig","step","hasDeferredModelOrProvider","model","kind","provider","deferredAgentStepConfig","agentStepConfigWithDefaults","completeAgentConfig","agent","plan","undefined","prompt","readConfigString","config","completeAgentField","field","template","defaults","completeAgentDefaults","harness","readConfigHarness","thinking","readConfigThinking","resolveAgentDefaults","definitionId","tools","integrations","mcpServers","agentIntegrationMcpServers","args","resolved","errorField","context","trace","push","map","entry","value","Error","error","methods","resolveAgentConfig","code","cause","diagnostics","resolveAgentField","templates","resolveOptionalAgentField","hasTemplates","agentToolsConfig","authoredAgentIntegrationsConfig","configPlan","dispatchPlanField","materializedAgentIntegrationsConfig","providerValue","frozenFieldValue","modelValue","promptIsDeferred","promptValue","jobKey","stepId","id","agentToolContext","snapshot","agentToolSnapshot","name","transport","endpoint","auth","isResidual","isFrozen","hasTemplate","segments","diagnostic","fieldResolution","hasValue","key"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AgentInterModuleClient } from '@shipfox/api-agent-dto/inter-module';
|
|
2
|
-
import type { IntegrationsModuleClient } from '@shipfox/api-integration-core-dto';
|
|
3
|
-
import type { ProjectsModuleClient } from '@shipfox/api-projects-dto';
|
|
2
|
+
import type { IntegrationsModuleClient } from '@shipfox/api-integration-core-dto/inter-module';
|
|
3
|
+
import type { ProjectsModuleClient } from '@shipfox/api-projects-dto/inter-module';
|
|
4
4
|
import { type AgentDefaultsResolver } from '#core/agent-defaults.js';
|
|
5
5
|
import { type JobStatus, type ResolutionReason } from '#core/entities/job.js';
|
|
6
6
|
import type { JobExecutionStatus } from '#core/entities/job-execution.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job-listeners.d.ts","sourceRoot":"","sources":["../../src/db/job-listeners.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAEhF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"job-listeners.d.ts","sourceRoot":"","sources":["../../src/db/job-listeners.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAEhF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,gDAAgD,CAAC;AAC7F,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AAMjF,OAAO,EAAC,KAAK,qBAAqB,EAA8B,MAAM,yBAAyB,CAAC;AAEhG,OAAO,EAAgB,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AAC3F,OAAO,KAAK,EAAC,kBAAkB,EAAyB,MAAM,iCAAiC,CAAC;AAkChG,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAeD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,yBAAyB,CAAC,CAyFpC;AAED,MAAM,MAAM,yBAAyB,GACjC;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;CAC5B,GACD;IAAC,IAAI,EAAE,mBAAmB,CAAA;CAAC,GAC3B;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,CAAC;AAEpB,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,YAAY,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC5C,oBAAoB,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACzD,KAAK,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;CAC5C;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,yBAAyB,CAAC,CA6DpC;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsB7F;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;CAC1B,GAAG,OAAO,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAAC,CAchE;AAwFD,wBAAsB,0BAA0B,CAAC,MAAM,EAAE;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC,kBAAkB,EAAE,QAAQ,GAAG,WAAW,CAAC,CAAC;CAC7D,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhB;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAM5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/job-listeners.ts"],"sourcesContent":["import type {AgentInterModuleClient} from '@shipfox/api-agent-dto/inter-module';\nimport {readPersistedWorkflowModel} from '@shipfox/api-definitions-dto';\nimport type {IntegrationsModuleClient} from '@shipfox/api-integration-core-dto';\nimport type {ProjectsModuleClient} from '@shipfox/api-projects-dto';\nimport {\n WORKFLOWS_JOB_ACTIVATED,\n type WorkflowsJobActivatedEventDto,\n} from '@shipfox/api-workflows-dto';\nimport {and, asc, count, eq, inArray, isNull, notInArray, sql} from 'drizzle-orm';\nimport {type AgentDefaultsResolver, createAgentDefaultsResolver} from '#core/agent-defaults.js';\nimport {loadAgentToolMaterializationContext} from '#core/agent-tools.js';\nimport {isJobTerminal, type JobStatus, type ResolutionReason} from '#core/entities/job.js';\nimport type {JobExecutionStatus, WorkflowExecutionEvent} from '#core/entities/job-execution.js';\nimport {type DeriveJobSuccessResult, deriveJobSuccess} from '#core/job-transition/index.js';\nimport {\n type MaterializedListenerExecution,\n materializeListenerExecution,\n} from '#core/listener-execution-materialization.js';\nimport {\n applyListenerFilterSnapshots,\n assembleListenerSnapshotContext,\n type ListenerTriggerWithSnapshot,\n planListenerFilterSnapshots,\n} from '#core/step-config/assemble-run-context.js';\nimport {\n recordListenerEventsCoalesced,\n recordWorkflowJobExecutionStatusChanged,\n recordWorkflowListenerResolved,\n} from '#metrics/instance.js';\nimport {db, type Tx} from './db.js';\nimport {writeWorkflowsOutboxEvent} from './outbox-writes.js';\nimport {type JobExecutionDb, jobExecutions, toJobExecution} from './schema/job-executions.js';\nimport {type JobListenerEventDb, jobListenerEvents} from './schema/job-listener-events.js';\nimport {jobs, toJob} from './schema/jobs.js';\nimport {steps} from './schema/steps.js';\nimport {workflowRunAttempts} from './schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from './schema/workflow-runs.js';\nimport {\n bulkUpdateStepStatuses,\n getDirectDependencyJobContexts,\n updateJobStatusAtVersion,\n} from './workflow-runs.js';\n\nconst TERMINAL_EXECUTION_STATUSES: JobExecutionStatus[] = ['succeeded', 'failed', 'cancelled'];\nconst MAX_LISTENER_RESOLUTION_ATTEMPTS = 3;\n\nexport interface ActivateJobListenerParams {\n jobId: string;\n expectedVersion: number;\n}\n\nexport interface ActivateJobListenerResult {\n status: 'running' | 'terminal';\n jobStatus: JobStatus;\n jobVersion: number;\n executionCount: number;\n}\n\ntype JobActivatedListenerMatcher = Extract<\n WorkflowsJobActivatedEventDto,\n {mode: 'listening'}\n>['on'][number] &\n ListenerTriggerWithSnapshot;\n\nfunction applyActivatedListenerFilterSnapshots(\n plans: Parameters<typeof applyListenerFilterSnapshots>[0],\n context: Parameters<typeof applyListenerFilterSnapshots>[1],\n): JobActivatedListenerMatcher[] {\n return applyListenerFilterSnapshots(plans, context);\n}\n\nexport async function activateJobListener(\n params: ActivateJobListenerParams,\n): Promise<ActivateJobListenerResult> {\n return await db().transaction(async (tx) => {\n const [target] = await tx\n .select({job: jobs, run: workflowRuns})\n .from(jobs)\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobs.id, params.jobId))\n .limit(1)\n .for('update');\n if (!target) throw new Error(`Job not found: ${params.jobId}`);\n\n const [{value: executionCount} = {value: 0}] = await tx\n .select({value: count()})\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, params.jobId));\n\n if (['succeeded', 'failed', 'cancelled', 'skipped'].includes(target.job.status)) {\n return {\n status: 'terminal',\n jobStatus: target.job.status,\n jobVersion: target.job.version,\n executionCount,\n };\n }\n\n let job = toJob(target.job);\n if (target.job.status === 'pending') {\n const updated = await updateJobStatusAtVersion(tx, {\n jobId: params.jobId,\n status: 'running',\n expectedVersion: params.expectedVersion,\n });\n if (!updated) {\n const [existing] = await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1);\n if (existing?.status !== 'running') {\n throw new Error(\n `Optimistic lock failure activating listener job ${params.jobId} version ${params.expectedVersion}`,\n );\n }\n job = toJob(existing);\n } else {\n job = updated.job;\n }\n }\n\n const listenerRows = await tx\n .update(jobs)\n .set({listenerStatus: 'listening', updatedAt: new Date()})\n .where(and(eq(jobs.id, params.jobId), eq(jobs.listenerStatus, 'inactive')))\n .returning();\n\n if (listenerRows[0]) {\n const matchers = {\n on: target.job.listeningOn ?? [],\n until: target.job.listeningUntil ?? null,\n };\n const snapshotPlan = planListenerFilterSnapshots(matchers);\n const dependencyJobs =\n snapshotPlan.jobKeys.size === 0\n ? []\n : await getDirectDependencyJobContexts(params.jobId, tx);\n const snapshotContext = assembleListenerSnapshotContext({\n job: toJob(target.job),\n run: toWorkflowRun(target.run),\n triggerPayload: target.run.triggerPayload,\n inputs: target.run.inputs,\n plan: snapshotPlan,\n dependencyJobs,\n });\n\n await writeWorkflowsOutboxEvent(tx, {\n type: WORKFLOWS_JOB_ACTIVATED,\n payload: {\n jobId: params.jobId,\n workflowRunId: target.run.id,\n workspaceId: target.run.workspaceId,\n mode: 'listening',\n on: applyActivatedListenerFilterSnapshots(snapshotPlan.on, snapshotContext),\n until:\n matchers.until === null\n ? null\n : applyActivatedListenerFilterSnapshots(snapshotPlan.until, snapshotContext),\n },\n });\n }\n\n return {status: 'running', jobStatus: job.status, jobVersion: job.version, executionCount};\n });\n}\n\nexport type DrainListenerEventsResult =\n | {\n kind: 'execution';\n jobExecutionId: string;\n executionVersion: number;\n sequence: number;\n requiredLabels: string[];\n status: JobExecutionStatus;\n }\n | {kind: 'resolve-requested'}\n | {kind: 'empty'};\n\nexport interface DrainListenerEventsParams {\n jobId: string;\n expectedSequence: number;\n maxSize?: number | undefined;\n integrations?: IntegrationsModuleClient | undefined;\n projects?: ProjectsModuleClient | undefined;\n resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n agent?: AgentInterModuleClient | undefined;\n}\n\nexport async function drainListenerEventsIntoExecution(\n params: DrainListenerEventsParams,\n): Promise<DrainListenerEventsResult> {\n const drained = await db().transaction(async (tx) => {\n const existing = await findExistingExecution(params, tx);\n if (existing) return {result: existing};\n\n const resolveRequested = await hasPendingResolveEvent(params.jobId, tx);\n if (resolveRequested) return {result: {kind: 'resolve-requested' as const}};\n\n const bufferedEvents = await lockBufferedFireEvents(params, tx);\n if (bufferedEvents.length === 0) return {result: {kind: 'empty' as const}};\n\n const target = await loadListenerMaterializationTarget(params.jobId, tx);\n const model =\n target.attempt.model === null ? null : readPersistedWorkflowModel(target.attempt.model);\n const agentToolContext =\n target.attempt.agentToolMaterialization === null\n ? await loadAgentToolMaterializationContext({\n model,\n workspaceId: target.run.workspaceId,\n projectId: target.run.projectId,\n integrations: params.integrations,\n projects: params.projects,\n })\n : undefined;\n const materialized = await materializeListenerExecution({\n model,\n run: toWorkflowRun(target.run),\n job: toJob(target.job),\n sequence: params.expectedSequence,\n triggerEvents: listenerTriggerEvents(bufferedEvents),\n priorExecutions: target.priorExecutions,\n resolveAgentDefaults:\n params.resolveAgentDefaults ??\n (params.agent\n ? createAgentDefaultsResolver(params.agent, target.run.workspaceId)\n : undefined),\n agentToolContext,\n agentToolSnapshot: target.attempt.agentToolMaterialization,\n });\n const execution = await persistMaterializedListenerExecution(tx, {\n jobId: params.jobId,\n sequence: params.expectedSequence,\n bufferedEventIds: bufferedEvents.map((event) => event.id),\n materialized,\n });\n\n if (materialized.status === 'failed') {\n recordWorkflowJobExecutionStatusChanged(materialized.status);\n }\n\n return {\n result: drainExecutionResult(execution),\n batchSize: bufferedEvents.length,\n };\n });\n\n if (drained.result.kind === 'execution' && drained.batchSize !== undefined) {\n recordListenerEventsCoalesced(drained.batchSize);\n }\n\n return drained.result;\n}\n\nexport interface ListenerBufferPeek {\n fireCount: number;\n resolvePending: boolean;\n oldestAgeMs: number;\n newestAgeMs: number;\n}\n\nexport async function peekListenerBuffer(params: {jobId: string}): Promise<ListenerBufferPeek> {\n const [row] = await db()\n .select({\n fireCount: sql<number>`count(*) filter (where ${jobListenerEvents.disposition} = 'fire')::integer`,\n resolvePending: sql<boolean>`coalesce(bool_or(${jobListenerEvents.disposition} = 'resolve'), false)`,\n oldestAgeMs: sql<number>`coalesce(floor(extract(epoch from (statement_timestamp() - min(${jobListenerEvents.receivedAt}) filter (where ${jobListenerEvents.disposition} = 'fire'))) * 1000), 0)::integer`,\n newestAgeMs: sql<number>`coalesce(floor(extract(epoch from (statement_timestamp() - max(${jobListenerEvents.receivedAt}) filter (where ${jobListenerEvents.disposition} = 'fire'))) * 1000), 0)::integer`,\n })\n .from(jobListenerEvents)\n .where(\n and(\n eq(jobListenerEvents.jobId, params.jobId),\n isNull(jobListenerEvents.consumedByExecutionId),\n ),\n );\n\n return {\n fireCount: row?.fireCount ?? 0,\n resolvePending: row?.resolvePending ?? false,\n oldestAgeMs: row?.oldestAgeMs ?? 0,\n newestAgeMs: row?.newestAgeMs ?? 0,\n };\n}\n\nexport async function resolveJobListener(params: {\n jobId: string;\n reason: ResolutionReason;\n}): Promise<{status: 'succeeded' | 'failed'; jobVersion: number}> {\n let result: ApplyJobListenerResolutionResult | undefined;\n for (let attempt = 0; attempt < MAX_LISTENER_RESOLUTION_ATTEMPTS; attempt += 1) {\n const decision = await deriveJobListenerResolutionDecision(params.jobId);\n result = await applyJobListenerResolution(params, decision);\n if (result.kind === 'applied') break;\n }\n\n if (result?.kind !== 'applied') {\n throw new Error(`Optimistic lock failure resolving listener job ${params.jobId}`);\n }\n\n if (result.changed) recordWorkflowListenerResolved(params.reason);\n return {status: result.status, jobVersion: result.jobVersion};\n}\n\ntype JobListenerResolutionDecision = DeriveJobSuccessResult & {\n expectedVersion: number;\n};\n\ntype ApplyJobListenerResolutionResult =\n | {\n kind: 'applied';\n status: 'succeeded' | 'failed';\n jobVersion: number;\n changed: boolean;\n }\n | {kind: 'stale'};\n\nasync function deriveJobListenerResolutionDecision(\n jobId: string,\n): Promise<JobListenerResolutionDecision> {\n const [jobRow] = await db().select().from(jobs).where(eq(jobs.id, jobId)).limit(1);\n if (!jobRow) throw new Error(`Job not found: ${jobId}`);\n\n const [executionRows, dependencyJobs] = await Promise.all([\n db()\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id)),\n getDirectDependencyJobContexts(jobId),\n ]);\n return {\n expectedVersion: jobRow.version,\n ...deriveJobSuccess({\n success: jobRow.success,\n executions: executionRows.map(toJobExecution),\n jobs: dependencyJobs,\n }),\n };\n}\n\nasync function applyJobListenerResolution(\n params: {\n jobId: string;\n reason: ResolutionReason;\n },\n decision: JobListenerResolutionDecision,\n): Promise<ApplyJobListenerResolutionResult> {\n return await db().transaction(async (tx) => {\n const [jobRow] = await tx\n .select()\n .from(jobs)\n .where(eq(jobs.id, params.jobId))\n .limit(1)\n .for('update');\n if (!jobRow) throw new Error(`Job not found: ${params.jobId}`);\n\n if (jobRow.version !== decision.expectedVersion && !isJobTerminal(jobRow.status)) {\n return {kind: 'stale' as const};\n }\n\n const listenerRows = await tx\n .update(jobs)\n .set({\n listenerStatus: 'resolved',\n resolutionReason: params.reason,\n updatedAt: new Date(),\n })\n .where(and(eq(jobs.id, params.jobId), notInArray(jobs.listenerStatus, ['resolved'])))\n .returning({id: jobs.id});\n\n const updated = await updateJobStatusAtVersion(tx, {\n jobId: params.jobId,\n status: decision.status,\n expectedVersion: decision.expectedVersion,\n statusReason: decision.statusReason,\n evaluationTrace: decision.trace,\n });\n const job = updated?.job ?? toJob(jobRow);\n const resolvedStatus: 'succeeded' | 'failed' =\n job.status === 'succeeded' ? 'succeeded' : 'failed';\n return {\n kind: 'applied' as const,\n status: resolvedStatus,\n jobVersion: job.version,\n changed: listenerRows.length > 0 || updated?.changed === true,\n };\n });\n}\n\nexport async function settleListenerJobExecution(params: {\n jobExecutionId: string;\n status: Extract<JobExecutionStatus, 'failed' | 'cancelled'>;\n}): Promise<void> {\n const changed = await db().transaction(async (tx) => {\n const [execution] = await tx\n .update(jobExecutions)\n .set({\n status: params.status,\n statusReason: params.status === 'failed' ? 'step_failed' : 'run_cancelled',\n version: sql`${jobExecutions.version} + 1`,\n updatedAt: new Date(),\n finishedAt: sql`now()`,\n })\n .where(\n and(\n eq(jobExecutions.id, params.jobExecutionId),\n notInArray(jobExecutions.status, TERMINAL_EXECUTION_STATUSES),\n ),\n )\n .returning();\n if (!execution) return false;\n await bulkUpdateStepStatuses(\n {jobExecutionId: params.jobExecutionId, status: params.status},\n tx,\n );\n return true;\n });\n\n if (changed) {\n recordWorkflowJobExecutionStatusChanged(params.status);\n }\n}\n\nexport async function countActiveListeners(): Promise<number> {\n const [row] = await db()\n .select({value: count()})\n .from(jobs)\n .where(eq(jobs.listenerStatus, 'listening'));\n return row?.value ?? 0;\n}\n\nasync function findExistingExecution(\n params: DrainListenerEventsParams,\n tx: Tx,\n): Promise<Extract<DrainListenerEventsResult, {kind: 'execution'}> | undefined> {\n const [existing] = await tx\n .select()\n .from(jobExecutions)\n .where(\n and(\n eq(jobExecutions.jobId, params.jobId),\n eq(jobExecutions.sequence, params.expectedSequence),\n ),\n )\n .limit(1);\n if (!existing) return undefined;\n return drainExecutionResult(existing);\n}\n\nasync function hasPendingResolveEvent(jobId: string, tx: Tx): Promise<boolean> {\n const [resolveEvent] = await tx\n .select({id: jobListenerEvents.id})\n .from(jobListenerEvents)\n .where(\n and(\n eq(jobListenerEvents.jobId, jobId),\n eq(jobListenerEvents.disposition, 'resolve'),\n isNull(jobListenerEvents.consumedByExecutionId),\n ),\n )\n .orderBy(asc(jobListenerEvents.receivedAt), asc(jobListenerEvents.id))\n .limit(1)\n .for('update');\n return resolveEvent !== undefined;\n}\n\nasync function lockBufferedFireEvents(\n params: DrainListenerEventsParams,\n tx: Tx,\n): Promise<JobListenerEventDb[]> {\n const bufferedQuery = tx\n .select()\n .from(jobListenerEvents)\n .where(\n and(\n eq(jobListenerEvents.jobId, params.jobId),\n eq(jobListenerEvents.disposition, 'fire'),\n isNull(jobListenerEvents.consumedByExecutionId),\n ),\n )\n .orderBy(asc(jobListenerEvents.receivedAt), asc(jobListenerEvents.id));\n return await (params.maxSize === undefined\n ? bufferedQuery\n : bufferedQuery.limit(params.maxSize)\n ).for('update');\n}\n\nfunction listenerTriggerEvents(\n bufferedEvents: readonly JobListenerEventDb[],\n): WorkflowExecutionEvent[] {\n return bufferedEvents.map((event) => ({\n source: event.source,\n event: event.event,\n delivery_id: event.deliveryId,\n received_at: event.receivedAt.toISOString(),\n data: event.payload,\n }));\n}\n\nasync function persistMaterializedListenerExecution(\n tx: Tx,\n params: {\n readonly jobId: string;\n readonly sequence: number;\n readonly bufferedEventIds: readonly string[];\n readonly materialized: MaterializedListenerExecution;\n },\n): Promise<JobExecutionDb> {\n const [execution] = await tx\n .insert(jobExecutions)\n .values({\n jobId: params.jobId,\n sequence: params.sequence,\n name: params.materialized.name,\n runner: params.materialized.runner.length === 0 ? null : [...params.materialized.runner],\n status: params.materialized.status,\n statusReason: params.materialized.statusReason,\n triggerEvents: [...params.materialized.triggerEvents],\n evaluationTrace: params.materialized.evaluationTrace,\n ...(params.materialized.status === 'failed' ? {finishedAt: sql`now()`} : {}),\n })\n .returning();\n if (!execution) throw new Error('Insert returned no rows');\n\n await tx\n .update(jobListenerEvents)\n .set({consumedByExecutionId: execution.id})\n .where(inArray(jobListenerEvents.id, [...params.bufferedEventIds]));\n\n if (params.materialized.status === 'pending' && params.materialized.steps.length > 0) {\n await tx.insert(steps).values(\n params.materialized.steps.map((step) => ({\n jobExecutionId: execution.id,\n key: step.key,\n name: step.name,\n sourceLocation: step.sourceLocation,\n status: step.status,\n type: step.type,\n config: step.config,\n configPlan: step.configPlan ?? null,\n authoredConfig: step.authoredConfig,\n condition: step.condition ?? null,\n position: step.position,\n })),\n );\n }\n\n return execution;\n}\n\nfunction drainExecutionResult(\n execution: JobExecutionDb,\n): Extract<DrainListenerEventsResult, {kind: 'execution'}> {\n return {\n kind: 'execution',\n jobExecutionId: execution.id,\n executionVersion: execution.version,\n sequence: execution.sequence,\n requiredLabels: execution.runner ?? [],\n status: execution.status,\n };\n}\n\nasync function loadListenerMaterializationTarget(jobId: string, tx: Tx) {\n const [target] = await tx\n .select({job: jobs, attempt: workflowRunAttempts, run: workflowRuns})\n .from(jobs)\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobs.id, jobId))\n .limit(1)\n .for('update');\n if (!target) throw new Error(`Job not found: ${jobId}`);\n\n const priorExecutions = await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return {...target, priorExecutions: priorExecutions.map(toJobExecution)};\n}\n"],"names":["readPersistedWorkflowModel","WORKFLOWS_JOB_ACTIVATED","and","asc","count","eq","inArray","isNull","notInArray","sql","createAgentDefaultsResolver","loadAgentToolMaterializationContext","isJobTerminal","deriveJobSuccess","materializeListenerExecution","applyListenerFilterSnapshots","assembleListenerSnapshotContext","planListenerFilterSnapshots","recordListenerEventsCoalesced","recordWorkflowJobExecutionStatusChanged","recordWorkflowListenerResolved","db","writeWorkflowsOutboxEvent","jobExecutions","toJobExecution","jobListenerEvents","jobs","toJob","steps","workflowRunAttempts","toWorkflowRun","workflowRuns","bulkUpdateStepStatuses","getDirectDependencyJobContexts","updateJobStatusAtVersion","TERMINAL_EXECUTION_STATUSES","MAX_LISTENER_RESOLUTION_ATTEMPTS","applyActivatedListenerFilterSnapshots","plans","context","activateJobListener","params","transaction","tx","target","select","job","run","from","innerJoin","workflowRunAttemptId","id","workflowRunId","where","jobId","limit","for","Error","value","executionCount","includes","status","jobStatus","jobVersion","version","updated","expectedVersion","existing","listenerRows","update","set","listenerStatus","updatedAt","Date","returning","matchers","on","listeningOn","until","listeningUntil","snapshotPlan","dependencyJobs","jobKeys","size","snapshotContext","triggerPayload","inputs","plan","type","payload","workspaceId","mode","drainListenerEventsIntoExecution","drained","findExistingExecution","result","resolveRequested","hasPendingResolveEvent","kind","bufferedEvents","lockBufferedFireEvents","length","loadListenerMaterializationTarget","model","attempt","agentToolContext","agentToolMaterialization","projectId","integrations","projects","undefined","materialized","sequence","expectedSequence","triggerEvents","listenerTriggerEvents","priorExecutions","resolveAgentDefaults","agent","agentToolSnapshot","execution","persistMaterializedListenerExecution","bufferedEventIds","map","event","drainExecutionResult","batchSize","peekListenerBuffer","row","fireCount","disposition","resolvePending","oldestAgeMs","receivedAt","newestAgeMs","consumedByExecutionId","resolveJobListener","decision","deriveJobListenerResolutionDecision","applyJobListenerResolution","changed","reason","jobRow","executionRows","Promise","all","orderBy","success","executions","resolutionReason","statusReason","evaluationTrace","trace","resolvedStatus","settleListenerJobExecution","finishedAt","jobExecutionId","countActiveListeners","resolveEvent","bufferedQuery","maxSize","source","delivery_id","deliveryId","received_at","toISOString","data","insert","values","name","runner","step","key","sourceLocation","config","configPlan","authoredConfig","condition","position","executionVersion","requiredLabels"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/db/job-listeners.ts"],"sourcesContent":["import type {AgentInterModuleClient} from '@shipfox/api-agent-dto/inter-module';\nimport {readPersistedWorkflowModel} from '@shipfox/api-definitions-dto';\nimport type {IntegrationsModuleClient} from '@shipfox/api-integration-core-dto/inter-module';\nimport type {ProjectsModuleClient} from '@shipfox/api-projects-dto/inter-module';\nimport {\n WORKFLOWS_JOB_ACTIVATED,\n type WorkflowsJobActivatedEventDto,\n} from '@shipfox/api-workflows-dto';\nimport {and, asc, count, eq, inArray, isNull, notInArray, sql} from 'drizzle-orm';\nimport {type AgentDefaultsResolver, createAgentDefaultsResolver} from '#core/agent-defaults.js';\nimport {loadAgentToolMaterializationContext} from '#core/agent-tools.js';\nimport {isJobTerminal, type JobStatus, type ResolutionReason} from '#core/entities/job.js';\nimport type {JobExecutionStatus, WorkflowExecutionEvent} from '#core/entities/job-execution.js';\nimport {type DeriveJobSuccessResult, deriveJobSuccess} from '#core/job-transition/index.js';\nimport {\n type MaterializedListenerExecution,\n materializeListenerExecution,\n} from '#core/listener-execution-materialization.js';\nimport {\n applyListenerFilterSnapshots,\n assembleListenerSnapshotContext,\n type ListenerTriggerWithSnapshot,\n planListenerFilterSnapshots,\n} from '#core/step-config/assemble-run-context.js';\nimport {\n recordListenerEventsCoalesced,\n recordWorkflowJobExecutionStatusChanged,\n recordWorkflowListenerResolved,\n} from '#metrics/instance.js';\nimport {db, type Tx} from './db.js';\nimport {writeWorkflowsOutboxEvent} from './outbox-writes.js';\nimport {type JobExecutionDb, jobExecutions, toJobExecution} from './schema/job-executions.js';\nimport {type JobListenerEventDb, jobListenerEvents} from './schema/job-listener-events.js';\nimport {jobs, toJob} from './schema/jobs.js';\nimport {steps} from './schema/steps.js';\nimport {workflowRunAttempts} from './schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from './schema/workflow-runs.js';\nimport {\n bulkUpdateStepStatuses,\n getDirectDependencyJobContexts,\n updateJobStatusAtVersion,\n} from './workflow-runs.js';\n\nconst TERMINAL_EXECUTION_STATUSES: JobExecutionStatus[] = ['succeeded', 'failed', 'cancelled'];\nconst MAX_LISTENER_RESOLUTION_ATTEMPTS = 3;\n\nexport interface ActivateJobListenerParams {\n jobId: string;\n expectedVersion: number;\n}\n\nexport interface ActivateJobListenerResult {\n status: 'running' | 'terminal';\n jobStatus: JobStatus;\n jobVersion: number;\n executionCount: number;\n}\n\ntype JobActivatedListenerMatcher = Extract<\n WorkflowsJobActivatedEventDto,\n {mode: 'listening'}\n>['on'][number] &\n ListenerTriggerWithSnapshot;\n\nfunction applyActivatedListenerFilterSnapshots(\n plans: Parameters<typeof applyListenerFilterSnapshots>[0],\n context: Parameters<typeof applyListenerFilterSnapshots>[1],\n): JobActivatedListenerMatcher[] {\n return applyListenerFilterSnapshots(plans, context);\n}\n\nexport async function activateJobListener(\n params: ActivateJobListenerParams,\n): Promise<ActivateJobListenerResult> {\n return await db().transaction(async (tx) => {\n const [target] = await tx\n .select({job: jobs, run: workflowRuns})\n .from(jobs)\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobs.id, params.jobId))\n .limit(1)\n .for('update');\n if (!target) throw new Error(`Job not found: ${params.jobId}`);\n\n const [{value: executionCount} = {value: 0}] = await tx\n .select({value: count()})\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, params.jobId));\n\n if (['succeeded', 'failed', 'cancelled', 'skipped'].includes(target.job.status)) {\n return {\n status: 'terminal',\n jobStatus: target.job.status,\n jobVersion: target.job.version,\n executionCount,\n };\n }\n\n let job = toJob(target.job);\n if (target.job.status === 'pending') {\n const updated = await updateJobStatusAtVersion(tx, {\n jobId: params.jobId,\n status: 'running',\n expectedVersion: params.expectedVersion,\n });\n if (!updated) {\n const [existing] = await tx.select().from(jobs).where(eq(jobs.id, params.jobId)).limit(1);\n if (existing?.status !== 'running') {\n throw new Error(\n `Optimistic lock failure activating listener job ${params.jobId} version ${params.expectedVersion}`,\n );\n }\n job = toJob(existing);\n } else {\n job = updated.job;\n }\n }\n\n const listenerRows = await tx\n .update(jobs)\n .set({listenerStatus: 'listening', updatedAt: new Date()})\n .where(and(eq(jobs.id, params.jobId), eq(jobs.listenerStatus, 'inactive')))\n .returning();\n\n if (listenerRows[0]) {\n const matchers = {\n on: target.job.listeningOn ?? [],\n until: target.job.listeningUntil ?? null,\n };\n const snapshotPlan = planListenerFilterSnapshots(matchers);\n const dependencyJobs =\n snapshotPlan.jobKeys.size === 0\n ? []\n : await getDirectDependencyJobContexts(params.jobId, tx);\n const snapshotContext = assembleListenerSnapshotContext({\n job: toJob(target.job),\n run: toWorkflowRun(target.run),\n triggerPayload: target.run.triggerPayload,\n inputs: target.run.inputs,\n plan: snapshotPlan,\n dependencyJobs,\n });\n\n await writeWorkflowsOutboxEvent(tx, {\n type: WORKFLOWS_JOB_ACTIVATED,\n payload: {\n jobId: params.jobId,\n workflowRunId: target.run.id,\n workspaceId: target.run.workspaceId,\n mode: 'listening',\n on: applyActivatedListenerFilterSnapshots(snapshotPlan.on, snapshotContext),\n until:\n matchers.until === null\n ? null\n : applyActivatedListenerFilterSnapshots(snapshotPlan.until, snapshotContext),\n },\n });\n }\n\n return {status: 'running', jobStatus: job.status, jobVersion: job.version, executionCount};\n });\n}\n\nexport type DrainListenerEventsResult =\n | {\n kind: 'execution';\n jobExecutionId: string;\n executionVersion: number;\n sequence: number;\n requiredLabels: string[];\n status: JobExecutionStatus;\n }\n | {kind: 'resolve-requested'}\n | {kind: 'empty'};\n\nexport interface DrainListenerEventsParams {\n jobId: string;\n expectedSequence: number;\n maxSize?: number | undefined;\n integrations?: IntegrationsModuleClient | undefined;\n projects?: ProjectsModuleClient | undefined;\n resolveAgentDefaults?: AgentDefaultsResolver | undefined;\n agent?: AgentInterModuleClient | undefined;\n}\n\nexport async function drainListenerEventsIntoExecution(\n params: DrainListenerEventsParams,\n): Promise<DrainListenerEventsResult> {\n const drained = await db().transaction(async (tx) => {\n const existing = await findExistingExecution(params, tx);\n if (existing) return {result: existing};\n\n const resolveRequested = await hasPendingResolveEvent(params.jobId, tx);\n if (resolveRequested) return {result: {kind: 'resolve-requested' as const}};\n\n const bufferedEvents = await lockBufferedFireEvents(params, tx);\n if (bufferedEvents.length === 0) return {result: {kind: 'empty' as const}};\n\n const target = await loadListenerMaterializationTarget(params.jobId, tx);\n const model =\n target.attempt.model === null ? null : readPersistedWorkflowModel(target.attempt.model);\n const agentToolContext =\n target.attempt.agentToolMaterialization === null\n ? await loadAgentToolMaterializationContext({\n model,\n workspaceId: target.run.workspaceId,\n projectId: target.run.projectId,\n integrations: params.integrations,\n projects: params.projects,\n })\n : undefined;\n const materialized = await materializeListenerExecution({\n model,\n run: toWorkflowRun(target.run),\n job: toJob(target.job),\n sequence: params.expectedSequence,\n triggerEvents: listenerTriggerEvents(bufferedEvents),\n priorExecutions: target.priorExecutions,\n resolveAgentDefaults:\n params.resolveAgentDefaults ??\n (params.agent\n ? createAgentDefaultsResolver(params.agent, target.run.workspaceId)\n : undefined),\n agentToolContext,\n agentToolSnapshot: target.attempt.agentToolMaterialization,\n });\n const execution = await persistMaterializedListenerExecution(tx, {\n jobId: params.jobId,\n sequence: params.expectedSequence,\n bufferedEventIds: bufferedEvents.map((event) => event.id),\n materialized,\n });\n\n if (materialized.status === 'failed') {\n recordWorkflowJobExecutionStatusChanged(materialized.status);\n }\n\n return {\n result: drainExecutionResult(execution),\n batchSize: bufferedEvents.length,\n };\n });\n\n if (drained.result.kind === 'execution' && drained.batchSize !== undefined) {\n recordListenerEventsCoalesced(drained.batchSize);\n }\n\n return drained.result;\n}\n\nexport interface ListenerBufferPeek {\n fireCount: number;\n resolvePending: boolean;\n oldestAgeMs: number;\n newestAgeMs: number;\n}\n\nexport async function peekListenerBuffer(params: {jobId: string}): Promise<ListenerBufferPeek> {\n const [row] = await db()\n .select({\n fireCount: sql<number>`count(*) filter (where ${jobListenerEvents.disposition} = 'fire')::integer`,\n resolvePending: sql<boolean>`coalesce(bool_or(${jobListenerEvents.disposition} = 'resolve'), false)`,\n oldestAgeMs: sql<number>`coalesce(floor(extract(epoch from (statement_timestamp() - min(${jobListenerEvents.receivedAt}) filter (where ${jobListenerEvents.disposition} = 'fire'))) * 1000), 0)::integer`,\n newestAgeMs: sql<number>`coalesce(floor(extract(epoch from (statement_timestamp() - max(${jobListenerEvents.receivedAt}) filter (where ${jobListenerEvents.disposition} = 'fire'))) * 1000), 0)::integer`,\n })\n .from(jobListenerEvents)\n .where(\n and(\n eq(jobListenerEvents.jobId, params.jobId),\n isNull(jobListenerEvents.consumedByExecutionId),\n ),\n );\n\n return {\n fireCount: row?.fireCount ?? 0,\n resolvePending: row?.resolvePending ?? false,\n oldestAgeMs: row?.oldestAgeMs ?? 0,\n newestAgeMs: row?.newestAgeMs ?? 0,\n };\n}\n\nexport async function resolveJobListener(params: {\n jobId: string;\n reason: ResolutionReason;\n}): Promise<{status: 'succeeded' | 'failed'; jobVersion: number}> {\n let result: ApplyJobListenerResolutionResult | undefined;\n for (let attempt = 0; attempt < MAX_LISTENER_RESOLUTION_ATTEMPTS; attempt += 1) {\n const decision = await deriveJobListenerResolutionDecision(params.jobId);\n result = await applyJobListenerResolution(params, decision);\n if (result.kind === 'applied') break;\n }\n\n if (result?.kind !== 'applied') {\n throw new Error(`Optimistic lock failure resolving listener job ${params.jobId}`);\n }\n\n if (result.changed) recordWorkflowListenerResolved(params.reason);\n return {status: result.status, jobVersion: result.jobVersion};\n}\n\ntype JobListenerResolutionDecision = DeriveJobSuccessResult & {\n expectedVersion: number;\n};\n\ntype ApplyJobListenerResolutionResult =\n | {\n kind: 'applied';\n status: 'succeeded' | 'failed';\n jobVersion: number;\n changed: boolean;\n }\n | {kind: 'stale'};\n\nasync function deriveJobListenerResolutionDecision(\n jobId: string,\n): Promise<JobListenerResolutionDecision> {\n const [jobRow] = await db().select().from(jobs).where(eq(jobs.id, jobId)).limit(1);\n if (!jobRow) throw new Error(`Job not found: ${jobId}`);\n\n const [executionRows, dependencyJobs] = await Promise.all([\n db()\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id)),\n getDirectDependencyJobContexts(jobId),\n ]);\n return {\n expectedVersion: jobRow.version,\n ...deriveJobSuccess({\n success: jobRow.success,\n executions: executionRows.map(toJobExecution),\n jobs: dependencyJobs,\n }),\n };\n}\n\nasync function applyJobListenerResolution(\n params: {\n jobId: string;\n reason: ResolutionReason;\n },\n decision: JobListenerResolutionDecision,\n): Promise<ApplyJobListenerResolutionResult> {\n return await db().transaction(async (tx) => {\n const [jobRow] = await tx\n .select()\n .from(jobs)\n .where(eq(jobs.id, params.jobId))\n .limit(1)\n .for('update');\n if (!jobRow) throw new Error(`Job not found: ${params.jobId}`);\n\n if (jobRow.version !== decision.expectedVersion && !isJobTerminal(jobRow.status)) {\n return {kind: 'stale' as const};\n }\n\n const listenerRows = await tx\n .update(jobs)\n .set({\n listenerStatus: 'resolved',\n resolutionReason: params.reason,\n updatedAt: new Date(),\n })\n .where(and(eq(jobs.id, params.jobId), notInArray(jobs.listenerStatus, ['resolved'])))\n .returning({id: jobs.id});\n\n const updated = await updateJobStatusAtVersion(tx, {\n jobId: params.jobId,\n status: decision.status,\n expectedVersion: decision.expectedVersion,\n statusReason: decision.statusReason,\n evaluationTrace: decision.trace,\n });\n const job = updated?.job ?? toJob(jobRow);\n const resolvedStatus: 'succeeded' | 'failed' =\n job.status === 'succeeded' ? 'succeeded' : 'failed';\n return {\n kind: 'applied' as const,\n status: resolvedStatus,\n jobVersion: job.version,\n changed: listenerRows.length > 0 || updated?.changed === true,\n };\n });\n}\n\nexport async function settleListenerJobExecution(params: {\n jobExecutionId: string;\n status: Extract<JobExecutionStatus, 'failed' | 'cancelled'>;\n}): Promise<void> {\n const changed = await db().transaction(async (tx) => {\n const [execution] = await tx\n .update(jobExecutions)\n .set({\n status: params.status,\n statusReason: params.status === 'failed' ? 'step_failed' : 'run_cancelled',\n version: sql`${jobExecutions.version} + 1`,\n updatedAt: new Date(),\n finishedAt: sql`now()`,\n })\n .where(\n and(\n eq(jobExecutions.id, params.jobExecutionId),\n notInArray(jobExecutions.status, TERMINAL_EXECUTION_STATUSES),\n ),\n )\n .returning();\n if (!execution) return false;\n await bulkUpdateStepStatuses(\n {jobExecutionId: params.jobExecutionId, status: params.status},\n tx,\n );\n return true;\n });\n\n if (changed) {\n recordWorkflowJobExecutionStatusChanged(params.status);\n }\n}\n\nexport async function countActiveListeners(): Promise<number> {\n const [row] = await db()\n .select({value: count()})\n .from(jobs)\n .where(eq(jobs.listenerStatus, 'listening'));\n return row?.value ?? 0;\n}\n\nasync function findExistingExecution(\n params: DrainListenerEventsParams,\n tx: Tx,\n): Promise<Extract<DrainListenerEventsResult, {kind: 'execution'}> | undefined> {\n const [existing] = await tx\n .select()\n .from(jobExecutions)\n .where(\n and(\n eq(jobExecutions.jobId, params.jobId),\n eq(jobExecutions.sequence, params.expectedSequence),\n ),\n )\n .limit(1);\n if (!existing) return undefined;\n return drainExecutionResult(existing);\n}\n\nasync function hasPendingResolveEvent(jobId: string, tx: Tx): Promise<boolean> {\n const [resolveEvent] = await tx\n .select({id: jobListenerEvents.id})\n .from(jobListenerEvents)\n .where(\n and(\n eq(jobListenerEvents.jobId, jobId),\n eq(jobListenerEvents.disposition, 'resolve'),\n isNull(jobListenerEvents.consumedByExecutionId),\n ),\n )\n .orderBy(asc(jobListenerEvents.receivedAt), asc(jobListenerEvents.id))\n .limit(1)\n .for('update');\n return resolveEvent !== undefined;\n}\n\nasync function lockBufferedFireEvents(\n params: DrainListenerEventsParams,\n tx: Tx,\n): Promise<JobListenerEventDb[]> {\n const bufferedQuery = tx\n .select()\n .from(jobListenerEvents)\n .where(\n and(\n eq(jobListenerEvents.jobId, params.jobId),\n eq(jobListenerEvents.disposition, 'fire'),\n isNull(jobListenerEvents.consumedByExecutionId),\n ),\n )\n .orderBy(asc(jobListenerEvents.receivedAt), asc(jobListenerEvents.id));\n return await (params.maxSize === undefined\n ? bufferedQuery\n : bufferedQuery.limit(params.maxSize)\n ).for('update');\n}\n\nfunction listenerTriggerEvents(\n bufferedEvents: readonly JobListenerEventDb[],\n): WorkflowExecutionEvent[] {\n return bufferedEvents.map((event) => ({\n source: event.source,\n event: event.event,\n delivery_id: event.deliveryId,\n received_at: event.receivedAt.toISOString(),\n data: event.payload,\n }));\n}\n\nasync function persistMaterializedListenerExecution(\n tx: Tx,\n params: {\n readonly jobId: string;\n readonly sequence: number;\n readonly bufferedEventIds: readonly string[];\n readonly materialized: MaterializedListenerExecution;\n },\n): Promise<JobExecutionDb> {\n const [execution] = await tx\n .insert(jobExecutions)\n .values({\n jobId: params.jobId,\n sequence: params.sequence,\n name: params.materialized.name,\n runner: params.materialized.runner.length === 0 ? null : [...params.materialized.runner],\n status: params.materialized.status,\n statusReason: params.materialized.statusReason,\n triggerEvents: [...params.materialized.triggerEvents],\n evaluationTrace: params.materialized.evaluationTrace,\n ...(params.materialized.status === 'failed' ? {finishedAt: sql`now()`} : {}),\n })\n .returning();\n if (!execution) throw new Error('Insert returned no rows');\n\n await tx\n .update(jobListenerEvents)\n .set({consumedByExecutionId: execution.id})\n .where(inArray(jobListenerEvents.id, [...params.bufferedEventIds]));\n\n if (params.materialized.status === 'pending' && params.materialized.steps.length > 0) {\n await tx.insert(steps).values(\n params.materialized.steps.map((step) => ({\n jobExecutionId: execution.id,\n key: step.key,\n name: step.name,\n sourceLocation: step.sourceLocation,\n status: step.status,\n type: step.type,\n config: step.config,\n configPlan: step.configPlan ?? null,\n authoredConfig: step.authoredConfig,\n condition: step.condition ?? null,\n position: step.position,\n })),\n );\n }\n\n return execution;\n}\n\nfunction drainExecutionResult(\n execution: JobExecutionDb,\n): Extract<DrainListenerEventsResult, {kind: 'execution'}> {\n return {\n kind: 'execution',\n jobExecutionId: execution.id,\n executionVersion: execution.version,\n sequence: execution.sequence,\n requiredLabels: execution.runner ?? [],\n status: execution.status,\n };\n}\n\nasync function loadListenerMaterializationTarget(jobId: string, tx: Tx) {\n const [target] = await tx\n .select({job: jobs, attempt: workflowRunAttempts, run: workflowRuns})\n .from(jobs)\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobs.id, jobId))\n .limit(1)\n .for('update');\n if (!target) throw new Error(`Job not found: ${jobId}`);\n\n const priorExecutions = await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return {...target, priorExecutions: priorExecutions.map(toJobExecution)};\n}\n"],"names":["readPersistedWorkflowModel","WORKFLOWS_JOB_ACTIVATED","and","asc","count","eq","inArray","isNull","notInArray","sql","createAgentDefaultsResolver","loadAgentToolMaterializationContext","isJobTerminal","deriveJobSuccess","materializeListenerExecution","applyListenerFilterSnapshots","assembleListenerSnapshotContext","planListenerFilterSnapshots","recordListenerEventsCoalesced","recordWorkflowJobExecutionStatusChanged","recordWorkflowListenerResolved","db","writeWorkflowsOutboxEvent","jobExecutions","toJobExecution","jobListenerEvents","jobs","toJob","steps","workflowRunAttempts","toWorkflowRun","workflowRuns","bulkUpdateStepStatuses","getDirectDependencyJobContexts","updateJobStatusAtVersion","TERMINAL_EXECUTION_STATUSES","MAX_LISTENER_RESOLUTION_ATTEMPTS","applyActivatedListenerFilterSnapshots","plans","context","activateJobListener","params","transaction","tx","target","select","job","run","from","innerJoin","workflowRunAttemptId","id","workflowRunId","where","jobId","limit","for","Error","value","executionCount","includes","status","jobStatus","jobVersion","version","updated","expectedVersion","existing","listenerRows","update","set","listenerStatus","updatedAt","Date","returning","matchers","on","listeningOn","until","listeningUntil","snapshotPlan","dependencyJobs","jobKeys","size","snapshotContext","triggerPayload","inputs","plan","type","payload","workspaceId","mode","drainListenerEventsIntoExecution","drained","findExistingExecution","result","resolveRequested","hasPendingResolveEvent","kind","bufferedEvents","lockBufferedFireEvents","length","loadListenerMaterializationTarget","model","attempt","agentToolContext","agentToolMaterialization","projectId","integrations","projects","undefined","materialized","sequence","expectedSequence","triggerEvents","listenerTriggerEvents","priorExecutions","resolveAgentDefaults","agent","agentToolSnapshot","execution","persistMaterializedListenerExecution","bufferedEventIds","map","event","drainExecutionResult","batchSize","peekListenerBuffer","row","fireCount","disposition","resolvePending","oldestAgeMs","receivedAt","newestAgeMs","consumedByExecutionId","resolveJobListener","decision","deriveJobListenerResolutionDecision","applyJobListenerResolution","changed","reason","jobRow","executionRows","Promise","all","orderBy","success","executions","resolutionReason","statusReason","evaluationTrace","trace","resolvedStatus","settleListenerJobExecution","finishedAt","jobExecutionId","countActiveListeners","resolveEvent","bufferedQuery","maxSize","source","delivery_id","deliveryId","received_at","toISOString","data","insert","values","name","runner","step","key","sourceLocation","config","configPlan","authoredConfig","condition","position","executionVersion","requiredLabels"],"mappings":"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"}
|
|
@@ -3,11 +3,6 @@ import type { JobStatusReason } from '#core/entities/job.js';
|
|
|
3
3
|
import type { JobExecution, JobExecutionStatus } from '#core/entities/job-execution.js';
|
|
4
4
|
import type { RuntimeCompletionStatus } from '#core/workflow-scheduling/runtime-dag.js';
|
|
5
5
|
import { type Tx } from '../db.js';
|
|
6
|
-
export declare function lockActiveJobExecutionLeaseForUpdate(params: {
|
|
7
|
-
jobId: string;
|
|
8
|
-
jobExecutionId: string;
|
|
9
|
-
runnerSessionId: string;
|
|
10
|
-
}, tx: Tx): Promise<boolean>;
|
|
11
6
|
export declare function getJobExecutionById(id: string, tx?: Tx): Promise<JobExecution | undefined>;
|
|
12
7
|
export declare function getJobExecutionsByWorkflowRunAttemptId(workflowRunAttemptId: string): Promise<JobExecution[]>;
|
|
13
8
|
export declare function getJobExecutionsByJobId(jobId: string): Promise<JobExecution[]>;
|