@polpo-ai/drizzle 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/stores-pg.test.js +13 -0
- package/dist/__tests__/stores-pg.test.js.map +1 -1
- package/dist/__tests__/stores.test.js +88 -0
- package/dist/__tests__/stores.test.js.map +1 -1
- package/dist/backfill.d.ts +3 -0
- package/dist/backfill.d.ts.map +1 -0
- package/dist/backfill.js +35 -0
- package/dist/backfill.js.map +1 -0
- package/dist/index.d.ts +361 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +12 -0
- package/dist/migrate.js.map +1 -1
- package/dist/schema/runs.d.ts +360 -0
- package/dist/schema/runs.d.ts.map +1 -1
- package/dist/schema/runs.js +32 -0
- package/dist/schema/runs.js.map +1 -1
- package/dist/stores/loop-run-store.d.ts +32 -1
- package/dist/stores/loop-run-store.d.ts.map +1 -1
- package/dist/stores/loop-run-store.js +83 -6
- package/dist/stores/loop-run-store.js.map +1 -1
- package/dist/stores/run-store.d.ts.map +1 -1
- package/dist/stores/run-store.js +8 -4
- package/dist/stores/run-store.js.map +1 -1
- package/package.json +3 -3
package/dist/schema/runs.d.ts
CHANGED
|
@@ -323,6 +323,196 @@ export declare const runsSqlite: import("drizzle-orm/sqlite-core").SQLiteTableWi
|
|
|
323
323
|
}, {}, {
|
|
324
324
|
length: number | undefined;
|
|
325
325
|
}>;
|
|
326
|
+
loopName: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
327
|
+
name: "loop_name";
|
|
328
|
+
tableName: "runs";
|
|
329
|
+
dataType: "string";
|
|
330
|
+
columnType: "SQLiteText";
|
|
331
|
+
data: string;
|
|
332
|
+
driverParam: string;
|
|
333
|
+
notNull: false;
|
|
334
|
+
hasDefault: false;
|
|
335
|
+
isPrimaryKey: false;
|
|
336
|
+
isAutoincrement: false;
|
|
337
|
+
hasRuntimeDefault: false;
|
|
338
|
+
enumValues: [string, ...string[]];
|
|
339
|
+
baseColumn: never;
|
|
340
|
+
identity: undefined;
|
|
341
|
+
generated: undefined;
|
|
342
|
+
}, {}, {
|
|
343
|
+
length: number | undefined;
|
|
344
|
+
}>;
|
|
345
|
+
context: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
346
|
+
name: "context";
|
|
347
|
+
tableName: "runs";
|
|
348
|
+
dataType: "string";
|
|
349
|
+
columnType: "SQLiteText";
|
|
350
|
+
data: string;
|
|
351
|
+
driverParam: string;
|
|
352
|
+
notNull: false;
|
|
353
|
+
hasDefault: false;
|
|
354
|
+
isPrimaryKey: false;
|
|
355
|
+
isAutoincrement: false;
|
|
356
|
+
hasRuntimeDefault: false;
|
|
357
|
+
enumValues: [string, ...string[]];
|
|
358
|
+
baseColumn: never;
|
|
359
|
+
identity: undefined;
|
|
360
|
+
generated: undefined;
|
|
361
|
+
}, {}, {
|
|
362
|
+
length: number | undefined;
|
|
363
|
+
}>;
|
|
364
|
+
trace: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
365
|
+
name: "trace";
|
|
366
|
+
tableName: "runs";
|
|
367
|
+
dataType: "string";
|
|
368
|
+
columnType: "SQLiteText";
|
|
369
|
+
data: string;
|
|
370
|
+
driverParam: string;
|
|
371
|
+
notNull: false;
|
|
372
|
+
hasDefault: false;
|
|
373
|
+
isPrimaryKey: false;
|
|
374
|
+
isAutoincrement: false;
|
|
375
|
+
hasRuntimeDefault: false;
|
|
376
|
+
enumValues: [string, ...string[]];
|
|
377
|
+
baseColumn: never;
|
|
378
|
+
identity: undefined;
|
|
379
|
+
generated: undefined;
|
|
380
|
+
}, {}, {
|
|
381
|
+
length: number | undefined;
|
|
382
|
+
}>;
|
|
383
|
+
error: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
384
|
+
name: "error";
|
|
385
|
+
tableName: "runs";
|
|
386
|
+
dataType: "string";
|
|
387
|
+
columnType: "SQLiteText";
|
|
388
|
+
data: string;
|
|
389
|
+
driverParam: string;
|
|
390
|
+
notNull: false;
|
|
391
|
+
hasDefault: false;
|
|
392
|
+
isPrimaryKey: false;
|
|
393
|
+
isAutoincrement: false;
|
|
394
|
+
hasRuntimeDefault: false;
|
|
395
|
+
enumValues: [string, ...string[]];
|
|
396
|
+
baseColumn: never;
|
|
397
|
+
identity: undefined;
|
|
398
|
+
generated: undefined;
|
|
399
|
+
}, {}, {
|
|
400
|
+
length: number | undefined;
|
|
401
|
+
}>;
|
|
402
|
+
approvalRequestId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
403
|
+
name: "approval_request_id";
|
|
404
|
+
tableName: "runs";
|
|
405
|
+
dataType: "string";
|
|
406
|
+
columnType: "SQLiteText";
|
|
407
|
+
data: string;
|
|
408
|
+
driverParam: string;
|
|
409
|
+
notNull: false;
|
|
410
|
+
hasDefault: false;
|
|
411
|
+
isPrimaryKey: false;
|
|
412
|
+
isAutoincrement: false;
|
|
413
|
+
hasRuntimeDefault: false;
|
|
414
|
+
enumValues: [string, ...string[]];
|
|
415
|
+
baseColumn: never;
|
|
416
|
+
identity: undefined;
|
|
417
|
+
generated: undefined;
|
|
418
|
+
}, {}, {
|
|
419
|
+
length: number | undefined;
|
|
420
|
+
}>;
|
|
421
|
+
approval: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
422
|
+
name: "approval";
|
|
423
|
+
tableName: "runs";
|
|
424
|
+
dataType: "string";
|
|
425
|
+
columnType: "SQLiteText";
|
|
426
|
+
data: string;
|
|
427
|
+
driverParam: string;
|
|
428
|
+
notNull: false;
|
|
429
|
+
hasDefault: false;
|
|
430
|
+
isPrimaryKey: false;
|
|
431
|
+
isAutoincrement: false;
|
|
432
|
+
hasRuntimeDefault: false;
|
|
433
|
+
enumValues: [string, ...string[]];
|
|
434
|
+
baseColumn: never;
|
|
435
|
+
identity: undefined;
|
|
436
|
+
generated: undefined;
|
|
437
|
+
}, {}, {
|
|
438
|
+
length: number | undefined;
|
|
439
|
+
}>;
|
|
440
|
+
metadata: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
441
|
+
name: "metadata";
|
|
442
|
+
tableName: "runs";
|
|
443
|
+
dataType: "string";
|
|
444
|
+
columnType: "SQLiteText";
|
|
445
|
+
data: string;
|
|
446
|
+
driverParam: string;
|
|
447
|
+
notNull: false;
|
|
448
|
+
hasDefault: false;
|
|
449
|
+
isPrimaryKey: false;
|
|
450
|
+
isAutoincrement: false;
|
|
451
|
+
hasRuntimeDefault: false;
|
|
452
|
+
enumValues: [string, ...string[]];
|
|
453
|
+
baseColumn: never;
|
|
454
|
+
identity: undefined;
|
|
455
|
+
generated: undefined;
|
|
456
|
+
}, {}, {
|
|
457
|
+
length: number | undefined;
|
|
458
|
+
}>;
|
|
459
|
+
completedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
460
|
+
name: "completed_at";
|
|
461
|
+
tableName: "runs";
|
|
462
|
+
dataType: "string";
|
|
463
|
+
columnType: "SQLiteText";
|
|
464
|
+
data: string;
|
|
465
|
+
driverParam: string;
|
|
466
|
+
notNull: false;
|
|
467
|
+
hasDefault: false;
|
|
468
|
+
isPrimaryKey: false;
|
|
469
|
+
isAutoincrement: false;
|
|
470
|
+
hasRuntimeDefault: false;
|
|
471
|
+
enumValues: [string, ...string[]];
|
|
472
|
+
baseColumn: never;
|
|
473
|
+
identity: undefined;
|
|
474
|
+
generated: undefined;
|
|
475
|
+
}, {}, {
|
|
476
|
+
length: number | undefined;
|
|
477
|
+
}>;
|
|
478
|
+
engine: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
479
|
+
name: "engine";
|
|
480
|
+
tableName: "runs";
|
|
481
|
+
dataType: "string";
|
|
482
|
+
columnType: "SQLiteText";
|
|
483
|
+
data: string;
|
|
484
|
+
driverParam: string;
|
|
485
|
+
notNull: false;
|
|
486
|
+
hasDefault: true;
|
|
487
|
+
isPrimaryKey: false;
|
|
488
|
+
isAutoincrement: false;
|
|
489
|
+
hasRuntimeDefault: false;
|
|
490
|
+
enumValues: [string, ...string[]];
|
|
491
|
+
baseColumn: never;
|
|
492
|
+
identity: undefined;
|
|
493
|
+
generated: undefined;
|
|
494
|
+
}, {}, {
|
|
495
|
+
length: number | undefined;
|
|
496
|
+
}>;
|
|
497
|
+
delivery: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
498
|
+
name: "delivery";
|
|
499
|
+
tableName: "runs";
|
|
500
|
+
dataType: "string";
|
|
501
|
+
columnType: "SQLiteText";
|
|
502
|
+
data: string;
|
|
503
|
+
driverParam: string;
|
|
504
|
+
notNull: false;
|
|
505
|
+
hasDefault: false;
|
|
506
|
+
isPrimaryKey: false;
|
|
507
|
+
isAutoincrement: false;
|
|
508
|
+
hasRuntimeDefault: false;
|
|
509
|
+
enumValues: [string, ...string[]];
|
|
510
|
+
baseColumn: never;
|
|
511
|
+
identity: undefined;
|
|
512
|
+
generated: undefined;
|
|
513
|
+
}, {}, {
|
|
514
|
+
length: number | undefined;
|
|
515
|
+
}>;
|
|
326
516
|
};
|
|
327
517
|
dialect: "sqlite";
|
|
328
518
|
}>;
|
|
@@ -621,6 +811,176 @@ export declare const runsPg: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
|
621
811
|
identity: undefined;
|
|
622
812
|
generated: undefined;
|
|
623
813
|
}, {}, {}>;
|
|
814
|
+
loopName: import("drizzle-orm/pg-core").PgColumn<{
|
|
815
|
+
name: "loop_name";
|
|
816
|
+
tableName: "runs";
|
|
817
|
+
dataType: "string";
|
|
818
|
+
columnType: "PgText";
|
|
819
|
+
data: string;
|
|
820
|
+
driverParam: string;
|
|
821
|
+
notNull: false;
|
|
822
|
+
hasDefault: false;
|
|
823
|
+
isPrimaryKey: false;
|
|
824
|
+
isAutoincrement: false;
|
|
825
|
+
hasRuntimeDefault: false;
|
|
826
|
+
enumValues: [string, ...string[]];
|
|
827
|
+
baseColumn: never;
|
|
828
|
+
identity: undefined;
|
|
829
|
+
generated: undefined;
|
|
830
|
+
}, {}, {}>;
|
|
831
|
+
context: import("drizzle-orm/pg-core").PgColumn<{
|
|
832
|
+
name: "context";
|
|
833
|
+
tableName: "runs";
|
|
834
|
+
dataType: "json";
|
|
835
|
+
columnType: "PgJsonb";
|
|
836
|
+
data: unknown;
|
|
837
|
+
driverParam: unknown;
|
|
838
|
+
notNull: false;
|
|
839
|
+
hasDefault: false;
|
|
840
|
+
isPrimaryKey: false;
|
|
841
|
+
isAutoincrement: false;
|
|
842
|
+
hasRuntimeDefault: false;
|
|
843
|
+
enumValues: undefined;
|
|
844
|
+
baseColumn: never;
|
|
845
|
+
identity: undefined;
|
|
846
|
+
generated: undefined;
|
|
847
|
+
}, {}, {}>;
|
|
848
|
+
trace: import("drizzle-orm/pg-core").PgColumn<{
|
|
849
|
+
name: "trace";
|
|
850
|
+
tableName: "runs";
|
|
851
|
+
dataType: "json";
|
|
852
|
+
columnType: "PgJsonb";
|
|
853
|
+
data: unknown;
|
|
854
|
+
driverParam: unknown;
|
|
855
|
+
notNull: false;
|
|
856
|
+
hasDefault: false;
|
|
857
|
+
isPrimaryKey: false;
|
|
858
|
+
isAutoincrement: false;
|
|
859
|
+
hasRuntimeDefault: false;
|
|
860
|
+
enumValues: undefined;
|
|
861
|
+
baseColumn: never;
|
|
862
|
+
identity: undefined;
|
|
863
|
+
generated: undefined;
|
|
864
|
+
}, {}, {}>;
|
|
865
|
+
error: import("drizzle-orm/pg-core").PgColumn<{
|
|
866
|
+
name: "error";
|
|
867
|
+
tableName: "runs";
|
|
868
|
+
dataType: "string";
|
|
869
|
+
columnType: "PgText";
|
|
870
|
+
data: string;
|
|
871
|
+
driverParam: string;
|
|
872
|
+
notNull: false;
|
|
873
|
+
hasDefault: false;
|
|
874
|
+
isPrimaryKey: false;
|
|
875
|
+
isAutoincrement: false;
|
|
876
|
+
hasRuntimeDefault: false;
|
|
877
|
+
enumValues: [string, ...string[]];
|
|
878
|
+
baseColumn: never;
|
|
879
|
+
identity: undefined;
|
|
880
|
+
generated: undefined;
|
|
881
|
+
}, {}, {}>;
|
|
882
|
+
approvalRequestId: import("drizzle-orm/pg-core").PgColumn<{
|
|
883
|
+
name: "approval_request_id";
|
|
884
|
+
tableName: "runs";
|
|
885
|
+
dataType: "string";
|
|
886
|
+
columnType: "PgText";
|
|
887
|
+
data: string;
|
|
888
|
+
driverParam: string;
|
|
889
|
+
notNull: false;
|
|
890
|
+
hasDefault: false;
|
|
891
|
+
isPrimaryKey: false;
|
|
892
|
+
isAutoincrement: false;
|
|
893
|
+
hasRuntimeDefault: false;
|
|
894
|
+
enumValues: [string, ...string[]];
|
|
895
|
+
baseColumn: never;
|
|
896
|
+
identity: undefined;
|
|
897
|
+
generated: undefined;
|
|
898
|
+
}, {}, {}>;
|
|
899
|
+
approval: import("drizzle-orm/pg-core").PgColumn<{
|
|
900
|
+
name: "approval";
|
|
901
|
+
tableName: "runs";
|
|
902
|
+
dataType: "json";
|
|
903
|
+
columnType: "PgJsonb";
|
|
904
|
+
data: unknown;
|
|
905
|
+
driverParam: unknown;
|
|
906
|
+
notNull: false;
|
|
907
|
+
hasDefault: false;
|
|
908
|
+
isPrimaryKey: false;
|
|
909
|
+
isAutoincrement: false;
|
|
910
|
+
hasRuntimeDefault: false;
|
|
911
|
+
enumValues: undefined;
|
|
912
|
+
baseColumn: never;
|
|
913
|
+
identity: undefined;
|
|
914
|
+
generated: undefined;
|
|
915
|
+
}, {}, {}>;
|
|
916
|
+
metadata: import("drizzle-orm/pg-core").PgColumn<{
|
|
917
|
+
name: "metadata";
|
|
918
|
+
tableName: "runs";
|
|
919
|
+
dataType: "json";
|
|
920
|
+
columnType: "PgJsonb";
|
|
921
|
+
data: unknown;
|
|
922
|
+
driverParam: unknown;
|
|
923
|
+
notNull: false;
|
|
924
|
+
hasDefault: false;
|
|
925
|
+
isPrimaryKey: false;
|
|
926
|
+
isAutoincrement: false;
|
|
927
|
+
hasRuntimeDefault: false;
|
|
928
|
+
enumValues: undefined;
|
|
929
|
+
baseColumn: never;
|
|
930
|
+
identity: undefined;
|
|
931
|
+
generated: undefined;
|
|
932
|
+
}, {}, {}>;
|
|
933
|
+
completedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
934
|
+
name: "completed_at";
|
|
935
|
+
tableName: "runs";
|
|
936
|
+
dataType: "string";
|
|
937
|
+
columnType: "PgText";
|
|
938
|
+
data: string;
|
|
939
|
+
driverParam: string;
|
|
940
|
+
notNull: false;
|
|
941
|
+
hasDefault: false;
|
|
942
|
+
isPrimaryKey: false;
|
|
943
|
+
isAutoincrement: false;
|
|
944
|
+
hasRuntimeDefault: false;
|
|
945
|
+
enumValues: [string, ...string[]];
|
|
946
|
+
baseColumn: never;
|
|
947
|
+
identity: undefined;
|
|
948
|
+
generated: undefined;
|
|
949
|
+
}, {}, {}>;
|
|
950
|
+
engine: import("drizzle-orm/pg-core").PgColumn<{
|
|
951
|
+
name: "engine";
|
|
952
|
+
tableName: "runs";
|
|
953
|
+
dataType: "string";
|
|
954
|
+
columnType: "PgText";
|
|
955
|
+
data: string;
|
|
956
|
+
driverParam: string;
|
|
957
|
+
notNull: false;
|
|
958
|
+
hasDefault: true;
|
|
959
|
+
isPrimaryKey: false;
|
|
960
|
+
isAutoincrement: false;
|
|
961
|
+
hasRuntimeDefault: false;
|
|
962
|
+
enumValues: [string, ...string[]];
|
|
963
|
+
baseColumn: never;
|
|
964
|
+
identity: undefined;
|
|
965
|
+
generated: undefined;
|
|
966
|
+
}, {}, {}>;
|
|
967
|
+
delivery: import("drizzle-orm/pg-core").PgColumn<{
|
|
968
|
+
name: "delivery";
|
|
969
|
+
tableName: "runs";
|
|
970
|
+
dataType: "string";
|
|
971
|
+
columnType: "PgText";
|
|
972
|
+
data: string;
|
|
973
|
+
driverParam: string;
|
|
974
|
+
notNull: false;
|
|
975
|
+
hasDefault: false;
|
|
976
|
+
isPrimaryKey: false;
|
|
977
|
+
isAutoincrement: false;
|
|
978
|
+
hasRuntimeDefault: false;
|
|
979
|
+
enumValues: [string, ...string[]];
|
|
980
|
+
baseColumn: never;
|
|
981
|
+
identity: undefined;
|
|
982
|
+
generated: undefined;
|
|
983
|
+
}, {}, {}>;
|
|
624
984
|
};
|
|
625
985
|
dialect: "pg";
|
|
626
986
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/schema/runs.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/schema/runs.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyCrB,CAAC;AAIH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCjB,CAAC"}
|
package/dist/schema/runs.js
CHANGED
|
@@ -21,10 +21,27 @@ export const runsSqlite = sqliteTable("runs", {
|
|
|
21
21
|
/** Durable-turns checkpoint (LoopResumeState JSON) — written once per completed turn. */
|
|
22
22
|
resumeState: text("resume_state"),
|
|
23
23
|
executionMode: text("execution_mode"),
|
|
24
|
+
// ── F2: unified Run — columns folded from loop_runs (all nullable/additive) ──
|
|
25
|
+
loopName: text("loop_name"),
|
|
26
|
+
context: text("context"),
|
|
27
|
+
trace: text("trace"),
|
|
28
|
+
error: text("error"),
|
|
29
|
+
approvalRequestId: text("approval_request_id"),
|
|
30
|
+
approval: text("approval"),
|
|
31
|
+
metadata: text("metadata"),
|
|
32
|
+
completedAt: text("completed_at"),
|
|
33
|
+
/** Execution-engine discriminator: "agent" (chat/task turn-loop) | "graph"
|
|
34
|
+
* (project-loop). Defaults to "agent" so existing task rows backfill; loop
|
|
35
|
+
* rows are written "graph" so task queries (getActiveRuns/getTerminalRuns)
|
|
36
|
+
* can exclude them once the tables merge. */
|
|
37
|
+
engine: text("engine").default("agent"),
|
|
38
|
+
/** Consumption axis (F3, forward-compat only): "stream" | "background". */
|
|
39
|
+
delivery: text("delivery"),
|
|
24
40
|
}, (table) => [
|
|
25
41
|
index("idx_runs_status").on(table.status),
|
|
26
42
|
index("idx_runs_task_id").on(table.taskId),
|
|
27
43
|
index("idx_runs_user").on(table.user),
|
|
44
|
+
index("idx_runs_engine").on(table.engine),
|
|
28
45
|
]);
|
|
29
46
|
// ── PostgreSQL schema ──────────────────────────────────────────────────
|
|
30
47
|
export const runsPg = pgTable("runs", {
|
|
@@ -47,9 +64,24 @@ export const runsPg = pgTable("runs", {
|
|
|
47
64
|
/** Durable-turns checkpoint (LoopResumeState JSON) — written once per completed turn. */
|
|
48
65
|
resumeState: jsonb("resume_state"),
|
|
49
66
|
executionMode: pgText("execution_mode"),
|
|
67
|
+
// ── F2: unified Run — columns folded from loop_runs (all nullable/additive) ──
|
|
68
|
+
loopName: pgText("loop_name"),
|
|
69
|
+
context: jsonb("context"),
|
|
70
|
+
trace: jsonb("trace"),
|
|
71
|
+
error: pgText("error"),
|
|
72
|
+
approvalRequestId: pgText("approval_request_id"),
|
|
73
|
+
approval: jsonb("approval"),
|
|
74
|
+
metadata: jsonb("metadata"),
|
|
75
|
+
completedAt: pgText("completed_at"),
|
|
76
|
+
/** Execution-engine discriminator: "agent" (chat/task) | "graph" (project-loop).
|
|
77
|
+
* Defaults "agent"; loop rows are "graph" so task queries can exclude them. */
|
|
78
|
+
engine: pgText("engine").default("agent"),
|
|
79
|
+
/** Consumption axis (F3, forward-compat only): "stream" | "background". */
|
|
80
|
+
delivery: pgText("delivery"),
|
|
50
81
|
}, (table) => [
|
|
51
82
|
pgIndex("idx_pg_runs_status").on(table.status),
|
|
52
83
|
pgIndex("idx_pg_runs_task_id").on(table.taskId),
|
|
53
84
|
pgIndex("idx_pg_runs_user").on(table.user),
|
|
85
|
+
pgIndex("idx_pg_runs_engine").on(table.engine),
|
|
54
86
|
]);
|
|
55
87
|
//# sourceMappingURL=runs.js.map
|
package/dist/schema/runs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/schema/runs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,OAAO,IAAI,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEtH,0EAA0E;AAE1E,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE;IAC5C,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IACjC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IACvC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE;IAC3C,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;IAC7B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACnD,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IACvC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IACvC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClD,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC;IACtB,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;IAC1B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC;IACtB,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE;IACzC,gFAAgF;IAChF,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;IAClB,yFAAyF;IACzF,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;IACjC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/schema/runs.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,17 @@ export declare class DrizzleLoopRunStore implements LoopRunStore {
|
|
|
6
6
|
private db;
|
|
7
7
|
private loopRuns;
|
|
8
8
|
private dialect;
|
|
9
|
-
|
|
9
|
+
/** When true, `loopRuns` is actually the unified `runs` table (F2 fold):
|
|
10
|
+
* records are written with engine="graph" + task-column sentinels, `resume`
|
|
11
|
+
* maps to the `resume_state` column, and reads/lists scope to engine="graph"
|
|
12
|
+
* so task rows in the same table are never returned. */
|
|
13
|
+
private targetsRuns;
|
|
14
|
+
constructor(db: any, loopRuns: AnyTable, dialect: Dialect,
|
|
15
|
+
/** When true, `loopRuns` is actually the unified `runs` table (F2 fold):
|
|
16
|
+
* records are written with engine="graph" + task-column sentinels, `resume`
|
|
17
|
+
* maps to the `resume_state` column, and reads/lists scope to engine="graph"
|
|
18
|
+
* so task rows in the same table are never returned. */
|
|
19
|
+
targetsRuns?: boolean);
|
|
10
20
|
private rowToRecord;
|
|
11
21
|
createRun(input: CreateLoopRunInput): Promise<LoopRunRecord>;
|
|
12
22
|
getRun(id: string): Promise<LoopRunRecord | undefined>;
|
|
@@ -16,5 +26,26 @@ export declare class DrizzleLoopRunStore implements LoopRunStore {
|
|
|
16
26
|
close(): Promise<void>;
|
|
17
27
|
private recordToValues;
|
|
18
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Dual-write LoopRunStore for the F2 transition. Writes go to BOTH the legacy
|
|
31
|
+
* `loop_runs` store and the shadow `runs`-backed store; the shadow write is
|
|
32
|
+
* best-effort (a shadow failure never fails the request). Reads come from
|
|
33
|
+
* `readFrom` — "legacy" during dual-write, flipped to "shadow" once loop_runs
|
|
34
|
+
* is backfilled into `runs`. When the shadow is the sole source, this wrapper
|
|
35
|
+
* is dropped and the plain runs-backed store is used directly (PR5).
|
|
36
|
+
*/
|
|
37
|
+
export declare class DualWriteLoopRunStore implements LoopRunStore {
|
|
38
|
+
private legacy;
|
|
39
|
+
private shadow;
|
|
40
|
+
private readFrom;
|
|
41
|
+
constructor(legacy: LoopRunStore, shadow: LoopRunStore, readFrom?: "legacy" | "shadow");
|
|
42
|
+
private shadowBestEffort;
|
|
43
|
+
createRun(input: CreateLoopRunInput): Promise<LoopRunRecord>;
|
|
44
|
+
appendTrace(runId: string, event: LoopTraceEvent): Promise<void>;
|
|
45
|
+
updateRun(runId: string, patch: Partial<Omit<LoopRunRecord, "id" | "startedAt">>): Promise<LoopRunRecord | undefined>;
|
|
46
|
+
getRun(id: string): Promise<LoopRunRecord | undefined>;
|
|
47
|
+
listRuns(filter?: LoopRunListFilter): Promise<LoopRunRecord[]>;
|
|
48
|
+
close(): Promise<void>;
|
|
49
|
+
}
|
|
19
50
|
export {};
|
|
20
51
|
//# sourceMappingURL=loop-run-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-run-store.d.ts","sourceRoot":"","sources":["../../src/stores/loop-run-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EAEb,YAAY,EACb,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,KAAK,OAAO,EAAkC,MAAM,aAAa,CAAC;AAE3E,KAAK,QAAQ,GAAG,GAAG,CAAC;AAEpB,qBAAa,mBAAoB,YAAW,YAAY;IAEpD,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"loop-run-store.d.ts","sourceRoot":"","sources":["../../src/stores/loop-run-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EAEb,YAAY,EACb,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,KAAK,OAAO,EAAkC,MAAM,aAAa,CAAC;AAE3E,KAAK,QAAQ,GAAG,GAAG,CAAC;AAEpB,qBAAa,mBAAoB,YAAW,YAAY;IAEpD,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf;;;6DAGyD;IACzD,OAAO,CAAC,WAAW;gBAPX,EAAE,EAAE,GAAG,EACP,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO;IACxB;;;6DAGyD;IACjD,WAAW,GAAE,OAAe;IAGtC,OAAO,CAAC,WAAW;IAqBb,SAAS,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IA0B5D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAQtD,QAAQ,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAiBlE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAcrH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,OAAO,CAAC,cAAc;CAqCvB;AAED;;;;;;;GAOG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IAEtD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;gBAFR,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,EACpB,QAAQ,GAAE,QAAQ,GAAG,QAAmB;YAGpC,gBAAgB;IAIxB,SAAS,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAM5D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAM3H,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAItD,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAIxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
|
|
@@ -4,10 +4,17 @@ export class DrizzleLoopRunStore {
|
|
|
4
4
|
db;
|
|
5
5
|
loopRuns;
|
|
6
6
|
dialect;
|
|
7
|
-
|
|
7
|
+
targetsRuns;
|
|
8
|
+
constructor(db, loopRuns, dialect,
|
|
9
|
+
/** When true, `loopRuns` is actually the unified `runs` table (F2 fold):
|
|
10
|
+
* records are written with engine="graph" + task-column sentinels, `resume`
|
|
11
|
+
* maps to the `resume_state` column, and reads/lists scope to engine="graph"
|
|
12
|
+
* so task rows in the same table are never returned. */
|
|
13
|
+
targetsRuns = false) {
|
|
8
14
|
this.db = db;
|
|
9
15
|
this.loopRuns = loopRuns;
|
|
10
16
|
this.dialect = dialect;
|
|
17
|
+
this.targetsRuns = targetsRuns;
|
|
11
18
|
}
|
|
12
19
|
rowToRecord(row) {
|
|
13
20
|
return {
|
|
@@ -22,7 +29,7 @@ export class DrizzleLoopRunStore {
|
|
|
22
29
|
error: row.error ?? undefined,
|
|
23
30
|
approvalRequestId: row.approvalRequestId ?? undefined,
|
|
24
31
|
approval: deserializeJson(row.approval, undefined, this.dialect),
|
|
25
|
-
resume: deserializeJson(row.resume, undefined, this.dialect),
|
|
32
|
+
resume: deserializeJson(this.targetsRuns ? row.resumeState : row.resume, undefined, this.dialect),
|
|
26
33
|
metadata: deserializeJson(row.metadata, undefined, this.dialect),
|
|
27
34
|
startedAt: row.startedAt,
|
|
28
35
|
updatedAt: row.updatedAt,
|
|
@@ -55,11 +62,16 @@ export class DrizzleLoopRunStore {
|
|
|
55
62
|
return run;
|
|
56
63
|
}
|
|
57
64
|
async getRun(id) {
|
|
58
|
-
const
|
|
65
|
+
const where = this.targetsRuns
|
|
66
|
+
? and(eq(this.loopRuns.id, id), eq(this.loopRuns.engine, "graph"))
|
|
67
|
+
: eq(this.loopRuns.id, id);
|
|
68
|
+
const rows = await this.db.select().from(this.loopRuns).where(where).limit(1);
|
|
59
69
|
return rows[0] ? this.rowToRecord(rows[0]) : undefined;
|
|
60
70
|
}
|
|
61
71
|
async listRuns(filter = {}) {
|
|
62
72
|
const clauses = [];
|
|
73
|
+
if (this.targetsRuns)
|
|
74
|
+
clauses.push(eq(this.loopRuns.engine, "graph"));
|
|
63
75
|
if (filter.loopName)
|
|
64
76
|
clauses.push(eq(this.loopRuns.loopName, filter.loopName));
|
|
65
77
|
if (filter.agentName)
|
|
@@ -102,10 +114,9 @@ export class DrizzleLoopRunStore {
|
|
|
102
114
|
// Connection lifecycle managed externally.
|
|
103
115
|
}
|
|
104
116
|
recordToValues(run) {
|
|
105
|
-
|
|
117
|
+
const base = {
|
|
106
118
|
id: run.id,
|
|
107
119
|
loopName: run.loopName,
|
|
108
|
-
agentName: run.agentName ?? null,
|
|
109
120
|
sessionId: run.sessionId ?? null,
|
|
110
121
|
user: run.user ?? null,
|
|
111
122
|
status: run.status,
|
|
@@ -114,12 +125,78 @@ export class DrizzleLoopRunStore {
|
|
|
114
125
|
error: run.error ?? null,
|
|
115
126
|
approvalRequestId: run.approvalRequestId ?? null,
|
|
116
127
|
approval: serializeJson(run.approval, this.dialect),
|
|
117
|
-
resume: serializeJson(run.resume, this.dialect),
|
|
118
128
|
metadata: serializeJson(run.metadata, this.dialect),
|
|
119
129
|
startedAt: run.startedAt,
|
|
120
130
|
updatedAt: run.updatedAt,
|
|
121
131
|
completedAt: run.completedAt ?? null,
|
|
122
132
|
};
|
|
133
|
+
if (this.targetsRuns) {
|
|
134
|
+
// Writing a loop record into the unified `runs` table: fill the NOT-NULL
|
|
135
|
+
// task columns with sentinels, tag engine="graph", and map resume →
|
|
136
|
+
// resume_state (the column `runs` already has).
|
|
137
|
+
return {
|
|
138
|
+
...base,
|
|
139
|
+
agentName: run.agentName ?? "", // runs.agent_name is NOT NULL
|
|
140
|
+
taskId: run.id,
|
|
141
|
+
adapterType: "loop",
|
|
142
|
+
configPath: "",
|
|
143
|
+
engine: "graph",
|
|
144
|
+
resumeState: serializeJson(run.resume, this.dialect),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
...base,
|
|
149
|
+
agentName: run.agentName ?? null,
|
|
150
|
+
resume: serializeJson(run.resume, this.dialect),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Dual-write LoopRunStore for the F2 transition. Writes go to BOTH the legacy
|
|
156
|
+
* `loop_runs` store and the shadow `runs`-backed store; the shadow write is
|
|
157
|
+
* best-effort (a shadow failure never fails the request). Reads come from
|
|
158
|
+
* `readFrom` — "legacy" during dual-write, flipped to "shadow" once loop_runs
|
|
159
|
+
* is backfilled into `runs`. When the shadow is the sole source, this wrapper
|
|
160
|
+
* is dropped and the plain runs-backed store is used directly (PR5).
|
|
161
|
+
*/
|
|
162
|
+
export class DualWriteLoopRunStore {
|
|
163
|
+
legacy;
|
|
164
|
+
shadow;
|
|
165
|
+
readFrom;
|
|
166
|
+
constructor(legacy, shadow, readFrom = "legacy") {
|
|
167
|
+
this.legacy = legacy;
|
|
168
|
+
this.shadow = shadow;
|
|
169
|
+
this.readFrom = readFrom;
|
|
170
|
+
}
|
|
171
|
+
async shadowBestEffort(op) {
|
|
172
|
+
try {
|
|
173
|
+
await op();
|
|
174
|
+
}
|
|
175
|
+
catch { /* shadow write must never fail the request */ }
|
|
176
|
+
}
|
|
177
|
+
async createRun(input) {
|
|
178
|
+
const run = await this.legacy.createRun(input);
|
|
179
|
+
await this.shadowBestEffort(() => this.shadow.createRun(input));
|
|
180
|
+
return run;
|
|
181
|
+
}
|
|
182
|
+
async appendTrace(runId, event) {
|
|
183
|
+
await this.legacy.appendTrace(runId, event);
|
|
184
|
+
await this.shadowBestEffort(() => this.shadow.appendTrace(runId, event));
|
|
185
|
+
}
|
|
186
|
+
async updateRun(runId, patch) {
|
|
187
|
+
const updated = await this.legacy.updateRun(runId, patch);
|
|
188
|
+
await this.shadowBestEffort(() => this.shadow.updateRun(runId, patch));
|
|
189
|
+
return updated;
|
|
190
|
+
}
|
|
191
|
+
getRun(id) {
|
|
192
|
+
return (this.readFrom === "shadow" ? this.shadow : this.legacy).getRun(id);
|
|
193
|
+
}
|
|
194
|
+
listRuns(filter) {
|
|
195
|
+
return (this.readFrom === "shadow" ? this.shadow : this.legacy).listRuns(filter);
|
|
196
|
+
}
|
|
197
|
+
async close() {
|
|
198
|
+
await this.legacy.close?.();
|
|
199
|
+
await this.shadow.close?.();
|
|
123
200
|
}
|
|
124
201
|
}
|
|
125
202
|
//# sourceMappingURL=loop-run-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-run-store.js","sourceRoot":"","sources":["../../src/stores/loop-run-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAS5C,OAAO,EAAgB,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI3E,MAAM,OAAO,mBAAmB;IAEpB;IACA;IACA;
|
|
1
|
+
{"version":3,"file":"loop-run-store.js","sourceRoot":"","sources":["../../src/stores/loop-run-store.ts"],"names":[],"mappings":"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"}
|