kimi-code-memory-mcp-server 0.1.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/AGENTS.md +144 -0
- package/CHANGELOG.md +26 -0
- package/LICENSE +21 -0
- package/README.md +227 -0
- package/README.zh-CN.md +227 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.js +63 -0
- package/dist/config.js.map +1 -0
- package/dist/context/wire-context.d.ts +171 -0
- package/dist/context/wire-context.js +586 -0
- package/dist/context/wire-context.js.map +1 -0
- package/dist/dao/index.d.ts +76 -0
- package/dist/dao/index.js +490 -0
- package/dist/dao/index.js.map +1 -0
- package/dist/dao/memory-store.d.ts +24 -0
- package/dist/dao/memory-store.js +112 -0
- package/dist/dao/memory-store.js.map +1 -0
- package/dist/refined-manager.d.ts +70 -0
- package/dist/refined-manager.js +369 -0
- package/dist/refined-manager.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.js +71 -0
- package/dist/server.js.map +1 -0
- package/dist/theme-manager.d.ts +40 -0
- package/dist/theme-manager.js +88 -0
- package/dist/theme-manager.js.map +1 -0
- package/dist/tools/context-tools.d.ts +56 -0
- package/dist/tools/context-tools.js +332 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/index.d.ts +835 -0
- package/dist/tools/index.js +370 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +62 -0
- package/dist/tools/memory-tools.js +292 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/system-tools.d.ts +37 -0
- package/dist/tools/system-tools.js +195 -0
- package/dist/tools/system-tools.js.map +1 -0
- package/dist/tools/theme-tools.d.ts +34 -0
- package/dist/tools/theme-tools.js +186 -0
- package/dist/tools/theme-tools.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +10 -0
- package/dist/utils/frontmatter.js +61 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/mutex.d.ts +11 -0
- package/dist/utils/mutex.js +17 -0
- package/dist/utils/mutex.js.map +1 -0
- package/dist/utils/paths.d.ts +19 -0
- package/dist/utils/paths.js +54 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/validation.d.ts +15 -0
- package/dist/utils/validation.js +40 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/version.d.ts +9 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/docs/ARCHITECTURE.md +144 -0
- package/docs/CONTRIBUTING.md +83 -0
- package/docs/CONTRIBUTING.zh-CN.md +83 -0
- package/docs/search-logic.md +157 -0
- package/docs/search-logic.zh-CN.md +157 -0
- package/examples/README.md +34 -0
- package/examples/sample-workspace/essence/essence.md +26 -0
- package/examples/sample-workspace/index.json +36 -0
- package/examples/sample-workspace/memory/decisions/sample-decision.md +30 -0
- package/examples/sample-workspace/memory/knowledge/sample-knowledge.md +24 -0
- package/examples/sample-workspace/memory/reference/sample-reference.md +20 -0
- package/examples/sample-workspace/memory/rules/sample-rule.md +31 -0
- package/examples/sample-workspace/themes/cache-design.json +15 -0
- package/package.json +72 -0
- package/skills/memory-manage/SKILL.md +43 -0
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wire.jsonl parsing and context recovery.
|
|
3
|
+
*
|
|
4
|
+
* This module is intentionally Kimi Code CLI specific: it understands the
|
|
5
|
+
* wire.jsonl event schema. A future abstraction layer could make this pluggable.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import readline from 'readline';
|
|
10
|
+
import { getStoreRoot, getSessionsRoot, DEFAULT_CONTEXT_WINDOW, DEFAULT_RECENT_CHANGE_LIMIT, } from '../config.js';
|
|
11
|
+
import { computeWorkspaceHash } from '../utils/paths.js';
|
|
12
|
+
function getMcpConfigPath() {
|
|
13
|
+
return path.join(getStoreRoot(), 'mcp-config.json');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load the global MCP configuration, creating defaults if absent.
|
|
17
|
+
*/
|
|
18
|
+
export function loadMcpConfig() {
|
|
19
|
+
try {
|
|
20
|
+
const text = fs.readFileSync(getMcpConfigPath(), 'utf8');
|
|
21
|
+
const parsed = JSON.parse(text);
|
|
22
|
+
return {
|
|
23
|
+
version: parsed.version || 1,
|
|
24
|
+
contextWindow: { ...DEFAULT_CONTEXT_WINDOW, ...(parsed.contextWindow || {}) },
|
|
25
|
+
recentChangeLimit: typeof parsed.recentChangeLimit === 'number'
|
|
26
|
+
? Math.max(0, Math.floor(parsed.recentChangeLimit))
|
|
27
|
+
: DEFAULT_RECENT_CHANGE_LIMIT,
|
|
28
|
+
sessionMappings: parsed.sessionMappings || {},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return {
|
|
33
|
+
version: 1,
|
|
34
|
+
contextWindow: { ...DEFAULT_CONTEXT_WINDOW },
|
|
35
|
+
recentChangeLimit: DEFAULT_RECENT_CHANGE_LIMIT,
|
|
36
|
+
sessionMappings: {},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Persist the global MCP configuration.
|
|
42
|
+
*/
|
|
43
|
+
export function saveMcpConfig(config) {
|
|
44
|
+
const mcpConfigPath = getMcpConfigPath();
|
|
45
|
+
fs.mkdirSync(path.dirname(mcpConfigPath), { recursive: true });
|
|
46
|
+
fs.writeFileSync(mcpConfigPath, JSON.stringify(config, null, 2), 'utf8');
|
|
47
|
+
}
|
|
48
|
+
function normalizeCwd() {
|
|
49
|
+
return process.cwd().replace(/\\/g, '/');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Find all session directory candidates for a workspace hash.
|
|
53
|
+
*/
|
|
54
|
+
function findCandidateSessionDirs(hash) {
|
|
55
|
+
const sessionsRoot = getSessionsRoot();
|
|
56
|
+
if (!fs.existsSync(sessionsRoot))
|
|
57
|
+
return [];
|
|
58
|
+
return fs
|
|
59
|
+
.readdirSync(sessionsRoot, { withFileTypes: true })
|
|
60
|
+
.filter((entry) => entry.isDirectory() && entry.name.endsWith(`_${hash}`))
|
|
61
|
+
.map((entry) => entry.name);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Within a single wd_* directory, find the most recently active session.
|
|
65
|
+
*/
|
|
66
|
+
function findLatestSessionInDir(slugDir) {
|
|
67
|
+
const dir = path.join(getSessionsRoot(), slugDir);
|
|
68
|
+
if (!fs.existsSync(dir))
|
|
69
|
+
return null;
|
|
70
|
+
const sessions = fs
|
|
71
|
+
.readdirSync(dir, { withFileTypes: true })
|
|
72
|
+
.filter((entry) => entry.isDirectory() && entry.name.startsWith('session_'))
|
|
73
|
+
.map((entry) => {
|
|
74
|
+
const wire = path.join(dir, entry.name, 'agents', 'main', 'wire.jsonl');
|
|
75
|
+
let mtime = 0;
|
|
76
|
+
try {
|
|
77
|
+
mtime = fs.statSync(wire).mtimeMs;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
mtime = 0;
|
|
81
|
+
}
|
|
82
|
+
return { sessionId: entry.name, wire, mtime };
|
|
83
|
+
})
|
|
84
|
+
.filter((s) => s.mtime > 0)
|
|
85
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
86
|
+
return sessions[0] || null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Discover the active session for the current workspace and cache the mapping.
|
|
90
|
+
*/
|
|
91
|
+
export function discoverCurrentSession() {
|
|
92
|
+
const cwd = normalizeCwd();
|
|
93
|
+
const hash = computeWorkspaceHash(cwd);
|
|
94
|
+
const candidates = findCandidateSessionDirs(hash);
|
|
95
|
+
let best = null;
|
|
96
|
+
let bestSlugDir = null;
|
|
97
|
+
for (const slugDir of candidates) {
|
|
98
|
+
const session = findLatestSessionInDir(slugDir);
|
|
99
|
+
if (session && (!best || session.mtime > best.mtime)) {
|
|
100
|
+
best = session;
|
|
101
|
+
bestSlugDir = slugDir;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (best && bestSlugDir) {
|
|
105
|
+
const config = loadMcpConfig();
|
|
106
|
+
config.sessionMappings[cwd] = {
|
|
107
|
+
slugDir: bestSlugDir,
|
|
108
|
+
discoveredAt: new Date().toISOString(),
|
|
109
|
+
};
|
|
110
|
+
saveMcpConfig(config);
|
|
111
|
+
}
|
|
112
|
+
return best;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Resolve the active session wire path, using the cached mapping if valid.
|
|
116
|
+
*/
|
|
117
|
+
export function getCurrentSessionWirePath() {
|
|
118
|
+
const cwd = normalizeCwd();
|
|
119
|
+
const config = loadMcpConfig();
|
|
120
|
+
const mapping = config.sessionMappings[cwd];
|
|
121
|
+
if (mapping?.slugDir) {
|
|
122
|
+
const session = findLatestSessionInDir(mapping.slugDir);
|
|
123
|
+
if (session)
|
|
124
|
+
return session;
|
|
125
|
+
}
|
|
126
|
+
return discoverCurrentSession();
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Find all historical sessions for the current workspace.
|
|
130
|
+
*/
|
|
131
|
+
export function findAllWorkspaceSessions() {
|
|
132
|
+
const cwd = normalizeCwd();
|
|
133
|
+
const hash = computeWorkspaceHash(cwd);
|
|
134
|
+
const candidates = findCandidateSessionDirs(hash);
|
|
135
|
+
const sessions = [];
|
|
136
|
+
for (const slugDir of candidates) {
|
|
137
|
+
const dir = path.join(getSessionsRoot(), slugDir);
|
|
138
|
+
if (!fs.existsSync(dir))
|
|
139
|
+
continue;
|
|
140
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
141
|
+
for (const entry of entries) {
|
|
142
|
+
if (!entry.isDirectory() || !entry.name.startsWith('session_'))
|
|
143
|
+
continue;
|
|
144
|
+
const wire = path.join(dir, entry.name, 'agents', 'main', 'wire.jsonl');
|
|
145
|
+
if (!fs.existsSync(wire))
|
|
146
|
+
continue;
|
|
147
|
+
sessions.push({ sessionId: entry.name, wire, slugDir });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return sessions;
|
|
151
|
+
}
|
|
152
|
+
function truncate(text, maxLen) {
|
|
153
|
+
if (text === null || text === undefined)
|
|
154
|
+
return '';
|
|
155
|
+
const s = String(text);
|
|
156
|
+
return s.length > maxLen ? s.slice(0, maxLen) + '...' : s;
|
|
157
|
+
}
|
|
158
|
+
function buildMatchFromRefined(refined, terms) {
|
|
159
|
+
// Refined summaries already condense user intent, tool usage, and agent lead.
|
|
160
|
+
// Use them as the primary content when the original wire is unavailable.
|
|
161
|
+
const snippetSource = [refined.summary, ...refined.facts, ...refined.notes].join('\n');
|
|
162
|
+
return {
|
|
163
|
+
sessionId: refined.sessionId,
|
|
164
|
+
turnId: refined.turnId,
|
|
165
|
+
timestamp: refined.timestamp ?? null,
|
|
166
|
+
score: refined.score,
|
|
167
|
+
user: '',
|
|
168
|
+
agent: truncate(refined.summary, 2000),
|
|
169
|
+
snippet: extractSnippet(snippetSource, terms, 240),
|
|
170
|
+
actions: [],
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function summarizeToolArgs(name, args) {
|
|
174
|
+
if (!args || typeof args !== 'object')
|
|
175
|
+
return '';
|
|
176
|
+
const record = args;
|
|
177
|
+
const priorityKeys = ['path', 'command', 'key', 'query', 'description', 'folder', 'skill', 'url'];
|
|
178
|
+
const parts = [];
|
|
179
|
+
for (const key of priorityKeys) {
|
|
180
|
+
if (record[key] === null || record[key] === undefined)
|
|
181
|
+
continue;
|
|
182
|
+
let value = String(record[key]);
|
|
183
|
+
if (key === 'command')
|
|
184
|
+
value = truncate(value, 120);
|
|
185
|
+
else
|
|
186
|
+
value = truncate(value, 200);
|
|
187
|
+
parts.push(`${key}=${value}`);
|
|
188
|
+
if (parts.length >= 3)
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
return parts.join(', ');
|
|
192
|
+
}
|
|
193
|
+
function summarizeToolResult(result) {
|
|
194
|
+
if (result === null || result === undefined)
|
|
195
|
+
return '';
|
|
196
|
+
const r = result;
|
|
197
|
+
if (r.isError || r.error) {
|
|
198
|
+
const err = r.error || r.output || r.content || 'failed';
|
|
199
|
+
return `error: ${truncate(err, 200)}`;
|
|
200
|
+
}
|
|
201
|
+
const output = r.output || r.content || r.result || '';
|
|
202
|
+
const text = typeof output === 'string' ? output : JSON.stringify(output);
|
|
203
|
+
return `success: ${truncate(text, 200)}`;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Parse a wire.jsonl file and return conversation turns + session-level
|
|
207
|
+
* compaction summaries.
|
|
208
|
+
*/
|
|
209
|
+
export function parseWireFile(wirePath) {
|
|
210
|
+
return new Promise((resolve, reject) => {
|
|
211
|
+
if (!wirePath || !fs.existsSync(wirePath)) {
|
|
212
|
+
return resolve({ turns: [], compactionSummaries: [] });
|
|
213
|
+
}
|
|
214
|
+
const turns = new Map();
|
|
215
|
+
const pendingActions = new Map();
|
|
216
|
+
const compactionSummaries = [];
|
|
217
|
+
let nextUserTurnId = 0;
|
|
218
|
+
function ensureTurn(turnId) {
|
|
219
|
+
const id = String(turnId);
|
|
220
|
+
if (!turns.has(id)) {
|
|
221
|
+
turns.set(id, {
|
|
222
|
+
turnId: id,
|
|
223
|
+
timestamp: null,
|
|
224
|
+
user: '',
|
|
225
|
+
agentText: '',
|
|
226
|
+
actions: [],
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
return turns.get(id);
|
|
230
|
+
}
|
|
231
|
+
const stream = fs.createReadStream(wirePath, { encoding: 'utf8' });
|
|
232
|
+
const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
|
|
233
|
+
rl.on('line', (line) => {
|
|
234
|
+
if (!line.trim())
|
|
235
|
+
return;
|
|
236
|
+
let event;
|
|
237
|
+
try {
|
|
238
|
+
event = JSON.parse(line);
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (event.type === 'turn.prompt') {
|
|
244
|
+
const turnId = String(nextUserTurnId);
|
|
245
|
+
nextUserTurnId += 1;
|
|
246
|
+
const turn = ensureTurn(turnId);
|
|
247
|
+
const text = (event.input || [])
|
|
248
|
+
.filter((p) => p && p.type === 'text')
|
|
249
|
+
.map((p) => String(p.text ?? ''))
|
|
250
|
+
.join('\n');
|
|
251
|
+
turn.user = text;
|
|
252
|
+
if (event.time && !turn.timestamp) {
|
|
253
|
+
turn.timestamp = new Date(event.time).toISOString();
|
|
254
|
+
}
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
if (event.type === 'context.apply_compaction' && event.summary) {
|
|
258
|
+
compactionSummaries.push({
|
|
259
|
+
time: event.time ? new Date(event.time).toISOString() : null,
|
|
260
|
+
summary: String(event.summary),
|
|
261
|
+
});
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (event.type !== 'context.append_loop_event')
|
|
265
|
+
return;
|
|
266
|
+
const ev = event.event;
|
|
267
|
+
if (!ev || !ev.type)
|
|
268
|
+
return;
|
|
269
|
+
const turnId = ev.turnId;
|
|
270
|
+
if (ev.type === 'step.begin' && turnId !== null && turnId !== undefined) {
|
|
271
|
+
const turn = ensureTurn(turnId);
|
|
272
|
+
if (event.time && !turn.timestamp) {
|
|
273
|
+
turn.timestamp = new Date(event.time).toISOString();
|
|
274
|
+
}
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
if (ev.type === 'content.part' && turnId !== null && turnId !== undefined) {
|
|
278
|
+
const turn = ensureTurn(turnId);
|
|
279
|
+
const part = ev.part || {};
|
|
280
|
+
if (part.type === 'text' && part.text) {
|
|
281
|
+
turn.agentText += part.text;
|
|
282
|
+
}
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
if (ev.type === 'tool.call' && turnId !== null && turnId !== undefined) {
|
|
286
|
+
const turn = ensureTurn(turnId);
|
|
287
|
+
const action = {
|
|
288
|
+
name: ev.name || '',
|
|
289
|
+
args: summarizeToolArgs(ev.name, ev.args),
|
|
290
|
+
result: '',
|
|
291
|
+
};
|
|
292
|
+
turn.actions.push(action);
|
|
293
|
+
if (ev.toolCallId) {
|
|
294
|
+
pendingActions.set(ev.toolCallId, action);
|
|
295
|
+
}
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
if (ev.type === 'tool.result') {
|
|
299
|
+
const action = pendingActions.get(ev.toolCallId) || pendingActions.get(ev.parentUuid);
|
|
300
|
+
if (action) {
|
|
301
|
+
action.result = summarizeToolResult(ev.result);
|
|
302
|
+
pendingActions.delete(ev.toolCallId);
|
|
303
|
+
pendingActions.delete(ev.parentUuid);
|
|
304
|
+
}
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
rl.on('error', reject);
|
|
309
|
+
rl.on('close', () => {
|
|
310
|
+
const sortedTurns = Array.from(turns.values()).sort((a, b) => parseInt(a.turnId, 10) - parseInt(b.turnId, 10));
|
|
311
|
+
resolve({ turns: sortedTurns, compactionSummaries });
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
function toDetailedRound(turn) {
|
|
316
|
+
return {
|
|
317
|
+
turnId: parseInt(turn.turnId, 10),
|
|
318
|
+
timestamp: turn.timestamp,
|
|
319
|
+
user: truncate(turn.user, 2000),
|
|
320
|
+
agent: truncate(turn.agentText, 4000),
|
|
321
|
+
actions: turn.actions.map((a) => ({
|
|
322
|
+
name: a.name,
|
|
323
|
+
args: a.args,
|
|
324
|
+
result: a.result,
|
|
325
|
+
})),
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
function toSummaryRound(turn) {
|
|
329
|
+
const actionNames = turn.actions.map((a) => a.name).filter(Boolean);
|
|
330
|
+
const parts = [`User: ${truncate(turn.user, 120)}`];
|
|
331
|
+
if (turn.agentText) {
|
|
332
|
+
parts.push(`Agent: ${truncate(turn.agentText, 120)}`);
|
|
333
|
+
}
|
|
334
|
+
if (actionNames.length) {
|
|
335
|
+
parts.push(`Actions: ${actionNames.join(', ')}`);
|
|
336
|
+
}
|
|
337
|
+
return {
|
|
338
|
+
turnId: parseInt(turn.turnId, 10),
|
|
339
|
+
timestamp: turn.timestamp,
|
|
340
|
+
summary: parts.join(' | '),
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Build the default context window: last N rounds detailed, preceding M rounds
|
|
345
|
+
* summarized.
|
|
346
|
+
*/
|
|
347
|
+
export function buildContextWindow(turns, overrides = {}) {
|
|
348
|
+
const config = loadMcpConfig();
|
|
349
|
+
const detailedCount = overrides.detailedRounds ?? config.contextWindow.detailedRounds;
|
|
350
|
+
const summaryCount = overrides.summaryRounds ?? config.contextWindow.defaultSummaryRounds;
|
|
351
|
+
const total = turns.length;
|
|
352
|
+
const detailedEnd = Math.min(detailedCount, total);
|
|
353
|
+
const summaryEnd = Math.min(detailedEnd + summaryCount, total);
|
|
354
|
+
const detailedRounds = turns.slice(total - detailedEnd).map(toDetailedRound);
|
|
355
|
+
const summaryRounds = turns.slice(total - summaryEnd, total - detailedEnd).map(toSummaryRound);
|
|
356
|
+
return { detailedRounds, summaryRounds, totalTurns: total };
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Load older rounds before a given turnId, summarized by default.
|
|
360
|
+
*/
|
|
361
|
+
export function loadMoreRounds(turns, beforeTurnId, limit) {
|
|
362
|
+
const config = loadMcpConfig();
|
|
363
|
+
const chunkSize = limit ?? config.contextWindow.loadMoreChunkSize;
|
|
364
|
+
const older = turns.filter((t) => parseInt(t.turnId, 10) < beforeTurnId);
|
|
365
|
+
const selected = older.slice(-chunkSize);
|
|
366
|
+
return selected.map(toSummaryRound);
|
|
367
|
+
}
|
|
368
|
+
function scoreRound(turn, terms) {
|
|
369
|
+
const haystack = `${turn.user}\n${turn.agentText}\n${turn.actions
|
|
370
|
+
.map((a) => a.name)
|
|
371
|
+
.join(' ')}`.toLowerCase();
|
|
372
|
+
let score = 0;
|
|
373
|
+
for (const term of terms) {
|
|
374
|
+
const re = new RegExp(term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi');
|
|
375
|
+
const matches = haystack.match(re);
|
|
376
|
+
if (matches)
|
|
377
|
+
score += matches.length;
|
|
378
|
+
}
|
|
379
|
+
return score;
|
|
380
|
+
}
|
|
381
|
+
function extractSnippet(text, terms, maxLen = 200) {
|
|
382
|
+
if (!terms.length)
|
|
383
|
+
return truncate(text, maxLen);
|
|
384
|
+
const lower = text.toLowerCase();
|
|
385
|
+
let bestPos = -1;
|
|
386
|
+
let bestTermLen = 0;
|
|
387
|
+
for (const term of terms) {
|
|
388
|
+
const idx = lower.indexOf(term);
|
|
389
|
+
if (idx !== -1 && term.length > bestTermLen) {
|
|
390
|
+
bestPos = idx;
|
|
391
|
+
bestTermLen = term.length;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
if (bestPos === -1)
|
|
395
|
+
return truncate(text, maxLen);
|
|
396
|
+
const start = Math.max(0, bestPos - 60);
|
|
397
|
+
const end = Math.min(text.length, bestPos + bestTermLen + 60);
|
|
398
|
+
let snippet = text.slice(start, end);
|
|
399
|
+
if (start > 0)
|
|
400
|
+
snippet = '...' + snippet;
|
|
401
|
+
if (end < text.length)
|
|
402
|
+
snippet = snippet + '...';
|
|
403
|
+
return snippet;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Search across all workspace session wires for rounds matching the query.
|
|
407
|
+
*
|
|
408
|
+
* If a RefinedManager is provided, we first query the refined SQLite index for
|
|
409
|
+
* candidate turns and only parse the wires needed to return full content. This
|
|
410
|
+
* avoids parsing every historical wire on every search. When refined data is
|
|
411
|
+
* unavailable we fall back to the original full-scan behavior.
|
|
412
|
+
*/
|
|
413
|
+
export async function searchWireContext(query, options = {}) {
|
|
414
|
+
const limit = typeof options.limit === 'number' ? Math.max(1, Math.floor(options.limit)) : 10;
|
|
415
|
+
const dateFrom = options.dateFrom || null;
|
|
416
|
+
const dateTo = options.dateTo || null;
|
|
417
|
+
const refinedManager = options.refinedManager;
|
|
418
|
+
const terms = query
|
|
419
|
+
.toLowerCase()
|
|
420
|
+
.split(/\s+/)
|
|
421
|
+
.filter((t) => t.length > 0);
|
|
422
|
+
if (terms.length === 0) {
|
|
423
|
+
return { query, totalMatches: 0, matches: [], hits: [] };
|
|
424
|
+
}
|
|
425
|
+
const matches = [];
|
|
426
|
+
const hits = [];
|
|
427
|
+
const skippedSessionIds = [];
|
|
428
|
+
const parsedSessionCache = new Map();
|
|
429
|
+
async function getSessionTurns(sessionId) {
|
|
430
|
+
if (parsedSessionCache.has(sessionId)) {
|
|
431
|
+
return parsedSessionCache.get(sessionId);
|
|
432
|
+
}
|
|
433
|
+
const sessions = findAllWorkspaceSessions();
|
|
434
|
+
const session = sessions.find((s) => s.sessionId === sessionId);
|
|
435
|
+
if (!session)
|
|
436
|
+
return null;
|
|
437
|
+
const { turns } = await parseWireFile(session.wire);
|
|
438
|
+
parsedSessionCache.set(sessionId, turns);
|
|
439
|
+
return turns;
|
|
440
|
+
}
|
|
441
|
+
if (refinedManager) {
|
|
442
|
+
const refinedMatches = refinedManager.searchRefinedTurns({
|
|
443
|
+
query,
|
|
444
|
+
dateFrom: dateFrom || undefined,
|
|
445
|
+
dateTo: dateTo || undefined,
|
|
446
|
+
limit,
|
|
447
|
+
});
|
|
448
|
+
for (const refined of refinedMatches) {
|
|
449
|
+
const turns = await getSessionTurns(refined.sessionId);
|
|
450
|
+
if (!turns) {
|
|
451
|
+
// The original wire has been removed, but the refined summary still
|
|
452
|
+
// contains the key facts. Return it instead of skipping.
|
|
453
|
+
matches.push(buildMatchFromRefined(refined, terms));
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
const turn = turns.find((t) => parseInt(t.turnId, 10) === refined.turnId);
|
|
457
|
+
if (!turn) {
|
|
458
|
+
// The turn is gone from the wire; fall back to the refined record.
|
|
459
|
+
matches.push(buildMatchFromRefined(refined, terms));
|
|
460
|
+
continue;
|
|
461
|
+
}
|
|
462
|
+
const roundDate = turn.timestamp ? turn.timestamp.slice(0, 10) : null;
|
|
463
|
+
if (dateFrom && roundDate && roundDate < dateFrom)
|
|
464
|
+
continue;
|
|
465
|
+
if (dateTo && roundDate && roundDate > dateTo)
|
|
466
|
+
continue;
|
|
467
|
+
const fullText = `${turn.user}\n${turn.agentText}`;
|
|
468
|
+
matches.push({
|
|
469
|
+
sessionId: refined.sessionId,
|
|
470
|
+
turnId: refined.turnId,
|
|
471
|
+
timestamp: turn.timestamp || null,
|
|
472
|
+
score: refined.score,
|
|
473
|
+
user: truncate(turn.user, 1000),
|
|
474
|
+
agent: truncate(turn.agentText, 2000),
|
|
475
|
+
snippet: extractSnippet(fullText, terms, 240),
|
|
476
|
+
actions: turn.actions.map((a) => a.name).filter(Boolean),
|
|
477
|
+
});
|
|
478
|
+
hits.push({ sessionId: refined.sessionId, turn });
|
|
479
|
+
}
|
|
480
|
+
if (matches.length > 0 || skippedSessionIds.length > 0) {
|
|
481
|
+
matches.sort((a, b) => b.score - a.score);
|
|
482
|
+
return {
|
|
483
|
+
query,
|
|
484
|
+
totalMatches: matches.length,
|
|
485
|
+
matches: matches.slice(0, limit),
|
|
486
|
+
hits,
|
|
487
|
+
skippedSessionIds,
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
// Fallback: full scan of all workspace session wires.
|
|
492
|
+
const sessions = findAllWorkspaceSessions();
|
|
493
|
+
for (const session of sessions) {
|
|
494
|
+
const { turns } = await parseWireFile(session.wire);
|
|
495
|
+
parsedSessionCache.set(session.sessionId, turns);
|
|
496
|
+
for (const turn of turns) {
|
|
497
|
+
const roundDate = turn.timestamp ? turn.timestamp.slice(0, 10) : null;
|
|
498
|
+
if (dateFrom && roundDate && roundDate < dateFrom)
|
|
499
|
+
continue;
|
|
500
|
+
if (dateTo && roundDate && roundDate > dateTo)
|
|
501
|
+
continue;
|
|
502
|
+
const score = scoreRound(turn, terms);
|
|
503
|
+
if (score === 0)
|
|
504
|
+
continue;
|
|
505
|
+
const fullText = `${turn.user}\n${turn.agentText}`;
|
|
506
|
+
matches.push({
|
|
507
|
+
sessionId: session.sessionId,
|
|
508
|
+
turnId: parseInt(turn.turnId, 10),
|
|
509
|
+
timestamp: turn.timestamp || null,
|
|
510
|
+
score,
|
|
511
|
+
user: truncate(turn.user, 1000),
|
|
512
|
+
agent: truncate(turn.agentText, 2000),
|
|
513
|
+
snippet: extractSnippet(fullText, terms, 240),
|
|
514
|
+
actions: turn.actions.map((a) => a.name).filter(Boolean),
|
|
515
|
+
});
|
|
516
|
+
hits.push({ sessionId: session.sessionId, turn });
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
matches.sort((a, b) => b.score - a.score);
|
|
520
|
+
return {
|
|
521
|
+
query,
|
|
522
|
+
totalMatches: matches.length,
|
|
523
|
+
matches: matches.slice(0, limit),
|
|
524
|
+
hits,
|
|
525
|
+
skippedSessionIds,
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Load the full detailed content of specific conversation turns.
|
|
530
|
+
*/
|
|
531
|
+
export async function loadTurnContext(references, options = {}) {
|
|
532
|
+
const maxRefs = typeof options.maxReferences === 'number' ? Math.max(1, Math.floor(options.maxReferences)) : 20;
|
|
533
|
+
if (!Array.isArray(references)) {
|
|
534
|
+
return { rounds: [], notFound: [], error: 'references must be an array' };
|
|
535
|
+
}
|
|
536
|
+
const validRefs = references
|
|
537
|
+
.filter((r) => r && typeof r.sessionId === 'string' && typeof r.turnId === 'number')
|
|
538
|
+
.slice(0, maxRefs);
|
|
539
|
+
if (validRefs.length === 0) {
|
|
540
|
+
return { rounds: [], notFound: [] };
|
|
541
|
+
}
|
|
542
|
+
const sessionGroups = new Map();
|
|
543
|
+
for (const ref of validRefs) {
|
|
544
|
+
if (!sessionGroups.has(ref.sessionId)) {
|
|
545
|
+
sessionGroups.set(ref.sessionId, new Set());
|
|
546
|
+
}
|
|
547
|
+
sessionGroups.get(ref.sessionId).add(ref.turnId);
|
|
548
|
+
}
|
|
549
|
+
const allSessions = findAllWorkspaceSessions();
|
|
550
|
+
const sessionMap = new Map(allSessions.map((s) => [s.sessionId, s.wire]));
|
|
551
|
+
const rounds = [];
|
|
552
|
+
const notFound = [];
|
|
553
|
+
for (const [sessionId, turnIds] of sessionGroups.entries()) {
|
|
554
|
+
const wire = sessionMap.get(sessionId);
|
|
555
|
+
if (!wire) {
|
|
556
|
+
for (const turnId of turnIds) {
|
|
557
|
+
notFound.push({ sessionId, turnId });
|
|
558
|
+
}
|
|
559
|
+
continue;
|
|
560
|
+
}
|
|
561
|
+
const { turns } = await parseWireFile(wire);
|
|
562
|
+
const turnMap = new Map(turns.map((t) => [parseInt(t.turnId, 10), t]));
|
|
563
|
+
for (const turnId of turnIds) {
|
|
564
|
+
const turn = turnMap.get(turnId);
|
|
565
|
+
if (turn) {
|
|
566
|
+
rounds.push({ sessionId, ...toDetailedRound(turn) });
|
|
567
|
+
}
|
|
568
|
+
else {
|
|
569
|
+
notFound.push({ sessionId, turnId });
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
const orderMap = new Map();
|
|
574
|
+
validRefs.forEach((ref, idx) => {
|
|
575
|
+
const key = `${ref.sessionId}:${ref.turnId}`;
|
|
576
|
+
if (!orderMap.has(key))
|
|
577
|
+
orderMap.set(key, idx);
|
|
578
|
+
});
|
|
579
|
+
rounds.sort((a, b) => {
|
|
580
|
+
const keyA = `${a.sessionId}:${a.turnId}`;
|
|
581
|
+
const keyB = `${b.sessionId}:${b.turnId}`;
|
|
582
|
+
return (orderMap.get(keyA) ?? 0) - (orderMap.get(keyB) ?? 0);
|
|
583
|
+
});
|
|
584
|
+
return { rounds, notFound };
|
|
585
|
+
}
|
|
586
|
+
//# sourceMappingURL=wire-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire-context.js","sourceRoot":"","sources":["../../src/context/wire-context.ts"],"names":[],"mappings":"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"}
|