ai-hist 0.3.7 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +100 -2
  2. package/dist/cloud-client.d.ts +1 -0
  3. package/dist/cloud-client.d.ts.map +1 -1
  4. package/dist/cloud-client.js +2 -0
  5. package/dist/cloud-client.js.map +1 -1
  6. package/dist/cloud-push.d.ts +51 -0
  7. package/dist/cloud-push.d.ts.map +1 -0
  8. package/dist/cloud-push.js +113 -0
  9. package/dist/cloud-push.js.map +1 -0
  10. package/dist/cloud-push.test.d.ts +2 -0
  11. package/dist/cloud-push.test.d.ts.map +1 -0
  12. package/dist/cloud-push.test.js +82 -0
  13. package/dist/cloud-push.test.js.map +1 -0
  14. package/dist/index.d.ts +119 -6
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +304 -10
  17. package/dist/index.js.map +1 -1
  18. package/dist/jsonl-sources.d.ts +4 -6
  19. package/dist/jsonl-sources.d.ts.map +1 -1
  20. package/dist/jsonl-sources.js +9 -12
  21. package/dist/jsonl-sources.js.map +1 -1
  22. package/dist/mcp-server.js +116 -1
  23. package/dist/mcp-server.js.map +1 -1
  24. package/dist/mcp-smoke.test.js +194 -44
  25. package/dist/mcp-smoke.test.js.map +1 -1
  26. package/dist/session-catalog.d.ts +257 -0
  27. package/dist/session-catalog.d.ts.map +1 -0
  28. package/dist/session-catalog.js +340 -0
  29. package/dist/session-catalog.js.map +1 -0
  30. package/dist/session-catalog.test.d.ts +2 -0
  31. package/dist/session-catalog.test.d.ts.map +1 -0
  32. package/dist/session-catalog.test.js +710 -0
  33. package/dist/session-catalog.test.js.map +1 -0
  34. package/dist/session-events.test.d.ts +2 -0
  35. package/dist/session-events.test.d.ts.map +1 -0
  36. package/dist/session-events.test.js +177 -0
  37. package/dist/session-events.test.js.map +1 -0
  38. package/package.json +1 -1
@@ -0,0 +1,340 @@
1
+ /**
2
+ * Session catalog: the materialized shallow index of coding-agent sessions.
3
+ *
4
+ * Two halves, deliberately split by who owns the write:
5
+ *
6
+ * - **Cache-only listing** — `AiHist.listSessionCatalog()` in `index.ts`
7
+ * reads the `sessions` table and nothing else. No provider file is opened,
8
+ * no `history` / `session_events` scan happens. This module supplies the
9
+ * row type and the raw-row → `CatalogSession` mapping it uses.
10
+ * - **Shallow discovery** — `discoverSessions()` here drives
11
+ * `ai-hist sessions discover --json`, which scans the known provider
12
+ * locations with bounded reads and upserts the catalog. It is a top-level
13
+ * function rather than an `AiHist` method because discovery *writes* the
14
+ * on-disk database, and an `AiHist` instance is an in-memory snapshot taken
15
+ * at open time — a method would hand back a reader that cannot see the rows
16
+ * it just wrote. Re-open (or `openAiHist` again) afterwards to read them.
17
+ *
18
+ * The Rust CLI stays the single source of truth for discovery (provider
19
+ * locations, bounded reads, global recency ordering, stamp comparison), exactly
20
+ * as `cloud-push.ts` defers to `ai-hist push` for the push pipeline.
21
+ */
22
+ import { spawn } from 'node:child_process';
23
+ import { StringDecoder } from 'node:string_decoder';
24
+ import { resolveAiHistBinary } from './cloud-push.js';
25
+ /**
26
+ * Version of the session-catalog output contract this SDK understands.
27
+ * Mirrors the native `SESSION_CATALOG_CONTRACT_VERSION`; a `summary` whose
28
+ * `contractVersion` differs came from a binary that speaks a different dialect.
29
+ */
30
+ export const SESSION_CATALOG_CONTRACT_VERSION = 1;
31
+ /**
32
+ * A discovery run that could not be completed or trusted.
33
+ *
34
+ * The native command emits its diagnostics and the summary trailer even when
35
+ * every provider fails, so a failed run still carries everything it managed to
36
+ * learn: `diagnostics` says which sources broke and why, and `summary` (when
37
+ * the trailer arrived) says what the run actually did. `stderr` and `exitCode`
38
+ * carry the process-level detail.
39
+ */
40
+ export class DiscoveryError extends Error {
41
+ exitCode;
42
+ stderr;
43
+ diagnostics;
44
+ summary;
45
+ constructor(message, details = {}) {
46
+ super(message);
47
+ this.name = 'DiscoveryError';
48
+ this.exitCode = details.exitCode ?? null;
49
+ this.stderr = details.stderr ?? '';
50
+ this.diagnostics = details.diagnostics ?? [];
51
+ this.summary = details.summary ?? null;
52
+ }
53
+ }
54
+ const AI_HIST_RUST_BIN_ENV = 'AI_HIST_RUST_BIN';
55
+ /** Spawn failures that all mean the same thing: no usable binary. */
56
+ const MISSING_BINARY_CODES = new Set(['ENOENT', 'EACCES', 'EPERM', 'ENOTDIR', 'EISDIR']);
57
+ function str(value) {
58
+ return typeof value === 'string' ? value : null;
59
+ }
60
+ function num(value) {
61
+ return typeof value === 'number' && Number.isFinite(value) ? value : null;
62
+ }
63
+ function count(value) {
64
+ return num(value) ?? 0;
65
+ }
66
+ function stringList(value) {
67
+ return Array.isArray(value) ? value.filter((item) => typeof item === 'string') : [];
68
+ }
69
+ /**
70
+ * Parse a JSON string array column (`models_json`, `workspace_roots_json`).
71
+ * `NULL`, `''`, and malformed JSON all mean "nothing observed" → `[]`; the
72
+ * column never stores `[]` itself.
73
+ */
74
+ export function parseJsonStringList(raw) {
75
+ if (typeof raw !== 'string' || raw.length === 0)
76
+ return [];
77
+ try {
78
+ return stringList(JSON.parse(raw));
79
+ }
80
+ catch {
81
+ return [];
82
+ }
83
+ }
84
+ /** `NULL` `discovery_state` predates the catalog and means a fully ingested row. */
85
+ export function normalizeDiscoveryState(raw) {
86
+ return raw === 'shallow' ? 'shallow' : 'full';
87
+ }
88
+ /** Map one snake_case CLI/`sessions`-row object onto a {@link CatalogSession}. */
89
+ export function catalogSessionFromJson(raw) {
90
+ return {
91
+ source: (str(raw.source) ?? ''),
92
+ sessionId: str(raw.session_id) ?? '',
93
+ cwd: str(raw.cwd),
94
+ gitBranch: str(raw.git_branch),
95
+ firstActivityMs: num(raw.first_activity_ms),
96
+ lastActivityMs: num(raw.last_activity_ms),
97
+ firstPrompt: str(raw.first_prompt),
98
+ lastAssistantText: str(raw.last_assistant_text),
99
+ // Discovery emits parsed arrays; a raw table row carries the JSON text.
100
+ models: Array.isArray(raw.models) ? stringList(raw.models) : parseJsonStringList(str(raw.models_json)),
101
+ originator: str(raw.originator),
102
+ agentVersion: str(raw.agent_version),
103
+ repoUrl: str(raw.repo_url),
104
+ initialCommit: str(raw.initial_commit),
105
+ workspaceRoots: Array.isArray(raw.workspace_roots)
106
+ ? stringList(raw.workspace_roots)
107
+ : parseJsonStringList(str(raw.workspace_roots_json)),
108
+ rawPath: str(raw.raw_path),
109
+ sourceStamp: str(raw.source_stamp),
110
+ discoveryState: normalizeDiscoveryState(raw.discovery_state),
111
+ fromCache: raw.from_cache === true,
112
+ ...(num(raw.parser_version) != null ? { parserVersion: num(raw.parser_version) } : {}),
113
+ };
114
+ }
115
+ function diagnosticFromJson(raw) {
116
+ return {
117
+ source: str(raw.source) ?? '',
118
+ locator: str(raw.locator),
119
+ error: str(raw.error) ?? '',
120
+ };
121
+ }
122
+ function providerSummaryFromJson(raw) {
123
+ const obj = (typeof raw === 'object' && raw !== null ? raw : {});
124
+ return {
125
+ candidates: count(obj.candidates),
126
+ discovered: count(obj.discovered),
127
+ skippedUnchanged: count(obj.skipped_unchanged),
128
+ failed: obj.failed === true,
129
+ };
130
+ }
131
+ function summaryFromJson(raw) {
132
+ const providersRaw = (typeof raw.providers === 'object' && raw.providers !== null
133
+ ? raw.providers
134
+ : {});
135
+ const providers = {};
136
+ for (const [source, value] of Object.entries(providersRaw)) {
137
+ providers[source] = providerSummaryFromJson(value);
138
+ }
139
+ const countersRaw = (typeof raw.counters === 'object' && raw.counters !== null
140
+ ? raw.counters
141
+ : {});
142
+ return {
143
+ contractVersion: count(raw.contract_version),
144
+ discovered: count(raw.discovered),
145
+ skippedUnchanged: count(raw.skipped_unchanged),
146
+ providers,
147
+ exemptSources: Array.isArray(raw.exempt_sources)
148
+ ? raw.exempt_sources
149
+ .filter((item) => typeof item === 'object' && item !== null)
150
+ .map((item) => ({ source: str(item.source) ?? '', reason: str(item.reason) ?? '' }))
151
+ : [],
152
+ counters: {
153
+ candidatesEnumerated: count(countersRaw.candidates_enumerated),
154
+ shallowReads: count(countersRaw.shallow_reads),
155
+ skippedUnchanged: count(countersRaw.skipped_unchanged),
156
+ filesOpened: count(countersRaw.files_opened),
157
+ bytesRead: count(countersRaw.bytes_read),
158
+ },
159
+ };
160
+ }
161
+ /**
162
+ * Run shallow session discovery by driving `ai-hist sessions discover --json`.
163
+ *
164
+ * The CLI streams JSONL — one `session` object per discovered row, a
165
+ * `diagnostic` per non-fatal failure, then a closing `summary` — and this
166
+ * parses it as it arrives, so `onSession` fires progressively rather than only
167
+ * once the whole run finishes.
168
+ *
169
+ * Discovery **writes the on-disk database**. An `AiHist` opened before the run
170
+ * is a snapshot and will not contain the new rows; re-open (or call
171
+ * `openAiHist` again) before `listSessionCatalog()` to see them.
172
+ *
173
+ * Failure behavior mirrors the CLI's: a provider that blows up contributes a
174
+ * diagnostic and the run still resolves (exit 0). Individual unparseable or
175
+ * unrecognized lines are skipped rather than failing the run, so a newer
176
+ * binary's extra line types stay forward-compatible. The promise rejects with
177
+ * a {@link DiscoveryError} when:
178
+ *
179
+ * - the binary cannot be run at all (the message names `AI_HIST_RUST_BIN`);
180
+ * - the run exits non-zero — every selected provider failed. The native
181
+ * command still writes its diagnostics and the summary trailer before
182
+ * exiting, so the error carries both alongside `stderr` and `exitCode`;
183
+ * - no summary line arrived, or its `contractVersion` is not the one this
184
+ * SDK understands. The trailer is mandatory in the native contract, so a
185
+ * run without one (or with a version this SDK cannot read) means the rows
186
+ * are not safe to interpret — better to say so than to hand back a
187
+ * half-understood catalog.
188
+ *
189
+ * An exception thrown by `onSession` or `onDiagnostic` aborts the run: the
190
+ * child is killed and the promise rejects with that exception, rather than
191
+ * escaping the stream handler as an uncaught error in the host process.
192
+ */
193
+ export function discoverSessions(opts = {}) {
194
+ const spawnFn = opts.spawnFn ?? spawn;
195
+ const bin = resolveAiHistBinary(opts.binPath);
196
+ const args = ['sessions', 'discover', '--json'];
197
+ for (const source of opts.sources ?? [])
198
+ args.push('--source', String(source));
199
+ if (opts.limit != null)
200
+ args.push('--limit', String(opts.limit));
201
+ const spawnOpts = {
202
+ env: { ...process.env, ...opts.env },
203
+ stdio: ['ignore', 'pipe', 'pipe'],
204
+ };
205
+ return new Promise((resolve, reject) => {
206
+ const sessions = [];
207
+ const diagnostics = [];
208
+ let summary = null;
209
+ let stderr = '';
210
+ let pending = '';
211
+ let settled = false;
212
+ const decoder = new StringDecoder('utf8');
213
+ const child = spawnFn(bin, args, spawnOpts);
214
+ const succeed = (result) => {
215
+ if (settled)
216
+ return;
217
+ settled = true;
218
+ resolve(result);
219
+ };
220
+ const fail = (err) => {
221
+ if (settled)
222
+ return;
223
+ settled = true;
224
+ reject(err);
225
+ };
226
+ /**
227
+ * A host callback that throws must not take the process down with it, and
228
+ * must not leave the child running: stop consuming, end the run, surface
229
+ * the caller's own error.
230
+ */
231
+ const abort = (err) => {
232
+ try {
233
+ child.kill?.();
234
+ }
235
+ catch {
236
+ /* already gone */
237
+ }
238
+ fail(err);
239
+ };
240
+ const handleLine = (line) => {
241
+ const trimmed = line.trim();
242
+ if (!trimmed)
243
+ return;
244
+ let parsed;
245
+ try {
246
+ parsed = JSON.parse(trimmed);
247
+ }
248
+ catch {
249
+ return; // Tolerant: skip a line we cannot read rather than failing the run.
250
+ }
251
+ if (typeof parsed !== 'object' || parsed === null)
252
+ return;
253
+ const obj = parsed;
254
+ switch (obj.type) {
255
+ case 'session': {
256
+ const session = catalogSessionFromJson(obj);
257
+ sessions.push(session);
258
+ if (opts.onSession) {
259
+ try {
260
+ opts.onSession(session);
261
+ }
262
+ catch (err) {
263
+ abort(err);
264
+ }
265
+ }
266
+ break;
267
+ }
268
+ case 'diagnostic': {
269
+ const diagnostic = diagnosticFromJson(obj);
270
+ diagnostics.push(diagnostic);
271
+ if (opts.onDiagnostic) {
272
+ try {
273
+ opts.onDiagnostic(diagnostic);
274
+ }
275
+ catch (err) {
276
+ abort(err);
277
+ }
278
+ }
279
+ break;
280
+ }
281
+ case 'summary':
282
+ summary = summaryFromJson(obj);
283
+ break;
284
+ default:
285
+ break; // Unknown line type from a newer binary.
286
+ }
287
+ };
288
+ child.stdout?.on('data', (chunk) => {
289
+ if (settled)
290
+ return;
291
+ pending += typeof chunk === 'string' ? chunk : decoder.write(chunk);
292
+ let newline = pending.indexOf('\n');
293
+ while (newline !== -1 && !settled) {
294
+ handleLine(pending.slice(0, newline));
295
+ pending = pending.slice(newline + 1);
296
+ newline = pending.indexOf('\n');
297
+ }
298
+ });
299
+ child.stderr?.on('data', (chunk) => {
300
+ stderr += String(chunk);
301
+ });
302
+ child.on('error', (err) => {
303
+ if (MISSING_BINARY_CODES.has(err.code ?? '')) {
304
+ fail(new DiscoveryError(`could not run the ai-hist binary (${bin}): ${err.code}. Install ai-hist, ` +
305
+ `or set ${AI_HIST_RUST_BIN_ENV} to its path.`));
306
+ return;
307
+ }
308
+ fail(err);
309
+ });
310
+ child.on('close', (code) => {
311
+ if (settled)
312
+ return;
313
+ handleLine(pending + decoder.end());
314
+ pending = '';
315
+ if (settled)
316
+ return; // A callback threw on the final line.
317
+ const trailer = summary;
318
+ if (code !== 0) {
319
+ // The native command emits its diagnostics and the summary trailer
320
+ // before exiting non-zero, so the failure carries what the run learned.
321
+ fail(new DiscoveryError(`ai-hist sessions discover failed (exit ${code}): ${stderr.trim().slice(0, 300)}`, { exitCode: code, stderr, diagnostics, summary: trailer }));
322
+ return;
323
+ }
324
+ if (!trailer) {
325
+ fail(new DiscoveryError('ai-hist sessions discover produced no summary line — the closing summary is ' +
326
+ 'part of the output contract, so the stream was truncated or the binary is too old.', { exitCode: code, stderr, diagnostics, summary: null }));
327
+ return;
328
+ }
329
+ if (trailer.contractVersion !== SESSION_CATALOG_CONTRACT_VERSION) {
330
+ fail(new DiscoveryError(`unsupported session-catalog contract version ${trailer.contractVersion} ` +
331
+ `(this SDK understands ${SESSION_CATALOG_CONTRACT_VERSION}) — upgrade the ai-hist ` +
332
+ 'package or the ai-hist binary so the two agree. A version of 0 means the summary ' +
333
+ 'carried no contract_version at all.', { exitCode: code, stderr, diagnostics, summary: trailer }));
334
+ return;
335
+ }
336
+ succeed({ sessions, diagnostics, summary: trailer });
337
+ });
338
+ });
339
+ }
340
+ //# sourceMappingURL=session-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-catalog.js","sourceRoot":"","sources":["../src/session-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-catalog.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-catalog.test.d.ts","sourceRoot":"","sources":["../src/session-catalog.test.ts"],"names":[],"mappings":""}