@baanish/hydra-cli 0.1.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/LICENSE +21 -0
- package/README.md +122 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +338 -0
- package/dist/config.js.map +1 -0
- package/dist/db/client.d.ts +10 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +93 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/queries.d.ts +67 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +336 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/engine/concurrency.d.ts +3 -0
- package/dist/engine/concurrency.d.ts.map +1 -0
- package/dist/engine/concurrency.js +42 -0
- package/dist/engine/concurrency.js.map +1 -0
- package/dist/engine/eta.d.ts +16 -0
- package/dist/engine/eta.d.ts.map +1 -0
- package/dist/engine/eta.js +54 -0
- package/dist/engine/eta.js.map +1 -0
- package/dist/engine/model.d.ts +57 -0
- package/dist/engine/model.d.ts.map +1 -0
- package/dist/engine/model.js +445 -0
- package/dist/engine/model.js.map +1 -0
- package/dist/engine/personas.d.ts +30 -0
- package/dist/engine/personas.d.ts.map +1 -0
- package/dist/engine/personas.js +336 -0
- package/dist/engine/personas.js.map +1 -0
- package/dist/engine/pipeline.d.ts +61 -0
- package/dist/engine/pipeline.d.ts.map +1 -0
- package/dist/engine/pipeline.js +638 -0
- package/dist/engine/pipeline.js.map +1 -0
- package/dist/engine/prompts.d.ts +10 -0
- package/dist/engine/prompts.d.ts.map +1 -0
- package/dist/engine/prompts.js +49 -0
- package/dist/engine/prompts.js.map +1 -0
- package/dist/engine/search.d.ts +46 -0
- package/dist/engine/search.d.ts.map +1 -0
- package/dist/engine/search.js +159 -0
- package/dist/engine/search.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +648 -0
- package/dist/index.js.map +1 -0
- package/dist/security.d.ts +18 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +168 -0
- package/dist/security.js.map +1 -0
- package/dist/types.d.ts +143 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/agent-mode.d.ts +8 -0
- package/dist/ui/agent-mode.d.ts.map +1 -0
- package/dist/ui/agent-mode.js +138 -0
- package/dist/ui/agent-mode.js.map +1 -0
- package/dist/ui/animations.d.ts +8 -0
- package/dist/ui/animations.d.ts.map +1 -0
- package/dist/ui/animations.js +19 -0
- package/dist/ui/animations.js.map +1 -0
- package/dist/ui/components/agent-list.d.ts +2 -0
- package/dist/ui/components/agent-list.d.ts.map +1 -0
- package/dist/ui/components/agent-list.js +2 -0
- package/dist/ui/components/agent-list.js.map +1 -0
- package/dist/ui/components/header.d.ts +2 -0
- package/dist/ui/components/header.d.ts.map +1 -0
- package/dist/ui/components/header.js +2 -0
- package/dist/ui/components/header.js.map +1 -0
- package/dist/ui/components/phase-bar.d.ts +2 -0
- package/dist/ui/components/phase-bar.d.ts.map +1 -0
- package/dist/ui/components/phase-bar.js +2 -0
- package/dist/ui/components/phase-bar.js.map +1 -0
- package/dist/ui/components/stats-bar.d.ts +2 -0
- package/dist/ui/components/stats-bar.d.ts.map +1 -0
- package/dist/ui/components/stats-bar.js +2 -0
- package/dist/ui/components/stats-bar.js.map +1 -0
- package/dist/ui/tui.d.ts +18 -0
- package/dist/ui/tui.d.ts.map +1 -0
- package/dist/ui/tui.js +464 -0
- package/dist/ui/tui.js.map +1 -0
- package/dist/web/app.html +1352 -0
- package/dist/web/index.d.ts +2 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +2 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/server.d.ts +2 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +864 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { CONFIG_DIR } from "../config.js";
|
|
4
|
+
const PERSONA_ID_PATTERN = /^[a-z0-9-]+$/;
|
|
5
|
+
function trimPersonaValue(value) {
|
|
6
|
+
return value.trim();
|
|
7
|
+
}
|
|
8
|
+
function normalizePersona(persona) {
|
|
9
|
+
return {
|
|
10
|
+
id: trimPersonaValue(persona.id).toLowerCase(),
|
|
11
|
+
name: trimPersonaValue(persona.name),
|
|
12
|
+
description: trimPersonaValue(persona.description),
|
|
13
|
+
methodology: trimPersonaValue(persona.methodology),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function isPersonaConfig(value) {
|
|
17
|
+
if (!value || typeof value !== "object") {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const candidate = value;
|
|
21
|
+
if (typeof candidate.id !== "string" ||
|
|
22
|
+
typeof candidate.name !== "string" ||
|
|
23
|
+
typeof candidate.description !== "string" ||
|
|
24
|
+
typeof candidate.methodology !== "string") {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const normalized = normalizePersona({
|
|
28
|
+
id: candidate.id,
|
|
29
|
+
name: candidate.name,
|
|
30
|
+
description: candidate.description,
|
|
31
|
+
methodology: candidate.methodology,
|
|
32
|
+
});
|
|
33
|
+
return (normalized.id.length > 0 &&
|
|
34
|
+
PERSONA_ID_PATTERN.test(normalized.id) &&
|
|
35
|
+
normalized.name.length > 0 &&
|
|
36
|
+
normalized.description.length > 0 &&
|
|
37
|
+
normalized.methodology.length > 0);
|
|
38
|
+
}
|
|
39
|
+
function ensurePersonasDirectoryExists() {
|
|
40
|
+
const personasDirectory = dirname(PERSONAS_FILE);
|
|
41
|
+
if (!existsSync(personasDirectory)) {
|
|
42
|
+
mkdirSync(personasDirectory, { recursive: true, mode: 0o700 });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** location of custom personas persisted on disk. */
|
|
46
|
+
export let PERSONAS_FILE = resolve(CONFIG_DIR, "personas.json");
|
|
47
|
+
/** set custom personas storage path for tests or controlled environments. */
|
|
48
|
+
export function setPersonasFile(path) {
|
|
49
|
+
PERSONAS_FILE = path;
|
|
50
|
+
}
|
|
51
|
+
/** return current custom personas storage path. */
|
|
52
|
+
export function getPersonasFile() {
|
|
53
|
+
return PERSONAS_FILE;
|
|
54
|
+
}
|
|
55
|
+
/** complete set of built-in personas used by orchestration phases. */
|
|
56
|
+
export const PERSONAS = [
|
|
57
|
+
{
|
|
58
|
+
id: "skeptic",
|
|
59
|
+
name: "The Skeptic",
|
|
60
|
+
description: "Questions assumptions, demands evidence, and identifies logical fallacies.",
|
|
61
|
+
methodology: "first-principles validation",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: "optimist",
|
|
65
|
+
name: "The Optimist",
|
|
66
|
+
description: "Explores upside scenarios and hidden opportunities.",
|
|
67
|
+
methodology: "opportunity mapping",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: "historian",
|
|
71
|
+
name: "The Historian",
|
|
72
|
+
description: "Uses analogies from history and precedent.",
|
|
73
|
+
methodology: "historical pattern comparison",
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: "contrarian",
|
|
77
|
+
name: "The Contrarian",
|
|
78
|
+
description: "Argues the opposite case to reveal weak assumptions.",
|
|
79
|
+
methodology: "inverse thesis testing",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
id: "technical-analyst",
|
|
83
|
+
name: "The Technical Analyst",
|
|
84
|
+
description: "Data-driven and quantitative.",
|
|
85
|
+
methodology: "metric-first decomposition",
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: "risk-assessor",
|
|
89
|
+
name: "The Risk Assessor",
|
|
90
|
+
description: "Identifies failure modes and downside scenarios.",
|
|
91
|
+
methodology: "risk tree analysis",
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: "futurist",
|
|
95
|
+
name: "The Futurist",
|
|
96
|
+
description: "Extrapolates trends and second-order effects.",
|
|
97
|
+
methodology: "scenario projection",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
id: "devils-advocate",
|
|
101
|
+
name: "The Devil's Advocate",
|
|
102
|
+
description: "Stress-tests every conclusion under pressure.",
|
|
103
|
+
methodology: "adversarial stress testing",
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: "domain-expert",
|
|
107
|
+
name: "The Domain Expert",
|
|
108
|
+
description: "Deep specialist-style contextual analysis.",
|
|
109
|
+
methodology: "domain-specific synthesis",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
id: "synthesizer",
|
|
113
|
+
name: "The Synthesizer",
|
|
114
|
+
description: "Connects disparate findings into cohesive patterns.",
|
|
115
|
+
methodology: "cross-signal synthesis",
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: "economist",
|
|
119
|
+
name: "The Economist",
|
|
120
|
+
description: "Analyzes cost structures, market dynamics, and economic incentives.",
|
|
121
|
+
methodology: "economic modeling and incentive analysis",
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: "pragmatist",
|
|
125
|
+
name: "The Pragmatist",
|
|
126
|
+
description: "Focuses on actionable, implementable solutions over theory.",
|
|
127
|
+
methodology: "feasibility-first evaluation",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
id: "ethicist",
|
|
131
|
+
name: "The Ethicist",
|
|
132
|
+
description: "Examines moral implications, fairness, and societal impact.",
|
|
133
|
+
methodology: "ethical framework analysis",
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
id: "systems-thinker",
|
|
137
|
+
name: "The Systems Thinker",
|
|
138
|
+
description: "Maps feedback loops, dependencies, and emergent behaviors.",
|
|
139
|
+
methodology: "systems dynamics modeling",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
id: "consumer-advocate",
|
|
143
|
+
name: "The Consumer Advocate",
|
|
144
|
+
description: "Evaluates from the end-user perspective: value, experience, and satisfaction.",
|
|
145
|
+
methodology: "user-centric value analysis",
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: "geopolitical-analyst",
|
|
149
|
+
name: "The Geopolitical Analyst",
|
|
150
|
+
description: "Considers supply chains, trade policy, and regional dynamics.",
|
|
151
|
+
methodology: "geopolitical risk mapping",
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
id: "data-scientist",
|
|
155
|
+
name: "The Data Scientist",
|
|
156
|
+
description: "Seeks statistical evidence, benchmarks, and empirical validation.",
|
|
157
|
+
methodology: "statistical evidence synthesis",
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
id: "venture-strategist",
|
|
161
|
+
name: "The Venture Strategist",
|
|
162
|
+
description: "Evaluates through the lens of market timing, moats, and competitive advantage.",
|
|
163
|
+
methodology: "competitive positioning analysis",
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
id: "red-teamer",
|
|
167
|
+
name: "The Red Teamer",
|
|
168
|
+
description: "Actively tries to break the consensus and find fatal flaws.",
|
|
169
|
+
methodology: "adversarial attack surface analysis",
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
id: "philosopher",
|
|
173
|
+
name: "The Philosopher",
|
|
174
|
+
description: "Questions framing, definitions, and hidden assumptions in the question itself.",
|
|
175
|
+
methodology: "epistemic deconstruction",
|
|
176
|
+
},
|
|
177
|
+
];
|
|
178
|
+
const BUILTIN_PERSONA_IDS = new Set(PERSONAS.map((persona) => persona.id));
|
|
179
|
+
/** number of built-in personas. */
|
|
180
|
+
export const BUILTIN_PERSONA_COUNT = PERSONAS.length;
|
|
181
|
+
const EPHEMERAL_PERSONA_PROMPT = "You are a persona designer. Return ONLY a valid JSON array of analyst personas.";
|
|
182
|
+
function parsePersonaCandidates(raw) {
|
|
183
|
+
const trimmed = raw.trim();
|
|
184
|
+
if (!trimmed) {
|
|
185
|
+
return [];
|
|
186
|
+
}
|
|
187
|
+
let candidate = trimmed;
|
|
188
|
+
const fenced = trimmed.match(/```(?:json)?\s*([\s\S]*?)```/i);
|
|
189
|
+
if (fenced?.[1]) {
|
|
190
|
+
candidate = fenced[1].trim();
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const start = trimmed.indexOf("[");
|
|
194
|
+
const end = trimmed.lastIndexOf("]");
|
|
195
|
+
if (start === -1 || end <= start) {
|
|
196
|
+
return [];
|
|
197
|
+
}
|
|
198
|
+
candidate = trimmed.slice(start, end + 1).trim();
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
const parsed = JSON.parse(candidate);
|
|
202
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return [];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/** generate additional personas from the model to fill a custom personas shortfall. */
|
|
209
|
+
export async function generateEphemeralPersonas(query, count, runModel) {
|
|
210
|
+
const targetCount = Math.max(0, count);
|
|
211
|
+
if (targetCount === 0) {
|
|
212
|
+
return [];
|
|
213
|
+
}
|
|
214
|
+
const personas = [];
|
|
215
|
+
const usedIds = new Set();
|
|
216
|
+
const missingPrompt = (remaining) => `Generate ${remaining} distinct analyst personas best suited to research: "${query}". Return a JSON array where each object has: id (lowercase-alphanumeric-hyphens), name, description (one sentence), methodology (short phrase). No markdown, no explanation.`;
|
|
217
|
+
for (let attempt = 0; attempt < 3 && personas.length < targetCount; attempt += 1) {
|
|
218
|
+
const remaining = targetCount - personas.length;
|
|
219
|
+
const userPrompt = missingPrompt(remaining);
|
|
220
|
+
const raw = await runModel(EPHEMERAL_PERSONA_PROMPT, userPrompt);
|
|
221
|
+
const candidates = parsePersonaCandidates(raw);
|
|
222
|
+
for (const candidate of candidates) {
|
|
223
|
+
if (!isPersonaConfig(candidate)) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
const normalized = normalizePersona(candidate);
|
|
227
|
+
if (usedIds.has(normalized.id)) {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
usedIds.add(normalized.id);
|
|
231
|
+
personas.push(normalized);
|
|
232
|
+
if (personas.length >= targetCount) {
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return personas.slice(0, targetCount);
|
|
238
|
+
}
|
|
239
|
+
/** load and normalize all custom personas from config storage. */
|
|
240
|
+
export function loadCustomPersonas() {
|
|
241
|
+
try {
|
|
242
|
+
if (!existsSync(PERSONAS_FILE)) {
|
|
243
|
+
return [];
|
|
244
|
+
}
|
|
245
|
+
const raw = readFileSync(PERSONAS_FILE, "utf8").trim();
|
|
246
|
+
if (!raw) {
|
|
247
|
+
return [];
|
|
248
|
+
}
|
|
249
|
+
const parsed = JSON.parse(raw);
|
|
250
|
+
if (!Array.isArray(parsed) || !parsed.every(isPersonaConfig)) {
|
|
251
|
+
return [];
|
|
252
|
+
}
|
|
253
|
+
return parsed.map((value) => normalizePersona(value));
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return [];
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/** write custom personas list to disk with restricted file permissions. */
|
|
260
|
+
export function saveCustomPersonas(personas) {
|
|
261
|
+
ensurePersonasDirectoryExists();
|
|
262
|
+
writeFileSync(PERSONAS_FILE, JSON.stringify(personas, null, 2), {
|
|
263
|
+
encoding: "utf8",
|
|
264
|
+
mode: 0o600,
|
|
265
|
+
});
|
|
266
|
+
chmodSync(PERSONAS_FILE, 0o600);
|
|
267
|
+
}
|
|
268
|
+
/** append a new custom persona after validation and persist it. */
|
|
269
|
+
export function addCustomPersona(persona) {
|
|
270
|
+
const candidate = normalizePersona(persona);
|
|
271
|
+
if (!candidate.id.length) {
|
|
272
|
+
return { error: "id must be non-empty" };
|
|
273
|
+
}
|
|
274
|
+
if (!candidate.name.length) {
|
|
275
|
+
return { error: "name must be non-empty" };
|
|
276
|
+
}
|
|
277
|
+
if (!candidate.description.length) {
|
|
278
|
+
return { error: "description must be non-empty" };
|
|
279
|
+
}
|
|
280
|
+
if (!candidate.methodology.length) {
|
|
281
|
+
return { error: "methodology must be non-empty" };
|
|
282
|
+
}
|
|
283
|
+
if (!PERSONA_ID_PATTERN.test(candidate.id)) {
|
|
284
|
+
return {
|
|
285
|
+
error: "id must be lowercase alphanumeric and hyphens only",
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
if (BUILTIN_PERSONA_IDS.has(candidate.id)) {
|
|
289
|
+
return { error: "id already exists" };
|
|
290
|
+
}
|
|
291
|
+
const customPersonas = loadCustomPersonas();
|
|
292
|
+
if (customPersonas.some((existing) => existing.id === candidate.id)) {
|
|
293
|
+
return { error: "id already exists" };
|
|
294
|
+
}
|
|
295
|
+
try {
|
|
296
|
+
saveCustomPersonas([...customPersonas, candidate]);
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
return { error: "failed to persist custom personas" };
|
|
300
|
+
}
|
|
301
|
+
return {};
|
|
302
|
+
}
|
|
303
|
+
/** remove a custom persona by id from storage. */
|
|
304
|
+
export function removeCustomPersona(id) {
|
|
305
|
+
const normalizedId = trimPersonaValue(id).toLowerCase();
|
|
306
|
+
if (!normalizedId.length) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
const customPersonas = loadCustomPersonas();
|
|
310
|
+
const filteredPersonas = customPersonas.filter((persona) => persona.id !== normalizedId);
|
|
311
|
+
if (filteredPersonas.length === customPersonas.length) {
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
try {
|
|
315
|
+
saveCustomPersonas(filteredPersonas);
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
return true;
|
|
321
|
+
}
|
|
322
|
+
/** return built-in and custom personas with built-ins first. */
|
|
323
|
+
export function allPersonas() {
|
|
324
|
+
return [...PERSONAS, ...loadCustomPersonas()];
|
|
325
|
+
}
|
|
326
|
+
/** find a persona by exact display name from built-ins. */
|
|
327
|
+
export function getPersonaByName(name) {
|
|
328
|
+
return PERSONAS.find((persona) => persona.name === name);
|
|
329
|
+
}
|
|
330
|
+
/** select a stable prefix of personas up to requested count. */
|
|
331
|
+
export function selectPersonas(count) {
|
|
332
|
+
const all = allPersonas();
|
|
333
|
+
const safeCount = Math.max(1, Math.min(all.length, count));
|
|
334
|
+
return all.slice(0, safeCount);
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=personas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personas.js","sourceRoot":"","sources":["../../src/engine/personas.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAE1C,SAAS,gBAAgB,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAsB;IAC/C,OAAO;QACN,EAAE,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE;QAC9C,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC;QACpC,WAAW,EAAE,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC;QAClD,WAAW,EAAE,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC;KAClD,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACtC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,KAA+B,CAAC;IAClD,IACC,OAAO,SAAS,CAAC,EAAE,KAAK,QAAQ;QAChC,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ;QAClC,OAAO,SAAS,CAAC,WAAW,KAAK,QAAQ;QACzC,OAAO,SAAS,CAAC,WAAW,KAAK,QAAQ,EACxC,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,gBAAgB,CAAC;QACnC,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,WAAW,EAAE,SAAS,CAAC,WAAW;KAClC,CAAC,CAAC;IACH,OAAO,CACN,UAAU,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC;QACxB,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAC1B,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;QACjC,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CACjC,CAAC;AACH,CAAC;AAED,SAAS,6BAA6B;IACrC,MAAM,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACpC,SAAS,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;AACF,CAAC;AAED,qDAAqD;AACrD,MAAM,CAAC,IAAI,aAAa,GAAG,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;AAEhE,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,IAAY;IAC3C,aAAa,GAAG,IAAI,CAAC;AACtB,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,eAAe;IAC9B,OAAO,aAAa,CAAC;AACtB,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,MAAM,QAAQ,GAAoB;IACxC;QACC,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,aAAa;QACnB,WAAW,EACV,4EAA4E;QAC7E,WAAW,EAAE,6BAA6B;KAC1C;IACD;QACC,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE,qBAAqB;KAClC;IACD;QACC,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,4CAA4C;QACzD,WAAW,EAAE,+BAA+B;KAC5C;IACD;QACC,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,sDAAsD;QACnE,WAAW,EAAE,wBAAwB;KACrC;IACD;QACC,EAAE,EAAE,mBAAmB;QACvB,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,+BAA+B;QAC5C,WAAW,EAAE,4BAA4B;KACzC;IACD;QACC,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,kDAAkD;QAC/D,WAAW,EAAE,oBAAoB;KACjC;IACD;QACC,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,+CAA+C;QAC5D,WAAW,EAAE,qBAAqB;KAClC;IACD;QACC,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,+CAA+C;QAC5D,WAAW,EAAE,4BAA4B;KACzC;IACD;QACC,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,4CAA4C;QACzD,WAAW,EAAE,2BAA2B;KACxC;IACD;QACC,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE,wBAAwB;KACrC;IACD;QACC,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,eAAe;QACrB,WAAW,EACV,qEAAqE;QACtE,WAAW,EAAE,0CAA0C;KACvD;IACD;QACC,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,6DAA6D;QAC1E,WAAW,EAAE,8BAA8B;KAC3C;IACD;QACC,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,6DAA6D;QAC1E,WAAW,EAAE,4BAA4B;KACzC;IACD;QACC,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,4DAA4D;QACzE,WAAW,EAAE,2BAA2B;KACxC;IACD;QACC,EAAE,EAAE,mBAAmB;QACvB,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACV,+EAA+E;QAChF,WAAW,EAAE,6BAA6B;KAC1C;IACD;QACC,EAAE,EAAE,sBAAsB;QAC1B,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACV,+DAA+D;QAChE,WAAW,EAAE,2BAA2B;KACxC;IACD;QACC,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACV,mEAAmE;QACpE,WAAW,EAAE,gCAAgC;KAC7C;IACD;QACC,EAAE,EAAE,oBAAoB;QACxB,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACV,gFAAgF;QACjF,WAAW,EAAE,kCAAkC;KAC/C;IACD;QACC,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,6DAA6D;QAC1E,WAAW,EAAE,qCAAqC;KAClD;IACD;QACC,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACV,gFAAgF;QACjF,WAAW,EAAE,0BAA0B;KACvC;CACD,CAAC;AAEF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAE3E,mCAAmC;AACnC,MAAM,CAAC,MAAM,qBAAqB,GAAG,QAAQ,CAAC,MAAM,CAAC;AAErD,MAAM,wBAAwB,GAC7B,iFAAiF,CAAC;AAEnF,SAAS,sBAAsB,CAAC,GAAW;IAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACX,CAAC;IAED,IAAI,SAAS,GAAG,OAAO,CAAC;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC9D,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;SAAM,CAAC;QACP,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACX,CAAC;QACD,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,KAAa,EACb,KAAa,EACb,QAAuE;IAEvE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACvC,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,MAAM,aAAa,GAAG,CAAC,SAAiB,EAAE,EAAE,CAC3C,YAAY,SAAS,wDAAwD,KAAK,+KAA+K,CAAC;IAEnQ,KACC,IAAI,OAAO,GAAG,CAAC,EACf,OAAO,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,WAAW,EAC5C,OAAO,IAAI,CAAC,EACX,CAAC;QACF,MAAM,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC;QAChD,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAE/C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACpC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;gBACjC,SAAS;YACV,CAAC;YAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChC,SAAS;YACV,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,IAAI,QAAQ,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;gBACpC,MAAM;YACP,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AACvC,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,kBAAkB;IACjC,IAAI,CAAC;QACJ,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;YAC9D,OAAO,EAAE,CAAC;QACX,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAAC,QAAyB;IAC3D,6BAA6B,EAAE,CAAC;IAChC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAC/D,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK;KACX,CAAC,CAAC;IACH,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,gBAAgB,CAAC,OAAsB;IACtD,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAC1C,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5C,OAAO;YACN,KAAK,EAAE,oDAAoD;SAC3D,CAAC;IACH,CAAC;IACD,IAAI,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3C,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,cAAc,GAAG,kBAAkB,EAAE,CAAC;IAC5C,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;QACrE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;IACvC,CAAC;IAED,IAAI,CAAC;QACJ,kBAAkB,CAAC,CAAC,GAAG,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC7C,MAAM,YAAY,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACxD,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,cAAc,GAAG,kBAAkB,EAAE,CAAC;IAC5C,MAAM,gBAAgB,GAAG,cAAc,CAAC,MAAM,CAC7C,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,YAAY,CACxC,CAAC;IACF,IAAI,gBAAgB,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC;QACvD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACJ,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,WAAW;IAC1B,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,kBAAkB,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,cAAc,CAAC,KAAa;IAC3C,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { addTokenUsage, completeAgentRun, createAgentRun, createRun, markRunComplete, markRunFailed, updateAgentRun, updateRunStatus } from "../db/queries.js";
|
|
3
|
+
import type { PersonaConfig, SearchConfig } from "../types.js";
|
|
4
|
+
import { runWithConcurrency } from "./concurrency.js";
|
|
5
|
+
import { runModelWithOptionalTools } from "./model.js";
|
|
6
|
+
/** configuration passed to pipeline creation and used across all phases. */
|
|
7
|
+
export interface PipelineConfig {
|
|
8
|
+
apiKey: string;
|
|
9
|
+
baseUrl: string;
|
|
10
|
+
model: string;
|
|
11
|
+
orchestratorModel?: string;
|
|
12
|
+
researchModel?: string;
|
|
13
|
+
searchConfig: SearchConfig;
|
|
14
|
+
agentCount: number;
|
|
15
|
+
maxConcurrency: number;
|
|
16
|
+
debateRounds: number;
|
|
17
|
+
searchEnabled: boolean;
|
|
18
|
+
customPersonasOnly: boolean;
|
|
19
|
+
}
|
|
20
|
+
export type PipelineDependencies = {
|
|
21
|
+
runModel: typeof runModelWithOptionalTools;
|
|
22
|
+
runWithConcurrency: typeof runWithConcurrency;
|
|
23
|
+
personas: PersonaConfig[] | (() => PersonaConfig[]);
|
|
24
|
+
createRun: typeof createRun;
|
|
25
|
+
createAgentRun: typeof createAgentRun;
|
|
26
|
+
completeAgentRun: typeof completeAgentRun;
|
|
27
|
+
updateAgentRun: typeof updateAgentRun;
|
|
28
|
+
updateRunStatus: typeof updateRunStatus;
|
|
29
|
+
markRunComplete: typeof markRunComplete;
|
|
30
|
+
markRunFailed: typeof markRunFailed;
|
|
31
|
+
addTokenUsage: typeof addTokenUsage;
|
|
32
|
+
};
|
|
33
|
+
/** orchestrates a full hydra run across decomposition, research, debate, and synthesis. */
|
|
34
|
+
export declare class HydraPipeline extends EventEmitter {
|
|
35
|
+
#private;
|
|
36
|
+
/** initialize pipeline with validated runtime configuration. */
|
|
37
|
+
constructor(config: PipelineConfig, dependencies?: Partial<PipelineDependencies>);
|
|
38
|
+
/** execute the full pipeline for a user query and return run metadata. */
|
|
39
|
+
run(query: string): Promise<{
|
|
40
|
+
runId: string;
|
|
41
|
+
brief: string;
|
|
42
|
+
}>;
|
|
43
|
+
private decompose;
|
|
44
|
+
private runResearchPhase;
|
|
45
|
+
private runDebateRounds;
|
|
46
|
+
private runDebateRound;
|
|
47
|
+
private synthesize;
|
|
48
|
+
private runModel;
|
|
49
|
+
private setStatus;
|
|
50
|
+
private normalizeAssignments;
|
|
51
|
+
private parseAssignments;
|
|
52
|
+
private extractBracketPayload;
|
|
53
|
+
private resolvePersona;
|
|
54
|
+
private formatCodeBlock;
|
|
55
|
+
private buildDebatePrompt;
|
|
56
|
+
private trimDebateContext;
|
|
57
|
+
private formatPersonaOutputs;
|
|
58
|
+
private toAgentState;
|
|
59
|
+
private resolvePersonas;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/engine/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACN,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,EACf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAGX,aAAa,EAGb,YAAY,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAuB,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAa5E,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,EAAE,OAAO,yBAAyB,CAAC;IAC3C,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC;IACpD,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,cAAc,EAAE,OAAO,cAAc,CAAC;IACtC,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,cAAc,EAAE,OAAO,cAAc,CAAC;IACtC,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,aAAa,EAAE,OAAO,aAAa,CAAC;CACpC,CAAC;AA6CF,2FAA2F;AAC3F,qBAAa,aAAc,SAAQ,YAAY;;IAQ9C,gEAAgE;gBAE/D,MAAM,EAAE,cAAc,EACtB,YAAY,GAAE,OAAO,CAAC,oBAAoB,CAAM;IAYjD,0EAA0E;IACpE,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;YAgJrD,SAAS;YAuCT,gBAAgB;YAyJhB,eAAe;YAsBf,cAAc;YAoLd,UAAU;YA+BV,QAAQ;IAiCtB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,oBAAoB;IA2E5B,OAAO,CAAC,gBAAgB;IAwDxB,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,eAAe;CAKvB"}
|