hippo-memory 1.15.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +862 -861
- package/dist/audit.d.ts +1 -1
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1244 -3
- package/dist/cli.js.map +1 -1
- package/dist/customer-notes.d.ts +95 -0
- package/dist/customer-notes.d.ts.map +1 -0
- package/dist/customer-notes.js +296 -0
- package/dist/customer-notes.js.map +1 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +731 -1
- package/dist/db.js.map +1 -1
- package/dist/graph-extract.d.ts +55 -0
- package/dist/graph-extract.d.ts.map +1 -0
- package/dist/graph-extract.js +259 -0
- package/dist/graph-extract.js.map +1 -0
- package/dist/graph-recall.d.ts +41 -0
- package/dist/graph-recall.d.ts.map +1 -0
- package/dist/graph-recall.js +246 -0
- package/dist/graph-recall.js.map +1 -0
- package/dist/graph.d.ts +137 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +433 -0
- package/dist/graph.js.map +1 -0
- package/dist/incidents.d.ts +100 -0
- package/dist/incidents.d.ts.map +1 -0
- package/dist/incidents.js +322 -0
- package/dist/incidents.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +6 -0
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +6 -0
- package/dist/memory.js.map +1 -1
- package/dist/policies.d.ts +149 -0
- package/dist/policies.d.ts.map +1 -0
- package/dist/policies.js +380 -0
- package/dist/policies.js.map +1 -0
- package/dist/processes.d.ts +104 -0
- package/dist/processes.d.ts.map +1 -0
- package/dist/processes.js +330 -0
- package/dist/processes.js.map +1 -0
- package/dist/project-briefs.d.ts +126 -0
- package/dist/project-briefs.d.ts.map +1 -0
- package/dist/project-briefs.js +453 -0
- package/dist/project-briefs.js.map +1 -0
- package/dist/search.d.ts +7 -0
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1028 -16
- package/dist/server.js.map +1 -1
- package/dist/skills.d.ts +98 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +339 -0
- package/dist/skills.js.map +1 -0
- package/dist/src/audit.js.map +1 -1
- package/dist/src/cli.js +1244 -3
- package/dist/src/cli.js.map +1 -1
- package/dist/src/customer-notes.js +296 -0
- package/dist/src/customer-notes.js.map +1 -0
- package/dist/src/db.js +731 -1
- package/dist/src/db.js.map +1 -1
- package/dist/src/graph-extract.js +259 -0
- package/dist/src/graph-extract.js.map +1 -0
- package/dist/src/graph-recall.js +246 -0
- package/dist/src/graph-recall.js.map +1 -0
- package/dist/src/graph.js +433 -0
- package/dist/src/graph.js.map +1 -0
- package/dist/src/incidents.js +322 -0
- package/dist/src/incidents.js.map +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/memory.js +6 -0
- package/dist/src/memory.js.map +1 -1
- package/dist/src/policies.js +380 -0
- package/dist/src/policies.js.map +1 -0
- package/dist/src/processes.js +330 -0
- package/dist/src/processes.js.map +1 -0
- package/dist/src/project-briefs.js +453 -0
- package/dist/src/project-briefs.js.map +1 -0
- package/dist/src/search.js.map +1 -1
- package/dist/src/server.js +1028 -16
- package/dist/src/server.js.map +1 -1
- package/dist/src/skills.js +339 -0
- package/dist/src/skills.js.map +1 -0
- package/dist/src/version.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
|
@@ -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
|
/**
|
package/dist/search.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAqB,MAAM,aAAa,CAAC;AAa7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAUzD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM/C;AAMD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,CAAC,EAAE,MAAM,CAAC;CACX;AAKD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAmBvD;AA6BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAoBD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAOjF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CASjG;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,EAAE,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAc5I;AAMD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B;uEACmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAqB,MAAM,aAAa,CAAC;AAa7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAUzD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM/C;AAMD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,CAAC,EAAE,MAAM,CAAC;CACX;AAKD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAmBvD;AA6BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAoBD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAOjF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CASjG;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,EAAE,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAc5I;AAMD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B;uEACmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;qFACiF;IACjF,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACxE;AAED,MAAM,WAAW,cAAc;IAC7B;;;;;;;OAOG;IACH,IAAI,EAAE,QAAQ,GAAG,eAAe,GAAG,WAAW,GAAG,SAAS,CAAC;IAC3D,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,eAAe,EAAE,MAAM,CAAC;IACxB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mDAAmD;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB;gEAC4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB;;kEAE8D;IAC9D,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAUD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAExD;AAkCD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iEAAiE;IACjE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;8DAE0D;IAC1D,OAAO,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC1B;;;4CAGwC;IACxC,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B;yEACqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;sCACkC;IAClC,QAAQ,CAAC,EAAE,OAAO,sBAAsB,EAAE,UAAU,CAAC;IACrD,8CAA8C;IAC9C,eAAe,CAAC,EAAE,OAAO,sBAAsB,EAAE,eAAe,CAAC;IACjE;oFACgF;IAChF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;8DAC0D;IAC1D,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,GACL,OAAO,CAAC,YAAY,EAAE,CAAC,CA0UzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,YAAY,EAAE,EACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACxC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GACf,YAAY,EAAE,CAgDhB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;gFAG4E;IAC5E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;4EACwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,GACL,OAAO,CAAC,YAAY,EAAE,CAAC,CAuJzB;AAiBD;;;;;;;GAOG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACjI,YAAY,EAAE,CAuIhB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,GAAE,IAAiB,GAAG,WAAW,EAAE,CAe3F;AAMD,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,4DAA4D;IAC5D,YAAY,EAAE,OAAO,CAAC;IACtB,yDAAyD;IACzD,gBAAgB,EAAE,MAAM,CAAC;IACzB,wFAAwF;IACxF,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,gBAAgB,CAwClF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAaxD"}
|