@nxuss/lemma 1.16.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/bin/init.js +4 -0
- package/dist/cjs/mcp/tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools.js +279 -9
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/cjs/mcp/utils.d.ts.map +1 -1
- package/dist/cjs/mcp/utils.js +21 -2
- package/dist/cjs/mcp/utils.js.map +1 -1
- package/dist/cjs/pr-review/bridge/BrainBridge.js +1 -1
- package/dist/cjs/pr-review/bridge/BrainBridge.js.map +1 -1
- package/dist/cjs/subconscious/BrainEmbeddings.d.ts +59 -0
- package/dist/cjs/subconscious/BrainEmbeddings.d.ts.map +1 -0
- package/dist/cjs/subconscious/BrainEmbeddings.js +222 -0
- package/dist/cjs/subconscious/BrainEmbeddings.js.map +1 -0
- package/dist/cjs/subconscious/GitIngest.js +2 -2
- package/dist/cjs/subconscious/GitIngest.js.map +1 -1
- package/dist/cjs/subconscious/TheBrainV2.d.ts +284 -2
- package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -1
- package/dist/cjs/subconscious/TheBrainV2.js +871 -46
- package/dist/cjs/subconscious/TheBrainV2.js.map +1 -1
- package/dist/cjs/utils/ConversationCheckpoint.js +1 -1
- package/dist/cjs/utils/ConversationCheckpoint.js.map +1 -1
- package/dist/esm/mcp/tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools.js +280 -10
- package/dist/esm/mcp/tools.js.map +1 -1
- package/dist/esm/mcp/utils.d.ts.map +1 -1
- package/dist/esm/mcp/utils.js +21 -2
- package/dist/esm/mcp/utils.js.map +1 -1
- package/dist/esm/pr-review/bridge/BrainBridge.js +1 -1
- package/dist/esm/pr-review/bridge/BrainBridge.js.map +1 -1
- package/dist/esm/subconscious/BrainEmbeddings.d.ts +59 -0
- package/dist/esm/subconscious/BrainEmbeddings.d.ts.map +1 -0
- package/dist/esm/subconscious/BrainEmbeddings.js +211 -0
- package/dist/esm/subconscious/BrainEmbeddings.js.map +1 -0
- package/dist/esm/subconscious/GitIngest.js +2 -2
- package/dist/esm/subconscious/GitIngest.js.map +1 -1
- package/dist/esm/subconscious/TheBrainV2.d.ts +284 -2
- package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -1
- package/dist/esm/subconscious/TheBrainV2.js +866 -46
- package/dist/esm/subconscious/TheBrainV2.js.map +1 -1
- package/dist/esm/utils/ConversationCheckpoint.js +1 -1
- package/dist/esm/utils/ConversationCheckpoint.js.map +1 -1
- package/package.json +1 -1
|
@@ -87,6 +87,57 @@ export interface BrainEntry {
|
|
|
87
87
|
* current state, only inherited.
|
|
88
88
|
*/
|
|
89
89
|
derivedFrom?: string[];
|
|
90
|
+
/**
|
|
91
|
+
* Normalized record of what wrote this memory, as opposed to `provider` — a free-text
|
|
92
|
+
* model/provider label that several auto-capture paths have been overloading to mean
|
|
93
|
+
* "who stored this" ('test_oracle_auto', 'checkpoint', 'git-commit', 'pr-review'). Absent
|
|
94
|
+
* on entries written before this existed; `entrySource()` back-derives one from `provider`
|
|
95
|
+
* for those, so stats never report a corpus as entirely unknown just because it predates
|
|
96
|
+
* the field. Exists so a misbehaving auto-capture path can be identified as a group.
|
|
97
|
+
*/
|
|
98
|
+
source?: BrainSource;
|
|
99
|
+
/**
|
|
100
|
+
* Git HEAD and branch at store time, when the memory was stored inside a git repo.
|
|
101
|
+
* Absent otherwise (and on every entry written before this existed). Freshness never
|
|
102
|
+
* consults these — a hash mismatch is still a hash mismatch — but a *stale* result uses
|
|
103
|
+
* them to say whether the tracked code actually changed or whether the caller is simply
|
|
104
|
+
* standing on a different branch than the memory was recorded on. Those two look
|
|
105
|
+
* identical to a content hash and are completely different situations for the reader.
|
|
106
|
+
*/
|
|
107
|
+
gitCommit?: string;
|
|
108
|
+
gitBranch?: string;
|
|
109
|
+
/**
|
|
110
|
+
* Set by refresh(): when this memory's evidence was last re-anchored to current code.
|
|
111
|
+
* Absent means never refreshed. Ranking treats this as the entry's effective age — a
|
|
112
|
+
* re-verified memory is young again — while `timestamp` keeps the original creation time
|
|
113
|
+
* so provenance is never rewritten.
|
|
114
|
+
*/
|
|
115
|
+
refreshedAt?: string;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Who wrote a memory. 'manual' is an explicit store_memory call; every 'auto-*' value is a
|
|
119
|
+
* capture path that fires without the agent asking; 'import' came from another machine via
|
|
120
|
+
* importBundle (so its tracked paths may not exist here at all).
|
|
121
|
+
*/
|
|
122
|
+
export type BrainSource = 'manual' | 'auto-test' | 'auto-checkpoint' | 'auto-git' | 'auto-pr-review' | 'import';
|
|
123
|
+
/**
|
|
124
|
+
* Optional store() fields that arrived after its positional signature was already eleven
|
|
125
|
+
* parameters long. Everything here is additive: omitting the object entirely reproduces
|
|
126
|
+
* pre-existing behavior byte for byte.
|
|
127
|
+
*/
|
|
128
|
+
export interface BrainStoreOptions {
|
|
129
|
+
/** See BrainEntry.source. Defaults to 'manual'. */
|
|
130
|
+
source?: BrainSource;
|
|
131
|
+
/**
|
|
132
|
+
* Preserve an origin machine's git context instead of stamping this checkout's. Only
|
|
133
|
+
* importBundle passes these — a local store always records where it actually happened.
|
|
134
|
+
*/
|
|
135
|
+
gitCommit?: string;
|
|
136
|
+
gitBranch?: string;
|
|
137
|
+
/** Skip recording git context entirely (importBundle for entries that never had any). */
|
|
138
|
+
skipGitContext?: boolean;
|
|
139
|
+
/** Preserve the original creation time (importBundle). Defaults to now. */
|
|
140
|
+
timestamp?: string;
|
|
90
141
|
}
|
|
91
142
|
export interface Claim {
|
|
92
143
|
id: string;
|
|
@@ -122,6 +173,10 @@ export interface VerifyMemoryResult {
|
|
|
122
173
|
claimBreakdown?: ClaimFreshness[];
|
|
123
174
|
/** Fase D, only set under semanticDiff: symbols whose raw hash changed but only cosmetically. */
|
|
124
175
|
cosmeticChanges?: string[];
|
|
176
|
+
/** See BrainSearchResult.staleCause. Only set on status 'stale'. */
|
|
177
|
+
staleCause?: StaleCause;
|
|
178
|
+
/** Only set alongside staleCause 'branch-changed'. */
|
|
179
|
+
storedOnBranch?: string;
|
|
125
180
|
}
|
|
126
181
|
export interface SymbolRef {
|
|
127
182
|
/** Relative or absolute; resolved against process.cwd() the same way filePaths is. */
|
|
@@ -142,7 +197,23 @@ export interface BrainSearchResult {
|
|
|
142
197
|
domain?: string;
|
|
143
198
|
/** Fase D, only set under semanticDiff: symbols whose raw hash changed but only cosmetically. */
|
|
144
199
|
cosmeticChanges?: string[];
|
|
200
|
+
/**
|
|
201
|
+
* Only set when !fresh. Distinguishes "the code this was recorded against really changed"
|
|
202
|
+
* from "you're on a different branch than the memory was recorded on" — the second is
|
|
203
|
+
* usually not a reason to distrust the memory, but a raw hash mismatch reports both
|
|
204
|
+
* identically. See attributeStaleness().
|
|
205
|
+
*/
|
|
206
|
+
staleCause?: StaleCause;
|
|
207
|
+
/** Only set alongside staleCause 'branch-changed': the branch this memory was stored on. */
|
|
208
|
+
storedOnBranch?: string;
|
|
145
209
|
}
|
|
210
|
+
/**
|
|
211
|
+
* Why a stale result is stale. 'content-changed' is the ordinary case: the tracked code
|
|
212
|
+
* differs on the branch it was recorded on. 'branch-changed' means the caller has simply
|
|
213
|
+
* moved to a different branch since — the memory may well still be accurate on its own
|
|
214
|
+
* branch, and switching back would make it fresh again with nothing else changing.
|
|
215
|
+
*/
|
|
216
|
+
export type StaleCause = 'content-changed' | 'branch-changed';
|
|
146
217
|
export interface BrainSearchOptions {
|
|
147
218
|
/**
|
|
148
219
|
* Set false for internal lookups (duplicate detection) so they don't register as cache
|
|
@@ -170,7 +241,64 @@ export interface BrainStats {
|
|
|
170
241
|
bloomFilterSize: number;
|
|
171
242
|
cacheHits: number;
|
|
172
243
|
cacheMisses: number;
|
|
244
|
+
/** Entries no search has ever returned as a top hit. Dead weight, evicted first. */
|
|
245
|
+
neverHit?: number;
|
|
246
|
+
/** Entries with at least one downvote_memory against them. */
|
|
247
|
+
downvoted?: number;
|
|
248
|
+
/** Entry count per `source` (see entrySource(): legacy entries are back-derived). */
|
|
249
|
+
bySource?: Record<string, number>;
|
|
250
|
+
/** Distinct projectIds represented, plus how many entries predate project scoping. */
|
|
251
|
+
projects?: number;
|
|
252
|
+
unscopedEntries?: number;
|
|
253
|
+
/** ISO timestamp of the oldest entry still in the corpus. */
|
|
254
|
+
oldestEntry?: string;
|
|
255
|
+
/** Bytes the persisted corpus occupies on disk. */
|
|
256
|
+
corpusBytes?: number;
|
|
257
|
+
/** Ids deleted via forget()/eviction and still suppressed on merge. */
|
|
258
|
+
tombstones?: number;
|
|
259
|
+
/**
|
|
260
|
+
* Only under { deep: true }: entries whose tracked evidence no longer matches. This one
|
|
261
|
+
* re-hashes every tracked file/symbol in the corpus, so it is deliberately opt-in — on a
|
|
262
|
+
* full 8,000-entry Brain it is thousands of file reads.
|
|
263
|
+
*/
|
|
264
|
+
staleEntries?: number;
|
|
265
|
+
/** Only under { deep: true }: staleEntries as a fraction of entries that track anything. */
|
|
266
|
+
staleRatio?: number;
|
|
173
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* Union two views of the corpus. Never subtracts: an id present in either side survives
|
|
270
|
+
* unless it is tombstoned, because "absent from my copy" and "deleted" are indistinguishable
|
|
271
|
+
* from inside one process, and guessing wrong loses a user's memory permanently.
|
|
272
|
+
*
|
|
273
|
+
* For an id on both sides, the newer version (by refreshedAt/timestamp) supplies the content
|
|
274
|
+
* and the counters take the max of both — `hits` and `demerits` are monotonic tallies that
|
|
275
|
+
* each process accumulated independently, so max is the only merge that doesn't discard
|
|
276
|
+
* feedback one of them collected.
|
|
277
|
+
*/
|
|
278
|
+
export declare function mergeEntryMaps(mine: Map<string, BrainEntry>, theirs: Map<string, BrainEntry>, tombstones?: Set<string>): Map<string, BrainEntry>;
|
|
279
|
+
export declare function currentGitContext(cwd?: string): {
|
|
280
|
+
commit?: string;
|
|
281
|
+
branch?: string;
|
|
282
|
+
};
|
|
283
|
+
/** Test seam: forget the cached git context so a test can change branches mid-run. */
|
|
284
|
+
export declare function resetGitContextCache(): void;
|
|
285
|
+
/**
|
|
286
|
+
* Why a stale entry is stale. Pure attribution over data already gathered — it never
|
|
287
|
+
* changes whether something is stale, only how the staleness is explained.
|
|
288
|
+
*/
|
|
289
|
+
export declare function attributeStaleness(entry: BrainEntry, git: {
|
|
290
|
+
commit?: string;
|
|
291
|
+
branch?: string;
|
|
292
|
+
}): {
|
|
293
|
+
staleCause: StaleCause;
|
|
294
|
+
storedOnBranch?: string;
|
|
295
|
+
};
|
|
296
|
+
/**
|
|
297
|
+
* Normalized provenance for an entry, back-deriving one for entries written before `source`
|
|
298
|
+
* existed. Those overloaded the free-text `provider` field with the same information, so
|
|
299
|
+
* reading it here keeps historical stats meaningful instead of a wall of "unknown".
|
|
300
|
+
*/
|
|
301
|
+
export declare function entrySource(entry: BrainEntry): BrainSource | 'unknown';
|
|
174
302
|
/**
|
|
175
303
|
* Stable identity for the project a memory belongs to.
|
|
176
304
|
*
|
|
@@ -272,19 +400,56 @@ export declare class TheBrainV2 {
|
|
|
272
400
|
private sessionMisses;
|
|
273
401
|
private dirty;
|
|
274
402
|
private flushTimer;
|
|
403
|
+
/** State of entries.ndjson as of our last read/write — see syncIfChanged(). */
|
|
404
|
+
private diskStamp;
|
|
405
|
+
/** id -> ISO deletion time, for ids that must not come back through a merge. */
|
|
406
|
+
private tombstones;
|
|
275
407
|
constructor();
|
|
276
408
|
private ensureDir;
|
|
277
409
|
private load;
|
|
410
|
+
/** Recomputes the inverted index from scratch over the current entries. */
|
|
411
|
+
private rebuildIndex;
|
|
412
|
+
/**
|
|
413
|
+
* Pull in anything another process wrote since we last touched the corpus.
|
|
414
|
+
*
|
|
415
|
+
* Called at the top of every read path. Two statSync calls when nothing changed (the
|
|
416
|
+
* overwhelmingly common case) is far below the cost of the search that follows, and it
|
|
417
|
+
* turns sibling sessions from a data-loss hazard into a live shared corpus: a memory
|
|
418
|
+
* stored in one project's session is searchable from another within one tool call.
|
|
419
|
+
*
|
|
420
|
+
* Merges rather than reloads, so memories stored locally but not yet flushed survive.
|
|
421
|
+
*/
|
|
422
|
+
private syncIfChanged;
|
|
278
423
|
private recalcAvgDocLength;
|
|
279
424
|
private scheduleSave;
|
|
280
425
|
private save;
|
|
426
|
+
/**
|
|
427
|
+
* Pull in deletions made by other processes.
|
|
428
|
+
*
|
|
429
|
+
* Tombstones are shared state, not per-process bookkeeping: a peer that deleted a memory
|
|
430
|
+
* wrote the tombstone to meta.json, and a process that still holds the entry in memory
|
|
431
|
+
* would otherwise merge it right back on its next flush — undoing a deliberate deletion
|
|
432
|
+
* from a session that had nothing to do with it.
|
|
433
|
+
*/
|
|
434
|
+
private absorbPeerTombstones;
|
|
435
|
+
/**
|
|
436
|
+
* Records an id as deliberately deleted, so a merge with a peer that still holds it
|
|
437
|
+
* doesn't resurrect it. Without this, forget() would be undone the moment any other
|
|
438
|
+
* session flushed, and eviction would thrash forever between two processes.
|
|
439
|
+
*/
|
|
440
|
+
private tombstone;
|
|
441
|
+
/** Drops tombstones older than TOMBSTONE_TTL_MS — by then no peer still holds the entry. */
|
|
442
|
+
private pruneTombstones;
|
|
443
|
+
/** Removes an entry from the in-memory corpus and the inverted index. No persistence. */
|
|
444
|
+
private dropEntry;
|
|
281
445
|
/**
|
|
282
446
|
* Store a query+response pair in the brain.
|
|
283
447
|
* Returns false if detected as duplicate (>= dupThreshold similarity).
|
|
284
448
|
*/
|
|
285
|
-
store(query: string, response: string, provider?: string, dupThreshold?: number, filePaths?: string[], projectId?: string, outcome?: 'confirmed' | 'failed', symbolRefs?: SymbolRef[], claimInputs?: ClaimInput[], domain?: string, derivedFrom?: string[]): {
|
|
449
|
+
store(query: string, response: string, provider?: string, dupThreshold?: number, filePaths?: string[], projectId?: string, outcome?: 'confirmed' | 'failed', symbolRefs?: SymbolRef[], claimInputs?: ClaimInput[], domain?: string, derivedFrom?: string[], options?: BrainStoreOptions): {
|
|
286
450
|
stored: boolean;
|
|
287
451
|
reason: string;
|
|
452
|
+
id?: string;
|
|
288
453
|
duplicate?: BrainSearchResult;
|
|
289
454
|
conflicts?: Array<{
|
|
290
455
|
id: string;
|
|
@@ -318,6 +483,21 @@ export declare class TheBrainV2 {
|
|
|
318
483
|
* Entries belonging to a project, including the unscoped ones written before entries
|
|
319
484
|
* carried a projectId — same fallback rule search() uses, so counts and results agree.
|
|
320
485
|
*/
|
|
486
|
+
/**
|
|
487
|
+
* search(), with an optional semantic re-rank layered on top.
|
|
488
|
+
*
|
|
489
|
+
* BM25 still does the retrieving — this only reorders what it already found, and only
|
|
490
|
+
* when LEMMA_BRAIN_EMBEDDINGS is set and Ollama answers. With the flag off (the default)
|
|
491
|
+
* this is exactly `search()` plus one boolean check, so callers can use it unconditionally
|
|
492
|
+
* and no session pays for a feature it hasn't turned on. See BrainEmbeddings.ts.
|
|
493
|
+
*
|
|
494
|
+
* The candidate pool is widened before re-ranking: re-ordering the same `limit` results
|
|
495
|
+
* BM25 already picked can only shuffle them, never surface the memory BM25 ranked 9th
|
|
496
|
+
* because it happened to use different words — which is the entire point.
|
|
497
|
+
*/
|
|
498
|
+
searchHybrid(query: string, limit?: number, minSimilarity?: number, options?: BrainSearchOptions): Promise<BrainSearchResult[]>;
|
|
499
|
+
private sidecar;
|
|
500
|
+
private embeddingSidecar;
|
|
321
501
|
getEntriesForProject(projectId: string): BrainEntry[];
|
|
322
502
|
/**
|
|
323
503
|
* Check if a query is likely a duplicate before storing.
|
|
@@ -340,6 +520,59 @@ export declare class TheBrainV2 {
|
|
|
340
520
|
ok: boolean;
|
|
341
521
|
message: string;
|
|
342
522
|
};
|
|
523
|
+
/**
|
|
524
|
+
* Permanently remove one memory.
|
|
525
|
+
*
|
|
526
|
+
* The Brain had no way to delete anything: downvote() only demotes, and eviction only
|
|
527
|
+
* fires at capacity. A memory that is simply wrong, or that captured something that
|
|
528
|
+
* should never have been stored, had no exit — the only recourse was to downvote it
|
|
529
|
+
* repeatedly and wait for the corpus to fill up. This is that exit.
|
|
530
|
+
*
|
|
531
|
+
* The id is tombstoned as well as dropped, so a concurrent session's merge can't hand it
|
|
532
|
+
* straight back. The bloom filter cannot un-add a key, so the deleted query may still
|
|
533
|
+
* register as a possible duplicate later; that costs one extra dedup search and never
|
|
534
|
+
* produces a wrong answer, which is the right side of that trade for a probabilistic
|
|
535
|
+
* filter that is rebuilt on the next clear().
|
|
536
|
+
*/
|
|
537
|
+
forget(id: string): {
|
|
538
|
+
ok: boolean;
|
|
539
|
+
message: string;
|
|
540
|
+
forgotten?: {
|
|
541
|
+
id: string;
|
|
542
|
+
query: string;
|
|
543
|
+
timestamp: string;
|
|
544
|
+
hits: number;
|
|
545
|
+
};
|
|
546
|
+
};
|
|
547
|
+
/**
|
|
548
|
+
* Re-verify a memory against the code as it stands now, keeping its identity.
|
|
549
|
+
*
|
|
550
|
+
* Staleness used to be terminal: once tracked evidence changed, an entry was stale
|
|
551
|
+
* forever, even in the very common case where the insight is still true and the code just
|
|
552
|
+
* moved. The only workaround was to store a near-duplicate — which store()'s own dedup
|
|
553
|
+
* guard would often refuse — losing the entry's id, its hit count, its demerits, and every
|
|
554
|
+
* `derivedFrom` edge pointing at it.
|
|
555
|
+
*
|
|
556
|
+
* With no arguments this re-hashes whatever the entry already tracks (and each claim's own
|
|
557
|
+
* evidence), which is the "yes, I checked, this is still correct" path. Passing filePaths
|
|
558
|
+
* or symbols instead re-points the entry at new evidence, which is the "the code moved"
|
|
559
|
+
* path. Either way the caller is asserting the memory is currently true — this tool
|
|
560
|
+
* records that assertion, it cannot verify it, so it is never called automatically.
|
|
561
|
+
*
|
|
562
|
+
* `derivedFrom` dependencies are deliberately not re-anchored: a conclusion inherited from
|
|
563
|
+
* a memory that is itself stale is exactly what Fase B exists to catch, and silently
|
|
564
|
+
* clearing that would defeat it. Those come back in `stillStale` instead.
|
|
565
|
+
*/
|
|
566
|
+
refresh(id: string, opts?: {
|
|
567
|
+
filePaths?: string[];
|
|
568
|
+
symbols?: SymbolRef[];
|
|
569
|
+
}): {
|
|
570
|
+
ok: boolean;
|
|
571
|
+
message: string;
|
|
572
|
+
fresh?: boolean;
|
|
573
|
+
retracked?: string[];
|
|
574
|
+
stillStale?: string[];
|
|
575
|
+
};
|
|
343
576
|
/**
|
|
344
577
|
* Revalidate ids from a prior search_memory/store_memory result via hash-compare only —
|
|
345
578
|
* no BM25, no `search()`. `ids` may mix entry ids and claim ids freely; each resolves
|
|
@@ -356,7 +589,56 @@ export declare class TheBrainV2 {
|
|
|
356
589
|
* next search) — see findBlastRadius for the algorithm and cost.
|
|
357
590
|
*/
|
|
358
591
|
findBlastRadius(filePath: string, symbolName?: string): BlastRadiusResult;
|
|
359
|
-
|
|
592
|
+
/**
|
|
593
|
+
* Serialize memories to a portable NDJSON bundle: a header line, then one entry per line.
|
|
594
|
+
*
|
|
595
|
+
* The Brain is a single file under one user's home directory with no way in or out. That
|
|
596
|
+
* makes it unshareable with a teammate, unmovable to another machine, and unbackupable
|
|
597
|
+
* except by copying the directory wholesale (which also copies every other project's
|
|
598
|
+
* memories). This is the smallest thing that fixes all three.
|
|
599
|
+
*/
|
|
600
|
+
exportBundle(opts?: {
|
|
601
|
+
projectId?: string;
|
|
602
|
+
domain?: string;
|
|
603
|
+
includeStale?: boolean;
|
|
604
|
+
}): {
|
|
605
|
+
text: string;
|
|
606
|
+
count: number;
|
|
607
|
+
skippedStale: number;
|
|
608
|
+
};
|
|
609
|
+
/**
|
|
610
|
+
* Merge a bundle produced by exportBundle into this Brain.
|
|
611
|
+
*
|
|
612
|
+
* Import is additive and never destructive: an id already present keeps whichever version
|
|
613
|
+
* is newer and the higher of both counters (the same rule cross-process merging uses), and
|
|
614
|
+
* a tombstoned id stays deleted — importing a bundle must not resurrect something the user
|
|
615
|
+
* deliberately forgot.
|
|
616
|
+
*
|
|
617
|
+
* Imported entries keep their origin machine's absolute paths, so most of them will read
|
|
618
|
+
* as stale here until refresh() re-anchors them. That is the honest outcome: their
|
|
619
|
+
* evidence genuinely cannot be verified against this checkout, and reporting them as fresh
|
|
620
|
+
* would be the one failure mode this whole system is built to prevent.
|
|
621
|
+
*/
|
|
622
|
+
importBundle(text: string, opts?: {
|
|
623
|
+
markSource?: boolean;
|
|
624
|
+
}): {
|
|
625
|
+
ok: boolean;
|
|
626
|
+
imported: number;
|
|
627
|
+
updated: number;
|
|
628
|
+
skipped: number;
|
|
629
|
+
message: string;
|
|
630
|
+
};
|
|
631
|
+
/**
|
|
632
|
+
* Corpus counters, plus health signals that answer the question counts alone can't:
|
|
633
|
+
* is this Brain getting better or is it accumulating dead weight?
|
|
634
|
+
*
|
|
635
|
+
* Everything is computed from memory except `staleEntries`, which re-hashes every tracked
|
|
636
|
+
* file and symbol in the corpus and is therefore behind `deep` — on a full Brain that is
|
|
637
|
+
* thousands of file reads and has no business running on a routine stats call.
|
|
638
|
+
*/
|
|
639
|
+
getStats(options?: {
|
|
640
|
+
deep?: boolean;
|
|
641
|
+
}): BrainStats;
|
|
360
642
|
clear(): void;
|
|
361
643
|
}
|
|
362
644
|
export declare function getBrain(): TheBrainV2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TheBrainV2.d.ts","sourceRoot":"","sources":["../../../src/subconscious/TheBrainV2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"TheBrainV2.d.ts","sourceRoot":"","sources":["../../../src/subconscious/TheBrainV2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAInB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IACjC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;;;;;;;;OAQG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,WAAW,GACX,iBAAiB,GACjB,UAAU,GACV,gBAAgB,GAChB,QAAQ,CAAC;AAEb;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,iGAAiG;IACjG,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,kFAAkF;IAClF,cAAc,CAAC,EAAE,cAAc,EAAE,CAAC;IAClC,iGAAiG;IACjG,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,oEAAoE;IACpE,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,sFAAsF;IACtF,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IACjC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,4FAA4F;IAC5F,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IAMpB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4FAA4F;IAC5F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA4LD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAC/B,UAAU,GAAE,GAAG,CAAC,MAAM,CAAa,GAClC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAmBzB;AAiBD,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAwBnG;AAED,sFAAsF;AACtF,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAKrD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,CAUtE;AAID;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,CAqCnE;AAID;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA+D/C;AAoDD;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMvE;AAgBD,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAa;gBAEb,UAAU,CAAC,EAAE,MAAM;IAQ/B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOvB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQ1B,SAAS,IAAI,MAAM;CAGpB;AAID,wBAAgB,SAAS,CACvB,UAAU,EAAE,MAAM,EAAE,EACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,MAAM,CAWR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAO9E;AAwDD,+EAA+E;AAC/E,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAEnG;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAChC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,EAC9B,EAAE,EAAE,MAAM,GACT,aAAa,GAAG,SAAS,CAM3B;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAOpF;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAInC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IACjC,qHAAqH;IACrH,GAAG,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,8FAA8F;IAC9F,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B;AA6ED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,GAClB,iBAAiB,CAqCnB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,EACvD,KAAK,SAAI,EACT,OAAO,GAAE,GAAG,CAAC,MAAM,CAAa,EAChC,YAAY,UAAQ,GACnB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAiEtE;AAeD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,UAAQ,GAAG,cAAc,CAmDtF;AAID,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAA8C;IAChE,+EAA+E;IAC/E,OAAO,CAAC,SAAS,CAAmB;IACpC,gFAAgF;IAChF,OAAO,CAAC,UAAU,CAAkC;;IASpD,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,IAAI;IA6BZ,2EAA2E;IAC3E,OAAO,CAAC,YAAY;IAcpB;;;;;;;;;OASG;IACH,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,IAAI;IAsDZ;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAIjB,4FAA4F;IAC5F,OAAO,CAAC,eAAe;IAQvB,yFAAyF;IACzF,OAAO,CAAC,SAAS;IAYjB;;;OAGG;IACH,KAAK,CACH,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,SAAY,EACpB,YAAY,SAAO,EACnB,SAAS,CAAC,EAAE,MAAM,EAAE,EACpB,SAAS,GAAE,MAA0B,EACrC,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,EAChC,UAAU,CAAC,EAAE,SAAS,EAAE,EACxB,WAAW,CAAC,EAAE,UAAU,EAAE,EAC1B,MAAM,CAAC,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,EAAE,EACtB,OAAO,GAAE,iBAAsB,GAC9B;QACD,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,iBAAiB,CAAC;QAC9B,SAAS,CAAC,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,WAAW,GAAG,QAAQ,CAAA;SAAE,CAAC,CAAC;KACnF;IAqGD;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAQ;IAC3C,6FAA6F;IAC7F,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAO;IAE1C;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IA4B3B;;;OAGG;IACH,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,KAAK,SAAI,EACT,aAAa,SAAI,EACjB,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,EAAE;IA8KtB;;;OAGG;IACH;;;;;;;;;;;OAWG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,KAAK,SAAI,EACT,aAAa,SAAI,EACjB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAoD/B,OAAO,CAAC,OAAO,CAAiC;IAEhD,OAAO,CAAC,gBAAgB;IAKxB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE;IAQrD;;;OAGG;IACH,cAAc,CACZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,SAAS,SAAO,GACf;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAA;KAAE;IA6B7E;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAWtD;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG;QAClB,EAAE,EAAE,OAAO,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KAC5E;IAqBD;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CACL,EAAE,EAAE,MAAM,EACV,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAA;KAAO,GACzD;QACD,EAAE,EAAE,OAAO,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB;IAgFD;;;;;;OAMG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,kBAAkB,EAAE;IAyC1F;;;;OAIG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,iBAAiB;IAOzE;;;;;;;OAOG;IACH,YAAY,CAAC,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG;QACxF,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;KACtB;IA+BD;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG;QAC/D,EAAE,EAAE,OAAO,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB;IA6FD;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,UAAU;IAwDtD,KAAK,IAAI,IAAI;CAkBd;AAMD,wBAAgB,QAAQ,IAAI,UAAU,CAGrC"}
|