@shipfox/api-workflows 12.4.0 → 12.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/.turbo/turbo-build.log +4 -4
  2. package/CHANGELOG.md +24 -0
  3. package/dist/core/entities/job-execution.d.ts +1 -0
  4. package/dist/core/entities/job-execution.d.ts.map +1 -1
  5. package/dist/core/entities/job-execution.js.map +1 -1
  6. package/dist/core/entities/job.d.ts +1 -1
  7. package/dist/core/entities/job.d.ts.map +1 -1
  8. package/dist/core/entities/job.js +3 -1
  9. package/dist/core/entities/job.js.map +1 -1
  10. package/dist/core/errors.d.ts +3 -1
  11. package/dist/core/errors.d.ts.map +1 -1
  12. package/dist/core/errors.js +4 -2
  13. package/dist/core/errors.js.map +1 -1
  14. package/dist/core/step-config/job-output-limits.d.ts.map +1 -1
  15. package/dist/core/step-config/job-output-limits.js +2 -2
  16. package/dist/core/step-config/job-output-limits.js.map +1 -1
  17. package/dist/core/step-config/materialize-workflow-model.js +2 -2
  18. package/dist/core/step-config/materialize-workflow-model.js.map +1 -1
  19. package/dist/db/db.d.ts +42 -8
  20. package/dist/db/db.d.ts.map +1 -1
  21. package/dist/db/index.d.ts +1 -1
  22. package/dist/db/index.d.ts.map +1 -1
  23. package/dist/db/index.js.map +1 -1
  24. package/dist/db/schema/job-executions.d.ts +19 -2
  25. package/dist/db/schema/job-executions.d.ts.map +1 -1
  26. package/dist/db/schema/job-executions.js +2 -0
  27. package/dist/db/schema/job-executions.js.map +1 -1
  28. package/dist/db/schema/jobs.d.ts +3 -3
  29. package/dist/db/schema/jobs.d.ts.map +1 -1
  30. package/dist/db/schema/jobs.js +3 -0
  31. package/dist/db/schema/jobs.js.map +1 -1
  32. package/dist/db/workflow-runs/job-executions.d.ts +7 -0
  33. package/dist/db/workflow-runs/job-executions.d.ts.map +1 -1
  34. package/dist/db/workflow-runs/job-executions.js +26 -4
  35. package/dist/db/workflow-runs/job-executions.js.map +1 -1
  36. package/dist/db/workflow-runs/jobs.d.ts.map +1 -1
  37. package/dist/db/workflow-runs/jobs.js +4 -2
  38. package/dist/db/workflow-runs/jobs.js.map +1 -1
  39. package/dist/db/workflow-runs/queries.d.ts +14 -2
  40. package/dist/db/workflow-runs/queries.d.ts.map +1 -1
  41. package/dist/db/workflow-runs/queries.js +52 -13
  42. package/dist/db/workflow-runs/queries.js.map +1 -1
  43. package/dist/db/workflow-runs.d.ts +1 -1
  44. package/dist/db/workflow-runs.d.ts.map +1 -1
  45. package/dist/db/workflow-runs.js.map +1 -1
  46. package/dist/presentation/dto/job.d.ts.map +1 -1
  47. package/dist/presentation/dto/job.js +1 -0
  48. package/dist/presentation/dto/job.js.map +1 -1
  49. package/dist/presentation/dto/workflow-run.d.ts.map +1 -1
  50. package/dist/presentation/dto/workflow-run.js +10 -2
  51. package/dist/presentation/dto/workflow-run.js.map +1 -1
  52. package/dist/presentation/subscribers/on-failure-annotations.d.ts.map +1 -1
  53. package/dist/presentation/subscribers/on-failure-annotations.js +6 -3
  54. package/dist/presentation/subscribers/on-failure-annotations.js.map +1 -1
  55. package/dist/tsconfig.test.tsbuildinfo +1 -1
  56. package/drizzle/0002_output_failure_details.sql +2 -0
  57. package/drizzle/0003_output_invalid_reason.sql +1 -0
  58. package/drizzle/meta/0002_snapshot.json +1718 -0
  59. package/drizzle/meta/0003_snapshot.json +1719 -0
  60. package/drizzle/meta/_journal.json +14 -0
  61. package/package.json +2 -2
  62. package/src/core/entities/job-execution.ts +1 -0
  63. package/src/core/entities/job.ts +2 -0
  64. package/src/core/errors.test.ts +18 -0
  65. package/src/core/errors.ts +9 -2
  66. package/src/core/step-config/job-output-limits.ts +2 -2
  67. package/src/core/step-config/materialize-workflow-model.test.ts +67 -3
  68. package/src/core/step-config/materialize-workflow-model.ts +2 -2
  69. package/src/db/index.ts +1 -0
  70. package/src/db/schema/job-executions.ts +2 -0
  71. package/src/db/schema/jobs.ts +3 -0
  72. package/src/db/workflow-runs/job-executions.test.ts +149 -4
  73. package/src/db/workflow-runs/job-executions.ts +44 -9
  74. package/src/db/workflow-runs/job-status.test.ts +30 -0
  75. package/src/db/workflow-runs/jobs.ts +5 -1
  76. package/src/db/workflow-runs/queries.test.ts +169 -2
  77. package/src/db/workflow-runs/queries.ts +86 -11
  78. package/src/db/workflow-runs.ts +1 -0
  79. package/src/presentation/dto/job.ts +1 -0
  80. package/src/presentation/dto/workflow-run.ts +6 -2
  81. package/src/presentation/subscribers/on-failure-annotations.test.ts +47 -1
  82. package/src/presentation/subscribers/on-failure-annotations.ts +10 -2
  83. package/test/helpers/workflow-runs.ts +1 -0
  84. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/db/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nexport {closeDb, db, schema} from './db.js';\nexport {\n type DeliverEventToListenerParams,\n type DeliverEventToListenerResult,\n deliverEventToListener,\n} from './job-listener-events.js';\nexport type {\n ActivateJobListenerParams,\n ActivateJobListenerResult,\n DrainListenerEventsParams,\n DrainListenerEventsResult,\n ListenerBufferPeek,\n} from './job-listeners.js';\nexport {\n activateJobListener,\n countActiveListeners,\n drainListenerEventsIntoExecution,\n peekListenerBuffer,\n resolveJobListener,\n settleListenerJobExecution,\n} from './job-listeners.js';\nexport {workflowsOutbox} from './schema/outbox.js';\nexport {workflowRunCounters} from './schema/workflow-run-counters.js';\nexport type {\n BulkUpdateStepStatusesParams,\n CancelWorkflowRunParams,\n CreateRerunWorkflowRunParams,\n CreateWorkflowRunParams,\n EvaluateJobActivationsParams,\n FailWorkflowRunAsTimedOutParams,\n JobActivationDecision,\n ListWorkflowRunsParams,\n ListWorkflowRunsResult,\n StepAttemptDetail,\n UpdateJobExecutionStatusParams,\n UpdateJobStatusParams,\n UpdateWorkflowRunStatusParams,\n WorkflowJobExecutionDepth,\n WorkflowJobExecutionDepthParams,\n WorkflowRunAggregates,\n WorkflowRunFilters,\n WorkflowRunJobStatusCount,\n WorkflowRunJobSummary,\n WorkflowRunJobSummaryTarget,\n WorkflowRunJobsSummary,\n} from './workflow-runs.js';\nexport {\n bulkUpdateStepStatuses,\n cancelWorkflowRun,\n createRerunWorkflowRun,\n createWorkflowRun,\n evaluateJobActivations,\n failJobExecutionAsTimedOut,\n failWorkflowRunAsTimedOut,\n getFirstJobExecutionByJobId,\n getJobById,\n getJobExecutionById,\n getJobExecutionDetail,\n getJobExecutionFailureOrigin,\n getJobExecutionsByJobId,\n getJobExecutionsByWorkflowRunAttemptId,\n getJobScope,\n getJobsByWorkflowRunAttemptId,\n getJobsByWorkflowRunId,\n getLatestAttempt,\n getLatestJobExecutionByJobId,\n getStepAttemptDetail,\n getStepAttempts,\n getStepAttemptsByJobIds,\n getStepById,\n getStepByIdForJobExecution,\n getStepsByJobExecutionId,\n getStepsByJobExecutionIdForUpdate,\n getWorkflowJobExecutionDepth,\n getWorkflowRunAggregates,\n getWorkflowRunAttemptById,\n getWorkflowRunByAttemptId,\n getWorkflowRunById,\n getWorkflowRunDetail,\n listRunAttempts,\n listWorkflowRunJobSummaries,\n listWorkflowRuns,\n listWorkflowRunsByProject,\n recordJobExecutionQueuedAt,\n recordJobExecutionStartedAt,\n resolveJobExecutionAfterLeaseExpiry,\n resolveJobStatusFromJobExecutions,\n updateJobExecutionStatus,\n updateJobStatus,\n updateWorkflowRunStatus,\n} from './workflow-runs.js';\n\nexport const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');\n"],"names":["dirname","resolve","fileURLToPath","closeDb","db","schema","deliverEventToListener","activateJobListener","countActiveListeners","drainListenerEventsIntoExecution","peekListenerBuffer","resolveJobListener","settleListenerJobExecution","workflowsOutbox","workflowRunCounters","bulkUpdateStepStatuses","cancelWorkflowRun","createRerunWorkflowRun","createWorkflowRun","evaluateJobActivations","failJobExecutionAsTimedOut","failWorkflowRunAsTimedOut","getFirstJobExecutionByJobId","getJobById","getJobExecutionById","getJobExecutionDetail","getJobExecutionFailureOrigin","getJobExecutionsByJobId","getJobExecutionsByWorkflowRunAttemptId","getJobScope","getJobsByWorkflowRunAttemptId","getJobsByWorkflowRunId","getLatestAttempt","getLatestJobExecutionByJobId","getStepAttemptDetail","getStepAttempts","getStepAttemptsByJobIds","getStepById","getStepByIdForJobExecution","getStepsByJobExecutionId","getStepsByJobExecutionIdForUpdate","getWorkflowJobExecutionDepth","getWorkflowRunAggregates","getWorkflowRunAttemptById","getWorkflowRunByAttemptId","getWorkflowRunById","getWorkflowRunDetail","listRunAttempts","listWorkflowRunJobSummaries","listWorkflowRuns","listWorkflowRunsByProject","recordJobExecutionQueuedAt","recordJobExecutionStartedAt","resolveJobExecutionAfterLeaseExpiry","resolveJobStatusFromJobExecutions","updateJobExecutionStatus","updateJobStatus","updateWorkflowRunStatus","migrationsPath","url"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,OAAO,QAAO,YAAY;AAC3C,SAAQC,aAAa,QAAO,WAAW;AAEvC,SAAQC,OAAO,EAAEC,EAAE,EAAEC,MAAM,QAAO,UAAU;AAC5C,SAGEC,sBAAsB,QACjB,2BAA2B;AAQlC,SACEC,mBAAmB,EACnBC,oBAAoB,EACpBC,gCAAgC,EAChCC,kBAAkB,EAClBC,kBAAkB,EAClBC,0BAA0B,QACrB,qBAAqB;AAC5B,SAAQC,eAAe,QAAO,qBAAqB;AACnD,SAAQC,mBAAmB,QAAO,oCAAoC;AAwBtE,SACEC,sBAAsB,EACtBC,iBAAiB,EACjBC,sBAAsB,EACtBC,iBAAiB,EACjBC,sBAAsB,EACtBC,0BAA0B,EAC1BC,yBAAyB,EACzBC,2BAA2B,EAC3BC,UAAU,EACVC,mBAAmB,EACnBC,qBAAqB,EACrBC,4BAA4B,EAC5BC,uBAAuB,EACvBC,sCAAsC,EACtCC,WAAW,EACXC,6BAA6B,EAC7BC,sBAAsB,EACtBC,gBAAgB,EAChBC,4BAA4B,EAC5BC,oBAAoB,EACpBC,eAAe,EACfC,uBAAuB,EACvBC,WAAW,EACXC,0BAA0B,EAC1BC,wBAAwB,EACxBC,iCAAiC,EACjCC,4BAA4B,EAC5BC,wBAAwB,EACxBC,yBAAyB,EACzBC,yBAAyB,EACzBC,kBAAkB,EAClBC,oBAAoB,EACpBC,eAAe,EACfC,2BAA2B,EAC3BC,gBAAgB,EAChBC,yBAAyB,EACzBC,0BAA0B,EAC1BC,2BAA2B,EAC3BC,mCAAmC,EACnCC,iCAAiC,EACjCC,wBAAwB,EACxBC,eAAe,EACfC,uBAAuB,QAClB,qBAAqB;AAE5B,OAAO,MAAMC,iBAAiBzD,QAAQD,QAAQE,cAAc,YAAYyD,GAAG,IAAI,iBAAiB"}
1
+ {"version":3,"sources":["../../src/db/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nexport {closeDb, db, schema} from './db.js';\nexport {\n type DeliverEventToListenerParams,\n type DeliverEventToListenerResult,\n deliverEventToListener,\n} from './job-listener-events.js';\nexport type {\n ActivateJobListenerParams,\n ActivateJobListenerResult,\n DrainListenerEventsParams,\n DrainListenerEventsResult,\n ListenerBufferPeek,\n} from './job-listeners.js';\nexport {\n activateJobListener,\n countActiveListeners,\n drainListenerEventsIntoExecution,\n peekListenerBuffer,\n resolveJobListener,\n settleListenerJobExecution,\n} from './job-listeners.js';\nexport {workflowsOutbox} from './schema/outbox.js';\nexport {workflowRunCounters} from './schema/workflow-run-counters.js';\nexport type {\n BulkUpdateStepStatusesParams,\n CancelWorkflowRunParams,\n CreateRerunWorkflowRunParams,\n CreateWorkflowRunParams,\n EvaluateJobActivationsParams,\n FailWorkflowRunAsTimedOutParams,\n JobActivationDecision,\n ListWorkflowRunsParams,\n ListWorkflowRunsResult,\n StepAttemptDetail,\n UpdateJobExecutionStatusParams,\n UpdateJobStatusParams,\n UpdateWorkflowRunStatusParams,\n WorkflowJobExecutionDepth,\n WorkflowJobExecutionDepthParams,\n WorkflowRunAggregates,\n WorkflowRunFilters,\n WorkflowRunJobRawStatusCount,\n WorkflowRunJobStatusCount,\n WorkflowRunJobSummary,\n WorkflowRunJobSummaryTarget,\n WorkflowRunJobsSummary,\n} from './workflow-runs.js';\nexport {\n bulkUpdateStepStatuses,\n cancelWorkflowRun,\n createRerunWorkflowRun,\n createWorkflowRun,\n evaluateJobActivations,\n failJobExecutionAsTimedOut,\n failWorkflowRunAsTimedOut,\n getFirstJobExecutionByJobId,\n getJobById,\n getJobExecutionById,\n getJobExecutionDetail,\n getJobExecutionFailureOrigin,\n getJobExecutionsByJobId,\n getJobExecutionsByWorkflowRunAttemptId,\n getJobScope,\n getJobsByWorkflowRunAttemptId,\n getJobsByWorkflowRunId,\n getLatestAttempt,\n getLatestJobExecutionByJobId,\n getStepAttemptDetail,\n getStepAttempts,\n getStepAttemptsByJobIds,\n getStepById,\n getStepByIdForJobExecution,\n getStepsByJobExecutionId,\n getStepsByJobExecutionIdForUpdate,\n getWorkflowJobExecutionDepth,\n getWorkflowRunAggregates,\n getWorkflowRunAttemptById,\n getWorkflowRunByAttemptId,\n getWorkflowRunById,\n getWorkflowRunDetail,\n listRunAttempts,\n listWorkflowRunJobSummaries,\n listWorkflowRuns,\n listWorkflowRunsByProject,\n recordJobExecutionQueuedAt,\n recordJobExecutionStartedAt,\n resolveJobExecutionAfterLeaseExpiry,\n resolveJobStatusFromJobExecutions,\n updateJobExecutionStatus,\n updateJobStatus,\n updateWorkflowRunStatus,\n} from './workflow-runs.js';\n\nexport const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');\n"],"names":["dirname","resolve","fileURLToPath","closeDb","db","schema","deliverEventToListener","activateJobListener","countActiveListeners","drainListenerEventsIntoExecution","peekListenerBuffer","resolveJobListener","settleListenerJobExecution","workflowsOutbox","workflowRunCounters","bulkUpdateStepStatuses","cancelWorkflowRun","createRerunWorkflowRun","createWorkflowRun","evaluateJobActivations","failJobExecutionAsTimedOut","failWorkflowRunAsTimedOut","getFirstJobExecutionByJobId","getJobById","getJobExecutionById","getJobExecutionDetail","getJobExecutionFailureOrigin","getJobExecutionsByJobId","getJobExecutionsByWorkflowRunAttemptId","getJobScope","getJobsByWorkflowRunAttemptId","getJobsByWorkflowRunId","getLatestAttempt","getLatestJobExecutionByJobId","getStepAttemptDetail","getStepAttempts","getStepAttemptsByJobIds","getStepById","getStepByIdForJobExecution","getStepsByJobExecutionId","getStepsByJobExecutionIdForUpdate","getWorkflowJobExecutionDepth","getWorkflowRunAggregates","getWorkflowRunAttemptById","getWorkflowRunByAttemptId","getWorkflowRunById","getWorkflowRunDetail","listRunAttempts","listWorkflowRunJobSummaries","listWorkflowRuns","listWorkflowRunsByProject","recordJobExecutionQueuedAt","recordJobExecutionStartedAt","resolveJobExecutionAfterLeaseExpiry","resolveJobStatusFromJobExecutions","updateJobExecutionStatus","updateJobStatus","updateWorkflowRunStatus","migrationsPath","url"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,OAAO,QAAO,YAAY;AAC3C,SAAQC,aAAa,QAAO,WAAW;AAEvC,SAAQC,OAAO,EAAEC,EAAE,EAAEC,MAAM,QAAO,UAAU;AAC5C,SAGEC,sBAAsB,QACjB,2BAA2B;AAQlC,SACEC,mBAAmB,EACnBC,oBAAoB,EACpBC,gCAAgC,EAChCC,kBAAkB,EAClBC,kBAAkB,EAClBC,0BAA0B,QACrB,qBAAqB;AAC5B,SAAQC,eAAe,QAAO,qBAAqB;AACnD,SAAQC,mBAAmB,QAAO,oCAAoC;AAyBtE,SACEC,sBAAsB,EACtBC,iBAAiB,EACjBC,sBAAsB,EACtBC,iBAAiB,EACjBC,sBAAsB,EACtBC,0BAA0B,EAC1BC,yBAAyB,EACzBC,2BAA2B,EAC3BC,UAAU,EACVC,mBAAmB,EACnBC,qBAAqB,EACrBC,4BAA4B,EAC5BC,uBAAuB,EACvBC,sCAAsC,EACtCC,WAAW,EACXC,6BAA6B,EAC7BC,sBAAsB,EACtBC,gBAAgB,EAChBC,4BAA4B,EAC5BC,oBAAoB,EACpBC,eAAe,EACfC,uBAAuB,EACvBC,WAAW,EACXC,0BAA0B,EAC1BC,wBAAwB,EACxBC,iCAAiC,EACjCC,4BAA4B,EAC5BC,wBAAwB,EACxBC,yBAAyB,EACzBC,yBAAyB,EACzBC,kBAAkB,EAClBC,oBAAoB,EACpBC,eAAe,EACfC,2BAA2B,EAC3BC,gBAAgB,EAChBC,yBAAyB,EACzBC,0BAA0B,EAC1BC,2BAA2B,EAC3BC,mCAAmC,EACnCC,iCAAiC,EACjCC,wBAAwB,EACxBC,eAAe,EACfC,uBAAuB,QAClB,qBAAqB;AAE5B,OAAO,MAAMC,iBAAiBzD,QAAQD,QAAQE,cAAc,YAAYyD,GAAG,IAAI,iBAAiB"}
@@ -114,14 +114,31 @@ export declare const jobExecutions: import("drizzle-orm/pg-core").PgTableWithCol
114
114
  tableName: "job_executions";
115
115
  dataType: "string";
116
116
  columnType: "PgEnumColumn";
117
- data: "condition_errored" | "condition_false" | "condition_rejected" | "default_gate_rejected" | "dependency_not_completed" | "run_cancelled" | "runner_lost" | "step_failed" | "timed_out" | "unknown" | "user_cancelled";
117
+ data: "condition_errored" | "condition_false" | "condition_rejected" | "default_gate_rejected" | "dependency_not_completed" | "output_invalid" | "output_too_large" | "run_cancelled" | "runner_lost" | "step_failed" | "timed_out" | "unknown" | "user_cancelled";
118
118
  driverParam: string;
119
119
  notNull: false;
120
120
  hasDefault: false;
121
121
  isPrimaryKey: false;
122
122
  isAutoincrement: false;
123
123
  hasRuntimeDefault: false;
124
- enumValues: ["dependency_not_completed", "condition_false", "default_gate_rejected", "condition_rejected", "condition_errored", "user_cancelled", "run_cancelled", "timed_out", "runner_lost", "step_failed", "unknown"];
124
+ enumValues: ["dependency_not_completed", "condition_false", "default_gate_rejected", "condition_rejected", "condition_errored", "user_cancelled", "run_cancelled", "timed_out", "runner_lost", "output_too_large", "step_failed", "unknown", "output_invalid"];
125
+ baseColumn: never;
126
+ identity: undefined;
127
+ generated: undefined;
128
+ }, {}, {}>;
129
+ statusReasonMessage: import("drizzle-orm/pg-core").PgColumn<{
130
+ name: "status_reason_message";
131
+ tableName: "job_executions";
132
+ dataType: "string";
133
+ columnType: "PgText";
134
+ data: string;
135
+ driverParam: string;
136
+ notNull: false;
137
+ hasDefault: false;
138
+ isPrimaryKey: false;
139
+ isAutoincrement: false;
140
+ hasRuntimeDefault: false;
141
+ enumValues: [string, ...string[]];
125
142
  baseColumn: never;
126
143
  identity: undefined;
127
144
  generated: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"job-executions.d.ts","sourceRoot":"","sources":["../../../src/db/schema/job-executions.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAC,6BAA6B,EAAC,MAAM,wBAAwB,CAAC;AAI1E,eAAO,MAAM,sBAAsB,kGAMjC,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCzB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAC/D,MAAM,MAAM,oBAAoB,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAErE,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,GAAG,YAAY,CAqBtF"}
1
+ {"version":3,"file":"job-executions.d.ts","sourceRoot":"","sources":["../../../src/db/schema/job-executions.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAC,6BAA6B,EAAC,MAAM,wBAAwB,CAAC;AAI1E,eAAO,MAAM,sBAAsB,kGAMjC,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCzB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAC/D,MAAM,MAAM,oBAAoB,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAErE,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,GAAG,YAAY,CAsBtF"}
@@ -24,6 +24,7 @@ export const jobExecutions = pgTable('job_executions', {
24
24
  runner: jsonb('runner').$type(),
25
25
  status: jobExecutionStatusEnum('status').notNull().default('pending'),
26
26
  statusReason: jobStatusReasonEnum('status_reason'),
27
+ statusReasonMessage: text('status_reason_message'),
27
28
  triggerEvents: jsonb('trigger_events').notNull().default([]).$type(),
28
29
  outputs: jsonb('outputs').$type(),
29
30
  evaluationTrace: jsonb('evaluation_trace').$type(),
@@ -64,6 +65,7 @@ export function toJobExecution(row, fallbackName) {
64
65
  runner: row.runner,
65
66
  status: row.status,
66
67
  statusReason: toJobStatusReason(row.statusReason),
68
+ statusReasonMessage: row.statusReasonMessage,
67
69
  triggerEvents: row.triggerEvents.map(normalizeWorkflowExecutionEvent),
68
70
  outputs: row.outputs,
69
71
  evaluationTrace: row.evaluationTrace ?? null,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/schema/job-executions.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {\n index,\n integer,\n jsonb,\n pgEnum,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from 'drizzle-orm/pg-core';\nimport {toJobStatusReason} from '#core/entities/job.js';\nimport {\n type JobExecution,\n normalizeWorkflowExecutionEvent,\n type WorkflowExecutionEvent,\n} from '#core/entities/job-execution.js';\nimport type {PersistedEvaluationTraceEntry} from '#core/entities/step.js';\nimport {pgTable} from './common.js';\nimport {jobStatusReasonEnum, jobs} from './jobs.js';\n\nexport const jobExecutionStatusEnum = pgEnum('workflows_job_execution_status', [\n 'pending',\n 'running',\n 'succeeded',\n 'failed',\n 'cancelled',\n]);\n\nexport const jobExecutions = pgTable(\n 'job_executions',\n {\n id: uuidv7PrimaryKey(),\n jobId: uuid('job_id')\n .notNull()\n .references(() => jobs.id, {onDelete: 'cascade'}),\n sequence: integer('sequence').notNull(),\n // A null value means no dynamic override was resolved. The core entity\n // exposes the parent job's static name/key as the effective name.\n name: text('name'),\n runner: jsonb('runner').$type<string[]>(),\n status: jobExecutionStatusEnum('status').notNull().default('pending'),\n statusReason: jobStatusReasonEnum('status_reason'),\n triggerEvents: jsonb('trigger_events').notNull().default([]).$type<WorkflowExecutionEvent[]>(),\n outputs: jsonb('outputs').$type<Record<string, unknown> | null>(),\n evaluationTrace: jsonb('evaluation_trace').$type<readonly PersistedEvaluationTraceEntry[]>(),\n version: integer('version').notNull().default(1),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', {withTimezone: true}).notNull().defaultNow(),\n queuedAt: timestamp('queued_at', {withTimezone: true}),\n startedAt: timestamp('started_at', {withTimezone: true}),\n finishedAt: timestamp('finished_at', {withTimezone: true}),\n timedOutAt: timestamp('timed_out_at', {withTimezone: true}),\n },\n (table) => [\n index('workflows_job_executions_job_id_idx').on(table.jobId),\n // Partial index backing the running-executions depth gauge, which counts on\n // every Prometheus scrape. Indexes only active rows so the count stays cheap\n // as the historical table grows.\n index('workflows_job_executions_running_idx')\n .on(table.status)\n .where(sql`${table.status} = 'running'`),\n uniqueIndex('workflows_job_executions_job_sequence_uq').on(table.jobId, table.sequence),\n ],\n);\n\nexport type JobExecutionDb = typeof jobExecutions.$inferSelect;\nexport type JobExecutionCreateDb = typeof jobExecutions.$inferInsert;\n\nexport function toJobExecution(row: JobExecutionDb, fallbackName: string): JobExecution {\n return {\n id: row.id,\n jobId: row.jobId,\n sequence: row.sequence,\n nameOverride: row.name,\n name: row.name ?? fallbackName,\n runner: row.runner as string[] | null,\n status: row.status,\n statusReason: toJobStatusReason(row.statusReason),\n triggerEvents: row.triggerEvents.map(normalizeWorkflowExecutionEvent),\n outputs: row.outputs,\n evaluationTrace: row.evaluationTrace ?? null,\n version: row.version,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n queuedAt: row.queuedAt,\n startedAt: row.startedAt,\n finishedAt: row.finishedAt,\n timedOutAt: row.timedOutAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","index","integer","jsonb","pgEnum","text","timestamp","uniqueIndex","uuid","toJobStatusReason","normalizeWorkflowExecutionEvent","pgTable","jobStatusReasonEnum","jobs","jobExecutionStatusEnum","jobExecutions","id","jobId","notNull","references","onDelete","sequence","name","runner","$type","status","default","statusReason","triggerEvents","outputs","evaluationTrace","version","createdAt","withTimezone","defaultNow","updatedAt","queuedAt","startedAt","finishedAt","timedOutAt","table","on","where","toJobExecution","row","fallbackName","nameOverride","map"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,GAAG,QAAO,cAAc;AAChC,SACEC,KAAK,EACLC,OAAO,EACPC,KAAK,EACLC,MAAM,EACNC,IAAI,EACJC,SAAS,EACTC,WAAW,EACXC,IAAI,QACC,sBAAsB;AAC7B,SAAQC,iBAAiB,QAAO,wBAAwB;AACxD,SAEEC,+BAA+B,QAE1B,kCAAkC;AAEzC,SAAQC,OAAO,QAAO,cAAc;AACpC,SAAQC,mBAAmB,EAAEC,IAAI,QAAO,YAAY;AAEpD,OAAO,MAAMC,yBAAyBV,OAAO,kCAAkC;IAC7E;IACA;IACA;IACA;IACA;CACD,EAAE;AAEH,OAAO,MAAMW,gBAAgBJ,QAC3B,kBACA;IACEK,IAAIjB;IACJkB,OAAOT,KAAK,UACTU,OAAO,GACPC,UAAU,CAAC,IAAMN,KAAKG,EAAE,EAAE;QAACI,UAAU;IAAS;IACjDC,UAAUnB,QAAQ,YAAYgB,OAAO;IACrC,uEAAuE;IACvE,kEAAkE;IAClEI,MAAMjB,KAAK;IACXkB,QAAQpB,MAAM,UAAUqB,KAAK;IAC7BC,QAAQX,uBAAuB,UAAUI,OAAO,GAAGQ,OAAO,CAAC;IAC3DC,cAAcf,oBAAoB;IAClCgB,eAAezB,MAAM,kBAAkBe,OAAO,GAAGQ,OAAO,CAAC,EAAE,EAAEF,KAAK;IAClEK,SAAS1B,MAAM,WAAWqB,KAAK;IAC/BM,iBAAiB3B,MAAM,oBAAoBqB,KAAK;IAChDO,SAAS7B,QAAQ,WAAWgB,OAAO,GAAGQ,OAAO,CAAC;IAC9CM,WAAW1B,UAAU,cAAc;QAAC2B,cAAc;IAAI,GAAGf,OAAO,GAAGgB,UAAU;IAC7EC,WAAW7B,UAAU,cAAc;QAAC2B,cAAc;IAAI,GAAGf,OAAO,GAAGgB,UAAU;IAC7EE,UAAU9B,UAAU,aAAa;QAAC2B,cAAc;IAAI;IACpDI,WAAW/B,UAAU,cAAc;QAAC2B,cAAc;IAAI;IACtDK,YAAYhC,UAAU,eAAe;QAAC2B,cAAc;IAAI;IACxDM,YAAYjC,UAAU,gBAAgB;QAAC2B,cAAc;IAAI;AAC3D,GACA,CAACO,QAAU;QACTvC,MAAM,uCAAuCwC,EAAE,CAACD,MAAMvB,KAAK;QAC3D,4EAA4E;QAC5E,6EAA6E;QAC7E,iCAAiC;QACjChB,MAAM,wCACHwC,EAAE,CAACD,MAAMf,MAAM,EACfiB,KAAK,CAAC1C,GAAG,CAAC,EAAEwC,MAAMf,MAAM,CAAC,YAAY,CAAC;QACzClB,YAAY,4CAA4CkC,EAAE,CAACD,MAAMvB,KAAK,EAAEuB,MAAMnB,QAAQ;KACvF,EACD;AAKF,OAAO,SAASsB,eAAeC,GAAmB,EAAEC,YAAoB;IACtE,OAAO;QACL7B,IAAI4B,IAAI5B,EAAE;QACVC,OAAO2B,IAAI3B,KAAK;QAChBI,UAAUuB,IAAIvB,QAAQ;QACtByB,cAAcF,IAAItB,IAAI;QACtBA,MAAMsB,IAAItB,IAAI,IAAIuB;QAClBtB,QAAQqB,IAAIrB,MAAM;QAClBE,QAAQmB,IAAInB,MAAM;QAClBE,cAAclB,kBAAkBmC,IAAIjB,YAAY;QAChDC,eAAegB,IAAIhB,aAAa,CAACmB,GAAG,CAACrC;QACrCmB,SAASe,IAAIf,OAAO;QACpBC,iBAAiBc,IAAId,eAAe,IAAI;QACxCC,SAASa,IAAIb,OAAO;QACpBC,WAAWY,IAAIZ,SAAS;QACxBG,WAAWS,IAAIT,SAAS;QACxBC,UAAUQ,IAAIR,QAAQ;QACtBC,WAAWO,IAAIP,SAAS;QACxBC,YAAYM,IAAIN,UAAU;QAC1BC,YAAYK,IAAIL,UAAU;IAC5B;AACF"}
1
+ {"version":3,"sources":["../../../src/db/schema/job-executions.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {\n index,\n integer,\n jsonb,\n pgEnum,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from 'drizzle-orm/pg-core';\nimport {toJobStatusReason} from '#core/entities/job.js';\nimport {\n type JobExecution,\n normalizeWorkflowExecutionEvent,\n type WorkflowExecutionEvent,\n} from '#core/entities/job-execution.js';\nimport type {PersistedEvaluationTraceEntry} from '#core/entities/step.js';\nimport {pgTable} from './common.js';\nimport {jobStatusReasonEnum, jobs} from './jobs.js';\n\nexport const jobExecutionStatusEnum = pgEnum('workflows_job_execution_status', [\n 'pending',\n 'running',\n 'succeeded',\n 'failed',\n 'cancelled',\n]);\n\nexport const jobExecutions = pgTable(\n 'job_executions',\n {\n id: uuidv7PrimaryKey(),\n jobId: uuid('job_id')\n .notNull()\n .references(() => jobs.id, {onDelete: 'cascade'}),\n sequence: integer('sequence').notNull(),\n // A null value means no dynamic override was resolved. The core entity\n // exposes the parent job's static name/key as the effective name.\n name: text('name'),\n runner: jsonb('runner').$type<string[]>(),\n status: jobExecutionStatusEnum('status').notNull().default('pending'),\n statusReason: jobStatusReasonEnum('status_reason'),\n statusReasonMessage: text('status_reason_message'),\n triggerEvents: jsonb('trigger_events').notNull().default([]).$type<WorkflowExecutionEvent[]>(),\n outputs: jsonb('outputs').$type<Record<string, unknown> | null>(),\n evaluationTrace: jsonb('evaluation_trace').$type<readonly PersistedEvaluationTraceEntry[]>(),\n version: integer('version').notNull().default(1),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', {withTimezone: true}).notNull().defaultNow(),\n queuedAt: timestamp('queued_at', {withTimezone: true}),\n startedAt: timestamp('started_at', {withTimezone: true}),\n finishedAt: timestamp('finished_at', {withTimezone: true}),\n timedOutAt: timestamp('timed_out_at', {withTimezone: true}),\n },\n (table) => [\n index('workflows_job_executions_job_id_idx').on(table.jobId),\n // Partial index backing the running-executions depth gauge, which counts on\n // every Prometheus scrape. Indexes only active rows so the count stays cheap\n // as the historical table grows.\n index('workflows_job_executions_running_idx')\n .on(table.status)\n .where(sql`${table.status} = 'running'`),\n uniqueIndex('workflows_job_executions_job_sequence_uq').on(table.jobId, table.sequence),\n ],\n);\n\nexport type JobExecutionDb = typeof jobExecutions.$inferSelect;\nexport type JobExecutionCreateDb = typeof jobExecutions.$inferInsert;\n\nexport function toJobExecution(row: JobExecutionDb, fallbackName: string): JobExecution {\n return {\n id: row.id,\n jobId: row.jobId,\n sequence: row.sequence,\n nameOverride: row.name,\n name: row.name ?? fallbackName,\n runner: row.runner as string[] | null,\n status: row.status,\n statusReason: toJobStatusReason(row.statusReason),\n statusReasonMessage: row.statusReasonMessage,\n triggerEvents: row.triggerEvents.map(normalizeWorkflowExecutionEvent),\n outputs: row.outputs,\n evaluationTrace: row.evaluationTrace ?? null,\n version: row.version,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n queuedAt: row.queuedAt,\n startedAt: row.startedAt,\n finishedAt: row.finishedAt,\n timedOutAt: row.timedOutAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","index","integer","jsonb","pgEnum","text","timestamp","uniqueIndex","uuid","toJobStatusReason","normalizeWorkflowExecutionEvent","pgTable","jobStatusReasonEnum","jobs","jobExecutionStatusEnum","jobExecutions","id","jobId","notNull","references","onDelete","sequence","name","runner","$type","status","default","statusReason","statusReasonMessage","triggerEvents","outputs","evaluationTrace","version","createdAt","withTimezone","defaultNow","updatedAt","queuedAt","startedAt","finishedAt","timedOutAt","table","on","where","toJobExecution","row","fallbackName","nameOverride","map"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { type Job, type JobListeningTrigger } from '#core/entities/job.js';
2
2
  import type { PersistedEvaluationTraceEntry } from '#core/entities/step.js';
3
3
  export declare const jobStatusEnum: import("drizzle-orm/pg-core").PgEnum<["pending", "running", "succeeded", "failed", "cancelled", "skipped"]>;
4
- export declare const jobStatusReasonEnum: import("drizzle-orm/pg-core").PgEnum<["dependency_not_completed", "condition_false", "default_gate_rejected", "condition_rejected", "condition_errored", "user_cancelled", "run_cancelled", "timed_out", "runner_lost", "step_failed", "unknown"]>;
4
+ export declare const jobStatusReasonEnum: import("drizzle-orm/pg-core").PgEnum<["dependency_not_completed", "condition_false", "default_gate_rejected", "condition_rejected", "condition_errored", "user_cancelled", "run_cancelled", "timed_out", "runner_lost", "output_too_large", "step_failed", "unknown", "output_invalid"]>;
5
5
  export declare const jobModeEnum: import("drizzle-orm/pg-core").PgEnum<["one_shot", "listening"]>;
6
6
  export declare const jobCheckoutContentsEnum: import("drizzle-orm/pg-core").PgEnum<["read", "write"]>;
7
7
  export declare const jobOnResolveEnum: import("drizzle-orm/pg-core").PgEnum<["finish", "cancel"]>;
@@ -118,14 +118,14 @@ export declare const jobs: import("drizzle-orm/pg-core").PgTableWithColumns<{
118
118
  tableName: "jobs";
119
119
  dataType: "string";
120
120
  columnType: "PgEnumColumn";
121
- data: "condition_errored" | "condition_false" | "condition_rejected" | "default_gate_rejected" | "dependency_not_completed" | "run_cancelled" | "runner_lost" | "step_failed" | "timed_out" | "unknown" | "user_cancelled";
121
+ data: "condition_errored" | "condition_false" | "condition_rejected" | "default_gate_rejected" | "dependency_not_completed" | "output_invalid" | "output_too_large" | "run_cancelled" | "runner_lost" | "step_failed" | "timed_out" | "unknown" | "user_cancelled";
122
122
  driverParam: string;
123
123
  notNull: false;
124
124
  hasDefault: false;
125
125
  isPrimaryKey: false;
126
126
  isAutoincrement: false;
127
127
  hasRuntimeDefault: false;
128
- enumValues: ["dependency_not_completed", "condition_false", "default_gate_rejected", "condition_rejected", "condition_errored", "user_cancelled", "run_cancelled", "timed_out", "runner_lost", "step_failed", "unknown"];
128
+ enumValues: ["dependency_not_completed", "condition_false", "default_gate_rejected", "condition_rejected", "condition_errored", "user_cancelled", "run_cancelled", "timed_out", "runner_lost", "output_too_large", "step_failed", "unknown", "output_invalid"];
129
129
  baseColumn: never;
130
130
  identity: undefined;
131
131
  generated: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../src/db/schema/jobs.ts"],"names":[],"mappings":"AAaA,OAAO,EAEL,KAAK,GAAG,EACR,KAAK,mBAAmB,EAEzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAC,6BAA6B,EAAC,MAAM,wBAAwB,CAAC;AAI1E,eAAO,MAAM,aAAa,6GAOxB,CAAC;AAEH,eAAO,MAAM,mBAAmB,oPAA4D,CAAC;AAE7F,eAAO,MAAM,WAAW,iEAA0D,CAAC;AAEnF,eAAO,MAAM,uBAAuB,yDAA2D,CAAC;AAEhG,eAAO,MAAM,gBAAgB,4DAA2D,CAAC;AAEzF,eAAO,MAAM,kBAAkB,6EAI7B,CAAC;AAEH,eAAO,MAAM,oBAAoB,2FAK/B,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0ChB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,YAAY,CAAC;AAC7C,MAAM,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,YAAY,CAAC;AAEnD,wBAAgB,KAAK,CAAC,GAAG,EAAE,KAAK,GAAG,GAAG,CAmCrC"}
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../src/db/schema/jobs.ts"],"names":[],"mappings":"AAaA,OAAO,EAEL,KAAK,GAAG,EACR,KAAK,mBAAmB,EAEzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAC,6BAA6B,EAAC,MAAM,wBAAwB,CAAC;AAI1E,eAAO,MAAM,aAAa,6GAOxB,CAAC;AAEH,eAAO,MAAM,mBAAmB,0RAA4D,CAAC;AAE7F,eAAO,MAAM,WAAW,iEAA0D,CAAC;AAEnF,eAAO,MAAM,uBAAuB,yDAA2D,CAAC;AAEhG,eAAO,MAAM,gBAAgB,4DAA2D,CAAC;AAEzF,eAAO,MAAM,kBAAkB,6EAI7B,CAAC;AAEH,eAAO,MAAM,oBAAoB,2FAK/B,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6ChB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,YAAY,CAAC;AAC7C,MAAM,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,YAAY,CAAC;AAEnD,wBAAgB,KAAK,CAAC,GAAG,EAAE,KAAK,GAAG,GAAG,CAmCrC"}
@@ -44,6 +44,9 @@ export const jobs = pgTable('jobs', {
44
44
  key: text('key').notNull(),
45
45
  mode: jobModeEnum('mode').notNull().default('one_shot'),
46
46
  name: text('name'),
47
+ // This is the job's execution verdict, not its runtime lifecycle. Active execution state
48
+ // lives on job_executions and must be read there when a surface needs to distinguish
49
+ // waiting from executing.
47
50
  status: jobStatusEnum('status').notNull().default('pending'),
48
51
  statusReason: jobStatusReasonEnum('status_reason'),
49
52
  carriedOver: boolean('carried_over').notNull().default(false),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/schema/jobs.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {\n bigint,\n boolean,\n index,\n integer,\n jsonb,\n pgEnum,\n text,\n timestamp,\n uuid,\n} from 'drizzle-orm/pg-core';\nimport {\n JOB_STATUS_REASONS,\n type Job,\n type JobListeningTrigger,\n toJobStatusReason,\n} from '#core/entities/job.js';\nimport type {PersistedEvaluationTraceEntry} from '#core/entities/step.js';\nimport {pgTable} from './common.js';\nimport {workflowRunAttempts} from './workflow-run-attempts.js';\n\nexport const jobStatusEnum = pgEnum('workflows_job_status', [\n 'pending',\n 'running',\n 'succeeded',\n 'failed',\n 'cancelled',\n 'skipped',\n]);\n\nexport const jobStatusReasonEnum = pgEnum('workflows_job_status_reason', JOB_STATUS_REASONS);\n\nexport const jobModeEnum = pgEnum('workflows_job_mode', ['one_shot', 'listening']);\n\nexport const jobCheckoutContentsEnum = pgEnum('workflows_checkout_contents', ['read', 'write']);\n\nexport const jobOnResolveEnum = pgEnum('workflows_job_on_resolve', ['finish', 'cancel']);\n\nexport const listenerStatusEnum = pgEnum('workflows_listener_status', [\n 'inactive',\n 'listening',\n 'resolved',\n]);\n\nexport const resolutionReasonEnum = pgEnum('workflows_resolution_reason', [\n 'until',\n 'timeout',\n 'max_executions',\n 'cancelled',\n]);\n\nexport const jobs = pgTable(\n 'jobs',\n {\n id: uuidv7PrimaryKey(),\n workflowRunAttemptId: uuid('workflow_run_attempt_id')\n .notNull()\n .references(() => workflowRunAttempts.id, {onDelete: 'cascade'}),\n key: text('key').notNull(),\n mode: jobModeEnum('mode').notNull().default('one_shot'),\n name: text('name'),\n status: jobStatusEnum('status').notNull().default('pending'),\n statusReason: jobStatusReasonEnum('status_reason'),\n carriedOver: boolean('carried_over').notNull().default(false),\n checkoutPersistCredentials: boolean('checkout_persist_credentials').notNull(),\n checkoutPermissionsContents: jobCheckoutContentsEnum('checkout_permissions_contents').notNull(),\n success: text('success'),\n evaluationTrace: jsonb('evaluation_trace').$type<readonly PersistedEvaluationTraceEntry[]>(),\n executionTimeoutMs: integer('execution_timeout_ms'),\n listeningTimeoutMs: bigint('listening_timeout_ms', {mode: 'number'}),\n maxExecutions: integer('max_executions'),\n onResolve: jobOnResolveEnum('on_resolve'),\n batchDebounceMs: integer('batch_debounce_ms'),\n batchMaxSize: integer('batch_max_size'),\n batchMaxWaitMs: integer('batch_max_wait_ms'),\n listenerStatus: listenerStatusEnum('listener_status').notNull().default('inactive'),\n resolutionReason: resolutionReasonEnum('resolution_reason'),\n listeningOn: jsonb('listening_on').$type<JobListeningTrigger[]>(),\n listeningUntil: jsonb('listening_until').$type<JobListeningTrigger[]>(),\n outputs: jsonb('outputs').$type<Record<string, unknown> | null>(),\n dependencies: jsonb('dependencies').notNull().$type<string[]>(),\n runner: jsonb('runner').$type<string[]>(),\n position: integer('position').notNull(),\n version: integer('version').notNull().default(1),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', {withTimezone: true}).notNull().defaultNow(),\n },\n (table) => [\n index('workflows_jobs_workflow_run_attempt_id_idx').on(table.workflowRunAttemptId),\n index('workflows_jobs_active_listeners_idx')\n .on(table.listenerStatus)\n .where(sql`${table.listenerStatus} = 'listening'`),\n ],\n);\n\nexport type JobDb = typeof jobs.$inferSelect;\nexport type JobCreateDb = typeof jobs.$inferInsert;\n\nexport function toJob(row: JobDb): Job {\n return {\n id: row.id,\n workflowRunAttemptId: row.workflowRunAttemptId,\n key: row.key,\n name: row.name,\n mode: row.mode,\n status: row.status,\n statusReason: toJobStatusReason(row.statusReason),\n carriedOver: row.carriedOver,\n checkout: {\n permissions: {contents: row.checkoutPermissionsContents},\n persistCredentials: row.checkoutPersistCredentials,\n },\n success: row.success,\n evaluationTrace: row.evaluationTrace ?? null,\n executionTimeoutMs: row.executionTimeoutMs,\n listeningTimeoutMs: row.listeningTimeoutMs,\n maxExecutions: row.maxExecutions,\n onResolve: row.onResolve,\n batchDebounceMs: row.batchDebounceMs,\n batchMaxSize: row.batchMaxSize,\n batchMaxWaitMs: row.batchMaxWaitMs,\n listenerStatus: row.listenerStatus,\n resolutionReason: row.resolutionReason,\n listeningOn: row.listeningOn,\n listeningUntil: row.listeningUntil,\n outputs: row.outputs,\n dependencies: row.dependencies as string[],\n runner: row.runner as string[] | null,\n position: row.position,\n version: row.version,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","bigint","boolean","index","integer","jsonb","pgEnum","text","timestamp","uuid","JOB_STATUS_REASONS","toJobStatusReason","pgTable","workflowRunAttempts","jobStatusEnum","jobStatusReasonEnum","jobModeEnum","jobCheckoutContentsEnum","jobOnResolveEnum","listenerStatusEnum","resolutionReasonEnum","jobs","id","workflowRunAttemptId","notNull","references","onDelete","key","mode","default","name","status","statusReason","carriedOver","checkoutPersistCredentials","checkoutPermissionsContents","success","evaluationTrace","$type","executionTimeoutMs","listeningTimeoutMs","maxExecutions","onResolve","batchDebounceMs","batchMaxSize","batchMaxWaitMs","listenerStatus","resolutionReason","listeningOn","listeningUntil","outputs","dependencies","runner","position","version","createdAt","withTimezone","defaultNow","updatedAt","table","on","where","toJob","row","checkout","permissions","contents","persistCredentials"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/db/schema/jobs.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {\n bigint,\n boolean,\n index,\n integer,\n jsonb,\n pgEnum,\n text,\n timestamp,\n uuid,\n} from 'drizzle-orm/pg-core';\nimport {\n JOB_STATUS_REASONS,\n type Job,\n type JobListeningTrigger,\n toJobStatusReason,\n} from '#core/entities/job.js';\nimport type {PersistedEvaluationTraceEntry} from '#core/entities/step.js';\nimport {pgTable} from './common.js';\nimport {workflowRunAttempts} from './workflow-run-attempts.js';\n\nexport const jobStatusEnum = pgEnum('workflows_job_status', [\n 'pending',\n 'running',\n 'succeeded',\n 'failed',\n 'cancelled',\n 'skipped',\n]);\n\nexport const jobStatusReasonEnum = pgEnum('workflows_job_status_reason', JOB_STATUS_REASONS);\n\nexport const jobModeEnum = pgEnum('workflows_job_mode', ['one_shot', 'listening']);\n\nexport const jobCheckoutContentsEnum = pgEnum('workflows_checkout_contents', ['read', 'write']);\n\nexport const jobOnResolveEnum = pgEnum('workflows_job_on_resolve', ['finish', 'cancel']);\n\nexport const listenerStatusEnum = pgEnum('workflows_listener_status', [\n 'inactive',\n 'listening',\n 'resolved',\n]);\n\nexport const resolutionReasonEnum = pgEnum('workflows_resolution_reason', [\n 'until',\n 'timeout',\n 'max_executions',\n 'cancelled',\n]);\n\nexport const jobs = pgTable(\n 'jobs',\n {\n id: uuidv7PrimaryKey(),\n workflowRunAttemptId: uuid('workflow_run_attempt_id')\n .notNull()\n .references(() => workflowRunAttempts.id, {onDelete: 'cascade'}),\n key: text('key').notNull(),\n mode: jobModeEnum('mode').notNull().default('one_shot'),\n name: text('name'),\n // This is the job's execution verdict, not its runtime lifecycle. Active execution state\n // lives on job_executions and must be read there when a surface needs to distinguish\n // waiting from executing.\n status: jobStatusEnum('status').notNull().default('pending'),\n statusReason: jobStatusReasonEnum('status_reason'),\n carriedOver: boolean('carried_over').notNull().default(false),\n checkoutPersistCredentials: boolean('checkout_persist_credentials').notNull(),\n checkoutPermissionsContents: jobCheckoutContentsEnum('checkout_permissions_contents').notNull(),\n success: text('success'),\n evaluationTrace: jsonb('evaluation_trace').$type<readonly PersistedEvaluationTraceEntry[]>(),\n executionTimeoutMs: integer('execution_timeout_ms'),\n listeningTimeoutMs: bigint('listening_timeout_ms', {mode: 'number'}),\n maxExecutions: integer('max_executions'),\n onResolve: jobOnResolveEnum('on_resolve'),\n batchDebounceMs: integer('batch_debounce_ms'),\n batchMaxSize: integer('batch_max_size'),\n batchMaxWaitMs: integer('batch_max_wait_ms'),\n listenerStatus: listenerStatusEnum('listener_status').notNull().default('inactive'),\n resolutionReason: resolutionReasonEnum('resolution_reason'),\n listeningOn: jsonb('listening_on').$type<JobListeningTrigger[]>(),\n listeningUntil: jsonb('listening_until').$type<JobListeningTrigger[]>(),\n outputs: jsonb('outputs').$type<Record<string, unknown> | null>(),\n dependencies: jsonb('dependencies').notNull().$type<string[]>(),\n runner: jsonb('runner').$type<string[]>(),\n position: integer('position').notNull(),\n version: integer('version').notNull().default(1),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', {withTimezone: true}).notNull().defaultNow(),\n },\n (table) => [\n index('workflows_jobs_workflow_run_attempt_id_idx').on(table.workflowRunAttemptId),\n index('workflows_jobs_active_listeners_idx')\n .on(table.listenerStatus)\n .where(sql`${table.listenerStatus} = 'listening'`),\n ],\n);\n\nexport type JobDb = typeof jobs.$inferSelect;\nexport type JobCreateDb = typeof jobs.$inferInsert;\n\nexport function toJob(row: JobDb): Job {\n return {\n id: row.id,\n workflowRunAttemptId: row.workflowRunAttemptId,\n key: row.key,\n name: row.name,\n mode: row.mode,\n status: row.status,\n statusReason: toJobStatusReason(row.statusReason),\n carriedOver: row.carriedOver,\n checkout: {\n permissions: {contents: row.checkoutPermissionsContents},\n persistCredentials: row.checkoutPersistCredentials,\n },\n success: row.success,\n evaluationTrace: row.evaluationTrace ?? null,\n executionTimeoutMs: row.executionTimeoutMs,\n listeningTimeoutMs: row.listeningTimeoutMs,\n maxExecutions: row.maxExecutions,\n onResolve: row.onResolve,\n batchDebounceMs: row.batchDebounceMs,\n batchMaxSize: row.batchMaxSize,\n batchMaxWaitMs: row.batchMaxWaitMs,\n listenerStatus: row.listenerStatus,\n resolutionReason: row.resolutionReason,\n listeningOn: row.listeningOn,\n listeningUntil: row.listeningUntil,\n outputs: row.outputs,\n dependencies: row.dependencies as string[],\n runner: row.runner as string[] | null,\n position: row.position,\n version: row.version,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","bigint","boolean","index","integer","jsonb","pgEnum","text","timestamp","uuid","JOB_STATUS_REASONS","toJobStatusReason","pgTable","workflowRunAttempts","jobStatusEnum","jobStatusReasonEnum","jobModeEnum","jobCheckoutContentsEnum","jobOnResolveEnum","listenerStatusEnum","resolutionReasonEnum","jobs","id","workflowRunAttemptId","notNull","references","onDelete","key","mode","default","name","status","statusReason","carriedOver","checkoutPersistCredentials","checkoutPermissionsContents","success","evaluationTrace","$type","executionTimeoutMs","listeningTimeoutMs","maxExecutions","onResolve","batchDebounceMs","batchMaxSize","batchMaxWaitMs","listenerStatus","resolutionReason","listeningOn","listeningUntil","outputs","dependencies","runner","position","version","createdAt","withTimezone","defaultNow","updatedAt","table","on","where","toJob","row","checkout","permissions","contents","persistCredentials"],"mappings":"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"}
@@ -13,14 +13,21 @@ export interface UpdateJobExecutionStatusAtVersionParams {
13
13
  status: JobExecutionStatus;
14
14
  expectedVersion: number;
15
15
  statusReason?: JobStatusReason | null | undefined;
16
+ statusReasonMessage?: string | null | undefined;
16
17
  markTimedOut?: boolean;
17
18
  secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;
18
19
  }
20
+ export type JobOutputFailure = {
21
+ statusReason: Extract<JobStatusReason, 'output_invalid' | 'output_too_large'>;
22
+ statusReasonMessage: string;
23
+ };
24
+ export declare function classifyJobOutputFailure(error: unknown): JobOutputFailure | null;
19
25
  export interface UpdateJobExecutionStatusParams {
20
26
  jobExecutionId: string;
21
27
  status: JobExecutionStatus;
22
28
  expectedVersion: number;
23
29
  statusReason?: JobStatusReason | null | undefined;
30
+ statusReasonMessage?: string | null | undefined;
24
31
  secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;
25
32
  }
26
33
  export declare function updateJobExecutionStatus(params: UpdateJobExecutionStatusParams): Promise<JobExecution>;
@@ -1 +1 @@
1
- {"version":3,"file":"job-executions.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/job-executions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"job-executions.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/job-executions.ts"],"names":[],"mappings":"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"}
@@ -62,6 +62,25 @@ export async function getLatestJobExecutionByJobId(jobId, tx) {
62
62
  const row = rows[0];
63
63
  return row ? toJobExecution(row.jobExecution, row.job.name ?? row.job.key) : undefined;
64
64
  }
65
+ const MAX_STATUS_REASON_MESSAGE_LENGTH = 2048;
66
+ export function classifyJobOutputFailure(error) {
67
+ if (error instanceof JobOutputTooLargeError) {
68
+ return {
69
+ statusReason: 'output_too_large',
70
+ statusReasonMessage: boundedStatusReasonMessage(error.message)
71
+ };
72
+ }
73
+ if (error instanceof InterpolationUnresolvableError && error.field === 'job.outputs' || error instanceof JobOutputNotJsonSafeError || error instanceof JobOutputTooManyEntriesError) {
74
+ return {
75
+ statusReason: 'output_invalid',
76
+ statusReasonMessage: boundedStatusReasonMessage(error.message)
77
+ };
78
+ }
79
+ return null;
80
+ }
81
+ function boundedStatusReasonMessage(message) {
82
+ return message.length <= MAX_STATUS_REASON_MESSAGE_LENGTH ? message : `${message.slice(0, MAX_STATUS_REASON_MESSAGE_LENGTH - 1)}…`;
83
+ }
65
84
  async function resolveJobExecutionOutputs(tx, params) {
66
85
  const [target] = await tx.select({
67
86
  execution: jobExecutions,
@@ -110,6 +129,7 @@ async function resolveJobExecutionOutputs(tx, params) {
110
129
  async function updateJobExecutionStatusAtVersion(tx, params) {
111
130
  let status = params.status;
112
131
  let statusReason = params.statusReason ?? null;
132
+ let statusReasonMessage = params.statusReasonMessage ?? null;
113
133
  let outputs;
114
134
  if (TERMINAL_EXECUTION_STATUSES.includes(status)) {
115
135
  outputs = null;
@@ -123,17 +143,18 @@ async function updateJobExecutionStatusAtVersion(tx, params) {
123
143
  secrets: params.secrets
124
144
  });
125
145
  } catch (error) {
126
- if (!(error instanceof InterpolationUnresolvableError) && !(error instanceof JobOutputNotJsonSafeError) && !(error instanceof JobOutputTooLargeError) && !(error instanceof JobOutputTooManyEntriesError)) {
127
- throw error;
128
- }
146
+ const outputFailure = classifyJobOutputFailure(error);
147
+ if (outputFailure === null) throw error;
129
148
  status = 'failed';
130
- statusReason = 'unknown';
149
+ statusReason = outputFailure.statusReason;
150
+ statusReasonMessage = outputFailure.statusReasonMessage;
131
151
  outputs = null;
132
152
  }
133
153
  }
134
154
  const rows = await tx.update(jobExecutions).set({
135
155
  status,
136
156
  statusReason,
157
+ statusReasonMessage,
137
158
  ...outputs === undefined ? {} : {
138
159
  outputs
139
160
  },
@@ -162,6 +183,7 @@ export async function updateJobExecutionStatus(params) {
162
183
  status: params.status,
163
184
  expectedVersion: params.expectedVersion,
164
185
  statusReason,
186
+ statusReasonMessage: params.statusReasonMessage,
165
187
  secrets: params.secrets
166
188
  }),
167
189
  fetchFn: async ()=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/workflow-runs/job-executions.ts"],"sourcesContent":["import {readPersistedWorkflowModel} from '@shipfox/api-definitions-dto';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {WORKFLOWS_JOB_EXECUTION_TIMED_OUT} from '@shipfox/api-workflows-dto';\nimport {and, asc, desc, eq, isNull, notInArray, sql} from 'drizzle-orm';\nimport type {JobStatusReason} from '#core/entities/job.js';\nimport type {JobExecution, JobExecutionStatus} from '#core/entities/job-execution.js';\nimport {\n InterpolationUnresolvableError,\n JobNotFoundError,\n JobOutputNotJsonSafeError,\n JobOutputTooLargeError,\n JobOutputTooManyEntriesError,\n} from '#core/errors.js';\nimport {deriveJobExecutionOutputs} from '#core/job-transition/index.js';\nimport {deriveCompletion, isTerminal} from '#core/step-transition/decide-step-transition.js';\nimport type {RuntimeCompletionStatus} from '#core/workflow-scheduling/runtime-dag.js';\nimport {\n recordWorkflowJobExecutionLeaseExpiryResolved,\n recordWorkflowJobExecutionQueued,\n recordWorkflowJobExecutionStarted,\n recordWorkflowJobExecutionStatusChanged,\n recordWorkflowJobExecutionTimedOut,\n} from '#metrics/instance.js';\nimport {db, type Tx} from '../db.js';\nimport {writeWorkflowsOutboxEvent} from '../outbox-writes.js';\nimport {jobExecutions, toJobExecution} from '../schema/job-executions.js';\nimport {jobs, toJob} from '../schema/jobs.js';\nimport {stepAttempts, toStepAttempt} from '../schema/step-attempts.js';\nimport {steps, toStep} from '../schema/steps.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {getDirectDependencyJobContexts} from './jobs.js';\nimport {loadReferencedVariables} from './runs.js';\nimport {\n getWorkflowContextForJob,\n optimisticLockRetry,\n TERMINAL_EXECUTION_STATUSES,\n} from './shared.js';\nimport {bulkUpdateStepStatuses, getStepsByJobExecutionIdForUpdate} from './steps.js';\n\nasync function getJobExecutionFallbackName(tx: Tx, jobExecutionId: string): Promise<string> {\n const [row] = await tx\n .select({job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.id, jobExecutionId))\n .limit(1);\n if (!row) throw new JobNotFoundError(jobExecutionId);\n return row.job.name ?? row.job.key;\n}\n\nexport async function getJobExecutionById(id: string, tx?: Tx): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.id, id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row.jobExecution, row.job.name ?? row.job.key) : undefined;\n}\n\nexport async function getJobExecutionsByWorkflowRunAttemptId(\n workflowRunAttemptId: string,\n): Promise<JobExecution[]> {\n const rows = await db()\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobs.workflowRunAttemptId, workflowRunAttemptId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return rows.map((row) => toJobExecution(row.jobExecution, row.job.name ?? row.job.key));\n}\n\nexport async function getJobExecutionsByJobId(jobId: string): Promise<JobExecution[]> {\n const rows = await db()\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return rows.map((row) => toJobExecution(row.jobExecution, row.job.name ?? row.job.key));\n}\n\nexport async function getFirstJobExecutionByJobId(\n jobId: string,\n tx?: Tx,\n): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row.jobExecution, row.job.name ?? row.job.key) : undefined;\n}\n\nexport async function getLatestJobExecutionByJobId(\n jobId: string,\n tx?: Tx,\n): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(desc(jobExecutions.sequence), desc(jobExecutions.id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row.jobExecution, row.job.name ?? row.job.key) : undefined;\n}\n\nexport interface UpdateJobExecutionStatusAtVersionParams {\n jobExecutionId: string;\n status: JobExecutionStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n markTimedOut?: boolean;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}\n\nasync function resolveJobExecutionOutputs(\n tx: Tx,\n params: {\n jobExecutionId: string;\n status: JobExecutionStatus;\n statusReason: JobStatusReason | null;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n },\n): Promise<Record<string, unknown> | null> {\n const [target] = await tx\n .select({execution: jobExecutions, job: jobs, attempt: workflowRunAttempts, run: workflowRuns})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1);\n if (!target) throw new JobNotFoundError(params.jobExecutionId);\n const model =\n target.attempt.model === null ? null : readPersistedWorkflowModel(target.attempt.model);\n if (!model) return null;\n const modelJob = model.jobs.find((job) => job.key === target.job.key);\n if (!modelJob || modelJob.outputs === undefined) return null;\n\n const executionRows = await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, target.job.id))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n const fallbackName = target.job.name ?? target.job.key;\n const executions = executionRows.map((row) =>\n row.id === target.execution.id\n ? toJobExecution(\n {...row, status: params.status, statusReason: params.statusReason},\n fallbackName,\n )\n : toJobExecution(row, fallbackName),\n );\n const jobExecution = executions.find((execution) => execution.id === target.execution.id);\n if (!jobExecution) throw new JobNotFoundError(params.jobExecutionId);\n\n const stepRows = await tx\n .select()\n .from(steps)\n .where(eq(steps.jobExecutionId, params.jobExecutionId))\n .orderBy(asc(steps.position), asc(steps.id));\n const attemptRows = await tx\n .select()\n .from(stepAttempts)\n .where(eq(stepAttempts.jobExecutionId, params.jobExecutionId))\n .orderBy(asc(stepAttempts.executionOrder), asc(stepAttempts.id));\n const dependencyJobs = await getDirectDependencyJobContexts(target.job.id, tx);\n\n return deriveJobExecutionOutputs({\n run: toWorkflowRun(target.run),\n modelJob,\n job: toJob(target.job),\n jobExecution,\n executions,\n steps: stepRows.map(toStep),\n attempts: attemptRows.map(toStepAttempt),\n jobs: dependencyJobs,\n vars: await loadReferencedVariables({\n model,\n jobs: [modelJob],\n workspaceId: target.run.workspaceId,\n projectId: target.run.projectId,\n definitionId: target.run.definitionId,\n secrets: params.secrets,\n }),\n });\n}\n\nasync function updateJobExecutionStatusAtVersion(\n tx: Tx,\n params: UpdateJobExecutionStatusAtVersionParams,\n): Promise<{execution: JobExecution; changed: boolean} | null> {\n let status = params.status;\n let statusReason = params.statusReason ?? null;\n let outputs: Record<string, unknown> | null | undefined;\n if (TERMINAL_EXECUTION_STATUSES.includes(status)) {\n outputs = null;\n }\n if (status === 'succeeded') {\n try {\n outputs = await resolveJobExecutionOutputs(tx, {\n jobExecutionId: params.jobExecutionId,\n status,\n statusReason,\n secrets: params.secrets,\n });\n } catch (error) {\n if (\n !(error instanceof InterpolationUnresolvableError) &&\n !(error instanceof JobOutputNotJsonSafeError) &&\n !(error instanceof JobOutputTooLargeError) &&\n !(error instanceof JobOutputTooManyEntriesError)\n ) {\n throw error;\n }\n status = 'failed';\n statusReason = 'unknown';\n outputs = null;\n }\n }\n\n const rows = await tx\n .update(jobExecutions)\n .set({\n status,\n statusReason,\n ...(outputs === undefined ? {} : {outputs}),\n version: sql`${jobExecutions.version} + 1`,\n updatedAt: new Date(),\n ...(params.markTimedOut ? {timedOutAt: new Date()} : {}),\n ...(TERMINAL_EXECUTION_STATUSES.includes(status) ? {finishedAt: sql`now()`} : {}),\n })\n .where(\n and(\n eq(jobExecutions.id, params.jobExecutionId),\n eq(jobExecutions.version, params.expectedVersion),\n notInArray(jobExecutions.status, TERMINAL_EXECUTION_STATUSES),\n ),\n )\n .returning();\n\n const row = rows[0];\n if (!row) return null;\n return {\n execution: toJobExecution(row, await getJobExecutionFallbackName(tx, row.id)),\n changed: true,\n };\n}\n\nexport interface UpdateJobExecutionStatusParams {\n jobExecutionId: string;\n status: JobExecutionStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}\n\nexport async function updateJobExecutionStatus(\n params: UpdateJobExecutionStatusParams,\n): Promise<JobExecution> {\n const statusReason = params.statusReason ?? null;\n const result = await db().transaction(async (tx) => {\n return await optimisticLockRetry({\n updateFn: () =>\n updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: params.status,\n expectedVersion: params.expectedVersion,\n statusReason,\n secrets: params.secrets,\n }),\n fetchFn: async () => {\n const row = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n return row ? toJobExecution(row, await getJobExecutionFallbackName(tx, row.id)) : undefined;\n },\n matchFn: (execution) =>\n (execution.status === params.status && execution.statusReason === statusReason) ||\n TERMINAL_EXECUTION_STATUSES.includes(execution.status)\n ? {execution, changed: false}\n : null,\n failureMessage: `Optimistic lock failure: job execution ${params.jobExecutionId} version ${params.expectedVersion}`,\n });\n });\n\n if (result.changed) recordWorkflowJobExecutionStatusChanged(result.execution.status);\n\n return result.execution;\n}\n\nexport async function recordJobExecutionQueuedAt(params: {\n jobExecutionId: string;\n queuedAt: Date;\n}): Promise<void> {\n const updated = await db()\n .update(jobExecutions)\n .set({queuedAt: params.queuedAt})\n .where(and(eq(jobExecutions.id, params.jobExecutionId), isNull(jobExecutions.queuedAt)))\n .returning({id: jobExecutions.id});\n\n if (updated.length > 0) recordWorkflowJobExecutionQueued();\n}\n\nexport async function recordJobExecutionStartedAt(params: {\n jobExecutionId: string;\n startedAt: Date;\n}): Promise<void> {\n const updated = await db()\n .update(jobExecutions)\n .set({startedAt: params.startedAt})\n .where(and(eq(jobExecutions.id, params.jobExecutionId), isNull(jobExecutions.startedAt)))\n .returning({id: jobExecutions.id});\n\n if (updated.length > 0) recordWorkflowJobExecutionStarted();\n}\n\nexport async function failJobExecutionAsTimedOut(params: {\n jobExecutionId: string;\n workflowRunAttemptId: string;\n expectedVersion: number;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}): Promise<JobExecution> {\n const result = await db().transaction(async (tx) => {\n const updated = await optimisticLockRetry({\n updateFn: () =>\n updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: 'failed',\n expectedVersion: params.expectedVersion,\n statusReason: 'timed_out',\n markTimedOut: true,\n secrets: params.secrets,\n }),\n fetchFn: async () => {\n const row = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n return row ? toJobExecution(row, await getJobExecutionFallbackName(tx, row.id)) : undefined;\n },\n matchFn: (execution) => (execution.timedOutAt !== null ? {execution, changed: false} : null),\n failureMessage: `Optimistic lock failure: job execution ${params.jobExecutionId} version ${params.expectedVersion}`,\n });\n\n if (updated.changed) {\n const identity = await getWorkflowContextForJob(updated.execution.jobId, tx);\n await writeWorkflowsOutboxEvent(tx, {\n type: WORKFLOWS_JOB_EXECUTION_TIMED_OUT,\n payload: {\n jobId: identity.jobId,\n jobExecutionId: params.jobExecutionId,\n workflowRunAttemptId: identity.workflowRunAttemptId,\n },\n });\n }\n\n return updated;\n });\n\n if (result.changed) {\n recordWorkflowJobExecutionStatusChanged(result.execution.status);\n recordWorkflowJobExecutionTimedOut();\n }\n\n return result.execution;\n}\n\nexport async function resolveJobExecutionAfterLeaseExpiry(params: {\n jobExecutionId: string;\n expectedVersion: number;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}): Promise<{status: RuntimeCompletionStatus; executionVersion: number}> {\n const result = await db().transaction(async (tx) => {\n const jobExecutionSteps = await getStepsByJobExecutionIdForUpdate(params.jobExecutionId, tx);\n let changedJobExecution: JobExecution | null = null;\n\n if (jobExecutionSteps.length === 0) {\n throw new JobNotFoundError(params.jobExecutionId);\n }\n\n if (jobExecutionSteps.every((step) => isTerminal(step.status))) {\n const status = deriveCompletion(jobExecutionSteps);\n const updated = await updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status,\n expectedVersion: params.expectedVersion,\n statusReason: statusReasonForStepCompletion(status),\n secrets: params.secrets,\n });\n changedJobExecution = updated?.changed ? updated.execution : null;\n } else {\n const updated = await updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: 'failed',\n expectedVersion: params.expectedVersion,\n statusReason: 'runner_lost',\n secrets: params.secrets,\n });\n if (updated?.changed) {\n changedJobExecution = updated.execution;\n await bulkUpdateStepStatuses(\n {jobExecutionId: params.jobExecutionId, status: 'cancelled'},\n tx,\n );\n }\n }\n\n const jobExecutionRow = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n if (!jobExecutionRow) {\n throw new Error(`Job execution not found resolving lease expiry: ${params.jobExecutionId}`);\n }\n const status: RuntimeCompletionStatus =\n jobExecutionRow.status === 'succeeded' ? 'succeeded' : 'failed';\n return {status, executionVersion: jobExecutionRow.version, changedJobExecution};\n });\n\n recordWorkflowJobExecutionLeaseExpiryResolved(result.status);\n if (result.changedJobExecution) {\n recordWorkflowJobExecutionStatusChanged(result.changedJobExecution.status);\n }\n\n return {status: result.status, executionVersion: result.executionVersion};\n}\n\nfunction statusReasonForStepCompletion(status: RuntimeCompletionStatus): JobStatusReason | null {\n return status === 'failed' ? 'step_failed' : null;\n}\n"],"names":["readPersistedWorkflowModel","WORKFLOWS_JOB_EXECUTION_TIMED_OUT","and","asc","desc","eq","isNull","notInArray","sql","InterpolationUnresolvableError","JobNotFoundError","JobOutputNotJsonSafeError","JobOutputTooLargeError","JobOutputTooManyEntriesError","deriveJobExecutionOutputs","deriveCompletion","isTerminal","recordWorkflowJobExecutionLeaseExpiryResolved","recordWorkflowJobExecutionQueued","recordWorkflowJobExecutionStarted","recordWorkflowJobExecutionStatusChanged","recordWorkflowJobExecutionTimedOut","db","writeWorkflowsOutboxEvent","jobExecutions","toJobExecution","jobs","toJob","stepAttempts","toStepAttempt","steps","toStep","workflowRunAttempts","toWorkflowRun","workflowRuns","getDirectDependencyJobContexts","loadReferencedVariables","getWorkflowContextForJob","optimisticLockRetry","TERMINAL_EXECUTION_STATUSES","bulkUpdateStepStatuses","getStepsByJobExecutionIdForUpdate","getJobExecutionFallbackName","tx","jobExecutionId","row","select","job","from","innerJoin","jobId","id","where","limit","name","key","getJobExecutionById","rows","jobExecution","undefined","getJobExecutionsByWorkflowRunAttemptId","workflowRunAttemptId","orderBy","sequence","map","getJobExecutionsByJobId","getFirstJobExecutionByJobId","getLatestJobExecutionByJobId","resolveJobExecutionOutputs","params","target","execution","attempt","run","workflowRunId","model","modelJob","find","outputs","executionRows","fallbackName","executions","status","statusReason","stepRows","position","attemptRows","executionOrder","dependencyJobs","attempts","vars","workspaceId","projectId","definitionId","secrets","updateJobExecutionStatusAtVersion","includes","error","update","set","version","updatedAt","Date","markTimedOut","timedOutAt","finishedAt","expectedVersion","returning","changed","updateJobExecutionStatus","result","transaction","updateFn","fetchFn","matchFn","failureMessage","recordJobExecutionQueuedAt","updated","queuedAt","length","recordJobExecutionStartedAt","startedAt","failJobExecutionAsTimedOut","identity","type","payload","resolveJobExecutionAfterLeaseExpiry","jobExecutionSteps","changedJobExecution","every","step","statusReasonForStepCompletion","jobExecutionRow","Error","executionVersion"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/db/workflow-runs/job-executions.ts"],"sourcesContent":["import {readPersistedWorkflowModel} from '@shipfox/api-definitions-dto';\nimport type {SecretsInterModuleClient} from '@shipfox/api-secrets-dto/inter-module';\nimport {WORKFLOWS_JOB_EXECUTION_TIMED_OUT} from '@shipfox/api-workflows-dto';\nimport {and, asc, desc, eq, isNull, notInArray, sql} from 'drizzle-orm';\nimport type {JobStatusReason} from '#core/entities/job.js';\nimport type {JobExecution, JobExecutionStatus} from '#core/entities/job-execution.js';\nimport {\n InterpolationUnresolvableError,\n JobNotFoundError,\n JobOutputNotJsonSafeError,\n JobOutputTooLargeError,\n JobOutputTooManyEntriesError,\n} from '#core/errors.js';\nimport {deriveJobExecutionOutputs} from '#core/job-transition/index.js';\nimport {deriveCompletion, isTerminal} from '#core/step-transition/decide-step-transition.js';\nimport type {RuntimeCompletionStatus} from '#core/workflow-scheduling/runtime-dag.js';\nimport {\n recordWorkflowJobExecutionLeaseExpiryResolved,\n recordWorkflowJobExecutionQueued,\n recordWorkflowJobExecutionStarted,\n recordWorkflowJobExecutionStatusChanged,\n recordWorkflowJobExecutionTimedOut,\n} from '#metrics/instance.js';\nimport {db, type Tx} from '../db.js';\nimport {writeWorkflowsOutboxEvent} from '../outbox-writes.js';\nimport {jobExecutions, toJobExecution} from '../schema/job-executions.js';\nimport {jobs, toJob} from '../schema/jobs.js';\nimport {stepAttempts, toStepAttempt} from '../schema/step-attempts.js';\nimport {steps, toStep} from '../schema/steps.js';\nimport {workflowRunAttempts} from '../schema/workflow-run-attempts.js';\nimport {toWorkflowRun, workflowRuns} from '../schema/workflow-runs.js';\nimport {getDirectDependencyJobContexts} from './jobs.js';\nimport {loadReferencedVariables} from './runs.js';\nimport {\n getWorkflowContextForJob,\n optimisticLockRetry,\n TERMINAL_EXECUTION_STATUSES,\n} from './shared.js';\nimport {bulkUpdateStepStatuses, getStepsByJobExecutionIdForUpdate} from './steps.js';\n\nasync function getJobExecutionFallbackName(tx: Tx, jobExecutionId: string): Promise<string> {\n const [row] = await tx\n .select({job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.id, jobExecutionId))\n .limit(1);\n if (!row) throw new JobNotFoundError(jobExecutionId);\n return row.job.name ?? row.job.key;\n}\n\nexport async function getJobExecutionById(id: string, tx?: Tx): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.id, id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row.jobExecution, row.job.name ?? row.job.key) : undefined;\n}\n\nexport async function getJobExecutionsByWorkflowRunAttemptId(\n workflowRunAttemptId: string,\n): Promise<JobExecution[]> {\n const rows = await db()\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobs.workflowRunAttemptId, workflowRunAttemptId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return rows.map((row) => toJobExecution(row.jobExecution, row.job.name ?? row.job.key));\n}\n\nexport async function getJobExecutionsByJobId(jobId: string): Promise<JobExecution[]> {\n const rows = await db()\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n return rows.map((row) => toJobExecution(row.jobExecution, row.job.name ?? row.job.key));\n}\n\nexport async function getFirstJobExecutionByJobId(\n jobId: string,\n tx?: Tx,\n): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row.jobExecution, row.job.name ?? row.job.key) : undefined;\n}\n\nexport async function getLatestJobExecutionByJobId(\n jobId: string,\n tx?: Tx,\n): Promise<JobExecution | undefined> {\n const rows = await (tx ?? db())\n .select({jobExecution: jobExecutions, job: jobs})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .where(eq(jobExecutions.jobId, jobId))\n .orderBy(desc(jobExecutions.sequence), desc(jobExecutions.id))\n .limit(1);\n const row = rows[0];\n return row ? toJobExecution(row.jobExecution, row.job.name ?? row.job.key) : undefined;\n}\n\nexport interface UpdateJobExecutionStatusAtVersionParams {\n jobExecutionId: string;\n status: JobExecutionStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n statusReasonMessage?: string | null | undefined;\n markTimedOut?: boolean;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}\n\nconst MAX_STATUS_REASON_MESSAGE_LENGTH = 2048;\n\nexport type JobOutputFailure = {\n statusReason: Extract<JobStatusReason, 'output_invalid' | 'output_too_large'>;\n statusReasonMessage: string;\n};\n\nexport function classifyJobOutputFailure(error: unknown): JobOutputFailure | null {\n if (error instanceof JobOutputTooLargeError) {\n return {\n statusReason: 'output_too_large',\n statusReasonMessage: boundedStatusReasonMessage(error.message),\n };\n }\n\n if (\n (error instanceof InterpolationUnresolvableError && error.field === 'job.outputs') ||\n error instanceof JobOutputNotJsonSafeError ||\n error instanceof JobOutputTooManyEntriesError\n ) {\n return {\n statusReason: 'output_invalid',\n statusReasonMessage: boundedStatusReasonMessage(error.message),\n };\n }\n\n return null;\n}\n\nfunction boundedStatusReasonMessage(message: string): string {\n return message.length <= MAX_STATUS_REASON_MESSAGE_LENGTH\n ? message\n : `${message.slice(0, MAX_STATUS_REASON_MESSAGE_LENGTH - 1)}…`;\n}\n\nasync function resolveJobExecutionOutputs(\n tx: Tx,\n params: {\n jobExecutionId: string;\n status: JobExecutionStatus;\n statusReason: JobStatusReason | null;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n },\n): Promise<Record<string, unknown> | null> {\n const [target] = await tx\n .select({execution: jobExecutions, job: jobs, attempt: workflowRunAttempts, run: workflowRuns})\n .from(jobExecutions)\n .innerJoin(jobs, eq(jobExecutions.jobId, jobs.id))\n .innerJoin(workflowRunAttempts, eq(jobs.workflowRunAttemptId, workflowRunAttempts.id))\n .innerJoin(workflowRuns, eq(workflowRunAttempts.workflowRunId, workflowRuns.id))\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1);\n if (!target) throw new JobNotFoundError(params.jobExecutionId);\n const model =\n target.attempt.model === null ? null : readPersistedWorkflowModel(target.attempt.model);\n if (!model) return null;\n const modelJob = model.jobs.find((job) => job.key === target.job.key);\n if (!modelJob || modelJob.outputs === undefined) return null;\n\n const executionRows = await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.jobId, target.job.id))\n .orderBy(asc(jobExecutions.sequence), asc(jobExecutions.id));\n const fallbackName = target.job.name ?? target.job.key;\n const executions = executionRows.map((row) =>\n row.id === target.execution.id\n ? toJobExecution(\n {...row, status: params.status, statusReason: params.statusReason},\n fallbackName,\n )\n : toJobExecution(row, fallbackName),\n );\n const jobExecution = executions.find((execution) => execution.id === target.execution.id);\n if (!jobExecution) throw new JobNotFoundError(params.jobExecutionId);\n\n const stepRows = await tx\n .select()\n .from(steps)\n .where(eq(steps.jobExecutionId, params.jobExecutionId))\n .orderBy(asc(steps.position), asc(steps.id));\n const attemptRows = await tx\n .select()\n .from(stepAttempts)\n .where(eq(stepAttempts.jobExecutionId, params.jobExecutionId))\n .orderBy(asc(stepAttempts.executionOrder), asc(stepAttempts.id));\n const dependencyJobs = await getDirectDependencyJobContexts(target.job.id, tx);\n\n return deriveJobExecutionOutputs({\n run: toWorkflowRun(target.run),\n modelJob,\n job: toJob(target.job),\n jobExecution,\n executions,\n steps: stepRows.map(toStep),\n attempts: attemptRows.map(toStepAttempt),\n jobs: dependencyJobs,\n vars: await loadReferencedVariables({\n model,\n jobs: [modelJob],\n workspaceId: target.run.workspaceId,\n projectId: target.run.projectId,\n definitionId: target.run.definitionId,\n secrets: params.secrets,\n }),\n });\n}\n\nasync function updateJobExecutionStatusAtVersion(\n tx: Tx,\n params: UpdateJobExecutionStatusAtVersionParams,\n): Promise<{execution: JobExecution; changed: boolean} | null> {\n let status = params.status;\n let statusReason = params.statusReason ?? null;\n let statusReasonMessage = params.statusReasonMessage ?? null;\n let outputs: Record<string, unknown> | null | undefined;\n if (TERMINAL_EXECUTION_STATUSES.includes(status)) {\n outputs = null;\n }\n if (status === 'succeeded') {\n try {\n outputs = await resolveJobExecutionOutputs(tx, {\n jobExecutionId: params.jobExecutionId,\n status,\n statusReason,\n secrets: params.secrets,\n });\n } catch (error) {\n const outputFailure = classifyJobOutputFailure(error);\n if (outputFailure === null) throw error;\n status = 'failed';\n statusReason = outputFailure.statusReason;\n statusReasonMessage = outputFailure.statusReasonMessage;\n outputs = null;\n }\n }\n\n const rows = await tx\n .update(jobExecutions)\n .set({\n status,\n statusReason,\n statusReasonMessage,\n ...(outputs === undefined ? {} : {outputs}),\n version: sql`${jobExecutions.version} + 1`,\n updatedAt: new Date(),\n ...(params.markTimedOut ? {timedOutAt: new Date()} : {}),\n ...(TERMINAL_EXECUTION_STATUSES.includes(status) ? {finishedAt: sql`now()`} : {}),\n })\n .where(\n and(\n eq(jobExecutions.id, params.jobExecutionId),\n eq(jobExecutions.version, params.expectedVersion),\n notInArray(jobExecutions.status, TERMINAL_EXECUTION_STATUSES),\n ),\n )\n .returning();\n\n const row = rows[0];\n if (!row) return null;\n return {\n execution: toJobExecution(row, await getJobExecutionFallbackName(tx, row.id)),\n changed: true,\n };\n}\n\nexport interface UpdateJobExecutionStatusParams {\n jobExecutionId: string;\n status: JobExecutionStatus;\n expectedVersion: number;\n statusReason?: JobStatusReason | null | undefined;\n statusReasonMessage?: string | null | undefined;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}\n\nexport async function updateJobExecutionStatus(\n params: UpdateJobExecutionStatusParams,\n): Promise<JobExecution> {\n const statusReason = params.statusReason ?? null;\n const result = await db().transaction(async (tx) => {\n return await optimisticLockRetry({\n updateFn: () =>\n updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: params.status,\n expectedVersion: params.expectedVersion,\n statusReason,\n statusReasonMessage: params.statusReasonMessage,\n secrets: params.secrets,\n }),\n fetchFn: async () => {\n const row = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n return row ? toJobExecution(row, await getJobExecutionFallbackName(tx, row.id)) : undefined;\n },\n matchFn: (execution) =>\n (execution.status === params.status && execution.statusReason === statusReason) ||\n TERMINAL_EXECUTION_STATUSES.includes(execution.status)\n ? {execution, changed: false}\n : null,\n failureMessage: `Optimistic lock failure: job execution ${params.jobExecutionId} version ${params.expectedVersion}`,\n });\n });\n\n if (result.changed) recordWorkflowJobExecutionStatusChanged(result.execution.status);\n\n return result.execution;\n}\n\nexport async function recordJobExecutionQueuedAt(params: {\n jobExecutionId: string;\n queuedAt: Date;\n}): Promise<void> {\n const updated = await db()\n .update(jobExecutions)\n .set({queuedAt: params.queuedAt})\n .where(and(eq(jobExecutions.id, params.jobExecutionId), isNull(jobExecutions.queuedAt)))\n .returning({id: jobExecutions.id});\n\n if (updated.length > 0) recordWorkflowJobExecutionQueued();\n}\n\nexport async function recordJobExecutionStartedAt(params: {\n jobExecutionId: string;\n startedAt: Date;\n}): Promise<void> {\n const updated = await db()\n .update(jobExecutions)\n .set({startedAt: params.startedAt})\n .where(and(eq(jobExecutions.id, params.jobExecutionId), isNull(jobExecutions.startedAt)))\n .returning({id: jobExecutions.id});\n\n if (updated.length > 0) recordWorkflowJobExecutionStarted();\n}\n\nexport async function failJobExecutionAsTimedOut(params: {\n jobExecutionId: string;\n workflowRunAttemptId: string;\n expectedVersion: number;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}): Promise<JobExecution> {\n const result = await db().transaction(async (tx) => {\n const updated = await optimisticLockRetry({\n updateFn: () =>\n updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: 'failed',\n expectedVersion: params.expectedVersion,\n statusReason: 'timed_out',\n markTimedOut: true,\n secrets: params.secrets,\n }),\n fetchFn: async () => {\n const row = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n return row ? toJobExecution(row, await getJobExecutionFallbackName(tx, row.id)) : undefined;\n },\n matchFn: (execution) => (execution.timedOutAt !== null ? {execution, changed: false} : null),\n failureMessage: `Optimistic lock failure: job execution ${params.jobExecutionId} version ${params.expectedVersion}`,\n });\n\n if (updated.changed) {\n const identity = await getWorkflowContextForJob(updated.execution.jobId, tx);\n await writeWorkflowsOutboxEvent(tx, {\n type: WORKFLOWS_JOB_EXECUTION_TIMED_OUT,\n payload: {\n jobId: identity.jobId,\n jobExecutionId: params.jobExecutionId,\n workflowRunAttemptId: identity.workflowRunAttemptId,\n },\n });\n }\n\n return updated;\n });\n\n if (result.changed) {\n recordWorkflowJobExecutionStatusChanged(result.execution.status);\n recordWorkflowJobExecutionTimedOut();\n }\n\n return result.execution;\n}\n\nexport async function resolveJobExecutionAfterLeaseExpiry(params: {\n jobExecutionId: string;\n expectedVersion: number;\n secrets?: Pick<SecretsInterModuleClient, 'getVariablesByNamespace'> | undefined;\n}): Promise<{status: RuntimeCompletionStatus; executionVersion: number}> {\n const result = await db().transaction(async (tx) => {\n const jobExecutionSteps = await getStepsByJobExecutionIdForUpdate(params.jobExecutionId, tx);\n let changedJobExecution: JobExecution | null = null;\n\n if (jobExecutionSteps.length === 0) {\n throw new JobNotFoundError(params.jobExecutionId);\n }\n\n if (jobExecutionSteps.every((step) => isTerminal(step.status))) {\n const status = deriveCompletion(jobExecutionSteps);\n const updated = await updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status,\n expectedVersion: params.expectedVersion,\n statusReason: statusReasonForStepCompletion(status),\n secrets: params.secrets,\n });\n changedJobExecution = updated?.changed ? updated.execution : null;\n } else {\n const updated = await updateJobExecutionStatusAtVersion(tx, {\n jobExecutionId: params.jobExecutionId,\n status: 'failed',\n expectedVersion: params.expectedVersion,\n statusReason: 'runner_lost',\n secrets: params.secrets,\n });\n if (updated?.changed) {\n changedJobExecution = updated.execution;\n await bulkUpdateStepStatuses(\n {jobExecutionId: params.jobExecutionId, status: 'cancelled'},\n tx,\n );\n }\n }\n\n const jobExecutionRow = (\n await tx\n .select()\n .from(jobExecutions)\n .where(eq(jobExecutions.id, params.jobExecutionId))\n .limit(1)\n )[0];\n if (!jobExecutionRow) {\n throw new Error(`Job execution not found resolving lease expiry: ${params.jobExecutionId}`);\n }\n const status: RuntimeCompletionStatus =\n jobExecutionRow.status === 'succeeded' ? 'succeeded' : 'failed';\n return {status, executionVersion: jobExecutionRow.version, changedJobExecution};\n });\n\n recordWorkflowJobExecutionLeaseExpiryResolved(result.status);\n if (result.changedJobExecution) {\n recordWorkflowJobExecutionStatusChanged(result.changedJobExecution.status);\n }\n\n return {status: result.status, executionVersion: result.executionVersion};\n}\n\nfunction statusReasonForStepCompletion(status: RuntimeCompletionStatus): JobStatusReason | null {\n return status === 'failed' ? 'step_failed' : null;\n}\n"],"names":["readPersistedWorkflowModel","WORKFLOWS_JOB_EXECUTION_TIMED_OUT","and","asc","desc","eq","isNull","notInArray","sql","InterpolationUnresolvableError","JobNotFoundError","JobOutputNotJsonSafeError","JobOutputTooLargeError","JobOutputTooManyEntriesError","deriveJobExecutionOutputs","deriveCompletion","isTerminal","recordWorkflowJobExecutionLeaseExpiryResolved","recordWorkflowJobExecutionQueued","recordWorkflowJobExecutionStarted","recordWorkflowJobExecutionStatusChanged","recordWorkflowJobExecutionTimedOut","db","writeWorkflowsOutboxEvent","jobExecutions","toJobExecution","jobs","toJob","stepAttempts","toStepAttempt","steps","toStep","workflowRunAttempts","toWorkflowRun","workflowRuns","getDirectDependencyJobContexts","loadReferencedVariables","getWorkflowContextForJob","optimisticLockRetry","TERMINAL_EXECUTION_STATUSES","bulkUpdateStepStatuses","getStepsByJobExecutionIdForUpdate","getJobExecutionFallbackName","tx","jobExecutionId","row","select","job","from","innerJoin","jobId","id","where","limit","name","key","getJobExecutionById","rows","jobExecution","undefined","getJobExecutionsByWorkflowRunAttemptId","workflowRunAttemptId","orderBy","sequence","map","getJobExecutionsByJobId","getFirstJobExecutionByJobId","getLatestJobExecutionByJobId","MAX_STATUS_REASON_MESSAGE_LENGTH","classifyJobOutputFailure","error","statusReason","statusReasonMessage","boundedStatusReasonMessage","message","field","length","slice","resolveJobExecutionOutputs","params","target","execution","attempt","run","workflowRunId","model","modelJob","find","outputs","executionRows","fallbackName","executions","status","stepRows","position","attemptRows","executionOrder","dependencyJobs","attempts","vars","workspaceId","projectId","definitionId","secrets","updateJobExecutionStatusAtVersion","includes","outputFailure","update","set","version","updatedAt","Date","markTimedOut","timedOutAt","finishedAt","expectedVersion","returning","changed","updateJobExecutionStatus","result","transaction","updateFn","fetchFn","matchFn","failureMessage","recordJobExecutionQueuedAt","updated","queuedAt","recordJobExecutionStartedAt","startedAt","failJobExecutionAsTimedOut","identity","type","payload","resolveJobExecutionAfterLeaseExpiry","jobExecutionSteps","changedJobExecution","every","step","statusReasonForStepCompletion","jobExecutionRow","Error","executionVersion"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/jobs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../src/db/workflow-runs/jobs.ts"],"names":[],"mappings":"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"}
@@ -224,7 +224,8 @@ export async function updateJobStatusAtVersion(tx, params) {
224
224
  // makes the terminal fact fire exactly once across all paths.
225
225
  if (isJobTerminal(job.status)) {
226
226
  const [currentExecution] = await tx.select({
227
- id: jobExecutions.id
227
+ id: jobExecutions.id,
228
+ statusReasonMessage: jobExecutions.statusReasonMessage
228
229
  }).from(jobExecutions).where(eq(jobExecutions.jobId, job.id)).orderBy(desc(jobExecutions.sequence), desc(jobExecutions.id)).limit(1);
229
230
  const identity = await getWorkflowContextForJob(job.id, tx);
230
231
  await writeWorkflowsOutboxEvent(tx, {
@@ -235,7 +236,8 @@ export async function updateJobStatusAtVersion(tx, params) {
235
236
  workflowRunId: identity.workflowRunId,
236
237
  workflowRunAttemptId: identity.workflowRunAttemptId,
237
238
  status: job.status,
238
- statusReason: job.statusReason
239
+ statusReason: job.statusReason,
240
+ statusReasonMessage: currentExecution?.statusReasonMessage ?? null
239
241
  }
240
242
  });
241
243
  }