omniwire 2.0.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 +316 -0
- package/dist/claude/integration.d.ts +12 -0
- package/dist/claude/integration.js +157 -0
- package/dist/claude/integration.js.map +1 -0
- package/dist/commands/browser.d.ts +2 -0
- package/dist/commands/browser.js +23 -0
- package/dist/commands/browser.js.map +1 -0
- package/dist/commands/builtins.d.ts +4 -0
- package/dist/commands/builtins.js +309 -0
- package/dist/commands/builtins.js.map +1 -0
- package/dist/commands/router.d.ts +2 -0
- package/dist/commands/router.js +174 -0
- package/dist/commands/router.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +198 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +71 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/rest.d.ts +3 -0
- package/dist/mcp/rest.js +98 -0
- package/dist/mcp/rest.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.js +419 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/sse.d.ts +2 -0
- package/dist/mcp/sse.js +43 -0
- package/dist/mcp/sse.js.map +1 -0
- package/dist/mcp/sync-tools.d.ts +5 -0
- package/dist/mcp/sync-tools.js +124 -0
- package/dist/mcp/sync-tools.js.map +1 -0
- package/dist/nodes/manager.d.ts +28 -0
- package/dist/nodes/manager.js +341 -0
- package/dist/nodes/manager.js.map +1 -0
- package/dist/nodes/realtime.d.ts +13 -0
- package/dist/nodes/realtime.js +46 -0
- package/dist/nodes/realtime.js.map +1 -0
- package/dist/nodes/shell.d.ts +17 -0
- package/dist/nodes/shell.js +137 -0
- package/dist/nodes/shell.js.map +1 -0
- package/dist/nodes/transfer.d.ts +22 -0
- package/dist/nodes/transfer.js +244 -0
- package/dist/nodes/transfer.js.map +1 -0
- package/dist/nodes/tunnel.d.ts +12 -0
- package/dist/nodes/tunnel.js +49 -0
- package/dist/nodes/tunnel.js.map +1 -0
- package/dist/protocol/config.d.ts +9 -0
- package/dist/protocol/config.js +133 -0
- package/dist/protocol/config.js.map +1 -0
- package/dist/protocol/paths.d.ts +3 -0
- package/dist/protocol/paths.js +19 -0
- package/dist/protocol/paths.js.map +1 -0
- package/dist/protocol/types.d.ts +106 -0
- package/dist/protocol/types.js +3 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/sync/db.d.ts +53 -0
- package/dist/sync/db.js +212 -0
- package/dist/sync/db.js.map +1 -0
- package/dist/sync/engine.d.ts +23 -0
- package/dist/sync/engine.js +251 -0
- package/dist/sync/engine.js.map +1 -0
- package/dist/sync/hasher.d.ts +2 -0
- package/dist/sync/hasher.js +25 -0
- package/dist/sync/hasher.js.map +1 -0
- package/dist/sync/index.d.ts +6 -0
- package/dist/sync/index.js +155 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/manifest.d.ts +4 -0
- package/dist/sync/manifest.js +105 -0
- package/dist/sync/manifest.js.map +1 -0
- package/dist/sync/memory-bridge.d.ts +7 -0
- package/dist/sync/memory-bridge.js +84 -0
- package/dist/sync/memory-bridge.js.map +1 -0
- package/dist/sync/paths.d.ts +6 -0
- package/dist/sync/paths.js +53 -0
- package/dist/sync/paths.js.map +1 -0
- package/dist/sync/schema.d.ts +2 -0
- package/dist/sync/schema.js +72 -0
- package/dist/sync/schema.js.map +1 -0
- package/dist/sync/types.d.ts +83 -0
- package/dist/sync/types.js +11 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/sync/watcher.d.ts +21 -0
- package/dist/sync/watcher.js +87 -0
- package/dist/sync/watcher.js.map +1 -0
- package/dist/ui/format.d.ts +24 -0
- package/dist/ui/format.js +108 -0
- package/dist/ui/format.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
// OmniWire Built-in Commands — cross-node system operations
|
|
2
|
+
// All remote commands run via SSH2 client.exec() (not child_process)
|
|
3
|
+
import { allNodes, findNode, NODE_ROLES, getDefaultNodeForTask } from '../protocol/config.js';
|
|
4
|
+
import { parseMeshPath } from '../protocol/paths.js';
|
|
5
|
+
import { openBrowser } from './browser.js';
|
|
6
|
+
import { formatTable, nodeColor, dim, bold, red, green, yellow, cyan } from '../ui/format.js';
|
|
7
|
+
let transferEngine = null;
|
|
8
|
+
export function setTransferEngine(engine) {
|
|
9
|
+
transferEngine = engine;
|
|
10
|
+
}
|
|
11
|
+
export async function handleBuiltin(name, args, raw, manager) {
|
|
12
|
+
switch (name) {
|
|
13
|
+
case 'status':
|
|
14
|
+
case 'nodes':
|
|
15
|
+
return cmdStatus(manager);
|
|
16
|
+
case 'ps':
|
|
17
|
+
return cmdPs(args, manager);
|
|
18
|
+
case 'df':
|
|
19
|
+
return cmdDf(manager);
|
|
20
|
+
case 'top':
|
|
21
|
+
return cmdTop(args, manager);
|
|
22
|
+
case 'find':
|
|
23
|
+
return cmdFind(args, manager);
|
|
24
|
+
case 'sync':
|
|
25
|
+
case 'scp':
|
|
26
|
+
return cmdSync(args, manager);
|
|
27
|
+
case 'upload':
|
|
28
|
+
return cmdUpload(args);
|
|
29
|
+
case 'download':
|
|
30
|
+
return cmdDownload(args);
|
|
31
|
+
case 'cat':
|
|
32
|
+
return cmdCat(args);
|
|
33
|
+
case 'write':
|
|
34
|
+
return cmdWrite(args);
|
|
35
|
+
case 'mkdir':
|
|
36
|
+
return cmdMkdir(args);
|
|
37
|
+
case 'reconnect':
|
|
38
|
+
return cmdReconnect(manager);
|
|
39
|
+
case 'remote-exec':
|
|
40
|
+
return cmdRemoteExec(raw, manager);
|
|
41
|
+
case 'browser':
|
|
42
|
+
return cmdBrowser(args, manager);
|
|
43
|
+
case 'docker':
|
|
44
|
+
return cmdDocker(raw, manager);
|
|
45
|
+
case 'tunnel':
|
|
46
|
+
return cmdTunnel();
|
|
47
|
+
case 'help':
|
|
48
|
+
return cmdHelp();
|
|
49
|
+
default:
|
|
50
|
+
return `Unknown builtin: ${name}`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function cmdStatus(manager) {
|
|
54
|
+
const statuses = await manager.getAllStatus();
|
|
55
|
+
const rows = statuses.map((s) => {
|
|
56
|
+
const node = allNodes().find((n) => n.id === s.nodeId);
|
|
57
|
+
const role = NODE_ROLES[s.nodeId] ?? '-';
|
|
58
|
+
const status = s.online ? green('● online') : red('○ offline');
|
|
59
|
+
const latency = s.latencyMs !== null ? `${s.latencyMs}ms` : '-';
|
|
60
|
+
const mem = s.memUsedPct !== null ? `${s.memUsedPct.toFixed(0)}%` : '-';
|
|
61
|
+
const disk = s.diskUsedPct !== null ? `${s.diskUsedPct.toFixed(0)}%` : '-';
|
|
62
|
+
const load = s.loadAvg ?? '-';
|
|
63
|
+
return [
|
|
64
|
+
nodeColor(s.nodeId),
|
|
65
|
+
node?.host ?? '-',
|
|
66
|
+
role,
|
|
67
|
+
status,
|
|
68
|
+
latency,
|
|
69
|
+
load,
|
|
70
|
+
mem,
|
|
71
|
+
disk,
|
|
72
|
+
];
|
|
73
|
+
});
|
|
74
|
+
return formatTable(['Node', 'IP', 'Role', 'Status', 'Latency', 'Load', 'Mem%', 'Disk%'], rows);
|
|
75
|
+
}
|
|
76
|
+
async function cmdPs(args, manager) {
|
|
77
|
+
const filter = args[0] ?? '';
|
|
78
|
+
const cmd = filter
|
|
79
|
+
? `ps aux | head -1; ps aux | grep -iF '${filter.replace(/'/g, "'\\''")}' | grep -v grep | head -15`
|
|
80
|
+
: 'ps aux --sort=-%cpu | head -12';
|
|
81
|
+
const results = await manager.execAll(cmd);
|
|
82
|
+
return formatMultiNodeOutput(results);
|
|
83
|
+
}
|
|
84
|
+
async function cmdDf(manager) {
|
|
85
|
+
const results = await manager.execAll('df -h / /home 2>/dev/null | grep -v tmpfs');
|
|
86
|
+
return formatMultiNodeOutput(results);
|
|
87
|
+
}
|
|
88
|
+
async function cmdTop(args, manager) {
|
|
89
|
+
const n = Math.min(Math.max(parseInt(args[0] ?? '5', 10) || 5, 1), 50);
|
|
90
|
+
const results = await manager.execAll(`echo "=== CPU ===" && ps aux --sort=-%cpu | head -${n + 1} && echo "\\n=== MEM ===" && ps aux --sort=-%mem | head -${n + 1}`);
|
|
91
|
+
return formatMultiNodeOutput(results);
|
|
92
|
+
}
|
|
93
|
+
async function cmdFind(args, manager) {
|
|
94
|
+
if (args.length === 0)
|
|
95
|
+
return red('Usage: @find <pattern> [path]');
|
|
96
|
+
const pattern = args[0].replace(/'/g, "'\\''");
|
|
97
|
+
const searchPath = (args[1] ?? '/').replace(/'/g, "'\\''");
|
|
98
|
+
const results = await manager.execAll(`find '${searchPath}' -name '${pattern}' -type f 2>/dev/null | head -20`);
|
|
99
|
+
return formatMultiNodeOutput(results);
|
|
100
|
+
}
|
|
101
|
+
async function cmdSync(args, manager) {
|
|
102
|
+
if (args.length < 3) {
|
|
103
|
+
return red('Usage: @sync <file> <src-node> <dst-node>');
|
|
104
|
+
}
|
|
105
|
+
const [file, srcId, dstId] = args;
|
|
106
|
+
const src = findNode(srcId);
|
|
107
|
+
const dst = findNode(dstId);
|
|
108
|
+
if (!src)
|
|
109
|
+
return red(`Unknown source node: ${srcId}`);
|
|
110
|
+
if (!dst)
|
|
111
|
+
return red(`Unknown destination node: ${dstId}`);
|
|
112
|
+
// Use fast transfer engine if available
|
|
113
|
+
if (transferEngine) {
|
|
114
|
+
try {
|
|
115
|
+
const result = await transferEngine.transfer(src.id, file, dst.id, file);
|
|
116
|
+
const speed = result.speedMBps.toFixed(1);
|
|
117
|
+
return green(`Synced ${file}: ${src.id} → ${dst.id} via ${result.mode} (${speed} MB/s, ${result.durationMs}ms)`);
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
return red(`Transfer failed: ${e.message}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Fallback to base64 if no transfer engine
|
|
124
|
+
const escapedFile = file.replace(/'/g, "'\\''");
|
|
125
|
+
const readResult = await manager.exec(src.id, `base64 '${escapedFile}'`);
|
|
126
|
+
if (readResult.code !== 0)
|
|
127
|
+
return red(`Failed to read from ${src.id}: ${readResult.stderr}`);
|
|
128
|
+
const writeResult = await manager.exec(dst.id, `base64 -d > '${escapedFile}' << 'OMNIWIRE_EOF'\n${readResult.stdout}\nOMNIWIRE_EOF`);
|
|
129
|
+
if (writeResult.code !== 0)
|
|
130
|
+
return red(`Failed to write to ${dst.id}: ${writeResult.stderr}`);
|
|
131
|
+
return green(`Synced ${file}: ${src.id} -> ${dst.id}`);
|
|
132
|
+
}
|
|
133
|
+
async function cmdUpload(args) {
|
|
134
|
+
if (args.length < 2 || !transferEngine) {
|
|
135
|
+
return yellow('Usage: @upload <local-path> <node>:<remote-path>');
|
|
136
|
+
}
|
|
137
|
+
const [localPath, meshPath] = args;
|
|
138
|
+
const parsed = parseMeshPath(meshPath);
|
|
139
|
+
if (!parsed)
|
|
140
|
+
return red('Invalid destination. Use node:/path format.');
|
|
141
|
+
try {
|
|
142
|
+
const result = await transferEngine.transfer('windows', localPath, parsed.nodeId, parsed.path);
|
|
143
|
+
return green(`Uploaded ${localPath} → ${parsed.nodeId}:${parsed.path} (${result.speedMBps.toFixed(1)} MB/s)`);
|
|
144
|
+
}
|
|
145
|
+
catch (e) {
|
|
146
|
+
return red(`Upload failed: ${e.message}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async function cmdDownload(args) {
|
|
150
|
+
if (args.length < 2 || !transferEngine) {
|
|
151
|
+
return yellow('Usage: @download <node>:<remote-path> <local-path>');
|
|
152
|
+
}
|
|
153
|
+
const [meshPath, localPath] = args;
|
|
154
|
+
const parsed = parseMeshPath(meshPath);
|
|
155
|
+
if (!parsed)
|
|
156
|
+
return red('Invalid source. Use node:/path format.');
|
|
157
|
+
try {
|
|
158
|
+
const result = await transferEngine.transfer(parsed.nodeId, parsed.path, 'windows', localPath);
|
|
159
|
+
return green(`Downloaded ${parsed.nodeId}:${parsed.path} → ${localPath} (${result.speedMBps.toFixed(1)} MB/s)`);
|
|
160
|
+
}
|
|
161
|
+
catch (e) {
|
|
162
|
+
return red(`Download failed: ${e.message}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async function cmdCat(args) {
|
|
166
|
+
if (args.length === 0)
|
|
167
|
+
return red('Usage: @cat <node>:<path> or @cat <path> [node]');
|
|
168
|
+
if (!transferEngine)
|
|
169
|
+
return red('Transfer engine not available');
|
|
170
|
+
let nodeId;
|
|
171
|
+
let filePath;
|
|
172
|
+
const parsed = parseMeshPath(args[0]);
|
|
173
|
+
if (parsed) {
|
|
174
|
+
nodeId = parsed.nodeId;
|
|
175
|
+
filePath = parsed.path;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
filePath = args[0];
|
|
179
|
+
nodeId = args[1] ?? getDefaultNodeForTask('storage');
|
|
180
|
+
}
|
|
181
|
+
try {
|
|
182
|
+
const content = await transferEngine.readFile(nodeId, filePath);
|
|
183
|
+
return `${nodeColor(nodeId)} ${dim(filePath)}\n${content}`;
|
|
184
|
+
}
|
|
185
|
+
catch (e) {
|
|
186
|
+
return red(e.message);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async function cmdWrite(args) {
|
|
190
|
+
if (args.length < 2)
|
|
191
|
+
return red('Usage: @write <node>:<path> <content>');
|
|
192
|
+
if (!transferEngine)
|
|
193
|
+
return red('Transfer engine not available');
|
|
194
|
+
const parsed = parseMeshPath(args[0]);
|
|
195
|
+
if (!parsed)
|
|
196
|
+
return red('Invalid path. Use node:/path format.');
|
|
197
|
+
const content = args.slice(1).join(' ');
|
|
198
|
+
try {
|
|
199
|
+
await transferEngine.writeFile(parsed.nodeId, parsed.path, content);
|
|
200
|
+
return green(`Written to ${parsed.nodeId}:${parsed.path}`);
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
return red(e.message);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async function cmdMkdir(args) {
|
|
207
|
+
if (args.length === 0)
|
|
208
|
+
return red('Usage: @mkdir <node>:<path>');
|
|
209
|
+
if (!transferEngine)
|
|
210
|
+
return red('Transfer engine not available');
|
|
211
|
+
const parsed = parseMeshPath(args[0]);
|
|
212
|
+
if (!parsed)
|
|
213
|
+
return red('Invalid path. Use node:/path format.');
|
|
214
|
+
try {
|
|
215
|
+
await transferEngine.mkdir(parsed.nodeId, parsed.path);
|
|
216
|
+
return green(`Created ${parsed.nodeId}:${parsed.path}`);
|
|
217
|
+
}
|
|
218
|
+
catch (e) {
|
|
219
|
+
return red(e.message);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
async function cmdBrowser(args, manager) {
|
|
223
|
+
if (args.length === 0)
|
|
224
|
+
return red('Usage: @browser <url> [node]');
|
|
225
|
+
return openBrowser(manager, args[0], args[1]);
|
|
226
|
+
}
|
|
227
|
+
async function cmdDocker(raw, manager) {
|
|
228
|
+
const dockerCmd = raw.trim();
|
|
229
|
+
if (!dockerCmd)
|
|
230
|
+
return red('Usage: @docker <command>');
|
|
231
|
+
const nodeId = getDefaultNodeForTask('storage');
|
|
232
|
+
const result = await manager.exec(nodeId, `docker ${dockerCmd}`);
|
|
233
|
+
return `${nodeColor(nodeId)} docker ${dockerCmd}\n${result.code === 0 ? result.stdout : red(result.stderr)}`;
|
|
234
|
+
}
|
|
235
|
+
function cmdTunnel() {
|
|
236
|
+
return yellow('Tunnel management available via MCP tools. Use @claude for tunnel operations.');
|
|
237
|
+
}
|
|
238
|
+
async function cmdReconnect(manager) {
|
|
239
|
+
manager.disconnect();
|
|
240
|
+
await manager.connectAll();
|
|
241
|
+
const online = manager.getOnlineNodes();
|
|
242
|
+
return green(`Reconnected. Online: ${online.join(', ')}`);
|
|
243
|
+
}
|
|
244
|
+
async function cmdRemoteExec(raw, manager) {
|
|
245
|
+
const results = await manager.execRemote(raw);
|
|
246
|
+
return formatMultiNodeOutput(results);
|
|
247
|
+
}
|
|
248
|
+
function cmdHelp() {
|
|
249
|
+
return `
|
|
250
|
+
${bold('OmniWire Terminal v2.0 — Command Reference')}
|
|
251
|
+
|
|
252
|
+
${cyan('Targeting:')}
|
|
253
|
+
${dim('(no prefix)')} Execute on local machine
|
|
254
|
+
${cyan('@node')} cmd Execute on specific node by id or alias
|
|
255
|
+
${cyan('@alias')} cmd Use node alias (see @status for aliases)
|
|
256
|
+
${cyan('@all')} cmd Broadcast to ALL nodes simultaneously
|
|
257
|
+
${cyan('@remote')} cmd Execute on all remote nodes (skip local)
|
|
258
|
+
|
|
259
|
+
${cyan('AI Integration:')}
|
|
260
|
+
${cyan('@claude')} prompt Ask Claude to orchestrate mesh operations
|
|
261
|
+
${cyan('@ai')} prompt Same as @claude
|
|
262
|
+
|
|
263
|
+
${cyan('System Commands:')}
|
|
264
|
+
${cyan('@status')} Node health + resources (with roles)
|
|
265
|
+
${cyan('@ps')} [filter] Cross-node process listing
|
|
266
|
+
${cyan('@df')} Disk usage across all nodes
|
|
267
|
+
${cyan('@top')} [n] Top CPU/mem consumers per node
|
|
268
|
+
${cyan('@find')} pat [dir] Search files across all nodes
|
|
269
|
+
${cyan('@reconnect')} Reconnect all SSH sessions
|
|
270
|
+
|
|
271
|
+
${cyan('File Operations (v2):')}
|
|
272
|
+
${cyan('@sync')} f src dst Fast transfer between nodes (nc/tar, aria2c)
|
|
273
|
+
${cyan('@upload')} f n:p Upload local file to node
|
|
274
|
+
${cyan('@download')} n:p f Download file from node
|
|
275
|
+
${cyan('@cat')} n:/path Read file from any node
|
|
276
|
+
${cyan('@write')} n:p text Write file to any node
|
|
277
|
+
${cyan('@mkdir')} n:/path Create directory on node
|
|
278
|
+
|
|
279
|
+
${cyan('Services & Control:')}
|
|
280
|
+
${cyan('@browser')} url Open URL on GPU/browser node
|
|
281
|
+
${cyan('@docker')} cmd Run docker command on default storage node
|
|
282
|
+
${cyan('@shell')} node Enter persistent interactive shell (Ctrl+] to exit)
|
|
283
|
+
${cyan('@kernel')} n cmd Kernel operations (dmesg, sysctl, modprobe)
|
|
284
|
+
${cyan('@stream')} n cmd Real-time streaming output (tail -f, watch)
|
|
285
|
+
|
|
286
|
+
${cyan('MCP Server:')}
|
|
287
|
+
22 tools available via MCP (Claude Code, OpenCode, etc.)
|
|
288
|
+
Start: ${dim('node dist/mcp/index.js --stdio')}
|
|
289
|
+
SSE: ${dim('node dist/mcp/index.js')} (port 3200)
|
|
290
|
+
REST: ${dim('localhost:3201/api/*')}
|
|
291
|
+
|
|
292
|
+
${cyan('Shortcuts:')}
|
|
293
|
+
Ctrl+C Cancel current command
|
|
294
|
+
Ctrl+D / exit Quit OmniWire Terminal
|
|
295
|
+
@clear Clear screen
|
|
296
|
+
`;
|
|
297
|
+
}
|
|
298
|
+
function formatMultiNodeOutput(results) {
|
|
299
|
+
return results
|
|
300
|
+
.map((r) => {
|
|
301
|
+
const header = `${nodeColor(r.nodeId)} ${dim(`(${r.durationMs}ms)`)}`;
|
|
302
|
+
const output = r.code === 0
|
|
303
|
+
? r.stdout || dim('(no output)')
|
|
304
|
+
: red(r.stderr || `exit code ${r.code}`);
|
|
305
|
+
return `${header}\n${output}`;
|
|
306
|
+
})
|
|
307
|
+
.join('\n\n');
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=builtins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../src/commands/builtins.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,qEAAqE;AAKrE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE9F,IAAI,cAAc,GAA0B,IAAI,CAAC;AAEjD,MAAM,UAAU,iBAAiB,CAAC,MAAsB;IACtD,cAAc,GAAG,MAAM,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,IAAc,EACd,GAAW,EACX,OAAoB;IAEpB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACV,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5B,KAAK,IAAI;YACP,OAAO,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9B,KAAK,IAAI;YACP,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC;QACxB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/B,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChC,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK;YACR,OAAO,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChC,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,UAAU;YACb,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,KAAK,WAAW;YACd,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;QAC/B,KAAK,aAAa;YAChB,OAAO,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACrC,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACjC,KAAK,QAAQ;YACX,OAAO,SAAS,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,OAAO,EAAE,CAAC;QACnB;YACE,OAAO,oBAAoB,IAAI,EAAE,CAAC;IACtC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAoB;IAC3C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;QACzC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAChE,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACxE,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC3E,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC;QAC9B,OAAO;YACL,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,IAAI,IAAI,GAAG;YACjB,IAAI;YACJ,MAAM;YACN,OAAO;YACP,IAAI;YACJ,GAAG;YACH,IAAI;SACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAChB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EACpE,IAAI,CACL,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,IAAc,EAAE,OAAoB;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,MAAM;QAChB,CAAC,CAAC,wCAAwC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,6BAA6B;QACpG,CAAC,CAAC,gCAAgC,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,OAAoB;IACvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;IACnF,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,OAAoB;IACxD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CACnC,qDAAqD,CAAC,GAAG,CAAC,4DAA4D,CAAC,GAAG,CAAC,EAAE,CAC9H,CAAC;IACF,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAAc,EAAE,OAAoB;IACzD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CACnC,SAAS,UAAU,YAAY,OAAO,kCAAkC,CACzE,CAAC;IACF,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAAc,EAAE,OAAoB;IACzD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;IAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;IAE3D,wCAAwC;IACxC,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACzE,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1C,OAAO,KAAK,CAAC,UAAU,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,QAAQ,MAAM,CAAC,IAAI,KAAK,KAAK,UAAU,MAAM,CAAC,UAAU,KAAK,CAAC,CAAC;QACnH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,GAAG,CAAC,oBAAqB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,WAAW,GAAG,CAAC,CAAC;IACzE,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,uBAAuB,GAAG,CAAC,EAAE,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAE7F,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CACpC,GAAG,CAAC,EAAE,EACN,gBAAgB,WAAW,wBAAwB,UAAU,CAAC,MAAM,gBAAgB,CACrF,CAAC;IACF,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,sBAAsB,GAAG,CAAC,EAAE,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAE9F,OAAO,KAAK,CAAC,UAAU,IAAI,KAAK,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAc;IACrC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,kDAAkD,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAEvE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/F,OAAO,KAAK,CAAC,YAAY,SAAS,MAAM,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAChH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,kBAAmB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAc;IACvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,oDAAoD,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAElE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/F,OAAO,KAAK,CAAC,cAAc,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM,SAAS,KAAK,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAC,oBAAqB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAc;IAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,iDAAiD,CAAC,CAAC;IACrF,IAAI,CAAC,cAAc;QAAE,OAAO,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAEjE,IAAI,MAAc,CAAC;IACnB,IAAI,QAAgB,CAAC;IAErB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACvB,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChE,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,OAAO,EAAE,CAAC;IAC7D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAc;IACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACzE,IAAI,CAAC,cAAc;QAAE,OAAO,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAEjE,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAEhE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpE,OAAO,KAAK,CAAC,cAAc,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAc;IACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,6BAA6B,CAAC,CAAC;IACjE,IAAI,CAAC,cAAc;QAAE,OAAO,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAEjE,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC,WAAW,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAc,EAAE,OAAoB;IAC5D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAClE,OAAO,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,OAAoB;IACxD,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,SAAS;QAAE,OAAO,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,SAAS,EAAE,CAAC,CAAC;IACjE,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,SAAS,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/G,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,MAAM,CAAC,+EAA+E,CAAC,CAAC;AACjG,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAoB;IAC9C,OAAO,CAAC,UAAU,EAAE,CAAC;IACrB,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IACxC,OAAO,KAAK,CAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,OAAoB;IAC5D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9C,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,OAAO;IACd,OAAO;EACP,IAAI,CAAC,4CAA4C,CAAC;;EAElD,IAAI,CAAC,YAAY,CAAC;IAChB,GAAG,CAAC,aAAa,CAAC;IAClB,IAAI,CAAC,OAAO,CAAC;IACb,IAAI,CAAC,QAAQ,CAAC;IACd,IAAI,CAAC,MAAM,CAAC;IACZ,IAAI,CAAC,SAAS,CAAC;;EAEjB,IAAI,CAAC,iBAAiB,CAAC;IACrB,IAAI,CAAC,SAAS,CAAC;IACf,IAAI,CAAC,KAAK,CAAC;;EAEb,IAAI,CAAC,kBAAkB,CAAC;IACtB,IAAI,CAAC,SAAS,CAAC;IACf,IAAI,CAAC,KAAK,CAAC;IACX,IAAI,CAAC,KAAK,CAAC;IACX,IAAI,CAAC,MAAM,CAAC;IACZ,IAAI,CAAC,OAAO,CAAC;IACb,IAAI,CAAC,YAAY,CAAC;;EAEpB,IAAI,CAAC,uBAAuB,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC;IACb,IAAI,CAAC,SAAS,CAAC;IACf,IAAI,CAAC,WAAW,CAAC;IACjB,IAAI,CAAC,MAAM,CAAC;IACZ,IAAI,CAAC,QAAQ,CAAC;IACd,IAAI,CAAC,QAAQ,CAAC;;EAEhB,IAAI,CAAC,qBAAqB,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC;IAChB,IAAI,CAAC,SAAS,CAAC;IACf,IAAI,CAAC,QAAQ,CAAC;IACd,IAAI,CAAC,SAAS,CAAC;IACf,IAAI,CAAC,SAAS,CAAC;;EAEjB,IAAI,CAAC,aAAa,CAAC;;WAEV,GAAG,CAAC,gCAAgC,CAAC;WACrC,GAAG,CAAC,wBAAwB,CAAC;WAC7B,GAAG,CAAC,sBAAsB,CAAC;;EAEpC,IAAI,CAAC,YAAY,CAAC;;;;CAInB,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAqB;IAClD,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC;YACzB,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,aAAa,CAAC;YAChC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3C,OAAO,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC;IAChC,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// OmniWire Command Router — parse and route commands to mesh nodes
|
|
2
|
+
import { findNode } from '../protocol/config.js';
|
|
3
|
+
const BUILTIN_COMMANDS = new Set([
|
|
4
|
+
'status', 'nodes', 'ps', 'df', 'top', 'sync', 'find',
|
|
5
|
+
'help', 'exit', 'quit', 'clear', 'history', 'reconnect',
|
|
6
|
+
'scp', 'upload', 'download', 'tunnel', 'proxy',
|
|
7
|
+
'browser', 'docker', 'cat', 'write', 'mkdir',
|
|
8
|
+
]);
|
|
9
|
+
export function parseCommand(input) {
|
|
10
|
+
const trimmed = input.trim();
|
|
11
|
+
if (!trimmed) {
|
|
12
|
+
return { target: { type: 'local' }, command: '', args: [], raw: '' };
|
|
13
|
+
}
|
|
14
|
+
// @shell <node> — enter interactive shell
|
|
15
|
+
if (trimmed.startsWith('@shell ')) {
|
|
16
|
+
const nodeQuery = trimmed.slice(7).trim();
|
|
17
|
+
const node = findNode(nodeQuery);
|
|
18
|
+
if (node) {
|
|
19
|
+
return {
|
|
20
|
+
target: { type: 'shell', nodeId: node.id },
|
|
21
|
+
command: 'shell',
|
|
22
|
+
args: [],
|
|
23
|
+
raw: trimmed,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// @kernel <node> <command> — kernel-level operations
|
|
28
|
+
if (trimmed.startsWith('@kernel ')) {
|
|
29
|
+
const rest = trimmed.slice(8).trim();
|
|
30
|
+
const spaceIdx = rest.indexOf(' ');
|
|
31
|
+
if (spaceIdx > 0) {
|
|
32
|
+
const nodeQuery = rest.slice(0, spaceIdx);
|
|
33
|
+
const cmd = rest.slice(spaceIdx + 1);
|
|
34
|
+
const node = findNode(nodeQuery);
|
|
35
|
+
if (node) {
|
|
36
|
+
return {
|
|
37
|
+
target: { type: 'kernel', nodeId: node.id },
|
|
38
|
+
command: cmd,
|
|
39
|
+
args: splitArgs(cmd),
|
|
40
|
+
raw: cmd,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// @stream <node> <command> — real-time streaming output
|
|
46
|
+
if (trimmed.startsWith('@stream ')) {
|
|
47
|
+
const rest = trimmed.slice(8).trim();
|
|
48
|
+
const spaceIdx = rest.indexOf(' ');
|
|
49
|
+
if (spaceIdx > 0) {
|
|
50
|
+
const nodeQuery = rest.slice(0, spaceIdx);
|
|
51
|
+
const cmd = rest.slice(spaceIdx + 1);
|
|
52
|
+
const node = findNode(nodeQuery);
|
|
53
|
+
if (node) {
|
|
54
|
+
return {
|
|
55
|
+
target: { type: 'stream', nodeId: node.id },
|
|
56
|
+
command: cmd,
|
|
57
|
+
args: splitArgs(cmd),
|
|
58
|
+
raw: cmd,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// @claude <prompt> — AI-routed command
|
|
64
|
+
if (trimmed.startsWith('@claude ') || trimmed.startsWith('@ai ')) {
|
|
65
|
+
const prompt = trimmed.replace(/^@(claude|ai)\s+/, '');
|
|
66
|
+
return {
|
|
67
|
+
target: { type: 'claude', prompt },
|
|
68
|
+
command: 'claude',
|
|
69
|
+
args: [prompt],
|
|
70
|
+
raw: trimmed,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// @all <command> — broadcast to all nodes
|
|
74
|
+
if (trimmed.startsWith('@all ') || trimmed.startsWith('@* ')) {
|
|
75
|
+
const cmd = trimmed.replace(/^@(all|\*)\s+/, '');
|
|
76
|
+
const parts = splitArgs(cmd);
|
|
77
|
+
return {
|
|
78
|
+
target: { type: 'all' },
|
|
79
|
+
command: parts[0],
|
|
80
|
+
args: parts.slice(1),
|
|
81
|
+
raw: cmd,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// @remote <command> — all remote nodes only
|
|
85
|
+
if (trimmed.startsWith('@remote ')) {
|
|
86
|
+
const cmd = trimmed.replace(/^@remote\s+/, '');
|
|
87
|
+
const parts = splitArgs(cmd);
|
|
88
|
+
return {
|
|
89
|
+
target: { type: 'builtin', name: 'remote-exec' },
|
|
90
|
+
command: parts[0],
|
|
91
|
+
args: parts.slice(1),
|
|
92
|
+
raw: cmd,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// @<node> <command> — target specific node
|
|
96
|
+
if (trimmed.startsWith('@')) {
|
|
97
|
+
const spaceIdx = trimmed.indexOf(' ');
|
|
98
|
+
if (spaceIdx > 0) {
|
|
99
|
+
const nodeQuery = trimmed.slice(1, spaceIdx);
|
|
100
|
+
const cmd = trimmed.slice(spaceIdx + 1);
|
|
101
|
+
// Check if it's a builtin command
|
|
102
|
+
if (BUILTIN_COMMANDS.has(nodeQuery)) {
|
|
103
|
+
return {
|
|
104
|
+
target: { type: 'builtin', name: nodeQuery },
|
|
105
|
+
command: nodeQuery,
|
|
106
|
+
args: splitArgs(cmd),
|
|
107
|
+
raw: cmd,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// Check if it's a node reference
|
|
111
|
+
const node = findNode(nodeQuery);
|
|
112
|
+
if (node) {
|
|
113
|
+
const parts = splitArgs(cmd);
|
|
114
|
+
return {
|
|
115
|
+
target: { type: 'node', nodeId: node.id },
|
|
116
|
+
command: parts[0],
|
|
117
|
+
args: parts.slice(1),
|
|
118
|
+
raw: cmd,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// @builtin with no args
|
|
123
|
+
const name = trimmed.slice(1);
|
|
124
|
+
if (BUILTIN_COMMANDS.has(name)) {
|
|
125
|
+
return {
|
|
126
|
+
target: { type: 'builtin', name },
|
|
127
|
+
command: name,
|
|
128
|
+
args: [],
|
|
129
|
+
raw: '',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Plain command — execute locally
|
|
134
|
+
const parts = splitArgs(trimmed);
|
|
135
|
+
return {
|
|
136
|
+
target: { type: 'local' },
|
|
137
|
+
command: parts[0],
|
|
138
|
+
args: parts.slice(1),
|
|
139
|
+
raw: trimmed,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function splitArgs(cmd) {
|
|
143
|
+
const args = [];
|
|
144
|
+
let current = '';
|
|
145
|
+
let inQuote = false;
|
|
146
|
+
let quoteChar = '';
|
|
147
|
+
for (const ch of cmd) {
|
|
148
|
+
if (inQuote) {
|
|
149
|
+
if (ch === quoteChar) {
|
|
150
|
+
inQuote = false;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
current += ch;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else if (ch === '"' || ch === "'") {
|
|
157
|
+
inQuote = true;
|
|
158
|
+
quoteChar = ch;
|
|
159
|
+
}
|
|
160
|
+
else if (ch === ' ') {
|
|
161
|
+
if (current) {
|
|
162
|
+
args.push(current);
|
|
163
|
+
current = '';
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
current += ch;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (current)
|
|
171
|
+
args.push(current);
|
|
172
|
+
return args;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/commands/router.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED