@rivet-dev/flue 0.0.0-main.79e97f1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +26 -0
  2. package/dist/agent-coordinator.d.ts +89 -0
  3. package/dist/agent-coordinator.d.ts.map +1 -0
  4. package/dist/agent-coordinator.js +346 -0
  5. package/dist/agent-coordinator.js.map +1 -0
  6. package/dist/index.d.ts +4 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +4 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/internal.d.ts +3 -0
  11. package/dist/internal.d.ts.map +1 -0
  12. package/dist/internal.js +2 -0
  13. package/dist/internal.js.map +1 -0
  14. package/dist/registry-ops-async.d.ts +7 -0
  15. package/dist/registry-ops-async.d.ts.map +1 -0
  16. package/dist/registry-ops-async.js +12 -0
  17. package/dist/registry-ops-async.js.map +1 -0
  18. package/dist/rivet-db.d.ts +7 -0
  19. package/dist/rivet-db.d.ts.map +1 -0
  20. package/dist/rivet-db.js +65 -0
  21. package/dist/rivet-db.js.map +1 -0
  22. package/dist/run-store-composite.d.ts +3 -0
  23. package/dist/run-store-composite.d.ts.map +1 -0
  24. package/dist/run-store-composite.js +43 -0
  25. package/dist/run-store-composite.js.map +1 -0
  26. package/dist/runtime.d.ts +8 -0
  27. package/dist/runtime.d.ts.map +1 -0
  28. package/dist/runtime.js +7 -0
  29. package/dist/runtime.js.map +1 -0
  30. package/dist/stores/async-db.d.ts +10 -0
  31. package/dist/stores/async-db.d.ts.map +1 -0
  32. package/dist/stores/async-db.js +5 -0
  33. package/dist/stores/async-db.js.map +1 -0
  34. package/dist/stores/attachment-store.d.ts +4 -0
  35. package/dist/stores/attachment-store.d.ts.map +1 -0
  36. package/dist/stores/attachment-store.js +59 -0
  37. package/dist/stores/attachment-store.js.map +1 -0
  38. package/dist/stores/constants.d.ts +11 -0
  39. package/dist/stores/constants.d.ts.map +1 -0
  40. package/dist/stores/constants.js +11 -0
  41. package/dist/stores/constants.js.map +1 -0
  42. package/dist/stores/conversation-stream-store.d.ts +4 -0
  43. package/dist/stores/conversation-stream-store.d.ts.map +1 -0
  44. package/dist/stores/conversation-stream-store.js +35 -0
  45. package/dist/stores/conversation-stream-store.js.map +1 -0
  46. package/dist/stores/event-stream-store.d.ts +6 -0
  47. package/dist/stores/event-stream-store.d.ts.map +1 -0
  48. package/dist/stores/event-stream-store.js +156 -0
  49. package/dist/stores/event-stream-store.js.map +1 -0
  50. package/dist/stores/helpers.d.ts +2 -0
  51. package/dist/stores/helpers.d.ts.map +1 -0
  52. package/dist/stores/helpers.js +6 -0
  53. package/dist/stores/helpers.js.map +1 -0
  54. package/dist/stores/index.d.ts +11 -0
  55. package/dist/stores/index.d.ts.map +1 -0
  56. package/dist/stores/index.js +23 -0
  57. package/dist/stores/index.js.map +1 -0
  58. package/dist/stores/listener-registry.d.ts +6 -0
  59. package/dist/stores/listener-registry.d.ts.map +1 -0
  60. package/dist/stores/listener-registry.js +27 -0
  61. package/dist/stores/listener-registry.js.map +1 -0
  62. package/dist/stores/run-store.d.ts +4 -0
  63. package/dist/stores/run-store.d.ts.map +1 -0
  64. package/dist/stores/run-store.js +117 -0
  65. package/dist/stores/run-store.js.map +1 -0
  66. package/dist/stores/schema.d.ts +3 -0
  67. package/dist/stores/schema.d.ts.map +1 -0
  68. package/dist/stores/schema.js +241 -0
  69. package/dist/stores/schema.js.map +1 -0
  70. package/dist/stores/submission-store.d.ts +4 -0
  71. package/dist/stores/submission-store.d.ts.map +1 -0
  72. package/dist/stores/submission-store.js +261 -0
  73. package/dist/stores/submission-store.js.map +1 -0
  74. package/dist/target.d.ts +8 -0
  75. package/dist/target.d.ts.map +1 -0
  76. package/dist/target.js +420 -0
  77. package/dist/target.js.map +1 -0
  78. package/dist/workflow-coordinator.d.ts +71 -0
  79. package/dist/workflow-coordinator.d.ts.map +1 -0
  80. package/dist/workflow-coordinator.js +154 -0
  81. package/dist/workflow-coordinator.js.map +1 -0
  82. package/package.json +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rivet-db.js","sourceRoot":"","sources":["../src/rivet-db.ts"],"names":[],"mappings":"AAUA,MAAM,cAAc,GAAG,WAAW,CAAC;AAEnC,MAAM,UAAU,qBAAqB,CAAC,GAAe;IACpD,IAAI,IAAI,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAE5C,MAAM,WAAW,GAAG,KAAK,EACxB,IAAY,EACZ,SAAmC,EAAE,EACZ,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEhF,OAAO;QACN,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,EAAE;YAC5B,2EAA2E;YAC3E,iEAAiE;YACjE,yEAAyE;YACzE,mEAAmE;YACnE,MAAM,IAAI,CAAC;YACX,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,EAAE;YACnB,uEAAuE;YACvE,uEAAuE;YACvE,oEAAoE;YACpE,yDAAyD;YACzD,EAAE;YACF,uEAAuE;YACvE,0EAA0E;YAC1E,0EAA0E;YAC1E,0EAA0E;YAC1E,yEAAyE;YACzE,MAAM,QAAQ,GAAG,IAAI,CAAC;YACtB,IAAI,OAAoB,CAAC;YACzB,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACpC,OAAO,GAAG,OAAO,CAAC;YACnB,CAAC,CAAC,CAAC;YACH,MAAM,QAAQ,CAAC;YACf,IAAI,CAAC;gBACJ,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;oBACrB,OAAO,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CACnC,EAAE,CAAC;wBACF,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,CAC5B,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;qBAClD,CAAC,CACF,CAAC;gBACH,CAAC;gBAED,iEAAiE;gBACjE,mEAAmE;gBACnE,8BAA8B;gBAC9B,MAAM,WAAW,CAAC,aAAa,cAAc,EAAE,CAAC,CAAC;gBACjD,IAAI,CAAC;oBACJ,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;oBAChD,MAAM,WAAW,CAAC,qBAAqB,cAAc,EAAE,CAAC,CAAC;oBACzD,OAAO,MAAM,CAAC;gBACf,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,4DAA4D;oBAC5D,gEAAgE;oBAChE,+DAA+D;oBAC/D,2DAA2D;oBAC3D,MAAM,WAAW,CAAC,yBAAyB,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBAC7E,MAAM,WAAW,CAAC,qBAAqB,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBACzE,MAAM,KAAK,CAAC;gBACb,CAAC;YACF,CAAC;oBAAS,CAAC;gBACV,OAAO,EAAE,CAAC;YACX,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAoB;IAC7C,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RunStore } from '@flue/runtime/adapter-kit';
2
+ export declare function createRivetRunStore(primary: RunStore, mirror?: RunStore): RunStore;
3
+ //# sourceMappingURL=run-store-composite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-store-composite.d.ts","sourceRoot":"","sources":["../src/run-store-composite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAOX,QAAQ,EAER,MAAM,2BAA2B,CAAC;AACnC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAElF"}
@@ -0,0 +1,43 @@
1
+ export function createRivetRunStore(primary, mirror) {
2
+ return new RivetRunStore(primary, mirror);
3
+ }
4
+ class RivetRunStore {
5
+ primary;
6
+ mirror;
7
+ constructor(primary, mirror) {
8
+ this.primary = primary;
9
+ this.mirror = mirror;
10
+ }
11
+ async createRun(input) {
12
+ await this.primary.createRun(input);
13
+ await this.mirrorWrite(() => this.mirror?.createRun(input));
14
+ }
15
+ async endRun(input) {
16
+ await this.primary.endRun(input);
17
+ await this.mirrorWrite(() => this.mirror?.endRun(input));
18
+ }
19
+ getRun(runId) {
20
+ return this.primary.getRun(runId);
21
+ }
22
+ lookupRun(runId) {
23
+ return this.primary.lookupRun(runId);
24
+ }
25
+ listRuns(opts) {
26
+ return this.primary.listRuns(opts);
27
+ }
28
+ async mirrorWrite(write) {
29
+ // The registry index is a best-effort mirror of the authoritative per-actor
30
+ // run record: an index fault must NOT fail run admission or finalization.
31
+ // This mirrors the Cloudflare adapter's `safeIndexWrite` contract
32
+ // (`@flue/runtime` `src/cloudflare/run-store.ts`). RivetKit owns actor
33
+ // readiness; an unavailable registry actor is logged as an index fault
34
+ // rather than hidden behind an adapter-specific retry policy.
35
+ try {
36
+ await write();
37
+ }
38
+ catch (error) {
39
+ console.error('[flue:run-index] mirror write failed:', error);
40
+ }
41
+ }
42
+ }
43
+ //# sourceMappingURL=run-store-composite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-store-composite.js","sourceRoot":"","sources":["../src/run-store-composite.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,mBAAmB,CAAC,OAAiB,EAAE,MAAiB;IACvE,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,aAAa;IACD,OAAO,CAAW;IAClB,MAAM,CAAuB;IAE9C,YAAY,OAAiB,EAAE,MAA4B;QAC1D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAqB;QACpC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC9B,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,SAAS,CAAC,KAAa;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,QAAQ,CAAC,IAAmB;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,KAAyC;QAClE,4EAA4E;QAC5E,0EAA0E;QACzE,kEAAkE;QAClE,uEAAuE;QACvE,uEAAuE;QACvE,8DAA8D;QAC/D,IAAI,CAAC;YACJ,MAAM,KAAK,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,8 @@
1
+ export { createRivetAgentRuntime, type RivetAgentActorContext, type RivetAgentRuntime, type RivetAgentRuntimeOptions, } from './agent-coordinator.js';
2
+ export { createAsyncRegistryOps, type RivetRegistryOps } from './registry-ops-async.js';
3
+ export { createRivetRunStore } from './run-store-composite.js';
4
+ export { createRivetWorkflowRuntime, type RivetWorkflowActorContext, type RivetWorkflowRuntime, type RivetWorkflowRuntimeOptions, } from './workflow-coordinator.js';
5
+ export { createRivetAsyncSqlDb, type RivetRawDb } from './rivet-db.js';
6
+ export { createAsyncAttachmentStore, createAsyncConversationStreamStore, createAsyncEventStreamStore, createAsyncRunStore, createAsyncSqlStores, createAsyncSubmissionStore, ensureAsyncSqlSchema, } from './stores/index.js';
7
+ export type { AsyncSqlDb, AsyncSqlRow, AsyncSqlRunner, AsyncSqlValue } from './stores/index.js';
8
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,uBAAuB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,GAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACN,0BAA0B,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,GAChC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EACN,0BAA0B,EAC1B,kCAAkC,EAClC,2BAA2B,EAC3B,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { createRivetAgentRuntime, } from './agent-coordinator.js';
2
+ export { createAsyncRegistryOps } from './registry-ops-async.js';
3
+ export { createRivetRunStore } from './run-store-composite.js';
4
+ export { createRivetWorkflowRuntime, } from './workflow-coordinator.js';
5
+ export { createRivetAsyncSqlDb } from './rivet-db.js';
6
+ export { createAsyncAttachmentStore, createAsyncConversationStreamStore, createAsyncEventStreamStore, createAsyncRunStore, createAsyncSqlStores, createAsyncSubmissionStore, ensureAsyncSqlSchema, } from './stores/index.js';
7
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,uBAAuB,GAIvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,sBAAsB,EAAyB,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACN,0BAA0B,GAI1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAmB,MAAM,eAAe,CAAC;AACvE,OAAO,EACN,0BAA0B,EAC1B,kCAAkC,EAClC,2BAA2B,EAC3B,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,GACpB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type AsyncSqlValue = string | number | boolean | null;
2
+ export type AsyncSqlRow = Record<string, unknown>;
3
+ export interface AsyncSqlRunner {
4
+ query(text: string, params?: readonly AsyncSqlValue[]): Promise<AsyncSqlRow[]>;
5
+ }
6
+ export interface AsyncSqlDb extends AsyncSqlRunner {
7
+ transaction<T>(fn: (tx: AsyncSqlRunner) => Promise<T>): Promise<T>;
8
+ }
9
+ export declare function queryOne(runner: AsyncSqlRunner, text: string, params?: readonly AsyncSqlValue[]): Promise<AsyncSqlRow | undefined>;
10
+ //# sourceMappingURL=async-db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-db.d.ts","sourceRoot":"","sources":["../../src/stores/async-db.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAC7D,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAElD,MAAM,WAAW,cAAc;IAC9B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,UAAW,SAAQ,cAAc;IACjD,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACnE;AAED,wBAAsB,QAAQ,CAC7B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,GAC/B,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAGlC"}
@@ -0,0 +1,5 @@
1
+ export async function queryOne(runner, text, params) {
2
+ const rows = await runner.query(text, params);
3
+ return rows[0];
4
+ }
5
+ //# sourceMappingURL=async-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-db.js","sourceRoot":"","sources":["../../src/stores/async-db.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,MAAsB,EACtB,IAAY,EACZ,MAAiC;IAEjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { AttachmentStore } from '@flue/runtime/adapter-kit';
2
+ import type { AsyncSqlDb } from './async-db.js';
3
+ export declare function createAsyncAttachmentStore(db: AsyncSqlDb): AttachmentStore;
4
+ //# sourceMappingURL=attachment-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-store.d.ts","sourceRoot":"","sources":["../../src/stores/attachment-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,eAAe,EAGf,MAAM,2BAA2B,CAAC;AAOnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,UAAU,GAAG,eAAe,CAE1E"}
@@ -0,0 +1,59 @@
1
+ import { AttachmentConflictError, attachmentBytesEqual, sameAttachmentRef, verifyAttachmentBytes, } from '@flue/runtime/adapter-kit';
2
+ export function createAsyncAttachmentStore(db) {
3
+ return new AsyncAttachmentStore(db);
4
+ }
5
+ class AsyncAttachmentStore {
6
+ db;
7
+ constructor(db) {
8
+ this.db = db;
9
+ }
10
+ async put(input) {
11
+ await verifyAttachmentBytes(input.attachment, input.bytes);
12
+ const data = Buffer.from(input.bytes).toString('base64');
13
+ await this.db.transaction(async (tx) => {
14
+ await tx.query(`INSERT OR IGNORE INTO flue_attachments
15
+ (stream_path, attachment_id, conversation_id, mime_type, filename, size, digest, data)
16
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [input.streamPath, input.attachment.id, input.conversationId, input.attachment.mimeType,
17
+ input.attachment.filename ?? null, input.attachment.size, input.attachment.digest, data]);
18
+ const rows = await tx.query(`SELECT conversation_id, mime_type, filename, size, digest, data FROM flue_attachments
19
+ WHERE stream_path = ? AND attachment_id = ? LIMIT 1`, [input.streamPath, input.attachment.id]);
20
+ const row = rows[0];
21
+ if (!row)
22
+ throw new Error('[flue] Attachment admission did not create a row.');
23
+ const existing = rowToStored(input.attachment.id, row);
24
+ if (String(row.conversation_id) !== input.conversationId ||
25
+ !sameAttachmentRef(existing.attachment, input.attachment) ||
26
+ !attachmentBytesEqual(existing.bytes, input.bytes)) {
27
+ throw new AttachmentConflictError({
28
+ path: input.streamPath,
29
+ attachmentId: input.attachment.id,
30
+ });
31
+ }
32
+ });
33
+ }
34
+ async get(input) {
35
+ const rows = await this.db.query(`SELECT conversation_id, mime_type, filename, size, digest, data FROM flue_attachments
36
+ WHERE stream_path = ? AND attachment_id = ? LIMIT 1`, [input.streamPath, input.attachmentId]);
37
+ if (!rows[0] || String(rows[0].conversation_id) !== input.conversationId)
38
+ return null;
39
+ const stored = rowToStored(input.attachmentId, rows[0]);
40
+ await verifyAttachmentBytes(stored.attachment, stored.bytes);
41
+ return stored;
42
+ }
43
+ async deleteForInstance(streamPath) {
44
+ await this.db.query(`DELETE FROM flue_attachments WHERE stream_path = ?`, [streamPath]);
45
+ }
46
+ }
47
+ function rowToStored(id, row) {
48
+ return {
49
+ attachment: {
50
+ id,
51
+ mimeType: String(row.mime_type),
52
+ size: Number(row.size),
53
+ digest: String(row.digest),
54
+ ...(typeof row.filename === 'string' ? { filename: row.filename } : {}),
55
+ },
56
+ bytes: Uint8Array.from(Buffer.from(String(row.data), 'base64')),
57
+ };
58
+ }
59
+ //# sourceMappingURL=attachment-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-store.js","sourceRoot":"","sources":["../../src/stores/attachment-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare const FLUE_SCHEMA_VERSION = 2;
2
+ export declare const DURABILITY_DEFAULT_MAX_ATTEMPTS = 10;
3
+ export declare const DURABILITY_DEFAULT_TIMEOUT_MS = 3600000;
4
+ export declare const LEASE_DURATION_MS = 30000;
5
+ export declare const SUBMISSION_HARNESS_NAME = "default";
6
+ export declare const SUBMISSION_SESSION_NAME = "default";
7
+ export declare const DEFAULT_LIST_LIMIT = 100;
8
+ export declare const MAX_LIST_LIMIT = 1000;
9
+ export declare const DEFAULT_READ_LIMIT = 100;
10
+ export declare const MAX_READ_LIMIT = 1000;
11
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/stores/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAClD,eAAO,MAAM,6BAA6B,UAAY,CAAC;AACvD,eAAO,MAAM,iBAAiB,QAAS,CAAC;AAExC,eAAO,MAAM,uBAAuB,YAAY,CAAC;AACjD,eAAO,MAAM,uBAAuB,YAAY,CAAC;AAEjD,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,cAAc,OAAO,CAAC;AACnC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,cAAc,OAAO,CAAC"}
@@ -0,0 +1,11 @@
1
+ export const FLUE_SCHEMA_VERSION = 2;
2
+ export const DURABILITY_DEFAULT_MAX_ATTEMPTS = 10;
3
+ export const DURABILITY_DEFAULT_TIMEOUT_MS = 3_600_000;
4
+ export const LEASE_DURATION_MS = 30_000;
5
+ export const SUBMISSION_HARNESS_NAME = 'default';
6
+ export const SUBMISSION_SESSION_NAME = 'default';
7
+ export const DEFAULT_LIST_LIMIT = 100;
8
+ export const MAX_LIST_LIMIT = 1000;
9
+ export const DEFAULT_READ_LIMIT = 100;
10
+ export const MAX_READ_LIMIT = 1000;
11
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/stores/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAClD,MAAM,CAAC,MAAM,6BAA6B,GAAG,SAAS,CAAC;AACvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAExC,MAAM,CAAC,MAAM,uBAAuB,GAAG,SAAS,CAAC;AACjD,MAAM,CAAC,MAAM,uBAAuB,GAAG,SAAS,CAAC;AAEjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type ConversationStreamStore } from '@flue/runtime/adapter-kit';
2
+ import type { AsyncSqlDb } from './async-db.js';
3
+ export declare function createAsyncConversationStreamStore(db: AsyncSqlDb, notificationScope?: string): ConversationStreamStore;
4
+ //# sourceMappingURL=conversation-stream-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-stream-store.d.ts","sourceRoot":"","sources":["../../src/stores/conversation-stream-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,uBAAuB,EAG5B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,eAAe,CAAC;AAK/D,wBAAgB,kCAAkC,CACjD,EAAE,EAAE,UAAU,EACd,iBAAiB,SAAY,GAC3B,uBAAuB,CAiCzB"}
@@ -0,0 +1,35 @@
1
+ import { defineSqlConversationStreamStore, } from '@flue/runtime/adapter-kit';
2
+ import { ListenerRegistry } from './listener-registry.js';
3
+ const listeners = new ListenerRegistry();
4
+ export function createAsyncConversationStreamStore(db, notificationScope = 'default') {
5
+ const notificationPath = (path) => `${notificationScope}\0${path}`;
6
+ const dialect = {
7
+ placeholder: () => '?',
8
+ lockClause: '',
9
+ insertIgnorePrefix: 'INSERT OR IGNORE',
10
+ insertIgnoreSuffix: '',
11
+ supportsReturning: true,
12
+ query: (sql, params) => db.query(sql, params),
13
+ transaction: (fn) => db.transaction((tx) => fn({
14
+ query: (sql, params) => tx.query(sql, params),
15
+ })),
16
+ };
17
+ const store = defineSqlConversationStreamStore(dialect);
18
+ return {
19
+ createStream: (path, identity) => store.createStream(path, identity),
20
+ acquireProducer: (path, producerId) => store.acquireProducer(path, producerId),
21
+ async append(input) {
22
+ const result = await store.append(input);
23
+ listeners.notify(notificationPath(input.path));
24
+ return result;
25
+ },
26
+ read: (path, options) => store.read(path, options),
27
+ getMeta: (path) => store.getMeta(path),
28
+ async delete(path) {
29
+ await store.delete(path);
30
+ listeners.notify(notificationPath(path));
31
+ },
32
+ subscribe: (path, listener) => listeners.subscribe(notificationPath(path), listener),
33
+ };
34
+ }
35
+ //# sourceMappingURL=conversation-stream-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-stream-store.js","sourceRoot":"","sources":["../../src/stores/conversation-stream-store.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,gCAAgC,GAIhC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEzC,MAAM,UAAU,kCAAkC,CACjD,EAAc,EACd,iBAAiB,GAAG,SAAS;IAE7B,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,iBAAiB,KAAK,IAAI,EAAE,CAAC;IAC3E,MAAM,OAAO,GAA2B;QACvC,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG;QACtB,UAAU,EAAE,EAAE;QACd,kBAAkB,EAAE,kBAAkB;QACtC,kBAAkB,EAAE,EAAE;QACtB,iBAAiB,EAAE,IAAI;QACvB,KAAK,EAAE,CAAC,GAAW,EAAE,MAA0B,EAAE,EAAE,CAClD,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,MAAkC,CAAC;QAClD,WAAW,EAAE,CAAI,EAAgD,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC/F,KAAK,EAAE,CAAC,GAAW,EAAE,MAA0B,EAAE,EAAE,CAClD,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,MAAkC,CAAC;SAClD,CAAC,CAAC;KACH,CAAC;IACF,MAAM,KAAK,GAAG,gCAAgC,CAAC,OAAO,CAAC,CAAC;IACxD,OAAO;QACN,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC;QACpE,eAAe,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC;QAC9E,KAAK,CAAC,MAAM,CAAC,KAAK;YACjB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/C,OAAO,MAAM,CAAC;QACf,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;QAClD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACtC,KAAK,CAAC,MAAM,CAAC,IAAI;YAChB,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAC7B,SAAS,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;KACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { EventStreamStore } from '@flue/runtime/adapter-kit';
2
+ import type { AsyncSqlDb } from './async-db.js';
3
+ export declare function createAsyncEventStreamStore(db: AsyncSqlDb, notificationScope?: string): EventStreamStore;
4
+ export declare function formatOffset(seq: number): string;
5
+ export declare function parseOffset(offset: string): number;
6
+ //# sourceMappingURL=event-stream-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-stream-store.d.ts","sourceRoot":"","sources":["../../src/stores/event-stream-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGX,gBAAgB,EAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAC;AAShE,wBAAgB,2BAA2B,CAC1C,EAAE,EAAE,UAAU,EACd,iBAAiB,SAAY,GAC3B,gBAAgB,CAElB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMlD"}
@@ -0,0 +1,156 @@
1
+ import { DEFAULT_READ_LIMIT, MAX_READ_LIMIT } from './constants.js';
2
+ import { clampLimit } from './helpers.js';
3
+ import { ListenerRegistry } from './listener-registry.js';
4
+ const COMPONENT_PAD = 16;
5
+ const ZERO_COMPONENT = '0'.repeat(COMPONENT_PAD);
6
+ const listeners = new ListenerRegistry();
7
+ export function createAsyncEventStreamStore(db, notificationScope = 'default') {
8
+ return new AsyncEventStreamStore(db, notificationScope);
9
+ }
10
+ export function formatOffset(seq) {
11
+ if (seq === -1)
12
+ return '-1';
13
+ return `${ZERO_COMPONENT}_${String(seq).padStart(COMPONENT_PAD, '0')}`;
14
+ }
15
+ export function parseOffset(offset) {
16
+ if (offset === '-1')
17
+ return -1;
18
+ const match = /^\d+_(\d+)$/.exec(offset);
19
+ const sequence = match?.[1];
20
+ if (!sequence)
21
+ throw new Error(`[flue] Invalid stream offset: "${offset}".`);
22
+ return parseInt(sequence, 10);
23
+ }
24
+ class AsyncEventStreamStore {
25
+ pendingAppends = new Map();
26
+ db;
27
+ notificationScope;
28
+ constructor(db, notificationScope) {
29
+ this.db = db;
30
+ this.notificationScope = notificationScope;
31
+ }
32
+ async createStream(path) {
33
+ await this.db.query(`INSERT OR IGNORE INTO flue_event_streams (path) VALUES (?)`, [path]);
34
+ }
35
+ async appendEvent(path, event) {
36
+ const previous = this.pendingAppends.get(path) ?? Promise.resolve();
37
+ const append = previous.then(async () => {
38
+ const data = JSON.stringify(event);
39
+ const seq = await this.db.transaction(async (tx) => {
40
+ const updated = await tx.query(`UPDATE flue_event_streams
41
+ SET next_offset = next_offset + 1
42
+ WHERE path = ? AND closed = 0
43
+ RETURNING next_offset`, [path]);
44
+ if (updated.length === 0) {
45
+ const meta = await getStreamMetaFromRunner(tx, path);
46
+ if (!meta)
47
+ throw new Error(`[flue] Event stream "${path}" does not exist.`);
48
+ throw new Error(`[flue] Event stream "${path}" is closed.`);
49
+ }
50
+ const offset = Number(updated[0]?.next_offset) - 1;
51
+ await tx.query(`INSERT INTO flue_event_stream_entries (path, seq, data) VALUES (?, ?, ?)`, [path, offset, data]);
52
+ return offset;
53
+ });
54
+ this.notifyListeners(path);
55
+ return formatOffset(seq);
56
+ });
57
+ const settled = append.then(() => undefined, () => undefined);
58
+ this.pendingAppends.set(path, settled);
59
+ try {
60
+ return await append;
61
+ }
62
+ finally {
63
+ if (this.pendingAppends.get(path) === settled) {
64
+ this.pendingAppends.delete(path);
65
+ }
66
+ }
67
+ }
68
+ async appendEventOnce(path, key, event) {
69
+ const data = JSON.stringify(event);
70
+ const result = await this.db.transaction(async (tx) => {
71
+ const existing = await tx.query(`SELECT seq, data FROM flue_event_stream_keys WHERE path = ? AND key = ? LIMIT 1`, [path, key]);
72
+ if (existing[0]) {
73
+ if (existing[0].data !== data) {
74
+ throw new Error(`[flue] Event key "${key}" already has a conflicting payload.`);
75
+ }
76
+ return { offset: Number(existing[0].seq), appended: false };
77
+ }
78
+ const updated = await tx.query(`UPDATE flue_event_streams SET next_offset = next_offset + 1
79
+ WHERE path = ? AND closed = 0 RETURNING next_offset`, [path]);
80
+ if (!updated[0]) {
81
+ const meta = await getStreamMetaFromRunner(tx, path);
82
+ if (!meta)
83
+ throw new Error(`[flue] Event stream "${path}" does not exist.`);
84
+ throw new Error(`[flue] Event stream "${path}" is closed.`);
85
+ }
86
+ const offset = Number(updated[0].next_offset) - 1;
87
+ await tx.query(`INSERT INTO flue_event_stream_entries (path, seq, data) VALUES (?, ?, ?)`, [path, offset, data]);
88
+ await tx.query(`INSERT INTO flue_event_stream_keys (path, key, seq, data) VALUES (?, ?, ?, ?)`, [path, key, offset, data]);
89
+ return { offset, appended: true };
90
+ });
91
+ if (result.appended)
92
+ this.notifyListeners(path);
93
+ return formatOffset(result.offset);
94
+ }
95
+ async readEvents(path, opts) {
96
+ const meta = await this.getStreamMeta(path);
97
+ if (!meta)
98
+ return { events: [], nextOffset: formatOffset(-1), upToDate: true, closed: false };
99
+ const rawOffset = opts?.offset ?? '-1';
100
+ const limit = clampLimit(opts?.limit, DEFAULT_READ_LIMIT, MAX_READ_LIMIT);
101
+ let startAfter;
102
+ if (rawOffset === '-1') {
103
+ startAfter = -1;
104
+ }
105
+ else if (rawOffset === 'now') {
106
+ return { events: [], nextOffset: meta.nextOffset, upToDate: true, closed: meta.closed };
107
+ }
108
+ else {
109
+ startAfter = parseOffset(rawOffset);
110
+ }
111
+ const rows = await this.db.query(`SELECT seq, data FROM flue_event_stream_entries
112
+ WHERE path = ? AND seq > ?
113
+ ORDER BY seq ASC
114
+ LIMIT ?`, [path, startAfter, limit + 1]);
115
+ const page = rows.slice(0, limit);
116
+ const events = page.map((row) => ({
117
+ data: JSON.parse(String(row.data)),
118
+ offset: formatOffset(Number(row.seq)),
119
+ }));
120
+ const lastSeq = page.length > 0 ? Number(page.at(-1)?.seq) : -1;
121
+ return {
122
+ events,
123
+ nextOffset: events.length > 0 ? formatOffset(lastSeq) : formatOffset(startAfter),
124
+ upToDate: rows.length <= limit,
125
+ closed: meta.closed,
126
+ };
127
+ }
128
+ async closeStream(path) {
129
+ await this.db.query(`UPDATE flue_event_streams SET closed = 1 WHERE path = ?`, [path]);
130
+ this.notifyListeners(path);
131
+ }
132
+ async getStreamMeta(path) {
133
+ return getStreamMetaFromRunner(this.db, path);
134
+ }
135
+ subscribe(path, listener) {
136
+ return listeners.subscribe(this.notificationPath(path), listener);
137
+ }
138
+ notifyListeners(path) {
139
+ listeners.notify(this.notificationPath(path));
140
+ }
141
+ notificationPath(path) {
142
+ return `${this.notificationScope}\0${path}`;
143
+ }
144
+ }
145
+ async function getStreamMetaFromRunner(runner, path) {
146
+ const rows = await runner.query(`SELECT next_offset, closed FROM flue_event_streams WHERE path = ? LIMIT 1`, [path]);
147
+ const row = rows[0];
148
+ if (!row)
149
+ return null;
150
+ const writeHead = Number(row.next_offset);
151
+ return {
152
+ nextOffset: formatOffset(writeHead - 1),
153
+ closed: Boolean(row.closed),
154
+ };
155
+ }
156
+ //# sourceMappingURL=event-stream-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-stream-store.js","sourceRoot":"","sources":["../../src/stores/event-stream-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function clampLimit(limit: number | undefined, defaultLimit: number, maxLimit: number): number;
2
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/stores/helpers.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CACzB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACd,MAAM,CAGR"}
@@ -0,0 +1,6 @@
1
+ export function clampLimit(limit, defaultLimit, maxLimit) {
2
+ if (!limit || !Number.isFinite(limit) || limit <= 0)
3
+ return defaultLimit;
4
+ return Math.min(limit, maxLimit);
5
+ }
6
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/stores/helpers.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CACzB,KAAyB,EACzB,YAAoB,EACpB,QAAgB;IAEhB,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC;IACzE,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { PersistenceStores } from '@flue/runtime/adapter-kit';
2
+ import type { AsyncSqlDb } from './async-db.js';
3
+ export type { AsyncSqlDb, AsyncSqlRow, AsyncSqlRunner, AsyncSqlValue } from './async-db.js';
4
+ export { ensureAsyncSqlSchema } from './schema.js';
5
+ export { createAsyncAttachmentStore } from './attachment-store.js';
6
+ export { createAsyncConversationStreamStore } from './conversation-stream-store.js';
7
+ export { createAsyncEventStreamStore } from './event-stream-store.js';
8
+ export { createAsyncRunStore } from './run-store.js';
9
+ export { createAsyncSubmissionStore } from './submission-store.js';
10
+ export declare function createAsyncSqlStores(db: AsyncSqlDb, notificationScope?: string): PersistenceStores;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAOhD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,kCAAkC,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEnE,wBAAgB,oBAAoB,CACnC,EAAE,EAAE,UAAU,EACd,iBAAiB,SAAY,GAC3B,iBAAiB,CAanB"}
@@ -0,0 +1,23 @@
1
+ import { createAsyncAttachmentStore } from './attachment-store.js';
2
+ import { createAsyncConversationStreamStore } from './conversation-stream-store.js';
3
+ import { createAsyncEventStreamStore } from './event-stream-store.js';
4
+ import { createAsyncRunStore } from './run-store.js';
5
+ import { createAsyncSubmissionStore } from './submission-store.js';
6
+ export { ensureAsyncSqlSchema } from './schema.js';
7
+ export { createAsyncAttachmentStore } from './attachment-store.js';
8
+ export { createAsyncConversationStreamStore } from './conversation-stream-store.js';
9
+ export { createAsyncEventStreamStore } from './event-stream-store.js';
10
+ export { createAsyncRunStore } from './run-store.js';
11
+ export { createAsyncSubmissionStore } from './submission-store.js';
12
+ export function createAsyncSqlStores(db, notificationScope = 'default') {
13
+ return {
14
+ executionStore: {
15
+ submissions: createAsyncSubmissionStore(db),
16
+ },
17
+ runStore: createAsyncRunStore(db),
18
+ eventStreamStore: createAsyncEventStreamStore(db, notificationScope),
19
+ conversationStreamStore: createAsyncConversationStreamStore(db, notificationScope),
20
+ attachmentStore: createAsyncAttachmentStore(db),
21
+ };
22
+ }
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,kCAAkC,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAGnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,kCAAkC,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,UAAU,oBAAoB,CACnC,EAAc,EACd,iBAAiB,GAAG,SAAS;IAE7B,OAAO;QACN,cAAc,EAAE;YACf,WAAW,EAAE,0BAA0B,CAAC,EAAE,CAAC;SAC3C;QACD,QAAQ,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACjC,gBAAgB,EAAE,2BAA2B,CAAC,EAAE,EAAE,iBAAiB,CAAC;QACpE,uBAAuB,EAAE,kCAAkC,CAC1D,EAAE,EACF,iBAAiB,CACjB;QACD,eAAe,EAAE,0BAA0B,CAAC,EAAE,CAAC;KAC/C,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare class ListenerRegistry {
2
+ private listeners;
3
+ subscribe(path: string, listener: () => void): () => void;
4
+ notify(path: string): void;
5
+ }
6
+ //# sourceMappingURL=listener-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listener-registry.d.ts","sourceRoot":"","sources":["../../src/stores/listener-registry.ts"],"names":[],"mappings":"AAAA,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,SAAS,CAAsC;IAEvD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAazD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAS1B"}
@@ -0,0 +1,27 @@
1
+ export class ListenerRegistry {
2
+ listeners = new Map();
3
+ subscribe(path, listener) {
4
+ let bucket = this.listeners.get(path);
5
+ if (!bucket) {
6
+ bucket = new Set();
7
+ this.listeners.set(path, bucket);
8
+ }
9
+ bucket.add(listener);
10
+ return () => {
11
+ bucket.delete(listener);
12
+ if (bucket.size === 0)
13
+ this.listeners.delete(path);
14
+ };
15
+ }
16
+ notify(path) {
17
+ for (const listener of this.listeners.get(path) ?? []) {
18
+ try {
19
+ listener();
20
+ }
21
+ catch {
22
+ // Listener failures are intentionally isolated from writes.
23
+ }
24
+ }
25
+ }
26
+ }
27
+ //# sourceMappingURL=listener-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listener-registry.js","sourceRoot":"","sources":["../../src/stores/listener-registry.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,gBAAgB;IACpB,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEvD,SAAS,CAAC,IAAY,EAAE,QAAoB;QAC3C,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrB,OAAO,GAAG,EAAE;YACX,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxB,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAY;QAClB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC;gBACJ,QAAQ,EAAE,CAAC;YACZ,CAAC;YAAC,MAAM,CAAC;gBACR,4DAA4D;YAC7D,CAAC;QACF,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,4 @@
1
+ import type { RunStore } from '@flue/runtime/adapter-kit';
2
+ import type { AsyncSqlDb } from './async-db.js';
3
+ export declare function createAsyncRunStore(db: AsyncSqlDb): RunStore;
4
+ //# sourceMappingURL=run-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-store.d.ts","sourceRoot":"","sources":["../../src/stores/run-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAQX,QAAQ,EAER,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,eAAe,CAAC;AAI7D,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,UAAU,GAAG,QAAQ,CAE5D"}