@theihtisham/agent-shadow-brain 6.0.0 → 6.0.3
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/CHANGELOG.md +372 -0
- package/README.md +366 -355
- 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-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-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 +3 -3
- package/dist/brain/brain-portability.js.map +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/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/context-continuity.d.ts +78 -0
- package/dist/brain/context-continuity.d.ts.map +1 -0
- package/dist/brain/context-continuity.js +341 -0
- package/dist/brain/context-continuity.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/global-brain.d.ts.map +1 -1
- package/dist/brain/global-brain.js +35 -9
- package/dist/brain/global-brain.js.map +1 -1
- 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/live-brain.d.ts +119 -0
- package/dist/brain/live-brain.d.ts.map +1 -0
- package/dist/brain/live-brain.js +405 -0
- package/dist/brain/live-brain.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 +4 -0
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +81 -5
- package/dist/brain/mcp-server.js.map +1 -1
- package/dist/brain/memory-seeder.d.ts +78 -0
- package/dist/brain/memory-seeder.d.ts.map +1 -0
- package/dist/brain/memory-seeder.js +326 -0
- package/dist/brain/memory-seeder.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/token-economy.d.ts +2 -0
- package/dist/brain/token-economy.d.ts.map +1 -1
- package/dist/brain/token-economy.js +80 -24
- package/dist/brain/token-economy.js.map +1 -1
- package/dist/cli.js +1120 -32
- package/dist/cli.js.map +1 -1
- package/dist/dashboard/server.d.ts +5 -0
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +355 -2
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/v6-dashboard-html.d.ts +1 -1
- package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -1
- package/dist/dashboard/v6-dashboard-html.js +755 -85
- package/dist/dashboard/v6-dashboard-html.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +17 -12
- package/dist/types.d.ts.map +1 -1
- package/docs/launch/README.md +61 -0
- package/docs/launch/RELEASE_CHECKLIST_v6.0.3.md +102 -0
- package/docs/launch/RELEASE_NOTES_v6.0.3.md +111 -0
- package/package.json +25 -13
- package/tools/export-resume-pack.mjs +56 -0
- package/tools/record-global-memory.mjs +72 -0
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
// src/brain/brain-quest.ts — Gamified onboarding adventure
|
|
2
|
+
// v6.0.2 — Hive Mind Edition
|
|
3
|
+
//
|
|
4
|
+
// A scripted, choose-your-own-adventure introduction to the brain.
|
|
5
|
+
// Quests are deterministic — they advance when verify() returns true.
|
|
6
|
+
// No LLM calls, no shell exec. Verification uses fs heuristics only.
|
|
7
|
+
// Progress persisted per project under ~/.shadow-brain/quests/<project>.json.
|
|
8
|
+
//
|
|
9
|
+
// Exposed: availableQuests(), start(id, project), current(project),
|
|
10
|
+
// step(project, choice?), reset(project).
|
|
11
|
+
import * as fs from 'fs';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import * as os from 'os';
|
|
14
|
+
const QUEST_DIR = path.join(os.homedir(), '.shadow-brain', 'quests');
|
|
15
|
+
const BRAIN_HOME = path.join(os.homedir(), '.shadow-brain');
|
|
16
|
+
export class BrainQuest {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.quests = [];
|
|
19
|
+
this.states = new Map();
|
|
20
|
+
this.registerQuests();
|
|
21
|
+
}
|
|
22
|
+
availableQuests() {
|
|
23
|
+
return this.quests.map(q => ({ ...q }));
|
|
24
|
+
}
|
|
25
|
+
async start(questId, project) {
|
|
26
|
+
const quest = this.quests.find(q => q.id === questId);
|
|
27
|
+
if (!quest)
|
|
28
|
+
throw new Error(`Unknown quest: ${questId}`);
|
|
29
|
+
const file = this.loadFile(project);
|
|
30
|
+
const state = {
|
|
31
|
+
questId,
|
|
32
|
+
project,
|
|
33
|
+
currentStepId: quest.steps[0].id,
|
|
34
|
+
startedAt: Date.now(),
|
|
35
|
+
completedSteps: [],
|
|
36
|
+
branchHistory: [],
|
|
37
|
+
};
|
|
38
|
+
file.active = state;
|
|
39
|
+
this.persist(project, file);
|
|
40
|
+
return state;
|
|
41
|
+
}
|
|
42
|
+
current(project) {
|
|
43
|
+
return this.loadFile(project).active;
|
|
44
|
+
}
|
|
45
|
+
async step(project, choice) {
|
|
46
|
+
const file = this.loadFile(project);
|
|
47
|
+
const state = file.active;
|
|
48
|
+
if (!state) {
|
|
49
|
+
return {
|
|
50
|
+
state: emptyState(project),
|
|
51
|
+
narrative: 'No active quest. Run `availableQuests()` to see your options, then `start(questId, project)` to begin.',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const quest = this.quests.find(q => q.id === state.questId);
|
|
55
|
+
if (!quest) {
|
|
56
|
+
return {
|
|
57
|
+
state,
|
|
58
|
+
narrative: `Quest \`${state.questId}\` no longer exists. Resetting.`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const stepDef = quest.steps.find(s => s.id === state.currentStepId);
|
|
62
|
+
if (!stepDef) {
|
|
63
|
+
return { state, narrative: 'Current step is missing from quest definition. Try `reset(project)`.' };
|
|
64
|
+
}
|
|
65
|
+
// If user provided a choice, record it and follow branch
|
|
66
|
+
if (choice && stepDef.branches && stepDef.branches[choice]) {
|
|
67
|
+
state.branchHistory.push({ stepId: stepDef.id, choice, ts: Date.now() });
|
|
68
|
+
state.currentStepId = stepDef.branches[choice];
|
|
69
|
+
this.persist(project, file);
|
|
70
|
+
const nextDef = quest.steps.find(s => s.id === state.currentStepId);
|
|
71
|
+
if (nextDef) {
|
|
72
|
+
return {
|
|
73
|
+
state,
|
|
74
|
+
narrative: `${nextDef.narrative}\n\n— ${nextDef.prompt}`,
|
|
75
|
+
options: nextDef.branches ? Object.keys(nextDef.branches) : undefined,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Otherwise, check if current step is verified — advance if so
|
|
80
|
+
let verified = false;
|
|
81
|
+
try {
|
|
82
|
+
verified = stepDef.verify(project);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
verified = false;
|
|
86
|
+
}
|
|
87
|
+
if (!verified) {
|
|
88
|
+
return {
|
|
89
|
+
state,
|
|
90
|
+
narrative: `${stepDef.narrative}\n\n— ${stepDef.prompt}`,
|
|
91
|
+
options: stepDef.branches ? Object.keys(stepDef.branches) : undefined,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Step verified! Advance.
|
|
95
|
+
if (!state.completedSteps.includes(stepDef.id)) {
|
|
96
|
+
state.completedSteps.push(stepDef.id);
|
|
97
|
+
}
|
|
98
|
+
const nextId = stepDef.nextId ?? this.defaultNext(quest, stepDef.id);
|
|
99
|
+
if (!nextId) {
|
|
100
|
+
// Quest complete
|
|
101
|
+
state.completedAt = Date.now();
|
|
102
|
+
file.history.push({ ...state });
|
|
103
|
+
file.active = null;
|
|
104
|
+
this.persist(project, file);
|
|
105
|
+
const reward = await this.unlockTrophy(quest);
|
|
106
|
+
return {
|
|
107
|
+
state,
|
|
108
|
+
narrative: `\n${quest.emoji} **Quest Complete — ${quest.title}**\n\n${quest.rewardMessage}`,
|
|
109
|
+
complete: true,
|
|
110
|
+
reward,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
state.currentStepId = nextId;
|
|
114
|
+
this.persist(project, file);
|
|
115
|
+
const nextDef = quest.steps.find(s => s.id === nextId);
|
|
116
|
+
if (!nextDef) {
|
|
117
|
+
return { state, narrative: 'Quest is in a broken state. Try `reset(project)`.' };
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
state,
|
|
121
|
+
narrative: `${nextDef.narrative}\n\n— ${nextDef.prompt}`,
|
|
122
|
+
options: nextDef.branches ? Object.keys(nextDef.branches) : undefined,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
reset(project) {
|
|
126
|
+
const file = this.loadFile(project);
|
|
127
|
+
if (file.active)
|
|
128
|
+
file.history.push({ ...file.active });
|
|
129
|
+
file.active = null;
|
|
130
|
+
this.persist(project, file);
|
|
131
|
+
}
|
|
132
|
+
// ── Quest definitions ───────────────────────────────────────────────
|
|
133
|
+
registerQuests() {
|
|
134
|
+
// Quest 1: Hello Brain
|
|
135
|
+
this.quests.push({
|
|
136
|
+
id: 'hello-brain',
|
|
137
|
+
title: 'Hello Brain',
|
|
138
|
+
subtitle: 'The first whispers of consciousness',
|
|
139
|
+
emoji: '🧠',
|
|
140
|
+
estimatedMinutes: 8,
|
|
141
|
+
rewardAchievement: 'first-bloom',
|
|
142
|
+
rewardMessage: 'You have lit the first spark. The brain knows you now — and it remembers.',
|
|
143
|
+
steps: [
|
|
144
|
+
{
|
|
145
|
+
id: 'first-memory',
|
|
146
|
+
narrative: 'The brain stirs. It has no past, no preferences, no scars. Only potential, and an unlit lamp.\n\n' +
|
|
147
|
+
'You stand before a quiet machine that wants to remember things for you. It will not judge what you teach it. It will only keep faith with what you offer.\n\n' +
|
|
148
|
+
'Begin by giving it a single thought to hold.',
|
|
149
|
+
prompt: 'Run `shadow-brain embed add "your first memory here"` — anything you want it to remember.',
|
|
150
|
+
verify: (project) => fileExistsBeneath(BRAIN_HOME, 'embeddings', 'vectors.json') ||
|
|
151
|
+
anyMemoryFile(project),
|
|
152
|
+
nextId: 'first-search',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
id: 'first-search',
|
|
156
|
+
narrative: 'The memory lives. You can feel it — somewhere in the lattice, a small light is on.\n\n' +
|
|
157
|
+
'Now reach for it. Ask the brain to find what it just learned.',
|
|
158
|
+
prompt: 'Run `shadow-brain search "<a word from your memory>"` and confirm it surfaces.',
|
|
159
|
+
verify: (project) => hasRecentEvent(project, 'memory.search'),
|
|
160
|
+
nextId: 'first-dna',
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
id: 'first-dna',
|
|
164
|
+
narrative: 'Memories alone are sparks. To become a brain, they must develop structure — fingerprints, ancestry, identity.\n\n' +
|
|
165
|
+
'Generate a DNA card for your project. It is the brain looking at itself in a mirror for the first time.',
|
|
166
|
+
prompt: 'Run `shadow-brain dna generate`.',
|
|
167
|
+
verify: (project) => fileExistsBeneath(BRAIN_HOME, 'dna', `${safe(project)}.json`) ||
|
|
168
|
+
fileExistsBeneath(BRAIN_HOME, 'dna', 'index.json'),
|
|
169
|
+
nextId: 'first-capsule',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
id: 'first-capsule',
|
|
173
|
+
narrative: 'Time presses on every brain. What is true today may be foolish tomorrow.\n\n' +
|
|
174
|
+
'Freeze a capsule — a snapshot you can return to. It is your first time-traveler\'s anchor.',
|
|
175
|
+
prompt: 'Run `shadow-brain capsule freeze "first snapshot"`.',
|
|
176
|
+
verify: (project) => anyFileIn(path.join(BRAIN_HOME, 'capsules')),
|
|
177
|
+
nextId: 'first-replay',
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
id: 'first-replay',
|
|
181
|
+
narrative: 'You have given the brain memory, search, identity, and a past. There is one ritual left.\n\n' +
|
|
182
|
+
'Witness its history. Watch the replay of everything you have done together so far.',
|
|
183
|
+
prompt: 'Run `shadow-brain replay --since 1h`.',
|
|
184
|
+
verify: (project) => hasRecentEvent(project, 'replay.view'),
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
});
|
|
188
|
+
// Quest 2: The Hive Initiate
|
|
189
|
+
this.quests.push({
|
|
190
|
+
id: 'hive-initiate',
|
|
191
|
+
title: 'The Hive Initiate',
|
|
192
|
+
subtitle: 'When one mind becomes many',
|
|
193
|
+
emoji: '🐝',
|
|
194
|
+
estimatedMinutes: 15,
|
|
195
|
+
rewardAchievement: 'hive-born',
|
|
196
|
+
rewardMessage: 'You have founded a hive. From now on, no agent works alone — and no lesson is learned twice.',
|
|
197
|
+
steps: [
|
|
198
|
+
{
|
|
199
|
+
id: 'enable-hive',
|
|
200
|
+
narrative: 'A single brain is a candle. A hive is a hearth. Let us light the hearth.',
|
|
201
|
+
prompt: 'Run `shadow-brain hive enable`.',
|
|
202
|
+
verify: (project) => fileExistsBeneath(BRAIN_HOME, 'hive', `${safe(project)}.json`) ||
|
|
203
|
+
anyFileIn(path.join(BRAIN_HOME, 'hive')),
|
|
204
|
+
nextId: 'spawn-subagent',
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: 'spawn-subagent',
|
|
208
|
+
narrative: 'A hive needs more than walls. It needs voices.\n\n' +
|
|
209
|
+
'Spawn a subagent. Watch as it inherits the memories you have already given the brain — not as instructions, but as instinct.',
|
|
210
|
+
prompt: 'Run `shadow-brain agent spawn --inherit`.',
|
|
211
|
+
verify: (project) => hasRecentEvent(project, 'agent.spawn'),
|
|
212
|
+
nextId: 'watch-inheritance',
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
id: 'watch-inheritance',
|
|
216
|
+
narrative: 'The subagent is awake. It knows what you know — or some fraction of it.\n\n' +
|
|
217
|
+
'Confirm the inheritance. Ask the new agent something only your brain should know.',
|
|
218
|
+
prompt: 'Run `shadow-brain agent ask <agentId> "<question from a memory>"`.',
|
|
219
|
+
verify: (project) => hasRecentEvent(project, 'voice.ask'),
|
|
220
|
+
nextId: 'first-share',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: 'first-share',
|
|
224
|
+
narrative: 'Inheritance is the start. Sharing is the soul of the hive.\n\n' +
|
|
225
|
+
'Have your subagent teach the central brain something new.',
|
|
226
|
+
prompt: 'Run `shadow-brain hive share --from <agentId>`.',
|
|
227
|
+
verify: (project) => hasRecentEvent(project, 'hive.share'),
|
|
228
|
+
nextId: 'first-voice',
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
id: 'first-voice',
|
|
232
|
+
narrative: 'A hive has a voice that is more than any one mind. Many agents, one answer.\n\n' +
|
|
233
|
+
'Ask the Hive a question that requires multiple opinions.',
|
|
234
|
+
prompt: 'Run `shadow-brain hive ask "should I refactor X?"`.',
|
|
235
|
+
verify: (project) => hasRecentEvent(project, 'voice.ask'),
|
|
236
|
+
nextId: 'hive-status',
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
id: 'hive-status',
|
|
240
|
+
narrative: 'Step back. Look at the hive you have built. Count the agents. Count the bridges.',
|
|
241
|
+
prompt: 'Run `shadow-brain hive status`.',
|
|
242
|
+
verify: (project) => true, // any view counts
|
|
243
|
+
nextId: 'hive-rest',
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
id: 'hive-rest',
|
|
247
|
+
narrative: 'The hive is yours. Rest the apprentices. Take a breath.',
|
|
248
|
+
prompt: 'Run `shadow-brain agent pause --all`.',
|
|
249
|
+
verify: (project) => true,
|
|
250
|
+
},
|
|
251
|
+
],
|
|
252
|
+
});
|
|
253
|
+
// Quest 3: The Architect's Path
|
|
254
|
+
this.quests.push({
|
|
255
|
+
id: 'architects-path',
|
|
256
|
+
title: 'The Architect\'s Path',
|
|
257
|
+
subtitle: 'Laws inscribed in silicon',
|
|
258
|
+
emoji: '📜',
|
|
259
|
+
estimatedMinutes: 12,
|
|
260
|
+
rewardAchievement: 'lawgiver',
|
|
261
|
+
rewardMessage: 'You have written the laws. The brain will defend them — even from you.',
|
|
262
|
+
steps: [
|
|
263
|
+
{
|
|
264
|
+
id: 'draft-constitution',
|
|
265
|
+
narrative: 'Every great mind has its commandments. Without them, agents drift, conventions die, and the codebase forgets itself.\n\n' +
|
|
266
|
+
'Write your first constitutional rule. Make it specific. Make it enforceable.',
|
|
267
|
+
prompt: 'Run `shadow-brain constitution add "<your rule>"`.',
|
|
268
|
+
verify: (project) => fileExistsBeneath(BRAIN_HOME, 'constitution', `${safe(project)}.json`) ||
|
|
269
|
+
anyFileIn(path.join(BRAIN_HOME, 'constitution')),
|
|
270
|
+
nextId: 'inject-rule',
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
id: 'inject-rule',
|
|
274
|
+
narrative: 'A rule that lives only on disk is no rule at all. It must be felt by every agent at every turn.\n\n' +
|
|
275
|
+
'Inject the constitution into your next prompt.',
|
|
276
|
+
prompt: 'Run `shadow-brain constitution inject`.',
|
|
277
|
+
verify: (project) => true,
|
|
278
|
+
nextId: 'trigger-violation',
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
id: 'trigger-violation',
|
|
282
|
+
narrative: 'A law that has never been challenged is a guess. Test it.\n\n' +
|
|
283
|
+
'Ask an agent to do the very thing you forbade. Watch what happens.',
|
|
284
|
+
prompt: 'Trigger a deliberate violation. The brain should object.',
|
|
285
|
+
verify: (project) => hasRecentEvent(project, 'constitution.violation'),
|
|
286
|
+
nextId: 'fix-violation',
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
id: 'fix-violation',
|
|
290
|
+
narrative: 'The objection is the proof. Now repair the breach.',
|
|
291
|
+
prompt: 'Resolve the violation. Use `shadow-brain constitution audit` to confirm.',
|
|
292
|
+
verify: (project) => true,
|
|
293
|
+
nextId: 'review-constitution',
|
|
294
|
+
branches: { 'review': 'review-constitution', 'expand': 'expand-constitution' },
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
id: 'review-constitution',
|
|
298
|
+
narrative: 'You may pause here and review what you have written — or press on and grow the lawbook.',
|
|
299
|
+
prompt: 'Run `shadow-brain constitution show`.',
|
|
300
|
+
verify: (project) => true,
|
|
301
|
+
nextId: 'finalize',
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
id: 'expand-constitution',
|
|
305
|
+
narrative: 'A growing brain needs growing laws. Add two more rules.',
|
|
306
|
+
prompt: 'Run `shadow-brain constitution add "<rule>"` twice more.',
|
|
307
|
+
verify: (project) => true,
|
|
308
|
+
nextId: 'finalize',
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
id: 'finalize',
|
|
312
|
+
narrative: 'You are now the architect. The brain has its constitution. Future agents will inherit it as their first breath.',
|
|
313
|
+
prompt: 'Run `shadow-brain constitution lock`.',
|
|
314
|
+
verify: (project) => true,
|
|
315
|
+
},
|
|
316
|
+
],
|
|
317
|
+
});
|
|
318
|
+
// Quest 4: The Time Traveler
|
|
319
|
+
this.quests.push({
|
|
320
|
+
id: 'time-traveler',
|
|
321
|
+
title: 'The Time Traveler',
|
|
322
|
+
subtitle: 'Snapshots, drift, and return',
|
|
323
|
+
emoji: '⏳',
|
|
324
|
+
estimatedMinutes: 7,
|
|
325
|
+
rewardAchievement: 'temporal',
|
|
326
|
+
rewardMessage: 'You walk between yesterdays. The brain will never lose you again.',
|
|
327
|
+
steps: [
|
|
328
|
+
{
|
|
329
|
+
id: 'freeze',
|
|
330
|
+
narrative: 'Time is a thief, but you can outwit it. Freeze a capsule of the brain as it stands right now.',
|
|
331
|
+
prompt: 'Run `shadow-brain capsule freeze "before experiment"`.',
|
|
332
|
+
verify: (project) => anyFileIn(path.join(BRAIN_HOME, 'capsules')),
|
|
333
|
+
nextId: 'mutate',
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
id: 'mutate',
|
|
337
|
+
narrative: 'Now break something. Or build something. Add memories. Change rules. Do anything that will leave footprints.',
|
|
338
|
+
prompt: 'Run any 2-3 `shadow-brain` commands that mutate state.',
|
|
339
|
+
verify: (project) => hasMinEventCount(project, 'memory.add', 1),
|
|
340
|
+
nextId: 'diff',
|
|
341
|
+
branches: { 'safe-mode': 'diff', 'risky-mode': 'risky-mutate' },
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
id: 'risky-mutate',
|
|
345
|
+
narrative: 'You chose chaos. Good. Make several drastic changes.',
|
|
346
|
+
prompt: 'Run heavy mutations — add 5+ memories or modify rules.',
|
|
347
|
+
verify: (project) => hasMinEventCount(project, 'memory.add', 3),
|
|
348
|
+
nextId: 'diff',
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
id: 'diff',
|
|
352
|
+
narrative: 'Now look back. Compare what the brain knows now with what it knew when you froze it.',
|
|
353
|
+
prompt: 'Run `shadow-brain capsule diff`.',
|
|
354
|
+
verify: (project) => true,
|
|
355
|
+
nextId: 'restore',
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
id: 'restore',
|
|
359
|
+
narrative: 'The final step. Return — selectively — to the past. Restore one thing, leave the rest.',
|
|
360
|
+
prompt: 'Run `shadow-brain capsule restore --selective`.',
|
|
361
|
+
verify: (project) => true,
|
|
362
|
+
},
|
|
363
|
+
],
|
|
364
|
+
});
|
|
365
|
+
// Quest 5: Speedrun
|
|
366
|
+
this.quests.push({
|
|
367
|
+
id: 'speedrun',
|
|
368
|
+
title: 'Speedrun',
|
|
369
|
+
subtitle: 'How fast can one mind awaken?',
|
|
370
|
+
emoji: '⚡',
|
|
371
|
+
estimatedMinutes: 3,
|
|
372
|
+
rewardAchievement: 'speedrunner',
|
|
373
|
+
rewardMessage: 'You are on the leaderboard. The hive remembers the swift.',
|
|
374
|
+
steps: [
|
|
375
|
+
{
|
|
376
|
+
id: 'sprint-setup',
|
|
377
|
+
narrative: 'No narrative. No ceremony. Just speed.\n\n' +
|
|
378
|
+
'Set up your brain in one shot.',
|
|
379
|
+
prompt: 'Run `shadow-brain init --quick`.',
|
|
380
|
+
verify: (project) => fs.existsSync(BRAIN_HOME),
|
|
381
|
+
nextId: 'sprint-agent',
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
id: 'sprint-agent',
|
|
385
|
+
narrative: 'Spawn an agent. Don\'t configure it — just spawn it.',
|
|
386
|
+
prompt: 'Run `shadow-brain agent spawn`.',
|
|
387
|
+
verify: (project) => hasRecentEvent(project, 'agent.spawn'),
|
|
388
|
+
nextId: 'sprint-memories',
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
id: 'sprint-memories',
|
|
392
|
+
narrative: 'Ten memories. Any ten. Go.',
|
|
393
|
+
prompt: 'Run `shadow-brain embed add "..."` ten times. The leaderboard is watching.',
|
|
394
|
+
verify: (project) => hasMinEventCount(project, 'memory.add', 10),
|
|
395
|
+
},
|
|
396
|
+
],
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
defaultNext(quest, currentId) {
|
|
400
|
+
const idx = quest.steps.findIndex(s => s.id === currentId);
|
|
401
|
+
if (idx === -1 || idx === quest.steps.length - 1)
|
|
402
|
+
return null;
|
|
403
|
+
return quest.steps[idx + 1].id;
|
|
404
|
+
}
|
|
405
|
+
async unlockTrophy(quest) {
|
|
406
|
+
try {
|
|
407
|
+
const trophiesMod = await import('./brain-trophies.js').catch(() => null);
|
|
408
|
+
if (trophiesMod && typeof trophiesMod.getBrainTrophies === 'function') {
|
|
409
|
+
const getter = trophiesMod.getBrainTrophies;
|
|
410
|
+
const trophies = getter();
|
|
411
|
+
if (trophies && typeof trophies.award === 'function') {
|
|
412
|
+
trophies.award(quest.rewardAchievement, quest.rewardMessage);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
catch { /* trophies module not available; that's fine */ }
|
|
417
|
+
return { achievementId: quest.rewardAchievement, message: quest.rewardMessage };
|
|
418
|
+
}
|
|
419
|
+
// ── Persistence ─────────────────────────────────────────────────────
|
|
420
|
+
loadFile(project) {
|
|
421
|
+
const cached = this.states.get(project);
|
|
422
|
+
if (cached)
|
|
423
|
+
return cached;
|
|
424
|
+
const fp = pathFor(project);
|
|
425
|
+
let file = { schemaVersion: 1, active: null, history: [] };
|
|
426
|
+
try {
|
|
427
|
+
if (fs.existsSync(fp)) {
|
|
428
|
+
const raw = JSON.parse(fs.readFileSync(fp, 'utf-8'));
|
|
429
|
+
if (raw.schemaVersion === 1)
|
|
430
|
+
file = raw;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
catch { /* fresh */ }
|
|
434
|
+
this.states.set(project, file);
|
|
435
|
+
return file;
|
|
436
|
+
}
|
|
437
|
+
persist(project, file) {
|
|
438
|
+
try {
|
|
439
|
+
fs.mkdirSync(QUEST_DIR, { recursive: true });
|
|
440
|
+
const fp = pathFor(project);
|
|
441
|
+
const tmp = fp + '.tmp';
|
|
442
|
+
fs.writeFileSync(tmp, JSON.stringify(file, null, 2));
|
|
443
|
+
fs.renameSync(tmp, fp);
|
|
444
|
+
}
|
|
445
|
+
catch { /* non-fatal */ }
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
function pathFor(project) {
|
|
449
|
+
return path.join(QUEST_DIR, `${safe(project)}.json`);
|
|
450
|
+
}
|
|
451
|
+
function safe(s) {
|
|
452
|
+
return s.replace(/[^a-zA-Z0-9._-]+/g, '_').slice(0, 80) || 'default';
|
|
453
|
+
}
|
|
454
|
+
function emptyState(project) {
|
|
455
|
+
return {
|
|
456
|
+
questId: '',
|
|
457
|
+
project,
|
|
458
|
+
currentStepId: '',
|
|
459
|
+
startedAt: 0,
|
|
460
|
+
completedSteps: [],
|
|
461
|
+
branchHistory: [],
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
function fileExistsBeneath(...parts) {
|
|
465
|
+
try {
|
|
466
|
+
return fs.existsSync(path.join(...parts));
|
|
467
|
+
}
|
|
468
|
+
catch {
|
|
469
|
+
return false;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
function anyFileIn(dir) {
|
|
473
|
+
try {
|
|
474
|
+
if (!fs.existsSync(dir))
|
|
475
|
+
return false;
|
|
476
|
+
return fs.readdirSync(dir).length > 0;
|
|
477
|
+
}
|
|
478
|
+
catch {
|
|
479
|
+
return false;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
function anyMemoryFile(project) {
|
|
483
|
+
const candidates = [
|
|
484
|
+
path.join(BRAIN_HOME, 'memories', `${safe(project)}.json`),
|
|
485
|
+
path.join(BRAIN_HOME, 'embeddings', 'vectors.json'),
|
|
486
|
+
path.join(BRAIN_HOME, 'memories'),
|
|
487
|
+
];
|
|
488
|
+
return candidates.some(p => {
|
|
489
|
+
try {
|
|
490
|
+
return fs.existsSync(p);
|
|
491
|
+
}
|
|
492
|
+
catch {
|
|
493
|
+
return false;
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
/** Heuristic: check coach event log on disk for a recent event of given type. */
|
|
498
|
+
function hasRecentEvent(project, type) {
|
|
499
|
+
try {
|
|
500
|
+
const coachFile = path.join(BRAIN_HOME, 'coach', `${safe(project)}.json`);
|
|
501
|
+
if (!fs.existsSync(coachFile))
|
|
502
|
+
return false;
|
|
503
|
+
const raw = JSON.parse(fs.readFileSync(coachFile, 'utf-8'));
|
|
504
|
+
const events = raw?.state?.events ?? [];
|
|
505
|
+
if (!Array.isArray(events))
|
|
506
|
+
return false;
|
|
507
|
+
const day = 24 * 3600 * 1000;
|
|
508
|
+
const now = Date.now();
|
|
509
|
+
return events.some((e) => e.type === type && (now - (e.ts ?? 0)) < day);
|
|
510
|
+
}
|
|
511
|
+
catch {
|
|
512
|
+
return false;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
function hasMinEventCount(project, type, min) {
|
|
516
|
+
try {
|
|
517
|
+
const coachFile = path.join(BRAIN_HOME, 'coach', `${safe(project)}.json`);
|
|
518
|
+
if (!fs.existsSync(coachFile))
|
|
519
|
+
return false;
|
|
520
|
+
const raw = JSON.parse(fs.readFileSync(coachFile, 'utf-8'));
|
|
521
|
+
const events = raw?.state?.events ?? [];
|
|
522
|
+
if (!Array.isArray(events))
|
|
523
|
+
return false;
|
|
524
|
+
let count = 0;
|
|
525
|
+
for (const e of events)
|
|
526
|
+
if (e?.type === type)
|
|
527
|
+
count++;
|
|
528
|
+
return count >= min;
|
|
529
|
+
}
|
|
530
|
+
catch {
|
|
531
|
+
return false;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
let _instance = null;
|
|
535
|
+
export function getBrainQuest() {
|
|
536
|
+
if (!_instance)
|
|
537
|
+
_instance = new BrainQuest();
|
|
538
|
+
return _instance;
|
|
539
|
+
}
|
|
540
|
+
export function resetBrainQuestForTests() { _instance = null; }
|
|
541
|
+
//# sourceMappingURL=brain-quest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-quest.js","sourceRoot":"","sources":["../../src/brain/brain-quest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export interface CachedResult {
|
|
2
|
+
result: unknown;
|
|
3
|
+
storedAt: number;
|
|
4
|
+
ttlMs: number;
|
|
5
|
+
contextHash: string;
|
|
6
|
+
/** Memory ids referenced by this cached result (for smart invalidation). */
|
|
7
|
+
memoryIds: string[];
|
|
8
|
+
/** Optional project tag for project-scoped invalidation. */
|
|
9
|
+
project?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface RecallCacheStats {
|
|
12
|
+
hits: number;
|
|
13
|
+
misses: number;
|
|
14
|
+
hitRate: number;
|
|
15
|
+
bloomFP: number;
|
|
16
|
+
evictions: number;
|
|
17
|
+
size: number;
|
|
18
|
+
}
|
|
19
|
+
export interface InvalidateOpts {
|
|
20
|
+
key?: string;
|
|
21
|
+
contextHash?: string;
|
|
22
|
+
project?: string;
|
|
23
|
+
/** Invalidate entries stored before this timestamp (ms). */
|
|
24
|
+
before?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface PutOpts {
|
|
27
|
+
memoryIds?: string[];
|
|
28
|
+
project?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare class BrainRecallCache {
|
|
31
|
+
private capacity;
|
|
32
|
+
private map;
|
|
33
|
+
private head;
|
|
34
|
+
private tail;
|
|
35
|
+
private bloom;
|
|
36
|
+
/** memoryId → set of cache keys that referenced it. */
|
|
37
|
+
private memToKeys;
|
|
38
|
+
/** project → set of cache keys (for project-scoped invalidation). */
|
|
39
|
+
private projectToKeys;
|
|
40
|
+
private hits;
|
|
41
|
+
private misses;
|
|
42
|
+
private bloomNegatives;
|
|
43
|
+
/** Count where bloom said "maybe" but LRU said "no" → false positive. */
|
|
44
|
+
private bloomFalsePositives;
|
|
45
|
+
private evictions;
|
|
46
|
+
private writesSincePersist;
|
|
47
|
+
private initialized;
|
|
48
|
+
private init;
|
|
49
|
+
/** Look up a cached entry. contextHash filters by brain state version. */
|
|
50
|
+
lookup(key: string, contextHash?: string): CachedResult | null;
|
|
51
|
+
put(key: string, contextHash: string, result: unknown, ttlMs?: number, opts?: PutOpts): void;
|
|
52
|
+
invalidate(opts: InvalidateOpts): {
|
|
53
|
+
invalidated: number;
|
|
54
|
+
};
|
|
55
|
+
/** Call when a brain memory is added/updated → prune any cached top-N that referenced it. */
|
|
56
|
+
observeWrite(memoryId: string): void;
|
|
57
|
+
stats(): RecallCacheStats;
|
|
58
|
+
/** Wipe contents and metrics. Stats file is removed. */
|
|
59
|
+
reset(): void;
|
|
60
|
+
private trackKey;
|
|
61
|
+
private untrackKey;
|
|
62
|
+
private evictLru;
|
|
63
|
+
private touch;
|
|
64
|
+
private addToFront;
|
|
65
|
+
private removeNode;
|
|
66
|
+
private rebuildBloom;
|
|
67
|
+
private loadConfig;
|
|
68
|
+
private loadStats;
|
|
69
|
+
private persistStats;
|
|
70
|
+
}
|
|
71
|
+
export declare function getBrainRecallCache(): BrainRecallCache;
|
|
72
|
+
export declare function resetBrainRecallCacheForTests(): void;
|
|
73
|
+
//# sourceMappingURL=brain-recall-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-recall-cache.d.ts","sourceRoot":"","sources":["../../src/brain/brain-recall-cache.ts"],"names":[],"mappings":"AAmCA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA2ED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,IAAI,CAAqB;IAEjC,OAAO,CAAC,KAAK,CAAqB;IAElC,uDAAuD;IACvD,OAAO,CAAC,SAAS,CAAuC;IACxD,qEAAqE;IACrE,OAAO,CAAC,aAAa,CAAuC;IAE5D,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,cAAc,CAAK;IAC3B,yEAAyE;IACzE,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,IAAI;IAQZ,0EAA0E;IAC1E,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAmC9D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IA+B5F,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;IAsCzD,6FAA6F;IAC7F,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAiBpC,KAAK,IAAI,gBAAgB;IAczB,wDAAwD;IACxD,KAAK,IAAI,IAAI;IAkBb,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,SAAS;YAeH,YAAY;CAmB3B;AAqCD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAGtD;AACD,wBAAgB,6BAA6B,IAAI,IAAI,CAAsB"}
|