deepline 0.3.145 → 0.3.146

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.
@@ -9099,6 +9099,9 @@ export async function directCompletePostgresSchedulerRunnerTerminal(
9099
9099
  input.result,
9100
9100
  { logMetadata: input.completionLogMetadata ?? 'attach' },
9101
9101
  );
9102
+ const resultSummary = terminalRowOutcomesSummary(
9103
+ (input.result as { rowOutcomes?: unknown }).rowOutcomes,
9104
+ );
9102
9105
  const terminalResult = assertTerminalRunResultWithinLimit(terminalOutput);
9103
9106
  const ledgerTerminalResult = terminalRunResultForLedger(terminalResult, {
9104
9107
  content: 'full',
@@ -9352,7 +9355,8 @@ export async function directCompletePostgresSchedulerRunnerTerminal(
9352
9355
  jsonb_build_object(
9353
9356
  'output', $6::jsonb,
9354
9357
  'terminalLogLines', $7::jsonb,
9355
- 'terminalProgressEvents', $8::jsonb
9358
+ 'terminalProgressEvents', $8::jsonb,
9359
+ 'resultSummary', $16::jsonb
9356
9360
  ),
9357
9361
  ${causalOutboxCreatedAt('run_terminal.run_id', options)}
9358
9362
  FROM run_terminal
@@ -9386,6 +9390,7 @@ export async function directCompletePostgresSchedulerRunnerTerminal(
9386
9390
  input.engineWake.eventName,
9387
9391
  input.engineWake.wakeChannel,
9388
9392
  input.allowCappedCompletion === true,
9393
+ stringifyPostgresJson(resultSummary),
9389
9394
  ],
9390
9395
  );
9391
9396
  if (completed.rows.length > 0) return 'completed';
@@ -11271,6 +11276,7 @@ export async function completePostgresSchedulerAttempt(
11271
11276
  attempt: number;
11272
11277
  leaseToken: string;
11273
11278
  output: unknown;
11279
+ rowOutcomes?: unknown;
11274
11280
  runtimeTiming?: PlayRunnerRuntimeTiming | null;
11275
11281
  terminalLogLines?: readonly string[] | null;
11276
11282
  },
@@ -11280,6 +11286,7 @@ export async function completePostgresSchedulerAttempt(
11280
11286
  const ledgerTerminalResult = terminalRunResultForLedger(terminalResult, {
11281
11287
  content: 'full',
11282
11288
  });
11289
+ const resultSummary = terminalRowOutcomesSummary(input.rowOutcomes);
11283
11290
  const terminalLogLines = (input.terminalLogLines ?? [])
11284
11291
  .map((line) => line.trim())
11285
11292
  .filter(Boolean)
@@ -11458,7 +11465,8 @@ export async function completePostgresSchedulerAttempt(
11458
11465
  'run.completed',
11459
11466
  jsonb_build_object(
11460
11467
  'output', $9::jsonb,
11461
- 'terminalLogLines', $8::jsonb
11468
+ 'terminalLogLines', $8::jsonb,
11469
+ 'resultSummary', $10::jsonb
11462
11470
  ),
11463
11471
  ${causalOutboxCreatedAt('run_terminal.run_id', options)}
11464
11472
  FROM run_terminal
@@ -11479,6 +11487,7 @@ export async function completePostgresSchedulerAttempt(
11479
11487
  JSON.stringify({ runId: input.runId, status: 'completed' }),
11480
11488
  JSON.stringify(terminalLogLines),
11481
11489
  stringifyPostgresJson(ledgerTerminalResult ?? null),
11490
+ stringifyPostgresJson(resultSummary),
11482
11491
  ],
11483
11492
  );
11484
11493
  if (completed.rows.length === 0) {
@@ -11522,6 +11531,9 @@ export async function failPostgresSchedulerAttempt(
11522
11531
  terminalResult === undefined ? (input.result ?? null) : terminalResult,
11523
11532
  terminalResult === undefined ? {} : { content: 'full' },
11524
11533
  );
11534
+ const resultSummary = terminalRowOutcomesSummary(
11535
+ (input.result as { rowOutcomes?: unknown } | null)?.rowOutcomes,
11536
+ );
11525
11537
  // Keep the recovery tail separate from result: large failures are represented
11526
11538
  // by a result reference, but their customer guidance must still be logged.
11527
11539
  const terminalLogLines = (input.terminalLogLines ?? [])
@@ -11762,7 +11774,8 @@ export async function failPostgresSchedulerAttempt(
11762
11774
  jsonb_build_object(
11763
11775
  'error', $4::jsonb ->> 'message',
11764
11776
  'result', $8::jsonb,
11765
- 'terminalLogLines', $12::jsonb
11777
+ 'terminalLogLines', $12::jsonb,
11778
+ 'resultSummary', $13::jsonb
11766
11779
  ),
11767
11780
  ${causalOutboxCreatedAt('run_terminal.run_id', options)}
11768
11781
  FROM run_terminal
@@ -11786,6 +11799,7 @@ export async function failPostgresSchedulerAttempt(
11786
11799
  stringifyPostgresJson(input.sandboxCrashDiagnostic ?? null),
11787
11800
  input.preserveRunnerTerminal === true,
11788
11801
  JSON.stringify(terminalLogLines),
11802
+ stringifyPostgresJson(resultSummary),
11789
11803
  ],
11790
11804
  );
11791
11805
  return failed.rows.length > 0;
@@ -12265,6 +12279,23 @@ function finiteRunnerNumber(value: unknown): number | null {
12265
12279
  : null;
12266
12280
  }
12267
12281
 
12282
+ function terminalRowOutcomesSummary(value: unknown): {
12283
+ rowOutcomes: Record<string, number>;
12284
+ } | null {
12285
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return null;
12286
+ const record = value as Record<string, unknown>;
12287
+ const completedRows = finiteRunnerNumber(record.completedRows);
12288
+ const failedRows = finiteRunnerNumber(record.failedRows);
12289
+ const totalRows = finiteRunnerNumber(record.totalRows);
12290
+ const supersededRows = finiteRunnerNumber(record.supersededRows);
12291
+ const rowOutcomes: Record<string, number> = {};
12292
+ if (completedRows !== null) rowOutcomes.completedRows = completedRows;
12293
+ if (failedRows !== null) rowOutcomes.failedRows = failedRows;
12294
+ if (totalRows !== null) rowOutcomes.totalRows = totalRows;
12295
+ if (supersededRows !== null) rowOutcomes.supersededRows = supersededRows;
12296
+ return Object.keys(rowOutcomes).length > 0 ? { rowOutcomes } : null;
12297
+ }
12298
+
12268
12299
  function readPlayRunnerRuntimeTiming(
12269
12300
  value: unknown,
12270
12301
  ): PlayRunnerRuntimeTiming | null {
@@ -12425,6 +12456,18 @@ function attachRunnerWorkProgressMetadata(
12425
12456
  const skipped = finiteRunnerNumber(
12426
12457
  (runnerResult as { skipped?: unknown }).skipped,
12427
12458
  );
12459
+ const runnerRowOutcomes = terminalRowOutcomesSummary(
12460
+ (runnerResult as { rowOutcomes?: unknown }).rowOutcomes,
12461
+ )?.rowOutcomes;
12462
+ const existingRowOutcomes =
12463
+ metadata?.rowOutcomes &&
12464
+ typeof metadata.rowOutcomes === 'object' &&
12465
+ !Array.isArray(metadata.rowOutcomes)
12466
+ ? (metadata.rowOutcomes as Record<string, unknown>)
12467
+ : null;
12468
+ const rowOutcomes = runnerRowOutcomes
12469
+ ? { ...(existingRowOutcomes ?? {}), ...runnerRowOutcomes }
12470
+ : null;
12428
12471
  const logs = Array.isArray((runnerResult as { logs?: unknown }).logs)
12429
12472
  ? (runnerResult as { logs: unknown[] }).logs.filter(
12430
12473
  (line): line is string =>
@@ -12480,6 +12523,7 @@ function attachRunnerWorkProgressMetadata(
12480
12523
  (total === null || skipped === null || metadata?.workProgress) &&
12481
12524
  !runLogTail &&
12482
12525
  !runtimeResources &&
12526
+ !rowOutcomes &&
12483
12527
  mergedOutputWarnings.length === 0
12484
12528
  ) {
12485
12529
  return output;
@@ -12511,6 +12555,7 @@ function attachRunnerWorkProgressMetadata(
12511
12555
  _metadata: {
12512
12556
  ...(metadata ?? {}),
12513
12557
  ...(workProgress ? { workProgress } : {}),
12558
+ ...(rowOutcomes ? { rowOutcomes } : {}),
12514
12559
  ...(runLogTail ? { runLogTail } : {}),
12515
12560
  ...(runtimeResources ? { runtimeResources } : {}),
12516
12561
  ...(mergedOutputWarnings.length > 0
@@ -12608,6 +12653,7 @@ export async function executePostgresSchedulerClaim(
12608
12653
  attempt: claim.attempt,
12609
12654
  leaseToken: claim.leaseToken,
12610
12655
  output: terminalOutput,
12656
+ rowOutcomes: (output as { rowOutcomes?: unknown } | null)?.rowOutcomes,
12611
12657
  runtimeTiming: extractRunnerRuntimeTiming(output),
12612
12658
  terminalLogLines: terminalLogLinesForOutbox(
12613
12659
  output,
@@ -15736,6 +15782,7 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
15736
15782
  event.runId,
15737
15783
  );
15738
15784
  const lines = stringArrayPayloadField(event.payload, 'terminalLogLines');
15785
+ const resultSummary = payloadField(event.payload, 'resultSummary');
15739
15786
  return [
15740
15787
  ...progressEvents,
15741
15788
  ...(lines.length === 0
@@ -15757,6 +15804,9 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
15757
15804
  result: terminalRunResultForLedger(
15758
15805
  payloadField(event.payload, 'output'),
15759
15806
  ),
15807
+ ...(resultSummary === undefined || resultSummary === null
15808
+ ? {}
15809
+ : { resultSummary }),
15760
15810
  },
15761
15811
  ];
15762
15812
  }
@@ -15770,6 +15820,7 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
15770
15820
  const result = terminalRunResultForLedger(
15771
15821
  payloadField(event.payload, 'result'),
15772
15822
  );
15823
+ const resultSummary = payloadField(event.payload, 'resultSummary');
15773
15824
  return [
15774
15825
  ...progressEvents,
15775
15826
  ...(lines.length === 0
@@ -15790,6 +15841,9 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
15790
15841
  source: 'system',
15791
15842
  error: stringPayloadField(event.payload, 'error'),
15792
15843
  ...(result === null || result === undefined ? {} : { result }),
15844
+ ...(resultSummary === undefined || resultSummary === null
15845
+ ? {}
15846
+ : { resultSummary }),
15793
15847
  },
15794
15848
  ];
15795
15849
  }
@@ -25,6 +25,7 @@ export type PlayVisualNodeProgress = {
25
25
  activeRows?: number;
26
26
  waitingRows?: number;
27
27
  completedRows?: number;
28
+ supersededRows?: number;
28
29
  message?: string;
29
30
  updatedAt?: number | null;
30
31
  startedAt?: number | null;
@@ -129,6 +130,11 @@ export function normalizePlayVisualNodeProgressMap(
129
130
  Number.isFinite(rawProgress.completedRows)
130
131
  ? rawProgress.completedRows
131
132
  : undefined;
133
+ const supersededRows =
134
+ typeof rawProgress.supersededRows === 'number' &&
135
+ Number.isFinite(rawProgress.supersededRows)
136
+ ? rawProgress.supersededRows
137
+ : undefined;
132
138
  const updatedAt =
133
139
  typeof rawProgress.updatedAt === 'number' &&
134
140
  Number.isFinite(rawProgress.updatedAt)
@@ -165,6 +171,7 @@ export function normalizePlayVisualNodeProgressMap(
165
171
  ...(activeRows !== undefined ? { activeRows } : {}),
166
172
  ...(waitingRows !== undefined ? { waitingRows } : {}),
167
173
  ...(completedRows !== undefined ? { completedRows } : {}),
174
+ ...(supersededRows !== undefined ? { supersededRows } : {}),
168
175
  ...(updatedAt !== undefined ? { updatedAt } : {}),
169
176
  ...(startedAt !== undefined ? { startedAt } : {}),
170
177
  ...(completedAt !== undefined ? { completedAt } : {}),
@@ -18,6 +18,7 @@ export type PlayVisualNodeProgress = {
18
18
  activeRows?: number;
19
19
  waitingRows?: number;
20
20
  completedRows?: number;
21
+ supersededRows?: number;
21
22
  message?: string;
22
23
  updatedAt?: number;
23
24
  startedAt?: number;
package/dist/cli/index.js CHANGED
@@ -3068,7 +3068,7 @@ var SDK_RELEASE = {
3068
3068
  // getters keep their established compatibility behavior.
3069
3069
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
3070
3070
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
3071
- version: "0.3.145",
3071
+ version: "0.3.146",
3072
3072
  updateSummary: "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.",
3073
3073
  packageCapabilities: {
3074
3074
  updatePreferences: 1
@@ -5313,19 +5313,32 @@ function summarizeRunRowOutcomes(snapshot) {
5313
5313
  let completedRows = 0;
5314
5314
  let failedRows = 0;
5315
5315
  let totalRows = 0;
5316
+ let supersededRows = 0;
5316
5317
  for (const step of Object.values(snapshot.stepsById)) {
5317
5318
  const progress = step.progress;
5318
5319
  if (!progress) continue;
5319
5320
  completedRows += Math.max(0, finiteNumber(progress.completed) ?? 0);
5320
5321
  failedRows += Math.max(0, finiteNumber(progress.failed) ?? 0);
5322
+ supersededRows += Math.max(0, finiteNumber(progress.supersededRows) ?? 0);
5321
5323
  const stepTotal = finiteNumber(progress.total);
5322
- totalRows += stepTotal !== null && stepTotal >= 0 ? stepTotal : Math.max(0, finiteNumber(progress.completed) ?? 0) + Math.max(0, finiteNumber(progress.failed) ?? 0);
5323
- }
5324
+ totalRows += stepTotal !== null && stepTotal >= 0 ? stepTotal : Math.max(0, finiteNumber(progress.completed) ?? 0) + Math.max(0, finiteNumber(progress.failed) ?? 0) + Math.max(0, finiteNumber(progress.supersededRows) ?? 0);
5325
+ }
5326
+ const resultSummary = isRecord5(snapshot.resultSummary) ? snapshot.resultSummary : null;
5327
+ const resultRowOutcomes = isRecord5(resultSummary?.rowOutcomes) ? resultSummary.rowOutcomes : null;
5328
+ const terminalCompletedRows = finiteNumber(resultRowOutcomes?.completedRows);
5329
+ const terminalFailedRows = finiteNumber(resultRowOutcomes?.failedRows);
5330
+ const terminalTotalRows = finiteNumber(resultRowOutcomes?.totalRows);
5331
+ const terminalSupersededRows = finiteNumber(
5332
+ resultRowOutcomes?.supersededRows
5333
+ );
5334
+ const settledCompletedRows = terminalCompletedRows ?? completedRows;
5335
+ const settledFailedRows = terminalFailedRows ?? failedRows;
5324
5336
  return {
5325
- completedRows,
5326
- failedRows,
5327
- totalRows,
5328
- hasRowFailures: failedRows > 0
5337
+ completedRows: settledCompletedRows,
5338
+ failedRows: settledFailedRows,
5339
+ totalRows: terminalTotalRows ?? totalRows,
5340
+ hasRowFailures: settledFailedRows > 0,
5341
+ ...(terminalSupersededRows ?? supersededRows) > 0 ? { supersededRows: terminalSupersededRows ?? supersededRows } : {}
5329
5342
  };
5330
5343
  }
5331
5344
  function createEmptyPlayRunLedgerSnapshot(input2) {
@@ -5483,6 +5496,7 @@ function normalizeStepProgress(value) {
5483
5496
  ...optionalFiniteNumber(value.activeRows) !== void 0 ? { activeRows: optionalFiniteNumber(value.activeRows) } : {},
5484
5497
  ...optionalFiniteNumber(value.waitingRows) !== void 0 ? { waitingRows: optionalFiniteNumber(value.waitingRows) } : {},
5485
5498
  ...optionalFiniteNumber(value.completedRows) !== void 0 ? { completedRows: optionalFiniteNumber(value.completedRows) } : {},
5499
+ ...optionalFiniteNumber(value.supersededRows) !== void 0 ? { supersededRows: optionalFiniteNumber(value.supersededRows) } : {},
5486
5500
  ...optionalString(value.message) ? { message: optionalString(value.message) } : {},
5487
5501
  ...optionalNullableString(value.artifactTableNamespace) !== void 0 ? {
5488
5502
  artifactTableNamespace: optionalNullableString(
@@ -5734,6 +5748,7 @@ function buildSnapshotFromLedger(snapshot) {
5734
5748
  activeRows: step.progress.activeRows,
5735
5749
  waitingRows: step.progress.waitingRows,
5736
5750
  completedRows: step.progress.completedRows,
5751
+ supersededRows: step.progress.supersededRows,
5737
5752
  message: step.progress.message,
5738
5753
  artifactTableNamespace: step.progress.artifactTableNamespace ?? step.artifactTableNamespace ?? null,
5739
5754
  startedAt: step.startedAt ?? null,
@@ -5747,7 +5762,8 @@ function buildSnapshotFromLedger(snapshot) {
5747
5762
  ...step.progress?.nodeIo ? { nodeIo: step.progress.nodeIo } : {}
5748
5763
  }));
5749
5764
  const liveStatus = normalizePlayRunLiveStatus(snapshot.status);
5750
- const rowOutcomes = isTerminalPlayRunLiveStatus(liveStatus) && Object.keys(snapshot.stepsById).length > 0 ? summarizeRunRowOutcomes(snapshot) : null;
5765
+ const terminalRowOutcomes = isTerminalPlayRunLiveStatus(liveStatus) ? summarizeRunRowOutcomes(snapshot) : null;
5766
+ const rowOutcomes = terminalRowOutcomes && (Object.keys(snapshot.stepsById).length > 0 || terminalRowOutcomes.totalRows > 0 || (terminalRowOutcomes.supersededRows ?? 0) > 0) ? terminalRowOutcomes : null;
5751
5767
  return {
5752
5768
  runId: snapshot.runId,
5753
5769
  status: liveStatus,
@@ -7435,7 +7451,7 @@ var DeeplineClient = class _DeeplineClient {
7435
7451
  * guaranteed support for every model. Runtime AI SDK/Gateway errors remain
7436
7452
  * authoritative for model-gated values.
7437
7453
  *
7438
- * @param model - Gateway model id such as `"openai/gpt-5.5"`
7454
+ * @param model - Exact-case Gateway model id such as `"openai/gpt-5.6-luna"`
7439
7455
  * @returns Model metadata, provider option shapes, and runnable examples
7440
7456
  */
7441
7457
  async describeModel(model) {
@@ -23656,14 +23672,18 @@ function getProgressLinesFromLiveEvent(event) {
23656
23672
  const rowOutcomes = readRowOutcomeSummary({
23657
23673
  rowOutcomes: payload.rowOutcomes
23658
23674
  });
23659
- if (rowOutcomes?.hasRowFailures) {
23675
+ if (rowOutcomes && (rowOutcomes.hasRowFailures || (rowOutcomes.supersededRows ?? 0) > 0)) {
23660
23676
  const counts = formatProgressCounts({
23661
23677
  completed: rowOutcomes.completedRows,
23662
23678
  total: rowOutcomes.totalRows,
23663
23679
  failed: rowOutcomes.failedRows
23664
23680
  });
23665
- if (counts) {
23666
- lines.push(`progress run outcomes: ${counts}`);
23681
+ const outcomeParts = [
23682
+ counts,
23683
+ ...rowOutcomes && (rowOutcomes.supersededRows ?? 0) > 0 ? [formatSupersededRowsNotice(rowOutcomes.supersededRows)] : []
23684
+ ].filter((part) => Boolean(part));
23685
+ if (outcomeParts.length > 0) {
23686
+ lines.push(`progress run outcomes: ${outcomeParts.join(", ")}`);
23667
23687
  }
23668
23688
  }
23669
23689
  return lines;
@@ -24542,9 +24562,13 @@ function buildRunWarnings(status, rowsInfo) {
24542
24562
  const rowOutcomeWarnings = rowOutcomes?.hasRowFailures ? [
24543
24563
  `${status.status === "completed" ? "Run completed" : "Run ended"} with ${formatInteger(rowOutcomes.failedRows)} failed row(s); inspect the persisted failed rows before treating the output as complete.`
24544
24564
  ] : [];
24565
+ const supersededRowNotices = (rowOutcomes?.supersededRows ?? 0) > 0 ? [
24566
+ `Latest-write-wins: ${formatSupersededRowsNotice(rowOutcomes.supersededRows ?? 0)}; the newer write still owns that Runtime Sheet row.`
24567
+ ] : [];
24545
24568
  if (status.status === "completed" && rowsInfo?.totalRows === 0) {
24546
24569
  return [
24547
24570
  ...rowOutcomeWarnings,
24571
+ ...supersededRowNotices,
24548
24572
  "Run completed with 0 output rows.",
24549
24573
  ...outputWarnings
24550
24574
  ];
@@ -24552,11 +24576,12 @@ function buildRunWarnings(status, rowsInfo) {
24552
24576
  if (rowsInfo && !rowsInfo.complete) {
24553
24577
  return [
24554
24578
  ...rowOutcomeWarnings,
24579
+ ...supersededRowNotices,
24555
24580
  `Run output is partial: showing ${rowsInfo.rows.length} preview row(s) of ${rowsInfo.totalRows}.`,
24556
24581
  ...outputWarnings
24557
24582
  ];
24558
24583
  }
24559
- return [...rowOutcomeWarnings, ...outputWarnings];
24584
+ return [...rowOutcomeWarnings, ...supersededRowNotices, ...outputWarnings];
24560
24585
  }
24561
24586
  function buildRunNextCommands(status) {
24562
24587
  const runId = status.runId?.trim();
@@ -24592,6 +24617,9 @@ function getNumericField(value, key) {
24592
24617
  const field = getRecordField(value, key);
24593
24618
  return typeof field === "number" && Number.isFinite(field) ? field : null;
24594
24619
  }
24620
+ function formatSupersededRowsNotice(count) {
24621
+ return `${formatInteger(count)} row${count === 1 ? "" : "s"} skipped because a newer Runtime Sheet write took precedence`;
24622
+ }
24595
24623
  function readRowOutcomeSummary(value) {
24596
24624
  const record3 = getRecordField(value, "rowOutcomes");
24597
24625
  if (!record3) return null;
@@ -24602,11 +24630,13 @@ function readRowOutcomeSummary(value) {
24602
24630
  return null;
24603
24631
  }
24604
24632
  const explicitHasFailures = getRecordField(record3, "hasRowFailures");
24633
+ const supersededRows = getNumericField(record3, "supersededRows");
24605
24634
  return {
24606
24635
  completedRows,
24607
24636
  failedRows,
24608
24637
  totalRows,
24609
- hasRowFailures: typeof explicitHasFailures === "boolean" ? explicitHasFailures : failedRows > 0
24638
+ hasRowFailures: typeof explicitHasFailures === "boolean" ? explicitHasFailures : failedRows > 0,
24639
+ ...supersededRows !== null ? { supersededRows: Math.max(0, supersededRows) } : {}
24610
24640
  };
24611
24641
  }
24612
24642
  function getStringField(value, key) {
@@ -24849,12 +24879,16 @@ function normalizeProgressForEnvelope(status, rowsInfo) {
24849
24879
  const total = rowOutcomes?.totalRows ?? getNumericField(progress, "totalRows") ?? getNumericField(progress, "total") ?? rowsInfo?.totalRows ?? null;
24850
24880
  const failed = rowOutcomes?.failedRows ?? getNumericField(progress, "failed") ?? getNumericField(progress, "failedRows") ?? null;
24851
24881
  const completed = rowOutcomes?.completedRows ?? getNumericField(progress, "completed") ?? getNumericField(progress, "completedRows") ?? (status.status === "completed" ? total : null);
24852
- const pending = getNumericField(progress, "pending") ?? (typeof total === "number" && typeof completed === "number" && typeof failed === "number" ? Math.max(0, total - completed - failed) : null);
24882
+ const supersededRows = rowOutcomes?.supersededRows ?? getNumericField(progress, "supersededRows");
24883
+ const supersededOffset = supersededRows ?? 0;
24884
+ const progressPending = getNumericField(progress, "pending");
24885
+ const pending = (progressPending !== null ? Math.max(0, progressPending - supersededOffset) : null) ?? (typeof total === "number" && typeof completed === "number" && typeof failed === "number" ? Math.max(0, total - completed - failed - supersededOffset) : null);
24853
24886
  return {
24854
24887
  total,
24855
24888
  totalRows: total,
24856
24889
  completed,
24857
24890
  completedRows: completed,
24891
+ ...supersededRows !== null ? { supersededRows: Math.max(0, supersededRows) } : {},
24858
24892
  pending,
24859
24893
  failed,
24860
24894
  executed: getNumericField(progress, "executed"),
@@ -24985,6 +25019,9 @@ function compactPlayStatus(status) {
24985
25019
  ) : [],
24986
25020
  ...rowOutcomes2.hasRowFailures ? [
24987
25021
  `${status.status === "completed" ? "Run completed" : "Run ended"} with ${formatInteger(rowOutcomes2.failedRows)} failed row(s); inspect the persisted failed rows before treating the output as complete.`
25022
+ ] : [],
25023
+ ...(rowOutcomes2.supersededRows ?? 0) > 0 ? [
25024
+ `Latest-write-wins: ${formatSupersededRowsNotice(rowOutcomes2.supersededRows ?? 0)}; the newer write still owns that Runtime Sheet row.`
24988
25025
  ] : []
24989
25026
  ]
24990
25027
  } : packaged;
@@ -47939,7 +47976,7 @@ Examples:
47939
47976
  deepline tools describe hunter_email_verifier --schema-only
47940
47977
  deepline tools describe hunter_email_verifier --examples-only
47941
47978
  deepline tools describe hunter_email_verifier --json
47942
- deepline tools describe deeplineagent --model openai/gpt-5.5 --json
47979
+ deepline tools describe deeplineagent --model openai/gpt-5.6-luna --json
47943
47980
  deepline tools describe ai_inference --estimate-payload @payload.json --json
47944
47981
  deepline tools describe ai_evaluate --estimate-payload @payload.json --json
47945
47982
  deepline tools execute hunter_email_verifier --input '{"email":"a@b.com"}'
@@ -47985,9 +48022,11 @@ Notes:
47985
48022
  waterfalls, row maps, checkpoints, and retries.
47986
48023
  Calling a provider-backed tool can spend Deepline credits. Use --json for the
47987
48024
  stable result payload plus output preview and debugging helpers.
48025
+ --timeout sets this CLI request's HTTP deadline; it does not cancel provider work.
47988
48026
 
47989
48027
  Examples:
47990
48028
  deepline tools execute hunter_email_verifier --input '{"email":"a@b.com"}'
48029
+ deepline tools execute bounceban_verify_bulk --input @batch.json --timeout 10m --json
47991
48030
  deepline tools execute hunter_email_verifier -p email=a@b.com
47992
48031
  deepline tools execute test_rate_limit --input '{"key":"smoke"}' --timeout 90s --json
47993
48032
  deepline tools execute test_rate_limit --input '{"key":"smoke"}' --json | jq '.status'
@@ -48012,7 +48051,7 @@ Examples:
48012
48051
  "Merge a JSON object or @file path into the tool params"
48013
48052
  ).option(
48014
48053
  "--timeout <duration>",
48015
- "Execution HTTP deadline (for example 90s, 5m, or 1h; bare numbers are seconds)"
48054
+ "Client-side HTTP deadline (for example 90s, 5m, or 1h; bare numbers are seconds); it does not cancel provider work"
48016
48055
  ).option(
48017
48056
  "--output-format <format>",
48018
48057
  "Output format: auto, csv, csv_file, json, or json_file"
@@ -49637,6 +49676,7 @@ async function executeTool(args) {
49637
49676
  return 2;
49638
49677
  }
49639
49678
  const rawResponse = await client2.executeTool(parsed.toolId, parsed.params, {
49679
+ ...parsed.timeoutMs !== void 0 ? { timeout: parsed.timeoutMs } : {},
49640
49680
  responseIntent: parsed.outPath || parsed.outputFormat === "csv" || parsed.outputFormat === "csv_file" ? "row_artifact" : "raw",
49641
49681
  ...parsed.timeoutMs !== void 0 ? { timeout: parsed.timeoutMs } : {}
49642
49682
  });
@@ -3063,7 +3063,7 @@ var SDK_RELEASE = {
3063
3063
  // getters keep their established compatibility behavior.
3064
3064
  // 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
3065
3065
  // 0.3.90 is the first deliberately versioned SDK release for API v3.
3066
- version: "0.3.145",
3066
+ version: "0.3.146",
3067
3067
  updateSummary: "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.",
3068
3068
  packageCapabilities: {
3069
3069
  updatePreferences: 1
@@ -5308,19 +5308,32 @@ function summarizeRunRowOutcomes(snapshot) {
5308
5308
  let completedRows = 0;
5309
5309
  let failedRows = 0;
5310
5310
  let totalRows = 0;
5311
+ let supersededRows = 0;
5311
5312
  for (const step of Object.values(snapshot.stepsById)) {
5312
5313
  const progress = step.progress;
5313
5314
  if (!progress) continue;
5314
5315
  completedRows += Math.max(0, finiteNumber(progress.completed) ?? 0);
5315
5316
  failedRows += Math.max(0, finiteNumber(progress.failed) ?? 0);
5317
+ supersededRows += Math.max(0, finiteNumber(progress.supersededRows) ?? 0);
5316
5318
  const stepTotal = finiteNumber(progress.total);
5317
- totalRows += stepTotal !== null && stepTotal >= 0 ? stepTotal : Math.max(0, finiteNumber(progress.completed) ?? 0) + Math.max(0, finiteNumber(progress.failed) ?? 0);
5318
- }
5319
+ totalRows += stepTotal !== null && stepTotal >= 0 ? stepTotal : Math.max(0, finiteNumber(progress.completed) ?? 0) + Math.max(0, finiteNumber(progress.failed) ?? 0) + Math.max(0, finiteNumber(progress.supersededRows) ?? 0);
5320
+ }
5321
+ const resultSummary = isRecord5(snapshot.resultSummary) ? snapshot.resultSummary : null;
5322
+ const resultRowOutcomes = isRecord5(resultSummary?.rowOutcomes) ? resultSummary.rowOutcomes : null;
5323
+ const terminalCompletedRows = finiteNumber(resultRowOutcomes?.completedRows);
5324
+ const terminalFailedRows = finiteNumber(resultRowOutcomes?.failedRows);
5325
+ const terminalTotalRows = finiteNumber(resultRowOutcomes?.totalRows);
5326
+ const terminalSupersededRows = finiteNumber(
5327
+ resultRowOutcomes?.supersededRows
5328
+ );
5329
+ const settledCompletedRows = terminalCompletedRows ?? completedRows;
5330
+ const settledFailedRows = terminalFailedRows ?? failedRows;
5319
5331
  return {
5320
- completedRows,
5321
- failedRows,
5322
- totalRows,
5323
- hasRowFailures: failedRows > 0
5332
+ completedRows: settledCompletedRows,
5333
+ failedRows: settledFailedRows,
5334
+ totalRows: terminalTotalRows ?? totalRows,
5335
+ hasRowFailures: settledFailedRows > 0,
5336
+ ...(terminalSupersededRows ?? supersededRows) > 0 ? { supersededRows: terminalSupersededRows ?? supersededRows } : {}
5324
5337
  };
5325
5338
  }
5326
5339
  function createEmptyPlayRunLedgerSnapshot(input2) {
@@ -5478,6 +5491,7 @@ function normalizeStepProgress(value) {
5478
5491
  ...optionalFiniteNumber(value.activeRows) !== void 0 ? { activeRows: optionalFiniteNumber(value.activeRows) } : {},
5479
5492
  ...optionalFiniteNumber(value.waitingRows) !== void 0 ? { waitingRows: optionalFiniteNumber(value.waitingRows) } : {},
5480
5493
  ...optionalFiniteNumber(value.completedRows) !== void 0 ? { completedRows: optionalFiniteNumber(value.completedRows) } : {},
5494
+ ...optionalFiniteNumber(value.supersededRows) !== void 0 ? { supersededRows: optionalFiniteNumber(value.supersededRows) } : {},
5481
5495
  ...optionalString(value.message) ? { message: optionalString(value.message) } : {},
5482
5496
  ...optionalNullableString(value.artifactTableNamespace) !== void 0 ? {
5483
5497
  artifactTableNamespace: optionalNullableString(
@@ -5729,6 +5743,7 @@ function buildSnapshotFromLedger(snapshot) {
5729
5743
  activeRows: step.progress.activeRows,
5730
5744
  waitingRows: step.progress.waitingRows,
5731
5745
  completedRows: step.progress.completedRows,
5746
+ supersededRows: step.progress.supersededRows,
5732
5747
  message: step.progress.message,
5733
5748
  artifactTableNamespace: step.progress.artifactTableNamespace ?? step.artifactTableNamespace ?? null,
5734
5749
  startedAt: step.startedAt ?? null,
@@ -5742,7 +5757,8 @@ function buildSnapshotFromLedger(snapshot) {
5742
5757
  ...step.progress?.nodeIo ? { nodeIo: step.progress.nodeIo } : {}
5743
5758
  }));
5744
5759
  const liveStatus = normalizePlayRunLiveStatus(snapshot.status);
5745
- const rowOutcomes = isTerminalPlayRunLiveStatus(liveStatus) && Object.keys(snapshot.stepsById).length > 0 ? summarizeRunRowOutcomes(snapshot) : null;
5760
+ const terminalRowOutcomes = isTerminalPlayRunLiveStatus(liveStatus) ? summarizeRunRowOutcomes(snapshot) : null;
5761
+ const rowOutcomes = terminalRowOutcomes && (Object.keys(snapshot.stepsById).length > 0 || terminalRowOutcomes.totalRows > 0 || (terminalRowOutcomes.supersededRows ?? 0) > 0) ? terminalRowOutcomes : null;
5746
5762
  return {
5747
5763
  runId: snapshot.runId,
5748
5764
  status: liveStatus,
@@ -7430,7 +7446,7 @@ var DeeplineClient = class _DeeplineClient {
7430
7446
  * guaranteed support for every model. Runtime AI SDK/Gateway errors remain
7431
7447
  * authoritative for model-gated values.
7432
7448
  *
7433
- * @param model - Gateway model id such as `"openai/gpt-5.5"`
7449
+ * @param model - Exact-case Gateway model id such as `"openai/gpt-5.6-luna"`
7434
7450
  * @returns Model metadata, provider option shapes, and runnable examples
7435
7451
  */
7436
7452
  async describeModel(model) {
@@ -23728,14 +23744,18 @@ function getProgressLinesFromLiveEvent(event) {
23728
23744
  const rowOutcomes = readRowOutcomeSummary({
23729
23745
  rowOutcomes: payload.rowOutcomes
23730
23746
  });
23731
- if (rowOutcomes?.hasRowFailures) {
23747
+ if (rowOutcomes && (rowOutcomes.hasRowFailures || (rowOutcomes.supersededRows ?? 0) > 0)) {
23732
23748
  const counts = formatProgressCounts({
23733
23749
  completed: rowOutcomes.completedRows,
23734
23750
  total: rowOutcomes.totalRows,
23735
23751
  failed: rowOutcomes.failedRows
23736
23752
  });
23737
- if (counts) {
23738
- lines.push(`progress run outcomes: ${counts}`);
23753
+ const outcomeParts = [
23754
+ counts,
23755
+ ...rowOutcomes && (rowOutcomes.supersededRows ?? 0) > 0 ? [formatSupersededRowsNotice(rowOutcomes.supersededRows)] : []
23756
+ ].filter((part) => Boolean(part));
23757
+ if (outcomeParts.length > 0) {
23758
+ lines.push(`progress run outcomes: ${outcomeParts.join(", ")}`);
23739
23759
  }
23740
23760
  }
23741
23761
  return lines;
@@ -24614,9 +24634,13 @@ function buildRunWarnings(status, rowsInfo) {
24614
24634
  const rowOutcomeWarnings = rowOutcomes?.hasRowFailures ? [
24615
24635
  `${status.status === "completed" ? "Run completed" : "Run ended"} with ${formatInteger(rowOutcomes.failedRows)} failed row(s); inspect the persisted failed rows before treating the output as complete.`
24616
24636
  ] : [];
24637
+ const supersededRowNotices = (rowOutcomes?.supersededRows ?? 0) > 0 ? [
24638
+ `Latest-write-wins: ${formatSupersededRowsNotice(rowOutcomes.supersededRows ?? 0)}; the newer write still owns that Runtime Sheet row.`
24639
+ ] : [];
24617
24640
  if (status.status === "completed" && rowsInfo?.totalRows === 0) {
24618
24641
  return [
24619
24642
  ...rowOutcomeWarnings,
24643
+ ...supersededRowNotices,
24620
24644
  "Run completed with 0 output rows.",
24621
24645
  ...outputWarnings
24622
24646
  ];
@@ -24624,11 +24648,12 @@ function buildRunWarnings(status, rowsInfo) {
24624
24648
  if (rowsInfo && !rowsInfo.complete) {
24625
24649
  return [
24626
24650
  ...rowOutcomeWarnings,
24651
+ ...supersededRowNotices,
24627
24652
  `Run output is partial: showing ${rowsInfo.rows.length} preview row(s) of ${rowsInfo.totalRows}.`,
24628
24653
  ...outputWarnings
24629
24654
  ];
24630
24655
  }
24631
- return [...rowOutcomeWarnings, ...outputWarnings];
24656
+ return [...rowOutcomeWarnings, ...supersededRowNotices, ...outputWarnings];
24632
24657
  }
24633
24658
  function buildRunNextCommands(status) {
24634
24659
  const runId = status.runId?.trim();
@@ -24664,6 +24689,9 @@ function getNumericField(value, key) {
24664
24689
  const field = getRecordField(value, key);
24665
24690
  return typeof field === "number" && Number.isFinite(field) ? field : null;
24666
24691
  }
24692
+ function formatSupersededRowsNotice(count) {
24693
+ return `${formatInteger(count)} row${count === 1 ? "" : "s"} skipped because a newer Runtime Sheet write took precedence`;
24694
+ }
24667
24695
  function readRowOutcomeSummary(value) {
24668
24696
  const record3 = getRecordField(value, "rowOutcomes");
24669
24697
  if (!record3) return null;
@@ -24674,11 +24702,13 @@ function readRowOutcomeSummary(value) {
24674
24702
  return null;
24675
24703
  }
24676
24704
  const explicitHasFailures = getRecordField(record3, "hasRowFailures");
24705
+ const supersededRows = getNumericField(record3, "supersededRows");
24677
24706
  return {
24678
24707
  completedRows,
24679
24708
  failedRows,
24680
24709
  totalRows,
24681
- hasRowFailures: typeof explicitHasFailures === "boolean" ? explicitHasFailures : failedRows > 0
24710
+ hasRowFailures: typeof explicitHasFailures === "boolean" ? explicitHasFailures : failedRows > 0,
24711
+ ...supersededRows !== null ? { supersededRows: Math.max(0, supersededRows) } : {}
24682
24712
  };
24683
24713
  }
24684
24714
  function getStringField(value, key) {
@@ -24921,12 +24951,16 @@ function normalizeProgressForEnvelope(status, rowsInfo) {
24921
24951
  const total = rowOutcomes?.totalRows ?? getNumericField(progress, "totalRows") ?? getNumericField(progress, "total") ?? rowsInfo?.totalRows ?? null;
24922
24952
  const failed = rowOutcomes?.failedRows ?? getNumericField(progress, "failed") ?? getNumericField(progress, "failedRows") ?? null;
24923
24953
  const completed = rowOutcomes?.completedRows ?? getNumericField(progress, "completed") ?? getNumericField(progress, "completedRows") ?? (status.status === "completed" ? total : null);
24924
- const pending = getNumericField(progress, "pending") ?? (typeof total === "number" && typeof completed === "number" && typeof failed === "number" ? Math.max(0, total - completed - failed) : null);
24954
+ const supersededRows = rowOutcomes?.supersededRows ?? getNumericField(progress, "supersededRows");
24955
+ const supersededOffset = supersededRows ?? 0;
24956
+ const progressPending = getNumericField(progress, "pending");
24957
+ const pending = (progressPending !== null ? Math.max(0, progressPending - supersededOffset) : null) ?? (typeof total === "number" && typeof completed === "number" && typeof failed === "number" ? Math.max(0, total - completed - failed - supersededOffset) : null);
24925
24958
  return {
24926
24959
  total,
24927
24960
  totalRows: total,
24928
24961
  completed,
24929
24962
  completedRows: completed,
24963
+ ...supersededRows !== null ? { supersededRows: Math.max(0, supersededRows) } : {},
24930
24964
  pending,
24931
24965
  failed,
24932
24966
  executed: getNumericField(progress, "executed"),
@@ -25057,6 +25091,9 @@ function compactPlayStatus(status) {
25057
25091
  ) : [],
25058
25092
  ...rowOutcomes2.hasRowFailures ? [
25059
25093
  `${status.status === "completed" ? "Run completed" : "Run ended"} with ${formatInteger(rowOutcomes2.failedRows)} failed row(s); inspect the persisted failed rows before treating the output as complete.`
25094
+ ] : [],
25095
+ ...(rowOutcomes2.supersededRows ?? 0) > 0 ? [
25096
+ `Latest-write-wins: ${formatSupersededRowsNotice(rowOutcomes2.supersededRows ?? 0)}; the newer write still owns that Runtime Sheet row.`
25060
25097
  ] : []
25061
25098
  ]
25062
25099
  } : packaged;
@@ -48081,7 +48118,7 @@ Examples:
48081
48118
  deepline tools describe hunter_email_verifier --schema-only
48082
48119
  deepline tools describe hunter_email_verifier --examples-only
48083
48120
  deepline tools describe hunter_email_verifier --json
48084
- deepline tools describe deeplineagent --model openai/gpt-5.5 --json
48121
+ deepline tools describe deeplineagent --model openai/gpt-5.6-luna --json
48085
48122
  deepline tools describe ai_inference --estimate-payload @payload.json --json
48086
48123
  deepline tools describe ai_evaluate --estimate-payload @payload.json --json
48087
48124
  deepline tools execute hunter_email_verifier --input '{"email":"a@b.com"}'
@@ -48127,9 +48164,11 @@ Notes:
48127
48164
  waterfalls, row maps, checkpoints, and retries.
48128
48165
  Calling a provider-backed tool can spend Deepline credits. Use --json for the
48129
48166
  stable result payload plus output preview and debugging helpers.
48167
+ --timeout sets this CLI request's HTTP deadline; it does not cancel provider work.
48130
48168
 
48131
48169
  Examples:
48132
48170
  deepline tools execute hunter_email_verifier --input '{"email":"a@b.com"}'
48171
+ deepline tools execute bounceban_verify_bulk --input @batch.json --timeout 10m --json
48133
48172
  deepline tools execute hunter_email_verifier -p email=a@b.com
48134
48173
  deepline tools execute test_rate_limit --input '{"key":"smoke"}' --timeout 90s --json
48135
48174
  deepline tools execute test_rate_limit --input '{"key":"smoke"}' --json | jq '.status'
@@ -48154,7 +48193,7 @@ Examples:
48154
48193
  "Merge a JSON object or @file path into the tool params"
48155
48194
  ).option(
48156
48195
  "--timeout <duration>",
48157
- "Execution HTTP deadline (for example 90s, 5m, or 1h; bare numbers are seconds)"
48196
+ "Client-side HTTP deadline (for example 90s, 5m, or 1h; bare numbers are seconds); it does not cancel provider work"
48158
48197
  ).option(
48159
48198
  "--output-format <format>",
48160
48199
  "Output format: auto, csv, csv_file, json, or json_file"
@@ -49779,6 +49818,7 @@ async function executeTool(args) {
49779
49818
  return 2;
49780
49819
  }
49781
49820
  const rawResponse = await client2.executeTool(parsed.toolId, parsed.params, {
49821
+ ...parsed.timeoutMs !== void 0 ? { timeout: parsed.timeoutMs } : {},
49782
49822
  responseIntent: parsed.outPath || parsed.outputFormat === "csv" || parsed.outputFormat === "csv_file" ? "row_artifact" : "raw",
49783
49823
  ...parsed.timeoutMs !== void 0 ? { timeout: parsed.timeoutMs } : {}
49784
49824
  });