@sixb/pipeline-worker 0.1.26 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,KAAK,EACV,iBAAiB,EAEjB,qBAAqB,EACtB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAI/F,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,YAAY,GAAG,WAAW,CAAC,EAC/D,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,IAAI,EAAE,IAAI,CACR,qBAAqB,EACrB,IAAI,GAAG,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAC7E,EACD,OAAO,EAAE,4BAA4B,EACrC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,IAAI,EAAE,IAAI,CACR,qBAAqB,EACnB,IAAI,GACJ,eAAe,GACf,YAAY,GACZ,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,aAAa,GACb,OAAO,CACV,EACD,OAAO,EAAE,4BAA4B,EACrC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,qBAAqB,EAC3B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,EACjF,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAQf"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,KAAK,EACV,iBAAiB,EAEjB,qBAAqB,EACtB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAI/F,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,YAAY,GAAG,WAAW,CAAC,EAC/D,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,IAAI,EAAE,IAAI,CACR,qBAAqB,EACrB,IAAI,GAAG,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAC7E,EACD,OAAO,EAAE,4BAA4B,EACrC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,IAAI,EAAE,IAAI,CACR,qBAAqB,EACnB,IAAI,GACJ,eAAe,GACf,YAAY,GACZ,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,aAAa,GACb,OAAO,CACV,EACD,OAAO,EAAE,4BAA4B,EACrC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,qBAAqB,EAC3B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,EACjF,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAQf"}
package/dist/index.js CHANGED
@@ -1,9 +1,12 @@
1
1
  // @bun
2
2
  // src/worker.ts
3
3
  import { reportRunFailure } from "@sixb/core/internal/error-reporting";
4
+ import { captureSixbFailure as captureSixbFailure3 } from "@sixb/core/internal/errors";
4
5
  import { bindDurablePrimitiveExecution } from "@sixb/core/internal/primitive-execution";
5
- import { QueueWorker } from "@sixb/core/internal/workers";
6
- import { PIPELINE_RUN_FAILURE_CODES as PIPELINE_RUN_FAILURE_CODES3 } from "@sixb/core/storage";
6
+ import { QueueWorker, retryUnstartedRun } from "@sixb/core/internal/workers";
7
+ import {
8
+ PIPELINE_RUN_FAILURE_CODES as PIPELINE_RUN_FAILURE_CODES3
9
+ } from "@sixb/core/storage";
7
10
 
8
11
  // src/events.ts
9
12
  var SOURCE = "SixbPipelineWorker";
@@ -85,7 +88,9 @@ async function emitDatasetVersionCommitted(events, job, step, correlationId) {
85
88
  id: job.pipelineId,
86
89
  runId: job.id,
87
90
  stepId: step.run.stepId
88
- }
91
+ },
92
+ rowsChanged: step.version.rowsChanged,
93
+ lineageChanged: step.version.lineageChanged
89
94
  }
90
95
  }
91
96
  ],
@@ -619,7 +624,7 @@ async function runPipelineJob(input) {
619
624
  projectId: runtime.id,
620
625
  id: job.id
621
626
  });
622
- if (existing?.pipelineId === durableRun.pipelineId && existing.executionId === durableRun.executionId) {
627
+ if (existing?.pipelineId === durableRun.pipelineId && existing.executionId === durableRun.executionId && existing.status !== "queued") {
623
628
  throw new PipelineRunAlreadyStartedError(existing);
624
629
  }
625
630
  throw error;
@@ -746,6 +751,8 @@ class PipelineWorker extends QueueWorker {
746
751
  if (!run) {
747
752
  throw new Error(`[SixbPipelineWorker] Pipeline run '${job.payload.runId}' was not found.`);
748
753
  }
754
+ if (run.status !== "queued")
755
+ return;
749
756
  const durableExecution = await this.host.storage.executions.getById({
750
757
  projectId: this.host.id,
751
758
  id: run.executionId
@@ -790,13 +797,40 @@ class PipelineWorker extends QueueWorker {
790
797
  throw error;
791
798
  }
792
799
  }
793
- async onExecutionError(claimed, _error) {
800
+ async onExecutionError(claimed, error) {
794
801
  const run = await this.host.storage.pipelineRuns?.getById({
795
802
  projectId: this.host.id,
796
803
  id: claimed.job.payload.runId
797
804
  });
805
+ if (run?.status === "queued") {
806
+ const retry = retryUnstartedRun(claimed.job.attempt);
807
+ if (retry)
808
+ return retry;
809
+ return { kind: "fail", failure: await this.failUnstartedRun(claimed, run, error) };
810
+ }
798
811
  return run?.status === "failed" && run.error ? { kind: "fail", failure: run.error } : { kind: "fail" };
799
812
  }
813
+ async failUnstartedRun(claimed, run, error) {
814
+ const failure = captureSixbFailure3(error, {
815
+ allowedCodes: PIPELINE_RUN_FAILURE_CODES3,
816
+ defaultCode: "internal.unexpected",
817
+ details: { pipelineId: run.pipelineId, runId: run.id }
818
+ });
819
+ await this.context.pipelineRunsStorage.finish({
820
+ projectId: this.host.id,
821
+ id: run.id,
822
+ status: "failed",
823
+ error: failure
824
+ });
825
+ reportRunFailure(this.host, error, {
826
+ projectId: this.host.id,
827
+ attempt: claimed.job.attempt,
828
+ runKind: "pipeline",
829
+ run: { runId: run.id, pipelineId: run.pipelineId },
830
+ failure
831
+ });
832
+ return failure;
833
+ }
800
834
  async onAbortError(claimed, _error) {
801
835
  const run = await this.host.storage.pipelineRuns?.getById({
802
836
  projectId: this.host.id,
@@ -833,4 +867,4 @@ export {
833
867
  PipelineWorker
834
868
  };
835
869
 
836
- //# debugId=5FFC283C2E39D35B64756E2164756E21
870
+ //# debugId=93F85C427BD82A2064756E2164756E21
package/dist/index.js.map CHANGED
@@ -2,16 +2,16 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/worker.ts", "../src/events.ts", "../src/run-pipeline-job.ts", "../src/errors.ts", "../src/run-step.ts", "../src/execute-run-step.ts", "../src/step-inputs.ts", "../src/execute-sql-step.ts"],
4
4
  "sourcesContent": [
5
- "import { reportRunFailure } from \"@sixb/core/internal/error-reporting\"\nimport { bindDurablePrimitiveExecution } from \"@sixb/core/internal/primitive-execution\"\nimport type { QueueWorkerFailureDecision } from \"@sixb/core/internal/workers\"\nimport { QueueWorker } from \"@sixb/core/internal/workers\"\nimport type { ClaimedQueueJob, PipelineRunRequestedQueueJob } from \"@sixb/core/queues\"\nimport { PIPELINE_RUN_FAILURE_CODES, type PipelineRunStorage } from \"@sixb/core/storage\"\nimport {\n emitDatasetVersionCommitted,\n emitPipelineRunFinished,\n emitPipelineRunStarted,\n emitPipelineRunStepFinished,\n emitPipelineRunStepStarted,\n} from \"./events\"\nimport { PipelineRunAlreadyStartedError, runPipelineJob } from \"./run-pipeline-job\"\nimport type { PipelineJob, PipelineWorkerContext, PipelineWorkerHost } from \"./types\"\n\nexport interface PipelineWorkerOptions {\n /** Maximum pipeline run jobs this worker claims and executes at once. Defaults to 1. */\n readonly concurrency?: number\n}\n\nexport class PipelineWorker extends QueueWorker<\n PipelineRunRequestedQueueJob,\n typeof PIPELINE_RUN_FAILURE_CODES\n> {\n private readonly context: PipelineWorkerContext\n private readonly host: PipelineWorkerHost\n\n constructor(host: PipelineWorkerHost, options: PipelineWorkerOptions = {}) {\n if (host.definitions.pipelines.list().length === 0) {\n throw new Error(\"[SixbPipelineWorker] No pipeline definitions are registered.\")\n }\n\n const pipelineRunsStorage = host.storage.pipelineRuns\n if (!pipelineRunsStorage) {\n throw new Error(\"[SixbPipelineWorker] Pipeline workers require storage.pipelineRuns support.\")\n }\n\n super({\n projectId: host.id,\n queue: host.queues.pipelines,\n failureCodes: PIPELINE_RUN_FAILURE_CODES,\n workerId: `pipeline-worker-${host.id}`,\n claimLimit: options.concurrency,\n })\n\n this.context = buildPipelineContext(host, pipelineRunsStorage)\n this.host = host\n }\n\n protected async execute(\n claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,\n signal: AbortSignal\n ): Promise<void> {\n const { job } = claimed\n const pipelineRuns = this.host.storage.pipelineRuns\n if (!pipelineRuns) {\n throw new Error(\"[SixbPipelineWorker] Pipeline workers require storage.pipelineRuns support.\")\n }\n const run = await pipelineRuns.getById({ projectId: this.host.id, id: job.payload.runId })\n if (!run) {\n throw new Error(`[SixbPipelineWorker] Pipeline run '${job.payload.runId}' was not found.`)\n }\n\n const durableExecution = await this.host.storage.executions.getById({\n projectId: this.host.id,\n id: run.executionId,\n })\n if (!durableExecution) {\n throw new Error(\n `[SixbPipelineWorker] Pipeline run '${run.id}' references missing execution '${run.executionId}'.`\n )\n }\n\n const pipelineJob: PipelineJob = {\n id: run.id,\n pipelineId: run.pipelineId,\n }\n // Pipeline steps currently use host-owned lake and run storage directly. Binding still happens\n // here so the durable execution and its trusted primitive authority are validated before work.\n bindDurablePrimitiveExecution(this.host, {\n execution: durableExecution,\n primitive: { kind: \"pipeline\", id: run.pipelineId, runId: run.id },\n })\n\n try {\n await runPipelineJob({\n runtime: this.context,\n run,\n signal,\n onRunStarted: (run) =>\n emitPipelineRunStarted(this.host.events, run, durableExecution.correlationId),\n onRunFinished: (run) =>\n emitPipelineRunFinished(this.host.events, run, durableExecution.correlationId),\n onRunFailed: (error, run, failure) => {\n reportRunFailure(this.host, error, {\n projectId: this.host.id,\n attempt: job.attempt,\n runKind: \"pipeline\",\n run: {\n runId: run.id,\n pipelineId: run.pipelineId,\n },\n failure,\n })\n },\n onStepStarted: (step, context) =>\n emitPipelineRunStepStarted(\n this.host.events,\n step,\n context,\n durableExecution.correlationId\n ),\n onStepFinished: (step, context) =>\n emitPipelineRunStepFinished(\n this.host.events,\n step,\n context,\n durableExecution.correlationId\n ),\n onStepCommitted: (step) =>\n emitDatasetVersionCommitted(\n this.host.events,\n pipelineJob,\n step,\n durableExecution.correlationId\n ),\n })\n } catch (error) {\n if (error instanceof PipelineRunAlreadyStartedError) return\n throw error\n }\n }\n\n protected override async onExecutionError(\n claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,\n _error: unknown\n ): Promise<QueueWorkerFailureDecision<(typeof PIPELINE_RUN_FAILURE_CODES)[number]>> {\n // Pipeline runs are not all-or-nothing in V1. A previous step may have committed an append\n // output, so failed pipeline jobs must not be retried automatically.\n const run = await this.host.storage.pipelineRuns?.getById({\n projectId: this.host.id,\n id: claimed.job.payload.runId,\n })\n return run?.status === \"failed\" && run.error\n ? { kind: \"fail\", failure: run.error }\n : { kind: \"fail\" }\n }\n\n protected override async onAbortError(\n claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,\n _error: unknown\n ): Promise<QueueWorkerFailureDecision<(typeof PIPELINE_RUN_FAILURE_CODES)[number]>> {\n const run = await this.host.storage.pipelineRuns?.getById({\n projectId: this.host.id,\n id: claimed.job.payload.runId,\n })\n if (!run) return { kind: \"fail\" }\n\n if (!(await hasCommittedStep(this.context, run.id))) {\n return { kind: \"retry\" }\n }\n\n // After a step commit, rerunning the whole pipeline could duplicate append outputs.\n return run.status === \"cancelled\" && run.error\n ? { kind: \"fail\", failure: run.error }\n : { kind: \"fail\" }\n }\n}\n\nfunction buildPipelineContext(\n host: PipelineWorkerHost,\n pipelineRunsStorage: PipelineRunStorage\n): PipelineWorkerContext {\n return {\n id: host.id,\n pipelineRunsStorage,\n lakeStorage: host.lakeStorage,\n logging: host.logging,\n pipelines: host.definitions.pipelines,\n datasets: host.definitions.datasets,\n }\n}\n\nasync function hasCommittedStep(\n context: PipelineWorkerContext,\n pipelineRunId: string\n): Promise<boolean> {\n const result = await context.pipelineRunsStorage.listSteps({\n projectId: context.id,\n pipelineRunId,\n statuses: [\"succeeded\"],\n limit: 1,\n })\n\n return result.steps.some((step) => Boolean(step.output))\n}\n",
6
- "import type { DomainEventLog } from \"@sixb/core\"\nimport type {\n PipelineRunRecord,\n PipelineRunStatus,\n PipelineStepRunRecord,\n} from \"@sixb/core/storage\"\nimport type { PipelineJob, PipelineStepLifecycleContext, PipelineStepRunResult } from \"./types\"\n\nconst SOURCE = \"SixbPipelineWorker\"\n\nexport async function emitPipelineRunStarted(\n events: DomainEventLog | undefined,\n run: Pick<PipelineRunRecord, \"id\" | \"pipelineId\" | \"startedAt\">,\n correlationId: string\n): Promise<void> {\n if (!run.startedAt) {\n throw new Error(`[SixbPipelineWorker] Pipeline run '${run.id}' started without a timestamp.`)\n }\n await events?.emit(\n {\n events: [\n {\n type: \"pipeline.run.started\",\n payload: {\n pipelineId: run.pipelineId,\n runId: run.id,\n startedAt: run.startedAt.toISOString(),\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitPipelineRunStepStarted(\n events: DomainEventLog | undefined,\n step: Pick<\n PipelineStepRunRecord,\n \"id\" | \"pipelineRunId\" | \"pipelineId\" | \"stepId\" | \"datasetId\" | \"startedAt\"\n >,\n context: PipelineStepLifecycleContext,\n correlationId: string\n): Promise<void> {\n await events?.emit(\n {\n events: [\n {\n type: \"pipeline.run.step.started\",\n payload: {\n pipelineId: step.pipelineId,\n runId: step.pipelineRunId,\n stepRunId: step.id,\n stepId: step.stepId,\n stepIndex: context.stepIndex,\n totalSteps: context.totalSteps,\n datasetId: step.datasetId,\n startedAt: step.startedAt.toISOString(),\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitPipelineRunStepFinished(\n events: DomainEventLog | undefined,\n step: Pick<\n PipelineStepRunRecord,\n | \"id\"\n | \"pipelineRunId\"\n | \"pipelineId\"\n | \"stepId\"\n | \"datasetId\"\n | \"status\"\n | \"finishedAt\"\n | \"output\"\n | \"rowsWritten\"\n | \"error\"\n >,\n context: PipelineStepLifecycleContext,\n correlationId: string\n): Promise<void> {\n await events?.emit(\n {\n events: [\n {\n type: \"pipeline.run.step.finished\",\n payload: {\n pipelineId: step.pipelineId,\n runId: step.pipelineRunId,\n stepRunId: step.id,\n stepId: step.stepId,\n stepIndex: context.stepIndex,\n totalSteps: context.totalSteps,\n datasetId: step.datasetId,\n status: requireTerminalStatus(step.status, `Pipeline step run '${step.id}'`),\n finishedAt: requireFinishedAt(step.id, step.finishedAt).toISOString(),\n ...(step.output ? { versionId: step.output.versionId } : {}),\n ...(step.rowsWritten !== undefined ? { rowsWritten: step.rowsWritten } : {}),\n ...(step.error ? { error: step.error } : {}),\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitDatasetVersionCommitted(\n events: DomainEventLog | undefined,\n job: PipelineJob,\n step: PipelineStepRunResult,\n correlationId: string\n): Promise<void> {\n if (!step.versionCreated) return\n\n // Emit step outputs immediately so dataset event schedules can react before later steps finish.\n await events?.emit(\n {\n events: [\n {\n type: \"dataset.version.committed\" as const,\n payload: {\n datasetId: step.version.datasetId,\n versionId: step.version.versionId,\n createdAt: step.version.createdAt.toISOString(),\n producer: {\n kind: \"pipeline\" as const,\n id: job.pipelineId,\n runId: job.id,\n stepId: step.run.stepId,\n },\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitPipelineRunFinished(\n events: DomainEventLog | undefined,\n run: Pick<PipelineRunRecord, \"id\" | \"pipelineId\" | \"status\" | \"output\" | \"error\">,\n correlationId: string\n): Promise<void> {\n await events?.emit(\n {\n events: [{ type: \"pipeline.run.finished\", payload: buildPipelineRunFinishedPayload(run) }],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nfunction buildPipelineRunFinishedPayload(\n run: Pick<PipelineRunRecord, \"id\" | \"pipelineId\" | \"status\" | \"output\" | \"error\">\n) {\n return {\n pipelineId: run.pipelineId,\n runId: run.id,\n status: requireTerminalStatus(run.status, `Pipeline run '${run.id}'`),\n ...(run.output\n ? {\n datasetId: run.output.datasetId,\n versionId: run.output.versionId,\n }\n : {}),\n ...(run.error ? { error: run.error } : {}),\n }\n}\n\nfunction requireFinishedAt(stepRunId: string, finishedAt: Date | undefined): Date {\n if (finishedAt) {\n return finishedAt\n }\n\n throw new Error(`[SixbPipelineWorker] Pipeline step run '${stepRunId}' has no finishedAt.`)\n}\n\nfunction requireTerminalStatus(\n status: PipelineRunStatus,\n context: string\n): Exclude<PipelineRunStatus, \"queued\" | \"running\"> {\n if (status === \"queued\" || status === \"running\") {\n throw new Error(`[SixbPipelineWorker] ${context} is still running.`)\n }\n\n return status\n}\n",
7
- "import { captureSixbFailure } from \"@sixb/core/internal/errors\"\nimport { resolveLoggingService } from \"@sixb/core/internal/logging\"\nimport type { DatasetVersion } from \"@sixb/core/lake-storage\"\nimport { PIPELINE_RUN_FAILURE_CODES, type PipelineRunRecord } from \"@sixb/core/storage\"\nimport {\n createPipelineBookkeepingError,\n requireFinishedAt,\n requirePipeline,\n statusForFailure,\n throwIfAborted,\n unwrapPipelineStepFailure,\n} from \"./errors\"\nimport { runStep } from \"./run-step\"\nimport type {\n PipelineRunFinishedHandler,\n PipelineRunResult,\n PipelineStepRunResult,\n RunPipelineJobInput,\n} from \"./types\"\n\nexport class PipelineRunAlreadyStartedError extends Error {\n override readonly name = \"PipelineRunAlreadyStartedError\"\n\n constructor(readonly run: PipelineRunRecord) {\n super(`[SixbPipelineWorker] Pipeline run '${run.id}' has already started.`)\n }\n}\n\nexport async function runPipelineJob(input: RunPipelineJobInput): Promise<PipelineRunResult> {\n const { runtime, run: durableRun } = input\n const job = { id: durableRun.id, pipelineId: durableRun.pipelineId }\n const signal = input.signal ?? new AbortController().signal\n if (durableRun.projectId !== runtime.id) {\n throw new Error(\n `[SixbPipelineWorker] Pipeline run '${durableRun.id}' belongs to project '${durableRun.projectId}', not '${runtime.id}'.`\n )\n }\n const logSession = resolveLoggingService(runtime.id, runtime.logging).startExecution({\n kind: \"pipeline\",\n id: job.id,\n })\n const steps: PipelineStepRunResult[] = []\n let startedRun: PipelineRunRecord | undefined\n let finalVersion: DatasetVersion | undefined\n let finished = false\n\n throwIfAborted(signal)\n\n try {\n try {\n startedRun = await runtime.pipelineRunsStorage.start({\n projectId: runtime.id,\n id: job.id,\n })\n } catch (error) {\n const existing = await runtime.pipelineRunsStorage.getById({\n projectId: runtime.id,\n id: job.id,\n })\n if (\n existing?.pipelineId === durableRun.pipelineId &&\n existing.executionId === durableRun.executionId\n ) {\n throw new PipelineRunAlreadyStartedError(existing)\n }\n throw error\n }\n await input.onRunStarted?.(startedRun)\n\n const pipeline = requirePipeline(runtime.pipelines.getById(job.pipelineId), job)\n\n for (const [stepIndex, node] of pipeline.graph.nodes.entries()) {\n const stepResult = await runStep({\n runtime,\n pipeline,\n step: node.step,\n stepIndex,\n job,\n signal,\n logSession,\n onStepStarted: input.onStepStarted,\n onStepFinished: input.onStepFinished,\n })\n\n steps.push(stepResult)\n finalVersion = stepResult.version\n // This is the durability boundary for per-step output events.\n await input.onStepCommitted?.(stepResult)\n }\n\n let run: PipelineRunRecord\n try {\n run = await runtime.pipelineRunsStorage.finish({\n projectId: runtime.id,\n id: job.id,\n status: \"succeeded\",\n output: finalVersion\n ? {\n datasetId: finalVersion.datasetId,\n versionId: finalVersion.versionId,\n }\n : undefined,\n })\n } catch (error) {\n if (finalVersion) {\n throw createPipelineBookkeepingError({\n pipelineId: pipeline.id,\n runId: job.id,\n version: finalVersion,\n cause: error,\n })\n }\n throw error\n }\n const finishedRun = {\n ...run,\n finishedAt: requireFinishedAt({\n pipelineId: pipeline.id,\n runId: job.id,\n finishedAt: run.finishedAt,\n }),\n }\n\n finished = true\n await notifyRunFinished(input.onRunFinished, finishedRun)\n return {\n run: finishedRun,\n steps,\n version: finalVersion,\n }\n } catch (error) {\n const reportedError = unwrapPipelineStepFailure(error)\n if (startedRun && !finished) {\n const status = statusForFailure(signal, error)\n try {\n const failure = captureSixbFailure(error, {\n allowedCodes: PIPELINE_RUN_FAILURE_CODES,\n defaultCode: status === \"cancelled\" ? \"runtime.cancelled\" : \"internal.unexpected\",\n details: { pipelineId: durableRun.pipelineId, runId: job.id },\n })\n const run = await runtime.pipelineRunsStorage.finish({\n projectId: runtime.id,\n id: job.id,\n status,\n error: failure,\n })\n if (status === \"failed\" && run.status === \"failed\") {\n input.onRunFailed?.(reportedError, run, failure)\n }\n await notifyRunFinished(input.onRunFinished, run)\n } catch {\n // The run did not transition to the requested terminal status.\n }\n }\n\n throw reportedError\n } finally {\n await logSession.flush()\n }\n}\n\nasync function notifyRunFinished(\n handler: PipelineRunFinishedHandler | undefined,\n run: PipelineRunRecord\n): Promise<void> {\n try {\n await handler?.(run)\n } catch (error) {\n // The built-in event log reports lost batches itself. Anything reaching here is a broken\n // invariant in a custom lifecycle handler and must not change an already durable outcome.\n console.error(\"[SixbPipelineWorker] Pipeline run lifecycle handler failed:\", error)\n }\n}\n",
5
+ "import type { SixbFailure } from \"@sixb/core\"\nimport { reportRunFailure } from \"@sixb/core/internal/error-reporting\"\nimport { captureSixbFailure } from \"@sixb/core/internal/errors\"\nimport { bindDurablePrimitiveExecution } from \"@sixb/core/internal/primitive-execution\"\nimport type { QueueWorkerFailureDecision } from \"@sixb/core/internal/workers\"\nimport { QueueWorker, retryUnstartedRun } from \"@sixb/core/internal/workers\"\nimport type { ClaimedQueueJob, PipelineRunRequestedQueueJob } from \"@sixb/core/queues\"\nimport {\n PIPELINE_RUN_FAILURE_CODES,\n type PipelineRunFailureCode,\n type PipelineRunRecord,\n type PipelineRunStorage,\n} from \"@sixb/core/storage\"\nimport {\n emitDatasetVersionCommitted,\n emitPipelineRunFinished,\n emitPipelineRunStarted,\n emitPipelineRunStepFinished,\n emitPipelineRunStepStarted,\n} from \"./events\"\nimport { PipelineRunAlreadyStartedError, runPipelineJob } from \"./run-pipeline-job\"\nimport type { PipelineJob, PipelineWorkerContext, PipelineWorkerHost } from \"./types\"\n\nexport interface PipelineWorkerOptions {\n /** Maximum pipeline run jobs this worker claims and executes at once. Defaults to 1. */\n readonly concurrency?: number\n}\n\nexport class PipelineWorker extends QueueWorker<\n PipelineRunRequestedQueueJob,\n typeof PIPELINE_RUN_FAILURE_CODES\n> {\n private readonly context: PipelineWorkerContext\n private readonly host: PipelineWorkerHost\n\n constructor(host: PipelineWorkerHost, options: PipelineWorkerOptions = {}) {\n if (host.definitions.pipelines.list().length === 0) {\n throw new Error(\"[SixbPipelineWorker] No pipeline definitions are registered.\")\n }\n\n const pipelineRunsStorage = host.storage.pipelineRuns\n if (!pipelineRunsStorage) {\n throw new Error(\"[SixbPipelineWorker] Pipeline workers require storage.pipelineRuns support.\")\n }\n\n super({\n projectId: host.id,\n queue: host.queues.pipelines,\n failureCodes: PIPELINE_RUN_FAILURE_CODES,\n workerId: `pipeline-worker-${host.id}`,\n claimLimit: options.concurrency,\n })\n\n this.context = buildPipelineContext(host, pipelineRunsStorage)\n this.host = host\n }\n\n protected async execute(\n claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,\n signal: AbortSignal\n ): Promise<void> {\n const { job } = claimed\n const pipelineRuns = this.host.storage.pipelineRuns\n if (!pipelineRuns) {\n throw new Error(\"[SixbPipelineWorker] Pipeline workers require storage.pipelineRuns support.\")\n }\n const run = await pipelineRuns.getById({ projectId: this.host.id, id: job.payload.runId })\n if (!run) {\n throw new Error(`[SixbPipelineWorker] Pipeline run '${job.payload.runId}' was not found.`)\n }\n\n // Each trigger that joined this run published its own job for it. Once one of them has started\n // the run, the others have nothing left to do.\n if (run.status !== \"queued\") return\n\n const durableExecution = await this.host.storage.executions.getById({\n projectId: this.host.id,\n id: run.executionId,\n })\n if (!durableExecution) {\n throw new Error(\n `[SixbPipelineWorker] Pipeline run '${run.id}' references missing execution '${run.executionId}'.`\n )\n }\n\n const pipelineJob: PipelineJob = {\n id: run.id,\n pipelineId: run.pipelineId,\n }\n // Pipeline steps currently use host-owned lake and run storage directly. Binding still happens\n // here so the durable execution and its trusted primitive authority are validated before work.\n bindDurablePrimitiveExecution(this.host, {\n execution: durableExecution,\n primitive: { kind: \"pipeline\", id: run.pipelineId, runId: run.id },\n })\n\n try {\n await runPipelineJob({\n runtime: this.context,\n run,\n signal,\n onRunStarted: (run) =>\n emitPipelineRunStarted(this.host.events, run, durableExecution.correlationId),\n onRunFinished: (run) =>\n emitPipelineRunFinished(this.host.events, run, durableExecution.correlationId),\n onRunFailed: (error, run, failure) => {\n reportRunFailure(this.host, error, {\n projectId: this.host.id,\n attempt: job.attempt,\n runKind: \"pipeline\",\n run: {\n runId: run.id,\n pipelineId: run.pipelineId,\n },\n failure,\n })\n },\n onStepStarted: (step, context) =>\n emitPipelineRunStepStarted(\n this.host.events,\n step,\n context,\n durableExecution.correlationId\n ),\n onStepFinished: (step, context) =>\n emitPipelineRunStepFinished(\n this.host.events,\n step,\n context,\n durableExecution.correlationId\n ),\n onStepCommitted: (step) =>\n emitDatasetVersionCommitted(\n this.host.events,\n pipelineJob,\n step,\n durableExecution.correlationId\n ),\n })\n } catch (error) {\n if (error instanceof PipelineRunAlreadyStartedError) return\n throw error\n }\n }\n\n protected override async onExecutionError(\n claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,\n error: unknown\n ): Promise<QueueWorkerFailureDecision<(typeof PIPELINE_RUN_FAILURE_CODES)[number]>> {\n // Pipeline runs are not all-or-nothing in V1. A previous step may have committed an append\n // output, so a job that failed after starting its run must not be retried automatically.\n const run = await this.host.storage.pipelineRuns?.getById({\n projectId: this.host.id,\n id: claimed.job.payload.runId,\n })\n if (run?.status === \"queued\") {\n const retry = retryUnstartedRun(claimed.job.attempt)\n if (retry) return retry\n\n return { kind: \"fail\", failure: await this.failUnstartedRun(claimed, run, error) }\n }\n\n return run?.status === \"failed\" && run.error\n ? { kind: \"fail\", failure: run.error }\n : { kind: \"fail\" }\n }\n\n /**\n * Automatic dispatch joins a queued run instead of queueing another, so a run whose job ends\n * before starting it must not stay queued: every later trigger would wait on it forever.\n */\n private async failUnstartedRun(\n claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,\n run: PipelineRunRecord,\n error: unknown\n ): Promise<SixbFailure<PipelineRunFailureCode>> {\n const failure = captureSixbFailure(error, {\n allowedCodes: PIPELINE_RUN_FAILURE_CODES,\n defaultCode: \"internal.unexpected\",\n details: { pipelineId: run.pipelineId, runId: run.id },\n })\n\n await this.context.pipelineRunsStorage.finish({\n projectId: this.host.id,\n id: run.id,\n status: \"failed\",\n error: failure,\n })\n\n reportRunFailure(this.host, error, {\n projectId: this.host.id,\n attempt: claimed.job.attempt,\n runKind: \"pipeline\",\n run: { runId: run.id, pipelineId: run.pipelineId },\n failure,\n })\n return failure\n }\n\n protected override async onAbortError(\n claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,\n _error: unknown\n ): Promise<QueueWorkerFailureDecision<(typeof PIPELINE_RUN_FAILURE_CODES)[number]>> {\n const run = await this.host.storage.pipelineRuns?.getById({\n projectId: this.host.id,\n id: claimed.job.payload.runId,\n })\n if (!run) return { kind: \"fail\" }\n\n if (!(await hasCommittedStep(this.context, run.id))) {\n return { kind: \"retry\" }\n }\n\n // After a step commit, rerunning the whole pipeline could duplicate append outputs.\n return run.status === \"cancelled\" && run.error\n ? { kind: \"fail\", failure: run.error }\n : { kind: \"fail\" }\n }\n}\n\nfunction buildPipelineContext(\n host: PipelineWorkerHost,\n pipelineRunsStorage: PipelineRunStorage\n): PipelineWorkerContext {\n return {\n id: host.id,\n pipelineRunsStorage,\n lakeStorage: host.lakeStorage,\n logging: host.logging,\n pipelines: host.definitions.pipelines,\n datasets: host.definitions.datasets,\n }\n}\n\nasync function hasCommittedStep(\n context: PipelineWorkerContext,\n pipelineRunId: string\n): Promise<boolean> {\n const result = await context.pipelineRunsStorage.listSteps({\n projectId: context.id,\n pipelineRunId,\n statuses: [\"succeeded\"],\n limit: 1,\n })\n\n return result.steps.some((step) => Boolean(step.output))\n}\n",
6
+ "import type { DomainEventLog } from \"@sixb/core\"\nimport type {\n PipelineRunRecord,\n PipelineRunStatus,\n PipelineStepRunRecord,\n} from \"@sixb/core/storage\"\nimport type { PipelineJob, PipelineStepLifecycleContext, PipelineStepRunResult } from \"./types\"\n\nconst SOURCE = \"SixbPipelineWorker\"\n\nexport async function emitPipelineRunStarted(\n events: DomainEventLog | undefined,\n run: Pick<PipelineRunRecord, \"id\" | \"pipelineId\" | \"startedAt\">,\n correlationId: string\n): Promise<void> {\n if (!run.startedAt) {\n throw new Error(`[SixbPipelineWorker] Pipeline run '${run.id}' started without a timestamp.`)\n }\n await events?.emit(\n {\n events: [\n {\n type: \"pipeline.run.started\",\n payload: {\n pipelineId: run.pipelineId,\n runId: run.id,\n startedAt: run.startedAt.toISOString(),\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitPipelineRunStepStarted(\n events: DomainEventLog | undefined,\n step: Pick<\n PipelineStepRunRecord,\n \"id\" | \"pipelineRunId\" | \"pipelineId\" | \"stepId\" | \"datasetId\" | \"startedAt\"\n >,\n context: PipelineStepLifecycleContext,\n correlationId: string\n): Promise<void> {\n await events?.emit(\n {\n events: [\n {\n type: \"pipeline.run.step.started\",\n payload: {\n pipelineId: step.pipelineId,\n runId: step.pipelineRunId,\n stepRunId: step.id,\n stepId: step.stepId,\n stepIndex: context.stepIndex,\n totalSteps: context.totalSteps,\n datasetId: step.datasetId,\n startedAt: step.startedAt.toISOString(),\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitPipelineRunStepFinished(\n events: DomainEventLog | undefined,\n step: Pick<\n PipelineStepRunRecord,\n | \"id\"\n | \"pipelineRunId\"\n | \"pipelineId\"\n | \"stepId\"\n | \"datasetId\"\n | \"status\"\n | \"finishedAt\"\n | \"output\"\n | \"rowsWritten\"\n | \"error\"\n >,\n context: PipelineStepLifecycleContext,\n correlationId: string\n): Promise<void> {\n await events?.emit(\n {\n events: [\n {\n type: \"pipeline.run.step.finished\",\n payload: {\n pipelineId: step.pipelineId,\n runId: step.pipelineRunId,\n stepRunId: step.id,\n stepId: step.stepId,\n stepIndex: context.stepIndex,\n totalSteps: context.totalSteps,\n datasetId: step.datasetId,\n status: requireTerminalStatus(step.status, `Pipeline step run '${step.id}'`),\n finishedAt: requireFinishedAt(step.id, step.finishedAt).toISOString(),\n ...(step.output ? { versionId: step.output.versionId } : {}),\n ...(step.rowsWritten !== undefined ? { rowsWritten: step.rowsWritten } : {}),\n ...(step.error ? { error: step.error } : {}),\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitDatasetVersionCommitted(\n events: DomainEventLog | undefined,\n job: PipelineJob,\n step: PipelineStepRunResult,\n correlationId: string\n): Promise<void> {\n if (!step.versionCreated) return\n\n // Emit step outputs immediately so dataset event schedules can react before later steps finish.\n await events?.emit(\n {\n events: [\n {\n type: \"dataset.version.committed\" as const,\n payload: {\n datasetId: step.version.datasetId,\n versionId: step.version.versionId,\n createdAt: step.version.createdAt.toISOString(),\n producer: {\n kind: \"pipeline\" as const,\n id: job.pipelineId,\n runId: job.id,\n stepId: step.run.stepId,\n },\n rowsChanged: step.version.rowsChanged,\n lineageChanged: step.version.lineageChanged,\n },\n },\n ],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nexport async function emitPipelineRunFinished(\n events: DomainEventLog | undefined,\n run: Pick<PipelineRunRecord, \"id\" | \"pipelineId\" | \"status\" | \"output\" | \"error\">,\n correlationId: string\n): Promise<void> {\n await events?.emit(\n {\n events: [{ type: \"pipeline.run.finished\", payload: buildPipelineRunFinishedPayload(run) }],\n correlationId,\n },\n { source: SOURCE }\n )\n}\n\nfunction buildPipelineRunFinishedPayload(\n run: Pick<PipelineRunRecord, \"id\" | \"pipelineId\" | \"status\" | \"output\" | \"error\">\n) {\n return {\n pipelineId: run.pipelineId,\n runId: run.id,\n status: requireTerminalStatus(run.status, `Pipeline run '${run.id}'`),\n ...(run.output\n ? {\n datasetId: run.output.datasetId,\n versionId: run.output.versionId,\n }\n : {}),\n ...(run.error ? { error: run.error } : {}),\n }\n}\n\nfunction requireFinishedAt(stepRunId: string, finishedAt: Date | undefined): Date {\n if (finishedAt) {\n return finishedAt\n }\n\n throw new Error(`[SixbPipelineWorker] Pipeline step run '${stepRunId}' has no finishedAt.`)\n}\n\nfunction requireTerminalStatus(\n status: PipelineRunStatus,\n context: string\n): Exclude<PipelineRunStatus, \"queued\" | \"running\"> {\n if (status === \"queued\" || status === \"running\") {\n throw new Error(`[SixbPipelineWorker] ${context} is still running.`)\n }\n\n return status\n}\n",
7
+ "import { captureSixbFailure } from \"@sixb/core/internal/errors\"\nimport { resolveLoggingService } from \"@sixb/core/internal/logging\"\nimport type { DatasetVersion } from \"@sixb/core/lake-storage\"\nimport { PIPELINE_RUN_FAILURE_CODES, type PipelineRunRecord } from \"@sixb/core/storage\"\nimport {\n createPipelineBookkeepingError,\n requireFinishedAt,\n requirePipeline,\n statusForFailure,\n throwIfAborted,\n unwrapPipelineStepFailure,\n} from \"./errors\"\nimport { runStep } from \"./run-step\"\nimport type {\n PipelineRunFinishedHandler,\n PipelineRunResult,\n PipelineStepRunResult,\n RunPipelineJobInput,\n} from \"./types\"\n\nexport class PipelineRunAlreadyStartedError extends Error {\n override readonly name = \"PipelineRunAlreadyStartedError\"\n\n constructor(readonly run: PipelineRunRecord) {\n super(`[SixbPipelineWorker] Pipeline run '${run.id}' has already started.`)\n }\n}\n\nexport async function runPipelineJob(input: RunPipelineJobInput): Promise<PipelineRunResult> {\n const { runtime, run: durableRun } = input\n const job = { id: durableRun.id, pipelineId: durableRun.pipelineId }\n const signal = input.signal ?? new AbortController().signal\n if (durableRun.projectId !== runtime.id) {\n throw new Error(\n `[SixbPipelineWorker] Pipeline run '${durableRun.id}' belongs to project '${durableRun.projectId}', not '${runtime.id}'.`\n )\n }\n const logSession = resolveLoggingService(runtime.id, runtime.logging).startExecution({\n kind: \"pipeline\",\n id: job.id,\n })\n const steps: PipelineStepRunResult[] = []\n let startedRun: PipelineRunRecord | undefined\n let finalVersion: DatasetVersion | undefined\n let finished = false\n\n throwIfAborted(signal)\n\n try {\n try {\n startedRun = await runtime.pipelineRunsStorage.start({\n projectId: runtime.id,\n id: job.id,\n })\n } catch (error) {\n const existing = await runtime.pipelineRunsStorage.getById({\n projectId: runtime.id,\n id: job.id,\n })\n // A run still queued did not start elsewhere: the start itself failed.\n if (\n existing?.pipelineId === durableRun.pipelineId &&\n existing.executionId === durableRun.executionId &&\n existing.status !== \"queued\"\n ) {\n throw new PipelineRunAlreadyStartedError(existing)\n }\n throw error\n }\n await input.onRunStarted?.(startedRun)\n\n const pipeline = requirePipeline(runtime.pipelines.getById(job.pipelineId), job)\n\n for (const [stepIndex, node] of pipeline.graph.nodes.entries()) {\n const stepResult = await runStep({\n runtime,\n pipeline,\n step: node.step,\n stepIndex,\n job,\n signal,\n logSession,\n onStepStarted: input.onStepStarted,\n onStepFinished: input.onStepFinished,\n })\n\n steps.push(stepResult)\n finalVersion = stepResult.version\n // This is the durability boundary for per-step output events.\n await input.onStepCommitted?.(stepResult)\n }\n\n let run: PipelineRunRecord\n try {\n run = await runtime.pipelineRunsStorage.finish({\n projectId: runtime.id,\n id: job.id,\n status: \"succeeded\",\n output: finalVersion\n ? {\n datasetId: finalVersion.datasetId,\n versionId: finalVersion.versionId,\n }\n : undefined,\n })\n } catch (error) {\n if (finalVersion) {\n throw createPipelineBookkeepingError({\n pipelineId: pipeline.id,\n runId: job.id,\n version: finalVersion,\n cause: error,\n })\n }\n throw error\n }\n const finishedRun = {\n ...run,\n finishedAt: requireFinishedAt({\n pipelineId: pipeline.id,\n runId: job.id,\n finishedAt: run.finishedAt,\n }),\n }\n\n finished = true\n await notifyRunFinished(input.onRunFinished, finishedRun)\n return {\n run: finishedRun,\n steps,\n version: finalVersion,\n }\n } catch (error) {\n const reportedError = unwrapPipelineStepFailure(error)\n if (startedRun && !finished) {\n const status = statusForFailure(signal, error)\n try {\n const failure = captureSixbFailure(error, {\n allowedCodes: PIPELINE_RUN_FAILURE_CODES,\n defaultCode: status === \"cancelled\" ? \"runtime.cancelled\" : \"internal.unexpected\",\n details: { pipelineId: durableRun.pipelineId, runId: job.id },\n })\n const run = await runtime.pipelineRunsStorage.finish({\n projectId: runtime.id,\n id: job.id,\n status,\n error: failure,\n })\n if (status === \"failed\" && run.status === \"failed\") {\n input.onRunFailed?.(reportedError, run, failure)\n }\n await notifyRunFinished(input.onRunFinished, run)\n } catch {\n // The run did not transition to the requested terminal status.\n }\n }\n\n throw reportedError\n } finally {\n await logSession.flush()\n }\n}\n\nasync function notifyRunFinished(\n handler: PipelineRunFinishedHandler | undefined,\n run: PipelineRunRecord\n): Promise<void> {\n try {\n await handler?.(run)\n } catch (error) {\n // The built-in event log reports lost batches itself. Anything reaching here is a broken\n // invariant in a custom lifecycle handler and must not change an already durable outcome.\n console.error(\"[SixbPipelineWorker] Pipeline run lifecycle handler failed:\", error)\n }\n}\n",
8
8
  "import type { DatasetDefinition, PipelineDefinition } from \"@sixb/core\"\nimport { createSixbError, isSixbError, summarizeErrorMessage } from \"@sixb/core/internal/errors\"\nimport type { DatasetVersion } from \"@sixb/core/lake-storage\"\nimport type { PipelineRunStatus } from \"@sixb/core/storage\"\nimport type { PipelineJob } from \"./types\"\n\nexport function throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw createAbortError()\n }\n}\n\nexport function statusForFailure(\n signal: AbortSignal,\n error: unknown\n): Extract<PipelineRunStatus, \"failed\" | \"cancelled\"> {\n return signal.aborted || isAbortError(error) ? \"cancelled\" : \"failed\"\n}\n\nexport function requireFinishedAt(input: {\n readonly pipelineId: string\n readonly runId: string\n readonly finishedAt: Date | undefined\n}): Date {\n if (input.finishedAt) {\n return input.finishedAt\n }\n\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline run '${input.runId}' finished without a finishedAt timestamp.`,\n { details: { pipelineId: input.pipelineId, runId: input.runId } }\n )\n}\n\nexport function createStepBookkeepingError(options: {\n readonly pipelineId: string\n readonly pipelineRunId: string\n readonly stepId: string\n readonly stepRunId: string\n readonly version: DatasetVersion\n readonly cause: unknown\n}): Error {\n // The dataset version is already durable; retrying the whole pipeline could duplicate appends.\n return createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${options.pipelineId}' step '${options.stepId}' committed dataset version '${options.version.versionId}', but failed to finalize step run '${options.stepRunId}'. The dataset commit may already have succeeded and the step run record may need repair.`,\n {\n cause: options.cause,\n details: {\n pipelineId: options.pipelineId,\n pipelineRunId: options.pipelineRunId,\n stepId: options.stepId,\n stepRunId: options.stepRunId,\n datasetId: options.version.datasetId,\n versionId: options.version.versionId,\n },\n }\n )\n}\n\nexport function createPipelineStepFailure(options: {\n readonly pipelineId: string\n readonly pipelineRunId: string\n readonly stepId: string\n readonly stepRunId?: string\n readonly cause: unknown\n}) {\n return createSixbError(\n \"pipeline.step_failed\",\n summarizeErrorMessage(options.cause, \"Pipeline step execution failed.\"),\n {\n cause: options.cause,\n details: {\n pipelineId: options.pipelineId,\n pipelineRunId: options.pipelineRunId,\n stepId: options.stepId,\n ...(options.stepRunId ? { stepRunId: options.stepRunId } : {}),\n },\n }\n )\n}\n\nexport function unwrapPipelineStepFailure(error: unknown): unknown {\n return isSixbError(error) && error.code === \"pipeline.step_failed\" && error.cause !== undefined\n ? error.cause\n : error\n}\n\nexport function createPipelineBookkeepingError(options: {\n readonly pipelineId: string\n readonly runId: string\n readonly version: DatasetVersion\n readonly cause: unknown\n}): Error {\n return createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${options.pipelineId}' committed final dataset version '${options.version.versionId}', but failed to finalize pipeline run '${options.runId}'. The dataset commit may already have succeeded and the pipeline run record may need repair.`,\n {\n cause: options.cause,\n details: {\n pipelineId: options.pipelineId,\n runId: options.runId,\n datasetId: options.version.datasetId,\n versionId: options.version.versionId,\n },\n }\n )\n}\n\nexport function requirePipeline(\n pipeline: PipelineDefinition | null,\n job: PipelineJob\n): PipelineDefinition {\n if (!pipeline) {\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Unknown pipeline '${job.pipelineId}'.`,\n { details: { pipelineId: job.pipelineId, runId: job.id } }\n )\n }\n\n return pipeline\n}\n\nexport function requireRegisteredDataset(options: {\n readonly dataset: DatasetDefinition | null\n readonly pipelineId: string\n readonly pipelineRunId: string\n readonly stepId: string\n readonly role: \"input\" | \"output\"\n readonly name?: string\n readonly datasetId: string\n}): DatasetDefinition {\n if (options.dataset) {\n return options.dataset\n }\n\n const namedRole = options.role === \"input\" ? `input '${options.name ?? \"unknown\"}'` : \"output\"\n\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${options.pipelineId}' step '${options.stepId}' ${namedRole} references unknown dataset '${options.datasetId}'.`,\n {\n details: {\n pipelineId: options.pipelineId,\n pipelineRunId: options.pipelineRunId,\n stepId: options.stepId,\n datasetId: options.datasetId,\n },\n }\n )\n}\n\nfunction createAbortError(): Error {\n const error = new Error(\"Worker runtime aborted.\")\n error.name = \"AbortError\"\n return error\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\"\n}\n",
9
9
  "import type { DatasetDefinition, PipelineDefinition, PipelineStepDefinition } from \"@sixb/core\"\nimport { lakeDatasetDefinition } from \"@sixb/core/internal/datasets\"\nimport { captureSixbFailure } from \"@sixb/core/internal/errors\"\nimport type { DatasetVersion } from \"@sixb/core/lake-storage\"\nimport { PIPELINE_RUN_FAILURE_CODES, type PipelineStepRunRecord } from \"@sixb/core/storage\"\nimport {\n createPipelineStepFailure,\n createStepBookkeepingError,\n requireRegisteredDataset,\n statusForFailure,\n throwIfAborted,\n} from \"./errors\"\nimport { executeRunStep } from \"./execute-run-step\"\nimport { executeSqlStep } from \"./execute-sql-step\"\nimport { type ResolvedStepInput, resolveStepInputs } from \"./step-inputs\"\nimport type {\n PipelineJob,\n PipelineLogSession,\n PipelineStepFinishedHandler,\n PipelineStepRunResult,\n PipelineStepStartedHandler,\n PipelineWorkerContext,\n} from \"./types\"\n\ntype StepExecutionResult = {\n readonly version: DatasetVersion\n readonly versionCreated: boolean\n readonly rowsWritten?: number\n}\n\nexport async function runStep(input: {\n readonly runtime: PipelineWorkerContext\n readonly pipeline: PipelineDefinition\n readonly step: PipelineStepDefinition\n readonly stepIndex: number\n readonly job: PipelineJob\n readonly signal: AbortSignal\n readonly logSession: PipelineLogSession\n readonly onStepStarted?: PipelineStepStartedHandler\n readonly onStepFinished?: PipelineStepFinishedHandler\n}): Promise<PipelineStepRunResult> {\n const { runtime, pipeline, step, stepIndex, job, signal } = input\n const lifecycleContext = {\n stepIndex,\n totalSteps: pipeline.graph.nodes.length,\n }\n\n throwIfAborted(signal)\n let resolvedInputs: readonly ResolvedStepInput[]\n let outputDataset: DatasetDefinition\n let expectedLatestVersionId: string | null\n try {\n outputDataset = lakeDatasetDefinition(\n requireRegisteredDataset({\n dataset: runtime.datasets.getById(step.output.id),\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n role: \"output\",\n datasetId: step.output.id,\n })\n )\n\n await runtime.lakeStorage.createDataset(outputDataset)\n // Capture the output guard before any input is pinned. A later capture could legitimize\n // overwriting a concurrent run with results computed from older inputs.\n expectedLatestVersionId =\n (await runtime.lakeStorage.getLatestVersion(outputDataset.id))?.versionId ?? null\n resolvedInputs = await resolveStepInputs({\n runtime,\n pipeline,\n step,\n pipelineRunId: job.id,\n })\n } catch (error) {\n if (statusForFailure(signal, error) === \"failed\") {\n throw createPipelineStepFailure({\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n cause: error,\n })\n }\n throw error\n }\n const inputRefs = resolvedInputs.map((resolved) => resolved.ref)\n\n const stepRunId = `${job.id}:step:${stepIndex + 1}:${step.id}`\n const startedStepRun = await runtime.pipelineRunsStorage.startStep({\n projectId: runtime.id,\n id: stepRunId,\n pipelineRunId: job.id,\n pipelineId: pipeline.id,\n stepId: step.id,\n datasetId: outputDataset.id,\n mode: step.mode,\n inputs: inputRefs,\n })\n await input.onStepStarted?.(startedStepRun, lifecycleContext)\n\n let committedVersion: DatasetVersion | undefined\n let rowsWritten: number | undefined\n\n try {\n const execution = await executeStep({\n runtime,\n pipeline,\n step,\n job,\n signal,\n logSession: input.logSession,\n outputDataset,\n expectedLatestVersionId,\n resolvedInputs,\n })\n committedVersion = execution.version\n rowsWritten = execution.rowsWritten\n\n let stepRun: PipelineStepRunRecord\n try {\n stepRun = await runtime.pipelineRunsStorage.finishStep({\n projectId: runtime.id,\n id: stepRunId,\n status: \"succeeded\",\n output: {\n datasetId: committedVersion.datasetId,\n versionId: committedVersion.versionId,\n },\n rowsWritten,\n })\n } catch (error) {\n throw createStepBookkeepingError({\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n stepRunId,\n version: committedVersion,\n cause: error,\n })\n }\n await input.onStepFinished?.(stepRun, lifecycleContext)\n\n return {\n run: stepRun,\n version: committedVersion,\n versionCreated: execution.versionCreated,\n }\n } catch (error) {\n if (!committedVersion) {\n const status = statusForFailure(signal, error)\n const failureError =\n status === \"failed\"\n ? createPipelineStepFailure({\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n stepRunId,\n cause: error,\n })\n : error\n const failedStepRun = await runtime.pipelineRunsStorage\n .finishStep({\n projectId: runtime.id,\n id: stepRunId,\n status,\n rowsWritten,\n error: captureSixbFailure(failureError, {\n allowedCodes: PIPELINE_RUN_FAILURE_CODES,\n defaultCode: status === \"cancelled\" ? \"runtime.cancelled\" : \"internal.unexpected\",\n details: {\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n stepRunId,\n },\n }),\n })\n .catch(() => null)\n\n if (failedStepRun) {\n await input.onStepFinished?.(failedStepRun, lifecycleContext)\n }\n\n throw failureError\n }\n\n throw error\n }\n}\n\nasync function executeStep(input: {\n readonly runtime: PipelineWorkerContext\n readonly pipeline: PipelineDefinition\n readonly step: PipelineStepDefinition\n readonly job: PipelineJob\n readonly signal: AbortSignal\n readonly logSession: PipelineLogSession\n readonly outputDataset: DatasetDefinition\n readonly expectedLatestVersionId: string | null\n readonly resolvedInputs: readonly ResolvedStepInput[]\n}): Promise<StepExecutionResult> {\n switch (input.step.executor.kind) {\n case \"run\":\n return executeRunStep(input)\n case \"sql\":\n return executeSqlStep(input)\n }\n}\n",
10
10
  "import type {\n DatasetDefinition,\n DatasetRow,\n PipelineDefinition,\n PipelineStepDefinition,\n PipelineStepRunContext,\n} from \"@sixb/core\"\nimport { createSixbError } from \"@sixb/core/internal/errors\"\nimport { runStepLineage } from \"@sixb/core/internal/pipelines\"\nimport { type DatasetVersion, resolveStepLineage } from \"@sixb/core/lake-storage\"\nimport { throwIfAborted } from \"./errors\"\nimport { createStepInputs, type ResolvedStepInput } from \"./step-inputs\"\nimport type { PipelineJob, PipelineLogSession, PipelineWorkerContext } from \"./types\"\n\nexport async function executeRunStep(input: {\n readonly runtime: PipelineWorkerContext\n readonly pipeline: PipelineDefinition\n readonly step: PipelineStepDefinition\n readonly job: PipelineJob\n readonly signal: AbortSignal\n readonly logSession: PipelineLogSession\n readonly outputDataset: DatasetDefinition\n readonly expectedLatestVersionId: string | null\n readonly resolvedInputs: readonly ResolvedStepInput[]\n}): Promise<{\n readonly version: DatasetVersion\n readonly versionCreated: boolean\n readonly rowsWritten: number\n}> {\n const { runtime, pipeline, step, job, signal, outputDataset, resolvedInputs } = input\n\n if (step.executor.kind !== \"run\") {\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${pipeline.id}' step '${step.id}' uses SQL execution, which is not supported by the run step executor.`,\n {\n details: {\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n datasetId: outputDataset.id,\n },\n }\n )\n }\n\n const logger = input.logSession.withContext({ stepId: step.id })\n let rowsWritten = 0\n const write = await runtime.lakeStorage.beginWrite({\n dataset: outputDataset,\n mode: step.mode,\n inputs: resolvedInputs.map((resolved) => resolved.ref),\n producer: { kind: \"pipeline\", id: pipeline.id, runId: job.id, stepId: step.id },\n // Through every upstream hop: each column the step reads stands for what its input version\n // records. The output is the only registered dataset the step's own lineage reads.\n lineage: resolveStepLineage(\n runStepLineage(step, new Map([[outputDataset.id, outputDataset]])),\n resolvedInputs.map((resolved) => resolved.version)\n ),\n })\n\n try {\n const context: PipelineStepRunContext = {\n projectId: runtime.id,\n pipelineId: pipeline.id,\n stepId: step.id,\n runId: job.id,\n signal,\n logger,\n inputs: createStepInputs({\n lakeStorage: runtime.lakeStorage,\n pipeline,\n step,\n resolvedInputs,\n signal,\n }),\n output: {\n async writeRows(rows) {\n await write.writeRows(\n countRowsWritten(rows, signal, () => {\n rowsWritten += 1\n })\n )\n },\n },\n }\n\n await step.executor.handler(context)\n throwIfAborted(signal)\n\n const commit = await write.commit({\n expectedLatestVersionId: input.expectedLatestVersionId,\n commitMessage: `pipeline ${pipeline.id} step ${step.id} run ${job.id}`,\n })\n const { outcome, ...version } = commit\n\n return {\n version,\n versionCreated: outcome === \"created\",\n rowsWritten,\n }\n } catch (error) {\n await write.abort().catch(() => {})\n throw error\n }\n}\n\nasync function* countRowsWritten(\n rows: Iterable<DatasetRow> | AsyncIterable<DatasetRow>,\n signal: AbortSignal,\n onWritten: () => void\n): AsyncIterable<DatasetRow> {\n for await (const row of rows) {\n throwIfAborted(signal)\n yield row\n onWritten()\n }\n}\n",
11
11
  "import type {\n DatasetDefinition,\n PipelineDefinition,\n PipelineStepDefinition,\n PipelineStepInput,\n PipelineStepRunContext,\n} from \"@sixb/core\"\nimport { createSixbError } from \"@sixb/core/internal/errors\"\nimport { isDatasetPick, stepInputColumns } from \"@sixb/core/internal/pipelines\"\nimport type {\n DatasetVersion,\n DatasetVersionRef,\n ReadDatasetRowsInput,\n} from \"@sixb/core/lake-storage\"\nimport { requireRegisteredDataset } from \"./errors\"\nimport type { PipelineWorkerContext } from \"./types\"\n\nexport interface ResolvedStepInput {\n readonly name: string\n /** The registered dataset. */\n readonly dataset: DatasetDefinition\n /** Present when the step input is `dataset.pick(...)`: the step reads only those columns. */\n readonly pick?: {\n readonly dataset: DatasetDefinition\n readonly columns: readonly string[]\n }\n readonly version: DatasetVersion\n readonly ref: DatasetVersionRef\n}\n\nexport async function resolveStepInputs(input: {\n readonly runtime: PipelineWorkerContext\n readonly pipeline: PipelineDefinition\n readonly step: PipelineStepDefinition\n readonly pipelineRunId: string\n}): Promise<readonly ResolvedStepInput[]> {\n const { runtime, pipeline, step, pipelineRunId } = input\n const resolved: ResolvedStepInput[] = []\n\n for (const [name, declaredDataset] of Object.entries(step.inputs)) {\n const dataset = requireRegisteredDataset({\n dataset: runtime.datasets.getById(declaredDataset.id),\n pipelineId: pipeline.id,\n pipelineRunId,\n stepId: step.id,\n role: \"input\",\n name,\n datasetId: declaredDataset.id,\n })\n\n const version = await runtime.lakeStorage.getLatestVersion(dataset.id)\n if (!version) {\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${pipeline.id}' step '${step.id}' input '${name}' dataset '${dataset.id}' has no committed version.`,\n {\n details: {\n pipelineId: pipeline.id,\n pipelineRunId,\n stepId: step.id,\n datasetId: dataset.id,\n },\n }\n )\n }\n\n resolved.push({\n name,\n dataset,\n ...(isDatasetPick(declaredDataset)\n ? { pick: { dataset: declaredDataset, columns: stepInputColumns(declaredDataset) } }\n : {}),\n version,\n ref: {\n datasetId: version.datasetId,\n versionId: version.versionId,\n },\n })\n }\n\n return resolved\n}\n\nexport function createStepInputs(input: {\n readonly lakeStorage: PipelineWorkerContext[\"lakeStorage\"]\n readonly pipeline: PipelineDefinition\n readonly step: PipelineStepDefinition\n readonly resolvedInputs: readonly ResolvedStepInput[]\n readonly signal: AbortSignal\n}): PipelineStepRunContext[\"inputs\"] {\n const { lakeStorage, signal } = input\n const inputs: Record<string, PipelineStepInput> = {}\n\n for (const resolved of input.resolvedInputs) {\n const subject = `[SixbPipelineWorker] Pipeline '${input.pipeline.id}' step '${input.step.id}' input '${resolved.name}'`\n const { pick } = resolved\n\n inputs[resolved.name] = {\n dataset: pick?.dataset ?? resolved.dataset,\n version: resolved.version,\n readRows(readInput: Omit<ReadDatasetRowsInput, \"datasetId\" | \"versionId\"> = {}) {\n // Step readers stay pinned even if newer versions commit while the handler runs.\n return lakeStorage.readRows({\n ...readInput,\n ...(pick && { columns: readPickedColumns(subject, pick.columns, readInput.columns) }),\n signal: readInput.signal ? AbortSignal.any([signal, readInput.signal]) : signal,\n datasetId: resolved.dataset.id,\n versionId: resolved.version.versionId,\n })\n },\n }\n }\n\n return inputs\n}\n\n/**\n * The version records that the step read only the picked columns, which keeps the markings of the\n * others out of its output. Reading another column would make that record false.\n */\nfunction readPickedColumns(\n subject: string,\n pickedColumns: readonly string[],\n requested: readonly string[] | undefined\n): readonly string[] {\n // Lake providers read every column for an empty list.\n if (requested === undefined || requested.length === 0) return pickedColumns\n\n const unpicked = requested.find((column) => !pickedColumns.includes(column))\n if (unpicked !== undefined) {\n throw new Error(\n `${subject} reads column '${unpicked}', which its pick leaves out. Add '${unpicked}' to the pick to read it.`\n )\n }\n\n return requested\n}\n",
12
12
  "import type {\n DatasetDefinition,\n LakeStorage,\n LakeStorageWithSql,\n PipelineDefinition,\n PipelineStepDefinition,\n} from \"@sixb/core\"\nimport { createSixbError } from \"@sixb/core/internal/errors\"\nimport type {\n DatasetVersion,\n DatasetWriteMode,\n LakeSqlTransformCapabilities,\n} from \"@sixb/core/lake-storage\"\nimport { throwIfAborted } from \"./errors\"\nimport type { ResolvedStepInput } from \"./step-inputs\"\nimport type { PipelineJob, PipelineWorkerContext } from \"./types\"\n\nfunction hasSqlExecutor(lakeStorage: LakeStorage): lakeStorage is LakeStorageWithSql {\n const sql = \"sql\" in lakeStorage ? lakeStorage.sql : null\n\n return (\n typeof sql === \"object\" && sql !== null && \"execute\" in sql && typeof sql.execute === \"function\"\n )\n}\n\nfunction assertSqlModeSupported(input: {\n readonly capabilities: LakeSqlTransformCapabilities\n readonly dialect: string\n readonly mode: DatasetWriteMode\n readonly pipelineId: string\n readonly pipelineRunId: string\n readonly stepId: string\n readonly datasetId: string\n}): void {\n const supported =\n input.mode === \"append\"\n ? input.capabilities.supportsAppend\n : input.capabilities.supportsSnapshot\n if (supported) return\n\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${input.pipelineId}' step '${input.stepId}' writes in ` +\n `'${input.mode}' mode, which the ${input.dialect} SQL executor does not support.`,\n {\n details: {\n pipelineId: input.pipelineId,\n pipelineRunId: input.pipelineRunId,\n stepId: input.stepId,\n datasetId: input.datasetId,\n },\n }\n )\n}\n\nexport async function executeSqlStep(input: {\n readonly runtime: PipelineWorkerContext\n readonly pipeline: PipelineDefinition\n readonly step: PipelineStepDefinition\n readonly job: PipelineJob\n readonly signal: AbortSignal\n readonly outputDataset: DatasetDefinition\n readonly expectedLatestVersionId: string | null\n readonly resolvedInputs: readonly ResolvedStepInput[]\n}): Promise<{\n readonly version: DatasetVersion\n readonly versionCreated: boolean\n readonly rowsWritten?: number\n}> {\n const { runtime, pipeline, step, job, signal, outputDataset, resolvedInputs } = input\n\n if (step.executor.kind !== \"sql\") {\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${pipeline.id}' step '${step.id}' uses run execution, which is not supported by the SQL step executor.`,\n {\n details: {\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n datasetId: outputDataset.id,\n },\n }\n )\n }\n\n if (!hasSqlExecutor(runtime.lakeStorage)) {\n throw createSixbError(\n \"internal.unexpected\",\n `[SixbPipelineWorker] Pipeline '${pipeline.id}' step '${step.id}' requires SQL transform support, but lake storage does not provide lakeStorage.sql.execute(...).`,\n {\n details: {\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n datasetId: outputDataset.id,\n },\n }\n )\n }\n\n // `LakeSqlExecutor.capabilities` is a required field on the contract that nothing read,\n // so a provider declaring `supportsAppend: false` was asked to be honest and then\n // ignored — the unsupported mode failed somewhere inside the provider instead, in\n // whatever words that provider happened to use.\n assertSqlModeSupported({\n capabilities: runtime.lakeStorage.sql.capabilities,\n dialect: runtime.lakeStorage.sql.dialect,\n mode: step.mode,\n pipelineId: pipeline.id,\n pipelineRunId: job.id,\n stepId: step.id,\n datasetId: outputDataset.id,\n })\n\n throwIfAborted(signal)\n\n const commit = await runtime.lakeStorage.sql.execute({\n sources: Object.fromEntries(\n resolvedInputs.map((input) => [\n input.name,\n {\n dataset: input.dataset,\n versionId: input.version.versionId,\n ...(input.pick && { columns: input.pick.columns }),\n },\n ])\n ),\n sql: step.executor.sql,\n target: outputDataset,\n expectedLatestVersionId: input.expectedLatestVersionId,\n mode: step.mode,\n producer: {\n kind: \"pipeline\",\n id: pipeline.id,\n runId: job.id,\n stepId: step.id,\n },\n commitMessage: `pipeline ${pipeline.id} step ${step.id} run ${job.id}`,\n })\n\n throwIfAborted(signal)\n const { outcome, ...version } = commit\n\n return {\n version,\n versionCreated: outcome === \"created\",\n rowsWritten: version.rowCount,\n }\n}\n"
13
13
  ],
14
- "mappings": "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",
15
- "debugId": "5FFC283C2E39D35B64756E2164756E21",
14
+ "mappings": "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",
15
+ "debugId": "93F85C427BD82A2064756E2164756E21",
16
16
  "names": []
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run-pipeline-job.d.ts","sourceRoot":"","sources":["../src/run-pipeline-job.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8B,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAUvF,OAAO,KAAK,EAEV,iBAAiB,EAEjB,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAEhB,qBAAa,8BAA+B,SAAQ,KAAK;IAG3C,QAAQ,CAAC,GAAG,EAAE,iBAAiB;IAF3C,SAAkB,IAAI,oCAAmC;gBAEpC,GAAG,EAAE,iBAAiB;CAG5C;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmI3F"}
1
+ {"version":3,"file":"run-pipeline-job.d.ts","sourceRoot":"","sources":["../src/run-pipeline-job.ts"],"names":[],"mappings":"AAGA,OAAO,EAA8B,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAUvF,OAAO,KAAK,EAEV,iBAAiB,EAEjB,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAEhB,qBAAa,8BAA+B,SAAQ,KAAK;IAG3C,QAAQ,CAAC,GAAG,EAAE,iBAAiB;IAF3C,SAAkB,IAAI,oCAAmC;gBAEpC,GAAG,EAAE,iBAAiB;CAG5C;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqI3F"}
package/dist/worker.d.ts CHANGED
@@ -12,7 +12,12 @@ export declare class PipelineWorker extends QueueWorker<PipelineRunRequestedQueu
12
12
  private readonly host;
13
13
  constructor(host: PipelineWorkerHost, options?: PipelineWorkerOptions);
14
14
  protected execute(claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>, signal: AbortSignal): Promise<void>;
15
- protected onExecutionError(claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>, _error: unknown): Promise<QueueWorkerFailureDecision<(typeof PIPELINE_RUN_FAILURE_CODES)[number]>>;
15
+ protected onExecutionError(claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>, error: unknown): Promise<QueueWorkerFailureDecision<(typeof PIPELINE_RUN_FAILURE_CODES)[number]>>;
16
+ /**
17
+ * Automatic dispatch joins a queued run instead of queueing another, so a run whose job ends
18
+ * before starting it must not stay queued: every later trigger would wait on it forever.
19
+ */
20
+ private failUnstartedRun;
16
21
  protected onAbortError(claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>, _error: unknown): Promise<QueueWorkerFailureDecision<(typeof PIPELINE_RUN_FAILURE_CODES)[number]>>;
17
22
  }
18
23
  //# sourceMappingURL=worker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,0BAA0B,EAA2B,MAAM,oBAAoB,CAAA;AASxF,OAAO,KAAK,EAAsC,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAErF,MAAM,WAAW,qBAAqB;IACpC,wFAAwF;IACxF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,qBAAa,cAAe,SAAQ,WAAW,CAC7C,4BAA4B,EAC5B,OAAO,0BAA0B,CAClC;IACC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;gBAE7B,IAAI,EAAE,kBAAkB,EAAE,OAAO,GAAE,qBAA0B;cAsBzD,OAAO,CACrB,OAAO,EAAE,eAAe,CAAC,4BAA4B,CAAC,EACtD,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC;cAiFS,gBAAgB,CACvC,OAAO,EAAE,eAAe,CAAC,4BAA4B,CAAC,EACtD,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,0BAA0B,CAAC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;cAY1D,YAAY,CACnC,OAAO,EAAE,eAAe,CAAC,4BAA4B,CAAC,EACtD,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,0BAA0B,CAAC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;CAgBpF"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAE,WAAW,EAAqB,MAAM,6BAA6B,CAAA;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EACL,0BAA0B,EAI3B,MAAM,oBAAoB,CAAA;AAS3B,OAAO,KAAK,EAAsC,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAErF,MAAM,WAAW,qBAAqB;IACpC,wFAAwF;IACxF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,qBAAa,cAAe,SAAQ,WAAW,CAC7C,4BAA4B,EAC5B,OAAO,0BAA0B,CAClC;IACC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;gBAE7B,IAAI,EAAE,kBAAkB,EAAE,OAAO,GAAE,qBAA0B;cAsBzD,OAAO,CACrB,OAAO,EAAE,eAAe,CAAC,4BAA4B,CAAC,EACtD,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC;cAqFS,gBAAgB,CACvC,OAAO,EAAE,eAAe,CAAC,4BAA4B,CAAC,EACtD,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,0BAA0B,CAAC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAmBnF;;;OAGG;YACW,gBAAgB;cA4BL,YAAY,CACnC,OAAO,EAAE,eAAe,CAAC,4BAA4B,CAAC,EACtD,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,0BAA0B,CAAC,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;CAgBpF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sixb/pipeline-worker",
3
- "version": "0.1.26",
3
+ "version": "0.2.1",
4
4
  "description": "Worker that runs Sixb pipelines",
5
5
  "keywords": [
6
6
  "sixb",
@@ -35,10 +35,10 @@
35
35
  "prepack": "bun run build"
36
36
  },
37
37
  "peerDependencies": {
38
- "@sixb/core": "0.1.26"
38
+ "@sixb/core": "0.2.1"
39
39
  },
40
40
  "devDependencies": {
41
- "@sixb/core": "0.1.26",
41
+ "@sixb/core": "0.2.1",
42
42
  "@types/bun": "latest",
43
43
  "typescript": "^5.7.0"
44
44
  },
package/src/events.ts CHANGED
@@ -135,6 +135,8 @@ export async function emitDatasetVersionCommitted(
135
135
  runId: job.id,
136
136
  stepId: step.run.stepId,
137
137
  },
138
+ rowsChanged: step.version.rowsChanged,
139
+ lineageChanged: step.version.lineageChanged,
138
140
  },
139
141
  },
140
142
  ],
@@ -57,9 +57,11 @@ export async function runPipelineJob(input: RunPipelineJobInput): Promise<Pipeli
57
57
  projectId: runtime.id,
58
58
  id: job.id,
59
59
  })
60
+ // A run still queued did not start elsewhere: the start itself failed.
60
61
  if (
61
62
  existing?.pipelineId === durableRun.pipelineId &&
62
- existing.executionId === durableRun.executionId
63
+ existing.executionId === durableRun.executionId &&
64
+ existing.status !== "queued"
63
65
  ) {
64
66
  throw new PipelineRunAlreadyStartedError(existing)
65
67
  }
package/src/worker.ts CHANGED
@@ -1,9 +1,16 @@
1
+ import type { SixbFailure } from "@sixb/core"
1
2
  import { reportRunFailure } from "@sixb/core/internal/error-reporting"
3
+ import { captureSixbFailure } from "@sixb/core/internal/errors"
2
4
  import { bindDurablePrimitiveExecution } from "@sixb/core/internal/primitive-execution"
3
5
  import type { QueueWorkerFailureDecision } from "@sixb/core/internal/workers"
4
- import { QueueWorker } from "@sixb/core/internal/workers"
6
+ import { QueueWorker, retryUnstartedRun } from "@sixb/core/internal/workers"
5
7
  import type { ClaimedQueueJob, PipelineRunRequestedQueueJob } from "@sixb/core/queues"
6
- import { PIPELINE_RUN_FAILURE_CODES, type PipelineRunStorage } from "@sixb/core/storage"
8
+ import {
9
+ PIPELINE_RUN_FAILURE_CODES,
10
+ type PipelineRunFailureCode,
11
+ type PipelineRunRecord,
12
+ type PipelineRunStorage,
13
+ } from "@sixb/core/storage"
7
14
  import {
8
15
  emitDatasetVersionCommitted,
9
16
  emitPipelineRunFinished,
@@ -62,6 +69,10 @@ export class PipelineWorker extends QueueWorker<
62
69
  throw new Error(`[SixbPipelineWorker] Pipeline run '${job.payload.runId}' was not found.`)
63
70
  }
64
71
 
72
+ // Each trigger that joined this run published its own job for it. Once one of them has started
73
+ // the run, the others have nothing left to do.
74
+ if (run.status !== "queued") return
75
+
65
76
  const durableExecution = await this.host.storage.executions.getById({
66
77
  projectId: this.host.id,
67
78
  id: run.executionId,
@@ -134,19 +145,58 @@ export class PipelineWorker extends QueueWorker<
134
145
 
135
146
  protected override async onExecutionError(
136
147
  claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,
137
- _error: unknown
148
+ error: unknown
138
149
  ): Promise<QueueWorkerFailureDecision<(typeof PIPELINE_RUN_FAILURE_CODES)[number]>> {
139
150
  // Pipeline runs are not all-or-nothing in V1. A previous step may have committed an append
140
- // output, so failed pipeline jobs must not be retried automatically.
151
+ // output, so a job that failed after starting its run must not be retried automatically.
141
152
  const run = await this.host.storage.pipelineRuns?.getById({
142
153
  projectId: this.host.id,
143
154
  id: claimed.job.payload.runId,
144
155
  })
156
+ if (run?.status === "queued") {
157
+ const retry = retryUnstartedRun(claimed.job.attempt)
158
+ if (retry) return retry
159
+
160
+ return { kind: "fail", failure: await this.failUnstartedRun(claimed, run, error) }
161
+ }
162
+
145
163
  return run?.status === "failed" && run.error
146
164
  ? { kind: "fail", failure: run.error }
147
165
  : { kind: "fail" }
148
166
  }
149
167
 
168
+ /**
169
+ * Automatic dispatch joins a queued run instead of queueing another, so a run whose job ends
170
+ * before starting it must not stay queued: every later trigger would wait on it forever.
171
+ */
172
+ private async failUnstartedRun(
173
+ claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,
174
+ run: PipelineRunRecord,
175
+ error: unknown
176
+ ): Promise<SixbFailure<PipelineRunFailureCode>> {
177
+ const failure = captureSixbFailure(error, {
178
+ allowedCodes: PIPELINE_RUN_FAILURE_CODES,
179
+ defaultCode: "internal.unexpected",
180
+ details: { pipelineId: run.pipelineId, runId: run.id },
181
+ })
182
+
183
+ await this.context.pipelineRunsStorage.finish({
184
+ projectId: this.host.id,
185
+ id: run.id,
186
+ status: "failed",
187
+ error: failure,
188
+ })
189
+
190
+ reportRunFailure(this.host, error, {
191
+ projectId: this.host.id,
192
+ attempt: claimed.job.attempt,
193
+ runKind: "pipeline",
194
+ run: { runId: run.id, pipelineId: run.pipelineId },
195
+ failure,
196
+ })
197
+ return failure
198
+ }
199
+
150
200
  protected override async onAbortError(
151
201
  claimed: ClaimedQueueJob<PipelineRunRequestedQueueJob>,
152
202
  _error: unknown