navada-edge-cli 2.1.0 → 2.2.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/README.md CHANGED
@@ -1,145 +1,285 @@
1
1
  # navada-edge-cli
2
2
 
3
- Interactive CLI for the **NAVADA Edge Network**. Explore nodes, Cloudflare, AI services, Docker registry, MCP tools, and Postgres — all from your terminal.
3
+ An AI-powered terminal agent for the **NAVADA Edge Network**. Full computer access, distributed infrastructure control, and conversational AI — all from your terminal.
4
4
 
5
- ```
5
+ ```bash
6
6
  npm install -g navada-edge-cli
7
7
  ```
8
8
 
9
+ ```
10
+ ╭─────────────────────────────────────────────────────────╮
11
+ │ ███╗ ██╗ █████╗ ██╗ ██╗ █████╗ ██████╗ █████╗ │
12
+ │ ██╔██╗ ██║███████║██║ ██║███████║██║ ██║███████║ │
13
+ │ ██║ ╚████║██║ ██║ ╚████╔╝ ██║ ██║██████╔╝██║ ██║ │
14
+ │ E D G E N E T W O R K v2.1.1 │
15
+ ╰─────────────────────────────────────────────────────────╯
16
+ ```
17
+
18
+ ## What is this?
19
+
20
+ NAVADA Edge CLI is a **conversational AI agent** that runs in your terminal. It has full access to your local machine (files, shell, processes) and connects to the NAVADA Edge Network — a distributed infrastructure spanning 4 physical nodes, Cloudflare, Azure, and AI services.
21
+
22
+ **Just type naturally.** No commands needed.
23
+
24
+ ```
25
+ navada> what images are in the docker registry?
26
+ [docker_registry] {}
27
+
28
+ NAVADA
29
+ The private registry contains: my-api, navada-command-dashboard,
30
+ navada-edge-mcp, navada-opencode-serve, navada-opencode-server.
31
+ ```
32
+
33
+ ```
34
+ navada> check disk space on EC2
35
+ [lucas_ssh] {"node":"ec2","command":"df -h"}
36
+
37
+ NAVADA
38
+ EC2 disk usage: 45% used (12G/26G). /dev/xvda1 mounted at /.
39
+ ```
40
+
41
+ ```
42
+ navada> create a file called hello.txt with "Hello from NAVADA"
43
+ [write_file] {"path":"hello.txt","content":"Hello from NAVADA"}
44
+
45
+ NAVADA
46
+ ✓ Written: /Users/you/hello.txt
47
+ ```
48
+
9
49
  ## Network Architecture
10
50
 
11
- ![NAVADA Edge Network](https://cdn.jsdelivr.net/npm/navada-edge-sdk@1.1.0/network.svg)
51
+ ![NAVADA Edge Network](https://cdn.jsdelivr.net/npm/navada-edge-sdk@1.2.0/network.svg)
12
52
 
13
53
  ## Quick Start
14
54
 
15
55
  ```bash
16
- # Launch interactive mode
56
+ # Install
57
+ npm install -g navada-edge-cli
58
+
59
+ # Start the CLI
17
60
  navada
18
61
 
19
- # Or run commands directly
20
- navada status
21
- navada mcp tools
22
- navada registry
23
- navada chat "What is ISA allowance for 2026?"
62
+ # Login with your API key (Anthropic recommended for full agent mode)
63
+ /login sk-ant-your-key-here
64
+
65
+ # Start talking
66
+ hello, what can you do?
24
67
  ```
25
68
 
26
- ## Setup
69
+ The CLI accepts **any** API key:
27
70
 
28
- ```bash
29
- # Install globally
30
- npm install -g navada-edge-cli
71
+ | Key Type | Prefix | What You Get |
72
+ |----------|--------|-------------|
73
+ | **Anthropic** | `sk-ant-...` | Full agent with tool use — recommended |
74
+ | **OpenAI** | `sk-...` | GPT-4o chat |
75
+ | **HuggingFace** | `hf_...` | Qwen Coder (FREE) |
76
+ | **NAVADA Edge** | `nv_edge_...` | MCP server access + all network tools |
31
77
 
32
- # Set your API key
33
- navada login <your-api-key>
78
+ ## Features
34
79
 
35
- # Configure your nodes
36
- navada init asus 10.0.0.1
37
- navada init mcp http://10.0.0.1:8811
38
- navada init dashboard http://10.0.0.1:7900
39
- navada init registry http://10.0.0.1:5000
40
- ```
80
+ ### AI Agent with Tool Use
81
+
82
+ The CLI is powered by Claude Sonnet 4 with 13 tools. It doesn't just answer questions — it **executes tasks**:
41
83
 
42
- Config is saved to `~/.navada/config.json`. You can also use environment variables (see `navada-edge-sdk` docs).
84
+ | Tool | What it does |
85
+ |------|-------------|
86
+ | `shell` | Run any command on your local machine |
87
+ | `read_file` | Read files from your filesystem |
88
+ | `write_file` | Create or modify files |
89
+ | `list_files` | Browse directories |
90
+ | `system_info` | CPU, RAM, disk, hostname, OS |
91
+ | `network_status` | Ping all NAVADA Edge nodes |
92
+ | `lucas_exec` | Run bash on EC2 via Lucas CTO |
93
+ | `lucas_ssh` | SSH to any node via Lucas |
94
+ | `lucas_docker` | Docker exec in remote containers |
95
+ | `mcp_call` | Call any of 18 MCP server tools |
96
+ | `docker_registry` | Query the private Docker registry |
97
+ | `send_email` | Send email via SMTP or MCP |
98
+ | `generate_image` | Generate images (Flux FREE / DALL-E) |
43
99
 
44
- ## Interactive Mode
100
+ ### Two AI Agents
45
101
 
46
- Run `navada` with no arguments to enter the interactive TUI:
102
+ | Agent | Role | Access |
103
+ |-------|------|--------|
104
+ | **Lucas CTO** | Infrastructure agent on EC2 | bash, SSH, Docker, deploy, file operations |
105
+ | **Claude CoS** | Chief of Staff | Email, image gen, SMS, research, automation |
47
106
 
48
107
  ```
49
- ███╗ ██╗ █████╗ ██╗ ██╗ █████╗ ██████╗ █████╗
50
- ████╗ ██║██╔══██╗██║ ██║██╔══██╗██╔══██╗██╔══██╗
51
- ██╔██╗ ██║███████║██║ ██║███████║██║ ██║███████║
52
- ██║╚██╗██║██╔══██║╚██╗ ██╔╝██╔══██║██║ ██║██╔══██║
53
- ██║ ╚████║██║ ██║ ╚████╔╝ ██║ ██║██████╔╝██║ ██║
54
- ╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝
55
- ─────────────────────────────────────────────────────
56
- E D G E N E T W O R K v1.0.0
57
- ─────────────────────────────────────────────────────
108
+ navada> /agents
109
+ ● Lucas CTO ONLINE (MCP http://100.x.x.x:8820)
110
+ Tools: bash, ssh, docker_exec, deploy, read_file, write_file
58
111
 
59
- navada> /status
60
- ASUS ONLINE (HTTP 200)
61
- ● HP ONLINE (HTTP 401)
62
- EC2 ONLINE (HTTP 401)
63
- ORACLE ONLINE (HTTP 200)
64
- ○ AZURE OFFLINE (unreachable)
65
- ● CLOUDFLARE ONLINE (HTTP 200)
112
+ Claude CoS ONLINE (Dashboard http://100.x.x.x:7900)
113
+ Controls: Telegram, email, SMS, image gen, R2, cost tracking
114
+
115
+ MCP Server ONLINE (http://100.x.x.x:8811)
116
+ Version: 1.0.0
66
117
  ```
67
118
 
68
- ## Commands
119
+ ### 45+ Slash Commands
120
+
121
+ Use `/commands` for direct control, or just type naturally for the AI agent.
69
122
 
70
- ### Network
123
+ **Network**
71
124
  | Command | Description |
72
125
  |---------|-------------|
73
126
  | `/status` | Ping all nodes + cloud services |
74
127
  | `/nodes` | Show node configuration |
75
- | `/dashboard` | Get Command Dashboard status |
76
-
77
- ### MCP
78
- | Command | Description |
79
- |---------|-------------|
80
- | `/mcp tools` | List MCP tools |
81
- | `/mcp call <tool> [json]` | Call an MCP tool |
128
+ | `/doctor` | Validate all connections |
129
+ | `/ping` | Quick all-nodes ping |
130
+ | `/metrics` | CPU/RAM/disk for all nodes |
131
+ | `/health` | Deep health check |
132
+ | `/dashboard` | Command Dashboard status |
82
133
 
83
- ### Lucas CTO
134
+ **Agents**
84
135
  | Command | Description |
85
136
  |---------|-------------|
86
- | `/lucas exec <cmd>` | Run bash on EC2 |
137
+ | `/agents` | Show Lucas CTO + Claude CoS status |
138
+ | `/claude <msg>` | Send message to Claude CoS |
139
+ | `/lucas exec <cmd>` | Run bash on EC2 via Lucas |
87
140
  | `/lucas ssh <node> <cmd>` | SSH to node via Lucas |
88
141
  | `/lucas docker <ctr> <cmd>` | Docker exec via Lucas |
89
- | `/lucas status` | Lucas network status |
142
+ | `/lucas deploy <name> <node>` | Deploy container |
90
143
 
91
- ### Docker
144
+ **Docker**
92
145
  | Command | Description |
93
146
  |---------|-------------|
94
147
  | `/registry` | List images in private registry |
95
148
  | `/registry tags <image>` | List tags for an image |
149
+ | `/deploy <name> <node>` | Deploy container to node |
150
+ | `/logs <container>` | View container logs |
96
151
 
97
- ### Database
152
+ **AI**
98
153
  | Command | Description |
99
154
  |---------|-------------|
100
- | `/db <sql>` | Run a Postgres query |
155
+ | `/chat <msg>` | Chat with NAVADA Edge AI |
156
+ | `/qwen <prompt>` | Qwen Coder 32B (FREE) |
157
+ | `/yolo detect <img>` | Object detection |
158
+ | `/image <prompt>` | Generate image (Flux FREE) |
159
+ | `/image --dalle <prompt>` | Generate with DALL-E 3 |
160
+ | `/model` | Show/set AI model |
161
+ | `/research <query>` | RAG search via MCP |
101
162
 
102
- ### Cloudflare
163
+ **Cloudflare**
103
164
  | Command | Description |
104
165
  |---------|-------------|
105
166
  | `/r2 ls [prefix]` | List R2 objects |
106
- | `/r2 buckets` | List R2 buckets |
107
- | `/r2 upload <key> <file>` | Upload file to R2 |
167
+ | `/r2 upload <key> <file>` | Upload to R2 |
108
168
  | `/dns` | List DNS records |
109
- | `/dns create <type> <name> <content>` | Create DNS record |
169
+ | `/dns create <type> <name> <val>` | Create DNS record |
110
170
  | `/tunnel` | List Cloudflare tunnels |
111
171
  | `/stream` | List Stream videos |
112
172
  | `/flux <prompt>` | Generate image (FREE) |
113
- | `/trace <url>` | Trace through Cloudflare WAF |
173
+ | `/trace <url>` | Trace through WAF |
114
174
 
115
- ### AI
175
+ **Database**
116
176
  | Command | Description |
117
177
  |---------|-------------|
118
- | `/chat <message>` | Chat with GPT-4o |
119
- | `/qwen <prompt>` | Qwen Coder (FREE) |
120
- | `/yolo` | YOLO service status |
121
- | `/yolo detect <image>` | Run object detection |
178
+ | `/db <sql>` | Query Postgres |
122
179
 
123
- ### Azure
180
+ **System**
124
181
  | Command | Description |
125
182
  |---------|-------------|
126
- | `/n8n` | Check n8n health |
127
-
128
- ### System
129
- | Command | Description |
130
- |---------|-------------|
131
- | `/config` | Show current configuration |
132
- | `/login <api-key>` | Set API key |
133
- | `/init <key> <value>` | Set a config value |
183
+ | `/config` | Show all configuration |
184
+ | `/login <key>` | Set API key (auto-detects type) |
185
+ | `/setup` | Guided onboarding wizard |
186
+ | `/theme [name]` | Switch theme (dark/crow/matrix/light) |
187
+ | `/history` | Command history |
188
+ | `/alias <name> <cmd>` | Create shortcut |
189
+ | `/watch <cmd> <sec>` | Repeat command on interval |
190
+ | `/export <file>` | Save output to file |
191
+ | `/pipe` | Copy output to clipboard |
192
+ | `/email <to> <subj> <body>` | Send email (SMTP/MCP) |
193
+ | `/email setup` | Configure SMTP (Hotmail/Gmail/Zoho) |
194
+ | `/serve [port]` | Start mobile HTTP UI |
195
+ | `/version` | Version + tier info |
196
+ | `/upgrade` | Check for updates |
134
197
  | `/clear` | Clear screen |
135
198
  | `/exit` | Exit CLI |
136
199
 
200
+ ### 4 Themes
201
+
202
+ ```
203
+ navada> /theme crow # achromatic, minimal
204
+ navada> /theme matrix # green terminal
205
+ navada> /theme dark # default
206
+ navada> /theme light # blue + white
207
+ ```
208
+
209
+ ### Mobile Access
210
+
211
+ ```
212
+ navada> /serve 7800
213
+ MOBILE SERVER
214
+ Local http://localhost:7800
215
+ Network http://100.x.x.x:7800
216
+ [QR code displayed]
217
+ ```
218
+
219
+ Opens a web UI on your phone — same commands, same network access.
220
+
221
+ ### Email
222
+
223
+ ```bash
224
+ # Configure SMTP (Hotmail, Gmail, Zoho)
225
+ navada> /email setup
226
+
227
+ # Send directly
228
+ navada> /email user@example.com "Subject" "Body text"
229
+
230
+ # Or ask the agent naturally
231
+ navada> email lee the network status report
232
+ ```
233
+
234
+ ### Persistent History
235
+
236
+ Commands survive restarts. Search with `/history docker` to find previous Docker commands.
237
+
238
+ ### Docker
239
+
240
+ ```bash
241
+ # Run in Docker
242
+ docker run -it --env-file .env navada-edge-cli
243
+
244
+ # With mobile access
245
+ docker run -it -p 7800:7800 --env-file .env navada-edge-cli --serve
246
+ ```
247
+
248
+ ## Configuration
249
+
250
+ All config lives in `~/.navada/config.json`. Set values with:
251
+
252
+ ```bash
253
+ navada> /login sk-ant-your-key # API key
254
+ navada> /init asus 100.x.x.x # Node IP
255
+ navada> /init mcp http://x.x.x:8811 # MCP server
256
+ navada> /theme crow # Theme
257
+ navada> /alias s status # Alias
258
+ ```
259
+
260
+ Or use environment variables:
261
+
262
+ ```env
263
+ ANTHROPIC_API_KEY=sk-ant-...
264
+ NAVADA_ASUS=100.x.x.x
265
+ NAVADA_MCP=http://100.x.x.x:8811
266
+ NAVADA_DASHBOARD=http://100.x.x.x:7900
267
+ NAVADA_REGISTRY=http://100.x.x.x:5000
268
+ NAVADA_LUCAS=http://100.x.x.x:8820
269
+ ```
270
+
137
271
  ## NAVADA Edge Ecosystem
138
272
 
139
273
  | Package | Install | Purpose |
140
274
  |---------|---------|---------|
141
- | `navada-edge-sdk` | `npm i navada-edge-sdk` | SDK — use in your Node.js apps |
142
- | `navada-edge-cli` | `npm i -g navada-edge-cli` | CLI — interactive terminal tool |
275
+ | **navada-edge-sdk** | `npm i navada-edge-sdk` | SDK — use in your Node.js apps |
276
+ | **navada-edge-cli** | `npm i -g navada-edge-cli` | CLI — AI agent in your terminal |
277
+ | **MCP Server** | `POST /mcp` | JSON-RPC tool server (18 tools) |
278
+ | **Docker** | `docker pull navada-edge-cli` | Run CLI in a container |
279
+
280
+ ## Telemetry
281
+
282
+ The CLI reports anonymous usage events (install, session start, command counts) to the NAVADA Edge Dashboard for monitoring. No personal data or API keys are transmitted. Telemetry requires a configured dashboard endpoint.
143
283
 
144
284
  ## License
145
285
 
package/lib/agent.js CHANGED
@@ -98,10 +98,19 @@ const localTools = {
98
98
  // Anthropic Claude API — conversational agent
99
99
  // ---------------------------------------------------------------------------
100
100
  async function chat(userMessage, conversationHistory = []) {
101
- const anthropicKey = config.get('anthropicKey') || process.env.ANTHROPIC_API_KEY || '';
101
+ // Smart key detection check all possible locations
102
+ const anthropicKey = config.get('anthropicKey')
103
+ || config.getApiKey() // /setup saves here
104
+ || process.env.ANTHROPIC_API_KEY
105
+ || '';
102
106
 
103
- if (!anthropicKey) {
104
- // Fall back to other providers
107
+ // Auto-detect: if the key starts with sk-ant, it's Anthropic
108
+ const apiKey = config.getApiKey();
109
+ const effectiveKey = anthropicKey
110
+ || (apiKey && apiKey.startsWith('sk-ant') ? apiKey : '')
111
+ || '';
112
+
113
+ if (!effectiveKey) {
105
114
  return fallbackChat(userMessage);
106
115
  }
107
116
 
@@ -179,7 +188,7 @@ async function chat(userMessage, conversationHistory = []) {
179
188
  ];
180
189
 
181
190
  // Call Anthropic API
182
- let response = await callAnthropic(anthropicKey, messages, tools);
191
+ let response = await callAnthropic(effectiveKey, messages, tools);
183
192
 
184
193
  // Handle tool use loop
185
194
  let iterations = 0;
@@ -265,17 +274,30 @@ async function executeTool(name, input) {
265
274
  }
266
275
 
267
276
  async function fallbackChat(msg) {
268
- // Try MCP → Qwen → OpenAI → error
277
+ // Try MCP → Qwen → OpenAI → helpful error
269
278
  if (navada.config.mcp) {
270
- try { return JSON.stringify(await navada.mcp.call('chat', { message: msg })); } catch {}
279
+ try {
280
+ const r = await navada.mcp.call('chat', { message: msg });
281
+ return typeof r === 'object' ? JSON.stringify(r) : r;
282
+ } catch {}
271
283
  }
272
284
  if (navada.config.hfToken) {
273
- try { return await navada.ai.huggingface.qwen(msg); } catch {}
285
+ try {
286
+ const r = await navada.ai.huggingface.qwen(msg);
287
+ return typeof r === 'object' ? JSON.stringify(r) : r;
288
+ } catch {}
274
289
  }
275
290
  if (navada.config.openaiKey) {
276
291
  try { return await navada.ai.openai.chat(msg); } catch {}
277
292
  }
278
- return 'No AI provider configured. Run /setup or set ANTHROPIC_API_KEY.';
293
+ return `I need an API key to chat. Quick fix:
294
+
295
+ /login sk-ant-your-anthropic-key (recommended — enables full agent with tool use)
296
+ /login sk-your-openai-key (GPT-4o)
297
+ /init hfToken hf_your_token (Qwen Coder — FREE)
298
+ /setup (guided wizard)
299
+
300
+ /commands still work without a key — try /help`;
279
301
  }
280
302
 
281
303
  // ---------------------------------------------------------------------------
package/lib/cli.js CHANGED
@@ -85,17 +85,21 @@ async function run(argv) {
85
85
  applyConfig();
86
86
 
87
87
  if (argv.length === 0) {
88
- // Check first run
89
- if (config.isFirstRun()) {
90
- reportTelemetry('install');
91
- const { runSetup } = require('./commands/setup');
92
- await runSetup();
93
- return;
94
- }
95
- // Report session start
96
- reportTelemetry('session_start');
97
- // Interactive mode
88
+ // Report telemetry
89
+ if (config.isFirstRun()) reportTelemetry('install');
90
+ else reportTelemetry('session_start');
91
+
92
+ // Interactive mode — always start. User can /setup if needed.
98
93
  showWelcome();
94
+
95
+ // Hint if no key configured
96
+ const hasKey = config.getApiKey() || config.get('anthropicKey') || process.env.ANTHROPIC_API_KEY;
97
+ if (!hasKey) {
98
+ console.log(ui.warn('No API key set. Type /login <key> or /setup to configure.'));
99
+ console.log(ui.dim('You can still use /commands. Natural chat requires an API key.'));
100
+ console.log('');
101
+ }
102
+
99
103
  startRepl();
100
104
  } else if (argv[0] === '--version' || argv[0] === '-v') {
101
105
  const pkg = require('../package.json');
@@ -9,128 +9,97 @@ function ask(rl, question) {
9
9
  return new Promise(resolve => rl.question(question, resolve));
10
10
  }
11
11
 
12
- async function runSetup() {
13
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
12
+ async function runSetup(fromRepl = false) {
13
+ // Create a fresh readline don't conflict with the REPL
14
+ const rl = readline.createInterface({
15
+ input: process.stdin,
16
+ output: process.stdout,
17
+ terminal: true,
18
+ });
14
19
 
15
- console.log(ui.banner());
16
- console.log(ui.box('WELCOME', ' First-time setup. Let\'s connect you to the NAVADA Edge Network.'));
17
20
  console.log('');
18
-
19
- // 1. API Key
20
- const apiKey = await ask(rl, ' Enter your NAVADA Edge API key (or press Enter for FREE tier): ');
21
- if (apiKey.trim()) {
22
- config.setApiKey(apiKey.trim());
23
- navada.init({ mcpApiKey: apiKey.trim(), dashboardApiKey: apiKey.trim() });
24
- console.log(ui.success('API key saved'));
25
- } else {
26
- console.log(ui.dim('Continuing with FREE tier'));
27
- }
21
+ console.log(ui.box('SETUP', ' Configure your NAVADA Edge CLI.'));
28
22
  console.log('');
29
23
 
30
- // 2. Auto-detect network
31
- console.log(ui.dim('Scanning for NAVADA Edge nodes...'));
32
- // Ask for primary node IP to scan from
33
- const scanIp = await ask(rl, ' Enter your primary node IP to scan (or press Enter to skip): ');
34
- const defaultIps = {};
35
- if (scanIp.trim()) {
36
- defaultIps.asus = scanIp.trim();
37
- }
24
+ // 1. API Key — the only required thing
25
+ console.log(ui.dim(' Your API key powers the AI agent. Accepts:'));
26
+ console.log(ui.dim(' - Anthropic key (sk-ant-...)'));
27
+ console.log(ui.dim(' - NAVADA Edge API key (nv_edge_...)'));
28
+ console.log(ui.dim(' - OpenAI key (sk-...)'));
29
+ console.log(ui.dim(' - Or press Enter to skip (limited mode)'));
30
+ console.log('');
38
31
 
39
- let detected = {};
40
- for (const [node, ip] of Object.entries(defaultIps)) {
41
- try {
42
- const port = node === 'oracle' ? 9000 : 3200;
43
- await navada.request(`http://${ip}:${port}/`, { timeout: 3000 });
44
- detected[node] = ip;
45
- console.log(ui.online(node.toUpperCase(), true, ip));
46
- } catch {
47
- console.log(ui.online(node.toUpperCase(), false, 'not found'));
32
+ const apiKey = await ask(rl, ' API key: ');
33
+ if (apiKey.trim()) {
34
+ const key = apiKey.trim();
35
+ config.setApiKey(key);
36
+ // Auto-detect key type and save to right field
37
+ if (key.startsWith('sk-ant')) {
38
+ config.set('anthropicKey', key);
39
+ console.log(ui.success('Anthropic key saved — full agent mode enabled'));
40
+ } else if (key.startsWith('nv_edge')) {
41
+ console.log(ui.success('NAVADA Edge key saved — MCP access enabled'));
42
+ } else if (key.startsWith('sk-')) {
43
+ config.set('openaiKey', key);
44
+ navada.init({ openaiKey: key });
45
+ console.log(ui.success('OpenAI key saved'));
46
+ } else {
47
+ console.log(ui.success('Key saved'));
48
48
  }
49
+ } else {
50
+ console.log(ui.dim('Skipped — you can set this later with /login <key>'));
49
51
  }
50
52
  console.log('');
51
53
 
52
- // 3. Confirm or enter manually
53
- if (Object.keys(detected).length > 0) {
54
- const useDetected = await ask(rl, ' Use detected nodes? (Y/n): ');
55
- if (useDetected.toLowerCase() !== 'n') {
56
- for (const [node, ip] of Object.entries(detected)) {
57
- config.set(node, ip);
58
- }
59
- // Auto-derive service URLs from ASUS
60
- if (detected.asus) {
61
- config.set('mcp', `http://${detected.asus}:8811`);
62
- config.set('dashboard', `http://${detected.asus}:7900`);
63
- config.set('registry', `http://${detected.asus}:5000`);
64
- navada.init({
65
- asus: detected.asus, hp: detected.hp || '', ec2: detected.ec2 || '', oracle: detected.oracle || '',
66
- mcp: `http://${detected.asus}:8811`, dashboard: `http://${detected.asus}:7900`, registry: `http://${detected.asus}:5000`,
67
- });
68
- }
69
- if (detected.ec2) {
70
- config.set('lucas', `http://${detected.ec2}:8820`);
71
- navada.init({ lucas: `http://${detected.ec2}:8820` });
72
- }
73
- console.log(ui.success('Nodes configured'));
74
- }
75
- } else {
76
- console.log(ui.dim('No nodes auto-detected. Enter manually:'));
54
+ // 2. Node IPs optional
55
+ const configureNodes = await ask(rl, ' Configure network nodes? (y/N): ');
56
+ if (configureNodes.trim().toLowerCase() === 'y') {
57
+ console.log('');
58
+ console.log(ui.dim(' Enter Tailscale IPs for your NAVADA Edge nodes.'));
59
+ console.log(ui.dim(' Press Enter to skip any node.'));
60
+ console.log('');
61
+
77
62
  const asusIp = await ask(rl, ' ASUS IP (Production Engine): ');
78
63
  if (asusIp.trim()) {
79
64
  config.set('asus', asusIp.trim());
80
65
  config.set('mcp', `http://${asusIp.trim()}:8811`);
81
66
  config.set('dashboard', `http://${asusIp.trim()}:7900`);
82
67
  config.set('registry', `http://${asusIp.trim()}:5000`);
83
- navada.init({ asus: asusIp.trim(), mcp: `http://${asusIp.trim()}:8811`, dashboard: `http://${asusIp.trim()}:7900`, registry: `http://${asusIp.trim()}:5000` });
68
+ navada.init({
69
+ asus: asusIp.trim(),
70
+ mcp: `http://${asusIp.trim()}:8811`,
71
+ dashboard: `http://${asusIp.trim()}:7900`,
72
+ registry: `http://${asusIp.trim()}:5000`,
73
+ });
84
74
  }
85
- const hpIp = await ask(rl, ' HP IP (Database, press Enter to skip): ');
75
+ const hpIp = await ask(rl, ' HP IP (Database): ');
86
76
  if (hpIp.trim()) config.set('hp', hpIp.trim());
87
- const ec2Ip = await ask(rl, ' EC2 IP (Monitoring, press Enter to skip): ');
77
+ const ec2Ip = await ask(rl, ' EC2 IP (Monitoring): ');
88
78
  if (ec2Ip.trim()) {
89
79
  config.set('ec2', ec2Ip.trim());
90
80
  config.set('lucas', `http://${ec2Ip.trim()}:8820`);
91
81
  }
92
- const oracleIp = await ask(rl, ' Oracle IP (Docker Infra, press Enter to skip): ');
82
+ const oracleIp = await ask(rl, ' Oracle IP (Infrastructure): ');
93
83
  if (oracleIp.trim()) config.set('oracle', oracleIp.trim());
84
+ console.log(ui.success('Nodes configured'));
94
85
  }
95
86
  console.log('');
96
87
 
97
- // 4. Choose theme
98
- const theme = await ask(rl, ' Choose theme (dark/crow/matrix/light) [dark]: ');
88
+ // 3. Theme
89
+ const theme = await ask(rl, ' Theme (dark/crow/matrix/light) [dark]: ');
99
90
  config.setTheme(theme.trim() || 'dark');
100
- console.log(ui.success(`Theme: ${config.getTheme()}`));
101
- console.log('');
102
-
103
- // 5. Test connections
104
- console.log(ui.dim('Testing connections...'));
105
- const tests = [
106
- { name: 'MCP', url: navada.config.mcp ? navada.config.mcp + '/health' : '' },
107
- { name: 'Dashboard', url: navada.config.dashboard || '' },
108
- { name: 'Registry', url: navada.config.registry ? navada.config.registry + '/v2/_catalog' : '' },
109
- ];
110
- let pass = 0;
111
- for (const t of tests) {
112
- if (!t.url) { console.log(ui.online(t.name, false, 'not configured')); continue; }
113
- try {
114
- const r = await navada.request(t.url, { timeout: 5000 });
115
- console.log(ui.online(t.name, r.status < 500));
116
- pass++;
117
- } catch {
118
- console.log(ui.online(t.name, false, 'unreachable'));
119
- }
120
- }
121
91
  console.log('');
122
92
 
123
- // 6. Summary
124
- console.log(ui.box('SETUP COMPLETE', ` ${pass}/${tests.length} services connected\n Theme: ${config.getTheme()}\n Tier: ${config.getTier()}\n Config: ${config.CONFIG_FILE}`));
93
+ // 4. Done
94
+ console.log(ui.box('READY', ` Config saved: ${config.CONFIG_FILE}\n Type naturally to chat, or /help for commands.`));
125
95
  console.log('');
126
- console.log(ui.dim('Run `navada` to start, or `navada doctor` to test all connections.'));
127
96
 
128
97
  rl.close();
129
98
  }
130
99
 
131
100
  module.exports = function(reg) {
132
- reg('setup', 'Run onboarding wizard', async () => {
133
- await runSetup();
101
+ reg('setup', 'Run setup wizard', async () => {
102
+ await runSetup(true);
134
103
  }, { category: 'SYSTEM' });
135
104
  };
136
105
 
@@ -65,11 +65,32 @@ module.exports = function(reg) {
65
65
  }, { category: 'SYSTEM' });
66
66
 
67
67
  // --- /login ---
68
- reg('login', 'Set API key', (args) => {
69
- if (!args[0]) { console.log(ui.dim('Usage: /login <api-key>')); return; }
70
- config.setApiKey(args[0]);
71
- navada.init({ mcpApiKey: args[0], dashboardApiKey: args[0] });
72
- console.log(ui.success(`API key saved to ${config.CONFIG_FILE}`));
68
+ reg('login', 'Set API key (Anthropic, OpenAI, NAVADA Edge, or HuggingFace)', (args) => {
69
+ if (!args[0]) {
70
+ console.log(ui.dim('Usage: /login <api-key>'));
71
+ console.log(ui.dim('Accepts: sk-ant-... (Anthropic) | sk-... (OpenAI) | nv_edge_... (NAVADA) | hf_... (HuggingFace)'));
72
+ return;
73
+ }
74
+ const key = args[0].trim();
75
+ config.setApiKey(key);
76
+
77
+ if (key.startsWith('sk-ant')) {
78
+ config.set('anthropicKey', key);
79
+ console.log(ui.success('Anthropic key saved — full agent mode with tool use enabled'));
80
+ } else if (key.startsWith('hf_')) {
81
+ config.set('hfToken', key);
82
+ navada.init({ hfToken: key });
83
+ console.log(ui.success('HuggingFace key saved — Qwen Coder (FREE) enabled'));
84
+ } else if (key.startsWith('nv_edge')) {
85
+ navada.init({ mcpApiKey: key, dashboardApiKey: key });
86
+ console.log(ui.success('NAVADA Edge key saved — MCP + Dashboard access enabled'));
87
+ } else if (key.startsWith('sk-')) {
88
+ config.set('openaiKey', key);
89
+ navada.init({ openaiKey: key });
90
+ console.log(ui.success('OpenAI key saved — GPT-4o enabled'));
91
+ } else {
92
+ console.log(ui.success('Key saved'));
93
+ }
73
94
  }, { category: 'SYSTEM' });
74
95
 
75
96
  // --- /init ---
package/network.svg CHANGED
@@ -1,197 +1,207 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 980" font-family="'SF Mono','Cascadia Code','IBM Plex Mono',monospace">
2
- <rect width="1200" height="980" fill="#050505"/>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 720" font-family="'SF Mono','Cascadia Code','Courier New',monospace">
2
+ <defs>
3
+ <style>
4
+ .bg { fill: #050505; }
5
+ .card { fill: #0a0a0a; stroke: #1a1a1a; stroke-width: 1; }
6
+ .card-hdr { fill: #0f0f0f; }
7
+ .t-title { fill: #fff; font-size: 20px; font-weight: 700; letter-spacing: 3px; }
8
+ .t-sub { fill: #555; font-size: 10px; letter-spacing: 1.5px; }
9
+ .t-label { fill: #555; font-size: 8px; letter-spacing: 1px; text-transform: uppercase; }
10
+ .t-name { fill: #fff; font-size: 11px; font-weight: 600; }
11
+ .t-role { fill: #666; font-size: 9px; }
12
+ .t-svc { fill: #bbb; font-size: 9px; }
13
+ .t-port { fill: #555; font-size: 9px; }
14
+ .t-ip { fill: #444; font-size: 8px; }
15
+ .t-count { fill: #555; font-size: 8px; }
16
+ .t-pill { fill: #e0e0e0; font-size: 10px; }
17
+ .t-pill-sub { fill: #555; font-size: 8px; }
18
+ .t-footer { fill: #333; font-size: 9px; letter-spacing: 0.5px; }
19
+ .dot-on { fill: #22c55e; }
20
+ .dot-off { fill: #444; }
21
+ .line-v { stroke: #1a1a1a; stroke-width: 1; }
22
+ .line-accent { stroke: #fff; stroke-width: 2; }
23
+ .line-dim { stroke: #333; stroke-width: 2; }
24
+ .line-dark { stroke: #222; stroke-width: 2; }
25
+ .badge { fill: none; stroke: #222; stroke-width: 1; }
26
+ .badge-text { fill: #666; font-size: 7px; letter-spacing: 0.5px; }
27
+ .pill-box { fill: none; stroke: #1a1a1a; stroke-width: 1; }
28
+ .mesh-bar { fill: #080808; stroke: #1a1a1a; stroke-width: 1; }
29
+ .arrow { fill: #222; }
30
+ </style>
31
+ </defs>
32
+
33
+ <!-- Background -->
34
+ <rect width="900" height="720" class="bg"/>
3
35
 
4
36
  <!-- Title -->
5
- <text x="600" y="40" fill="#ffffff" font-size="22" font-weight="600" text-anchor="middle" letter-spacing="4">NAVADA EDGE NETWORK</text>
6
- <text x="600" y="58" fill="#555" font-size="11" text-anchor="middle" letter-spacing="2">Distributed AI Infrastructure — 4 Nodes | 25 Containers | 100% Docker</text>
7
-
8
- <!-- Clients -->
9
- <rect x="400" y="78" width="400" height="50" fill="#0a0a0a" stroke="#1a1a1a"/>
10
- <text x="470" y="100" fill="#e0e0e0" font-size="11">iPhone</text>
11
- <text x="470" y="115" fill="#444" font-size="9">Telegram</text>
12
- <text x="580" y="100" fill="#e0e0e0" font-size="11">Desktop</text>
13
- <text x="580" y="115" fill="#444" font-size="9">VS Code / Browser</text>
14
- <text x="700" y="100" fill="#e0e0e0" font-size="11">API Consumer</text>
15
- <text x="700" y="115" fill="#444" font-size="9">SDK / CLI / MCP</text>
16
-
17
- <!-- Arrow -->
18
- <line x1="600" y1="128" x2="600" y2="148" stroke="#333" stroke-width="1"/>
19
- <polygon points="596,148 604,148 600,155" fill="#333"/>
37
+ <text x="450" y="36" text-anchor="middle" class="t-title">NAVADA EDGE NETWORK</text>
38
+ <text x="450" y="52" text-anchor="middle" class="t-sub">Distributed AI Infrastructure</text>
20
39
 
21
40
  <!-- Mesh Bar -->
22
- <rect x="60" y="160" width="1080" height="44" fill="#0a0a0a" stroke="#1a1a1a"/>
23
- <text x="200" y="178" fill="#555" font-size="9" letter-spacing="1">VPN MESH</text>
24
- <text x="200" y="194" fill="#e0e0e0" font-size="11">Tailscale (WireGuard)</text>
25
- <text x="500" y="178" fill="#555" font-size="9" letter-spacing="1">TUNNEL</text>
26
- <text x="500" y="194" fill="#e0e0e0" font-size="11">Cloudflare *.navada-edge-server.uk</text>
27
- <text x="880" y="178" fill="#555" font-size="9" letter-spacing="1">REGISTRY</text>
28
- <text x="880" y="194" fill="#e0e0e0" font-size="11">Private Docker :5000</text>
41
+ <rect x="40" y="68" width="820" height="36" rx="0" class="mesh-bar"/>
42
+ <text x="140" y="82" class="t-label">VPN</text>
43
+ <text x="140" y="95" class="t-svc">Tailscale WireGuard</text>
44
+ <text x="370" y="82" class="t-label">TUNNEL</text>
45
+ <text x="370" y="95" class="t-svc">Cloudflare *.navada-edge-server.uk</text>
46
+ <text x="680" y="82" class="t-label">REGISTRY</text>
47
+ <text x="680" y="95" class="t-svc">Private Docker :5000</text>
29
48
 
30
49
  <!-- Arrow -->
31
- <line x1="600" y1="204" x2="600" y2="222" stroke="#333" stroke-width="1"/>
32
- <polygon points="596,222 604,222 600,229" fill="#333"/>
33
-
34
- <!-- Section: Nodes -->
35
- <text x="68" y="244" fill="#333" font-size="9" letter-spacing="2">TAILSCALE NODES</text>
36
-
37
- <!-- NODE 1: ASUS -->
38
- <rect x="60" y="255" width="265" height="235" fill="#0a0a0a" stroke="#1a1a1a"/>
39
- <rect x="60" y="255" width="3" height="32" fill="#fff"/>
40
- <rect x="60" y="255" width="265" height="32" fill="#0a0a0a" stroke="#1a1a1a"/>
41
- <text x="72" y="274" fill="#fff" font-size="12" font-weight="600">ASUS Zenbook Duo</text>
42
- <text x="72" y="282" fill="#555" font-size="9">Production Engine</text>
43
- <text x="310" y="271" fill="#444" font-size="9" text-anchor="end">100.88.118.128</text>
44
- <text x="310" y="282" fill="#555" font-size="9" text-anchor="end">7 containers</text>
45
- <circle cx="316" cy="277" r="4" fill="#22c55e"/>
46
- <!-- Services -->
47
- <text x="72" y="304" fill="#e0e0e0" font-size="10">MCP Server</text><text x="310" y="304" fill="#444" font-size="10" text-anchor="end">:8811</text>
48
- <line x1="72" y1="310" x2="310" y2="310" stroke="#111" stroke-width="0.5"/>
49
- <text x="72" y="324" fill="#e0e0e0" font-size="10">Command Dashboard</text><text x="310" y="324" fill="#444" font-size="10" text-anchor="end">:7900</text>
50
- <line x1="72" y1="330" x2="310" y2="330" stroke="#111" stroke-width="0.5"/>
51
- <text x="72" y="344" fill="#e0e0e0" font-size="10">Docker Registry</text><text x="310" y="344" fill="#444" font-size="10" text-anchor="end">:5000</text>
52
- <line x1="72" y1="350" x2="310" y2="350" stroke="#111" stroke-width="0.5"/>
53
- <text x="72" y="364" fill="#e0e0e0" font-size="10">OpenCode</text><text x="310" y="364" fill="#444" font-size="10" text-anchor="end">:3200</text>
54
- <line x1="72" y1="370" x2="310" y2="370" stroke="#111" stroke-width="0.5"/>
55
- <text x="72" y="384" fill="#e0e0e0" font-size="10">Portainer Agent</text><text x="310" y="384" fill="#444" font-size="10" text-anchor="end">:9001</text>
56
- <line x1="72" y1="390" x2="310" y2="390" stroke="#111" stroke-width="0.5"/>
57
- <text x="72" y="404" fill="#e0e0e0" font-size="10">Builder</text><text x="310" y="404" fill="#444" font-size="10" text-anchor="end">:4000</text>
58
- <line x1="72" y1="410" x2="310" y2="410" stroke="#111" stroke-width="0.5"/>
59
- <text x="72" y="424" fill="#e0e0e0" font-size="10">Sandbox</text><text x="310" y="424" fill="#444" font-size="10" text-anchor="end">:3100</text>
60
-
61
- <!-- NODE 2: EC2 -->
62
- <rect x="340" y="255" width="265" height="255" fill="#0a0a0a" stroke="#1a1a1a"/>
63
- <rect x="340" y="255" width="3" height="32" fill="#666"/>
64
- <rect x="340" y="255" width="265" height="32" fill="#0a0a0a" stroke="#1a1a1a"/>
65
- <text x="352" y="274" fill="#fff" font-size="12" font-weight="600">AWS EC2</text>
66
- <text x="352" y="282" fill="#555" font-size="9">Monitoring + Bots</text>
67
- <text x="590" y="271" fill="#444" font-size="9" text-anchor="end">100.98.118.33</text>
68
- <text x="590" y="282" fill="#555" font-size="9" text-anchor="end">8 containers</text>
69
- <circle cx="596" cy="277" r="4" fill="#22c55e"/>
70
- <text x="352" y="304" fill="#e0e0e0" font-size="10">Telegram Bot (Claude)</text><text x="590" y="304" fill="#444" font-size="10" text-anchor="end">:3456</text>
71
- <line x1="352" y1="310" x2="590" y2="310" stroke="#111" stroke-width="0.5"/>
72
- <text x="352" y="324" fill="#e0e0e0" font-size="10">Lucas CTO MCP</text><text x="590" y="324" fill="#444" font-size="10" text-anchor="end">:8820</text>
73
- <line x1="352" y1="330" x2="590" y2="330" stroke="#111" stroke-width="0.5"/>
74
- <text x="352" y="344" fill="#e0e0e0" font-size="10">Health Monitor</text><text x="590" y="344" fill="#444" font-size="10" text-anchor="end">—</text>
75
- <line x1="352" y1="350" x2="590" y2="350" stroke="#111" stroke-width="0.5"/>
76
- <text x="352" y="364" fill="#e0e0e0" font-size="10">Dashboard</text><text x="590" y="364" fill="#444" font-size="10" text-anchor="end">:9090</text>
77
- <line x1="352" y1="370" x2="590" y2="370" stroke="#111" stroke-width="0.5"/>
78
- <text x="352" y="384" fill="#e0e0e0" font-size="10">OpenCode</text><text x="590" y="384" fill="#444" font-size="10" text-anchor="end">:3200</text>
79
- <line x1="352" y1="390" x2="590" y2="390" stroke="#111" stroke-width="0.5"/>
80
- <text x="352" y="404" fill="#e0e0e0" font-size="10">WorldMonitor</text><text x="590" y="404" fill="#444" font-size="10" text-anchor="end">:4000</text>
81
- <line x1="352" y1="410" x2="590" y2="410" stroke="#111" stroke-width="0.5"/>
82
- <text x="352" y="424" fill="#e0e0e0" font-size="10">E2E Tests</text><text x="590" y="424" fill="#444" font-size="10" text-anchor="end">—</text>
83
- <line x1="352" y1="430" x2="590" y2="430" stroke="#111" stroke-width="0.5"/>
84
- <text x="352" y="444" fill="#e0e0e0" font-size="10">Portainer Agent</text><text x="590" y="444" fill="#444" font-size="10" text-anchor="end">:9001</text>
85
-
86
- <!-- NODE 3: Oracle -->
87
- <rect x="620" y="255" width="265" height="255" fill="#0a0a0a" stroke="#1a1a1a"/>
88
- <rect x="620" y="255" width="3" height="32" fill="#444"/>
89
- <rect x="620" y="255" width="265" height="32" fill="#0a0a0a" stroke="#1a1a1a"/>
90
- <text x="632" y="274" fill="#fff" font-size="12" font-weight="600">Oracle Cloud</text>
91
- <text x="632" y="282" fill="#555" font-size="9">Docker Infrastructure</text>
92
- <text x="870" y="271" fill="#444" font-size="9" text-anchor="end">100.77.206.9</text>
93
- <text x="870" y="282" fill="#555" font-size="9" text-anchor="end">8 containers</text>
94
- <circle cx="876" cy="277" r="4" fill="#22c55e"/>
95
- <text x="632" y="304" fill="#e0e0e0" font-size="10">Portainer</text><text x="870" y="304" fill="#444" font-size="10" text-anchor="end">:9000</text>
96
- <line x1="632" y1="310" x2="870" y2="310" stroke="#111" stroke-width="0.5"/>
97
- <text x="632" y="324" fill="#e0e0e0" font-size="10">Cloudflare Tunnel</text><text x="870" y="324" fill="#444" font-size="10" text-anchor="end">—</text>
98
- <line x1="632" y1="330" x2="870" y2="330" stroke="#111" stroke-width="0.5"/>
99
- <text x="632" y="344" fill="#e0e0e0" font-size="10">Nginx Proxy</text><text x="870" y="344" fill="#444" font-size="10" text-anchor="end">:80/443</text>
100
- <line x1="632" y1="350" x2="870" y2="350" stroke="#111" stroke-width="0.5"/>
101
- <text x="632" y="364" fill="#e0e0e0" font-size="10">Grafana</text><text x="870" y="364" fill="#444" font-size="10" text-anchor="end">:3000</text>
102
- <line x1="632" y1="370" x2="870" y2="370" stroke="#111" stroke-width="0.5"/>
103
- <text x="632" y="384" fill="#e0e0e0" font-size="10">Prometheus</text><text x="870" y="384" fill="#444" font-size="10" text-anchor="end">:9090</text>
104
- <line x1="632" y1="390" x2="870" y2="390" stroke="#111" stroke-width="0.5"/>
105
- <text x="632" y="404" fill="#e0e0e0" font-size="10">Uptime Kuma</text><text x="870" y="404" fill="#444" font-size="10" text-anchor="end">:3001</text>
106
- <line x1="632" y1="410" x2="870" y2="410" stroke="#111" stroke-width="0.5"/>
107
- <text x="632" y="424" fill="#e0e0e0" font-size="10">CloudBeaver</text><text x="870" y="424" fill="#444" font-size="10" text-anchor="end">:8978</text>
108
- <line x1="632" y1="430" x2="870" y2="430" stroke="#111" stroke-width="0.5"/>
109
- <text x="632" y="444" fill="#e0e0e0" font-size="10">Portainer Agent</text><text x="870" y="444" fill="#444" font-size="10" text-anchor="end">:9001</text>
110
-
111
- <!-- NODE 4: HP -->
112
- <rect x="900" y="255" width="240" height="145" fill="#0a0a0a" stroke="#1a1a1a"/>
113
- <rect x="900" y="255" width="3" height="32" fill="#333"/>
114
- <rect x="900" y="255" width="240" height="32" fill="#0a0a0a" stroke="#1a1a1a"/>
115
- <text x="912" y="274" fill="#fff" font-size="12" font-weight="600">HP EliteBook</text>
116
- <text x="912" y="282" fill="#555" font-size="9">Database Node</text>
117
- <text x="1126" y="271" fill="#444" font-size="9" text-anchor="end">100.121.187.67</text>
118
- <text x="1126" y="282" fill="#555" font-size="9" text-anchor="end">2 containers</text>
119
- <circle cx="1132" cy="277" r="4" fill="#22c55e"/>
120
- <text x="912" y="304" fill="#e0e0e0" font-size="10">PostgreSQL 17</text><text x="1126" y="304" fill="#444" font-size="10" text-anchor="end">:5433</text>
121
- <line x1="912" y1="310" x2="1126" y2="310" stroke="#111" stroke-width="0.5"/>
122
- <text x="912" y="324" fill="#e0e0e0" font-size="10">OpenCode</text><text x="1126" y="324" fill="#444" font-size="10" text-anchor="end">:3200</text>
123
- <line x1="912" y1="330" x2="1126" y2="330" stroke="#111" stroke-width="0.5"/>
124
- <text x="912" y="344" fill="#e0e0e0" font-size="10">Portainer Agent</text><text x="1126" y="344" fill="#444" font-size="10" text-anchor="end">:9001</text>
125
-
126
- <!-- Section: Cloud -->
127
- <text x="68" y="535" fill="#333" font-size="9" letter-spacing="2">CLOUD SERVICES</text>
50
+ <line x1="450" y1="104" x2="450" y2="118" class="line-v"/>
51
+ <polygon points="447,118 453,118 450,124" class="arrow"/>
52
+
53
+ <!-- ==================== 4 NODES ==================== -->
54
+ <text x="48" y="140" class="t-label">NODES</text>
55
+
56
+ <!-- ASUS -->
57
+ <rect x="40" y="148" width="200" height="184" class="card"/>
58
+ <rect x="40" y="148" width="200" height="26" class="card-hdr"/>
59
+ <rect x="40" y="148" width="3" height="26" class="line-accent" style="stroke:none;fill:#fff"/>
60
+ <circle cx="228" cy="161" r="3" class="dot-on"/>
61
+ <text x="52" y="163" class="t-name">ASUS Zenbook</text>
62
+ <text x="52" y="172" class="t-role">Production Engine</text>
63
+ <text x="210" y="172" text-anchor="end" class="t-ip">7 containers</text>
64
+ <text x="52" y="192" class="t-svc">MCP Server</text><text x="228" y="192" text-anchor="end" class="t-port">:8811</text>
65
+ <line x1="52" y1="197" x2="228" y2="197" style="stroke:#111;stroke-width:0.5"/>
66
+ <text x="52" y="209" class="t-svc">Command Dashboard</text><text x="228" y="209" text-anchor="end" class="t-port">:7900</text>
67
+ <line x1="52" y1="214" x2="228" y2="214" style="stroke:#111;stroke-width:0.5"/>
68
+ <text x="52" y="226" class="t-svc">Docker Registry</text><text x="228" y="226" text-anchor="end" class="t-port">:5000</text>
69
+ <line x1="52" y1="231" x2="228" y2="231" style="stroke:#111;stroke-width:0.5"/>
70
+ <text x="52" y="243" class="t-svc">OpenCode</text><text x="228" y="243" text-anchor="end" class="t-port">:3200</text>
71
+ <line x1="52" y1="248" x2="228" y2="248" style="stroke:#111;stroke-width:0.5"/>
72
+ <text x="52" y="260" class="t-svc">Portainer Agent</text><text x="228" y="260" text-anchor="end" class="t-port">:9001</text>
73
+ <line x1="52" y1="265" x2="228" y2="265" style="stroke:#111;stroke-width:0.5"/>
74
+ <text x="52" y="277" class="t-svc">Builder + Sandbox</text><text x="228" y="277" text-anchor="end" class="t-port">:4000 :3100</text>
75
+
76
+ <!-- EC2 -->
77
+ <rect x="250" y="148" width="200" height="184" class="card"/>
78
+ <rect x="250" y="148" width="200" height="26" class="card-hdr"/>
79
+ <rect x="250" y="148" width="3" height="26" style="fill:#666"/>
80
+ <circle cx="438" cy="161" r="3" class="dot-on"/>
81
+ <text x="262" y="163" class="t-name">AWS EC2</text>
82
+ <text x="262" y="172" class="t-role">Monitoring + Bots</text>
83
+ <text x="420" y="172" text-anchor="end" class="t-ip">8 containers</text>
84
+ <text x="262" y="192" class="t-svc">Telegram Bot (Claude)</text><text x="438" y="192" text-anchor="end" class="t-port">:3456</text>
85
+ <line x1="262" y1="197" x2="438" y2="197" style="stroke:#111;stroke-width:0.5"/>
86
+ <text x="262" y="209" class="t-svc">Lucas CTO MCP</text><text x="438" y="209" text-anchor="end" class="t-port">:8820</text>
87
+ <line x1="262" y1="214" x2="438" y2="214" style="stroke:#111;stroke-width:0.5"/>
88
+ <text x="262" y="226" class="t-svc">Health Monitor</text><text x="438" y="226" text-anchor="end" class="t-port">24/7</text>
89
+ <line x1="262" y1="231" x2="438" y2="231" style="stroke:#111;stroke-width:0.5"/>
90
+ <text x="262" y="243" class="t-svc">OpenCode + Dashboard</text><text x="438" y="243" text-anchor="end" class="t-port">:3200 :9090</text>
91
+ <line x1="262" y1="248" x2="438" y2="248" style="stroke:#111;stroke-width:0.5"/>
92
+ <text x="262" y="260" class="t-svc">WorldMonitor + E2E</text><text x="438" y="260" text-anchor="end" class="t-port">:4000</text>
93
+ <line x1="262" y1="265" x2="438" y2="265" style="stroke:#111;stroke-width:0.5"/>
94
+ <text x="262" y="277" class="t-svc">Portainer Agent</text><text x="438" y="277" text-anchor="end" class="t-port">:9001</text>
95
+
96
+ <!-- Oracle -->
97
+ <rect x="460" y="148" width="200" height="184" class="card"/>
98
+ <rect x="460" y="148" width="200" height="26" class="card-hdr"/>
99
+ <rect x="460" y="148" width="3" height="26" style="fill:#444"/>
100
+ <circle cx="648" cy="161" r="3" class="dot-on"/>
101
+ <text x="472" y="163" class="t-name">Oracle Cloud</text>
102
+ <text x="472" y="172" class="t-role">Docker Infrastructure</text>
103
+ <text x="630" y="172" text-anchor="end" class="t-ip">8 containers</text>
104
+ <text x="472" y="192" class="t-svc">Portainer</text><text x="648" y="192" text-anchor="end" class="t-port">:9000</text>
105
+ <line x1="472" y1="197" x2="648" y2="197" style="stroke:#111;stroke-width:0.5"/>
106
+ <text x="472" y="209" class="t-svc">Cloudflare Tunnel</text><text x="648" y="209" text-anchor="end" class="t-port">origin</text>
107
+ <line x1="472" y1="214" x2="648" y2="214" style="stroke:#111;stroke-width:0.5"/>
108
+ <text x="472" y="226" class="t-svc">Grafana + Prometheus</text><text x="648" y="226" text-anchor="end" class="t-port">:3000 :9090</text>
109
+ <line x1="472" y1="231" x2="648" y2="231" style="stroke:#111;stroke-width:0.5"/>
110
+ <text x="472" y="243" class="t-svc">Uptime Kuma</text><text x="648" y="243" text-anchor="end" class="t-port">:3001</text>
111
+ <line x1="472" y1="248" x2="648" y2="248" style="stroke:#111;stroke-width:0.5"/>
112
+ <text x="472" y="260" class="t-svc">CloudBeaver</text><text x="648" y="260" text-anchor="end" class="t-port">:8978</text>
113
+ <line x1="472" y1="265" x2="648" y2="265" style="stroke:#111;stroke-width:0.5"/>
114
+ <text x="472" y="277" class="t-svc">Nginx Proxy</text><text x="648" y="277" text-anchor="end" class="t-port">:80/443</text>
115
+
116
+ <!-- HP -->
117
+ <rect x="670" y="148" width="190" height="108" class="card"/>
118
+ <rect x="670" y="148" width="190" height="26" class="card-hdr"/>
119
+ <rect x="670" y="148" width="3" height="26" style="fill:#333"/>
120
+ <circle cx="848" cy="161" r="3" class="dot-on"/>
121
+ <text x="682" y="163" class="t-name">HP EliteBook</text>
122
+ <text x="682" y="172" class="t-role">Database Node</text>
123
+ <text x="838" y="172" text-anchor="end" class="t-ip">2 containers</text>
124
+ <text x="682" y="192" class="t-svc">PostgreSQL 17</text><text x="848" y="192" text-anchor="end" class="t-port">:5433</text>
125
+ <line x1="682" y1="197" x2="848" y2="197" style="stroke:#111;stroke-width:0.5"/>
126
+ <text x="682" y="209" class="t-svc">OpenCode</text><text x="848" y="209" text-anchor="end" class="t-port">:3200</text>
127
+ <line x1="682" y1="214" x2="848" y2="214" style="stroke:#111;stroke-width:0.5"/>
128
+ <text x="682" y="226" class="t-svc">Portainer Agent</text><text x="848" y="226" text-anchor="end" class="t-port">:9001</text>
129
+
130
+ <!-- ==================== CLOUD ==================== -->
131
+ <text x="48" y="352" class="t-label">CLOUD SERVICES</text>
128
132
 
129
133
  <!-- Cloudflare -->
130
- <rect x="60" y="546" width="370" height="160" fill="#0a0a0a" stroke="#1a1a1a"/>
131
- <rect x="60" y="546" width="3" height="30" fill="#333"/>
132
- <rect x="60" y="546" width="370" height="30" fill="#0a0a0a" stroke="#1a1a1a"/>
133
- <text x="72" y="564" fill="#fff" font-size="12" font-weight="600">Cloudflare</text>
134
- <text x="72" y="572" fill="#555" font-size="9">CDN + Storage + AI</text>
135
- <rect x="380" y="552" width="40" height="16" fill="none" stroke="#222"/>
136
- <text x="400" y="564" fill="#888" font-size="8" text-anchor="middle">EDGE</text>
137
- <text x="72" y="594" fill="#e0e0e0" font-size="10">R2 Object Storage</text><text x="416" y="594" fill="#444" font-size="10" text-anchor="end">navada-assets</text>
138
- <line x1="72" y1="600" x2="416" y2="600" stroke="#111" stroke-width="0.5"/>
139
- <text x="72" y="614" fill="#e0e0e0" font-size="10">Flux Image Gen (FREE)</text><text x="416" y="614" fill="#444" font-size="10" text-anchor="end">Workers AI</text>
140
- <line x1="72" y1="620" x2="416" y2="620" stroke="#111" stroke-width="0.5"/>
141
- <text x="72" y="634" fill="#e0e0e0" font-size="10">Stream Video CDN</text><text x="416" y="634" fill="#444" font-size="10" text-anchor="end">HLS</text>
142
- <line x1="72" y1="640" x2="416" y2="640" stroke="#111" stroke-width="0.5"/>
143
- <text x="72" y="654" fill="#e0e0e0" font-size="10">Tunnel (11 subdomains)</text><text x="416" y="654" fill="#444" font-size="10" text-anchor="end">navada-edge-server.uk</text>
144
- <line x1="72" y1="660" x2="416" y2="660" stroke="#111" stroke-width="0.5"/>
145
- <text x="72" y="674" fill="#e0e0e0" font-size="10">DNS</text><text x="416" y="674" fill="#444" font-size="10" text-anchor="end">navada-edge-server.uk</text>
134
+ <rect x="40" y="360" width="280" height="120" class="card"/>
135
+ <rect x="40" y="360" width="280" height="24" class="card-hdr"/>
136
+ <text x="52" y="375" class="t-name">Cloudflare</text>
137
+ <text x="160" y="375" class="t-role">CDN + Storage + AI</text>
138
+ <rect x="280" y="364" width="32" height="14" class="badge"/><text x="296" y="374" text-anchor="middle" class="badge-text">EDGE</text>
139
+ <text x="52" y="398" class="t-svc">R2 Object Storage</text>
140
+ <text x="52" y="412" class="t-svc">Flux Image Gen (FREE)</text>
141
+ <text x="52" y="426" class="t-svc">Stream Video CDN</text>
142
+ <text x="52" y="440" class="t-svc">Tunnel (11 subdomains)</text>
143
+ <text x="52" y="454" class="t-svc">DNS + WAF Trace</text>
144
+ <text x="308" y="398" text-anchor="end" class="t-port">navada-assets</text>
145
+ <text x="308" y="412" text-anchor="end" class="t-port">Workers AI</text>
146
+ <text x="308" y="426" text-anchor="end" class="t-port">HLS</text>
147
+ <text x="308" y="440" text-anchor="end" class="t-port">*.navada-edge-server.uk</text>
148
+
149
+ <!-- AI Services -->
150
+ <rect x="330" y="360" width="280" height="120" class="card"/>
151
+ <rect x="330" y="360" width="280" height="24" class="card-hdr"/>
152
+ <text x="342" y="375" class="t-name">AI Services</text>
153
+ <text x="440" y="375" class="t-role">Inference + Generation</text>
154
+ <rect x="570" y="364" width="32" height="14" class="badge"/><text x="586" y="374" text-anchor="middle" class="badge-text">API</text>
155
+ <text x="342" y="398" class="t-svc">YOLO v8 Detection</text><text x="598" y="398" text-anchor="end" class="t-port">ASUS :8765</text>
156
+ <text x="342" y="412" class="t-svc">Qwen Coder 32B</text><text x="598" y="412" text-anchor="end" class="t-port">FREE (HuggingFace)</text>
157
+ <text x="342" y="426" class="t-svc">GPT-4o / DALL-E 3</text><text x="598" y="426" text-anchor="end" class="t-port">OpenAI</text>
158
+ <text x="342" y="440" class="t-svc">Claude Sonnet 4</text><text x="598" y="440" text-anchor="end" class="t-port">Anthropic</text>
159
+ <text x="342" y="454" class="t-svc">Flux (FREE)</text><text x="598" y="454" text-anchor="end" class="t-port">Cloudflare Workers</text>
146
160
 
147
161
  <!-- Azure -->
148
- <rect x="445" y="546" width="250" height="80" fill="#0a0a0a" stroke="#1a1a1a"/>
149
- <rect x="445" y="546" width="3" height="30" fill="#333"/>
150
- <rect x="445" y="546" width="250" height="30" fill="#0a0a0a" stroke="#1a1a1a"/>
151
- <text x="457" y="564" fill="#fff" font-size="12" font-weight="600">Azure</text>
152
- <text x="457" y="572" fill="#555" font-size="9">Workflow Automation</text>
153
- <rect x="645" y="552" width="40" height="16" fill="none" stroke="#222"/>
154
- <text x="665" y="564" fill="#888" font-size="8" text-anchor="middle">UK S</text>
155
- <text x="457" y="594" fill="#e0e0e0" font-size="10">n8n (Container Apps)</text><text x="681" y="594" fill="#444" font-size="10" text-anchor="end">HTTPS</text>
156
-
157
- <!-- AI -->
158
- <rect x="710" y="546" width="430" height="160" fill="#0a0a0a" stroke="#1a1a1a"/>
159
- <rect x="710" y="546" width="3" height="30" fill="#333"/>
160
- <rect x="710" y="546" width="430" height="30" fill="#0a0a0a" stroke="#1a1a1a"/>
161
- <text x="722" y="564" fill="#fff" font-size="12" font-weight="600">AI Services</text>
162
- <text x="722" y="572" fill="#555" font-size="9">Inference + Generation</text>
163
- <rect x="1090" y="552" width="40" height="16" fill="none" stroke="#222"/>
164
- <text x="1110" y="564" fill="#888" font-size="8" text-anchor="middle">API</text>
165
- <text x="722" y="594" fill="#e0e0e0" font-size="10">YOLO v8 Object Detection</text><text x="1126" y="594" fill="#444" font-size="10" text-anchor="end">ASUS :8765</text>
166
- <line x1="722" y1="600" x2="1126" y2="600" stroke="#111" stroke-width="0.5"/>
167
- <text x="722" y="614" fill="#e0e0e0" font-size="10">Qwen Coder 32B (FREE)</text><text x="1126" y="614" fill="#444" font-size="10" text-anchor="end">HuggingFace</text>
168
- <line x1="722" y1="620" x2="1126" y2="620" stroke="#111" stroke-width="0.5"/>
169
- <text x="722" y="634" fill="#e0e0e0" font-size="10">GPT-4o / DALL-E 3</text><text x="1126" y="634" fill="#444" font-size="10" text-anchor="end">OpenAI</text>
170
- <line x1="722" y1="640" x2="1126" y2="640" stroke="#111" stroke-width="0.5"/>
171
- <text x="722" y="654" fill="#e0e0e0" font-size="10">Flux Image Gen (FREE)</text><text x="1126" y="654" fill="#444" font-size="10" text-anchor="end">Cloudflare Workers</text>
172
-
173
- <!-- SDK Access Bar -->
174
- <rect x="60" y="730" width="1080" height="70" fill="#0a0a0a" stroke="#1a1a1a"/>
175
- <text x="600" y="752" fill="#555" font-size="9" text-anchor="middle" letter-spacing="2">ACCESS THE NETWORK</text>
176
-
177
- <rect x="140" y="762" width="160" height="30" fill="none" stroke="#222"/>
178
- <text x="220" y="778" fill="#e0e0e0" font-size="11" text-anchor="middle">SDK</text>
179
- <text x="220" y="788" fill="#555" font-size="8" text-anchor="middle">npm i navada-edge-sdk</text>
180
-
181
- <rect x="330" y="762" width="170" height="30" fill="none" stroke="#222"/>
182
- <text x="415" y="778" fill="#e0e0e0" font-size="11" text-anchor="middle">CLI</text>
183
- <text x="415" y="788" fill="#555" font-size="8" text-anchor="middle">npm i -g navada-edge-cli</text>
184
-
185
- <rect x="530" y="762" width="170" height="30" fill="none" stroke="#222"/>
186
- <text x="615" y="778" fill="#e0e0e0" font-size="11" text-anchor="middle">MCP</text>
187
- <text x="615" y="788" fill="#555" font-size="8" text-anchor="middle">POST /mcp (JSON-RPC)</text>
188
-
189
- <rect x="730" y="762" width="170" height="30" fill="none" stroke="#222"/>
190
- <text x="815" y="778" fill="#e0e0e0" font-size="11" text-anchor="middle">REST API</text>
191
- <text x="815" y="788" fill="#555" font-size="8" text-anchor="middle">GET /api/v1/status</text>
162
+ <rect x="620" y="360" width="240" height="60" class="card"/>
163
+ <rect x="620" y="360" width="240" height="24" class="card-hdr"/>
164
+ <text x="632" y="375" class="t-name">Azure</text>
165
+ <text x="700" y="375" class="t-role">Automation</text>
166
+ <rect x="822" y="364" width="30" height="14" class="badge"/><text x="837" y="374" text-anchor="middle" class="badge-text">UK</text>
167
+ <text x="632" y="398" class="t-svc">n8n Workflows (Container Apps)</text>
168
+
169
+ <!-- ==================== AGENTS ==================== -->
170
+ <text x="48" y="502" class="t-label">AGENTS</text>
171
+
172
+ <rect x="40" y="510" width="410" height="56" class="card"/>
173
+ <rect x="40" y="510" width="410" height="24" class="card-hdr"/>
174
+ <text x="52" y="525" class="t-name">Lucas CTO</text>
175
+ <text x="160" y="525" class="t-role">EC2 :8820 — 8 tools</text>
176
+ <text x="52" y="548" class="t-svc">bash ssh docker_exec deploy read_file write_file list_files network_status</text>
177
+
178
+ <rect x="460" y="510" width="400" height="56" class="card"/>
179
+ <rect x="460" y="510" width="400" height="24" class="card-hdr"/>
180
+ <text x="472" y="525" class="t-name">Claude CoS</text>
181
+ <text x="580" y="525" class="t-role">EC2 :3456 Chief of Staff</text>
182
+ <text x="472" y="548" class="t-svc">email image_gen SMS voice R2 research automation cost_tracking</text>
183
+
184
+ <!-- ==================== ACCESS ==================== -->
185
+ <text x="48" y="590" class="t-label">ACCESS THE NETWORK</text>
186
+
187
+ <rect x="40" y="598" width="820" height="52" class="card"/>
188
+ <rect x="80" y="610" width="150" height="28" class="pill-box"/>
189
+ <text x="155" y="625" text-anchor="middle" class="t-pill">SDK</text>
190
+ <text x="155" y="634" text-anchor="middle" class="t-pill-sub">npm i navada-edge-sdk</text>
191
+
192
+ <rect x="250" y="610" width="150" height="28" class="pill-box"/>
193
+ <text x="325" y="625" text-anchor="middle" class="t-pill">CLI</text>
194
+ <text x="325" y="634" text-anchor="middle" class="t-pill-sub">npm i -g navada-edge-cli</text>
195
+
196
+ <rect x="420" y="610" width="150" height="28" class="pill-box"/>
197
+ <text x="495" y="625" text-anchor="middle" class="t-pill">MCP</text>
198
+ <text x="495" y="634" text-anchor="middle" class="t-pill-sub">POST /mcp (JSON-RPC)</text>
199
+
200
+ <rect x="590" y="610" width="150" height="28" class="pill-box"/>
201
+ <text x="665" y="625" text-anchor="middle" class="t-pill">Docker</text>
202
+ <text x="665" y="634" text-anchor="middle" class="t-pill-sub">docker pull navada-edge-cli</text>
192
203
 
193
204
  <!-- Footer -->
194
- <rect x="60" y="820" width="1080" height="36" fill="#0a0a0a" stroke="#1a1a1a"/>
195
- <text x="600" y="843" fill="#444" font-size="10" text-anchor="middle" letter-spacing="1">NAVADA EDGE NETWORK — March 2026 | 4 Nodes | 25 Containers | 100% Docker | MIT Open Source</text>
196
-
205
+ <rect x="40" y="664" width="820" height="30" class="card"/>
206
+ <text x="450" y="684" text-anchor="middle" class="t-footer">NAVADA EDGE NETWORK — 4 Nodes | 25 Containers | 100% Docker | 2 AI Agents | 5 AI Models | MIT Open Source</text>
197
207
  </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "navada-edge-cli",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "Interactive CLI for the NAVADA Edge Network — explore nodes, agents, Cloudflare, AI, Docker, and MCP from your terminal",
5
5
  "main": "lib/cli.js",
6
6
  "bin": {