ai-hist 0.4.1 → 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.
Files changed (46) hide show
  1. package/README.md +34 -156
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +248 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/cloud-client.d.ts +0 -1
  7. package/dist/cloud-client.d.ts.map +1 -1
  8. package/dist/cloud-client.js +0 -2
  9. package/dist/cloud-client.js.map +1 -1
  10. package/dist/index.d.ts +153 -211
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +263 -902
  13. package/dist/index.js.map +1 -1
  14. package/dist/mcp-server.d.ts +0 -9
  15. package/dist/mcp-server.d.ts.map +1 -1
  16. package/dist/mcp-server.js +52 -675
  17. package/dist/mcp-server.js.map +1 -1
  18. package/package.json +14 -8
  19. package/dist/cloud-push.d.ts +0 -47
  20. package/dist/cloud-push.d.ts.map +0 -1
  21. package/dist/cloud-push.js +0 -111
  22. package/dist/cloud-push.js.map +0 -1
  23. package/dist/cloud-push.test.d.ts +0 -2
  24. package/dist/cloud-push.test.d.ts.map +0 -1
  25. package/dist/cloud-push.test.js +0 -68
  26. package/dist/cloud-push.test.js.map +0 -1
  27. package/dist/jsonl-sources.d.ts +0 -35
  28. package/dist/jsonl-sources.d.ts.map +0 -1
  29. package/dist/jsonl-sources.js +0 -354
  30. package/dist/jsonl-sources.js.map +0 -1
  31. package/dist/mcp-smoke.test.d.ts +0 -2
  32. package/dist/mcp-smoke.test.d.ts.map +0 -1
  33. package/dist/mcp-smoke.test.js +0 -424
  34. package/dist/mcp-smoke.test.js.map +0 -1
  35. package/dist/pair-client.d.ts +0 -41
  36. package/dist/pair-client.d.ts.map +0 -1
  37. package/dist/pair-client.js +0 -60
  38. package/dist/pair-client.js.map +0 -1
  39. package/dist/pair-client.test.d.ts +0 -2
  40. package/dist/pair-client.test.d.ts.map +0 -1
  41. package/dist/pair-client.test.js +0 -118
  42. package/dist/pair-client.test.js.map +0 -1
  43. package/dist/trajectory-sources.d.ts +0 -36
  44. package/dist/trajectory-sources.d.ts.map +0 -1
  45. package/dist/trajectory-sources.js +0 -201
  46. package/dist/trajectory-sources.js.map +0 -1
@@ -1,424 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { spawn } from 'node:child_process';
3
- import { mkdtemp, mkdir, realpath, stat, writeFile } from 'node:fs/promises';
4
- import { tmpdir } from 'node:os';
5
- import { 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 readyPath = join(root, 'ready');
144
- const child = spawn('python3', [
145
- '-c',
146
- `
147
- import json, pathlib, sqlite3, time
148
- db = pathlib.Path(${JSON.stringify(dbPath)})
149
- ready = pathlib.Path(${JSON.stringify(readyPath)})
150
- conn = sqlite3.connect(db)
151
- conn.execute("PRAGMA journal_mode=WAL")
152
- conn.execute("PRAGMA wal_autocheckpoint=0")
153
- conn.execute("CREATE TABLE session (id TEXT PRIMARY KEY, directory TEXT, time_created INTEGER)")
154
- conn.execute("CREATE TABLE message (id TEXT PRIMARY KEY, session_id TEXT, time_created INTEGER, data TEXT)")
155
- conn.execute("CREATE TABLE part (id TEXT PRIMARY KEY, message_id TEXT, session_id TEXT, time_created INTEGER, data TEXT)")
156
- conn.execute("INSERT INTO session VALUES ('oc-ts-wal', '/tmp/opencode-ts', 1700000000000)")
157
- conn.execute("INSERT INTO message VALUES ('msg-ts-wal', 'oc-ts-wal', 1700000001000, ?)", (json.dumps({"role":"user"}),))
158
- conn.execute("INSERT INTO part VALUES ('part-ts-wal', 'msg-ts-wal', 'oc-ts-wal', 1700000002000, ?)", (json.dumps({"type":"text","text":"ts wal opencode prompt"}),))
159
- conn.commit()
160
- live = sqlite3.connect(db)
161
- assert live.execute("SELECT COUNT(*) FROM part").fetchone()[0] == 1
162
- live.close()
163
- ready.write_text("ready")
164
- time.sleep(60)
165
- `,
166
- ], { stdio: ['ignore', 'ignore', 'pipe'] });
167
- const stderr = [];
168
- child.stderr.on('data', (chunk) => stderr.push(chunk));
169
- const previousDb = process.env.AI_HIST_DB;
170
- const previousOpenCode = process.env.OPENCODE_DB;
171
- const previousTrajectory = process.env.TRAJECTORY_ROOT;
172
- process.env.AI_HIST_DB = join(root, 'missing-ai-hist.db');
173
- process.env.OPENCODE_DB = dbPath;
174
- process.env.TRAJECTORY_ROOT = join(root, 'missing-trajectories');
175
- try {
176
- await waitForFile(readyPath, () => Buffer.concat(stderr).toString('utf8'));
177
- const hist = await openAiHist({ dbPath: process.env.AI_HIST_DB });
178
- try {
179
- assert.deepEqual(hist.search('ts wal opencode', { source: 'opencode', limit: 5 }).map((entry) => entry.prompt), ['ts wal opencode prompt']);
180
- }
181
- finally {
182
- hist.close();
183
- }
184
- }
185
- finally {
186
- child.kill();
187
- if (previousDb === undefined)
188
- delete process.env.AI_HIST_DB;
189
- else
190
- process.env.AI_HIST_DB = previousDb;
191
- if (previousOpenCode === undefined)
192
- delete process.env.OPENCODE_DB;
193
- else
194
- process.env.OPENCODE_DB = previousOpenCode;
195
- if (previousTrajectory === undefined)
196
- delete process.env.TRAJECTORY_ROOT;
197
- else
198
- process.env.TRAJECTORY_ROOT = previousTrajectory;
199
- }
200
- });
201
- test('MCP server exposes history and trajectory tools over stdio', async () => {
202
- const root = await realpath(await mkdtemp(join(tmpdir(), 'ai-hist-mcp-')));
203
- const dbPath = join(root, 'history.db');
204
- await writeScopeFixtureDb(dbPath);
205
- const child = spawn(process.execPath, [new URL('./mcp-server.js', import.meta.url).pathname, '--project', '--project-path=.'], {
206
- cwd: root,
207
- env: {
208
- ...process.env,
209
- AI_HIST_DB: dbPath,
210
- TRAJECTORY_ROOT: root,
211
- },
212
- stdio: ['pipe', 'pipe', 'pipe'],
213
- });
214
- const stderr = [];
215
- child.stderr.on('data', (chunk) => stderr.push(chunk));
216
- try {
217
- const { tools, stats } = await new Promise((resolve, reject) => {
218
- const timer = setTimeout(() => reject(new Error('timed out waiting for MCP responses')), 5000);
219
- let buffer = '';
220
- let tools = null;
221
- let stats = null;
222
- child.stdout.on('data', (chunk) => {
223
- buffer += chunk.toString('utf8');
224
- while (true) {
225
- const marker = buffer.indexOf('\n');
226
- if (marker === -1)
227
- return;
228
- const body = buffer.slice(0, marker).trim();
229
- buffer = buffer.slice(marker + 1);
230
- if (!body)
231
- continue;
232
- const message = JSON.parse(body);
233
- if (message.error) {
234
- clearTimeout(timer);
235
- reject(new Error(`MCP error: ${JSON.stringify(message.error)}`));
236
- return;
237
- }
238
- if (message.id === 2) {
239
- tools = new Set((message.result?.tools ?? []).map((tool) => tool.name));
240
- }
241
- if (message.id === 3) {
242
- const text = message.result?.content?.find((item) => item.type === 'text')?.text ?? '{}';
243
- stats = JSON.parse(text);
244
- }
245
- if (tools && stats) {
246
- clearTimeout(timer);
247
- resolve({ tools, stats });
248
- }
249
- }
250
- });
251
- child.on('error', (err) => {
252
- clearTimeout(timer);
253
- reject(err);
254
- });
255
- child.on('exit', (code) => {
256
- if (code !== null && code !== 0) {
257
- clearTimeout(timer);
258
- reject(new Error(`MCP server exited ${code}: ${Buffer.concat(stderr).toString('utf8')}`));
259
- }
260
- });
261
- writeJsonRpc(child.stdin, {
262
- jsonrpc: '2.0',
263
- id: 1,
264
- method: 'initialize',
265
- params: {
266
- protocolVersion: '2025-06-18',
267
- capabilities: {},
268
- clientInfo: { name: 'ai-hist-smoke', version: '0.0.0' },
269
- },
270
- });
271
- writeJsonRpc(child.stdin, {
272
- jsonrpc: '2.0',
273
- method: 'notifications/initialized',
274
- params: {},
275
- });
276
- writeJsonRpc(child.stdin, {
277
- jsonrpc: '2.0',
278
- id: 2,
279
- method: 'tools/list',
280
- params: {},
281
- });
282
- writeJsonRpc(child.stdin, {
283
- jsonrpc: '2.0',
284
- id: 3,
285
- method: 'tools/call',
286
- params: { name: 'stats', arguments: {} },
287
- });
288
- });
289
- for (const name of [
290
- 'search_history',
291
- 'recent_entries',
292
- 'get_session',
293
- 'get_context',
294
- 'stats',
295
- 'tag_session',
296
- 'untag_session',
297
- 'list_tags',
298
- 'search_trajectories',
299
- 'why_for_task',
300
- 'get_handoff',
301
- 'pair_check',
302
- ]) {
303
- assert.ok(tools.has(name), `missing MCP tool ${name}`);
304
- }
305
- assert.equal(stats.projectScope, root);
306
- }
307
- finally {
308
- child.kill();
309
- }
310
- });
311
- function writeJsonRpc(stdin, payload) {
312
- stdin.write(`${JSON.stringify(payload)}\n`);
313
- }
314
- async function waitForFile(path, getError) {
315
- const deadline = Date.now() + 5_000;
316
- while (Date.now() < deadline) {
317
- try {
318
- await stat(path);
319
- return;
320
- }
321
- catch {
322
- await new Promise((resolve) => setTimeout(resolve, 50));
323
- }
324
- }
325
- throw new Error(`timed out waiting for ${path}: ${getError()}`);
326
- }
327
- async function writeScopeFixtureDb(dbPath) {
328
- const SQL = await initSqlJs();
329
- const db = new SQL.Database();
330
- try {
331
- db.run(`CREATE TABLE history (
332
- id INTEGER PRIMARY KEY AUTOINCREMENT,
333
- source TEXT NOT NULL,
334
- session_id TEXT,
335
- project TEXT,
336
- prompt TEXT NOT NULL,
337
- timestamp_ms INTEGER NOT NULL,
338
- git_branch TEXT
339
- )`);
340
- db.run(`CREATE TABLE sessions (
341
- session_id TEXT NOT NULL,
342
- source TEXT NOT NULL,
343
- cwd TEXT,
344
- git_branch TEXT,
345
- first_activity_ms INTEGER,
346
- last_activity_ms INTEGER,
347
- last_assistant_text TEXT,
348
- raw_path TEXT,
349
- parser_version INTEGER NOT NULL DEFAULT 1,
350
- PRIMARY KEY (session_id, source)
351
- )`);
352
- db.run(`CREATE TABLE trajectories (
353
- id TEXT PRIMARY KEY,
354
- version INTEGER,
355
- persona_id TEXT,
356
- project_id TEXT,
357
- task_title TEXT,
358
- task_description TEXT,
359
- status TEXT,
360
- started_at TEXT,
361
- completed_at TEXT,
362
- decisions_json TEXT NOT NULL,
363
- retrospective_json TEXT NOT NULL,
364
- search_text TEXT NOT NULL,
365
- path TEXT,
366
- updated_ms INTEGER NOT NULL,
367
- timestamp_ms INTEGER NOT NULL
368
- )`);
369
- const insertHistory = db.prepare('INSERT INTO history (source, session_id, project, prompt, timestamp_ms) VALUES (?, ?, ?, ?, ?)');
370
- const insertTrajectory = db.prepare(`INSERT INTO trajectories
371
- (id, version, persona_id, project_id, task_title, task_description, status,
372
- started_at, completed_at, decisions_json, retrospective_json, search_text,
373
- path, updated_ms, timestamp_ms)
374
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
375
- try {
376
- insertHistory.run(['claude', 'shared', '/work/app', 'scoped root prompt', 1_000]);
377
- insertHistory.run(['codex', 'shared', '/work/app/pkg', 'scoped child prompt', 2_000]);
378
- insertHistory.run(['cursor', 'shared', '/work/other', 'outside prompt', 3_000]);
379
- insertTrajectory.run([
380
- 'scoped-run',
381
- 1,
382
- 'planner',
383
- 'app',
384
- 'Scoped task',
385
- 'Scoped decision',
386
- 'completed',
387
- null,
388
- null,
389
- '[]',
390
- '{}',
391
- 'scoped decision',
392
- '/work/app/.trajectories/planner/compacted/scoped-run.json',
393
- 4_000,
394
- 4_000,
395
- ]);
396
- insertTrajectory.run([
397
- 'outside-run',
398
- 1,
399
- 'planner',
400
- 'other',
401
- 'Outside task',
402
- 'Outside decision',
403
- 'completed',
404
- null,
405
- null,
406
- '[]',
407
- '{}',
408
- 'outside decision',
409
- '/work/other/.trajectories/planner/compacted/outside-run.json',
410
- 5_000,
411
- 5_000,
412
- ]);
413
- }
414
- finally {
415
- insertHistory.free();
416
- insertTrajectory.free();
417
- }
418
- await writeFile(dbPath, Buffer.from(db.export()));
419
- }
420
- finally {
421
- db.close();
422
- }
423
- }
424
- //# 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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"}
@@ -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"}
@@ -1,60 +0,0 @@
1
- import { execFile } from "node:child_process";
2
- import { promisify } from "node:util";
3
- const execFileAsync = promisify(execFile);
4
- function pushArg(args, name, value) {
5
- const trimmed = value?.trim();
6
- if (trimmed)
7
- args.push(name, trimmed);
8
- }
9
- function cliArgs(req) {
10
- const c = req.context;
11
- const args = ["pair", "check", "--json"];
12
- pushArg(args, "--project-id", c.projectId);
13
- pushArg(args, "--repo-path", c.repoPath);
14
- pushArg(args, "--cwd", c.cwd);
15
- pushArg(args, "--git-remote", c.gitRemote);
16
- pushArg(args, "--task", c.task);
17
- pushArg(args, "--tool", c.tool);
18
- pushArg(args, "--target", c.target);
19
- pushArg(args, "--action", c.action);
20
- pushArg(args, "--recent-prompt", c.recentPrompt);
21
- for (const file of c.files ?? [])
22
- pushArg(args, "--file", file);
23
- if (req.limit != null)
24
- args.push("--limit", String(req.limit));
25
- return args;
26
- }
27
- export async function pairCheck(req, timeoutMs = 10_000) {
28
- const bin = process.env.AI_HIST_PAIR_CHECK_BIN || "ai-hist";
29
- const { stdout } = await execFileAsync(bin, cliArgs(req), {
30
- timeout: timeoutMs,
31
- maxBuffer: 1024 * 1024,
32
- env: process.env,
33
- });
34
- const parsed = (stdout.trim() ? JSON.parse(stdout) : {});
35
- return {
36
- decision: parsed.decision,
37
- warnings: Array.isArray(parsed.warnings) ? parsed.warnings : [],
38
- correlationId: parsed.correlationId,
39
- };
40
- }
41
- export function formatPairWarnings(result) {
42
- if (result.warnings.length === 0)
43
- return "";
44
- const lines = ["Pair advisory warnings from prior convergence events:"];
45
- for (const warning of result.warnings) {
46
- const label = [warning.kind, warning.lens].filter(Boolean).join("/");
47
- const score = typeof warning.score === "number" ? ` score=${warning.score.toFixed(2)}` : "";
48
- lines.push(`- ${label ? `[${label}${score}] ` : ""}${warning.text}`);
49
- for (const ev of warning.evidence ?? []) {
50
- const id = [ev.machineId, ev.source, ev.sessionId, ev.eventId].filter(Boolean).join(":");
51
- const when = ev.ts ? ` ${ev.ts}` : "";
52
- const snippet = ev.snippet ? ` - ${ev.snippet}` : "";
53
- lines.push(` evidence: ${id || ev.eventId || "(unknown)"}${when}${snippet}`);
54
- }
55
- }
56
- if (result.correlationId)
57
- lines.push(`correlationId: ${result.correlationId}`);
58
- return lines.join("\n");
59
- }
60
- //# sourceMappingURL=pair-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pair-client.js","sourceRoot":"","sources":["../src/pair-client.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=pair-client.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pair-client.test.d.ts","sourceRoot":"","sources":["../src/pair-client.test.ts"],"names":[],"mappings":""}