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
package/dist/search.js ADDED
@@ -0,0 +1,285 @@
1
+ import { matcher } from './glob.js';
2
+ import { KIND_WEIGHT } from './model.js';
3
+ export function loadFiles(db) {
4
+ const rows = db
5
+ .prepare(`SELECT id, path, source, session_uuid, cwd, project, name, parent_id, lineage_id,
6
+ lineage_depth, orphaned, private, started, last_activity, entry_count
7
+ FROM file`)
8
+ .all();
9
+ const out = new Map();
10
+ for (const row of rows)
11
+ out.set(Number(row.id), row);
12
+ return out;
13
+ }
14
+ /** Quote every token, turning a hostile string into a valid FTS5 AND query. */
15
+ export function quoteQuery(text) {
16
+ const tokens = text.match(/[^\s]+/g) ?? [];
17
+ const quoted = tokens.map((t) => '"' + t.replace(/"/g, '""') + '"');
18
+ return quoted.join(' ');
19
+ }
20
+ function inList(column, values) {
21
+ if (!values || values.length === 0)
22
+ return { sql: '', args: [] };
23
+ const placeholders = values.map(() => '?').join(', ');
24
+ return { sql: ` AND ${column} IN (${placeholders})`, args: values };
25
+ }
26
+ function recencyBoost(ts, now) {
27
+ if (!ts)
28
+ return 1;
29
+ const t = Date.parse(ts);
30
+ if (Number.isNaN(t))
31
+ return 1;
32
+ const ageDays = Math.max(0, (now - t) / 86_400_000);
33
+ // A gentle nudge, not a sort: 1.25x for today, ~1.0x after a year.
34
+ return 1 + 0.25 * Math.exp(-ageDays / 120);
35
+ }
36
+ export function search(db, query, now = Date.now()) {
37
+ const limit = query.limit ?? 20;
38
+ const threadLimit = query.threadLimit ?? 3;
39
+ const files = loadFiles(db);
40
+ // Visibility is decided per THREAD, because a lineage can in principle span
41
+ // working directories. The lineage set below is only a prefilter.
42
+ const cwdMatch = query.cwd && query.cwd.length ? matcher(query.cwd) : null;
43
+ const projectMatch = query.project && query.project.length ? new Set(query.project) : null;
44
+ const visibleFiles = new Set();
45
+ const visibleLineages = new Set();
46
+ for (const file of files.values()) {
47
+ if (!query.includePrivate && file.private)
48
+ continue;
49
+ if (cwdMatch && !cwdMatch(file.cwd))
50
+ continue;
51
+ if (projectMatch && !(file.project && projectMatch.has(file.project)))
52
+ continue;
53
+ visibleFiles.add(Number(file.id));
54
+ if (file.lineage_id !== null)
55
+ visibleLineages.add(Number(file.lineage_id));
56
+ }
57
+ const totalLineages = new Set();
58
+ for (const file of files.values())
59
+ if (file.lineage_id !== null)
60
+ totalLineages.add(Number(file.lineage_id));
61
+ const clauses = [];
62
+ const args = [];
63
+ for (const part of [
64
+ inList('e.role', query.role),
65
+ inList('e.tool', query.tool),
66
+ inList('c.kind', query.kind),
67
+ ]) {
68
+ if (part.sql) {
69
+ clauses.push(part.sql);
70
+ args.push(...part.args);
71
+ }
72
+ }
73
+ if (query.since) {
74
+ clauses.push(' AND e.ts >= ?');
75
+ args.push(query.since);
76
+ }
77
+ if (query.until) {
78
+ clauses.push(' AND e.ts <= ?');
79
+ args.push(query.until);
80
+ }
81
+ // Only push the lineage set into SQL when it actually narrows things down;
82
+ // a 3,000-element IN list to exclude nothing is a waste.
83
+ if (visibleLineages.size > 0 &&
84
+ visibleLineages.size < totalLineages.size * 0.5) {
85
+ const ids = [...visibleLineages];
86
+ clauses.push(` AND e.lineage_id IN (${ids.map(() => '?').join(', ')})`);
87
+ args.push(...ids);
88
+ }
89
+ // Over-fetch: grouping by lineage and re-weighting by kind both collapse rows.
90
+ const fetch = Math.min(2000, Math.max(200, limit * 20));
91
+ const sql = `
92
+ SELECT e.id AS entry_id, e.entry_key, e.lineage_id, e.role, e.tool, e.ts,
93
+ c.kind AS kind,
94
+ bm25(chunk_fts) AS bm,
95
+ snippet(chunk_fts, 0, '\u0001', '\u0002', '…', 14) AS snip
96
+ FROM chunk_fts
97
+ JOIN chunk c ON c.id = chunk_fts.rowid
98
+ JOIN entry e ON e.id = c.entry_id
99
+ WHERE chunk_fts MATCH ?${clauses.join('')}
100
+ ORDER BY bm
101
+ LIMIT ?
102
+ `;
103
+ let usedQuery = query.text;
104
+ let quotedFallback = false;
105
+ let rows;
106
+ try {
107
+ rows = db
108
+ .prepare(sql)
109
+ .all(usedQuery, ...args, fetch);
110
+ }
111
+ catch (err) {
112
+ if (query.raw)
113
+ throw new Error(`invalid FTS5 query: ${err.message}`);
114
+ usedQuery = quoteQuery(query.text);
115
+ quotedFallback = true;
116
+ if (!usedQuery)
117
+ throw new Error('empty query');
118
+ rows = db
119
+ .prepare(sql)
120
+ .all(usedQuery, ...args, fetch);
121
+ }
122
+ const memberStmt = db.prepare('SELECT file_id, seq FROM membership WHERE entry_id = ?');
123
+ const groups = new Map();
124
+ const order = [];
125
+ for (const row of rows) {
126
+ const kind = row.kind;
127
+ const weight = KIND_WEIGHT[kind] ?? 1;
128
+ const score = -Number(row.bm) *
129
+ weight *
130
+ (query.noRecency ? 1 : recencyBoost(row.ts, now));
131
+ const lineageId = Number(row.lineage_id);
132
+ const existing = groups.get(lineageId);
133
+ if (existing) {
134
+ existing.otherHits++;
135
+ if (score > existing.score) {
136
+ // A better hit in the same lineage takes over the group, keeping the
137
+ // count of everything it displaced.
138
+ const otherHits = existing.otherHits;
139
+ const replaced = buildHit(row, kind, score, memberStmt, files, visibleFiles, threadLimit);
140
+ if (replaced) {
141
+ replaced.otherHits = otherHits;
142
+ groups.set(lineageId, replaced);
143
+ }
144
+ }
145
+ continue;
146
+ }
147
+ const hit = buildHit(row, kind, score, memberStmt, files, visibleFiles, threadLimit);
148
+ if (!hit)
149
+ continue;
150
+ groups.set(lineageId, hit);
151
+ order.push(lineageId);
152
+ }
153
+ const hits = order
154
+ .map((id) => groups.get(id))
155
+ .filter((h) => Boolean(h))
156
+ .sort((a, b) => b.score - a.score);
157
+ return {
158
+ hits: hits.slice(0, limit),
159
+ usedQuery,
160
+ scanned: hits.length,
161
+ quotedFallback,
162
+ };
163
+ }
164
+ function buildHit(row, kind, score, memberStmt, files, visibleFiles, threadLimit) {
165
+ const members = memberStmt.all(row.entry_id);
166
+ const threads = [];
167
+ for (const m of members) {
168
+ const fileId = Number(m.file_id);
169
+ if (!visibleFiles.has(fileId))
170
+ continue;
171
+ const file = files.get(fileId);
172
+ if (!file)
173
+ continue;
174
+ threads.push({
175
+ fileId,
176
+ path: file.path,
177
+ name: file.name,
178
+ cwd: file.cwd,
179
+ project: file.project,
180
+ lastActivity: file.last_activity,
181
+ entryCount: Number(file.entry_count),
182
+ seq: Number(m.seq),
183
+ after: Math.max(0, Number(file.entry_count) - Number(m.seq) - 1),
184
+ isRoot: Number(file.lineage_id) === fileId,
185
+ });
186
+ }
187
+ // Every visible thread that inherited this entry is a result. Most recently
188
+ // active first: when a fork family matches on shared history, the thread you
189
+ // touched last is the one you almost always mean.
190
+ threads.sort((a, b) => (b.lastActivity ?? '').localeCompare(a.lastActivity ?? ''));
191
+ if (threads.length === 0)
192
+ return null;
193
+ return {
194
+ entryId: Number(row.entry_id),
195
+ entryKey: row.entry_key,
196
+ lineageId: Number(row.lineage_id),
197
+ role: row.role,
198
+ tool: row.tool,
199
+ ts: row.ts,
200
+ kind,
201
+ snippet: row.snip,
202
+ score,
203
+ threads: threadLimit < 0 ? threads : threads.slice(0, Math.max(threadLimit, 1)),
204
+ threadTotal: threads.length,
205
+ otherHits: 0,
206
+ };
207
+ }
208
+ /** Resolve a user-supplied reference to a thread: file id, uuid prefix, or path. */
209
+ export function resolveThread(db, ref) {
210
+ if (/^\d+$/.test(ref)) {
211
+ const byId = db
212
+ .prepare('SELECT * FROM file WHERE id = ?')
213
+ .get(Number(ref));
214
+ if (byId)
215
+ return byId;
216
+ }
217
+ const byPath = db
218
+ .prepare('SELECT * FROM file WHERE path = ?')
219
+ .get(ref);
220
+ if (byPath)
221
+ return byPath;
222
+ const byUuid = db
223
+ .prepare('SELECT * FROM file WHERE session_uuid LIKE ? ORDER BY last_activity DESC LIMIT 1')
224
+ .get(ref + '%');
225
+ if (byUuid)
226
+ return byUuid;
227
+ const byName = db
228
+ .prepare('SELECT * FROM file WHERE name = ? ORDER BY last_activity DESC LIMIT 1')
229
+ .get(ref);
230
+ return byName ?? null;
231
+ }
232
+ /**
233
+ * Read one thread back in order.
234
+ *
235
+ * `ownerPath` + byte range is the pointer back to the source transcript. The
236
+ * index deliberately stores tool output truncated (or not at all), so anything
237
+ * that needs full fidelity re-reads those bytes instead of trusting the cache.
238
+ */
239
+ export function readThread(db, fileId, from = 0, limit = 50) {
240
+ const rows = db
241
+ .prepare(`SELECT m.seq AS seq, e.id AS entry_id, e.entry_key, e.role, e.tool, e.ts,
242
+ e.first_file, e.byte_offset, e.byte_len, f.path AS owner_path
243
+ FROM membership m
244
+ JOIN entry e ON e.id = m.entry_id
245
+ LEFT JOIN file f ON f.id = e.first_file
246
+ WHERE m.file_id = ? AND m.seq >= ?
247
+ ORDER BY m.seq LIMIT ?`)
248
+ .all(fileId, from, limit);
249
+ const chunkStmt = db.prepare('SELECT kind, text FROM chunk WHERE entry_id = ? ORDER BY part');
250
+ return rows.map((r) => ({
251
+ seq: Number(r.seq),
252
+ entryId: Number(r.entry_id),
253
+ entryKey: r.entry_key,
254
+ role: r.role,
255
+ tool: r.tool,
256
+ ts: r.ts,
257
+ shared: Number(r.first_file) !== fileId,
258
+ ownerPath: r.owner_path,
259
+ byteOffset: Number(r.byte_offset),
260
+ byteLength: Number(r.byte_len),
261
+ texts: chunkStmt.all(r.entry_id),
262
+ }));
263
+ }
264
+ export function indexStats(db) {
265
+ const one = (sql) => db.prepare(sql).get();
266
+ const counts = one(`SELECT COUNT(*) AS files,
267
+ COUNT(DISTINCT lineage_id) AS lineages,
268
+ SUM(CASE WHEN parent_id IS NOT NULL THEN 1 ELSE 0 END) AS forks,
269
+ SUM(private) AS privateFiles,
270
+ SUM(orphaned) AS orphans,
271
+ COUNT(DISTINCT project) AS projects,
272
+ MIN(started) AS oldest,
273
+ MAX(last_activity) AS newest
274
+ FROM file`);
275
+ const entries = one('SELECT COUNT(*) AS n FROM entry').n;
276
+ const memberships = one('SELECT COUNT(*) AS n FROM membership').n;
277
+ const chunks = one('SELECT COUNT(*) AS n FROM chunk').n;
278
+ return {
279
+ ...counts,
280
+ entries: Number(entries),
281
+ memberships: Number(memberships),
282
+ chunks: Number(chunks),
283
+ };
284
+ }
285
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=silence-sqlite-warning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"silence-sqlite-warning.d.ts","sourceRoot":"","sources":["../src/silence-sqlite-warning.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { silenceSqliteWarning } from './quiet.js';
2
+ /**
3
+ * Side-effect module. Imported FIRST by the CLI so the patch is installed
4
+ * before `node:sqlite` is ever loaded: ES modules evaluate all imports before
5
+ * the importing module's body runs, so calling the function from `main()` would
6
+ * be far too late.
7
+ */
8
+ silenceSqliteWarning();
9
+ //# sourceMappingURL=silence-sqlite-warning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"silence-sqlite-warning.js","sourceRoot":"","sources":["../src/silence-sqlite-warning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAC,MAAM,YAAY,CAAC;AAEhD;;;;;GAKG;AACH,oBAAoB,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,62 @@
1
1
  {
2
2
  "name": "memonaut",
3
- "version": "0.0.0",
3
+ "version": "0.1.0",
4
+ "description": "Index and search AI agent conversation transcripts (pi sessions and friends) from the CLI, from agents, and from your own code",
5
+ "license": "AGPL-3.0-only",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/wighawag/memonaut.git",
9
+ "directory": "packages/memonaut"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/wighawag/memonaut/issues"
13
+ },
14
+ "homepage": "https://github.com/wighawag/memonaut#readme",
15
+ "keywords": [
16
+ "search",
17
+ "index",
18
+ "transcripts",
19
+ "conversations",
20
+ "sessions",
21
+ "agent",
22
+ "sqlite",
23
+ "fts5",
24
+ "cli"
25
+ ],
4
26
  "publishConfig": {
5
27
  "access": "public"
28
+ },
29
+ "type": "module",
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "default": "./dist/index.js"
34
+ }
35
+ },
36
+ "bin": {
37
+ "memonaut": "./dist/cli.js",
38
+ "recall": "./dist/cli.js"
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "src"
43
+ ],
44
+ "engines": {
45
+ "node": ">=22.5.0"
46
+ },
47
+ "dependencies": {},
48
+ "devDependencies": {
49
+ "@types/node": "^25.2.0",
50
+ "as-soon": "^0.1.5",
51
+ "tsx": "^4.21.0",
52
+ "typescript": "^5.3.3",
53
+ "vitest": "^4.0.18"
54
+ },
55
+ "scripts": {
56
+ "build": "tsc",
57
+ "dev": "as-soon -w src pnpm build",
58
+ "cli": "tsx src/cli.ts",
59
+ "test": "vitest run",
60
+ "test:watch": "vitest"
6
61
  }
7
- }
62
+ }