deepline 0.3.271 → 0.3.272

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/dist/bundling-sources/sdk/src/release.ts +1 -1
  2. package/dist/bundling-sources/shared_libs/play-runtime/activity-observation.ts +3 -2
  3. package/dist/bundling-sources/shared_libs/play-runtime/app-runtime-api.ts +11 -9
  4. package/dist/bundling-sources/shared_libs/play-runtime/context.ts +5 -4
  5. package/dist/bundling-sources/shared_libs/play-runtime/ctx-types.ts +2 -1
  6. package/dist/bundling-sources/shared_libs/play-runtime/run-event-catalog.ts +610 -0
  7. package/dist/bundling-sources/shared_libs/play-runtime/run-ledger-event-transport.ts +3 -1
  8. package/dist/bundling-sources/shared_libs/play-runtime/run-ledger-projection-diagnostics.ts +3 -2
  9. package/dist/bundling-sources/shared_libs/play-runtime/run-ledger.ts +80 -67
  10. package/dist/bundling-sources/shared_libs/play-runtime/runner-app/index.ts +5 -4
  11. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/absurd-shared.ts +3 -2
  12. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres-progress.ts +19 -9
  13. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/postgres.ts +103 -78
  14. package/dist/bundling-sources/shared_libs/play-runtime/scheduler-backends/runtime-event-search.ts +125 -81
  15. package/dist/cli/index.js +429 -3
  16. package/dist/cli/index.mjs +429 -3
  17. package/dist/index.js +420 -1
  18. package/dist/index.mjs +420 -1
  19. package/dist/install-integrity.json +1 -0
  20. package/dist/release.d.mts +1 -1
  21. package/dist/release.d.ts +1 -1
  22. package/dist/release.js +1 -1
  23. package/dist/release.mjs +1 -1
  24. 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 = 'run.events'
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 == "log.appended" && (exists(@.lines) || exists(@.lineContexts)))'::jsonpath)
934
- OR (event_type IN ('run.completed', 'run.failed')
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 == "log.appended" && (exists(@.lines) || exists(@.lineContexts)))'::jsonpath)))
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 ('run.completed', 'run.failed', 'run.cancelled') THEN
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 = 'run.created' THEN 0 ELSE 1 END),
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 'run.created' THEN 0 WHEN 'run.started' THEN 1 ELSE 2 END),
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 'run.created' THEN 0 WHEN 'run.started' THEN 1 ELSE 2 END),
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 = 'run.created' THEN 0 ELSE 1 END),
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
- 'run.created',
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
- 'run.created',
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, 'run.waiting', jsonb_build_object('kind', 'detached_runner'),
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
- 'run.waiting',
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
- 'run.resumed',
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
- 'run.resumed',
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
- 'run.resumed',
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
- 'run.failed',
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
- 'run.resumed',
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
- 'run.resumed',
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
- 'run.completed',
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
- 'run.completed',
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
- 'run.failed',
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
- 'run.cancelled',
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
- { ...input, eventId, eventType: 'run.events', payload },
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: 'run.started',
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: 'run.events' | 'run.started';
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 (prefix.length > 0 && row.event_type === 'run.events') break;
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
- ['run.completed', 'run.failed', 'run.cancelled'].includes(
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
- ['run.created', 'run.started'].includes(first.event_type)
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
- !['run.created', 'run.started'].includes(first.event_type) &&
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
- ['run.created', 'run.started', 'run.events'].includes(first.event_type)
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 'run.created' THEN 0 WHEN 'run.started' THEN 1 ELSE 2 END, ${alias}.created_at, ${alias}.event_id`;
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 = 'run.created' THEN 0
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 ('run.created', 'run.started', 'run.events')
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 <> 'run.events' OR outbox.event_id = head.event_id)
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
- 'run.completed', 'run.failed', 'run.cancelled'
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 = 'run.events'
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 ('run.completed', 'run.failed', 'run.cancelled')
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 = 'run.events' THEN jsonb_set(
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' = 'log.appended'
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' = 'log.appended'
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 (event.type !== 'step.progress' && event.key !== 'step.progress') {
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 === 'run.events') {
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 === 'run.started') {
18305
+ if (event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runStarted) {
18285
18306
  return [
18286
18307
  {
18287
- type: 'run.started',
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 === 'run.completed') {
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: 'log.appended',
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: 'run.completed',
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 === 'run.failed') {
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: 'log.appended',
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: 'run.failed',
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 === 'run.cancelled') {
18403
+ if (event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runCancelled) {
18383
18404
  return [
18384
18405
  {
18385
- type: 'run.cancelled',
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 (event.eventType === 'run.waiting' || event.eventType === 'run.resumed') {
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 === 'run.waiting' && waitKind !== null
18431
+ ...(event.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runWaiting &&
18432
+ waitKind !== null
18408
18433
  ? { waitKind }
18409
18434
  : {}),
18410
- ...(event.eventType === 'run.waiting' && waitUntil !== null
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 === 'run.waiting'
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: 'log.appended',
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 === 'run.wait_timeout') {
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: 'log.appended',
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
- 'run.events',
18487
- 'run.started',
18488
- 'run.completed',
18489
- 'run.failed',
18490
- 'run.cancelled',
18491
- 'run.waiting',
18492
- 'run.resumed',
18493
- 'run.wait_timeout',
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 === 'run.completed' || candidate.type === 'run.failed') &&
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 = 'run.created' THEN 0
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 === 'run.created') {
19110
+ if (first.eventType === RUN_SCHEDULER_OUTBOX_EVENT_TYPE.runCreated) {
19084
19111
  await projectPostgresSchedulerCreatedEvent(runtimeApi, first);
19085
- } else if (first.eventType === 'run.started') {
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
- ['run.completed', 'run.failed', 'run.cancelled'].includes(
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'))