@j0hanz/memory-mcp 0.1.1 → 1.0.1
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 +32 -25
- package/dist/completions/index.d.ts.map +1 -1
- package/dist/completions/index.js +8 -5
- package/dist/completions/index.js.map +1 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +68 -8
- package/dist/db/index.js.map +1 -1
- package/dist/db/typed.d.ts +9 -3
- package/dist/db/typed.d.ts.map +1 -1
- package/dist/db/typed.js +33 -4
- package/dist/db/typed.js.map +1 -1
- package/dist/index.js +13 -8
- package/dist/index.js.map +1 -1
- package/dist/instructions.md +102 -56
- package/dist/lib/errors.d.ts +3 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +11 -4
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/hash.d.ts.map +1 -1
- package/dist/lib/hash.js +9 -2
- package/dist/lib/hash.js.map +1 -1
- package/dist/lib/instructions.d.ts +2 -0
- package/dist/lib/instructions.d.ts.map +1 -0
- package/dist/lib/instructions.js +27 -0
- package/dist/lib/instructions.js.map +1 -0
- package/dist/lib/mcp-utils.d.ts +6 -0
- package/dist/lib/mcp-utils.d.ts.map +1 -0
- package/dist/lib/mcp-utils.js +26 -0
- package/dist/lib/mcp-utils.js.map +1 -0
- package/dist/lib/pagination.d.ts.map +1 -1
- package/dist/lib/pagination.js +14 -7
- package/dist/lib/pagination.js.map +1 -1
- package/dist/lib/search-cursor.d.ts +13 -0
- package/dist/lib/search-cursor.d.ts.map +1 -0
- package/dist/lib/search-cursor.js +89 -0
- package/dist/lib/search-cursor.js.map +1 -0
- package/dist/lib/search.d.ts +16 -0
- package/dist/lib/search.d.ts.map +1 -1
- package/dist/lib/search.js +53 -12
- package/dist/lib/search.js.map +1 -1
- package/dist/lib/tool-response.d.ts +1 -5
- package/dist/lib/tool-response.d.ts.map +1 -1
- package/dist/lib/tool-response.js +9 -7
- package/dist/lib/tool-response.js.map +1 -1
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +10 -9
- package/dist/lib/types.js.map +1 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +21 -35
- package/dist/prompts/index.js.map +1 -1
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +12 -32
- package/dist/resources/index.js.map +1 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/inputs.d.ts +5 -5
- package/dist/schemas/inputs.d.ts.map +1 -1
- package/dist/schemas/inputs.js +21 -14
- package/dist/schemas/inputs.js.map +1 -1
- package/dist/schemas/outputs.d.ts +94 -148
- package/dist/schemas/outputs.d.ts.map +1 -1
- package/dist/schemas/outputs.js +59 -66
- package/dist/schemas/outputs.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +20 -18
- package/dist/server.js.map +1 -1
- package/dist/tools/create-relationship.d.ts.map +1 -1
- package/dist/tools/create-relationship.js +28 -17
- package/dist/tools/create-relationship.js.map +1 -1
- package/dist/tools/delete-memories.d.ts.map +1 -1
- package/dist/tools/delete-memories.js +23 -20
- package/dist/tools/delete-memories.js.map +1 -1
- package/dist/tools/delete-memory.d.ts.map +1 -1
- package/dist/tools/delete-memory.js +13 -13
- package/dist/tools/delete-memory.js.map +1 -1
- package/dist/tools/delete-relationship.d.ts.map +1 -1
- package/dist/tools/delete-relationship.js +18 -12
- package/dist/tools/delete-relationship.js.map +1 -1
- package/dist/tools/get-memory.d.ts.map +1 -1
- package/dist/tools/get-memory.js +16 -8
- package/dist/tools/get-memory.js.map +1 -1
- package/dist/tools/get-relationships.d.ts.map +1 -1
- package/dist/tools/get-relationships.js +27 -16
- package/dist/tools/get-relationships.js.map +1 -1
- package/dist/tools/index.d.ts +6 -14
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory-stats.d.ts.map +1 -1
- package/dist/tools/memory-stats.js +26 -20
- package/dist/tools/memory-stats.js.map +1 -1
- package/dist/tools/progress.d.ts +34 -0
- package/dist/tools/progress.d.ts.map +1 -0
- package/dist/tools/progress.js +129 -0
- package/dist/tools/progress.js.map +1 -0
- package/dist/tools/recall.d.ts.map +1 -1
- package/dist/tools/recall.js +150 -98
- package/dist/tools/recall.js.map +1 -1
- package/dist/tools/result.d.ts +5 -0
- package/dist/tools/result.d.ts.map +1 -0
- package/dist/tools/result.js +14 -0
- package/dist/tools/result.js.map +1 -0
- package/dist/tools/retrieve-context.d.ts.map +1 -1
- package/dist/tools/retrieve-context.js +99 -26
- package/dist/tools/retrieve-context.js.map +1 -1
- package/dist/tools/search-memories.d.ts.map +1 -1
- package/dist/tools/search-memories.js +28 -40
- package/dist/tools/search-memories.js.map +1 -1
- package/dist/tools/store-memories.d.ts.map +1 -1
- package/dist/tools/store-memories.js +30 -18
- package/dist/tools/store-memories.js.map +1 -1
- package/dist/tools/store-memory.d.ts.map +1 -1
- package/dist/tools/store-memory.js +32 -13
- package/dist/tools/store-memory.js.map +1 -1
- package/dist/tools/update-memory.d.ts.map +1 -1
- package/dist/tools/update-memory.js +35 -16
- package/dist/tools/update-memory.js.map +1 -1
- package/package.json +1 -2
- package/dist/tools/helpers.d.ts +0 -13
- package/dist/tools/helpers.d.ts.map +0 -1
- package/dist/tools/helpers.js +0 -49
- package/dist/tools/helpers.js.map +0 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
const DEFAULT_PROGRESS_INTERVAL_MS = 250;
|
|
2
|
+
function toProgressToken(value) {
|
|
3
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
4
|
+
return value;
|
|
5
|
+
}
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
function toNotificationParams(progressToken, progress) {
|
|
9
|
+
const params = {
|
|
10
|
+
progressToken,
|
|
11
|
+
progress: progress.current,
|
|
12
|
+
};
|
|
13
|
+
if (progress.total !== undefined) {
|
|
14
|
+
params.total = progress.total;
|
|
15
|
+
}
|
|
16
|
+
if (progress.message !== undefined) {
|
|
17
|
+
params.message = progress.message;
|
|
18
|
+
}
|
|
19
|
+
return params;
|
|
20
|
+
}
|
|
21
|
+
function isFailedResult(result) {
|
|
22
|
+
if (result.isError) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
if (typeof result.structuredContent === 'object' &&
|
|
26
|
+
'ok' in result.structuredContent) {
|
|
27
|
+
return result.structuredContent.ok === false;
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
function defaultCompletionMessage(startMessage, result) {
|
|
32
|
+
return `${startMessage} • ${isFailedResult(result) ? 'failed' : 'completed'}`;
|
|
33
|
+
}
|
|
34
|
+
export async function notifyProgress(extra, progress) {
|
|
35
|
+
const progressToken = toProgressToken(extra._meta?.progressToken);
|
|
36
|
+
if (progressToken === undefined) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (typeof extra.sendNotification !== 'function') {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
await extra.sendNotification({
|
|
44
|
+
method: 'notifications/progress',
|
|
45
|
+
params: toNotificationParams(progressToken, progress),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// best-effort progress
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function createProgressReporter(extra, options = {}) {
|
|
53
|
+
const minIntervalMs = options.minIntervalMs ?? DEFAULT_PROGRESS_INTERVAL_MS;
|
|
54
|
+
let lastCurrent = 0;
|
|
55
|
+
let lastReportedAt = 0;
|
|
56
|
+
let isCompleted = false;
|
|
57
|
+
let notificationChain = Promise.resolve();
|
|
58
|
+
const reporter = ((progress) => {
|
|
59
|
+
if (isCompleted) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const monotonicCurrent = progress.current >= lastCurrent ? progress.current : lastCurrent;
|
|
63
|
+
const now = Date.now();
|
|
64
|
+
const shouldFlush = now - lastReportedAt >= minIntervalMs ||
|
|
65
|
+
(progress.total !== undefined && monotonicCurrent >= progress.total);
|
|
66
|
+
lastCurrent = monotonicCurrent;
|
|
67
|
+
if (!shouldFlush) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
lastReportedAt = now;
|
|
71
|
+
isCompleted =
|
|
72
|
+
progress.total !== undefined && monotonicCurrent >= progress.total;
|
|
73
|
+
const payload = { current: monotonicCurrent };
|
|
74
|
+
if (progress.total !== undefined) {
|
|
75
|
+
payload.total = progress.total;
|
|
76
|
+
}
|
|
77
|
+
if (progress.message !== undefined) {
|
|
78
|
+
payload.message = progress.message;
|
|
79
|
+
}
|
|
80
|
+
notificationChain = notificationChain.then(() => notifyProgress(extra, payload));
|
|
81
|
+
});
|
|
82
|
+
reporter.flush = async () => {
|
|
83
|
+
await notificationChain;
|
|
84
|
+
};
|
|
85
|
+
return reporter;
|
|
86
|
+
}
|
|
87
|
+
export function progressWithMessage(reporter, getMessage) {
|
|
88
|
+
const wrapped = (({ current, total }) => {
|
|
89
|
+
const message = getMessage(total === undefined ? { current } : { current, total });
|
|
90
|
+
reporter({
|
|
91
|
+
current,
|
|
92
|
+
...(total === undefined ? {} : { total }),
|
|
93
|
+
message,
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
wrapped.flush = () => reporter.flush();
|
|
97
|
+
return wrapped;
|
|
98
|
+
}
|
|
99
|
+
export function wrapToolHandler(handler, options) {
|
|
100
|
+
return async (args, extra) => {
|
|
101
|
+
const startMessage = options.progressMessage(args);
|
|
102
|
+
await notifyProgress(extra, {
|
|
103
|
+
current: 0,
|
|
104
|
+
total: 1,
|
|
105
|
+
message: startMessage,
|
|
106
|
+
});
|
|
107
|
+
let result;
|
|
108
|
+
try {
|
|
109
|
+
result = await handler(args, extra);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
await notifyProgress(extra, {
|
|
113
|
+
current: 1,
|
|
114
|
+
total: 1,
|
|
115
|
+
message: `${startMessage} • failed`,
|
|
116
|
+
});
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
const completionMessage = options.completionMessage?.(args, result) ??
|
|
120
|
+
defaultCompletionMessage(startMessage, result);
|
|
121
|
+
await notifyProgress(extra, {
|
|
122
|
+
current: 1,
|
|
123
|
+
total: 1,
|
|
124
|
+
message: completionMessage,
|
|
125
|
+
});
|
|
126
|
+
return result;
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/tools/progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/tools/recall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/tools/recall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAmO9C,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,CAgInE"}
|
package/dist/tools/recall.js
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
1
|
+
import { McpError, } from '@modelcontextprotocol/sdk/types.js';
|
|
1
2
|
import process from 'node:process';
|
|
2
|
-
import { E_UNKNOWN, getErrorMessage } from '../lib/errors.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { E_UNKNOWN, getErrorMessage, rethrowMcpError } from '../lib/errors.js';
|
|
4
|
+
import { logToolEvent } from '../lib/mcp-utils.js';
|
|
5
|
+
import { splitPage } from '../lib/pagination.js';
|
|
6
|
+
import { buildSearchCursorScope, decodeSearchCursor, encodeSearchCursor, } from '../lib/search-cursor.js';
|
|
7
|
+
import { loadRankedSearchRows, toMemoryFilters } from '../lib/search.js';
|
|
5
8
|
import { createErrorResponse, createToolResponse, } from '../lib/tool-response.js';
|
|
6
9
|
import { parseMemoryRow } from '../lib/types.js';
|
|
7
10
|
import { RecallInputSchema } from '../schemas/inputs.js';
|
|
8
11
|
import { RecallResultSchema } from '../schemas/outputs.js';
|
|
12
|
+
import { createProgressReporter, notifyProgress, progressWithMessage, } from './progress.js';
|
|
13
|
+
import { getToolResultPayload, isOkStructuredToolResult } from './result.js';
|
|
14
|
+
function countPayloadArrayItems(payload, key) {
|
|
15
|
+
const value = payload[key];
|
|
16
|
+
return Array.isArray(value) ? value.length : 0;
|
|
17
|
+
}
|
|
9
18
|
function parseEnvInt(name, fallback, min, max) {
|
|
10
19
|
const raw = process.env[name];
|
|
11
20
|
if (raw == null)
|
|
@@ -18,42 +27,23 @@ function parseEnvInt(name, fallback, min, max) {
|
|
|
18
27
|
const MAX_FRONTIER_SIZE = parseEnvInt('RECALL_MAX_FRONTIER_SIZE', 1000, 100, 50000);
|
|
19
28
|
const MAX_EDGE_ROWS = parseEnvInt('RECALL_MAX_EDGE_ROWS', 5000, 100, 50000);
|
|
20
29
|
const MAX_VISITED_NODES = parseEnvInt('RECALL_MAX_VISITED_NODES', 5000, 100, 50000);
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (params.max_importance != null) {
|
|
27
|
-
filters.max_importance = params.max_importance;
|
|
28
|
-
}
|
|
29
|
-
if (params.memory_type != null) {
|
|
30
|
-
filters.memory_type = params.memory_type;
|
|
31
|
-
}
|
|
32
|
-
return filters;
|
|
33
|
-
}
|
|
34
|
-
function createPlaceholders(count) {
|
|
35
|
-
return new Array(count).fill('?').join(',');
|
|
36
|
-
}
|
|
37
|
-
function loadSeedRows(db, query, limit, offset, filters) {
|
|
38
|
-
const ftsQuery = sanitizeFtsQuery(query);
|
|
39
|
-
const filter = buildFilterClauses(filters);
|
|
40
|
-
const whereExtra = buildAndWhereClause(filter.clauses);
|
|
41
|
-
return db
|
|
42
|
-
.prepare(`SELECT m.*, memories_fts.rank AS rank FROM memories m
|
|
43
|
-
JOIN memories_fts ON memories_fts.rowid = m.rowid
|
|
44
|
-
WHERE memories_fts MATCH ?${whereExtra}
|
|
45
|
-
ORDER BY memories_fts.rank
|
|
46
|
-
LIMIT ? OFFSET ?`)
|
|
47
|
-
.all(ftsQuery, ...filter.params, limit + 1, offset);
|
|
48
|
-
}
|
|
30
|
+
const EDGE_QUERY_SQL = `SELECT from_hash, to_hash, relation_type FROM relationships
|
|
31
|
+
WHERE from_hash IN (SELECT value FROM json_each(?))
|
|
32
|
+
OR to_hash IN (SELECT value FROM json_each(?))
|
|
33
|
+
LIMIT ?`;
|
|
34
|
+
const MEMORIES_BY_HASH_SQL = 'SELECT * FROM memories WHERE hash IN (SELECT value FROM json_each(?))';
|
|
49
35
|
function traverseGraph(db, seeds, depth, signal, onHop) {
|
|
50
|
-
const visited = new Set(
|
|
36
|
+
const visited = new Set();
|
|
37
|
+
const frontier = [];
|
|
38
|
+
for (const seed of seeds) {
|
|
39
|
+
visited.add(seed.hash);
|
|
40
|
+
frontier.push(seed.hash);
|
|
41
|
+
}
|
|
51
42
|
const edges = [];
|
|
52
43
|
const seenEdges = new Set();
|
|
53
|
-
let frontier = seeds.map((r) => r.hash);
|
|
54
44
|
let depthReached = 0;
|
|
55
45
|
let aborted = false;
|
|
56
|
-
for (let hop = 0; hop < depth && frontier.length > 0; hop
|
|
46
|
+
for (let hop = 0; hop < depth && frontier.length > 0; hop += 1) {
|
|
57
47
|
if (signal?.aborted) {
|
|
58
48
|
aborted = true;
|
|
59
49
|
break;
|
|
@@ -61,7 +51,7 @@ function traverseGraph(db, seeds, depth, signal, onHop) {
|
|
|
61
51
|
depthReached = hop + 1;
|
|
62
52
|
onHop?.(hop, depth);
|
|
63
53
|
if (frontier.length > MAX_FRONTIER_SIZE) {
|
|
64
|
-
frontier =
|
|
54
|
+
frontier.length = MAX_FRONTIER_SIZE;
|
|
65
55
|
aborted = true;
|
|
66
56
|
}
|
|
67
57
|
const remainingEdgeBudget = MAX_EDGE_ROWS - edges.length;
|
|
@@ -70,20 +60,22 @@ function traverseGraph(db, seeds, depth, signal, onHop) {
|
|
|
70
60
|
aborted = true;
|
|
71
61
|
break;
|
|
72
62
|
}
|
|
73
|
-
const
|
|
63
|
+
const frontierJson = JSON.stringify(frontier);
|
|
74
64
|
const edgeRows = db
|
|
75
|
-
.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
? edgeRows.slice(0, remainingEdgeBudget)
|
|
81
|
-
: edgeRows;
|
|
65
|
+
.prepareOnce(EDGE_QUERY_SQL)
|
|
66
|
+
.all(frontierJson, frontierJson, remainingEdgeBudget + 1);
|
|
67
|
+
const rowsToProcess = edgeRows.length > remainingEdgeBudget
|
|
68
|
+
? remainingEdgeBudget
|
|
69
|
+
: edgeRows.length;
|
|
82
70
|
if (edgeRows.length > remainingEdgeBudget) {
|
|
83
71
|
aborted = true;
|
|
84
72
|
}
|
|
85
73
|
const nextHashes = [];
|
|
86
|
-
for (
|
|
74
|
+
for (let i = 0; i < rowsToProcess; i += 1) {
|
|
75
|
+
const edge = edgeRows[i];
|
|
76
|
+
if (edge === undefined) {
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
87
79
|
const edgeKey = `${edge.from_hash}|${edge.to_hash}|${edge.relation_type}`;
|
|
88
80
|
if (!seenEdges.has(edgeKey)) {
|
|
89
81
|
seenEdges.add(edgeKey);
|
|
@@ -93,19 +85,30 @@ function traverseGraph(db, seeds, depth, signal, onHop) {
|
|
|
93
85
|
relation_type: edge.relation_type,
|
|
94
86
|
});
|
|
95
87
|
}
|
|
96
|
-
|
|
97
|
-
if (
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
88
|
+
if (!visited.has(edge.from_hash)) {
|
|
89
|
+
if (visited.size >= MAX_VISITED_NODES) {
|
|
90
|
+
aborted = true;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
visited.add(edge.from_hash);
|
|
94
|
+
if (nextHashes.length < MAX_FRONTIER_SIZE) {
|
|
95
|
+
nextHashes.push(edge.from_hash);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
aborted = true;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (!visited.has(edge.to_hash)) {
|
|
102
|
+
if (visited.size >= MAX_VISITED_NODES) {
|
|
103
|
+
aborted = true;
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
visited.add(edge.to_hash);
|
|
107
|
+
if (nextHashes.length < MAX_FRONTIER_SIZE) {
|
|
108
|
+
nextHashes.push(edge.to_hash);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
aborted = true;
|
|
109
112
|
}
|
|
110
113
|
}
|
|
111
114
|
if (aborted &&
|
|
@@ -113,7 +116,8 @@ function traverseGraph(db, seeds, depth, signal, onHop) {
|
|
|
113
116
|
break;
|
|
114
117
|
}
|
|
115
118
|
}
|
|
116
|
-
frontier =
|
|
119
|
+
frontier.length = 0;
|
|
120
|
+
frontier.push(...nextHashes);
|
|
117
121
|
}
|
|
118
122
|
return { edges, visited, depthReached, aborted };
|
|
119
123
|
}
|
|
@@ -121,46 +125,60 @@ function loadMemoriesByHashes(db, hashes) {
|
|
|
121
125
|
if (hashes.length === 0) {
|
|
122
126
|
return [];
|
|
123
127
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
.
|
|
127
|
-
.all(...hashes);
|
|
128
|
-
return memRows.map(parseMemoryRow);
|
|
128
|
+
return db
|
|
129
|
+
.prepareOnce(MEMORIES_BY_HASH_SQL)
|
|
130
|
+
.all(JSON.stringify(hashes));
|
|
129
131
|
}
|
|
130
|
-
function
|
|
131
|
-
|
|
132
|
-
|
|
132
|
+
function formatRecallCompletionMessage(query, result) {
|
|
133
|
+
const failedMessage = `⊙ recall: ${query} • failed`;
|
|
134
|
+
if (result.isError) {
|
|
135
|
+
return failedMessage;
|
|
133
136
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
function toProgressToken(value) {
|
|
142
|
-
if (typeof value === 'string' || typeof value === 'number') {
|
|
143
|
-
return value;
|
|
137
|
+
if (!isOkStructuredToolResult(result)) {
|
|
138
|
+
return failedMessage;
|
|
139
|
+
}
|
|
140
|
+
const payload = getToolResultPayload(result);
|
|
141
|
+
if (!payload) {
|
|
142
|
+
return `⊙ recall: ${query} • completed`;
|
|
144
143
|
}
|
|
145
|
-
|
|
144
|
+
const memoriesCount = countPayloadArrayItems(payload, 'memories');
|
|
145
|
+
const edgesCount = countPayloadArrayItems(payload, 'graph');
|
|
146
|
+
const aborted = 'aborted' in payload && payload.aborted === true;
|
|
147
|
+
return `⊙ recall: ${query} • ${memoriesCount} memories, ${edgesCount} edges${aborted ? ' [aborted]' : ''}`;
|
|
146
148
|
}
|
|
147
149
|
export function registerRecall(server, db) {
|
|
148
150
|
server.registerTool('recall', {
|
|
149
151
|
title: 'Recall (BFS Graph Traversal)',
|
|
150
|
-
description: 'Search memories by full-text query, then traverse the relationship graph up to `depth` hops via BFS. Returns all discovered memories and the edges connecting them.',
|
|
152
|
+
description: 'Search memories by full-text query, then traverse the relationship graph up to `depth` hops via BFS. Returns all discovered memories and the edges connecting them. Query terms are matched individually; FTS5 phrase operators and negation are not supported.',
|
|
151
153
|
inputSchema: RecallInputSchema,
|
|
152
154
|
outputSchema: RecallResultSchema,
|
|
153
155
|
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
154
|
-
}, (params,
|
|
156
|
+
}, async (params, extra) => {
|
|
157
|
+
const { depth, limit, cursor } = params;
|
|
158
|
+
const filters = toMemoryFilters(params);
|
|
159
|
+
const scope = buildSearchCursorScope(params.query, filters);
|
|
160
|
+
const contextLabel = `⊙ recall: ${params.query} [depth ${depth}]`;
|
|
161
|
+
const completionCurrent = depth + 1;
|
|
162
|
+
await notifyProgress(extra, {
|
|
163
|
+
current: 0,
|
|
164
|
+
total: completionCurrent,
|
|
165
|
+
message: contextLabel,
|
|
166
|
+
});
|
|
167
|
+
const hopReporter = progressWithMessage(createProgressReporter(extra), ({ current, total }) => `⊙ recall: ${params.query} [hop ${current}/${Math.max((total ?? current) - 1, current)}]`);
|
|
168
|
+
const onHop = (hop) => {
|
|
169
|
+
hopReporter({ current: hop + 1, total: completionCurrent });
|
|
170
|
+
};
|
|
171
|
+
let result;
|
|
172
|
+
let thrownError;
|
|
155
173
|
try {
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
174
|
+
const decodedCursor = cursor
|
|
175
|
+
? decodeSearchCursor(cursor, scope)
|
|
176
|
+
: undefined;
|
|
159
177
|
// Step 1: FTS seed search
|
|
160
|
-
const seedRows =
|
|
178
|
+
const seedRows = loadRankedSearchRows(db, params.query, limit, decodedCursor, filters);
|
|
161
179
|
const { page: pageSeeds, hasMore } = splitPage(seedRows, limit);
|
|
162
180
|
// Step 2: BFS traversal up to `depth` hops
|
|
163
|
-
const traversal = traverseGraph(db, pageSeeds, depth, signal, onHop);
|
|
181
|
+
const traversal = traverseGraph(db, pageSeeds, depth, extra.signal, onHop);
|
|
164
182
|
// Step 3: Load all discovered memory rows
|
|
165
183
|
const allHashes = Array.from(traversal.visited);
|
|
166
184
|
const seedRelevance = new Map();
|
|
@@ -168,25 +186,59 @@ export function registerRecall(server, db) {
|
|
|
168
186
|
if (seed.rank != null)
|
|
169
187
|
seedRelevance.set(seed.hash, -seed.rank);
|
|
170
188
|
}
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
189
|
+
const memoryRows = loadMemoriesByHashes(db, allHashes);
|
|
190
|
+
const memories = memoryRows.map((row) => {
|
|
191
|
+
const memory = parseMemoryRow(row);
|
|
192
|
+
const rel = seedRelevance.get(memory.hash);
|
|
193
|
+
if (rel != null) {
|
|
194
|
+
memory.relevance = rel;
|
|
195
|
+
}
|
|
196
|
+
return memory;
|
|
174
197
|
});
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
198
|
+
let nextCursor;
|
|
199
|
+
if (hasMore && pageSeeds.length > 0) {
|
|
200
|
+
const lastSeed = pageSeeds[pageSeeds.length - 1];
|
|
201
|
+
if (lastSeed !== undefined) {
|
|
202
|
+
const rank = lastSeed.rank ?? 0;
|
|
203
|
+
nextCursor = encodeSearchCursor(scope, rank, lastSeed.hash);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
await logToolEvent(server, 'recall', {
|
|
207
|
+
depth,
|
|
208
|
+
depth_reached: traversal.depthReached,
|
|
209
|
+
seed_count: pageSeeds.length,
|
|
210
|
+
visited_nodes: traversal.visited.size,
|
|
211
|
+
edge_count: traversal.edges.length,
|
|
212
|
+
aborted: traversal.aborted,
|
|
213
|
+
});
|
|
214
|
+
result = createToolResponse({
|
|
215
|
+
memories,
|
|
216
|
+
graph: traversal.edges,
|
|
217
|
+
depth_reached: traversal.depthReached,
|
|
218
|
+
...(traversal.aborted ? { aborted: true } : {}),
|
|
219
|
+
...(nextCursor ? { nextCursor } : {}),
|
|
185
220
|
});
|
|
186
221
|
}
|
|
187
222
|
catch (err) {
|
|
188
|
-
|
|
223
|
+
if (err instanceof McpError) {
|
|
224
|
+
thrownError = err;
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
rethrowMcpError(err);
|
|
228
|
+
result = createErrorResponse(E_UNKNOWN, getErrorMessage(err));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
await hopReporter.flush();
|
|
232
|
+
const completionResult = result ?? createErrorResponse(E_UNKNOWN, getErrorMessage(thrownError));
|
|
233
|
+
await notifyProgress(extra, {
|
|
234
|
+
current: completionCurrent,
|
|
235
|
+
total: completionCurrent,
|
|
236
|
+
message: formatRecallCompletionMessage(params.query, completionResult),
|
|
237
|
+
});
|
|
238
|
+
if (thrownError) {
|
|
239
|
+
throw thrownError;
|
|
189
240
|
}
|
|
241
|
+
return completionResult;
|
|
190
242
|
});
|
|
191
243
|
}
|
|
192
244
|
//# sourceMappingURL=recall.js.map
|
package/dist/tools/recall.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/tools/recall.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/tools/recall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
export type ToolResultPayload = Record<string, unknown>;
|
|
3
|
+
export declare function isOkStructuredToolResult(result: CallToolResult): boolean;
|
|
4
|
+
export declare function getToolResultPayload(result: CallToolResult): ToolResultPayload | undefined;
|
|
5
|
+
//# sourceMappingURL=result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/tools/result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAMxD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAExE;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,cAAc,GACrB,iBAAiB,GAAG,SAAS,CAO/B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
function isRecord(value) {
|
|
2
|
+
return typeof value === 'object' && value !== null;
|
|
3
|
+
}
|
|
4
|
+
export function isOkStructuredToolResult(result) {
|
|
5
|
+
return result.isError !== true && isRecord(result.structuredContent);
|
|
6
|
+
}
|
|
7
|
+
export function getToolResultPayload(result) {
|
|
8
|
+
const { structuredContent } = result;
|
|
9
|
+
if (result.isError === true || !isRecord(structuredContent)) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
return structuredContent;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/tools/result.ts"],"names":[],"mappings":"AAIA,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAsB;IAC7D,OAAO,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAsB;IAEtB,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAAC;IACrC,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieve-context.d.ts","sourceRoot":"","sources":["../../src/tools/retrieve-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"retrieve-context.d.ts","sourceRoot":"","sources":["../../src/tools/retrieve-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAkH9C,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,CAsG5E"}
|