memonaut 0.2.0 → 0.4.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.
package/dist/indexer.js CHANGED
@@ -12,7 +12,8 @@ function probe(file) {
12
12
  return { header: readHeader(file), headHash: headFingerprint(file) };
13
13
  }
14
14
  export function index(opts) {
15
- const started = Date.now();
15
+ const clock = opts.now ?? Date.now;
16
+ const started = clock();
16
17
  const { config } = opts;
17
18
  const db = opts.db ?? openDb(config.dbPath);
18
19
  const report = opts.onProgress ?? (() => { });
@@ -32,6 +33,7 @@ export function index(opts) {
32
33
  bytesRead: 0,
33
34
  durationMs: 0,
34
35
  fullRebuild: false,
36
+ budgetExhausted: false,
35
37
  };
36
38
  // A tier change alters what text exists at all, so it forces a rebuild.
37
39
  const storedTier = getMeta(db, 'tier');
@@ -39,6 +41,18 @@ export function index(opts) {
39
41
  if (storedTier !== undefined && storedTier !== config.tier)
40
42
  full = true;
41
43
  stats.fullRebuild = full;
44
+ // A rebuild is all-or-nothing: it DELETEs every chunk, entry and membership
45
+ // before reading a byte, so truncating one would leave an index that later
46
+ // queries would answer from as though it were complete. A budget means the
47
+ // caller cannot afford to finish, so the honest move is not to start.
48
+ // Reachable without `opts.full`: a tier change forces one (line above).
49
+ if (full && opts.budgetMs !== undefined) {
50
+ stats.budgetExhausted = true;
51
+ stats.durationMs = clock() - started;
52
+ if (!opts.db)
53
+ db.close();
54
+ return stats;
55
+ }
42
56
  const isIgnored = matcher(config.ignore);
43
57
  const isPrivate = matcher(config.private);
44
58
  // Everything already known, loaded up front. This is what lets a warm run
@@ -293,6 +307,12 @@ export function index(opts) {
293
307
  };
294
308
  let done = 0;
295
309
  for (const unit of work) {
310
+ // `>=` so that a budget of 0 means "do nothing", even on a machine fast
311
+ // enough to reach this in the same millisecond it started.
312
+ if (opts.budgetMs !== undefined && clock() - started >= opts.budgetMs) {
313
+ stats.budgetExhausted = true;
314
+ break;
315
+ }
296
316
  db.exec('BEGIN');
297
317
  try {
298
318
  const lineageId = idOf.get(unit.lineageRoot);
@@ -368,9 +388,13 @@ export function index(opts) {
368
388
  });
369
389
  }
370
390
  setMeta(db, 'tier', config.tier);
371
- setMeta(db, 'indexed_at', String(Date.now()));
391
+ // Only claim to be caught up when we actually are. `indexed_at` is what the
392
+ // sync TTL reads, so advancing it after a budget-truncated run would let the
393
+ // next query skip the catch-up and answer from an index we KNOW is behind.
394
+ if (!stats.budgetExhausted)
395
+ setMeta(db, 'indexed_at', String(Date.now()));
372
396
  setMeta(db, 'roots', JSON.stringify(config.sources.map((s) => s.root)));
373
- stats.durationMs = Date.now() - started;
397
+ stats.durationMs = clock() - started;
374
398
  if (!opts.db)
375
399
  db.close();
376
400
  return stats;
@@ -379,6 +403,21 @@ export function index(opts) {
379
403
  export function describeIndex(config) {
380
404
  return path.resolve(config.dbPath);
381
405
  }
406
+ /**
407
+ * There is no index yet, as opposed to there being one that could not be read.
408
+ *
409
+ * The distinction is the whole point of the type. "No index" is fixed by
410
+ * building one; "index is locked" or "index is corrupt" is not, and a caller
411
+ * that collapses the two tells the user to run a command that will not help.
412
+ */
413
+ export class MissingIndexError extends Error {
414
+ dbPath;
415
+ constructor(dbPath) {
416
+ super(`no index at ${dbPath}`);
417
+ this.name = 'MissingIndexError';
418
+ this.dbPath = dbPath;
419
+ }
420
+ }
382
421
  /**
383
422
  * Catch the index up, unless it was already synced within `ttlMs`.
384
423
  *
@@ -387,18 +426,111 @@ export function describeIndex(config) {
387
426
  * turn. The TTL is what makes "always fresh" affordable for callers that query
388
427
  * in a burst.
389
428
  */
390
- export function syncIfStale(config, ttlMs = 15_000) {
429
+ export function syncIfStale(config, ttlMs = 15_000, budgetMs) {
391
430
  if (!fs.existsSync(config.dbPath))
392
- throw new Error(`no index at ${config.dbPath}`);
431
+ throw new MissingIndexError(config.dbPath);
393
432
  const db = openDb(config.dbPath);
394
433
  try {
395
434
  const last = Number(getMeta(db, 'indexed_at') ?? 0);
396
435
  if (Number.isFinite(last) && Date.now() - last < ttlMs)
397
436
  return { ran: false };
398
- return { ran: true, stats: index({ config, db }) };
437
+ return { ran: true, stats: index({ config, db, budgetMs }) };
399
438
  }
400
439
  finally {
401
440
  db.close();
402
441
  }
403
442
  }
443
+ /**
444
+ * How far behind the index is, without changing it.
445
+ *
446
+ * This is a `stat` pass over the corpus plus a header read for the few files
447
+ * the index has never seen, because whether a new file is ignored can only be
448
+ * decided from its header `cwd`, never from its mangled directory name.
449
+ * Measured at ~70 ms over 4,831 transcripts.
450
+ *
451
+ * Every read path already syncs before it answers, so this is not how anything
452
+ * stays correct: it is how a human or an agent can SEE the lag, and how they
453
+ * can tell "nothing to do" apart from "about to pay for a month of catch-up".
454
+ */
455
+ export function freshness(config) {
456
+ const report = {
457
+ dbPath: config.dbPath,
458
+ exists: fs.existsSync(config.dbPath),
459
+ dbBytes: 0,
460
+ tier: null,
461
+ indexedAt: null,
462
+ ageMs: null,
463
+ transcriptsOnDisk: 0,
464
+ transcriptsIndexed: 0,
465
+ changed: 0,
466
+ unseen: 0,
467
+ vanished: 0,
468
+ sources: config.sources.map((s) => s.root),
469
+ };
470
+ // Null size/mtime means "row exists, content never ingested", which is a
471
+ // different thing from "ingested and since changed", so the nulls are kept.
472
+ const known = new Map();
473
+ if (report.exists) {
474
+ report.dbBytes = fs.statSync(config.dbPath).size;
475
+ const db = openDb(config.dbPath, { readOnly: true });
476
+ try {
477
+ report.tier = getMeta(db, 'tier') ?? null;
478
+ const at = Number(getMeta(db, 'indexed_at') ?? NaN);
479
+ if (Number.isFinite(at)) {
480
+ report.indexedAt = at;
481
+ report.ageMs = Date.now() - at;
482
+ }
483
+ for (const row of db
484
+ .prepare('SELECT path, size, mtime FROM file')
485
+ .all()) {
486
+ known.set(row.path, {
487
+ size: row.size === null ? null : num(row.size),
488
+ mtime: row.mtime === null ? null : num(row.mtime),
489
+ });
490
+ }
491
+ }
492
+ finally {
493
+ db.close();
494
+ }
495
+ }
496
+ report.transcriptsIndexed = known.size;
497
+ const isIgnored = matcher(config.ignore);
498
+ // Tracked so a deletion counts as pending work too: reporting "up to date"
499
+ // while the next sync still has N `deleteFile` calls to make would undercut
500
+ // the only thing this command is for.
501
+ const seen = new Set();
502
+ for (const source of config.sources) {
503
+ if (!fs.existsSync(source.root))
504
+ continue;
505
+ for (const file of listTranscripts(source.root)) {
506
+ report.transcriptsOnDisk++;
507
+ let st;
508
+ try {
509
+ st = fs.statSync(file);
510
+ }
511
+ catch {
512
+ continue;
513
+ }
514
+ seen.add(file);
515
+ const row = known.get(file);
516
+ if (!row) {
517
+ // Only a file the index has never heard of has to be opened, and only
518
+ // because the ignore rules match the header cwd, never the mangled
519
+ // directory name.
520
+ const header = readHeader(file);
521
+ if (header && !isIgnored(header.cwd ?? file))
522
+ report.unseen++;
523
+ continue;
524
+ }
525
+ if (row.size === null || row.mtime === null)
526
+ report.unseen++;
527
+ else if (row.size !== st.size || row.mtime !== Math.floor(st.mtimeMs))
528
+ report.changed++;
529
+ }
530
+ }
531
+ for (const knownPath of known.keys())
532
+ if (!seen.has(knownPath))
533
+ report.vanished++;
534
+ return report;
535
+ }
404
536
  //# sourceMappingURL=indexer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function resolvePackageResource(relative: string): string | undefined;
2
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAaA,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY3E"}
@@ -0,0 +1,25 @@
1
+ import fs from 'node:fs';
2
+ import { fileURLToPath } from 'node:url';
3
+ /**
4
+ * Finding files that ship beside the package rather than inside `dist`.
5
+ *
6
+ * A published install carries `skills/` next to `dist/`, staged there at build time. A checkout
7
+ * keeps the same directory at the repo root, three levels above `packages/memonaut/dist`. Both are
8
+ * searched instead of one being made canonical, so `recall skills` behaves the same whether it is
9
+ * run from a global install, from the workspace, or through `tsx src/cli.ts`.
10
+ */
11
+ const ROOTS = ['../', '../../../'];
12
+ export function resolvePackageResource(relative) {
13
+ for (const root of ROOTS) {
14
+ try {
15
+ const candidate = fileURLToPath(new URL(`${root}${relative}`, import.meta.url));
16
+ if (fs.existsSync(candidate))
17
+ return candidate;
18
+ }
19
+ catch {
20
+ continue;
21
+ }
22
+ }
23
+ return undefined;
24
+ }
25
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAC;AAEvC;;;;;;;GAOG;AACH,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AAEnC,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC;YACJ,MAAM,SAAS,GAAG,aAAa,CAC9B,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,QAAQ,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAC9C,CAAC;YACF,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACR,SAAS;QACV,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Installing the agent skill that ships with this package.
3
+ *
4
+ * pi loads the skill itself from `memonaut-pi` (its `pi.skills` entry), so this command exists for
5
+ * every other agent: the skill is the same file, and `~/.agents/skills/<name>` is where agents that
6
+ * are not pi look for it. One directory, no fan-out to twenty agent-specific locations, and the
7
+ * report names every path written.
8
+ */
9
+ export interface Skill {
10
+ name: string;
11
+ description: string;
12
+ from: string;
13
+ }
14
+ export type Scope = 'user' | 'project';
15
+ /** Where skills live, by convention. `project` keeps them beside the code that needs them. */
16
+ export declare function destinationFor(scope: Scope, cwd?: string): string;
17
+ export declare function skillsSource(): string | undefined;
18
+ /** Name and description come from the SKILL.md front matter, so there is one source of truth. */
19
+ export declare function availableSkills(): Skill[];
20
+ export interface Installed {
21
+ name: string;
22
+ to: string;
23
+ replaced: boolean;
24
+ }
25
+ /**
26
+ * Copies rather than symlinks, so an installed skill survives `node_modules` being deleted.
27
+ *
28
+ * The cost is that upgrading the package does not upgrade the installed skill, which is why the
29
+ * report says `replaced` versus `installed`: a skill that is quietly stale is worse than one you
30
+ * know you have to refresh.
31
+ */
32
+ export declare function installSkills(scope: Scope, cwd?: string): Installed[];
33
+ export declare function isInstalled(skill: Skill, scope: Scope, cwd?: string): boolean;
34
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AAEH,MAAM,WAAW,KAAK;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAEvC,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,SAAgB,GAAG,MAAM,CAIxE;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED,iGAAiG;AACjG,wBAAgB,eAAe,IAAI,KAAK,EAAE,CAgBzC;AAED,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,SAAgB,GAAG,SAAS,EAAE,CAY5E;AAED,wBAAgB,WAAW,CAC1B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,GAAG,SAAgB,GACjB,OAAO,CAET"}
package/dist/skills.js ADDED
@@ -0,0 +1,59 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { resolvePackageResource } from './resources.js';
5
+ /** Where skills live, by convention. `project` keeps them beside the code that needs them. */
6
+ export function destinationFor(scope, cwd = process.cwd()) {
7
+ return scope === 'user'
8
+ ? path.join(os.homedir(), '.agents', 'skills')
9
+ : path.join(cwd, '.agents', 'skills');
10
+ }
11
+ export function skillsSource() {
12
+ return resolvePackageResource('skills/');
13
+ }
14
+ /** Name and description come from the SKILL.md front matter, so there is one source of truth. */
15
+ export function availableSkills() {
16
+ const root = skillsSource();
17
+ if (!root)
18
+ return [];
19
+ const skills = [];
20
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
21
+ if (!entry.isDirectory())
22
+ continue;
23
+ const manifest = path.join(root, entry.name, 'SKILL.md');
24
+ if (!fs.existsSync(manifest))
25
+ continue;
26
+ const text = fs.readFileSync(manifest, 'utf8');
27
+ skills.push({
28
+ name: /^name:\s*(.+)$/m.exec(text)?.[1]?.trim() ?? entry.name,
29
+ description: /^description:\s*(.+)$/m.exec(text)?.[1]?.trim() ?? '',
30
+ from: path.join(root, entry.name),
31
+ });
32
+ }
33
+ return skills.sort((a, b) => a.name.localeCompare(b.name));
34
+ }
35
+ /**
36
+ * Copies rather than symlinks, so an installed skill survives `node_modules` being deleted.
37
+ *
38
+ * The cost is that upgrading the package does not upgrade the installed skill, which is why the
39
+ * report says `replaced` versus `installed`: a skill that is quietly stale is worse than one you
40
+ * know you have to refresh.
41
+ */
42
+ export function installSkills(scope, cwd = process.cwd()) {
43
+ const destination = destinationFor(scope, cwd);
44
+ const installed = [];
45
+ for (const skill of availableSkills()) {
46
+ const to = path.join(destination, skill.name);
47
+ const replaced = fs.existsSync(to);
48
+ if (replaced)
49
+ fs.rmSync(to, { recursive: true, force: true });
50
+ fs.mkdirSync(destination, { recursive: true });
51
+ fs.cpSync(skill.from, to, { recursive: true });
52
+ installed.push({ name: skill.name, to, replaced });
53
+ }
54
+ return installed;
55
+ }
56
+ export function isInstalled(skill, scope, cwd = process.cwd()) {
57
+ return fs.existsSync(path.join(destinationFor(scope, cwd), skill.name));
58
+ }
59
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memonaut",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Index and search AI agent conversation transcripts (pi sessions and friends) from the CLI, from agents, and from your own code",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {
@@ -39,7 +39,8 @@
39
39
  },
40
40
  "files": [
41
41
  "dist",
42
- "src"
42
+ "src",
43
+ "skills"
43
44
  ],
44
45
  "engines": {
45
46
  "node": ">=22.5.0"
@@ -53,7 +54,7 @@
53
54
  "vitest": "^4.0.18"
54
55
  },
55
56
  "scripts": {
56
- "build": "tsc",
57
+ "build": "rm -rf skills && cp -r ../../skills ./skills && tsc",
57
58
  "dev": "as-soon -w src pnpm build",
58
59
  "cli": "tsx src/cli.ts",
59
60
  "test": "vitest run",
@@ -0,0 +1,122 @@
1
+ ---
2
+ name: memonaut
3
+ description: Search past AI conversation transcripts (previous sessions, across every project) for what was said, decided, tried or rejected. Use when the user refers to an earlier session ("what did we decide about X", "we discussed this before", "that thing we tried last month"), when you need context that predates the current conversation, when you are about to redo analysis that may already exist, or when asked to find or resume an old conversation. Works via the recall_search / recall_thread / recall_sql tools when the memonaut pi package is loaded, or the `memonaut` (aka `recall`) CLI otherwise.
4
+ license: AGPL-3.0-only
5
+ ---
6
+
7
+ # memonaut
8
+
9
+ Past sessions with this user are indexed and searchable. The index covers **all projects**, not just the current one.
10
+
11
+ ## When to reach for it
12
+
13
+ - The user refers to something from before: "what did we decide", "like we did in the other repo", "the bug from last month".
14
+ - You need a decision's *rationale*, which usually lives in an old conversation, not in the code or the docs.
15
+ - You are about to investigate something that feels like it has been investigated before.
16
+ - The user wants to find or resume an old conversation.
17
+
18
+ Do **not** use it as a code search. It indexes conversations. Use `grep` for the codebase.
19
+
20
+ ## The two-step
21
+
22
+ Search returns snippets, not conversations. The normal loop is:
23
+
24
+ 1. `recall_search` with a phrase you expect to have been typed.
25
+ 2. `recall_thread` on the most promising result to read what was actually said around it.
26
+
27
+ Snippets are deliberately short. Do not answer from a snippet alone when the answer matters: read the thread.
28
+
29
+ ## Query syntax
30
+
31
+ The query is an SQLite FTS5 expression:
32
+
33
+ | Form | Meaning |
34
+ |---|---|
35
+ | `steering queue` | both words, anywhere in the message |
36
+ | `"steering queue"` | that exact phrase |
37
+ | `queue OR backlog` | either |
38
+ | `queue NOT redis` | first without the second |
39
+ | `NEAR(fork lineage, 5)` | both within five tokens |
40
+ | `parentSess*` | prefix |
41
+
42
+ Search words the **user or you would have typed**, not words you would use to describe the topic. Transcripts contain the actual vocabulary of the moment: identifiers, error strings, file names. `"ERR_SQLITE_ERROR"` finds things; "database problem" often does not.
43
+
44
+ If a query fails to parse as FTS5 it is retried as quoted literal tokens, so pasting `handleToolCall(x)` is safe.
45
+
46
+ FTS5 tokenises, so it cannot match *inside* an identifier (`ToolCall` does not find `handleToolCall`), and it only sees text the index holds. When you need either, use the exact path below.
47
+
48
+ ## Narrowing
49
+
50
+ Everything is global by default, which is usually right and occasionally noisy.
51
+
52
+ - `project: ["wherever"]` — the last path segment of the working directory.
53
+ - `cwd: ["~/dev/**/wherever"]` — glob over the full path.
54
+ - `since: "2026-07-01"` — bound the time range.
55
+ - `role: ["user"]` — only what the human typed. Very effective for finding a decision or a requirement.
56
+ - `tool: ["bash"]` — messages involving a given tool.
57
+
58
+ Start broad, then narrow. A result count in the dozens means add a filter; zero results usually means your phrase was too specific, so drop a word or try `OR`.
59
+
60
+ ## Forks: several threads can carry the same message
61
+
62
+ Forking a conversation copies its history, so one message can belong to several continuations. When a match falls in shared history, the result says so and lists every thread that inherited it, **most recently active first**, with how many entries each accumulated afterwards.
63
+
64
+ That list is a real choice, not noise. The threads diverged after the matched point, so they may have reached different conclusions. When it matters which one you follow:
65
+
66
+ - The newest thread is the usual default, but say which one you read.
67
+ - If the forks disagree, tell the user there are several continuations rather than picking one silently.
68
+
69
+ ## Aggregates
70
+
71
+ For counting and grouping questions ("which projects did I touch in July", "how many sessions used this tool"), use `recall_sql` instead of trying to phrase it as a search. Tables:
72
+
73
+ ```
74
+ file(id, path, cwd, project, name, parent_id, lineage_id, private, started, last_activity, entry_count)
75
+ entry(id, lineage_id, entry_key, role, tool, ts)
76
+ membership(entry_id, file_id, seq) -- which threads carry an entry
77
+ chunk(entry_id, kind, text) -- indexed text
78
+ chunk_fts -- FTS5 index over chunk.text
79
+ ```
80
+
81
+ The connection is read-only. Always include a `LIMIT`.
82
+
83
+ ## Exact search: the CLI's `--regex`
84
+
85
+ There is **no regex tool**. When full-text search structurally cannot answer, use the shell:
86
+
87
+ ```sh
88
+ recall search --regex 'ERR_[A-Z_]+' --since 30d
89
+ recall search --regex 'handleToolCall(' -F --project wherever # -F: literal, not a regex
90
+ ```
91
+
92
+ It runs ripgrep over the **original transcripts**, so it reaches two things the tools cannot:
93
+
94
+ - text *inside* an identifier, which FTS5 cannot tokenise to;
95
+ - text the index does not hold at all, above all **tool output** (42% of the bytes, not indexed by default) and the tail of long tool-call arguments. A hit that came from such text is labelled `read from the transcript · this ... text is not indexed`. If a user insists something was definitely said and search finds nothing, this is usually why. (A hit labelled `matched the transcript JSON, not the message text` is different: your pattern hit a JSON key or an id, not anything anyone wrote.)
96
+
97
+ It is fork-aware and filtered exactly like a normal search (`--project`, `--role`, `--since`, ...), and it still never reads an ignored or private transcript. It is roughly 5x slower than the indexed query and has **no relevance ranking**: results are ordered by recency, so the first one is the most recent match, not the best one. Search full-text first; reach for `--regex` when you know the exact string.
98
+
99
+ ## Without the pi tools
100
+
101
+ If `recall_search` is not available, the same index is reachable from the shell:
102
+
103
+ ```sh
104
+ recall search '"steering queue"' --project wherever --since 30d
105
+ recall search '"completing one work task"' --threads all
106
+ recall show 2585 --from 120
107
+ recall sql "select project, count(*) n from file group by 1 order by n desc limit 10"
108
+ ```
109
+
110
+ Add `--json` for machine-readable output. `recall status` reports how fresh the index is; `recall status --json` gives `indexedAt`, `ageMs`, `changed`, `unseen`.
111
+
112
+ You do not have to keep the index fresh. Every query runs an incremental catch-up first (~120 ms warm): all three tools, and `recall search` / `recall show` / `recall sql` on the CLI. If no index exists at all, the first query builds one (~35 s, once) and tells you it did. Pass that on to the user when it happens, and otherwise do not offer to run `recall index`: it is not what makes results current.
113
+
114
+ ## What is not there
115
+
116
+ - **Private conversations.** The user's config lists working directories that are indexed for them but never exposed to tools. This holds for `recall_sql` too: the tables it queries are filtered, so a `COUNT(*)` is a count of what you may see, and `main.file`, `ATTACH` and `chunk_fts` are refused because they would go around that filter. If a thread comes back as private, do not try to route around it; tell the user.
117
+ - **Full tool output.** Tool results are stored truncated or not at all (they are 42% of the bytes and rarely what anyone is looking for). The discussion is indexed; the command output usually is not. For full fidelity the original transcript is still on disk, and `recall search --regex` reads it.
118
+ - **Anything the user chose to ignore.** Ignored directories were never read at all.
119
+
120
+ ## Reporting back
121
+
122
+ Cite what you found by thread number and date ("thread 2585, 11 July"), so the user can open it themselves. When you are relying on an old conversation for a claim, say so: a decision from six weeks ago may since have been reversed, and the transcript cannot tell you that on its own.