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.
- package/dist/bundling-sources/sdk/src/api-error.ts +45 -0
- package/dist/bundling-sources/sdk/src/client.ts +98 -459
- package/dist/bundling-sources/sdk/src/http.ts +1 -34
- package/dist/bundling-sources/sdk/src/index.ts +8 -0
- package/dist/bundling-sources/sdk/src/plays/csv-data-input.ts +139 -0
- package/dist/bundling-sources/sdk/src/plays/run-request.ts +855 -0
- package/dist/bundling-sources/sdk/src/release.ts +1 -1
- package/dist/bundling-sources/sdk/src/runs/overview.ts +45 -2
- package/dist/bundling-sources/sdk/src/types.ts +5 -0
- package/dist/bundling-sources/shared_libs/play-runtime/app-runtime-api.ts +8 -0
- package/dist/bundling-sources/shared_libs/play-runtime/context.ts +42 -10
- package/dist/bundling-sources/shared_libs/play-runtime/launch-identity.ts +3 -0
- package/dist/bundling-sources/shared_libs/play-runtime/launch-source-policy.ts +23 -0
- package/dist/bundling-sources/shared_libs/play-runtime/live-state-contract.ts +3 -0
- package/dist/bundling-sources/shared_libs/play-runtime/play-admission-outcome.ts +23 -5
- package/dist/bundling-sources/shared_libs/play-runtime/play-runs/projection/gateway-adapter.ts +1 -1
- package/dist/bundling-sources/shared_libs/play-runtime/run-execution-state.ts +845 -0
- package/dist/bundling-sources/shared_libs/play-runtime/run-ledger.ts +106 -6
- package/dist/bundling-sources/shared_libs/play-runtime/run-observation.ts +440 -0
- package/dist/bundling-sources/shared_libs/play-runtime/run-snapshot-stream.ts +35 -2
- package/dist/bundling-sources/shared_libs/play-runtime/runner-app/index.ts +66 -7
- package/dist/bundling-sources/shared_libs/play-runtime/runtime-api.ts +0 -29
- package/dist/bundling-sources/shared_libs/play-runtime/runtime-sheet-row-transition.ts +47 -2
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backend.ts +6 -0
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-runtime-worker.ts +475 -36
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-progress.ts +78 -11
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres.ts +550 -42
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/run-ledger-outbox-recovery.ts +181 -8
- package/dist/bundling-sources/shared_libs/play-runtime/step-lifecycle-tracker.ts +0 -18
- package/dist/bundling-sources/shared_libs/play-runtime/tool-execute-retry-policy.ts +80 -7
- package/dist/bundling-sources/shared_libs/play-runtime/tool-http-errors.ts +37 -2
- package/dist/bundling-sources/shared_libs/plays/bundling/index.ts +148 -18
- package/dist/bundling-sources/shared_libs/plays/cascade-falloff.ts +86 -0
- package/dist/bundling-sources/shared_libs/plays/docflow-unreached-reason.ts +611 -0
- package/dist/bundling-sources/shared_libs/plays/docflow.ts +21 -0
- package/dist/bundling-sources/shared_libs/plays/play-exports.ts +28 -5
- package/dist/bundling-sources/shared_libs/plays/settings-contract.ts +92 -10
- package/dist/bundling-sources/shared_libs/plays/static-pipeline.ts +5 -0
- package/dist/bundling-sources/shared_libs/plays/trigger-config-contract.ts +222 -0
- package/dist/bundling-sources/shared_libs/plays/trigger-config-route.ts +15 -0
- package/dist/cli/index.js +4957 -771
- package/dist/cli/index.mjs +4957 -771
- package/dist/client-B5XbKrrs.d.mts +6564 -0
- package/dist/client-C9Y49yya.d.ts +6564 -0
- package/dist/{compiler-manifest-C4mdRJOP.d.mts → compiler-manifest-CUuh8C3b.d.mts} +14 -1
- package/dist/{compiler-manifest-C4mdRJOP.d.ts → compiler-manifest-CUuh8C3b.d.ts} +14 -1
- package/dist/index.d.mts +7 -6275
- package/dist/index.d.ts +7 -6275
- package/dist/index.js +360 -326
- package/dist/index.mjs +360 -326
- package/dist/install-integrity.json +21 -2
- package/dist/plays/bundle-play-file.d.mts +2 -2
- package/dist/plays/bundle-play-file.d.ts +2 -2
- package/dist/plays/bundle-play-file.mjs +117 -18
- package/dist/plays/csv-data-input.d.mts +37 -0
- package/dist/plays/csv-data-input.d.ts +37 -0
- package/dist/plays/csv-data-input.js +3135 -0
- package/dist/plays/csv-data-input.mjs +3108 -0
- package/dist/plays/run-request.d.mts +6 -0
- package/dist/plays/run-request.d.ts +6 -0
- package/dist/plays/run-request.js +664 -0
- package/dist/plays/run-request.mjs +614 -0
- package/dist/release.d.mts +1 -1
- package/dist/release.d.ts +1 -1
- package/dist/release.js +1 -1
- package/dist/release.mjs +1 -1
- 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.
|
|
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
|
-
|
|
341
|
-
|
|
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
|
|
7315
|
-
//
|
|
7316
|
-
//
|
|
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
|
|
16664
|
-
//
|
|
16665
|
-
//
|
|
16666
|
-
//
|
|
16667
|
-
//
|
|
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
|
-
|
|
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
|
-
:
|
|
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
|
/**
|