@claude-flow/cli 3.11.0 → 3.12.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.
Files changed (154) hide show
  1. package/dist/src/commands/doctor.d.ts.map +1 -1
  2. package/dist/src/commands/doctor.js +175 -1
  3. package/dist/src/commands/doctor.js.map +1 -1
  4. package/dist/src/commands/eject.d.ts +33 -0
  5. package/dist/src/commands/eject.d.ts.map +1 -0
  6. package/dist/src/commands/eject.js +195 -0
  7. package/dist/src/commands/eject.js.map +1 -0
  8. package/dist/src/commands/hooks.d.ts.map +1 -1
  9. package/dist/src/commands/hooks.js +2 -1
  10. package/dist/src/commands/hooks.js.map +1 -1
  11. package/dist/src/commands/index.d.ts.map +1 -1
  12. package/dist/src/commands/index.js +4 -0
  13. package/dist/src/commands/index.js.map +1 -1
  14. package/dist/src/commands/init.d.ts.map +1 -1
  15. package/dist/src/commands/init.js +3 -0
  16. package/dist/src/commands/init.js.map +1 -1
  17. package/dist/src/commands/metaharness.d.ts +39 -0
  18. package/dist/src/commands/metaharness.d.ts.map +1 -0
  19. package/dist/src/commands/metaharness.js +194 -0
  20. package/dist/src/commands/metaharness.js.map +1 -0
  21. package/dist/src/mcp-client.d.ts.map +1 -1
  22. package/dist/src/mcp-client.js +4 -0
  23. package/dist/src/mcp-client.js.map +1 -1
  24. package/dist/src/mcp-tools/index.d.ts +1 -0
  25. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  26. package/dist/src/mcp-tools/index.js +2 -0
  27. package/dist/src/mcp-tools/index.js.map +1 -1
  28. package/dist/src/mcp-tools/metaharness-tools.d.ts +31 -0
  29. package/dist/src/mcp-tools/metaharness-tools.d.ts.map +1 -0
  30. package/dist/src/mcp-tools/metaharness-tools.js +372 -0
  31. package/dist/src/mcp-tools/metaharness-tools.js.map +1 -0
  32. package/dist/src/plugins/store/discovery.d.ts.map +1 -1
  33. package/dist/src/plugins/store/discovery.js +3 -0
  34. package/dist/src/plugins/store/discovery.js.map +1 -1
  35. package/dist/src/plugins/store/types.d.ts +6 -1
  36. package/dist/src/plugins/store/types.d.ts.map +1 -1
  37. package/dist/src/ruvector/model-router.d.ts.map +1 -1
  38. package/dist/src/ruvector/model-router.js +37 -0
  39. package/dist/src/ruvector/model-router.js.map +1 -1
  40. package/dist/src/ruvector/router-parallel-recorder.d.ts +127 -0
  41. package/dist/src/ruvector/router-parallel-recorder.d.ts.map +1 -0
  42. package/dist/src/ruvector/router-parallel-recorder.js +183 -0
  43. package/dist/src/ruvector/router-parallel-recorder.js.map +1 -0
  44. package/dist/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +11 -9
  46. package/dist/src/benchmarks/capability-tasks.d.ts +0 -126
  47. package/dist/src/benchmarks/capability-tasks.d.ts.map +0 -1
  48. package/dist/src/benchmarks/capability-tasks.js +0 -147
  49. package/dist/src/benchmarks/capability-tasks.js.map +0 -1
  50. package/dist/src/benchmarks/gaia-agent-contrastive.d.ts +0 -53
  51. package/dist/src/benchmarks/gaia-agent-contrastive.d.ts.map +0 -1
  52. package/dist/src/benchmarks/gaia-agent-contrastive.js +0 -177
  53. package/dist/src/benchmarks/gaia-agent-contrastive.js.map +0 -1
  54. package/dist/src/benchmarks/gaia-agent-gemini.d.ts +0 -51
  55. package/dist/src/benchmarks/gaia-agent-gemini.d.ts.map +0 -1
  56. package/dist/src/benchmarks/gaia-agent-gemini.js +0 -352
  57. package/dist/src/benchmarks/gaia-agent-gemini.js.map +0 -1
  58. package/dist/src/benchmarks/gaia-claude-p.d.ts +0 -105
  59. package/dist/src/benchmarks/gaia-claude-p.d.ts.map +0 -1
  60. package/dist/src/benchmarks/gaia-claude-p.js +0 -269
  61. package/dist/src/benchmarks/gaia-claude-p.js.map +0 -1
  62. package/dist/src/benchmarks/gaia-claude-p.smoke.d.ts +0 -20
  63. package/dist/src/benchmarks/gaia-claude-p.smoke.d.ts.map +0 -1
  64. package/dist/src/benchmarks/gaia-claude-p.smoke.js +0 -168
  65. package/dist/src/benchmarks/gaia-claude-p.smoke.js.map +0 -1
  66. package/dist/src/benchmarks/gaia-codeagent-runner.py +0 -556
  67. package/dist/src/benchmarks/gaia-codeagent.d.ts +0 -129
  68. package/dist/src/benchmarks/gaia-codeagent.d.ts.map +0 -1
  69. package/dist/src/benchmarks/gaia-codeagent.js +0 -590
  70. package/dist/src/benchmarks/gaia-codeagent.js.map +0 -1
  71. package/dist/src/benchmarks/gaia-codeagent.smoke.d.ts +0 -33
  72. package/dist/src/benchmarks/gaia-codeagent.smoke.d.ts.map +0 -1
  73. package/dist/src/benchmarks/gaia-codeagent.smoke.js +0 -241
  74. package/dist/src/benchmarks/gaia-codeagent.smoke.js.map +0 -1
  75. package/dist/src/benchmarks/gaia-dag-pilot.d.ts +0 -22
  76. package/dist/src/benchmarks/gaia-dag-pilot.d.ts.map +0 -1
  77. package/dist/src/benchmarks/gaia-dag-pilot.js +0 -158
  78. package/dist/src/benchmarks/gaia-dag-pilot.js.map +0 -1
  79. package/dist/src/benchmarks/gaia-dag.d.ts +0 -110
  80. package/dist/src/benchmarks/gaia-dag.d.ts.map +0 -1
  81. package/dist/src/benchmarks/gaia-dag.js +0 -658
  82. package/dist/src/benchmarks/gaia-dag.js.map +0 -1
  83. package/dist/src/benchmarks/gaia-dag.smoke.d.ts +0 -21
  84. package/dist/src/benchmarks/gaia-dag.smoke.d.ts.map +0 -1
  85. package/dist/src/benchmarks/gaia-dag.smoke.js +0 -290
  86. package/dist/src/benchmarks/gaia-dag.smoke.js.map +0 -1
  87. package/dist/src/benchmarks/gaia-ensemble-pilot.d.ts +0 -17
  88. package/dist/src/benchmarks/gaia-ensemble-pilot.d.ts.map +0 -1
  89. package/dist/src/benchmarks/gaia-ensemble-pilot.js +0 -106
  90. package/dist/src/benchmarks/gaia-ensemble-pilot.js.map +0 -1
  91. package/dist/src/benchmarks/gaia-ensemble.d.ts +0 -103
  92. package/dist/src/benchmarks/gaia-ensemble.d.ts.map +0 -1
  93. package/dist/src/benchmarks/gaia-ensemble.js +0 -462
  94. package/dist/src/benchmarks/gaia-ensemble.js.map +0 -1
  95. package/dist/src/benchmarks/gaia-gemini-pilot.d.ts +0 -17
  96. package/dist/src/benchmarks/gaia-gemini-pilot.d.ts.map +0 -1
  97. package/dist/src/benchmarks/gaia-gemini-pilot.js +0 -168
  98. package/dist/src/benchmarks/gaia-gemini-pilot.js.map +0 -1
  99. package/dist/src/benchmarks/gaia-mode-router.d.ts +0 -67
  100. package/dist/src/benchmarks/gaia-mode-router.d.ts.map +0 -1
  101. package/dist/src/benchmarks/gaia-mode-router.js +0 -126
  102. package/dist/src/benchmarks/gaia-mode-router.js.map +0 -1
  103. package/dist/src/benchmarks/gaia-mode-router.smoke.d.ts +0 -15
  104. package/dist/src/benchmarks/gaia-mode-router.smoke.d.ts.map +0 -1
  105. package/dist/src/benchmarks/gaia-mode-router.smoke.js +0 -131
  106. package/dist/src/benchmarks/gaia-mode-router.smoke.js.map +0 -1
  107. package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.d.ts +0 -24
  108. package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.d.ts.map +0 -1
  109. package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.js +0 -276
  110. package/dist/src/benchmarks/gaia-tools/grounded_query.smoke.js.map +0 -1
  111. package/dist/src/benchmarks/gaia-tools/image_describe.d.ts +0 -45
  112. package/dist/src/benchmarks/gaia-tools/image_describe.d.ts.map +0 -1
  113. package/dist/src/benchmarks/gaia-tools/image_describe.js +0 -222
  114. package/dist/src/benchmarks/gaia-tools/image_describe.js.map +0 -1
  115. package/dist/src/benchmarks/gaia-tools/image_describe.smoke.d.ts +0 -24
  116. package/dist/src/benchmarks/gaia-tools/image_describe.smoke.d.ts.map +0 -1
  117. package/dist/src/benchmarks/gaia-tools/image_describe.smoke.js +0 -169
  118. package/dist/src/benchmarks/gaia-tools/image_describe.smoke.js.map +0 -1
  119. package/dist/src/benchmarks/gaia-tools/pdf_read.d.ts +0 -27
  120. package/dist/src/benchmarks/gaia-tools/pdf_read.d.ts.map +0 -1
  121. package/dist/src/benchmarks/gaia-tools/pdf_read.js +0 -226
  122. package/dist/src/benchmarks/gaia-tools/pdf_read.js.map +0 -1
  123. package/dist/src/benchmarks/gaia-tools/python_exec.d.ts +0 -31
  124. package/dist/src/benchmarks/gaia-tools/python_exec.d.ts.map +0 -1
  125. package/dist/src/benchmarks/gaia-tools/python_exec.js +0 -94
  126. package/dist/src/benchmarks/gaia-tools/python_exec.js.map +0 -1
  127. package/dist/src/benchmarks/gaia-tools/python_exec.smoke.d.ts +0 -13
  128. package/dist/src/benchmarks/gaia-tools/python_exec.smoke.d.ts.map +0 -1
  129. package/dist/src/benchmarks/gaia-tools/python_exec.smoke.js +0 -98
  130. package/dist/src/benchmarks/gaia-tools/python_exec.smoke.js.map +0 -1
  131. package/dist/src/benchmarks/gaia-tools/visit_webpage.d.ts +0 -52
  132. package/dist/src/benchmarks/gaia-tools/visit_webpage.d.ts.map +0 -1
  133. package/dist/src/benchmarks/gaia-tools/visit_webpage.js +0 -304
  134. package/dist/src/benchmarks/gaia-tools/visit_webpage.js.map +0 -1
  135. package/dist/src/benchmarks/gaia-tools/web_browse.d.ts +0 -61
  136. package/dist/src/benchmarks/gaia-tools/web_browse.d.ts.map +0 -1
  137. package/dist/src/benchmarks/gaia-tools/web_browse.js +0 -217
  138. package/dist/src/benchmarks/gaia-tools/web_browse.js.map +0 -1
  139. package/dist/src/benchmarks/gaia-tools/web_browse.smoke.d.ts +0 -26
  140. package/dist/src/benchmarks/gaia-tools/web_browse.smoke.d.ts.map +0 -1
  141. package/dist/src/benchmarks/gaia-tools/web_browse.smoke.js +0 -152
  142. package/dist/src/benchmarks/gaia-tools/web_browse.smoke.js.map +0 -1
  143. package/dist/src/benchmarks/gaia-tools/web_search.smoke.d.ts +0 -24
  144. package/dist/src/benchmarks/gaia-tools/web_search.smoke.d.ts.map +0 -1
  145. package/dist/src/benchmarks/gaia-tools/web_search.smoke.js +0 -311
  146. package/dist/src/benchmarks/gaia-tools/web_search.smoke.js.map +0 -1
  147. package/dist/src/benchmarks/gaia-visit-webpage.smoke.d.ts +0 -25
  148. package/dist/src/benchmarks/gaia-visit-webpage.smoke.d.ts.map +0 -1
  149. package/dist/src/benchmarks/gaia-visit-webpage.smoke.js +0 -304
  150. package/dist/src/benchmarks/gaia-visit-webpage.smoke.js.map +0 -1
  151. package/dist/src/commands/performance-capability.d.ts +0 -30
  152. package/dist/src/commands/performance-capability.d.ts.map +0 -1
  153. package/dist/src/commands/performance-capability.js +0 -349
  154. package/dist/src/commands/performance-capability.js.map +0 -1
@@ -1,349 +0,0 @@
1
- /**
2
- * V3 CLI Performance Capability Benchmark
3
- *
4
- * Runs a small verifiable-answer corpus through the Anthropic API and reports
5
- * pass-rate, latency, and cost. Closes the capability-evaluation gap that
6
- * `performance benchmark --suite agent` does NOT cover — that suite measures
7
- * the agent control plane (router, memory, hooks) without LLM calls; this
8
- * subcommand measures the actual model's ability to solve agent-style tasks.
9
- *
10
- * Features:
11
- * - Parallel execution with configurable concurrency
12
- * - Multi-model comparison in a single run (`--models a,b,c`)
13
- * - Per-task max-tokens overrides (declared in the fixture)
14
- * - Configurable corpus via `--questions <path>`
15
- *
16
- * Inspired by GAIA / SWE-bench / GSM8K but text-only and scoreable via
17
- * substring / exact match — no web browsing, no file attachments, no
18
- * Hugging Face dataset download.
19
- *
20
- * API key resolution (in order):
21
- * 1. $ANTHROPIC_API_KEY env var
22
- * 2. `gcloud secrets versions access latest --secret=ANTHROPIC_API_KEY`
23
- * 3. Fail with a clear error
24
- *
25
- * Refs: #2156 (Dream Cycle 2026-05-27 capabilities scan)
26
- */
27
- import { execSync } from 'node:child_process';
28
- import * as fs from 'node:fs';
29
- import * as path from 'node:path';
30
- import { output } from '../output.js';
31
- import { BUILTIN_CAPABILITY_TASKS } from '../benchmarks/capability-tasks.js';
32
- // Anthropic pricing (per 1M tokens, USD)
33
- const PRICING = {
34
- 'claude-haiku-4-5': { in: 1.0, out: 5.0 },
35
- 'claude-haiku-4-5-20251001': { in: 1.0, out: 5.0 },
36
- 'claude-sonnet-4-6': { in: 3.0, out: 15.0 },
37
- 'claude-opus-4-7': { in: 15.0, out: 75.0 },
38
- };
39
- const DEFAULT_MAX_TOKENS = 256;
40
- function resolveApiKey() {
41
- const envKey = process.env.ANTHROPIC_API_KEY;
42
- if (envKey && envKey.trim())
43
- return envKey.trim();
44
- try {
45
- const out = execSync('gcloud secrets versions access latest --secret=ANTHROPIC_API_KEY 2>/dev/null', { encoding: 'utf-8', timeout: 10_000 }).trim();
46
- if (out)
47
- return out;
48
- }
49
- catch {
50
- /* fall through */
51
- }
52
- throw new Error('ANTHROPIC_API_KEY not found. Set the env var or store it as a gcloud secret named ANTHROPIC_API_KEY (e.g. `echo -n "$KEY" | gcloud secrets versions add ANTHROPIC_API_KEY --data-file=-`).');
53
- }
54
- function loadTaskFile(custom) {
55
- if (custom) {
56
- const resolved = path.resolve(custom);
57
- if (!fs.existsSync(resolved))
58
- throw new Error(`questions file not found: ${resolved}`);
59
- return JSON.parse(fs.readFileSync(resolved, 'utf-8'));
60
- }
61
- return BUILTIN_CAPABILITY_TASKS;
62
- }
63
- function buildPrompt(task) {
64
- return `You are answering an agent-capability benchmark question. Show only the key reasoning steps (one or two lines), then wrap your final answer in <answer>...</answer> tags. Be exact — the harness compares the tag contents to a ground-truth string.
65
-
66
- Question: ${task.prompt}`;
67
- }
68
- function extractAnswer(text) {
69
- const m = text.match(/<answer>([\s\S]*?)<\/answer>/i);
70
- if (m && m[1] !== undefined)
71
- return m[1].trim();
72
- // Fallback: take last non-empty line. Strip leading markdown bullets/quotes/heading marks
73
- // and trailing sentence-ending punctuation. Models sometimes give the bare answer on the
74
- // final line without the <answer> tags, often prefixed with "- " or "* " from a list.
75
- const lines = text.split(/\r?\n/).map((l) => l.trim()).filter(Boolean);
76
- const last = lines[lines.length - 1] || '';
77
- return last
78
- .replace(/^[-*>#\s]+/, '') // leading bullet / quote / heading
79
- .replace(/^\*\*|\*\*$/g, '') // bold markers
80
- .replace(/[.,!?]+$/, '') // trailing punctuation
81
- .trim();
82
- }
83
- function check(answer, task) {
84
- const a = answer.trim().toLowerCase();
85
- const e = task.expected.trim().toLowerCase();
86
- switch (task.matchMode) {
87
- case 'exact':
88
- return a === e;
89
- case 'substring':
90
- return a.includes(e);
91
- case 'regex':
92
- try {
93
- return new RegExp(task.expected, 'i').test(answer);
94
- }
95
- catch {
96
- return false;
97
- }
98
- default:
99
- return false;
100
- }
101
- }
102
- async function callAnthropic(apiKey, model, prompt, maxTokens, timeoutMs) {
103
- const ac = new AbortController();
104
- const timer = setTimeout(() => ac.abort(), timeoutMs);
105
- try {
106
- const resp = await fetch('https://api.anthropic.com/v1/messages', {
107
- method: 'POST',
108
- headers: {
109
- 'x-api-key': apiKey,
110
- 'anthropic-version': '2023-06-01',
111
- 'Content-Type': 'application/json',
112
- },
113
- signal: ac.signal,
114
- body: JSON.stringify({
115
- model,
116
- max_tokens: maxTokens,
117
- messages: [{ role: 'user', content: prompt }],
118
- }),
119
- });
120
- if (!resp.ok) {
121
- const body = await resp.text().catch(() => '');
122
- throw new Error(`HTTP ${resp.status}: ${body.slice(0, 200)}`);
123
- }
124
- const body = (await resp.json());
125
- const text = body.content?.[0]?.text ?? '';
126
- return {
127
- text,
128
- inputTokens: body.usage?.input_tokens ?? 0,
129
- outputTokens: body.usage?.output_tokens ?? 0,
130
- };
131
- }
132
- finally {
133
- clearTimeout(timer);
134
- }
135
- }
136
- /**
137
- * Concurrency-limited parallel mapper. Avoids a p-limit dep; rate-limits via
138
- * a sliding window of in-flight promises. Anthropic Haiku tier-1 has 50 RPM
139
- * + 50K TPM headroom — concurrency 4 keeps us well under both.
140
- */
141
- async function parallelMap(items, concurrency, fn) {
142
- const results = new Array(items.length);
143
- let cursor = 0;
144
- async function worker() {
145
- while (true) {
146
- const i = cursor++;
147
- if (i >= items.length)
148
- return;
149
- results[i] = await fn(items[i], i);
150
- }
151
- }
152
- const workers = Array.from({ length: Math.min(concurrency, items.length) }, () => worker());
153
- await Promise.all(workers);
154
- return results;
155
- }
156
- async function runOne(task, model, apiKey, defaultMaxTokens, timeoutMs) {
157
- const maxTokens = task.maxTokens ?? defaultMaxTokens;
158
- const start = performance.now();
159
- try {
160
- const { text, inputTokens, outputTokens } = await callAnthropic(apiKey, model, buildPrompt(task), maxTokens, timeoutMs);
161
- const answer = extractAnswer(text);
162
- return {
163
- id: task.id,
164
- category: task.category,
165
- model,
166
- correct: check(answer, task),
167
- answer,
168
- expected: task.expected,
169
- latencyMs: performance.now() - start,
170
- inputTokens,
171
- outputTokens,
172
- };
173
- }
174
- catch (err) {
175
- return {
176
- id: task.id,
177
- category: task.category,
178
- model,
179
- correct: false,
180
- answer: '',
181
- expected: task.expected,
182
- latencyMs: performance.now() - start,
183
- inputTokens: 0,
184
- outputTokens: 0,
185
- error: err.message.slice(0, 120),
186
- };
187
- }
188
- }
189
- function summarizeModel(results) {
190
- const model = results[0]?.model ?? '';
191
- const passed = results.filter((r) => r.correct).length;
192
- const meanLatencyMs = results.reduce((a, b) => a + b.latencyMs, 0) / results.length;
193
- const totalInputTokens = results.reduce((a, b) => a + b.inputTokens, 0);
194
- const totalOutputTokens = results.reduce((a, b) => a + b.outputTokens, 0);
195
- const price = PRICING[model] ?? { in: 3.0, out: 15.0 };
196
- const estCostUsd = (totalInputTokens / 1_000_000) * price.in + (totalOutputTokens / 1_000_000) * price.out;
197
- return {
198
- model,
199
- passed,
200
- total: results.length,
201
- passRate: passed / results.length,
202
- meanLatencyMs,
203
- totalInputTokens,
204
- totalOutputTokens,
205
- estCostUsd,
206
- };
207
- }
208
- const capabilityCommand = {
209
- name: 'capability',
210
- description: 'Run a real LLM-driven agent-capability benchmark against the Anthropic API',
211
- options: [
212
- { name: 'model', short: 'm', type: 'string', description: 'Single model id (default: claude-haiku-4-5). Overridden by --models.', default: 'claude-haiku-4-5' },
213
- { name: 'models', short: 'M', type: 'string', description: 'Comma-separated list of models for cross-model comparison (e.g. claude-haiku-4-5,claude-sonnet-4-6)' },
214
- { name: 'questions', short: 'q', type: 'string', description: 'Path to a custom tasks JSON file (default: built-in fixture)' },
215
- { name: 'concurrency', short: 'c', type: 'number', description: 'Parallel in-flight requests', default: '4' },
216
- { name: 'max-tokens', type: 'number', description: 'Default max_tokens cap (per-task overrides in fixture take precedence)', default: String(DEFAULT_MAX_TOKENS) },
217
- { name: 'timeout', short: 't', type: 'number', description: 'Per-question timeout (ms)', default: '30000' },
218
- { name: 'limit', short: 'l', type: 'number', description: 'Run only the first N questions' },
219
- { name: 'output', short: 'o', type: 'string', description: 'Output format: text, json', default: 'text' },
220
- ],
221
- examples: [
222
- { command: 'claude-flow performance capability', description: 'Run the built-in fixture against Haiku (parallel, default)' },
223
- { command: 'claude-flow performance capability -M claude-haiku-4-5,claude-sonnet-4-6', description: 'Compare Haiku vs Sonnet on every question' },
224
- { command: 'claude-flow performance capability -c 8 -o json', description: 'Higher concurrency, emit JSON' },
225
- { command: 'claude-flow performance capability -q ./my-eval.json -l 3', description: 'Custom dataset, first 3 only' },
226
- ],
227
- action: async (ctx) => {
228
- const modelsFlag = ctx.flags.models;
229
- const singleModel = ctx.flags.model || 'claude-haiku-4-5';
230
- const models = modelsFlag
231
- ? modelsFlag.split(',').map((m) => m.trim()).filter(Boolean)
232
- : [singleModel];
233
- const customPath = ctx.flags.questions;
234
- const outputFormat = ctx.flags.output || 'text';
235
- const timeoutMs = parseInt(String(ctx.flags.timeout ?? '30000'), 10);
236
- const limit = ctx.flags.limit ? parseInt(String(ctx.flags.limit), 10) : undefined;
237
- const concurrency = Math.max(1, parseInt(String(ctx.flags.concurrency ?? '4'), 10));
238
- const defaultMaxTokens = Math.max(32, parseInt(String(ctx.flags['max-tokens'] ?? DEFAULT_MAX_TOKENS), 10));
239
- output.writeln();
240
- output.writeln(output.bold('Agent Capability Benchmark (Anthropic API)'));
241
- output.writeln(output.dim('─'.repeat(60)));
242
- let apiKey;
243
- try {
244
- apiKey = resolveApiKey();
245
- }
246
- catch (err) {
247
- output.writeln(output.error(err.message));
248
- return { success: false, message: err.message, exitCode: 1 };
249
- }
250
- let file;
251
- try {
252
- file = loadTaskFile(customPath);
253
- }
254
- catch (err) {
255
- output.writeln(output.error(err.message));
256
- return { success: false, message: err.message, exitCode: 1 };
257
- }
258
- const tasks = limit ? file.tasks.slice(0, limit) : file.tasks;
259
- output.writeln(`Models: ${models.join(', ')}`);
260
- output.writeln(`Questions: ${tasks.length}${customPath ? ` (custom: ${customPath})` : ' (built-in fixture)'}`);
261
- output.writeln(`Concurrency: ${concurrency}`);
262
- output.writeln(`Default cap: ${defaultMaxTokens} tokens (per-task override allowed)`);
263
- output.writeln();
264
- const startWall = performance.now();
265
- const spinner = output.createSpinner({ text: `Running ${models.length * tasks.length} requests...`, spinner: 'dots' });
266
- spinner.start();
267
- // Build flat list of (task, model) pairs, then parallel-execute with concurrency limiter.
268
- const work = [];
269
- for (const model of models) {
270
- for (const task of tasks)
271
- work.push({ task, model });
272
- }
273
- const results = await parallelMap(work, concurrency, async ({ task, model }) => {
274
- return runOne(task, model, apiKey, defaultMaxTokens, timeoutMs);
275
- });
276
- const wallMs = performance.now() - startWall;
277
- spinner.succeed(`Completed ${results.length} requests in ${(wallMs / 1000).toFixed(2)}s`);
278
- // Group by model for per-model summary
279
- const byModel = new Map();
280
- for (const r of results) {
281
- const arr = byModel.get(r.model) ?? [];
282
- arr.push(r);
283
- byModel.set(r.model, arr);
284
- }
285
- const summaries = [...byModel.entries()].map(([, arr]) => summarizeModel(arr));
286
- if (outputFormat === 'json') {
287
- output.printJson({
288
- models,
289
- questions: tasks.length,
290
- concurrency,
291
- wallMs,
292
- summaries,
293
- results,
294
- });
295
- const overallPass = summaries.every((s) => s.passRate >= 0.5);
296
- return { success: overallPass, data: { summaries, results } };
297
- }
298
- // Per-model detail tables
299
- for (const [model, arr] of byModel) {
300
- output.writeln();
301
- output.writeln(output.bold(`${model}`));
302
- output.printTable({
303
- columns: [
304
- { key: 'id', header: 'Question', width: 22 },
305
- { key: 'category', header: 'Category', width: 24 },
306
- { key: 'correct', header: 'Pass', width: 6 },
307
- { key: 'latency', header: 'Latency', width: 10 },
308
- { key: 'answer', header: 'Answer (got vs expected)', width: 36 },
309
- ],
310
- data: arr.map((r) => ({
311
- id: r.id,
312
- category: r.category,
313
- correct: r.correct ? output.success('✓') : output.error('✗'),
314
- latency: `${r.latencyMs.toFixed(0)}ms`,
315
- answer: r.error
316
- ? output.dim(`error: ${r.error}`)
317
- : r.correct
318
- ? r.answer.slice(0, 34)
319
- : `${r.answer.slice(0, 14)} ≠ ${r.expected.slice(0, 14)}`,
320
- })),
321
- });
322
- }
323
- // Cross-model summary table
324
- output.writeln();
325
- output.writeln(output.bold('Summary'));
326
- output.printTable({
327
- columns: [
328
- { key: 'model', header: 'Model', width: 26 },
329
- { key: 'pass', header: 'Pass', width: 14 },
330
- { key: 'mean', header: 'Mean Lat', width: 12 },
331
- { key: 'tokens', header: 'Tokens (in/out)', width: 18 },
332
- { key: 'cost', header: 'Est. Cost', width: 12 },
333
- ],
334
- data: summaries.map((s) => ({
335
- model: s.model,
336
- pass: `${(s.passRate * 100).toFixed(1)}% (${s.passed}/${s.total})`,
337
- mean: `${s.meanLatencyMs.toFixed(0)}ms`,
338
- tokens: `${s.totalInputTokens} / ${s.totalOutputTokens}`,
339
- cost: `$${s.estCostUsd.toFixed(4)}`,
340
- })),
341
- });
342
- output.writeln();
343
- output.writeln(output.dim(`Wall time: ${(wallMs / 1000).toFixed(2)}s (concurrency=${concurrency})`));
344
- const overallPass = summaries.every((s) => s.passRate >= 0.5);
345
- return { success: overallPass, data: { summaries, wallMs, results } };
346
- },
347
- };
348
- export default capabilityCommand;
349
- //# sourceMappingURL=performance-capability.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"performance-capability.js","sourceRoot":"","sources":["../../../src/commands/performance-capability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAgC7E,yCAAyC;AACzC,MAAM,OAAO,GAAgD;IAC3D,kBAAkB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;IACzC,2BAA2B,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;IAClD,mBAAmB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE;IAC3C,iBAAiB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;CAC3C,CAAC;AAEF,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,SAAS,aAAa;IACpB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC7C,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAClB,8EAA8E,EAC9E,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CACvC,CAAC,IAAI,EAAE,CAAC;QACT,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,4LAA4L,CAC7L,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,MAAe;IACnC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QACvF,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAa,CAAC;IACpE,CAAC;IACD,OAAO,wBAA+C,CAAC;AACzD,CAAC;AAED,SAAS,WAAW,CAAC,IAAU;IAC7B,OAAO;;YAEG,IAAI,CAAC,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,0FAA0F;IAC1F,yFAAyF;IACzF,sFAAsF;IACtF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,OAAO,IAAI;SACR,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAM,mCAAmC;SAClE,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAI,eAAe;SAC9C,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAQ,uBAAuB;SACtD,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,KAAK,CAAC,MAAc,EAAE,IAAU;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,KAAK,OAAO;YACV,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,KAAK,WAAW;YACd,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACvB,KAAK,OAAO;YACV,IAAI,CAAC;gBACH,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,MAAc,EACd,KAAa,EACb,MAAc,EACd,SAAiB,EACjB,SAAiB;IAEjB,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,uCAAuC,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,WAAW,EAAE,MAAM;gBACnB,mBAAmB,EAAE,YAAY;gBACjC,cAAc,EAAE,kBAAkB;aACnC;YACD,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,UAAU,EAAE,SAAS;gBACrB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;aAC9C,CAAC;SACH,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAG9B,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAC3C,OAAO;YACL,IAAI;YACJ,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC;YAC1C,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC;SAC7C,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,WAAW,CACxB,KAAU,EACV,WAAmB,EACnB,EAAwC;IAExC,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,UAAU,MAAM;QACnB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO;YAC9B,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5F,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,IAAU,EACV,KAAa,EACb,MAAc,EACd,gBAAwB,EACxB,SAAiB;IAEjB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC;IACrD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,MAAM,aAAa,CAC7D,MAAM,EACN,KAAK,EACL,WAAW,CAAC,IAAI,CAAC,EACjB,SAAS,EACT,SAAS,CACV,CAAC;QACF,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK;YACL,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC;YAC5B,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK;YACpC,WAAW;YACX,YAAY;SACb,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK;YACpC,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,KAAK,EAAG,GAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SAC5C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAAoB;IAU1C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACvD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACpF,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACvD,MAAM,UAAU,GAAG,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,iBAAiB,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;IAC3G,OAAO;QACL,KAAK;QACL,MAAM;QACN,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM;QACjC,aAAa;QACb,gBAAgB;QAChB,iBAAiB;QACjB,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,iBAAiB,GAAY;IACjC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,4EAA4E;IACzF,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sEAAsE,EAAE,OAAO,EAAE,kBAAkB,EAAE;QAC/J,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qGAAqG,EAAE;QAClK,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;QAC9H,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE,OAAO,EAAE,GAAG,EAAE;QAC7G,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wEAAwE,EAAE,OAAO,EAAE,MAAM,CAAC,kBAAkB,CAAC,EAAE;QAClK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE,OAAO,EAAE,OAAO,EAAE;QAC3G,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;QAC5F,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE,OAAO,EAAE,MAAM,EAAE;KAC1G;IACD,QAAQ,EAAE;QACR,EAAE,OAAO,EAAE,oCAAoC,EAAE,WAAW,EAAE,4DAA4D,EAAE;QAC5H,EAAE,OAAO,EAAE,0EAA0E,EAAE,WAAW,EAAE,2CAA2C,EAAE;QACjJ,EAAE,OAAO,EAAE,iDAAiD,EAAE,WAAW,EAAE,+BAA+B,EAAE;QAC5G,EAAE,OAAO,EAAE,2DAA2D,EAAE,WAAW,EAAE,8BAA8B,EAAE;KACtH;IACD,MAAM,EAAE,KAAK,EAAE,GAAmB,EAA0B,EAAE;QAC5D,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,MAA4B,CAAC;QAC1D,MAAM,WAAW,GAAI,GAAG,CAAC,KAAK,CAAC,KAAgB,IAAI,kBAAkB,CAAC;QACtE,MAAM,MAAM,GAAG,UAAU;YACvB,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAC5D,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAClB,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,SAA+B,CAAC;QAC7D,MAAM,YAAY,GAAI,GAAG,CAAC,KAAK,CAAC,MAAiB,IAAI,MAAM,CAAC;QAC5D,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACpF,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAE3G,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3C,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,aAAa,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC1E,CAAC;QAED,IAAI,IAAc,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC1E,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,kBAAkB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,kBAAkB,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,UAAU,GAAG,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACnH,MAAM,CAAC,OAAO,CAAC,kBAAkB,WAAW,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,kBAAkB,gBAAgB,qCAAqC,CAAC,CAAC;QACxF,MAAM,CAAC,OAAO,EAAE,CAAC;QAEjB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,WAAW,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACvH,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,0FAA0F;QAC1F,MAAM,IAAI,GAAyC,EAAE,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YAC7E,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC7C,OAAO,CAAC,OAAO,CAAC,aAAa,OAAO,CAAC,MAAM,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAE1F,uCAAuC;QACvC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACvC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QAE/E,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,SAAS,CAAC;gBACf,MAAM;gBACN,SAAS,EAAE,KAAK,CAAC,MAAM;gBACvB,WAAW;gBACX,MAAM;gBACN,SAAS;gBACT,OAAO;aACR,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;YAC9D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC;QAChE,CAAC;QAED,0BAA0B;QAC1B,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,UAAU,CAAC;gBAChB,OAAO,EAAE;oBACP,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;oBAC5C,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;oBAClD,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE;oBAC5C,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;oBAChD,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,0BAA0B,EAAE,KAAK,EAAE,EAAE,EAAE;iBACjE;gBACD,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACpB,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;oBAC5D,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;oBACtC,MAAM,EAAE,CAAC,CAAC,KAAK;wBACb,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;wBACjC,CAAC,CAAC,CAAC,CAAC,OAAO;4BACT,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;4BACvB,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;iBAC9D,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;QAED,4BAA4B;QAC5B,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,UAAU,CAAC;YAChB,OAAO,EAAE;gBACP,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC5C,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC1C,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC9C,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,EAAE;gBACvD,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE;aAChD;YACD,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,GAAG;gBAClE,IAAI,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;gBACvC,MAAM,EAAE,GAAG,CAAC,CAAC,gBAAgB,MAAM,CAAC,CAAC,iBAAiB,EAAE;gBACxD,IAAI,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;aACpC,CAAC,CAAC;SACJ,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,WAAW,GAAG,CAAC,CAAC,CAAC;QAErG,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;QAC9D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;IACxE,CAAC;CACF,CAAC;AAEF,eAAe,iBAAiB,CAAC"}