@traqr/memory 0.1.1 → 0.1.3
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/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/borderline.js +3 -1
- package/dist/lib/borderline.js.map +1 -1
- package/dist/lib/embeddings.d.ts +40 -12
- package/dist/lib/embeddings.js +340 -160
- package/dist/lib/embeddings.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -22,8 +22,8 @@ export type { EntityExtractionResult } from './lib/entity-pipeline.js';
|
|
|
22
22
|
export type { StoreWithDedupResult, TriageResult, TriageZone, TriageAction, TriageOptions, RoundTripResult, DetailedStats, SystemHealth, } from './lib/memory.js';
|
|
23
23
|
export { searchMemoriesV2, reciprocalRankFusion, detectStrategies, parseTemporalRange, findEntitiesInQuery, } from './lib/retrieval.js';
|
|
24
24
|
export type { SearchV2Options, SearchStrategy, FusedItem, StrategyResult, DetectedStrategies, } from './lib/retrieval.js';
|
|
25
|
-
export { generateEmbedding, generateEmbeddingsBatch, cosineSimilarity, formatEmbeddingForPgVector, parseEmbeddingFromPgVector, needsReembedding, checkEmbeddingHealth, EMBEDDING_CONFIG, } from './lib/embeddings.js';
|
|
26
|
-
export type { EmbeddingResult, EmbeddingHealthStatus } from './lib/embeddings.js';
|
|
25
|
+
export { generateEmbedding, generateEmbeddingsBatch, cosineSimilarity, formatEmbeddingForPgVector, parseEmbeddingFromPgVector, needsReembedding, checkEmbeddingHealth, EMBEDDING_CONFIG, getEmbeddingProvider, getEmbeddingConfig, resetEmbeddingProvider, } from './lib/embeddings.js';
|
|
26
|
+
export type { EmbeddingResult, EmbeddingHealthStatus, EmbeddingProvider } from './lib/embeddings.js';
|
|
27
27
|
export { CATEGORY_EMOJI, CATEGORY_EMOJI_SLACK, CATEGORY_EMOJI_TEXT, SOURCE_TYPE_EMOJI, getCategoryEmoji, } from './lib/formatting.js';
|
|
28
28
|
export { getMemoryClient, resetMemoryClient, getUserId, getProjectId, configureMemory, getTableName } from './lib/client.js';
|
|
29
29
|
export type { MemoryClientConfig } from './lib/client.js';
|
package/dist/index.js
CHANGED
|
@@ -24,7 +24,7 @@ export { processEntitiesForMemory } from './lib/entity-pipeline.js';
|
|
|
24
24
|
// Multi-strategy retrieval (v2)
|
|
25
25
|
export { searchMemoriesV2, reciprocalRankFusion, detectStrategies, parseTemporalRange, findEntitiesInQuery, } from './lib/retrieval.js';
|
|
26
26
|
// Embeddings
|
|
27
|
-
export { generateEmbedding, generateEmbeddingsBatch, cosineSimilarity, formatEmbeddingForPgVector, parseEmbeddingFromPgVector, needsReembedding, checkEmbeddingHealth, EMBEDDING_CONFIG, } from './lib/embeddings.js';
|
|
27
|
+
export { generateEmbedding, generateEmbeddingsBatch, cosineSimilarity, formatEmbeddingForPgVector, parseEmbeddingFromPgVector, needsReembedding, checkEmbeddingHealth, EMBEDDING_CONFIG, getEmbeddingProvider, getEmbeddingConfig, resetEmbeddingProvider, } from './lib/embeddings.js';
|
|
28
28
|
// Formatting
|
|
29
29
|
export { CATEGORY_EMOJI, CATEGORY_EMOJI_SLACK, CATEGORY_EMOJI_TEXT, SOURCE_TYPE_EMOJI, getCategoryEmoji, } from './lib/formatting.js';
|
|
30
30
|
// Client configuration
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,SAAS;AACT,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEhD,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAmBhE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAExE,iBAAiB;AACjB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,sBAAsB,CAAA;AAG7B,0BAA0B;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAGxD,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG9C,+BAA+B;AAC/B,OAAO,EACL,WAAW,EACX,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,MAAM,EACN,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAExB,sBAAsB;AACtB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,oBAAoB,CAAA;AAG3B,6BAA6B;AAC7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAcnE,gCAAgC;AAChC,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,oBAAoB,CAAA;AAS3B,aAAa;AACb,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,0BAA0B,EAC1B,0BAA0B,EAC1B,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,SAAS;AACT,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEhD,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAmBhE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAExE,iBAAiB;AACjB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,sBAAsB,CAAA;AAG7B,0BAA0B;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAGxD,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG9C,+BAA+B;AAC/B,OAAO,EACL,WAAW,EACX,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,MAAM,EACN,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAExB,sBAAsB;AACtB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,oBAAoB,CAAA;AAG3B,6BAA6B;AAC7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAcnE,gCAAgC;AAChC,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,oBAAoB,CAAA;AAS3B,aAAa;AACb,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,0BAA0B,EAC1B,0BAA0B,EAC1B,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,qBAAqB,CAAA;AAG5B,aAAa;AACb,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAE5B,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG5H,kBAAkB;AAClB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAE1E,mBAAmB;AACnB,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAGzD,qBAAqB;AACrB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,EAC3B,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,6BAA6B,CAAA"}
|
package/dist/lib/borderline.js
CHANGED
|
@@ -17,7 +17,9 @@ function getClient() {
|
|
|
17
17
|
return client;
|
|
18
18
|
const apiKey = process.env.OPENAI_API_KEY;
|
|
19
19
|
if (!apiKey)
|
|
20
|
-
throw new Error('OPENAI_API_KEY not set'
|
|
20
|
+
throw new Error('OPENAI_API_KEY not set. Borderline decisions use GPT-4o-mini to classify memories ' +
|
|
21
|
+
'near the cosine similarity threshold. Without it, the system falls back to heuristic ' +
|
|
22
|
+
'scoring (still works, slightly less accurate). Set OPENAI_API_KEY to enable LLM triage.');
|
|
21
23
|
client = new OpenAI({ apiKey });
|
|
22
24
|
return client;
|
|
23
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"borderline.js","sourceRoot":"","sources":["../../src/lib/borderline.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAA;AAqB3B,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAE9E,IAAI,MAAM,GAAkB,IAAI,CAAA;AAEhC,SAAS,SAAS;IAChB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IACzB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;IACzC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,
|
|
1
|
+
{"version":3,"file":"borderline.js","sourceRoot":"","sources":["../../src/lib/borderline.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/embeddings.d.ts
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Embeddings
|
|
2
|
+
* Embeddings Provider System
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Provider-agnostic embedding generation. Supports:
|
|
5
|
+
* - OpenAI (text-embedding-3-small)
|
|
6
|
+
* - Gemini (gemini-embedding-001)
|
|
7
|
+
* - Amazon Bedrock (Nova Embeddings, Titan, etc.)
|
|
8
|
+
* - Ollama (local models)
|
|
9
|
+
* - None (BM25-only keyword search, no embeddings)
|
|
10
|
+
*
|
|
11
|
+
* Set EMBEDDING_PROVIDER env var: 'openai', 'gemini', 'bedrock', 'ollama', 'none'
|
|
12
|
+
* If not set, auto-detects from available API keys.
|
|
7
13
|
*/
|
|
8
|
-
export declare const EMBEDDING_CONFIG: {
|
|
9
|
-
readonly MODEL: "gemini-embedding-001" | "text-embedding-3-small";
|
|
10
|
-
readonly MODEL_VERSION: "v1";
|
|
11
|
-
readonly DIMENSIONS: 1536;
|
|
12
|
-
readonly PROVIDER: string;
|
|
13
|
-
readonly MAX_TOKENS: 8191;
|
|
14
|
-
};
|
|
15
14
|
export interface EmbeddingResult {
|
|
16
15
|
embedding: number[];
|
|
17
16
|
model: string;
|
|
@@ -22,8 +21,37 @@ export interface EmbeddingResult {
|
|
|
22
21
|
totalTokens: number;
|
|
23
22
|
};
|
|
24
23
|
}
|
|
24
|
+
export interface EmbeddingProvider {
|
|
25
|
+
generate(text: string): Promise<EmbeddingResult>;
|
|
26
|
+
generateBatch(texts: string[]): Promise<EmbeddingResult[]>;
|
|
27
|
+
readonly dimensions: number;
|
|
28
|
+
readonly model: string;
|
|
29
|
+
readonly provider: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get the configured embedding provider.
|
|
33
|
+
* Auto-detects from EMBEDDING_PROVIDER env var, or falls back to API key detection.
|
|
34
|
+
*/
|
|
35
|
+
export declare function getEmbeddingProvider(): EmbeddingProvider;
|
|
36
|
+
/** Reset singleton (for testing or reconfiguration) */
|
|
37
|
+
export declare function resetEmbeddingProvider(): void;
|
|
38
|
+
/** Dynamic config based on active provider */
|
|
39
|
+
export declare function getEmbeddingConfig(): {
|
|
40
|
+
MODEL: string;
|
|
41
|
+
MODEL_VERSION: string;
|
|
42
|
+
DIMENSIONS: number;
|
|
43
|
+
PROVIDER: string;
|
|
44
|
+
MAX_TOKENS: number;
|
|
45
|
+
};
|
|
46
|
+
export declare const EMBEDDING_CONFIG: {
|
|
47
|
+
readonly MODEL: string;
|
|
48
|
+
readonly MODEL_VERSION: "v1";
|
|
49
|
+
readonly DIMENSIONS: number;
|
|
50
|
+
readonly PROVIDER: string;
|
|
51
|
+
readonly MAX_TOKENS: 8191;
|
|
52
|
+
};
|
|
25
53
|
/**
|
|
26
|
-
* Generate embedding for a single text (
|
|
54
|
+
* Generate embedding for a single text (backward-compatible entry point)
|
|
27
55
|
*/
|
|
28
56
|
export declare function generateEmbedding(text: string): Promise<EmbeddingResult>;
|
|
29
57
|
/**
|
package/dist/lib/embeddings.js
CHANGED
|
@@ -1,117 +1,340 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Embeddings
|
|
2
|
+
* Embeddings Provider System
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Provider-agnostic embedding generation. Supports:
|
|
5
|
+
* - OpenAI (text-embedding-3-small)
|
|
6
|
+
* - Gemini (gemini-embedding-001)
|
|
7
|
+
* - Amazon Bedrock (Nova Embeddings, Titan, etc.)
|
|
8
|
+
* - Ollama (local models)
|
|
9
|
+
* - None (BM25-only keyword search, no embeddings)
|
|
10
|
+
*
|
|
11
|
+
* Set EMBEDDING_PROVIDER env var: 'openai', 'gemini', 'bedrock', 'ollama', 'none'
|
|
12
|
+
* If not set, auto-detects from available API keys.
|
|
7
13
|
*/
|
|
8
14
|
import OpenAI from 'openai';
|
|
9
|
-
//
|
|
10
|
-
|
|
11
|
-
//
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// OpenAI Provider
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
class OpenAIEmbeddingProvider {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.provider = 'openai';
|
|
21
|
+
this.model = 'text-embedding-3-small';
|
|
22
|
+
this.dimensions = 1536;
|
|
23
|
+
this.client = null;
|
|
24
|
+
}
|
|
25
|
+
getClient() {
|
|
26
|
+
if (this.client)
|
|
27
|
+
return this.client;
|
|
28
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
29
|
+
if (!apiKey) {
|
|
30
|
+
throw new Error('OPENAI_API_KEY environment variable is not set. ' +
|
|
31
|
+
'Get your API key from https://platform.openai.com/api-keys');
|
|
32
|
+
}
|
|
33
|
+
this.client = new OpenAI({ apiKey, baseURL: process.env.OPENAI_BASE_URL });
|
|
34
|
+
return this.client;
|
|
35
|
+
}
|
|
36
|
+
async generate(text) {
|
|
37
|
+
const client = this.getClient();
|
|
38
|
+
const truncated = text.slice(0, 8191 * 4);
|
|
39
|
+
const response = await client.embeddings.create({
|
|
40
|
+
model: this.model,
|
|
41
|
+
input: truncated,
|
|
42
|
+
encoding_format: 'float',
|
|
43
|
+
});
|
|
44
|
+
const data = response.data[0];
|
|
45
|
+
return {
|
|
46
|
+
embedding: data.embedding,
|
|
47
|
+
model: `openai/${this.model}`,
|
|
48
|
+
modelVersion: 'v1',
|
|
49
|
+
dimensions: this.dimensions,
|
|
50
|
+
usage: { promptTokens: response.usage.prompt_tokens, totalTokens: response.usage.total_tokens },
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async generateBatch(texts) {
|
|
54
|
+
if (texts.length === 0)
|
|
55
|
+
return [];
|
|
56
|
+
const client = this.getClient();
|
|
57
|
+
const truncated = texts.map(t => t.slice(0, 8191 * 4));
|
|
58
|
+
const response = await client.embeddings.create({
|
|
59
|
+
model: this.model,
|
|
60
|
+
input: truncated,
|
|
61
|
+
encoding_format: 'float',
|
|
62
|
+
});
|
|
63
|
+
return response.data.map(d => ({
|
|
64
|
+
embedding: d.embedding,
|
|
65
|
+
model: `openai/${this.model}`,
|
|
66
|
+
modelVersion: 'v1',
|
|
67
|
+
dimensions: this.dimensions,
|
|
68
|
+
usage: {
|
|
69
|
+
promptTokens: Math.floor(response.usage.prompt_tokens / texts.length),
|
|
70
|
+
totalTokens: Math.floor(response.usage.total_tokens / texts.length),
|
|
71
|
+
},
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Gemini Provider
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
class GeminiEmbeddingProvider {
|
|
79
|
+
constructor() {
|
|
80
|
+
this.provider = 'gemini';
|
|
81
|
+
this.model = 'gemini-embedding-001';
|
|
82
|
+
this.dimensions = 1536;
|
|
83
|
+
}
|
|
84
|
+
async generate(text) {
|
|
85
|
+
const apiKey = process.env.GOOGLE_API_KEY;
|
|
86
|
+
if (!apiKey) {
|
|
87
|
+
throw new Error('GOOGLE_API_KEY not set. Required when EMBEDDING_PROVIDER=gemini. Get one at https://aistudio.google.com');
|
|
88
|
+
}
|
|
89
|
+
const truncated = text.slice(0, 8191 * 4);
|
|
90
|
+
const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${this.model}:embedContent?key=${apiKey}`, {
|
|
91
|
+
method: 'POST',
|
|
92
|
+
headers: { 'Content-Type': 'application/json' },
|
|
93
|
+
body: JSON.stringify({
|
|
94
|
+
model: `models/${this.model}`,
|
|
95
|
+
content: { parts: [{ text: truncated }] },
|
|
96
|
+
outputDimensionality: this.dimensions,
|
|
97
|
+
}),
|
|
98
|
+
});
|
|
99
|
+
if (!response.ok) {
|
|
100
|
+
throw new Error(`Gemini embedding failed: ${response.status} ${response.statusText}`);
|
|
101
|
+
}
|
|
102
|
+
const data = await response.json();
|
|
103
|
+
return {
|
|
104
|
+
embedding: data.embedding.values,
|
|
105
|
+
model: `gemini/${this.model}`,
|
|
106
|
+
modelVersion: 'v1',
|
|
107
|
+
dimensions: data.embedding.values.length,
|
|
108
|
+
usage: { promptTokens: 0, totalTokens: 0 },
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async generateBatch(texts) {
|
|
112
|
+
// Gemini doesn't have a native batch API — sequential for now
|
|
113
|
+
return Promise.all(texts.map(t => this.generate(t)));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
// Bedrock Provider (Amazon Nova Embeddings, Titan, etc.)
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
class BedrockEmbeddingProvider {
|
|
120
|
+
constructor() {
|
|
121
|
+
this.provider = 'bedrock';
|
|
122
|
+
this._sdk = null;
|
|
123
|
+
this.model = process.env.EMBEDDING_MODEL || 'amazon.nova-embed-v1:0';
|
|
124
|
+
this.dimensions = parseInt(process.env.EMBEDDING_DIMENSIONS || '1536', 10);
|
|
125
|
+
}
|
|
126
|
+
async getSdk() {
|
|
127
|
+
if (this._sdk)
|
|
128
|
+
return this._sdk;
|
|
129
|
+
try {
|
|
130
|
+
// Dynamic import — @aws-sdk is optional, only loaded when EMBEDDING_PROVIDER=bedrock
|
|
131
|
+
const mod = await Function('return import("@aws-sdk/client-bedrock-runtime")')();
|
|
132
|
+
this._sdk = {
|
|
133
|
+
client: new mod.BedrockRuntimeClient({ region: process.env.AWS_REGION || 'us-east-1' }),
|
|
134
|
+
InvokeModelCommand: mod.InvokeModelCommand,
|
|
135
|
+
};
|
|
136
|
+
return this._sdk;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
throw new Error('Amazon Bedrock requires @aws-sdk/client-bedrock-runtime. ' +
|
|
140
|
+
'Install it: npm install @aws-sdk/client-bedrock-runtime\n' +
|
|
141
|
+
'Then set AWS_REGION and configure AWS credentials (IAM role, env vars, or ~/.aws/credentials).');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async generate(text) {
|
|
145
|
+
const { client, InvokeModelCommand } = await this.getSdk();
|
|
146
|
+
const truncated = text.slice(0, 8191 * 4);
|
|
147
|
+
const command = new InvokeModelCommand({
|
|
148
|
+
modelId: this.model,
|
|
149
|
+
contentType: 'application/json',
|
|
150
|
+
accept: 'application/json',
|
|
151
|
+
body: JSON.stringify({
|
|
152
|
+
inputText: truncated,
|
|
153
|
+
dimensions: this.dimensions,
|
|
154
|
+
}),
|
|
155
|
+
});
|
|
156
|
+
const response = await client.send(command);
|
|
157
|
+
const body = JSON.parse(new TextDecoder().decode(response.body));
|
|
158
|
+
const embedding = body.embedding || body.embeddings?.[0];
|
|
159
|
+
if (!embedding) {
|
|
160
|
+
throw new Error(`Bedrock model ${this.model} returned no embedding. Response keys: ${Object.keys(body).join(', ')}`);
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
embedding,
|
|
164
|
+
model: `bedrock/${this.model}`,
|
|
165
|
+
modelVersion: 'v1',
|
|
166
|
+
dimensions: embedding.length,
|
|
167
|
+
usage: { promptTokens: body.inputTextTokenCount || 0, totalTokens: body.inputTextTokenCount || 0 },
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
async generateBatch(texts) {
|
|
171
|
+
// Bedrock doesn't have a native batch embedding API — sequential
|
|
172
|
+
return Promise.all(texts.map(t => this.generate(t)));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// ---------------------------------------------------------------------------
|
|
176
|
+
// Ollama Provider (local models)
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
class OllamaEmbeddingProvider {
|
|
179
|
+
constructor() {
|
|
180
|
+
this.provider = 'ollama';
|
|
181
|
+
this.model = process.env.EMBEDDING_MODEL || 'nomic-embed-text';
|
|
182
|
+
this.dimensions = parseInt(process.env.EMBEDDING_DIMENSIONS || '768', 10);
|
|
183
|
+
this.baseUrl = process.env.OLLAMA_BASE_URL || 'http://localhost:11434';
|
|
184
|
+
}
|
|
185
|
+
async generate(text) {
|
|
186
|
+
const truncated = text.slice(0, 8191 * 4);
|
|
187
|
+
const response = await fetch(`${this.baseUrl}/api/embed`, {
|
|
188
|
+
method: 'POST',
|
|
189
|
+
headers: { 'Content-Type': 'application/json' },
|
|
190
|
+
body: JSON.stringify({ model: this.model, input: truncated }),
|
|
191
|
+
});
|
|
192
|
+
if (!response.ok) {
|
|
193
|
+
throw new Error(`Ollama embedding failed: ${response.status} ${response.statusText}. ` +
|
|
194
|
+
`Is Ollama running at ${this.baseUrl}? Has model '${this.model}' been pulled?`);
|
|
195
|
+
}
|
|
196
|
+
const data = await response.json();
|
|
197
|
+
const embedding = data.embeddings[0];
|
|
198
|
+
return {
|
|
199
|
+
embedding,
|
|
200
|
+
model: `ollama/${this.model}`,
|
|
201
|
+
modelVersion: 'v1',
|
|
202
|
+
dimensions: embedding.length,
|
|
203
|
+
usage: { promptTokens: 0, totalTokens: 0 },
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
async generateBatch(texts) {
|
|
207
|
+
// Ollama supports batch via array input
|
|
208
|
+
const truncated = texts.map(t => t.slice(0, 8191 * 4));
|
|
209
|
+
const response = await fetch(`${this.baseUrl}/api/embed`, {
|
|
210
|
+
method: 'POST',
|
|
211
|
+
headers: { 'Content-Type': 'application/json' },
|
|
212
|
+
body: JSON.stringify({ model: this.model, input: truncated }),
|
|
213
|
+
});
|
|
214
|
+
if (!response.ok) {
|
|
215
|
+
throw new Error(`Ollama batch embedding failed: ${response.status}`);
|
|
216
|
+
}
|
|
217
|
+
const data = await response.json();
|
|
218
|
+
return data.embeddings.map(emb => ({
|
|
219
|
+
embedding: emb,
|
|
220
|
+
model: `ollama/${this.model}`,
|
|
221
|
+
modelVersion: 'v1',
|
|
222
|
+
dimensions: emb.length,
|
|
223
|
+
usage: { promptTokens: 0, totalTokens: 0 },
|
|
224
|
+
}));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// ---------------------------------------------------------------------------
|
|
228
|
+
// Null Provider (BM25-only, no embeddings)
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
class NullEmbeddingProvider {
|
|
231
|
+
constructor() {
|
|
232
|
+
this.provider = 'none';
|
|
233
|
+
this.model = 'none';
|
|
234
|
+
this.dimensions = 0;
|
|
235
|
+
}
|
|
236
|
+
async generate(_text) {
|
|
237
|
+
return {
|
|
238
|
+
embedding: [],
|
|
239
|
+
model: 'none',
|
|
240
|
+
modelVersion: 'v1',
|
|
241
|
+
dimensions: 0,
|
|
242
|
+
usage: { promptTokens: 0, totalTokens: 0 },
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
async generateBatch(texts) {
|
|
246
|
+
return texts.map(() => ({
|
|
247
|
+
embedding: [],
|
|
248
|
+
model: 'none',
|
|
249
|
+
modelVersion: 'v1',
|
|
250
|
+
dimensions: 0,
|
|
251
|
+
usage: { promptTokens: 0, totalTokens: 0 },
|
|
252
|
+
}));
|
|
253
|
+
}
|
|
31
254
|
}
|
|
255
|
+
// ---------------------------------------------------------------------------
|
|
256
|
+
// Factory + Singleton
|
|
257
|
+
// ---------------------------------------------------------------------------
|
|
258
|
+
let providerInstance = null;
|
|
32
259
|
/**
|
|
33
|
-
*
|
|
260
|
+
* Get the configured embedding provider.
|
|
261
|
+
* Auto-detects from EMBEDDING_PROVIDER env var, or falls back to API key detection.
|
|
34
262
|
*/
|
|
35
|
-
export
|
|
36
|
-
if (
|
|
37
|
-
return
|
|
263
|
+
export function getEmbeddingProvider() {
|
|
264
|
+
if (providerInstance)
|
|
265
|
+
return providerInstance;
|
|
266
|
+
const type = process.env.EMBEDDING_PROVIDER;
|
|
267
|
+
switch (type) {
|
|
268
|
+
case 'openai':
|
|
269
|
+
providerInstance = new OpenAIEmbeddingProvider();
|
|
270
|
+
break;
|
|
271
|
+
case 'gemini':
|
|
272
|
+
providerInstance = new GeminiEmbeddingProvider();
|
|
273
|
+
break;
|
|
274
|
+
case 'bedrock':
|
|
275
|
+
providerInstance = new BedrockEmbeddingProvider();
|
|
276
|
+
break;
|
|
277
|
+
case 'ollama':
|
|
278
|
+
providerInstance = new OllamaEmbeddingProvider();
|
|
279
|
+
break;
|
|
280
|
+
case 'none':
|
|
281
|
+
providerInstance = new NullEmbeddingProvider();
|
|
282
|
+
break;
|
|
283
|
+
default:
|
|
284
|
+
// Auto-detect from available API keys (backward compat)
|
|
285
|
+
if (process.env.OPENAI_API_KEY) {
|
|
286
|
+
providerInstance = new OpenAIEmbeddingProvider();
|
|
287
|
+
}
|
|
288
|
+
else if (process.env.GOOGLE_API_KEY) {
|
|
289
|
+
providerInstance = new GeminiEmbeddingProvider();
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
providerInstance = new NullEmbeddingProvider();
|
|
293
|
+
}
|
|
38
294
|
}
|
|
39
|
-
return
|
|
295
|
+
return providerInstance;
|
|
40
296
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const truncatedText = text.slice(0, maxChars);
|
|
45
|
-
const response = await client.embeddings.create({
|
|
46
|
-
model: 'text-embedding-3-small',
|
|
47
|
-
input: truncatedText,
|
|
48
|
-
encoding_format: 'float',
|
|
49
|
-
});
|
|
50
|
-
const embeddingData = response.data[0];
|
|
51
|
-
return {
|
|
52
|
-
embedding: embeddingData.embedding,
|
|
53
|
-
model: 'openai/text-embedding-3-small',
|
|
54
|
-
modelVersion: 'v1',
|
|
55
|
-
dimensions: EMBEDDING_CONFIG.DIMENSIONS,
|
|
56
|
-
usage: {
|
|
57
|
-
promptTokens: response.usage.prompt_tokens,
|
|
58
|
-
totalTokens: response.usage.total_tokens,
|
|
59
|
-
},
|
|
60
|
-
};
|
|
297
|
+
/** Reset singleton (for testing or reconfiguration) */
|
|
298
|
+
export function resetEmbeddingProvider() {
|
|
299
|
+
providerInstance = null;
|
|
61
300
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const
|
|
68
|
-
const truncatedText = text.slice(0, maxChars);
|
|
69
|
-
const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-embedding-001:embedContent?key=${apiKey}`, {
|
|
70
|
-
method: 'POST',
|
|
71
|
-
headers: { 'Content-Type': 'application/json' },
|
|
72
|
-
body: JSON.stringify({
|
|
73
|
-
model: 'models/gemini-embedding-001',
|
|
74
|
-
content: { parts: [{ text: truncatedText }] },
|
|
75
|
-
outputDimensionality: EMBEDDING_CONFIG.DIMENSIONS,
|
|
76
|
-
}),
|
|
77
|
-
});
|
|
78
|
-
if (!response.ok) {
|
|
79
|
-
throw new Error(`Gemini embedding failed: ${response.status} ${response.statusText}`);
|
|
80
|
-
}
|
|
81
|
-
const data = await response.json();
|
|
301
|
+
// ---------------------------------------------------------------------------
|
|
302
|
+
// Backward-compatible API (existing callers use these)
|
|
303
|
+
// ---------------------------------------------------------------------------
|
|
304
|
+
/** Dynamic config based on active provider */
|
|
305
|
+
export function getEmbeddingConfig() {
|
|
306
|
+
const p = getEmbeddingProvider();
|
|
82
307
|
return {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
308
|
+
MODEL: p.model,
|
|
309
|
+
MODEL_VERSION: 'v1',
|
|
310
|
+
DIMENSIONS: p.dimensions,
|
|
311
|
+
PROVIDER: p.provider,
|
|
312
|
+
MAX_TOKENS: 8191,
|
|
88
313
|
};
|
|
89
314
|
}
|
|
315
|
+
// Keep the old constant for backward compat (code that imports EMBEDDING_CONFIG directly)
|
|
316
|
+
export const EMBEDDING_CONFIG = {
|
|
317
|
+
get MODEL() { return getEmbeddingConfig().MODEL; },
|
|
318
|
+
MODEL_VERSION: 'v1',
|
|
319
|
+
get DIMENSIONS() { return getEmbeddingConfig().DIMENSIONS; },
|
|
320
|
+
get PROVIDER() { return getEmbeddingConfig().PROVIDER; },
|
|
321
|
+
MAX_TOKENS: 8191,
|
|
322
|
+
};
|
|
323
|
+
/**
|
|
324
|
+
* Generate embedding for a single text (backward-compatible entry point)
|
|
325
|
+
*/
|
|
326
|
+
export async function generateEmbedding(text) {
|
|
327
|
+
return getEmbeddingProvider().generate(text);
|
|
328
|
+
}
|
|
90
329
|
/**
|
|
91
330
|
* Generate embeddings for multiple texts in batch
|
|
92
331
|
*/
|
|
93
332
|
export async function generateEmbeddingsBatch(texts) {
|
|
94
|
-
|
|
95
|
-
return [];
|
|
96
|
-
const client = getOpenAIClient();
|
|
97
|
-
const maxChars = EMBEDDING_CONFIG.MAX_TOKENS * 4;
|
|
98
|
-
const truncatedTexts = texts.map(t => t.slice(0, maxChars));
|
|
99
|
-
const response = await client.embeddings.create({
|
|
100
|
-
model: EMBEDDING_CONFIG.MODEL,
|
|
101
|
-
input: truncatedTexts,
|
|
102
|
-
encoding_format: 'float',
|
|
103
|
-
});
|
|
104
|
-
return response.data.map((embeddingData) => ({
|
|
105
|
-
embedding: embeddingData.embedding,
|
|
106
|
-
model: `${EMBEDDING_CONFIG.PROVIDER}/${EMBEDDING_CONFIG.MODEL}`,
|
|
107
|
-
modelVersion: EMBEDDING_CONFIG.MODEL_VERSION,
|
|
108
|
-
dimensions: EMBEDDING_CONFIG.DIMENSIONS,
|
|
109
|
-
usage: {
|
|
110
|
-
promptTokens: Math.floor(response.usage.prompt_tokens / texts.length),
|
|
111
|
-
totalTokens: Math.floor(response.usage.total_tokens / texts.length),
|
|
112
|
-
},
|
|
113
|
-
}));
|
|
333
|
+
return getEmbeddingProvider().generateBatch(texts);
|
|
114
334
|
}
|
|
335
|
+
// ---------------------------------------------------------------------------
|
|
336
|
+
// Utility functions (provider-agnostic)
|
|
337
|
+
// ---------------------------------------------------------------------------
|
|
115
338
|
/**
|
|
116
339
|
* Calculate cosine similarity between two embeddings
|
|
117
340
|
*/
|
|
@@ -119,18 +342,14 @@ export function cosineSimilarity(a, b) {
|
|
|
119
342
|
if (a.length !== b.length) {
|
|
120
343
|
throw new Error(`Embedding dimensions don't match: ${a.length} vs ${b.length}`);
|
|
121
344
|
}
|
|
122
|
-
let dotProduct = 0;
|
|
123
|
-
let normA = 0;
|
|
124
|
-
let normB = 0;
|
|
345
|
+
let dotProduct = 0, normA = 0, normB = 0;
|
|
125
346
|
for (let i = 0; i < a.length; i++) {
|
|
126
347
|
dotProduct += a[i] * b[i];
|
|
127
348
|
normA += a[i] * a[i];
|
|
128
349
|
normB += b[i] * b[i];
|
|
129
350
|
}
|
|
130
351
|
const magnitude = Math.sqrt(normA) * Math.sqrt(normB);
|
|
131
|
-
|
|
132
|
-
return 0;
|
|
133
|
-
return dotProduct / magnitude;
|
|
352
|
+
return magnitude === 0 ? 0 : dotProduct / magnitude;
|
|
134
353
|
}
|
|
135
354
|
/**
|
|
136
355
|
* Format embedding for Supabase pgvector storage
|
|
@@ -154,76 +373,37 @@ export function parseEmbeddingFromPgVector(pgvectorString) {
|
|
|
154
373
|
* Check if embeddings need regeneration
|
|
155
374
|
*/
|
|
156
375
|
export function needsReembedding(currentModel, currentVersion) {
|
|
157
|
-
const
|
|
158
|
-
const
|
|
159
|
-
return currentModel !== expectedModel || currentVersion !==
|
|
376
|
+
const config = getEmbeddingConfig();
|
|
377
|
+
const expectedModel = `${config.PROVIDER}/${config.MODEL}`;
|
|
378
|
+
return currentModel !== expectedModel || currentVersion !== config.MODEL_VERSION;
|
|
160
379
|
}
|
|
161
380
|
/**
|
|
162
381
|
* Check embedding service health
|
|
163
382
|
*/
|
|
164
383
|
export async function checkEmbeddingHealth() {
|
|
384
|
+
const provider = getEmbeddingProvider();
|
|
385
|
+
if (provider.provider === 'none') {
|
|
386
|
+
return { status: 'degraded', canStore: true, canSearch: false, reason: 'No embedding provider configured. BM25 keyword search only.' };
|
|
387
|
+
}
|
|
165
388
|
const startTime = Date.now();
|
|
166
389
|
try {
|
|
167
|
-
const
|
|
168
|
-
const response = await client.embeddings.create({
|
|
169
|
-
model: EMBEDDING_CONFIG.MODEL,
|
|
170
|
-
input: 'health check',
|
|
171
|
-
encoding_format: 'float',
|
|
172
|
-
});
|
|
390
|
+
const result = await provider.generate('health check');
|
|
173
391
|
const latencyMs = Date.now() - startTime;
|
|
174
|
-
if (!
|
|
175
|
-
return {
|
|
176
|
-
status: 'degraded',
|
|
177
|
-
canStore: false,
|
|
178
|
-
canSearch: false,
|
|
179
|
-
reason: 'OpenAI returned empty embedding',
|
|
180
|
-
latencyMs,
|
|
181
|
-
};
|
|
392
|
+
if (!result.embedding?.length) {
|
|
393
|
+
return { status: 'degraded', canStore: false, canSearch: false, reason: 'Provider returned empty embedding', latencyMs };
|
|
182
394
|
}
|
|
183
|
-
return {
|
|
184
|
-
status: 'healthy',
|
|
185
|
-
canStore: true,
|
|
186
|
-
canSearch: true,
|
|
187
|
-
latencyMs,
|
|
188
|
-
};
|
|
395
|
+
return { status: 'healthy', canStore: true, canSearch: true, latencyMs };
|
|
189
396
|
}
|
|
190
397
|
catch (error) {
|
|
191
398
|
const latencyMs = Date.now() - startTime;
|
|
192
|
-
const
|
|
193
|
-
const
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
errorMessage.includes('unauthorized');
|
|
201
|
-
if (isQuotaExceeded) {
|
|
202
|
-
return {
|
|
203
|
-
status: 'degraded',
|
|
204
|
-
canStore: false,
|
|
205
|
-
canSearch: false,
|
|
206
|
-
reason: 'OpenAI quota exceeded - cannot generate embeddings',
|
|
207
|
-
quotaExceeded: true,
|
|
208
|
-
latencyMs,
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
if (isAuthError) {
|
|
212
|
-
return {
|
|
213
|
-
status: 'failed',
|
|
214
|
-
canStore: false,
|
|
215
|
-
canSearch: false,
|
|
216
|
-
reason: 'OpenAI API key invalid or missing',
|
|
217
|
-
latencyMs,
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
return {
|
|
221
|
-
status: 'failed',
|
|
222
|
-
canStore: false,
|
|
223
|
-
canSearch: false,
|
|
224
|
-
reason: errorMessage,
|
|
225
|
-
latencyMs,
|
|
226
|
-
};
|
|
399
|
+
const msg = error instanceof Error ? error.message : 'Unknown error';
|
|
400
|
+
const isQuota = msg.includes('quota') || msg.includes('rate limit') || msg.includes('exceeded');
|
|
401
|
+
const isAuth = msg.includes('API key') || msg.includes('authentication') || msg.includes('unauthorized');
|
|
402
|
+
if (isQuota)
|
|
403
|
+
return { status: 'degraded', canStore: false, canSearch: false, reason: 'API quota exceeded', quotaExceeded: true, latencyMs };
|
|
404
|
+
if (isAuth)
|
|
405
|
+
return { status: 'failed', canStore: false, canSearch: false, reason: 'API key invalid or missing', latencyMs };
|
|
406
|
+
return { status: 'failed', canStore: false, canSearch: false, reason: msg, latencyMs };
|
|
227
407
|
}
|
|
228
408
|
}
|
|
229
409
|
//# sourceMappingURL=embeddings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/lib/embeddings.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/lib/embeddings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAA;AAyB3B,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,uBAAuB;IAA7B;QACW,aAAQ,GAAG,QAAQ,CAAA;QACnB,UAAK,GAAG,wBAAwB,CAAA;QAChC,eAAU,GAAG,IAAI,CAAA;QAClB,WAAM,GAAkB,IAAI,CAAA;IAqDtC,CAAC;IAnDS,SAAS;QACf,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAA;QACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,kDAAkD;gBAClD,4DAA4D,CAC7D,CAAA;QACH,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAA;QAC1E,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAA;QACzC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;YAC9C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,SAAS;YAChB,eAAe,EAAE,OAAO;SACzB,CAAC,CAAA;QACF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC7B,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YAC7B,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,KAAK,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE;SAChG,CAAA;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAe;QACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;QACtD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;YAC9C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,SAAS;YAChB,eAAe,EAAE,OAAO;SACzB,CAAC,CAAA;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YAC7B,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,KAAK,EAAE;gBACL,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;gBACrE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;aACpE;SACF,CAAC,CAAC,CAAA;IACL,CAAC;CACF;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,uBAAuB;IAA7B;QACW,aAAQ,GAAG,QAAQ,CAAA;QACnB,UAAK,GAAG,sBAAsB,CAAA;QAC9B,eAAU,GAAG,IAAI,CAAA;IAqC5B,CAAC;IAnCC,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,yGAAyG,CAAC,CAAA;QAC5H,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAA;QACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,2DAA2D,IAAI,CAAC,KAAK,qBAAqB,MAAM,EAAE,EAClG;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;gBAC7B,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE;gBACzC,oBAAoB,EAAE,IAAI,CAAC,UAAU;aACtC,CAAC;SACH,CACF,CAAA;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;QACvF,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAyC,CAAA;QACzE,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;YAChC,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YAC7B,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM;YACxC,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;SAC3C,CAAA;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAe;QACjC,8DAA8D;QAC9D,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACtD,CAAC;CACF;AAED,8EAA8E;AAC9E,yDAAyD;AACzD,8EAA8E;AAE9E,MAAM,wBAAwB;IAM5B;QALS,aAAQ,GAAG,SAAS,CAAA;QAGrB,SAAI,GAAoD,IAAI,CAAA;QAGlE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,wBAAwB,CAAA;QACpE,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAA;IAC5E,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,CAAA;QAC/B,IAAI,CAAC;YACH,qFAAqF;YACrF,MAAM,GAAG,GAAG,MAAO,QAAQ,CAAC,kDAAkD,CAAC,EAAmB,CAAA;YAClG,IAAI,CAAC,IAAI,GAAG;gBACV,MAAM,EAAE,IAAI,GAAG,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW,EAAE,CAAC;gBACvF,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;aAC3C,CAAA;YACD,OAAO,IAAI,CAAC,IAAI,CAAA;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,2DAA2D;gBAC3D,2DAA2D;gBAC3D,gGAAgG,CACjG,CAAA;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAA;QAEzC,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC;YACrC,OAAO,EAAE,IAAI,CAAC,KAAK;YACnB,WAAW,EAAE,kBAAkB;YAC/B,MAAM,EAAE,kBAAkB;YAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS,EAAE,SAAS;gBACpB,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B,CAAC;SACH,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;QAExD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,KAAK,0CAA0C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACtH,CAAC;QAED,OAAO;YACL,SAAS;YACT,KAAK,EAAE,WAAW,IAAI,CAAC,KAAK,EAAE;YAC9B,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,SAAS,CAAC,MAAM;YAC5B,KAAK,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,mBAAmB,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,mBAAmB,IAAI,CAAC,EAAE;SACnG,CAAA;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAe;QACjC,iEAAiE;QACjE,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACtD,CAAC;CACF;AAED,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E,MAAM,uBAAuB;IAM3B;QALS,aAAQ,GAAG,QAAQ,CAAA;QAM1B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,kBAAkB,CAAA;QAC9D,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,KAAK,EAAE,EAAE,CAAC,CAAA;QACzE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,wBAAwB,CAAA;IACxE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAA;QACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SAC9D,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,4BAA4B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,IAAI;gBACtE,wBAAwB,IAAI,CAAC,OAAO,gBAAgB,IAAI,CAAC,KAAK,gBAAgB,CAC/E,CAAA;QACH,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAgC,CAAA;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAEpC,OAAO;YACL,SAAS;YACT,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YAC7B,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,SAAS,CAAC,MAAM;YAC5B,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;SAC3C,CAAA;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAe;QACjC,wCAAwC;QACxC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;QACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SAC9D,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QACtE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAgC,CAAA;QAChE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjC,SAAS,EAAE,GAAG;YACd,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YAC7B,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,GAAG,CAAC,MAAM;YACtB,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;SAC3C,CAAC,CAAC,CAAA;IACL,CAAC;CACF;AAED,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E,MAAM,qBAAqB;IAA3B;QACW,aAAQ,GAAG,MAAM,CAAA;QACjB,UAAK,GAAG,MAAM,CAAA;QACd,eAAU,GAAG,CAAC,CAAA;IAqBzB,CAAC;IAnBC,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,OAAO;YACL,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,MAAM;YACb,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;SAC3C,CAAA;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAe;QACjC,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YACtB,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,MAAM;YACb,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;SAC3C,CAAC,CAAC,CAAA;IACL,CAAC;CACF;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,IAAI,gBAAgB,GAA6B,IAAI,CAAA;AAErD;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,gBAAgB;QAAE,OAAO,gBAAgB,CAAA;IAE7C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;IAE3C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,gBAAgB,GAAG,IAAI,uBAAuB,EAAE,CAAA;YAChD,MAAK;QACP,KAAK,QAAQ;YACX,gBAAgB,GAAG,IAAI,uBAAuB,EAAE,CAAA;YAChD,MAAK;QACP,KAAK,SAAS;YACZ,gBAAgB,GAAG,IAAI,wBAAwB,EAAE,CAAA;YACjD,MAAK;QACP,KAAK,QAAQ;YACX,gBAAgB,GAAG,IAAI,uBAAuB,EAAE,CAAA;YAChD,MAAK;QACP,KAAK,MAAM;YACT,gBAAgB,GAAG,IAAI,qBAAqB,EAAE,CAAA;YAC9C,MAAK;QACP;YACE,wDAAwD;YACxD,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;gBAC/B,gBAAgB,GAAG,IAAI,uBAAuB,EAAE,CAAA;YAClD,CAAC;iBAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;gBACtC,gBAAgB,GAAG,IAAI,uBAAuB,EAAE,CAAA;YAClD,CAAC;iBAAM,CAAC;gBACN,gBAAgB,GAAG,IAAI,qBAAqB,EAAE,CAAA;YAChD,CAAC;IACL,CAAC;IAED,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,sBAAsB;IACpC,gBAAgB,GAAG,IAAI,CAAA;AACzB,CAAC;AAED,8EAA8E;AAC9E,uDAAuD;AACvD,8EAA8E;AAE9E,8CAA8C;AAC9C,MAAM,UAAU,kBAAkB;IAChC,MAAM,CAAC,GAAG,oBAAoB,EAAE,CAAA;IAChC,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,IAAI;KACjB,CAAA;AACH,CAAC;AAED,0FAA0F;AAC1F,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,KAAK,KAAK,OAAO,kBAAkB,EAAE,CAAC,KAAK,CAAA,CAAC,CAAC;IACjD,aAAa,EAAE,IAAI;IACnB,IAAI,UAAU,KAAK,OAAO,kBAAkB,EAAE,CAAC,UAAU,CAAA,CAAC,CAAC;IAC3D,IAAI,QAAQ,KAAK,OAAO,kBAAkB,EAAE,CAAC,QAAQ,CAAA,CAAC,CAAC;IACvD,UAAU,EAAE,IAAI;CACR,CAAA;AAEV;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAClD,OAAO,oBAAoB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAe;IAC3D,OAAO,oBAAoB,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;AACpD,CAAC;AAED,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;IACjF,CAAC;IACD,IAAI,UAAU,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAA;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACzB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACpB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACtB,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrD,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,SAAS,CAAA;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,SAAmB;IAC5D,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,cAAsB;IAC/D,IAAI,CAAC,cAAc;QAAE,OAAO,EAAE,CAAA;IAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,OAAQ,cAAsC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC5D,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IACtD,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,YAAoB,EAAE,cAAsB;IAC3E,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAA;IACnC,MAAM,aAAa,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAA;IAC1D,OAAO,YAAY,KAAK,aAAa,IAAI,cAAc,KAAK,MAAM,CAAC,aAAa,CAAA;AAClF,CAAC;AAeD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAA;IACvC,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACjC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,6DAA6D,EAAE,CAAA;IACxI,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;QACxC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YAC9B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,mCAAmC,EAAE,SAAS,EAAE,CAAA;QAC1H,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IAC1E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;QACxC,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAA;QACpE,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QAC/F,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;QACxG,IAAI,OAAO;YAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;QAC3I,IAAI,MAAM;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,EAAE,SAAS,EAAE,CAAA;QAC3H,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAA;IACxF,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@traqr/memory",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Persistent memory for AI agents. Multi-strategy retrieval (semantic + BM25 + RRF), 3-zone cosine triage, type-aware lifecycle, entity canonicalization. Postgres + pgvector.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|