@mmnto/cli 0.18.0 → 0.20.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 +190 -21
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +15 -0
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/docs.d.ts +6 -1
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +58 -5
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/docs.test.js +141 -89
- package/dist/commands/docs.test.js.map +1 -1
- package/dist/commands/extract.d.ts +1 -0
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +15 -5
- package/dist/commands/extract.js.map +1 -1
- package/dist/commands/extract.test.js +54 -1
- package/dist/commands/extract.test.js.map +1 -1
- package/dist/commands/shield.d.ts.map +1 -1
- package/dist/commands/shield.js +3 -1
- package/dist/commands/shield.js.map +1 -1
- package/dist/commands/wrap.js +1 -1
- package/dist/commands/wrap.js.map +1 -1
- package/dist/commands/wrap.test.js +2 -2
- package/dist/commands/wrap.test.js.map +1 -1
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +35 -24
- package/dist/git.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/orchestrators/anthropic-orchestrator.d.ts +9 -0
- package/dist/orchestrators/anthropic-orchestrator.d.ts.map +1 -0
- package/dist/orchestrators/anthropic-orchestrator.js +62 -0
- package/dist/orchestrators/anthropic-orchestrator.js.map +1 -0
- package/dist/orchestrators/anthropic-orchestrator.test.d.ts +2 -0
- package/dist/orchestrators/anthropic-orchestrator.test.d.ts.map +1 -0
- package/dist/orchestrators/anthropic-orchestrator.test.js +109 -0
- package/dist/orchestrators/anthropic-orchestrator.test.js.map +1 -0
- package/dist/orchestrators/gemini-orchestrator.d.ts +9 -0
- package/dist/orchestrators/gemini-orchestrator.d.ts.map +1 -0
- package/dist/orchestrators/gemini-orchestrator.js +58 -0
- package/dist/orchestrators/gemini-orchestrator.js.map +1 -0
- package/dist/orchestrators/gemini-orchestrator.test.d.ts +2 -0
- package/dist/orchestrators/gemini-orchestrator.test.d.ts.map +1 -0
- package/dist/orchestrators/gemini-orchestrator.test.js +120 -0
- package/dist/orchestrators/gemini-orchestrator.test.js.map +1 -0
- package/dist/orchestrators/orchestrator.d.ts +56 -0
- package/dist/orchestrators/orchestrator.d.ts.map +1 -0
- package/dist/orchestrators/orchestrator.js +96 -0
- package/dist/orchestrators/orchestrator.js.map +1 -0
- package/dist/orchestrators/orchestrator.test.d.ts.map +1 -0
- package/dist/orchestrators/orchestrator.test.js +222 -0
- package/dist/orchestrators/orchestrator.test.js.map +1 -0
- package/dist/orchestrators/shell-orchestrator.d.ts +16 -0
- package/dist/orchestrators/shell-orchestrator.d.ts.map +1 -0
- package/dist/orchestrators/shell-orchestrator.js +131 -0
- package/dist/orchestrators/shell-orchestrator.js.map +1 -0
- package/dist/orchestrators/shell-orchestrator.test.d.ts +2 -0
- package/dist/orchestrators/shell-orchestrator.test.d.ts.map +1 -0
- package/dist/orchestrators/shell-orchestrator.test.js +267 -0
- package/dist/orchestrators/shell-orchestrator.test.js.map +1 -0
- package/dist/utils.d.ts +1 -18
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +31 -146
- package/dist/utils.js.map +1 -1
- package/dist/utils.test.js +183 -82
- package/dist/utils.test.js.map +1 -1
- package/package.json +17 -3
- package/dist/orchestrator.test.d.ts.map +0 -1
- package/dist/orchestrator.test.js +0 -130
- package/dist/orchestrator.test.js.map +0 -1
- /package/dist/{orchestrator.test.d.ts → orchestrators/orchestrator.test.d.ts} +0 -0
package/dist/utils.js
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
1
|
import * as crypto from 'node:crypto';
|
|
3
2
|
import * as fs from 'node:fs';
|
|
4
3
|
import * as path from 'node:path';
|
|
5
|
-
import { z } from 'zod';
|
|
6
4
|
import { TotemConfigSchema } from '@mmnto/totem';
|
|
5
|
+
import { createOrchestrator, resolveOrchestrator } from './orchestrators/orchestrator.js';
|
|
7
6
|
import { bold, log } from './ui.js';
|
|
8
7
|
// ─── Shared constants ────────────────────────────────────
|
|
9
|
-
const LLM_TIMEOUT_MS = 180_000;
|
|
10
|
-
const LLM_MAX_OUTPUT = 50 * 1024 * 1024; // 50 MB — safety cap on streamed output
|
|
11
|
-
const TEMP_ID_BYTES = 4;
|
|
12
|
-
const MODEL_NAME_RE = /^[\w./:_-]+$/;
|
|
13
8
|
const TELEMETRY_FILE = 'telemetry.jsonl';
|
|
14
9
|
/** execFileSync on Windows can't resolve executables without `shell: true`. */
|
|
15
10
|
export const IS_WIN = process.platform === 'win32';
|
|
@@ -70,126 +65,6 @@ function appendTelemetry(entry, cwd, totemDir) {
|
|
|
70
65
|
log.warn('Totem', `Failed to write telemetry: ${msg}`);
|
|
71
66
|
}
|
|
72
67
|
}
|
|
73
|
-
const GeminiModelStatsSchema = z.object({
|
|
74
|
-
tokens: z.object({ input: z.number(), candidates: z.number() }).optional(),
|
|
75
|
-
api: z.object({ totalLatencyMs: z.number() }).optional(),
|
|
76
|
-
});
|
|
77
|
-
const GeminiOutputSchema = z.object({
|
|
78
|
-
response: z.string(),
|
|
79
|
-
stats: z.object({ models: z.record(GeminiModelStatsSchema) }),
|
|
80
|
-
});
|
|
81
|
-
/**
|
|
82
|
-
* Try to parse Gemini CLI JSON output. Returns extracted data or null if
|
|
83
|
-
* the output is not valid Gemini JSON (e.g. raw text from a non-Gemini orchestrator).
|
|
84
|
-
*/
|
|
85
|
-
export function tryParseGeminiJson(raw) {
|
|
86
|
-
let data;
|
|
87
|
-
try {
|
|
88
|
-
data = JSON.parse(raw);
|
|
89
|
-
}
|
|
90
|
-
catch {
|
|
91
|
-
return null;
|
|
92
|
-
}
|
|
93
|
-
const result = GeminiOutputSchema.safeParse(data);
|
|
94
|
-
if (!result.success)
|
|
95
|
-
return null;
|
|
96
|
-
const allModelStats = Object.values(result.data.stats.models);
|
|
97
|
-
if (allModelStats.length === 0)
|
|
98
|
-
return null;
|
|
99
|
-
const inputTokens = allModelStats.reduce((sum, s) => sum + (s.tokens?.input ?? 0), 0);
|
|
100
|
-
const outputTokens = allModelStats.reduce((sum, s) => sum + (s.tokens?.candidates ?? 0), 0);
|
|
101
|
-
const latencyMs = allModelStats.reduce((sum, s) => sum + (s.api?.totalLatencyMs ?? 0), 0) || null;
|
|
102
|
-
return {
|
|
103
|
-
content: result.data.response,
|
|
104
|
-
inputTokens,
|
|
105
|
-
outputTokens,
|
|
106
|
-
latencyMs,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
// ─── Shell orchestrator ─────────────────────────────────
|
|
110
|
-
export async function invokeShellOrchestrator(prompt, command, model, cwd, tag, totemDir) {
|
|
111
|
-
const tmpName = `totem-${tag.toLowerCase()}-${crypto.randomBytes(TEMP_ID_BYTES).toString('hex')}.md`;
|
|
112
|
-
const tempDir = path.join(cwd, totemDir, 'temp');
|
|
113
|
-
fs.mkdirSync(tempDir, { recursive: true });
|
|
114
|
-
const tempPath = path.join(tempDir, tmpName);
|
|
115
|
-
fs.writeFileSync(tempPath, prompt, { encoding: 'utf-8', mode: 0o600 });
|
|
116
|
-
const quotedPath = IS_WIN
|
|
117
|
-
? `"${tempPath.replace(/"/g, '""')}"`
|
|
118
|
-
: `'${tempPath.replace(/'/g, "'\\''")}'`;
|
|
119
|
-
const resolvedCmd = command.replace(/\{file\}/g, quotedPath).replace(/\{model\}/g, model);
|
|
120
|
-
log.info(tag, 'Invoking orchestrator (this may take 15-60 seconds)...');
|
|
121
|
-
const startMs = Date.now();
|
|
122
|
-
try {
|
|
123
|
-
const raw = await new Promise((resolve, reject) => {
|
|
124
|
-
const child = spawn(resolvedCmd, {
|
|
125
|
-
cwd,
|
|
126
|
-
shell: true,
|
|
127
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
128
|
-
});
|
|
129
|
-
let stdout = '';
|
|
130
|
-
let stderr = '';
|
|
131
|
-
let timedOut = false;
|
|
132
|
-
child.stdout.on('data', (chunk) => {
|
|
133
|
-
if (stdout.length < LLM_MAX_OUTPUT)
|
|
134
|
-
stdout += chunk.toString();
|
|
135
|
-
});
|
|
136
|
-
child.stderr.on('data', (chunk) => {
|
|
137
|
-
if (stderr.length < LLM_MAX_OUTPUT)
|
|
138
|
-
stderr += chunk.toString();
|
|
139
|
-
});
|
|
140
|
-
const timer = setTimeout(() => {
|
|
141
|
-
timedOut = true;
|
|
142
|
-
child.kill();
|
|
143
|
-
}, LLM_TIMEOUT_MS);
|
|
144
|
-
child.on('error', (err) => {
|
|
145
|
-
clearTimeout(timer);
|
|
146
|
-
reject(new Error(`[Totem Error] Shell orchestrator command failed: ${err.message}\n${stderr}`));
|
|
147
|
-
});
|
|
148
|
-
child.on('close', (code) => {
|
|
149
|
-
clearTimeout(timer);
|
|
150
|
-
if (timedOut) {
|
|
151
|
-
reject(Object.assign(new Error(`[Totem Error] Orchestrator timed out after ${LLM_TIMEOUT_MS / 1000}s.\n${stderr}`), { code: 'ETIMEDOUT' }));
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
if (code !== 0) {
|
|
155
|
-
const fullError = `Process exited with code ${code}\n${stderr}`;
|
|
156
|
-
const lowerMsg = fullError.toLowerCase();
|
|
157
|
-
if (lowerMsg.includes('quota') ||
|
|
158
|
-
lowerMsg.includes('429') ||
|
|
159
|
-
lowerMsg.includes('too many requests')) {
|
|
160
|
-
const quotaErr = new Error(fullError);
|
|
161
|
-
quotaErr.name = 'QuotaError';
|
|
162
|
-
reject(quotaErr);
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
reject(new Error(`[Totem Error] Shell orchestrator command failed: ${fullError}`));
|
|
166
|
-
}
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
resolve(stdout);
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
const wallMs = Date.now() - startMs;
|
|
173
|
-
const gemini = tryParseGeminiJson(raw);
|
|
174
|
-
if (gemini) {
|
|
175
|
-
return {
|
|
176
|
-
content: gemini.content,
|
|
177
|
-
inputTokens: gemini.inputTokens,
|
|
178
|
-
outputTokens: gemini.outputTokens,
|
|
179
|
-
durationMs: gemini.latencyMs ?? wallMs,
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
return { content: raw.trim(), inputTokens: null, outputTokens: null, durationMs: wallMs };
|
|
183
|
-
}
|
|
184
|
-
finally {
|
|
185
|
-
try {
|
|
186
|
-
fs.unlinkSync(tempPath);
|
|
187
|
-
}
|
|
188
|
-
catch {
|
|
189
|
-
// Temp cleanup is best-effort
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
68
|
// ─── Orphaned temp file cleanup ──────────────────────────
|
|
194
69
|
const TEMP_FILE_RE = /^totem-.*\.md$/;
|
|
195
70
|
const TEMP_MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
@@ -300,7 +175,7 @@ const DEFAULT_TTLS = {
|
|
|
300
175
|
};
|
|
301
176
|
/**
|
|
302
177
|
* Validate orchestrator config, then either output raw context (--raw) or
|
|
303
|
-
* invoke the
|
|
178
|
+
* invoke the configured orchestrator provider and return the LLM content.
|
|
304
179
|
*
|
|
305
180
|
* Returns `undefined` in --raw mode (prompt already written to output).
|
|
306
181
|
* Returns the LLM response content string otherwise.
|
|
@@ -320,18 +195,18 @@ export async function runOrchestrator(opts) {
|
|
|
320
195
|
throw new Error(`[Totem Error] No orchestrator configured. Add an 'orchestrator' block to totem.config.ts.\n` +
|
|
321
196
|
`Example:\n orchestrator: {\n provider: 'shell',\n command: 'gemini --model {model} -e none < {file}',\n defaultModel: 'gemini-2.5-pro',\n }`);
|
|
322
197
|
}
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
}
|
|
198
|
+
const baseProvider = config.orchestrator.provider;
|
|
199
|
+
const baseInvoke = createOrchestrator(config.orchestrator);
|
|
326
200
|
const tagKey = tag.toLowerCase();
|
|
327
|
-
|
|
328
|
-
if (!
|
|
201
|
+
const rawModel = options.model ?? config.orchestrator.overrides?.[tagKey] ?? config.orchestrator.defaultModel;
|
|
202
|
+
if (!rawModel) {
|
|
329
203
|
throw new Error(`[Totem Error] No model specified. Provide one with --model, set a command-specific model in 'overrides', or set a 'defaultModel' in your orchestrator config.`);
|
|
330
204
|
}
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
205
|
+
let resolved = resolveOrchestrator(rawModel, baseProvider, baseInvoke);
|
|
206
|
+
let model = resolved.parsed.model;
|
|
207
|
+
let qualifiedModel = resolved.qualifiedModel;
|
|
208
|
+
let invoke = resolved.invoke;
|
|
209
|
+
log.info(tag, `Model: ${bold(rawModel)}`);
|
|
335
210
|
const ttlSeconds = config.orchestrator.cacheTtls?.[tagKey] ?? DEFAULT_TTLS[tagKey] ?? 0;
|
|
336
211
|
const useCache = ttlSeconds > 0 && !options.fresh;
|
|
337
212
|
let cachePath = '';
|
|
@@ -339,7 +214,7 @@ export async function runOrchestrator(opts) {
|
|
|
339
214
|
const hash = crypto
|
|
340
215
|
.createHash('sha256')
|
|
341
216
|
.update(prompt)
|
|
342
|
-
.update(
|
|
217
|
+
.update(qualifiedModel)
|
|
343
218
|
.digest('hex')
|
|
344
219
|
.slice(0, 16);
|
|
345
220
|
const cacheDir = path.join(cwd, config.totemDir, 'cache');
|
|
@@ -360,22 +235,32 @@ export async function runOrchestrator(opts) {
|
|
|
360
235
|
}
|
|
361
236
|
let result;
|
|
362
237
|
try {
|
|
363
|
-
result = await
|
|
238
|
+
result = await invoke({ prompt, model, cwd, tag, totemDir: config.totemDir });
|
|
364
239
|
}
|
|
365
240
|
catch (err) {
|
|
366
241
|
if (err instanceof Error && err.name === 'QuotaError') {
|
|
367
|
-
const
|
|
368
|
-
if (
|
|
369
|
-
log.warn(tag, `Quota exhausted for ${
|
|
242
|
+
const rawFallback = config.orchestrator.fallbackModel;
|
|
243
|
+
if (rawFallback && rawModel !== rawFallback) {
|
|
244
|
+
log.warn(tag, `Quota exhausted for ${rawModel}. Retrying with fallback model: ${bold(rawFallback)}...`);
|
|
245
|
+
const fallbackResolved = resolveOrchestrator(rawFallback, baseProvider, baseInvoke);
|
|
370
246
|
try {
|
|
371
|
-
result = await
|
|
372
|
-
|
|
373
|
-
|
|
247
|
+
result = await fallbackResolved.invoke({
|
|
248
|
+
prompt,
|
|
249
|
+
model: fallbackResolved.parsed.model,
|
|
250
|
+
cwd,
|
|
251
|
+
tag,
|
|
252
|
+
totemDir: config.totemDir,
|
|
253
|
+
});
|
|
254
|
+
// Update model/invoke so telemetry and cache log the correct values
|
|
255
|
+
model = fallbackResolved.parsed.model;
|
|
256
|
+
qualifiedModel = fallbackResolved.qualifiedModel;
|
|
257
|
+
resolved = fallbackResolved;
|
|
258
|
+
invoke = fallbackResolved.invoke;
|
|
374
259
|
}
|
|
375
260
|
catch (fallbackErr) {
|
|
376
261
|
const originalMsg = err.message;
|
|
377
262
|
const fallbackMsg = fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr);
|
|
378
|
-
throw new Error(`[Totem Error] Primary model '${
|
|
263
|
+
throw new Error(`[Totem Error] Primary model '${rawModel}' failed and fallback model '${rawFallback}' also failed.\n\n` +
|
|
379
264
|
`Primary error:\n${originalMsg}\n\n` +
|
|
380
265
|
`Fallback error:\n${fallbackMsg}`);
|
|
381
266
|
}
|
|
@@ -418,7 +303,7 @@ export async function runOrchestrator(opts) {
|
|
|
418
303
|
appendTelemetry({
|
|
419
304
|
timestamp: new Date().toISOString(),
|
|
420
305
|
tag,
|
|
421
|
-
model,
|
|
306
|
+
model: qualifiedModel,
|
|
422
307
|
promptChars: prompt.length,
|
|
423
308
|
inputTokens: result.inputTokens,
|
|
424
309
|
outputTokens: result.outputTokens,
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAEpC,4DAA4D;AAE5D,MAAM,cAAc,GAAG,OAAO,CAAC;AAC/B,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,wCAAwC;AACjF,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,aAAa,GAAG,cAAc,CAAC;AACrC,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAEzC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAEnD,yCAAyC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO;IAEpC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC5C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAA4B,CAAC;IACvE,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC;IAClC,OAAO,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,uDAAuD;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAqBhD,SAAS,eAAe,CAAC,KAAqB,EAAE,GAAW,EAAE,QAAgB;IAC3E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,0EAA0E;QAC1E,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,8BAA8B,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC1E,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;CACzD,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,EAAE,CAAC;CAC9D,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAW;IAEX,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9D,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtF,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,cAAc,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;IAElG,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;QAC7B,WAAW;QACX,YAAY;QACZ,SAAS;KACV,CAAC;AACJ,CAAC;AAED,2DAA2D;AAE3D,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAc,EACd,OAAe,EACf,KAAa,EACb,GAAW,EACX,GAAW,EACX,QAAgB;IAEhB,MAAM,OAAO,GAAG,SAAS,GAAG,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;IACrG,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE7C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAG,MAAM;QACvB,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG;QACrC,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;IAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAE1F,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,wDAAwD,CAAC,CAAC;IAExE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;gBAC/B,GAAG;gBACH,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;YAErB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACxC,IAAI,MAAM,CAAC,MAAM,GAAG,cAAc;oBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjE,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACxC,IAAI,MAAM,CAAC,MAAM,GAAG,cAAc;oBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjE,CAAC,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,QAAQ,GAAG,IAAI,CAAC;gBAChB,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC,EAAE,cAAc,CAAC,CAAC;YAEnB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,CACJ,IAAI,KAAK,CAAC,oDAAoD,GAAG,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC,CACxF,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,CACJ,MAAM,CAAC,MAAM,CACX,IAAI,KAAK,CACP,8CAA8C,cAAc,GAAG,IAAI,OAAO,MAAM,EAAE,CACnF,EACD,EAAE,IAAI,EAAE,WAAW,EAAE,CACtB,CACF,CAAC;oBACF,OAAO;gBACT,CAAC;gBAED,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,MAAM,SAAS,GAAG,4BAA4B,IAAI,KAAK,MAAM,EAAE,CAAC;oBAChE,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;oBACzC,IACE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;wBAC1B,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;wBACxB,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EACtC,CAAC;wBACD,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;wBACtC,QAAQ,CAAC,IAAI,GAAG,YAAY,CAAC;wBAC7B,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACnB,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,KAAK,CAAC,oDAAoD,SAAS,EAAE,CAAC,CAAC,CAAC;oBACrF,CAAC;oBACD,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QAEpC,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,UAAU,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM;aACvC,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAC5F,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;AACH,CAAC;AAED,4DAA4D;AAE5D,MAAM,YAAY,GAAG,gBAAgB,CAAC;AACtC,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AAExD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAW,EACX,QAAgB,EAChB,WAAmB,eAAe;IAElC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC;IAE9C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC,CAAC,iDAAiD;IAC7D,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,SAAS;QAExC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;gBAClC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;QACjE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4DAA4D;AAE5D,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AAEvD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,WAAmB,EACnB,aAAqB,EACrB,GAAW,EACX,QAAgB;IAEhB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC;QAAE,OAAO,aAAa,CAAC;IAElE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,WAAW,KAAK,CAAC,CAAC;IAC5E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,aAAa,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,OAAO,aAAa,CAAC;QAC1C,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC;IACvB,CAAC;AACH,CAAC;AAED,2DAA2D;AAE3D,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,OAAgB;IAC3D,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,4DAA4D;AAE5D,0DAA0D;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,2DAA2D;AAE3D,oDAAoD;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,2DAA2D;AAE3D,MAAM,yBAAyB,GAAG,GAAG,CAAC;AACtC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAEpC,MAAM,UAAU,aAAa,CAC3B,OAAuB,EACvB,OAAe,EACf,SAAmB;IAEnB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,yBAAyB,CAAC;IAChF,MAAM,KAAK,GAAG,OAAO;SAClB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE7C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9C,OAAO,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,QAAQ,KAAK,OAAO,GAAG,QAAQ,EAAE,CAAC;QAClE,CAAC;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,CACL,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;YACpE,GAAG,OAAO,GAAG,QAAQ,EAAE,CACxB,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,OAAO,SAAS,OAAO,SAAS,KAAK,IAAI,CAAC;AAC5C,CAAC;AAWD,MAAM,YAAY,GAA2B;IAC3C,MAAM,EAAE,IAAI,EAAE,SAAS;IACvB,QAAQ,EAAE,IAAI,EAAE,SAAS;IACzB,IAAI,EAAE,IAAI,EAAE,SAAS;IACrB,IAAI,EAAE,CAAC,EAAE,kDAAkD;IAC3D,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;CACT,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAOrC;IACC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAEnD,kCAAkC;IAClC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,8BAA8B,MAAM,GAAG,CAAC,CAAC;QACtD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,6FAA6F;YAC3F,wJAAwJ,CAC3J,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,qDAAqD,MAAM,CAAC,YAAY,CAAC,QAAQ,+BAA+B,CACjH,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,KAAK,GACP,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC;IAC/F,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,+JAA+J,CAChK,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,qCAAqC,KAAK,mIAAmI,CAC9K,CAAC;IACJ,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAEvC,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAG,UAAU,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAClD,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM;aAChB,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,MAAM,CAAC;aACd,MAAM,CAAC,KAAK,CAAC;aACb,MAAM,CAAC,KAAK,CAAC;aACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1D,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,IAAI,IAAI,OAAO,CAAC,CAAC;QAE1D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;gBAClE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC;gBAC/C,IAAI,KAAK,GAAG,UAAU,GAAG,IAAI,EAAE,CAAC;oBAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,kCAAkC,UAAU,IAAI,CAAC,CAAC;oBAC/D,OAAO,SAAS,CAAC,OAAO,CAAC;gBAC3B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,uBAAuB,CACpC,MAAM,EACN,MAAM,CAAC,YAAY,CAAC,OAAO,EAC3B,KAAK,EACL,GAAG,EACH,GAAG,EACH,MAAM,CAAC,QAAQ,CAChB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC;YACnD,IAAI,QAAQ,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACnC,GAAG,CAAC,IAAI,CACN,GAAG,EACH,uBAAuB,KAAK,mCAAmC,IAAI,CAAC,QAAQ,CAAC,KAAK,CACnF,CAAC;gBACF,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,uBAAuB,CACpC,MAAM,EACN,MAAM,CAAC,YAAY,CAAC,OAAO,EAC3B,QAAQ,EACR,GAAG,EACH,GAAG,EACH,MAAM,CAAC,QAAQ,CAChB,CAAC;oBACF,4EAA4E;oBAC5E,KAAK,GAAG,QAAQ,CAAC;gBACnB,CAAC;gBAAC,OAAO,WAAoB,EAAE,CAAC;oBAC9B,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC;oBAChC,MAAM,WAAW,GACf,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC3E,MAAM,IAAI,KAAK,CACb,gCAAgC,KAAK,gCAAgC,QAAQ,oBAAoB;wBAC/F,mBAAmB,WAAW,MAAM;wBACpC,oBAAoB,WAAW,EAAE,CACpC,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CACb,qCAAqC,KAAK,KAAK;oBAC7C,6CAA6C;oBAC7C,cAAc;oBACd,iEAAiE;oBACjE,2EAA2E;oBAC3E,8CAA8C,CACjD,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,qEAAqE;YACrE,MAAM,SAAS,GAAG,MAAM;iBACrB,UAAU,CAAC,QAAQ,CAAC;iBACpB,MAAM,CAAC,MAAM,CAAC;iBACd,MAAM,CAAC,KAAK,CAAC;iBACb,MAAM,CAAC,KAAK,CAAC;iBACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,IAAI,SAAS,OAAO,CAAC,CAAC;YAC1E,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,EAAE,CAAC,aAAa,CACd,cAAc,EACd,IAAI,CAAC,SAAS,CAAC;gBACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,EACF,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CACnC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,eAAe,CACb;QACE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG;QACH,KAAK;QACL,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,EACD,GAAG,EACH,MAAM,CAAC,QAAQ,CAChB,CAAC;IAEF,kBAAkB;IAClB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;QACpD,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,IAAI,OAAO,KAAK,SAAS,MAAM,MAAM,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.test.js
CHANGED
|
@@ -2,7 +2,7 @@ import * as fs from 'node:fs';
|
|
|
2
2
|
import * as os from 'node:os';
|
|
3
3
|
import * as path from 'node:path';
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
-
import { formatResults, getSystemPrompt, loadEnv, reapOrphanedTempFiles, requireEmbedding, resolveConfigPath,
|
|
5
|
+
import { formatResults, getSystemPrompt, loadEnv, reapOrphanedTempFiles, requireEmbedding, resolveConfigPath, runOrchestrator, sanitize, wrapXml, writeOutput, } from './utils.js';
|
|
6
6
|
/** Helper to build a minimal SearchResult for tests. */
|
|
7
7
|
function makeResult(overrides) {
|
|
8
8
|
return { contextPrefix: '', type: 'code', metadata: {}, ...overrides };
|
|
@@ -157,87 +157,6 @@ describe('writeOutput', () => {
|
|
|
157
157
|
spy.mockRestore();
|
|
158
158
|
});
|
|
159
159
|
});
|
|
160
|
-
// ─── tryParseGeminiJson ──────────────────────────────
|
|
161
|
-
describe('tryParseGeminiJson', () => {
|
|
162
|
-
it('returns null for non-JSON input', () => {
|
|
163
|
-
expect(tryParseGeminiJson('plain text output')).toBeNull();
|
|
164
|
-
});
|
|
165
|
-
it('returns null for JSON that does not match Gemini schema', () => {
|
|
166
|
-
expect(tryParseGeminiJson('{"foo": "bar"}')).toBeNull();
|
|
167
|
-
});
|
|
168
|
-
it('returns null when stats.models is empty', () => {
|
|
169
|
-
const input = JSON.stringify({
|
|
170
|
-
response: 'hello',
|
|
171
|
-
stats: { models: {} },
|
|
172
|
-
});
|
|
173
|
-
expect(tryParseGeminiJson(input)).toBeNull();
|
|
174
|
-
});
|
|
175
|
-
it('parses valid Gemini output with token stats', () => {
|
|
176
|
-
const input = JSON.stringify({
|
|
177
|
-
response: 'The answer is 42.',
|
|
178
|
-
stats: {
|
|
179
|
-
models: {
|
|
180
|
-
'gemini-2.5-pro': {
|
|
181
|
-
tokens: { input: 500, candidates: 200 },
|
|
182
|
-
api: { totalLatencyMs: 3000 },
|
|
183
|
-
},
|
|
184
|
-
},
|
|
185
|
-
},
|
|
186
|
-
});
|
|
187
|
-
const result = tryParseGeminiJson(input);
|
|
188
|
-
expect(result).toEqual({
|
|
189
|
-
content: 'The answer is 42.',
|
|
190
|
-
inputTokens: 500,
|
|
191
|
-
outputTokens: 200,
|
|
192
|
-
latencyMs: 3000,
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
it('aggregates stats across multiple models', () => {
|
|
196
|
-
const input = JSON.stringify({
|
|
197
|
-
response: 'multi-model',
|
|
198
|
-
stats: {
|
|
199
|
-
models: {
|
|
200
|
-
'model-a': { tokens: { input: 100, candidates: 50 }, api: { totalLatencyMs: 1000 } },
|
|
201
|
-
'model-b': { tokens: { input: 200, candidates: 75 }, api: { totalLatencyMs: 2000 } },
|
|
202
|
-
},
|
|
203
|
-
},
|
|
204
|
-
});
|
|
205
|
-
const result = tryParseGeminiJson(input);
|
|
206
|
-
expect(result).toEqual({
|
|
207
|
-
content: 'multi-model',
|
|
208
|
-
inputTokens: 300,
|
|
209
|
-
outputTokens: 125,
|
|
210
|
-
latencyMs: 3000,
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
it('returns latencyMs null when api stats are missing', () => {
|
|
214
|
-
const input = JSON.stringify({
|
|
215
|
-
response: 'no api stats',
|
|
216
|
-
stats: {
|
|
217
|
-
models: {
|
|
218
|
-
'gemini-flash': { tokens: { input: 10, candidates: 5 } },
|
|
219
|
-
},
|
|
220
|
-
},
|
|
221
|
-
});
|
|
222
|
-
const result = tryParseGeminiJson(input);
|
|
223
|
-
expect(result).not.toBeNull();
|
|
224
|
-
expect(result.latencyMs).toBeNull();
|
|
225
|
-
});
|
|
226
|
-
it('defaults missing token counts to zero', () => {
|
|
227
|
-
const input = JSON.stringify({
|
|
228
|
-
response: 'no tokens key',
|
|
229
|
-
stats: {
|
|
230
|
-
models: {
|
|
231
|
-
'gemini-flash': { api: { totalLatencyMs: 500 } },
|
|
232
|
-
},
|
|
233
|
-
},
|
|
234
|
-
});
|
|
235
|
-
const result = tryParseGeminiJson(input);
|
|
236
|
-
expect(result).not.toBeNull();
|
|
237
|
-
expect(result.inputTokens).toBe(0);
|
|
238
|
-
expect(result.outputTokens).toBe(0);
|
|
239
|
-
});
|
|
240
|
-
});
|
|
241
160
|
// ─── resolveConfigPath ───────────────────────────────
|
|
242
161
|
describe('resolveConfigPath', () => {
|
|
243
162
|
let tmpDir;
|
|
@@ -427,4 +346,186 @@ describe('reapOrphanedTempFiles', () => {
|
|
|
427
346
|
expect(removed).toBe(0);
|
|
428
347
|
});
|
|
429
348
|
});
|
|
349
|
+
// ─── runOrchestrator (#243 — cross-provider routing) ──
|
|
350
|
+
vi.mock('./orchestrators/orchestrator.js', async (importOriginal) => {
|
|
351
|
+
const actual = await importOriginal();
|
|
352
|
+
const mockInvoke = vi.fn().mockResolvedValue({
|
|
353
|
+
content: 'mock result',
|
|
354
|
+
inputTokens: 100,
|
|
355
|
+
outputTokens: 50,
|
|
356
|
+
durationMs: 500,
|
|
357
|
+
});
|
|
358
|
+
const mockedCreate = vi.fn().mockReturnValue(mockInvoke);
|
|
359
|
+
return {
|
|
360
|
+
...actual,
|
|
361
|
+
createOrchestrator: mockedCreate,
|
|
362
|
+
// Re-bind resolveOrchestrator to use the mocked createOrchestrator
|
|
363
|
+
// (the real impl captures a closure over the real factory)
|
|
364
|
+
resolveOrchestrator: (rawModel, baseProvider, baseInvoke) => {
|
|
365
|
+
if (rawModel.startsWith('-') || !/^[\w./:_-]+$/.test(rawModel)) {
|
|
366
|
+
throw new Error(`[Totem Error] Invalid model name '${rawModel}'. Model names may only contain word characters, dots, slashes, colons, underscores, and hyphens.`);
|
|
367
|
+
}
|
|
368
|
+
const parsed = actual.parseModelString(rawModel, baseProvider);
|
|
369
|
+
if (parsed.provider === 'shell' && baseProvider !== 'shell') {
|
|
370
|
+
throw new Error(`[Totem Error] Cannot route to 'shell' provider from a '${baseProvider}' config.\n` +
|
|
371
|
+
`The shell provider requires a 'command' template in the orchestrator config.`);
|
|
372
|
+
}
|
|
373
|
+
if (!parsed.model || parsed.model.startsWith('-')) {
|
|
374
|
+
throw new Error(`[Totem Error] Invalid model name in '${rawModel}'. The model portion must not be empty or start with a hyphen.`);
|
|
375
|
+
}
|
|
376
|
+
const invoke = parsed.provider === baseProvider
|
|
377
|
+
? baseInvoke
|
|
378
|
+
: mockedCreate({ provider: parsed.provider });
|
|
379
|
+
return { parsed, invoke, qualifiedModel: rawModel };
|
|
380
|
+
},
|
|
381
|
+
};
|
|
382
|
+
});
|
|
383
|
+
import { createOrchestrator } from './orchestrators/orchestrator.js';
|
|
384
|
+
const mockedCreateOrchestrator = vi.mocked(createOrchestrator);
|
|
385
|
+
function baseConfig(overrides) {
|
|
386
|
+
return {
|
|
387
|
+
targets: [{ glob: '**/*.ts', type: 'code', strategy: 'typescript-ast' }],
|
|
388
|
+
orchestrator: {
|
|
389
|
+
provider: 'gemini',
|
|
390
|
+
defaultModel: 'gemini-3-flash-preview',
|
|
391
|
+
},
|
|
392
|
+
totemDir: '.totem',
|
|
393
|
+
lanceDir: '.lancedb',
|
|
394
|
+
ignorePatterns: [],
|
|
395
|
+
contextWarningThreshold: 40_000,
|
|
396
|
+
...overrides,
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
describe('runOrchestrator', () => {
|
|
400
|
+
let tmpDir;
|
|
401
|
+
beforeEach(() => {
|
|
402
|
+
vi.clearAllMocks();
|
|
403
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-orch-test-'));
|
|
404
|
+
vi.spyOn(process, 'cwd').mockReturnValue(tmpDir);
|
|
405
|
+
// Re-set the mock return value after clearAllMocks
|
|
406
|
+
const mockInvoke = vi.fn().mockResolvedValue({
|
|
407
|
+
content: 'mock result',
|
|
408
|
+
inputTokens: 100,
|
|
409
|
+
outputTokens: 50,
|
|
410
|
+
durationMs: 500,
|
|
411
|
+
});
|
|
412
|
+
mockedCreateOrchestrator.mockReturnValue(mockInvoke);
|
|
413
|
+
});
|
|
414
|
+
afterEach(() => {
|
|
415
|
+
vi.restoreAllMocks();
|
|
416
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
417
|
+
});
|
|
418
|
+
it('uses default provider and model when no overrides', async () => {
|
|
419
|
+
const result = await runOrchestrator({
|
|
420
|
+
prompt: 'test prompt',
|
|
421
|
+
tag: 'Spec',
|
|
422
|
+
options: {},
|
|
423
|
+
config: baseConfig(),
|
|
424
|
+
cwd: tmpDir,
|
|
425
|
+
});
|
|
426
|
+
expect(result).toBe('mock result');
|
|
427
|
+
expect(mockedCreateOrchestrator).toHaveBeenCalledWith(expect.objectContaining({ provider: 'gemini' }));
|
|
428
|
+
});
|
|
429
|
+
it('uses per-command override from config', async () => {
|
|
430
|
+
const config = baseConfig({
|
|
431
|
+
orchestrator: {
|
|
432
|
+
provider: 'gemini',
|
|
433
|
+
defaultModel: 'gemini-3-flash-preview',
|
|
434
|
+
overrides: { spec: 'gemini-3.1-pro-preview' },
|
|
435
|
+
},
|
|
436
|
+
});
|
|
437
|
+
await runOrchestrator({
|
|
438
|
+
prompt: 'test',
|
|
439
|
+
tag: 'Spec',
|
|
440
|
+
options: {},
|
|
441
|
+
config,
|
|
442
|
+
cwd: tmpDir,
|
|
443
|
+
});
|
|
444
|
+
// The invoke should receive the override model
|
|
445
|
+
const invoke = mockedCreateOrchestrator.mock.results[0].value;
|
|
446
|
+
expect(invoke).toHaveBeenCalledWith(expect.objectContaining({ model: 'gemini-3.1-pro-preview' }));
|
|
447
|
+
});
|
|
448
|
+
it('--model flag takes priority over overrides', async () => {
|
|
449
|
+
const config = baseConfig({
|
|
450
|
+
orchestrator: {
|
|
451
|
+
provider: 'gemini',
|
|
452
|
+
defaultModel: 'gemini-3-flash-preview',
|
|
453
|
+
overrides: { spec: 'gemini-3.1-pro-preview' },
|
|
454
|
+
},
|
|
455
|
+
});
|
|
456
|
+
await runOrchestrator({
|
|
457
|
+
prompt: 'test',
|
|
458
|
+
tag: 'Spec',
|
|
459
|
+
options: { model: 'custom-model' },
|
|
460
|
+
config,
|
|
461
|
+
cwd: tmpDir,
|
|
462
|
+
});
|
|
463
|
+
const invoke = mockedCreateOrchestrator.mock.results[0].value;
|
|
464
|
+
expect(invoke).toHaveBeenCalledWith(expect.objectContaining({ model: 'custom-model' }));
|
|
465
|
+
});
|
|
466
|
+
it('creates a new orchestrator for cross-provider override', async () => {
|
|
467
|
+
const config = baseConfig({
|
|
468
|
+
orchestrator: {
|
|
469
|
+
provider: 'gemini',
|
|
470
|
+
defaultModel: 'gemini-3-flash-preview',
|
|
471
|
+
overrides: { shield: 'anthropic:claude-sonnet-4-20250514' },
|
|
472
|
+
},
|
|
473
|
+
});
|
|
474
|
+
await runOrchestrator({
|
|
475
|
+
prompt: 'test',
|
|
476
|
+
tag: 'Shield',
|
|
477
|
+
options: {},
|
|
478
|
+
config,
|
|
479
|
+
cwd: tmpDir,
|
|
480
|
+
});
|
|
481
|
+
// Should create two orchestrators: one for base config, one for cross-provider
|
|
482
|
+
expect(mockedCreateOrchestrator).toHaveBeenCalledTimes(2);
|
|
483
|
+
expect(mockedCreateOrchestrator).toHaveBeenCalledWith(expect.objectContaining({ provider: 'anthropic' }));
|
|
484
|
+
});
|
|
485
|
+
it('throws when cross-routing to shell from an API provider', async () => {
|
|
486
|
+
const config = baseConfig({
|
|
487
|
+
orchestrator: {
|
|
488
|
+
provider: 'gemini',
|
|
489
|
+
defaultModel: 'gemini-3-flash-preview',
|
|
490
|
+
overrides: { spec: 'shell:my-model' },
|
|
491
|
+
},
|
|
492
|
+
});
|
|
493
|
+
await expect(runOrchestrator({ prompt: 'test', tag: 'Spec', options: {}, config, cwd: tmpDir })).rejects.toThrow("Cannot route to 'shell' provider");
|
|
494
|
+
});
|
|
495
|
+
it('throws when model portion is empty (anthropic:)', async () => {
|
|
496
|
+
await expect(runOrchestrator({
|
|
497
|
+
prompt: 'test',
|
|
498
|
+
tag: 'Spec',
|
|
499
|
+
options: { model: 'anthropic:' },
|
|
500
|
+
config: baseConfig(),
|
|
501
|
+
cwd: tmpDir,
|
|
502
|
+
})).rejects.toThrow('must not be empty');
|
|
503
|
+
});
|
|
504
|
+
it('throws when model portion starts with hyphen', async () => {
|
|
505
|
+
await expect(runOrchestrator({
|
|
506
|
+
prompt: 'test',
|
|
507
|
+
tag: 'Spec',
|
|
508
|
+
options: { model: 'anthropic:-bad' },
|
|
509
|
+
config: baseConfig(),
|
|
510
|
+
cwd: tmpDir,
|
|
511
|
+
})).rejects.toThrow('must not be empty or start with a hyphen');
|
|
512
|
+
});
|
|
513
|
+
it('throws when no model is specified anywhere', async () => {
|
|
514
|
+
const config = baseConfig({
|
|
515
|
+
orchestrator: { provider: 'gemini' },
|
|
516
|
+
});
|
|
517
|
+
await expect(runOrchestrator({ prompt: 'test', tag: 'Spec', options: {}, config, cwd: tmpDir })).rejects.toThrow('No model specified');
|
|
518
|
+
});
|
|
519
|
+
it('returns undefined in --raw mode without invoking orchestrator', async () => {
|
|
520
|
+
const result = await runOrchestrator({
|
|
521
|
+
prompt: 'test',
|
|
522
|
+
tag: 'Spec',
|
|
523
|
+
options: { raw: true },
|
|
524
|
+
config: baseConfig(),
|
|
525
|
+
cwd: tmpDir,
|
|
526
|
+
});
|
|
527
|
+
expect(result).toBeUndefined();
|
|
528
|
+
expect(mockedCreateOrchestrator).not.toHaveBeenCalled();
|
|
529
|
+
});
|
|
530
|
+
});
|
|
430
531
|
//# sourceMappingURL=utils.test.js.map
|