@agent-link/agent 0.1.334 → 0.1.336
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backends/types.d.ts +0 -11
- package/dist/backends/types.js +5 -12
- package/dist/backends/types.js.map +1 -1
- package/dist/connection.js +18 -150
- package/dist/connection.js.map +1 -1
- package/dist/copilot.d.ts +8 -47
- package/dist/copilot.js +49 -748
- package/dist/copilot.js.map +1 -1
- package/dist/history.d.ts +5 -1
- package/dist/history.js +12 -3
- package/dist/history.js.map +1 -1
- package/dist/provider-command-discovery.d.ts +0 -5
- package/dist/provider-command-discovery.js +1 -41
- package/dist/provider-command-discovery.js.map +1 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +1 -1
- package/dist/runtime.js.map +1 -1
- package/dist/search-sessions.d.ts +9 -9
- package/dist/search-sessions.js +105 -160
- package/dist/search-sessions.js.map +1 -1
- package/dist/session-search-handler.d.ts +21 -0
- package/dist/session-search-handler.js +77 -0
- package/dist/session-search-handler.js.map +1 -0
- package/package.json +1 -3
- package/dist/copilot-command-bridge.d.ts +0 -102
- package/dist/copilot-command-bridge.js +0 -654
- package/dist/copilot-command-bridge.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type HistoryMessage } from './history-message-transform.js';
|
|
2
|
+
import type { BackendType } from './backends/types.js';
|
|
2
3
|
export interface SessionSearchHit {
|
|
3
4
|
role: HistoryMessage['role'];
|
|
4
5
|
ts?: string;
|
|
@@ -20,14 +21,13 @@ export interface SessionSearchResponse {
|
|
|
20
21
|
matchedFiles: number;
|
|
21
22
|
durationMs: number;
|
|
22
23
|
}
|
|
23
|
-
|
|
24
|
-
* Search every session under `workDir` for `query`.
|
|
25
|
-
*
|
|
26
|
-
* - Case-insensitive substring match (no regex).
|
|
27
|
-
* - Capped at `limit` total hits across all sessions; per-session capped at 10.
|
|
28
|
-
* - `signal` (optional) can be aborted between files for cancellation.
|
|
29
|
-
*/
|
|
30
|
-
export declare function searchSessions(workDir: string, query: string, opts?: {
|
|
24
|
+
export interface SessionSearchOptions {
|
|
31
25
|
limit?: number;
|
|
32
26
|
signal?: AbortSignal;
|
|
33
|
-
}
|
|
27
|
+
}
|
|
28
|
+
export declare const MAX_SESSION_SEARCH_QUERY_LENGTH = 1000;
|
|
29
|
+
/** Synchronous Claude entry point retained for existing callers. */
|
|
30
|
+
export declare function searchSessions(workDir: string, query: string, opts?: SessionSearchOptions): SessionSearchResponse;
|
|
31
|
+
export declare function searchSessionsAsync(workDir: string, query: string, opts?: SessionSearchOptions & {
|
|
32
|
+
backendType?: BackendType;
|
|
33
|
+
}): Promise<SessionSearchResponse>;
|
package/dist/search-sessions.js
CHANGED
|
@@ -1,32 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
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 {
|
|
7
|
+
import { readdirSync, statSync } from 'fs';
|
|
17
8
|
import { join } from 'path';
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
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;
|
|
23
|
-
|
|
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
|
|
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 +
|
|
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
|
-
//
|
|
72
|
-
|
|
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
|
-
|
|
96
|
-
|
|
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
|
-
|
|
104
|
-
return buf.toString('utf-8').toLowerCase().includes(queryLower);
|
|
72
|
+
files = readdirSync(projectPath);
|
|
105
73
|
}
|
|
106
|
-
catch {
|
|
107
|
-
|
|
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
|
-
|
|
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
|
|
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 (
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
169
|
-
|
|
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
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
if (!
|
|
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 +=
|
|
140
|
+
sessionTotal += occurrences;
|
|
201
141
|
if (hits.length < PER_SESSION_LIMIT && totalHits < totalLimit) {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
214
|
-
truncated = true;
|
|
215
|
-
break;
|
|
150
|
+
else {
|
|
151
|
+
response.truncated = true;
|
|
216
152
|
}
|
|
217
153
|
}
|
|
218
154
|
if (hits.length > 0) {
|
|
219
|
-
|
|
155
|
+
response.matchedFiles++;
|
|
156
|
+
response.results.push({
|
|
220
157
|
sessionId: entry.sessionId,
|
|
221
|
-
title:
|
|
222
|
-
lastModified: entry.
|
|
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
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
|
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.
|
|
3
|
+
"version": "0.1.336",
|
|
4
4
|
"description": "AgentLink local agent CLI",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -43,7 +43,6 @@
|
|
|
43
43
|
"node": ">=18.0.0"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@agentclientprotocol/sdk": "^1.4.0",
|
|
47
46
|
"@azure/msal-node": "^3.8.10",
|
|
48
47
|
"commander": "^12.0.0",
|
|
49
48
|
"cron-parser": "^5.5.0",
|
|
@@ -54,7 +53,6 @@
|
|
|
54
53
|
"qrcode-terminal": "^0.12.0",
|
|
55
54
|
"tweetnacl": "^1.0.3",
|
|
56
55
|
"tweetnacl-util": "^0.15.1",
|
|
57
|
-
"vscode-jsonrpc": "^8.2.1",
|
|
58
56
|
"ws": "^8.16.0"
|
|
59
57
|
},
|
|
60
58
|
"devDependencies": {
|