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.
Files changed (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +316 -0
  3. package/dist/claude/integration.d.ts +12 -0
  4. package/dist/claude/integration.js +157 -0
  5. package/dist/claude/integration.js.map +1 -0
  6. package/dist/commands/browser.d.ts +2 -0
  7. package/dist/commands/browser.js +23 -0
  8. package/dist/commands/browser.js.map +1 -0
  9. package/dist/commands/builtins.d.ts +4 -0
  10. package/dist/commands/builtins.js +309 -0
  11. package/dist/commands/builtins.js.map +1 -0
  12. package/dist/commands/router.d.ts +2 -0
  13. package/dist/commands/router.js +174 -0
  14. package/dist/commands/router.js.map +1 -0
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.js +198 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/mcp/index.d.ts +2 -0
  19. package/dist/mcp/index.js +71 -0
  20. package/dist/mcp/index.js.map +1 -0
  21. package/dist/mcp/rest.d.ts +3 -0
  22. package/dist/mcp/rest.js +98 -0
  23. package/dist/mcp/rest.js.map +1 -0
  24. package/dist/mcp/server.d.ts +4 -0
  25. package/dist/mcp/server.js +419 -0
  26. package/dist/mcp/server.js.map +1 -0
  27. package/dist/mcp/sse.d.ts +2 -0
  28. package/dist/mcp/sse.js +43 -0
  29. package/dist/mcp/sse.js.map +1 -0
  30. package/dist/mcp/sync-tools.d.ts +5 -0
  31. package/dist/mcp/sync-tools.js +124 -0
  32. package/dist/mcp/sync-tools.js.map +1 -0
  33. package/dist/nodes/manager.d.ts +28 -0
  34. package/dist/nodes/manager.js +341 -0
  35. package/dist/nodes/manager.js.map +1 -0
  36. package/dist/nodes/realtime.d.ts +13 -0
  37. package/dist/nodes/realtime.js +46 -0
  38. package/dist/nodes/realtime.js.map +1 -0
  39. package/dist/nodes/shell.d.ts +17 -0
  40. package/dist/nodes/shell.js +137 -0
  41. package/dist/nodes/shell.js.map +1 -0
  42. package/dist/nodes/transfer.d.ts +22 -0
  43. package/dist/nodes/transfer.js +244 -0
  44. package/dist/nodes/transfer.js.map +1 -0
  45. package/dist/nodes/tunnel.d.ts +12 -0
  46. package/dist/nodes/tunnel.js +49 -0
  47. package/dist/nodes/tunnel.js.map +1 -0
  48. package/dist/protocol/config.d.ts +9 -0
  49. package/dist/protocol/config.js +133 -0
  50. package/dist/protocol/config.js.map +1 -0
  51. package/dist/protocol/paths.d.ts +3 -0
  52. package/dist/protocol/paths.js +19 -0
  53. package/dist/protocol/paths.js.map +1 -0
  54. package/dist/protocol/types.d.ts +106 -0
  55. package/dist/protocol/types.js +3 -0
  56. package/dist/protocol/types.js.map +1 -0
  57. package/dist/sync/db.d.ts +53 -0
  58. package/dist/sync/db.js +212 -0
  59. package/dist/sync/db.js.map +1 -0
  60. package/dist/sync/engine.d.ts +23 -0
  61. package/dist/sync/engine.js +251 -0
  62. package/dist/sync/engine.js.map +1 -0
  63. package/dist/sync/hasher.d.ts +2 -0
  64. package/dist/sync/hasher.js +25 -0
  65. package/dist/sync/hasher.js.map +1 -0
  66. package/dist/sync/index.d.ts +6 -0
  67. package/dist/sync/index.js +155 -0
  68. package/dist/sync/index.js.map +1 -0
  69. package/dist/sync/manifest.d.ts +4 -0
  70. package/dist/sync/manifest.js +105 -0
  71. package/dist/sync/manifest.js.map +1 -0
  72. package/dist/sync/memory-bridge.d.ts +7 -0
  73. package/dist/sync/memory-bridge.js +84 -0
  74. package/dist/sync/memory-bridge.js.map +1 -0
  75. package/dist/sync/paths.d.ts +6 -0
  76. package/dist/sync/paths.js +53 -0
  77. package/dist/sync/paths.js.map +1 -0
  78. package/dist/sync/schema.d.ts +2 -0
  79. package/dist/sync/schema.js +72 -0
  80. package/dist/sync/schema.js.map +1 -0
  81. package/dist/sync/types.d.ts +83 -0
  82. package/dist/sync/types.js +11 -0
  83. package/dist/sync/types.js.map +1 -0
  84. package/dist/sync/watcher.d.ts +21 -0
  85. package/dist/sync/watcher.js +87 -0
  86. package/dist/sync/watcher.js.map +1 -0
  87. package/dist/ui/format.d.ts +24 -0
  88. package/dist/ui/format.js +108 -0
  89. package/dist/ui/format.js.map +1 -0
  90. 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":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ParsedCommand } from '../protocol/types.js';
2
+ export declare function parseCommand(input: string): ParsedCommand;
@@ -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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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};