deepline 0.3.271 → 0.3.273
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/README.md +9 -0
- package/dist/bundling-sources/sdk/src/client.ts +49 -17
- package/dist/bundling-sources/sdk/src/release.ts +1 -1
- package/dist/bundling-sources/sdk/src/runs/receipts.ts +18 -2
- package/dist/bundling-sources/shared_libs/play-runtime/activity-observation.ts +3 -2
- package/dist/bundling-sources/shared_libs/play-runtime/app-runtime-api.ts +11 -9
- package/dist/bundling-sources/shared_libs/play-runtime/context.ts +5 -4
- package/dist/bundling-sources/shared_libs/play-runtime/ctx-types.ts +2 -1
- package/dist/bundling-sources/shared_libs/play-runtime/run-event-catalog.ts +610 -0
- package/dist/bundling-sources/shared_libs/play-runtime/run-ledger-event-transport.ts +3 -1
- package/dist/bundling-sources/shared_libs/play-runtime/run-ledger-projection-diagnostics.ts +3 -2
- package/dist/bundling-sources/shared_libs/play-runtime/run-ledger.ts +80 -67
- package/dist/bundling-sources/shared_libs/play-runtime/runner-app/index.ts +5 -4
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-shared.ts +3 -2
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-progress.ts +19 -9
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres.ts +103 -78
- package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-event-search.ts +125 -81
- package/dist/bundling-sources/shared_libs/plays/authoring-contract.ts +3 -2
- package/dist/cli/index.js +662 -39
- package/dist/cli/index.mjs +662 -39
- package/dist/{client-BbKtvT9Q.d.ts → client-5xpuGpRn.d.ts} +64 -19
- package/dist/{client-C1Xm7eBH.d.mts → client-D9annc6K.d.mts} +64 -19
- package/dist/{compiler-manifest-CUuh8C3b.d.mts → compiler-manifest-C1bKB9bY.d.mts} +3 -2
- package/dist/{compiler-manifest-CUuh8C3b.d.ts → compiler-manifest-C1bKB9bY.d.ts} +3 -2
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +423 -4
- package/dist/index.mjs +423 -4
- package/dist/install-integrity.json +5 -4
- package/dist/plays/bundle-play-file.d.mts +2 -2
- package/dist/plays/bundle-play-file.d.ts +2 -2
- package/dist/plays/run-request.d.mts +2 -2
- package/dist/plays/run-request.d.ts +2 -2
- 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 +1 -1
|
@@ -98,6 +98,15 @@ import {
|
|
|
98
98
|
type PlayRunLedgerIngressEvent,
|
|
99
99
|
type PlayRunLedgerTerminalWorkCounterSegment,
|
|
100
100
|
} from '../run-ledger';
|
|
101
|
+
import {
|
|
102
|
+
RUN_EVENT_KIND_SQL_LITERAL,
|
|
103
|
+
RUN_EVENT_KIND,
|
|
104
|
+
RUN_SCHEDULER_OUTBOX_START_EVENT_TYPES,
|
|
105
|
+
RUN_SCHEDULER_OUTBOX_EVENT_TYPE,
|
|
106
|
+
RUN_SCHEDULER_OUTBOX_EVENT_TYPE_SQL_LITERAL,
|
|
107
|
+
RUN_SCHEDULER_OUTBOX_PREFIX_STOP_EVENT_TYPES,
|
|
108
|
+
RUN_SCHEDULER_OUTBOX_TERMINAL_EVENT_TYPES,
|
|
109
|
+
} from '../run-event-catalog';
|
|
101
110
|
import { stableStringify } from '../../plays/row-identity';
|
|
102
111
|
import {
|
|
103
112
|
runtimeWorkCountersFromResources,
|
|
@@ -928,13 +937,13 @@ export const POSTGRES_SCHEDULER_OUTBOX_DELIVERED_RETENTION_BATCH_LIMIT = 1_000;
|
|
|
928
937
|
// eligibility test, including present-but-null log fields.
|
|
929
938
|
const DELIVERED_OUTBOX_RAW_LOG_BODY_PREDICATE = `
|
|
930
939
|
(
|
|
931
|
-
(event_type =
|
|
940
|
+
(event_type = ${RUN_SCHEDULER_OUTBOX_EVENT_TYPE_SQL_LITERAL.runEvents}
|
|
932
941
|
AND jsonb_typeof(payload_json->'events') = 'array'
|
|
933
|
-
AND payload_json @? 'strict $.events[*] ? (@.type == "
|
|
934
|
-
OR (event_type IN (
|
|
942
|
+
AND payload_json @? 'strict $.events[*] ? (@.type == "${RUN_EVENT_KIND.logAppended}" && (exists(@.lines) || exists(@.lineContexts)))'::jsonpath)
|
|
943
|
+
OR (event_type IN (${RUN_EVENT_KIND_SQL_LITERAL.runCompleted}, ${RUN_EVENT_KIND_SQL_LITERAL.runFailed})
|
|
935
944
|
AND (payload_json ? 'terminalLogLines'
|
|
936
945
|
OR (jsonb_typeof(payload_json->'terminalProgressEvents') = 'array'
|
|
937
|
-
AND payload_json @? 'strict $.terminalProgressEvents[*] ? (@.type == "
|
|
946
|
+
AND payload_json @? 'strict $.terminalProgressEvents[*] ? (@.type == "${RUN_EVENT_KIND.logAppended}" && (exists(@.lines) || exists(@.lineContexts)))'::jsonpath)))
|
|
938
947
|
)`;
|
|
939
948
|
const RUN_LEDGER_DISPATCH_TOKEN_TIMEOUT_MS = 15_000;
|
|
940
949
|
const COMPUTE_BILLING_DISPATCH_TOKEN_TIMEOUT_MS = 15_000;
|
|
@@ -2252,7 +2261,7 @@ async function ensurePostgresSchedulerTerminalComputeBillingOutboxTrigger(
|
|
|
2252
2261
|
LANGUAGE plpgsql
|
|
2253
2262
|
AS $$
|
|
2254
2263
|
BEGIN
|
|
2255
|
-
IF NEW.event_type NOT IN (
|
|
2264
|
+
IF NEW.event_type NOT IN (${RUN_EVENT_KIND_SQL_LITERAL.runCompleted}, ${RUN_EVENT_KIND_SQL_LITERAL.runFailed}, ${RUN_EVENT_KIND_SQL_LITERAL.runCancelled}) THEN
|
|
2256
2265
|
RETURN NEW;
|
|
2257
2266
|
END IF;
|
|
2258
2267
|
|
|
@@ -3907,7 +3916,7 @@ export async function ensurePostgresSchedulerSchema(
|
|
|
3907
3916
|
await client.query(`
|
|
3908
3917
|
CREATE INDEX IF NOT EXISTS runtime_scheduler_outbox_admission_pending_idx
|
|
3909
3918
|
ON ${tableName('outbox', options)} (
|
|
3910
|
-
(CASE WHEN event_type =
|
|
3919
|
+
(CASE WHEN event_type = ${RUN_EVENT_KIND_SQL_LITERAL.runCreated} THEN 0 ELSE 1 END),
|
|
3911
3920
|
coalesce(next_attempt_at, created_at),
|
|
3912
3921
|
created_at,
|
|
3913
3922
|
event_id
|
|
@@ -3923,7 +3932,7 @@ export async function ensurePostgresSchedulerSchema(
|
|
|
3923
3932
|
CREATE INDEX IF NOT EXISTS runtime_scheduler_outbox_run_pending_order_idx
|
|
3924
3933
|
ON ${tableName('outbox', options)} (
|
|
3925
3934
|
run_id,
|
|
3926
|
-
(CASE event_type WHEN
|
|
3935
|
+
(CASE event_type WHEN ${RUN_EVENT_KIND_SQL_LITERAL.runCreated} THEN 0 WHEN ${RUN_EVENT_KIND_SQL_LITERAL.runStarted} THEN 1 ELSE 2 END),
|
|
3927
3936
|
created_at,
|
|
3928
3937
|
event_id
|
|
3929
3938
|
)
|
|
@@ -4075,7 +4084,7 @@ const POSTGRES_SCHEDULER_RUNTIME_ADMIN_INDEXES = [
|
|
|
4075
4084
|
name: 'runtime_scheduler_outbox_run_pending_order_idx',
|
|
4076
4085
|
table: 'outbox',
|
|
4077
4086
|
definition: `(run_id,
|
|
4078
|
-
(CASE event_type WHEN
|
|
4087
|
+
(CASE event_type WHEN ${RUN_EVENT_KIND_SQL_LITERAL.runCreated} THEN 0 WHEN ${RUN_EVENT_KIND_SQL_LITERAL.runStarted} THEN 1 ELSE 2 END),
|
|
4079
4088
|
created_at, event_id)
|
|
4080
4089
|
WHERE delivered_at IS NULL`,
|
|
4081
4090
|
},
|
|
@@ -4105,7 +4114,7 @@ const POSTGRES_SCHEDULER_RUNTIME_ADMIN_INDEXES = [
|
|
|
4105
4114
|
name: 'runtime_scheduler_outbox_admission_pending_idx',
|
|
4106
4115
|
table: 'outbox',
|
|
4107
4116
|
definition: `(
|
|
4108
|
-
(CASE WHEN event_type =
|
|
4117
|
+
(CASE WHEN event_type = ${RUN_EVENT_KIND_SQL_LITERAL.runCreated} THEN 0 ELSE 1 END),
|
|
4109
4118
|
coalesce(next_attempt_at, created_at),
|
|
4110
4119
|
created_at,
|
|
4111
4120
|
event_id
|
|
@@ -5145,7 +5154,7 @@ async function submitPostgresSchedulerRunTransaction(
|
|
|
5145
5154
|
SELECT
|
|
5146
5155
|
'run-created:' || run_insert.run_id,
|
|
5147
5156
|
run_insert.run_id,
|
|
5148
|
-
|
|
5157
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runCreated},
|
|
5149
5158
|
jsonb_strip_nulls(jsonb_build_object(
|
|
5150
5159
|
'orgId', $2::text,
|
|
5151
5160
|
'playId', $3::text,
|
|
@@ -6232,7 +6241,7 @@ export async function firePostgresSchedulerCronSchedule(
|
|
|
6232
6241
|
SELECT
|
|
6233
6242
|
'run-created:' || run_insert.run_id,
|
|
6234
6243
|
run_insert.run_id,
|
|
6235
|
-
|
|
6244
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runCreated},
|
|
6236
6245
|
jsonb_strip_nulls(jsonb_build_object(
|
|
6237
6246
|
'orgId', launch_payload.launch_json ->> 'orgId',
|
|
6238
6247
|
'playId', launch_payload.launch_json ->> 'playId',
|
|
@@ -7247,7 +7256,7 @@ export async function resumePostgresSchedulerDetachedRunnerAttempt(
|
|
|
7247
7256
|
INSERT INTO ${tableName('outbox', options)} (
|
|
7248
7257
|
event_id, run_id, event_type, payload_json, created_at
|
|
7249
7258
|
)
|
|
7250
|
-
SELECT $4, run_id,
|
|
7259
|
+
SELECT $4, run_id, ${RUN_EVENT_KIND_SQL_LITERAL.runWaiting}, jsonb_build_object('kind', 'detached_runner'),
|
|
7251
7260
|
${causalOutboxCreatedAt('restored_run.run_id', options)}
|
|
7252
7261
|
FROM restored_run
|
|
7253
7262
|
RETURNING run_id
|
|
@@ -7386,7 +7395,7 @@ export async function markPostgresSchedulerAttemptWaiting(
|
|
|
7386
7395
|
SELECT
|
|
7387
7396
|
$6,
|
|
7388
7397
|
waiting_run.run_id,
|
|
7389
|
-
|
|
7398
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runWaiting},
|
|
7390
7399
|
jsonb_strip_nulls(jsonb_build_object(
|
|
7391
7400
|
'kind', NULLIF(btrim($4::jsonb ->> 'kind'), ''),
|
|
7392
7401
|
'eventKey', NULLIF($7::text, ''),
|
|
@@ -7532,7 +7541,7 @@ export async function markPostgresSchedulerAttemptRunning(
|
|
|
7532
7541
|
SELECT
|
|
7533
7542
|
$4,
|
|
7534
7543
|
running_run.run_id,
|
|
7535
|
-
|
|
7544
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runResumed},
|
|
7536
7545
|
jsonb_strip_nulls(jsonb_build_object(
|
|
7537
7546
|
'kind', NULLIF(btrim(running_run.suspension_json ->> 'kind'), ''),
|
|
7538
7547
|
'eventKey',
|
|
@@ -7630,7 +7639,7 @@ export async function claimPostgresSchedulerCompletedDetachedRunnerTerminal(
|
|
|
7630
7639
|
SELECT
|
|
7631
7640
|
$3,
|
|
7632
7641
|
run_id,
|
|
7633
|
-
|
|
7642
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runResumed},
|
|
7634
7643
|
jsonb_build_object(
|
|
7635
7644
|
'kind', 'detached_runner',
|
|
7636
7645
|
'eventKey', 'detached_runner_terminal'
|
|
@@ -7776,7 +7785,7 @@ export async function claimPostgresSchedulerOverdueDetachedRunnerCeilings(
|
|
|
7776
7785
|
SELECT
|
|
7777
7786
|
$3 || ':' || running_runs.run_id,
|
|
7778
7787
|
running_runs.run_id,
|
|
7779
|
-
|
|
7788
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runResumed},
|
|
7780
7789
|
jsonb_build_object(
|
|
7781
7790
|
'kind', 'detached_runner',
|
|
7782
7791
|
'eventKey', 'detached_runner_hard_ceiling'
|
|
@@ -8037,7 +8046,7 @@ export async function failPostgresSchedulerScheduledChildWaits(
|
|
|
8037
8046
|
SELECT
|
|
8038
8047
|
'run-terminal:' || run_id,
|
|
8039
8048
|
terminal_runs.run_id,
|
|
8040
|
-
|
|
8049
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runFailed},
|
|
8041
8050
|
jsonb_build_object('error', $2::text),
|
|
8042
8051
|
${causalOutboxCreatedAt('terminal_runs.run_id', options)}
|
|
8043
8052
|
FROM terminal_runs
|
|
@@ -8303,7 +8312,7 @@ export async function claimPostgresSchedulerWaitingDetachedAttemptForTerminal(
|
|
|
8303
8312
|
SELECT
|
|
8304
8313
|
$4,
|
|
8305
8314
|
running_run.run_id,
|
|
8306
|
-
|
|
8315
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runResumed},
|
|
8307
8316
|
jsonb_build_object(
|
|
8308
8317
|
'kind', 'detached_runner',
|
|
8309
8318
|
'eventKey', 'detached_runner_terminal_salvage'
|
|
@@ -8712,7 +8721,7 @@ export async function handoffPostgresSchedulerAttemptContinuation(
|
|
|
8712
8721
|
SELECT
|
|
8713
8722
|
$6,
|
|
8714
8723
|
continuation_run.run_id,
|
|
8715
|
-
|
|
8724
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runResumed},
|
|
8716
8725
|
jsonb_strip_nulls(jsonb_build_object(
|
|
8717
8726
|
'kind', NULLIF(btrim(continuation_run.suspension_json ->> 'kind'), ''),
|
|
8718
8727
|
'eventKey',
|
|
@@ -10632,7 +10641,7 @@ export async function directCompletePostgresSchedulerRunnerTerminal(
|
|
|
10632
10641
|
SELECT
|
|
10633
10642
|
'run-terminal:' || run_id,
|
|
10634
10643
|
run_terminal.run_id,
|
|
10635
|
-
|
|
10644
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runCompleted},
|
|
10636
10645
|
jsonb_build_object(
|
|
10637
10646
|
'output', $6::jsonb,
|
|
10638
10647
|
'producerAttempt', $2::integer,
|
|
@@ -13089,7 +13098,7 @@ export async function completePostgresSchedulerAttempt(
|
|
|
13089
13098
|
SELECT
|
|
13090
13099
|
'run-terminal:' || run_id,
|
|
13091
13100
|
run_terminal.run_id,
|
|
13092
|
-
|
|
13101
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runCompleted},
|
|
13093
13102
|
jsonb_build_object(
|
|
13094
13103
|
'output', $9::jsonb,
|
|
13095
13104
|
'producerAttempt', $2::integer,
|
|
@@ -13425,7 +13434,7 @@ export async function failPostgresSchedulerAttempt(
|
|
|
13425
13434
|
SELECT
|
|
13426
13435
|
'run-terminal:' || run_id,
|
|
13427
13436
|
run_terminal.run_id,
|
|
13428
|
-
|
|
13437
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runFailed},
|
|
13429
13438
|
jsonb_build_object(
|
|
13430
13439
|
'error', $4::jsonb ->> 'message',
|
|
13431
13440
|
'result', $8::jsonb,
|
|
@@ -13683,7 +13692,7 @@ export async function cancelPostgresSchedulerRun(
|
|
|
13683
13692
|
SELECT
|
|
13684
13693
|
'run-terminal:' || run_id,
|
|
13685
13694
|
cancelled_run.run_id,
|
|
13686
|
-
|
|
13695
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runCancelled},
|
|
13687
13696
|
jsonb_build_object('error', $5::text),
|
|
13688
13697
|
${causalOutboxCreatedAt('cancelled_run.run_id', options)},
|
|
13689
13698
|
NULL,
|
|
@@ -17071,7 +17080,12 @@ export async function appendPostgresRunLedgerEvents(
|
|
|
17071
17080
|
const eventId = `run-events:${input.runId}:${createHash('sha256').update(payload).digest('hex')}`;
|
|
17072
17081
|
return appendRunLedgerOutboxFact(
|
|
17073
17082
|
client,
|
|
17074
|
-
{
|
|
17083
|
+
{
|
|
17084
|
+
...input,
|
|
17085
|
+
eventId,
|
|
17086
|
+
eventType: RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runEvents,
|
|
17087
|
+
payload,
|
|
17088
|
+
},
|
|
17075
17089
|
options,
|
|
17076
17090
|
);
|
|
17077
17091
|
}
|
|
@@ -17096,7 +17110,7 @@ export async function appendPostgresRunLedgerStart(
|
|
|
17096
17110
|
orgId: input.orgId,
|
|
17097
17111
|
runId: input.runId,
|
|
17098
17112
|
eventId: `run-start-callback:${input.runId}`,
|
|
17099
|
-
eventType:
|
|
17113
|
+
eventType: RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runStarted,
|
|
17100
17114
|
payload: stableStringify(
|
|
17101
17115
|
prepareRetainedPlayPipelinesForTransport(input.start),
|
|
17102
17116
|
),
|
|
@@ -17111,7 +17125,9 @@ async function appendRunLedgerOutboxFact(
|
|
|
17111
17125
|
orgId: string;
|
|
17112
17126
|
runId: string;
|
|
17113
17127
|
eventId: string;
|
|
17114
|
-
eventType:
|
|
17128
|
+
eventType:
|
|
17129
|
+
| typeof RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runEvents
|
|
17130
|
+
| typeof RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runStarted;
|
|
17115
17131
|
payload: string;
|
|
17116
17132
|
},
|
|
17117
17133
|
options?: Pick<PostgresSchedulerOptions, 'schema'>,
|
|
@@ -17249,14 +17265,16 @@ export async function assertPostgresRunLedgerDelivery(
|
|
|
17249
17265
|
prefixStopReason = 'predecessor_failed';
|
|
17250
17266
|
break;
|
|
17251
17267
|
}
|
|
17252
|
-
if (
|
|
17268
|
+
if (
|
|
17269
|
+
prefix.length > 0 &&
|
|
17270
|
+
row.event_type === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runEvents
|
|
17271
|
+
)
|
|
17272
|
+
break;
|
|
17253
17273
|
prefix.push(row);
|
|
17254
17274
|
|
|
17255
17275
|
const first = prefix[0]!;
|
|
17256
17276
|
const terminal = prefix.find((candidate) =>
|
|
17257
|
-
|
|
17258
|
-
candidate.event_type,
|
|
17259
|
-
),
|
|
17277
|
+
RUN_SCHEDULER_OUTBOX_TERMINAL_EVENT_TYPES.includes(candidate.event_type),
|
|
17260
17278
|
);
|
|
17261
17279
|
const prefixDigest = createHash('sha256')
|
|
17262
17280
|
.update(prefix.map((candidate) => candidate.delivery_key).join('\n'))
|
|
@@ -17269,7 +17287,7 @@ export async function assertPostgresRunLedgerDelivery(
|
|
|
17269
17287
|
});
|
|
17270
17288
|
} else if (
|
|
17271
17289
|
prefix.length === 1 &&
|
|
17272
|
-
|
|
17290
|
+
RUN_SCHEDULER_OUTBOX_START_EVENT_TYPES.includes(first.event_type)
|
|
17273
17291
|
) {
|
|
17274
17292
|
expectedKey = buildRunLedgerStartIdempotencyKey({
|
|
17275
17293
|
runId: input.runId,
|
|
@@ -17292,7 +17310,7 @@ export async function assertPostgresRunLedgerDelivery(
|
|
|
17292
17310
|
// Preserve the old singleton key for non-start, nonterminal facts.
|
|
17293
17311
|
const legacySingletonKey =
|
|
17294
17312
|
prefix.length === 1 &&
|
|
17295
|
-
!
|
|
17313
|
+
!RUN_SCHEDULER_OUTBOX_START_EVENT_TYPES.includes(first.event_type) &&
|
|
17296
17314
|
input.idempotencyKey ===
|
|
17297
17315
|
buildRunLedgerTerminalIdempotencyKey({
|
|
17298
17316
|
runId: input.runId,
|
|
@@ -17343,7 +17361,7 @@ export async function assertPostgresRunLedgerDelivery(
|
|
|
17343
17361
|
|
|
17344
17362
|
if (
|
|
17345
17363
|
prefix.length === 1 &&
|
|
17346
|
-
|
|
17364
|
+
RUN_SCHEDULER_OUTBOX_PREFIX_STOP_EVENT_TYPES.includes(first.event_type)
|
|
17347
17365
|
) {
|
|
17348
17366
|
break;
|
|
17349
17367
|
}
|
|
@@ -17370,7 +17388,7 @@ function runLedgerPositionSql(alias: string): string {
|
|
|
17370
17388
|
}
|
|
17371
17389
|
|
|
17372
17390
|
function runLedgerOrderSql(alias: string): string {
|
|
17373
|
-
return `CASE ${alias}.event_type WHEN
|
|
17391
|
+
return `CASE ${alias}.event_type WHEN ${RUN_EVENT_KIND_SQL_LITERAL.runCreated} THEN 0 WHEN ${RUN_EVENT_KIND_SQL_LITERAL.runStarted} THEN 1 ELSE 2 END, ${alias}.created_at, ${alias}.event_id`;
|
|
17374
17392
|
}
|
|
17375
17393
|
|
|
17376
17394
|
/**
|
|
@@ -17453,7 +17471,7 @@ export async function readPendingPostgresSchedulerOutboxEvents(
|
|
|
17453
17471
|
-- commit to first claim while the projector drained continuously).
|
|
17454
17472
|
ORDER BY
|
|
17455
17473
|
CASE
|
|
17456
|
-
WHEN candidate.event_type =
|
|
17474
|
+
WHEN candidate.event_type = ${RUN_EVENT_KIND_SQL_LITERAL.runCreated} THEN 0
|
|
17457
17475
|
WHEN candidate.event_id LIKE 'run-terminal:%' THEN 1
|
|
17458
17476
|
ELSE 2
|
|
17459
17477
|
END,
|
|
@@ -17471,12 +17489,12 @@ export async function readPendingPostgresSchedulerOutboxEvents(
|
|
|
17471
17489
|
-- Admission is causally first and must be projected alone. A later
|
|
17472
17490
|
-- start/terminal append may not leapfrog a delayed queued row.
|
|
17473
17491
|
AND (
|
|
17474
|
-
head.event_type NOT IN (
|
|
17492
|
+
head.event_type NOT IN (${RUN_EVENT_KIND_SQL_LITERAL.runCreated}, ${RUN_EVENT_KIND_SQL_LITERAL.runStarted}, ${RUN_SCHEDULER_OUTBOX_EVENT_TYPE_SQL_LITERAL.runEvents})
|
|
17475
17493
|
OR outbox.event_id = head.event_id
|
|
17476
17494
|
)
|
|
17477
17495
|
-- An ingress row already contains a producer's bounded batch. Keep
|
|
17478
17496
|
-- its receipt stable independently of the recovery caller's limit.
|
|
17479
|
-
AND (outbox.event_type <>
|
|
17497
|
+
AND (outbox.event_type <> ${RUN_SCHEDULER_OUTBOX_EVENT_TYPE_SQL_LITERAL.runEvents} OR outbox.event_id = head.event_id)
|
|
17480
17498
|
AND coalesce(outbox.next_attempt_at, outbox.created_at) <= now()
|
|
17481
17499
|
AND (
|
|
17482
17500
|
$3::text IS NULL
|
|
@@ -17506,7 +17524,7 @@ export async function readPendingPostgresSchedulerOutboxEvents(
|
|
|
17506
17524
|
: 'true'
|
|
17507
17525
|
}
|
|
17508
17526
|
AND terminal_predecessor.event_type IN (
|
|
17509
|
-
|
|
17527
|
+
${RUN_EVENT_KIND_SQL_LITERAL.runCompleted}, ${RUN_EVENT_KIND_SQL_LITERAL.runFailed}, ${RUN_EVENT_KIND_SQL_LITERAL.runCancelled}
|
|
17510
17528
|
)
|
|
17511
17529
|
AND ${runLedgerPrecedesSql('terminal_predecessor', 'outbox')}
|
|
17512
17530
|
)
|
|
@@ -17519,7 +17537,7 @@ export async function readPendingPostgresSchedulerOutboxEvents(
|
|
|
17519
17537
|
AND predecessor.delivered_at IS NULL
|
|
17520
17538
|
AND ${runLedgerPrecedesSql('predecessor', 'outbox')}
|
|
17521
17539
|
AND (
|
|
17522
|
-
predecessor.event_type =
|
|
17540
|
+
predecessor.event_type = ${RUN_SCHEDULER_OUTBOX_EVENT_TYPE_SQL_LITERAL.runEvents}
|
|
17523
17541
|
OR predecessor.failed_at IS NOT NULL
|
|
17524
17542
|
OR coalesce(predecessor.next_attempt_at, predecessor.created_at) > now()
|
|
17525
17543
|
OR (
|
|
@@ -17538,7 +17556,7 @@ export async function readPendingPostgresSchedulerOutboxEvents(
|
|
|
17538
17556
|
SELECT 1
|
|
17539
17557
|
FROM ${tableName('outbox', options)} AS candidate
|
|
17540
17558
|
JOIN candidates ON candidates.event_id = candidate.event_id
|
|
17541
|
-
WHERE candidate.event_type IN (
|
|
17559
|
+
WHERE candidate.event_type IN (${RUN_EVENT_KIND_SQL_LITERAL.runCompleted}, ${RUN_EVENT_KIND_SQL_LITERAL.runFailed}, ${RUN_EVENT_KIND_SQL_LITERAL.runCancelled})
|
|
17542
17560
|
) AS has_terminal
|
|
17543
17561
|
), claimed AS (
|
|
17544
17562
|
UPDATE ${tableName('outbox', options)} outbox
|
|
@@ -17861,11 +17879,11 @@ export async function purgePostgresSchedulerDeliveredOutboxRetentionBatch(
|
|
|
17861
17879
|
)
|
|
17862
17880
|
UPDATE ${tableName('outbox', options)} AS outbox
|
|
17863
17881
|
SET payload_json = CASE
|
|
17864
|
-
WHEN outbox.event_type =
|
|
17882
|
+
WHEN outbox.event_type = ${RUN_SCHEDULER_OUTBOX_EVENT_TYPE_SQL_LITERAL.runEvents} THEN jsonb_set(
|
|
17865
17883
|
outbox.payload_json,
|
|
17866
17884
|
'{events}',
|
|
17867
17885
|
(SELECT jsonb_agg(
|
|
17868
|
-
CASE WHEN item.value->>'type' =
|
|
17886
|
+
CASE WHEN item.value->>'type' = ${RUN_EVENT_KIND_SQL_LITERAL.logAppended}
|
|
17869
17887
|
THEN item.value - 'lines' - 'lineContexts'
|
|
17870
17888
|
ELSE item.value
|
|
17871
17889
|
END ORDER BY item.ordinality
|
|
@@ -17882,7 +17900,7 @@ export async function purgePostgresSchedulerDeliveredOutboxRetentionBatch(
|
|
|
17882
17900
|
outbox.payload_json - 'terminalLogLines' - 'terminalLogContexts',
|
|
17883
17901
|
'{terminalProgressEvents}',
|
|
17884
17902
|
coalesce((SELECT jsonb_agg(
|
|
17885
|
-
CASE WHEN item.value->>'type' =
|
|
17903
|
+
CASE WHEN item.value->>'type' = ${RUN_EVENT_KIND_SQL_LITERAL.logAppended}
|
|
17886
17904
|
THEN item.value - 'lines' - 'lineContexts'
|
|
17887
17905
|
ELSE item.value
|
|
17888
17906
|
END ORDER BY item.ordinality
|
|
@@ -18237,7 +18255,10 @@ export async function releasePostgresSchedulerOutboxLease(
|
|
|
18237
18255
|
function normalizeOutboxIngressPreview(
|
|
18238
18256
|
event: PlayRunLedgerIngressEvent,
|
|
18239
18257
|
): PlayRunLedgerIngressEvent {
|
|
18240
|
-
if (
|
|
18258
|
+
if (
|
|
18259
|
+
event.type !== RUN_EVENT_KIND.stepProgress &&
|
|
18260
|
+
event.key !== RUN_EVENT_KIND.stepProgress
|
|
18261
|
+
) {
|
|
18241
18262
|
return event;
|
|
18242
18263
|
}
|
|
18243
18264
|
const progress = recordPayload(event.progress);
|
|
@@ -18253,7 +18274,7 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
|
|
|
18253
18274
|
event: PostgresSchedulerOutboxEvent,
|
|
18254
18275
|
): PlayRunLedgerIngressEvent[] {
|
|
18255
18276
|
const occurredAt = event.createdAt.getTime();
|
|
18256
|
-
if (event.eventType ===
|
|
18277
|
+
if (event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runEvents) {
|
|
18257
18278
|
const events = payloadField(event.payload, 'events');
|
|
18258
18279
|
const logsStored =
|
|
18259
18280
|
payloadField(event.payload, 'logBodyStore') === 'planet_scale';
|
|
@@ -18281,10 +18302,10 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
|
|
|
18281
18302
|
normalizeOutboxIngressPreview,
|
|
18282
18303
|
);
|
|
18283
18304
|
}
|
|
18284
|
-
if (event.eventType ===
|
|
18305
|
+
if (event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runStarted) {
|
|
18285
18306
|
return [
|
|
18286
18307
|
{
|
|
18287
|
-
type:
|
|
18308
|
+
type: RUN_EVENT_KIND.runStarted,
|
|
18288
18309
|
runId: event.runId,
|
|
18289
18310
|
occurredAt,
|
|
18290
18311
|
source: 'system',
|
|
@@ -18293,7 +18314,7 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
|
|
|
18293
18314
|
},
|
|
18294
18315
|
];
|
|
18295
18316
|
}
|
|
18296
|
-
if (event.eventType ===
|
|
18317
|
+
if (event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runCompleted) {
|
|
18297
18318
|
const terminalWorkCounterSegment =
|
|
18298
18319
|
normalizePlayRunLedgerTerminalWorkCounterSegment(
|
|
18299
18320
|
payloadField(event.payload, 'terminalWorkCounterSegment'),
|
|
@@ -18312,7 +18333,7 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
|
|
|
18312
18333
|
? []
|
|
18313
18334
|
: [
|
|
18314
18335
|
{
|
|
18315
|
-
type:
|
|
18336
|
+
type: RUN_EVENT_KIND.logAppended,
|
|
18316
18337
|
runId: event.runId,
|
|
18317
18338
|
occurredAt,
|
|
18318
18339
|
source: 'worker',
|
|
@@ -18321,7 +18342,7 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
|
|
|
18321
18342
|
} as PlayRunLedgerEvent,
|
|
18322
18343
|
]),
|
|
18323
18344
|
{
|
|
18324
|
-
type:
|
|
18345
|
+
type: RUN_EVENT_KIND.runCompleted,
|
|
18325
18346
|
runId: event.runId,
|
|
18326
18347
|
occurredAt,
|
|
18327
18348
|
source: 'system',
|
|
@@ -18335,7 +18356,7 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
|
|
|
18335
18356
|
},
|
|
18336
18357
|
];
|
|
18337
18358
|
}
|
|
18338
|
-
if (event.eventType ===
|
|
18359
|
+
if (event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runFailed) {
|
|
18339
18360
|
const terminalWorkCounterSegment =
|
|
18340
18361
|
normalizePlayRunLedgerTerminalWorkCounterSegment(
|
|
18341
18362
|
payloadField(event.payload, 'terminalWorkCounterSegment'),
|
|
@@ -18357,7 +18378,7 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
|
|
|
18357
18378
|
? []
|
|
18358
18379
|
: [
|
|
18359
18380
|
{
|
|
18360
|
-
type:
|
|
18381
|
+
type: RUN_EVENT_KIND.logAppended,
|
|
18361
18382
|
runId: event.runId,
|
|
18362
18383
|
occurredAt,
|
|
18363
18384
|
source: 'worker',
|
|
@@ -18366,7 +18387,7 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
|
|
|
18366
18387
|
} as PlayRunLedgerEvent,
|
|
18367
18388
|
]),
|
|
18368
18389
|
{
|
|
18369
|
-
type:
|
|
18390
|
+
type: RUN_EVENT_KIND.runFailed,
|
|
18370
18391
|
runId: event.runId,
|
|
18371
18392
|
occurredAt,
|
|
18372
18393
|
source: 'system',
|
|
@@ -18379,10 +18400,10 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
|
|
|
18379
18400
|
},
|
|
18380
18401
|
];
|
|
18381
18402
|
}
|
|
18382
|
-
if (event.eventType ===
|
|
18403
|
+
if (event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runCancelled) {
|
|
18383
18404
|
return [
|
|
18384
18405
|
{
|
|
18385
|
-
type:
|
|
18406
|
+
type: RUN_EVENT_KIND.runCancelled,
|
|
18386
18407
|
runId: event.runId,
|
|
18387
18408
|
occurredAt,
|
|
18388
18409
|
source: 'system',
|
|
@@ -18390,7 +18411,10 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
|
|
|
18390
18411
|
} as PlayRunLedgerEvent,
|
|
18391
18412
|
];
|
|
18392
18413
|
}
|
|
18393
|
-
if (
|
|
18414
|
+
if (
|
|
18415
|
+
event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runWaiting ||
|
|
18416
|
+
event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runResumed
|
|
18417
|
+
) {
|
|
18394
18418
|
const waitKind = stringPayloadField(event.payload, 'kind');
|
|
18395
18419
|
// A detached runner is still actively executing in a managed sandbox.
|
|
18396
18420
|
// The scheduler parks its worker claim as an internal transport detail;
|
|
@@ -18404,10 +18428,12 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
|
|
|
18404
18428
|
runId: event.runId,
|
|
18405
18429
|
occurredAt,
|
|
18406
18430
|
source: 'system',
|
|
18407
|
-
...(event.eventType ===
|
|
18431
|
+
...(event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runWaiting &&
|
|
18432
|
+
waitKind !== null
|
|
18408
18433
|
? { waitKind }
|
|
18409
18434
|
: {}),
|
|
18410
|
-
...(event.eventType ===
|
|
18435
|
+
...(event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runWaiting &&
|
|
18436
|
+
waitUntil !== null
|
|
18411
18437
|
? { waitUntil }
|
|
18412
18438
|
: {}),
|
|
18413
18439
|
} as PlayRunLedgerEvent;
|
|
@@ -18426,13 +18452,13 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
|
|
|
18426
18452
|
if (waitKind !== null && !eventKey) return [lifecycle];
|
|
18427
18453
|
const renderedEventKey = eventKey ?? 'event';
|
|
18428
18454
|
const line =
|
|
18429
|
-
event.eventType ===
|
|
18455
|
+
event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runWaiting
|
|
18430
18456
|
? `Waiting for integration_event:${renderedEventKey}.`
|
|
18431
18457
|
: `Resumed integration_event:${renderedEventKey}.`;
|
|
18432
18458
|
return [
|
|
18433
18459
|
lifecycle,
|
|
18434
18460
|
{
|
|
18435
|
-
type:
|
|
18461
|
+
type: RUN_EVENT_KIND.logAppended,
|
|
18436
18462
|
runId: event.runId,
|
|
18437
18463
|
occurredAt,
|
|
18438
18464
|
source: 'system',
|
|
@@ -18440,11 +18466,11 @@ export function buildRunLedgerEventsFromPostgresSchedulerOutbox(
|
|
|
18440
18466
|
} as PlayRunLedgerEvent,
|
|
18441
18467
|
];
|
|
18442
18468
|
}
|
|
18443
|
-
if (event.eventType ===
|
|
18469
|
+
if (event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runWaitTimeout) {
|
|
18444
18470
|
const eventKey = stringPayloadField(event.payload, 'eventKey') ?? 'event';
|
|
18445
18471
|
return [
|
|
18446
18472
|
{
|
|
18447
|
-
type:
|
|
18473
|
+
type: RUN_EVENT_KIND.logAppended,
|
|
18448
18474
|
runId: event.runId,
|
|
18449
18475
|
occurredAt,
|
|
18450
18476
|
source: 'system',
|
|
@@ -18482,15 +18508,15 @@ export type PostgresSchedulerOutboxMaterializationPlan = {
|
|
|
18482
18508
|
failureCode: string | null;
|
|
18483
18509
|
};
|
|
18484
18510
|
|
|
18485
|
-
const RUN_LEDGER_KNOWN_OUTBOX_EVENT_TYPES = new Set([
|
|
18486
|
-
|
|
18487
|
-
|
|
18488
|
-
|
|
18489
|
-
|
|
18490
|
-
|
|
18491
|
-
|
|
18492
|
-
|
|
18493
|
-
|
|
18511
|
+
const RUN_LEDGER_KNOWN_OUTBOX_EVENT_TYPES: ReadonlySet<string> = new Set([
|
|
18512
|
+
RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runEvents,
|
|
18513
|
+
RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runStarted,
|
|
18514
|
+
RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runCompleted,
|
|
18515
|
+
RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runFailed,
|
|
18516
|
+
RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runCancelled,
|
|
18517
|
+
RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runWaiting,
|
|
18518
|
+
RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runResumed,
|
|
18519
|
+
RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runWaitTimeout,
|
|
18494
18520
|
]);
|
|
18495
18521
|
|
|
18496
18522
|
/**
|
|
@@ -18508,7 +18534,8 @@ export function planPostgresSchedulerOutboxMaterialization(
|
|
|
18508
18534
|
const projected = buildRunLedgerEventsFromPostgresSchedulerOutbox(event);
|
|
18509
18535
|
const terminalRef = projected.some(
|
|
18510
18536
|
(candidate) =>
|
|
18511
|
-
(candidate.type ===
|
|
18537
|
+
(candidate.type === RUN_EVENT_KIND.runCompleted ||
|
|
18538
|
+
candidate.type === RUN_EVENT_KIND.runFailed) &&
|
|
18512
18539
|
isLedgerTerminalResultRef(candidate.result),
|
|
18513
18540
|
);
|
|
18514
18541
|
const delivery = terminalRef
|
|
@@ -18967,7 +18994,7 @@ export async function dispatchRunLedgerOutboxToLedgerBatchOnceWithClientScope(
|
|
|
18967
18994
|
input.headPriority === 'oldest_ready'
|
|
18968
18995
|
? ''
|
|
18969
18996
|
: `CASE
|
|
18970
|
-
WHEN head.event_type =
|
|
18997
|
+
WHEN head.event_type = ${RUN_EVENT_KIND_SQL_LITERAL.runCreated} THEN 0
|
|
18971
18998
|
WHEN head.event_id LIKE 'run-terminal:%' THEN 1
|
|
18972
18999
|
ELSE 2
|
|
18973
19000
|
END,`
|
|
@@ -19080,9 +19107,9 @@ export async function dispatchRunLedgerOutboxToLedgerBatchOnceWithClientScope(
|
|
|
19080
19107
|
// A pending start is always claimed alone because later events require its
|
|
19081
19108
|
// snapshot. It cannot share the append endpoint, so retain that mutation
|
|
19082
19109
|
// as its own exact delivery.
|
|
19083
|
-
if (first.eventType ===
|
|
19110
|
+
if (first.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runCreated) {
|
|
19084
19111
|
await projectPostgresSchedulerCreatedEvent(runtimeApi, first);
|
|
19085
|
-
} else if (first.eventType ===
|
|
19112
|
+
} else if (first.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runStarted) {
|
|
19086
19113
|
const leaseOwner = first.leaseOwner;
|
|
19087
19114
|
const launch = leaseOwner
|
|
19088
19115
|
? await withClient((client) =>
|
|
@@ -19106,9 +19133,7 @@ export async function dispatchRunLedgerOutboxToLedgerBatchOnceWithClientScope(
|
|
|
19106
19133
|
const terminal = [...events]
|
|
19107
19134
|
.reverse()
|
|
19108
19135
|
.find((event) =>
|
|
19109
|
-
|
|
19110
|
-
event.eventType,
|
|
19111
|
-
),
|
|
19136
|
+
RUN_SCHEDULER_OUTBOX_TERMINAL_EVENT_TYPES.includes(event.eventType),
|
|
19112
19137
|
);
|
|
19113
19138
|
const batchDeliveryKey = createHash('sha256')
|
|
19114
19139
|
.update(events.map((event) => event.deliveryKey).join('\n'))
|