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 +426 -438
- package/dist/mcp/server.js +785 -144
- package/dist/mcp/server.js.map +1 -1
- package/dist/nodes/manager.js +16 -14
- package/dist/nodes/manager.js.map +1 -1
- package/dist/nodes/transfer.js +3 -3
- package/dist/nodes/transfer.js.map +1 -1
- package/package.json +1 -1
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§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-
|
|
12
|
-
<img src="https://img.shields.io/badge/
|
|
13
|
-
<img src="https://img.shields.io/badge/
|
|
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
|
-
| Tool | Description |
|
|
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
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
---
|
|
325
|
-
|
|
326
|
-
## Transport Modes
|
|
327
|
-
|
|
328
|
-
| Mode |
|
|
329
|
-
|
|
330
|
-
| `--stdio` | -- | Claude Code, Cursor, MCP subprocess
|
|
331
|
-
| `--sse-port=N` | 3200 | OpenCode, remote HTTP
|
|
332
|
-
| `--rest-port=N` | 3201 | Scripts, dashboards, non-MCP
|
|
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
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
```
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
-
|
|
423
|
-
|
|
424
|
-
|
|
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§ion=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§ion=footer" />
|
|
436
|
-
<img alt="footer" src="https://capsule-render.vercel.app/api?type=waving&color=0:0A0E14,50:1A1F2E,100:59C2FF&height=100§ion=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§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-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§ion=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§ion=footer" />
|
|
424
|
+
<img alt="footer" src="https://capsule-render.vercel.app/api?type=waving&color=0:0A0E14,50:1A1F2E,100:59C2FF&height=100§ion=footer" />
|
|
425
|
+
</picture>
|
|
426
|
+
</p>
|