memonaut 0.0.0 → 0.1.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 (71) hide show
  1. package/LICENSE +661 -0
  2. package/dist/cli-main.d.ts +3 -0
  3. package/dist/cli-main.d.ts.map +1 -0
  4. package/dist/cli-main.js +428 -0
  5. package/dist/cli-main.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +16 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +38 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +86 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/db.d.ts +37 -0
  15. package/dist/db.d.ts.map +1 -0
  16. package/dist/db.js +184 -0
  17. package/dist/db.js.map +1 -0
  18. package/dist/format.d.ts +22 -0
  19. package/dist/format.d.ts.map +1 -0
  20. package/dist/format.js +130 -0
  21. package/dist/format.js.map +1 -0
  22. package/dist/glob.d.ts +17 -0
  23. package/dist/glob.d.ts.map +1 -0
  24. package/dist/glob.js +77 -0
  25. package/dist/glob.js.map +1 -0
  26. package/dist/index.d.ts +11 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +11 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/indexer.d.ts +50 -0
  31. package/dist/indexer.d.ts.map +1 -0
  32. package/dist/indexer.js +404 -0
  33. package/dist/indexer.js.map +1 -0
  34. package/dist/lineage.d.ts +31 -0
  35. package/dist/lineage.d.ts.map +1 -0
  36. package/dist/lineage.js +94 -0
  37. package/dist/lineage.js.map +1 -0
  38. package/dist/model.d.ts +99 -0
  39. package/dist/model.d.ts.map +1 -0
  40. package/dist/model.js +41 -0
  41. package/dist/model.js.map +1 -0
  42. package/dist/pi-source.d.ts +47 -0
  43. package/dist/pi-source.d.ts.map +1 -0
  44. package/dist/pi-source.js +309 -0
  45. package/dist/pi-source.js.map +1 -0
  46. package/dist/quiet.d.ts +7 -0
  47. package/dist/quiet.d.ts.map +1 -0
  48. package/dist/quiet.js +19 -0
  49. package/dist/quiet.js.map +1 -0
  50. package/dist/search.d.ts +93 -0
  51. package/dist/search.d.ts.map +1 -0
  52. package/dist/search.js +285 -0
  53. package/dist/search.js.map +1 -0
  54. package/dist/silence-sqlite-warning.d.ts +2 -0
  55. package/dist/silence-sqlite-warning.d.ts.map +1 -0
  56. package/dist/silence-sqlite-warning.js +9 -0
  57. package/dist/silence-sqlite-warning.js.map +1 -0
  58. package/package.json +57 -2
  59. package/src/cli-main.ts +475 -0
  60. package/src/cli.ts +17 -0
  61. package/src/config.ts +130 -0
  62. package/src/db.ts +213 -0
  63. package/src/format.ts +173 -0
  64. package/src/glob.ts +79 -0
  65. package/src/index.ts +10 -0
  66. package/src/indexer.ts +534 -0
  67. package/src/lineage.ts +111 -0
  68. package/src/model.ts +135 -0
  69. package/src/pi-source.ts +328 -0
  70. package/src/quiet.ts +22 -0
  71. package/src/search.ts +462 -0
@@ -0,0 +1,428 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { parseArgs } from 'node:util';
5
+ import { loadConfig, writeStarterConfig } from './config.js';
6
+ import { getMeta, openDb } from './db.js';
7
+ import { colorsEnabled, makeStyle, renderHit, renderTable, relativeTime, tildify, } from './format.js';
8
+ import { index } from './indexer.js';
9
+ import { TIERS } from './model.js';
10
+ import { readRawEntry } from './pi-source.js';
11
+ import { indexStats, readThread, resolveThread, search } from './search.js';
12
+ const USAGE = `memonaut — search your agent conversation transcripts
13
+
14
+ USAGE
15
+ recall <command> [options]
16
+
17
+ COMMANDS
18
+ index Bring the index up to date (incremental by default)
19
+ search <query...> Search transcripts, grouped by fork lineage
20
+ show <ref> Print a thread (file id, session uuid prefix, name or path)
21
+ sql <query> Run a read-only SQL query against the index
22
+ stats Summarise what is indexed
23
+ config Show config paths, or write a starter config
24
+
25
+ SEARCH OPTIONS
26
+ --cwd <glob> Filter by working directory (repeatable, globs, ~ ok)
27
+ --project <name> Filter by project (last segment of the cwd, repeatable)
28
+ --role <role> user | assistant | toolResult | bashExecution | ... (repeatable)
29
+ --tool <name> Filter by tool name (repeatable)
30
+ --kind <kind> user | assistant | thinking | toolCall | toolResult | bash | summary | name
31
+ --since <when> 30d, 6h, 2w, or an ISO date
32
+ --until <when> Same forms as --since
33
+ --limit <n> Result groups (default 20)
34
+ --threads <n|all> Threads shown per group (default 3)
35
+ --private Include transcripts matched by the config's private globs
36
+ --raw Pass the query to FTS5 verbatim (no quoting fallback)
37
+ --no-recency Rank on bm25 x kind weight only
38
+ --path Show full transcript paths
39
+ --json Machine-readable output
40
+ --no-sync Skip the incremental catch-up before querying
41
+
42
+ INDEX OPTIONS
43
+ --full Rebuild from scratch
44
+ --tier <t> slim | default | full (overrides config for this run)
45
+ --quiet No progress output
46
+
47
+ QUERY SYNTAX
48
+ The query is an FTS5 MATCH expression: bare words are ANDed, "quoted phrases"
49
+ match in order, OR / NOT / NEAR(a b, 5) work, and trailing * is a prefix.
50
+ If that fails to parse, the query is retried as quoted literal tokens.
51
+
52
+ EXAMPLES
53
+ recall search steering queue --project wherever --since 30d
54
+ recall search '"fork point" OR parentSession' --threads all
55
+ recall search --tool bash --kind bash 'fuser -k'
56
+ recall sql "select project, count(*) n from file group by 1 order by n desc limit 10"
57
+ `;
58
+ function fail(message) {
59
+ process.stderr.write(`recall: ${message}\n`);
60
+ process.exit(1);
61
+ }
62
+ function version() {
63
+ try {
64
+ const here = path.dirname(fileURLToPath(import.meta.url));
65
+ for (const candidate of [
66
+ path.join(here, '../package.json'),
67
+ path.join(here, '../../package.json'),
68
+ ]) {
69
+ if (fs.existsSync(candidate)) {
70
+ return (JSON.parse(fs.readFileSync(candidate, 'utf8'))
71
+ .version ?? '0.0.0');
72
+ }
73
+ }
74
+ }
75
+ catch {
76
+ /* ignore */
77
+ }
78
+ return '0.0.0';
79
+ }
80
+ /** Accept `30d`, `6h`, `2w`, `3mo`, or anything Date can parse. */
81
+ function parseWhen(value) {
82
+ if (!value)
83
+ return undefined;
84
+ const m = /^(\d+)(mo|[smhdwy])$/.exec(value.trim());
85
+ if (m) {
86
+ const n = Number(m[1]);
87
+ const unit = m[2];
88
+ const ms = unit === 's'
89
+ ? 1000
90
+ : unit === 'm'
91
+ ? 60_000
92
+ : unit === 'h'
93
+ ? 3_600_000
94
+ : unit === 'd'
95
+ ? 86_400_000
96
+ : unit === 'w'
97
+ ? 604_800_000
98
+ : unit === 'mo'
99
+ ? 2_592_000_000
100
+ : 31_536_000_000;
101
+ return new Date(Date.now() - n * ms).toISOString();
102
+ }
103
+ const parsed = Date.parse(value);
104
+ if (Number.isNaN(parsed))
105
+ fail(`cannot understand time "${value}"`);
106
+ return new Date(parsed).toISOString();
107
+ }
108
+ function withTier(config, tier) {
109
+ if (!tier)
110
+ return config;
111
+ if (!TIERS.includes(tier))
112
+ fail(`unknown tier "${tier}" (expected ${TIERS.join(', ')})`);
113
+ return { ...config, tier: tier };
114
+ }
115
+ /** Cheap incremental catch-up so a query is never answered from a stale index. */
116
+ function sync(config, quiet) {
117
+ if (!fs.existsSync(config.dbPath)) {
118
+ fail(`no index at ${tildify(config.dbPath)}. Run \`recall index\` first.`);
119
+ }
120
+ const stats = index({ config, onProgress: () => { } });
121
+ if (!quiet && stats.filesIndexed > 0) {
122
+ process.stderr.write(`recall: synced ${stats.filesIndexed} transcript(s) in ${stats.durationMs}ms\n`);
123
+ }
124
+ }
125
+ function cmdIndex(argv) {
126
+ const { values } = parseArgs({
127
+ args: argv,
128
+ options: {
129
+ full: { type: 'boolean', default: false },
130
+ tier: { type: 'string' },
131
+ quiet: { type: 'boolean', default: false },
132
+ json: { type: 'boolean', default: false },
133
+ },
134
+ allowPositionals: false,
135
+ });
136
+ const config = withTier(loadConfig(), values.tier);
137
+ const quiet = Boolean(values.quiet) || Boolean(values.json);
138
+ let lastLine = 0;
139
+ const stats = index({
140
+ config,
141
+ full: Boolean(values.full),
142
+ onProgress: (p) => {
143
+ if (quiet || !process.stderr.isTTY)
144
+ return;
145
+ const now = Date.now();
146
+ if (now - lastLine < 100)
147
+ return;
148
+ lastLine = now;
149
+ process.stderr.write(`\r${p.phase} ${p.done}/${p.total}\u001b[K`);
150
+ },
151
+ });
152
+ if (!quiet && process.stderr.isTTY)
153
+ process.stderr.write('\r\u001b[K');
154
+ if (values.json) {
155
+ process.stdout.write(JSON.stringify(stats, null, 2) + '\n');
156
+ return;
157
+ }
158
+ const seconds = (stats.durationMs / 1000).toFixed(1);
159
+ process.stdout.write([
160
+ `indexed ${stats.filesIndexed} transcript(s) in ${seconds}s${stats.fullRebuild ? ' (full rebuild)' : ''}`,
161
+ ` seen ${stats.filesSeen} · skipped ${stats.filesSkipped} · appended ${stats.filesAppended} · removed ${stats.filesRemoved}`,
162
+ ` ignored ${stats.filesIgnored} · private ${stats.filesPrivate} · lineages rebuilt ${stats.lineagesRebuilt}`,
163
+ ` entries ${stats.entriesInserted} new, ${stats.entriesShared} inherited by forks · chunks ${stats.chunksInserted}`,
164
+ ` index: ${tildify(config.dbPath)}`,
165
+ ].join('\n') + '\n');
166
+ }
167
+ function cmdSearch(argv) {
168
+ const { values, positionals } = parseArgs({
169
+ args: argv,
170
+ options: {
171
+ cwd: { type: 'string', multiple: true },
172
+ project: { type: 'string', multiple: true },
173
+ role: { type: 'string', multiple: true },
174
+ tool: { type: 'string', multiple: true },
175
+ kind: { type: 'string', multiple: true },
176
+ since: { type: 'string' },
177
+ until: { type: 'string' },
178
+ limit: { type: 'string', default: '20' },
179
+ threads: { type: 'string', default: '3' },
180
+ private: { type: 'boolean', default: false },
181
+ raw: { type: 'boolean', default: false },
182
+ 'no-recency': { type: 'boolean', default: false },
183
+ path: { type: 'boolean', default: false },
184
+ json: { type: 'boolean', default: false },
185
+ 'no-sync': { type: 'boolean', default: false },
186
+ },
187
+ allowPositionals: true,
188
+ });
189
+ const text = positionals.join(' ').trim();
190
+ if (!text)
191
+ fail('nothing to search for. Try `recall search <words>`');
192
+ const config = loadConfig();
193
+ if (!values['no-sync'])
194
+ sync(config, Boolean(values.json));
195
+ const db = openDb(config.dbPath, { readOnly: true });
196
+ const threadsRaw = String(values.threads);
197
+ const outcome = search(db, {
198
+ text,
199
+ cwd: values.cwd,
200
+ project: values.project,
201
+ role: values.role,
202
+ tool: values.tool,
203
+ kind: values.kind,
204
+ since: parseWhen(values.since),
205
+ until: parseWhen(values.until),
206
+ includePrivate: Boolean(values.private),
207
+ limit: Number(values.limit),
208
+ threadLimit: threadsRaw === 'all' ? -1 : Number(threadsRaw),
209
+ noRecency: Boolean(values['no-recency']),
210
+ raw: Boolean(values.raw),
211
+ });
212
+ if (values.json) {
213
+ process.stdout.write(JSON.stringify(outcome, null, 2) + '\n');
214
+ db.close();
215
+ return;
216
+ }
217
+ const style = makeStyle(colorsEnabled());
218
+ if (outcome.hits.length === 0) {
219
+ process.stdout.write('no matches\n');
220
+ db.close();
221
+ return;
222
+ }
223
+ if (outcome.quotedFallback) {
224
+ process.stderr.write(style.dim(`(query retried as literal tokens: ${outcome.usedQuery})\n`));
225
+ }
226
+ const rendered = outcome.hits.map((hit) => renderHit(hit, { style, showPath: Boolean(values.path) }));
227
+ process.stdout.write(rendered.join('\n\n') + '\n');
228
+ db.close();
229
+ }
230
+ function cmdShow(argv) {
231
+ const { values, positionals } = parseArgs({
232
+ args: argv,
233
+ options: {
234
+ from: { type: 'string', default: '0' },
235
+ limit: { type: 'string', default: '40' },
236
+ full: { type: 'boolean', default: false },
237
+ json: { type: 'boolean', default: false },
238
+ },
239
+ allowPositionals: true,
240
+ });
241
+ const ref = positionals[0];
242
+ if (!ref)
243
+ fail('which thread? Pass a file id, a session uuid prefix, a name, or a path');
244
+ const config = loadConfig();
245
+ const db = openDb(config.dbPath, { readOnly: true });
246
+ const thread = resolveThread(db, ref);
247
+ if (!thread)
248
+ fail(`no thread matching "${ref}"`);
249
+ const entries = readThread(db, Number(thread.id), Number(values.from), Number(values.limit));
250
+ if (values.json) {
251
+ process.stdout.write(JSON.stringify({ thread, entries }, null, 2) + '\n');
252
+ db.close();
253
+ return;
254
+ }
255
+ const style = makeStyle(colorsEnabled());
256
+ const header = [
257
+ style.bold(thread.name ?? thread.project ?? String(thread.id)),
258
+ style.dim(tildify(thread.cwd ?? '')),
259
+ style.dim(`${thread.entry_count} entries`),
260
+ style.dim(`last ${relativeTime(thread.last_activity)}`),
261
+ ].join(' · ');
262
+ process.stdout.write(header + '\n' + style.dim(tildify(thread.path)) + '\n\n');
263
+ const indent = (text) => text
264
+ .split('\n')
265
+ .map((l) => ' ' + l)
266
+ .join('\n');
267
+ for (const entry of entries) {
268
+ const marks = [
269
+ style.label(entry.role + (entry.tool ? `:${entry.tool}` : '')),
270
+ ];
271
+ if (entry.shared)
272
+ marks.push(style.dim('(inherited)'));
273
+ process.stdout.write(`${style.dim(String(entry.seq).padStart(4))} ${marks.join(' ')}\n`);
274
+ if (values.full && entry.ownerPath) {
275
+ // Full fidelity means going back to the transcript: the index keeps tool
276
+ // output truncated (or absent), by design, and the byte range is the pointer.
277
+ const raw = readRawEntry(entry.ownerPath, entry.byteOffset, entry.byteLength);
278
+ if (raw !== null) {
279
+ process.stdout.write(indent(JSON.stringify(raw, null, 2)) + '\n');
280
+ continue;
281
+ }
282
+ }
283
+ for (const t of entry.texts) {
284
+ const body = t.text.length > 2000 ? t.text.slice(0, 2000) + ' …' : t.text;
285
+ process.stdout.write(indent(body) + '\n');
286
+ }
287
+ }
288
+ db.close();
289
+ }
290
+ function cmdSql(argv) {
291
+ const { values, positionals } = parseArgs({
292
+ args: argv,
293
+ options: {
294
+ json: { type: 'boolean', default: false },
295
+ limit: { type: 'string', default: '200' },
296
+ },
297
+ allowPositionals: true,
298
+ });
299
+ const sql = positionals.join(' ').trim();
300
+ if (!sql)
301
+ fail('no SQL given');
302
+ const config = loadConfig();
303
+ const db = openDb(config.dbPath, { readOnly: true });
304
+ let rows;
305
+ try {
306
+ rows = db.prepare(sql).all();
307
+ }
308
+ catch (err) {
309
+ db.close();
310
+ fail(err.message);
311
+ }
312
+ const capped = rows.slice(0, Number(values.limit));
313
+ if (values.json)
314
+ process.stdout.write(JSON.stringify(capped, null, 2) + '\n');
315
+ else {
316
+ process.stdout.write(renderTable(capped) + '\n');
317
+ if (rows.length > capped.length) {
318
+ process.stdout.write(`(${rows.length - capped.length} more rows, raise --limit)\n`);
319
+ }
320
+ }
321
+ db.close();
322
+ }
323
+ function cmdStats(argv) {
324
+ const { values } = parseArgs({
325
+ args: argv,
326
+ options: { json: { type: 'boolean', default: false } },
327
+ allowPositionals: false,
328
+ });
329
+ const config = loadConfig();
330
+ const db = openDb(config.dbPath, { readOnly: true });
331
+ const stats = indexStats(db);
332
+ const indexedAt = getMeta(db, 'indexed_at');
333
+ const tier = getMeta(db, 'tier');
334
+ const size = fs.existsSync(config.dbPath)
335
+ ? fs.statSync(config.dbPath).size
336
+ : 0;
337
+ const payload = {
338
+ ...stats,
339
+ tier,
340
+ indexedAt: indexedAt ? new Date(Number(indexedAt)).toISOString() : null,
341
+ dbBytes: size,
342
+ };
343
+ if (values.json) {
344
+ process.stdout.write(JSON.stringify(payload, null, 2) + '\n');
345
+ db.close();
346
+ return;
347
+ }
348
+ const style = makeStyle(colorsEnabled());
349
+ process.stdout.write([
350
+ `${style.bold(String(stats.files))} transcripts · ${stats.lineages} lineages · ${stats.forks} forks`,
351
+ `${stats.entries} entries · ${stats.memberships} memberships · ${stats.chunks} chunks`,
352
+ `${stats.projects} projects · ${stats.privateFiles} private · ${stats.orphans} orphaned`,
353
+ `span ${String(stats.oldest).slice(0, 10)} → ${String(stats.newest).slice(0, 10)}`,
354
+ `tier ${tier} · db ${(size / 1e6).toFixed(1)} MB · updated ${relativeTime(payload.indexedAt)}`,
355
+ style.dim(tildify(config.dbPath)),
356
+ ].join('\n') + '\n');
357
+ db.close();
358
+ }
359
+ function cmdConfig(argv) {
360
+ const { values } = parseArgs({
361
+ args: argv,
362
+ options: {
363
+ init: { type: 'boolean', default: false },
364
+ json: { type: 'boolean', default: false },
365
+ },
366
+ allowPositionals: false,
367
+ });
368
+ const config = loadConfig();
369
+ if (values.init) {
370
+ const written = writeStarterConfig(config);
371
+ process.stdout.write(`config: ${tildify(written)}\n`);
372
+ return;
373
+ }
374
+ if (values.json) {
375
+ process.stdout.write(JSON.stringify(config, null, 2) + '\n');
376
+ return;
377
+ }
378
+ process.stdout.write([
379
+ `config ${tildify(config.configPath)}${config.loaded ? '' : ' (not created yet, using defaults)'}`,
380
+ `index ${tildify(config.dbPath)}`,
381
+ `tier ${config.tier}`,
382
+ `sources ${config.sources.map((s) => `${s.id}:${tildify(s.root)}`).join(', ')}`,
383
+ `ignore ${config.ignore.join(', ') || '(none)'}`,
384
+ `private ${config.private.join(', ') || '(none)'}`,
385
+ ].join('\n') + '\n');
386
+ }
387
+ function main() {
388
+ const argv = process.argv.slice(2);
389
+ const command = argv[0];
390
+ const rest = argv.slice(1);
391
+ switch (command) {
392
+ case 'index':
393
+ return cmdIndex(rest);
394
+ case 'search':
395
+ case 's':
396
+ return cmdSearch(rest);
397
+ case 'show':
398
+ return cmdShow(rest);
399
+ case 'sql':
400
+ return cmdSql(rest);
401
+ case 'stats':
402
+ return cmdStats(rest);
403
+ case 'config':
404
+ return cmdConfig(rest);
405
+ case '--version':
406
+ case '-v':
407
+ process.stdout.write(version() + '\n');
408
+ return;
409
+ case undefined:
410
+ case 'help':
411
+ case '--help':
412
+ case '-h':
413
+ process.stdout.write(USAGE);
414
+ return;
415
+ default:
416
+ fail(`unknown command "${command}". Try \`recall help\``);
417
+ }
418
+ }
419
+ /** Entry point. Loaded dynamically by `cli.ts`, see the note there. */
420
+ export function run() {
421
+ try {
422
+ main();
423
+ }
424
+ catch (err) {
425
+ fail(err.message);
426
+ }
427
+ }
428
+ //# sourceMappingURL=cli-main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-main.js","sourceRoot":"","sources":["../src/cli-main.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ import { silenceSqliteWarning } from './quiet.js';
3
+ /**
4
+ * Launcher, deliberately thin.
5
+ *
6
+ * `node:sqlite` prints an ExperimentalWarning the moment it is LOADED, and ES
7
+ * modules load the whole graph before any module body runs. So a static import
8
+ * of anything that touches sqlite would emit the warning before the filter
9
+ * could be installed, no matter where the call sits. Installing the filter here
10
+ * and pulling the real CLI in dynamically is what keeps two lines of noise off
11
+ * every single invocation.
12
+ */
13
+ silenceSqliteWarning();
14
+ const { run } = await import('./cli-main.js');
15
+ run();
16
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAC,oBAAoB,EAAC,MAAM,YAAY,CAAC;AAEhD;;;;;;;;;GASG;AACH,oBAAoB,EAAE,CAAC;AAEvB,MAAM,EAAC,GAAG,EAAC,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;AAC5C,GAAG,EAAE,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { Tier } from './model.js';
2
+ export interface SourceConfig {
3
+ /** Short label stored on every file row, so multi-source indexes stay legible. */
4
+ id: string;
5
+ /** Only `pi` for now. The adapter seam is here so other agents can be added. */
6
+ kind: 'pi';
7
+ root: string;
8
+ }
9
+ export interface Config {
10
+ sources: SourceConfig[];
11
+ /** cwd globs that are never read, never stored. */
12
+ ignore: string[];
13
+ /** cwd globs that are indexed but hidden from agents unless asked for. */
14
+ private: string[];
15
+ tier: Tier;
16
+ /** Bytes kept per tool result (tier `full` only). */
17
+ toolResultHeadBytes: number;
18
+ /** Bytes kept per tool call argument blob. */
19
+ toolArgsHeadBytes: number;
20
+ configDir: string;
21
+ dataDir: string;
22
+ dbPath: string;
23
+ configPath: string;
24
+ /** True when a config file was actually found on disk. */
25
+ loaded: boolean;
26
+ }
27
+ export declare const DEFAULT_TIER: Tier;
28
+ export declare function defaultConfigDir(env?: NodeJS.ProcessEnv): string;
29
+ export declare function defaultDataDir(env?: NodeJS.ProcessEnv): string;
30
+ export declare function defaultSources(): SourceConfig[];
31
+ /**
32
+ * Load config, filling in defaults. Every path is resolved here so nothing
33
+ * downstream ever has to think about `~` or XDG again.
34
+ */
35
+ export declare function loadConfig(env?: NodeJS.ProcessEnv): Config;
36
+ /** Write a starter config, never clobbering an existing one. */
37
+ export declare function writeStarterConfig(config: Config): string;
38
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,YAAY,CAAC;AAGrC,MAAM,WAAW,YAAY;IAC5B,kFAAkF;IAClF,EAAE,EAAE,MAAM,CAAC;IACX,gFAAgF;IAChF,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,MAAM;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,mDAAmD;IACnD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC;IACX,qDAAqD;IACrD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8CAA8C;IAC9C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,YAAY,EAAE,IAAgB,CAAC;AAQ5C,wBAAgB,gBAAgB,CAAC,GAAG,oBAAc,GAAG,MAAM,CAG1D;AAED,wBAAgB,cAAc,CAAC,GAAG,oBAAc,GAAG,MAAM,CAGxD;AAED,wBAAgB,cAAc,IAAI,YAAY,EAAE,CAI/C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,oBAAc,GAAG,MAAM,CA+CpD;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBzD"}
package/dist/config.js ADDED
@@ -0,0 +1,86 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { expandTilde } from './glob.js';
5
+ import { TIERS } from './model.js';
6
+ export const DEFAULT_TIER = 'default';
7
+ function xdg(envVar, fallback) {
8
+ const v = process.env[envVar];
9
+ if (v && v.trim())
10
+ return v;
11
+ return path.join(os.homedir(), fallback);
12
+ }
13
+ export function defaultConfigDir(env = process.env) {
14
+ if (env.MEMONAUT_CONFIG_DIR)
15
+ return env.MEMONAUT_CONFIG_DIR;
16
+ return path.join(xdg('XDG_CONFIG_HOME', '.config'), 'memonaut');
17
+ }
18
+ export function defaultDataDir(env = process.env) {
19
+ if (env.MEMONAUT_DATA_DIR)
20
+ return env.MEMONAUT_DATA_DIR;
21
+ return path.join(xdg('XDG_DATA_HOME', '.local/share'), 'memonaut');
22
+ }
23
+ export function defaultSources() {
24
+ return [
25
+ { id: 'pi', kind: 'pi', root: path.join(os.homedir(), '.pi/agent/sessions') },
26
+ ];
27
+ }
28
+ /**
29
+ * Load config, filling in defaults. Every path is resolved here so nothing
30
+ * downstream ever has to think about `~` or XDG again.
31
+ */
32
+ export function loadConfig(env = process.env) {
33
+ const configDir = defaultConfigDir(env);
34
+ const dataDir = defaultDataDir(env);
35
+ const configPath = path.join(configDir, 'config.json');
36
+ let raw = {};
37
+ let loaded = false;
38
+ if (fs.existsSync(configPath)) {
39
+ try {
40
+ raw = JSON.parse(fs.readFileSync(configPath, 'utf8'));
41
+ loaded = true;
42
+ }
43
+ catch (err) {
44
+ throw new Error(`config at ${configPath} is not valid JSON: ${err.message}`);
45
+ }
46
+ }
47
+ const sources = Array.isArray(raw.sources) && raw.sources.length
48
+ ? raw.sources
49
+ : defaultSources();
50
+ const tier = typeof raw.tier === 'string' && TIERS.includes(raw.tier)
51
+ ? raw.tier
52
+ : DEFAULT_TIER;
53
+ return {
54
+ sources: sources.map((s) => ({
55
+ ...s,
56
+ root: path.resolve(expandTilde(s.root)),
57
+ })),
58
+ ignore: raw.ignore ?? [],
59
+ private: raw.private ?? [],
60
+ tier,
61
+ toolResultHeadBytes: raw.toolResultHeadBytes ?? 4096,
62
+ toolArgsHeadBytes: raw.toolArgsHeadBytes ?? 2048,
63
+ configDir,
64
+ dataDir,
65
+ dbPath: env.MEMONAUT_DB ?? path.join(dataDir, 'index.db'),
66
+ configPath,
67
+ loaded,
68
+ };
69
+ }
70
+ /** Write a starter config, never clobbering an existing one. */
71
+ export function writeStarterConfig(config) {
72
+ fs.mkdirSync(config.configDir, { recursive: true });
73
+ if (fs.existsSync(config.configPath))
74
+ return config.configPath;
75
+ const starter = {
76
+ sources: defaultSources(),
77
+ ignore: ['/tmp/**'],
78
+ private: [],
79
+ tier: DEFAULT_TIER,
80
+ toolResultHeadBytes: 4096,
81
+ toolArgsHeadBytes: 2048,
82
+ };
83
+ fs.writeFileSync(config.configPath, JSON.stringify(starter, null, '\t') + '\n', { mode: 0o600 });
84
+ return config.configPath;
85
+ }
86
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/db.d.ts ADDED
@@ -0,0 +1,37 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ /**
3
+ * Bump when the schema or the extraction rules change. The index is a derived
4
+ * cache over files that are still on disk, and a full rebuild costs well under
5
+ * a minute, so a version mismatch simply throws the DB away rather than
6
+ * carrying migration code forever.
7
+ */
8
+ export declare const SCHEMA_VERSION = 1;
9
+ export type DB = DatabaseSync;
10
+ export interface OpenOptions {
11
+ readOnly?: boolean;
12
+ /** Throw instead of rebuilding when the schema version differs. */
13
+ noRebuild?: boolean;
14
+ }
15
+ export declare function getMeta(db: DB, key: string): string | undefined;
16
+ export declare function setMeta(db: DB, key: string, value: string): void;
17
+ /**
18
+ * Open the index, creating it if needed.
19
+ *
20
+ * The DB file is created 0600: it concentrates every secret that ever passed
21
+ * through a transcript, so it must never be world-readable.
22
+ */
23
+ export declare function openDb(dbPath: string, opts?: OpenOptions): DB;
24
+ export declare function dropAll(db: DB): void;
25
+ /**
26
+ * Drop all content for a whole lineage.
27
+ *
28
+ * Re-ingestion is a LINEAGE-level operation, never a file-level one: a forked
29
+ * file's membership rows point at entries owned by its parent, so re-reading
30
+ * one file in isolation would leave dangling references. Lineages are tiny
31
+ * (the vast majority are a single file; the largest measured is twelve), so
32
+ * this costs nothing and removes a whole class of bug.
33
+ */
34
+ export declare function clearLineage(db: DB, lineageId: number): void;
35
+ /** Remove a file that is no longer on disk, and anything only it owned. */
36
+ export declare function deleteFile(db: DB, fileId: number): void;
37
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,MAAM,MAAM,EAAE,GAAG,YAAY,CAAC;AA6F9B,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI/D;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIhE;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,EAAE,CAqCjE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAYpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAW5D;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOvD"}