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.
- package/README.md +14 -6
- package/dist/cli/index.js +1346 -717
- package/dist/cli/index.mjs +1342 -713
- package/dist/index.d.mts +199 -23
- package/dist/index.d.ts +199 -23
- package/dist/index.js +221 -14
- package/dist/index.mjs +221 -14
- package/dist/repo/apps/play-runner-workers/src/coordinator-entry.ts +214 -77
- package/dist/repo/apps/play-runner-workers/src/dedup-do.ts +85 -60
- package/dist/repo/apps/play-runner-workers/src/entry.ts +385 -66
- package/dist/repo/sdk/src/client.ts +237 -0
- package/dist/repo/sdk/src/config.ts +125 -8
- package/dist/repo/sdk/src/http.ts +29 -5
- package/dist/repo/sdk/src/play.ts +19 -36
- package/dist/repo/sdk/src/plays/bundle-play-file.ts +22 -8
- package/dist/repo/sdk/src/plays/local-file-discovery.ts +207 -160
- package/dist/repo/sdk/src/types.ts +25 -0
- package/dist/repo/sdk/src/version.ts +2 -2
- package/dist/repo/shared_libs/play-runtime/tool-result.ts +237 -145
- package/dist/repo/shared_libs/plays/bundling/index.ts +206 -229
- package/dist/repo/shared_libs/plays/dataset.ts +28 -0
- package/dist/repo/shared_libs/plays/row-identity.ts +59 -4
- package/package.json +5 -4
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/index.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/repo/apps/play-runner-workers/src/runtime/README.md +0 -21
- package/dist/repo/apps/play-runner-workers/src/runtime/batching.ts +0 -177
- package/dist/repo/apps/play-runner-workers/src/runtime/execution-plan.ts +0 -52
- package/dist/repo/apps/play-runner-workers/src/runtime/tool-batch.ts +0 -100
- package/dist/repo/sdk/src/cli/commands/auth.ts +0 -500
- package/dist/repo/sdk/src/cli/commands/billing.ts +0 -188
- package/dist/repo/sdk/src/cli/commands/csv.ts +0 -123
- package/dist/repo/sdk/src/cli/commands/db.ts +0 -119
- package/dist/repo/sdk/src/cli/commands/feedback.ts +0 -40
- package/dist/repo/sdk/src/cli/commands/org.ts +0 -117
- package/dist/repo/sdk/src/cli/commands/play.ts +0 -3441
- package/dist/repo/sdk/src/cli/commands/tools.ts +0 -687
- package/dist/repo/sdk/src/cli/dataset-stats.ts +0 -415
- package/dist/repo/sdk/src/cli/index.ts +0 -148
- package/dist/repo/sdk/src/cli/progress.ts +0 -149
- package/dist/repo/sdk/src/cli/skills-sync.ts +0 -141
- package/dist/repo/sdk/src/cli/trace.ts +0 -61
- package/dist/repo/sdk/src/cli/utils.ts +0 -145
- package/dist/repo/sdk/src/compat.ts +0 -77
- package/dist/repo/shared_libs/observability/node-tracing.ts +0 -129
- package/dist/repo/shared_libs/observability/tracing.ts +0 -98
- package/dist/repo/shared_libs/play-runtime/context.ts +0 -4242
- package/dist/repo/shared_libs/play-runtime/ctx-contract.ts +0 -250
- package/dist/repo/shared_libs/play-runtime/ctx-types.ts +0 -725
- package/dist/repo/shared_libs/play-runtime/dataset-id.ts +0 -10
- package/dist/repo/shared_libs/play-runtime/db-session-crypto.ts +0 -304
- package/dist/repo/shared_libs/play-runtime/db-session.ts +0 -462
- package/dist/repo/shared_libs/play-runtime/live-events.ts +0 -214
- package/dist/repo/shared_libs/play-runtime/live-state-contract.ts +0 -50
- package/dist/repo/shared_libs/play-runtime/map-execution-frame.ts +0 -114
- package/dist/repo/shared_libs/play-runtime/map-row-identity.ts +0 -158
- package/dist/repo/shared_libs/play-runtime/progress-emitter.ts +0 -172
- package/dist/repo/shared_libs/play-runtime/protocol.ts +0 -121
- package/dist/repo/shared_libs/play-runtime/public-play-contract.ts +0 -42
- package/dist/repo/shared_libs/play-runtime/result-normalization.ts +0 -33
- package/dist/repo/shared_libs/play-runtime/runtime-api.ts +0 -1873
- package/dist/repo/shared_libs/play-runtime/runtime-constraints.ts +0 -2
- package/dist/repo/shared_libs/play-runtime/runtime-pg-driver-neon-serverless.ts +0 -201
- package/dist/repo/shared_libs/play-runtime/runtime-pg-driver-pg.ts +0 -48
- package/dist/repo/shared_libs/play-runtime/runtime-pg-driver.ts +0 -84
- package/dist/repo/shared_libs/play-runtime/static-pipeline-types.ts +0 -147
- package/dist/repo/shared_libs/play-runtime/suspension.ts +0 -68
- package/dist/repo/shared_libs/play-runtime/tracing.ts +0 -31
- package/dist/repo/shared_libs/play-runtime/waterfall-replay.ts +0 -75
- package/dist/repo/shared_libs/play-runtime/worker-api-types.ts +0 -140
- package/dist/repo/shared_libs/plays/artifact-transport.ts +0 -14
- package/dist/repo/shared_libs/plays/artifact-types.ts +0 -49
- package/dist/repo/shared_libs/plays/compiler-manifest.ts +0 -186
- package/dist/repo/shared_libs/plays/definition.ts +0 -264
- package/dist/repo/shared_libs/plays/file-refs.ts +0 -11
- package/dist/repo/shared_libs/plays/rate-limit-scheduler.ts +0 -206
- package/dist/repo/shared_libs/plays/resolve-static-pipeline.ts +0 -164
- package/dist/repo/shared_libs/plays/runtime-validation.ts +0 -395
- package/dist/repo/shared_libs/temporal/constants.ts +0 -39
- 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('{}', {
|
|
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('{}', {
|
|
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({
|
|
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
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
473
|
-
|
|
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
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
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(
|
|
540
|
-
|
|
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
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
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
|
-
|
|
581
|
-
|
|
582
|
-
|
|
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 =
|
|
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
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
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(
|
|
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
|
|
662
|
-
|
|
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('{}', {
|
|
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(
|
|
728
|
+
entries: [...entries.values()].sort(
|
|
729
|
+
(left, right) => left.ts - right.ts,
|
|
730
|
+
),
|
|
706
731
|
}),
|
|
707
732
|
{ headers: { 'content-type': 'application/json' } },
|
|
708
733
|
);
|