ai-hist 0.6.0 → 0.8.2
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 +34 -254
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +248 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud-client.d.ts +0 -1
- package/dist/cloud-client.d.ts.map +1 -1
- package/dist/cloud-client.js +0 -2
- package/dist/cloud-client.js.map +1 -1
- package/dist/index.d.ts +138 -309
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +258 -1191
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts +0 -9
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +52 -790
- package/dist/mcp-server.js.map +1 -1
- package/package.json +14 -8
- package/dist/cloud-push.d.ts +0 -51
- package/dist/cloud-push.d.ts.map +0 -1
- package/dist/cloud-push.js +0 -113
- package/dist/cloud-push.js.map +0 -1
- package/dist/cloud-push.test.d.ts +0 -2
- package/dist/cloud-push.test.d.ts.map +0 -1
- package/dist/cloud-push.test.js +0 -82
- package/dist/cloud-push.test.js.map +0 -1
- package/dist/jsonl-sources.d.ts +0 -33
- package/dist/jsonl-sources.d.ts.map +0 -1
- package/dist/jsonl-sources.js +0 -351
- package/dist/jsonl-sources.js.map +0 -1
- package/dist/mcp-smoke.test.d.ts +0 -2
- package/dist/mcp-smoke.test.d.ts.map +0 -1
- package/dist/mcp-smoke.test.js +0 -574
- package/dist/mcp-smoke.test.js.map +0 -1
- package/dist/pair-client.d.ts +0 -41
- package/dist/pair-client.d.ts.map +0 -1
- package/dist/pair-client.js +0 -60
- package/dist/pair-client.js.map +0 -1
- package/dist/pair-client.test.d.ts +0 -2
- package/dist/pair-client.test.d.ts.map +0 -1
- package/dist/pair-client.test.js +0 -118
- package/dist/pair-client.test.js.map +0 -1
- package/dist/session-catalog.d.ts +0 -257
- package/dist/session-catalog.d.ts.map +0 -1
- package/dist/session-catalog.js +0 -340
- package/dist/session-catalog.js.map +0 -1
- package/dist/session-catalog.test.d.ts +0 -2
- package/dist/session-catalog.test.d.ts.map +0 -1
- package/dist/session-catalog.test.js +0 -710
- package/dist/session-catalog.test.js.map +0 -1
- package/dist/session-events.test.d.ts +0 -2
- package/dist/session-events.test.d.ts.map +0 -1
- package/dist/session-events.test.js +0 -177
- package/dist/session-events.test.js.map +0 -1
- package/dist/trajectory-sources.d.ts +0 -36
- package/dist/trajectory-sources.d.ts.map +0 -1
- package/dist/trajectory-sources.js +0 -201
- package/dist/trajectory-sources.js.map +0 -1
package/dist/mcp-smoke.test.js
DELETED
|
@@ -1,574 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import { execFile, spawn } from 'node:child_process';
|
|
3
|
-
import { mkdtemp, mkdir, realpath, writeFile } from 'node:fs/promises';
|
|
4
|
-
import { tmpdir } from 'node:os';
|
|
5
|
-
import { dirname, join } from 'node:path';
|
|
6
|
-
import { test } from 'node:test';
|
|
7
|
-
import initSqlJs from 'sql.js';
|
|
8
|
-
import { openAiHist } from './index.js';
|
|
9
|
-
test('SDK projectScope restricts all history and trajectory reads', async () => {
|
|
10
|
-
const root = await mkdtemp(join(tmpdir(), 'ai-hist-scope-'));
|
|
11
|
-
const dbPath = join(root, 'history.db');
|
|
12
|
-
await writeScopeFixtureDb(dbPath);
|
|
13
|
-
const hist = await openAiHist({ dbPath, projectScope: '/work/app' });
|
|
14
|
-
try {
|
|
15
|
-
assert.equal(hist.projectScope, '/work/app');
|
|
16
|
-
assert.deepEqual(hist.recent({ limit: 10 }).map((entry) => entry.prompt), ['scoped child prompt', 'scoped root prompt']);
|
|
17
|
-
assert.deepEqual(hist.recent({ limit: 10, project: '/work/app/pkg' }).map((entry) => entry.prompt), ['scoped child prompt']);
|
|
18
|
-
assert.deepEqual(hist.recent({ limit: 10, project: '/work/other' }), []);
|
|
19
|
-
assert.deepEqual(hist.search('prompt', { limit: 10 }).map((entry) => entry.prompt), ['scoped child prompt', 'scoped root prompt']);
|
|
20
|
-
assert.deepEqual(hist.getSession('shared').map((entry) => entry.prompt), ['scoped root prompt', 'scoped child prompt']);
|
|
21
|
-
assert.equal(hist.getEntry(3), null);
|
|
22
|
-
assert.deepEqual(hist.getInTimeWindow(2_000, 2_000).map((entry) => entry.prompt), ['scoped root prompt', 'scoped child prompt']);
|
|
23
|
-
assert.equal(hist.stats().total, 2);
|
|
24
|
-
assert.deepEqual(hist.searchTrajectories('decision', { limit: 10 }).map((entry) => entry.id), ['scoped-run']);
|
|
25
|
-
}
|
|
26
|
-
finally {
|
|
27
|
-
hist.close();
|
|
28
|
-
}
|
|
29
|
-
const rootScopedHist = await openAiHist({ dbPath, projectScope: '/' });
|
|
30
|
-
try {
|
|
31
|
-
assert.deepEqual(rootScopedHist.recent({ limit: 10 }).map((entry) => entry.prompt), ['outside prompt', 'scoped child prompt', 'scoped root prompt']);
|
|
32
|
-
assert.deepEqual(rootScopedHist.searchTrajectories('decision', { limit: 10 }).map((entry) => entry.id), ['outside-run', 'scoped-run']);
|
|
33
|
-
}
|
|
34
|
-
finally {
|
|
35
|
-
rootScopedHist.close();
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
test('SDK tags sessions, filters reads by tag, and persists SQLite writes', async () => {
|
|
39
|
-
const root = await mkdtemp(join(tmpdir(), 'ai-hist-tags-'));
|
|
40
|
-
const dbPath = join(root, 'history.db');
|
|
41
|
-
await writeScopeFixtureDb(dbPath);
|
|
42
|
-
const hist = await openAiHist({ dbPath });
|
|
43
|
-
try {
|
|
44
|
-
const tagged = hist.tagSession('shared', 'Release Work', { source: 'claude', color: 'blue' });
|
|
45
|
-
assert.equal(tagged.length, 1);
|
|
46
|
-
assert.deepEqual(hist.search('prompt', { tag: 'release work', limit: 10 }).map((entry) => entry.prompt), ['scoped root prompt']);
|
|
47
|
-
assert.deepEqual(hist.search('', { tag: 'release work', limit: 10 }).map((entry) => entry.prompt), ['scoped root prompt']);
|
|
48
|
-
assert.equal(hist.listTags({ includeSessions: true })[0].sessions?.[0].sessionId, 'shared');
|
|
49
|
-
}
|
|
50
|
-
finally {
|
|
51
|
-
hist.close();
|
|
52
|
-
}
|
|
53
|
-
const reopened = await openAiHist({ dbPath });
|
|
54
|
-
try {
|
|
55
|
-
assert.deepEqual(reopened.recent({ tag: 'release work', limit: 10 }).map((entry) => entry.prompt), ['scoped root prompt']);
|
|
56
|
-
assert.equal(reopened.untagSession('shared', 'release work', { source: 'claude' }), 1);
|
|
57
|
-
assert.deepEqual(reopened.recent({ tag: 'release work', limit: 10 }), []);
|
|
58
|
-
}
|
|
59
|
-
finally {
|
|
60
|
-
reopened.close();
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
test('SDK projectScope restricts tag counts and included tagged sessions', async () => {
|
|
64
|
-
const root = await mkdtemp(join(tmpdir(), 'ai-hist-tag-scope-'));
|
|
65
|
-
const dbPath = join(root, 'history.db');
|
|
66
|
-
await writeScopeFixtureDb(dbPath);
|
|
67
|
-
const unscoped = await openAiHist({ dbPath });
|
|
68
|
-
try {
|
|
69
|
-
assert.equal(unscoped.tagSession('shared', 'Scoped Tag', { source: 'claude' }).length, 1);
|
|
70
|
-
assert.equal(unscoped.tagSession('shared', 'Scoped Tag', { source: 'cursor' }).length, 1);
|
|
71
|
-
}
|
|
72
|
-
finally {
|
|
73
|
-
unscoped.close();
|
|
74
|
-
}
|
|
75
|
-
const scoped = await openAiHist({ dbPath, projectScope: '/work/app' });
|
|
76
|
-
try {
|
|
77
|
-
const tags = scoped.listTags({ tag: 'scoped tag', includeSessions: true });
|
|
78
|
-
assert.equal(tags.length, 1);
|
|
79
|
-
assert.equal(tags[0].sessionCount, 1);
|
|
80
|
-
assert.deepEqual(tags[0].sessions?.map((session) => session.source), ['claude']);
|
|
81
|
-
assert.deepEqual(scoped.recent({ tag: 'scoped tag', limit: 10 }).map((entry) => entry.prompt), ['scoped root prompt']);
|
|
82
|
-
}
|
|
83
|
-
finally {
|
|
84
|
-
scoped.close();
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
test('SDK fallback ingests compacted per-run trajectories from TRAJECTORY_ROOT', async () => {
|
|
88
|
-
const root = await mkdtemp(join(tmpdir(), 'ai-hist-trajectory-'));
|
|
89
|
-
const compacted = join(root, 'planner', 'compacted');
|
|
90
|
-
await mkdir(compacted, { recursive: true });
|
|
91
|
-
await writeFile(join(compacted, 'run-1.json'), JSON.stringify({
|
|
92
|
-
id: 'run-1',
|
|
93
|
-
version: 1,
|
|
94
|
-
personaId: 'planner',
|
|
95
|
-
projectId: 'agent-workforce',
|
|
96
|
-
task: { title: 'Latency budget', description: 'Choose retry behavior for API calls.' },
|
|
97
|
-
status: 'completed',
|
|
98
|
-
startedAt: '2026-06-06T10:00:00.000Z',
|
|
99
|
-
completedAt: '2026-06-06T10:05:00.000Z',
|
|
100
|
-
decisions: [
|
|
101
|
-
{
|
|
102
|
-
question: 'How should retries behave?',
|
|
103
|
-
chosen: 'Use capped exponential backoff',
|
|
104
|
-
reasoning: 'It protects downstream services while preserving UX.',
|
|
105
|
-
alternatives: ['fixed delay', 'no retry'],
|
|
106
|
-
},
|
|
107
|
-
],
|
|
108
|
-
retrospective: {
|
|
109
|
-
summary: 'Retry policy selected.',
|
|
110
|
-
approach: 'Compared failure modes and downstream pressure.',
|
|
111
|
-
learnings: ['Bound retries by elapsed time.'],
|
|
112
|
-
confidence: 0.82,
|
|
113
|
-
},
|
|
114
|
-
}));
|
|
115
|
-
const previousRoot = process.env.TRAJECTORY_ROOT;
|
|
116
|
-
const previousDb = process.env.AI_HIST_DB;
|
|
117
|
-
process.env.TRAJECTORY_ROOT = root;
|
|
118
|
-
process.env.AI_HIST_DB = join(root, 'missing.db');
|
|
119
|
-
const hist = await openAiHist({ dbPath: join(root, 'missing.db') });
|
|
120
|
-
try {
|
|
121
|
-
const results = hist.searchTrajectories('exponential backoff', { limit: 5 });
|
|
122
|
-
assert.equal(results.length, 1);
|
|
123
|
-
assert.equal(results[0].id, 'run-1');
|
|
124
|
-
assert.equal(results[0].decisions[0].chosen, 'Use capped exponential backoff');
|
|
125
|
-
assert.equal(hist.whyForTask('retry policy')?.retrospective.summary, 'Retry policy selected.');
|
|
126
|
-
assert.ok(hist.search('Latency budget', { source: 'trajectory', limit: 5 }).length >= 1);
|
|
127
|
-
}
|
|
128
|
-
finally {
|
|
129
|
-
hist.close();
|
|
130
|
-
if (previousRoot === undefined)
|
|
131
|
-
delete process.env.TRAJECTORY_ROOT;
|
|
132
|
-
else
|
|
133
|
-
process.env.TRAJECTORY_ROOT = previousRoot;
|
|
134
|
-
if (previousDb === undefined)
|
|
135
|
-
delete process.env.AI_HIST_DB;
|
|
136
|
-
else
|
|
137
|
-
process.env.AI_HIST_DB = previousDb;
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
test('SDK fallback ingests OpenCode rows committed in WAL files', async () => {
|
|
141
|
-
const root = await mkdtemp(join(tmpdir(), 'ai-hist-opencode-wal-'));
|
|
142
|
-
const dbPath = join(root, 'opencode.db');
|
|
143
|
-
const child = spawn('sqlite3', ['-bail', dbPath], { stdio: ['pipe', 'ignore', 'pipe'] });
|
|
144
|
-
const stderr = [];
|
|
145
|
-
child.stderr.on('data', (chunk) => stderr.push(chunk));
|
|
146
|
-
const fixtureReady = new Promise((resolve, reject) => {
|
|
147
|
-
const deadline = Date.now() + 5_000;
|
|
148
|
-
let settled = false;
|
|
149
|
-
let retryTimer;
|
|
150
|
-
const finish = (error, output) => {
|
|
151
|
-
if (settled)
|
|
152
|
-
return;
|
|
153
|
-
settled = true;
|
|
154
|
-
if (retryTimer)
|
|
155
|
-
clearTimeout(retryTimer);
|
|
156
|
-
if (error)
|
|
157
|
-
reject(error);
|
|
158
|
-
else
|
|
159
|
-
resolve(output ?? '');
|
|
160
|
-
};
|
|
161
|
-
const poll = () => {
|
|
162
|
-
execFile('sqlite3', ['-readonly', dbPath, "PRAGMA journal_mode; SELECT count(*) FROM part;"], (error, stdout) => {
|
|
163
|
-
if (!error && stdout === 'wal\n1\n') {
|
|
164
|
-
finish(undefined, stdout);
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
if (Date.now() >= deadline) {
|
|
168
|
-
finish(new Error(`timed out waiting for sqlite fixture: ${Buffer.concat(stderr).toString('utf8')}; ` +
|
|
169
|
-
`last probe: ${error ? String(error) : JSON.stringify(stdout)}`));
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
retryTimer = setTimeout(poll, 25);
|
|
173
|
-
});
|
|
174
|
-
};
|
|
175
|
-
child.once('error', (err) => {
|
|
176
|
-
finish(new Error(`could not start sqlite3: ${String(err)}`));
|
|
177
|
-
});
|
|
178
|
-
child.stdin.once('error', (err) => {
|
|
179
|
-
finish(new Error(`could not write sqlite fixture: ${String(err)}`));
|
|
180
|
-
});
|
|
181
|
-
child.once('exit', (code, signal) => {
|
|
182
|
-
finish(new Error(`sqlite3 exited before fixture readiness (code=${String(code)}, signal=${String(signal)}): ` +
|
|
183
|
-
Buffer.concat(stderr).toString('utf8')));
|
|
184
|
-
});
|
|
185
|
-
poll();
|
|
186
|
-
});
|
|
187
|
-
child.stdin.write(`
|
|
188
|
-
PRAGMA journal_mode=WAL;
|
|
189
|
-
PRAGMA wal_autocheckpoint=0;
|
|
190
|
-
CREATE TABLE session (id TEXT PRIMARY KEY, directory TEXT, time_created INTEGER);
|
|
191
|
-
CREATE TABLE message (id TEXT PRIMARY KEY, session_id TEXT, time_created INTEGER, data TEXT);
|
|
192
|
-
CREATE TABLE part (id TEXT PRIMARY KEY, message_id TEXT, session_id TEXT, time_created INTEGER, data TEXT);
|
|
193
|
-
INSERT INTO session VALUES ('oc-ts-wal', '/tmp/opencode-ts', 1700000000000);
|
|
194
|
-
INSERT INTO message VALUES ('msg-ts-wal', 'oc-ts-wal', 1700000001000, '{"role":"user"}');
|
|
195
|
-
INSERT INTO part VALUES ('part-ts-wal', 'msg-ts-wal', 'oc-ts-wal', 1700000002000, '{"type":"text","text":"ts wal opencode prompt"}');
|
|
196
|
-
`);
|
|
197
|
-
const previousDb = process.env.AI_HIST_DB;
|
|
198
|
-
const previousOpenCode = process.env.OPENCODE_DB;
|
|
199
|
-
const previousTrajectory = process.env.TRAJECTORY_ROOT;
|
|
200
|
-
process.env.AI_HIST_DB = join(root, 'missing-ai-hist.db');
|
|
201
|
-
process.env.OPENCODE_DB = dbPath;
|
|
202
|
-
process.env.TRAJECTORY_ROOT = join(root, 'missing-trajectories');
|
|
203
|
-
try {
|
|
204
|
-
const fixtureOutput = await fixtureReady;
|
|
205
|
-
assert.match(fixtureOutput, /^wal$/m, 'fixture database did not enter WAL mode');
|
|
206
|
-
assert.match(fixtureOutput, /^1$/m, 'fixture row was not committed and readable');
|
|
207
|
-
const hist = await openAiHist({ dbPath: process.env.AI_HIST_DB });
|
|
208
|
-
try {
|
|
209
|
-
assert.deepEqual(hist.search('ts wal opencode', { source: 'opencode', limit: 5 }).map((entry) => entry.prompt), ['ts wal opencode prompt']);
|
|
210
|
-
}
|
|
211
|
-
finally {
|
|
212
|
-
hist.close();
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
finally {
|
|
216
|
-
child.kill();
|
|
217
|
-
if (previousDb === undefined)
|
|
218
|
-
delete process.env.AI_HIST_DB;
|
|
219
|
-
else
|
|
220
|
-
process.env.AI_HIST_DB = previousDb;
|
|
221
|
-
if (previousOpenCode === undefined)
|
|
222
|
-
delete process.env.OPENCODE_DB;
|
|
223
|
-
else
|
|
224
|
-
process.env.OPENCODE_DB = previousOpenCode;
|
|
225
|
-
if (previousTrajectory === undefined)
|
|
226
|
-
delete process.env.TRAJECTORY_ROOT;
|
|
227
|
-
else
|
|
228
|
-
process.env.TRAJECTORY_ROOT = previousTrajectory;
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
test('MCP server exposes history and trajectory tools over stdio', async () => {
|
|
232
|
-
const root = await realpath(await mkdtemp(join(tmpdir(), 'ai-hist-mcp-')));
|
|
233
|
-
const dbPath = join(root, 'history.db');
|
|
234
|
-
await writeScopeFixtureDb(dbPath);
|
|
235
|
-
const child = spawn(process.execPath, [new URL('./mcp-server.js', import.meta.url).pathname, '--project', '--project-path=.'], {
|
|
236
|
-
cwd: root,
|
|
237
|
-
env: {
|
|
238
|
-
...process.env,
|
|
239
|
-
AI_HIST_DB: dbPath,
|
|
240
|
-
TRAJECTORY_ROOT: root,
|
|
241
|
-
},
|
|
242
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
243
|
-
});
|
|
244
|
-
const stderr = [];
|
|
245
|
-
child.stderr.on('data', (chunk) => stderr.push(chunk));
|
|
246
|
-
try {
|
|
247
|
-
const { tools, stats, catalog } = await new Promise((resolve, reject) => {
|
|
248
|
-
const timer = setTimeout(() => reject(new Error('timed out waiting for MCP responses')), 5000);
|
|
249
|
-
let buffer = '';
|
|
250
|
-
let tools = null;
|
|
251
|
-
let stats = null;
|
|
252
|
-
let catalog = null;
|
|
253
|
-
child.stdout.on('data', (chunk) => {
|
|
254
|
-
buffer += chunk.toString('utf8');
|
|
255
|
-
while (true) {
|
|
256
|
-
const marker = buffer.indexOf('\n');
|
|
257
|
-
if (marker === -1)
|
|
258
|
-
return;
|
|
259
|
-
const body = buffer.slice(0, marker).trim();
|
|
260
|
-
buffer = buffer.slice(marker + 1);
|
|
261
|
-
if (!body)
|
|
262
|
-
continue;
|
|
263
|
-
const message = JSON.parse(body);
|
|
264
|
-
if (message.error) {
|
|
265
|
-
clearTimeout(timer);
|
|
266
|
-
reject(new Error(`MCP error: ${JSON.stringify(message.error)}`));
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
if (message.id === 2) {
|
|
270
|
-
tools = new Set((message.result?.tools ?? []).map((tool) => tool.name));
|
|
271
|
-
}
|
|
272
|
-
if (message.id === 3) {
|
|
273
|
-
const text = message.result?.content?.find((item) => item.type === 'text')?.text ?? '{}';
|
|
274
|
-
stats = JSON.parse(text);
|
|
275
|
-
}
|
|
276
|
-
if (message.id === 4) {
|
|
277
|
-
const text = message.result?.content?.find((item) => item.type === 'text')?.text ?? '{}';
|
|
278
|
-
catalog = JSON.parse(text);
|
|
279
|
-
}
|
|
280
|
-
if (tools && stats && catalog) {
|
|
281
|
-
clearTimeout(timer);
|
|
282
|
-
resolve({ tools, stats, catalog });
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
child.on('error', (err) => {
|
|
287
|
-
clearTimeout(timer);
|
|
288
|
-
reject(err);
|
|
289
|
-
});
|
|
290
|
-
child.on('exit', (code) => {
|
|
291
|
-
if (code !== null && code !== 0) {
|
|
292
|
-
clearTimeout(timer);
|
|
293
|
-
reject(new Error(`MCP server exited ${code}: ${Buffer.concat(stderr).toString('utf8')}`));
|
|
294
|
-
}
|
|
295
|
-
});
|
|
296
|
-
writeJsonRpc(child.stdin, {
|
|
297
|
-
jsonrpc: '2.0',
|
|
298
|
-
id: 1,
|
|
299
|
-
method: 'initialize',
|
|
300
|
-
params: {
|
|
301
|
-
protocolVersion: '2025-06-18',
|
|
302
|
-
capabilities: {},
|
|
303
|
-
clientInfo: { name: 'ai-hist-smoke', version: '0.0.0' },
|
|
304
|
-
},
|
|
305
|
-
});
|
|
306
|
-
writeJsonRpc(child.stdin, {
|
|
307
|
-
jsonrpc: '2.0',
|
|
308
|
-
method: 'notifications/initialized',
|
|
309
|
-
params: {},
|
|
310
|
-
});
|
|
311
|
-
writeJsonRpc(child.stdin, {
|
|
312
|
-
jsonrpc: '2.0',
|
|
313
|
-
id: 2,
|
|
314
|
-
method: 'tools/list',
|
|
315
|
-
params: {},
|
|
316
|
-
});
|
|
317
|
-
writeJsonRpc(child.stdin, {
|
|
318
|
-
jsonrpc: '2.0',
|
|
319
|
-
id: 3,
|
|
320
|
-
method: 'tools/call',
|
|
321
|
-
params: { name: 'stats', arguments: {} },
|
|
322
|
-
});
|
|
323
|
-
writeJsonRpc(child.stdin, {
|
|
324
|
-
jsonrpc: '2.0',
|
|
325
|
-
id: 4,
|
|
326
|
-
method: 'tools/call',
|
|
327
|
-
params: { name: 'list_sessions', arguments: { limit: 5 } },
|
|
328
|
-
});
|
|
329
|
-
});
|
|
330
|
-
for (const name of [
|
|
331
|
-
'search_history',
|
|
332
|
-
'recent_entries',
|
|
333
|
-
'get_session',
|
|
334
|
-
'get_context',
|
|
335
|
-
'stats',
|
|
336
|
-
'tag_session',
|
|
337
|
-
'untag_session',
|
|
338
|
-
'list_tags',
|
|
339
|
-
'search_trajectories',
|
|
340
|
-
'why_for_task',
|
|
341
|
-
'get_handoff',
|
|
342
|
-
'pair_check',
|
|
343
|
-
'list_sessions',
|
|
344
|
-
]) {
|
|
345
|
-
assert.ok(tools.has(name), `missing MCP tool ${name}`);
|
|
346
|
-
}
|
|
347
|
-
assert.equal(stats.projectScope, root);
|
|
348
|
-
// The catalog tool serves the sessions table, with trajectories excluded.
|
|
349
|
-
assert.equal(catalog.contractVersion, 1);
|
|
350
|
-
assert.deepEqual(catalog.sessions?.map((session) => session.sessionId), ['catalog-codex']);
|
|
351
|
-
assert.deepEqual(catalog.sessions?.[0]?.models, ['gpt-5.4']);
|
|
352
|
-
assert.equal(catalog.sessions?.[0]?.discoveryState, 'shallow');
|
|
353
|
-
}
|
|
354
|
-
finally {
|
|
355
|
-
child.kill();
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
test('list_sessions answers without a database instead of scanning provider files', async () => {
|
|
359
|
-
// No SQLite database exists, and the catalog only ever lives in one. Opening
|
|
360
|
-
// the reader here would walk every local provider file to build the JSONL
|
|
361
|
-
// fallback — seconds of I/O for a guaranteed-empty catalog. The tool must
|
|
362
|
-
// short-circuit, which shows up as sourceKind "none" rather than "jsonl".
|
|
363
|
-
const root = await realpath(await mkdtemp(join(tmpdir(), 'ai-hist-mcp-nodb-')));
|
|
364
|
-
const home = join(root, 'home');
|
|
365
|
-
await mkdir(home, { recursive: true });
|
|
366
|
-
const child = spawn(process.execPath, [new URL('./mcp-server.js', import.meta.url).pathname], {
|
|
367
|
-
cwd: root,
|
|
368
|
-
env: {
|
|
369
|
-
...process.env,
|
|
370
|
-
HOME: home,
|
|
371
|
-
USERPROFILE: home,
|
|
372
|
-
AI_HIST_DB: join(root, 'missing.db'),
|
|
373
|
-
TRAJECTORY_ROOT: join(root, 'missing-trajectories'),
|
|
374
|
-
OPENCODE_DB: join(root, 'missing-opencode.db'),
|
|
375
|
-
},
|
|
376
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
377
|
-
});
|
|
378
|
-
const stderr = [];
|
|
379
|
-
child.stderr.on('data', (chunk) => stderr.push(chunk));
|
|
380
|
-
try {
|
|
381
|
-
const payload = await new Promise((resolve, reject) => {
|
|
382
|
-
const timer = setTimeout(() => reject(new Error('timed out waiting for list_sessions')), 10_000);
|
|
383
|
-
let buffer = '';
|
|
384
|
-
child.stdout.on('data', (chunk) => {
|
|
385
|
-
buffer += chunk.toString('utf8');
|
|
386
|
-
while (true) {
|
|
387
|
-
const marker = buffer.indexOf('\n');
|
|
388
|
-
if (marker === -1)
|
|
389
|
-
return;
|
|
390
|
-
const body = buffer.slice(0, marker).trim();
|
|
391
|
-
buffer = buffer.slice(marker + 1);
|
|
392
|
-
if (!body)
|
|
393
|
-
continue;
|
|
394
|
-
const message = JSON.parse(body);
|
|
395
|
-
if (message.error) {
|
|
396
|
-
clearTimeout(timer);
|
|
397
|
-
reject(new Error(`MCP error: ${JSON.stringify(message.error)}`));
|
|
398
|
-
return;
|
|
399
|
-
}
|
|
400
|
-
if (message.id === 2) {
|
|
401
|
-
clearTimeout(timer);
|
|
402
|
-
const text = message.result?.content?.find((item) => item.type === 'text')?.text ?? '{}';
|
|
403
|
-
resolve(JSON.parse(text));
|
|
404
|
-
return;
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
});
|
|
408
|
-
child.on('error', (err) => {
|
|
409
|
-
clearTimeout(timer);
|
|
410
|
-
reject(err);
|
|
411
|
-
});
|
|
412
|
-
child.on('exit', (code) => {
|
|
413
|
-
if (code !== null && code !== 0) {
|
|
414
|
-
clearTimeout(timer);
|
|
415
|
-
reject(new Error(`MCP server exited ${code}: ${Buffer.concat(stderr).toString('utf8')}`));
|
|
416
|
-
}
|
|
417
|
-
});
|
|
418
|
-
writeJsonRpc(child.stdin, {
|
|
419
|
-
jsonrpc: '2.0',
|
|
420
|
-
id: 1,
|
|
421
|
-
method: 'initialize',
|
|
422
|
-
params: {
|
|
423
|
-
protocolVersion: '2025-06-18',
|
|
424
|
-
capabilities: {},
|
|
425
|
-
clientInfo: { name: 'ai-hist-smoke', version: '0.0.0' },
|
|
426
|
-
},
|
|
427
|
-
});
|
|
428
|
-
writeJsonRpc(child.stdin, { jsonrpc: '2.0', method: 'notifications/initialized', params: {} });
|
|
429
|
-
writeJsonRpc(child.stdin, {
|
|
430
|
-
jsonrpc: '2.0',
|
|
431
|
-
id: 2,
|
|
432
|
-
method: 'tools/call',
|
|
433
|
-
params: { name: 'list_sessions', arguments: {} },
|
|
434
|
-
});
|
|
435
|
-
});
|
|
436
|
-
assert.equal(payload.sourceKind, 'none');
|
|
437
|
-
assert.deepEqual(payload.sessions, []);
|
|
438
|
-
assert.equal(payload.nextCursor, null);
|
|
439
|
-
assert.match(payload.note ?? '', /sessions discover/);
|
|
440
|
-
}
|
|
441
|
-
finally {
|
|
442
|
-
child.kill();
|
|
443
|
-
}
|
|
444
|
-
});
|
|
445
|
-
function writeJsonRpc(stdin, payload) {
|
|
446
|
-
stdin.write(`${JSON.stringify(payload)}\n`);
|
|
447
|
-
}
|
|
448
|
-
async function writeScopeFixtureDb(dbPath) {
|
|
449
|
-
const SQL = await initSqlJs();
|
|
450
|
-
const db = new SQL.Database();
|
|
451
|
-
try {
|
|
452
|
-
db.run(`CREATE TABLE history (
|
|
453
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
454
|
-
source TEXT NOT NULL,
|
|
455
|
-
session_id TEXT,
|
|
456
|
-
project TEXT,
|
|
457
|
-
prompt TEXT NOT NULL,
|
|
458
|
-
timestamp_ms INTEGER NOT NULL,
|
|
459
|
-
git_branch TEXT
|
|
460
|
-
)`);
|
|
461
|
-
db.run(`CREATE TABLE sessions (
|
|
462
|
-
session_id TEXT NOT NULL,
|
|
463
|
-
source TEXT NOT NULL,
|
|
464
|
-
cwd TEXT,
|
|
465
|
-
git_branch TEXT,
|
|
466
|
-
first_activity_ms INTEGER,
|
|
467
|
-
last_activity_ms INTEGER,
|
|
468
|
-
last_assistant_text TEXT,
|
|
469
|
-
raw_path TEXT,
|
|
470
|
-
parser_version INTEGER NOT NULL DEFAULT 1,
|
|
471
|
-
first_prompt TEXT,
|
|
472
|
-
models_json TEXT,
|
|
473
|
-
originator TEXT,
|
|
474
|
-
agent_version TEXT,
|
|
475
|
-
repo_url TEXT,
|
|
476
|
-
initial_commit TEXT,
|
|
477
|
-
workspace_roots_json TEXT,
|
|
478
|
-
source_stamp TEXT,
|
|
479
|
-
discovery_state TEXT,
|
|
480
|
-
PRIMARY KEY (session_id, source)
|
|
481
|
-
)`);
|
|
482
|
-
// Catalog rows live in the database's own directory so a project-scoped
|
|
483
|
-
// server (the MCP smoke test scopes to that directory) can see them.
|
|
484
|
-
const sessionCwd = dirname(dbPath);
|
|
485
|
-
const insertSession = db.prepare(`INSERT INTO sessions (session_id, source, cwd, git_branch, first_activity_ms,
|
|
486
|
-
last_activity_ms, last_assistant_text, raw_path, parser_version, first_prompt,
|
|
487
|
-
models_json, discovery_state)
|
|
488
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
489
|
-
try {
|
|
490
|
-
insertSession.run([
|
|
491
|
-
'catalog-codex', 'codex', sessionCwd, 'main', 1_000, 2_000, null, '/raw/codex.jsonl', 1,
|
|
492
|
-
'catalog codex prompt', '["gpt-5.4"]', 'shallow',
|
|
493
|
-
]);
|
|
494
|
-
insertSession.run([
|
|
495
|
-
'catalog-traj', 'trajectory', sessionCwd, null, 9_000, 9_000, null, null, 1,
|
|
496
|
-
null, null, 'full',
|
|
497
|
-
]);
|
|
498
|
-
}
|
|
499
|
-
finally {
|
|
500
|
-
insertSession.free();
|
|
501
|
-
}
|
|
502
|
-
db.run(`CREATE TABLE trajectories (
|
|
503
|
-
id TEXT PRIMARY KEY,
|
|
504
|
-
version INTEGER,
|
|
505
|
-
persona_id TEXT,
|
|
506
|
-
project_id TEXT,
|
|
507
|
-
task_title TEXT,
|
|
508
|
-
task_description TEXT,
|
|
509
|
-
status TEXT,
|
|
510
|
-
started_at TEXT,
|
|
511
|
-
completed_at TEXT,
|
|
512
|
-
decisions_json TEXT NOT NULL,
|
|
513
|
-
retrospective_json TEXT NOT NULL,
|
|
514
|
-
search_text TEXT NOT NULL,
|
|
515
|
-
path TEXT,
|
|
516
|
-
updated_ms INTEGER NOT NULL,
|
|
517
|
-
timestamp_ms INTEGER NOT NULL
|
|
518
|
-
)`);
|
|
519
|
-
const insertHistory = db.prepare('INSERT INTO history (source, session_id, project, prompt, timestamp_ms) VALUES (?, ?, ?, ?, ?)');
|
|
520
|
-
const insertTrajectory = db.prepare(`INSERT INTO trajectories
|
|
521
|
-
(id, version, persona_id, project_id, task_title, task_description, status,
|
|
522
|
-
started_at, completed_at, decisions_json, retrospective_json, search_text,
|
|
523
|
-
path, updated_ms, timestamp_ms)
|
|
524
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
525
|
-
try {
|
|
526
|
-
insertHistory.run(['claude', 'shared', '/work/app', 'scoped root prompt', 1_000]);
|
|
527
|
-
insertHistory.run(['codex', 'shared', '/work/app/pkg', 'scoped child prompt', 2_000]);
|
|
528
|
-
insertHistory.run(['cursor', 'shared', '/work/other', 'outside prompt', 3_000]);
|
|
529
|
-
insertTrajectory.run([
|
|
530
|
-
'scoped-run',
|
|
531
|
-
1,
|
|
532
|
-
'planner',
|
|
533
|
-
'app',
|
|
534
|
-
'Scoped task',
|
|
535
|
-
'Scoped decision',
|
|
536
|
-
'completed',
|
|
537
|
-
null,
|
|
538
|
-
null,
|
|
539
|
-
'[]',
|
|
540
|
-
'{}',
|
|
541
|
-
'scoped decision',
|
|
542
|
-
'/work/app/.trajectories/planner/compacted/scoped-run.json',
|
|
543
|
-
4_000,
|
|
544
|
-
4_000,
|
|
545
|
-
]);
|
|
546
|
-
insertTrajectory.run([
|
|
547
|
-
'outside-run',
|
|
548
|
-
1,
|
|
549
|
-
'planner',
|
|
550
|
-
'other',
|
|
551
|
-
'Outside task',
|
|
552
|
-
'Outside decision',
|
|
553
|
-
'completed',
|
|
554
|
-
null,
|
|
555
|
-
null,
|
|
556
|
-
'[]',
|
|
557
|
-
'{}',
|
|
558
|
-
'outside decision',
|
|
559
|
-
'/work/other/.trajectories/planner/compacted/outside-run.json',
|
|
560
|
-
5_000,
|
|
561
|
-
5_000,
|
|
562
|
-
]);
|
|
563
|
-
}
|
|
564
|
-
finally {
|
|
565
|
-
insertHistory.free();
|
|
566
|
-
insertTrajectory.free();
|
|
567
|
-
}
|
|
568
|
-
await writeFile(dbPath, Buffer.from(db.export()));
|
|
569
|
-
}
|
|
570
|
-
finally {
|
|
571
|
-
db.close();
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
//# sourceMappingURL=mcp-smoke.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-smoke.test.js","sourceRoot":"","sources":["../src/mcp-smoke.test.ts"],"names":[],"mappings":"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"}
|
package/dist/pair-client.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
export type PairContext = {
|
|
2
|
-
projectId?: string;
|
|
3
|
-
repoPath?: string;
|
|
4
|
-
cwd?: string;
|
|
5
|
-
gitRemote?: string;
|
|
6
|
-
task?: string;
|
|
7
|
-
files?: string[];
|
|
8
|
-
tool?: string;
|
|
9
|
-
target?: string;
|
|
10
|
-
action?: string;
|
|
11
|
-
recentPrompt?: string;
|
|
12
|
-
};
|
|
13
|
-
export type PairCheckRequest = {
|
|
14
|
-
context: PairContext;
|
|
15
|
-
limit?: number;
|
|
16
|
-
};
|
|
17
|
-
export type PairEvidence = {
|
|
18
|
-
eventId?: string;
|
|
19
|
-
machineId?: string;
|
|
20
|
-
source?: string;
|
|
21
|
-
sessionId?: string;
|
|
22
|
-
kind?: string;
|
|
23
|
-
lens?: string;
|
|
24
|
-
ts?: string;
|
|
25
|
-
snippet?: string;
|
|
26
|
-
};
|
|
27
|
-
export type PairWarning = {
|
|
28
|
-
text: string;
|
|
29
|
-
kind?: string;
|
|
30
|
-
lens?: string;
|
|
31
|
-
score?: number;
|
|
32
|
-
evidence?: PairEvidence[];
|
|
33
|
-
};
|
|
34
|
-
export type PairCheckResponse = {
|
|
35
|
-
decision?: "allow" | "warn";
|
|
36
|
-
warnings: PairWarning[];
|
|
37
|
-
correlationId?: string;
|
|
38
|
-
};
|
|
39
|
-
export declare function pairCheck(req: PairCheckRequest, timeoutMs?: number): Promise<PairCheckResponse>;
|
|
40
|
-
export declare function formatPairWarnings(result: PairCheckResponse): string;
|
|
41
|
-
//# sourceMappingURL=pair-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pair-client.d.ts","sourceRoot":"","sources":["../src/pair-client.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AA0BF,wBAAsB,SAAS,CAAC,GAAG,EAAE,gBAAgB,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAarG;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAgBpE"}
|