@revealui/ai 0.2.8 → 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/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/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/client.d.ts +7 -10
- package/dist/llm/client.d.ts.map +1 -1
- package/dist/llm/client.js +10 -34
- 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 +2 -2
- 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 +4 -4
- 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 +1 -1
- package/dist/llm/providers/openai-compat.d.ts +2 -2
- package/dist/llm/providers/openai-compat.js +5 -5
- package/dist/llm/providers/vultr.js +1 -1
- package/dist/llm/server.d.ts +0 -1
- package/dist/llm/server.d.ts.map +1 -1
- package/dist/llm/server.js +0 -1
- 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/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 +20 -15
- package/dist/ingestion/cms-indexer.d.ts.map +0 -1
- 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/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/client.js
CHANGED
|
@@ -42,7 +42,6 @@ export function redactSensitiveFields(obj) {
|
|
|
42
42
|
import { decryptApiKey } from '@revealui/db/crypto';
|
|
43
43
|
import { tenantProviderConfigs, userApiKeys } from '@revealui/db/schema';
|
|
44
44
|
import { and, eq } from 'drizzle-orm';
|
|
45
|
-
import { BitnetProvider } from './providers/bitnet.js';
|
|
46
45
|
import { GroqProvider } from './providers/groq.js';
|
|
47
46
|
import { InferenceSnapsProvider, } from './providers/inference-snaps.js';
|
|
48
47
|
import { OllamaProvider } from './providers/ollama.js';
|
|
@@ -79,7 +78,7 @@ export class LLMClient {
|
|
|
79
78
|
}
|
|
80
79
|
// Wire health monitor if provided
|
|
81
80
|
this.healthMonitor = config.healthMonitor;
|
|
82
|
-
// Wire dedicated embed provider if supplied
|
|
81
|
+
// Wire dedicated embed provider if supplied
|
|
83
82
|
this.embedProviderOverride = config.embedProvider;
|
|
84
83
|
// Create primary provider
|
|
85
84
|
this.provider = this.createProvider(config.provider, {
|
|
@@ -108,8 +107,6 @@ export class LLMClient {
|
|
|
108
107
|
return new GroqProvider(config);
|
|
109
108
|
case 'ollama':
|
|
110
109
|
return new OllamaProvider(config);
|
|
111
|
-
case 'bitnet':
|
|
112
|
-
return new BitnetProvider(config);
|
|
113
110
|
case 'inference-snaps':
|
|
114
111
|
return new InferenceSnapsProvider(config);
|
|
115
112
|
default:
|
|
@@ -273,7 +270,7 @@ export class LLMClient {
|
|
|
273
270
|
if (!this.checkRateLimit()) {
|
|
274
271
|
throw new Error('Rate limit exceeded');
|
|
275
272
|
}
|
|
276
|
-
// Use dedicated embed provider if one was configured
|
|
273
|
+
// Use dedicated embed provider if one was configured
|
|
277
274
|
const embedProvider = this.embedProviderOverride ?? this.provider;
|
|
278
275
|
try {
|
|
279
276
|
this.recordRequest();
|
|
@@ -363,13 +360,13 @@ export class LLMClient {
|
|
|
363
360
|
* Create an LLM client from environment variables.
|
|
364
361
|
*
|
|
365
362
|
* When LLM_PROVIDER is not set, auto-detects the provider by checking env vars
|
|
366
|
-
* in priority order: INFERENCE_SNAPS →
|
|
363
|
+
* in priority order: INFERENCE_SNAPS → GROQ → OLLAMA.
|
|
367
364
|
*
|
|
368
365
|
* All providers use OpenAI-compatible APIs. No proprietary provider SDKs.
|
|
369
366
|
*
|
|
370
367
|
* Provider defaults:
|
|
371
|
-
* groq →
|
|
372
|
-
* ollama →
|
|
368
|
+
* groq → qwen/qwen3-32b
|
|
369
|
+
* ollama → gemma4:e2b
|
|
373
370
|
*/
|
|
374
371
|
export function createLLMClientFromEnv() {
|
|
375
372
|
// Auto-detect provider when LLM_PROVIDER is not explicitly set
|
|
@@ -380,9 +377,6 @@ export function createLLMClientFromEnv() {
|
|
|
380
377
|
else if (process.env.INFERENCE_SNAPS_BASE_URL) {
|
|
381
378
|
provider = 'inference-snaps';
|
|
382
379
|
}
|
|
383
|
-
else if (process.env.BITNET_BASE_URL) {
|
|
384
|
-
provider = 'bitnet';
|
|
385
|
-
}
|
|
386
380
|
else if (process.env.GROQ_API_KEY) {
|
|
387
381
|
provider = 'groq';
|
|
388
382
|
}
|
|
@@ -390,9 +384,8 @@ export function createLLMClientFromEnv() {
|
|
|
390
384
|
provider = 'ollama';
|
|
391
385
|
}
|
|
392
386
|
else {
|
|
393
|
-
throw new Error('No LLM provider configured. Set one of:
|
|
394
|
-
'INFERENCE_SNAPS_BASE_URL (local snap), GROQ_API_KEY (
|
|
395
|
-
'OLLAMA_BASE_URL (local Ollama). ' +
|
|
387
|
+
throw new Error('No LLM provider configured. Set one of: OLLAMA_BASE_URL (local Ollama), ' +
|
|
388
|
+
'INFERENCE_SNAPS_BASE_URL (local snap), GROQ_API_KEY (cloud). ' +
|
|
396
389
|
'Alternatively, set LLM_PROVIDER explicitly.');
|
|
397
390
|
}
|
|
398
391
|
let apiKey;
|
|
@@ -409,19 +402,14 @@ export function createLLMClientFromEnv() {
|
|
|
409
402
|
else if (provider === 'groq') {
|
|
410
403
|
apiKey = process.env.GROQ_API_KEY;
|
|
411
404
|
baseURL = process.env.GROQ_BASE_URL;
|
|
412
|
-
defaultModel = '
|
|
405
|
+
defaultModel = 'qwen/qwen3-32b';
|
|
413
406
|
}
|
|
414
407
|
else if (provider === 'ollama') {
|
|
415
408
|
apiKey = 'ollama'; // Ollama ignores the API key
|
|
416
409
|
// Ollama's OpenAI-compatible endpoint lives at /v1
|
|
417
410
|
const ollamaBase = process.env.OLLAMA_BASE_URL ?? 'http://localhost:11434';
|
|
418
411
|
baseURL = ollamaBase.endsWith('/v1') ? ollamaBase : `${ollamaBase}/v1`;
|
|
419
|
-
defaultModel = '
|
|
420
|
-
}
|
|
421
|
-
else if (provider === 'bitnet') {
|
|
422
|
-
apiKey = 'bitnet'; // llama-server ignores the API key
|
|
423
|
-
baseURL = process.env.BITNET_BASE_URL;
|
|
424
|
-
defaultModel = 'bitnet-b1.58-2B-4T';
|
|
412
|
+
defaultModel = 'gemma4:e2b';
|
|
425
413
|
}
|
|
426
414
|
else if (provider === 'inference-snaps') {
|
|
427
415
|
apiKey = 'inference-snaps'; // inference-snaps ignores the API key
|
|
@@ -430,18 +418,7 @@ export function createLLMClientFromEnv() {
|
|
|
430
418
|
}
|
|
431
419
|
if (!apiKey) {
|
|
432
420
|
throw new Error(`API key not found for provider "${provider}". Set the corresponding env var ` +
|
|
433
|
-
`(INFERENCE_SNAPS_BASE_URL, GROQ_API_KEY, OLLAMA_BASE_URL,
|
|
434
|
-
}
|
|
435
|
-
// When BitNet is the chat provider, auto-wire Ollama as the embed backend.
|
|
436
|
-
// BitNet does not support /v1/embeddings; Ollama (nomic-embed-text) fills that role.
|
|
437
|
-
// If OLLAMA_BASE_URL is not set, embed() will throw with a helpful message.
|
|
438
|
-
let embedProvider;
|
|
439
|
-
if (provider === 'bitnet' && process.env.OLLAMA_BASE_URL) {
|
|
440
|
-
embedProvider = new OllamaProvider({
|
|
441
|
-
apiKey: 'ollama',
|
|
442
|
-
baseURL: process.env.OLLAMA_BASE_URL,
|
|
443
|
-
embedModel: process.env.OLLAMA_EMBED_MODEL ?? 'nomic-embed-text',
|
|
444
|
-
});
|
|
421
|
+
`(INFERENCE_SNAPS_BASE_URL, GROQ_API_KEY, OLLAMA_BASE_URL, VULTR_API_KEY, or HF_TOKEN).`);
|
|
445
422
|
}
|
|
446
423
|
return new LLMClient({
|
|
447
424
|
provider,
|
|
@@ -455,7 +432,6 @@ export function createLLMClientFromEnv() {
|
|
|
455
432
|
process.env.RESPONSE_CACHE_ENABLED === 'true',
|
|
456
433
|
enableSemanticCache: process.env.LLM_ENABLE_SEMANTIC_CACHE === 'true' ||
|
|
457
434
|
process.env.SEMANTIC_CACHE_ENABLED === 'true',
|
|
458
|
-
embedProvider,
|
|
459
435
|
});
|
|
460
436
|
}
|
|
461
437
|
/**
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* BYOK Provider Key Validator
|
|
3
3
|
*
|
|
4
4
|
* Validates API keys against their provider before storage.
|
|
5
|
-
* Uses the cheapest available endpoint for each provider
|
|
5
|
+
* Uses the cheapest available endpoint for each provider - typically a
|
|
6
6
|
* models list (read-only, no token cost). Falls back gracefully when the
|
|
7
7
|
* provider is unreachable so that network failures don't block key storage.
|
|
8
8
|
*/
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* BYOK Provider Key Validator
|
|
3
3
|
*
|
|
4
4
|
* Validates API keys against their provider before storage.
|
|
5
|
-
* Uses the cheapest available endpoint for each provider
|
|
5
|
+
* Uses the cheapest available endpoint for each provider - typically a
|
|
6
6
|
* models list (read-only, no token cost). Falls back gracefully when the
|
|
7
7
|
* provider is unreachable so that network failures don't block key storage.
|
|
8
8
|
*/
|
|
@@ -38,7 +38,7 @@ export async function validateProviderKey(provider, apiKey) {
|
|
|
38
38
|
return { valid: true };
|
|
39
39
|
if (res.status === 401)
|
|
40
40
|
return { valid: false, error: 'Invalid Groq API key' };
|
|
41
|
-
// Any other non-OK status (429, 500 etc.)
|
|
41
|
+
// Any other non-OK status (429, 500 etc.) - treat as reachable but unknown
|
|
42
42
|
return { valid: false, error: `Groq validation failed: HTTP ${res.status}` };
|
|
43
43
|
}
|
|
44
44
|
case 'anthropic': {
|
|
@@ -50,7 +50,7 @@ export async function validateProviderKey(provider, apiKey) {
|
|
|
50
50
|
return { valid: true };
|
|
51
51
|
}
|
|
52
52
|
case 'openai': {
|
|
53
|
-
// Validate by format
|
|
53
|
+
// Validate by format - keys start with "sk-"
|
|
54
54
|
// (Per LLM policy, OpenAI API calls are blocked until we have revenue.)
|
|
55
55
|
if (!apiKey.startsWith('sk-')) {
|
|
56
56
|
return { valid: false, error: 'OpenAI API key must start with "sk-"' };
|
|
@@ -80,22 +80,22 @@ export async function validateProviderKey(provider, apiKey) {
|
|
|
80
80
|
return { valid: false, error: `Vultr validation failed: HTTP ${res.status}` };
|
|
81
81
|
}
|
|
82
82
|
case 'ollama': {
|
|
83
|
-
// Ollama is local
|
|
83
|
+
// Ollama is local - we cannot reliably probe it from the server.
|
|
84
84
|
// Accept the key as-is (Ollama doesn't use API keys anyway).
|
|
85
85
|
return { valid: true };
|
|
86
86
|
}
|
|
87
87
|
default:
|
|
88
|
-
// Unknown provider
|
|
88
|
+
// Unknown provider - skip validation
|
|
89
89
|
return { valid: true };
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
catch (err) {
|
|
93
|
-
// Network error (AbortError, DNS failure, etc.)
|
|
93
|
+
// Network error (AbortError, DNS failure, etc.) - don't block storage
|
|
94
94
|
if (err instanceof Error && err.name === 'AbortError') {
|
|
95
|
-
// Timeout
|
|
95
|
+
// Timeout - provider unreachable, proceed with storage
|
|
96
96
|
return { valid: true };
|
|
97
97
|
}
|
|
98
|
-
// Other network errors (ECONNREFUSED, etc.)
|
|
98
|
+
// Other network errors (ECONNREFUSED, etc.) - proceed with storage
|
|
99
99
|
return { valid: true };
|
|
100
100
|
}
|
|
101
101
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
* Abstract interface for all LLM providers (OpenAI, Anthropic, etc.)
|
|
5
5
|
*/
|
|
6
6
|
/**
|
|
7
|
-
* A plain text content part
|
|
7
|
+
* A plain text content part - used in multipart messages.
|
|
8
8
|
*/
|
|
9
9
|
export interface TextPart {
|
|
10
10
|
type: 'text';
|
|
11
11
|
text: string;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
* An image content part
|
|
14
|
+
* An image content part - base64 data URL or HTTPS URL.
|
|
15
15
|
* Supported by OpenAI-compatible providers (inference-snaps, Ollama vision, GPT-4o).
|
|
16
16
|
*
|
|
17
17
|
* @example
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Groq Provider
|
|
3
3
|
*
|
|
4
4
|
* Thin wrapper over OpenAIProvider using Groq's OpenAI-compatible API.
|
|
5
|
-
* Free tier: 6,000 TPM / 500k TPD
|
|
5
|
+
* Free tier: 6,000 TPM / 500k TPD.
|
|
6
6
|
* Sign up: console.groq.com
|
|
7
7
|
*/
|
|
8
8
|
import type { Embedding, LLMChatOptions, LLMChunk, LLMEmbedOptions, LLMProvider, LLMProviderConfig, LLMResponse, LLMStreamOptions, Message } from './base.js';
|
|
@@ -10,7 +10,7 @@ export interface GroqProviderConfig extends Omit<LLMProviderConfig, 'apiKey'> {
|
|
|
10
10
|
apiKey: string;
|
|
11
11
|
/** Defaults to https://api.groq.com/openai/v1 */
|
|
12
12
|
baseURL?: string;
|
|
13
|
-
/** Defaults to
|
|
13
|
+
/** Defaults to qwen/qwen3-32b */
|
|
14
14
|
model?: string;
|
|
15
15
|
}
|
|
16
16
|
export declare class GroqProvider implements LLMProvider {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groq.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/groq.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,QAAQ,EACR,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,OAAO,EACR,MAAM,WAAW,CAAC;AAGnB,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,
|
|
1
|
+
{"version":3,"file":"groq.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/groq.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,QAAQ,EACR,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,OAAO,EACR,MAAM,WAAW,CAAC;AAGnB,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAa,YAAW,WAAW;IAC9C,OAAO,CAAC,KAAK,CAAuB;gBAExB,MAAM,EAAE,kBAAkB;IAQtC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAIzE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,aAAa,CAAC,QAAQ,CAAC;IAIhF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;CAG9F"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Groq Provider
|
|
3
3
|
*
|
|
4
4
|
* Thin wrapper over OpenAIProvider using Groq's OpenAI-compatible API.
|
|
5
|
-
* Free tier: 6,000 TPM / 500k TPD
|
|
5
|
+
* Free tier: 6,000 TPM / 500k TPD.
|
|
6
6
|
* Sign up: console.groq.com
|
|
7
7
|
*/
|
|
8
8
|
import { OpenAICompatProvider } from './openai-compat.js';
|
|
@@ -12,7 +12,7 @@ export class GroqProvider {
|
|
|
12
12
|
this.inner = new OpenAICompatProvider({
|
|
13
13
|
...config,
|
|
14
14
|
baseURL: config.baseURL ?? 'https://api.groq.com/openai/v1',
|
|
15
|
-
model: config.model ?? '
|
|
15
|
+
model: config.model ?? 'qwen/qwen3-32b',
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
18
|
chat(messages, options) {
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* No API key required. Zero cost, fully offline, hardware-optimized.
|
|
6
6
|
*
|
|
7
7
|
* Supported models (snaps):
|
|
8
|
-
* gemma3
|
|
9
|
-
* deepseek-r1
|
|
10
|
-
* qwen-vl
|
|
11
|
-
* nemotron-nano
|
|
8
|
+
* gemma3 - general LLM + vision (text/image in, text out)
|
|
9
|
+
* deepseek-r1 - reasoning LLM
|
|
10
|
+
* qwen-vl - vision-language model (image + text)
|
|
11
|
+
* nemotron-nano - general LLM (reasoning + non-reasoning)
|
|
12
12
|
*
|
|
13
13
|
* Install a model:
|
|
14
14
|
* sudo snap install gemma3
|
|
@@ -27,7 +27,7 @@ export interface InferenceSnapsProviderConfig extends Omit<LLMProviderConfig, 'a
|
|
|
27
27
|
apiKey?: string;
|
|
28
28
|
/** Base URL of the inference-snaps service, e.g. http://localhost:9090/v1 */
|
|
29
29
|
baseURL: string;
|
|
30
|
-
/** Chat/vision model name
|
|
30
|
+
/** Chat/vision model name - must match the snap's model ID (e.g. 'gemma3', 'deepseek-r1') */
|
|
31
31
|
model?: string;
|
|
32
32
|
/** Embedding model name. Defaults to the chat model when omitted. */
|
|
33
33
|
embedModel?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inference-snaps.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/inference-snaps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,QAAQ,EACR,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,OAAO,EACR,MAAM,WAAW,CAAC;AAGnB,MAAM,WAAW,4BAA6B,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB
|
|
1
|
+
{"version":3,"file":"inference-snaps.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/inference-snaps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,QAAQ,EACR,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,OAAO,EACR,MAAM,WAAW,CAAC;AAGnB,MAAM,WAAW,4BAA6B,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;IAChB,+FAA+F;IAC/F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,sBAAuB,YAAW,WAAW;IACxD,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,4BAA4B;IAahD,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAIzE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,aAAa,CAAC,QAAQ,CAAC;IAI1E,KAAK,CACT,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;CAsBpC"}
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* No API key required. Zero cost, fully offline, hardware-optimized.
|
|
6
6
|
*
|
|
7
7
|
* Supported models (snaps):
|
|
8
|
-
* gemma3
|
|
9
|
-
* deepseek-r1
|
|
10
|
-
* qwen-vl
|
|
11
|
-
* nemotron-nano
|
|
8
|
+
* gemma3 - general LLM + vision (text/image in, text out)
|
|
9
|
+
* deepseek-r1 - reasoning LLM
|
|
10
|
+
* qwen-vl - vision-language model (image + text)
|
|
11
|
+
* nemotron-nano - general LLM (reasoning + non-reasoning)
|
|
12
12
|
*
|
|
13
13
|
* Install a model:
|
|
14
14
|
* sudo snap install gemma3
|
|
@@ -10,9 +10,9 @@ export interface OllamaProviderConfig extends Omit<LLMProviderConfig, 'apiKey'>
|
|
|
10
10
|
apiKey?: string;
|
|
11
11
|
/** Defaults to http://localhost:11434/v1 */
|
|
12
12
|
baseURL?: string;
|
|
13
|
-
/** Chat model. Defaults to
|
|
13
|
+
/** Chat model. Defaults to gemma4:e2b - run `ollama pull gemma4:e2b` first */
|
|
14
14
|
model?: string;
|
|
15
|
-
/** Embedding model. Defaults to nomic-embed-text
|
|
15
|
+
/** Embedding model. Defaults to nomic-embed-text - run `ollama pull nomic-embed-text` first */
|
|
16
16
|
embedModel?: string;
|
|
17
17
|
}
|
|
18
18
|
export declare class OllamaProvider implements LLMProvider {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,QAAQ,EACR,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,OAAO,EACR,MAAM,WAAW,CAAC;AAGnB,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,QAAQ,EACR,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,OAAO,EACR,MAAM,WAAW,CAAC;AAGnB,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,oBAAoB;IAaxC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAIzE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,aAAa,CAAC,QAAQ,CAAC;IAI1E,KAAK,CACT,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;CAsBpC"}
|
|
@@ -19,7 +19,7 @@ export class OllamaProvider {
|
|
|
19
19
|
// Ollama ignores the API key but the OpenAI client requires a non-empty value
|
|
20
20
|
apiKey: config.apiKey ?? 'ollama',
|
|
21
21
|
baseURL,
|
|
22
|
-
model: config.model ?? '
|
|
22
|
+
model: config.model ?? 'gemma4:e2b',
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
chat(messages, options) {
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* OpenAI-Compatible Provider
|
|
3
3
|
*
|
|
4
4
|
* Base implementation for any LLM API that follows the OpenAI chat/completions
|
|
5
|
-
* format. Used by: Ollama, Groq, Inference Snaps,
|
|
6
|
-
* NOT for direct OpenAI usage
|
|
5
|
+
* format. Used by: Ollama, Groq, Inference Snaps, Vultr.
|
|
6
|
+
* NOT for direct OpenAI usage - RevealUI uses open-source models only.
|
|
7
7
|
*/
|
|
8
8
|
import type { Embedding, LLMChatOptions, LLMChunk, LLMEmbedOptions, LLMProvider, LLMProviderConfig, LLMResponse, LLMStreamOptions, Message } from './base.js';
|
|
9
9
|
export interface OpenAICompatConfig extends LLMProviderConfig {
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* OpenAI-Compatible Provider
|
|
3
3
|
*
|
|
4
4
|
* Base implementation for any LLM API that follows the OpenAI chat/completions
|
|
5
|
-
* format. Used by: Ollama, Groq, Inference Snaps,
|
|
6
|
-
* NOT for direct OpenAI usage
|
|
5
|
+
* format. Used by: Ollama, Groq, Inference Snaps, Vultr.
|
|
6
|
+
* NOT for direct OpenAI usage - RevealUI uses open-source models only.
|
|
7
7
|
*/
|
|
8
8
|
const authorizationHeader = 'Authorization';
|
|
9
9
|
const maxTokensKey = 'max_tokens';
|
|
@@ -34,7 +34,7 @@ export class OpenAICompatProvider {
|
|
|
34
34
|
constructor(config) {
|
|
35
35
|
this.config = config;
|
|
36
36
|
if (!config.baseURL) {
|
|
37
|
-
throw new Error('OpenAICompatProvider requires a baseURL
|
|
37
|
+
throw new Error('OpenAICompatProvider requires a baseURL - use a specific provider (InferenceSnapsProvider, OllamaProvider, etc.)');
|
|
38
38
|
}
|
|
39
39
|
this.baseURL = config.baseURL;
|
|
40
40
|
}
|
|
@@ -113,7 +113,7 @@ export class OpenAICompatProvider {
|
|
|
113
113
|
'Content-Type': 'application/json',
|
|
114
114
|
[authorizationHeader]: `Bearer ${this.config.apiKey}`,
|
|
115
115
|
},
|
|
116
|
-
// lgtm[js/file-access-to-http]
|
|
116
|
+
// lgtm[js/file-access-to-http] - embedding providers must send text to their API by design
|
|
117
117
|
body: JSON.stringify({
|
|
118
118
|
model,
|
|
119
119
|
input: texts,
|
|
@@ -220,7 +220,7 @@ export class OpenAICompatProvider {
|
|
|
220
220
|
return messages.map((msg) => {
|
|
221
221
|
const formatted = {
|
|
222
222
|
role: msg.role,
|
|
223
|
-
// Pass array content through as-is
|
|
223
|
+
// Pass array content through as-is - OpenAI-compatible APIs (including
|
|
224
224
|
// inference-snaps vision models) accept the same multipart format natively.
|
|
225
225
|
content: msg.content,
|
|
226
226
|
};
|
|
@@ -81,7 +81,7 @@ export class VultrProvider {
|
|
|
81
81
|
[contentTypeHeader]: 'application/json',
|
|
82
82
|
[authorizationHeader]: `Bearer ${this.config.apiKey}`,
|
|
83
83
|
},
|
|
84
|
-
// lgtm[js/file-access-to-http]
|
|
84
|
+
// lgtm[js/file-access-to-http] - embedding providers must send text to their API by design
|
|
85
85
|
body: JSON.stringify({ model, input: inputs }),
|
|
86
86
|
});
|
|
87
87
|
if (!res.ok) {
|
package/dist/llm/server.d.ts
CHANGED
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,qBAAqB,CAAC;AACpC,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
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
export * from './client.js';
|
|
9
9
|
// Export provider implementations
|
|
10
10
|
export * from './providers/base.js';
|
|
11
|
-
export * from './providers/bitnet.js';
|
|
12
11
|
export * from './providers/groq.js';
|
|
13
12
|
export * from './providers/inference-snaps.js';
|
|
14
13
|
export * from './providers/ollama.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"}
|