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.
- package/dist/helpers/journal-files.d.ts +1 -1
- package/dist/helpers/journal-files.d.ts.map +1 -1
- package/dist/helpers/journal-files.js +4 -3
- package/dist/helpers/journal-files.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/palace/awareness.d.ts.map +1 -1
- package/dist/palace/awareness.js +6 -2
- package/dist/palace/awareness.js.map +1 -1
- package/dist/palace/compress.d.ts.map +1 -1
- package/dist/palace/compress.js +30 -5
- package/dist/palace/compress.js.map +1 -1
- package/dist/palace/rooms.d.ts.map +1 -1
- package/dist/palace/rooms.js +13 -1
- package/dist/palace/rooms.js.map +1 -1
- package/dist/relevance/injector.d.ts +51 -0
- package/dist/relevance/injector.d.ts.map +1 -0
- package/dist/relevance/injector.js +121 -0
- package/dist/relevance/injector.js.map +1 -0
- package/dist/relevance/precision.d.ts +109 -0
- package/dist/relevance/precision.d.ts.map +1 -0
- package/dist/relevance/precision.js +279 -0
- package/dist/relevance/precision.js.map +1 -0
- package/dist/relevance/promoter.d.ts +60 -0
- package/dist/relevance/promoter.d.ts.map +1 -0
- package/dist/relevance/promoter.js +336 -0
- package/dist/relevance/promoter.js.map +1 -0
- package/dist/relevance/stager.d.ts +61 -0
- package/dist/relevance/stager.d.ts.map +1 -0
- package/dist/relevance/stager.js +251 -0
- package/dist/relevance/stager.js.map +1 -0
- package/dist/relevance/surfacer.d.ts +34 -0
- package/dist/relevance/surfacer.d.ts.map +1 -0
- package/dist/relevance/surfacer.js +333 -0
- package/dist/relevance/surfacer.js.map +1 -0
- package/dist/storage/paths.d.ts +6 -1
- package/dist/storage/paths.d.ts.map +1 -1
- package/dist/storage/paths.js +13 -7
- package/dist/storage/paths.js.map +1 -1
- package/dist/storage/project.d.ts +17 -0
- package/dist/storage/project.d.ts.map +1 -1
- package/dist/storage/project.js +73 -1
- package/dist/storage/project.js.map +1 -1
- package/dist/tools-logic/context-synthesize.d.ts.map +1 -1
- package/dist/tools-logic/context-synthesize.js +2 -1
- package/dist/tools-logic/context-synthesize.js.map +1 -1
- package/dist/tools-logic/dashboard-export.d.ts.map +1 -1
- package/dist/tools-logic/dashboard-export.js +13 -1
- package/dist/tools-logic/dashboard-export.js.map +1 -1
- package/dist/tools-logic/journal-capture.d.ts.map +1 -1
- package/dist/tools-logic/journal-capture.js +6 -1
- package/dist/tools-logic/journal-capture.js.map +1 -1
- package/dist/tools-logic/journal-read.js +1 -1
- package/dist/tools-logic/journal-read.js.map +1 -1
- package/dist/tools-logic/journal-search.d.ts.map +1 -1
- package/dist/tools-logic/journal-search.js +2 -1
- package/dist/tools-logic/journal-search.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- 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":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA2B1C,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,wEAAwE;AACxE,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,8EAA8E;AAC9E,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,kFAAkF;AAClF,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,oEAAoE;AACpE,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,2DAA2D;AAC3D,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,wEAAwE;AACxE,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,6DAA6D;AAC7D,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,OAAe,EACf,KAAa,EACb,IAAqB;IAErB,6EAA6E;IAC7E,kEAAkE;IAClE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAE7C,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,aAAa,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,iBAAiB,CAAC;IACrD,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,6EAA6E;IAC7E,IAAI,KAAmC,CAAC;IACxC,IAAI,CAAC;QACH,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,EAAE,CAAC;IACb,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,gDAAgD;QAC5D,CAAC;QACD,IAAI,UAAoB,CAAC;QACzB,IAAI,CAAC;YACH,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,qCAAqC;QACjD,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpC,IAAI,IAAI,KAAK,WAAW;gBAAE,SAAS,CAAC,uCAAuC;YAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACtC,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;YAC/E,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,CAAC,+BAA+B;YAC3C,CAAC;YACD,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;YACnE,yEAAyE;YACzE,uEAAuE;YACvE,0EAA0E;YAC1E,yEAAyE;YACzE,4CAA4C;YAC5C,IAAI,GAAG,IAAI,CAAC;gBAAE,SAAS;YACvB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YACzD,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;gBACtB,UAAU,CAAC,IAAI,CAAC;oBACd,EAAE,EAAE,UAAU,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;oBACjC,MAAM,EAAE,QAAQ;oBAChB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC;oBAC/E,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;oBAC7C,KAAK;oBACL,GAAG,EAAE,kBAAkB,IAAI,CAAC,IAAI,EAAE;iBACnC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,IAAI,QAA6C,CAAC;IAClD,IAAI,CAAC;QACH,QAAQ,GAAG,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,EAAE,CAAC;IAChB,CAAC;IACD,4EAA4E;IAC5E,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC3D,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;QAChF,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACzC,4EAA4E;QAC5E,wEAAwE;QACxE,yDAAyD;QACzD,IAAI,GAAG,IAAI,CAAC;YAAE,SAAS;QACvB,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAC7C,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC;gBACd,EAAE,EAAE,WAAW,CAAC,CAAC,IAAI,EAAE;gBACvB,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC;gBACrD,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;gBAC7C,KAAK;gBACL,GAAG,EAAE,0BAA0B,CAAC,CAAC,IAAI,EAAE;aACxC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,4EAA4E;IAC5E,0EAA0E;IAC1E,uEAAuE;IACvE,uEAAuE;IACvE,sEAAsE;IACtE,wEAAwE;IACxE,iEAAiE;IACjE,0EAA0E;IAC1E,qEAAqE;IACrE,yBAAyB;IACzB,IAAI,MAAsC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,EAAE,CAAC;IACd,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,wEAAwE;QACxE,uEAAuE;QACvE,sEAAsE;QACtE,2BAA2B;QAC3B,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,SAAS,IAAI,EAAE,EAAE;aAClD,IAAI,EAAE;aACN,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI;YAAE,SAAS,CAAC,4CAA4C;QACjE,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACtC,oEAAoE;QACpE,uEAAuE;QACvE,gEAAgE;QAChE,uCAAuC;QACvC,IAAI,GAAG,IAAI,CAAC;YAAE,SAAS;QACvB,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAChC,wEAAwE;QACxE,uEAAuE;QACvE,mEAAmE;QACnE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAC7C,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;YACtB,sEAAsE;YACtE,gEAAgE;YAChE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,GAAG,EAAE,CAAC,CAAC;YACtE,UAAU,CAAC,IAAI,CAAC;gBACd,mEAAmE;gBACnE,mEAAmE;gBACnE,8DAA8D;gBAC9D,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE;gBACtB,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,EAAE,EAAE,eAAe,CAAC;gBAC3E,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;gBAC1C,KAAK;gBACL,GAAG,EAAE,iCAAiC;aACvC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,IAAI,WAAqD,CAAC;IAC1D,IAAI,CAAC;QACH,WAAW,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,GAAG,EAAE,CAAC;IACnB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAClD,IAAI,OAAO,IAAI,sBAAsB,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,GAAG,sBAAsB,CAAC,CAAC;YACxD,UAAU,CAAC,IAAI,CAAC;gBACd,EAAE,EAAE,cAAc,CAAC,CAAC,EAAE,EAAE;gBACxB,MAAM,EAAE,YAAY;gBACpB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE,eAAe,CAAC;gBAChD,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,iBAAiB,CAAC;gBAC/D,KAAK;gBACL,GAAG,EAAE,2BAA2B;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,SAAS,YAAY,CAAC,CAAS,EAAE,CAAS;IACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACvD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,+CAA+C;IAC/C,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjG,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS,EAAE,CAAC;IACjC,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtD,OAAO,SAAS,GAAG,KAAK,CAAC;AAC3B,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,IAAI,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACnB,4EAA4E;IAC5E,kDAAkD;IAClD,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,YAAY,CAAC,OAAkC;IACtD,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IACvB,IAAI,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,wEAAwE;QACxE,iEAAiE;QACjE,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,6EAA6E;IAC7E,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACzB,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC;IAC1B,IAAI,IAAI,GAAG,GAAG;QAAE,OAAO,GAAG,CAAC;IAC3B,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,IAAI,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACvB,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACpC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|
package/dist/storage/paths.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/storage/paths.js
CHANGED
|
@@ -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
|
-
//
|
|
58
|
-
//
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;SAChC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjB,OAAO,IAAI,IAAI,SAAS,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,QAAgB,EAAE,IAAY,EAAE,OAAe;IACvE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;IACrE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED
|
|
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;
|
|
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"}
|
package/dist/storage/project.js
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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"}
|