deepline 0.3.258 → 0.3.259

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 (67) hide show
  1. package/dist/bundling-sources/sdk/src/api-error.ts +45 -0
  2. package/dist/bundling-sources/sdk/src/client.ts +98 -459
  3. package/dist/bundling-sources/sdk/src/http.ts +1 -34
  4. package/dist/bundling-sources/sdk/src/index.ts +8 -0
  5. package/dist/bundling-sources/sdk/src/plays/csv-data-input.ts +139 -0
  6. package/dist/bundling-sources/sdk/src/plays/run-request.ts +855 -0
  7. package/dist/bundling-sources/sdk/src/release.ts +1 -1
  8. package/dist/bundling-sources/sdk/src/runs/overview.ts +45 -2
  9. package/dist/bundling-sources/sdk/src/types.ts +5 -0
  10. package/dist/bundling-sources/shared_libs/play-runtime/app-runtime-api.ts +8 -0
  11. package/dist/bundling-sources/shared_libs/play-runtime/context.ts +42 -10
  12. package/dist/bundling-sources/shared_libs/play-runtime/launch-identity.ts +3 -0
  13. package/dist/bundling-sources/shared_libs/play-runtime/launch-source-policy.ts +23 -0
  14. package/dist/bundling-sources/shared_libs/play-runtime/live-state-contract.ts +3 -0
  15. package/dist/bundling-sources/shared_libs/play-runtime/play-admission-outcome.ts +23 -5
  16. package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/gateway-adapter.ts +1 -1
  17. package/dist/bundling-sources/shared_libs/play-runtime/run-execution-state.ts +845 -0
  18. package/dist/bundling-sources/shared_libs/play-runtime/run-ledger.ts +106 -6
  19. package/dist/bundling-sources/shared_libs/play-runtime/run-observation.ts +440 -0
  20. package/dist/bundling-sources/shared_libs/play-runtime/run-snapshot-stream.ts +35 -2
  21. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/index.ts +66 -7
  22. package/dist/bundling-sources/shared_libs/play-runtime/runtime-api.ts +0 -29
  23. package/dist/bundling-sources/shared_libs/play-runtime/runtime-sheet-row-transition.ts +47 -2
  24. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backend.ts +6 -0
  25. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-runtime-worker.ts +475 -36
  26. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-progress.ts +78 -11
  27. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres.ts +550 -42
  28. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-outbox-recovery.ts +181 -8
  29. package/dist/bundling-sources/shared_libs/play-runtime/step-lifecycle-tracker.ts +0 -18
  30. package/dist/bundling-sources/shared_libs/play-runtime/tool-execute-retry-policy.ts +80 -7
  31. package/dist/bundling-sources/shared_libs/play-runtime/tool-http-errors.ts +37 -2
  32. package/dist/bundling-sources/shared_libs/plays/bundling/index.ts +148 -18
  33. package/dist/bundling-sources/shared_libs/plays/cascade-falloff.ts +86 -0
  34. package/dist/bundling-sources/shared_libs/plays/docflow-unreached-reason.ts +611 -0
  35. package/dist/bundling-sources/shared_libs/plays/docflow.ts +21 -0
  36. package/dist/bundling-sources/shared_libs/plays/play-exports.ts +28 -5
  37. package/dist/bundling-sources/shared_libs/plays/settings-contract.ts +92 -10
  38. package/dist/bundling-sources/shared_libs/plays/static-pipeline.ts +5 -0
  39. package/dist/bundling-sources/shared_libs/plays/trigger-config-contract.ts +222 -0
  40. package/dist/bundling-sources/shared_libs/plays/trigger-config-route.ts +15 -0
  41. package/dist/cli/index.js +4957 -771
  42. package/dist/cli/index.mjs +4957 -771
  43. package/dist/client-B5XbKrrs.d.mts +6564 -0
  44. package/dist/client-C9Y49yya.d.ts +6564 -0
  45. package/dist/{compiler-manifest-C4mdRJOP.d.mts → compiler-manifest-CUuh8C3b.d.mts} +14 -1
  46. package/dist/{compiler-manifest-C4mdRJOP.d.ts → compiler-manifest-CUuh8C3b.d.ts} +14 -1
  47. package/dist/index.d.mts +7 -6275
  48. package/dist/index.d.ts +7 -6275
  49. package/dist/index.js +360 -326
  50. package/dist/index.mjs +360 -326
  51. package/dist/install-integrity.json +21 -2
  52. package/dist/plays/bundle-play-file.d.mts +2 -2
  53. package/dist/plays/bundle-play-file.d.ts +2 -2
  54. package/dist/plays/bundle-play-file.mjs +117 -18
  55. package/dist/plays/csv-data-input.d.mts +37 -0
  56. package/dist/plays/csv-data-input.d.ts +37 -0
  57. package/dist/plays/csv-data-input.js +3135 -0
  58. package/dist/plays/csv-data-input.mjs +3108 -0
  59. package/dist/plays/run-request.d.mts +6 -0
  60. package/dist/plays/run-request.d.ts +6 -0
  61. package/dist/plays/run-request.js +664 -0
  62. package/dist/plays/run-request.mjs +614 -0
  63. package/dist/release.d.mts +1 -1
  64. package/dist/release.d.ts +1 -1
  65. package/dist/release.js +1 -1
  66. package/dist/release.mjs +1 -1
  67. package/package.json +12 -1
@@ -200,7 +200,7 @@ export const SDK_RELEASE = {
200
200
  // getters keep their established compatibility behavior.
201
201
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
202
202
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
203
- version: '0.3.258',
203
+ version: '0.3.259',
204
204
  updateSummary:
205
205
  'Play grep now returns concise results with the matched fields and terms. Automatic CLI updates are enabled by default; use `deepline settings autoupdate off` to opt out, `deepline settings autoupdate on` to re-enable updates, or `deepline settings autoupdate pin <version>` to hold an exact release.',
206
206
  packageCapabilities: {
@@ -1,4 +1,10 @@
1
1
  import type { PlayStatus } from '../types';
2
+ import {
3
+ decodeNodeExecutionState,
4
+ deriveNodeExecutionState,
5
+ formatNodeExecutionState,
6
+ type NodeExecutionState,
7
+ } from '../../../shared_libs/play-runtime/run-execution-state';
2
8
  import { DATASET_EXECUTION_BUCKETS } from '../../../shared_libs/plays/dataset-summary';
3
9
 
4
10
  type RecordValue = Record<string, unknown>;
@@ -164,6 +170,37 @@ function actions(value: unknown, names: Record<string, string>) {
164
170
  );
165
171
  }
166
172
 
173
+ /**
174
+ * A step's canonical execution state: the server's (`steps[].execution`), or,
175
+ * from a server that predates it, the same derivation over the step's
176
+ * reported status and map progress.
177
+ */
178
+ function stepExecution(step: RecordValue, runStatus: string): NodeExecutionState {
179
+ const decoded = decodeNodeExecutionState(step.execution);
180
+ if (decoded) return decoded;
181
+ const progress = record(step.progress);
182
+ // Rows this step finished: executed plus reused, else its settled rows.
183
+ const completed =
184
+ typeof progress?.executed === 'number'
185
+ ? progress.executed +
186
+ (typeof progress.reused === 'number' ? progress.reused : 0)
187
+ : progress?.completedRows;
188
+ return deriveNodeExecutionState({
189
+ reported: {
190
+ status: typeof step.status === 'string' ? step.status : 'idle',
191
+ error: typeof step.error === 'string' ? step.error : null,
192
+ progress: progress
193
+ ? {
194
+ completed,
195
+ failed: progress.failed,
196
+ total: progress.total,
197
+ }
198
+ : null,
199
+ },
200
+ runStatus,
201
+ });
202
+ }
203
+
167
204
  /** A read-only overview of recorded run facts, never a complete row export. */
168
205
  export function buildRunOverview(status: PlayStatus, fullStatus?: PlayStatus) {
169
206
  const pkg = status.package;
@@ -182,10 +219,14 @@ export function buildRunOverview(status: PlayStatus, fullStatus?: PlayStatus) {
182
219
  const timing = record(step.timing);
183
220
  const started = timing?.startedAt,
184
221
  finished = timing?.completedAt;
222
+ const execution = stepExecution(step, pkg.run.status);
185
223
  return {
186
224
  id: step.id,
187
225
  kind: step.kind,
188
226
  status: step.status,
227
+ /** The canonical state and its one line (what the dashboard pill says). */
228
+ execution,
229
+ label: formatNodeExecutionState(execution),
189
230
  progress: step.progress,
190
231
  timing: step.timing,
191
232
  ...(typeof started === 'number' &&
@@ -337,13 +378,15 @@ export function buildRunOverview(status: PlayStatus, fullStatus?: PlayStatus) {
337
378
  const progress = record(step.progress);
338
379
  const failedRows =
339
380
  typeof progress?.failed === 'number' ? progress.failed : undefined;
340
- return step.status === 'failed' ||
341
- step.error ||
381
+ // A step the run stopped under did not fail; it is not a failure.
382
+ return step.execution.kind === 'failed' ||
383
+ (step.error && step.execution.kind !== 'stopped') ||
342
384
  (failedRows !== undefined && failedRows > 0)
343
385
  ? [
344
386
  {
345
387
  stepId: step.id,
346
388
  status: step.status,
389
+ label: step.label,
347
390
  failedRows,
348
391
  ...(step.error ? { message: step.error } : {}),
349
392
  },
@@ -1115,6 +1115,11 @@ export interface RerunOptions {
1115
1115
  * per invocation.
1116
1116
  */
1117
1117
  idempotencyKey?: string;
1118
+ /**
1119
+ * Optional scalar edits to fields present in the original retained input.
1120
+ * The source run stays immutable; the values apply only to the new run.
1121
+ */
1122
+ inputOverrides?: Record<string, string | number | boolean | null>;
1118
1123
  }
1119
1124
 
1120
1125
  /** Result of {@link DeeplineClient.rerun} / `runs.rerun`. */
@@ -243,6 +243,12 @@ type RuntimeApiRequest =
243
243
  workflowId: string;
244
244
  runId: string;
245
245
  workflowFamilyKey: string;
246
+ /**
247
+ * Epoch ms the scheduler admitted the run (its outbox row's commit
248
+ * time). Optional: older workers omit it and the projection keeps its
249
+ * own clock.
250
+ */
251
+ acceptedAt?: number | null;
246
252
  /** Optional for root and older durable admission envelopes. */
247
253
  parentRunId?: string | null;
248
254
  rootRunId?: string | null;
@@ -272,6 +278,8 @@ type RuntimeApiRequest =
272
278
  retainedPipelineGraph?: unknown;
273
279
  source?: 'published' | 'ad_hoc' | 'draft';
274
280
  triggerSource?: 'webhook' | 'cron' | 'sql_listener' | 'api';
281
+ /** Display-only client surface; older envelopes omit it. */
282
+ launchSurface?: 'ui' | 'cli' | 'api';
275
283
  inputFileId?: string;
276
284
  inputBytes?: number;
277
285
  inputSha256?: string;
@@ -657,6 +657,17 @@ export type RuntimeMapReceiptWaitParking = {
657
657
  stage: string | null;
658
658
  };
659
659
 
660
+ /** A cell status that settles the cell (no further patch follows on this run). */
661
+ function isSettledCellStatus(status: string): boolean {
662
+ return (
663
+ status === 'completed' ||
664
+ status === 'failed' ||
665
+ status === 'cached' ||
666
+ status === 'missed' ||
667
+ status === 'skipped'
668
+ );
669
+ }
670
+
660
671
  export class RuntimeMapStallObserver {
661
672
  readonly #resolvers = new Map<
662
673
  number,
@@ -7311,9 +7322,9 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
7311
7322
  provider: input.provider ?? null,
7312
7323
  error: input.error ?? null,
7313
7324
  ...(producer !== undefined ? { producer } : {}),
7314
- // Only attribution-bearing cells carry the run stamp and the trace.
7315
- // Both ride the retained-row payload, so paying for them on every
7316
- // status-only cell patch would move the map memory budget.
7325
+ // Only attribution-bearing cells carry the trace; it rides the
7326
+ // retained-row payload, so paying for it on every status-only cell
7327
+ // patch would move the map memory budget.
7317
7328
  ...(producers !== undefined
7318
7329
  ? {
7319
7330
  runId: this.currentRunId,
@@ -7321,7 +7332,15 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
7321
7332
  // Loud under-count: a capped trace states what it lost.
7322
7333
  ...(attemptsDropped > 0 ? { attemptsDropped } : {}),
7323
7334
  }
7324
- : {}),
7335
+ : capture && isSettledCellStatus(input.status)
7336
+ ? // The run stamp alone on a SETTLED cell with no attempt of its
7337
+ // own — a cell a later run reused from its receipt. The durable
7338
+ // jsonb merge keeps keys a patch omits, so without it the cell
7339
+ // kept the run that first wrote it, the run that reused it
7340
+ // counted none of its cells, and the canvas lent a step its
7341
+ // table's count ("8/10 ok" on a step that answered all 10).
7342
+ { runId: this.currentRunId }
7343
+ : {}),
7325
7344
  ...(reads !== undefined ? { reads } : {}),
7326
7345
  ...(decide !== undefined ? { decide } : {}),
7327
7346
  ...(input.reused !== undefined ? { reused: input.reused } : {}),
@@ -16660,15 +16679,23 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
16660
16679
  for (const request of entry.request.memberRequests) {
16661
16680
  await reject(request, entry.error);
16662
16681
  }
16663
- // A provider-unavailable physical batch is a logical outcome for
16664
- // each member, not a map-fatal scheduler failure. Each rejected
16665
- // row resolver now receives the typed error above, where a
16666
- // waterfall may persist the failed leg and advance to its next
16667
- // provider. Keep infrastructure and contract failures loud.
16682
+ // A failed physical batch is a logical outcome for each member,
16683
+ // not a map-fatal scheduler failure. Each rejected row resolver
16684
+ // now holds the typed error above, where a waterfall may persist
16685
+ // the failed leg and advance, and row isolation settles the rest.
16686
+ // A tool's own failure (any HTTP status, e.g. a 530 edge page in
16687
+ // front of the gateway) is exactly what an unbatched call
16688
+ // isolates to its row; rethrowing it here poisoned the shared
16689
+ // dispatcher, rejected every queued call, and failed the whole
16690
+ // run. Keep run-fatal tool errors (billing denials, cancellation,
16691
+ // persistence) and our own contract failures — plain Errors —
16692
+ // loud.
16668
16693
  if (
16669
16694
  isProviderExhaustedFailure(entry.error) ||
16670
16695
  isProviderUnavailable(entry.error) ||
16671
- entry.error instanceof PlayRowProviderBackpressureError
16696
+ entry.error instanceof PlayRowProviderBackpressureError ||
16697
+ (entry.error instanceof ToolExecutionError &&
16698
+ !isRowIsolationExemptError(entry.error))
16672
16699
  ) {
16673
16700
  continue;
16674
16701
  }
@@ -19889,6 +19916,7 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
19889
19916
  bodyText,
19890
19917
  transientHttpRetrySafe:
19891
19918
  retrySafeTransientHttp || fixtureReplaySafe,
19919
+ executionFenced: usesDurableInvocationFence,
19892
19920
  });
19893
19921
  let failure = classifyToolExecuteHttpFailure({
19894
19922
  toolId,
@@ -19900,6 +19928,7 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
19900
19928
  dispatchedResponse.headers.get('retry-after'),
19901
19929
  transientHttpRetrySafe:
19902
19930
  retrySafeTransientHttp || fixtureReplaySafe,
19931
+ executionFenced: usesDurableInvocationFence,
19903
19932
  providerLatencyMs:
19904
19933
  Date.now() - dispatchedProviderCallStartedAt,
19905
19934
  });
@@ -19920,6 +19949,7 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
19920
19949
  dispatchedResponse.headers.get('retry-after'),
19921
19950
  transientHttpRetrySafe:
19922
19951
  retrySafeTransientHttp || fixtureReplaySafe,
19952
+ executionFenced: usesDurableInvocationFence,
19923
19953
  providerLatencyMs:
19924
19954
  Date.now() - dispatchedProviderCallStartedAt,
19925
19955
  });
@@ -20287,6 +20317,7 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
20287
20317
  bodyText: text,
20288
20318
  transientHttpRetrySafe:
20289
20319
  retrySafeTransientHttp || fixtureReplaySafe,
20320
+ executionFenced: usesDurableInvocationFence,
20290
20321
  });
20291
20322
  const failure =
20292
20323
  preclassifiedHttpFailure.current?.failure ??
@@ -20299,6 +20330,7 @@ export class PlayContextImpl implements ScalarPlayAuthoringRuntimeContext {
20299
20330
  retryAfterHeader: response.headers.get('retry-after'),
20300
20331
  transientHttpRetrySafe:
20301
20332
  retrySafeTransientHttp || fixtureReplaySafe,
20333
+ executionFenced: usesDurableInvocationFence,
20302
20334
  ...(providerCallElapsedMs !== null
20303
20335
  ? { providerLatencyMs: providerCallElapsedMs }
20304
20336
  : {}),
@@ -60,6 +60,9 @@ export const PLAY_LAUNCH_ENVELOPE_FIELD_ROLES: {
60
60
  inputBytes: 'detail',
61
61
  inputFileId: 'detail',
62
62
  replayedFromRunId: 'detail',
63
+ // Display-only provenance: a retry of the same run from another surface is
64
+ // the same launch.
65
+ launchSurface: 'detail',
63
66
  totalRows: 'detail',
64
67
  contractSnapshot: 'detail',
65
68
  executionPlan: 'detail',
@@ -10,6 +10,29 @@ export type PlayLaunchTriggerSource =
10
10
  | 'sql_listener'
11
11
  | 'async_child';
12
12
 
13
+ /**
14
+ * Which client surface submitted a run a person started: the dashboard
15
+ * (session auth), the Deepline CLI/SDK (an API key carrying the SDK client
16
+ * headers), or any other API-key caller. Display-only provenance, recorded at
17
+ * admission and never consulted by queue policy or launch identity. Automated
18
+ * launches (cron, webhook, SQL listener, async child) carry no surface; their
19
+ * `triggerSource` already names them.
20
+ */
21
+ export type PlayLaunchSurface = 'ui' | 'cli' | 'api';
22
+
23
+ export const PLAY_LAUNCH_SURFACES: readonly PlayLaunchSurface[] = Object.freeze(
24
+ ['ui', 'cli', 'api'] as const,
25
+ );
26
+
27
+ export function readPlayLaunchSurface(
28
+ value: unknown,
29
+ ): PlayLaunchSurface | null {
30
+ return typeof value === 'string' &&
31
+ (PLAY_LAUNCH_SURFACES as readonly string[]).includes(value)
32
+ ? (value as PlayLaunchSurface)
33
+ : null;
34
+ }
35
+
13
36
  export type PlayLaunchQueuePolicy = {
14
37
  triggerSource: PlayLaunchTriggerSource;
15
38
  /**
@@ -1,5 +1,6 @@
1
1
  import type { PlayRunLifecycleStatus } from './run-lifecycle-policy';
2
2
  import type { PlayDocflowNodeIoState } from './docflow-node-io';
3
+ import type { RunStopCause } from './run-execution-state';
3
4
  import type {
4
5
  PlayActivityObservation,
5
6
  PlayRunActivityProjection,
@@ -65,6 +66,8 @@ export type PlayVisualNodeStateSnapshot = {
65
66
  nodeId: string;
66
67
  status: PlayVisualNodeStatus;
67
68
  error?: string | null;
69
+ /** The run's terminal event settled this node in flight (ledger fact). */
70
+ stoppedBy?: RunStopCause;
68
71
  artifactTableNamespace?: string | null;
69
72
  progress?: PlayVisualNodeProgressSnapshot | null;
70
73
  startedAt?: number | null;
@@ -32,6 +32,13 @@ export const PLAY_RUN_ADMISSION_REPLAY_MISSING =
32
32
  'PLAY_RUN_ADMISSION_REPLAY_MISSING' as const;
33
33
  /** A reused Run identity with different launch facts is permanently invalid. */
34
34
  export const PLAY_RUN_LAUNCH_CONFLICT = 'PLAY_RUN_LAUNCH_CONFLICT' as const;
35
+ /**
36
+ * The admitting deployment has no public callback its runtime backend can
37
+ * reach. Retrying the same deployment cannot change that; the source waits as
38
+ * blocked until the deployment is repaired and an admin retries it.
39
+ */
40
+ export const PLAY_RUNTIME_CALLBACK_UNCONFIGURED =
41
+ 'PLAY_RUNTIME_CALLBACK_UNCONFIGURED' as const;
35
42
 
36
43
  export type PlayAdmissionBlockedCode =
37
44
  | typeof PLAY_ADMISSION_PAYLOAD_UNREADABLE
@@ -39,7 +46,8 @@ export type PlayAdmissionBlockedCode =
39
46
  | typeof PLAY_RUN_PRE_RUN_VALIDATION_FAILED
40
47
  | typeof RUNTIME_DB_SESSION_PRELOAD_INCOMPLETE
41
48
  | typeof PLAY_RUN_ADMISSION_REPLAY_MISSING
42
- | typeof PLAY_RUN_LAUNCH_CONFLICT;
49
+ | typeof PLAY_RUN_LAUNCH_CONFLICT
50
+ | typeof PLAY_RUNTIME_CALLBACK_UNCONFIGURED;
43
51
 
44
52
  export type PlayAdmissionRetryableCode = typeof PLAY_ADMISSION_INTERNAL_FAILURE;
45
53
 
@@ -62,6 +70,7 @@ const TERMINAL_PRE_ADMISSION_CODES = new Set<PlayAdmissionBlockedCode>([
62
70
  RUNTIME_DB_SESSION_PRELOAD_INCOMPLETE,
63
71
  PLAY_RUN_ADMISSION_REPLAY_MISSING,
64
72
  PLAY_RUN_LAUNCH_CONFLICT,
73
+ PLAY_RUNTIME_CALLBACK_UNCONFIGURED,
65
74
  ]);
66
75
 
67
76
  function stableErrorCode(error: unknown): string | null {
@@ -74,13 +83,22 @@ function blocked(code: PlayAdmissionBlockedCode): PlayAdmissionFailure {
74
83
  return {
75
84
  disposition: 'blocked',
76
85
  code,
77
- message:
78
- code === PLAY_SECRET_UNAVAILABLE
86
+ message: playAdmissionBlockedMessage(code),
87
+ };
88
+ }
89
+
90
+ /**
91
+ * The customer-facing reason for a blocked source. A deferred batch settles by
92
+ * code alone, so the reason must be derivable from the stable code.
93
+ */
94
+ export function playAdmissionBlockedMessage(code: string): string {
95
+ return code === PLAY_SECRET_UNAVAILABLE
79
96
  ? 'The Play configuration is unavailable. Repair it, then retry this delivery.'
80
97
  : code === PLAY_RUN_LAUNCH_CONFLICT
81
98
  ? 'This run identity is already bound to a different launch. Repair the trigger identity before retrying this delivery.'
82
- : 'This delivery needs attention before it can be retried.',
83
- };
99
+ : code === PLAY_RUNTIME_CALLBACK_UNCONFIGURED
100
+ ? 'This deployment has no public runtime callback URL, so Play workers cannot report progress. Configure the callback (local dev: start the dev tunnel), then retry this delivery.'
101
+ : 'This delivery needs attention before it can be retried.';
84
102
  }
85
103
 
86
104
  /**
@@ -49,7 +49,7 @@ export function createGatewayRunLedgerProjectionAdapter(
49
49
  }
50
50
  return await dispatchRunLedgerOutboxToLedgerBatchOnceWithClientScope(
51
51
  input.withClient,
52
- dispatchInput,
52
+ { ...dispatchInput, continueThroughTerminal: true },
53
53
  options,
54
54
  );
55
55
  },