omniwire 2.1.0 → 2.3.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/.mcp.json.disabled +8 -0
- package/LICENSE +21 -21
- package/README.md +485 -316
- package/clawhub-skill/SKILL.md +354 -0
- package/dist/claude/integration.js +15 -18
- package/dist/claude/integration.js.map +1 -1
- package/dist/commands/browser.js +1 -1
- package/dist/commands/browser.js.map +1 -1
- package/dist/commands/builtins.js +6 -6
- package/dist/commands/builtins.js.map +1 -1
- package/dist/mcp/index.js +8 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/rest.js +9 -1
- package/dist/mcp/rest.js.map +1 -1
- package/dist/mcp/server.js +351 -119
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/sync-tools.d.ts +2 -1
- package/dist/mcp/sync-tools.js +77 -1
- package/dist/mcp/sync-tools.js.map +1 -1
- package/dist/nodes/manager.d.ts +4 -0
- package/dist/nodes/manager.js +66 -27
- package/dist/nodes/manager.js.map +1 -1
- package/dist/nodes/transfer.js +11 -6
- package/dist/nodes/transfer.js.map +1 -1
- package/dist/protocol/config.d.ts +7 -1
- package/dist/protocol/config.js +73 -102
- package/dist/protocol/config.js.map +1 -1
- package/dist/sync/cookies.d.ts +52 -0
- package/dist/sync/cookies.js +259 -0
- package/dist/sync/cookies.js.map +1 -0
- package/dist/sync/db.d.ts +2 -0
- package/dist/sync/db.js +15 -0
- package/dist/sync/db.js.map +1 -1
- package/dist/sync/engine.d.ts +3 -1
- package/dist/sync/engine.js +22 -3
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.js +44 -9
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/manifest.js +5 -5
- package/dist/sync/manifest.js.map +1 -1
- package/dist/sync/openclaw-bridge.d.ts +9 -0
- package/dist/sync/openclaw-bridge.js +206 -0
- package/dist/sync/openclaw-bridge.js.map +1 -0
- package/dist/sync/paths.js +6 -7
- package/dist/sync/paths.js.map +1 -1
- package/dist/sync/secrets.js +14 -11
- package/dist/sync/secrets.js.map +1 -1
- package/dist/sync/types.d.ts +1 -0
- package/dist/sync/types.js +7 -7
- package/dist/sync/types.js.map +1 -1
- package/dist/sync/vault-bridge.d.ts +12 -0
- package/dist/sync/vault-bridge.js +152 -0
- package/dist/sync/vault-bridge.js.map +1 -0
- package/dist/ui/format.js +15 -14
- package/dist/ui/format.js.map +1 -1
- package/mesh.example.json +39 -0
- package/motd/00-cybernord +410 -0
- package/package.json +3 -37
package/README.md
CHANGED
|
@@ -1,316 +1,485 @@
|
|
|
1
|
-
<p align="center">
|
|
2
|
-
<
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
</p>
|
|
8
|
-
|
|
9
|
-
<
|
|
10
|
-
|
|
11
|
-
<
|
|
12
|
-
<
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
|
169
|
-
|
|
170
|
-
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
| `
|
|
241
|
-
| `
|
|
242
|
-
| `
|
|
243
|
-
| `
|
|
244
|
-
| `
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
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§ion=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§ion=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§ion=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-40_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["40 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 (30s, parallel)
|
|
114
|
+
| |
|
|
115
|
+
| > 3s? --> 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 (20s)
|
|
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 40 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>DevOps (6 tools) — NEW in v2.3.0</b></summary>
|
|
236
|
+
|
|
237
|
+
| Tool | Description |
|
|
238
|
+
|------|-------------|
|
|
239
|
+
| `omniwire_cron` | List/add/remove cron jobs on any node |
|
|
240
|
+
| `omniwire_env` | Get/set/list environment variables (persistent via /etc/environment) |
|
|
241
|
+
| `omniwire_network` | Network diagnostics: ping, traceroute, dns, ports, speed, connections |
|
|
242
|
+
| `omniwire_clipboard` | Shared clipboard buffer across all mesh nodes |
|
|
243
|
+
| `omniwire_git` | Run git commands on repos on any node |
|
|
244
|
+
| `omniwire_syslog` | Query journalctl with unit/priority/time filters |
|
|
245
|
+
|
|
246
|
+
</details>
|
|
247
|
+
|
|
248
|
+
<details>
|
|
249
|
+
<summary><b>CyberSync (9 tools)</b></summary>
|
|
250
|
+
|
|
251
|
+
| Tool | Description |
|
|
252
|
+
|------|-------------|
|
|
253
|
+
| `cybersync_status` | Sync status, item counts, pending syncs |
|
|
254
|
+
| `cybersync_sync_now` | Trigger immediate reconciliation |
|
|
255
|
+
| `cybersync_diff` | Show local vs database differences |
|
|
256
|
+
| `cybersync_history` | Query sync event log |
|
|
257
|
+
| `cybersync_search_knowledge` | Full-text search unified knowledge base |
|
|
258
|
+
| `cybersync_get_memory` | Retrieve Claude memory from PostgreSQL |
|
|
259
|
+
| `cybersync_manifest` | Show tracked files per tool |
|
|
260
|
+
| `cybersync_force_push` | Force push file to all nodes |
|
|
261
|
+
| `omniwire_secrets` | Get/set/delete/list/sync secrets (1Password, file, env) |
|
|
262
|
+
|
|
263
|
+
</details>
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## Quick Start
|
|
268
|
+
|
|
269
|
+
### Install
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
npm install -g omniwire
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Configure Mesh
|
|
276
|
+
|
|
277
|
+
Create `~/.omniwire/mesh.json`:
|
|
278
|
+
|
|
279
|
+
```json
|
|
280
|
+
{
|
|
281
|
+
"nodes": [
|
|
282
|
+
{
|
|
283
|
+
"id": "server1",
|
|
284
|
+
"host": "10.0.0.1",
|
|
285
|
+
"user": "root",
|
|
286
|
+
"identityFile": "id_ed25519",
|
|
287
|
+
"role": "storage"
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
"id": "server2",
|
|
291
|
+
"host": "10.0.0.2",
|
|
292
|
+
"user": "root",
|
|
293
|
+
"identityFile": "id_ed25519",
|
|
294
|
+
"role": "compute"
|
|
295
|
+
}
|
|
296
|
+
]
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Add to Claude Code
|
|
301
|
+
|
|
302
|
+
```json
|
|
303
|
+
{
|
|
304
|
+
"mcpServers": {
|
|
305
|
+
"omniwire": {
|
|
306
|
+
"command": "omniwire",
|
|
307
|
+
"args": ["--stdio"]
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Interactive Mode
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
omniwire # or: ow
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## Performance
|
|
322
|
+
|
|
323
|
+
| Operation | Latency | Details |
|
|
324
|
+
|-----------|---------|---------|
|
|
325
|
+
| **Command exec** | `~120ms` | SSH2 + command + return |
|
|
326
|
+
| **Mesh status** | `~150ms` | Parallel probes, 5s cache |
|
|
327
|
+
| **File read (<1MB)** | `~80ms` | SFTP, binary-safe |
|
|
328
|
+
| **Transfer (10MB)** | `~200ms` | gzip netcat over WireGuard |
|
|
329
|
+
| **Config push** | `~200ms` | Parallel to all nodes + Obsidian mirror |
|
|
330
|
+
| **Reconcile (500 files)** | `~1.2s` | 100-file hash batches, parallel walkDir |
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## Security
|
|
335
|
+
|
|
336
|
+
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 20s auto-recovery isolates failing nodes. Output auto-truncated at 4KB to prevent context bloat in AI agents.
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## Transport Modes
|
|
341
|
+
|
|
342
|
+
| Mode | Default Port | Use Case |
|
|
343
|
+
|------|-------------|----------|
|
|
344
|
+
| `--stdio` | -- | Claude Code, Cursor, MCP subprocess clients |
|
|
345
|
+
| `--sse-port=N` | 3200 | OpenCode, remote HTTP-based MCP clients |
|
|
346
|
+
| `--rest-port=N` | 3201 | Scripts, dashboards, non-MCP integrations |
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
omniwire --stdio # MCP mode
|
|
350
|
+
omniwire --sse-port=3200 --rest-port=3201 # HTTP mode
|
|
351
|
+
omniwire --stdio --no-sync # MCP without CyberSync
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
## Changelog
|
|
357
|
+
|
|
358
|
+
### v2.3.0 — Compact Output, Speed, New Tools
|
|
359
|
+
|
|
360
|
+
**Output Overhaul**
|
|
361
|
+
- Complete rewrite of MCP output formatting — compact, scannable, AI-agent optimized
|
|
362
|
+
- Auto-truncation at 4KB prevents context window bloat
|
|
363
|
+
- Smart time formatting: `342ms` for fast, `2.1s` for slow ops
|
|
364
|
+
- Multi-node results use `--` separator with per-node status markers
|
|
365
|
+
- One-liner responses for write/install/deploy/tunnel operations
|
|
366
|
+
- Mesh status now tabular with `+`/`-` online indicators
|
|
367
|
+
- Human-readable file sizes in transfer results (`1.2MB` not bytes)
|
|
368
|
+
- Error prefix standardized to `ERR` for quick scanning
|
|
369
|
+
- `label` parameter now used as primary display in all exec-type tools
|
|
370
|
+
|
|
371
|
+
**Performance**
|
|
372
|
+
- Health pings now parallel (`Promise.allSettled`) instead of serial loop
|
|
373
|
+
- Keepalive interval: 3s (was 5s) — faster dead connection detection
|
|
374
|
+
- Keepalive max retries: 2 (was 3) — 6s detection vs 15s
|
|
375
|
+
- Status cache TTL: 5s (was 8s) — fresher data
|
|
376
|
+
- Circuit breaker recovery: 20s (was 30s) — faster node recovery
|
|
377
|
+
- Connection timeout: 6s (was 8s) — faster failover
|
|
378
|
+
- Transfer netcat sleep: 100ms (was 200ms)
|
|
379
|
+
- Transfer aria2c sleep: 250ms (was 500ms)
|
|
380
|
+
|
|
381
|
+
**6 New Tools (34 → 40)**
|
|
382
|
+
- `omniwire_cron` — manage cron jobs (list/add/remove) on any node
|
|
383
|
+
- `omniwire_env` — get/set/list persistent environment variables
|
|
384
|
+
- `omniwire_network` — diagnostics: ping, traceroute, dns, ports, speed, connections
|
|
385
|
+
- `omniwire_clipboard` — shared clipboard buffer across all mesh nodes
|
|
386
|
+
- `omniwire_git` — run git commands on repos on any node
|
|
387
|
+
- `omniwire_syslog` — query journalctl with unit/priority/time filters
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
### v2.2.1 — Security & Bug Fixes
|
|
392
|
+
|
|
393
|
+
**omniwire_exec**
|
|
394
|
+
- `command` is now optional when `script` is provided — previously rejected valid script-only calls
|
|
395
|
+
- Scripts now respect the `timeout` parameter — previously scripts could run indefinitely
|
|
396
|
+
- Removed unused `escaped` variable (dead code cleanup)
|
|
397
|
+
- Output now uses the compact `ok()` helper with label support
|
|
398
|
+
|
|
399
|
+
**omniwire_shell**
|
|
400
|
+
- Fixed race condition: close listener is now registered before writing commands, preventing spurious 15s timeouts on fast-completing commands
|
|
401
|
+
|
|
402
|
+
**transfer**
|
|
403
|
+
- Added size guard on base64 fallback — files >1MB no longer silently fail with `ARG_MAX` overflow
|
|
404
|
+
|
|
405
|
+
**REST API**
|
|
406
|
+
- CORS restricted from `*` to `http://localhost` — prevents cross-origin command execution from browser tabs
|
|
407
|
+
- Added input validation on `/api/exec` and `/api/transfer` endpoints
|
|
408
|
+
|
|
409
|
+
**Reconnect backoff**
|
|
410
|
+
- Fixed misleading comment: actual cap is 15s (comment previously said 30s)
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
### v2.1.0 — Multi-Path Failover & Performance
|
|
415
|
+
|
|
416
|
+
**Connectivity**
|
|
417
|
+
- Multi-path host resolution: WireGuard → Tailscale → Public IP per node
|
|
418
|
+
- Auto-reconnect tries all paths before marking node offline
|
|
419
|
+
- `exec()` attempts immediate reconnect on offline nodes before failing
|
|
420
|
+
|
|
421
|
+
**Performance**
|
|
422
|
+
- SSH key caching (no repeated disk reads)
|
|
423
|
+
- Compression disabled for small commands (faster round-trips)
|
|
424
|
+
- Reconnect backoff: 500ms start, 15s cap (was 1s/30s)
|
|
425
|
+
- Health ping interval: 45s (was 30s) with lighter `true` command
|
|
426
|
+
- Status cache: 8s TTL (was 5s)
|
|
427
|
+
- Circuit breaker recovery: 30s (was 60s)
|
|
428
|
+
|
|
429
|
+
**CyberSync**
|
|
430
|
+
- Parallel `walkDir` with 8 concurrent subdirectory scans
|
|
431
|
+
- Hash batch size doubled (50 → 100)
|
|
432
|
+
- Reconcile interval: 2min (was 5min)
|
|
433
|
+
- Timing in reconcile logs
|
|
434
|
+
|
|
435
|
+
**Output**
|
|
436
|
+
- Compact `ok()` / `fail()` helpers for cleaner Claude Code results
|
|
437
|
+
- `mesh_status` outputs aligned table with column headers
|
|
438
|
+
- `node_info` shows which host path is active (WG/Tailscale/Public)
|
|
439
|
+
- `exec` and `run` use `label` field as display tag
|
|
440
|
+
|
|
441
|
+
**CyberBase Integration**
|
|
442
|
+
- Renamed PostgreSQL database from `cybersync` to `cyberbase` (single DB for everything)
|
|
443
|
+
- VaultBridge: mirrors all sync items, knowledge, and memory to Obsidian-compatible markdown
|
|
444
|
+
- Obsidian vault at `~/Documents/BuisnessProjects/CyberBase` with Obsidian Sync for cloud backup
|
|
445
|
+
- Daily event logs in `vault/logs/`
|
|
446
|
+
- `obsidian-mcp` deployed on all mesh nodes for AI vault access
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
## Architecture
|
|
451
|
+
|
|
452
|
+
```
|
|
453
|
+
omniwire/
|
|
454
|
+
src/
|
|
455
|
+
mcp/ MCP server (40 tools, 3 transports)
|
|
456
|
+
nodes/ SSH2 pool, transfer engine, PTY, tunnels
|
|
457
|
+
sync/ CyberSync + CyberBase (PostgreSQL, Obsidian vault, encryption)
|
|
458
|
+
protocol/ Mesh config, types, path parsing
|
|
459
|
+
commands/ Interactive REPL
|
|
460
|
+
ui/ Terminal formatting
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
## Requirements
|
|
466
|
+
|
|
467
|
+
- **Node.js** >= 20
|
|
468
|
+
- **SSH access** to remote nodes (key-based auth)
|
|
469
|
+
- **PostgreSQL** (only for CyberSync)
|
|
470
|
+
- **WireGuard + Tailscale** recommended (multi-path failover uses both)
|
|
471
|
+
- **Obsidian** (optional) for CyberBase vault browsing + Obsidian Sync cloud backup
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
<p align="center">
|
|
476
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-E6B450?style=flat-square&labelColor=0A0E14" alt="MIT License" /></a>
|
|
477
|
+
</p>
|
|
478
|
+
|
|
479
|
+
<p align="center">
|
|
480
|
+
<picture>
|
|
481
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://capsule-render.vercel.app/api?type=waving&color=0:0A0E14,50:1A1F2E,100:59C2FF&height=100§ion=footer" />
|
|
482
|
+
<source media="(prefers-color-scheme: light)" srcset="https://capsule-render.vercel.app/api?type=waving&color=0:E8EAED,50:D4D8DE,100:59C2FF&height=100§ion=footer" />
|
|
483
|
+
<img alt="footer" src="https://capsule-render.vercel.app/api?type=waving&color=0:0A0E14,50:1A1F2E,100:59C2FF&height=100§ion=footer" />
|
|
484
|
+
</picture>
|
|
485
|
+
</p>
|