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 +216 -76
- package/lib/agent.js +30 -8
- package/lib/cli.js +14 -10
- package/lib/commands/setup.js +57 -88
- package/lib/commands/system.js +26 -5
- package/network.svg +194 -184
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,145 +1,285 @@
|
|
|
1
1
|
# navada-edge-cli
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-

|
|
12
52
|
|
|
13
53
|
## Quick Start
|
|
14
54
|
|
|
15
55
|
```bash
|
|
16
|
-
#
|
|
56
|
+
# Install
|
|
57
|
+
npm install -g navada-edge-cli
|
|
58
|
+
|
|
59
|
+
# Start the CLI
|
|
17
60
|
navada
|
|
18
61
|
|
|
19
|
-
#
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
69
|
+
The CLI accepts **any** API key:
|
|
27
70
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
33
|
-
navada login <your-api-key>
|
|
78
|
+
## Features
|
|
34
79
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
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
|
-
|
|
100
|
+
### Two AI Agents
|
|
45
101
|
|
|
46
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
●
|
|
63
|
-
|
|
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
|
-
|
|
119
|
+
### 45+ Slash Commands
|
|
120
|
+
|
|
121
|
+
Use `/commands` for direct control, or just type naturally for the AI agent.
|
|
69
122
|
|
|
70
|
-
|
|
123
|
+
**Network**
|
|
71
124
|
| Command | Description |
|
|
72
125
|
|---------|-------------|
|
|
73
126
|
| `/status` | Ping all nodes + cloud services |
|
|
74
127
|
| `/nodes` | Show node configuration |
|
|
75
|
-
| `/
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
|
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
|
-
|
|
134
|
+
**Agents**
|
|
84
135
|
| Command | Description |
|
|
85
136
|
|---------|-------------|
|
|
86
|
-
| `/
|
|
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
|
|
142
|
+
| `/lucas deploy <name> <node>` | Deploy container |
|
|
90
143
|
|
|
91
|
-
|
|
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
|
-
|
|
152
|
+
**AI**
|
|
98
153
|
| Command | Description |
|
|
99
154
|
|---------|-------------|
|
|
100
|
-
| `/
|
|
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
|
-
|
|
163
|
+
**Cloudflare**
|
|
103
164
|
| Command | Description |
|
|
104
165
|
|---------|-------------|
|
|
105
166
|
| `/r2 ls [prefix]` | List R2 objects |
|
|
106
|
-
| `/r2
|
|
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> <
|
|
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
|
|
173
|
+
| `/trace <url>` | Trace through WAF |
|
|
114
174
|
|
|
115
|
-
|
|
175
|
+
**Database**
|
|
116
176
|
| Command | Description |
|
|
117
177
|
|---------|-------------|
|
|
118
|
-
| `/
|
|
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
|
-
|
|
180
|
+
**System**
|
|
124
181
|
| Command | Description |
|
|
125
182
|
|---------|-------------|
|
|
126
|
-
| `/
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
|
130
|
-
|
|
131
|
-
| `/
|
|
132
|
-
| `/
|
|
133
|
-
| `/
|
|
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
|
-
|
|
|
142
|
-
|
|
|
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
|
-
|
|
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
|
|
104
|
-
|
|
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(
|
|
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 {
|
|
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 {
|
|
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
|
|
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
|
-
//
|
|
89
|
-
if (config.isFirstRun())
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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');
|
package/lib/commands/setup.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
//
|
|
31
|
-
console.log(ui.dim('
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
//
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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({
|
|
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
|
|
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
|
|
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 (
|
|
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
|
-
//
|
|
98
|
-
const theme = await ask(rl, '
|
|
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
|
-
//
|
|
124
|
-
console.log(ui.box('
|
|
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
|
|
133
|
-
await runSetup();
|
|
101
|
+
reg('setup', 'Run setup wizard', async () => {
|
|
102
|
+
await runSetup(true);
|
|
134
103
|
}, { category: 'SYSTEM' });
|
|
135
104
|
};
|
|
136
105
|
|
package/lib/commands/system.js
CHANGED
|
@@ -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]) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
|
2
|
-
<
|
|
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="
|
|
6
|
-
<text x="
|
|
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="
|
|
23
|
-
<text x="
|
|
24
|
-
<text x="
|
|
25
|
-
<text x="
|
|
26
|
-
<text x="
|
|
27
|
-
<text x="
|
|
28
|
-
<text x="
|
|
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="
|
|
32
|
-
<polygon points="
|
|
33
|
-
|
|
34
|
-
<!--
|
|
35
|
-
<text x="
|
|
36
|
-
|
|
37
|
-
<!--
|
|
38
|
-
<rect x="
|
|
39
|
-
<rect x="
|
|
40
|
-
<rect x="
|
|
41
|
-
<
|
|
42
|
-
<text x="
|
|
43
|
-
<text x="
|
|
44
|
-
<text x="
|
|
45
|
-
<
|
|
46
|
-
|
|
47
|
-
<text x="
|
|
48
|
-
<line x1="
|
|
49
|
-
<text x="
|
|
50
|
-
<line x1="
|
|
51
|
-
<text x="
|
|
52
|
-
<line x1="
|
|
53
|
-
<text x="
|
|
54
|
-
<line x1="
|
|
55
|
-
<text x="
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
<
|
|
59
|
-
<
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
<
|
|
63
|
-
<
|
|
64
|
-
<
|
|
65
|
-
<text x="
|
|
66
|
-
<
|
|
67
|
-
<text x="
|
|
68
|
-
<
|
|
69
|
-
<
|
|
70
|
-
<
|
|
71
|
-
<
|
|
72
|
-
<
|
|
73
|
-
<
|
|
74
|
-
<
|
|
75
|
-
<
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
<
|
|
79
|
-
<
|
|
80
|
-
<
|
|
81
|
-
<
|
|
82
|
-
<text x="
|
|
83
|
-
<
|
|
84
|
-
<text x="
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
<
|
|
88
|
-
<
|
|
89
|
-
<
|
|
90
|
-
<
|
|
91
|
-
<text x="
|
|
92
|
-
<
|
|
93
|
-
<text x="
|
|
94
|
-
<
|
|
95
|
-
<text x="
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
<
|
|
99
|
-
<
|
|
100
|
-
<
|
|
101
|
-
<
|
|
102
|
-
<
|
|
103
|
-
<text x="
|
|
104
|
-
<
|
|
105
|
-
<text x="
|
|
106
|
-
<line x1="
|
|
107
|
-
<text x="
|
|
108
|
-
<line x1="
|
|
109
|
-
<text x="
|
|
110
|
-
|
|
111
|
-
<!--
|
|
112
|
-
<
|
|
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="
|
|
131
|
-
<rect x="
|
|
132
|
-
<
|
|
133
|
-
<text x="
|
|
134
|
-
<
|
|
135
|
-
<
|
|
136
|
-
<text x="
|
|
137
|
-
<text x="
|
|
138
|
-
<
|
|
139
|
-
<text x="
|
|
140
|
-
<
|
|
141
|
-
<text x="
|
|
142
|
-
<
|
|
143
|
-
<text x="
|
|
144
|
-
|
|
145
|
-
|
|
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="
|
|
149
|
-
<rect x="
|
|
150
|
-
<
|
|
151
|
-
<text x="
|
|
152
|
-
<
|
|
153
|
-
<
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
<rect x="
|
|
159
|
-
<rect x="
|
|
160
|
-
<
|
|
161
|
-
<text x="
|
|
162
|
-
<text x="
|
|
163
|
-
|
|
164
|
-
<
|
|
165
|
-
<
|
|
166
|
-
<
|
|
167
|
-
<text x="
|
|
168
|
-
<
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
<text x="
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
<rect x="
|
|
175
|
-
<text x="
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
<
|
|
179
|
-
<text x="
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
<
|
|
183
|
-
<text x="
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
<
|
|
187
|
-
<text x="
|
|
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="
|
|
195
|
-
<text x="
|
|
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