@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.
- package/LICENSE +104 -17
- package/README.md +2 -2
- package/dist/a2a/card.d.ts +1 -1
- package/dist/a2a/card.d.ts.map +1 -1
- package/dist/a2a/card.js +4 -4
- package/dist/a2a/handler.d.ts +4 -4
- package/dist/a2a/handler.js +5 -5
- package/dist/a2a/index.d.ts +1 -1
- package/dist/a2a/index.js +1 -1
- package/dist/audit/emitter.d.ts +1 -1
- package/dist/audit/emitter.js +2 -2
- package/dist/audit/index.d.ts +2 -2
- package/dist/audit/index.js +2 -2
- package/dist/audit/store.d.ts +2 -2
- package/dist/audit/store.js +2 -2
- package/dist/client/errors.d.ts +13 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +28 -0
- package/dist/client/hooks/useAgentContext.d.ts.map +1 -1
- package/dist/client/hooks/useAgentContext.js +6 -5
- package/dist/client/hooks/useAgentStream.d.ts +2 -2
- package/dist/client/hooks/useAgentStream.js +3 -3
- package/dist/client/hooks/useEpisodicMemory.d.ts.map +1 -1
- package/dist/client/hooks/useEpisodicMemory.js +6 -5
- package/dist/client/hooks/useWorkingMemory.d.ts.map +1 -1
- package/dist/client/hooks/useWorkingMemory.js +7 -6
- package/dist/embeddings/index.d.ts +1 -1
- package/dist/embeddings/index.js +4 -4
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/inference/context-budget.d.ts +1 -1
- package/dist/inference/context-budget.js +4 -4
- package/dist/inference/index.d.ts +1 -1
- package/dist/inference/index.js +1 -1
- package/dist/inference/runRag.d.ts +3 -3
- package/dist/inference/runRag.d.ts.map +1 -1
- package/dist/inference/runRag.js +1 -1
- package/dist/inference/task-decomposer.d.ts +1 -1
- package/dist/inference/task-decomposer.d.ts.map +1 -1
- package/dist/inference/task-decomposer.js +3 -3
- package/dist/inference/tool-result-compressor.d.ts +1 -1
- package/dist/inference/tool-result-compressor.js +1 -1
- package/dist/ingestion/{cms-indexer.d.ts → admin-indexer.d.ts} +12 -12
- package/dist/ingestion/admin-indexer.d.ts.map +1 -0
- package/dist/ingestion/{cms-indexer.js → admin-indexer.js} +9 -9
- package/dist/ingestion/bm25.d.ts +1 -1
- package/dist/ingestion/bm25.js +1 -1
- package/dist/ingestion/file-parsers.d.ts +1 -1
- package/dist/ingestion/file-parsers.d.ts.map +1 -1
- package/dist/ingestion/file-parsers.js +36 -17
- package/dist/ingestion/hybrid-search.d.ts +1 -1
- package/dist/ingestion/hybrid-search.js +1 -1
- package/dist/ingestion/index.d.ts +1 -1
- package/dist/ingestion/index.d.ts.map +1 -1
- package/dist/ingestion/index.js +1 -1
- package/dist/ingestion/rag-vector-service.d.ts +1 -1
- package/dist/ingestion/rag-vector-service.js +1 -1
- package/dist/ingestion/reranker.d.ts +1 -1
- package/dist/ingestion/reranker.js +1 -1
- package/dist/ingestion/text-splitter.d.ts +1 -1
- package/dist/ingestion/text-splitter.js +2 -2
- package/dist/llm/cache-utils.d.ts.map +1 -1
- package/dist/llm/cache-utils.js +1 -17
- package/dist/llm/client.d.ts +8 -13
- package/dist/llm/client.d.ts.map +1 -1
- package/dist/llm/client.js +12 -60
- package/dist/llm/key-validator.d.ts +1 -1
- package/dist/llm/key-validator.js +8 -8
- package/dist/llm/providers/base.d.ts +2 -2
- package/dist/llm/providers/groq.d.ts +2 -2
- package/dist/llm/providers/groq.d.ts.map +1 -1
- package/dist/llm/providers/groq.js +4 -4
- package/dist/llm/providers/inference-snaps.d.ts +5 -5
- package/dist/llm/providers/inference-snaps.d.ts.map +1 -1
- package/dist/llm/providers/inference-snaps.js +6 -6
- package/dist/llm/providers/ollama.d.ts +2 -2
- package/dist/llm/providers/ollama.d.ts.map +1 -1
- package/dist/llm/providers/ollama.js +3 -3
- package/dist/llm/providers/{openai.d.ts → openai-compat.d.ts} +8 -7
- package/dist/llm/providers/openai-compat.d.ts.map +1 -0
- package/dist/llm/providers/{openai.js → openai-compat.js} +13 -17
- package/dist/llm/providers/vultr.d.ts.map +1 -1
- package/dist/llm/providers/vultr.js +1 -0
- package/dist/llm/server.d.ts +1 -3
- package/dist/llm/server.d.ts.map +1 -1
- package/dist/llm/server.js +1 -3
- package/dist/llm/token-counter.d.ts.map +1 -1
- package/dist/llm/token-counter.js +11 -8
- package/dist/llm/workspace-provider-config.d.ts +1 -1
- package/dist/llm/workspace-provider-config.d.ts.map +1 -1
- package/dist/llm/workspace-provider-config.js +1 -1
- package/dist/memory/crdt/or-set.d.ts +12 -0
- package/dist/memory/crdt/or-set.d.ts.map +1 -1
- package/dist/memory/crdt/or-set.js +27 -0
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +1 -0
- package/dist/memory/persistence/crdt-persistence.d.ts +21 -1
- package/dist/memory/persistence/crdt-persistence.d.ts.map +1 -1
- package/dist/memory/persistence/crdt-persistence.js +67 -0
- package/dist/memory/preferences/user-preferences-manager.d.ts.map +1 -1
- package/dist/memory/preferences/user-preferences-manager.js +11 -1
- package/dist/memory/stores/episodic-memory.js +2 -2
- package/dist/memory/stores/working-memory.d.ts +7 -2
- package/dist/memory/stores/working-memory.d.ts.map +1 -1
- package/dist/memory/stores/working-memory.js +31 -17
- package/dist/memory/sync/index.d.ts +2 -0
- package/dist/memory/sync/index.d.ts.map +1 -0
- package/dist/memory/sync/index.js +1 -0
- package/dist/memory/sync/sync-manager.d.ts +104 -0
- package/dist/memory/sync/sync-manager.d.ts.map +1 -0
- package/dist/memory/sync/sync-manager.js +137 -0
- package/dist/memory/utils/validation.js +1 -1
- package/dist/memory/vector/vector-memory-service.d.ts +1 -1
- package/dist/memory/vector/vector-memory-service.js +1 -1
- package/dist/orchestration/agent.d.ts +2 -2
- package/dist/orchestration/defaults.d.ts +1 -1
- package/dist/orchestration/defaults.js +1 -1
- package/dist/orchestration/orchestrator.d.ts +3 -3
- package/dist/orchestration/orchestrator.js +3 -3
- package/dist/orchestration/runtime.d.ts +1 -1
- package/dist/orchestration/runtime.js +1 -1
- package/dist/orchestration/streaming-runtime.d.ts +2 -2
- package/dist/orchestration/streaming-runtime.js +2 -2
- package/dist/orchestration/ticket-agent.d.ts +11 -11
- package/dist/orchestration/ticket-agent.d.ts.map +1 -1
- package/dist/orchestration/ticket-agent.js +10 -10
- package/dist/skills/catalog/vercel-catalog.d.ts.map +1 -1
- package/dist/skills/catalog/vercel-catalog.js +7 -4
- package/dist/skills/loader/github-loader.d.ts.map +1 -1
- package/dist/skills/loader/github-loader.js +2 -0
- package/dist/skills/loader/local-loader.js +1 -1
- package/dist/skills/loader/vercel-loader.d.ts.map +1 -1
- package/dist/skills/loader/vercel-loader.js +2 -0
- package/dist/skills/parser/skill-md-parser.js +2 -2
- package/dist/skills/registry/skill-registry.js +1 -1
- package/dist/skills/types.d.ts +6 -6
- package/dist/templates/prompt-spec.js +1 -1
- package/dist/templates/skill-spec.js +1 -1
- package/dist/tools/{cms → admin}/collection-tools.d.ts +2 -2
- package/dist/tools/admin/collection-tools.d.ts.map +1 -0
- package/dist/tools/{cms → admin}/collection-tools.js +8 -8
- package/dist/tools/{cms → admin}/factory.d.ts +11 -11
- package/dist/tools/admin/factory.d.ts.map +1 -0
- package/dist/tools/{cms → admin}/factory.js +4 -4
- package/dist/tools/{cms → admin}/global-tools.d.ts +1 -1
- package/dist/tools/admin/global-tools.d.ts.map +1 -0
- package/dist/tools/{cms → admin}/global-tools.js +4 -4
- package/dist/tools/{cms → admin}/index.d.ts +4 -4
- package/dist/tools/admin/index.d.ts.map +1 -0
- package/dist/tools/{cms → admin}/index.js +3 -3
- package/dist/tools/{cms → admin}/media-tools.d.ts +1 -1
- package/dist/tools/admin/media-tools.d.ts.map +1 -0
- package/dist/tools/{cms → admin}/media-tools.js +4 -4
- package/dist/tools/{cms → admin}/user-tools.d.ts +1 -1
- package/dist/tools/admin/user-tools.d.ts.map +1 -0
- package/dist/tools/{cms → admin}/user-tools.js +1 -1
- package/dist/tools/coding/file-edit.d.ts +1 -1
- package/dist/tools/coding/file-edit.js +2 -2
- package/dist/tools/coding/file-glob.d.ts +1 -1
- package/dist/tools/coding/file-glob.d.ts.map +1 -1
- package/dist/tools/coding/file-glob.js +2 -1
- package/dist/tools/coding/file-grep.d.ts +1 -1
- package/dist/tools/coding/file-grep.d.ts.map +1 -1
- package/dist/tools/coding/file-grep.js +2 -1
- package/dist/tools/coding/file-read.d.ts +1 -1
- package/dist/tools/coding/file-read.d.ts.map +1 -1
- package/dist/tools/coding/file-read.js +15 -9
- package/dist/tools/coding/file-write.d.ts +1 -1
- package/dist/tools/coding/file-write.js +1 -1
- package/dist/tools/coding/git-ops.d.ts +1 -1
- package/dist/tools/coding/git-ops.d.ts.map +1 -1
- package/dist/tools/coding/git-ops.js +5 -7
- package/dist/tools/coding/index.d.ts +1 -1
- package/dist/tools/coding/index.d.ts.map +1 -1
- package/dist/tools/coding/lint-fix.d.ts +1 -1
- package/dist/tools/coding/lint-fix.d.ts.map +1 -1
- package/dist/tools/coding/lint-fix.js +8 -4
- package/dist/tools/coding/project-context.d.ts +1 -1
- package/dist/tools/coding/project-context.d.ts.map +1 -1
- package/dist/tools/coding/project-context.js +25 -24
- package/dist/tools/coding/safety.d.ts +1 -1
- package/dist/tools/coding/safety.d.ts.map +1 -1
- package/dist/tools/coding/shell-exec.d.ts +1 -1
- package/dist/tools/coding/shell-exec.js +1 -1
- package/dist/tools/coding/test-runner.d.ts +1 -1
- package/dist/tools/coding/test-runner.d.ts.map +1 -1
- package/dist/tools/coding/test-runner.js +12 -7
- package/dist/tools/deduplicator.js +1 -1
- package/dist/tools/document-summarizer.js +2 -2
- package/dist/tools/memory/store-memory.d.ts +1 -1
- package/dist/tools/memory/store-memory.js +2 -2
- package/dist/tools/ticket-tools.d.ts +2 -2
- package/dist/tools/ticket-tools.js +3 -3
- package/dist/tools/web/duck-duck-go.d.ts +3 -3
- package/dist/tools/web/duck-duck-go.js +4 -4
- package/dist/tools/web/exa.d.ts +1 -1
- package/dist/tools/web/exa.js +1 -1
- package/dist/tools/web/scraper.js +1 -1
- package/dist/tools/web/tavily.d.ts +2 -2
- package/dist/tools/web/tavily.js +2 -2
- package/dist/tools/web/types.d.ts +2 -2
- package/dist/tools/web/types.js +2 -2
- package/package.json +23 -17
- package/LICENSE.commercial +0 -111
- package/dist/ingestion/cms-indexer.d.ts.map +0 -1
- package/dist/llm/providers/anthropic.d.ts +0 -31
- package/dist/llm/providers/anthropic.d.ts.map +0 -1
- package/dist/llm/providers/anthropic.js +0 -264
- package/dist/llm/providers/bitnet.d.ts +0 -28
- package/dist/llm/providers/bitnet.d.ts.map +0 -1
- package/dist/llm/providers/bitnet.js +0 -36
- package/dist/llm/providers/openai.d.ts.map +0 -1
- package/dist/tools/cms/collection-tools.d.ts.map +0 -1
- package/dist/tools/cms/factory.d.ts.map +0 -1
- package/dist/tools/cms/global-tools.d.ts.map +0 -1
- package/dist/tools/cms/index.d.ts.map +0 -1
- package/dist/tools/cms/media-tools.d.ts.map +0 -1
- package/dist/tools/cms/user-tools.d.ts.map +0 -1
package/dist/llm/server.d.ts
CHANGED
|
@@ -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
|
package/dist/llm/server.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/llm/server.js
CHANGED
|
@@ -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;
|
|
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)
|
|
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 (
|
|
21
|
-
'
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
'
|
|
25
|
-
'
|
|
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') ||
|
|
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 registry
|
|
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,
|
|
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 registry
|
|
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
|
*/
|
package/dist/memory/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/memory/index.js
CHANGED
|
@@ -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
|
|
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,
|
|
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;
|
|
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
|
-
|
|
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 results
|
|
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 failed
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"working-memory.d.ts","sourceRoot":"","sources":["../../../src/memory/stores/working-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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 @@
|
|
|
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';
|