deepline 0.1.12 → 0.1.20

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 (82) hide show
  1. package/README.md +14 -6
  2. package/dist/cli/index.js +1346 -717
  3. package/dist/cli/index.mjs +1342 -713
  4. package/dist/index.d.mts +199 -23
  5. package/dist/index.d.ts +199 -23
  6. package/dist/index.js +221 -14
  7. package/dist/index.mjs +221 -14
  8. package/dist/repo/apps/play-runner-workers/src/coordinator-entry.ts +214 -77
  9. package/dist/repo/apps/play-runner-workers/src/dedup-do.ts +85 -60
  10. package/dist/repo/apps/play-runner-workers/src/entry.ts +385 -66
  11. package/dist/repo/sdk/src/client.ts +237 -0
  12. package/dist/repo/sdk/src/config.ts +125 -8
  13. package/dist/repo/sdk/src/http.ts +29 -5
  14. package/dist/repo/sdk/src/play.ts +19 -36
  15. package/dist/repo/sdk/src/plays/bundle-play-file.ts +22 -8
  16. package/dist/repo/sdk/src/plays/local-file-discovery.ts +207 -160
  17. package/dist/repo/sdk/src/types.ts +25 -0
  18. package/dist/repo/sdk/src/version.ts +2 -2
  19. package/dist/repo/shared_libs/play-runtime/tool-result.ts +237 -145
  20. package/dist/repo/shared_libs/plays/bundling/index.ts +206 -229
  21. package/dist/repo/shared_libs/plays/dataset.ts +28 -0
  22. package/dist/repo/shared_libs/plays/row-identity.ts +59 -4
  23. package/package.json +5 -4
  24. package/dist/cli/index.js.map +0 -1
  25. package/dist/cli/index.mjs.map +0 -1
  26. package/dist/index.js.map +0 -1
  27. package/dist/index.mjs.map +0 -1
  28. package/dist/repo/apps/play-runner-workers/src/runtime/README.md +0 -21
  29. package/dist/repo/apps/play-runner-workers/src/runtime/batching.ts +0 -177
  30. package/dist/repo/apps/play-runner-workers/src/runtime/execution-plan.ts +0 -52
  31. package/dist/repo/apps/play-runner-workers/src/runtime/tool-batch.ts +0 -100
  32. package/dist/repo/sdk/src/cli/commands/auth.ts +0 -500
  33. package/dist/repo/sdk/src/cli/commands/billing.ts +0 -188
  34. package/dist/repo/sdk/src/cli/commands/csv.ts +0 -123
  35. package/dist/repo/sdk/src/cli/commands/db.ts +0 -119
  36. package/dist/repo/sdk/src/cli/commands/feedback.ts +0 -40
  37. package/dist/repo/sdk/src/cli/commands/org.ts +0 -117
  38. package/dist/repo/sdk/src/cli/commands/play.ts +0 -3441
  39. package/dist/repo/sdk/src/cli/commands/tools.ts +0 -687
  40. package/dist/repo/sdk/src/cli/dataset-stats.ts +0 -415
  41. package/dist/repo/sdk/src/cli/index.ts +0 -148
  42. package/dist/repo/sdk/src/cli/progress.ts +0 -149
  43. package/dist/repo/sdk/src/cli/skills-sync.ts +0 -141
  44. package/dist/repo/sdk/src/cli/trace.ts +0 -61
  45. package/dist/repo/sdk/src/cli/utils.ts +0 -145
  46. package/dist/repo/sdk/src/compat.ts +0 -77
  47. package/dist/repo/shared_libs/observability/node-tracing.ts +0 -129
  48. package/dist/repo/shared_libs/observability/tracing.ts +0 -98
  49. package/dist/repo/shared_libs/play-runtime/context.ts +0 -4242
  50. package/dist/repo/shared_libs/play-runtime/ctx-contract.ts +0 -250
  51. package/dist/repo/shared_libs/play-runtime/ctx-types.ts +0 -725
  52. package/dist/repo/shared_libs/play-runtime/dataset-id.ts +0 -10
  53. package/dist/repo/shared_libs/play-runtime/db-session-crypto.ts +0 -304
  54. package/dist/repo/shared_libs/play-runtime/db-session.ts +0 -462
  55. package/dist/repo/shared_libs/play-runtime/live-events.ts +0 -214
  56. package/dist/repo/shared_libs/play-runtime/live-state-contract.ts +0 -50
  57. package/dist/repo/shared_libs/play-runtime/map-execution-frame.ts +0 -114
  58. package/dist/repo/shared_libs/play-runtime/map-row-identity.ts +0 -158
  59. package/dist/repo/shared_libs/play-runtime/progress-emitter.ts +0 -172
  60. package/dist/repo/shared_libs/play-runtime/protocol.ts +0 -121
  61. package/dist/repo/shared_libs/play-runtime/public-play-contract.ts +0 -42
  62. package/dist/repo/shared_libs/play-runtime/result-normalization.ts +0 -33
  63. package/dist/repo/shared_libs/play-runtime/runtime-api.ts +0 -1873
  64. package/dist/repo/shared_libs/play-runtime/runtime-constraints.ts +0 -2
  65. package/dist/repo/shared_libs/play-runtime/runtime-pg-driver-neon-serverless.ts +0 -201
  66. package/dist/repo/shared_libs/play-runtime/runtime-pg-driver-pg.ts +0 -48
  67. package/dist/repo/shared_libs/play-runtime/runtime-pg-driver.ts +0 -84
  68. package/dist/repo/shared_libs/play-runtime/static-pipeline-types.ts +0 -147
  69. package/dist/repo/shared_libs/play-runtime/suspension.ts +0 -68
  70. package/dist/repo/shared_libs/play-runtime/tracing.ts +0 -31
  71. package/dist/repo/shared_libs/play-runtime/waterfall-replay.ts +0 -75
  72. package/dist/repo/shared_libs/play-runtime/worker-api-types.ts +0 -140
  73. package/dist/repo/shared_libs/plays/artifact-transport.ts +0 -14
  74. package/dist/repo/shared_libs/plays/artifact-types.ts +0 -49
  75. package/dist/repo/shared_libs/plays/compiler-manifest.ts +0 -186
  76. package/dist/repo/shared_libs/plays/definition.ts +0 -264
  77. package/dist/repo/shared_libs/plays/file-refs.ts +0 -11
  78. package/dist/repo/shared_libs/plays/rate-limit-scheduler.ts +0 -206
  79. package/dist/repo/shared_libs/plays/resolve-static-pipeline.ts +0 -164
  80. package/dist/repo/shared_libs/plays/runtime-validation.ts +0 -395
  81. package/dist/repo/shared_libs/temporal/constants.ts +0 -39
  82. package/dist/repo/shared_libs/temporal/preview-config.ts +0 -153
@@ -87,6 +87,7 @@ const COORDINATOR_TRACE_MAX_ENTRIES = 200;
87
87
  const FINISH_ALARM_DELAY_MS = 60_000; // self-evict 1 min after finish() called
88
88
  const WORKFLOW_POOL_DEFAULT_TTL_MS = 8 * 60 * 1000;
89
89
  const WORKFLOW_POOL_RUN_MAPPING_TTL_MS = 60 * 60 * 1000;
90
+ const WORKFLOW_POOL_READY_MAX_AGE_MS = 20_000;
90
91
 
91
92
  interface DedupEnv {
92
93
  PLAY_DEDUP: DurableObjectNamespace;
@@ -248,7 +249,9 @@ export class PlayDedup implements DurableObject {
248
249
  }
249
250
  }
250
251
 
251
- return new Response('{}', { headers: { 'content-type': 'application/json' } });
252
+ return new Response('{}', {
253
+ headers: { 'content-type': 'application/json' },
254
+ });
252
255
  }
253
256
 
254
257
  private async handleAwait(req: Request): Promise<Response> {
@@ -313,7 +316,9 @@ export class PlayDedup implements DurableObject {
313
316
  // Schedule alarm to evict after a grace period (any straggler awaits
314
317
  // get a chance to resolve). Grace = 60s.
315
318
  await this.state.storage.setAlarm(Date.now() + FINISH_ALARM_DELAY_MS);
316
- return new Response('{}', { headers: { 'content-type': 'application/json' } });
319
+ return new Response('{}', {
320
+ headers: { 'content-type': 'application/json' },
321
+ });
317
322
  }
318
323
 
319
324
  private async handleDebug(_req: Request): Promise<Response> {
@@ -321,7 +326,11 @@ export class PlayDedup implements DurableObject {
321
326
  const dump: Record<string, DedupEntry> = {};
322
327
  for (const [k, v] of all) dump[k] = v as DedupEntry;
323
328
  return new Response(
324
- JSON.stringify({ size: all.size, entries: dump, waiters: this.waiters.size }),
329
+ JSON.stringify({
330
+ size: all.size,
331
+ entries: dump,
332
+ waiters: this.waiters.size,
333
+ }),
325
334
  { headers: { 'content-type': 'application/json' } },
326
335
  );
327
336
  }
@@ -339,7 +348,8 @@ export class PlayDedup implements DurableObject {
339
348
  value.entry !== undefined &&
340
349
  value.entry.version === version &&
341
350
  value.entry.expiresAt > now &&
342
- value.entry.readyAt !== null
351
+ value.entry.readyAt !== null &&
352
+ now - value.entry.readyAt <= WORKFLOW_POOL_READY_MAX_AGE_MS
343
353
  );
344
354
  }
345
355
 
@@ -360,6 +370,8 @@ export class PlayDedup implements DurableObject {
360
370
  if (
361
371
  !entry ||
362
372
  entry.expiresAt <= now ||
373
+ (entry.readyAt !== null &&
374
+ now - entry.readyAt > WORKFLOW_POOL_READY_MAX_AGE_MS) ||
363
375
  (version && entry.version !== version)
364
376
  ) {
365
377
  expiredKeys.push(key);
@@ -380,16 +392,15 @@ export class PlayDedup implements DurableObject {
380
392
  }
381
393
 
382
394
  private async handlePoolAdd(req: Request): Promise<Response> {
383
- const body = (await req.json().catch(() => null)) as
384
- | {
385
- ids?: unknown;
386
- ttlMs?: unknown;
387
- version?: unknown;
388
- readyAt?: unknown;
389
- ready?: unknown;
390
- }
391
- | null;
392
- const version = typeof body?.version === 'string' ? body.version.trim() : '';
395
+ const body = (await req.json().catch(() => null)) as {
396
+ ids?: unknown;
397
+ ttlMs?: unknown;
398
+ version?: unknown;
399
+ readyAt?: unknown;
400
+ ready?: unknown;
401
+ } | null;
402
+ const version =
403
+ typeof body?.version === 'string' ? body.version.trim() : '';
393
404
  if (!version) {
394
405
  return new Response('version is required', { status: 400 });
395
406
  }
@@ -445,7 +456,9 @@ export class PlayDedup implements DurableObject {
445
456
  const sorted = [...entries.entries()]
446
457
  .map(([key, entry]) => ({ key, entry }))
447
458
  .filter((entry) => this.isReadyWorkflowPoolEntry(entry, version, now))
448
- .sort((a, b) => a.entry.readyAt - b.entry.readyAt);
459
+ // Lease the freshest ready instance. Older waiting Workflows are more
460
+ // likely to be hibernated, so "pooled" otherwise still pays a wake tax.
461
+ .sort((a, b) => b.entry.readyAt - a.entry.readyAt);
449
462
  const selected = sorted[0];
450
463
  if (!selected) return;
451
464
  leasedId = selected.entry.id;
@@ -461,7 +474,8 @@ export class PlayDedup implements DurableObject {
461
474
  if (!version) {
462
475
  return new Response('version is required', { status: 400 });
463
476
  }
464
- await this.gcWorkflowPool(Date.now(), version);
477
+ const now = Date.now();
478
+ await this.gcWorkflowPool(now, version);
465
479
  const entries = await this.state.storage.list<WorkflowPoolEntry>({
466
480
  prefix: WORKFLOW_POOL_KEY_PREFIX,
467
481
  });
@@ -469,8 +483,14 @@ export class PlayDedup implements DurableObject {
469
483
  let warming = 0;
470
484
  for (const entry of entries.values()) {
471
485
  if (entry.version !== version) continue;
472
- if (entry.readyAt === null) warming += 1;
473
- else available += 1;
486
+ if (
487
+ entry.readyAt === null ||
488
+ now - entry.readyAt > WORKFLOW_POOL_READY_MAX_AGE_MS
489
+ ) {
490
+ warming += 1;
491
+ } else {
492
+ available += 1;
493
+ }
474
494
  }
475
495
  return new Response(JSON.stringify({ available, warming }), {
476
496
  headers: { 'content-type': 'application/json' },
@@ -502,13 +522,12 @@ export class PlayDedup implements DurableObject {
502
522
  }
503
523
 
504
524
  private async handlePoolPromote(req: Request): Promise<Response> {
505
- const body = (await req.json().catch(() => null)) as
506
- | {
507
- ids?: unknown;
508
- version?: unknown;
509
- }
510
- | null;
511
- const version = typeof body?.version === 'string' ? body.version.trim() : '';
525
+ const body = (await req.json().catch(() => null)) as {
526
+ ids?: unknown;
527
+ version?: unknown;
528
+ } | null;
529
+ const version =
530
+ typeof body?.version === 'string' ? body.version.trim() : '';
512
531
  if (!version) {
513
532
  return new Response('version is required', { status: 400 });
514
533
  }
@@ -536,19 +555,21 @@ export class PlayDedup implements DurableObject {
536
555
  await this.state.storage.put(writes);
537
556
  }
538
557
  });
539
- return new Response(JSON.stringify({ promoted: Object.keys(writes).length }), {
540
- headers: { 'content-type': 'application/json' },
541
- });
558
+ return new Response(
559
+ JSON.stringify({ promoted: Object.keys(writes).length }),
560
+ {
561
+ headers: { 'content-type': 'application/json' },
562
+ },
563
+ );
542
564
  }
543
565
 
544
566
  private async handlePoolDelete(req: Request): Promise<Response> {
545
- const body = (await req.json().catch(() => null)) as
546
- | {
547
- ids?: unknown;
548
- version?: unknown;
549
- }
550
- | null;
551
- const version = typeof body?.version === 'string' ? body.version.trim() : '';
567
+ const body = (await req.json().catch(() => null)) as {
568
+ ids?: unknown;
569
+ version?: unknown;
570
+ } | null;
571
+ const version =
572
+ typeof body?.version === 'string' ? body.version.trim() : '';
552
573
  if (!version) {
553
574
  return new Response('version is required', { status: 400 });
554
575
  }
@@ -575,34 +596,32 @@ export class PlayDedup implements DurableObject {
575
596
  }
576
597
 
577
598
  private async handlePoolMapRun(req: Request): Promise<Response> {
578
- const body = (await req.json().catch(() => null)) as
579
- | {
580
- runId?: unknown;
581
- instanceId?: unknown;
582
- version?: unknown;
583
- }
584
- | null;
599
+ const body = (await req.json().catch(() => null)) as {
600
+ runId?: unknown;
601
+ instanceId?: unknown;
602
+ version?: unknown;
603
+ } | null;
585
604
  const runId = typeof body?.runId === 'string' ? body.runId : '';
586
605
  const instanceId =
587
606
  typeof body?.instanceId === 'string' ? body.instanceId : '';
588
- const version = typeof body?.version === 'string' ? body.version.trim() : '';
607
+ const version =
608
+ typeof body?.version === 'string' ? body.version.trim() : '';
589
609
  if (!runId || !instanceId || !version) {
590
610
  return new Response('runId, instanceId, and version are required', {
591
611
  status: 400,
592
612
  });
593
613
  }
594
614
  const now = Date.now();
595
- await this.state.storage.put(
596
- `${WORKFLOW_POOL_RUN_KEY_PREFIX}${runId}`,
597
- {
598
- runId,
599
- instanceId,
600
- version,
601
- createdAt: now,
602
- expiresAt: now + WORKFLOW_POOL_RUN_MAPPING_TTL_MS,
603
- } satisfies WorkflowRunMapping,
604
- );
605
- return new Response('{}', { headers: { 'content-type': 'application/json' } });
615
+ await this.state.storage.put(`${WORKFLOW_POOL_RUN_KEY_PREFIX}${runId}`, {
616
+ runId,
617
+ instanceId,
618
+ version,
619
+ createdAt: now,
620
+ expiresAt: now + WORKFLOW_POOL_RUN_MAPPING_TTL_MS,
621
+ } satisfies WorkflowRunMapping);
622
+ return new Response('{}', {
623
+ headers: { 'content-type': 'application/json' },
624
+ });
606
625
  }
607
626
 
608
627
  private async handlePoolResolveRun(req: Request): Promise<Response> {
@@ -620,7 +639,9 @@ export class PlayDedup implements DurableObject {
620
639
  `${WORKFLOW_POOL_RUN_KEY_PREFIX}${runId}`,
621
640
  );
622
641
  if (mapping && mapping.version !== version) {
623
- await this.state.storage.delete(`${WORKFLOW_POOL_RUN_KEY_PREFIX}${runId}`);
642
+ await this.state.storage.delete(
643
+ `${WORKFLOW_POOL_RUN_KEY_PREFIX}${runId}`,
644
+ );
624
645
  return new Response(JSON.stringify({ instanceId: null }), {
625
646
  headers: { 'content-type': 'application/json' },
626
647
  });
@@ -658,9 +679,9 @@ export class PlayDedup implements DurableObject {
658
679
  }
659
680
 
660
681
  private async handleTraceAdd(req: Request): Promise<Response> {
661
- const body = (await req.json().catch(() => null)) as
662
- | Partial<CoordinatorTraceEntry>
663
- | null;
682
+ const body = (await req
683
+ .json()
684
+ .catch(() => null)) as Partial<CoordinatorTraceEntry> | null;
664
685
  if (
665
686
  !body ||
666
687
  (body.source !== 'coordinator' && body.source !== 'dynamic_worker') ||
@@ -693,7 +714,9 @@ export class PlayDedup implements DurableObject {
693
714
  await this.state.storage.delete([...entries.keys()].slice(0, overflow));
694
715
  }
695
716
  });
696
- return new Response('{}', { headers: { 'content-type': 'application/json' } });
717
+ return new Response('{}', {
718
+ headers: { 'content-type': 'application/json' },
719
+ });
697
720
  }
698
721
 
699
722
  private async handleTraceList(): Promise<Response> {
@@ -702,7 +725,9 @@ export class PlayDedup implements DurableObject {
702
725
  });
703
726
  return new Response(
704
727
  JSON.stringify({
705
- entries: [...entries.values()].sort((left, right) => left.ts - right.ts),
728
+ entries: [...entries.values()].sort(
729
+ (left, right) => left.ts - right.ts,
730
+ ),
706
731
  }),
707
732
  { headers: { 'content-type': 'application/json' } },
708
733
  );