@revealui/ai 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/LICENSE.commercial +112 -0
- package/README.md +314 -0
- package/dist/a2a/card.d.ts +26 -0
- package/dist/a2a/card.d.ts.map +1 -0
- package/dist/a2a/card.js +173 -0
- package/dist/a2a/handler.d.ts +26 -0
- package/dist/a2a/handler.d.ts.map +1 -0
- package/dist/a2a/handler.js +170 -0
- package/dist/a2a/index.d.ts +10 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +9 -0
- package/dist/a2a/task-store.d.ts +42 -0
- package/dist/a2a/task-store.d.ts.map +1 -0
- package/dist/a2a/task-store.js +99 -0
- package/dist/audit/emitter.d.ts +34 -0
- package/dist/audit/emitter.d.ts.map +1 -0
- package/dist/audit/emitter.js +34 -0
- package/dist/audit/index.d.ts +44 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +48 -0
- package/dist/audit/observer.d.ts +108 -0
- package/dist/audit/observer.d.ts.map +1 -0
- package/dist/audit/observer.js +271 -0
- package/dist/audit/policy.d.ts +70 -0
- package/dist/audit/policy.d.ts.map +1 -0
- package/dist/audit/policy.js +209 -0
- package/dist/audit/store.d.ts +42 -0
- package/dist/audit/store.d.ts.map +1 -0
- package/dist/audit/store.js +80 -0
- package/dist/audit/types.d.ts +169 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +80 -0
- package/dist/client/hooks/index.d.ts +22 -0
- package/dist/client/hooks/index.d.ts.map +1 -0
- package/dist/client/hooks/index.js +21 -0
- package/dist/client/hooks/useAgentContext.d.ts +30 -0
- package/dist/client/hooks/useAgentContext.d.ts.map +1 -0
- package/dist/client/hooks/useAgentContext.js +161 -0
- package/dist/client/hooks/useAgentEvents.d.ts +126 -0
- package/dist/client/hooks/useAgentEvents.d.ts.map +1 -0
- package/dist/client/hooks/useAgentEvents.js +232 -0
- package/dist/client/hooks/useAgentStream.d.ts +44 -0
- package/dist/client/hooks/useAgentStream.d.ts.map +1 -0
- package/dist/client/hooks/useAgentStream.js +101 -0
- package/dist/client/hooks/useEpisodicMemory.d.ts +25 -0
- package/dist/client/hooks/useEpisodicMemory.d.ts.map +1 -0
- package/dist/client/hooks/useEpisodicMemory.js +174 -0
- package/dist/client/hooks/useWorkingMemory.d.ts +57 -0
- package/dist/client/hooks/useWorkingMemory.d.ts.map +1 -0
- package/dist/client/hooks/useWorkingMemory.js +276 -0
- package/dist/client/index.d.ts +14 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +13 -0
- package/dist/embeddings/index.d.ts +51 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +73 -0
- package/dist/index.d.ts +83 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/inference/context-assembly.d.ts +27 -0
- package/dist/inference/context-assembly.d.ts.map +1 -0
- package/dist/inference/context-assembly.js +81 -0
- package/dist/inference/overflow-compressor.d.ts +17 -0
- package/dist/inference/overflow-compressor.d.ts.map +1 -0
- package/dist/inference/overflow-compressor.js +40 -0
- package/dist/inference/runRag.d.ts +35 -0
- package/dist/inference/runRag.d.ts.map +1 -0
- package/dist/inference/runRag.js +53 -0
- package/dist/ingestion/bm25.d.ts +29 -0
- package/dist/ingestion/bm25.d.ts.map +1 -0
- package/dist/ingestion/bm25.js +161 -0
- package/dist/ingestion/cms-indexer.d.ts +39 -0
- package/dist/ingestion/cms-indexer.d.ts.map +1 -0
- package/dist/ingestion/cms-indexer.js +74 -0
- package/dist/ingestion/file-parsers.d.ts +51 -0
- package/dist/ingestion/file-parsers.d.ts.map +1 -0
- package/dist/ingestion/file-parsers.js +247 -0
- package/dist/ingestion/hybrid-search.d.ts +22 -0
- package/dist/ingestion/hybrid-search.d.ts.map +1 -0
- package/dist/ingestion/hybrid-search.js +63 -0
- package/dist/ingestion/index.d.ts +9 -0
- package/dist/ingestion/index.d.ts.map +1 -0
- package/dist/ingestion/index.js +8 -0
- package/dist/ingestion/pipeline.d.ts +35 -0
- package/dist/ingestion/pipeline.d.ts.map +1 -0
- package/dist/ingestion/pipeline.js +114 -0
- package/dist/ingestion/rag-vector-service.d.ts +34 -0
- package/dist/ingestion/rag-vector-service.d.ts.map +1 -0
- package/dist/ingestion/rag-vector-service.js +98 -0
- package/dist/ingestion/reranker.d.ts +10 -0
- package/dist/ingestion/reranker.d.ts.map +1 -0
- package/dist/ingestion/reranker.js +41 -0
- package/dist/ingestion/text-splitter.d.ts +25 -0
- package/dist/ingestion/text-splitter.d.ts.map +1 -0
- package/dist/ingestion/text-splitter.js +119 -0
- package/dist/llm/cache-utils.d.ts +146 -0
- package/dist/llm/cache-utils.d.ts.map +1 -0
- package/dist/llm/cache-utils.js +204 -0
- package/dist/llm/client.d.ts +134 -0
- package/dist/llm/client.d.ts.map +1 -0
- package/dist/llm/client.js +497 -0
- package/dist/llm/key-validator.d.ts +25 -0
- package/dist/llm/key-validator.d.ts.map +1 -0
- package/dist/llm/key-validator.js +101 -0
- package/dist/llm/provider-health.d.ts +40 -0
- package/dist/llm/provider-health.d.ts.map +1 -0
- package/dist/llm/provider-health.js +97 -0
- package/dist/llm/providers/anthropic.d.ts +31 -0
- package/dist/llm/providers/anthropic.d.ts.map +1 -0
- package/dist/llm/providers/anthropic.js +248 -0
- package/dist/llm/providers/base.d.ts +111 -0
- package/dist/llm/providers/base.d.ts.map +1 -0
- package/dist/llm/providers/base.js +6 -0
- package/dist/llm/providers/groq.d.ts +23 -0
- package/dist/llm/providers/groq.d.ts.map +1 -0
- package/dist/llm/providers/groq.js +27 -0
- package/dist/llm/providers/ollama.d.ts +27 -0
- package/dist/llm/providers/ollama.d.ts.map +1 -0
- package/dist/llm/providers/ollama.js +48 -0
- package/dist/llm/providers/openai.d.ts +19 -0
- package/dist/llm/providers/openai.d.ts.map +1 -0
- package/dist/llm/providers/openai.js +245 -0
- package/dist/llm/providers/vultr.d.ts +18 -0
- package/dist/llm/providers/vultr.d.ts.map +1 -0
- package/dist/llm/providers/vultr.js +168 -0
- package/dist/llm/response-cache.d.ts +166 -0
- package/dist/llm/response-cache.d.ts.map +1 -0
- package/dist/llm/response-cache.js +233 -0
- package/dist/llm/semantic-cache.d.ts +179 -0
- package/dist/llm/semantic-cache.d.ts.map +1 -0
- package/dist/llm/semantic-cache.js +306 -0
- package/dist/llm/server.d.ts +14 -0
- package/dist/llm/server.d.ts.map +1 -0
- package/dist/llm/server.js +15 -0
- package/dist/llm/token-counter.d.ts +48 -0
- package/dist/llm/token-counter.d.ts.map +1 -0
- package/dist/llm/token-counter.js +77 -0
- package/dist/llm/workspace-provider-config.d.ts +38 -0
- package/dist/llm/workspace-provider-config.d.ts.map +1 -0
- package/dist/llm/workspace-provider-config.js +47 -0
- package/dist/memory/agent/context-manager.d.ts +148 -0
- package/dist/memory/agent/context-manager.d.ts.map +1 -0
- package/dist/memory/agent/context-manager.js +284 -0
- package/dist/memory/agent/index.d.ts +7 -0
- package/dist/memory/agent/index.d.ts.map +1 -0
- package/dist/memory/agent/index.js +6 -0
- package/dist/memory/crdt/index.d.ts +13 -0
- package/dist/memory/crdt/index.d.ts.map +1 -0
- package/dist/memory/crdt/index.js +12 -0
- package/dist/memory/crdt/lww-register.d.ts +108 -0
- package/dist/memory/crdt/lww-register.d.ts.map +1 -0
- package/dist/memory/crdt/lww-register.js +169 -0
- package/dist/memory/crdt/or-set.d.ts +141 -0
- package/dist/memory/crdt/or-set.d.ts.map +1 -0
- package/dist/memory/crdt/or-set.js +291 -0
- package/dist/memory/crdt/pn-counter.d.ts +116 -0
- package/dist/memory/crdt/pn-counter.d.ts.map +1 -0
- package/dist/memory/crdt/pn-counter.js +174 -0
- package/dist/memory/crdt/vector-clock.d.ts +115 -0
- package/dist/memory/crdt/vector-clock.d.ts.map +1 -0
- package/dist/memory/crdt/vector-clock.js +179 -0
- package/dist/memory/errors/index.d.ts +56 -0
- package/dist/memory/errors/index.d.ts.map +1 -0
- package/dist/memory/errors/index.js +85 -0
- package/dist/memory/index.d.ts +21 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +20 -0
- package/dist/memory/persistence/crdt-persistence.d.ts +85 -0
- package/dist/memory/persistence/crdt-persistence.d.ts.map +1 -0
- package/dist/memory/persistence/crdt-persistence.js +204 -0
- package/dist/memory/persistence/index.d.ts +7 -0
- package/dist/memory/persistence/index.d.ts.map +1 -0
- package/dist/memory/persistence/index.js +6 -0
- package/dist/memory/preferences/index.d.ts +7 -0
- package/dist/memory/preferences/index.d.ts.map +1 -0
- package/dist/memory/preferences/index.js +6 -0
- package/dist/memory/preferences/user-preferences-manager.d.ts +133 -0
- package/dist/memory/preferences/user-preferences-manager.d.ts.map +1 -0
- package/dist/memory/preferences/user-preferences-manager.js +342 -0
- package/dist/memory/services/index.d.ts +8 -0
- package/dist/memory/services/index.d.ts.map +1 -0
- package/dist/memory/services/index.js +6 -0
- package/dist/memory/services/node-id-service.d.ts +75 -0
- package/dist/memory/services/node-id-service.d.ts.map +1 -0
- package/dist/memory/services/node-id-service.js +190 -0
- package/dist/memory/stores/episodic-memory.d.ts +182 -0
- package/dist/memory/stores/episodic-memory.d.ts.map +1 -0
- package/dist/memory/stores/episodic-memory.js +378 -0
- package/dist/memory/stores/index.d.ts +16 -0
- package/dist/memory/stores/index.d.ts.map +1 -0
- package/dist/memory/stores/index.js +15 -0
- package/dist/memory/stores/procedural-memory.d.ts +89 -0
- package/dist/memory/stores/procedural-memory.d.ts.map +1 -0
- package/dist/memory/stores/procedural-memory.js +152 -0
- package/dist/memory/stores/semantic-memory.d.ts +92 -0
- package/dist/memory/stores/semantic-memory.d.ts.map +1 -0
- package/dist/memory/stores/semantic-memory.js +155 -0
- package/dist/memory/stores/working-memory.d.ts +225 -0
- package/dist/memory/stores/working-memory.d.ts.map +1 -0
- package/dist/memory/stores/working-memory.js +336 -0
- package/dist/memory/utils/deep-clone.d.ts +10 -0
- package/dist/memory/utils/deep-clone.d.ts.map +1 -0
- package/dist/memory/utils/deep-clone.js +9 -0
- package/dist/memory/utils/index.d.ts +8 -0
- package/dist/memory/utils/index.d.ts.map +1 -0
- package/dist/memory/utils/index.js +7 -0
- package/dist/memory/utils/logger.d.ts +21 -0
- package/dist/memory/utils/logger.d.ts.map +1 -0
- package/dist/memory/utils/logger.js +62 -0
- package/dist/memory/utils/sql-helpers.d.ts +97 -0
- package/dist/memory/utils/sql-helpers.d.ts.map +1 -0
- package/dist/memory/utils/sql-helpers.js +214 -0
- package/dist/memory/utils/validation.d.ts +62 -0
- package/dist/memory/utils/validation.d.ts.map +1 -0
- package/dist/memory/utils/validation.js +244 -0
- package/dist/memory/vector/index.d.ts +12 -0
- package/dist/memory/vector/index.d.ts.map +1 -0
- package/dist/memory/vector/index.js +14 -0
- package/dist/memory/vector/vector-memory-service.d.ts +88 -0
- package/dist/memory/vector/vector-memory-service.d.ts.map +1 -0
- package/dist/memory/vector/vector-memory-service.js +335 -0
- package/dist/observability/logger.d.ts +79 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +165 -0
- package/dist/observability/metrics.d.ts +43 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +197 -0
- package/dist/observability/query.d.ts +150 -0
- package/dist/observability/query.d.ts.map +1 -0
- package/dist/observability/query.js +339 -0
- package/dist/observability/types.d.ts +140 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +6 -0
- package/dist/orchestration/agent.d.ts +98 -0
- package/dist/orchestration/agent.d.ts.map +1 -0
- package/dist/orchestration/agent.js +6 -0
- package/dist/orchestration/defaults.d.ts +21 -0
- package/dist/orchestration/defaults.d.ts.map +1 -0
- package/dist/orchestration/defaults.js +22 -0
- package/dist/orchestration/memory-integration.d.ts +58 -0
- package/dist/orchestration/memory-integration.d.ts.map +1 -0
- package/dist/orchestration/memory-integration.js +130 -0
- package/dist/orchestration/orchestrator.d.ts +67 -0
- package/dist/orchestration/orchestrator.d.ts.map +1 -0
- package/dist/orchestration/orchestrator.js +174 -0
- package/dist/orchestration/runtime.d.ts +82 -0
- package/dist/orchestration/runtime.d.ts.map +1 -0
- package/dist/orchestration/runtime.js +251 -0
- package/dist/orchestration/streaming-runtime.d.ts +36 -0
- package/dist/orchestration/streaming-runtime.d.ts.map +1 -0
- package/dist/orchestration/streaming-runtime.js +175 -0
- package/dist/orchestration/ticket-agent.d.ts +70 -0
- package/dist/orchestration/ticket-agent.d.ts.map +1 -0
- package/dist/orchestration/ticket-agent.js +146 -0
- package/dist/skills/activation/index.d.ts +7 -0
- package/dist/skills/activation/index.d.ts.map +1 -0
- package/dist/skills/activation/index.js +6 -0
- package/dist/skills/activation/skill-activator.d.ts +68 -0
- package/dist/skills/activation/skill-activator.d.ts.map +1 -0
- package/dist/skills/activation/skill-activator.js +224 -0
- package/dist/skills/catalog/catalog-search.d.ts +55 -0
- package/dist/skills/catalog/catalog-search.d.ts.map +1 -0
- package/dist/skills/catalog/catalog-search.js +111 -0
- package/dist/skills/catalog/catalog-types.d.ts +81 -0
- package/dist/skills/catalog/catalog-types.d.ts.map +1 -0
- package/dist/skills/catalog/catalog-types.js +66 -0
- package/dist/skills/catalog/index.d.ts +9 -0
- package/dist/skills/catalog/index.d.ts.map +1 -0
- package/dist/skills/catalog/index.js +7 -0
- package/dist/skills/catalog/vercel-catalog.d.ts +42 -0
- package/dist/skills/catalog/vercel-catalog.d.ts.map +1 -0
- package/dist/skills/catalog/vercel-catalog.js +189 -0
- package/dist/skills/compat/index.d.ts +9 -0
- package/dist/skills/compat/index.d.ts.map +1 -0
- package/dist/skills/compat/index.js +8 -0
- package/dist/skills/compat/skill-enhancer.d.ts +37 -0
- package/dist/skills/compat/skill-enhancer.d.ts.map +1 -0
- package/dist/skills/compat/skill-enhancer.js +76 -0
- package/dist/skills/compat/tool-mapper.d.ts +61 -0
- package/dist/skills/compat/tool-mapper.d.ts.map +1 -0
- package/dist/skills/compat/tool-mapper.js +168 -0
- package/dist/skills/compat/vercel-compat.d.ts +33 -0
- package/dist/skills/compat/vercel-compat.d.ts.map +1 -0
- package/dist/skills/compat/vercel-compat.js +132 -0
- package/dist/skills/index.d.ts +40 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +47 -0
- package/dist/skills/integration/agent-skill-provider.d.ts +94 -0
- package/dist/skills/integration/agent-skill-provider.d.ts.map +1 -0
- package/dist/skills/integration/agent-skill-provider.js +161 -0
- package/dist/skills/integration/index.d.ts +7 -0
- package/dist/skills/integration/index.d.ts.map +1 -0
- package/dist/skills/integration/index.js +6 -0
- package/dist/skills/loader/github-loader.d.ts +61 -0
- package/dist/skills/loader/github-loader.d.ts.map +1 -0
- package/dist/skills/loader/github-loader.js +176 -0
- package/dist/skills/loader/index.d.ts +10 -0
- package/dist/skills/loader/index.d.ts.map +1 -0
- package/dist/skills/loader/index.js +9 -0
- package/dist/skills/loader/local-loader.d.ts +56 -0
- package/dist/skills/loader/local-loader.d.ts.map +1 -0
- package/dist/skills/loader/local-loader.js +186 -0
- package/dist/skills/loader/vercel-loader.d.ts +64 -0
- package/dist/skills/loader/vercel-loader.d.ts.map +1 -0
- package/dist/skills/loader/vercel-loader.js +313 -0
- package/dist/skills/loader/vercel-types.d.ts +64 -0
- package/dist/skills/loader/vercel-types.d.ts.map +1 -0
- package/dist/skills/loader/vercel-types.js +55 -0
- package/dist/skills/parser/index.d.ts +7 -0
- package/dist/skills/parser/index.d.ts.map +1 -0
- package/dist/skills/parser/index.js +6 -0
- package/dist/skills/parser/skill-md-parser.d.ts +64 -0
- package/dist/skills/parser/skill-md-parser.d.ts.map +1 -0
- package/dist/skills/parser/skill-md-parser.js +242 -0
- package/dist/skills/registry/index.d.ts +7 -0
- package/dist/skills/registry/index.d.ts.map +1 -0
- package/dist/skills/registry/index.js +6 -0
- package/dist/skills/registry/skill-registry.d.ts +133 -0
- package/dist/skills/registry/skill-registry.d.ts.map +1 -0
- package/dist/skills/registry/skill-registry.js +373 -0
- package/dist/skills/types.d.ts +216 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +176 -0
- package/dist/templates/agent-spec.d.ts +138 -0
- package/dist/templates/agent-spec.d.ts.map +1 -0
- package/dist/templates/agent-spec.js +138 -0
- package/dist/templates/index.d.ts +56 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +58 -0
- package/dist/templates/prompt-spec.d.ts +140 -0
- package/dist/templates/prompt-spec.d.ts.map +1 -0
- package/dist/templates/prompt-spec.js +210 -0
- package/dist/templates/skill-spec.d.ts +106 -0
- package/dist/templates/skill-spec.d.ts.map +1 -0
- package/dist/templates/skill-spec.js +119 -0
- package/dist/tools/base.d.ts +74 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +6 -0
- package/dist/tools/cms/collection-tools.d.ts +36 -0
- package/dist/tools/cms/collection-tools.d.ts.map +1 -0
- package/dist/tools/cms/collection-tools.js +178 -0
- package/dist/tools/cms/factory.d.ts +89 -0
- package/dist/tools/cms/factory.d.ts.map +1 -0
- package/dist/tools/cms/factory.js +462 -0
- package/dist/tools/cms/global-tools.d.ts +21 -0
- package/dist/tools/cms/global-tools.d.ts.map +1 -0
- package/dist/tools/cms/global-tools.js +92 -0
- package/dist/tools/cms/index.d.ts +11 -0
- package/dist/tools/cms/index.d.ts.map +1 -0
- package/dist/tools/cms/index.js +11 -0
- package/dist/tools/cms/media-tools.d.ts +31 -0
- package/dist/tools/cms/media-tools.d.ts.map +1 -0
- package/dist/tools/cms/media-tools.js +140 -0
- package/dist/tools/cms/user-tools.d.ts +31 -0
- package/dist/tools/cms/user-tools.d.ts.map +1 -0
- package/dist/tools/cms/user-tools.js +135 -0
- package/dist/tools/deduplicator.d.ts +19 -0
- package/dist/tools/deduplicator.d.ts.map +1 -0
- package/dist/tools/deduplicator.js +53 -0
- package/dist/tools/document-summarizer.d.ts +11 -0
- package/dist/tools/document-summarizer.d.ts.map +1 -0
- package/dist/tools/document-summarizer.js +82 -0
- package/dist/tools/mcp-adapter.d.ts +66 -0
- package/dist/tools/mcp-adapter.d.ts.map +1 -0
- package/dist/tools/mcp-adapter.js +152 -0
- package/dist/tools/memory/index.d.ts +3 -0
- package/dist/tools/memory/index.d.ts.map +1 -0
- package/dist/tools/memory/index.js +1 -0
- package/dist/tools/memory/store-memory.d.ts +39 -0
- package/dist/tools/memory/store-memory.d.ts.map +1 -0
- package/dist/tools/memory/store-memory.js +94 -0
- package/dist/tools/registry.d.ts +14 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +48 -0
- package/dist/tools/ticket-tools.d.ts +31 -0
- package/dist/tools/ticket-tools.d.ts.map +1 -0
- package/dist/tools/ticket-tools.js +74 -0
- package/dist/tools/web/duck-duck-go.d.ts +52 -0
- package/dist/tools/web/duck-duck-go.d.ts.map +1 -0
- package/dist/tools/web/duck-duck-go.js +202 -0
- package/dist/tools/web/exa.d.ts +34 -0
- package/dist/tools/web/exa.d.ts.map +1 -0
- package/dist/tools/web/exa.js +80 -0
- package/dist/tools/web/index.d.ts +6 -0
- package/dist/tools/web/index.d.ts.map +1 -0
- package/dist/tools/web/index.js +4 -0
- package/dist/tools/web/scraper.d.ts +9 -0
- package/dist/tools/web/scraper.d.ts.map +1 -0
- package/dist/tools/web/scraper.js +118 -0
- package/dist/tools/web/tavily.d.ts +32 -0
- package/dist/tools/web/tavily.d.ts.map +1 -0
- package/dist/tools/web/tavily.js +73 -0
- package/dist/tools/web/types.d.ts +31 -0
- package/dist/tools/web/types.d.ts.map +1 -0
- package/dist/tools/web/types.js +9 -0
- package/package.json +143 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory System Errors
|
|
3
|
+
*
|
|
4
|
+
* Custom error classes for the memory system with proper error codes and types.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Base error class for memory system errors
|
|
8
|
+
*/
|
|
9
|
+
export class MemoryError extends Error {
|
|
10
|
+
code;
|
|
11
|
+
statusCode;
|
|
12
|
+
constructor(message, code, statusCode = 500) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = 'MemoryError';
|
|
15
|
+
this.code = code;
|
|
16
|
+
this.statusCode = statusCode;
|
|
17
|
+
// Capture stack trace if available (Node.js/V8 only)
|
|
18
|
+
if (Error.captureStackTrace) {
|
|
19
|
+
Error.captureStackTrace(this, this.constructor);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Database connection errors
|
|
25
|
+
*/
|
|
26
|
+
export class DatabaseConnectionError extends MemoryError {
|
|
27
|
+
constructor(message = 'Database connection failed', originalError) {
|
|
28
|
+
super(originalError ? `${message}: ${originalError.message}` : message, 'DB_CONNECTION_ERROR', 503);
|
|
29
|
+
this.name = 'DatabaseConnectionError';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Database constraint violation errors
|
|
34
|
+
*/
|
|
35
|
+
export class DatabaseConstraintError extends MemoryError {
|
|
36
|
+
constructor(message = 'Database constraint violation', originalError) {
|
|
37
|
+
super(originalError ? `${message}: ${originalError.message}` : message, 'DB_CONSTRAINT_ERROR', 409);
|
|
38
|
+
this.name = 'DatabaseConstraintError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Database query/operation errors
|
|
43
|
+
*/
|
|
44
|
+
export class DatabaseOperationError extends MemoryError {
|
|
45
|
+
constructor(message = 'Database operation failed', originalError) {
|
|
46
|
+
super(originalError ? `${message}: ${originalError.message}` : message, 'DB_OPERATION_ERROR', 500);
|
|
47
|
+
this.name = 'DatabaseOperationError';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Validation errors
|
|
52
|
+
*/
|
|
53
|
+
export class ValidationError extends MemoryError {
|
|
54
|
+
constructor(message) {
|
|
55
|
+
super(message, 'VALIDATION_ERROR', 400);
|
|
56
|
+
this.name = 'ValidationError';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Not found errors
|
|
61
|
+
*/
|
|
62
|
+
export class NotFoundError extends MemoryError {
|
|
63
|
+
constructor(resource) {
|
|
64
|
+
super(`${resource} not found`, 'NOT_FOUND', 404);
|
|
65
|
+
this.name = 'NotFoundError';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Configuration errors
|
|
70
|
+
*/
|
|
71
|
+
export class ConfigurationError extends MemoryError {
|
|
72
|
+
constructor(message) {
|
|
73
|
+
super(message, 'CONFIGURATION_ERROR', 500);
|
|
74
|
+
this.name = 'ConfigurationError';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Data migration errors
|
|
79
|
+
*/
|
|
80
|
+
export class MigrationError extends MemoryError {
|
|
81
|
+
constructor(message) {
|
|
82
|
+
super(message, 'MIGRATION_ERROR', 400);
|
|
83
|
+
this.name = 'MigrationError';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @revealui/ai/memory - Memory System (Server-side)
|
|
3
|
+
*
|
|
4
|
+
* CRDT-based persistent memory system:
|
|
5
|
+
* - CRDT data structures (LWW Register, OR-Set, Counter)
|
|
6
|
+
* - Memory management (Working, Episodic memory)
|
|
7
|
+
* - Vector similarity search
|
|
8
|
+
*
|
|
9
|
+
* These are server-side implementations that can be used
|
|
10
|
+
* in Node.js, Edge Functions, and server components.
|
|
11
|
+
*
|
|
12
|
+
* @packageDocumentation
|
|
13
|
+
*/
|
|
14
|
+
export * from './agent/index.js';
|
|
15
|
+
export * from './crdt/index.js';
|
|
16
|
+
export * from './errors/index.js';
|
|
17
|
+
export * from './persistence/index.js';
|
|
18
|
+
export * from './preferences/index.js';
|
|
19
|
+
export * from './services/index.js';
|
|
20
|
+
export * from './vector/index.js';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @revealui/ai/memory - Memory System (Server-side)
|
|
3
|
+
*
|
|
4
|
+
* CRDT-based persistent memory system:
|
|
5
|
+
* - CRDT data structures (LWW Register, OR-Set, Counter)
|
|
6
|
+
* - Memory management (Working, Episodic memory)
|
|
7
|
+
* - Vector similarity search
|
|
8
|
+
*
|
|
9
|
+
* These are server-side implementations that can be used
|
|
10
|
+
* in Node.js, Edge Functions, and server components.
|
|
11
|
+
*
|
|
12
|
+
* @packageDocumentation
|
|
13
|
+
*/
|
|
14
|
+
export * from './agent/index.js';
|
|
15
|
+
export * from './crdt/index.js';
|
|
16
|
+
export * from './errors/index.js';
|
|
17
|
+
export * from './persistence/index.js';
|
|
18
|
+
export * from './preferences/index.js';
|
|
19
|
+
export * from './services/index.js';
|
|
20
|
+
export * from './vector/index.js';
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRDT Persistence Adapter
|
|
3
|
+
*
|
|
4
|
+
* Generic adapter for saving/loading CRDT state to/from database.
|
|
5
|
+
* Supports both state-based (JSONB) and operation-based (operations log) storage.
|
|
6
|
+
*/
|
|
7
|
+
import type { Database } from '@revealui/db/client';
|
|
8
|
+
import type { LWWRegisterData, ORSetData, PNCounterData } from '../crdt/index.js';
|
|
9
|
+
export type CRDTType = 'lww_register' | 'or_set' | 'pn_counter';
|
|
10
|
+
export type CRDTOperationType = 'set' | 'add' | 'remove' | 'increment' | 'decrement';
|
|
11
|
+
export interface CRDTOperationPayload {
|
|
12
|
+
crdtId: string;
|
|
13
|
+
crdtType: CRDTType;
|
|
14
|
+
operationType: CRDTOperationType;
|
|
15
|
+
payload: Record<string, unknown>;
|
|
16
|
+
nodeId: string;
|
|
17
|
+
timestamp: number;
|
|
18
|
+
}
|
|
19
|
+
export interface CRDTStateData {
|
|
20
|
+
lww_register?: LWWRegisterData<unknown>;
|
|
21
|
+
or_set?: ORSetData<unknown>;
|
|
22
|
+
pn_counter?: PNCounterData;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Persistence adapter for CRDT operations.
|
|
26
|
+
*
|
|
27
|
+
* Supports:
|
|
28
|
+
* - State-based storage (JSONB in existing tables)
|
|
29
|
+
* - Operation-based storage (crdt_operations table)
|
|
30
|
+
*/
|
|
31
|
+
export declare class CRDTPersistence {
|
|
32
|
+
private db;
|
|
33
|
+
constructor(db: Database);
|
|
34
|
+
/**
|
|
35
|
+
* Saves CRDT state to database (state-based approach).
|
|
36
|
+
* Stores serialized CRDT data in JSONB field.
|
|
37
|
+
*
|
|
38
|
+
* @param crdtId - Unique identifier for this CRDT instance
|
|
39
|
+
* @param type - Type of CRDT
|
|
40
|
+
* @param data - Serialized CRDT data
|
|
41
|
+
* @param table - Table to store in (default: agentContexts)
|
|
42
|
+
* @param field - JSONB field name (default: 'context')
|
|
43
|
+
*/
|
|
44
|
+
saveCRDTState(crdtId: string, type: CRDTType, data: LWWRegisterData<unknown> | ORSetData<unknown> | PNCounterData, _table?: 'agentContexts', _field?: string): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Loads CRDT state from database (state-based approach).
|
|
47
|
+
*
|
|
48
|
+
* @param crdtId - Unique identifier for this CRDT instance
|
|
49
|
+
* @param type - Type of CRDT to load
|
|
50
|
+
* @returns Serialized CRDT data or null if not found
|
|
51
|
+
*/
|
|
52
|
+
loadCRDTState(crdtId: string, type: CRDTType): Promise<LWWRegisterData<unknown> | ORSetData<unknown> | PNCounterData | null>;
|
|
53
|
+
/**
|
|
54
|
+
* Appends an operation to the CRDT operations log.
|
|
55
|
+
*
|
|
56
|
+
* @param operation - The operation to append
|
|
57
|
+
*/
|
|
58
|
+
appendOperation(operation: CRDTOperationPayload): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Gets operations since a given timestamp (for sync).
|
|
61
|
+
*
|
|
62
|
+
* @param crdtId - CRDT instance identifier
|
|
63
|
+
* @param since - Unix timestamp (milliseconds) to get operations since
|
|
64
|
+
* @returns Array of operations
|
|
65
|
+
*/
|
|
66
|
+
getOperationsSince(crdtId: string, since: number): Promise<CRDTOperationPayload[]>;
|
|
67
|
+
/**
|
|
68
|
+
* Saves composite CRDT state (multiple CRDTs in one record).
|
|
69
|
+
* Useful for WorkingMemory which uses multiple CRDTs.
|
|
70
|
+
*
|
|
71
|
+
* Supports storing multiple CRDTs with keys like "lww_register:context" or "or_set:agents"
|
|
72
|
+
*
|
|
73
|
+
* @param crdtId - Unique identifier
|
|
74
|
+
* @param states - Map of CRDT key (e.g., "lww_register:context") to serialized data
|
|
75
|
+
*/
|
|
76
|
+
saveCompositeState(crdtId: string, states: Map<string, LWWRegisterData<unknown> | ORSetData<unknown> | PNCounterData>): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Loads composite CRDT state (multiple CRDTs from one record).
|
|
79
|
+
*
|
|
80
|
+
* @param crdtId - Unique identifier
|
|
81
|
+
* @returns Map of CRDT key (e.g., "lww_register:context") to serialized data
|
|
82
|
+
*/
|
|
83
|
+
loadCompositeState(crdtId: string): Promise<Map<string, LWWRegisterData<unknown> | ORSetData<unknown> | PNCounterData>>;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=crdt-persistence.d.ts.map
|
|
@@ -0,0 +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,CAAA;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAOjF,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,QAAQ,GAAG,YAAY,CAAA;AAC/D,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAA;AAEpF,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,QAAQ,CAAA;IAClB,aAAa,EAAE,iBAAiB,CAAA;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;IACvC,MAAM,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;IAC3B,UAAU,CAAC,EAAE,aAAa,CAAA;CAC3B;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;IA4ChB;;;;;;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;IAuChB;;;;;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"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRDT Persistence Adapter
|
|
3
|
+
*
|
|
4
|
+
* Generic adapter for saving/loading CRDT state to/from database.
|
|
5
|
+
* Supports both state-based (JSONB) and operation-based (operations log) storage.
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
import { agentContexts, and, crdtOperations, eq, gte } from '@revealui/db/schema';
|
|
9
|
+
import { findAgentContextById } from '../utils/sql-helpers.js';
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// CRDT Persistence
|
|
12
|
+
// =============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Persistence adapter for CRDT operations.
|
|
15
|
+
*
|
|
16
|
+
* Supports:
|
|
17
|
+
* - State-based storage (JSONB in existing tables)
|
|
18
|
+
* - Operation-based storage (crdt_operations table)
|
|
19
|
+
*/
|
|
20
|
+
export class CRDTPersistence {
|
|
21
|
+
db;
|
|
22
|
+
constructor(db) {
|
|
23
|
+
this.db = db;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Saves CRDT state to database (state-based approach).
|
|
27
|
+
* Stores serialized CRDT data in JSONB field.
|
|
28
|
+
*
|
|
29
|
+
* @param crdtId - Unique identifier for this CRDT instance
|
|
30
|
+
* @param type - Type of CRDT
|
|
31
|
+
* @param data - Serialized CRDT data
|
|
32
|
+
* @param table - Table to store in (default: agentContexts)
|
|
33
|
+
* @param field - JSONB field name (default: 'context')
|
|
34
|
+
*/
|
|
35
|
+
async saveCRDTState(crdtId, type, data, _table = 'agentContexts', _field = 'context') {
|
|
36
|
+
void _table;
|
|
37
|
+
void _field;
|
|
38
|
+
// For now, we'll store in agentContexts.context JSONB field
|
|
39
|
+
// This is a simplified state-based approach
|
|
40
|
+
const stateData = {
|
|
41
|
+
[type]: data,
|
|
42
|
+
};
|
|
43
|
+
// Check if context exists (using raw SQL for Neon HTTP compatibility)
|
|
44
|
+
const existing = await findAgentContextById(this.db, crdtId);
|
|
45
|
+
if (existing) {
|
|
46
|
+
// Update existing context
|
|
47
|
+
const currentContext = existing.context || {};
|
|
48
|
+
await this.db
|
|
49
|
+
.update(agentContexts)
|
|
50
|
+
.set({
|
|
51
|
+
context: {
|
|
52
|
+
...currentContext,
|
|
53
|
+
// biome-ignore lint/style/useNamingConvention: _crdt is the CRDT state storage key — internal convention that must not be renamed
|
|
54
|
+
_crdt: stateData,
|
|
55
|
+
},
|
|
56
|
+
updatedAt: new Date(),
|
|
57
|
+
})
|
|
58
|
+
.where(eq(agentContexts.id, crdtId));
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Create new context entry
|
|
62
|
+
await this.db.insert(agentContexts).values({
|
|
63
|
+
id: crdtId,
|
|
64
|
+
version: 1,
|
|
65
|
+
sessionId: crdtId.split(':')[0] || '',
|
|
66
|
+
agentId: crdtId.split(':')[1] || '',
|
|
67
|
+
context: {
|
|
68
|
+
// biome-ignore lint/style/useNamingConvention: _crdt is the CRDT state storage key — internal convention that must not be renamed
|
|
69
|
+
_crdt: stateData,
|
|
70
|
+
},
|
|
71
|
+
priority: 0.5,
|
|
72
|
+
createdAt: new Date(),
|
|
73
|
+
updatedAt: new Date(),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Loads CRDT state from database (state-based approach).
|
|
79
|
+
*
|
|
80
|
+
* @param crdtId - Unique identifier for this CRDT instance
|
|
81
|
+
* @param type - Type of CRDT to load
|
|
82
|
+
* @returns Serialized CRDT data or null if not found
|
|
83
|
+
*/
|
|
84
|
+
async loadCRDTState(crdtId, type) {
|
|
85
|
+
const context = await findAgentContextById(this.db, crdtId);
|
|
86
|
+
if (!context?.context) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
const contextData = context.context;
|
|
90
|
+
const crdtData = contextData._crdt;
|
|
91
|
+
if (!crdtData?.[type]) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
return crdtData[type];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Appends an operation to the CRDT operations log.
|
|
98
|
+
*
|
|
99
|
+
* @param operation - The operation to append
|
|
100
|
+
*/
|
|
101
|
+
async appendOperation(operation) {
|
|
102
|
+
await this.db.insert(crdtOperations).values({
|
|
103
|
+
id: randomUUID(),
|
|
104
|
+
crdtId: operation.crdtId,
|
|
105
|
+
crdtType: operation.crdtType,
|
|
106
|
+
operationType: operation.operationType,
|
|
107
|
+
payload: operation.payload,
|
|
108
|
+
nodeId: operation.nodeId,
|
|
109
|
+
timestamp: operation.timestamp,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Gets operations since a given timestamp (for sync).
|
|
114
|
+
*
|
|
115
|
+
* @param crdtId - CRDT instance identifier
|
|
116
|
+
* @param since - Unix timestamp (milliseconds) to get operations since
|
|
117
|
+
* @returns Array of operations
|
|
118
|
+
*/
|
|
119
|
+
async getOperationsSince(crdtId, since) {
|
|
120
|
+
const operations = await this.db
|
|
121
|
+
.select()
|
|
122
|
+
.from(crdtOperations)
|
|
123
|
+
.where(and(eq(crdtOperations.crdtId, crdtId), gte(crdtOperations.timestamp, since)))
|
|
124
|
+
.orderBy(crdtOperations.timestamp);
|
|
125
|
+
return operations.map((op) => ({
|
|
126
|
+
crdtId: op.crdtId,
|
|
127
|
+
crdtType: op.crdtType,
|
|
128
|
+
operationType: op.operationType,
|
|
129
|
+
payload: op.payload,
|
|
130
|
+
nodeId: op.nodeId,
|
|
131
|
+
timestamp: op.timestamp,
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Saves composite CRDT state (multiple CRDTs in one record).
|
|
136
|
+
* Useful for WorkingMemory which uses multiple CRDTs.
|
|
137
|
+
*
|
|
138
|
+
* Supports storing multiple CRDTs with keys like "lww_register:context" or "or_set:agents"
|
|
139
|
+
*
|
|
140
|
+
* @param crdtId - Unique identifier
|
|
141
|
+
* @param states - Map of CRDT key (e.g., "lww_register:context") to serialized data
|
|
142
|
+
*/
|
|
143
|
+
async saveCompositeState(crdtId, states) {
|
|
144
|
+
const stateData = {};
|
|
145
|
+
for (const [key, data] of states) {
|
|
146
|
+
stateData[key] = data;
|
|
147
|
+
}
|
|
148
|
+
const existing = await findAgentContextById(this.db, crdtId);
|
|
149
|
+
if (existing) {
|
|
150
|
+
const currentContext = existing.context || {};
|
|
151
|
+
await this.db
|
|
152
|
+
.update(agentContexts)
|
|
153
|
+
.set({
|
|
154
|
+
context: {
|
|
155
|
+
...currentContext,
|
|
156
|
+
// biome-ignore lint/style/useNamingConvention: _crdt is the CRDT state storage key — internal convention that must not be renamed
|
|
157
|
+
_crdt: stateData,
|
|
158
|
+
},
|
|
159
|
+
updatedAt: new Date(),
|
|
160
|
+
})
|
|
161
|
+
.where(eq(agentContexts.id, crdtId));
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
await this.db.insert(agentContexts).values({
|
|
165
|
+
id: crdtId,
|
|
166
|
+
version: 1,
|
|
167
|
+
sessionId: crdtId.split(':')[0] || '',
|
|
168
|
+
agentId: crdtId.split(':')[1] || '',
|
|
169
|
+
context: {
|
|
170
|
+
// biome-ignore lint/style/useNamingConvention: _crdt is the CRDT state storage key — internal convention that must not be renamed
|
|
171
|
+
_crdt: stateData,
|
|
172
|
+
},
|
|
173
|
+
priority: 0.5,
|
|
174
|
+
createdAt: new Date(),
|
|
175
|
+
updatedAt: new Date(),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Loads composite CRDT state (multiple CRDTs from one record).
|
|
181
|
+
*
|
|
182
|
+
* @param crdtId - Unique identifier
|
|
183
|
+
* @returns Map of CRDT key (e.g., "lww_register:context") to serialized data
|
|
184
|
+
*/
|
|
185
|
+
async loadCompositeState(crdtId) {
|
|
186
|
+
const context = await findAgentContextById(this.db, crdtId);
|
|
187
|
+
const result = new Map();
|
|
188
|
+
if (!context?.context) {
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
const contextData = context.context;
|
|
192
|
+
const crdtData = contextData._crdt;
|
|
193
|
+
if (!crdtData) {
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
// Return all CRDT states with their keys
|
|
197
|
+
for (const [key, data] of Object.entries(crdtData)) {
|
|
198
|
+
if (data && typeof data === 'object') {
|
|
199
|
+
result.set(key, data);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRDT Persistence Layer
|
|
3
|
+
*
|
|
4
|
+
* Adapters for saving/loading CRDT state to/from database.
|
|
5
|
+
*/
|
|
6
|
+
export { type CRDTOperationPayload, type CRDTOperationType, CRDTPersistence, type CRDTStateData, type CRDTType, } from './crdt-persistence.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/memory/persistence/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,QAAQ,GACd,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/memory/preferences/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User Preferences Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages user preferences with CRDT support for conflict-free updates
|
|
5
|
+
* from multiple devices. Uses LWWRegister for last-writer-wins semantics.
|
|
6
|
+
*/
|
|
7
|
+
import type { UserPreferences } from '@revealui/contracts/entities';
|
|
8
|
+
import type { Database } from '@revealui/db/client';
|
|
9
|
+
import { type LWWRegisterData } from '../crdt/lww-register.js';
|
|
10
|
+
/**
|
|
11
|
+
* Manages user preferences with CRDT support.
|
|
12
|
+
*
|
|
13
|
+
* Note: This implementation stores CRDT state directly in users.preferences JSONB field.
|
|
14
|
+
* All preferences must be in CRDT format - legacy format is not supported.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const manager = new UserPreferencesManager('user-123', 'node-abc', db)
|
|
19
|
+
* await manager.load()
|
|
20
|
+
*
|
|
21
|
+
* await manager.updatePreferences({ theme: 'dark' })
|
|
22
|
+
* const prefs = manager.getPreferences()
|
|
23
|
+
*
|
|
24
|
+
* await manager.save()
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare class UserPreferencesManager {
|
|
28
|
+
private preferences;
|
|
29
|
+
private userId;
|
|
30
|
+
private nodeId;
|
|
31
|
+
private db;
|
|
32
|
+
private logger;
|
|
33
|
+
/**
|
|
34
|
+
* Creates a new UserPreferencesManager.
|
|
35
|
+
*
|
|
36
|
+
* @param userId - User identifier
|
|
37
|
+
* @param nodeId - Node identifier (for CRDT operations)
|
|
38
|
+
* @param db - Database client
|
|
39
|
+
*/
|
|
40
|
+
constructor(userId: string, nodeId: string, db: Database);
|
|
41
|
+
/**
|
|
42
|
+
* Gets the current preferences.
|
|
43
|
+
*
|
|
44
|
+
* @returns Current user preferences
|
|
45
|
+
*/
|
|
46
|
+
getPreferences(): UserPreferences;
|
|
47
|
+
/**
|
|
48
|
+
* Updates preferences with partial data.
|
|
49
|
+
* Merges with existing preferences.
|
|
50
|
+
*
|
|
51
|
+
* @param updates - Partial preferences updates
|
|
52
|
+
*/
|
|
53
|
+
updatePreferences(updates: Partial<UserPreferences>): void;
|
|
54
|
+
/**
|
|
55
|
+
* Sets entire preferences object.
|
|
56
|
+
*
|
|
57
|
+
* @param preferences - Complete preferences object
|
|
58
|
+
*/
|
|
59
|
+
setPreferences(preferences: UserPreferences): void;
|
|
60
|
+
/**
|
|
61
|
+
* Gets a specific preference value.
|
|
62
|
+
*
|
|
63
|
+
* @param key - Preference key (supports dot notation for nested keys)
|
|
64
|
+
* @returns Preference value or undefined
|
|
65
|
+
*/
|
|
66
|
+
getPreference(key: string): unknown;
|
|
67
|
+
/**
|
|
68
|
+
* Sets a specific preference value.
|
|
69
|
+
*
|
|
70
|
+
* @param key - Preference key (supports dot notation for nested keys)
|
|
71
|
+
* @param value - Preference value
|
|
72
|
+
*/
|
|
73
|
+
setPreference(key: string, value: unknown): void;
|
|
74
|
+
/**
|
|
75
|
+
* Merges another UserPreferencesManager into this one.
|
|
76
|
+
* Uses CRDT merge for conflict resolution.
|
|
77
|
+
*
|
|
78
|
+
* @param other - UserPreferencesManager to merge
|
|
79
|
+
* @returns New merged UserPreferencesManager
|
|
80
|
+
*/
|
|
81
|
+
merge(other: UserPreferencesManager): UserPreferencesManager;
|
|
82
|
+
/**
|
|
83
|
+
* Loads preferences from database.
|
|
84
|
+
* Stores CRDT state directly in users.preferences JSONB field.
|
|
85
|
+
* Requires preferences to be in CRDT format.
|
|
86
|
+
*
|
|
87
|
+
* @throws DatabaseConnectionError if database connection fails
|
|
88
|
+
* @throws DatabaseOperationError if database operation fails
|
|
89
|
+
* @throws ValidationError if preferences are not in CRDT format
|
|
90
|
+
*/
|
|
91
|
+
load(): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Saves preferences to database.
|
|
94
|
+
* Stores CRDT state directly in users.preferences JSONB field.
|
|
95
|
+
*
|
|
96
|
+
* @throws NotFoundError if user does not exist
|
|
97
|
+
* @throws DatabaseConnectionError if database connection fails
|
|
98
|
+
* @throws DatabaseConstraintError if database constraint violation occurs
|
|
99
|
+
* @throws DatabaseOperationError if database operation fails
|
|
100
|
+
*/
|
|
101
|
+
save(): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Serializes preferences to plain object.
|
|
104
|
+
*
|
|
105
|
+
* @returns Serialized data
|
|
106
|
+
*/
|
|
107
|
+
toData(): LWWRegisterData<UserPreferences>;
|
|
108
|
+
/**
|
|
109
|
+
* Deserializes preferences from plain object.
|
|
110
|
+
*
|
|
111
|
+
* @param data - Serialized data
|
|
112
|
+
* @param userId - User identifier
|
|
113
|
+
* @param nodeId - Node identifier
|
|
114
|
+
* @param db - Database client
|
|
115
|
+
* @returns New UserPreferencesManager instance
|
|
116
|
+
*/
|
|
117
|
+
static fromData(data: LWWRegisterData<UserPreferences>, userId: string, nodeId: string, db: Database): UserPreferencesManager;
|
|
118
|
+
/**
|
|
119
|
+
* Creates a copy of this UserPreferencesManager.
|
|
120
|
+
*
|
|
121
|
+
* @returns New UserPreferencesManager with same state
|
|
122
|
+
*/
|
|
123
|
+
clone(): UserPreferencesManager;
|
|
124
|
+
/**
|
|
125
|
+
* Gets the user ID.
|
|
126
|
+
*/
|
|
127
|
+
getUserId(): string;
|
|
128
|
+
/**
|
|
129
|
+
* Gets the node ID.
|
|
130
|
+
*/
|
|
131
|
+
getNodeId(): string;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=user-preferences-manager.d.ts.map
|
|
@@ -0,0 +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,CAAA;AAEnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAEnD,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAgB3E;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,EAAE,CAAU;IACpB,OAAO,CAAC,MAAM,CAAoC;IAElD;;;;;;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;IAiF3B;;;;;;;;OAQG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6E3B;;;;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"}
|