deepline 0.1.191 → 0.1.192
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundling-sources/apps/play-runner-workers/src/coordinator-entry.ts +144 -10
- package/dist/bundling-sources/apps/play-runner-workers/src/entry.ts +8 -11
- package/dist/bundling-sources/sdk/src/release.ts +2 -2
- package/dist/bundling-sources/shared_libs/play-runtime/durable-receipt-execution.ts +3 -0
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backend.ts +5 -0
- package/dist/bundling-sources/shared_libs/play-runtime/tool-execute-retry-policy.ts +1 -3
- package/dist/bundling-sources/shared_libs/play-runtime/tool-http-errors.ts +2 -2
- package/dist/cli/index.js +29 -3
- package/dist/cli/index.mjs +29 -3
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +1 -1
|
@@ -131,6 +131,8 @@ export type PlayWorkflowParams = {
|
|
|
131
131
|
dynamicWorkerCode?: string | null;
|
|
132
132
|
executorToken: string;
|
|
133
133
|
baseUrl: string;
|
|
134
|
+
runtimeApiBaseUrl?: string | null;
|
|
135
|
+
callbackUrl?: string | null;
|
|
134
136
|
integrationMode?: 'live' | 'eval_stub' | 'fixture' | null;
|
|
135
137
|
orgId: string;
|
|
136
138
|
userEmail: string;
|
|
@@ -402,6 +404,15 @@ function recordCoordinatorPerfTrace(event: CoordinatorPerfTraceInput): void {
|
|
|
402
404
|
logCoordinatorPerfTrace(payload);
|
|
403
405
|
}
|
|
404
406
|
|
|
407
|
+
function safeOrigin(value: string | null | undefined): string | null {
|
|
408
|
+
if (!value?.trim()) return null;
|
|
409
|
+
try {
|
|
410
|
+
return new URL(value).origin;
|
|
411
|
+
} catch {
|
|
412
|
+
return '<invalid>';
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
405
416
|
async function appendCoordinatorPerfTrace(
|
|
406
417
|
env: CoordinatorEnv,
|
|
407
418
|
payload: CoordinatorPerfTracePayload,
|
|
@@ -1330,9 +1341,23 @@ async function markWorkflowRuntimeFailure(input: {
|
|
|
1330
1341
|
const backoffMs = [200, 500, 1500];
|
|
1331
1342
|
let lastError: unknown = null;
|
|
1332
1343
|
for (let attempt = 0; attempt <= backoffMs.length; attempt += 1) {
|
|
1344
|
+
const requestId = crypto.randomUUID();
|
|
1333
1345
|
try {
|
|
1346
|
+
headers.set('x-deepline-request-id', requestId);
|
|
1334
1347
|
const response = await fetch(url, { method: 'POST', headers, body });
|
|
1335
|
-
if (response.ok)
|
|
1348
|
+
if (response.ok) {
|
|
1349
|
+
if (attempt > 0) {
|
|
1350
|
+
console.info('[coordinator.runtime_api.retry]', {
|
|
1351
|
+
action: 'append_run_events',
|
|
1352
|
+
status: 'ok',
|
|
1353
|
+
attempt,
|
|
1354
|
+
runId,
|
|
1355
|
+
requestId,
|
|
1356
|
+
baseOrigin: safeOrigin(baseUrl),
|
|
1357
|
+
});
|
|
1358
|
+
}
|
|
1359
|
+
return;
|
|
1360
|
+
}
|
|
1336
1361
|
lastError = new Error(
|
|
1337
1362
|
`runtime API responded ${response.status}: ${(await response.text().catch(() => '')).slice(0, 400)}`,
|
|
1338
1363
|
);
|
|
@@ -1348,6 +1373,19 @@ async function markWorkflowRuntimeFailure(input: {
|
|
|
1348
1373
|
lastError = error;
|
|
1349
1374
|
}
|
|
1350
1375
|
if (attempt < backoffMs.length) {
|
|
1376
|
+
console.warn('[coordinator.runtime_api.retry]', {
|
|
1377
|
+
action: 'append_run_events',
|
|
1378
|
+
status: 'retry',
|
|
1379
|
+
attempt: attempt + 1,
|
|
1380
|
+
retryDelayMs: backoffMs[attempt],
|
|
1381
|
+
runId,
|
|
1382
|
+
requestId,
|
|
1383
|
+
baseOrigin: safeOrigin(baseUrl),
|
|
1384
|
+
error:
|
|
1385
|
+
lastError instanceof Error
|
|
1386
|
+
? lastError.message.slice(0, 300)
|
|
1387
|
+
: String(lastError).slice(0, 300),
|
|
1388
|
+
});
|
|
1351
1389
|
await new Promise((resolve) => setTimeout(resolve, backoffMs[attempt]));
|
|
1352
1390
|
}
|
|
1353
1391
|
}
|
|
@@ -2203,6 +2241,26 @@ async function callRuntimeApiFromCoordinator(input: {
|
|
|
2203
2241
|
});
|
|
2204
2242
|
|
|
2205
2243
|
const fetchStartedAt = Date.now();
|
|
2244
|
+
const requestId = crypto.randomUUID();
|
|
2245
|
+
const action =
|
|
2246
|
+
body && typeof body === 'object' && !Array.isArray(body)
|
|
2247
|
+
? String((body as { action?: unknown }).action ?? 'unknown')
|
|
2248
|
+
: 'unknown';
|
|
2249
|
+
const runId =
|
|
2250
|
+
body && typeof body === 'object' && !Array.isArray(body)
|
|
2251
|
+
? String(
|
|
2252
|
+
(body as { runId?: unknown; playId?: unknown }).runId ??
|
|
2253
|
+
(body as { runId?: unknown; playId?: unknown }).playId ??
|
|
2254
|
+
'',
|
|
2255
|
+
) || null
|
|
2256
|
+
: null;
|
|
2257
|
+
console.info('[coordinator.runtime_api.breadcrumb]', {
|
|
2258
|
+
phase: 'request',
|
|
2259
|
+
action,
|
|
2260
|
+
runId,
|
|
2261
|
+
requestId,
|
|
2262
|
+
baseOrigin: safeOrigin(input.baseUrl),
|
|
2263
|
+
});
|
|
2206
2264
|
const response = await input.env.HARNESS.runtimeApiCall({
|
|
2207
2265
|
contract: PLAY_RUNTIME_CONTRACT,
|
|
2208
2266
|
executorToken: input.executorToken,
|
|
@@ -2210,11 +2268,20 @@ async function callRuntimeApiFromCoordinator(input: {
|
|
|
2210
2268
|
path: PLAY_RUNTIME_API_COMPAT_PATH,
|
|
2211
2269
|
body,
|
|
2212
2270
|
headers: {
|
|
2213
|
-
'x-deepline-request-id':
|
|
2271
|
+
'x-deepline-request-id': requestId,
|
|
2214
2272
|
[PLAY_RUNTIME_CONTRACT_HEADER]: String(PLAY_RUNTIME_CONTRACT),
|
|
2215
2273
|
},
|
|
2216
2274
|
});
|
|
2217
2275
|
recordTiming('coordinator.runtime_api.fetch', fetchStartedAt);
|
|
2276
|
+
console.info('[coordinator.runtime_api.breadcrumb]', {
|
|
2277
|
+
phase: 'response',
|
|
2278
|
+
action,
|
|
2279
|
+
runId,
|
|
2280
|
+
requestId,
|
|
2281
|
+
status: response.status,
|
|
2282
|
+
ms: Date.now() - fetchStartedAt,
|
|
2283
|
+
baseOrigin: safeOrigin(input.baseUrl),
|
|
2284
|
+
});
|
|
2218
2285
|
|
|
2219
2286
|
const bodyStartedAt = Date.now();
|
|
2220
2287
|
const responseBody = response.body;
|
|
@@ -2361,12 +2428,75 @@ function normalizeRuntimeBaseUrl(value: unknown): string | null {
|
|
|
2361
2428
|
return parsed.toString().replace(/\/$/, '');
|
|
2362
2429
|
}
|
|
2363
2430
|
|
|
2364
|
-
|
|
2431
|
+
const DEEPLINE_PRODUCTION_APP_HOST = 'code.deepline.com';
|
|
2432
|
+
const DEEPLINE_VERCEL_DEPLOYMENT_HOST_RE =
|
|
2433
|
+
/^deepline-api(?:-[a-z0-9-]+)?-aero-team-0f650658\.vercel\.app$/i;
|
|
2434
|
+
const DEEPLINE_VERCEL_PROJECT_HOST_RE =
|
|
2435
|
+
/^deepline-[a-z0-9]+-aero-team-0f650658\.vercel\.app$/i;
|
|
2436
|
+
const DEEPLINE_WORKERS_DEV_SUBDOMAINS = new Set(['chirag-d94']);
|
|
2437
|
+
|
|
2438
|
+
function isDeeplineCoordinatorWorkerHost(hostname: string): boolean {
|
|
2439
|
+
const labels = hostname.toLowerCase().split('.');
|
|
2440
|
+
return (
|
|
2441
|
+
labels.length === 4 &&
|
|
2442
|
+
labels[0]?.startsWith('deepline-play-coordinator-') &&
|
|
2443
|
+
labels[2] === 'workers' &&
|
|
2444
|
+
labels[3] === 'dev' &&
|
|
2445
|
+
DEEPLINE_WORKERS_DEV_SUBDOMAINS.has(labels[1] ?? '')
|
|
2446
|
+
);
|
|
2447
|
+
}
|
|
2448
|
+
|
|
2449
|
+
function shouldCanonicalizeRuntimeApiBaseUrl(input: {
|
|
2450
|
+
configuredBaseUrl: URL;
|
|
2451
|
+
overrideBaseUrl: URL;
|
|
2452
|
+
}): boolean {
|
|
2453
|
+
if (input.overrideBaseUrl.host === input.configuredBaseUrl.host) {
|
|
2454
|
+
return false;
|
|
2455
|
+
}
|
|
2456
|
+
const configuredHostname = input.configuredBaseUrl.hostname.toLowerCase();
|
|
2457
|
+
const overrideHostname = input.overrideBaseUrl.hostname.toLowerCase();
|
|
2458
|
+
if (DEEPLINE_VERCEL_DEPLOYMENT_HOST_RE.test(overrideHostname)) {
|
|
2459
|
+
return true;
|
|
2460
|
+
}
|
|
2461
|
+
if (
|
|
2462
|
+
(configuredHostname === DEEPLINE_PRODUCTION_APP_HOST ||
|
|
2463
|
+
DEEPLINE_VERCEL_PROJECT_HOST_RE.test(configuredHostname)) &&
|
|
2464
|
+
DEEPLINE_VERCEL_PROJECT_HOST_RE.test(overrideHostname)
|
|
2465
|
+
) {
|
|
2466
|
+
return true;
|
|
2467
|
+
}
|
|
2468
|
+
return isDeeplineCoordinatorWorkerHost(overrideHostname);
|
|
2469
|
+
}
|
|
2470
|
+
|
|
2471
|
+
function resolveRuntimeApiBaseUrl(
|
|
2472
|
+
env: CoordinatorEnv,
|
|
2473
|
+
body: Record<string, unknown>,
|
|
2474
|
+
): string {
|
|
2475
|
+
const configuredBaseUrl = env.DEEPLINE_API_BASE_URL.replace(/\/$/, '');
|
|
2476
|
+
const overrideBaseUrl =
|
|
2477
|
+
normalizeRuntimeBaseUrl(body.runtimeApiBaseUrl) ??
|
|
2478
|
+
normalizeRuntimeBaseUrl(body.baseUrl);
|
|
2479
|
+
if (!overrideBaseUrl) {
|
|
2480
|
+
return configuredBaseUrl;
|
|
2481
|
+
}
|
|
2482
|
+
if (
|
|
2483
|
+
shouldCanonicalizeRuntimeApiBaseUrl({
|
|
2484
|
+
configuredBaseUrl: new URL(configuredBaseUrl),
|
|
2485
|
+
overrideBaseUrl: new URL(overrideBaseUrl),
|
|
2486
|
+
})
|
|
2487
|
+
) {
|
|
2488
|
+
return configuredBaseUrl;
|
|
2489
|
+
}
|
|
2490
|
+
return overrideBaseUrl;
|
|
2491
|
+
}
|
|
2492
|
+
|
|
2493
|
+
function resolveWorkflowCallbackBaseUrl(
|
|
2365
2494
|
env: CoordinatorEnv,
|
|
2366
2495
|
body: Record<string, unknown>,
|
|
2367
2496
|
): string {
|
|
2368
2497
|
return (
|
|
2369
2498
|
normalizeRuntimeBaseUrl(body.callbackBaseUrl) ??
|
|
2499
|
+
normalizeRuntimeBaseUrl(body.callbackUrl) ??
|
|
2370
2500
|
normalizeRuntimeBaseUrl(body.baseUrl) ??
|
|
2371
2501
|
env.DEEPLINE_API_BASE_URL.replace(/\/$/, '')
|
|
2372
2502
|
);
|
|
@@ -2388,7 +2518,8 @@ function validateChildSubmitBody(input: {
|
|
|
2388
2518
|
const { parentRunId, body } = input;
|
|
2389
2519
|
const manifest = body.manifest as PlayRuntimeManifest | undefined;
|
|
2390
2520
|
const governance = body.internalRunPlay as
|
|
2391
|
-
|
|
2521
|
+
| PlayCallGovernanceSnapshot
|
|
2522
|
+
| undefined;
|
|
2392
2523
|
const childPlayName =
|
|
2393
2524
|
typeof body.name === 'string' && body.name.trim()
|
|
2394
2525
|
? body.name.trim()
|
|
@@ -2480,7 +2611,8 @@ function buildChildWorkflowParams(input: {
|
|
|
2480
2611
|
dynamicWorkerCode,
|
|
2481
2612
|
preloadedDbSessions,
|
|
2482
2613
|
} = input;
|
|
2483
|
-
const baseUrl =
|
|
2614
|
+
const baseUrl = resolveRuntimeApiBaseUrl(env, body);
|
|
2615
|
+
const callbackUrl = resolveWorkflowCallbackBaseUrl(env, body);
|
|
2484
2616
|
return {
|
|
2485
2617
|
runId: childRunId,
|
|
2486
2618
|
playId: childRunId,
|
|
@@ -2517,7 +2649,9 @@ function buildChildWorkflowParams(input: {
|
|
|
2517
2649
|
preloadedDbSessions,
|
|
2518
2650
|
dynamicWorkerCode,
|
|
2519
2651
|
executorToken: childToken,
|
|
2520
|
-
baseUrl,
|
|
2652
|
+
baseUrl: callbackUrl,
|
|
2653
|
+
runtimeApiBaseUrl: baseUrl,
|
|
2654
|
+
callbackUrl,
|
|
2521
2655
|
integrationMode: normalizeIntegrationMode(body.integrationMode),
|
|
2522
2656
|
force: body.force === true || body.forceToolRefresh === true,
|
|
2523
2657
|
forceToolRefresh: body.forceToolRefresh === true,
|
|
@@ -2545,9 +2679,9 @@ function runRequestFromPlayWorkflowParams(
|
|
|
2545
2679
|
params.inputFile?.r2Key ?? params.inputFile?.storageKey ?? null;
|
|
2546
2680
|
return {
|
|
2547
2681
|
runId: params.runId,
|
|
2548
|
-
callbackUrl: params.baseUrl,
|
|
2682
|
+
callbackUrl: params.callbackUrl ?? params.baseUrl,
|
|
2549
2683
|
executorToken: params.executorToken,
|
|
2550
|
-
baseUrl: params.baseUrl,
|
|
2684
|
+
baseUrl: params.runtimeApiBaseUrl ?? params.baseUrl,
|
|
2551
2685
|
integrationMode: normalizeIntegrationMode(params.integrationMode),
|
|
2552
2686
|
orgId: params.orgId,
|
|
2553
2687
|
playName: params.playName,
|
|
@@ -2742,7 +2876,7 @@ async function executeChildInline(input: {
|
|
|
2742
2876
|
input.body.parentPlayName.trim()
|
|
2743
2877
|
? input.body.parentPlayName.trim()
|
|
2744
2878
|
: governance.parentPlayName;
|
|
2745
|
-
const baseUrl =
|
|
2879
|
+
const baseUrl = resolveRuntimeApiBaseUrl(input.env, input.body);
|
|
2746
2880
|
const { childToken, preloadedDbSessions, prepareTimings, transportTimings } =
|
|
2747
2881
|
await prepareInlineChildRunWithRuntime({
|
|
2748
2882
|
env: input.env,
|
|
@@ -3072,7 +3206,7 @@ async function submitChildWorkflowThroughCoordinator(input: {
|
|
|
3072
3206
|
parentRunId: input.parentRunId,
|
|
3073
3207
|
body: input.body,
|
|
3074
3208
|
});
|
|
3075
|
-
const baseUrl =
|
|
3209
|
+
const baseUrl = resolveRuntimeApiBaseUrl(input.env, input.body);
|
|
3076
3210
|
|
|
3077
3211
|
const tokenStartedAt = Date.now();
|
|
3078
3212
|
const childToken = await mintChildWorkflowExecutorToken({
|
|
@@ -1386,10 +1386,12 @@ async function postRuntimeApi<T>(
|
|
|
1386
1386
|
throw lastError instanceof Error ? lastError : new Error(String(lastError));
|
|
1387
1387
|
}
|
|
1388
1388
|
|
|
1389
|
+
const RETRYABLE_RUNTIME_API_ERROR_RE =
|
|
1390
|
+
/timeout|timed out|fetch failed|ECONNRESET|ECONNREFUSED|DeploymentNotFound|requested deployment .*exist|Authentication infrastructure/i;
|
|
1391
|
+
|
|
1389
1392
|
function isRetryableRuntimeApiError(error: unknown): boolean {
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
message,
|
|
1393
|
+
return RETRYABLE_RUNTIME_API_ERROR_RE.test(
|
|
1394
|
+
error instanceof Error ? error.message : String(error),
|
|
1393
1395
|
);
|
|
1394
1396
|
}
|
|
1395
1397
|
|
|
@@ -1411,12 +1413,7 @@ function isRetryableRuntimeApiResponse(status: number, body: string): boolean {
|
|
|
1411
1413
|
) {
|
|
1412
1414
|
return true;
|
|
1413
1415
|
}
|
|
1414
|
-
return (
|
|
1415
|
-
status === 500 &&
|
|
1416
|
-
/timeout exceeded when trying to connect|timed out|fetch failed|ECONNRESET|UND_ERR_CONNECT_TIMEOUT/i.test(
|
|
1417
|
-
body,
|
|
1418
|
-
)
|
|
1419
|
-
);
|
|
1416
|
+
return status === 500 && RETRYABLE_RUNTIME_API_ERROR_RE.test(body);
|
|
1420
1417
|
}
|
|
1421
1418
|
|
|
1422
1419
|
async function sleepRuntimeApiRetry(attempt: number): Promise<void> {
|
|
@@ -8305,9 +8302,9 @@ function runRequestFromWorkflowParams(
|
|
|
8305
8302
|
: null;
|
|
8306
8303
|
return {
|
|
8307
8304
|
runId: String(params.runId ?? ''),
|
|
8308
|
-
callbackUrl: String(params.baseUrl ?? ''),
|
|
8305
|
+
callbackUrl: String(params.callbackUrl ?? params.baseUrl ?? ''),
|
|
8309
8306
|
executorToken: String(params.executorToken ?? ''),
|
|
8310
|
-
baseUrl: String(params.baseUrl ?? ''),
|
|
8307
|
+
baseUrl: String(params.runtimeApiBaseUrl ?? params.baseUrl ?? ''),
|
|
8311
8308
|
integrationMode: normalizeIntegrationMode(params.integrationMode),
|
|
8312
8309
|
orgId: String(params.orgId ?? ''),
|
|
8313
8310
|
playName: String(params.playName ?? ''),
|
|
@@ -105,10 +105,10 @@ export const SDK_RELEASE = {
|
|
|
105
105
|
// 0.1.154 removes the short-lived generated enrich StepOptions recompute
|
|
106
106
|
// fields shipped in 0.1.153.
|
|
107
107
|
// 0.1.175 ships loud `deepline enrich` empty-waterfall reporting.
|
|
108
|
-
version: '0.1.
|
|
108
|
+
version: '0.1.192',
|
|
109
109
|
apiContract: '2026-06-dataset-handle-results-hard-cutover',
|
|
110
110
|
supportPolicy: {
|
|
111
|
-
latest: '0.1.
|
|
111
|
+
latest: '0.1.192',
|
|
112
112
|
minimumSupported: '0.1.53',
|
|
113
113
|
deprecatedBelow: '0.1.53',
|
|
114
114
|
commandMinimumSupported: [
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
isPlayExecutionSuspendedError,
|
|
12
12
|
isPlayRowExecutionSuspendedError,
|
|
13
13
|
} from './suspension';
|
|
14
|
+
import { getToolHttpErrorReceiptFailureKind } from './tool-http-errors';
|
|
14
15
|
import type { WorkReceiptFailureKind } from './work-receipts';
|
|
15
16
|
import {
|
|
16
17
|
PLAY_RUNTIME_WORK_RECEIPT_LEASE_TTL_MS,
|
|
@@ -48,6 +49,8 @@ function isInFlightRuntimeReceipt(
|
|
|
48
49
|
export function runtimeReceiptFailureKindForError(
|
|
49
50
|
error: unknown,
|
|
50
51
|
): WorkReceiptFailureKind {
|
|
52
|
+
const toolFailureKind = getToolHttpErrorReceiptFailureKind(error);
|
|
53
|
+
if (toolFailureKind) return toolFailureKind;
|
|
51
54
|
return isPlayExecutionSuspendedError(error) ||
|
|
52
55
|
isPlayRowExecutionSuspendedError(error)
|
|
53
56
|
? 'repairable'
|
|
@@ -128,6 +128,11 @@ export type PlaySchedulerSubmitInput = {
|
|
|
128
128
|
/** Optional immutable Worker module source for local Dynamic Worker loading. */
|
|
129
129
|
dynamicWorkerCode?: string | null;
|
|
130
130
|
executorToken: string;
|
|
131
|
+
/**
|
|
132
|
+
* Public app origin used by Workers to call Deepline runtime API routes.
|
|
133
|
+
* When omitted, legacy schedulers fall back to baseUrl.
|
|
134
|
+
*/
|
|
135
|
+
runtimeApiBaseUrl?: string | null;
|
|
131
136
|
baseUrl: string;
|
|
132
137
|
/** Optional per-run provider execution mode. Defaults to server policy when omitted. */
|
|
133
138
|
integrationMode?: 'live' | 'eval_stub' | 'fixture';
|
|
@@ -204,9 +204,7 @@ export function classifyToolExecuteHttpFailure(input: {
|
|
|
204
204
|
});
|
|
205
205
|
const shouldRetry =
|
|
206
206
|
retryDecision.retryable && input.attempt < retryDecision.attemptCap;
|
|
207
|
-
error.receiptFailureKind =
|
|
208
|
-
? 'repairable'
|
|
209
|
-
: 'terminal';
|
|
207
|
+
if (retryDecision.retryable) error.receiptFailureKind = 'repairable';
|
|
210
208
|
const retryAfterMs = parseToolExecuteRetryAfterMs(
|
|
211
209
|
input.retryAfterHeader,
|
|
212
210
|
input.nowMs,
|
|
@@ -4,13 +4,13 @@ export class ToolHttpError extends Error {
|
|
|
4
4
|
readonly billing: Record<string, unknown> | null;
|
|
5
5
|
/** HTTP status of the failed tool-execute response (e.g. 429, 502). */
|
|
6
6
|
readonly status: number;
|
|
7
|
-
receiptFailureKind: WorkReceiptFailureKind
|
|
7
|
+
receiptFailureKind: WorkReceiptFailureKind;
|
|
8
8
|
|
|
9
9
|
constructor(
|
|
10
10
|
message: string,
|
|
11
11
|
billing: Record<string, unknown> | null,
|
|
12
12
|
status: number,
|
|
13
|
-
receiptFailureKind: WorkReceiptFailureKind
|
|
13
|
+
receiptFailureKind: WorkReceiptFailureKind = 'terminal',
|
|
14
14
|
) {
|
|
15
15
|
super(message);
|
|
16
16
|
this.name = 'ToolHttpError';
|
package/dist/cli/index.js
CHANGED
|
@@ -623,10 +623,10 @@ var SDK_RELEASE = {
|
|
|
623
623
|
// 0.1.154 removes the short-lived generated enrich StepOptions recompute
|
|
624
624
|
// fields shipped in 0.1.153.
|
|
625
625
|
// 0.1.175 ships loud `deepline enrich` empty-waterfall reporting.
|
|
626
|
-
version: "0.1.
|
|
626
|
+
version: "0.1.192",
|
|
627
627
|
apiContract: "2026-06-dataset-handle-results-hard-cutover",
|
|
628
628
|
supportPolicy: {
|
|
629
|
-
latest: "0.1.
|
|
629
|
+
latest: "0.1.192",
|
|
630
630
|
minimumSupported: "0.1.53",
|
|
631
631
|
deprecatedBelow: "0.1.53",
|
|
632
632
|
commandMinimumSupported: [
|
|
@@ -19385,6 +19385,30 @@ function coalesceExportableSheetRows(rows, sourceRowStart = 0) {
|
|
|
19385
19385
|
bySourceRowIndex.set(rowIndex, next);
|
|
19386
19386
|
mergedRows.push(next);
|
|
19387
19387
|
}
|
|
19388
|
+
if (bySourceRowIndex.size > 0) {
|
|
19389
|
+
mergedRows.sort((left, right) => {
|
|
19390
|
+
const leftIndex = sourceRowIndexFromEnrichRow(
|
|
19391
|
+
left,
|
|
19392
|
+
sourceRowStart,
|
|
19393
|
+
Number.MAX_SAFE_INTEGER
|
|
19394
|
+
);
|
|
19395
|
+
const rightIndex = sourceRowIndexFromEnrichRow(
|
|
19396
|
+
right,
|
|
19397
|
+
sourceRowStart,
|
|
19398
|
+
Number.MAX_SAFE_INTEGER
|
|
19399
|
+
);
|
|
19400
|
+
if (leftIndex !== null && rightIndex !== null) {
|
|
19401
|
+
return leftIndex - rightIndex;
|
|
19402
|
+
}
|
|
19403
|
+
if (leftIndex !== null) {
|
|
19404
|
+
return -1;
|
|
19405
|
+
}
|
|
19406
|
+
if (rightIndex !== null) {
|
|
19407
|
+
return 1;
|
|
19408
|
+
}
|
|
19409
|
+
return 0;
|
|
19410
|
+
});
|
|
19411
|
+
}
|
|
19388
19412
|
return mergedRows;
|
|
19389
19413
|
}
|
|
19390
19414
|
function sourceRowIndexFromEnrichRow(row, start, end) {
|
|
@@ -21227,7 +21251,9 @@ function registerEnrichCommand(program) {
|
|
|
21227
21251
|
...finalExportResult ? { rowSetComplete: !finalExportResult.partial } : {}
|
|
21228
21252
|
});
|
|
21229
21253
|
if (chunk.exportResult) {
|
|
21230
|
-
currentChunkCommittedExportResult = await commitInPlaceOutput(
|
|
21254
|
+
currentChunkCommittedExportResult = await commitInPlaceOutput(
|
|
21255
|
+
chunk.exportResult
|
|
21256
|
+
);
|
|
21231
21257
|
finalExportResult = currentChunkCommittedExportResult;
|
|
21232
21258
|
}
|
|
21233
21259
|
const reportedExportResult = currentChunkCommittedExportResult ?? finalExportResult;
|
package/dist/cli/index.mjs
CHANGED
|
@@ -608,10 +608,10 @@ var SDK_RELEASE = {
|
|
|
608
608
|
// 0.1.154 removes the short-lived generated enrich StepOptions recompute
|
|
609
609
|
// fields shipped in 0.1.153.
|
|
610
610
|
// 0.1.175 ships loud `deepline enrich` empty-waterfall reporting.
|
|
611
|
-
version: "0.1.
|
|
611
|
+
version: "0.1.192",
|
|
612
612
|
apiContract: "2026-06-dataset-handle-results-hard-cutover",
|
|
613
613
|
supportPolicy: {
|
|
614
|
-
latest: "0.1.
|
|
614
|
+
latest: "0.1.192",
|
|
615
615
|
minimumSupported: "0.1.53",
|
|
616
616
|
deprecatedBelow: "0.1.53",
|
|
617
617
|
commandMinimumSupported: [
|
|
@@ -19414,6 +19414,30 @@ function coalesceExportableSheetRows(rows, sourceRowStart = 0) {
|
|
|
19414
19414
|
bySourceRowIndex.set(rowIndex, next);
|
|
19415
19415
|
mergedRows.push(next);
|
|
19416
19416
|
}
|
|
19417
|
+
if (bySourceRowIndex.size > 0) {
|
|
19418
|
+
mergedRows.sort((left, right) => {
|
|
19419
|
+
const leftIndex = sourceRowIndexFromEnrichRow(
|
|
19420
|
+
left,
|
|
19421
|
+
sourceRowStart,
|
|
19422
|
+
Number.MAX_SAFE_INTEGER
|
|
19423
|
+
);
|
|
19424
|
+
const rightIndex = sourceRowIndexFromEnrichRow(
|
|
19425
|
+
right,
|
|
19426
|
+
sourceRowStart,
|
|
19427
|
+
Number.MAX_SAFE_INTEGER
|
|
19428
|
+
);
|
|
19429
|
+
if (leftIndex !== null && rightIndex !== null) {
|
|
19430
|
+
return leftIndex - rightIndex;
|
|
19431
|
+
}
|
|
19432
|
+
if (leftIndex !== null) {
|
|
19433
|
+
return -1;
|
|
19434
|
+
}
|
|
19435
|
+
if (rightIndex !== null) {
|
|
19436
|
+
return 1;
|
|
19437
|
+
}
|
|
19438
|
+
return 0;
|
|
19439
|
+
});
|
|
19440
|
+
}
|
|
19417
19441
|
return mergedRows;
|
|
19418
19442
|
}
|
|
19419
19443
|
function sourceRowIndexFromEnrichRow(row, start, end) {
|
|
@@ -21256,7 +21280,9 @@ function registerEnrichCommand(program) {
|
|
|
21256
21280
|
...finalExportResult ? { rowSetComplete: !finalExportResult.partial } : {}
|
|
21257
21281
|
});
|
|
21258
21282
|
if (chunk.exportResult) {
|
|
21259
|
-
currentChunkCommittedExportResult = await commitInPlaceOutput(
|
|
21283
|
+
currentChunkCommittedExportResult = await commitInPlaceOutput(
|
|
21284
|
+
chunk.exportResult
|
|
21285
|
+
);
|
|
21260
21286
|
finalExportResult = currentChunkCommittedExportResult;
|
|
21261
21287
|
}
|
|
21262
21288
|
const reportedExportResult = currentChunkCommittedExportResult ?? finalExportResult;
|
package/dist/index.js
CHANGED
|
@@ -422,10 +422,10 @@ var SDK_RELEASE = {
|
|
|
422
422
|
// 0.1.154 removes the short-lived generated enrich StepOptions recompute
|
|
423
423
|
// fields shipped in 0.1.153.
|
|
424
424
|
// 0.1.175 ships loud `deepline enrich` empty-waterfall reporting.
|
|
425
|
-
version: "0.1.
|
|
425
|
+
version: "0.1.192",
|
|
426
426
|
apiContract: "2026-06-dataset-handle-results-hard-cutover",
|
|
427
427
|
supportPolicy: {
|
|
428
|
-
latest: "0.1.
|
|
428
|
+
latest: "0.1.192",
|
|
429
429
|
minimumSupported: "0.1.53",
|
|
430
430
|
deprecatedBelow: "0.1.53",
|
|
431
431
|
commandMinimumSupported: [
|
package/dist/index.mjs
CHANGED
|
@@ -352,10 +352,10 @@ var SDK_RELEASE = {
|
|
|
352
352
|
// 0.1.154 removes the short-lived generated enrich StepOptions recompute
|
|
353
353
|
// fields shipped in 0.1.153.
|
|
354
354
|
// 0.1.175 ships loud `deepline enrich` empty-waterfall reporting.
|
|
355
|
-
version: "0.1.
|
|
355
|
+
version: "0.1.192",
|
|
356
356
|
apiContract: "2026-06-dataset-handle-results-hard-cutover",
|
|
357
357
|
supportPolicy: {
|
|
358
|
-
latest: "0.1.
|
|
358
|
+
latest: "0.1.192",
|
|
359
359
|
minimumSupported: "0.1.53",
|
|
360
360
|
deprecatedBelow: "0.1.53",
|
|
361
361
|
commandMinimumSupported: [
|