@agent-link/agent 0.1.335 → 0.1.337

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.
@@ -1,32 +1,21 @@
1
1
  /**
2
- * Global content search across session JSONL files for a single workDir.
3
- *
4
- * Two-stage:
5
- * 1. Pre-filter — read each *.jsonl as raw text and substring-check the query.
6
- * This skips the expensive parse for files that obviously don't match.
7
- * 2. Extract — for matching files, parse via readSessionMessages() to get
8
- * clean role/text/timestamp records, then generate snippets with the
9
- * match wrapped in **bold** markers for the UI to render as <mark>.
10
- *
11
- * No external dependencies (no ripgrep) — keeps cross-platform behavior simple
12
- * and avoids shipping a binary. At the measured scale (200+ sessions / ~200MB)
13
- * pure Node fs is fast enough; substring scan over UTF-8 is dominated by I/O.
2
+ * Literal content search over normalized session history, scoped to one workDir.
3
+ * Both backends share matching, snippets and hit limits. The async entry point
4
+ * yields between files so incoming cancellation can interrupt a scan.
14
5
  */
15
6
  import { homedir } from 'os';
16
- import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
7
+ import { readdirSync, statSync } from 'fs';
17
8
  import { join } from 'path';
18
- import { pathToProjectFolder, } from './history-message-transform.js';
19
- import { listSessions, readSessionMessages } from './history.js';
9
+ import { setImmediate as yieldToEventLoop } from 'timers/promises';
10
+ import { pathToProjectFolder } from './history-message-transform.js';
11
+ import { getSessionTitle, readSessionMessages } from './history.js';
12
+ import { listCopilotSessions, readCopilotSessionMessages } from './copilot.js';
13
+ export const MAX_SESSION_SEARCH_QUERY_LENGTH = 1000;
20
14
  const DEFAULT_TOTAL_LIMIT = 200;
21
15
  const PER_SESSION_LIMIT = 10;
22
- const SNIPPET_RADIUS = 60; // chars on each side of the match
23
- function getClaudeProjectsDir() {
24
- return join(homedir(), '.claude', 'projects');
25
- }
26
- /** Wrap matches of `query` (case-insensitive) in **bold** markers. */
16
+ const SNIPPET_RADIUS = 60;
17
+ /** Wrap literal, case-insensitive matches in **bold** markers. */
27
18
  function highlight(text, query) {
28
- if (!query)
29
- return text;
30
19
  const lower = text.toLowerCase();
31
20
  const q = query.toLowerCase();
32
21
  const out = [];
@@ -37,25 +26,16 @@ function highlight(text, query) {
37
26
  out.push(text.slice(i));
38
27
  break;
39
28
  }
40
- out.push(text.slice(i, idx));
41
- out.push('**');
42
- out.push(text.slice(idx, idx + q.length));
43
- out.push('**');
29
+ out.push(text.slice(i, idx), '**', text.slice(idx, idx + q.length), '**');
44
30
  i = idx + q.length;
45
31
  }
46
32
  return out.join('');
47
33
  }
48
- /** Extract a snippet around the first match, with markers and ellipses. */
49
34
  function makeSnippet(text, query) {
50
- const lower = text.toLowerCase();
51
- const q = query.toLowerCase();
52
- const idx = lower.indexOf(q);
53
- if (idx === -1)
54
- return null;
35
+ const idx = text.toLowerCase().indexOf(query.toLowerCase());
55
36
  const start = Math.max(0, idx - SNIPPET_RADIUS);
56
- const end = Math.min(text.length, idx + q.length + SNIPPET_RADIUS);
37
+ const end = Math.min(text.length, idx + query.length + SNIPPET_RADIUS);
57
38
  let slice = text.slice(start, end);
58
- // Snap to whitespace boundary for readability
59
39
  if (start > 0) {
60
40
  const space = slice.indexOf(' ');
61
41
  if (space > 0 && space < 20)
@@ -66,18 +46,12 @@ function makeSnippet(text, query) {
66
46
  if (space > slice.length - 20 && space > 0)
67
47
  slice = slice.slice(0, space);
68
48
  }
69
- const prefix = start > 0 ? '…' : '';
70
- const suffix = end < text.length ? '…' : '';
71
- // Collapse newlines / tabs in snippet for compact rendering
72
- const compact = slice.replace(/\s+/g, ' ').trim();
73
- return prefix + highlight(compact, query) + suffix;
49
+ const prefix = start > 0 ? '\u2026' : '';
50
+ const suffix = end < text.length ? '\u2026' : '';
51
+ // Highlight before collapsing whitespace so multiline queries retain markers.
52
+ return prefix + highlight(slice, query).replace(/\s+/g, ' ').trim() + suffix;
74
53
  }
75
- /**
76
- * Count case-insensitive non-overlapping occurrences of `query` in `text`.
77
- */
78
54
  function countOccurrences(text, query) {
79
- if (!query)
80
- return 0;
81
55
  const lower = text.toLowerCase();
82
56
  const q = query.toLowerCase();
83
57
  let count = 0;
@@ -91,34 +65,39 @@ function countOccurrences(text, query) {
91
65
  }
92
66
  return count;
93
67
  }
94
- /**
95
- * Quick raw-text substring check on the JSONL file. Used as a pre-filter to
96
- * skip the expensive readSessionMessages parse for non-matching files.
97
- *
98
- * False positives (match inside JSON metadata like uuid/tool_use_id but not
99
- * in any visible text) are fine — they get filtered out in the extract phase.
100
- */
101
- function fileContainsQuery(filePath, queryLower) {
68
+ function listClaudeSearchEntries(workDir) {
69
+ const projectPath = join(homedir(), '.claude', 'projects', pathToProjectFolder(workDir));
70
+ let files;
102
71
  try {
103
- const buf = readFileSync(filePath);
104
- return buf.toString('utf-8').toLowerCase().includes(queryLower);
72
+ files = readdirSync(projectPath);
105
73
  }
106
- catch {
107
- return false;
74
+ catch (error) {
75
+ if (error.code === 'ENOENT')
76
+ return [];
77
+ throw error;
108
78
  }
79
+ return files.filter(file => file.endsWith('.jsonl')).map(file => ({
80
+ sessionId: file.slice(0, -'.jsonl'.length),
81
+ lastModified: statSync(join(projectPath, file)).mtimeMs,
82
+ })).sort((a, b) => b.lastModified - a.lastModified || a.sessionId.localeCompare(b.sessionId));
109
83
  }
110
- /**
111
- * Search every session under `workDir` for `query`.
112
- *
113
- * - Case-insensitive substring match (no regex).
114
- * - Capped at `limit` total hits across all sessions; per-session capped at 10.
115
- * - `signal` (optional) can be aborted between files for cancellation.
116
- */
117
- export function searchSessions(workDir, query, opts = {}) {
84
+ function* scanSessions(workDir, query, opts, backendType) {
118
85
  const start = Date.now();
119
- const totalLimit = opts.limit && opts.limit > 0 ? opts.limit : DEFAULT_TOTAL_LIMIT;
86
+ if (typeof query !== 'string' || query.length > MAX_SESSION_SEARCH_QUERY_LENGTH) {
87
+ throw new Error(`Search query must be a string of at most ${MAX_SESSION_SEARCH_QUERY_LENGTH} characters`);
88
+ }
89
+ if (opts.limit !== undefined && (!Number.isSafeInteger(opts.limit) || opts.limit <= 0)) {
90
+ throw new Error('Search limit must be a positive integer');
91
+ }
92
+ if (typeof workDir !== 'string' || !workDir.trim()) {
93
+ throw new Error('Search requires a working directory');
94
+ }
95
+ if (backendType !== 'claude' && backendType !== 'copilot') {
96
+ throw new Error(`Session search is not supported for backend "${backendType}"`);
97
+ }
120
98
  const trimmed = query.trim();
121
- const empty = {
99
+ const totalLimit = Math.min(opts.limit ?? DEFAULT_TOTAL_LIMIT, DEFAULT_TOTAL_LIMIT);
100
+ const response = {
122
101
  query: trimmed,
123
102
  results: [],
124
103
  truncated: false,
@@ -126,122 +105,88 @@ export function searchSessions(workDir, query, opts = {}) {
126
105
  matchedFiles: 0,
127
106
  durationMs: 0,
128
107
  };
129
- if (!trimmed)
130
- return { ...empty, durationMs: Date.now() - start };
131
- const projectsDir = getClaudeProjectsDir();
132
- const projectFolder = pathToProjectFolder(workDir);
133
- const projectPath = join(projectsDir, projectFolder);
134
- if (!existsSync(projectPath))
135
- return { ...empty, durationMs: Date.now() - start };
136
- let files;
137
- try {
138
- files = readdirSync(projectPath).filter(f => f.endsWith('.jsonl'));
139
- }
140
- catch {
141
- return { ...empty, durationMs: Date.now() - start };
142
- }
143
- // Sort newest-first by mtime so the most relevant sessions get hit budget first.
144
- const fileEntries = [];
145
- for (const file of files) {
146
- const filePath = join(projectPath, file);
147
- try {
148
- const st = statSync(filePath);
149
- fileEntries.push({
150
- path: filePath,
151
- sessionId: file.replace(/\.jsonl$/, ''),
152
- mtime: st.mtime.getTime(),
153
- });
154
- }
155
- catch { /* skip */ }
108
+ if (opts.signal?.aborted) {
109
+ response.truncated = true;
110
+ return response;
156
111
  }
157
- fileEntries.sort((a, b) => b.mtime - a.mtime);
158
- // Build a sessionId → title lookup once (uses the cached listSessions parse).
159
- const titleBySessionId = new Map();
160
- try {
161
- for (const s of listSessions(workDir))
162
- titleBySessionId.set(s.sessionId, s.title);
163
- }
164
- catch { /* ignore */ }
165
- const queryLower = trimmed.toLowerCase();
166
- const results = [];
112
+ if (!trimmed)
113
+ return response;
114
+ // Copilot's reader is not workDir-scoped: filter workspace metadata first.
115
+ const entries = backendType === 'copilot'
116
+ ? listCopilotSessions(workDir, { strictReadErrors: true })
117
+ : listClaudeSearchEntries(workDir);
167
118
  let totalHits = 0;
168
- let truncated = false;
169
- let scanned = 0;
170
- let matched = 0;
171
- for (const entry of fileEntries) {
119
+ for (const entry of entries) {
120
+ yield;
172
121
  if (opts.signal?.aborted) {
173
- truncated = true;
122
+ response.truncated = true;
174
123
  break;
175
124
  }
176
- scanned++;
177
- if (!fileContainsQuery(entry.path, queryLower))
178
- continue;
179
- matched++;
180
- let messages = [];
181
- try {
182
- messages = readSessionMessages(workDir, entry.sessionId);
183
- }
184
- catch { /* skip unreadable */
185
- continue;
186
- }
125
+ response.scannedFiles++;
126
+ // A raw JSON prefilter would miss decoded quotes, newlines and Unicode.
127
+ const messages = backendType === 'copilot'
128
+ ? readCopilotSessionMessages(workDir, entry.sessionId, { strictReadErrors: true })
129
+ : readSessionMessages(workDir, entry.sessionId, { strictReadErrors: true });
187
130
  const hits = [];
188
131
  let sessionTotal = 0;
189
132
  for (let idx = 0; idx < messages.length; idx++) {
190
- const m = messages[idx];
191
- // For tool entries, search both name + input; for user/assistant search content.
192
- const text = m.role === 'tool'
193
- ? `${m.toolName ?? ''} ${m.toolInput ?? ''}`
194
- : (m.content ?? '');
195
- if (!text)
196
- continue;
197
- const occ = countOccurrences(text, trimmed);
198
- if (occ === 0)
133
+ const message = messages[idx];
134
+ const text = message.role === 'tool'
135
+ ? `${message.toolName ?? ''} ${message.toolInput ?? ''}`
136
+ : message.content ?? '';
137
+ const occurrences = countOccurrences(text, trimmed);
138
+ if (!occurrences)
199
139
  continue;
200
- sessionTotal += occ;
140
+ sessionTotal += occurrences;
201
141
  if (hits.length < PER_SESSION_LIMIT && totalHits < totalLimit) {
202
- const snippet = makeSnippet(text, trimmed);
203
- if (snippet) {
204
- hits.push({
205
- role: m.role,
206
- ts: m.timestamp,
207
- messageIdx: idx,
208
- snippet,
209
- });
210
- totalHits++;
211
- }
142
+ hits.push({
143
+ role: message.role,
144
+ ts: message.timestamp,
145
+ messageIdx: idx,
146
+ snippet: makeSnippet(text, trimmed),
147
+ });
148
+ totalHits++;
212
149
  }
213
- if (totalHits >= totalLimit) {
214
- truncated = true;
215
- break;
150
+ else {
151
+ response.truncated = true;
216
152
  }
217
153
  }
218
154
  if (hits.length > 0) {
219
- results.push({
155
+ response.matchedFiles++;
156
+ response.results.push({
220
157
  sessionId: entry.sessionId,
221
- title: titleBySessionId.get(entry.sessionId) ?? entry.sessionId.slice(0, 8),
222
- lastModified: entry.mtime,
158
+ title: entry.title ?? getSessionTitle(workDir, entry.sessionId),
159
+ lastModified: entry.lastModified,
223
160
  hits,
224
161
  totalHits: sessionTotal,
225
162
  });
226
163
  }
227
164
  if (totalHits >= totalLimit) {
228
- truncated = true;
165
+ response.truncated = true;
229
166
  break;
230
167
  }
231
168
  }
232
- // Sort sessions: those with most hits first (then newest)
233
- results.sort((a, b) => {
234
- if (b.totalHits !== a.totalHits)
235
- return b.totalHits - a.totalHits;
236
- return b.lastModified - a.lastModified;
237
- });
238
- return {
239
- query: trimmed,
240
- results,
241
- truncated,
242
- scannedFiles: scanned,
243
- matchedFiles: matched,
244
- durationMs: Date.now() - start,
245
- };
169
+ response.results.sort((a, b) => b.totalHits - a.totalHits || b.lastModified - a.lastModified);
170
+ response.durationMs = Date.now() - start;
171
+ return response;
172
+ }
173
+ /** Synchronous Claude entry point retained for existing callers. */
174
+ export function searchSessions(workDir, query, opts = {}) {
175
+ const scan = scanSessions(workDir, query, opts, 'claude');
176
+ let step = scan.next();
177
+ while (!step.done)
178
+ step = scan.next();
179
+ return step.value;
180
+ }
181
+ export async function searchSessionsAsync(workDir, query, opts = {}) {
182
+ const scan = scanSessions(workDir, query, opts, opts.backendType ?? 'claude');
183
+ // Also give immediate cancellation a chance before enumerating any files.
184
+ await yieldToEventLoop();
185
+ let step = scan.next();
186
+ while (!step.done) {
187
+ await yieldToEventLoop();
188
+ step = scan.next();
189
+ }
190
+ return step.value;
246
191
  }
247
192
  //# sourceMappingURL=search-sessions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-sessions.js","sourceRoot":"","sources":["../src/search-sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,mBAAmB,GAEpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AA0BjE,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,cAAc,GAAG,EAAE,CAAC,CAAK,kCAAkC;AAEjE,SAAS,oBAAoB;IAC3B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAChD,CAAC;AAED,sEAAsE;AACtE,SAAS,SAAS,CAAC,IAAY,EAAE,KAAa;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM;QACR,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,2EAA2E;AAC3E,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC;IAEnE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,8CAA8C;IAC9C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;YAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC;YAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,4DAA4D;IAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,OAAO,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAAa;IACnD,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,MAAM;QACtB,KAAK,EAAE,CAAC;QACR,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,QAAgB,EAAE,UAAkB;IAC7D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,KAAa,EACb,OAAiD,EAAE;IAEnD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC;IACnF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,MAAM,KAAK,GAA0B;QACnC,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;KACd,CAAC;IAEF,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAElE,MAAM,WAAW,GAAG,oBAAoB,EAAE,CAAC;IAC3C,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAErD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAElF,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IACtD,CAAC;IAED,iFAAiF;IACjF,MAAM,WAAW,GAAyD,EAAE,CAAC;IAC7E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC9B,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;gBACvC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IACD,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAE9C,8EAA8E;IAC9E,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACnD,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC;YAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAExB,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YACzB,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM;QACR,CAAC;QACD,OAAO,EAAE,CAAC;QAEV,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC;YAAE,SAAS;QACzD,OAAO,EAAE,CAAC;QAEV,IAAI,QAAQ,GAAqB,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,QAAQ,GAAG,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC,CAAC,qBAAqB;YAAC,SAAS;QAAC,CAAC;QAE3C,MAAM,IAAI,GAAuB,EAAE,CAAC;QACpC,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YACxB,iFAAiF;YACjF,MAAM,IAAI,GACR,CAAC,CAAC,IAAI,KAAK,MAAM;gBACf,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE;gBAC5C,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAExB,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,IAAI,GAAG,KAAK,CAAC;gBAAE,SAAS;YAExB,YAAY,IAAI,GAAG,CAAC;YACpB,IAAI,IAAI,CAAC,MAAM,GAAG,iBAAiB,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;gBAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC3C,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC,IAAI,CAAC;wBACR,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,EAAE,EAAE,CAAC,CAAC,SAAS;wBACf,UAAU,EAAE,GAAG;wBACf,OAAO;qBACR,CAAC,CAAC;oBACH,SAAS,EAAE,CAAC;gBACd,CAAC;YACH,CAAC;YAED,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;gBAC5B,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC;gBACX,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,KAAK,EAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3E,YAAY,EAAE,KAAK,CAAC,KAAK;gBACzB,IAAI;gBACJ,SAAS,EAAE,YAAY;aACxB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;YAC5B,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM;QACR,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;YAAE,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;QAClE,OAAO,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,EAAE,OAAO;QACd,OAAO;QACP,SAAS;QACT,YAAY,EAAE,OAAO;QACrB,YAAY,EAAE,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC/B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"search-sessions.js","sourceRoot":"","sources":["../src/search-sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { BackendType } from './backends/types.js';
2
+ export interface SessionSearchRequest {
3
+ searchId: string;
4
+ query: string;
5
+ limit?: number;
6
+ workDir?: string;
7
+ providerId?: string;
8
+ }
9
+ interface SessionSearchDeps {
10
+ getWorkDir(): string;
11
+ getBackendType(): BackendType;
12
+ send(message: Record<string, unknown>): void;
13
+ }
14
+ /** One active search, with cancellation and a captured routing scope. */
15
+ export declare function createSessionSearchHandler(deps: SessionSearchDeps): {
16
+ search: (request: SessionSearchRequest) => Promise<void>;
17
+ cancel: (request: {
18
+ searchId: string;
19
+ }) => void;
20
+ };
21
+ export {};
@@ -0,0 +1,77 @@
1
+ import { resolve } from 'path';
2
+ import { getBackendTypeForProvider, listProviders } from './providers.js';
3
+ import { searchSessionsAsync } from './search-sessions.js';
4
+ /** One active search, with cancellation and a captured routing scope. */
5
+ export function createSessionSearchHandler(deps) {
6
+ let active;
7
+ async function search(request) {
8
+ active?.controller.abort();
9
+ const controller = new AbortController();
10
+ const current = { searchId: request.searchId, controller };
11
+ active = current;
12
+ const fallbackBackend = deps.getBackendType();
13
+ let providerId = request.providerId || fallbackBackend;
14
+ let workDir = deps.getWorkDir();
15
+ try {
16
+ if (typeof request.searchId !== 'string' || !request.searchId.trim()) {
17
+ throw new Error('Search requires a search ID');
18
+ }
19
+ if (request.workDir !== undefined && typeof request.workDir !== 'string') {
20
+ throw new Error('Search working directory must be a string');
21
+ }
22
+ workDir = resolve(request.workDir?.trim() ? request.workDir : workDir);
23
+ if (request.providerId !== undefined && (typeof request.providerId !== 'string' || !request.providerId.trim())) {
24
+ throw new Error('Search provider ID must be a non-empty string');
25
+ }
26
+ if (request.providerId && !listProviders().some(provider => provider.id === request.providerId)) {
27
+ throw new Error('Unknown session search provider');
28
+ }
29
+ // Match list_sessions: legacy clients use the runtime backend; explicit
30
+ // provider IDs select the engine without changing the active conversation.
31
+ const backendType = request.providerId ? getBackendTypeForProvider(request.providerId) : fallbackBackend;
32
+ providerId = request.providerId || backendType;
33
+ const result = await searchSessionsAsync(workDir, request.query, {
34
+ limit: request.limit,
35
+ backendType,
36
+ signal: controller.signal,
37
+ });
38
+ if (controller.signal.aborted)
39
+ return;
40
+ console.log(`[AgentLink] \u2192 session_search_results (hits=${result.results.reduce((sum, session) => sum + session.hits.length, 0)} scanned=${result.scannedFiles} matched=${result.matchedFiles} ${result.durationMs}ms)`);
41
+ deps.send({
42
+ type: 'session_search_results',
43
+ searchId: request.searchId,
44
+ ...result,
45
+ providerId,
46
+ workDir,
47
+ results: result.results.map(session => ({ ...session, providerId, workDir })),
48
+ });
49
+ }
50
+ catch (error) {
51
+ if (controller.signal.aborted)
52
+ return;
53
+ // Do not log the query or error payload, which may include session data.
54
+ console.error('[AgentLink] Session search failed');
55
+ deps.send({
56
+ type: 'session_search_error',
57
+ searchId: request.searchId,
58
+ providerId,
59
+ workDir,
60
+ message: error instanceof Error ? error.message : 'Session search failed',
61
+ });
62
+ }
63
+ finally {
64
+ // An older scan must not clear a newer scan (even with the same search ID).
65
+ if (active === current)
66
+ active = undefined;
67
+ }
68
+ }
69
+ function cancel(request) {
70
+ if (active?.searchId === request.searchId) {
71
+ active.controller.abort();
72
+ active = undefined;
73
+ }
74
+ }
75
+ return { search, cancel };
76
+ }
77
+ //# sourceMappingURL=session-search-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-search-handler.js","sourceRoot":"","sources":["../src/session-search-handler.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-link/agent",
3
- "version": "0.1.335",
3
+ "version": "0.1.337",
4
4
  "description": "AgentLink local agent CLI",
5
5
  "license": "MIT",
6
6
  "repository": {