@revealui/ai 0.2.7 → 0.2.9

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 (220) hide show
  1. package/LICENSE +104 -17
  2. package/README.md +2 -2
  3. package/dist/a2a/card.d.ts +1 -1
  4. package/dist/a2a/card.d.ts.map +1 -1
  5. package/dist/a2a/card.js +4 -4
  6. package/dist/a2a/handler.d.ts +4 -4
  7. package/dist/a2a/handler.js +5 -5
  8. package/dist/a2a/index.d.ts +1 -1
  9. package/dist/a2a/index.js +1 -1
  10. package/dist/audit/emitter.d.ts +1 -1
  11. package/dist/audit/emitter.js +2 -2
  12. package/dist/audit/index.d.ts +2 -2
  13. package/dist/audit/index.js +2 -2
  14. package/dist/audit/store.d.ts +2 -2
  15. package/dist/audit/store.js +2 -2
  16. package/dist/client/errors.d.ts +13 -0
  17. package/dist/client/errors.d.ts.map +1 -0
  18. package/dist/client/errors.js +28 -0
  19. package/dist/client/hooks/useAgentContext.d.ts.map +1 -1
  20. package/dist/client/hooks/useAgentContext.js +6 -5
  21. package/dist/client/hooks/useAgentStream.d.ts +2 -2
  22. package/dist/client/hooks/useAgentStream.js +3 -3
  23. package/dist/client/hooks/useEpisodicMemory.d.ts.map +1 -1
  24. package/dist/client/hooks/useEpisodicMemory.js +6 -5
  25. package/dist/client/hooks/useWorkingMemory.d.ts.map +1 -1
  26. package/dist/client/hooks/useWorkingMemory.js +7 -6
  27. package/dist/embeddings/index.d.ts +1 -1
  28. package/dist/embeddings/index.js +4 -4
  29. package/dist/index.d.ts +1 -2
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +1 -2
  32. package/dist/inference/context-budget.d.ts +1 -1
  33. package/dist/inference/context-budget.js +4 -4
  34. package/dist/inference/index.d.ts +1 -1
  35. package/dist/inference/index.js +1 -1
  36. package/dist/inference/runRag.d.ts +3 -3
  37. package/dist/inference/runRag.d.ts.map +1 -1
  38. package/dist/inference/runRag.js +1 -1
  39. package/dist/inference/task-decomposer.d.ts +1 -1
  40. package/dist/inference/task-decomposer.d.ts.map +1 -1
  41. package/dist/inference/task-decomposer.js +3 -3
  42. package/dist/inference/tool-result-compressor.d.ts +1 -1
  43. package/dist/inference/tool-result-compressor.js +1 -1
  44. package/dist/ingestion/{cms-indexer.d.ts → admin-indexer.d.ts} +12 -12
  45. package/dist/ingestion/admin-indexer.d.ts.map +1 -0
  46. package/dist/ingestion/{cms-indexer.js → admin-indexer.js} +9 -9
  47. package/dist/ingestion/bm25.d.ts +1 -1
  48. package/dist/ingestion/bm25.js +1 -1
  49. package/dist/ingestion/file-parsers.d.ts +1 -1
  50. package/dist/ingestion/file-parsers.d.ts.map +1 -1
  51. package/dist/ingestion/file-parsers.js +36 -17
  52. package/dist/ingestion/hybrid-search.d.ts +1 -1
  53. package/dist/ingestion/hybrid-search.js +1 -1
  54. package/dist/ingestion/index.d.ts +1 -1
  55. package/dist/ingestion/index.d.ts.map +1 -1
  56. package/dist/ingestion/index.js +1 -1
  57. package/dist/ingestion/rag-vector-service.d.ts +1 -1
  58. package/dist/ingestion/rag-vector-service.js +1 -1
  59. package/dist/ingestion/reranker.d.ts +1 -1
  60. package/dist/ingestion/reranker.js +1 -1
  61. package/dist/ingestion/text-splitter.d.ts +1 -1
  62. package/dist/ingestion/text-splitter.js +2 -2
  63. package/dist/llm/cache-utils.d.ts.map +1 -1
  64. package/dist/llm/cache-utils.js +1 -17
  65. package/dist/llm/client.d.ts +8 -13
  66. package/dist/llm/client.d.ts.map +1 -1
  67. package/dist/llm/client.js +12 -60
  68. package/dist/llm/key-validator.d.ts +1 -1
  69. package/dist/llm/key-validator.js +8 -8
  70. package/dist/llm/providers/base.d.ts +2 -2
  71. package/dist/llm/providers/groq.d.ts +2 -2
  72. package/dist/llm/providers/groq.d.ts.map +1 -1
  73. package/dist/llm/providers/groq.js +4 -4
  74. package/dist/llm/providers/inference-snaps.d.ts +5 -5
  75. package/dist/llm/providers/inference-snaps.d.ts.map +1 -1
  76. package/dist/llm/providers/inference-snaps.js +6 -6
  77. package/dist/llm/providers/ollama.d.ts +2 -2
  78. package/dist/llm/providers/ollama.d.ts.map +1 -1
  79. package/dist/llm/providers/ollama.js +3 -3
  80. package/dist/llm/providers/{openai.d.ts → openai-compat.d.ts} +8 -7
  81. package/dist/llm/providers/openai-compat.d.ts.map +1 -0
  82. package/dist/llm/providers/{openai.js → openai-compat.js} +13 -17
  83. package/dist/llm/providers/vultr.d.ts.map +1 -1
  84. package/dist/llm/providers/vultr.js +1 -0
  85. package/dist/llm/server.d.ts +1 -3
  86. package/dist/llm/server.d.ts.map +1 -1
  87. package/dist/llm/server.js +1 -3
  88. package/dist/llm/token-counter.d.ts.map +1 -1
  89. package/dist/llm/token-counter.js +11 -8
  90. package/dist/llm/workspace-provider-config.d.ts +1 -1
  91. package/dist/llm/workspace-provider-config.d.ts.map +1 -1
  92. package/dist/llm/workspace-provider-config.js +1 -1
  93. package/dist/memory/crdt/or-set.d.ts +12 -0
  94. package/dist/memory/crdt/or-set.d.ts.map +1 -1
  95. package/dist/memory/crdt/or-set.js +27 -0
  96. package/dist/memory/index.d.ts +1 -0
  97. package/dist/memory/index.d.ts.map +1 -1
  98. package/dist/memory/index.js +1 -0
  99. package/dist/memory/persistence/crdt-persistence.d.ts +21 -1
  100. package/dist/memory/persistence/crdt-persistence.d.ts.map +1 -1
  101. package/dist/memory/persistence/crdt-persistence.js +67 -0
  102. package/dist/memory/preferences/user-preferences-manager.d.ts.map +1 -1
  103. package/dist/memory/preferences/user-preferences-manager.js +11 -1
  104. package/dist/memory/stores/episodic-memory.js +2 -2
  105. package/dist/memory/stores/working-memory.d.ts +7 -2
  106. package/dist/memory/stores/working-memory.d.ts.map +1 -1
  107. package/dist/memory/stores/working-memory.js +31 -17
  108. package/dist/memory/sync/index.d.ts +2 -0
  109. package/dist/memory/sync/index.d.ts.map +1 -0
  110. package/dist/memory/sync/index.js +1 -0
  111. package/dist/memory/sync/sync-manager.d.ts +104 -0
  112. package/dist/memory/sync/sync-manager.d.ts.map +1 -0
  113. package/dist/memory/sync/sync-manager.js +137 -0
  114. package/dist/memory/utils/validation.js +1 -1
  115. package/dist/memory/vector/vector-memory-service.d.ts +1 -1
  116. package/dist/memory/vector/vector-memory-service.js +1 -1
  117. package/dist/orchestration/agent.d.ts +2 -2
  118. package/dist/orchestration/defaults.d.ts +1 -1
  119. package/dist/orchestration/defaults.js +1 -1
  120. package/dist/orchestration/orchestrator.d.ts +3 -3
  121. package/dist/orchestration/orchestrator.js +3 -3
  122. package/dist/orchestration/runtime.d.ts +1 -1
  123. package/dist/orchestration/runtime.js +1 -1
  124. package/dist/orchestration/streaming-runtime.d.ts +2 -2
  125. package/dist/orchestration/streaming-runtime.js +2 -2
  126. package/dist/orchestration/ticket-agent.d.ts +11 -11
  127. package/dist/orchestration/ticket-agent.d.ts.map +1 -1
  128. package/dist/orchestration/ticket-agent.js +10 -10
  129. package/dist/skills/catalog/vercel-catalog.d.ts.map +1 -1
  130. package/dist/skills/catalog/vercel-catalog.js +7 -4
  131. package/dist/skills/loader/github-loader.d.ts.map +1 -1
  132. package/dist/skills/loader/github-loader.js +2 -0
  133. package/dist/skills/loader/local-loader.js +1 -1
  134. package/dist/skills/loader/vercel-loader.d.ts.map +1 -1
  135. package/dist/skills/loader/vercel-loader.js +2 -0
  136. package/dist/skills/parser/skill-md-parser.js +2 -2
  137. package/dist/skills/registry/skill-registry.js +1 -1
  138. package/dist/skills/types.d.ts +6 -6
  139. package/dist/templates/prompt-spec.js +1 -1
  140. package/dist/templates/skill-spec.js +1 -1
  141. package/dist/tools/{cms → admin}/collection-tools.d.ts +2 -2
  142. package/dist/tools/admin/collection-tools.d.ts.map +1 -0
  143. package/dist/tools/{cms → admin}/collection-tools.js +8 -8
  144. package/dist/tools/{cms → admin}/factory.d.ts +11 -11
  145. package/dist/tools/admin/factory.d.ts.map +1 -0
  146. package/dist/tools/{cms → admin}/factory.js +4 -4
  147. package/dist/tools/{cms → admin}/global-tools.d.ts +1 -1
  148. package/dist/tools/admin/global-tools.d.ts.map +1 -0
  149. package/dist/tools/{cms → admin}/global-tools.js +4 -4
  150. package/dist/tools/{cms → admin}/index.d.ts +4 -4
  151. package/dist/tools/admin/index.d.ts.map +1 -0
  152. package/dist/tools/{cms → admin}/index.js +3 -3
  153. package/dist/tools/{cms → admin}/media-tools.d.ts +1 -1
  154. package/dist/tools/admin/media-tools.d.ts.map +1 -0
  155. package/dist/tools/{cms → admin}/media-tools.js +4 -4
  156. package/dist/tools/{cms → admin}/user-tools.d.ts +1 -1
  157. package/dist/tools/admin/user-tools.d.ts.map +1 -0
  158. package/dist/tools/{cms → admin}/user-tools.js +1 -1
  159. package/dist/tools/coding/file-edit.d.ts +1 -1
  160. package/dist/tools/coding/file-edit.js +2 -2
  161. package/dist/tools/coding/file-glob.d.ts +1 -1
  162. package/dist/tools/coding/file-glob.d.ts.map +1 -1
  163. package/dist/tools/coding/file-glob.js +2 -1
  164. package/dist/tools/coding/file-grep.d.ts +1 -1
  165. package/dist/tools/coding/file-grep.d.ts.map +1 -1
  166. package/dist/tools/coding/file-grep.js +2 -1
  167. package/dist/tools/coding/file-read.d.ts +1 -1
  168. package/dist/tools/coding/file-read.d.ts.map +1 -1
  169. package/dist/tools/coding/file-read.js +15 -9
  170. package/dist/tools/coding/file-write.d.ts +1 -1
  171. package/dist/tools/coding/file-write.js +1 -1
  172. package/dist/tools/coding/git-ops.d.ts +1 -1
  173. package/dist/tools/coding/git-ops.d.ts.map +1 -1
  174. package/dist/tools/coding/git-ops.js +5 -7
  175. package/dist/tools/coding/index.d.ts +1 -1
  176. package/dist/tools/coding/index.d.ts.map +1 -1
  177. package/dist/tools/coding/lint-fix.d.ts +1 -1
  178. package/dist/tools/coding/lint-fix.d.ts.map +1 -1
  179. package/dist/tools/coding/lint-fix.js +8 -4
  180. package/dist/tools/coding/project-context.d.ts +1 -1
  181. package/dist/tools/coding/project-context.d.ts.map +1 -1
  182. package/dist/tools/coding/project-context.js +25 -24
  183. package/dist/tools/coding/safety.d.ts +1 -1
  184. package/dist/tools/coding/safety.d.ts.map +1 -1
  185. package/dist/tools/coding/shell-exec.d.ts +1 -1
  186. package/dist/tools/coding/shell-exec.js +1 -1
  187. package/dist/tools/coding/test-runner.d.ts +1 -1
  188. package/dist/tools/coding/test-runner.d.ts.map +1 -1
  189. package/dist/tools/coding/test-runner.js +12 -7
  190. package/dist/tools/deduplicator.js +1 -1
  191. package/dist/tools/document-summarizer.js +2 -2
  192. package/dist/tools/memory/store-memory.d.ts +1 -1
  193. package/dist/tools/memory/store-memory.js +2 -2
  194. package/dist/tools/ticket-tools.d.ts +2 -2
  195. package/dist/tools/ticket-tools.js +3 -3
  196. package/dist/tools/web/duck-duck-go.d.ts +3 -3
  197. package/dist/tools/web/duck-duck-go.js +4 -4
  198. package/dist/tools/web/exa.d.ts +1 -1
  199. package/dist/tools/web/exa.js +1 -1
  200. package/dist/tools/web/scraper.js +1 -1
  201. package/dist/tools/web/tavily.d.ts +2 -2
  202. package/dist/tools/web/tavily.js +2 -2
  203. package/dist/tools/web/types.d.ts +2 -2
  204. package/dist/tools/web/types.js +2 -2
  205. package/package.json +23 -17
  206. package/LICENSE.commercial +0 -111
  207. package/dist/ingestion/cms-indexer.d.ts.map +0 -1
  208. package/dist/llm/providers/anthropic.d.ts +0 -31
  209. package/dist/llm/providers/anthropic.d.ts.map +0 -1
  210. package/dist/llm/providers/anthropic.js +0 -264
  211. package/dist/llm/providers/bitnet.d.ts +0 -28
  212. package/dist/llm/providers/bitnet.d.ts.map +0 -1
  213. package/dist/llm/providers/bitnet.js +0 -36
  214. package/dist/llm/providers/openai.d.ts.map +0 -1
  215. package/dist/tools/cms/collection-tools.d.ts.map +0 -1
  216. package/dist/tools/cms/factory.d.ts.map +0 -1
  217. package/dist/tools/cms/global-tools.d.ts.map +0 -1
  218. package/dist/tools/cms/index.d.ts.map +0 -1
  219. package/dist/tools/cms/media-tools.d.ts.map +0 -1
  220. package/dist/tools/cms/user-tools.d.ts.map +0 -1
@@ -5,12 +5,10 @@
5
5
  * Use this in API routes and server-side code.
6
6
  */
7
7
  export * from './client.js';
8
- export * from './providers/anthropic.js';
9
8
  export * from './providers/base.js';
10
- export * from './providers/bitnet.js';
11
9
  export * from './providers/groq.js';
12
10
  export * from './providers/inference-snaps.js';
13
11
  export * from './providers/ollama.js';
14
- export * from './providers/openai.js';
12
+ export * from './providers/openai-compat.js';
15
13
  export * from './providers/vultr.js';
16
14
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/llm/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,aAAa,CAAC;AAG5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/llm/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,aAAa,CAAC;AAG5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC"}
@@ -7,11 +7,9 @@
7
7
  // Export LLM client and factory functions
8
8
  export * from './client.js';
9
9
  // Export provider implementations
10
- export * from './providers/anthropic.js';
11
10
  export * from './providers/base.js';
12
- export * from './providers/bitnet.js';
13
11
  export * from './providers/groq.js';
14
12
  export * from './providers/inference-snaps.js';
15
13
  export * from './providers/ollama.js';
16
- export * from './providers/openai.js';
14
+ export * from './providers/openai-compat.js';
17
15
  export * from './providers/vultr.js';
@@ -1 +1 @@
1
- {"version":3,"file":"token-counter.d.ts","sourceRoot":"","sources":["../../src/llm/token-counter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC/B;AA4BD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAGxF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAQjG;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,GAAG,QAAQ,GAC5B,YAAY,CASd;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,MAAM,GACZ;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAI9C"}
1
+ {"version":3,"file":"token-counter.d.ts","sourceRoot":"","sources":["../../src/llm/token-counter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC/B;AAiCD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAGxF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAQjG;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,GAAG,QAAQ,GAC5B,YAAY,CASd;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,MAAM,GACZ;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAI9C"}
@@ -8,7 +8,7 @@
8
8
  * Limitation: actual token counts differ by model tokenizer. This is
9
9
  * accurate enough for budget tracking and context window management.
10
10
  */
11
- // Cost per 1M tokens (USD)input/output pricing
11
+ // Cost per 1M tokens (USD) - input/output pricing
12
12
  const MODEL_PRICING = {
13
13
  // Anthropic
14
14
  'claude-opus-4-6': { input: 15.0, output: 75.0 },
@@ -17,17 +17,20 @@ const MODEL_PRICING = {
17
17
  // OpenAI
18
18
  'gpt-4o': { input: 5.0, output: 15.0 },
19
19
  'gpt-4o-mini': { input: 0.15, output: 0.6 },
20
- // Groq (Llama)
21
- 'llama-3.3-70b-versatile': { input: 0.59, output: 0.79 },
22
- 'llama-3.1-8b-instant': { input: 0.05, output: 0.08 },
23
- // Ollama (self-hosted no cost)
24
- 'llama3.2:3b': { input: 0, output: 0 },
25
- 'llama3.2:1b': { input: 0, output: 0 },
20
+ // Groq (Qwen - Apache 2.0)
21
+ 'qwen/qwen3-32b': { input: 0.59, output: 0.79 },
22
+ // Ollama (self-hosted - no cost)
23
+ 'gemma4:e2b': { input: 0, output: 0 },
24
+ 'gemma4:e4b': { input: 0, output: 0 },
25
+ 'gemma4:26b': { input: 0, output: 0 },
26
26
  'nomic-embed-text': { input: 0, output: 0 },
27
27
  };
28
28
  function charsPerToken(model) {
29
29
  const lower = model.toLowerCase();
30
- if (lower.includes('ollama') || lower.includes('llama') || lower.includes('nomic')) {
30
+ if (lower.includes('ollama') ||
31
+ lower.includes('gemma') ||
32
+ lower.includes('nomic') ||
33
+ lower.includes('qwen')) {
31
34
  return 3.5;
32
35
  }
33
36
  return 4.0;
@@ -33,6 +33,6 @@ export declare class WorkspaceProviderRegistry {
33
33
  */
34
34
  createClientForWorkspace(workspaceId: string, fallback: LLMClient): LLMClient;
35
35
  }
36
- /** Singleton registryuse this in API route handlers */
36
+ /** Singleton registry - use this in API route handlers */
37
37
  export declare const workspaceProviderRegistry: WorkspaceProviderRegistry;
38
38
  //# sourceMappingURL=workspace-provider-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-provider-config.d.ts","sourceRoot":"","sources":["../../src/llm/workspace-provider-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAwB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpF,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,OAAO,CAAmD;IAElE,GAAG,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAI1C,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS;IAI7D,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIjC;;;;;;OAMG;IACH,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,SAAS;CAe9E;AAED,0DAA0D;AAC1D,eAAO,MAAM,yBAAyB,2BAAkC,CAAC"}
1
+ {"version":3,"file":"workspace-provider-config.d.ts","sourceRoot":"","sources":["../../src/llm/workspace-provider-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAwB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpF,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,OAAO,CAAmD;IAElE,GAAG,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAI1C,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS;IAI7D,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIjC;;;;;;OAMG;IACH,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,SAAS;CAe9E;AAED,4DAA4D;AAC5D,eAAO,MAAM,yBAAyB,2BAAkC,CAAC"}
@@ -43,5 +43,5 @@ export class WorkspaceProviderRegistry {
43
43
  return new LLMClient(clientConfig);
44
44
  }
45
45
  }
46
- /** Singleton registryuse this in API route handlers */
46
+ /** Singleton registry - use this in API route handlers */
47
47
  export const workspaceProviderRegistry = new WorkspaceProviderRegistry();
@@ -104,6 +104,18 @@ export declare class ORSet<T> {
104
104
  * @returns A new merged ORSet
105
105
  */
106
106
  merge(other: ORSet<T>): ORSet<T>;
107
+ /**
108
+ * Removes tombstones - entries in `added` whose tag appears in `removed`.
109
+ * Reduces memory usage and serialization size. Safe to call after all peers
110
+ * have merged the corresponding remove operations.
111
+ *
112
+ * @returns Number of tombstones compacted
113
+ */
114
+ compact(): number;
115
+ /**
116
+ * Number of tombstones (removed tags still tracked).
117
+ */
118
+ get tombstoneCount(): number;
107
119
  /**
108
120
  * Clears all elements from the set.
109
121
  */
@@ -1 +1 @@
1
- {"version":3,"file":"or-set.d.ts","sourceRoot":"","sources":["../../../src/memory/crdt/or-set.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,KAAK,CAAC,CAAC;IAClB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAgD;IAC7D,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,KAAK,CAAc;IAE3B;;;OAGG;gBACS,MAAM,EAAE,MAAM;IAO1B;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM;IAUvB;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAS5B;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM;IAcjC;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAS7B;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,EAAE;IAU7B;;;OAGG;IACH,MAAM,IAAI,CAAC,EAAE;IAUb;;;OAGG;IACH,OAAO,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAU7B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAQjB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAkChC;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;;OAGG;IACH,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC;IAkBjB;;;OAGG;IACH,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC;IAkBtB;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAiBhD;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IAI5B;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACH,QAAQ,IAAI,MAAM;CAInB"}
1
+ {"version":3,"file":"or-set.d.ts","sourceRoot":"","sources":["../../../src/memory/crdt/or-set.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,KAAK,CAAC,CAAC;IAClB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAgD;IAC7D,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,KAAK,CAAc;IAE3B;;;OAGG;gBACS,MAAM,EAAE,MAAM;IAO1B;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM;IAUvB;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAS5B;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM;IAcjC;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAS7B;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,EAAE;IAU7B;;;OAGG;IACH,MAAM,IAAI,CAAC,EAAE;IAUb;;;OAGG;IACH,OAAO,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAU7B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAQjB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAkChC;;;;;;OAMG;IACH,OAAO,IAAI,MAAM;IAejB;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;;OAGG;IACH,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC;IAkBjB;;;OAGG;IACH,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC;IAkBtB;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAiBhD;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IAI5B;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACH,QAAQ,IAAI,MAAM;CAInB"}
@@ -198,6 +198,33 @@ export class ORSet {
198
198
  }
199
199
  return merged;
200
200
  }
201
+ /**
202
+ * Removes tombstones - entries in `added` whose tag appears in `removed`.
203
+ * Reduces memory usage and serialization size. Safe to call after all peers
204
+ * have merged the corresponding remove operations.
205
+ *
206
+ * @returns Number of tombstones compacted
207
+ */
208
+ compact() {
209
+ let count = 0;
210
+ for (const tag of this.removed) {
211
+ if (this.added.has(tag)) {
212
+ this.added.delete(tag);
213
+ count++;
214
+ }
215
+ }
216
+ // Clear the removed set - all tombstones have been applied
217
+ if (count > 0) {
218
+ this.removed.clear();
219
+ }
220
+ return count;
221
+ }
222
+ /**
223
+ * Number of tombstones (removed tags still tracked).
224
+ */
225
+ get tombstoneCount() {
226
+ return this.removed.size;
227
+ }
201
228
  /**
202
229
  * Clears all elements from the set.
203
230
  */
@@ -17,5 +17,6 @@ export * from './errors/index.js';
17
17
  export * from './persistence/index.js';
18
18
  export * from './preferences/index.js';
19
19
  export * from './services/index.js';
20
+ export * from './sync/index.js';
20
21
  export * from './vector/index.js';
21
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
@@ -17,4 +17,5 @@ export * from './errors/index.js';
17
17
  export * from './persistence/index.js';
18
18
  export * from './preferences/index.js';
19
19
  export * from './services/index.js';
20
+ export * from './sync/index.js';
20
21
  export * from './vector/index.js';
@@ -5,7 +5,9 @@
5
5
  * Supports both state-based (JSONB) and operation-based (operations log) storage.
6
6
  */
7
7
  import type { Database } from '@revealui/db/client';
8
- import type { LWWRegisterData, ORSetData, PNCounterData } from '../crdt/index.js';
8
+ import { LWWRegister, type LWWRegisterData } from '../crdt/lww-register.js';
9
+ import { ORSet, type ORSetData } from '../crdt/or-set.js';
10
+ import { PNCounter, type PNCounterData } from '../crdt/pn-counter.js';
9
11
  export type CRDTType = 'lww_register' | 'or_set' | 'pn_counter';
10
12
  export type CRDTOperationType = 'set' | 'add' | 'remove' | 'increment' | 'decrement';
11
13
  export interface CRDTOperationPayload {
@@ -81,5 +83,23 @@ export declare class CRDTPersistence {
81
83
  * @returns Map of CRDT key (e.g., "lww_register:context") to serialized data
82
84
  */
83
85
  loadCompositeState(crdtId: string): Promise<Map<string, LWWRegisterData<unknown> | ORSetData<unknown> | PNCounterData>>;
86
+ /**
87
+ * Rebuilds CRDT state by replaying operations from the log.
88
+ *
89
+ * @param crdtId - CRDT instance identifier
90
+ * @param crdtType - Type of CRDT to rebuild
91
+ * @param nodeId - Node ID for the rebuilt CRDT
92
+ * @param since - Optional timestamp to replay from (defaults to 0 = all)
93
+ * @returns Rebuilt CRDT instance, or null if no operations found
94
+ */
95
+ replayOperations(crdtId: string, crdtType: CRDTType, nodeId: string, since?: number): Promise<LWWRegister<unknown> | ORSet<unknown> | PNCounter | null>;
96
+ /**
97
+ * Deletes operations older than a timestamp (for cleanup after compaction).
98
+ *
99
+ * @param crdtId - CRDT instance identifier
100
+ * @param before - Unix timestamp (milliseconds) - delete operations older than this
101
+ * @returns Number of operations deleted
102
+ */
103
+ deleteOperationsBefore(crdtId: string, before: number): Promise<number>;
84
104
  }
85
105
  //# sourceMappingURL=crdt-persistence.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"crdt-persistence.d.ts","sourceRoot":"","sources":["../../../src/memory/persistence/crdt-persistence.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOlF,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,QAAQ,GAAG,YAAY,CAAC;AAChE,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;AAErF,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,iBAAiB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5B,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAMD;;;;;;GAMG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEhC;;;;;;;;;OASG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,aAAa,EACnE,MAAM,GAAE,eAAiC,EACzC,MAAM,GAAE,MAAkB,GACzB,OAAO,CAAC,IAAI,CAAC;IA0ChB;;;;;;OAMG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,aAAa,GAAG,IAAI,CAAC;IAiBhF;;;;OAIG;IACG,eAAe,CAAC,SAAS,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrE;;;;;;OAMG;IACG,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAiBxF;;;;;;;;OAQG;IACG,kBAAkB,CACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,GACjF,OAAO,CAAC,IAAI,CAAC;IAqChB;;;;;OAKG;IACG,kBAAkB,CACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC;CAyBvF"}
1
+ {"version":3,"file":"crdt-persistence.d.ts","sourceRoot":"","sources":["../../../src/memory/persistence/crdt-persistence.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAOtE,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,QAAQ,GAAG,YAAY,CAAC;AAChE,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;AAErF,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,iBAAiB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5B,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAMD;;;;;;GAMG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEhC;;;;;;;;;OASG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,aAAa,EACnE,MAAM,GAAE,eAAiC,EACzC,MAAM,GAAE,MAAkB,GACzB,OAAO,CAAC,IAAI,CAAC;IA0ChB;;;;;;OAMG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,aAAa,GAAG,IAAI,CAAC;IAiBhF;;;;OAIG;IACG,eAAe,CAAC,SAAS,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrE;;;;;;OAMG;IACG,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAiBxF;;;;;;;;OAQG;IACG,kBAAkB,CACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,GACjF,OAAO,CAAC,IAAI,CAAC;IAqChB;;;;;OAKG;IACG,kBAAkB,CACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC;IA0BtF;;;;;;;;OAQG;IACG,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;IA4CpE;;;;;;OAMG;IACG,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAQ9E"}
@@ -7,6 +7,9 @@
7
7
  import { randomUUID } from 'node:crypto';
8
8
  import { agentContexts, crdtOperations } from '@revealui/db/schema';
9
9
  import { and, eq, gte } from 'drizzle-orm';
10
+ import { LWWRegister } from '../crdt/lww-register.js';
11
+ import { ORSet } from '../crdt/or-set.js';
12
+ import { PNCounter } from '../crdt/pn-counter.js';
10
13
  import { findAgentContextById } from '../utils/sql-helpers.js';
11
14
  // =============================================================================
12
15
  // CRDT Persistence
@@ -198,4 +201,68 @@ export class CRDTPersistence {
198
201
  }
199
202
  return result;
200
203
  }
204
+ /**
205
+ * Rebuilds CRDT state by replaying operations from the log.
206
+ *
207
+ * @param crdtId - CRDT instance identifier
208
+ * @param crdtType - Type of CRDT to rebuild
209
+ * @param nodeId - Node ID for the rebuilt CRDT
210
+ * @param since - Optional timestamp to replay from (defaults to 0 = all)
211
+ * @returns Rebuilt CRDT instance, or null if no operations found
212
+ */
213
+ async replayOperations(crdtId, crdtType, nodeId, since = 0) {
214
+ const operations = await this.getOperationsSince(crdtId, since);
215
+ if (operations.length === 0) {
216
+ return null;
217
+ }
218
+ if (crdtType === 'lww_register') {
219
+ const register = new LWWRegister(nodeId, null, 0);
220
+ for (const op of operations) {
221
+ if (op.operationType === 'set') {
222
+ register.set(op.payload.value, op.timestamp);
223
+ }
224
+ }
225
+ return register;
226
+ }
227
+ if (crdtType === 'or_set') {
228
+ const set = new ORSet(nodeId);
229
+ for (const op of operations) {
230
+ if (op.operationType === 'add') {
231
+ set.add(op.payload.value);
232
+ }
233
+ else if (op.operationType === 'remove' && typeof op.payload.tag === 'string') {
234
+ set.remove(op.payload.tag);
235
+ }
236
+ }
237
+ return set;
238
+ }
239
+ if (crdtType === 'pn_counter') {
240
+ const counter = new PNCounter(nodeId);
241
+ for (const op of operations) {
242
+ if (op.operationType === 'increment') {
243
+ counter.increment(typeof op.payload.delta === 'number' ? op.payload.delta : 1);
244
+ }
245
+ else if (op.operationType === 'decrement') {
246
+ counter.decrement(typeof op.payload.delta === 'number' ? op.payload.delta : 1);
247
+ }
248
+ }
249
+ return counter;
250
+ }
251
+ return null;
252
+ }
253
+ /**
254
+ * Deletes operations older than a timestamp (for cleanup after compaction).
255
+ *
256
+ * @param crdtId - CRDT instance identifier
257
+ * @param before - Unix timestamp (milliseconds) - delete operations older than this
258
+ * @returns Number of operations deleted
259
+ */
260
+ async deleteOperationsBefore(crdtId, before) {
261
+ const { lt } = await import('drizzle-orm');
262
+ const result = await this.db
263
+ .delete(crdtOperations)
264
+ .where(and(eq(crdtOperations.crdtId, crdtId), lt(crdtOperations.timestamp, before)))
265
+ .returning();
266
+ return result.length;
267
+ }
201
268
  }
@@ -1 +1 @@
1
- {"version":3,"file":"user-preferences-manager.d.ts","sourceRoot":"","sources":["../../../src/memory/preferences/user-preferences-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAe5E;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,MAAM,CAAkD;IAEhE;;;;;;OAMG;gBACS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ;IAcxD;;;;OAIG;IACH,cAAc,IAAI,eAAe;IAIjC;;;;;OAKG;IACH,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAsB1D;;;;OAIG;IACH,cAAc,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI;IAUlD;;;;;OAKG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAgBnC;;;;;OAKG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAiChD;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,EAAE,sBAAsB,GAAG,sBAAsB;IAM5D;;;;;;;;OAQG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoF3B;;;;;;;;OAQG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+E3B;;;;OAIG;IACH,MAAM,IAAI,eAAe,CAAC,eAAe,CAAC;IAI1C;;;;;;;;OAQG;IACH,MAAM,CAAC,QAAQ,CACb,IAAI,EAAE,eAAe,CAAC,eAAe,CAAC,EACtC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,QAAQ,GACX,sBAAsB;IAMzB;;;;OAIG;IACH,KAAK,IAAI,sBAAsB;IAI/B;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,SAAS,IAAI,MAAM;CAGpB"}
1
+ {"version":3,"file":"user-preferences-manager.d.ts","sourceRoot":"","sources":["../../../src/memory/preferences/user-preferences-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAe5E;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,MAAM,CAAkD;IAEhE;;;;;;OAMG;gBACS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ;IAcxD;;;;OAIG;IACH,cAAc,IAAI,eAAe;IAIjC;;;;;OAKG;IACH,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAsB1D;;;;OAIG;IACH,cAAc,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI;IAUlD;;;;;OAKG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAkBnC;;;;;OAKG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAyChD;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,EAAE,sBAAsB,GAAG,sBAAsB;IAM5D;;;;;;;;OAQG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoF3B;;;;;;;;OAQG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+E3B;;;;OAIG;IACH,MAAM,IAAI,eAAe,CAAC,eAAe,CAAC;IAI1C;;;;;;;;OAQG;IACH,MAAM,CAAC,QAAQ,CACb,IAAI,EAAE,eAAe,CAAC,eAAe,CAAC,EACtC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,QAAQ,GACX,sBAAsB;IAMzB;;;;OAIG;IACH,KAAK,IAAI,sBAAsB;IAI/B;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,SAAS,IAAI,MAAM;CAGpB"}
@@ -114,7 +114,10 @@ export class UserPreferencesManager {
114
114
  const keys = key.split('.');
115
115
  let value = prefs;
116
116
  for (const k of keys) {
117
- if (value && typeof value === 'object' && k in value) {
117
+ // Guard against prototype pollution reads
118
+ if (k === '__proto__' || k === 'constructor' || k === 'prototype')
119
+ return undefined;
120
+ if (value && typeof value === 'object' && Object.hasOwn(value, k)) {
118
121
  value = value[k];
119
122
  }
120
123
  else {
@@ -138,6 +141,13 @@ export class UserPreferencesManager {
138
141
  throw new ValidationError(`Invalid preference key: "${key}"`);
139
142
  }
140
143
  const parentKeys = keys.slice(0, -1);
144
+ // Guard against prototype pollution
145
+ const ForbiddenKeys = new Set(['__proto__', 'constructor', 'prototype']);
146
+ for (const k of keys) {
147
+ if (ForbiddenKeys.has(k)) {
148
+ throw new ValidationError(`Forbidden preference key segment: "${k}"`);
149
+ }
150
+ }
141
151
  // Navigate to parent object in cloned structure
142
152
  let parent = prefs;
143
153
  for (const k of parentKeys) {
@@ -268,9 +268,9 @@ export class EpisodicMemory {
268
268
  }
269
269
  catch (error) {
270
270
  // Embedding generation failed (e.g. embedding service unavailable).
271
- // Return empty resultsdo NOT fall back to getAll(), which would dump the
271
+ // Return empty results - do NOT fall back to getAll(), which would dump the
272
272
  // entire memory store into agent context regardless of relevance.
273
- void (error instanceof Error ? error.message : String(error)); // Semantic search failedreturn empty results
273
+ void (error instanceof Error ? error.message : String(error)); // Semantic search failed - return empty results
274
274
  return [];
275
275
  }
276
276
  }
@@ -12,6 +12,7 @@ import type { AgentDefinition } from '@revealui/contracts/agents';
12
12
  import { type LWWRegisterData } from '../crdt/lww-register.js';
13
13
  import { type ORSetData } from '../crdt/or-set.js';
14
14
  import type { CRDTPersistence } from '../persistence/crdt-persistence.js';
15
+ import type { SyncManager } from '../sync/sync-manager.js';
15
16
  export interface SessionState {
16
17
  status: 'active' | 'paused' | 'completed';
17
18
  focus?: {
@@ -56,19 +57,23 @@ export declare class WorkingMemory {
56
57
  private sessionId;
57
58
  private nodeId;
58
59
  private persistence?;
60
+ private syncManager?;
59
61
  /**
60
62
  * Creates a new WorkingMemory instance.
61
63
  *
62
64
  * @param sessionId - Unique session identifier
63
65
  * @param nodeId - Unique node identifier (for CRDT operations)
64
66
  * @param persistence - Optional persistence adapter
67
+ * @param syncManager - Optional sync manager for operation logging
65
68
  */
66
- constructor(sessionId: string, nodeId: string, persistence?: CRDTPersistence);
69
+ constructor(sessionId: string, nodeId: string, persistence?: CRDTPersistence, syncManager?: SyncManager);
67
70
  /**
68
71
  * Sets the entire context object.
69
72
  *
70
73
  * @param context - Context data to set
71
74
  */
75
+ /** Logs a CRDT operation to the sync manager (fire-and-forget). */
76
+ private logOp;
72
77
  /**
73
78
  * Sets the entire context object.
74
79
  *
@@ -199,7 +204,7 @@ export declare class WorkingMemory {
199
204
  * @param persistence - Optional persistence adapter
200
205
  * @returns New WorkingMemory instance
201
206
  */
202
- static fromData(data: WorkingMemoryData, persistence?: CRDTPersistence): WorkingMemory;
207
+ static fromData(data: WorkingMemoryData, persistence?: CRDTPersistence, syncManager?: SyncManager): WorkingMemory;
203
208
  /**
204
209
  * Creates a copy of this WorkingMemory.
205
210
  *
@@ -1 +1 @@
1
- {"version":3,"file":"working-memory.d.ts","sourceRoot":"","sources":["../../../src/memory/stores/working-memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"working-memory.d.ts","sourceRoot":"","sources":["../../../src/memory/stores/working-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAO3D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC1C,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;QACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,YAAY,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC;IAC5C,YAAY,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;CAC1C;AAMD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAC,CAAkB;IACtC,OAAO,CAAC,WAAW,CAAC,CAAc;IAElC;;;;;;;OAOG;gBAED,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,eAAe,EAC7B,WAAW,CAAC,EAAE,WAAW;IAe3B;;;;OAIG;IACH,mEAAmE;IACnE,OAAO,CAAC,KAAK;IAUb;;;;;;;;;;OAUG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAKlD;;;;OAIG;IACH,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIrC;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI;IAO9D;;;;;OAKG;IACH;;;;;;;;OAQG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAYrC;;;;;;;;OAQG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAOlD;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM;IAMxC;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQjC;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAoBxC;;;;OAIG;IACH,eAAe,IAAI,eAAe,EAAE;IAIpC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIlC;;;;OAIG;IACH,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAOtD;;;;OAIG;IACH,eAAe,IAAI,YAAY;IAI/B;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa;IAW1C;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC3B;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B;;;;OAIG;IACH,MAAM,IAAI,iBAAiB;IAU3B;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,CACb,IAAI,EAAE,iBAAiB,EACvB,WAAW,CAAC,EAAE,eAAe,EAC7B,WAAW,CAAC,EAAE,WAAW,GACxB,aAAa;IAQhB;;;;OAIG;IACH,KAAK,IAAI,aAAa;IAItB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;;;;OAKG;IACH,mBAAmB,IAAI,MAAM;CAG9B"}
@@ -36,17 +36,20 @@ export class WorkingMemory {
36
36
  sessionId;
37
37
  nodeId;
38
38
  persistence;
39
+ syncManager;
39
40
  /**
40
41
  * Creates a new WorkingMemory instance.
41
42
  *
42
43
  * @param sessionId - Unique session identifier
43
44
  * @param nodeId - Unique node identifier (for CRDT operations)
44
45
  * @param persistence - Optional persistence adapter
46
+ * @param syncManager - Optional sync manager for operation logging
45
47
  */
46
- constructor(sessionId, nodeId, persistence) {
48
+ constructor(sessionId, nodeId, persistence, syncManager) {
47
49
  this.sessionId = sessionId;
48
50
  this.nodeId = nodeId;
49
51
  this.persistence = persistence;
52
+ this.syncManager = syncManager;
50
53
  // Initialize CRDTs
51
54
  this.context = new LWWRegister(nodeId, {});
52
55
  this.sessionState = new LWWRegister(nodeId, {
@@ -59,6 +62,13 @@ export class WorkingMemory {
59
62
  *
60
63
  * @param context - Context data to set
61
64
  */
65
+ /** Logs a CRDT operation to the sync manager (fire-and-forget). */
66
+ logOp(crdtType, operationType, payload) {
67
+ if (!this.syncManager)
68
+ return;
69
+ const crdtId = `working-memory:${this.sessionId}`;
70
+ void this.syncManager.logOperation(crdtId, crdtType, operationType, payload);
71
+ }
62
72
  /**
63
73
  * Sets the entire context object.
64
74
  *
@@ -72,6 +82,7 @@ export class WorkingMemory {
72
82
  */
73
83
  setContext(context) {
74
84
  this.context.set(context);
85
+ this.logOp('lww_register', 'set', { value: context, key: 'context' });
75
86
  }
76
87
  /**
77
88
  * Gets the current context.
@@ -89,10 +100,9 @@ export class WorkingMemory {
89
100
  */
90
101
  updateContext(updates) {
91
102
  const current = this.context.get();
92
- this.context.set({
93
- ...current,
94
- ...updates,
95
- });
103
+ const merged = { ...current, ...updates };
104
+ this.context.set(merged);
105
+ this.logOp('lww_register', 'set', { value: merged, key: 'context' });
96
106
  }
97
107
  /**
98
108
  * Gets a specific context value.
@@ -131,10 +141,9 @@ export class WorkingMemory {
131
141
  */
132
142
  setContextValue(key, value) {
133
143
  const current = this.context.get();
134
- this.context.set({
135
- ...current,
136
- [key]: value,
137
- });
144
+ const updated = { ...current, [key]: value };
145
+ this.context.set(updated);
146
+ this.logOp('lww_register', 'set', { value: updated, key: 'context' });
138
147
  }
139
148
  /**
140
149
  * Adds an agent to the active agents set.
@@ -143,7 +152,9 @@ export class WorkingMemory {
143
152
  * @returns Unique tag for this agent addition
144
153
  */
145
154
  addAgent(agent) {
146
- return this.activeAgents.add(agent);
155
+ const tag = this.activeAgents.add(agent);
156
+ this.logOp('or_set', 'add', { value: agent, tag });
157
+ return tag;
147
158
  }
148
159
  /**
149
160
  * Removes an agent by tag.
@@ -152,7 +163,11 @@ export class WorkingMemory {
152
163
  * @returns true if agent was removed
153
164
  */
154
165
  removeAgent(tag) {
155
- return this.activeAgents.remove(tag);
166
+ const removed = this.activeAgents.remove(tag);
167
+ if (removed) {
168
+ this.logOp('or_set', 'remove', { tag });
169
+ }
170
+ return removed;
156
171
  }
157
172
  /**
158
173
  * Removes an agent by ID (removes all instances).
@@ -201,10 +216,9 @@ export class WorkingMemory {
201
216
  */
202
217
  updateSessionState(state) {
203
218
  const current = this.sessionState.get();
204
- this.sessionState.set({
205
- ...current,
206
- ...state,
207
- });
219
+ const merged = { ...current, ...state };
220
+ this.sessionState.set(merged);
221
+ this.logOp('lww_register', 'set', { value: merged, key: 'sessionState' });
208
222
  }
209
223
  /**
210
224
  * Gets the current session state.
@@ -297,8 +311,8 @@ export class WorkingMemory {
297
311
  * @param persistence - Optional persistence adapter
298
312
  * @returns New WorkingMemory instance
299
313
  */
300
- static fromData(data, persistence) {
301
- const memory = new WorkingMemory(data.sessionId, data.nodeId, persistence);
314
+ static fromData(data, persistence, syncManager) {
315
+ const memory = new WorkingMemory(data.sessionId, data.nodeId, persistence, syncManager);
302
316
  memory.context = LWWRegister.fromData(data.context);
303
317
  memory.sessionState = LWWRegister.fromData(data.sessionState);
304
318
  memory.activeAgents = ORSet.fromData(data.activeAgents);
@@ -0,0 +1,2 @@
1
+ export { type SyncDelta, SyncManager, type SyncResult, type SyncState } from './sync-manager.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/memory/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1 @@
1
+ export { SyncManager } from './sync-manager.js';