@theihtisham/agent-shadow-brain 5.2.0 → 6.0.2
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 +310 -1014
- package/dist/brain/agent-firewall.d.ts +7 -0
- package/dist/brain/agent-firewall.d.ts.map +1 -0
- package/dist/brain/agent-firewall.js +152 -0
- package/dist/brain/agent-firewall.js.map +1 -0
- package/dist/brain/agent-handoff.d.ts +19 -0
- package/dist/brain/agent-handoff.d.ts.map +1 -0
- package/dist/brain/agent-handoff.js +127 -0
- package/dist/brain/agent-handoff.js.map +1 -0
- package/dist/brain/air-gap.d.ts +23 -0
- package/dist/brain/air-gap.d.ts.map +1 -0
- package/dist/brain/air-gap.js +137 -0
- package/dist/brain/air-gap.js.map +1 -0
- package/dist/brain/attention-heatmap.d.ts +24 -0
- package/dist/brain/attention-heatmap.d.ts.map +1 -0
- package/dist/brain/attention-heatmap.js +108 -0
- package/dist/brain/attention-heatmap.js.map +1 -0
- package/dist/brain/auto-setup.js +19 -14
- package/dist/brain/auto-setup.js.map +1 -1
- package/dist/brain/auto-update.js +1 -1
- package/dist/brain/brain-3d.d.ts +79 -0
- package/dist/brain/brain-3d.d.ts.map +1 -0
- package/dist/brain/brain-3d.js +468 -0
- package/dist/brain/brain-3d.js.map +1 -0
- package/dist/brain/brain-active-learner.d.ts +74 -0
- package/dist/brain/brain-active-learner.d.ts.map +1 -0
- package/dist/brain/brain-active-learner.js +425 -0
- package/dist/brain/brain-active-learner.js.map +1 -0
- package/dist/brain/brain-ascii.d.ts +32 -0
- package/dist/brain/brain-ascii.d.ts.map +1 -0
- package/dist/brain/brain-ascii.js +402 -0
- package/dist/brain/brain-ascii.js.map +1 -0
- package/dist/brain/brain-chat.d.ts +42 -0
- package/dist/brain/brain-chat.d.ts.map +1 -0
- package/dist/brain/brain-chat.js +162 -0
- package/dist/brain/brain-chat.js.map +1 -0
- package/dist/brain/brain-cinema.d.ts +45 -0
- package/dist/brain/brain-cinema.d.ts.map +1 -0
- package/dist/brain/brain-cinema.js +393 -0
- package/dist/brain/brain-cinema.js.map +1 -0
- package/dist/brain/brain-coach.d.ts +45 -0
- package/dist/brain/brain-coach.d.ts.map +1 -0
- package/dist/brain/brain-coach.js +383 -0
- package/dist/brain/brain-coach.js.map +1 -0
- package/dist/brain/brain-consolidator.d.ts +56 -0
- package/dist/brain/brain-consolidator.d.ts.map +1 -0
- package/dist/brain/brain-consolidator.js +386 -0
- package/dist/brain/brain-consolidator.js.map +1 -0
- package/dist/brain/brain-contradictions.d.ts +57 -0
- package/dist/brain/brain-contradictions.d.ts.map +1 -0
- package/dist/brain/brain-contradictions.js +443 -0
- package/dist/brain/brain-contradictions.js.map +1 -0
- package/dist/brain/brain-diff.d.ts +61 -0
- package/dist/brain/brain-diff.d.ts.map +1 -0
- package/dist/brain/brain-diff.js +439 -0
- package/dist/brain/brain-diff.js.map +1 -0
- package/dist/brain/brain-dna.d.ts +59 -0
- package/dist/brain/brain-dna.d.ts.map +1 -0
- package/dist/brain/brain-dna.js +336 -0
- package/dist/brain/brain-dna.js.map +1 -0
- package/dist/brain/brain-doppelganger.d.ts +32 -0
- package/dist/brain/brain-doppelganger.d.ts.map +1 -0
- package/dist/brain/brain-doppelganger.js +417 -0
- package/dist/brain/brain-doppelganger.js.map +1 -0
- package/dist/brain/brain-encryption.d.ts +14 -0
- package/dist/brain/brain-encryption.d.ts.map +1 -0
- package/dist/brain/brain-encryption.js +68 -0
- package/dist/brain/brain-encryption.js.map +1 -0
- package/dist/brain/brain-exchange.d.ts +30 -0
- package/dist/brain/brain-exchange.d.ts.map +1 -0
- package/dist/brain/brain-exchange.js +106 -0
- package/dist/brain/brain-exchange.js.map +1 -0
- package/dist/brain/brain-garden.d.ts +18 -0
- package/dist/brain/brain-garden.d.ts.map +1 -0
- package/dist/brain/brain-garden.js +81 -0
- package/dist/brain/brain-garden.js.map +1 -0
- package/dist/brain/brain-graph-walker.d.ts +54 -0
- package/dist/brain/brain-graph-walker.d.ts.map +1 -0
- package/dist/brain/brain-graph-walker.js +412 -0
- package/dist/brain/brain-graph-walker.js.map +1 -0
- package/dist/brain/brain-holiday-card.d.ts +50 -0
- package/dist/brain/brain-holiday-card.d.ts.map +1 -0
- package/dist/brain/brain-holiday-card.js +432 -0
- package/dist/brain/brain-holiday-card.js.map +1 -0
- package/dist/brain/brain-memes.d.ts +44 -0
- package/dist/brain/brain-memes.d.ts.map +1 -0
- package/dist/brain/brain-memes.js +438 -0
- package/dist/brain/brain-memes.js.map +1 -0
- package/dist/brain/brain-memory-tiers.d.ts +67 -0
- package/dist/brain/brain-memory-tiers.d.ts.map +1 -0
- package/dist/brain/brain-memory-tiers.js +292 -0
- package/dist/brain/brain-memory-tiers.js.map +1 -0
- package/dist/brain/brain-notebook.d.ts +68 -0
- package/dist/brain/brain-notebook.d.ts.map +1 -0
- package/dist/brain/brain-notebook.js +379 -0
- package/dist/brain/brain-notebook.js.map +1 -0
- package/dist/brain/brain-portability.js +1 -1
- package/dist/brain/brain-quantize.d.ts +62 -0
- package/dist/brain/brain-quantize.d.ts.map +1 -0
- package/dist/brain/brain-quantize.js +346 -0
- package/dist/brain/brain-quantize.js.map +1 -0
- package/dist/brain/brain-query-expander.d.ts +31 -0
- package/dist/brain/brain-query-expander.d.ts.map +1 -0
- package/dist/brain/brain-query-expander.js +417 -0
- package/dist/brain/brain-query-expander.js.map +1 -0
- package/dist/brain/brain-quest.d.ts +58 -0
- package/dist/brain/brain-quest.d.ts.map +1 -0
- package/dist/brain/brain-quest.js +541 -0
- package/dist/brain/brain-quest.js.map +1 -0
- package/dist/brain/brain-recall-cache.d.ts +73 -0
- package/dist/brain/brain-recall-cache.d.ts.map +1 -0
- package/dist/brain/brain-recall-cache.js +444 -0
- package/dist/brain/brain-recall-cache.js.map +1 -0
- package/dist/brain/brain-reflex.d.ts +55 -0
- package/dist/brain/brain-reflex.d.ts.map +1 -0
- package/dist/brain/brain-reflex.js +364 -0
- package/dist/brain/brain-reflex.js.map +1 -0
- package/dist/brain/brain-replay.d.ts +74 -0
- package/dist/brain/brain-replay.d.ts.map +1 -0
- package/dist/brain/brain-replay.js +336 -0
- package/dist/brain/brain-replay.js.map +1 -0
- package/dist/brain/brain-rerank.d.ts +39 -0
- package/dist/brain/brain-rerank.d.ts.map +1 -0
- package/dist/brain/brain-rerank.js +216 -0
- package/dist/brain/brain-rerank.js.map +1 -0
- package/dist/brain/brain-roast.d.ts +44 -0
- package/dist/brain/brain-roast.d.ts.map +1 -0
- package/dist/brain/brain-roast.js +566 -0
- package/dist/brain/brain-roast.js.map +1 -0
- package/dist/brain/brain-sonification.d.ts +57 -0
- package/dist/brain/brain-sonification.d.ts.map +1 -0
- package/dist/brain/brain-sonification.js +286 -0
- package/dist/brain/brain-sonification.js.map +1 -0
- package/dist/brain/brain-tarot.d.ts +49 -0
- package/dist/brain/brain-tarot.d.ts.map +1 -0
- package/dist/brain/brain-tarot.js +634 -0
- package/dist/brain/brain-tarot.js.map +1 -0
- package/dist/brain/brain-time-capsule.d.ts +80 -0
- package/dist/brain/brain-time-capsule.d.ts.map +1 -0
- package/dist/brain/brain-time-capsule.js +289 -0
- package/dist/brain/brain-time-capsule.js.map +1 -0
- package/dist/brain/brain-trophies.d.ts +60 -0
- package/dist/brain/brain-trophies.d.ts.map +1 -0
- package/dist/brain/brain-trophies.js +431 -0
- package/dist/brain/brain-trophies.js.map +1 -0
- package/dist/brain/brain-working-memory.d.ts +78 -0
- package/dist/brain/brain-working-memory.d.ts.map +1 -0
- package/dist/brain/brain-working-memory.js +367 -0
- package/dist/brain/brain-working-memory.js.map +1 -0
- package/dist/brain/branch-brain.d.ts +23 -0
- package/dist/brain/branch-brain.d.ts.map +1 -0
- package/dist/brain/branch-brain.js +159 -0
- package/dist/brain/branch-brain.js.map +1 -0
- package/dist/brain/calibration-monitor.d.ts +20 -0
- package/dist/brain/calibration-monitor.d.ts.map +1 -0
- package/dist/brain/calibration-monitor.js +144 -0
- package/dist/brain/calibration-monitor.js.map +1 -0
- package/dist/brain/causal-chains.d.ts +37 -0
- package/dist/brain/causal-chains.d.ts.map +1 -0
- package/dist/brain/causal-chains.js +250 -0
- package/dist/brain/causal-chains.js.map +1 -0
- package/dist/brain/collision-detective.d.ts +32 -0
- package/dist/brain/collision-detective.d.ts.map +1 -0
- package/dist/brain/collision-detective.js +233 -0
- package/dist/brain/collision-detective.js.map +1 -0
- package/dist/brain/confidence-gate.d.ts +69 -0
- package/dist/brain/confidence-gate.d.ts.map +1 -0
- package/dist/brain/confidence-gate.js +244 -0
- package/dist/brain/confidence-gate.js.map +1 -0
- package/dist/brain/constitution.d.ts +59 -0
- package/dist/brain/constitution.d.ts.map +1 -0
- package/dist/brain/constitution.js +315 -0
- package/dist/brain/constitution.js.map +1 -0
- package/dist/brain/cost-aware-spawner.d.ts +7 -0
- package/dist/brain/cost-aware-spawner.d.ts.map +1 -0
- package/dist/brain/cost-aware-spawner.js +77 -0
- package/dist/brain/cost-aware-spawner.js.map +1 -0
- package/dist/brain/dream-engine.d.ts +35 -0
- package/dist/brain/dream-engine.d.ts.map +1 -0
- package/dist/brain/dream-engine.js +273 -0
- package/dist/brain/dream-engine.js.map +1 -0
- package/dist/brain/embeddings-v2.d.ts +58 -0
- package/dist/brain/embeddings-v2.d.ts.map +1 -0
- package/dist/brain/embeddings-v2.js +344 -0
- package/dist/brain/embeddings-v2.js.map +1 -0
- package/dist/brain/embeddings.d.ts +27 -0
- package/dist/brain/embeddings.d.ts.map +1 -0
- package/dist/brain/embeddings.js +175 -0
- package/dist/brain/embeddings.js.map +1 -0
- package/dist/brain/forgetting-curve.d.ts +21 -0
- package/dist/brain/forgetting-curve.d.ts.map +1 -0
- package/dist/brain/forgetting-curve.js +174 -0
- package/dist/brain/forgetting-curve.js.map +1 -0
- package/dist/brain/formal-verification-bridge.d.ts +26 -0
- package/dist/brain/formal-verification-bridge.d.ts.map +1 -0
- package/dist/brain/formal-verification-bridge.js +219 -0
- package/dist/brain/formal-verification-bridge.js.map +1 -0
- package/dist/brain/global-brain.d.ts +8 -1
- package/dist/brain/global-brain.d.ts.map +1 -1
- package/dist/brain/global-brain.js +24 -0
- package/dist/brain/global-brain.js.map +1 -1
- package/dist/brain/hallucination-quarantine.d.ts +26 -0
- package/dist/brain/hallucination-quarantine.d.ts.map +1 -0
- package/dist/brain/hallucination-quarantine.js +135 -0
- package/dist/brain/hallucination-quarantine.js.map +1 -0
- package/dist/brain/hive-accelerator.d.ts +39 -0
- package/dist/brain/hive-accelerator.d.ts.map +1 -0
- package/dist/brain/hive-accelerator.js +152 -0
- package/dist/brain/hive-accelerator.js.map +1 -0
- package/dist/brain/hive-voice.d.ts +71 -0
- package/dist/brain/hive-voice.d.ts.map +1 -0
- package/dist/brain/hive-voice.js +352 -0
- package/dist/brain/hive-voice.js.map +1 -0
- package/dist/brain/json-output.d.ts +26 -0
- package/dist/brain/json-output.d.ts.map +1 -0
- package/dist/brain/json-output.js +112 -0
- package/dist/brain/json-output.js.map +1 -0
- package/dist/brain/l0-cache.js +1 -1
- package/dist/brain/l0-cache.js.map +1 -1
- package/dist/brain/local-llm.d.ts +20 -0
- package/dist/brain/local-llm.d.ts.map +1 -0
- package/dist/brain/local-llm.js +132 -0
- package/dist/brain/local-llm.js.map +1 -0
- package/dist/brain/markdown-export.d.ts +48 -0
- package/dist/brain/markdown-export.d.ts.map +1 -0
- package/dist/brain/markdown-export.js +382 -0
- package/dist/brain/markdown-export.js.map +1 -0
- package/dist/brain/mcp-server.d.ts +40 -0
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +395 -12
- package/dist/brain/mcp-server.js.map +1 -1
- package/dist/brain/model-registry.d.ts +96 -0
- package/dist/brain/model-registry.d.ts.map +1 -0
- package/dist/brain/model-registry.js +585 -0
- package/dist/brain/model-registry.js.map +1 -0
- package/dist/brain/multimodal-vision.d.ts +38 -0
- package/dist/brain/multimodal-vision.d.ts.map +1 -0
- package/dist/brain/multimodal-vision.js +257 -0
- package/dist/brain/multimodal-vision.js.map +1 -0
- package/dist/brain/orchestrator.js +1 -1
- package/dist/brain/otel-lite.d.ts +71 -0
- package/dist/brain/otel-lite.d.ts.map +1 -0
- package/dist/brain/otel-lite.js +232 -0
- package/dist/brain/otel-lite.js.map +1 -0
- package/dist/brain/pr-auto-review.d.ts +17 -0
- package/dist/brain/pr-auto-review.d.ts.map +1 -0
- package/dist/brain/pr-auto-review.js +73 -0
- package/dist/brain/pr-auto-review.js.map +1 -0
- package/dist/brain/pre-mortem.d.ts +21 -0
- package/dist/brain/pre-mortem.d.ts.map +1 -0
- package/dist/brain/pre-mortem.js +210 -0
- package/dist/brain/pre-mortem.js.map +1 -0
- package/dist/brain/prompt-cache.d.ts +54 -0
- package/dist/brain/prompt-cache.d.ts.map +1 -0
- package/dist/brain/prompt-cache.js +105 -0
- package/dist/brain/prompt-cache.js.map +1 -0
- package/dist/brain/reputation-ledger.d.ts +42 -0
- package/dist/brain/reputation-ledger.d.ts.map +1 -0
- package/dist/brain/reputation-ledger.js +326 -0
- package/dist/brain/reputation-ledger.js.map +1 -0
- package/dist/brain/session-hooks.d.ts +19 -0
- package/dist/brain/session-hooks.d.ts.map +1 -1
- package/dist/brain/session-hooks.js +249 -18
- package/dist/brain/session-hooks.js.map +1 -1
- package/dist/brain/subagent-bridge.d.ts +46 -0
- package/dist/brain/subagent-bridge.d.ts.map +1 -0
- package/dist/brain/subagent-bridge.js +364 -0
- package/dist/brain/subagent-bridge.js.map +1 -0
- package/dist/brain/swarm-debate.d.ts +22 -0
- package/dist/brain/swarm-debate.d.ts.map +1 -0
- package/dist/brain/swarm-debate.js +134 -0
- package/dist/brain/swarm-debate.js.map +1 -0
- package/dist/brain/team-brain-sync.d.ts +22 -0
- package/dist/brain/team-brain-sync.d.ts.map +1 -0
- package/dist/brain/team-brain-sync.js +132 -0
- package/dist/brain/team-brain-sync.js.map +1 -0
- package/dist/brain/token-economy.d.ts +25 -0
- package/dist/brain/token-economy.d.ts.map +1 -0
- package/dist/brain/token-economy.js +216 -0
- package/dist/brain/token-economy.js.map +1 -0
- package/dist/brain/voice-mode.d.ts +15 -0
- package/dist/brain/voice-mode.d.ts.map +1 -0
- package/dist/brain/voice-mode.js +97 -0
- package/dist/brain/voice-mode.js.map +1 -0
- package/dist/cli.js +1702 -4
- package/dist/cli.js.map +1 -1
- package/dist/dashboard/server.d.ts +6 -0
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +1118 -368
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/v6-dashboard-html.d.ts +2 -0
- package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -0
- package/dist/dashboard/v6-dashboard-html.js +2474 -0
- package/dist/dashboard/v6-dashboard-html.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +518 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +33 -4
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
// src/brain/brain-notebook.ts — Jupyter-style interactive brain explorer
|
|
2
|
+
// v6.0.2 — Multimodal Edition
|
|
3
|
+
//
|
|
4
|
+
// A .shadow-brain.notebook.md file format that mixes markdown narrative with
|
|
5
|
+
// executable "brain query" cells. Pure Markdown with HTML comments delimiting
|
|
6
|
+
// cell boundaries — renders cleanly on GitHub, diffable, and PR-reviewable.
|
|
7
|
+
//
|
|
8
|
+
// Cell kinds: markdown · query (recall|search|dna|replay|archetype|stats) · code
|
|
9
|
+
//
|
|
10
|
+
// Exposed: createNotebook, parse, runCell, runAll, save, toMarkdown
|
|
11
|
+
import * as fs from 'fs';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
const BRAIN_VERSION = '6.0.2';
|
|
14
|
+
const DEFAULT_DIR = '.shadow-brain/notebooks';
|
|
15
|
+
export class BrainNotebook {
|
|
16
|
+
/** Create a starter notebook on disk and return its path. */
|
|
17
|
+
async createNotebook(project, title) {
|
|
18
|
+
const now = new Date().toISOString();
|
|
19
|
+
const slug = slugify(title);
|
|
20
|
+
const dir = path.join(project, DEFAULT_DIR);
|
|
21
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
22
|
+
const filePath = path.join(dir, `${slug}.md`);
|
|
23
|
+
const nb = {
|
|
24
|
+
title,
|
|
25
|
+
cells: starterCells(),
|
|
26
|
+
metadata: { project, created: now, modified: now, brain_version: BRAIN_VERSION },
|
|
27
|
+
};
|
|
28
|
+
await this.save(nb, filePath);
|
|
29
|
+
return { path: filePath };
|
|
30
|
+
}
|
|
31
|
+
/** Parse a notebook from disk. */
|
|
32
|
+
async parse(filePath) {
|
|
33
|
+
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
34
|
+
return this.parseString(raw, filePath);
|
|
35
|
+
}
|
|
36
|
+
/** Parse a notebook from a raw string (useful for tests). */
|
|
37
|
+
parseString(raw, source = 'unknown') {
|
|
38
|
+
const lines = raw.split(/\r?\n/);
|
|
39
|
+
let i = 0;
|
|
40
|
+
// Title — first H1 (or the file basename as a fallback)
|
|
41
|
+
let title = path.basename(source, path.extname(source));
|
|
42
|
+
while (i < lines.length && !/^#\s+/.test(lines[i]))
|
|
43
|
+
i++;
|
|
44
|
+
if (i < lines.length) {
|
|
45
|
+
title = lines[i].replace(/^#\s+/, '').trim();
|
|
46
|
+
i++;
|
|
47
|
+
}
|
|
48
|
+
// Optional metadata block — <!-- meta: { ... } -->
|
|
49
|
+
let metadata = {
|
|
50
|
+
project: '',
|
|
51
|
+
created: new Date().toISOString(),
|
|
52
|
+
modified: new Date().toISOString(),
|
|
53
|
+
brain_version: BRAIN_VERSION,
|
|
54
|
+
};
|
|
55
|
+
while (i < lines.length && lines[i].trim() === '')
|
|
56
|
+
i++;
|
|
57
|
+
const metaMatch = i < lines.length ? lines[i].match(/^<!--\s*meta:\s*(\{.*\})\s*-->\s*$/) : null;
|
|
58
|
+
if (metaMatch) {
|
|
59
|
+
try {
|
|
60
|
+
const parsed = JSON.parse(metaMatch[1]);
|
|
61
|
+
metadata = { ...metadata, ...parsed };
|
|
62
|
+
}
|
|
63
|
+
catch { /* ignore corrupt meta */ }
|
|
64
|
+
i++;
|
|
65
|
+
}
|
|
66
|
+
const cells = [];
|
|
67
|
+
let buffer = [];
|
|
68
|
+
let current = null;
|
|
69
|
+
let pendingResult = null;
|
|
70
|
+
const flush = () => {
|
|
71
|
+
if (!current) {
|
|
72
|
+
// implicit markdown until first cell marker
|
|
73
|
+
const md = buffer.join('\n').trim();
|
|
74
|
+
if (md)
|
|
75
|
+
cells.push({ kind: 'markdown', source: md });
|
|
76
|
+
buffer = [];
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (current.kind === 'markdown') {
|
|
80
|
+
const src = buffer.join('\n').trim();
|
|
81
|
+
if (src)
|
|
82
|
+
cells.push({ kind: 'markdown', source: src });
|
|
83
|
+
}
|
|
84
|
+
else if (current.kind === 'query') {
|
|
85
|
+
const src = buffer.join('\n').trim();
|
|
86
|
+
const cell = { kind: 'query', queryType: current.queryType, source: src };
|
|
87
|
+
if (pendingResult) {
|
|
88
|
+
cell.lastRun = pendingResult.lastRun;
|
|
89
|
+
cell.lastResult = pendingResult.lines.join('\n').trim();
|
|
90
|
+
pendingResult = null;
|
|
91
|
+
}
|
|
92
|
+
cells.push(cell);
|
|
93
|
+
}
|
|
94
|
+
else if (current.kind === 'code') {
|
|
95
|
+
const src = buffer.join('\n').trim();
|
|
96
|
+
cells.push({ kind: 'code', language: current.language, source: stripCodeFence(src) });
|
|
97
|
+
}
|
|
98
|
+
buffer = [];
|
|
99
|
+
};
|
|
100
|
+
for (; i < lines.length; i++) {
|
|
101
|
+
const line = lines[i];
|
|
102
|
+
const cellMatch = line.match(/^<!--\s*cell:(markdown|query|code)(?:\s+([^>]*?))?\s*-->\s*$/);
|
|
103
|
+
const resultMatch = line.match(/^<!--\s*cell:query-result(?:\s+run=([^\s>]+))?\s*-->\s*$/);
|
|
104
|
+
const endMatch = line.match(/^<!--\s*\/cell:query-result\s*-->\s*$/);
|
|
105
|
+
if (resultMatch) {
|
|
106
|
+
// capture lines until matching end (or next cell marker)
|
|
107
|
+
const runTs = resultMatch[1] ?? new Date().toISOString();
|
|
108
|
+
const resLines = [];
|
|
109
|
+
i++;
|
|
110
|
+
while (i < lines.length) {
|
|
111
|
+
const ln = lines[i];
|
|
112
|
+
if (/^<!--\s*\/cell:query-result\s*-->\s*$/.test(ln))
|
|
113
|
+
break;
|
|
114
|
+
if (/^<!--\s*cell:(markdown|query|code)/.test(ln)) {
|
|
115
|
+
i--;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
resLines.push(ln);
|
|
119
|
+
i++;
|
|
120
|
+
}
|
|
121
|
+
pendingResult = { lastRun: runTs, lines: resLines };
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (endMatch)
|
|
125
|
+
continue;
|
|
126
|
+
if (cellMatch) {
|
|
127
|
+
flush();
|
|
128
|
+
const kind = cellMatch[1];
|
|
129
|
+
const attrs = parseAttrs(cellMatch[2] ?? '');
|
|
130
|
+
if (kind === 'query') {
|
|
131
|
+
const qt = attrs.type || 'recall';
|
|
132
|
+
current = { kind: 'query', queryType: qt };
|
|
133
|
+
}
|
|
134
|
+
else if (kind === 'code') {
|
|
135
|
+
const lang = attrs.language || attrs.lang || 'ts';
|
|
136
|
+
current = { kind: 'code', language: lang };
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
current = { kind: 'markdown' };
|
|
140
|
+
}
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
buffer.push(line);
|
|
144
|
+
}
|
|
145
|
+
flush();
|
|
146
|
+
return { title, cells, metadata };
|
|
147
|
+
}
|
|
148
|
+
/** Run a single cell. Markdown cells are no-ops; code cells echo with a TODO. */
|
|
149
|
+
async runCell(notebook, cellIndex) {
|
|
150
|
+
const cell = notebook.cells[cellIndex];
|
|
151
|
+
if (!cell)
|
|
152
|
+
throw new Error(`No cell at index ${cellIndex}`);
|
|
153
|
+
const start = Date.now();
|
|
154
|
+
let result = '';
|
|
155
|
+
if (cell.kind === 'markdown') {
|
|
156
|
+
result = '_(markdown cell — nothing to run)_';
|
|
157
|
+
}
|
|
158
|
+
else if (cell.kind === 'code') {
|
|
159
|
+
result = `_(code cell — execution sandboxed)_\n\nLanguage: ${cell.language}\nTODO: wire up a sandboxed runner.\n\n\`\`\`${cell.language}\n${cell.source}\n\`\`\``;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
result = await this.executeQuery(cell, notebook.metadata.project);
|
|
163
|
+
cell.lastResult = result;
|
|
164
|
+
cell.lastRun = new Date().toISOString();
|
|
165
|
+
}
|
|
166
|
+
return { result, durationMs: Date.now() - start };
|
|
167
|
+
}
|
|
168
|
+
/** Run every query cell in order. */
|
|
169
|
+
async runAll(notebook) {
|
|
170
|
+
const start = Date.now();
|
|
171
|
+
const out = [];
|
|
172
|
+
for (let i = 0; i < notebook.cells.length; i++) {
|
|
173
|
+
const cell = notebook.cells[i];
|
|
174
|
+
if (cell.kind !== 'query') {
|
|
175
|
+
out.push({ index: i, kind: cell.kind });
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
const r = await this.runCell(notebook, i);
|
|
180
|
+
out.push({ index: i, kind: cell.kind, result: r.result, durationMs: r.durationMs });
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
out.push({ index: i, kind: cell.kind, error: String(e.message ?? e) });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return { cells: out, totalDurationMs: Date.now() - start, ranAt: new Date().toISOString() };
|
|
187
|
+
}
|
|
188
|
+
/** Write the notebook back to disk with the latest run results inlined. */
|
|
189
|
+
async save(notebook, filePath) {
|
|
190
|
+
notebook.metadata.modified = new Date().toISOString();
|
|
191
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
192
|
+
const tmp = filePath + '.tmp';
|
|
193
|
+
fs.writeFileSync(tmp, this.toMarkdown(notebook));
|
|
194
|
+
fs.renameSync(tmp, filePath);
|
|
195
|
+
}
|
|
196
|
+
/** Render the notebook as a plain Markdown document. */
|
|
197
|
+
toMarkdown(notebook) {
|
|
198
|
+
const parts = [];
|
|
199
|
+
parts.push(`# ${notebook.title}`, '');
|
|
200
|
+
parts.push(`<!-- meta: ${JSON.stringify(notebook.metadata)} -->`, '');
|
|
201
|
+
for (const cell of notebook.cells) {
|
|
202
|
+
if (cell.kind === 'markdown') {
|
|
203
|
+
parts.push('<!-- cell:markdown -->');
|
|
204
|
+
parts.push(cell.source, '');
|
|
205
|
+
}
|
|
206
|
+
else if (cell.kind === 'query') {
|
|
207
|
+
parts.push(`<!-- cell:query type=${cell.queryType} -->`);
|
|
208
|
+
parts.push(cell.source, '');
|
|
209
|
+
if (cell.lastResult) {
|
|
210
|
+
parts.push(`<!-- cell:query-result run=${cell.lastRun ?? new Date().toISOString()} -->`);
|
|
211
|
+
parts.push(cell.lastResult);
|
|
212
|
+
parts.push('<!-- /cell:query-result -->', '');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
parts.push(`<!-- cell:code language=${cell.language} -->`);
|
|
217
|
+
parts.push('```' + cell.language, cell.source, '```', '');
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return parts.join('\n').replace(/\n{3,}/g, '\n\n');
|
|
221
|
+
}
|
|
222
|
+
// ── Query execution ──────────────────────────────────────────────────────
|
|
223
|
+
async executeQuery(cell, project) {
|
|
224
|
+
const q = cell.source.trim();
|
|
225
|
+
if (!q)
|
|
226
|
+
return '_(empty query — add a search term and re-run)_';
|
|
227
|
+
try {
|
|
228
|
+
switch (cell.queryType) {
|
|
229
|
+
case 'recall':
|
|
230
|
+
case 'search':
|
|
231
|
+
return await this.runRecall(q, project);
|
|
232
|
+
case 'dna':
|
|
233
|
+
return await this.runDna(q || project);
|
|
234
|
+
case 'replay':
|
|
235
|
+
return await this.runReplay(q);
|
|
236
|
+
case 'archetype':
|
|
237
|
+
return await this.runArchetype(q || project);
|
|
238
|
+
case 'stats':
|
|
239
|
+
return await this.runStats();
|
|
240
|
+
default:
|
|
241
|
+
return `_(unknown query type: ${cell.queryType})_`;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch (e) {
|
|
245
|
+
return `_(query failed: ${e.message ?? e})_`;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
async runRecall(query, project) {
|
|
249
|
+
const mod = await tryImport('./hierarchical-memory.js');
|
|
250
|
+
if (!mod)
|
|
251
|
+
return this.fallbackResult('hierarchical-memory module not loaded — install brain core to enable recall.');
|
|
252
|
+
const hm = typeof mod.getHierarchicalMemory === 'function' ? mod.getHierarchicalMemory() : null;
|
|
253
|
+
if (!hm || typeof hm.search !== 'function')
|
|
254
|
+
return this.fallbackResult('hierarchical-memory has no search() method available.');
|
|
255
|
+
const results = await hm.search({ query, project, limit: 10 }).catch(() => null);
|
|
256
|
+
if (!results || !Array.isArray(results) || results.length === 0)
|
|
257
|
+
return '_(no matching memories)_';
|
|
258
|
+
return results
|
|
259
|
+
.map((r, idx) => {
|
|
260
|
+
const id = r.id ?? r.memoryId ?? `mem_${idx}`;
|
|
261
|
+
const snippet = (r.snippet ?? r.content ?? r.text ?? '').toString().slice(0, 240);
|
|
262
|
+
const score = typeof r.score === 'number' ? ` _(score: ${r.score.toFixed(3)})_` : '';
|
|
263
|
+
return `${idx + 1}. \`${id}\`${score} — ${snippet}`;
|
|
264
|
+
})
|
|
265
|
+
.join('\n');
|
|
266
|
+
}
|
|
267
|
+
async runDna(project) {
|
|
268
|
+
const mod = await tryImport('./brain-dna.js');
|
|
269
|
+
if (!mod)
|
|
270
|
+
return this.fallbackResult('brain-dna module not loaded.');
|
|
271
|
+
const dna = typeof mod.getBrainDna === 'function' ? mod.getBrainDna() : null;
|
|
272
|
+
if (!dna || typeof dna.snapshot !== 'function')
|
|
273
|
+
return this.fallbackResult('brain-dna has no snapshot() method available.');
|
|
274
|
+
const snap = await dna.snapshot(project).catch(() => null);
|
|
275
|
+
if (!snap)
|
|
276
|
+
return '_(no DNA snapshot available)_';
|
|
277
|
+
return '```json\n' + JSON.stringify(snap, null, 2).slice(0, 4000) + '\n```';
|
|
278
|
+
}
|
|
279
|
+
async runReplay(target) {
|
|
280
|
+
const mod = await tryImport('./brain-replay.js');
|
|
281
|
+
if (!mod)
|
|
282
|
+
return this.fallbackResult('brain-replay module not loaded.');
|
|
283
|
+
const replay = typeof mod.getBrainReplay === 'function' ? mod.getBrainReplay() : null;
|
|
284
|
+
if (!replay || typeof replay.list !== 'function')
|
|
285
|
+
return this.fallbackResult('brain-replay has no list() method available.');
|
|
286
|
+
const sessions = await replay.list({ target, limit: 10 }).catch(() => null);
|
|
287
|
+
if (!sessions || !Array.isArray(sessions) || sessions.length === 0)
|
|
288
|
+
return '_(no replay sessions found)_';
|
|
289
|
+
return sessions.map((s, idx) => `${idx + 1}. \`${s.id ?? idx}\` — ${s.title ?? s.description ?? 'session'} (${s.startedAt ?? 'unknown'})`).join('\n');
|
|
290
|
+
}
|
|
291
|
+
async runArchetype(project) {
|
|
292
|
+
const mod = await tryImport('./brain-archetypes.js');
|
|
293
|
+
if (!mod)
|
|
294
|
+
return this.fallbackResult('brain-archetypes module not loaded.');
|
|
295
|
+
const arch = typeof mod.getBrainArchetypes === 'function' ? mod.getBrainArchetypes() : null;
|
|
296
|
+
if (!arch || typeof arch.classify !== 'function')
|
|
297
|
+
return this.fallbackResult('brain-archetypes has no classify() method available.');
|
|
298
|
+
const result = await arch.classify(project).catch(() => null);
|
|
299
|
+
if (!result)
|
|
300
|
+
return '_(no archetype available)_';
|
|
301
|
+
return '```json\n' + JSON.stringify(result, null, 2).slice(0, 2000) + '\n```';
|
|
302
|
+
}
|
|
303
|
+
async runStats() {
|
|
304
|
+
const mod = await tryImport('./hierarchical-memory.js');
|
|
305
|
+
if (!mod)
|
|
306
|
+
return this.fallbackResult('hierarchical-memory module not loaded.');
|
|
307
|
+
const hm = typeof mod.getHierarchicalMemory === 'function' ? mod.getHierarchicalMemory() : null;
|
|
308
|
+
if (!hm || typeof hm.stats !== 'function')
|
|
309
|
+
return this.fallbackResult('hierarchical-memory has no stats() method available.');
|
|
310
|
+
const stats = await hm.stats().catch(() => null);
|
|
311
|
+
if (!stats)
|
|
312
|
+
return '_(no stats available)_';
|
|
313
|
+
return '```json\n' + JSON.stringify(stats, null, 2).slice(0, 2000) + '\n```';
|
|
314
|
+
}
|
|
315
|
+
fallbackResult(reason) {
|
|
316
|
+
return `_(empty-state: ${reason})_\n\nThis cell will populate once the brain core is wired up. The notebook itself is fully functional — re-run when modules become available.`;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// ── Helpers ───────────────────────────────────────────────────────────────
|
|
320
|
+
function slugify(s) {
|
|
321
|
+
return s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 60) || 'notebook';
|
|
322
|
+
}
|
|
323
|
+
function parseAttrs(s) {
|
|
324
|
+
const out = {};
|
|
325
|
+
const rx = /(\w+)\s*=\s*("([^"]*)"|'([^']*)'|(\S+))/g;
|
|
326
|
+
let m;
|
|
327
|
+
while ((m = rx.exec(s)) !== null) {
|
|
328
|
+
out[m[1]] = m[3] ?? m[4] ?? m[5] ?? '';
|
|
329
|
+
}
|
|
330
|
+
return out;
|
|
331
|
+
}
|
|
332
|
+
function stripCodeFence(src) {
|
|
333
|
+
const m = src.match(/^```\w*\n([\s\S]*?)\n```\s*$/);
|
|
334
|
+
return m ? m[1] : src;
|
|
335
|
+
}
|
|
336
|
+
async function tryImport(spec) {
|
|
337
|
+
try {
|
|
338
|
+
return await import(spec).catch(() => null);
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
function starterCells() {
|
|
345
|
+
return [
|
|
346
|
+
{
|
|
347
|
+
kind: 'markdown',
|
|
348
|
+
source: 'This is a **Shadow Brain notebook** — a Jupyter-style explorer for your project memory.\n\nEach `query` cell below runs against your local brain. Edit the source, then re-run to refresh the inlined result.',
|
|
349
|
+
},
|
|
350
|
+
{ kind: 'query', queryType: 'stats', source: '(no input — returns brain-wide stats)' },
|
|
351
|
+
{
|
|
352
|
+
kind: 'markdown',
|
|
353
|
+
source: '## Try a recall\n\nReplace the query below with anything you want to investigate.',
|
|
354
|
+
},
|
|
355
|
+
{ kind: 'query', queryType: 'recall', source: 'recent decisions in this project' },
|
|
356
|
+
{
|
|
357
|
+
kind: 'markdown',
|
|
358
|
+
source: '## Check the project archetype\n\nWhat kind of project does the brain think this is?',
|
|
359
|
+
},
|
|
360
|
+
{ kind: 'query', queryType: 'archetype', source: 'default project' },
|
|
361
|
+
{
|
|
362
|
+
kind: 'markdown',
|
|
363
|
+
source: '## Notes\n\nWrite anything here — this is a normal Markdown document. Add a `<!-- cell:code language=ts -->` block to keep code snippets near your investigation.',
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
kind: 'code',
|
|
367
|
+
language: 'ts',
|
|
368
|
+
source: '// Example snippet — wire your own thoughts here.\nconst summary = "this notebook is git-trackable and PR-reviewable";',
|
|
369
|
+
},
|
|
370
|
+
];
|
|
371
|
+
}
|
|
372
|
+
let _instance = null;
|
|
373
|
+
export function getBrainNotebook() {
|
|
374
|
+
if (!_instance)
|
|
375
|
+
_instance = new BrainNotebook();
|
|
376
|
+
return _instance;
|
|
377
|
+
}
|
|
378
|
+
export function resetBrainNotebookForTests() { _instance = null; }
|
|
379
|
+
//# sourceMappingURL=brain-notebook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-notebook.js","sourceRoot":"","sources":["../../src/brain/brain-notebook.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ export class BrainPortability {
|
|
|
35
35
|
const fileName = `brain-${projectName}-${timestamp}.json`;
|
|
36
36
|
const filePath = path.join(this.exportDir, fileName);
|
|
37
37
|
const data = {
|
|
38
|
-
version: '5.0
|
|
38
|
+
version: '5.2.0',
|
|
39
39
|
exportedAt: new Date(),
|
|
40
40
|
projectName,
|
|
41
41
|
projectDir: this.projectDir,
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export interface CompressionReport {
|
|
2
|
+
originalBytes: number;
|
|
3
|
+
compressedBytes: number;
|
|
4
|
+
compressionRatio: number;
|
|
5
|
+
vectorCount: number;
|
|
6
|
+
dim: number;
|
|
7
|
+
encodingError: {
|
|
8
|
+
meanAbs: number;
|
|
9
|
+
max: number;
|
|
10
|
+
};
|
|
11
|
+
durationMs: number;
|
|
12
|
+
}
|
|
13
|
+
export interface QuantizedEntry {
|
|
14
|
+
q: Int8Array;
|
|
15
|
+
scale: number;
|
|
16
|
+
}
|
|
17
|
+
export interface CompressedIndex {
|
|
18
|
+
vectors: Map<string, QuantizedEntry>;
|
|
19
|
+
dim: number;
|
|
20
|
+
recallFn: (query: number[], topK: number) => Array<{
|
|
21
|
+
id: string;
|
|
22
|
+
score: number;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
export interface RoundtripErrorReport {
|
|
26
|
+
meanAbs: number;
|
|
27
|
+
max: number;
|
|
28
|
+
samples: number;
|
|
29
|
+
}
|
|
30
|
+
export declare class BrainQuantize {
|
|
31
|
+
/** Symmetric int8 quantization with per-vector scale. */
|
|
32
|
+
quantize(vector: number[]): Int8Array;
|
|
33
|
+
/** Recover an approximation of the original float vector. */
|
|
34
|
+
dequantize(q: Int8Array, scale: number): number[];
|
|
35
|
+
/**
|
|
36
|
+
* Cosine similarity on quantized vectors WITHOUT dequantizing first.
|
|
37
|
+
*
|
|
38
|
+
* If `a` and `b` were derived from unit-norm float vectors, the cosine is
|
|
39
|
+
* just the dot product after rescaling. We compute the integer dot then
|
|
40
|
+
* apply `scaleA * scaleB` to convert back to the float dot, and clamp to
|
|
41
|
+
* [-1, 1] for numeric safety. Note: the dim/127^2 factor in the spec is the
|
|
42
|
+
* theoretical worst-case scale (when every element is ±127); the actual
|
|
43
|
+
* normalization is captured entirely by scaleA*scaleB, so we use that and
|
|
44
|
+
* do not double-divide. The clamp guards against quantization rounding
|
|
45
|
+
* pushing the result slightly out of range.
|
|
46
|
+
*/
|
|
47
|
+
cosineQuantized(a: Int8Array, scaleA: number, b: Int8Array, scaleB: number): number;
|
|
48
|
+
/** Convert a v2 sharded JSON index into a single compressed .q8 binary. */
|
|
49
|
+
compressIndex(srcPath: string, outPath: string): Promise<CompressionReport>;
|
|
50
|
+
/** Load a .q8 file and return vectors plus a ready-to-use recall function. */
|
|
51
|
+
loadCompressedIndex(filePath: string): Promise<CompressedIndex>;
|
|
52
|
+
/** Self-test: report mean / max absolute reconstruction error on `vectors`. */
|
|
53
|
+
quantizeRoundtripError(vectors: number[][]): RoundtripErrorReport;
|
|
54
|
+
private scaleOf;
|
|
55
|
+
private readShardDocs;
|
|
56
|
+
private collectDocs;
|
|
57
|
+
private measureBytes;
|
|
58
|
+
private atomicWrite;
|
|
59
|
+
}
|
|
60
|
+
export declare function getBrainQuantize(): BrainQuantize;
|
|
61
|
+
export declare function resetBrainQuantizeForTests(): void;
|
|
62
|
+
//# sourceMappingURL=brain-quantize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-quantize.d.ts","sourceRoot":"","sources":["../../src/brain/brain-quantize.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAAG,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAE/D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,qBAAa,aAAa;IACxB,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS;IAkBrC,6DAA6D;IAC7D,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAOjD;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAWnF,2EAA2E;IACrE,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA0FjF,8EAA8E;IACxE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA2CrE,+EAA+E;IAC/E,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,oBAAoB;IAwBjE,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,WAAW;CAMpB;AAWD,wBAAgB,gBAAgB,IAAI,aAAa,CAGhD;AACD,wBAAgB,0BAA0B,IAAI,IAAI,CAAsB"}
|