hippo-memory 1.14.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/README.md +862 -861
  2. package/dist/audit.d.ts +1 -1
  3. package/dist/audit.d.ts.map +1 -1
  4. package/dist/audit.js.map +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +1594 -229
  7. package/dist/cli.js.map +1 -1
  8. package/dist/customer-notes.d.ts +95 -0
  9. package/dist/customer-notes.d.ts.map +1 -0
  10. package/dist/customer-notes.js +296 -0
  11. package/dist/customer-notes.js.map +1 -0
  12. package/dist/db.d.ts.map +1 -1
  13. package/dist/db.js +1286 -472
  14. package/dist/db.js.map +1 -1
  15. package/dist/decisions.d.ts +91 -0
  16. package/dist/decisions.d.ts.map +1 -0
  17. package/dist/decisions.js +278 -0
  18. package/dist/decisions.js.map +1 -0
  19. package/dist/graph-extract.d.ts +39 -0
  20. package/dist/graph-extract.d.ts.map +1 -0
  21. package/dist/graph-extract.js +141 -0
  22. package/dist/graph-extract.js.map +1 -0
  23. package/dist/graph-recall.d.ts +41 -0
  24. package/dist/graph-recall.d.ts.map +1 -0
  25. package/dist/graph-recall.js +246 -0
  26. package/dist/graph-recall.js.map +1 -0
  27. package/dist/graph.d.ts +137 -0
  28. package/dist/graph.d.ts.map +1 -0
  29. package/dist/graph.js +433 -0
  30. package/dist/graph.js.map +1 -0
  31. package/dist/incidents.d.ts +100 -0
  32. package/dist/incidents.d.ts.map +1 -0
  33. package/dist/incidents.js +322 -0
  34. package/dist/incidents.js.map +1 -0
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/memory.d.ts +6 -0
  40. package/dist/memory.d.ts.map +1 -1
  41. package/dist/memory.js +6 -0
  42. package/dist/memory.js.map +1 -1
  43. package/dist/policies.d.ts +149 -0
  44. package/dist/policies.d.ts.map +1 -0
  45. package/dist/policies.js +380 -0
  46. package/dist/policies.js.map +1 -0
  47. package/dist/processes.d.ts +104 -0
  48. package/dist/processes.d.ts.map +1 -0
  49. package/dist/processes.js +330 -0
  50. package/dist/processes.js.map +1 -0
  51. package/dist/project-briefs.d.ts +126 -0
  52. package/dist/project-briefs.d.ts.map +1 -0
  53. package/dist/project-briefs.js +453 -0
  54. package/dist/project-briefs.js.map +1 -0
  55. package/dist/search.d.ts +7 -0
  56. package/dist/search.d.ts.map +1 -1
  57. package/dist/search.js.map +1 -1
  58. package/dist/server.d.ts.map +1 -1
  59. package/dist/server.js +1181 -8
  60. package/dist/server.js.map +1 -1
  61. package/dist/skills.d.ts +98 -0
  62. package/dist/skills.d.ts.map +1 -0
  63. package/dist/skills.js +339 -0
  64. package/dist/skills.js.map +1 -0
  65. package/dist/src/audit.js.map +1 -1
  66. package/dist/src/cli.js +1594 -229
  67. package/dist/src/cli.js.map +1 -1
  68. package/dist/src/customer-notes.js +296 -0
  69. package/dist/src/customer-notes.js.map +1 -0
  70. package/dist/src/db.js +1286 -472
  71. package/dist/src/db.js.map +1 -1
  72. package/dist/src/decisions.js +278 -0
  73. package/dist/src/decisions.js.map +1 -0
  74. package/dist/src/graph-extract.js +141 -0
  75. package/dist/src/graph-extract.js.map +1 -0
  76. package/dist/src/graph-recall.js +246 -0
  77. package/dist/src/graph-recall.js.map +1 -0
  78. package/dist/src/graph.js +433 -0
  79. package/dist/src/graph.js.map +1 -0
  80. package/dist/src/incidents.js +322 -0
  81. package/dist/src/incidents.js.map +1 -0
  82. package/dist/src/index.js +1 -0
  83. package/dist/src/index.js.map +1 -1
  84. package/dist/src/memory.js +6 -0
  85. package/dist/src/memory.js.map +1 -1
  86. package/dist/src/policies.js +380 -0
  87. package/dist/src/policies.js.map +1 -0
  88. package/dist/src/processes.js +330 -0
  89. package/dist/src/processes.js.map +1 -0
  90. package/dist/src/project-briefs.js +453 -0
  91. package/dist/src/project-briefs.js.map +1 -0
  92. package/dist/src/search.js.map +1 -1
  93. package/dist/src/server.js +1181 -8
  94. package/dist/src/server.js.map +1 -1
  95. package/dist/src/skills.js +339 -0
  96. package/dist/src/skills.js.map +1 -0
  97. package/dist/src/version.js +1 -1
  98. package/dist/src/version.js.map +1 -1
  99. package/dist/version.d.ts +1 -1
  100. package/dist/version.d.ts.map +1 -1
  101. package/dist/version.js +1 -1
  102. package/dist/version.js.map +1 -1
  103. package/extensions/openclaw-plugin/openclaw.plugin.json +46 -46
  104. package/extensions/openclaw-plugin/package.json +14 -14
  105. package/openclaw.plugin.json +45 -45
  106. package/package.json +75 -75
@@ -0,0 +1,453 @@
1
+ /**
2
+ * E2 project_brief first-class object
3
+ * (docs/plans/2026-05-30-e2-project-brief-object.md).
4
+ *
5
+ * A `project_brief` is the living, repo-scoped summary of a repository's state: a
6
+ * `summary` body scoped to a `repo`, evolving via the supersede delta lifecycle.
7
+ * "Auto-refreshes from receipts" is scoped to a DETERMINISTIC (no-LLM) assembler:
8
+ * `refreshBrief` gathers the repo's recent receipts (memory rows tagged
9
+ * `path:<repo>`) and assembles them into the brief body. The distinguishing
10
+ * capability is therefore the refresh assembler (analog of skill's export
11
+ * renderer), not an LLM/async pipeline (deferred).
12
+ *
13
+ * Reuses the skill/process supersede machinery verbatim (superseded_by self-FK +
14
+ * CAS + INSERT-preflight + server-derived version + change_summary + supersede
15
+ * tenant-match trigger). It DROPS skill's `skill_name`/`trigger_text` and ADDS
16
+ * `repo` (the repo-scoping dimension) + `summary` (the brief body).
17
+ *
18
+ * The `project_briefs` table is the source of truth (survives memory decay); the
19
+ * memory mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
20
+ *
21
+ * Lifecycle: active -> superseded (a newer version replaces it) or active ->
22
+ * closed (retired).
23
+ */
24
+ import { openHippoDb, closeHippoDb } from './db.js';
25
+ import { writeEntry, assertTenantId } from './store.js';
26
+ import { createMemory, Layer, PROJECT_BRIEF_HALF_LIFE_DAYS } from './memory.js';
27
+ import { appendAuditEvent } from './audit.js';
28
+ export const VALID_BRIEF_STATES = new Set([
29
+ 'active',
30
+ 'superseded',
31
+ 'closed',
32
+ ]);
33
+ /** Field caps (untrusted at the HTTP/SDK boundary). summary is a body, so a larger
34
+ * cap than the 4096 short-field convention. */
35
+ export const MAX_REPO_LEN = 256;
36
+ export const MAX_BRIEF_SUMMARY_LEN = 8192;
37
+ export const MAX_CHANGE_SUMMARY_LEN = 4096;
38
+ /** Bound the receipts gathered per refresh (a refresh reads memories; cap the scan
39
+ * + the rendered body). Realistic repos have far fewer recent receipts than this. */
40
+ export const MAX_BRIEF_RECEIPTS = 50;
41
+ /** Truncate each receipt's headline in the assembled digest. */
42
+ export const MAX_RECEIPT_HEADLINE_LEN = 200;
43
+ // ---------------------------------------------------------------------------
44
+ // Validation
45
+ // ---------------------------------------------------------------------------
46
+ /**
47
+ * Validate + normalise brief fields. `repo` is trimmed and MUST be a single line
48
+ * (no newlines): it becomes a path tag on the refresh match AND an H1 heading in
49
+ * the assembled digest. `summary` is kept verbatim (operator content) but capped.
50
+ * Returns the normalised repo.
51
+ */
52
+ function validateBriefFields(repo, summary, changeSummary) {
53
+ const normalizedRepo = (repo ?? '').trim();
54
+ if (normalizedRepo.length === 0)
55
+ throw new Error('saveProjectBrief: repo is required');
56
+ if (/[\r\n]/.test(normalizedRepo)) {
57
+ throw new Error('saveProjectBrief: repo must be a single line (no newlines)');
58
+ }
59
+ if (normalizedRepo.length > MAX_REPO_LEN) {
60
+ throw new Error(`saveProjectBrief: repo exceeds the ${MAX_REPO_LEN}-char cap`);
61
+ }
62
+ if (!summary || summary.trim().length === 0) {
63
+ throw new Error('saveProjectBrief: summary is required');
64
+ }
65
+ if (summary.length > MAX_BRIEF_SUMMARY_LEN) {
66
+ throw new Error(`saveProjectBrief: summary exceeds the ${MAX_BRIEF_SUMMARY_LEN}-char cap`);
67
+ }
68
+ if (changeSummary !== undefined && changeSummary.length > MAX_CHANGE_SUMMARY_LEN) {
69
+ throw new Error(`saveProjectBrief: changeSummary exceeds the ${MAX_CHANGE_SUMMARY_LEN}-char cap`);
70
+ }
71
+ return { repo: normalizedRepo };
72
+ }
73
+ function rowToProjectBrief(row) {
74
+ return {
75
+ id: row.id,
76
+ memoryId: row.memory_id,
77
+ tenantId: row.tenant_id,
78
+ repo: row.repo,
79
+ summary: row.summary,
80
+ version: row.version,
81
+ status: row.status,
82
+ supersededBy: row.superseded_by,
83
+ supersededAt: row.superseded_at,
84
+ changeSummary: row.change_summary,
85
+ closedAt: row.closed_at,
86
+ createdAt: row.created_at,
87
+ };
88
+ }
89
+ const BRIEF_COLS = `
90
+ id, memory_id, tenant_id, repo, summary, version, status,
91
+ superseded_by, superseded_at, change_summary, closed_at, created_at
92
+ `;
93
+ /** Recall-surface content for the memory mirror: repo + summary. Named (mirrors
94
+ * buildSkillContent) so the recall surface is deterministic + unit-testable. */
95
+ function buildBriefContent(repo, summary) {
96
+ return `${repo}\n\n${summary}`;
97
+ }
98
+ // ---------------------------------------------------------------------------
99
+ // Public API
100
+ // ---------------------------------------------------------------------------
101
+ /**
102
+ * Create a project_brief (or a new version that supersedes an existing one). Writes
103
+ * the memory mirror + the project_briefs row atomically inside writeEntry's
104
+ * SAVEPOINT. When supersedesBriefId is given, the referenced ACTIVE row is
105
+ * preflighted (status + version) BEFORE the INSERT, then CAS-UPDATEd -> superseded
106
+ * in the same SAVEPOINT; the new version = predecessor.version + 1 (server-derived).
107
+ */
108
+ export function saveProjectBrief(hippoRoot, tenantId, opts, actor = 'cli') {
109
+ assertTenantId('saveProjectBrief', tenantId);
110
+ const { repo } = validateBriefFields(opts.repo, opts.summary, opts.changeSummary);
111
+ const isSupersede = opts.supersedesBriefId !== undefined;
112
+ const changeSummary = isSupersede ? (opts.changeSummary ?? null) : null;
113
+ const isRefresh = opts.refreshReceiptCount !== undefined;
114
+ const now = new Date().toISOString();
115
+ const content = buildBriefContent(repo, opts.summary);
116
+ const tags = ['project_brief', ...(opts.extraTags ?? [])];
117
+ const mem = createMemory(content, {
118
+ tags,
119
+ layer: Layer.Semantic,
120
+ confidence: 'verified',
121
+ source: 'project_brief',
122
+ tenantId,
123
+ });
124
+ mem.half_life_days = PROJECT_BRIEF_HALF_LIFE_DAYS;
125
+ let savedRow;
126
+ writeEntry(hippoRoot, mem, {
127
+ actor,
128
+ afterWrite: (db, memoryId) => {
129
+ // Preflight the supersede target BEFORE inserting the new row (so the new
130
+ // autoincrement id can never be its own supersede target); read the
131
+ // predecessor version in the same SELECT for server-derived versioning.
132
+ // Mirrors saveSkill / saveProcess (codex P1 2026-05-28).
133
+ let version = 1;
134
+ if (opts.supersedesBriefId !== undefined) {
135
+ const pred = db.prepare(`SELECT status, version FROM project_briefs WHERE id = ? AND tenant_id = ?`).get(opts.supersedesBriefId, tenantId);
136
+ if (!pred) {
137
+ throw new Error(`saveProjectBrief: brief ${opts.supersedesBriefId} to supersede not found for tenant ${tenantId}`);
138
+ }
139
+ if (pred.status !== 'active') {
140
+ throw new Error(`saveProjectBrief: brief ${opts.supersedesBriefId} is not active (status='${pred.status}'); only active briefs can be superseded.`);
141
+ }
142
+ version = pred.version + 1;
143
+ }
144
+ const result = db.prepare(`
145
+ INSERT INTO project_briefs(
146
+ memory_id, tenant_id, repo, summary, version,
147
+ status, superseded_by, superseded_at, change_summary, closed_at, created_at
148
+ ) VALUES (?, ?, ?, ?, ?, 'active', NULL, NULL, ?, NULL, ?)
149
+ `).run(memoryId, tenantId, repo, opts.summary, version, changeSummary, now);
150
+ const briefId = Number(result.lastInsertRowid ?? 0);
151
+ if (opts.supersedesBriefId !== undefined) {
152
+ const sup = db.prepare(`
153
+ UPDATE project_briefs
154
+ SET status = 'superseded', superseded_by = ?, superseded_at = ?
155
+ WHERE id = ? AND tenant_id = ? AND status = 'active' AND id != ?
156
+ `).run(briefId, now, opts.supersedesBriefId, tenantId, briefId);
157
+ if (sup.changes === 0) {
158
+ throw new Error(`saveProjectBrief: brief ${opts.supersedesBriefId} could not be superseded (no longer active or self-reference).`);
159
+ }
160
+ appendAuditEvent(db, {
161
+ tenantId,
162
+ actor,
163
+ op: 'project_brief_supersede',
164
+ targetId: String(opts.supersedesBriefId),
165
+ metadata: {
166
+ brief_id: opts.supersedesBriefId,
167
+ superseded_by: briefId,
168
+ new_version: version,
169
+ refreshed: isRefresh,
170
+ ...(isRefresh ? { receipt_count: opts.refreshReceiptCount } : {}),
171
+ },
172
+ });
173
+ }
174
+ const row = db.prepare(`SELECT ${BRIEF_COLS} FROM project_briefs WHERE id = ?`)
175
+ .get(briefId);
176
+ if (!row)
177
+ throw new Error('saveProjectBrief: failed to reload saved brief row');
178
+ savedRow = row;
179
+ // GDPR-light metadata: ids + flags only, no brief text.
180
+ appendAuditEvent(db, {
181
+ tenantId,
182
+ actor,
183
+ op: 'project_brief_create',
184
+ targetId: String(briefId),
185
+ metadata: {
186
+ brief_id: briefId,
187
+ repo,
188
+ version,
189
+ refreshed: isRefresh,
190
+ ...(isRefresh ? { receipt_count: opts.refreshReceiptCount } : {}),
191
+ },
192
+ });
193
+ },
194
+ });
195
+ if (!savedRow) {
196
+ throw new Error('saveProjectBrief: afterWrite did not populate the row');
197
+ }
198
+ return rowToProjectBrief(savedRow);
199
+ }
200
+ /**
201
+ * Close (retire) an active brief. CAS guard WHERE status='active'; 0 changes
202
+ * distinguishes not-found from not-active. A superseded row is terminal.
203
+ */
204
+ export function closeProjectBrief(hippoRoot, tenantId, id, actor = 'cli') {
205
+ assertTenantId('closeProjectBrief', tenantId);
206
+ const now = new Date().toISOString();
207
+ const db = openHippoDb(hippoRoot);
208
+ try {
209
+ db.exec('BEGIN IMMEDIATE');
210
+ try {
211
+ const updateResult = db.prepare(`
212
+ UPDATE project_briefs
213
+ SET status = 'closed', closed_at = ?
214
+ WHERE id = ? AND tenant_id = ? AND status = 'active'
215
+ `).run(now, id, tenantId);
216
+ if (updateResult.changes === 0) {
217
+ const existing = db.prepare(`SELECT status FROM project_briefs WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
218
+ if (!existing) {
219
+ throw new Error(`closeProjectBrief: brief ${id} not found for tenant ${tenantId}`);
220
+ }
221
+ throw new Error(`closeProjectBrief: brief ${id} is not active (status='${existing.status}'); only active briefs can be closed.`);
222
+ }
223
+ const row = db.prepare(`SELECT ${BRIEF_COLS} FROM project_briefs WHERE id = ? AND tenant_id = ?`)
224
+ .get(id, tenantId);
225
+ if (!row)
226
+ throw new Error(`closeProjectBrief: brief ${id} not found after UPDATE`);
227
+ appendAuditEvent(db, {
228
+ tenantId,
229
+ actor,
230
+ op: 'project_brief_close',
231
+ targetId: String(id),
232
+ metadata: { brief_id: id },
233
+ });
234
+ db.exec('COMMIT');
235
+ return rowToProjectBrief(row);
236
+ }
237
+ catch (e) {
238
+ try {
239
+ db.exec('ROLLBACK');
240
+ }
241
+ catch {
242
+ // Ignore rollback failures — the throw below is what matters.
243
+ }
244
+ throw e;
245
+ }
246
+ }
247
+ finally {
248
+ closeHippoDb(db);
249
+ }
250
+ }
251
+ export function loadProjectBriefById(hippoRoot, tenantId, id) {
252
+ assertTenantId('loadProjectBriefById', tenantId);
253
+ const db = openHippoDb(hippoRoot);
254
+ try {
255
+ const row = db.prepare(`SELECT ${BRIEF_COLS} FROM project_briefs WHERE id = ? AND tenant_id = ?`)
256
+ .get(id, tenantId);
257
+ return row ? rowToProjectBrief(row) : null;
258
+ }
259
+ finally {
260
+ closeHippoDb(db);
261
+ }
262
+ }
263
+ export function loadProjectBriefs(hippoRoot, tenantId, opts = {}) {
264
+ assertTenantId('loadProjectBriefs', tenantId);
265
+ const limit = opts.limit ?? 100;
266
+ if (opts.status && !VALID_BRIEF_STATES.has(opts.status)) {
267
+ throw new Error(`loadProjectBriefs: status must be one of ${Array.from(VALID_BRIEF_STATES).join('|')}; got ${opts.status}`);
268
+ }
269
+ const db = openHippoDb(hippoRoot);
270
+ try {
271
+ const clauses = ['tenant_id = ?'];
272
+ const params = [tenantId];
273
+ if (opts.status) {
274
+ clauses.push('status = ?');
275
+ params.push(opts.status);
276
+ }
277
+ if (opts.repo) {
278
+ clauses.push('repo = ?');
279
+ params.push(opts.repo);
280
+ }
281
+ params.push(limit);
282
+ const rows = db.prepare(`
283
+ SELECT ${BRIEF_COLS} FROM project_briefs
284
+ WHERE ${clauses.join(' AND ')}
285
+ ORDER BY created_at DESC, id DESC
286
+ LIMIT ?
287
+ `).all(...params);
288
+ return rows.map(rowToProjectBrief);
289
+ }
290
+ finally {
291
+ closeHippoDb(db);
292
+ }
293
+ }
294
+ /**
295
+ * The repo's CURRENT active brief, or null. By convention there is one active brief
296
+ * per (tenant, repo); if an operator created more than one (the DB does not prevent
297
+ * it, consistent with every other E2 object), the MOST-RECENT active row wins.
298
+ */
299
+ export function loadActiveBriefForRepo(hippoRoot, tenantId, repo) {
300
+ assertTenantId('loadActiveBriefForRepo', tenantId);
301
+ const db = openHippoDb(hippoRoot);
302
+ try {
303
+ const row = db.prepare(`
304
+ SELECT ${BRIEF_COLS} FROM project_briefs
305
+ WHERE tenant_id = ? AND repo = ? AND status = 'active'
306
+ ORDER BY created_at DESC, id DESC
307
+ LIMIT 1
308
+ `).get(tenantId, repo);
309
+ return row ? rowToProjectBrief(row) : null;
310
+ }
311
+ finally {
312
+ closeHippoDb(db);
313
+ }
314
+ }
315
+ // ---------------------------------------------------------------------------
316
+ // Refresh assembler (the distinguishing deliverable)
317
+ // ---------------------------------------------------------------------------
318
+ /** Escape LIKE wildcards in operator-supplied text (mirror of store.ts:782). */
319
+ function escapeLike(term) {
320
+ return term.replace(/[%_\\]/g, '\\$&');
321
+ }
322
+ /** Single-line headline for a receipt: first non-empty line, newline-stripped,
323
+ * truncated. Deterministic + safe for the markdown bullet list. */
324
+ function receiptHeadline(content) {
325
+ const firstLine = (content ?? '').split(/\r?\n/).find((l) => l.trim().length > 0) ?? '';
326
+ const trimmed = firstLine.trim();
327
+ return trimmed.length > MAX_RECEIPT_HEADLINE_LEN
328
+ ? `${trimmed.slice(0, MAX_RECEIPT_HEADLINE_LEN)}...`
329
+ : trimmed;
330
+ }
331
+ /**
332
+ * Assemble the repo's recent receipts into a deterministic markdown digest, and
333
+ * return it WITH the receipt count (the count feeds refreshBrief's change_summary +
334
+ * audit metadata). NO LLM. Always returns a non-empty, valid summary (a brief
335
+ * `summary` is NOT NULL), including the zero-receipts case.
336
+ *
337
+ * A "receipt" = a tenant memory row carrying the repo's `path:<repo>` tag. The
338
+ * brief's OWN memory mirror (source='project_brief') is excluded so a brief never
339
+ * becomes its own receipt on the next refresh. The match is against the JSON-array
340
+ * serialization (each element is a double-quoted string `"path:hippo"`); the
341
+ * surrounding quotes are load-bearing — they stop `hip` matching `path:hippo`.
342
+ * `repo` is LIKE-escaped + parameterized (operator-supplied; security.md).
343
+ */
344
+ export function assembleBriefFromReceipts(hippoRoot, tenantId, repo) {
345
+ assertTenantId('assembleBriefFromReceipts', tenantId);
346
+ const normalizedRepo = (repo ?? '').trim();
347
+ if (normalizedRepo.length === 0) {
348
+ throw new Error('assembleBriefFromReceipts: repo is required');
349
+ }
350
+ const tag = `path:${normalizedRepo.toLowerCase()}`;
351
+ const likeParam = `%"${escapeLike(tag)}"%`;
352
+ const db = openHippoDb(hippoRoot);
353
+ let receipts;
354
+ try {
355
+ receipts = db.prepare(`
356
+ SELECT id, created, source, content FROM memories
357
+ WHERE tenant_id = ?
358
+ AND source != 'project_brief'
359
+ AND LOWER(tags_json) LIKE ? ESCAPE '\\'
360
+ ORDER BY created DESC, id DESC
361
+ LIMIT ?
362
+ `).all(tenantId, likeParam, MAX_BRIEF_RECEIPTS);
363
+ }
364
+ finally {
365
+ closeHippoDb(db);
366
+ }
367
+ // NOTE on ordering: the `id DESC` tiebreak is lexical on a random-ish memory id
368
+ // (e.g. `sem_<hex>`), NOT chronological — within the same `created` timestamp the
369
+ // order is stable-but-arbitrary, not insertion order. `created DESC` is the real
370
+ // recency ordering. (plan-eng-critic 2026-05-30, med.)
371
+ //
372
+ // Budget-aware assembly (codex-review-critic 2026-05-30, P2): the digest is the
373
+ // brief `summary`, which saveProjectBrief caps at MAX_BRIEF_SUMMARY_LEN. The
374
+ // receipt/headline caps (50 x ~200) could otherwise build an ~11KB body that the
375
+ // store then REJECTS, breaking refresh for inputs within the advertised caps. So
376
+ // include receipt lines newest-first only while they fit under the cap (reserving
377
+ // slack for the header + an omission footer), and note the omitted remainder.
378
+ const buildReceiptLine = (r) => `- ${(r.created ?? '').slice(0, 10)} [${r.source}] ${receiptHeadline(r.content)}`;
379
+ const receiptLines = [];
380
+ if (receipts.length > 0) {
381
+ // Header + "## Recent receipts" + a worst-case omission footer cost; keep slack
382
+ // so the joined markdown stays <= MAX_BRIEF_SUMMARY_LEN even after the footer.
383
+ const SLACK = 400;
384
+ let bodyBudget = MAX_BRIEF_SUMMARY_LEN - SLACK;
385
+ for (const r of receipts) {
386
+ const line = buildReceiptLine(r);
387
+ if (line.length + 1 > bodyBudget)
388
+ break;
389
+ receiptLines.push(line);
390
+ bodyBudget -= line.length + 1;
391
+ }
392
+ }
393
+ const omitted = receipts.length - receiptLines.length;
394
+ const lines = [];
395
+ lines.push(`# Project Brief: ${normalizedRepo}`);
396
+ lines.push('');
397
+ lines.push(omitted > 0
398
+ ? `_Auto-assembled from ${receiptLines.length} of ${receipts.length} receipt(s)._`
399
+ : `_Auto-assembled from ${receipts.length} receipt(s)._`);
400
+ lines.push('');
401
+ lines.push('## Recent receipts');
402
+ lines.push('');
403
+ if (receipts.length === 0) {
404
+ lines.push(`_No receipts found for ${normalizedRepo}._`);
405
+ }
406
+ else {
407
+ lines.push(...receiptLines);
408
+ if (omitted > 0) {
409
+ lines.push('');
410
+ lines.push(`_... ${omitted} more receipt(s) omitted (summary cap)._`);
411
+ }
412
+ }
413
+ // Belt-and-suspenders: the budget loop keeps us under the cap, but hard-clamp the
414
+ // joined string so the store's NOT-NULL/<=cap contract can never be violated even
415
+ // for a pathological single oversized line.
416
+ let markdown = lines.join('\n');
417
+ if (markdown.length > MAX_BRIEF_SUMMARY_LEN) {
418
+ markdown = markdown.slice(0, MAX_BRIEF_SUMMARY_LEN);
419
+ }
420
+ return { markdown, receiptCount: receipts.length };
421
+ }
422
+ /**
423
+ * Auto-refresh the repo's brief from its receipts: assemble the digest, then create
424
+ * a new version. If the repo already has an active brief it is superseded (the
425
+ * change_summary records the auto-refresh + the audit metadata carries
426
+ * `refreshed: true`); otherwise a v1 is created. Returns the new brief.
427
+ *
428
+ * The assemble (a read of `memories`) happens BEFORE writeEntry opens its SAVEPOINT;
429
+ * a concurrent receipt write landing between the read and the brief write simply
430
+ * appears in the NEXT refresh — the brief is a derived snapshot, not a transactional
431
+ * aggregate, so no consistency invariant is violated.
432
+ */
433
+ export function refreshBrief(hippoRoot, tenantId, repo, actor = 'cli') {
434
+ assertTenantId('refreshBrief', tenantId);
435
+ const normalizedRepo = (repo ?? '').trim();
436
+ if (normalizedRepo.length === 0)
437
+ throw new Error('refreshBrief: repo is required');
438
+ const { markdown, receiptCount } = assembleBriefFromReceipts(hippoRoot, tenantId, normalizedRepo);
439
+ const active = loadActiveBriefForRepo(hippoRoot, tenantId, normalizedRepo);
440
+ return saveProjectBrief(hippoRoot, tenantId, {
441
+ repo: normalizedRepo,
442
+ summary: markdown,
443
+ changeSummary: active ? `auto-refresh from ${receiptCount} receipt(s)` : undefined,
444
+ supersedesBriefId: active ? active.id : undefined,
445
+ refreshReceiptCount: receiptCount,
446
+ // Tag the refreshed brief's mirror as repo-local so path-aware recall boosts
447
+ // it like the manual `brief new`/`supersede` paths do (codex-review 2026-05-30,
448
+ // P2). Safe vs self-recursion: assembleBriefFromReceipts excludes
449
+ // source='project_brief', so the brief never becomes its own receipt.
450
+ extraTags: [`path:${normalizedRepo.toLowerCase()}`],
451
+ }, actor);
452
+ }
453
+ //# sourceMappingURL=project-briefs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-briefs.js","sourceRoot":"","sources":["../src/project-briefs.ts"],"names":[],"mappings":"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"}
package/dist/search.d.ts CHANGED
@@ -43,6 +43,13 @@ export interface SearchResult {
43
43
  rerankScore?: number;
44
44
  preRerankRank?: number;
45
45
  postRerankRank?: number;
46
+ /** Populated for results surfaced by E3.2 graph traversal (`recall --hops N`): how
47
+ * the memory was reached from a lexical seed. Absent on normal lexical hits. */
48
+ graphVia?: {
49
+ hops: number;
50
+ relType: string;
51
+ direction: 'from' | 'to';
52
+ };
46
53
  }
47
54
  export interface ScoreBreakdown {
48
55
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}