@nxuss/lemma 1.27.1 → 1.29.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 (83) hide show
  1. package/README.md +61 -15
  2. package/bin/brain-ingest.js +64 -2
  3. package/dashboard/dist/assets/index-Dh-whqJ7.js +481 -0
  4. package/dashboard/dist/assets/index-Dh-whqJ7.js.map +1 -0
  5. package/dashboard/dist/assets/{index-DtEKr0hI.css → index-Yt1H2B7F.css} +1 -1
  6. package/dashboard/dist/index.html +2 -2
  7. package/dist/cjs/cli/gitHooks.d.ts +28 -0
  8. package/dist/cjs/cli/gitHooks.d.ts.map +1 -0
  9. package/dist/cjs/cli/gitHooks.js +112 -0
  10. package/dist/cjs/cli/gitHooks.js.map +1 -0
  11. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
  12. package/dist/cjs/cli/lemma-proxy.js +26 -0
  13. package/dist/cjs/cli/lemma-proxy.js.map +1 -1
  14. package/dist/cjs/mcp/tool-profiles.d.ts.map +1 -1
  15. package/dist/cjs/mcp/tool-profiles.js +8 -0
  16. package/dist/cjs/mcp/tool-profiles.js.map +1 -1
  17. package/dist/cjs/mcp/tools/memory.d.ts.map +1 -1
  18. package/dist/cjs/mcp/tools/memory.js +57 -0
  19. package/dist/cjs/mcp/tools/memory.js.map +1 -1
  20. package/dist/cjs/mcp/tools/misc.d.ts.map +1 -1
  21. package/dist/cjs/mcp/tools/misc.js +16 -1
  22. package/dist/cjs/mcp/tools/misc.js.map +1 -1
  23. package/dist/cjs/mcp/tools/workspace.d.ts.map +1 -1
  24. package/dist/cjs/mcp/tools/workspace.js +17 -3
  25. package/dist/cjs/mcp/tools/workspace.js.map +1 -1
  26. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  27. package/dist/cjs/mcp/tools.js +2 -0
  28. package/dist/cjs/mcp/tools.js.map +1 -1
  29. package/dist/cjs/subconscious/GitIngest.d.ts.map +1 -1
  30. package/dist/cjs/subconscious/GitIngest.js +49 -1
  31. package/dist/cjs/subconscious/GitIngest.js.map +1 -1
  32. package/dist/cjs/subconscious/TeamBrain.d.ts +82 -0
  33. package/dist/cjs/subconscious/TeamBrain.d.ts.map +1 -0
  34. package/dist/cjs/subconscious/TeamBrain.js +543 -0
  35. package/dist/cjs/subconscious/TeamBrain.js.map +1 -0
  36. package/dist/cjs/subconscious/TheBrainV2.d.ts +19 -2
  37. package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -1
  38. package/dist/cjs/subconscious/TheBrainV2.js +23 -0
  39. package/dist/cjs/subconscious/TheBrainV2.js.map +1 -1
  40. package/dist/cjs/utils/FixCapture.d.ts +66 -0
  41. package/dist/cjs/utils/FixCapture.d.ts.map +1 -0
  42. package/dist/cjs/utils/FixCapture.js +338 -0
  43. package/dist/cjs/utils/FixCapture.js.map +1 -0
  44. package/dist/esm/cli/gitHooks.d.ts +28 -0
  45. package/dist/esm/cli/gitHooks.d.ts.map +1 -0
  46. package/dist/esm/cli/gitHooks.js +106 -0
  47. package/dist/esm/cli/gitHooks.js.map +1 -0
  48. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
  49. package/dist/esm/cli/lemma-proxy.js +26 -0
  50. package/dist/esm/cli/lemma-proxy.js.map +1 -1
  51. package/dist/esm/mcp/tool-profiles.d.ts.map +1 -1
  52. package/dist/esm/mcp/tool-profiles.js +8 -0
  53. package/dist/esm/mcp/tool-profiles.js.map +1 -1
  54. package/dist/esm/mcp/tools/memory.d.ts.map +1 -1
  55. package/dist/esm/mcp/tools/memory.js +57 -0
  56. package/dist/esm/mcp/tools/memory.js.map +1 -1
  57. package/dist/esm/mcp/tools/misc.d.ts.map +1 -1
  58. package/dist/esm/mcp/tools/misc.js +16 -1
  59. package/dist/esm/mcp/tools/misc.js.map +1 -1
  60. package/dist/esm/mcp/tools/workspace.d.ts.map +1 -1
  61. package/dist/esm/mcp/tools/workspace.js +17 -3
  62. package/dist/esm/mcp/tools/workspace.js.map +1 -1
  63. package/dist/esm/mcp/tools.d.ts.map +1 -1
  64. package/dist/esm/mcp/tools.js +2 -0
  65. package/dist/esm/mcp/tools.js.map +1 -1
  66. package/dist/esm/subconscious/GitIngest.d.ts.map +1 -1
  67. package/dist/esm/subconscious/GitIngest.js +49 -1
  68. package/dist/esm/subconscious/GitIngest.js.map +1 -1
  69. package/dist/esm/subconscious/TeamBrain.d.ts +82 -0
  70. package/dist/esm/subconscious/TeamBrain.d.ts.map +1 -0
  71. package/dist/esm/subconscious/TeamBrain.js +533 -0
  72. package/dist/esm/subconscious/TeamBrain.js.map +1 -0
  73. package/dist/esm/subconscious/TheBrainV2.d.ts +19 -2
  74. package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -1
  75. package/dist/esm/subconscious/TheBrainV2.js +23 -0
  76. package/dist/esm/subconscious/TheBrainV2.js.map +1 -1
  77. package/dist/esm/utils/FixCapture.d.ts +66 -0
  78. package/dist/esm/utils/FixCapture.d.ts.map +1 -0
  79. package/dist/esm/utils/FixCapture.js +328 -0
  80. package/dist/esm/utils/FixCapture.js.map +1 -0
  81. package/package.json +1 -1
  82. package/dashboard/dist/assets/index-DiidVeI5.js +0 -481
  83. package/dashboard/dist/assets/index-DiidVeI5.js.map +0 -1
@@ -0,0 +1,533 @@
1
+ /**
2
+ * TeamBrain — a Brain shared through the repo itself, one reviewed file per memory.
3
+ *
4
+ * brain_export/brain_import already move memories between machines, but every evidence key is
5
+ * an absolute path (`/Users/alice/app/src/auth.ts`), so on a teammate's checkout none of them
6
+ * resolve and every imported memory reads as stale until someone re-anchors it by hand — which
7
+ * certifies, blind, something another person wrote. The content hash is portable; the path is
8
+ * not. This module rewrites evidence keys relative to the repo root on the way out and back onto
9
+ * the local root on the way in, hashes untouched: a memory about a file that is byte-identical on
10
+ * both machines arrives *fresh*, and one about a file that has moved on arrives honestly stale.
11
+ *
12
+ * Layout: `.lemma-brain/memories/<id>.json`, sorted keys, indented. One file per memory so two
13
+ * people sharing at once never conflict on an add, a deletion is a `git rm`, and every shared
14
+ * memory goes through the same PR review as the code it describes. `.lemma/` is gitignored by
15
+ * `lemma init`, and git can't un-ignore a child of an ignored directory, hence a sibling dir.
16
+ *
17
+ * Publishing is always explicit (push). Pulling is safe to automate (post-merge hook): it only
18
+ * adds verifiable memories, and it only ever deletes ones this clone received from the team.
19
+ */
20
+ import fs from 'fs';
21
+ import path from 'path';
22
+ import { execFileSync } from 'child_process';
23
+ import { checkEntryFreshness, deriveProjectId, entrySource, getBrain, trackedArtifactCount, } from './TheBrainV2.js';
24
+ import { LocalFsResolver } from './freshness/LocalFsResolver.js';
25
+ export const TEAM_DIR = '.lemma-brain';
26
+ const MEMORIES_SUBDIR = 'memories';
27
+ /** Ids this clone received from the team on its last pull — see pullTeamBrain's deletion pass. */
28
+ const PULLED_MANIFEST = path.join('.lemma', 'session', 'team-pulled.json');
29
+ const FORMAT_VERSION = 1;
30
+ /** Ids come from sha1 hex today; the filename is built from the id, so nothing path-like gets in. */
31
+ const ID_RE = /^[A-Za-z0-9_-]{1,64}$/;
32
+ /**
33
+ * Written by automation, never shared: checkpoints are summaries of someone's conversation
34
+ * (private by nature), and commit memories are re-derived by every clone from git itself —
35
+ * sharing them would only duplicate what each teammate's post-commit hook already ingests.
36
+ */
37
+ const UNSHAREABLE_SOURCES = new Set(['auto-checkpoint', 'auto-git']);
38
+ /** Machine-local state: recomputed (terms), earned per machine (counters), or re-derived (projectId). */
39
+ const LOCAL_ONLY_FIELDS = ['terms', 'termFreq', 'hits', 'tokensSaved', 'demerits', 'projectId'];
40
+ // ─── Paths ────────────────────────────────────────────────────────────────────
41
+ /** The repo root git reports (already realpath'd), or the given dir outside a repo. */
42
+ export function repoRoot(cwd = process.cwd()) {
43
+ try {
44
+ const out = execFileSync('git', ['-C', cwd, 'rev-parse', '--show-toplevel'], {
45
+ encoding: 'utf8',
46
+ stdio: ['ignore', 'pipe', 'ignore'],
47
+ }).trim();
48
+ if (out)
49
+ return out;
50
+ }
51
+ catch { /* not a repo — fall through */ }
52
+ try {
53
+ return fs.realpathSync(cwd);
54
+ }
55
+ catch {
56
+ return path.resolve(cwd);
57
+ }
58
+ }
59
+ function memoriesDir(root) {
60
+ return path.join(root, TEAM_DIR, MEMORIES_SUBDIR);
61
+ }
62
+ /**
63
+ * Absolute evidence path → repo-relative posix path, or null when it lives outside the repo.
64
+ * Tries the realpath of both sides: on macOS the same file is /tmp/x from one call site and
65
+ * /private/tmp/x from another, and treating those as "outside the repo" would silently refuse
66
+ * to share a perfectly shareable memory.
67
+ */
68
+ function toPortable(abs, root) {
69
+ const roots = new Set([root]);
70
+ try {
71
+ roots.add(fs.realpathSync(root));
72
+ }
73
+ catch { /* keep the given root */ }
74
+ const candidates = new Set([abs]);
75
+ try {
76
+ candidates.add(fs.realpathSync(abs));
77
+ }
78
+ catch { /* file may be gone — the hash still travels */ }
79
+ for (const r of roots) {
80
+ for (const a of candidates) {
81
+ const rel = path.relative(r, a);
82
+ if (rel && !rel.startsWith('..') && !path.isAbsolute(rel))
83
+ return rel.split(path.sep).join('/');
84
+ }
85
+ }
86
+ return null;
87
+ }
88
+ /**
89
+ * Repo-relative posix path → absolute path under this checkout, or null when the path could
90
+ * escape it. A bundle arrives through a pull request, not from a trusted process: a `../` or
91
+ * absolute key would make freshness checks read (hash) files outside the repo.
92
+ */
93
+ function fromPortable(rel, root) {
94
+ if (typeof rel !== 'string' || rel.length === 0)
95
+ return null;
96
+ if (rel.startsWith('/') || /^[A-Za-z]:/.test(rel) || rel.includes('\\'))
97
+ return null;
98
+ const parts = rel.split('/');
99
+ if (parts.some((p) => p === '..' || p === ''))
100
+ return null;
101
+ return path.join(root, ...parts);
102
+ }
103
+ /** Symbol keys are `path::symbolName`; only the path half is rebased. */
104
+ function splitSymbolKey(key) {
105
+ const sep = key.lastIndexOf('::');
106
+ if (sep <= 0)
107
+ return null;
108
+ return { file: key.substring(0, sep), symbol: key.substring(sep + 2) };
109
+ }
110
+ function rebaseFileMap(map, rebase) {
111
+ if (!map)
112
+ return undefined;
113
+ const out = {};
114
+ for (const [k, v] of Object.entries(map)) {
115
+ const next = rebase(k);
116
+ if (next === null)
117
+ return null;
118
+ out[next] = v;
119
+ }
120
+ return out;
121
+ }
122
+ function rebaseSymbolMap(map, rebase) {
123
+ if (!map)
124
+ return undefined;
125
+ const out = {};
126
+ for (const [k, v] of Object.entries(map)) {
127
+ const parts = splitSymbolKey(k);
128
+ if (!parts)
129
+ return null;
130
+ const file = rebase(parts.file);
131
+ if (file === null)
132
+ return null;
133
+ out[`${file}::${parts.symbol}`] = v;
134
+ }
135
+ return out;
136
+ }
137
+ /**
138
+ * Rewrite every evidence key of an entry (and its claims) through `rebase`. Null when any single
139
+ * key can't be rebased — a memory whose evidence is only partly portable would arrive tracking
140
+ * fewer files than it depends on, and look fresh when it isn't.
141
+ */
142
+ function rebaseEvidence(target, rebase) {
143
+ const fileHashes = rebaseFileMap(target.fileHashes, rebase);
144
+ const symbolHashes = rebaseSymbolMap(target.symbolHashes, rebase);
145
+ const symbolNormalizedHashes = rebaseSymbolMap(target.symbolNormalizedHashes, rebase);
146
+ if (fileHashes === null || symbolHashes === null || symbolNormalizedHashes === null)
147
+ return null;
148
+ const out = { ...target };
149
+ if (fileHashes)
150
+ out.fileHashes = fileHashes;
151
+ else
152
+ delete out.fileHashes;
153
+ if (symbolHashes)
154
+ out.symbolHashes = symbolHashes;
155
+ else
156
+ delete out.symbolHashes;
157
+ if (symbolNormalizedHashes)
158
+ out.symbolNormalizedHashes = symbolNormalizedHashes;
159
+ else
160
+ delete out.symbolNormalizedHashes;
161
+ // The clear-path labels are derived from the hash keys, never the reverse (AN-03).
162
+ const files = fileHashes ? Object.keys(fileHashes).sort() : [];
163
+ const syms = symbolHashes ? Object.keys(symbolHashes).sort() : [];
164
+ if (files.length)
165
+ out.filePaths = files;
166
+ else
167
+ delete out.filePaths;
168
+ if (syms.length)
169
+ out.symbols = syms;
170
+ else
171
+ delete out.symbols;
172
+ return out;
173
+ }
174
+ function rebaseEntry(entry, rebase) {
175
+ const base = rebaseEvidence(entry, rebase);
176
+ if (!base)
177
+ return null;
178
+ if (entry.claims) {
179
+ const claims = [];
180
+ for (const claim of entry.claims) {
181
+ const c = rebaseEvidence(claim, rebase);
182
+ if (!c)
183
+ return null;
184
+ claims.push(c);
185
+ }
186
+ base.claims = claims;
187
+ }
188
+ return base;
189
+ }
190
+ /** JSON with recursively sorted keys, so re-publishing an unchanged memory is a byte-identical no-op. */
191
+ function stableStringify(value) {
192
+ const sort = (v) => {
193
+ if (Array.isArray(v))
194
+ return v.map(sort);
195
+ if (v && typeof v === 'object') {
196
+ return Object.fromEntries(Object.keys(v)
197
+ .sort()
198
+ .filter((k) => v[k] !== undefined)
199
+ .map((k) => [k, sort(v[k])]));
200
+ }
201
+ return v;
202
+ };
203
+ return JSON.stringify(sort(value), null, 2) + '\n';
204
+ }
205
+ function readManifest(root) {
206
+ try {
207
+ const parsed = JSON.parse(fs.readFileSync(path.join(root, PULLED_MANIFEST), 'utf8'));
208
+ return Array.isArray(parsed) ? parsed.filter((x) => typeof x === 'string') : [];
209
+ }
210
+ catch {
211
+ return [];
212
+ }
213
+ }
214
+ function writeManifest(root, ids) {
215
+ const p = path.join(root, PULLED_MANIFEST);
216
+ fs.mkdirSync(path.dirname(p), { recursive: true });
217
+ fs.writeFileSync(p, JSON.stringify([...new Set(ids)].sort()), 'utf8');
218
+ }
219
+ function listTeamFiles(root) {
220
+ try {
221
+ return fs.readdirSync(memoriesDir(root)).filter((f) => f.endsWith('.json'));
222
+ }
223
+ catch {
224
+ return [];
225
+ }
226
+ }
227
+ function freshnessNodeResolver(brain) {
228
+ return (id) => {
229
+ const entry = brain.getEntry(id);
230
+ if (entry)
231
+ return { kind: 'entry', entry };
232
+ const claim = brain.getClaim(id);
233
+ return claim ? { kind: 'claim', claim: claim.claim } : undefined;
234
+ };
235
+ }
236
+ /**
237
+ * Decide which of this project's memories may be shared, and in what form. Shared by push and
238
+ * status so the two can never disagree about what "publishable" means.
239
+ */
240
+ function planPublishable(root, brain) {
241
+ const projectId = deriveProjectId(root);
242
+ const resolver = new LocalFsResolver(root);
243
+ const resolveNode = freshnessNodeResolver(brain);
244
+ const existingFiles = new Set(listTeamFiles(root).map((f) => f.slice(0, -5)));
245
+ const skipped = [];
246
+ const publishable = new Map();
247
+ const skip = (e, reason) => skipped.push({ id: e.id, query: e.query.slice(0, 100), reason });
248
+ // Strict project match, unlike search()'s unscoped fallback: an entry written before scoping
249
+ // existed may be about any project on this machine, and a repo is the wrong place to guess.
250
+ for (const entry of brain.getEntriesForProject(projectId)) {
251
+ if (entry.projectId !== projectId)
252
+ continue;
253
+ if (!ID_RE.test(entry.id)) {
254
+ skip(entry, 'id is not a safe filename');
255
+ continue;
256
+ }
257
+ const source = entrySource(entry);
258
+ if (UNSHAREABLE_SOURCES.has(source)) {
259
+ skip(entry, `${source} memories stay local`);
260
+ continue;
261
+ }
262
+ if (trackedArtifactCount(entry) === 0) {
263
+ skip(entry, 'untracked — a teammate could never verify it (anchor it with refresh_memory first)');
264
+ continue;
265
+ }
266
+ // A superseded memory is only worth sharing to carry its successor pointer to clones that
267
+ // already have it; its evidence may well be stale, which is exactly why it was superseded.
268
+ const propagatingCorrection = !!entry.supersededBy && existingFiles.has(entry.id);
269
+ if (!propagatingCorrection) {
270
+ if (entry.supersededBy) {
271
+ skip(entry, 'superseded — share its successor instead');
272
+ continue;
273
+ }
274
+ const fresh = checkEntryFreshness(entry, resolver, resolveNode);
275
+ if (!fresh.fresh) {
276
+ skip(entry, `stale here (${[...fresh.staleFiles, ...fresh.unverifiedFiles].slice(0, 3).join(', ')})`);
277
+ continue;
278
+ }
279
+ }
280
+ const rebased = rebaseEntry(entry, (abs) => toPortable(abs, root));
281
+ if (!rebased) {
282
+ skip(entry, 'tracks files outside this repo');
283
+ continue;
284
+ }
285
+ const portable = { lemmaTeamMemory: FORMAT_VERSION, ...rebased };
286
+ for (const field of LOCAL_ONLY_FIELDS)
287
+ delete portable[field];
288
+ publishable.set(entry.id, { entry, portable });
289
+ }
290
+ // derivedFrom closure: a memory built on one that isn't shared would arrive with an upstream
291
+ // that can't resolve, which freshness correctly reads as stale ("unknown") on every clone.
292
+ // Iterate to a fixed point, since dropping one can orphan another.
293
+ const sharedClaimIds = () => {
294
+ const ids = new Set();
295
+ for (const p of publishable.values())
296
+ for (const c of p.entry.claims || [])
297
+ ids.add(c.id);
298
+ return ids;
299
+ };
300
+ for (let changed = true; changed;) {
301
+ changed = false;
302
+ const claimIds = sharedClaimIds();
303
+ for (const [id, p] of publishable) {
304
+ const missing = (p.entry.derivedFrom || []).find((dep) => !publishable.has(dep) && !claimIds.has(dep));
305
+ if (missing) {
306
+ publishable.delete(id);
307
+ skip(p.entry, `derived from ${missing}, which is not shared`);
308
+ changed = true;
309
+ }
310
+ }
311
+ }
312
+ return { publishable, skipped };
313
+ }
314
+ /**
315
+ * Write this project's publishable memories into `.lemma-brain/memories/`. Nothing is committed:
316
+ * the files show up in `git status` and go through review like any other change.
317
+ */
318
+ export function pushTeamBrain(cwd = process.cwd(), opts = {}) {
319
+ const root = repoRoot(cwd);
320
+ const dir = memoriesDir(root);
321
+ const brain = opts.brain ?? getBrain();
322
+ const dryRun = opts.dryRun === true;
323
+ const { publishable, skipped } = planPublishable(root, brain);
324
+ const written = [];
325
+ let unchanged = 0;
326
+ if (!dryRun && publishable.size > 0)
327
+ fs.mkdirSync(dir, { recursive: true });
328
+ for (const [id, { portable }] of publishable) {
329
+ const file = path.join(dir, `${id}.json`);
330
+ const text = stableStringify(portable);
331
+ let current = null;
332
+ try {
333
+ current = fs.readFileSync(file, 'utf8');
334
+ }
335
+ catch { /* new file */ }
336
+ if (current === text) {
337
+ unchanged++;
338
+ continue;
339
+ }
340
+ if (!dryRun)
341
+ fs.writeFileSync(file, text, 'utf8');
342
+ written.push(id);
343
+ }
344
+ // A memory you deliberately forgot here should stop being shared too. Only ids in this
345
+ // machine's trash qualify — "absent locally" alone would also match every teammate's memory
346
+ // this clone simply hasn't pulled yet.
347
+ const forgotten = new Set(brain.listForgotten().map((f) => f.id));
348
+ const removed = [];
349
+ for (const f of listTeamFiles(root)) {
350
+ const id = f.slice(0, -5);
351
+ if (publishable.has(id) || brain.getEntry(id) || !forgotten.has(id))
352
+ continue;
353
+ if (!dryRun)
354
+ fs.rmSync(path.join(dir, f), { force: true });
355
+ removed.push(id);
356
+ }
357
+ // Only once something is actually shared: a push with nothing publishable must not create
358
+ // a .lemma-brain/ in a repo that never opted in.
359
+ if (!dryRun && written.length > 0)
360
+ ensureReadme(root);
361
+ const verb = dryRun ? 'Would write' : 'Wrote';
362
+ return {
363
+ ok: true,
364
+ dir: path.relative(root, dir) || dir,
365
+ written,
366
+ unchanged,
367
+ removed,
368
+ skipped,
369
+ dryRun,
370
+ message: `${verb} ${written.length} memor${written.length === 1 ? 'y' : 'ies'} to ${TEAM_DIR}/ ` +
371
+ `(${unchanged} already up to date${removed.length ? `, ${removed.length} removed after forget_memory` : ''}), ` +
372
+ `skipped ${skipped.length}.` +
373
+ (dryRun ? ' Nothing was written.' : written.length || removed.length ? ` Review and commit them: git add ${TEAM_DIR} && git commit.` : ''),
374
+ };
375
+ }
376
+ function ensureReadme(root) {
377
+ const p = path.join(root, TEAM_DIR, 'README.md');
378
+ if (fs.existsSync(p))
379
+ return;
380
+ fs.writeFileSync(p, [
381
+ '# .lemma-brain — shared project memory',
382
+ '',
383
+ 'Verified memories about this codebase, shared through git by [Lemma](https://www.npmjs.com/package/@nxuss/lemma).',
384
+ 'Each file in `memories/` is one memory plus the sha256 of the files and symbols it depends on,',
385
+ 'with paths relative to the repo root.',
386
+ '',
387
+ '- `brain_team action=push` writes your fresh, tracked memories here. Review them like code.',
388
+ '- `brain_team action=pull` (or the post-merge hook `lemma init` installs) imports them. A memory',
389
+ ' whose files are byte-identical in your checkout arrives fresh; one whose files changed arrives',
390
+ ' flagged stale, never silently trusted.',
391
+ '- Deleting a file here removes that memory from every clone that pulled it (into its trash, restorable).',
392
+ '',
393
+ ].join('\n'), 'utf8');
394
+ }
395
+ // ─── Pull ─────────────────────────────────────────────────────────────────────
396
+ /**
397
+ * Import the repo's shared memories into this machine's Brain, evidence rebased onto this
398
+ * checkout. Safe to run on every merge/checkout: it is a no-op (no snapshot, no write) when
399
+ * nothing changed.
400
+ */
401
+ export function pullTeamBrain(cwd = process.cwd(), opts = {}) {
402
+ const root = repoRoot(cwd);
403
+ const dir = memoriesDir(root);
404
+ const brain = opts.brain ?? getBrain();
405
+ const dryRun = opts.dryRun === true;
406
+ const projectId = deriveProjectId(root);
407
+ const rejected = [];
408
+ const lines = [];
409
+ const seen = [];
410
+ for (const f of listTeamFiles(root)) {
411
+ const idFromName = f.slice(0, -5);
412
+ let raw;
413
+ try {
414
+ raw = JSON.parse(fs.readFileSync(path.join(dir, f), 'utf8'));
415
+ }
416
+ catch {
417
+ rejected.push({ id: idFromName, query: '', reason: 'unparseable JSON' });
418
+ continue;
419
+ }
420
+ const query = typeof raw.query === 'string' ? raw.query.slice(0, 100) : '';
421
+ if (typeof raw.id !== 'string' || raw.id !== idFromName || !ID_RE.test(raw.id)) {
422
+ rejected.push({ id: idFromName, query, reason: 'id missing, unsafe, or not matching its filename' });
423
+ continue;
424
+ }
425
+ if (typeof raw.query !== 'string' || typeof raw.response !== 'string') {
426
+ rejected.push({ id: idFromName, query, reason: 'missing query/response' });
427
+ continue;
428
+ }
429
+ delete raw.lemmaTeamMemory;
430
+ for (const field of LOCAL_ONLY_FIELDS)
431
+ delete raw[field];
432
+ const rebased = rebaseEntry(raw, (rel) => fromPortable(rel, root));
433
+ if (!rebased) {
434
+ rejected.push({ id: idFromName, query, reason: 'evidence path is absolute or escapes the repo' });
435
+ continue;
436
+ }
437
+ seen.push(rebased.id);
438
+ lines.push(JSON.stringify({ ...rebased, projectId, source: 'team', hits: 0 }));
439
+ }
440
+ const text = lines.join('\n');
441
+ const preview = lines.length > 0 ? brain.previewImport(text, { markSource: false }) : null;
442
+ const wouldChange = preview ? preview.wouldImport + preview.wouldUpdate : 0;
443
+ let imported = preview?.wouldImport ?? 0;
444
+ let updated = preview?.wouldUpdate ?? 0;
445
+ if (!dryRun && wouldChange > 0) {
446
+ const res = brain.importBundle(text, { markSource: false });
447
+ imported = res.imported;
448
+ updated = res.updated;
449
+ }
450
+ // A teammate deleting a memory's file is a deliberate retraction; honour it on every clone
451
+ // that received it — but only for ids this clone got from the team, and only while it is
452
+ // still a team memory here. A file vanishing never deletes anything you wrote yourself.
453
+ const previouslyPulled = readManifest(root);
454
+ const seenSet = new Set(seen);
455
+ const removed = [];
456
+ for (const id of previouslyPulled) {
457
+ if (seenSet.has(id))
458
+ continue;
459
+ const entry = brain.getEntry(id);
460
+ if (!entry || entry.source !== 'team')
461
+ continue;
462
+ if (!dryRun)
463
+ brain.forget(id);
464
+ removed.push(id);
465
+ }
466
+ if (!dryRun && (seen.length > 0 || previouslyPulled.length > 0))
467
+ writeManifest(root, seen);
468
+ // Report what actually arrived verifiable — the whole point of rebasing.
469
+ const resolver = new LocalFsResolver(root);
470
+ const resolveNode = freshnessNodeResolver(brain);
471
+ let fresh = 0;
472
+ let stale = 0;
473
+ if (!dryRun) {
474
+ for (const id of seen) {
475
+ const entry = brain.getEntry(id);
476
+ if (!entry)
477
+ continue;
478
+ if (checkEntryFreshness(entry, resolver, resolveNode).fresh)
479
+ fresh++;
480
+ else
481
+ stale++;
482
+ }
483
+ }
484
+ const unchanged = preview ? preview.wouldSkip : 0;
485
+ const verb = dryRun ? 'Would import' : 'Imported';
486
+ return {
487
+ ok: true,
488
+ dir: path.relative(root, dir) || dir,
489
+ imported,
490
+ updated,
491
+ unchanged,
492
+ removed,
493
+ rejected,
494
+ fresh,
495
+ stale,
496
+ dryRun,
497
+ message: lines.length === 0 && rejected.length === 0 && removed.length === 0
498
+ ? `No shared memories in ${TEAM_DIR}/ yet.`
499
+ : `${verb} ${imported} team memor${imported === 1 ? 'y' : 'ies'}, updated ${updated}, ${unchanged} already current` +
500
+ (removed.length ? `, removed ${removed.length} a teammate deleted (restorable from brain_trash)` : '') +
501
+ (rejected.length ? `, rejected ${rejected.length}` : '') +
502
+ '.' +
503
+ (dryRun ? ' Nothing was written.' : ` Verified against this checkout: ${fresh} fresh, ${stale} stale.`),
504
+ };
505
+ }
506
+ // ─── Status ───────────────────────────────────────────────────────────────────
507
+ export function teamBrainStatus(cwd = process.cwd(), opts = {}) {
508
+ const root = repoRoot(cwd);
509
+ const brain = opts.brain ?? getBrain();
510
+ const exists = fs.existsSync(path.join(root, TEAM_DIR));
511
+ const files = listTeamFiles(root).map((f) => f.slice(0, -5));
512
+ const { publishable } = planPublishable(root, brain);
513
+ const inRepo = new Set(files);
514
+ const notYetShared = [];
515
+ for (const [id, p] of publishable) {
516
+ if (!inRepo.has(id))
517
+ notYetShared.push({ id, query: p.entry.query.slice(0, 100), reason: 'publishable, not in the repo yet' });
518
+ }
519
+ const notYetPulled = files.filter((id) => !brain.getEntry(id));
520
+ return {
521
+ ok: true,
522
+ dir: path.join(TEAM_DIR, MEMORIES_SUBDIR),
523
+ exists,
524
+ inRepo: files.length,
525
+ publishable: publishable.size,
526
+ notYetShared,
527
+ notYetPulled,
528
+ message: `${files.length} shared memor${files.length === 1 ? 'y' : 'ies'} in ${TEAM_DIR}/, ` +
529
+ `${publishable.size} of yours publishable (${notYetShared.length} not shared yet), ` +
530
+ `${notYetPulled.length} in the repo not pulled here yet.`,
531
+ };
532
+ }
533
+ //# sourceMappingURL=TeamBrain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TeamBrain.js","sourceRoot":"","sources":["../../../src/subconscious/TeamBrain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAKL,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,QAAQ,EACR,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,CAAC,MAAM,QAAQ,GAAG,cAAc,CAAC;AACvC,MAAM,eAAe,GAAG,UAAU,CAAC;AACnC,kGAAkG;AAClG,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAC3E,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,qGAAqG;AACrG,MAAM,KAAK,GAAG,uBAAuB,CAAC;AAEtC;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC;AAErE,yGAAyG;AACzG,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,CAAU,CAAC;AA8CzG,iFAAiF;AAEjF,uFAAuF;AACvF,MAAM,UAAU,QAAQ,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAE;YAC3E,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC,CAAC,+BAA+B,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,SAAS,UAAU,CAAC,GAAW,EAAE,IAAY;IAC3C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC;QAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC;QAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,+CAA+C,CAAC,CAAC;IACvG,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,GAAW,EAAE,IAAY;IAC7C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,yEAAyE;AACzE,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,aAAa,CAAC,GAAwB,EAAE,MAAoC;IACnF,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,GAAwB,EAAE,MAAoC;IACrF,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,GAAG,GAAY,EAAE,CAAC;IACxB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,GAAG,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CACrB,MAAS,EACT,MAAoC;IAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAClE,MAAM,sBAAsB,GAAG,eAAe,CAAC,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IACtF,IAAI,UAAU,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI,IAAI,sBAAsB,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjG,MAAM,GAAG,GAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,IAAI,UAAU;QAAE,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;;QAAM,OAAO,GAAG,CAAC,UAAU,CAAC;IACxE,IAAI,YAAY;QAAE,GAAG,CAAC,YAAY,GAAG,YAAY,CAAC;;QAAM,OAAO,GAAG,CAAC,YAAY,CAAC;IAChF,IAAI,sBAAsB;QAAE,GAAG,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;;QAAM,OAAO,GAAG,CAAC,sBAAsB,CAAC;IACxH,mFAAmF;IACnF,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,IAAI,KAAK,CAAC,MAAM;QAAE,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC;;QAAM,OAAO,GAAG,CAAC,SAAS,CAAC;IACnE,IAAI,IAAI,CAAC,MAAM;QAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;;QAAM,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,KAAiB,EAAE,MAAoC;IAC1E,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yGAAyG;AACzG,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,IAAI,GAAG,CAAC,CAAU,EAAW,EAAE;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,CAA4B,CAAC;iBACtC,IAAI,EAAE;iBACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAA6B,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;iBAC9D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAE,CAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC5D,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACrF,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,GAAa;IAChD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC3C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAiB;IAC9C,OAAO,CAAC,EAAU,EAAE,EAAE;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,KAAK;YAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC;AASD;;;GAGG;AACH,SAAS,eAAe,CAAC,IAAY,EAAE,KAAiB;IACtD,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;IACnD,MAAM,IAAI,GAAG,CAAC,CAAa,EAAE,MAAc,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjH,6FAA6F;IAC7F,4FAA4F;IAC5F,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1D,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;YAAE,SAAS;QAC5C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAClF,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,EAAE,GAAG,MAAM,sBAAsB,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAChG,IAAI,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK,EAAE,oFAAoF,CAAC,CAAC;YAClG,SAAS;QACX,CAAC;QACD,0FAA0F;QAC1F,2FAA2F;QAC3F,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBAAC,IAAI,CAAC,KAAK,EAAE,0CAA0C,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC9F,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;YAChE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACjB,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACtG,SAAS;YACX,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,EAAE,gCAAgC,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC1E,MAAM,QAAQ,GAA4B,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;QAC1F,KAAK,MAAM,KAAK,IAAI,iBAAiB;YAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9D,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,6FAA6F;IAC7F,2FAA2F;IAC3F,mEAAmE;IACnE,MAAM,cAAc,GAAG,GAAgB,EAAE;QACvC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE;YAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1F,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IACF,KAAK,IAAI,OAAO,GAAG,IAAI,EAAE,OAAO,GAAI,CAAC;QACnC,OAAO,GAAG,KAAK,CAAC;QAChB,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACvG,IAAI,OAAO,EAAE,CAAC;gBACZ,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACvB,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,gBAAgB,OAAO,uBAAuB,CAAC,CAAC;gBAC9D,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE,EAAE,OAAiD,EAAE;IAC5G,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;IACpC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,OAAO,GAAkB,IAAI,CAAC;QAClC,IAAI,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QACzE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAAC,SAAS,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IAED,uFAAuF;IACvF,4FAA4F;IAC5F,uCAAuC;IACvC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAC9E,IAAI,CAAC,MAAM;YAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IAED,0FAA0F;IAC1F,iDAAiD;IACjD,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,CAAC;IAEtD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9C,OAAO;QACL,EAAE,EAAE,IAAI;QACR,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG;QACpC,OAAO;QACP,SAAS;QACT,OAAO;QACP,OAAO;QACP,MAAM;QACN,OAAO,EACL,GAAG,IAAI,IAAI,OAAO,CAAC,MAAM,SAAS,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,QAAQ,IAAI;YACvF,IAAI,SAAS,sBAAsB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,8BAA8B,CAAC,CAAC,CAAC,EAAE,KAAK;YAC/G,WAAW,OAAO,CAAC,MAAM,GAAG;YAC5B,CAAC,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,oCAAoC,QAAQ,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7I,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACjD,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO;IAC7B,EAAE,CAAC,aAAa,CACd,CAAC,EACD;QACE,wCAAwC;QACxC,EAAE;QACF,mHAAmH;QACnH,gGAAgG;QAChG,uCAAuC;QACvC,EAAE;QACF,6FAA6F;QAC7F,kGAAkG;QAClG,kGAAkG;QAClG,0CAA0C;QAC1C,0GAA0G;QAC1G,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,MAAM,CACP,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE,EAAE,OAAiD,EAAE;IAC5G,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;IACpC,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAe,EAAE,CAAC;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,KAAK,MAAM,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,GAA4B,CAAC;QACjC,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACzE,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/E,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,kDAAkD,EAAE,CAAC,CAAC;YACrG,SAAS;QACX,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACtE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC;YAC3E,SAAS;QACX,CAAC;QACD,OAAO,GAAG,CAAC,eAAe,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,iBAAiB;YAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,WAAW,CAAC,GAA4B,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,+CAA+C,EAAE,CAAC,CAAC;YAClG,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3F,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,QAAQ,GAAG,OAAO,EAAE,WAAW,IAAI,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,OAAO,EAAE,WAAW,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QACxB,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,2FAA2F;IAC3F,yFAAyF;IACzF,wFAAwF;IACxF,MAAM,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,SAAS;QAChD,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;QAAE,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAE3F,yEAAyE;IACzE,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,IAAI,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,KAAK;gBAAE,KAAK,EAAE,CAAC;;gBAChE,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;IAClD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG;QACpC,QAAQ;QACR,OAAO;QACP,SAAS;QACT,OAAO;QACP,QAAQ;QACR,KAAK;QACL,KAAK;QACL,MAAM;QACN,OAAO,EACL,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YACjE,CAAC,CAAC,yBAAyB,QAAQ,QAAQ;YAC3C,CAAC,CAAC,GAAG,IAAI,IAAI,QAAQ,cAAc,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,aAAa,OAAO,KAAK,SAAS,kBAAkB;gBACjH,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,MAAM,mDAAmD,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,GAAG;gBACH,CAAC,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,oCAAoC,KAAK,WAAW,KAAK,SAAS,CAAC;KAC9G,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,eAAe,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE,EAAE,OAA+B,EAAE;IAC5F,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,EAAE,WAAW,EAAE,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,YAAY,GAAe,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,kCAAkC,EAAE,CAAC,CAAC;IACjI,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAE/D,OAAO;QACL,EAAE,EAAE,IAAI;QACR,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC;QACzC,MAAM;QACN,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW,EAAE,WAAW,CAAC,IAAI;QAC7B,YAAY;QACZ,YAAY;QACZ,OAAO,EACL,GAAG,KAAK,CAAC,MAAM,gBAAgB,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,QAAQ,KAAK;YACnF,GAAG,WAAW,CAAC,IAAI,0BAA0B,YAAY,CAAC,MAAM,oBAAoB;YACpF,GAAG,YAAY,CAAC,MAAM,mCAAmC;KAC5D,CAAC;AACJ,CAAC"}
@@ -161,9 +161,11 @@ export interface BrainEntry {
161
161
  /**
162
162
  * Who wrote a memory. 'manual' is an explicit store_memory call; every 'auto-*' value is a
163
163
  * capture path that fires without the agent asking; 'import' came from another machine via
164
- * importBundle (so its tracked paths may not exist here at all).
164
+ * importBundle (so its tracked paths may not exist here at all); 'team' came from the
165
+ * repo's `.lemma-brain/` via TeamBrain, with its paths rebased onto this checkout.
166
+ * 'auto-fix' is a failing command that later passed, captured by FixCapture.
165
167
  */
166
- export type BrainSource = 'manual' | 'auto-test' | 'auto-checkpoint' | 'auto-git' | 'auto-pr-review' | 'import';
168
+ export type BrainSource = 'manual' | 'auto-test' | 'auto-fix' | 'auto-checkpoint' | 'auto-git' | 'auto-pr-review' | 'import' | 'team';
167
169
  /**
168
170
  * Optional store() fields that arrived after its positional signature was already eleven
169
171
  * parameters long. Everything here is additive: omitting the object entirely reproduces
@@ -393,6 +395,21 @@ export interface BrainStats {
393
395
  backups: boolean;
394
396
  encrypted: boolean;
395
397
  };
398
+ /** Entries whose timestamp falls within the last 7 days — is the Brain still filling up? */
399
+ addedLast7d?: number;
400
+ /** Sum of hits across the corpus: how many times a memory was served to an agent. */
401
+ totalRecalls?: number;
402
+ /**
403
+ * Distinct files the corpus carries evidence about (clear-path labels on entries, claims
404
+ * and symbols). What the Brain knows about the codebase, not what it saved.
405
+ */
406
+ knownFiles?: number;
407
+ /** Top 5 memories by hits, queries truncated to 80 chars like topSavers. */
408
+ topRecalled?: Array<{
409
+ id: string;
410
+ query: string;
411
+ hits: number;
412
+ }>;
396
413
  }
397
414
  /** Read-only upkeep pass over the corpus — see upkeep(). Every finding carries its fix. */
398
415
  export interface BrainUpkeepReport {