omniwire 2.2.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,438 +1,426 @@
1
- <p align="center">
2
- <picture>
3
- <source media="(prefers-color-scheme: dark)" srcset="https://capsule-render.vercel.app/api?type=waving&color=0:0A0E14,50:1A1F2E,100:59C2FF&height=200&section=header&text=OmniWire&fontSize=72&fontColor=59C2FF&animation=fadeIn&fontAlignY=35&desc=Unified%20Mesh%20Control%20Layer&descSize=18&descColor=8B949E&descAlignY=55" />
4
- <source media="(prefers-color-scheme: light)" srcset="https://capsule-render.vercel.app/api?type=waving&color=0:E8EAED,50:D4D8DE,100:59C2FF&height=200&section=header&text=OmniWire&fontSize=72&fontColor=0A0E14&animation=fadeIn&fontAlignY=35&desc=Unified%20Mesh%20Control%20Layer&descSize=18&descColor=586069&descAlignY=55" />
5
- <img alt="OmniWire" src="https://capsule-render.vercel.app/api?type=waving&color=0:0A0E14,50:1A1F2E,100:59C2FF&height=200&section=header&text=OmniWire&fontSize=72&fontColor=59C2FF&animation=fadeIn&fontAlignY=35&desc=Unified%20Mesh%20Control%20Layer&descSize=18&descColor=8B949E&descAlignY=55" />
6
- </picture>
7
- </p>
8
-
9
- <p align="center">
10
- <a href="https://www.npmjs.com/package/omniwire"><img src="https://img.shields.io/npm/v/omniwire?style=for-the-badge&logo=npm&color=CB3837&labelColor=0A0E14" alt="npm" /></a>
11
- <img src="https://img.shields.io/badge/MCP-34_tools-59C2FF?style=for-the-badge&labelColor=0A0E14" alt="tools" />
12
- <img src="https://img.shields.io/badge/transport-stdio_%7C_SSE_%7C_REST-91B362?style=for-the-badge&labelColor=0A0E14" alt="transports" />
13
- <img src="https://img.shields.io/badge/node-%E2%89%A520-CC93E6?style=for-the-badge&logo=node.js&labelColor=0A0E14" alt="node" />
14
- <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-E6B450?style=for-the-badge&labelColor=0A0E14" alt="license" /></a>
15
- </p>
16
-
17
- <p align="center">
18
- <sub>One MCP server to control all your machines. Multi-path SSH2 failover, adaptive file transfers, encrypted cross-node config sync.</sub>
19
- </p>
20
-
21
- ---
22
-
23
- ## How It Works
24
-
25
- ```mermaid
26
- graph TB
27
- subgraph clients["AI Agents"]
28
- CC["Claude Code"]
29
- OC["OpenCode"]
30
- CU["Cursor / Any MCP Client"]
31
- end
32
-
33
- subgraph omniwire["OmniWire MCP Server"]
34
- direction TB
35
- MCP["MCP Protocol Layer\nstdio | SSE | REST"]
36
-
37
- subgraph tools["34 Tools"]
38
- direction LR
39
- EXEC["Execution\nexec run batch\nbroadcast"]
40
- FILES["Files\nread write\ntransfer deploy"]
41
- MON["Monitoring\nstatus metrics\nlogs"]
42
- SYS["System\ndocker services\nkernel"]
43
- SYNC["CyberSync\nsync diff\nsearch secrets"]
44
- end
45
-
46
- subgraph engine["Core Engine"]
47
- direction LR
48
- POOL["SSH2 Pool\npersistent compressed\ncircuit breaker"]
49
- XFER["Transfer Engine\nSFTP netcat+gzip\naria2c 16-conn"]
50
- CSYNC["Sync Engine\nPostgreSQL XChaCha20\nparallel reconcile"]
51
- end
52
- end
53
-
54
- subgraph mesh["Infrastructure Mesh"]
55
- direction LR
56
- N1["Node A\nstorage\n10.0.0.1"]
57
- N2["Node B\ncompute\n10.0.0.2"]
58
- N3["Node C\nGPU\n10.0.0.3"]
59
- N4["Node D\nlocal"]
60
- end
61
-
62
- DB[("PostgreSQL\nCyberSync DB")]
63
-
64
- CC & OC & CU -->|MCP| MCP
65
- MCP --> tools
66
- tools --> engine
67
- POOL -->|"SSH2 multi-path"| N1 & N2 & N3
68
- POOL -->|"local exec"| N4
69
- CSYNC --> DB
70
-
71
- style omniwire fill:#0A0E14,stroke:#59C2FF,stroke-width:2px,color:#C6D0E1
72
- style clients fill:#1A1F2E,stroke:#91B362,stroke-width:1px,color:#C6D0E1
73
- style mesh fill:#1A1F2E,stroke:#E6B450,stroke-width:1px,color:#C6D0E1
74
- style tools fill:#141922,stroke:#59C2FF,stroke-width:1px,color:#C6D0E1
75
- style engine fill:#141922,stroke:#CC93E6,stroke-width:1px,color:#C6D0E1
76
- style MCP fill:#1A1F2E,stroke:#59C2FF,color:#59C2FF
77
- style DB fill:#1A1F2E,stroke:#CC93E6,color:#CC93E6
78
- ```
79
-
80
- ---
81
-
82
- ## Features at a Glance
83
-
84
- <table>
85
- <tr>
86
- <td width="50%">
87
-
88
- ### Remote Execution
89
- ```
90
- omniwire_exec single command, any node
91
- omniwire_run multi-line script (compact UI)
92
- omniwire_batch N commands in 1 tool call
93
- omniwire_broadcast parallel across all nodes
94
- ```
95
-
96
- </td>
97
- <td width="50%">
98
-
99
- ### Adaptive File Transfer
100
- ```
101
- < 10 MB SFTP native, 80ms
102
- 10M-1GB netcat+gzip compressed, 200ms
103
- > 1 GB aria2c 16-parallel, max speed
104
- ```
105
-
106
- </td>
107
- </tr>
108
- <tr>
109
- <td>
110
-
111
- ### Connection Resilience
112
- ```
113
- Connected --> Health Ping (45s)
114
- | |
115
- | > 5s? --> Degraded warning
116
- |
117
- Failure --> Multi-path Failover
118
- | WireGuard --> Tailscale --> Public IP
119
- |
120
- +--> Retry (exp. backoff)
121
- | 500ms -> 1s -> 2s -> ... -> 15s
122
- |
123
- 3 fails --> Circuit OPEN (30s)
124
- --> Auto-recover
125
- ```
126
-
127
- </td>
128
- <td>
129
-
130
- ### CyberSync + CyberBase
131
- ```
132
- Node A --push--> PostgreSQL (cyberbase)
133
- | |
134
- | XChaCha20-Poly1305
135
- | encrypted at rest
136
- |
137
- +--mirror--> Obsidian Vault
138
- |
139
- Obsidian Sync (cloud)
140
-
141
- 6 AI tools synced automatically:
142
- Claude OpenCode Codex Gemini ...
143
- ```
144
-
145
- </td>
146
- </tr>
147
- </table>
148
-
149
- ---
150
-
151
- ## All 34 Tools
152
-
153
- <details>
154
- <summary><b>Execution (4 tools)</b></summary>
155
-
156
- | Tool | Description |
157
- |------|-------------|
158
- | `omniwire_exec` | Run a command on any node. Supports `label` for compact display. |
159
- | `omniwire_run` | Execute multi-line scripts via temp file. Keeps tool call UI clean. |
160
- | `omniwire_batch` | Run N commands across nodes in a single tool call. Parallel by default. |
161
- | `omniwire_broadcast` | Execute on all online nodes simultaneously. |
162
-
163
- </details>
164
-
165
- <details>
166
- <summary><b>Monitoring (3 tools)</b></summary>
167
-
168
- | Tool | Description |
169
- |------|-------------|
170
- | `omniwire_mesh_status` | Health, latency, CPU/mem/disk for all nodes |
171
- | `omniwire_node_info` | Detailed info for a specific node |
172
- | `omniwire_live_monitor` | Snapshot metrics: cpu, memory, disk, network |
173
-
174
- </details>
175
-
176
- <details>
177
- <summary><b>Files (4 tools)</b></summary>
178
-
179
- | Tool | Description |
180
- |------|-------------|
181
- | `omniwire_read_file` | Read file from any node. Supports `node:/path` format. |
182
- | `omniwire_write_file` | Write/create file on any node |
183
- | `omniwire_list_files` | List directory contents |
184
- | `omniwire_find_files` | Search by glob pattern across all nodes |
185
-
186
- </details>
187
-
188
- <details>
189
- <summary><b>Transfer & Deploy (2 tools)</b></summary>
190
-
191
- | Tool | Description |
192
- |------|-------------|
193
- | `omniwire_transfer_file` | Copy between nodes. Auto-selects SFTP/netcat/aria2c. |
194
- | `omniwire_deploy` | Deploy file from one node to all others in parallel |
195
-
196
- </details>
197
-
198
- <details>
199
- <summary><b>System (6 tools)</b></summary>
200
-
201
- | Tool | Description |
202
- |------|-------------|
203
- | `omniwire_process_list` | List/filter processes across nodes |
204
- | `omniwire_disk_usage` | Disk usage for all nodes |
205
- | `omniwire_tail_log` | Last N lines of a log file |
206
- | `omniwire_install_package` | Install via apt/npm/pip |
207
- | `omniwire_service_control` | systemd start/stop/restart/status |
208
- | `omniwire_docker` | Run docker commands on any node |
209
-
210
- </details>
211
-
212
- <details>
213
- <summary><b>Network (2 tools)</b></summary>
214
-
215
- | Tool | Description |
216
- |------|-------------|
217
- | `omniwire_port_forward` | Create/list/close SSH tunnels |
218
- | `omniwire_open_browser` | Open URL in browser on a node |
219
-
220
- </details>
221
-
222
- <details>
223
- <summary><b>Advanced (4 tools)</b></summary>
224
-
225
- | Tool | Description |
226
- |------|-------------|
227
- | `omniwire_kernel` | dmesg, sysctl, modprobe, lsmod, strace, perf |
228
- | `omniwire_shell` | Persistent PTY session (preserves cwd/env) |
229
- | `omniwire_stream` | Capture streaming output (tail -f, watch) |
230
- | `omniwire_update` | Self-update OmniWire |
231
-
232
- </details>
233
-
234
- <details>
235
- <summary><b>CyberSync (9 tools)</b></summary>
236
-
237
- | Tool | Description |
238
- |------|-------------|
239
- | `cybersync_status` | Sync status, item counts, pending syncs |
240
- | `cybersync_sync_now` | Trigger immediate reconciliation |
241
- | `cybersync_diff` | Show local vs database differences |
242
- | `cybersync_history` | Query sync event log |
243
- | `cybersync_search_knowledge` | Full-text search unified knowledge base |
244
- | `cybersync_get_memory` | Retrieve Claude memory from PostgreSQL |
245
- | `cybersync_manifest` | Show tracked files per tool |
246
- | `cybersync_force_push` | Force push file to all nodes |
247
- | `omniwire_secrets` | Get/set/delete/list/sync secrets (1Password, file, env) |
248
-
249
- </details>
250
-
251
- ---
252
-
253
- ## Quick Start
254
-
255
- ### Install
256
-
257
- ```bash
258
- npm install -g omniwire
259
- ```
260
-
261
- ### Configure Mesh
262
-
263
- Create `~/.omniwire/mesh.json`:
264
-
265
- ```json
266
- {
267
- "nodes": [
268
- {
269
- "id": "server1",
270
- "host": "10.0.0.1",
271
- "user": "root",
272
- "identityFile": "id_ed25519",
273
- "role": "storage"
274
- },
275
- {
276
- "id": "server2",
277
- "host": "10.0.0.2",
278
- "user": "root",
279
- "identityFile": "id_ed25519",
280
- "role": "compute"
281
- }
282
- ]
283
- }
284
- ```
285
-
286
- ### Add to Claude Code
287
-
288
- ```json
289
- {
290
- "mcpServers": {
291
- "omniwire": {
292
- "command": "omniwire",
293
- "args": ["--stdio"]
294
- }
295
- }
296
- }
297
- ```
298
-
299
- ### Interactive Mode
300
-
301
- ```bash
302
- omniwire # or: ow
303
- ```
304
-
305
- ---
306
-
307
- ## Performance
308
-
309
- | Operation | Latency | Details |
310
- |-----------|---------|---------|
311
- | **Command exec** | `~120ms` | SSH2 + command + return |
312
- | **Mesh status** | `~150ms` | Parallel probes, 8s cache |
313
- | **File read (<1MB)** | `~80ms` | SFTP, binary-safe |
314
- | **Transfer (10MB)** | `~200ms` | gzip netcat over WireGuard |
315
- | **Config push** | `~200ms` | Parallel to all nodes + Obsidian mirror |
316
- | **Reconcile (500 files)** | `~1.2s` | 100-file hash batches, parallel walkDir |
317
-
318
- ---
319
-
320
- ## Security
321
-
322
- All remote execution uses `ssh2.Client.exec()`, never `child_process.exec()`. Key-based auth only, no passwords stored. Multi-path failover (WireGuard → Tailscale → Public IP) with SSH key caching. CyberBase: single PostgreSQL DB for all projects. XChaCha20-Poly1305 at-rest encryption for synced configs. 2MB output guard prevents memory exhaustion. Circuit breaker with 30s auto-recovery isolates failing nodes.
323
-
324
- ---
325
-
326
- ## Transport Modes
327
-
328
- | Mode | Default Port | Use Case |
329
- |------|-------------|----------|
330
- | `--stdio` | -- | Claude Code, Cursor, MCP subprocess clients |
331
- | `--sse-port=N` | 3200 | OpenCode, remote HTTP-based MCP clients |
332
- | `--rest-port=N` | 3201 | Scripts, dashboards, non-MCP integrations |
333
-
334
- ```bash
335
- omniwire --stdio # MCP mode
336
- omniwire --sse-port=3200 --rest-port=3201 # HTTP mode
337
- omniwire --stdio --no-sync # MCP without CyberSync
338
- ```
339
-
340
- ---
341
-
342
- ## Changelog
343
-
344
- ### v2.2.1 — Security & Bug Fixes
345
-
346
- **omniwire_exec**
347
- - `command` is now optional when `script` is provided — previously rejected valid script-only calls
348
- - Scripts now respect the `timeout` parameter — previously scripts could run indefinitely
349
- - Removed unused `escaped` variable (dead code cleanup)
350
- - Output now uses the compact `ok()` helper with label support
351
-
352
- **omniwire_shell**
353
- - Fixed race condition: close listener is now registered before writing commands, preventing spurious 15s timeouts on fast-completing commands
354
-
355
- **transfer**
356
- - Added size guard on base64 fallback — files >1MB no longer silently fail with `ARG_MAX` overflow
357
-
358
- **REST API**
359
- - CORS restricted from `*` to `http://localhost` — prevents cross-origin command execution from browser tabs
360
- - Added input validation on `/api/exec` and `/api/transfer` endpoints
361
-
362
- **Reconnect backoff**
363
- - Fixed misleading comment: actual cap is 15s (comment previously said 30s)
364
-
365
- ---
366
-
367
- ### v2.1.0 Multi-Path Failover & Performance
368
-
369
- **Connectivity**
370
- - Multi-path host resolution: WireGuard → Tailscale → Public IP per node
371
- - Auto-reconnect tries all paths before marking node offline
372
- - `exec()` attempts immediate reconnect on offline nodes before failing
373
-
374
- **Performance**
375
- - SSH key caching (no repeated disk reads)
376
- - Compression disabled for small commands (faster round-trips)
377
- - Reconnect backoff: 500ms start, 15s cap (was 1s/30s)
378
- - Health ping interval: 45s (was 30s) with lighter `true` command
379
- - Status cache: 8s TTL (was 5s)
380
- - Circuit breaker recovery: 30s (was 60s)
381
-
382
- **CyberSync**
383
- - Parallel `walkDir` with 8 concurrent subdirectory scans
384
- - Hash batch size doubled (50 → 100)
385
- - Reconcile interval: 2min (was 5min)
386
- - Timing in reconcile logs
387
-
388
- **Output**
389
- - Compact `ok()` / `fail()` helpers for cleaner Claude Code results
390
- - `mesh_status` outputs aligned table with column headers
391
- - `node_info` shows which host path is active (WG/Tailscale/Public)
392
- - `exec` and `run` use `label` field as display tag
393
-
394
- **CyberBase Integration**
395
- - Renamed PostgreSQL database from `cybersync` to `cyberbase` (single DB for everything)
396
- - VaultBridge: mirrors all sync items, knowledge, and memory to Obsidian-compatible markdown
397
- - Obsidian vault at `~/Documents/BuisnessProjects/CyberBase` with Obsidian Sync for cloud backup
398
- - Daily event logs in `vault/logs/`
399
- - `obsidian-mcp` deployed on all mesh nodes for AI vault access
400
-
401
- ---
402
-
403
- ## Architecture
404
-
405
- ```
406
- omniwire/
407
- src/
408
- mcp/ MCP server (34 tools, 3 transports)
409
- nodes/ SSH2 pool, transfer engine, PTY, tunnels
410
- sync/ CyberSync + CyberBase (PostgreSQL, Obsidian vault, encryption)
411
- protocol/ Mesh config, types, path parsing
412
- commands/ Interactive REPL
413
- ui/ Terminal formatting
414
- ```
415
-
416
- ---
417
-
418
- ## Requirements
419
-
420
- - **Node.js** >= 20
421
- - **SSH access** to remote nodes (key-based auth)
422
- - **PostgreSQL** (only for CyberSync)
423
- - **WireGuard + Tailscale** recommended (multi-path failover uses both)
424
- - **Obsidian** (optional) for CyberBase vault browsing + Obsidian Sync cloud backup
425
-
426
- ---
427
-
428
- <p align="center">
429
- <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-E6B450?style=flat-square&labelColor=0A0E14" alt="MIT License" /></a>
430
- </p>
431
-
432
- <p align="center">
433
- <picture>
434
- <source media="(prefers-color-scheme: dark)" srcset="https://capsule-render.vercel.app/api?type=waving&color=0:0A0E14,50:1A1F2E,100:59C2FF&height=100&section=footer" />
435
- <source media="(prefers-color-scheme: light)" srcset="https://capsule-render.vercel.app/api?type=waving&color=0:E8EAED,50:D4D8DE,100:59C2FF&height=100&section=footer" />
436
- <img alt="footer" src="https://capsule-render.vercel.app/api?type=waving&color=0:0A0E14,50:1A1F2E,100:59C2FF&height=100&section=footer" />
437
- </picture>
438
- </p>
1
+ <p align="center">
2
+ <picture>
3
+ <source media="(prefers-color-scheme: dark)" srcset="https://capsule-render.vercel.app/api?type=waving&color=0:0A0E14,50:1A1F2E,100:59C2FF&height=200&section=header&text=OmniWire&fontSize=72&fontColor=59C2FF&animation=fadeIn&fontAlignY=35&desc=Unified%20Mesh%20Control%20Layer&descSize=18&descColor=8B949E&descAlignY=55" />
4
+ <source media="(prefers-color-scheme: light)" srcset="https://capsule-render.vercel.app/api?type=waving&color=0:E8EAED,50:D4D8DE,100:59C2FF&height=200&section=header&text=OmniWire&fontSize=72&fontColor=0A0E14&animation=fadeIn&fontAlignY=35&desc=Unified%20Mesh%20Control%20Layer&descSize=18&descColor=586069&descAlignY=55" />
5
+ <img alt="OmniWire" src="https://capsule-render.vercel.app/api?type=waving&color=0:0A0E14,50:1A1F2E,100:59C2FF&height=200&section=header&text=OmniWire&fontSize=72&fontColor=59C2FF&animation=fadeIn&fontAlignY=35&desc=Unified%20Mesh%20Control%20Layer&descSize=18&descColor=8B949E&descAlignY=55" />
6
+ </picture>
7
+ </p>
8
+
9
+ <p align="center">
10
+ <a href="https://www.npmjs.com/package/omniwire"><img src="https://img.shields.io/npm/v/omniwire?style=for-the-badge&logo=npm&color=CB3837&labelColor=0A0E14" alt="npm" /></a>
11
+ <img src="https://img.shields.io/badge/MCP-49_tools-59C2FF?style=for-the-badge&labelColor=0A0E14" alt="tools" />
12
+ <img src="https://img.shields.io/badge/A2A-ready-91B362?style=for-the-badge&labelColor=0A0E14" alt="A2A" />
13
+ <img src="https://img.shields.io/badge/transport-stdio_%7C_SSE_%7C_REST-E6B450?style=for-the-badge&labelColor=0A0E14" alt="transports" />
14
+ <img src="https://img.shields.io/badge/node-%E2%89%A520-CC93E6?style=for-the-badge&logo=node.js&labelColor=0A0E14" alt="node" />
15
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-8B949E?style=for-the-badge&labelColor=0A0E14" alt="license" /></a>
16
+ </p>
17
+
18
+ <p align="center">
19
+ <b>One MCP server to control all your machines.</b><br/>
20
+ <sub>49 tools. Multi-agent orchestration. A2A messaging. Distributed locking. Cross-node pipelines.</sub><br/>
21
+ <sub>SSH2 failover, adaptive file transfers, encrypted config sync, agentic chaining.</sub>
22
+ </p>
23
+
24
+ ---
25
+
26
+ ## Quick Start
27
+
28
+ ```bash
29
+ npm install -g omniwire
30
+ ```
31
+
32
+ Add to your AI agent (Claude Code, Cursor, OpenCode, etc.):
33
+
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "omniwire": { "command": "omniwire", "args": ["--stdio"] }
38
+ }
39
+ }
40
+ ```
41
+
42
+ ---
43
+
44
+ ## Why OmniWire?
45
+
46
+ | Problem | OmniWire Solution |
47
+ |---------|-------------------|
48
+ | Managing multiple servers manually | One tool call controls any node |
49
+ | Agents can't coordinate with each other | A2A messaging, events, semaphores |
50
+ | Multi-step deploys need many round-trips | Pipelines chain steps in 1 call |
51
+ | Flaky commands break agent loops | Built-in retry + assert + watch |
52
+ | Long tasks block the agent | Background dispatch with task IDs |
53
+ | Results lost between tool calls | Session store with `{{key}}` interpolation |
54
+ | Different transfer methods for diff sizes | Auto-selects SFTP / netcat / aria2c |
55
+ | SSH connections drop | Multi-path failover + circuit breaker |
56
+
57
+ ---
58
+
59
+ ## Architecture
60
+
61
+ ```mermaid
62
+ graph TB
63
+ subgraph clients["AI Agents"]
64
+ CC["Claude Code"]
65
+ OC["OpenCode / OpenClaw"]
66
+ CU["Cursor / Any MCP Client"]
67
+ A2["Other Agents (A2A)"]
68
+ end
69
+
70
+ subgraph omniwire["OmniWire MCP Server"]
71
+ direction TB
72
+ MCP["MCP Protocol Layer<br/>stdio | SSE | REST"]
73
+
74
+ subgraph tools["49 Tools"]
75
+ direction LR
76
+ EXEC["Execution<br/>exec run batch<br/>broadcast pipeline"]
77
+ AGENT["Agentic<br/>store watch task<br/>a2a events locks"]
78
+ FILES["Files & Deploy<br/>read write transfer<br/>deploy find"]
79
+ SYS["System & DevOps<br/>docker services<br/>cron env git syslog"]
80
+ SYNC["CyberSync<br/>sync diff search<br/>secrets knowledge"]
81
+ end
82
+
83
+ subgraph engine["Core Engine"]
84
+ direction LR
85
+ POOL["SSH2 Pool<br/>persistent compressed<br/>circuit breaker"]
86
+ XFER["Transfer Engine<br/>SFTP netcat+gzip<br/>aria2c 16-conn"]
87
+ CSYNC["Sync Engine<br/>PostgreSQL XChaCha20<br/>parallel reconcile"]
88
+ end
89
+ end
90
+
91
+ subgraph mesh["Infrastructure Mesh"]
92
+ direction LR
93
+ N1["Node A<br/>storage"]
94
+ N2["Node B<br/>compute"]
95
+ N3["Node C<br/>GPU"]
96
+ N4["Node D<br/>local"]
97
+ end
98
+
99
+ DB[("PostgreSQL<br/>CyberBase")]
100
+
101
+ CC & OC & CU & A2 -->|MCP| MCP
102
+ MCP --> tools
103
+ tools --> engine
104
+ POOL -->|"SSH2 multi-path"| N1 & N2 & N3
105
+ POOL -->|"local exec"| N4
106
+ CSYNC --> DB
107
+
108
+ style omniwire fill:#0A0E14,stroke:#59C2FF,stroke-width:2px,color:#C6D0E1
109
+ style clients fill:#1A1F2E,stroke:#91B362,stroke-width:1px,color:#C6D0E1
110
+ style mesh fill:#1A1F2E,stroke:#E6B450,stroke-width:1px,color:#C6D0E1
111
+ style tools fill:#141922,stroke:#59C2FF,stroke-width:1px,color:#C6D0E1
112
+ style engine fill:#141922,stroke:#CC93E6,stroke-width:1px,color:#C6D0E1
113
+ style MCP fill:#1A1F2E,stroke:#59C2FF,color:#59C2FF
114
+ style DB fill:#1A1F2E,stroke:#CC93E6,color:#CC93E6
115
+ ```
116
+
117
+ ---
118
+
119
+ ## Key Capabilities
120
+
121
+ <table>
122
+ <tr>
123
+ <td width="50%">
124
+
125
+ ### Execution
126
+ ```
127
+ omniwire_exec single command + retry + assert
128
+ omniwire_run multi-line script (compact UI)
129
+ omniwire_batch N commands, 1 tool call, chaining
130
+ omniwire_broadcast parallel across all nodes
131
+ omniwire_pipeline multi-step DAG with data flow
132
+ ```
133
+
134
+ </td>
135
+ <td width="50%">
136
+
137
+ ### Multi-Agent (A2A)
138
+ ```
139
+ omniwire_store session key-value store
140
+ omniwire_a2a_message agent-to-agent queues
141
+ omniwire_event pub/sub event bus
142
+ omniwire_semaphore distributed locking
143
+ omniwire_agent_task async background dispatch
144
+ omniwire_workflow reusable named DAGs
145
+ ```
146
+
147
+ </td>
148
+ </tr>
149
+ <tr>
150
+ <td>
151
+
152
+ ### Adaptive File Transfer
153
+ ```
154
+ < 10 MB SFTP native, 80ms
155
+ 10M-1GB netcat+gzip compressed, 100ms
156
+ > 1 GB aria2c 16-parallel, max speed
157
+ ```
158
+
159
+ </td>
160
+ <td>
161
+
162
+ ### Connection Resilience
163
+ ```
164
+ Connected --> Health Ping (30s, parallel)
165
+ |
166
+ Failure --> Multi-path Failover
167
+ | WireGuard -> Tailscale -> Public IP
168
+ |
169
+ +--> Retry (500ms -> 1s -> ... -> 15s)
170
+ |
171
+ 3 fails --> Circuit OPEN (20s) -> Auto-recover
172
+ ```
173
+
174
+ </td>
175
+ </tr>
176
+ <tr>
177
+ <td>
178
+
179
+ ### Agentic Chaining
180
+ ```
181
+ exec(store_as="ip") store result
182
+ exec(command="ping {{ip}}") interpolate
183
+ batch(abort_on_fail=true) fail-fast
184
+ exec(format="json") structured output
185
+ exec(retry=3, assert="ok") resilient
186
+ watch(assert="ready") poll until
187
+ ```
188
+
189
+ </td>
190
+ <td>
191
+
192
+ ### CyberSync + CyberBase
193
+ ```
194
+ Nodes --push--> PostgreSQL (cyberbase)
195
+ | |
196
+ | XChaCha20-Poly1305
197
+ | encrypted at rest
198
+ |
199
+ +--mirror--> Obsidian Vault
200
+ |
201
+ Obsidian Sync (cloud)
202
+ ```
203
+
204
+ </td>
205
+ </tr>
206
+ </table>
207
+
208
+ ---
209
+
210
+ ## All 49 Tools
211
+
212
+ ### Execution (5)
213
+
214
+ | Tool | Description |
215
+ |------|-------------|
216
+ | `omniwire_exec` | Run command on any node. `retry`, `assert`, `store_as`, `format:"json"`, `{{key}}` interpolation. |
217
+ | `omniwire_run` | Execute multi-line scripts via temp file. Keeps tool call UI clean. |
218
+ | `omniwire_batch` | N commands in 1 call. Chaining with `{{prev}}`, `abort_on_fail`, parallel or sequential. |
219
+ | `omniwire_broadcast` | Execute on all nodes simultaneously. JSON format support. |
220
+ | `omniwire_pipeline` | Multi-step DAG. `{{prev}}`/`{{stepN}}` interpolation, per-step error handling, cross-node. |
221
+
222
+ ### Agentic / A2A (9)
223
+
224
+ | Tool | Description |
225
+ |------|-------------|
226
+ | `omniwire_store` | Session key-value store. Persist results across tool calls for chaining. |
227
+ | `omniwire_watch` | Poll command until assert pattern matches. For deploys, builds, service readiness. |
228
+ | `omniwire_healthcheck` | Parallel health probe across all nodes (connectivity, disk, mem, load, docker). Single call. |
229
+ | `omniwire_agent_task` | Dispatch background tasks. Get task IDs, poll status, retrieve results. A2A async. |
230
+ | `omniwire_a2a_message` | Agent-to-agent message queues. Send/receive/peek on named channels. |
231
+ | `omniwire_semaphore` | Distributed locking. Atomic acquire/release to prevent race conditions. |
232
+ | `omniwire_event` | Pub/sub events. Emit/poll timestamped events per topic. ACP/A2A/ACPX compatible. |
233
+ | `omniwire_workflow` | Define and run reusable named workflows (DAGs). Stored on disk, triggered by any agent. |
234
+
235
+ ### Files & Transfer (6)
236
+
237
+ | Tool | Description |
238
+ |------|-------------|
239
+ | `omniwire_read_file` | Read file from any node. `node:/path` format. |
240
+ | `omniwire_write_file` | Write/create file on any node. |
241
+ | `omniwire_list_files` | List directory contents. |
242
+ | `omniwire_find_files` | Glob search across all nodes. |
243
+ | `omniwire_transfer_file` | Copy between nodes. Auto-selects SFTP/netcat/aria2c. |
244
+ | `omniwire_deploy` | Deploy file from one node to all others in parallel. |
245
+
246
+ ### Monitoring (3)
247
+
248
+ | Tool | Description |
249
+ |------|-------------|
250
+ | `omniwire_mesh_status` | Health, latency, CPU/mem/disk for all nodes. Tabular output. |
251
+ | `omniwire_node_info` | Detailed info for a specific node. |
252
+ | `omniwire_live_monitor` | Snapshot metrics: cpu, memory, disk, network. |
253
+
254
+ ### System & DevOps (12)
255
+
256
+ | Tool | Description |
257
+ |------|-------------|
258
+ | `omniwire_process_list` | List/filter processes across nodes |
259
+ | `omniwire_disk_usage` | Disk usage for all nodes |
260
+ | `omniwire_tail_log` | Last N lines of a log file |
261
+ | `omniwire_install_package` | Install via apt/npm/pip |
262
+ | `omniwire_service_control` | systemd start/stop/restart/status |
263
+ | `omniwire_docker` | Docker commands on any node |
264
+ | `omniwire_kernel` | dmesg, sysctl, modprobe, lsmod, strace, perf |
265
+ | `omniwire_cron` | List/add/remove cron jobs |
266
+ | `omniwire_env` | Get/set persistent environment variables |
267
+ | `omniwire_network` | ping, traceroute, dns, ports, speed, connections |
268
+ | `omniwire_git` | Git commands on repos on any node |
269
+ | `omniwire_syslog` | Query journalctl with filters |
270
+
271
+ ### Network & Misc (5)
272
+
273
+ | Tool | Description |
274
+ |------|-------------|
275
+ | `omniwire_port_forward` | Create/list/close SSH tunnels |
276
+ | `omniwire_open_browser` | Open URL in browser on a node |
277
+ | `omniwire_shell` | Persistent PTY session (preserves cwd/env) |
278
+ | `omniwire_stream` | Capture streaming output (tail -f, watch) |
279
+ | `omniwire_clipboard` | Shared clipboard buffer across mesh |
280
+
281
+ ### CyberSync (9)
282
+
283
+ | Tool | Description |
284
+ |------|-------------|
285
+ | `cybersync_status` | Sync status, item counts, pending syncs |
286
+ | `cybersync_sync_now` | Trigger immediate reconciliation |
287
+ | `cybersync_diff` | Show local vs database differences |
288
+ | `cybersync_history` | Query sync event log |
289
+ | `cybersync_search_knowledge` | Full-text search unified knowledge base |
290
+ | `cybersync_get_memory` | Retrieve Claude memory from PostgreSQL |
291
+ | `cybersync_manifest` | Show tracked files per tool |
292
+ | `cybersync_force_push` | Force push file to all nodes |
293
+ | `omniwire_secrets` | Get/set/delete/list/sync secrets (1Password, file, env) |
294
+ | `omniwire_update` | Self-update OmniWire |
295
+
296
+ ---
297
+
298
+ ## Performance
299
+
300
+ | Operation | Latency | Details |
301
+ |-----------|---------|---------|
302
+ | Command exec | ~120ms | SSH2 channel on persistent connection |
303
+ | Mesh status (all nodes) | ~150ms | Parallel probes, 5s cache |
304
+ | File read (<1MB) | ~80ms | SFTP, binary-safe |
305
+ | Transfer (10MB) | ~200ms | gzip netcat over WireGuard |
306
+ | Pipeline (5 steps) | ~600ms | Sequential with interpolation |
307
+ | Health check (4 nodes) | ~200ms | Parallel, structured output |
308
+ | A2A message send | ~130ms | File-based queue |
309
+ | Config push (all nodes) | ~200ms | Parallel + Obsidian mirror |
310
+
311
+ ---
312
+
313
+ ## Security
314
+
315
+ - All remote execution via `ssh2.Client.exec()` -- never `child_process.exec()`
316
+ - Key-based auth only, no passwords stored, SSH key caching
317
+ - Multi-path failover: WireGuard -> Tailscale -> Public IP
318
+ - XChaCha20-Poly1305 at-rest encryption for synced configs
319
+ - 2MB output guard prevents memory exhaustion
320
+ - 4KB auto-truncation prevents context window bloat
321
+ - Circuit breaker with 20s auto-recovery isolates failing nodes
322
+ - CORS restricted to localhost on REST API
323
+
324
+ ---
325
+
326
+ ## Transport Modes
327
+
328
+ | Mode | Port | Use Case |
329
+ |------|------|----------|
330
+ | `--stdio` | -- | Claude Code, Cursor, MCP subprocess |
331
+ | `--sse-port=N` | 3200 | OpenCode, remote HTTP MCP clients |
332
+ | `--rest-port=N` | 3201 | Scripts, dashboards, non-MCP |
333
+
334
+ ```bash
335
+ omniwire --stdio # MCP mode (default)
336
+ omniwire --sse-port=3200 --rest-port=3201 # HTTP mode
337
+ omniwire --stdio --no-sync # MCP without CyberSync
338
+ omniwire # or: ow # Interactive REPL
339
+ ```
340
+
341
+ ---
342
+
343
+ ## Configure Mesh
344
+
345
+ Create `~/.omniwire/mesh.json`:
346
+
347
+ ```json
348
+ {
349
+ "nodes": [
350
+ { "id": "server1", "host": "10.0.0.1", "user": "root", "identityFile": "id_ed25519", "role": "storage" },
351
+ { "id": "server2", "host": "10.0.0.2", "user": "root", "identityFile": "id_ed25519", "role": "compute" }
352
+ ]
353
+ }
354
+ ```
355
+
356
+ ---
357
+
358
+ ## Changelog
359
+
360
+ <details>
361
+ <summary><b>v2.4.0 -- Agentic Loop, A2A, Multi-Agent Orchestration</b></summary>
362
+
363
+ **9 new agentic tools** (40 -> 49): store, pipeline, watch, healthcheck, agent_task, a2a_message, semaphore, event, workflow
364
+
365
+ **Agentic upgrades to existing tools**: `format:"json"`, `retry`, `assert`, `store_as`, `{{key}}` interpolation on exec/broadcast/batch
366
+
367
+ **Dynamic response processing**: Structured JSON output, step-to-step data flow, session result store, abort-on-fail chains
368
+
369
+ </details>
370
+
371
+ <details>
372
+ <summary><b>v2.3.0 -- Compact Output, Speed, New Tools</b></summary>
373
+
374
+ Output overhaul (auto-truncation, smart time, tabular multi-node). Performance (parallel health pings, 3s keepalive, 20s circuit breaker, 6s connect timeout). 6 new DevOps tools (cron, env, network, clipboard, git, syslog).
375
+
376
+ </details>
377
+
378
+ <details>
379
+ <summary><b>v2.2.1 -- Security & Bug Fixes</b></summary>
380
+
381
+ Fixed script-only exec, shell race condition, transfer size guard, CORS restriction, input validation.
382
+
383
+ </details>
384
+
385
+ <details>
386
+ <summary><b>v2.1.0 -- Multi-Path Failover & Performance</b></summary>
387
+
388
+ Multi-path SSH (WireGuard/Tailscale/Public), SSH key caching, CyberBase integration, VaultBridge Obsidian mirror.
389
+
390
+ </details>
391
+
392
+ ---
393
+
394
+ ## Architecture
395
+
396
+ ```
397
+ omniwire/
398
+ src/
399
+ mcp/ MCP server (49 tools, 3 transports)
400
+ nodes/ SSH2 pool, transfer engine, PTY, tunnels
401
+ sync/ CyberSync + CyberBase (PostgreSQL, Obsidian, encryption)
402
+ protocol/ Mesh config, types, path parsing
403
+ commands/ Interactive REPL
404
+ ui/ Terminal formatting
405
+ ```
406
+
407
+ ## Requirements
408
+
409
+ - **Node.js** >= 20
410
+ - **SSH access** to remote nodes (key-based auth)
411
+ - **PostgreSQL** (only for CyberSync)
412
+ - **WireGuard + Tailscale** recommended (multi-path failover)
413
+
414
+ ---
415
+
416
+ <p align="center">
417
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-E6B450?style=flat-square&labelColor=0A0E14" alt="MIT License" /></a>
418
+ </p>
419
+
420
+ <p align="center">
421
+ <picture>
422
+ <source media="(prefers-color-scheme: dark)" srcset="https://capsule-render.vercel.app/api?type=waving&color=0:0A0E14,50:1A1F2E,100:59C2FF&height=100&section=footer" />
423
+ <source media="(prefers-color-scheme: light)" srcset="https://capsule-render.vercel.app/api?type=waving&color=0:E8EAED,50:D4D8DE,100:59C2FF&height=100&section=footer" />
424
+ <img alt="footer" src="https://capsule-render.vercel.app/api?type=waving&color=0:0A0E14,50:1A1F2E,100:59C2FF&height=100&section=footer" />
425
+ </picture>
426
+ </p>