@mrc2204/agent-smart-memo 4.1.2 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +317 -135
- package/dist/adapters/openclaw/tool-runtime.d.ts +29 -0
- package/dist/adapters/openclaw/tool-runtime.d.ts.map +1 -0
- package/dist/adapters/openclaw/tool-runtime.js +48 -0
- package/dist/adapters/openclaw/tool-runtime.js.map +1 -0
- package/dist/core/contracts/adapter-contracts.d.ts +31 -0
- package/dist/core/contracts/adapter-contracts.d.ts.map +1 -0
- package/dist/core/contracts/adapter-contracts.js +2 -0
- package/dist/core/contracts/adapter-contracts.js.map +1 -0
- package/dist/core/runtime-boundary.d.ts +23 -0
- package/dist/core/runtime-boundary.d.ts.map +1 -0
- package/dist/core/runtime-boundary.js +39 -0
- package/dist/core/runtime-boundary.js.map +1 -0
- package/dist/core/usecases/default-memory-usecase-port.d.ts +21 -0
- package/dist/core/usecases/default-memory-usecase-port.d.ts.map +1 -0
- package/dist/core/usecases/default-memory-usecase-port.js +263 -0
- package/dist/core/usecases/default-memory-usecase-port.js.map +1 -0
- package/dist/core/usecases/semantic-memory-usecase.d.ts +52 -0
- package/dist/core/usecases/semantic-memory-usecase.d.ts.map +1 -0
- package/dist/core/usecases/semantic-memory-usecase.js +136 -0
- package/dist/core/usecases/semantic-memory-usecase.js.map +1 -0
- package/dist/hooks/tool-context-injector.d.ts +9 -0
- package/dist/hooks/tool-context-injector.d.ts.map +1 -0
- package/dist/hooks/tool-context-injector.js +55 -0
- package/dist/hooks/tool-context-injector.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -10
- package/dist/index.js.map +1 -1
- package/dist/tools/graph-tools.d.ts +2 -0
- package/dist/tools/graph-tools.d.ts.map +1 -1
- package/dist/tools/graph-tools.js +126 -177
- package/dist/tools/graph-tools.js.map +1 -1
- package/dist/tools/semantic-memory-tools.d.ts +8 -0
- package/dist/tools/semantic-memory-tools.d.ts.map +1 -0
- package/dist/tools/semantic-memory-tools.js +111 -0
- package/dist/tools/semantic-memory-tools.js.map +1 -0
- package/dist/tools/slot-tools.d.ts +3 -1
- package/dist/tools/slot-tools.d.ts.map +1 -1
- package/dist/tools/slot-tools.js +82 -156
- package/dist/tools/slot-tools.js.map +1 -1
- package/package.json +25 -32
- package/dist/config.d.ts +0 -62
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -102
- package/dist/config.js.map +0 -1
- package/dist/scripts/reembed-collection.d.ts +0 -2
- package/dist/scripts/reembed-collection.d.ts.map +0 -1
- package/dist/scripts/reembed-collection.js +0 -165
- package/dist/scripts/reembed-collection.js.map +0 -1
- package/dist/tools/memory_search.d.ts +0 -89
- package/dist/tools/memory_search.d.ts.map +0 -1
- package/dist/tools/memory_search.js +0 -188
- package/dist/tools/memory_search.js.map +0 -1
- package/dist/tools/memory_store.d.ts +0 -65
- package/dist/tools/memory_store.d.ts.map +0 -1
- package/dist/tools/memory_store.js +0 -196
- package/dist/tools/memory_store.js.map +0 -1
package/dist/config.d.ts
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration loader for Agent-Memo Plugin
|
|
3
|
-
* Reads from environment variables or .env file
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Plugin configuration object
|
|
7
|
-
* All values read from environment variables with sensible defaults
|
|
8
|
-
*/
|
|
9
|
-
export declare const PluginConfig: {
|
|
10
|
-
qdrant: {
|
|
11
|
-
host: string;
|
|
12
|
-
port: number;
|
|
13
|
-
collection: string;
|
|
14
|
-
timeout: number;
|
|
15
|
-
};
|
|
16
|
-
ollama: {
|
|
17
|
-
host: string;
|
|
18
|
-
port: number;
|
|
19
|
-
model: string;
|
|
20
|
-
timeout: number;
|
|
21
|
-
readonly baseUrl: string;
|
|
22
|
-
};
|
|
23
|
-
embedding: {
|
|
24
|
-
model: string;
|
|
25
|
-
dimensions: number;
|
|
26
|
-
apiUrl: string;
|
|
27
|
-
};
|
|
28
|
-
autoCapture: {
|
|
29
|
-
enabled: boolean;
|
|
30
|
-
minConfidence: number;
|
|
31
|
-
useLLM: boolean;
|
|
32
|
-
agentBlocklist: string[];
|
|
33
|
-
noisePatterns: RegExp[];
|
|
34
|
-
maxMessagesPerCapture: number;
|
|
35
|
-
minContentLength: number;
|
|
36
|
-
noiseThreshold: number;
|
|
37
|
-
};
|
|
38
|
-
contextWindow: {
|
|
39
|
-
maxConversationTokens: number;
|
|
40
|
-
tokenEstimateDivisor: number;
|
|
41
|
-
absoluteMaxMessages: number;
|
|
42
|
-
};
|
|
43
|
-
stateDir: string;
|
|
44
|
-
slotDbDir: string;
|
|
45
|
-
defaults: {
|
|
46
|
-
namespace: string;
|
|
47
|
-
slotCategories: string[];
|
|
48
|
-
};
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* Validate configuration
|
|
52
|
-
* Checks if required services are accessible
|
|
53
|
-
*/
|
|
54
|
-
export declare function validateConfig(): Promise<{
|
|
55
|
-
qdrant: boolean;
|
|
56
|
-
ollama: boolean;
|
|
57
|
-
}>;
|
|
58
|
-
/**
|
|
59
|
-
* Print configuration (for debugging)
|
|
60
|
-
*/
|
|
61
|
-
export declare function printConfig(): void;
|
|
62
|
-
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8DxB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAyBpF;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAQlC"}
|
package/dist/config.js
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration loader for Agent-Memo Plugin
|
|
3
|
-
* Reads from environment variables or .env file
|
|
4
|
-
*/
|
|
5
|
-
import { config } from "dotenv";
|
|
6
|
-
import { join } from "path";
|
|
7
|
-
// Load .env file from plugin directory
|
|
8
|
-
config({ path: join(import.meta.dirname || "", "../.env") });
|
|
9
|
-
/**
|
|
10
|
-
* Plugin configuration object
|
|
11
|
-
* All values read from environment variables with sensible defaults
|
|
12
|
-
*/
|
|
13
|
-
export const PluginConfig = {
|
|
14
|
-
// Qdrant settings
|
|
15
|
-
qdrant: {
|
|
16
|
-
host: process.env.QDRANT_HOST || "localhost",
|
|
17
|
-
port: parseInt(process.env.QDRANT_PORT || "6333"),
|
|
18
|
-
collection: process.env.QDRANT_COLLECTION || "mrc_bot",
|
|
19
|
-
timeout: parseInt(process.env.QDRANT_TIMEOUT || "30000"),
|
|
20
|
-
},
|
|
21
|
-
// Ollama LLM settings
|
|
22
|
-
ollama: {
|
|
23
|
-
host: process.env.OLLAMA_HOST || "http://localhost",
|
|
24
|
-
port: parseInt(process.env.OLLAMA_PORT || "11434"),
|
|
25
|
-
model: process.env.OLLAMA_MODEL || "deepseek-r1:8b",
|
|
26
|
-
timeout: parseInt(process.env.OLLAMA_TIMEOUT || "60000"),
|
|
27
|
-
get baseUrl() {
|
|
28
|
-
return `${this.host}:${this.port}`;
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
// Embedding service settings
|
|
32
|
-
embedding: {
|
|
33
|
-
model: process.env.EMBEDDING_MODEL || "text-embedding-3-small",
|
|
34
|
-
dimensions: parseInt(process.env.EMBEDDING_DIMENSIONS || "1024"),
|
|
35
|
-
apiUrl: process.env.EMBEDDING_API_URL || "http://localhost:8000",
|
|
36
|
-
},
|
|
37
|
-
// Auto-capture settings
|
|
38
|
-
autoCapture: {
|
|
39
|
-
enabled: process.env.AUTO_CAPTURE_ENABLED !== "false", // default true
|
|
40
|
-
minConfidence: parseFloat(process.env.AUTO_CAPTURE_MIN_CONFIDENCE || "0.7"),
|
|
41
|
-
useLLM: process.env.AUTO_CAPTURE_USE_LLM !== "false", // default true
|
|
42
|
-
// RAG Memory Isolation - Noise Filter settings
|
|
43
|
-
agentBlocklist: (process.env.AUTO_CAPTURE_AGENT_BLOCKLIST || "").split(",").filter(Boolean),
|
|
44
|
-
noisePatterns: (process.env.AUTO_CAPTURE_NOISE_PATTERNS || "").split(",").filter(Boolean).map((p) => new RegExp(p, "i")),
|
|
45
|
-
maxMessagesPerCapture: parseInt(process.env.AUTO_CAPTURE_MAX_MESSAGES || "50"),
|
|
46
|
-
minContentLength: parseInt(process.env.AUTO_CAPTURE_MIN_CONTENT_LENGTH || "20"),
|
|
47
|
-
noiseThreshold: parseFloat(process.env.AUTO_CAPTURE_NOISE_THRESHOLD || "0.5"),
|
|
48
|
-
},
|
|
49
|
-
// Context window management settings
|
|
50
|
-
contextWindow: {
|
|
51
|
-
maxConversationTokens: parseInt(process.env.CONTEXT_WINDOW_MAX_TOKENS || "12000"),
|
|
52
|
-
tokenEstimateDivisor: parseInt(process.env.CONTEXT_WINDOW_TOKEN_DIVISOR || "4"),
|
|
53
|
-
absoluteMaxMessages: parseInt(process.env.CONTEXT_WINDOW_MAX_MESSAGES || "200"),
|
|
54
|
-
},
|
|
55
|
-
// State storage
|
|
56
|
-
stateDir: process.env.STATE_DIR || process.env.OPENCLAW_STATE_DIR || `${process.env.HOME}/.openclaw`,
|
|
57
|
-
slotDbDir: process.env.OPENCLAW_SLOTDB_DIR || `${process.env.HOME}/.openclaw/agent-memo`,
|
|
58
|
-
// Plugin defaults
|
|
59
|
-
defaults: {
|
|
60
|
-
namespace: process.env.DEFAULT_NAMESPACE || "default",
|
|
61
|
-
slotCategories: (process.env.DEFAULT_SLOT_CATEGORIES || "profile,preferences,project,environment,custom").split(","),
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
/**
|
|
65
|
-
* Validate configuration
|
|
66
|
-
* Checks if required services are accessible
|
|
67
|
-
*/
|
|
68
|
-
export async function validateConfig() {
|
|
69
|
-
const results = { qdrant: false, ollama: false };
|
|
70
|
-
// Check Qdrant
|
|
71
|
-
try {
|
|
72
|
-
const response = await fetch(`http://${PluginConfig.qdrant.host}:${PluginConfig.qdrant.port}/collections`, { signal: AbortSignal.timeout(5000) });
|
|
73
|
-
results.qdrant = response.ok;
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
results.qdrant = false;
|
|
77
|
-
}
|
|
78
|
-
// Check Ollama
|
|
79
|
-
try {
|
|
80
|
-
const response = await fetch(`${PluginConfig.ollama.baseUrl}/api/tags`, {
|
|
81
|
-
signal: AbortSignal.timeout(5000),
|
|
82
|
-
});
|
|
83
|
-
results.ollama = response.ok;
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
results.ollama = false;
|
|
87
|
-
}
|
|
88
|
-
return results;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Print configuration (for debugging)
|
|
92
|
-
*/
|
|
93
|
-
export function printConfig() {
|
|
94
|
-
console.log("[AgentMemo] Configuration:");
|
|
95
|
-
console.log(` Qdrant: ${PluginConfig.qdrant.host}:${PluginConfig.qdrant.port}/${PluginConfig.qdrant.collection}`);
|
|
96
|
-
console.log(` Ollama: ${PluginConfig.ollama.baseUrl} (model: ${PluginConfig.ollama.model})`);
|
|
97
|
-
console.log(` Embedding: ${PluginConfig.embedding.model} (${PluginConfig.embedding.dimensions}d)`);
|
|
98
|
-
console.log(` AutoCapture: ${PluginConfig.autoCapture.enabled ? "enabled" : "disabled"}`);
|
|
99
|
-
console.log(` StateDir: ${PluginConfig.stateDir}`);
|
|
100
|
-
console.log(` SlotDbDir: ${PluginConfig.slotDbDir}`);
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reembed-collection.d.ts","sourceRoot":"","sources":["../../src/scripts/reembed-collection.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import "dotenv/config";
|
|
2
|
-
import { EmbeddingClient } from "../services/embedding.js";
|
|
3
|
-
import { QdrantClient } from "../services/qdrant.js";
|
|
4
|
-
function sampleArray(items, n) {
|
|
5
|
-
if (items.length <= n)
|
|
6
|
-
return [...items];
|
|
7
|
-
const copy = [...items];
|
|
8
|
-
const out = [];
|
|
9
|
-
while (out.length < n && copy.length > 0) {
|
|
10
|
-
const idx = Math.floor(Math.random() * copy.length);
|
|
11
|
-
out.push(copy.splice(idx, 1)[0]);
|
|
12
|
-
}
|
|
13
|
-
return out;
|
|
14
|
-
}
|
|
15
|
-
async function run() {
|
|
16
|
-
const qdrantHost = process.env.QDRANT_HOST || "localhost";
|
|
17
|
-
const qdrantPort = Number(process.env.QDRANT_PORT || 6333);
|
|
18
|
-
const qdrantCollection = process.env.QDRANT_COLLECTION || "mrc_bot_memory";
|
|
19
|
-
const embeddingApiUrl = process.env.EMBEDDING_API_URL || process.env.OLLAMA_URL || "http://localhost:4142";
|
|
20
|
-
const embeddingModel = process.env.EMBEDDING_MODEL || "text-embedding-3-small";
|
|
21
|
-
let embeddingDimensions = Number(process.env.EMBEDDING_DIMENSIONS || 1536);
|
|
22
|
-
const batchSize = Math.max(1, Number(process.env.REEMBED_BATCH_SIZE || 25));
|
|
23
|
-
const qdrant = new QdrantClient({
|
|
24
|
-
host: qdrantHost,
|
|
25
|
-
port: qdrantPort,
|
|
26
|
-
collection: qdrantCollection,
|
|
27
|
-
vectorSize: embeddingDimensions,
|
|
28
|
-
timeout: 60000,
|
|
29
|
-
maxRetries: 4,
|
|
30
|
-
}, console);
|
|
31
|
-
const collectionInfo = await qdrant.getCollectionInfo();
|
|
32
|
-
const detectedVectorSize = Number(collectionInfo?.result?.config?.params?.vectors?.size || 0);
|
|
33
|
-
if (detectedVectorSize > 0 && detectedVectorSize !== embeddingDimensions) {
|
|
34
|
-
console.warn(`[Reembed] EMBEDDING_DIMENSIONS mismatch env=${embeddingDimensions} qdrant=${detectedVectorSize}. Using qdrant size.`);
|
|
35
|
-
embeddingDimensions = detectedVectorSize;
|
|
36
|
-
}
|
|
37
|
-
const embedding = new EmbeddingClient({
|
|
38
|
-
embeddingApiUrl,
|
|
39
|
-
model: embeddingModel,
|
|
40
|
-
dimensions: embeddingDimensions,
|
|
41
|
-
timeout: 120000,
|
|
42
|
-
}, console);
|
|
43
|
-
const stats = {
|
|
44
|
-
totalProcessed: 0,
|
|
45
|
-
chunkedCount: 0,
|
|
46
|
-
maxChunksSeen: 0,
|
|
47
|
-
failedCount: 0,
|
|
48
|
-
startedAt: Date.now(),
|
|
49
|
-
};
|
|
50
|
-
console.log(`[Reembed] Start collection=${qdrantCollection} host=${qdrantHost}:${qdrantPort} model=${embeddingModel} dims=${embeddingDimensions}`);
|
|
51
|
-
const pointsBefore = await qdrant.countPoints(true);
|
|
52
|
-
console.log(`[Reembed] points_before=${pointsBefore}`);
|
|
53
|
-
const processedIds = [];
|
|
54
|
-
let offset = undefined;
|
|
55
|
-
while (true) {
|
|
56
|
-
const page = await qdrant.scroll(batchSize, offset, false);
|
|
57
|
-
if (page.points.length === 0)
|
|
58
|
-
break;
|
|
59
|
-
const fallbackUpsertPoints = [];
|
|
60
|
-
const vectorUpdates = [];
|
|
61
|
-
for (const point of page.points) {
|
|
62
|
-
const payload = point.payload || {};
|
|
63
|
-
const text = typeof payload.text === "string" ? payload.text.trim() : "";
|
|
64
|
-
if (!text) {
|
|
65
|
-
stats.failedCount += 1;
|
|
66
|
-
console.warn(`[Reembed] Skip id=${point.id}: empty text`);
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
try {
|
|
70
|
-
const embedded = await embedding.embedDetailed(text);
|
|
71
|
-
const mergedPayload = {
|
|
72
|
-
...payload,
|
|
73
|
-
...embedded.metadata,
|
|
74
|
-
metadata: {
|
|
75
|
-
...(payload.metadata && typeof payload.metadata === "object" ? payload.metadata : {}),
|
|
76
|
-
...embedded.metadata,
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
vectorUpdates.push({ id: point.id, vector: embedded.vector });
|
|
80
|
-
fallbackUpsertPoints.push({ id: point.id, vector: embedded.vector, payload: mergedPayload });
|
|
81
|
-
processedIds.push(point.id);
|
|
82
|
-
stats.totalProcessed += 1;
|
|
83
|
-
if (embedded.metadata.embedding_chunked)
|
|
84
|
-
stats.chunkedCount += 1;
|
|
85
|
-
if (embedded.metadata.embedding_chunks_count > stats.maxChunksSeen) {
|
|
86
|
-
stats.maxChunksSeen = embedded.metadata.embedding_chunks_count;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
stats.failedCount += 1;
|
|
91
|
-
console.error(`[Reembed] Failed id=${point.id}: ${error.message}`);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
if (vectorUpdates.length > 0) {
|
|
95
|
-
let usedFallbackUpsert = false;
|
|
96
|
-
try {
|
|
97
|
-
await qdrant.updateVectors(vectorUpdates);
|
|
98
|
-
await qdrant.setPayload(fallbackUpsertPoints.map((p) => ({ id: p.id, payload: p.payload })));
|
|
99
|
-
}
|
|
100
|
-
catch (_error) {
|
|
101
|
-
usedFallbackUpsert = true;
|
|
102
|
-
await qdrant.upsert(fallbackUpsertPoints);
|
|
103
|
-
}
|
|
104
|
-
console.log(`[Reembed] Batch done size=${page.points.length} updated=${vectorUpdates.length} mode=${usedFallbackUpsert ? "upsert_fallback" : "updateVectors+setPayload"}`);
|
|
105
|
-
}
|
|
106
|
-
offset = page.nextOffset;
|
|
107
|
-
if (offset === undefined || offset === null)
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
const pointsAfter = await qdrant.countPoints(true);
|
|
111
|
-
console.log(`[Reembed] points_after=${pointsAfter}`);
|
|
112
|
-
if (pointsBefore !== pointsAfter) {
|
|
113
|
-
throw new Error(`Point count mismatch: before=${pointsBefore}, after=${pointsAfter}`);
|
|
114
|
-
}
|
|
115
|
-
const verifyIds = sampleArray(processedIds, Math.min(10, processedIds.length));
|
|
116
|
-
const toKey = (id) => JSON.stringify(id);
|
|
117
|
-
let verifyChecked = 0;
|
|
118
|
-
if (verifyIds.length > 0) {
|
|
119
|
-
let verifyOffset = undefined;
|
|
120
|
-
const need = new Set(verifyIds.map((id) => toKey(id)));
|
|
121
|
-
while (need.size > 0) {
|
|
122
|
-
const page = await qdrant.scroll(100, verifyOffset, true);
|
|
123
|
-
if (page.points.length === 0)
|
|
124
|
-
break;
|
|
125
|
-
for (const p of page.points) {
|
|
126
|
-
const key = toKey(p.id);
|
|
127
|
-
if (need.has(key)) {
|
|
128
|
-
const dim = p.vector?.length || 0;
|
|
129
|
-
if (dim !== embeddingDimensions) {
|
|
130
|
-
throw new Error(`Vector dim mismatch for id=${key}: expected=${embeddingDimensions}, got=${dim}`);
|
|
131
|
-
}
|
|
132
|
-
verifyChecked += 1;
|
|
133
|
-
need.delete(key);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
verifyOffset = page.nextOffset;
|
|
137
|
-
if (verifyOffset === undefined || verifyOffset === null)
|
|
138
|
-
break;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
const smokeVector = await embedding.embed("memory search smoke test");
|
|
142
|
-
const smokeResults = await qdrant.search(smokeVector, 3);
|
|
143
|
-
if (!Array.isArray(smokeResults)) {
|
|
144
|
-
throw new Error("Search smoke test failed: no result array");
|
|
145
|
-
}
|
|
146
|
-
const totalTime = Date.now() - stats.startedAt;
|
|
147
|
-
console.log("[Reembed] Verification passed");
|
|
148
|
-
console.log(JSON.stringify({
|
|
149
|
-
collection: qdrantCollection,
|
|
150
|
-
points_before: pointsBefore,
|
|
151
|
-
points_after: pointsAfter,
|
|
152
|
-
random_verified_vectors: verifyChecked,
|
|
153
|
-
search_smoke_test: true,
|
|
154
|
-
total_processed: stats.totalProcessed,
|
|
155
|
-
chunked_count: stats.chunkedCount,
|
|
156
|
-
max_chunks_seen: stats.maxChunksSeen,
|
|
157
|
-
failed_count: stats.failedCount,
|
|
158
|
-
total_time_ms: totalTime,
|
|
159
|
-
}, null, 2));
|
|
160
|
-
}
|
|
161
|
-
run().catch((error) => {
|
|
162
|
-
console.error(`[Reembed] Fatal: ${error.stack || error.message}`);
|
|
163
|
-
process.exit(1);
|
|
164
|
-
});
|
|
165
|
-
//# sourceMappingURL=reembed-collection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reembed-collection.js","sourceRoot":"","sources":["../../src/scripts/reembed-collection.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAUrD,SAAS,WAAW,CAAI,KAAU,EAAE,CAAS;IAC3C,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACxB,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,GAAG;IAChB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,WAAW,CAAC;IAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;IAC3D,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,gBAAgB,CAAC;IAC3E,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,uBAAuB,CAAC;IAC3G,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,wBAAwB,CAAC;IAC/E,IAAI,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,IAAI,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,CAAC;IAE5E,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;QAC9B,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,gBAAgB;QAC5B,UAAU,EAAE,mBAAmB;QAC/B,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;KACd,EAAE,OAAO,CAAC,CAAC;IAEZ,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;IACxD,MAAM,kBAAkB,GAAG,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;IAC9F,IAAI,kBAAkB,GAAG,CAAC,IAAI,kBAAkB,KAAK,mBAAmB,EAAE,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,+CAA+C,mBAAmB,WAAW,kBAAkB,sBAAsB,CAAC,CAAC;QACpI,mBAAmB,GAAG,kBAAkB,CAAC;IAC3C,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC;QACpC,eAAe;QACf,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,mBAAmB;QAC/B,OAAO,EAAE,MAAM;KAChB,EAAE,OAAO,CAAC,CAAC;IAEZ,MAAM,KAAK,GAAiB;QAC1B,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,CAAC;QACf,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,8BAA8B,gBAAgB,SAAS,UAAU,IAAI,UAAU,UAAU,cAAc,SAAS,mBAAmB,EAAE,CAAC,CAAC;IAEnJ,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,2BAA2B,YAAY,EAAE,CAAC,CAAC;IAEvD,MAAM,YAAY,GAAU,EAAE,CAAC;IAC/B,IAAI,MAAM,GAAQ,SAAS,CAAC;IAE5B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QAEpC,MAAM,oBAAoB,GAA0E,EAAE,CAAC;QACvG,MAAM,aAAa,GAA4C,EAAE,CAAC;QAElE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAEzE,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,qBAAqB,KAAK,CAAC,EAAE,cAAc,CAAC,CAAC;gBAC1D,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACrD,MAAM,aAAa,GAAG;oBACpB,GAAG,OAAO;oBACV,GAAG,QAAQ,CAAC,QAAQ;oBACpB,QAAQ,EAAE;wBACR,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;wBACrF,GAAG,QAAQ,CAAC,QAAQ;qBACrB;iBACF,CAAC;gBAEF,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC9D,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;gBAC7F,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAE5B,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC;gBAC1B,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB;oBAAE,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;gBACjE,IAAI,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;oBACnE,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,CAAC;gBACjE,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,uBAAuB,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,kBAAkB,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;gBAC1C,MAAM,MAAM,CAAC,UAAU,CACrB,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CACpE,CAAC;YACJ,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,kBAAkB,GAAG,IAAI,CAAC;gBAC1B,MAAM,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,CAAC,GAAG,CACT,6BAA6B,IAAI,CAAC,MAAM,CAAC,MAAM,YAAY,aAAa,CAAC,MAAM,SAAS,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,0BAA0B,EAAE,CAC9J,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QACzB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;YAAE,MAAM;IACrD,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAC;IAErD,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,WAAW,WAAW,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,CAAC,EAAO,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC9C,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,IAAI,YAAY,GAAQ,SAAS,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;YAC1D,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM;YACpC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACxB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;oBAClC,IAAI,GAAG,KAAK,mBAAmB,EAAE,CAAC;wBAChC,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,cAAc,mBAAmB,SAAS,GAAG,EAAE,CAAC,CAAC;oBACpG,CAAC;oBACD,aAAa,IAAI,CAAC,CAAC;oBACnB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC;YAC/B,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI;gBAAE,MAAM;QACjE,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;QACzB,UAAU,EAAE,gBAAgB;QAC5B,aAAa,EAAE,YAAY;QAC3B,YAAY,EAAE,WAAW;QACzB,uBAAuB,EAAE,aAAa;QACtC,iBAAiB,EAAE,IAAI;QACvB,eAAe,EAAE,KAAK,CAAC,cAAc;QACrC,aAAa,EAAE,KAAK,CAAC,YAAY;QACjC,eAAe,EAAE,KAAK,CAAC,aAAa;QACpC,YAAY,EAAE,KAAK,CAAC,WAAW;QAC/B,aAAa,EAAE,SAAS;KACzB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACf,CAAC;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACpB,OAAO,CAAC,KAAK,CAAC,oBAAoB,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { QdrantClient } from "../services/qdrant.js";
|
|
2
|
-
import { EmbeddingClient } from "../services/embedding.js";
|
|
3
|
-
import { SearchParams, ToolResult, MemoryNamespace } from "../types.js";
|
|
4
|
-
export declare const memorySearchSchema: {
|
|
5
|
-
type: string;
|
|
6
|
-
properties: {
|
|
7
|
-
query: {
|
|
8
|
-
type: string;
|
|
9
|
-
description: string;
|
|
10
|
-
};
|
|
11
|
-
limit: {
|
|
12
|
-
type: string;
|
|
13
|
-
description: string;
|
|
14
|
-
minimum: number;
|
|
15
|
-
maximum: number;
|
|
16
|
-
};
|
|
17
|
-
namespace: {
|
|
18
|
-
type: string;
|
|
19
|
-
description: string;
|
|
20
|
-
};
|
|
21
|
-
sessionId: {
|
|
22
|
-
type: string;
|
|
23
|
-
description: string;
|
|
24
|
-
};
|
|
25
|
-
userId: {
|
|
26
|
-
type: string;
|
|
27
|
-
description: string;
|
|
28
|
-
};
|
|
29
|
-
minScore: {
|
|
30
|
-
type: string;
|
|
31
|
-
description: string;
|
|
32
|
-
minimum: number;
|
|
33
|
-
maximum: number;
|
|
34
|
-
};
|
|
35
|
-
sourceAgent: {
|
|
36
|
-
type: string;
|
|
37
|
-
description: string;
|
|
38
|
-
};
|
|
39
|
-
};
|
|
40
|
-
required: string[];
|
|
41
|
-
};
|
|
42
|
-
export declare function createMemorySearchTool(qdrant: QdrantClient, embedding: EmbeddingClient, defaultNamespace: MemoryNamespace): {
|
|
43
|
-
name: string;
|
|
44
|
-
label: string;
|
|
45
|
-
description: string;
|
|
46
|
-
parameters: {
|
|
47
|
-
type: string;
|
|
48
|
-
properties: {
|
|
49
|
-
query: {
|
|
50
|
-
type: string;
|
|
51
|
-
description: string;
|
|
52
|
-
};
|
|
53
|
-
limit: {
|
|
54
|
-
type: string;
|
|
55
|
-
description: string;
|
|
56
|
-
minimum: number;
|
|
57
|
-
maximum: number;
|
|
58
|
-
};
|
|
59
|
-
namespace: {
|
|
60
|
-
type: string;
|
|
61
|
-
description: string;
|
|
62
|
-
};
|
|
63
|
-
sessionId: {
|
|
64
|
-
type: string;
|
|
65
|
-
description: string;
|
|
66
|
-
};
|
|
67
|
-
userId: {
|
|
68
|
-
type: string;
|
|
69
|
-
description: string;
|
|
70
|
-
};
|
|
71
|
-
minScore: {
|
|
72
|
-
type: string;
|
|
73
|
-
description: string;
|
|
74
|
-
minimum: number;
|
|
75
|
-
maximum: number;
|
|
76
|
-
};
|
|
77
|
-
sourceAgent: {
|
|
78
|
-
type: string;
|
|
79
|
-
description: string;
|
|
80
|
-
};
|
|
81
|
-
};
|
|
82
|
-
required: string[];
|
|
83
|
-
};
|
|
84
|
-
execute(_id: string, params: SearchParams & {
|
|
85
|
-
sourceAgent?: string;
|
|
86
|
-
agentId?: string;
|
|
87
|
-
}, _signal?: AbortSignal): Promise<ToolResult>;
|
|
88
|
-
};
|
|
89
|
-
//# sourceMappingURL=memory_search.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memory_search.d.ts","sourceRoot":"","sources":["../../src/tools/memory_search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAe,eAAe,EAAE,MAAM,aAAa,CAAC;AAyBrF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC9B,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,eAAe,EAC1B,gBAAgB,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAcxB,MAAM,UACH,YAAY,GAAG;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,YACvD,WAAW,GACpB,OAAO,CAAC,UAAU,CAAC;EAuIzB"}
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { getAgentNamespaces, getNamespaceWeight, parseExplicitNamespace, toCoreAgent } from "../shared/memory-config.js";
|
|
2
|
-
function resolveAgentFromRuntimeParams(params) {
|
|
3
|
-
const directAgentId = typeof params.agentId === "string" ? params.agentId.trim() : "";
|
|
4
|
-
if (directAgentId)
|
|
5
|
-
return toCoreAgent(directAgentId);
|
|
6
|
-
const sessionId = typeof params.sessionId === "string" ? params.sessionId.trim() : "";
|
|
7
|
-
if (sessionId) {
|
|
8
|
-
const parts = sessionId.split(":");
|
|
9
|
-
if (parts.length >= 2 && parts[0] === "agent") {
|
|
10
|
-
const fromSession = parts[1]?.trim();
|
|
11
|
-
if (fromSession)
|
|
12
|
-
return toCoreAgent(fromSession);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
const namespace = typeof params.namespace === "string" ? params.namespace.trim() : "";
|
|
16
|
-
const nsMatch = /^agent\.([a-z0-9][a-z0-9_-]*)\.(working_memory|lessons|decisions)$/i.exec(namespace);
|
|
17
|
-
if (nsMatch?.[1]) {
|
|
18
|
-
return toCoreAgent(nsMatch[1]);
|
|
19
|
-
}
|
|
20
|
-
return "assistant";
|
|
21
|
-
}
|
|
22
|
-
export const memorySearchSchema = {
|
|
23
|
-
type: "object",
|
|
24
|
-
properties: {
|
|
25
|
-
query: {
|
|
26
|
-
type: "string",
|
|
27
|
-
description: "Search query for relevant memories",
|
|
28
|
-
},
|
|
29
|
-
limit: {
|
|
30
|
-
type: "number",
|
|
31
|
-
description: "Max results (default: 5)",
|
|
32
|
-
minimum: 1,
|
|
33
|
-
maximum: 20,
|
|
34
|
-
},
|
|
35
|
-
namespace: {
|
|
36
|
-
type: "string",
|
|
37
|
-
description: "Filter by namespace (default: auto-detected from agent)",
|
|
38
|
-
},
|
|
39
|
-
sessionId: {
|
|
40
|
-
type: "string",
|
|
41
|
-
description: "Filter by session ID",
|
|
42
|
-
},
|
|
43
|
-
userId: {
|
|
44
|
-
type: "string",
|
|
45
|
-
description: "Filter by user ID",
|
|
46
|
-
},
|
|
47
|
-
minScore: {
|
|
48
|
-
type: "number",
|
|
49
|
-
description: "Minimum similarity score (0-1, default: 0.7)",
|
|
50
|
-
minimum: 0,
|
|
51
|
-
maximum: 1,
|
|
52
|
-
},
|
|
53
|
-
sourceAgent: {
|
|
54
|
-
type: "string",
|
|
55
|
-
description: "Filter by source agent ID",
|
|
56
|
-
},
|
|
57
|
-
},
|
|
58
|
-
required: ["query"],
|
|
59
|
-
};
|
|
60
|
-
export function createMemorySearchTool(qdrant, embedding, defaultNamespace) {
|
|
61
|
-
const createDetails = (text, extra = {}) => ({
|
|
62
|
-
...extra,
|
|
63
|
-
toolResult: { text },
|
|
64
|
-
});
|
|
65
|
-
return {
|
|
66
|
-
name: "memory_search",
|
|
67
|
-
label: "Memory Search",
|
|
68
|
-
description: "Search stored memories by semantic similarity. Returns most relevant past information.",
|
|
69
|
-
parameters: memorySearchSchema,
|
|
70
|
-
async execute(_id, params, _signal) {
|
|
71
|
-
try {
|
|
72
|
-
// Validate
|
|
73
|
-
if (!params.query || typeof params.query !== "string") {
|
|
74
|
-
return {
|
|
75
|
-
content: [{ type: "text", text: "Error: query is required" }],
|
|
76
|
-
isError: true,
|
|
77
|
-
details: createDetails("Error: query is required", { error: "Missing query parameter" }),
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
const query = params.query.trim();
|
|
81
|
-
if (query.length === 0) {
|
|
82
|
-
return {
|
|
83
|
-
content: [{ type: "text", text: "Error: query cannot be empty" }],
|
|
84
|
-
isError: true,
|
|
85
|
-
details: createDetails("Error: query cannot be empty", { error: "Empty query" }),
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
const limit = Math.min(Math.max(params.limit || 5, 1), 20);
|
|
89
|
-
const minScore = params.minScore ?? 0.7;
|
|
90
|
-
// Determine namespaces to search (normalize user-facing aliases to canonical namespaces)
|
|
91
|
-
const sourceAgent = resolveAgentFromRuntimeParams(params);
|
|
92
|
-
const namespaces = params.namespace
|
|
93
|
-
? [parseExplicitNamespace(params.namespace, sourceAgent)]
|
|
94
|
-
: getAgentNamespaces(sourceAgent);
|
|
95
|
-
// Build namespace filter (OR if multiple namespaces)
|
|
96
|
-
const namespaceConditions = namespaces.map(ns => ({
|
|
97
|
-
key: "namespace",
|
|
98
|
-
match: { value: ns },
|
|
99
|
-
}));
|
|
100
|
-
const filterConditions = [];
|
|
101
|
-
if (namespaceConditions.length === 1) {
|
|
102
|
-
filterConditions.push(namespaceConditions[0]);
|
|
103
|
-
}
|
|
104
|
-
else if (namespaceConditions.length > 1) {
|
|
105
|
-
filterConditions.push({ should: namespaceConditions });
|
|
106
|
-
}
|
|
107
|
-
if (params.sessionId) {
|
|
108
|
-
filterConditions.push({
|
|
109
|
-
key: "sessionId",
|
|
110
|
-
match: { value: params.sessionId },
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
if (params.userId) {
|
|
114
|
-
filterConditions.push({
|
|
115
|
-
key: "userId",
|
|
116
|
-
match: { value: params.userId },
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
if (params.sourceAgent) {
|
|
120
|
-
filterConditions.push({
|
|
121
|
-
key: "source_agent",
|
|
122
|
-
match: { value: params.sourceAgent },
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
const filter = filterConditions.length > 0 ? { must: filterConditions } : undefined;
|
|
126
|
-
// Generate embedding and search
|
|
127
|
-
const vector = await embedding.embed(query);
|
|
128
|
-
const results = await qdrant.search(vector, limit, filter);
|
|
129
|
-
// Exclude quarantined noise and apply namespace-priority weighting
|
|
130
|
-
const weighted = results
|
|
131
|
-
.filter((r) => (r.payload?.namespace || "") !== "noise.filtered")
|
|
132
|
-
.map((r) => {
|
|
133
|
-
const ns = String(r.payload?.namespace || "");
|
|
134
|
-
const weight = getNamespaceWeight(sourceAgent, ns);
|
|
135
|
-
return {
|
|
136
|
-
...r,
|
|
137
|
-
_rawScore: r.score,
|
|
138
|
-
score: Math.min(1, r.score * weight),
|
|
139
|
-
};
|
|
140
|
-
})
|
|
141
|
-
.sort((a, b) => b.score - a.score);
|
|
142
|
-
// Filter by minScore on weighted score
|
|
143
|
-
const filtered = weighted.filter((r) => r.score >= minScore);
|
|
144
|
-
if (filtered.length === 0) {
|
|
145
|
-
const textOut = "No relevant memories found.";
|
|
146
|
-
return {
|
|
147
|
-
content: [{ type: "text", text: textOut }],
|
|
148
|
-
details: createDetails(textOut, { count: 0, query }),
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
// Format results
|
|
152
|
-
const formatted = filtered.map((r, i) => {
|
|
153
|
-
const payload = r.payload;
|
|
154
|
-
const date = payload.timestamp
|
|
155
|
-
? new Date(payload.timestamp).toLocaleDateString()
|
|
156
|
-
: "Unknown";
|
|
157
|
-
const lines = [
|
|
158
|
-
`[${i + 1}] Score: ${(r.score * 100).toFixed(1)}%`,
|
|
159
|
-
`Namespace: ${payload.namespace || "unknown"}`,
|
|
160
|
-
`Text: ${payload.text}`,
|
|
161
|
-
`Date: ${date}`,
|
|
162
|
-
];
|
|
163
|
-
if (payload.metadata && Object.keys(payload.metadata).length > 0) {
|
|
164
|
-
lines.push(`Metadata: ${JSON.stringify(payload.metadata)}`);
|
|
165
|
-
}
|
|
166
|
-
return lines.join("\n");
|
|
167
|
-
}).join("\n\n---\n\n");
|
|
168
|
-
const textOut = `Found ${filtered.length} relevant memories for "${query}":\n\n${formatted}`;
|
|
169
|
-
return {
|
|
170
|
-
content: [{
|
|
171
|
-
type: "text",
|
|
172
|
-
text: textOut,
|
|
173
|
-
}],
|
|
174
|
-
details: createDetails(textOut, { count: filtered.length, query, results: filtered }),
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
catch (error) {
|
|
178
|
-
const textOut = `Error searching memories: ${error.message}`;
|
|
179
|
-
return {
|
|
180
|
-
content: [{ type: "text", text: textOut }],
|
|
181
|
-
isError: true,
|
|
182
|
-
details: createDetails(textOut, { error: error.message }),
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
},
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
//# sourceMappingURL=memory_search.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memory_search.js","sourceRoot":"","sources":["../../src/tools/memory_search.ts"],"names":[],"mappings":"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"}
|