@workglow/storage 0.0.85 → 0.0.87

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 (108) hide show
  1. package/README.md +185 -53
  2. package/dist/browser.js +451 -188
  3. package/dist/browser.js.map +21 -18
  4. package/dist/bun.js +1069 -356
  5. package/dist/bun.js.map +29 -24
  6. package/dist/common-server.d.ts +17 -15
  7. package/dist/common-server.d.ts.map +1 -1
  8. package/dist/common.d.ts +13 -10
  9. package/dist/common.d.ts.map +1 -1
  10. package/dist/kv/{FsFolderJsonKvRepository.d.ts → FsFolderJsonKvStorage.d.ts} +8 -8
  11. package/dist/kv/FsFolderJsonKvStorage.d.ts.map +1 -0
  12. package/dist/kv/{FsFolderKvRepository.d.ts → FsFolderKvStorage.d.ts} +7 -7
  13. package/dist/kv/FsFolderKvStorage.d.ts.map +1 -0
  14. package/dist/kv/{IKvRepository.d.ts → IKvStorage.d.ts} +3 -3
  15. package/dist/kv/IKvStorage.d.ts.map +1 -0
  16. package/dist/kv/{InMemoryKvRepository.d.ts → InMemoryKvStorage.d.ts} +8 -8
  17. package/dist/kv/InMemoryKvStorage.d.ts.map +1 -0
  18. package/dist/kv/{IndexedDbKvRepository.d.ts → IndexedDbKvStorage.d.ts} +8 -8
  19. package/dist/kv/IndexedDbKvStorage.d.ts.map +1 -0
  20. package/dist/kv/{KvRepository.d.ts → KvStorage.d.ts} +7 -7
  21. package/dist/kv/KvStorage.d.ts.map +1 -0
  22. package/dist/kv/{KvViaTabularRepository.d.ts → KvViaTabularStorage.d.ts} +7 -7
  23. package/dist/kv/KvViaTabularStorage.d.ts.map +1 -0
  24. package/dist/kv/{PostgresKvRepository.d.ts → PostgresKvStorage.d.ts} +8 -8
  25. package/dist/kv/PostgresKvStorage.d.ts.map +1 -0
  26. package/dist/kv/{SqliteKvRepository.d.ts → SqliteKvStorage.d.ts} +8 -8
  27. package/dist/kv/SqliteKvStorage.d.ts.map +1 -0
  28. package/dist/kv/{SupabaseKvRepository.d.ts → SupabaseKvStorage.d.ts} +9 -9
  29. package/dist/kv/SupabaseKvStorage.d.ts.map +1 -0
  30. package/dist/node.js +1069 -356
  31. package/dist/node.js.map +29 -24
  32. package/dist/queue-limiter/IRateLimiterStorage.d.ts.map +1 -0
  33. package/dist/queue-limiter/InMemoryRateLimiterStorage.d.ts.map +1 -0
  34. package/dist/queue-limiter/IndexedDbRateLimiterStorage.d.ts.map +1 -0
  35. package/dist/queue-limiter/PostgresRateLimiterStorage.d.ts.map +1 -0
  36. package/dist/queue-limiter/SqliteRateLimiterStorage.d.ts.map +1 -0
  37. package/dist/queue-limiter/SupabaseRateLimiterStorage.d.ts.map +1 -0
  38. package/dist/tabular/{BaseSqlTabularRepository.d.ts → BaseSqlTabularStorage.d.ts} +8 -7
  39. package/dist/tabular/BaseSqlTabularStorage.d.ts.map +1 -0
  40. package/dist/tabular/{TabularRepository.d.ts → BaseTabularStorage.d.ts} +52 -10
  41. package/dist/tabular/BaseTabularStorage.d.ts.map +1 -0
  42. package/dist/tabular/{CachedTabularRepository.d.ts → CachedTabularStorage.d.ts} +15 -14
  43. package/dist/tabular/CachedTabularStorage.d.ts.map +1 -0
  44. package/dist/tabular/{FsFolderTabularRepository.d.ts → FsFolderTabularStorage.d.ts} +22 -12
  45. package/dist/tabular/FsFolderTabularStorage.d.ts.map +1 -0
  46. package/dist/tabular/{ITabularRepository.d.ts → ITabularStorage.d.ts} +29 -6
  47. package/dist/tabular/ITabularStorage.d.ts.map +1 -0
  48. package/dist/tabular/{InMemoryTabularRepository.d.ts → InMemoryTabularStorage.d.ts} +24 -14
  49. package/dist/tabular/InMemoryTabularStorage.d.ts.map +1 -0
  50. package/dist/tabular/{IndexedDbTabularRepository.d.ts → IndexedDbTabularStorage.d.ts} +20 -11
  51. package/dist/tabular/IndexedDbTabularStorage.d.ts.map +1 -0
  52. package/dist/tabular/{PostgresTabularRepository.d.ts → PostgresTabularStorage.d.ts} +37 -15
  53. package/dist/tabular/PostgresTabularStorage.d.ts.map +1 -0
  54. package/dist/tabular/{SharedInMemoryTabularRepository.d.ts → SharedInMemoryTabularStorage.d.ts} +14 -13
  55. package/dist/tabular/SharedInMemoryTabularStorage.d.ts.map +1 -0
  56. package/dist/tabular/{SqliteTabularRepository.d.ts → SqliteTabularStorage.d.ts} +25 -11
  57. package/dist/tabular/SqliteTabularStorage.d.ts.map +1 -0
  58. package/dist/tabular/{SupabaseTabularRepository.d.ts → SupabaseTabularStorage.d.ts} +17 -15
  59. package/dist/tabular/SupabaseTabularStorage.d.ts.map +1 -0
  60. package/dist/tabular/TabularStorageRegistry.d.ts +29 -0
  61. package/dist/tabular/TabularStorageRegistry.d.ts.map +1 -0
  62. package/dist/util/IndexedDbTable.d.ts +1 -1
  63. package/dist/util/IndexedDbTable.d.ts.map +1 -1
  64. package/dist/vector/IVectorStorage.d.ts +83 -0
  65. package/dist/vector/IVectorStorage.d.ts.map +1 -0
  66. package/dist/vector/InMemoryVectorStorage.d.ts +41 -0
  67. package/dist/vector/InMemoryVectorStorage.d.ts.map +1 -0
  68. package/dist/vector/PostgresVectorStorage.d.ts +57 -0
  69. package/dist/vector/PostgresVectorStorage.d.ts.map +1 -0
  70. package/dist/vector/SqliteVectorStorage.d.ts +45 -0
  71. package/dist/vector/SqliteVectorStorage.d.ts.map +1 -0
  72. package/package.json +7 -7
  73. package/src/kv/README.md +3 -3
  74. package/src/tabular/README.md +186 -23
  75. package/src/vector/README.md +393 -0
  76. package/dist/kv/FsFolderJsonKvRepository.d.ts.map +0 -1
  77. package/dist/kv/FsFolderKvRepository.d.ts.map +0 -1
  78. package/dist/kv/IKvRepository.d.ts.map +0 -1
  79. package/dist/kv/InMemoryKvRepository.d.ts.map +0 -1
  80. package/dist/kv/IndexedDbKvRepository.d.ts.map +0 -1
  81. package/dist/kv/KvRepository.d.ts.map +0 -1
  82. package/dist/kv/KvViaTabularRepository.d.ts.map +0 -1
  83. package/dist/kv/PostgresKvRepository.d.ts.map +0 -1
  84. package/dist/kv/SqliteKvRepository.d.ts.map +0 -1
  85. package/dist/kv/SupabaseKvRepository.d.ts.map +0 -1
  86. package/dist/limiter/IRateLimiterStorage.d.ts.map +0 -1
  87. package/dist/limiter/InMemoryRateLimiterStorage.d.ts.map +0 -1
  88. package/dist/limiter/IndexedDbRateLimiterStorage.d.ts.map +0 -1
  89. package/dist/limiter/PostgresRateLimiterStorage.d.ts.map +0 -1
  90. package/dist/limiter/SqliteRateLimiterStorage.d.ts.map +0 -1
  91. package/dist/limiter/SupabaseRateLimiterStorage.d.ts.map +0 -1
  92. package/dist/tabular/BaseSqlTabularRepository.d.ts.map +0 -1
  93. package/dist/tabular/CachedTabularRepository.d.ts.map +0 -1
  94. package/dist/tabular/FsFolderTabularRepository.d.ts.map +0 -1
  95. package/dist/tabular/ITabularRepository.d.ts.map +0 -1
  96. package/dist/tabular/InMemoryTabularRepository.d.ts.map +0 -1
  97. package/dist/tabular/IndexedDbTabularRepository.d.ts.map +0 -1
  98. package/dist/tabular/PostgresTabularRepository.d.ts.map +0 -1
  99. package/dist/tabular/SharedInMemoryTabularRepository.d.ts.map +0 -1
  100. package/dist/tabular/SqliteTabularRepository.d.ts.map +0 -1
  101. package/dist/tabular/SupabaseTabularRepository.d.ts.map +0 -1
  102. package/dist/tabular/TabularRepository.d.ts.map +0 -1
  103. /package/dist/{limiter → queue-limiter}/IRateLimiterStorage.d.ts +0 -0
  104. /package/dist/{limiter → queue-limiter}/InMemoryRateLimiterStorage.d.ts +0 -0
  105. /package/dist/{limiter → queue-limiter}/IndexedDbRateLimiterStorage.d.ts +0 -0
  106. /package/dist/{limiter → queue-limiter}/PostgresRateLimiterStorage.d.ts +0 -0
  107. /package/dist/{limiter → queue-limiter}/SqliteRateLimiterStorage.d.ts +0 -0
  108. /package/dist/{limiter → queue-limiter}/SupabaseRateLimiterStorage.d.ts +0 -0
package/dist/browser.js CHANGED
@@ -1,18 +1,4 @@
1
- // src/tabular/CachedTabularRepository.ts
2
- import { createServiceToken as createServiceToken3 } from "@workglow/util";
3
-
4
- // src/tabular/InMemoryTabularRepository.ts
5
- import {
6
- createServiceToken as createServiceToken2,
7
- makeFingerprint as makeFingerprint2
8
- } from "@workglow/util";
9
-
10
- // src/tabular/ITabularRepository.ts
11
- function isSearchCondition(value) {
12
- return typeof value === "object" && value !== null && "value" in value && "operator" in value && typeof value.operator === "string";
13
- }
14
-
15
- // src/tabular/TabularRepository.ts
1
+ // src/tabular/BaseTabularStorage.ts
16
2
  import {
17
3
  createServiceToken,
18
4
  EventEmitter,
@@ -20,16 +6,20 @@ import {
20
6
  } from "@workglow/util";
21
7
  var TABULAR_REPOSITORY = createServiceToken("storage.tabularRepository");
22
8
 
23
- class TabularRepository {
9
+ class BaseTabularStorage {
24
10
  schema;
25
11
  primaryKeyNames;
26
12
  events = new EventEmitter;
27
13
  indexes;
28
14
  primaryKeySchema;
29
15
  valueSchema;
30
- constructor(schema, primaryKeyNames, indexes = []) {
16
+ autoGeneratedKeyName = null;
17
+ autoGeneratedKeyStrategy = null;
18
+ clientProvidedKeys;
19
+ constructor(schema, primaryKeyNames, indexes = [], clientProvidedKeys = "if-missing") {
31
20
  this.schema = schema;
32
21
  this.primaryKeyNames = primaryKeyNames;
22
+ this.clientProvidedKeys = clientProvidedKeys;
33
23
  const primaryKeyProps = {};
34
24
  const valueProps = {};
35
25
  const primaryKeySet = new Set(primaryKeyNames);
@@ -72,6 +62,28 @@ class TabularRepository {
72
62
  }
73
63
  }
74
64
  }
65
+ const autoGeneratedKeys = [];
66
+ for (const key of primaryKeyNames) {
67
+ const keyStr = String(key);
68
+ const propDef = schema.properties[keyStr];
69
+ if (propDef && typeof propDef === "object" && "x-auto-generated" in propDef) {
70
+ if (propDef["x-auto-generated"] === true) {
71
+ autoGeneratedKeys.push(keyStr);
72
+ }
73
+ }
74
+ }
75
+ if (autoGeneratedKeys.length > 1) {
76
+ throw new Error(`Multiple auto-generated keys detected: ${autoGeneratedKeys.join(", ")}. ` + `Only the first primary key column can be auto-generated.`);
77
+ }
78
+ if (autoGeneratedKeys.length > 0) {
79
+ const autoGenKeyName = autoGeneratedKeys[0];
80
+ const firstPrimaryKey = String(primaryKeyNames[0]);
81
+ if (autoGenKeyName !== firstPrimaryKey) {
82
+ throw new Error(`Auto-generated key "${autoGenKeyName}" must be the first primary key column. ` + `Current first primary key is "${firstPrimaryKey}".`);
83
+ }
84
+ this.autoGeneratedKeyName = autoGenKeyName;
85
+ this.autoGeneratedKeyStrategy = this.determineGenerationStrategy(autoGenKeyName, schema.properties[autoGenKeyName]);
86
+ }
75
87
  }
76
88
  filterCompoundKeys(primaryKey, potentialKeys) {
77
89
  const isPrefix = (prefix, arr) => {
@@ -193,6 +205,32 @@ class TabularRepository {
193
205
  }
194
206
  return bestMatch;
195
207
  }
208
+ hasAutoGeneratedKey() {
209
+ return this.autoGeneratedKeyName !== null;
210
+ }
211
+ isAutoGeneratedKey(name) {
212
+ return this.autoGeneratedKeyName !== null && String(this.autoGeneratedKeyName) === name;
213
+ }
214
+ determineGenerationStrategy(columnName, typeDef) {
215
+ let actualType = typeDef;
216
+ if (typeDef && typeof typeDef === "object") {
217
+ if (typeDef.anyOf && Array.isArray(typeDef.anyOf)) {
218
+ actualType = typeDef.anyOf.find((t) => t.type !== "null") || typeDef;
219
+ } else if (typeDef.oneOf && Array.isArray(typeDef.oneOf)) {
220
+ actualType = typeDef.oneOf.find((t) => t.type !== "null") || typeDef;
221
+ }
222
+ }
223
+ if (typeof actualType !== "object") {
224
+ return "uuid";
225
+ }
226
+ if (actualType.type === "integer") {
227
+ return "autoincrement";
228
+ }
229
+ return "uuid";
230
+ }
231
+ generateKeyValue(columnName, strategy) {
232
+ throw new Error(`generateKeyValue not implemented for ${this.constructor.name}. ` + `Column: ${columnName}, Strategy: ${strategy}`);
233
+ }
196
234
  async setupDatabase() {}
197
235
  destroy() {}
198
236
  async[Symbol.asyncDispose]() {
@@ -202,22 +240,67 @@ class TabularRepository {
202
240
  this.destroy();
203
241
  }
204
242
  }
243
+ // src/tabular/CachedTabularStorage.ts
244
+ import {
245
+ createServiceToken as createServiceToken3
246
+ } from "@workglow/util";
247
+
248
+ // src/tabular/InMemoryTabularStorage.ts
249
+ import {
250
+ createServiceToken as createServiceToken2,
251
+ makeFingerprint as makeFingerprint2,
252
+ uuid4
253
+ } from "@workglow/util";
254
+
255
+ // src/tabular/ITabularStorage.ts
256
+ function isSearchCondition(value) {
257
+ return typeof value === "object" && value !== null && "value" in value && "operator" in value && typeof value.operator === "string";
258
+ }
205
259
 
206
- // src/tabular/InMemoryTabularRepository.ts
260
+ // src/tabular/InMemoryTabularStorage.ts
207
261
  var MEMORY_TABULAR_REPOSITORY = createServiceToken2("storage.tabularRepository.inMemory");
208
262
 
209
- class InMemoryTabularRepository extends TabularRepository {
263
+ class InMemoryTabularStorage extends BaseTabularStorage {
210
264
  values = new Map;
211
- constructor(schema, primaryKeyNames, indexes = []) {
212
- super(schema, primaryKeyNames, indexes);
265
+ autoIncrementCounter = 0;
266
+ constructor(schema, primaryKeyNames, indexes = [], clientProvidedKeys = "if-missing") {
267
+ super(schema, primaryKeyNames, indexes, clientProvidedKeys);
213
268
  }
214
269
  async setupDatabase() {}
270
+ generateKeyValue(columnName, strategy) {
271
+ if (strategy === "autoincrement") {
272
+ return ++this.autoIncrementCounter;
273
+ } else {
274
+ return uuid4();
275
+ }
276
+ }
215
277
  async put(value) {
216
- const { key } = this.separateKeyValueFromCombined(value);
278
+ let entityToStore = value;
279
+ if (this.hasAutoGeneratedKey() && this.autoGeneratedKeyName) {
280
+ const keyName = this.autoGeneratedKeyName;
281
+ const clientProvidedValue = value[keyName];
282
+ const hasClientValue = clientProvidedValue !== undefined && clientProvidedValue !== null;
283
+ let shouldGenerate = false;
284
+ if (this.clientProvidedKeys === "never") {
285
+ shouldGenerate = true;
286
+ } else if (this.clientProvidedKeys === "always") {
287
+ if (!hasClientValue) {
288
+ throw new Error(`Auto-generated key "${keyName}" is required when clientProvidedKeys is "always"`);
289
+ }
290
+ shouldGenerate = false;
291
+ } else {
292
+ shouldGenerate = !hasClientValue;
293
+ }
294
+ if (shouldGenerate) {
295
+ const generatedValue = this.generateKeyValue(keyName, this.autoGeneratedKeyStrategy);
296
+ entityToStore = { ...value, [keyName]: generatedValue };
297
+ }
298
+ }
299
+ const { key } = this.separateKeyValueFromCombined(entityToStore);
217
300
  const id = await makeFingerprint2(key);
218
- this.values.set(id, value);
219
- this.events.emit("put", value);
220
- return value;
301
+ this.values.set(id, entityToStore);
302
+ this.events.emit("put", entityToStore);
303
+ return entityToStore;
221
304
  }
222
305
  async putBulk(values) {
223
306
  return await Promise.all(values.map(async (value) => this.put(value)));
@@ -338,23 +421,23 @@ class InMemoryTabularRepository extends TabularRepository {
338
421
  }
339
422
  }
340
423
 
341
- // src/tabular/CachedTabularRepository.ts
424
+ // src/tabular/CachedTabularStorage.ts
342
425
  var CACHED_TABULAR_REPOSITORY = createServiceToken3("storage.tabularRepository.cached");
343
426
 
344
- class CachedTabularRepository extends TabularRepository {
427
+ class CachedTabularStorage extends BaseTabularStorage {
345
428
  cache;
346
429
  durable;
347
430
  cacheInitialized = false;
348
- constructor(durable, cache, schema, primaryKeyNames, indexes) {
431
+ constructor(durable, cache, schema, primaryKeyNames, indexes, clientProvidedKeys = "if-missing") {
349
432
  if (!schema || !primaryKeyNames) {
350
- throw new Error("Schema and primaryKeyNames must be provided when creating CachedTabularRepository");
433
+ throw new Error("Schema and primaryKeyNames must be provided when creating CachedTabularStorage");
351
434
  }
352
- super(schema, primaryKeyNames, indexes || []);
435
+ super(schema, primaryKeyNames, indexes || [], clientProvidedKeys);
353
436
  this.durable = durable;
354
437
  if (cache) {
355
438
  this.cache = cache;
356
439
  } else {
357
- this.cache = new InMemoryTabularRepository(schema, primaryKeyNames, indexes || []);
440
+ this.cache = new InMemoryTabularStorage(schema, primaryKeyNames, indexes || [], clientProvidedKeys);
358
441
  }
359
442
  this.setupEventForwarding();
360
443
  }
@@ -481,7 +564,36 @@ class CachedTabularRepository extends TabularRepository {
481
564
  this.cache.destroy();
482
565
  }
483
566
  }
484
- // src/kv/IKvRepository.ts
567
+ // src/tabular/TabularStorageRegistry.ts
568
+ import {
569
+ createServiceToken as createServiceToken4,
570
+ globalServiceRegistry,
571
+ registerInputResolver
572
+ } from "@workglow/util";
573
+ var TABULAR_REPOSITORIES = createServiceToken4("storage.tabular.repositories");
574
+ if (!globalServiceRegistry.has(TABULAR_REPOSITORIES)) {
575
+ globalServiceRegistry.register(TABULAR_REPOSITORIES, () => new Map, true);
576
+ }
577
+ function getGlobalTabularRepositories() {
578
+ return globalServiceRegistry.get(TABULAR_REPOSITORIES);
579
+ }
580
+ function registerTabularRepository(id, repository) {
581
+ const repos = getGlobalTabularRepositories();
582
+ repos.set(id, repository);
583
+ }
584
+ function getTabularRepository(id) {
585
+ return getGlobalTabularRepositories().get(id);
586
+ }
587
+ function resolveRepositoryFromRegistry(id, format, registry) {
588
+ const repos = registry.has(TABULAR_REPOSITORIES) ? registry.get(TABULAR_REPOSITORIES) : getGlobalTabularRepositories();
589
+ const repo = repos.get(id);
590
+ if (!repo) {
591
+ throw new Error(`Tabular storage "${id}" not found in registry`);
592
+ }
593
+ return repo;
594
+ }
595
+ registerInputResolver("storage:tabular", resolveRepositoryFromRegistry);
596
+ // src/kv/IKvStorage.ts
485
597
  var DefaultKeyValueSchema = {
486
598
  type: "object",
487
599
  properties: {
@@ -491,14 +603,14 @@ var DefaultKeyValueSchema = {
491
603
  additionalProperties: false
492
604
  };
493
605
  var DefaultKeyValueKey = ["key"];
494
- // src/kv/InMemoryKvRepository.ts
495
- import { createServiceToken as createServiceToken5 } from "@workglow/util";
606
+ // src/kv/InMemoryKvStorage.ts
607
+ import { createServiceToken as createServiceToken6 } from "@workglow/util";
496
608
 
497
- // src/kv/KvRepository.ts
498
- import { createServiceToken as createServiceToken4, EventEmitter as EventEmitter2, makeFingerprint as makeFingerprint3 } from "@workglow/util";
499
- var KV_REPOSITORY = createServiceToken4("storage.kvRepository");
609
+ // src/kv/KvStorage.ts
610
+ import { createServiceToken as createServiceToken5, EventEmitter as EventEmitter2, makeFingerprint as makeFingerprint3 } from "@workglow/util";
611
+ var KV_REPOSITORY = createServiceToken5("storage.kvRepository");
500
612
 
501
- class KvRepository {
613
+ class KvStorage {
502
614
  keySchema;
503
615
  valueSchema;
504
616
  events = new EventEmitter2;
@@ -526,8 +638,8 @@ class KvRepository {
526
638
  }
527
639
  }
528
640
 
529
- // src/kv/KvViaTabularRepository.ts
530
- class KvViaTabularRepository extends KvRepository {
641
+ // src/kv/KvViaTabularStorage.ts
642
+ class KvViaTabularStorage extends KvStorage {
531
643
  async setupDatabase() {
532
644
  await this.tabularRepository.setupDatabase?.();
533
645
  }
@@ -602,22 +714,22 @@ class KvViaTabularRepository extends KvRepository {
602
714
  }
603
715
  }
604
716
 
605
- // src/kv/InMemoryKvRepository.ts
606
- var MEMORY_KV_REPOSITORY = createServiceToken5("storage.kvRepository.inMemory");
717
+ // src/kv/InMemoryKvStorage.ts
718
+ var MEMORY_KV_REPOSITORY = createServiceToken6("storage.kvRepository.inMemory");
607
719
 
608
- class InMemoryKvRepository extends KvViaTabularRepository {
720
+ class InMemoryKvStorage extends KvViaTabularStorage {
609
721
  tabularRepository;
610
722
  constructor(keySchema = { type: "string" }, valueSchema = {}) {
611
723
  super(keySchema, valueSchema);
612
- this.tabularRepository = new InMemoryTabularRepository(DefaultKeyValueSchema, DefaultKeyValueKey);
724
+ this.tabularRepository = new InMemoryTabularStorage(DefaultKeyValueSchema, DefaultKeyValueKey);
613
725
  }
614
726
  }
615
727
  // src/queue/InMemoryQueueStorage.ts
616
- import { createServiceToken as createServiceToken7, EventEmitter as EventEmitter3, makeFingerprint as makeFingerprint4, sleep, uuid4 } from "@workglow/util";
728
+ import { createServiceToken as createServiceToken8, EventEmitter as EventEmitter3, makeFingerprint as makeFingerprint4, sleep, uuid4 as uuid42 } from "@workglow/util";
617
729
 
618
730
  // src/queue/IQueueStorage.ts
619
- import { createServiceToken as createServiceToken6 } from "@workglow/util";
620
- var QUEUE_STORAGE = createServiceToken6("jobqueue.storage");
731
+ import { createServiceToken as createServiceToken7 } from "@workglow/util";
732
+ var QUEUE_STORAGE = createServiceToken7("jobqueue.storage");
621
733
  var JobStatus = {
622
734
  PENDING: "PENDING",
623
735
  PROCESSING: "PROCESSING",
@@ -628,7 +740,7 @@ var JobStatus = {
628
740
  };
629
741
 
630
742
  // src/queue/InMemoryQueueStorage.ts
631
- var IN_MEMORY_QUEUE_STORAGE = createServiceToken7("jobqueue.storage.inMemory");
743
+ var IN_MEMORY_QUEUE_STORAGE = createServiceToken8("jobqueue.storage.inMemory");
632
744
 
633
745
  class InMemoryQueueStorage {
634
746
  queueName;
@@ -656,8 +768,8 @@ class InMemoryQueueStorage {
656
768
  await sleep(0);
657
769
  const now = new Date().toISOString();
658
770
  const jobWithPrefixes = job;
659
- jobWithPrefixes.id = jobWithPrefixes.id ?? uuid4();
660
- jobWithPrefixes.job_run_id = jobWithPrefixes.job_run_id ?? uuid4();
771
+ jobWithPrefixes.id = jobWithPrefixes.id ?? uuid42();
772
+ jobWithPrefixes.job_run_id = jobWithPrefixes.job_run_id ?? uuid42();
661
773
  jobWithPrefixes.queue = this.queueName;
662
774
  jobWithPrefixes.fingerprint = await makeFingerprint4(jobWithPrefixes.input);
663
775
  jobWithPrefixes.status = JobStatus.PENDING;
@@ -804,9 +916,9 @@ class InMemoryQueueStorage {
804
916
  return this.events.subscribe("change", filteredCallback);
805
917
  }
806
918
  }
807
- // src/limiter/InMemoryRateLimiterStorage.ts
808
- import { createServiceToken as createServiceToken8, sleep as sleep2 } from "@workglow/util";
809
- var IN_MEMORY_RATE_LIMITER_STORAGE = createServiceToken8("ratelimiter.storage.inMemory");
919
+ // src/queue-limiter/InMemoryRateLimiterStorage.ts
920
+ import { createServiceToken as createServiceToken9, sleep as sleep2 } from "@workglow/util";
921
+ var IN_MEMORY_RATE_LIMITER_STORAGE = createServiceToken9("ratelimiter.storage.inMemory");
810
922
 
811
923
  class InMemoryRateLimiterStorage {
812
924
  prefixValues;
@@ -863,9 +975,9 @@ class InMemoryRateLimiterStorage {
863
975
  this.nextAvailableTimes.delete(key);
864
976
  }
865
977
  }
866
- // src/limiter/IRateLimiterStorage.ts
867
- import { createServiceToken as createServiceToken9 } from "@workglow/util";
868
- var RATE_LIMITER_STORAGE = createServiceToken9("ratelimiter.storage");
978
+ // src/queue-limiter/IRateLimiterStorage.ts
979
+ import { createServiceToken as createServiceToken10 } from "@workglow/util";
980
+ var RATE_LIMITER_STORAGE = createServiceToken10("ratelimiter.storage");
869
981
  // src/util/HybridSubscriptionManager.ts
870
982
  class HybridSubscriptionManager {
871
983
  subscribers = new Set;
@@ -1139,10 +1251,129 @@ class PollingSubscriptionManager {
1139
1251
  this.initialized = false;
1140
1252
  }
1141
1253
  }
1142
- // src/tabular/IndexedDbTabularRepository.ts
1254
+ // src/vector/InMemoryVectorStorage.ts
1255
+ import { cosineSimilarity } from "@workglow/util";
1256
+
1257
+ // src/vector/IVectorStorage.ts
1258
+ function getVectorProperty(schema) {
1259
+ for (const [key, value] of Object.entries(schema.properties)) {
1260
+ if (typeof value !== "boolean" && value.type === "array" && (value.format === "TypedArray" || value.format?.startsWith("TypedArray:"))) {
1261
+ return key;
1262
+ }
1263
+ }
1264
+ return;
1265
+ }
1266
+ function getMetadataProperty(schema) {
1267
+ for (const [key, value] of Object.entries(schema.properties)) {
1268
+ if (typeof value !== "boolean" && value.type === "object" && value.format === "metadata") {
1269
+ return key;
1270
+ }
1271
+ }
1272
+ return;
1273
+ }
1274
+
1275
+ // src/vector/InMemoryVectorStorage.ts
1276
+ function matchesFilter(metadata, filter) {
1277
+ for (const [key, value] of Object.entries(filter)) {
1278
+ if (metadata[key] !== value) {
1279
+ return false;
1280
+ }
1281
+ }
1282
+ return true;
1283
+ }
1284
+ function textRelevance(text, query) {
1285
+ const textLower = text.toLowerCase();
1286
+ const queryLower = query.toLowerCase();
1287
+ const queryWords = queryLower.split(/\s+/).filter((w) => w.length > 0);
1288
+ if (queryWords.length === 0) {
1289
+ return 0;
1290
+ }
1291
+ let matches = 0;
1292
+ for (const word of queryWords) {
1293
+ if (textLower.includes(word)) {
1294
+ matches++;
1295
+ }
1296
+ }
1297
+ return matches / queryWords.length;
1298
+ }
1299
+
1300
+ class InMemoryVectorStorage extends InMemoryTabularStorage {
1301
+ vectorDimensions;
1302
+ VectorType;
1303
+ vectorPropertyName;
1304
+ metadataPropertyName;
1305
+ constructor(schema, primaryKeyNames, indexes = [], dimensions, VectorType = Float32Array) {
1306
+ super(schema, primaryKeyNames, indexes);
1307
+ this.vectorDimensions = dimensions;
1308
+ this.VectorType = VectorType;
1309
+ const vectorProp = getVectorProperty(schema);
1310
+ if (!vectorProp) {
1311
+ throw new Error("Schema must have a property with type array and format TypedArray");
1312
+ }
1313
+ this.vectorPropertyName = vectorProp;
1314
+ this.metadataPropertyName = getMetadataProperty(schema);
1315
+ }
1316
+ getVectorDimensions() {
1317
+ return this.vectorDimensions;
1318
+ }
1319
+ async similaritySearch(query, options = {}) {
1320
+ const { topK = 10, filter, scoreThreshold = 0 } = options;
1321
+ const results = [];
1322
+ const allEntities = await this.getAll() || [];
1323
+ for (const entity of allEntities) {
1324
+ const vector = entity[this.vectorPropertyName];
1325
+ const metadata = this.metadataPropertyName ? entity[this.metadataPropertyName] : {};
1326
+ if (filter && !matchesFilter(metadata, filter)) {
1327
+ continue;
1328
+ }
1329
+ const score = cosineSimilarity(query, vector);
1330
+ if (score < scoreThreshold) {
1331
+ continue;
1332
+ }
1333
+ results.push({
1334
+ ...entity,
1335
+ score
1336
+ });
1337
+ }
1338
+ results.sort((a, b) => b.score - a.score);
1339
+ const topResults = results.slice(0, topK);
1340
+ return topResults;
1341
+ }
1342
+ async hybridSearch(query, options) {
1343
+ const { topK = 10, filter, scoreThreshold = 0, textQuery, vectorWeight = 0.7 } = options;
1344
+ if (!textQuery || textQuery.trim().length === 0) {
1345
+ return this.similaritySearch(query, { topK, filter, scoreThreshold });
1346
+ }
1347
+ const results = [];
1348
+ const allEntities = await this.getAll() || [];
1349
+ for (const entity of allEntities) {
1350
+ const vector = entity[this.vectorPropertyName];
1351
+ const metadata = this.metadataPropertyName ? entity[this.metadataPropertyName] : {};
1352
+ if (filter && !matchesFilter(metadata, filter)) {
1353
+ continue;
1354
+ }
1355
+ const vectorScore = cosineSimilarity(query, vector);
1356
+ const metadataText = Object.values(metadata).join(" ").toLowerCase();
1357
+ const textScore = textRelevance(metadataText, textQuery);
1358
+ const combinedScore = vectorWeight * vectorScore + (1 - vectorWeight) * textScore;
1359
+ if (combinedScore < scoreThreshold) {
1360
+ continue;
1361
+ }
1362
+ results.push({
1363
+ ...entity,
1364
+ score: combinedScore
1365
+ });
1366
+ }
1367
+ results.sort((a, b) => b.score - a.score);
1368
+ const topResults = results.slice(0, topK);
1369
+ return topResults;
1370
+ }
1371
+ }
1372
+ // src/tabular/IndexedDbTabularStorage.ts
1143
1373
  import {
1144
- createServiceToken as createServiceToken10,
1145
- makeFingerprint as makeFingerprint5
1374
+ createServiceToken as createServiceToken11,
1375
+ makeFingerprint as makeFingerprint5,
1376
+ uuid4 as uuid43
1146
1377
  } from "@workglow/util";
1147
1378
 
1148
1379
  // src/util/IndexedDbTable.ts
@@ -1291,7 +1522,7 @@ async function performIncrementalMigration(db, tableName, diff, options = {}) {
1291
1522
  options.onMigrationProgress?.(`Migration complete`, 1);
1292
1523
  });
1293
1524
  }
1294
- async function performDestructiveMigration(db, tableName, primaryKey, expectedIndexes, options = {}) {
1525
+ async function performDestructiveMigration(db, tableName, primaryKey, expectedIndexes, options = {}, autoIncrement = false) {
1295
1526
  if (!options.allowDestructiveMigration) {
1296
1527
  throw new Error(`Destructive migration required for ${tableName} but not allowed. ` + `Primary key has changed. Set allowDestructiveMigration=true to proceed with data loss, ` + `or provide a dataTransformer to migrate data.`);
1297
1528
  }
@@ -1336,7 +1567,7 @@ async function performDestructiveMigration(db, tableName, primaryKey, expectedIn
1336
1567
  if (db2.objectStoreNames.contains(tableName)) {
1337
1568
  db2.deleteObjectStore(tableName);
1338
1569
  }
1339
- const store = db2.createObjectStore(tableName, { keyPath: primaryKey });
1570
+ const store = db2.createObjectStore(tableName, { keyPath: primaryKey, autoIncrement });
1340
1571
  for (const idx of expectedIndexes) {
1341
1572
  store.createIndex(idx.name, idx.keyPath, idx.options);
1342
1573
  }
@@ -1354,7 +1585,7 @@ async function performDestructiveMigration(db, tableName, primaryKey, expectedIn
1354
1585
  options.onMigrationProgress?.(`Destructive migration complete`, 1);
1355
1586
  return newDb;
1356
1587
  }
1357
- async function createNewDatabase(tableName, primaryKey, expectedIndexes, options = {}) {
1588
+ async function createNewDatabase(tableName, primaryKey, expectedIndexes, options = {}, autoIncrement = false) {
1358
1589
  options.onMigrationProgress?.(`Creating new database: ${tableName}`, 0);
1359
1590
  try {
1360
1591
  await deleteIndexedDbTable(tableName);
@@ -1366,7 +1597,7 @@ async function createNewDatabase(tableName, primaryKey, expectedIndexes, options
1366
1597
  if (!db2.objectStoreNames.contains(METADATA_STORE_NAME)) {
1367
1598
  db2.createObjectStore(METADATA_STORE_NAME, { keyPath: "tableName" });
1368
1599
  }
1369
- const store = db2.createObjectStore(tableName, { keyPath: primaryKey });
1600
+ const store = db2.createObjectStore(tableName, { keyPath: primaryKey, autoIncrement });
1370
1601
  for (const idx of expectedIndexes) {
1371
1602
  store.createIndex(idx.name, idx.keyPath, idx.options);
1372
1603
  }
@@ -1382,7 +1613,7 @@ async function createNewDatabase(tableName, primaryKey, expectedIndexes, options
1382
1613
  options.onMigrationProgress?.(`Database created successfully`, 1);
1383
1614
  return db;
1384
1615
  }
1385
- async function ensureIndexedDbTable(tableName, primaryKey, expectedIndexes = [], options = {}) {
1616
+ async function ensureIndexedDbTable(tableName, primaryKey, expectedIndexes = [], options = {}, autoIncrement = false) {
1386
1617
  try {
1387
1618
  let db;
1388
1619
  let wasJustCreated = false;
@@ -1394,7 +1625,7 @@ async function ensureIndexedDbTable(tableName, primaryKey, expectedIndexes = [],
1394
1625
  }
1395
1626
  } catch (err) {
1396
1627
  options.onMigrationProgress?.(`Database ${tableName} does not exist or has version conflict, creating...`, 0);
1397
- return await createNewDatabase(tableName, primaryKey, expectedIndexes, options);
1628
+ return await createNewDatabase(tableName, primaryKey, expectedIndexes, options, autoIncrement);
1398
1629
  }
1399
1630
  if (wasJustCreated) {
1400
1631
  options.onMigrationProgress?.(`Creating new database: ${tableName}`, 0);
@@ -1407,7 +1638,7 @@ async function ensureIndexedDbTable(tableName, primaryKey, expectedIndexes = [],
1407
1638
  if (!db2.objectStoreNames.contains(METADATA_STORE_NAME)) {
1408
1639
  db2.createObjectStore(METADATA_STORE_NAME, { keyPath: "tableName" });
1409
1640
  }
1410
- const store2 = db2.createObjectStore(tableName, { keyPath: primaryKey });
1641
+ const store2 = db2.createObjectStore(tableName, { keyPath: primaryKey, autoIncrement });
1411
1642
  for (const idx of expectedIndexes) {
1412
1643
  store2.createIndex(idx.name, idx.keyPath, idx.options);
1413
1644
  }
@@ -1437,7 +1668,7 @@ async function ensureIndexedDbTable(tableName, primaryKey, expectedIndexes = [],
1437
1668
  if (!db.objectStoreNames.contains(tableName)) {
1438
1669
  options.onMigrationProgress?.(`Object store ${tableName} does not exist, creating...`, 0);
1439
1670
  db.close();
1440
- return await createNewDatabase(tableName, primaryKey, expectedIndexes, options);
1671
+ return await createNewDatabase(tableName, primaryKey, expectedIndexes, options, autoIncrement);
1441
1672
  }
1442
1673
  const transaction = db.transaction(tableName, "readonly");
1443
1674
  const store = transaction.objectStore(tableName);
@@ -1460,7 +1691,7 @@ async function ensureIndexedDbTable(tableName, primaryKey, expectedIndexes = [],
1460
1691
  }
1461
1692
  if (diff.needsObjectStoreRecreation) {
1462
1693
  options.onMigrationProgress?.(`Schema change requires object store recreation for ${tableName}`, 0);
1463
- db = await performDestructiveMigration(db, tableName, primaryKey, expectedIndexes, options);
1694
+ db = await performDestructiveMigration(db, tableName, primaryKey, expectedIndexes, options, autoIncrement);
1464
1695
  } else {
1465
1696
  options.onMigrationProgress?.(`Performing incremental migration for ${tableName}`, 0);
1466
1697
  db = await performIncrementalMigration(db, tableName, diff, options);
@@ -1482,18 +1713,18 @@ async function dropIndexedDbTable(tableName) {
1482
1713
  return deleteIndexedDbTable(tableName);
1483
1714
  }
1484
1715
 
1485
- // src/tabular/IndexedDbTabularRepository.ts
1486
- var IDB_TABULAR_REPOSITORY = createServiceToken10("storage.tabularRepository.indexedDb");
1716
+ // src/tabular/IndexedDbTabularStorage.ts
1717
+ var IDB_TABULAR_REPOSITORY = createServiceToken11("storage.tabularRepository.indexedDb");
1487
1718
 
1488
- class IndexedDbTabularRepository extends TabularRepository {
1719
+ class IndexedDbTabularStorage extends BaseTabularStorage {
1489
1720
  table;
1490
1721
  db;
1491
1722
  setupPromise = null;
1492
1723
  migrationOptions;
1493
1724
  hybridManager = null;
1494
1725
  hybridOptions;
1495
- constructor(table = "tabular_store", schema, primaryKeyNames, indexes = [], migrationOptions = {}) {
1496
- super(schema, primaryKeyNames, indexes);
1726
+ constructor(table = "tabular_store", schema, primaryKeyNames, indexes = [], migrationOptions = {}, clientProvidedKeys = "if-missing") {
1727
+ super(schema, primaryKeyNames, indexes, clientProvidedKeys);
1497
1728
  this.table = table;
1498
1729
  this.migrationOptions = migrationOptions;
1499
1730
  this.hybridOptions = {
@@ -1540,21 +1771,64 @@ class IndexedDbTabularRepository extends TabularRepository {
1540
1771
  });
1541
1772
  }
1542
1773
  const primaryKey = pkColumns.length === 1 ? pkColumns[0] : pkColumns;
1543
- return await ensureIndexedDbTable(this.table, primaryKey, expectedIndexes, this.migrationOptions);
1774
+ const useAutoIncrement = this.hasAutoGeneratedKey() && this.autoGeneratedKeyStrategy === "autoincrement" && pkColumns.length === 1;
1775
+ return await ensureIndexedDbTable(this.table, primaryKey, expectedIndexes, this.migrationOptions, useAutoIncrement);
1776
+ }
1777
+ generateKeyValue(columnName, strategy) {
1778
+ if (strategy === "uuid") {
1779
+ return uuid43();
1780
+ }
1781
+ throw new Error(`IndexedDB autoincrement keys are generated by the database, not client-side. Column: ${columnName}`);
1544
1782
  }
1545
1783
  async put(record) {
1546
1784
  const db = await this.getDb();
1547
- const { key } = this.separateKeyValueFromCombined(record);
1785
+ let recordToStore = record;
1786
+ if (this.hasAutoGeneratedKey() && this.autoGeneratedKeyName) {
1787
+ const keyName = String(this.autoGeneratedKeyName);
1788
+ const clientProvidedValue = record[keyName];
1789
+ const hasClientValue = clientProvidedValue !== undefined && clientProvidedValue !== null;
1790
+ if (this.autoGeneratedKeyStrategy === "uuid") {
1791
+ let shouldGenerate = false;
1792
+ if (this.clientProvidedKeys === "never") {
1793
+ shouldGenerate = true;
1794
+ } else if (this.clientProvidedKeys === "always") {
1795
+ if (!hasClientValue) {
1796
+ throw new Error(`Auto-generated key "${keyName}" is required when clientProvidedKeys is "always"`);
1797
+ }
1798
+ shouldGenerate = false;
1799
+ } else {
1800
+ shouldGenerate = !hasClientValue;
1801
+ }
1802
+ if (shouldGenerate) {
1803
+ const generatedValue = this.generateKeyValue(keyName, "uuid");
1804
+ recordToStore = { ...record, [keyName]: generatedValue };
1805
+ }
1806
+ } else if (this.autoGeneratedKeyStrategy === "autoincrement") {
1807
+ if (this.clientProvidedKeys === "always" && !hasClientValue) {
1808
+ throw new Error(`Auto-generated key "${keyName}" is required when clientProvidedKeys is "always"`);
1809
+ }
1810
+ if (this.clientProvidedKeys === "never") {
1811
+ const { [keyName]: _, ...rest } = record;
1812
+ recordToStore = rest;
1813
+ }
1814
+ }
1815
+ }
1548
1816
  return new Promise((resolve, reject) => {
1549
1817
  const transaction = db.transaction(this.table, "readwrite");
1550
1818
  const store = transaction.objectStore(this.table);
1551
- const request = store.put(record);
1819
+ const request = store.put(recordToStore);
1552
1820
  request.onerror = () => {
1553
1821
  reject(request.error);
1554
1822
  };
1555
1823
  request.onsuccess = () => {
1556
- this.events.emit("put", record);
1557
- resolve(record);
1824
+ if (this.hasAutoGeneratedKey() && this.autoGeneratedKeyName && this.autoGeneratedKeyStrategy === "autoincrement") {
1825
+ const keyName = String(this.autoGeneratedKeyName);
1826
+ if (recordToStore[keyName] === undefined) {
1827
+ recordToStore = { ...recordToStore, [keyName]: request.result };
1828
+ }
1829
+ }
1830
+ this.events.emit("put", recordToStore);
1831
+ resolve(recordToStore);
1558
1832
  };
1559
1833
  transaction.oncomplete = () => {
1560
1834
  this.hybridManager?.notifyLocalChange();
@@ -1562,38 +1836,7 @@ class IndexedDbTabularRepository extends TabularRepository {
1562
1836
  });
1563
1837
  }
1564
1838
  async putBulk(records) {
1565
- const db = await this.getDb();
1566
- return new Promise((resolve, reject) => {
1567
- const transaction = db.transaction(this.table, "readwrite");
1568
- const store = transaction.objectStore(this.table);
1569
- let completed = 0;
1570
- let hasError = false;
1571
- transaction.onerror = () => {
1572
- if (!hasError) {
1573
- hasError = true;
1574
- reject(transaction.error);
1575
- }
1576
- };
1577
- transaction.oncomplete = () => {
1578
- if (!hasError) {
1579
- this.hybridManager?.notifyLocalChange();
1580
- resolve(records);
1581
- }
1582
- };
1583
- for (const record of records) {
1584
- const request = store.put(record);
1585
- request.onsuccess = () => {
1586
- this.events.emit("put", record);
1587
- completed++;
1588
- };
1589
- request.onerror = () => {
1590
- if (!hasError) {
1591
- hasError = true;
1592
- reject(request.error);
1593
- }
1594
- };
1595
- }
1596
- });
1839
+ return await Promise.all(records.map((record) => this.put(record)));
1597
1840
  }
1598
1841
  getPrimaryKeyAsOrderedArray(key) {
1599
1842
  return super.getPrimaryKeyAsOrderedArray(key).map((value) => typeof value === "bigint" ? value.toString() : value);
@@ -1885,20 +2128,22 @@ class IndexedDbTabularRepository extends TabularRepository {
1885
2128
  this.db?.close();
1886
2129
  }
1887
2130
  }
1888
- // src/tabular/SharedInMemoryTabularRepository.ts
1889
- import { createServiceToken as createServiceToken11 } from "@workglow/util";
1890
- var SHARED_IN_MEMORY_TABULAR_REPOSITORY = createServiceToken11("storage.tabularRepository.sharedInMemory");
2131
+ // src/tabular/SharedInMemoryTabularStorage.ts
2132
+ import {
2133
+ createServiceToken as createServiceToken12
2134
+ } from "@workglow/util";
2135
+ var SHARED_IN_MEMORY_TABULAR_REPOSITORY = createServiceToken12("storage.tabularRepository.sharedInMemory");
1891
2136
 
1892
- class SharedInMemoryTabularRepository extends TabularRepository {
2137
+ class SharedInMemoryTabularStorage extends BaseTabularStorage {
1893
2138
  channel = null;
1894
2139
  channelName;
1895
2140
  inMemoryRepo;
1896
2141
  isInitialized = false;
1897
2142
  syncInProgress = false;
1898
- constructor(channelName = "tabular_store", schema, primaryKeyNames, indexes = []) {
1899
- super(schema, primaryKeyNames, indexes);
2143
+ constructor(channelName = "tabular_store", schema, primaryKeyNames, indexes = [], clientProvidedKeys = "if-missing") {
2144
+ super(schema, primaryKeyNames, indexes, clientProvidedKeys);
1900
2145
  this.channelName = channelName;
1901
- this.inMemoryRepo = new InMemoryTabularRepository(schema, primaryKeyNames, indexes);
2146
+ this.inMemoryRepo = new InMemoryTabularStorage(schema, primaryKeyNames, indexes, clientProvidedKeys);
1902
2147
  this.setupEventForwarding();
1903
2148
  this.initializeBroadcastChannel();
1904
2149
  }
@@ -2049,14 +2294,16 @@ class SharedInMemoryTabularRepository extends TabularRepository {
2049
2294
  this.inMemoryRepo.destroy();
2050
2295
  }
2051
2296
  }
2052
- // src/tabular/SupabaseTabularRepository.ts
2053
- import { createServiceToken as createServiceToken12 } from "@workglow/util";
2297
+ // src/tabular/SupabaseTabularStorage.ts
2298
+ import {
2299
+ createServiceToken as createServiceToken13
2300
+ } from "@workglow/util";
2054
2301
 
2055
- // src/tabular/BaseSqlTabularRepository.ts
2056
- class BaseSqlTabularRepository extends TabularRepository {
2302
+ // src/tabular/BaseSqlTabularStorage.ts
2303
+ class BaseSqlTabularStorage extends BaseTabularStorage {
2057
2304
  table;
2058
- constructor(table = "tabular_store", schema, primaryKeyNames, indexes = []) {
2059
- super(schema, primaryKeyNames, indexes);
2305
+ constructor(table = "tabular_store", schema, primaryKeyNames, indexes = [], clientProvidedKeys = "if-missing") {
2306
+ super(schema, primaryKeyNames, indexes, clientProvidedKeys);
2060
2307
  this.table = table;
2061
2308
  this.validateTableAndSchema();
2062
2309
  }
@@ -2235,14 +2482,14 @@ class BaseSqlTabularRepository extends TabularRepository {
2235
2482
  }
2236
2483
  }
2237
2484
 
2238
- // src/tabular/SupabaseTabularRepository.ts
2239
- var SUPABASE_TABULAR_REPOSITORY = createServiceToken12("storage.tabularRepository.supabase");
2485
+ // src/tabular/SupabaseTabularStorage.ts
2486
+ var SUPABASE_TABULAR_REPOSITORY = createServiceToken13("storage.tabularRepository.supabase");
2240
2487
 
2241
- class SupabaseTabularRepository extends BaseSqlTabularRepository {
2488
+ class SupabaseTabularStorage extends BaseSqlTabularStorage {
2242
2489
  client;
2243
2490
  realtimeChannel = null;
2244
- constructor(client, table = "tabular_store", schema, primaryKeyNames, indexes = []) {
2245
- super(table, schema, primaryKeyNames, indexes);
2491
+ constructor(client, table = "tabular_store", schema, primaryKeyNames, indexes = [], clientProvidedKeys = "if-missing") {
2492
+ super(table, schema, primaryKeyNames, indexes, clientProvidedKeys);
2246
2493
  this.client = client;
2247
2494
  }
2248
2495
  async setupDatabase() {
@@ -2369,6 +2616,17 @@ class SupabaseTabularRepository extends BaseSqlTabularRepository {
2369
2616
  }
2370
2617
  constructPrimaryKeyColumns($delimiter = "") {
2371
2618
  const cols = Object.entries(this.primaryKeySchema.properties).map(([key, typeDef]) => {
2619
+ if (this.isAutoGeneratedKey(key)) {
2620
+ if (this.autoGeneratedKeyStrategy === "autoincrement") {
2621
+ const sqlType2 = this.mapTypeToSQL(typeDef);
2622
+ const isSmallInt = sqlType2.includes("SMALLINT");
2623
+ const isBigInt = sqlType2.includes("BIGINT");
2624
+ const serialType = isBigInt ? "BIGSERIAL" : isSmallInt ? "SMALLSERIAL" : "SERIAL";
2625
+ return `${$delimiter}${key}${$delimiter} ${serialType}`;
2626
+ } else if (this.autoGeneratedKeyStrategy === "uuid") {
2627
+ return `${$delimiter}${key}${$delimiter} UUID DEFAULT gen_random_uuid()`;
2628
+ }
2629
+ }
2372
2630
  const sqlType = this.mapTypeToSQL(typeDef);
2373
2631
  let constraints = "NOT NULL";
2374
2632
  if (this.shouldBeUnsigned(typeDef)) {
@@ -2428,7 +2686,27 @@ class SupabaseTabularRepository extends BaseSqlTabularRepository {
2428
2686
  return false;
2429
2687
  }
2430
2688
  async put(entity) {
2431
- const normalizedEntity = { ...entity };
2689
+ let entityToInsert = { ...entity };
2690
+ if (this.hasAutoGeneratedKey() && this.autoGeneratedKeyName) {
2691
+ const keyName = String(this.autoGeneratedKeyName);
2692
+ const clientProvidedValue = entity[keyName];
2693
+ const hasClientValue = clientProvidedValue !== undefined && clientProvidedValue !== null;
2694
+ let shouldOmitKey = false;
2695
+ if (this.clientProvidedKeys === "never") {
2696
+ shouldOmitKey = true;
2697
+ } else if (this.clientProvidedKeys === "always") {
2698
+ if (!hasClientValue) {
2699
+ throw new Error(`Auto-generated key "${keyName}" is required when clientProvidedKeys is "always"`);
2700
+ }
2701
+ shouldOmitKey = false;
2702
+ } else {
2703
+ shouldOmitKey = !hasClientValue;
2704
+ }
2705
+ if (shouldOmitKey) {
2706
+ delete entityToInsert[keyName];
2707
+ }
2708
+ }
2709
+ const normalizedEntity = { ...entityToInsert };
2432
2710
  const requiredSet = new Set(this.valueSchema.required ?? []);
2433
2711
  for (const key in this.valueSchema.properties) {
2434
2712
  if (!(key in normalizedEntity) || normalizedEntity[key] === undefined) {
@@ -2450,29 +2728,7 @@ class SupabaseTabularRepository extends BaseSqlTabularRepository {
2450
2728
  async putBulk(entities) {
2451
2729
  if (entities.length === 0)
2452
2730
  return [];
2453
- const requiredSet = new Set(this.valueSchema.required ?? []);
2454
- const normalizedEntities = entities.map((entity) => {
2455
- const normalized = { ...entity };
2456
- for (const key in this.valueSchema.properties) {
2457
- if (!(key in normalized) || normalized[key] === undefined) {
2458
- if (!requiredSet.has(key)) {
2459
- normalized[key] = null;
2460
- }
2461
- }
2462
- }
2463
- return normalized;
2464
- });
2465
- const { data, error } = await this.client.from(this.table).upsert(normalizedEntities, { onConflict: this.primaryKeyColumnList() }).select();
2466
- if (error)
2467
- throw error;
2468
- const updatedEntities = data;
2469
- for (const entity of updatedEntities) {
2470
- for (const key in this.schema.properties) {
2471
- entity[key] = this.sqlToJsValue(key, entity[key]);
2472
- }
2473
- this.events.emit("put", entity);
2474
- }
2475
- return updatedEntities;
2731
+ return await Promise.all(entities.map((entity) => this.put(entity)));
2476
2732
  }
2477
2733
  async get(key) {
2478
2734
  let query = this.client.from(this.table).select("*");
@@ -2645,24 +2901,24 @@ class SupabaseTabularRepository extends BaseSqlTabularRepository {
2645
2901
  }
2646
2902
  }
2647
2903
  }
2648
- // src/kv/IndexedDbKvRepository.ts
2649
- import { createServiceToken as createServiceToken13 } from "@workglow/util";
2650
- var IDB_KV_REPOSITORY = createServiceToken13("storage.kvRepository.indexedDb");
2904
+ // src/kv/IndexedDbKvStorage.ts
2905
+ import { createServiceToken as createServiceToken14 } from "@workglow/util";
2906
+ var IDB_KV_REPOSITORY = createServiceToken14("storage.kvRepository.indexedDb");
2651
2907
 
2652
- class IndexedDbKvRepository extends KvViaTabularRepository {
2908
+ class IndexedDbKvStorage extends KvViaTabularStorage {
2653
2909
  dbName;
2654
2910
  tabularRepository;
2655
2911
  constructor(dbName, keySchema = { type: "string" }, valueSchema = {}) {
2656
2912
  super(keySchema, valueSchema);
2657
2913
  this.dbName = dbName;
2658
- this.tabularRepository = new IndexedDbTabularRepository(dbName, DefaultKeyValueSchema, DefaultKeyValueKey);
2914
+ this.tabularRepository = new IndexedDbTabularStorage(dbName, DefaultKeyValueSchema, DefaultKeyValueKey);
2659
2915
  }
2660
2916
  }
2661
- // src/kv/SupabaseKvRepository.ts
2662
- import { createServiceToken as createServiceToken14 } from "@workglow/util";
2663
- var SUPABASE_KV_REPOSITORY = createServiceToken14("storage.kvRepository.supabase");
2917
+ // src/kv/SupabaseKvStorage.ts
2918
+ import { createServiceToken as createServiceToken15 } from "@workglow/util";
2919
+ var SUPABASE_KV_REPOSITORY = createServiceToken15("storage.kvRepository.supabase");
2664
2920
 
2665
- class SupabaseKvRepository extends KvViaTabularRepository {
2921
+ class SupabaseKvStorage extends KvViaTabularStorage {
2666
2922
  client;
2667
2923
  tableName;
2668
2924
  tabularRepository;
@@ -2670,12 +2926,12 @@ class SupabaseKvRepository extends KvViaTabularRepository {
2670
2926
  super(keySchema, valueSchema);
2671
2927
  this.client = client;
2672
2928
  this.tableName = tableName;
2673
- this.tabularRepository = tabularRepository ?? new SupabaseTabularRepository(client, tableName, DefaultKeyValueSchema, DefaultKeyValueKey);
2929
+ this.tabularRepository = tabularRepository ?? new SupabaseTabularStorage(client, tableName, DefaultKeyValueSchema, DefaultKeyValueKey);
2674
2930
  }
2675
2931
  }
2676
2932
  // src/queue/IndexedDbQueueStorage.ts
2677
- import { createServiceToken as createServiceToken15, makeFingerprint as makeFingerprint6, uuid4 as uuid42 } from "@workglow/util";
2678
- var INDEXED_DB_QUEUE_STORAGE = createServiceToken15("jobqueue.storage.indexedDb");
2933
+ import { createServiceToken as createServiceToken16, makeFingerprint as makeFingerprint6, uuid4 as uuid44 } from "@workglow/util";
2934
+ var INDEXED_DB_QUEUE_STORAGE = createServiceToken16("jobqueue.storage.indexedDb");
2679
2935
 
2680
2936
  class IndexedDbQueueStorage {
2681
2937
  queueName;
@@ -2755,8 +3011,8 @@ class IndexedDbQueueStorage {
2755
3011
  const db = await this.getDb();
2756
3012
  const now = new Date().toISOString();
2757
3013
  const jobWithPrefixes = job;
2758
- jobWithPrefixes.id = jobWithPrefixes.id ?? uuid42();
2759
- jobWithPrefixes.job_run_id = jobWithPrefixes.job_run_id ?? uuid42();
3014
+ jobWithPrefixes.id = jobWithPrefixes.id ?? uuid44();
3015
+ jobWithPrefixes.job_run_id = jobWithPrefixes.job_run_id ?? uuid44();
2760
3016
  jobWithPrefixes.queue = this.queueName;
2761
3017
  jobWithPrefixes.fingerprint = await makeFingerprint6(jobWithPrefixes.input);
2762
3018
  jobWithPrefixes.status = JobStatus.PENDING;
@@ -3243,8 +3499,8 @@ class IndexedDbQueueStorage {
3243
3499
  }
3244
3500
  }
3245
3501
  // src/queue/SupabaseQueueStorage.ts
3246
- import { createServiceToken as createServiceToken16, makeFingerprint as makeFingerprint7, uuid4 as uuid43 } from "@workglow/util";
3247
- var SUPABASE_QUEUE_STORAGE = createServiceToken16("jobqueue.storage.supabase");
3502
+ import { createServiceToken as createServiceToken17, makeFingerprint as makeFingerprint7, uuid4 as uuid45 } from "@workglow/util";
3503
+ var SUPABASE_QUEUE_STORAGE = createServiceToken17("jobqueue.storage.supabase");
3248
3504
 
3249
3505
  class SupabaseQueueStorage {
3250
3506
  client;
@@ -3360,7 +3616,7 @@ class SupabaseQueueStorage {
3360
3616
  async add(job) {
3361
3617
  const now = new Date().toISOString();
3362
3618
  job.queue = this.queueName;
3363
- job.job_run_id = job.job_run_id ?? uuid43();
3619
+ job.job_run_id = job.job_run_id ?? uuid45();
3364
3620
  job.fingerprint = await makeFingerprint7(job.input);
3365
3621
  job.status = JobStatus.PENDING;
3366
3622
  job.progress = 0;
@@ -3742,9 +3998,9 @@ class SupabaseQueueStorage {
3742
3998
  return manager.subscribe(callback, { intervalMs });
3743
3999
  }
3744
4000
  }
3745
- // src/limiter/IndexedDbRateLimiterStorage.ts
3746
- import { createServiceToken as createServiceToken17 } from "@workglow/util";
3747
- var INDEXED_DB_RATE_LIMITER_STORAGE = createServiceToken17("ratelimiter.storage.indexedDb");
4001
+ // src/queue-limiter/IndexedDbRateLimiterStorage.ts
4002
+ import { createServiceToken as createServiceToken18 } from "@workglow/util";
4003
+ var INDEXED_DB_RATE_LIMITER_STORAGE = createServiceToken18("ratelimiter.storage.indexedDb");
3748
4004
 
3749
4005
  class IndexedDbRateLimiterStorage {
3750
4006
  executionDb;
@@ -3963,9 +4219,9 @@ class IndexedDbRateLimiterStorage {
3963
4219
  });
3964
4220
  }
3965
4221
  }
3966
- // src/limiter/SupabaseRateLimiterStorage.ts
3967
- import { createServiceToken as createServiceToken18 } from "@workglow/util";
3968
- var SUPABASE_RATE_LIMITER_STORAGE = createServiceToken18("ratelimiter.storage.supabase");
4222
+ // src/queue-limiter/SupabaseRateLimiterStorage.ts
4223
+ import { createServiceToken as createServiceToken19 } from "@workglow/util";
4224
+ var SUPABASE_RATE_LIMITER_STORAGE = createServiceToken19("ratelimiter.storage.supabase");
3969
4225
 
3970
4226
  class SupabaseRateLimiterStorage {
3971
4227
  client;
@@ -4117,16 +4373,21 @@ class SupabaseRateLimiterStorage {
4117
4373
  }
4118
4374
  }
4119
4375
  export {
4376
+ registerTabularRepository,
4120
4377
  isSearchCondition,
4378
+ getVectorProperty,
4379
+ getTabularRepository,
4380
+ getMetadataProperty,
4381
+ getGlobalTabularRepositories,
4121
4382
  ensureIndexedDbTable,
4122
4383
  dropIndexedDbTable,
4123
- TabularRepository,
4124
4384
  TABULAR_REPOSITORY,
4125
- SupabaseTabularRepository,
4385
+ TABULAR_REPOSITORIES,
4386
+ SupabaseTabularStorage,
4126
4387
  SupabaseRateLimiterStorage,
4127
4388
  SupabaseQueueStorage,
4128
- SupabaseKvRepository,
4129
- SharedInMemoryTabularRepository,
4389
+ SupabaseKvStorage,
4390
+ SharedInMemoryTabularStorage,
4130
4391
  SUPABASE_TABULAR_REPOSITORY,
4131
4392
  SUPABASE_RATE_LIMITER_STORAGE,
4132
4393
  SUPABASE_QUEUE_STORAGE,
@@ -4137,18 +4398,19 @@ export {
4137
4398
  PollingSubscriptionManager,
4138
4399
  MEMORY_TABULAR_REPOSITORY,
4139
4400
  MEMORY_KV_REPOSITORY,
4140
- KvViaTabularRepository,
4141
- KvRepository,
4401
+ KvViaTabularStorage,
4402
+ KvStorage,
4142
4403
  KV_REPOSITORY,
4143
4404
  JobStatus,
4144
- IndexedDbTabularRepository,
4405
+ IndexedDbTabularStorage,
4145
4406
  IndexedDbRateLimiterStorage,
4146
4407
  IndexedDbQueueStorage,
4147
- IndexedDbKvRepository,
4148
- InMemoryTabularRepository,
4408
+ IndexedDbKvStorage,
4409
+ InMemoryVectorStorage,
4410
+ InMemoryTabularStorage,
4149
4411
  InMemoryRateLimiterStorage,
4150
4412
  InMemoryQueueStorage,
4151
- InMemoryKvRepository,
4413
+ InMemoryKvStorage,
4152
4414
  IN_MEMORY_RATE_LIMITER_STORAGE,
4153
4415
  IN_MEMORY_QUEUE_STORAGE,
4154
4416
  INDEXED_DB_RATE_LIMITER_STORAGE,
@@ -4158,8 +4420,9 @@ export {
4158
4420
  HybridSubscriptionManager,
4159
4421
  DefaultKeyValueSchema,
4160
4422
  DefaultKeyValueKey,
4161
- CachedTabularRepository,
4162
- CACHED_TABULAR_REPOSITORY
4423
+ CachedTabularStorage,
4424
+ CACHED_TABULAR_REPOSITORY,
4425
+ BaseTabularStorage
4163
4426
  };
4164
4427
 
4165
- //# debugId=DD99166332ED2CB564756E2164756E21
4428
+ //# debugId=DD95869160C198CF64756E2164756E21