@open-multi-agent/core 1.4.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 +373 -0
- package/dist/agent/agent.d.ts +153 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +559 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/loop-detector.d.ts +39 -0
- package/dist/agent/loop-detector.d.ts.map +1 -0
- package/dist/agent/loop-detector.js +122 -0
- package/dist/agent/loop-detector.js.map +1 -0
- package/dist/agent/pool.d.ts +158 -0
- package/dist/agent/pool.d.ts.map +1 -0
- package/dist/agent/pool.js +320 -0
- package/dist/agent/pool.js.map +1 -0
- package/dist/agent/runner.d.ts +242 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +943 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/structured-output.d.ts +33 -0
- package/dist/agent/structured-output.d.ts.map +1 -0
- package/dist/agent/structured-output.js +116 -0
- package/dist/agent/structured-output.js.map +1 -0
- package/dist/cli/oma.d.ts +30 -0
- package/dist/cli/oma.d.ts.map +1 -0
- package/dist/cli/oma.js +433 -0
- package/dist/cli/oma.js.map +1 -0
- package/dist/dashboard/layout-tasks.d.ts +23 -0
- package/dist/dashboard/layout-tasks.d.ts.map +1 -0
- package/dist/dashboard/layout-tasks.js +79 -0
- package/dist/dashboard/layout-tasks.js.map +1 -0
- package/dist/dashboard/render-team-run-dashboard.d.ts +11 -0
- package/dist/dashboard/render-team-run-dashboard.d.ts.map +1 -0
- package/dist/dashboard/render-team-run-dashboard.js +456 -0
- package/dist/dashboard/render-team-run-dashboard.js.map +1 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +20 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/adapter.d.ts +54 -0
- package/dist/llm/adapter.d.ts.map +1 -0
- package/dist/llm/adapter.js +101 -0
- package/dist/llm/adapter.js.map +1 -0
- package/dist/llm/anthropic.d.ts +57 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +432 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/azure-openai.d.ts +74 -0
- package/dist/llm/azure-openai.d.ts.map +1 -0
- package/dist/llm/azure-openai.js +267 -0
- package/dist/llm/azure-openai.js.map +1 -0
- package/dist/llm/bedrock.d.ts +41 -0
- package/dist/llm/bedrock.d.ts.map +1 -0
- package/dist/llm/bedrock.js +345 -0
- package/dist/llm/bedrock.js.map +1 -0
- package/dist/llm/copilot.d.ts +92 -0
- package/dist/llm/copilot.d.ts.map +1 -0
- package/dist/llm/copilot.js +433 -0
- package/dist/llm/copilot.js.map +1 -0
- package/dist/llm/deepseek.d.ts +21 -0
- package/dist/llm/deepseek.d.ts.map +1 -0
- package/dist/llm/deepseek.js +24 -0
- package/dist/llm/deepseek.js.map +1 -0
- package/dist/llm/gemini.d.ts +65 -0
- package/dist/llm/gemini.d.ts.map +1 -0
- package/dist/llm/gemini.js +427 -0
- package/dist/llm/gemini.js.map +1 -0
- package/dist/llm/grok.d.ts +21 -0
- package/dist/llm/grok.d.ts.map +1 -0
- package/dist/llm/grok.js +24 -0
- package/dist/llm/grok.js.map +1 -0
- package/dist/llm/minimax.d.ts +21 -0
- package/dist/llm/minimax.d.ts.map +1 -0
- package/dist/llm/minimax.js +24 -0
- package/dist/llm/minimax.js.map +1 -0
- package/dist/llm/openai-common.d.ts +65 -0
- package/dist/llm/openai-common.d.ts.map +1 -0
- package/dist/llm/openai-common.js +286 -0
- package/dist/llm/openai-common.js.map +1 -0
- package/dist/llm/openai.d.ts +63 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +256 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/qiniu.d.ts +21 -0
- package/dist/llm/qiniu.d.ts.map +1 -0
- package/dist/llm/qiniu.js +24 -0
- package/dist/llm/qiniu.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +2 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory/shared.d.ts +162 -0
- package/dist/memory/shared.d.ts.map +1 -0
- package/dist/memory/shared.js +294 -0
- package/dist/memory/shared.js.map +1 -0
- package/dist/memory/store.d.ts +72 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +121 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +245 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.js +1400 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/scheduler.d.ts +112 -0
- package/dist/orchestrator/scheduler.d.ts.map +1 -0
- package/dist/orchestrator/scheduler.js +256 -0
- package/dist/orchestrator/scheduler.js.map +1 -0
- package/dist/task/queue.d.ts +191 -0
- package/dist/task/queue.d.ts.map +1 -0
- package/dist/task/queue.js +408 -0
- package/dist/task/queue.js.map +1 -0
- package/dist/task/task.d.ts +90 -0
- package/dist/task/task.d.ts.map +1 -0
- package/dist/task/task.js +206 -0
- package/dist/task/task.js.map +1 -0
- package/dist/team/messaging.d.ts +106 -0
- package/dist/team/messaging.d.ts.map +1 -0
- package/dist/team/messaging.js +183 -0
- package/dist/team/messaging.js.map +1 -0
- package/dist/team/team.d.ts +141 -0
- package/dist/team/team.d.ts.map +1 -0
- package/dist/team/team.js +293 -0
- package/dist/team/team.js.map +1 -0
- package/dist/tool/built-in/bash.d.ts +12 -0
- package/dist/tool/built-in/bash.d.ts.map +1 -0
- package/dist/tool/built-in/bash.js +133 -0
- package/dist/tool/built-in/bash.js.map +1 -0
- package/dist/tool/built-in/delegate.d.ts +29 -0
- package/dist/tool/built-in/delegate.d.ts.map +1 -0
- package/dist/tool/built-in/delegate.js +92 -0
- package/dist/tool/built-in/delegate.js.map +1 -0
- package/dist/tool/built-in/file-edit.d.ts +14 -0
- package/dist/tool/built-in/file-edit.d.ts.map +1 -0
- package/dist/tool/built-in/file-edit.js +130 -0
- package/dist/tool/built-in/file-edit.js.map +1 -0
- package/dist/tool/built-in/file-read.d.ts +12 -0
- package/dist/tool/built-in/file-read.d.ts.map +1 -0
- package/dist/tool/built-in/file-read.js +82 -0
- package/dist/tool/built-in/file-read.js.map +1 -0
- package/dist/tool/built-in/file-write.d.ts +11 -0
- package/dist/tool/built-in/file-write.d.ts.map +1 -0
- package/dist/tool/built-in/file-write.js +70 -0
- package/dist/tool/built-in/file-write.js.map +1 -0
- package/dist/tool/built-in/fs-walk.d.ts +23 -0
- package/dist/tool/built-in/fs-walk.d.ts.map +1 -0
- package/dist/tool/built-in/fs-walk.js +78 -0
- package/dist/tool/built-in/fs-walk.js.map +1 -0
- package/dist/tool/built-in/glob.d.ts +12 -0
- package/dist/tool/built-in/glob.d.ts.map +1 -0
- package/dist/tool/built-in/glob.js +82 -0
- package/dist/tool/built-in/glob.js.map +1 -0
- package/dist/tool/built-in/grep.d.ts +15 -0
- package/dist/tool/built-in/grep.d.ts.map +1 -0
- package/dist/tool/built-in/grep.js +218 -0
- package/dist/tool/built-in/grep.js.map +1 -0
- package/dist/tool/built-in/index.d.ts +48 -0
- package/dist/tool/built-in/index.d.ts.map +1 -0
- package/dist/tool/built-in/index.js +56 -0
- package/dist/tool/built-in/index.js.map +1 -0
- package/dist/tool/executor.d.ts +100 -0
- package/dist/tool/executor.d.ts.map +1 -0
- package/dist/tool/executor.js +184 -0
- package/dist/tool/executor.js.map +1 -0
- package/dist/tool/framework.d.ts +167 -0
- package/dist/tool/framework.d.ts.map +1 -0
- package/dist/tool/framework.js +402 -0
- package/dist/tool/framework.js.map +1 -0
- package/dist/tool/mcp.d.ts +31 -0
- package/dist/tool/mcp.d.ts.map +1 -0
- package/dist/tool/mcp.js +175 -0
- package/dist/tool/mcp.js.map +1 -0
- package/dist/tool/text-tool-extractor.d.ts +32 -0
- package/dist/tool/text-tool-extractor.d.ts.map +1 -0
- package/dist/tool/text-tool-extractor.js +195 -0
- package/dist/tool/text-tool-extractor.js.map +1 -0
- package/dist/types.d.ts +916 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/keywords.d.ts +18 -0
- package/dist/utils/keywords.d.ts.map +1 -0
- package/dist/utils/keywords.js +32 -0
- package/dist/utils/keywords.js.map +1 -0
- package/dist/utils/semaphore.d.ts +49 -0
- package/dist/utils/semaphore.d.ts.map +1 -0
- package/dist/utils/semaphore.js +89 -0
- package/dist/utils/semaphore.js.map +1 -0
- package/dist/utils/tokens.d.ts +7 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +30 -0
- package/dist/utils/tokens.js.map +1 -0
- package/dist/utils/trace.d.ts +12 -0
- package/dist/utils/trace.d.ts.map +1 -0
- package/dist/utils/trace.js +30 -0
- package/dist/utils/trace.js.map +1 -0
- package/docs/DECISIONS.md +49 -0
- package/docs/cli.md +265 -0
- package/docs/context-management.md +24 -0
- package/docs/featured-partner.md +28 -0
- package/docs/observability.md +56 -0
- package/docs/providers.md +78 -0
- package/docs/shared-memory.md +27 -0
- package/docs/tool-configuration.md +152 -0
- package/package.json +96 -0
package/dist/cli/oma.js
ADDED
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Thin shell/CI wrapper over OpenMultiAgent — no interactive session, cwd binding,
|
|
4
|
+
* approvals, or persistence.
|
|
5
|
+
*
|
|
6
|
+
* Exit codes:
|
|
7
|
+
* 0 — finished; team run succeeded
|
|
8
|
+
* 1 — finished; team run reported failure (agents/tasks)
|
|
9
|
+
* 2 — invalid usage, I/O, or JSON validation
|
|
10
|
+
* 3 — unexpected runtime error (including LLM errors)
|
|
11
|
+
*/
|
|
12
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
import { join, resolve } from 'node:path';
|
|
15
|
+
import { fileURLToPath } from 'node:url';
|
|
16
|
+
import { OpenMultiAgent } from '../orchestrator/orchestrator.js';
|
|
17
|
+
import { renderTeamRunDashboard } from '../dashboard/render-team-run-dashboard.js';
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Exit codes
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
export const EXIT = {
|
|
22
|
+
SUCCESS: 0,
|
|
23
|
+
RUN_FAILED: 1,
|
|
24
|
+
USAGE: 2,
|
|
25
|
+
INTERNAL: 3,
|
|
26
|
+
};
|
|
27
|
+
class OmaValidationError extends Error {
|
|
28
|
+
name = 'OmaValidationError';
|
|
29
|
+
constructor(message) {
|
|
30
|
+
super(message);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Provider helper (static reference data)
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
const PROVIDER_REFERENCE = [
|
|
37
|
+
{ id: 'anthropic', apiKeyEnv: ['ANTHROPIC_API_KEY'], baseUrlSupported: true },
|
|
38
|
+
{ id: 'azure-openai', apiKeyEnv: ['AZURE_OPENAI_API_KEY', 'AZURE_OPENAI_ENDPOINT', 'AZURE_OPENAI_DEPLOYMENT'], baseUrlSupported: true, notes: 'Azure OpenAI requires endpoint URL (e.g., https://my-resource.openai.azure.com) and API key. Optional: AZURE_OPENAI_API_VERSION (defaults to 2024-10-21). Prefer setting deployment on agent.model; AZURE_OPENAI_DEPLOYMENT is a fallback when model is blank.' },
|
|
39
|
+
{ id: 'openai', apiKeyEnv: ['OPENAI_API_KEY'], baseUrlSupported: true, notes: 'Set baseURL for Ollama / vLLM / LM Studio; apiKey may be a placeholder.' },
|
|
40
|
+
{ id: 'gemini', apiKeyEnv: ['GEMINI_API_KEY', 'GOOGLE_API_KEY'], baseUrlSupported: false },
|
|
41
|
+
{ id: 'grok', apiKeyEnv: ['XAI_API_KEY'], baseUrlSupported: true },
|
|
42
|
+
{ id: 'minimax', apiKeyEnv: ['MINIMAX_API_KEY'], baseUrlSupported: true, notes: 'Global endpoint: https://api.minimax.io/v1 (default). China endpoint: https://api.minimaxi.com/v1. Set MINIMAX_BASE_URL to choose, or pass baseURL in agent config.' },
|
|
43
|
+
{ id: 'deepseek', apiKeyEnv: ['DEEPSEEK_API_KEY'], baseUrlSupported: true, notes: 'OpenAI-compatible endpoint at https://api.deepseek.com/v1. Models: deepseek-chat (V3), deepseek-reasoner (thinking).' },
|
|
44
|
+
{ id: 'qiniu', apiKeyEnv: ['QINIU_API_KEY'], baseUrlSupported: true, notes: 'OpenAI-compatible endpoint at https://api.qnaigc.com/v1. Set provider to qiniu and choose a model available to your key.' },
|
|
45
|
+
{
|
|
46
|
+
id: 'copilot',
|
|
47
|
+
apiKeyEnv: ['GITHUB_COPILOT_TOKEN', 'GITHUB_TOKEN'],
|
|
48
|
+
baseUrlSupported: false,
|
|
49
|
+
notes: 'If no token env is set, Copilot adapter may start an interactive OAuth device flow (avoid in CI).',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: 'bedrock',
|
|
53
|
+
apiKeyEnv: ['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_REGION'],
|
|
54
|
+
baseUrlSupported: false,
|
|
55
|
+
notes: 'No API key. Credentials via AWS SDK default provider chain (env vars, shared config, IAM role). Set AWS_REGION or pass region as the fourth arg to createAdapter; defaults to us-east-1. Requires npm install @aws-sdk/client-bedrock-runtime.',
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// argv / JSON helpers
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
export function parseArgs(argv) {
|
|
62
|
+
const _ = argv.slice(2);
|
|
63
|
+
const flags = new Set();
|
|
64
|
+
const kv = new Map();
|
|
65
|
+
let i = 0;
|
|
66
|
+
while (i < _.length) {
|
|
67
|
+
const a = _[i];
|
|
68
|
+
if (a === '--') {
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
if (a.startsWith('--')) {
|
|
72
|
+
const eq = a.indexOf('=');
|
|
73
|
+
if (eq !== -1) {
|
|
74
|
+
kv.set(a.slice(2, eq), a.slice(eq + 1));
|
|
75
|
+
i++;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const key = a.slice(2);
|
|
79
|
+
const next = _[i + 1];
|
|
80
|
+
if (next !== undefined && !next.startsWith('--')) {
|
|
81
|
+
kv.set(key, next);
|
|
82
|
+
i += 2;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
flags.add(key);
|
|
86
|
+
i++;
|
|
87
|
+
}
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
i++;
|
|
91
|
+
}
|
|
92
|
+
return { _, flags, kv };
|
|
93
|
+
}
|
|
94
|
+
function getOpt(kv, flags, key) {
|
|
95
|
+
if (flags.has(key))
|
|
96
|
+
return '';
|
|
97
|
+
return kv.get(key);
|
|
98
|
+
}
|
|
99
|
+
function readJson(path) {
|
|
100
|
+
const abs = resolve(path);
|
|
101
|
+
const raw = readFileSync(abs, 'utf8');
|
|
102
|
+
try {
|
|
103
|
+
return JSON.parse(raw);
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
if (e instanceof SyntaxError) {
|
|
107
|
+
throw new Error(`Invalid JSON in ${abs}: ${e.message}`);
|
|
108
|
+
}
|
|
109
|
+
throw e;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function isObject(v) {
|
|
113
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
114
|
+
}
|
|
115
|
+
function asTeamConfig(v, label) {
|
|
116
|
+
if (!isObject(v))
|
|
117
|
+
throw new OmaValidationError(`${label}: expected a JSON object`);
|
|
118
|
+
const name = v['name'];
|
|
119
|
+
const agents = v['agents'];
|
|
120
|
+
if (typeof name !== 'string' || !name)
|
|
121
|
+
throw new OmaValidationError(`${label}.name: non-empty string required`);
|
|
122
|
+
if (!Array.isArray(agents) || agents.length === 0) {
|
|
123
|
+
throw new OmaValidationError(`${label}.agents: non-empty array required`);
|
|
124
|
+
}
|
|
125
|
+
for (const a of agents) {
|
|
126
|
+
if (!isObject(a))
|
|
127
|
+
throw new OmaValidationError(`${label}.agents[]: each agent must be an object`);
|
|
128
|
+
if (typeof a['name'] !== 'string' || !a['name'])
|
|
129
|
+
throw new OmaValidationError(`agent.name required`);
|
|
130
|
+
if (typeof a['model'] !== 'string' || !a['model']) {
|
|
131
|
+
throw new OmaValidationError(`agent.model required for "${String(a['name'])}"`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// `sharedMemoryStore` is a runtime MemoryStore instance and cannot survive
|
|
135
|
+
// JSON round-tripping. Reject it here with a clear pointer to the SDK path,
|
|
136
|
+
// otherwise the plain object would reach `new SharedMemory(...)` and crash on
|
|
137
|
+
// the first read/write.
|
|
138
|
+
if ('sharedMemoryStore' in v) {
|
|
139
|
+
throw new OmaValidationError(`${label}.sharedMemoryStore: SDK-only; cannot be set from JSON config. ` +
|
|
140
|
+
'Use `sharedMemory: true` for the default in-memory store, or wire a ' +
|
|
141
|
+
'custom MemoryStore in TypeScript via `orchestrator.createTeam()`.');
|
|
142
|
+
}
|
|
143
|
+
return v;
|
|
144
|
+
}
|
|
145
|
+
function asOrchestratorPartial(v, label) {
|
|
146
|
+
if (!isObject(v))
|
|
147
|
+
throw new OmaValidationError(`${label}: expected a JSON object`);
|
|
148
|
+
return v;
|
|
149
|
+
}
|
|
150
|
+
function asCoordinatorPartial(v, label) {
|
|
151
|
+
if (!isObject(v))
|
|
152
|
+
throw new OmaValidationError(`${label}: expected a JSON object`);
|
|
153
|
+
return v;
|
|
154
|
+
}
|
|
155
|
+
function asTaskSpecs(v, label) {
|
|
156
|
+
if (!Array.isArray(v))
|
|
157
|
+
throw new OmaValidationError(`${label}: expected a JSON array`);
|
|
158
|
+
const out = [];
|
|
159
|
+
let i = 0;
|
|
160
|
+
for (const item of v) {
|
|
161
|
+
if (!isObject(item))
|
|
162
|
+
throw new OmaValidationError(`${label}[${i}]: object expected`);
|
|
163
|
+
if (typeof item['title'] !== 'string' || typeof item['description'] !== 'string') {
|
|
164
|
+
throw new OmaValidationError(`${label}[${i}]: title and description strings required`);
|
|
165
|
+
}
|
|
166
|
+
const row = {
|
|
167
|
+
title: item['title'],
|
|
168
|
+
description: item['description'],
|
|
169
|
+
};
|
|
170
|
+
if (typeof item['assignee'] === 'string')
|
|
171
|
+
row.assignee = item['assignee'];
|
|
172
|
+
if (Array.isArray(item['dependsOn'])) {
|
|
173
|
+
row.dependsOn = item['dependsOn'].filter((x) => typeof x === 'string');
|
|
174
|
+
}
|
|
175
|
+
if (item['memoryScope'] === 'all' || item['memoryScope'] === 'dependencies') {
|
|
176
|
+
row.memoryScope = item['memoryScope'];
|
|
177
|
+
}
|
|
178
|
+
if (typeof item['maxRetries'] === 'number')
|
|
179
|
+
row.maxRetries = item['maxRetries'];
|
|
180
|
+
if (typeof item['retryDelayMs'] === 'number')
|
|
181
|
+
row.retryDelayMs = item['retryDelayMs'];
|
|
182
|
+
if (typeof item['retryBackoff'] === 'number')
|
|
183
|
+
row.retryBackoff = item['retryBackoff'];
|
|
184
|
+
out.push(row);
|
|
185
|
+
i++;
|
|
186
|
+
}
|
|
187
|
+
return out;
|
|
188
|
+
}
|
|
189
|
+
export function serializeAgentResult(r, includeMessages) {
|
|
190
|
+
const base = {
|
|
191
|
+
success: r.success,
|
|
192
|
+
output: r.output,
|
|
193
|
+
tokenUsage: r.tokenUsage,
|
|
194
|
+
toolCalls: r.toolCalls,
|
|
195
|
+
structured: r.structured,
|
|
196
|
+
loopDetected: r.loopDetected,
|
|
197
|
+
budgetExceeded: r.budgetExceeded,
|
|
198
|
+
};
|
|
199
|
+
if (includeMessages)
|
|
200
|
+
base['messages'] = r.messages;
|
|
201
|
+
return base;
|
|
202
|
+
}
|
|
203
|
+
export function serializeTeamRunResult(result, opts) {
|
|
204
|
+
const agentResults = {};
|
|
205
|
+
for (const [k, v] of result.agentResults) {
|
|
206
|
+
agentResults[k] = serializeAgentResult(v, opts.includeMessages);
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
success: result.success,
|
|
210
|
+
goal: result.goal,
|
|
211
|
+
tasks: result.tasks,
|
|
212
|
+
totalTokenUsage: result.totalTokenUsage,
|
|
213
|
+
agentResults,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
function printJson(data, pretty) {
|
|
217
|
+
const s = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
|
|
218
|
+
process.stdout.write(`${s}\n`);
|
|
219
|
+
}
|
|
220
|
+
function help() {
|
|
221
|
+
return [
|
|
222
|
+
'open-multi-agent CLI (oma)',
|
|
223
|
+
'',
|
|
224
|
+
'Usage:',
|
|
225
|
+
' oma run --goal <text> --team <team.json> [--orchestrator <orch.json>] [--coordinator <coord.json>]',
|
|
226
|
+
' oma task --file <tasks.json> [--team <team.json>]',
|
|
227
|
+
' oma provider [list | template <provider>]',
|
|
228
|
+
'',
|
|
229
|
+
'Flags:',
|
|
230
|
+
' --pretty Pretty-print JSON to stdout',
|
|
231
|
+
' --include-messages Include full LLM message arrays in run output (large)',
|
|
232
|
+
' --dashboard Write team-run DAG HTML dashboard to oma-dashboards/',
|
|
233
|
+
'',
|
|
234
|
+
'team.json may be a TeamConfig object, or { "team": TeamConfig, "orchestrator": { ... } }.',
|
|
235
|
+
'tasks.json: { "team": TeamConfig, "tasks": [ ... ], "orchestrator"?: { ... } }.',
|
|
236
|
+
' Optional --team overrides the embedded team object.',
|
|
237
|
+
'',
|
|
238
|
+
'Exit codes: 0 success, 1 run failed, 2 usage/validation, 3 internal',
|
|
239
|
+
].join('\n');
|
|
240
|
+
}
|
|
241
|
+
const DEFAULT_MODEL_HINT = {
|
|
242
|
+
anthropic: 'claude-opus-4-6',
|
|
243
|
+
'azure-openai': 'gpt-4',
|
|
244
|
+
openai: 'gpt-4o',
|
|
245
|
+
gemini: 'gemini-2.0-flash',
|
|
246
|
+
grok: 'grok-2-latest',
|
|
247
|
+
copilot: 'gpt-4o',
|
|
248
|
+
minimax: 'MiniMax-M2.7',
|
|
249
|
+
deepseek: 'deepseek-chat',
|
|
250
|
+
qiniu: 'deepseek-v3',
|
|
251
|
+
bedrock: 'anthropic.claude-3-5-haiku-20241022-v1:0',
|
|
252
|
+
};
|
|
253
|
+
async function cmdProvider(sub, arg, pretty) {
|
|
254
|
+
if (sub === undefined || sub === 'list') {
|
|
255
|
+
printJson({ providers: PROVIDER_REFERENCE }, pretty);
|
|
256
|
+
return EXIT.SUCCESS;
|
|
257
|
+
}
|
|
258
|
+
if (sub === 'template') {
|
|
259
|
+
const id = arg;
|
|
260
|
+
const row = PROVIDER_REFERENCE.find((p) => p.id === id);
|
|
261
|
+
if (!id || !row) {
|
|
262
|
+
printJson({
|
|
263
|
+
error: {
|
|
264
|
+
kind: 'usage',
|
|
265
|
+
message: `usage: oma provider template <${PROVIDER_REFERENCE.map((p) => p.id).join('|')}>`,
|
|
266
|
+
},
|
|
267
|
+
}, pretty);
|
|
268
|
+
return EXIT.USAGE;
|
|
269
|
+
}
|
|
270
|
+
printJson({
|
|
271
|
+
orchestrator: {
|
|
272
|
+
defaultProvider: id,
|
|
273
|
+
defaultModel: DEFAULT_MODEL_HINT[id],
|
|
274
|
+
},
|
|
275
|
+
agent: {
|
|
276
|
+
name: 'worker',
|
|
277
|
+
model: DEFAULT_MODEL_HINT[id],
|
|
278
|
+
provider: id,
|
|
279
|
+
systemPrompt: 'You are a helpful assistant.',
|
|
280
|
+
},
|
|
281
|
+
env: Object.fromEntries(row.apiKeyEnv.map((k) => [k, `<set ${k} in environment>`])),
|
|
282
|
+
notes: row.notes,
|
|
283
|
+
}, pretty);
|
|
284
|
+
return EXIT.SUCCESS;
|
|
285
|
+
}
|
|
286
|
+
printJson({ error: { kind: 'usage', message: `unknown provider subcommand: ${sub}` } }, pretty);
|
|
287
|
+
return EXIT.USAGE;
|
|
288
|
+
}
|
|
289
|
+
function mergeOrchestrator(base, ...partials) {
|
|
290
|
+
let o = { ...base };
|
|
291
|
+
for (const p of partials) {
|
|
292
|
+
o = { ...o, ...p };
|
|
293
|
+
}
|
|
294
|
+
return o;
|
|
295
|
+
}
|
|
296
|
+
async function writeRunTeamDashboardFile(html) {
|
|
297
|
+
const directory = join(process.cwd(), 'oma-dashboards');
|
|
298
|
+
await mkdir(directory, { recursive: true });
|
|
299
|
+
const stamp = new Date().toISOString().replaceAll(':', '-').replace('.', '-');
|
|
300
|
+
const filePath = join(directory, `runTeam-${stamp}.html`);
|
|
301
|
+
await writeFile(filePath, html, 'utf8');
|
|
302
|
+
return filePath;
|
|
303
|
+
}
|
|
304
|
+
async function main() {
|
|
305
|
+
const argv = parseArgs(process.argv);
|
|
306
|
+
const cmd = argv._[0];
|
|
307
|
+
const pretty = argv.flags.has('pretty');
|
|
308
|
+
const includeMessages = argv.flags.has('include-messages');
|
|
309
|
+
const dashboard = argv.flags.has('dashboard');
|
|
310
|
+
if (cmd === undefined || cmd === 'help' || cmd === '-h' || cmd === '--help') {
|
|
311
|
+
process.stdout.write(`${help()}\n`);
|
|
312
|
+
return EXIT.SUCCESS;
|
|
313
|
+
}
|
|
314
|
+
if (cmd === 'provider') {
|
|
315
|
+
return cmdProvider(argv._[1], argv._[2], pretty);
|
|
316
|
+
}
|
|
317
|
+
const jsonOpts = { pretty, includeMessages };
|
|
318
|
+
try {
|
|
319
|
+
if (cmd === 'run') {
|
|
320
|
+
const goal = getOpt(argv.kv, argv.flags, 'goal');
|
|
321
|
+
const teamPath = getOpt(argv.kv, argv.flags, 'team');
|
|
322
|
+
const orchPath = getOpt(argv.kv, argv.flags, 'orchestrator');
|
|
323
|
+
const coordPath = getOpt(argv.kv, argv.flags, 'coordinator');
|
|
324
|
+
if (!goal || !teamPath) {
|
|
325
|
+
printJson({ error: { kind: 'usage', message: '--goal and --team are required' } }, pretty);
|
|
326
|
+
return EXIT.USAGE;
|
|
327
|
+
}
|
|
328
|
+
const teamRaw = readJson(teamPath);
|
|
329
|
+
let teamCfg;
|
|
330
|
+
let orchParts = [];
|
|
331
|
+
if (isObject(teamRaw) && teamRaw['team'] !== undefined) {
|
|
332
|
+
teamCfg = asTeamConfig(teamRaw['team'], 'team');
|
|
333
|
+
if (teamRaw['orchestrator'] !== undefined) {
|
|
334
|
+
orchParts.push(asOrchestratorPartial(teamRaw['orchestrator'], 'orchestrator'));
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
teamCfg = asTeamConfig(teamRaw, 'team');
|
|
339
|
+
}
|
|
340
|
+
if (orchPath) {
|
|
341
|
+
orchParts.push(asOrchestratorPartial(readJson(orchPath), 'orchestrator file'));
|
|
342
|
+
}
|
|
343
|
+
const orchestrator = new OpenMultiAgent(mergeOrchestrator({}, ...orchParts));
|
|
344
|
+
const team = orchestrator.createTeam(teamCfg.name, teamCfg);
|
|
345
|
+
let coordinator;
|
|
346
|
+
if (coordPath) {
|
|
347
|
+
coordinator = asCoordinatorPartial(readJson(coordPath), 'coordinator file');
|
|
348
|
+
}
|
|
349
|
+
const result = await orchestrator.runTeam(team, goal, coordinator ? { coordinator } : undefined);
|
|
350
|
+
if (dashboard) {
|
|
351
|
+
const html = renderTeamRunDashboard(result);
|
|
352
|
+
try {
|
|
353
|
+
await writeRunTeamDashboardFile(html);
|
|
354
|
+
}
|
|
355
|
+
catch (err) {
|
|
356
|
+
process.stderr.write(`oma: failed to write runTeam dashboard: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
await orchestrator.shutdown();
|
|
360
|
+
const payload = { command: 'run', ...serializeTeamRunResult(result, jsonOpts) };
|
|
361
|
+
printJson(payload, pretty);
|
|
362
|
+
return result.success ? EXIT.SUCCESS : EXIT.RUN_FAILED;
|
|
363
|
+
}
|
|
364
|
+
if (cmd === 'task') {
|
|
365
|
+
const file = getOpt(argv.kv, argv.flags, 'file');
|
|
366
|
+
const teamOverride = getOpt(argv.kv, argv.flags, 'team');
|
|
367
|
+
if (!file) {
|
|
368
|
+
printJson({ error: { kind: 'usage', message: '--file is required' } }, pretty);
|
|
369
|
+
return EXIT.USAGE;
|
|
370
|
+
}
|
|
371
|
+
const doc = readJson(file);
|
|
372
|
+
if (!isObject(doc)) {
|
|
373
|
+
throw new OmaValidationError('tasks file root must be an object');
|
|
374
|
+
}
|
|
375
|
+
const orchParts = [];
|
|
376
|
+
if (doc['orchestrator'] !== undefined) {
|
|
377
|
+
orchParts.push(asOrchestratorPartial(doc['orchestrator'], 'orchestrator'));
|
|
378
|
+
}
|
|
379
|
+
const teamCfg = teamOverride
|
|
380
|
+
? asTeamConfig(readJson(teamOverride), 'team (--team)')
|
|
381
|
+
: asTeamConfig(doc['team'], 'team');
|
|
382
|
+
const tasks = asTaskSpecs(doc['tasks'], 'tasks');
|
|
383
|
+
if (tasks.length === 0) {
|
|
384
|
+
throw new OmaValidationError('tasks array must not be empty');
|
|
385
|
+
}
|
|
386
|
+
const orchestrator = new OpenMultiAgent(mergeOrchestrator({}, ...orchParts));
|
|
387
|
+
const team = orchestrator.createTeam(teamCfg.name, teamCfg);
|
|
388
|
+
const result = await orchestrator.runTasks(team, tasks);
|
|
389
|
+
await orchestrator.shutdown();
|
|
390
|
+
const payload = { command: 'task', ...serializeTeamRunResult(result, jsonOpts) };
|
|
391
|
+
printJson(payload, pretty);
|
|
392
|
+
return result.success ? EXIT.SUCCESS : EXIT.RUN_FAILED;
|
|
393
|
+
}
|
|
394
|
+
printJson({ error: { kind: 'usage', message: `unknown command: ${cmd}` } }, pretty);
|
|
395
|
+
return EXIT.USAGE;
|
|
396
|
+
}
|
|
397
|
+
catch (e) {
|
|
398
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
399
|
+
const { kind, exit } = classifyCliError(e, message);
|
|
400
|
+
printJson({ error: { kind, message } }, pretty);
|
|
401
|
+
return exit;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
function classifyCliError(e, message) {
|
|
405
|
+
if (e instanceof OmaValidationError)
|
|
406
|
+
return { kind: 'validation', exit: EXIT.USAGE };
|
|
407
|
+
if (message.includes('Invalid JSON'))
|
|
408
|
+
return { kind: 'validation', exit: EXIT.USAGE };
|
|
409
|
+
if (message.includes('ENOENT') || message.includes('EACCES'))
|
|
410
|
+
return { kind: 'io', exit: EXIT.USAGE };
|
|
411
|
+
return { kind: 'runtime', exit: EXIT.INTERNAL };
|
|
412
|
+
}
|
|
413
|
+
const isMain = (() => {
|
|
414
|
+
const argv1 = process.argv[1];
|
|
415
|
+
if (!argv1)
|
|
416
|
+
return false;
|
|
417
|
+
try {
|
|
418
|
+
return fileURLToPath(import.meta.url) === resolve(argv1);
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
})();
|
|
424
|
+
if (isMain) {
|
|
425
|
+
main()
|
|
426
|
+
.then((code) => process.exit(code))
|
|
427
|
+
.catch((e) => {
|
|
428
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
429
|
+
process.stdout.write(`${JSON.stringify({ error: { kind: 'internal', message } })}\n`);
|
|
430
|
+
process.exit(EXIT.INTERNAL);
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=oma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oma.js","sourceRoot":"","sources":["../../src/cli/oma.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAA;AAIlF,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,OAAO,EAAE,CAAC;IACV,UAAU,EAAE,CAAC;IACb,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;CACH,CAAA;AAEV,MAAM,kBAAmB,SAAQ,KAAK;IAClB,IAAI,GAAG,oBAAoB,CAAA;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;IAChB,CAAC;CACF;AAED,8EAA8E;AAC9E,0CAA0C;AAC1C,8EAA8E;AAE9E,MAAM,kBAAkB,GAKnB;IACH,EAAE,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,mBAAmB,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE;IAC7E,EAAE,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,sBAAsB,EAAE,uBAAuB,EAAE,yBAAyB,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,gQAAgQ,EAAE;IAChZ,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,yEAAyE,EAAE;IACzJ,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE;IAC1F,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,aAAa,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE;IAClE,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,qKAAqK,EAAE;IACvP,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,sHAAsH,EAAE;IAC1M,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,eAAe,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,0HAA0H,EAAE;IACxM;QACE,EAAE,EAAE,SAAS;QACb,SAAS,EAAE,CAAC,sBAAsB,EAAE,cAAc,CAAC;QACnD,gBAAgB,EAAE,KAAK;QACvB,KAAK,EAAE,mGAAmG;KAC3G;IACD;QACE,EAAE,EAAE,SAAS;QACb,SAAS,EAAE,CAAC,mBAAmB,EAAE,uBAAuB,EAAE,YAAY,CAAC;QACvE,gBAAgB,EAAE,KAAK;QACvB,KAAK,EAAE,gPAAgP;KACxP;CACF,CAAA;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,MAAM,UAAU,SAAS,CAAC,IAAc;IAKtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACvB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,MAAM,EAAE,GAAG,IAAI,GAAG,EAAkB,CAAA;IACpC,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;QACf,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,MAAK;QACP,CAAC;QACD,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACzB,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;gBACd,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;gBACvC,CAAC,EAAE,CAAA;gBACH,SAAQ;YACV,CAAC;YACD,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACtB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YACrB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;gBACjB,CAAC,IAAI,CAAC,CAAA;YACR,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACd,CAAC,EAAE,CAAA;YACL,CAAC;YACD,SAAQ;QACV,CAAC;QACD,CAAC,EAAE,CAAA;IACL,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;AACzB,CAAC;AAED,SAAS,MAAM,CAAC,EAAuB,EAAE,KAAkB,EAAE,GAAW;IACtE,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAC7B,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACpB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAA;IACnC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QACzD,CAAC;QACD,MAAM,CAAC,CAAA;IACT,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AACjE,CAAC;AAED,SAAS,YAAY,CAAC,CAAU,EAAE,KAAa;IAC7C,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,GAAG,KAAK,0BAA0B,CAAC,CAAA;IAClF,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAA;IACtB,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAA;IAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,kBAAkB,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAA;IAC/G,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,kBAAkB,CAAC,GAAG,KAAK,mCAAmC,CAAC,CAAA;IAC3E,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,kBAAkB,CAAC,GAAG,KAAK,yCAAyC,CAAC,CAAA;QACjG,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,kBAAkB,CAAC,qBAAqB,CAAC,CAAA;QACpG,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,kBAAkB,CAAC,6BAA6B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAA;QACjF,CAAC;IACH,CAAC;IACD,2EAA2E;IAC3E,4EAA4E;IAC5E,8EAA8E;IAC9E,wBAAwB;IACxB,IAAI,mBAAmB,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,kBAAkB,CAC1B,GAAG,KAAK,gEAAgE;YACtE,sEAAsE;YACtE,mEAAmE,CACtE,CAAA;IACH,CAAC;IACD,OAAO,CAA0B,CAAA;AACnC,CAAC;AAED,SAAS,qBAAqB,CAAC,CAAU,EAAE,KAAa;IACtD,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,GAAG,KAAK,0BAA0B,CAAC,CAAA;IAClF,OAAO,CAAuB,CAAA;AAChC,CAAC;AAED,SAAS,oBAAoB,CAAC,CAAU,EAAE,KAAa;IACrD,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,GAAG,KAAK,0BAA0B,CAAC,CAAA;IAClF,OAAO,CAAsB,CAAA;AAC/B,CAAC;AAED,SAAS,WAAW,CAAC,CAAU,EAAE,KAAa;IAU5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,GAAG,KAAK,yBAAyB,CAAC,CAAA;IACtF,MAAM,GAAG,GASJ,EAAE,CAAA;IACP,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,kBAAkB,CAAC,GAAG,KAAK,IAAI,CAAC,oBAAoB,CAAC,CAAA;QACpF,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,QAAQ,EAAE,CAAC;YACjF,MAAM,IAAI,kBAAkB,CAAC,GAAG,KAAK,IAAI,CAAC,2CAA2C,CAAC,CAAA;QACxF,CAAC;QACD,MAAM,GAAG,GAAoB;YAC3B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;YACpB,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC;SACjC,CAAA;QACD,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAA;QACzE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAA;QACrF,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,cAAc,EAAE,CAAC;YAC5E,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,CAAA;QACvC,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;QAC/E,IAAI,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,CAAA;QACrF,IAAI,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,CAAA;QACrF,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACb,CAAC,EAAE,CAAA;IACL,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAOD,MAAM,UAAU,oBAAoB,CAAC,CAAiB,EAAE,eAAwB;IAC9E,MAAM,IAAI,GAA4B;QACpC,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,cAAc,EAAE,CAAC,CAAC,cAAc;KACjC,CAAA;IACD,IAAI,eAAe;QAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAA;IAClD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAqB,EAAE,IAAoB;IAChF,MAAM,YAAY,GAA4B,EAAE,CAAA;IAChD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACzC,YAAY,CAAC,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;IACjE,CAAC;IACD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,YAAY;KACb,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAa,EAAE,MAAe;IAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED,SAAS,IAAI;IACX,OAAO;QACL,4BAA4B;QAC5B,EAAE;QACF,QAAQ;QACR,sGAAsG;QACtG,qDAAqD;QACrD,6CAA6C;QAC7C,EAAE;QACF,QAAQ;QACR,qDAAqD;QACrD,+EAA+E;QAC/E,8EAA8E;QAC9E,EAAE;QACF,2FAA2F;QAC3F,iFAAiF;QACjF,uDAAuD;QACvD,EAAE;QACF,qEAAqE;KACtE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,kBAAkB,GAAsC;IAC5D,SAAS,EAAE,iBAAiB;IAC5B,cAAc,EAAE,OAAO;IACvB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,kBAAkB;IAC1B,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,cAAc;IACvB,QAAQ,EAAE,eAAe;IACzB,KAAK,EAAE,aAAa;IACpB,OAAO,EAAE,0CAA0C;CACpD,CAAA;AAED,KAAK,UAAU,WAAW,CAAC,GAAuB,EAAE,GAAuB,EAAE,MAAe;IAC1F,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACxC,SAAS,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,MAAM,CAAC,CAAA;QACpD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IACD,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,GAAoC,CAAA;QAC/C,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QACvD,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YAChB,SAAS,CACP;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,iCAAiC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;iBAC3F;aACF,EACD,MAAM,CACP,CAAA;YACD,OAAO,IAAI,CAAC,KAAK,CAAA;QACnB,CAAC;QACD,SAAS,CACP;YACE,YAAY,EAAE;gBACZ,eAAe,EAAE,EAAE;gBACnB,YAAY,EAAE,kBAAkB,CAAC,EAAE,CAAC;aACrC;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,kBAAkB,CAAC,EAAE,CAAC;gBAC7B,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,8BAA8B;aAC7C;YACD,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACnF,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,EACD,MAAM,CACP,CAAA;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IACD,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,gCAAgC,GAAG,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;IAC/F,OAAO,IAAI,CAAC,KAAK,CAAA;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAwB,EAAE,GAAG,QAA8B;IACpF,IAAI,CAAC,GAAuB,EAAE,GAAG,IAAI,EAAE,CAAA;IACvC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;IACpB,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,IAAY;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAA;IACvD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,KAAK,OAAO,CAAC,CAAA;IACzD,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACvC,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACrB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACvC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAE7C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAA;QACnC,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACvB,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,QAAQ,GAAmB,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;IAE5D,IAAI,CAAC;QACH,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAA;YAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;YAC5D,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACvB,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,gCAAgC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;gBAC1F,OAAO,IAAI,CAAC,KAAK,CAAA;YACnB,CAAC;YAED,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAClC,IAAI,OAAmB,CAAA;YACvB,IAAI,SAAS,GAAyB,EAAE,CAAA;YACxC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;gBACvD,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;gBAC/C,IAAI,OAAO,CAAC,cAAc,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC1C,SAAS,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC,CAAC,CAAA;gBAChF,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACzC,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,SAAS,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAA;YAChF,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,cAAc,CAAC,iBAAiB,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,CAAC,CAAA;YAC5E,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YAC3D,IAAI,WAA0C,CAAA;YAC9C,IAAI,SAAS,EAAE,CAAC;gBACd,WAAW,GAAG,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC,CAAA;YAC7E,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YAChG,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAA;gBAC3C,IAAI,CAAC;oBACH,MAAM,yBAAyB,CAAC,IAAI,CAAC,CAAA;gBACvC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2CAA2C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAChG,CAAA;gBACH,CAAC;YACH,CAAC;YACD,MAAM,YAAY,CAAC,QAAQ,EAAE,CAAA;YAC7B,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,KAAc,EAAE,GAAG,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAA;YACxF,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAA;QACxD,CAAC;QAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YAChD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YACxD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;gBAC9E,OAAO,IAAI,CAAC,KAAK,CAAA;YACnB,CAAC;YACD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;YAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,kBAAkB,CAAC,mCAAmC,CAAC,CAAA;YACnE,CAAC;YACD,MAAM,SAAS,GAAyB,EAAE,CAAA;YAC1C,IAAI,GAAG,CAAC,cAAc,CAAC,KAAK,SAAS,EAAE,CAAC;gBACtC,SAAS,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC,CAAC,CAAA;YAC5E,CAAC;YACD,MAAM,OAAO,GAAG,YAAY;gBAC1B,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,eAAe,CAAC;gBACvD,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;YAErC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAA;YAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,kBAAkB,CAAC,+BAA+B,CAAC,CAAA;YAC/D,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,cAAc,CAAC,iBAAiB,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,CAAC,CAAA;YAC5E,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YAC3D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACvD,MAAM,YAAY,CAAC,QAAQ,EAAE,CAAA;YAC7B,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,MAAe,EAAE,GAAG,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAA;YACzF,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAA;QACxD,CAAC;QAED,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,GAAG,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;QACnF,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAC1D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QACnD,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;QAC/C,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAU,EAAE,OAAe;IACnD,IAAI,CAAC,YAAY,kBAAkB;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACpF,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACrF,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;IACrG,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAA;AACjD,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC7B,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACxB,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC,CAAC,EAAE,CAAA;AAEJ,IAAI,MAAM,EAAE,CAAC;IACX,IAAI,EAAE;SACH,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAClC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;QACrF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure DAG layout for the team-run dashboard (mirrors the browser algorithm).
|
|
3
|
+
*/
|
|
4
|
+
export interface LayoutTaskInput {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly dependsOn?: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
export interface LayoutTasksResult {
|
|
9
|
+
readonly positions: ReadonlyMap<string, {
|
|
10
|
+
readonly x: number;
|
|
11
|
+
readonly y: number;
|
|
12
|
+
}>;
|
|
13
|
+
readonly width: number;
|
|
14
|
+
readonly height: number;
|
|
15
|
+
readonly nodeW: number;
|
|
16
|
+
readonly nodeH: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Assigns each task to a column by longest path from roots (topological level),
|
|
20
|
+
* then stacks rows within each column. Used by the dashboard canvas sizing.
|
|
21
|
+
*/
|
|
22
|
+
export declare function layoutTasks<T extends LayoutTaskInput>(taskList: readonly T[]): LayoutTasksResult;
|
|
23
|
+
//# sourceMappingURL=layout-tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-tasks.d.ts","sourceRoot":"","sources":["../../src/dashboard/layout-tasks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACvC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACnF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,eAAe,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,GAAG,iBAAiB,CA4EhG"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure DAG layout for the team-run dashboard (mirrors the browser algorithm).
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Assigns each task to a column by longest path from roots (topological level),
|
|
6
|
+
* then stacks rows within each column. Used by the dashboard canvas sizing.
|
|
7
|
+
*/
|
|
8
|
+
export function layoutTasks(taskList) {
|
|
9
|
+
const byId = new Map(taskList.map((task) => [task.id, task]));
|
|
10
|
+
const children = new Map(taskList.map((task) => [task.id, []]));
|
|
11
|
+
const indegree = new Map();
|
|
12
|
+
for (const task of taskList) {
|
|
13
|
+
const deps = (task.dependsOn ?? []).filter((dep) => byId.has(dep));
|
|
14
|
+
indegree.set(task.id, deps.length);
|
|
15
|
+
for (const depId of deps) {
|
|
16
|
+
children.get(depId).push(task.id);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const levels = new Map();
|
|
20
|
+
const queue = [];
|
|
21
|
+
let processed = 0;
|
|
22
|
+
for (const task of taskList) {
|
|
23
|
+
if ((indegree.get(task.id) ?? 0) === 0) {
|
|
24
|
+
levels.set(task.id, 0);
|
|
25
|
+
queue.push(task.id);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
while (queue.length > 0) {
|
|
29
|
+
const currentId = queue.shift();
|
|
30
|
+
processed += 1;
|
|
31
|
+
const baseLevel = levels.get(currentId) ?? 0;
|
|
32
|
+
for (const childId of children.get(currentId) ?? []) {
|
|
33
|
+
const nextLevel = Math.max(levels.get(childId) ?? 0, baseLevel + 1);
|
|
34
|
+
levels.set(childId, nextLevel);
|
|
35
|
+
indegree.set(childId, (indegree.get(childId) ?? 1) - 1);
|
|
36
|
+
if ((indegree.get(childId) ?? 0) === 0) {
|
|
37
|
+
queue.push(childId);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (processed !== taskList.length) {
|
|
42
|
+
throw new Error('Task dependency graph contains a cycle');
|
|
43
|
+
}
|
|
44
|
+
for (const task of taskList) {
|
|
45
|
+
if (!levels.has(task.id))
|
|
46
|
+
levels.set(task.id, 0);
|
|
47
|
+
}
|
|
48
|
+
const cols = new Map();
|
|
49
|
+
for (const task of taskList) {
|
|
50
|
+
const level = levels.get(task.id) ?? 0;
|
|
51
|
+
if (!cols.has(level))
|
|
52
|
+
cols.set(level, []);
|
|
53
|
+
cols.get(level).push(task);
|
|
54
|
+
}
|
|
55
|
+
const sortedLevels = Array.from(cols.keys()).sort((a, b) => a - b);
|
|
56
|
+
const nodeW = 256;
|
|
57
|
+
const nodeH = 142;
|
|
58
|
+
const colGap = 96;
|
|
59
|
+
const rowGap = 72;
|
|
60
|
+
const padX = 120;
|
|
61
|
+
const padY = 100;
|
|
62
|
+
const positions = new Map();
|
|
63
|
+
let maxRows = 1;
|
|
64
|
+
for (const level of sortedLevels)
|
|
65
|
+
maxRows = Math.max(maxRows, cols.get(level).length);
|
|
66
|
+
for (const level of sortedLevels) {
|
|
67
|
+
const colTasks = cols.get(level);
|
|
68
|
+
colTasks.forEach((task, idx) => {
|
|
69
|
+
positions.set(task.id, {
|
|
70
|
+
x: padX + level * (nodeW + colGap),
|
|
71
|
+
y: padY + idx * (nodeH + rowGap),
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
const width = Math.max(1600, padX * 2 + sortedLevels.length * (nodeW + colGap));
|
|
76
|
+
const height = Math.max(700, padY * 2 + maxRows * (nodeH + rowGap));
|
|
77
|
+
return { positions, width, height, nodeW, nodeH };
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=layout-tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-tasks.js","sourceRoot":"","sources":["../../src/dashboard/layout-tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure HTML renderer for the post-run team task DAG dashboard (no filesystem or network I/O).
|
|
3
|
+
*/
|
|
4
|
+
import type { TeamRunResult } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Escape serialized JSON so it can be embedded in HTML without closing a {@code <script>} tag.
|
|
7
|
+
* The HTML tokenizer ends a script on {@code </script>} even for {@code type="application/json"}.
|
|
8
|
+
*/
|
|
9
|
+
export declare function escapeJsonForHtmlScript(json: string): string;
|
|
10
|
+
export declare function renderTeamRunDashboard(result: TeamRunResult): string;
|
|
11
|
+
//# sourceMappingURL=render-team-run-dashboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-team-run-dashboard.d.ts","sourceRoot":"","sources":["../../src/dashboard/render-team-run-dashboard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGhD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA4bpE"}
|