agent-recall-core 3.4.25 → 3.4.30

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 (62) hide show
  1. package/dist/helpers/journal-files.d.ts +1 -1
  2. package/dist/helpers/journal-files.d.ts.map +1 -1
  3. package/dist/helpers/journal-files.js +4 -3
  4. package/dist/helpers/journal-files.js.map +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/palace/awareness.d.ts.map +1 -1
  10. package/dist/palace/awareness.js +6 -2
  11. package/dist/palace/awareness.js.map +1 -1
  12. package/dist/palace/compress.d.ts.map +1 -1
  13. package/dist/palace/compress.js +30 -5
  14. package/dist/palace/compress.js.map +1 -1
  15. package/dist/palace/rooms.d.ts.map +1 -1
  16. package/dist/palace/rooms.js +13 -1
  17. package/dist/palace/rooms.js.map +1 -1
  18. package/dist/relevance/injector.d.ts +51 -0
  19. package/dist/relevance/injector.d.ts.map +1 -0
  20. package/dist/relevance/injector.js +121 -0
  21. package/dist/relevance/injector.js.map +1 -0
  22. package/dist/relevance/precision.d.ts +109 -0
  23. package/dist/relevance/precision.d.ts.map +1 -0
  24. package/dist/relevance/precision.js +279 -0
  25. package/dist/relevance/precision.js.map +1 -0
  26. package/dist/relevance/promoter.d.ts +60 -0
  27. package/dist/relevance/promoter.d.ts.map +1 -0
  28. package/dist/relevance/promoter.js +336 -0
  29. package/dist/relevance/promoter.js.map +1 -0
  30. package/dist/relevance/stager.d.ts +61 -0
  31. package/dist/relevance/stager.d.ts.map +1 -0
  32. package/dist/relevance/stager.js +251 -0
  33. package/dist/relevance/stager.js.map +1 -0
  34. package/dist/relevance/surfacer.d.ts +34 -0
  35. package/dist/relevance/surfacer.d.ts.map +1 -0
  36. package/dist/relevance/surfacer.js +333 -0
  37. package/dist/relevance/surfacer.js.map +1 -0
  38. package/dist/storage/paths.d.ts +6 -1
  39. package/dist/storage/paths.d.ts.map +1 -1
  40. package/dist/storage/paths.js +13 -7
  41. package/dist/storage/paths.js.map +1 -1
  42. package/dist/storage/project.d.ts +17 -0
  43. package/dist/storage/project.d.ts.map +1 -1
  44. package/dist/storage/project.js +73 -1
  45. package/dist/storage/project.js.map +1 -1
  46. package/dist/tools-logic/context-synthesize.d.ts.map +1 -1
  47. package/dist/tools-logic/context-synthesize.js +2 -1
  48. package/dist/tools-logic/context-synthesize.js.map +1 -1
  49. package/dist/tools-logic/dashboard-export.d.ts.map +1 -1
  50. package/dist/tools-logic/dashboard-export.js +13 -1
  51. package/dist/tools-logic/dashboard-export.js.map +1 -1
  52. package/dist/tools-logic/journal-capture.d.ts.map +1 -1
  53. package/dist/tools-logic/journal-capture.js +6 -1
  54. package/dist/tools-logic/journal-capture.js.map +1 -1
  55. package/dist/tools-logic/journal-read.js +1 -1
  56. package/dist/tools-logic/journal-read.js.map +1 -1
  57. package/dist/tools-logic/journal-search.d.ts.map +1 -1
  58. package/dist/tools-logic/journal-search.js +2 -1
  59. package/dist/tools-logic/journal-search.js.map +1 -1
  60. package/dist/types.d.ts +1 -1
  61. package/dist/types.js +1 -1
  62. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stager.js","sourceRoot":"","sources":["../../src/relevance/stager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export interface Candidate {
2
+ /** Unique id, e.g. "palace:goals/decisions.md" or "journal:2026-06-19.md". */
3
+ id: string;
4
+ source: "palace" | "journal" | "staging" | "correction";
5
+ /** Room slug for palace/staging sources; omitted otherwise. */
6
+ room?: string;
7
+ /** ≤ 80 chars. */
8
+ title: string;
9
+ /** ≤ 300 chars preview. */
10
+ snippet: string;
11
+ /** 0..1 (clamped). */
12
+ score: number;
13
+ /** One-line explanation for the Injector. */
14
+ why: string;
15
+ }
16
+ export interface SurfaceOptions {
17
+ topK?: number;
18
+ minScore?: number;
19
+ }
20
+ /**
21
+ * Surface up to `topK` candidates from a project relevant to `query`.
22
+ *
23
+ * Returns an EMPTY array when:
24
+ * • query is empty/whitespace (no signal to score against),
25
+ * • the project has no palace/journal yet (cold start), or
26
+ * • nothing clears `minScore` (silence is precision — better to surface
27
+ * nothing than to pollute context with low-confidence noise).
28
+ *
29
+ * The function is read-only and synchronous internally, but exposed as async to
30
+ * leave room for future remote/embedding backends without changing the surface
31
+ * (the Injector awaits it either way).
32
+ */
33
+ export declare function surface(project: string, query: string, opts?: SurfaceOptions): Promise<Candidate[]>;
34
+ //# sourceMappingURL=surfacer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfacer.d.ts","sourceRoot":"","sources":["../../src/relevance/surfacer.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,SAAS;IACxB,8EAA8E;IAC9E,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;IACxD,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA6BD;;;;;;;;;;;;GAYG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC,CAiLtB"}
@@ -0,0 +1,333 @@
1
+ /**
2
+ * Surfacer — local retrieval for the Ambient Relevance Loop (v3.5.0 P-B).
3
+ *
4
+ * Per spec §4.2 (Surface) + §5: cheap, fully-local retrieval over palace + journal
5
+ * + active corrections. Combines lexical overlap, room salience, and recency into
6
+ * a single score. Threshold-gated (silence is precision) and top-K capped.
7
+ *
8
+ * Zero cloud. Zero embeddings dependency. Returns Candidate[] with a `why` field
9
+ * the Injector uses to explain each surfaced memory.
10
+ */
11
+ import * as fs from "node:fs";
12
+ import * as path from "node:path";
13
+ import { listRooms } from "../palace/rooms.js";
14
+ import { listJournalFiles } from "../helpers/journal-files.js";
15
+ import { readActiveCorrections } from "../storage/corrections.js";
16
+ import { roomDir } from "../storage/paths.js";
17
+ import { readStaging } from "./stager.js";
18
+ // ---------------------------------------------------------------------------
19
+ // Tunables
20
+ // ---------------------------------------------------------------------------
21
+ const DEFAULT_TOP_K = 3;
22
+ /** SILENCE IS PRECISION — anything below this floor returns nothing. */
23
+ const DEFAULT_MIN_SCORE = 0.3;
24
+ /** Cap journal scan to keep latency bounded (spec §10: tens-of-ms budget). */
25
+ const JOURNAL_SCAN_CAP = 30;
26
+ /** Cap staging scan — staging holds this-session exchanges; small N is plenty. */
27
+ const STAGING_SCAN_CAP = 50;
28
+ /** Snippet budget for a staged exchange (user+assistant concat). */
29
+ const STAGING_SNIPPET_BUDGET = 400;
30
+ /** Bytes of file content to consider for token overlap. */
31
+ const PALACE_SNIPPET_BUDGET = 400;
32
+ const JOURNAL_SNIPPET_BUDGET = 400;
33
+ const SNIPPET_MAX_CHARS = 300;
34
+ const TITLE_MAX_CHARS = 80;
35
+ /** Correction surfacing — minimum lexical overlap before we surface. */
36
+ const CORRECTION_OVERLAP_MIN = 0.3;
37
+ /** Strong bonus added to the correction's surfaced score. */
38
+ const CORRECTION_SCORE_BONUS = 0.3;
39
+ // ---------------------------------------------------------------------------
40
+ // Surface
41
+ // ---------------------------------------------------------------------------
42
+ /**
43
+ * Surface up to `topK` candidates from a project relevant to `query`.
44
+ *
45
+ * Returns an EMPTY array when:
46
+ * • query is empty/whitespace (no signal to score against),
47
+ * • the project has no palace/journal yet (cold start), or
48
+ * • nothing clears `minScore` (silence is precision — better to surface
49
+ * nothing than to pollute context with low-confidence noise).
50
+ *
51
+ * The function is read-only and synchronous internally, but exposed as async to
52
+ * leave room for future remote/embedding backends without changing the surface
53
+ * (the Injector awaits it either way).
54
+ */
55
+ export async function surface(project, query, opts) {
56
+ // Empty-query guard FIRST — tokenOverlap of "" against anything is 0 anyway,
57
+ // but exiting early skips all the fs work for the no-signal case.
58
+ if (!query || query.trim() === "")
59
+ return [];
60
+ const topK = opts?.topK ?? DEFAULT_TOP_K;
61
+ const minScore = opts?.minScore ?? DEFAULT_MIN_SCORE;
62
+ const candidates = [];
63
+ // ── Palace topics ─────────────────────────────────────────────────────────
64
+ let rooms;
65
+ try {
66
+ rooms = listRooms(project);
67
+ }
68
+ catch {
69
+ rooms = [];
70
+ }
71
+ for (const room of rooms) {
72
+ let dir;
73
+ try {
74
+ dir = roomDir(project, room.slug);
75
+ }
76
+ catch {
77
+ continue; // bad slug — skip, never throw out of surface()
78
+ }
79
+ let topicFiles;
80
+ try {
81
+ topicFiles = fs.readdirSync(dir);
82
+ }
83
+ catch {
84
+ continue; // missing/unreadable room dir — skip
85
+ }
86
+ for (const file of topicFiles) {
87
+ if (!file.endsWith(".md"))
88
+ continue;
89
+ if (file === "README.md")
90
+ continue; // README is room scaffold, not a topic
91
+ const fullPath = path.join(dir, file);
92
+ let content;
93
+ try {
94
+ content = fs.readFileSync(fullPath, "utf-8").slice(0, PALACE_SNIPPET_BUDGET);
95
+ }
96
+ catch {
97
+ continue; // unreadable topic file — skip
98
+ }
99
+ const lex = tokenOverlap(query, `${room.name} ${file} ${content}`);
100
+ // Lexical gate FIRST — silence is precision. A room can be high-salience
101
+ // and freshly updated, but if zero query tokens match the topic, it is
102
+ // not relevant to THIS turn; surfacing it is exactly the context-flooding
103
+ // failure mode the spec warns against (§6). Salience/recency act only as
104
+ // tiebreakers among lex-matched candidates.
105
+ if (lex <= 0)
106
+ continue;
107
+ const sal = clamp01(room.salience ?? 0.5);
108
+ const rec = recencyBoost(room.updated);
109
+ const score = clamp01(lex * 0.5 + sal * 0.3 + rec * 0.2);
110
+ if (score >= minScore) {
111
+ candidates.push({
112
+ id: `palace:${room.slug}/${file}`,
113
+ source: "palace",
114
+ room: room.slug,
115
+ title: truncate(`${room.name} — ${file.replace(/\.md$/, "")}`, TITLE_MAX_CHARS),
116
+ snippet: truncate(content, SNIPPET_MAX_CHARS),
117
+ score,
118
+ why: `matched palace/${room.slug}`,
119
+ });
120
+ }
121
+ }
122
+ }
123
+ // ── Journals (recent only, exclude archive) ───────────────────────────────
124
+ let journals;
125
+ try {
126
+ journals = listJournalFiles(project, /* includeArchive */ false);
127
+ }
128
+ catch {
129
+ journals = [];
130
+ }
131
+ // Cap to keep latency bounded; listJournalFiles already sorts newest-first.
132
+ const recentJournals = journals.slice(0, JOURNAL_SCAN_CAP);
133
+ for (const j of recentJournals) {
134
+ const fullPath = path.join(j.dir, j.file);
135
+ let content;
136
+ try {
137
+ content = fs.readFileSync(fullPath, "utf-8").slice(0, JOURNAL_SNIPPET_BUDGET);
138
+ }
139
+ catch {
140
+ continue;
141
+ }
142
+ const lex = tokenOverlap(query, content);
143
+ // Same lex-gate as palace topics — a recent journal with zero query overlap
144
+ // is not "relevant", it is just new. recency * 0.4 alone clears 0.3 and
145
+ // would flood every turn with the latest entry; gate it.
146
+ if (lex <= 0)
147
+ continue;
148
+ const rec = recencyBoost(j.date);
149
+ const score = clamp01(lex * 0.6 + rec * 0.4);
150
+ if (score >= minScore) {
151
+ candidates.push({
152
+ id: `journal:${j.file}`,
153
+ source: "journal",
154
+ title: truncate(`journal ${j.date}`, TITLE_MAX_CHARS),
155
+ snippet: truncate(content, SNIPPET_MAX_CHARS),
156
+ score,
157
+ why: `matched recent journal ${j.date}`,
158
+ });
159
+ }
160
+ }
161
+ // ── Staging (this-session exchanges, pre-promote) ────────────────────────
162
+ // Per spec §4.4: "Staging is itself retrievable by Surface (so this-session
163
+ // content is recallable before promotion)". Without this branch, anything
164
+ // captured by hook-stop in the current session is invisible to Surface
165
+ // until session_end fires Promote — which defeats the read-after-write
166
+ // contract the spec promises. We score these the same way as journals
167
+ // (lex + recency) but skip the salience term (staged entries don't live
168
+ // in a room yet) and gate them on the same lex floor (silence is
169
+ // precision; a staged "ok thanks" must not surface). The Candidate.source
170
+ // is "staging" so the Injector / dashboard can distinguish them from
171
+ // promoted journal hits.
172
+ let staged;
173
+ try {
174
+ staged = readStaging(project, STAGING_SCAN_CAP);
175
+ }
176
+ catch {
177
+ staged = [];
178
+ }
179
+ for (const ex of staged) {
180
+ // Concatenate the human-readable fields so token overlap considers both
181
+ // sides of the exchange. tool_calls are intentionally excluded — their
182
+ // args_summary is JSON noise that would inflate the token set without
183
+ // adding semantic content.
184
+ const text = `${ex.user ?? ""} ${ex.assistant ?? ""}`
185
+ .trim()
186
+ .slice(0, STAGING_SNIPPET_BUDGET);
187
+ if (!text)
188
+ continue; // tool-only turn — nothing to score against
189
+ const lex = tokenOverlap(query, text);
190
+ // Same lex-gate as palace topics / journals — silence is precision.
191
+ // A freshly-staged exchange with zero query overlap is not relevant to
192
+ // THIS turn; surfacing it would flood context with chitchat the
193
+ // Promoter is about to discard anyway.
194
+ if (lex <= 0)
195
+ continue;
196
+ const rec = recencyBoost(ex.ts);
197
+ // Weight identical to journals (lex 0.6 + rec 0.4) — staging IS journal
198
+ // material that just hasn't been promoted yet. Keeping weights aligned
199
+ // means a staged-then-promoted entry's score doesn't visibly jump.
200
+ const score = clamp01(lex * 0.6 + rec * 0.4);
201
+ if (score >= minScore) {
202
+ // Title: ISO timestamp + first ~40 chars of the text so the candidate
203
+ // is identifiable to the agent even before it gets a real slug.
204
+ const head = text.replace(/\s+/g, " ").slice(0, TITLE_MAX_CHARS - 25);
205
+ candidates.push({
206
+ // Use the ts as the id — ts is unique-enough within a project (one
207
+ // line per exchange) and stable across reads. Tail with `staging:`
208
+ // prefix so per_source bucketing in precision.ts groups them.
209
+ id: `staging:${ex.ts}`,
210
+ source: "staging",
211
+ title: truncate(`staging ${ex.ts.slice(0, 19)} — ${head}`, TITLE_MAX_CHARS),
212
+ snippet: truncate(text, SNIPPET_MAX_CHARS),
213
+ score,
214
+ why: `matched current-session staging`,
215
+ });
216
+ }
217
+ }
218
+ // ── Active corrections — strong bonus when query overlaps the rule ───────
219
+ let corrections;
220
+ try {
221
+ corrections = readActiveCorrections(project);
222
+ }
223
+ catch {
224
+ corrections = [];
225
+ }
226
+ for (const c of corrections) {
227
+ const overlap = tokenOverlap(query, c.rule || "");
228
+ if (overlap >= CORRECTION_OVERLAP_MIN) {
229
+ const score = clamp01(overlap + CORRECTION_SCORE_BONUS);
230
+ candidates.push({
231
+ id: `correction:${c.id}`,
232
+ source: "correction",
233
+ title: truncate(c.rule || c.id, TITLE_MAX_CHARS),
234
+ snippet: truncate(c.context || c.rule || "", SNIPPET_MAX_CHARS),
235
+ score,
236
+ why: "matches active correction",
237
+ });
238
+ }
239
+ }
240
+ return candidates.sort((a, b) => b.score - a.score).slice(0, topK);
241
+ }
242
+ // ---------------------------------------------------------------------------
243
+ // Helpers (inline — only used by Surfacer)
244
+ // ---------------------------------------------------------------------------
245
+ /**
246
+ * Lexical overlap between two strings.
247
+ *
248
+ * Tokens: lowercase alphanum/CJK runs of length ≥ 4. Ratio is
249
+ * |aTokens ∩ bTokens| / max(|aTokens|, |bTokens|, 1)
250
+ * so a tiny query that fully matches a long doc still scores high, and the
251
+ * `max(..., 1)` guard keeps the empty-set case at 0 instead of NaN.
252
+ *
253
+ * Visible for testing — kept narrow (no synonym expansion, no stemming) because
254
+ * Surfacer is the FIRST pass; the agent's own model is the final relevance
255
+ * judge (spec §4.2 "Judge").
256
+ */
257
+ function tokenOverlap(a, b) {
258
+ const aTokens = tokenize(a);
259
+ const bTokens = tokenize(b);
260
+ if (aTokens.size === 0 || bTokens.size === 0)
261
+ return 0;
262
+ let intersect = 0;
263
+ // Iterate the smaller set for cheaper lookups.
264
+ const [smaller, larger] = aTokens.size <= bTokens.size ? [aTokens, bTokens] : [bTokens, aTokens];
265
+ for (const t of smaller) {
266
+ if (larger.has(t))
267
+ intersect++;
268
+ }
269
+ const denom = Math.max(aTokens.size, bTokens.size, 1);
270
+ return intersect / denom;
271
+ }
272
+ function tokenize(s) {
273
+ const out = new Set();
274
+ if (!s)
275
+ return out;
276
+ // Split on anything that is not alphanumeric (ASCII only — keeps the helper
277
+ // lean; the broader vector pipeline handles CJK).
278
+ const parts = s.toLowerCase().split(/[^a-z0-9]+/);
279
+ for (const p of parts) {
280
+ if (p.length >= 4)
281
+ out.add(p);
282
+ }
283
+ return out;
284
+ }
285
+ /**
286
+ * Recency boost for a YYYY-MM-DD or ISO date string.
287
+ *
288
+ * < 7 days → 1.0
289
+ * < 30 days → 0.6
290
+ * < 180 days→ 0.2
291
+ * else → 0
292
+ *
293
+ * Threshold ordering is high → low (worker done-definition rule 3). Any
294
+ * unparseable input (NaN) returns 0 — never throws.
295
+ */
296
+ function recencyBoost(dateStr) {
297
+ if (!dateStr)
298
+ return 0;
299
+ const dt = new Date(dateStr);
300
+ const t = dt.getTime();
301
+ if (isNaN(t))
302
+ return 0;
303
+ const ageMs = Date.now() - t;
304
+ if (ageMs < 0) {
305
+ // Future-dated entries (e.g. clock drift, fixture data). Treat as "very
306
+ // recent" rather than NaN/0 so they still rank — but cap at 1.0.
307
+ return 1.0;
308
+ }
309
+ const days = ageMs / (24 * 60 * 60 * 1000);
310
+ // High threshold first so we never return the lower bucket for a recent doc.
311
+ if (days < 7)
312
+ return 1.0;
313
+ if (days < 30)
314
+ return 0.6;
315
+ if (days < 180)
316
+ return 0.2;
317
+ return 0;
318
+ }
319
+ function clamp01(n) {
320
+ if (isNaN(n))
321
+ return 0;
322
+ if (n < 0)
323
+ return 0;
324
+ if (n > 1)
325
+ return 1;
326
+ return n;
327
+ }
328
+ function truncate(s, n) {
329
+ if (!s)
330
+ return "";
331
+ return s.length <= n ? s : s.slice(0, n);
332
+ }
333
+ //# sourceMappingURL=surfacer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surfacer.js","sourceRoot":"","sources":["../../src/relevance/surfacer.ts"],"names":[],"mappings":"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"}
@@ -20,8 +20,13 @@ export declare function sanitizeProject(project: string): string;
20
20
  export declare function journalDir(project: string): string;
21
21
  /**
22
22
  * Find all journal directories for a project (new + legacy fallback).
23
+ *
24
+ * @param includeArchive — when true, includes journal/archive/ so recall
25
+ * and backlink resolution can reach rollup-archived entries (P0-2 fix).
26
+ * Defaults to false so counting paths (session_start, dashboard_export)
27
+ * don't inflate session counts with archived entries (v3.4.26 fix).
23
28
  */
24
- export declare function journalDirs(project: string): string[];
29
+ export declare function journalDirs(project: string, includeArchive?: boolean): string[];
25
30
  /**
26
31
  * Resolve the palace directory for a project.
27
32
  */
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOvD;AAaD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAoCrD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOvD;AAaD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,UAAQ,GAAG,MAAM,EAAE,CAqC7E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
@@ -47,19 +47,25 @@ export function journalDir(project) {
47
47
  }
48
48
  /**
49
49
  * Find all journal directories for a project (new + legacy fallback).
50
+ *
51
+ * @param includeArchive — when true, includes journal/archive/ so recall
52
+ * and backlink resolution can reach rollup-archived entries (P0-2 fix).
53
+ * Defaults to false so counting paths (session_start, dashboard_export)
54
+ * don't inflate session counts with archived entries (v3.4.26 fix).
50
55
  */
51
- export function journalDirs(project) {
56
+ export function journalDirs(project, includeArchive = false) {
52
57
  const dirs = [];
53
58
  const primary = journalDir(project);
54
59
  if (fs.existsSync(primary))
55
60
  dirs.push(primary);
56
61
  // Archive: journal/archive/ holds entries moved by journalRollup.
57
- // Including it here makes all downstream readers (listJournalFiles,
58
- // readJournalFile, readRecentCaptures, smartRecall) automatically
59
- // traverse archived entries — no per-reader changes needed.
60
- const archiveDir = path.join(primary, "archive");
61
- if (fs.existsSync(archiveDir))
62
- dirs.push(archiveDir);
62
+ // Only included when caller explicitly requests it (recall, readJournalFile,
63
+ // journalSearch). Excluded by default so session counting doesn't inflate.
64
+ if (includeArchive) {
65
+ const archiveDir = path.join(primary, "archive");
66
+ if (fs.existsSync(archiveDir))
67
+ dirs.push(archiveDir);
68
+ }
63
69
  // Legacy: ~/.claude/projects/*/memory/journal/
64
70
  const legacyRoot = getLegacyRoot();
65
71
  if (fs.existsSync(legacyRoot)) {
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,18 @@
2
2
  * Project detection and listing.
3
3
  */
4
4
  import type { ProjectInfo } from "../types.js";
5
+ /**
6
+ * Validate whether a string is a legitimate project slug.
7
+ *
8
+ * Returns `false` for:
9
+ * - UUIDs (8-4-4-4-12 hex)
10
+ * - `.md` suffix
11
+ * - `_` prefix (internal / archive dirs)
12
+ * - Generic words on the deny-list
13
+ * - Path traversal artifacts (`..`, `/`, `\`)
14
+ * - Strings without any letter
15
+ */
16
+ export declare function isValidProjectSlug(slug: string): boolean;
5
17
  /**
6
18
  * Auto-detect project slug from environment, git, or cwd.
7
19
  * No caching — each call re-detects from the current environment.
@@ -16,6 +28,11 @@ export declare function detectProject(): Promise<string>;
16
28
  * same directory route correctly without needing the explicit slug. This is
17
29
  * the migration path for existing projects — the allowlist fills itself over
18
30
  * normal use.
31
+ *
32
+ * Slug validation: if an explicit slug fails `isValidProjectSlug()` AND no
33
+ * project directory already exists for it, resolution throws — preventing
34
+ * garbage slugs from creating new directories. Existing (already-on-disk)
35
+ * invalid slugs still resolve so reads of legacy data don't break.
19
36
  */
20
37
  export declare function resolveProject(project: string | undefined): Promise<string>;
21
38
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/storage/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAa/C;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CA+ErD;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAWjF;AAaD;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAuD/C"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/storage/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAwB/C;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAyBxD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CA+ErD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCjF;AAaD;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAuD/C"}
@@ -15,6 +15,52 @@ const BLOCKED_SLUGS = new Set([
15
15
  "Downloads", "Projects", "default", "Documents", "Desktop",
16
16
  "tmp", "node_modules", "dist", "src", ".aam", "phase-1",
17
17
  ]);
18
+ // ── Slug validation ──────────────────────────────────────────────────────────
19
+ /**
20
+ * Deny-list of generic words that are clearly not project names.
21
+ * Checked case-insensitively.
22
+ */
23
+ const SLUG_DENY_LIST = new Set([
24
+ "build", "runtime", "palace", "mcp", "default",
25
+ "phase-1", "monitor", "test",
26
+ ]);
27
+ /**
28
+ * Validate whether a string is a legitimate project slug.
29
+ *
30
+ * Returns `false` for:
31
+ * - UUIDs (8-4-4-4-12 hex)
32
+ * - `.md` suffix
33
+ * - `_` prefix (internal / archive dirs)
34
+ * - Generic words on the deny-list
35
+ * - Path traversal artifacts (`..`, `/`, `\`)
36
+ * - Strings without any letter
37
+ */
38
+ export function isValidProjectSlug(slug) {
39
+ if (!slug)
40
+ return false;
41
+ // Reject UUIDs (8-4-4-4-12 hex pattern)
42
+ if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(slug))
43
+ return false;
44
+ // Reject .md suffix
45
+ if (slug.endsWith(".md"))
46
+ return false;
47
+ // Reject _ prefix (internal/archive dirs)
48
+ if (slug.startsWith("_"))
49
+ return false;
50
+ // Reject . prefix (hidden dirs like .DS_Store, .aam)
51
+ if (slug.startsWith("."))
52
+ return false;
53
+ // Reject deny-listed generic words
54
+ if (SLUG_DENY_LIST.has(slug.toLowerCase()))
55
+ return false;
56
+ // Reject path traversal artifacts
57
+ if (slug.includes("..") || slug.includes("/") || slug.includes("\\"))
58
+ return false;
59
+ // Must contain at least one letter
60
+ if (!/[a-zA-Z]/.test(slug))
61
+ return false;
62
+ return true;
63
+ }
18
64
  /**
19
65
  * Auto-detect project slug from environment, git, or cwd.
20
66
  * No caching — each call re-detects from the current environment.
@@ -110,10 +156,36 @@ export async function detectProject() {
110
156
  * same directory route correctly without needing the explicit slug. This is
111
157
  * the migration path for existing projects — the allowlist fills itself over
112
158
  * normal use.
159
+ *
160
+ * Slug validation: if an explicit slug fails `isValidProjectSlug()` AND no
161
+ * project directory already exists for it, resolution throws — preventing
162
+ * garbage slugs from creating new directories. Existing (already-on-disk)
163
+ * invalid slugs still resolve so reads of legacy data don't break.
113
164
  */
114
165
  export async function resolveProject(project) {
115
166
  if (!project || project === "auto") {
116
- return await detectProject();
167
+ const detected = await detectProject();
168
+ // Gate: block auto-detected slugs from creating new dirs if invalid
169
+ if (!isValidProjectSlug(detected)) {
170
+ const projectDir = path.join(getRoot(), "projects", detected);
171
+ if (!fs.existsSync(projectDir)) {
172
+ throw new Error(`Auto-detected project slug "${detected}" is invalid (UUID, system dir, or deny-listed). ` +
173
+ `Set AGENT_RECALL_PROJECT env var or pass project explicitly.`);
174
+ }
175
+ // Existing dir — allow read but don't register into allowlist
176
+ }
177
+ return detected;
178
+ }
179
+ // Explicit slug: validate before allowing new directory creation
180
+ if (!isValidProjectSlug(project)) {
181
+ const projectDir = path.join(getRoot(), "projects", project);
182
+ if (!fs.existsSync(projectDir)) {
183
+ throw new Error(`Invalid project slug "${project}". Slugs must contain at least one letter ` +
184
+ `and cannot be UUIDs, end with .md, start with _, or be a reserved word ` +
185
+ `(${[...SLUG_DENY_LIST].join(", ")}).`);
186
+ }
187
+ // Existing dir — allow resolution for backward compat but skip allowlist registration
188
+ return project;
117
189
  }
118
190
  try {
119
191
  const { addCwdToAllowlist } = await import("./cwd-allowlist.js");
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/storage/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/storage/project.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"context-synthesize.d.ts","sourceRoot":"","sources":["../../src/tools-logic/context-synthesize.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;IACpD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA4KvG"}
1
+ {"version":3,"file":"context-synthesize.d.ts","sourceRoot":"","sources":["../../src/tools-logic/context-synthesize.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;IACpD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA6KvG"}