omniwire 2.5.1 → 2.6.1

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,49 +1,20 @@
1
1
  <p align="center">
2
2
  <picture>
3
- <source media="(prefers-color-scheme: dark)" srcset="https://capsule-render.vercel.app/api?type=waving&color=0:0D1117,25:0D1B2A,50:162B44,75:1A3A5C,100:59C2FF&height=200&section=header&text=⚡%20OmniWire&fontSize=72&fontColor=59C2FF&animation=twinkling&fontAlignY=35&desc=Infrastructure%20Layer%20for%20AI%20Agent%20Swarms&descSize=18&descColor=8B949E&descAlignY=60" />
4
- <source media="(prefers-color-scheme: light)" srcset="https://capsule-render.vercel.app/api?type=waving&color=0:FFFFFF,25:F0F4F8,50:D8E2EE,75:B8CCE0,100:59C2FF&height=200&section=header&text=⚡%20OmniWire&fontSize=72&fontColor=0D1117&animation=twinkling&fontAlignY=35&desc=Infrastructure%20Layer%20for%20AI%20Agent%20Swarms&descSize=18&descColor=586069&descAlignY=60" />
5
- <img alt="OmniWire" src="https://capsule-render.vercel.app/api?type=waving&color=0:0D1117,25:0D1B2A,50:162B44,75:1A3A5C,100:59C2FF&height=200&section=header&text=⚡%20OmniWire&fontSize=72&fontColor=59C2FF&animation=twinkling&fontAlignY=35&desc=Infrastructure%20Layer%20for%20AI%20Agent%20Swarms&descSize=18&descColor=8B949E&descAlignY=60" />
3
+ <source media="(prefers-color-scheme: dark)" srcset="assets/banner-dark.svg" />
4
+ <source media="(prefers-color-scheme: light)" srcset="assets/banner-light.svg" />
5
+ <img alt="OmniWire — The infrastructure layer for AI agent swarms" src="assets/banner-dark.svg" width="900" />
6
6
  </picture>
7
7
  </p>
8
8
 
9
9
  <p align="center">
10
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=0D1117" alt="npm" /></a>
11
- <img src="https://img.shields.io/badge/MCP_Tools-54-59C2FF?style=for-the-badge&logo=lightning&logoColor=59C2FF&labelColor=0D1117" alt="tools" />
12
- <img src="https://img.shields.io/badge/A2A-Protocol-00C853?style=for-the-badge&logo=link&logoColor=00C853&labelColor=0D1117" alt="A2A" />
13
- <img src="https://img.shields.io/badge/Latency-~80ms-FF6D00?style=for-the-badge&logo=bolt&logoColor=FF6D00&labelColor=0D1117" alt="latency" />
14
- <img src="https://img.shields.io/badge/LZ4-Transfer-CC93E6?style=for-the-badge&logo=files&logoColor=CC93E6&labelColor=0D1117" alt="lz4" />
15
- <a href="LICENSE"><img src="https://img.shields.io/badge/License-GPL--3.0-8B949E?style=for-the-badge&logo=gnu&logoColor=8B949E&labelColor=0D1117" alt="license" /></a>
11
+ <img src="https://img.shields.io/badge/MCP_Tools-55-59C2FF?style=for-the-badge&labelColor=0D1117" alt="tools" />
12
+ <img src="https://img.shields.io/badge/A2A-Protocol-00C853?style=for-the-badge&labelColor=0D1117" alt="A2A" />
13
+ <img src="https://img.shields.io/badge/Latency-~80ms-FF6D00?style=for-the-badge&labelColor=0D1117" alt="latency" />
14
+ <img src="https://img.shields.io/badge/Background-Dispatch-CC93E6?style=for-the-badge&labelColor=0D1117" alt="background" />
15
+ <a href="LICENSE"><img src="https://img.shields.io/badge/GPL--3.0-license-8B949E?style=for-the-badge&labelColor=0D1117" alt="license" /></a>
16
16
  </p>
17
17
 
18
- <br/>
19
-
20
- <div align="center">
21
-
22
- **54 MCP tools** · **Agent-to-Agent messaging** · **Distributed task queues** · **Capability routing**
23
-
24
- AES-128-GCM SSH2 · LZ4 transfers · Circuit breakers · Multi-path failover · Pipeline DAGs · Blackboard architecture
25
-
26
- </div>
27
-
28
- <br/>
29
-
30
- <div align="center">
31
- <table>
32
- <tr>
33
- <td align="center">⚡ <b>~80ms</b><br/><sub>exec latency</sub></td>
34
- <td align="center">🔧 <b>54</b><br/><sub>MCP tools</sub></td>
35
- <td align="center">🔗 <b>A2A</b><br/><sub>agent protocol</sub></td>
36
- <td align="center">📦 <b>LZ4</b><br/><sub>fast transfer</sub></td>
37
- <td align="center">🛡️ <b>AES-128</b><br/><sub>GCM cipher</sub></td>
38
- <td align="center">🔄 <b>300ms</b><br/><sub>reconnect</sub></td>
39
- </tr>
40
- </table>
41
- </div>
42
-
43
- > **v2.5** &mdash; AES-128-GCM cipher, 2s keepalive, LZ4 compression, SFTP-first reads, agent registry, blackboard, task queues, capability routing. [Changelog →](#changelog)
44
-
45
- <br/>
46
-
47
18
  ---
48
19
 
49
20
  ## Quick Start
@@ -72,9 +43,9 @@ Add to your AI agent (Claude Code, Cursor, OpenCode, etc.):
72
43
  | Agents can't coordinate with each other | A2A messaging, events, semaphores |
73
44
  | Multi-step deploys need many round-trips | Pipelines chain steps in 1 call |
74
45
  | Flaky commands break agent loops | Built-in retry + assert + watch |
75
- | Long tasks block the agent | Background dispatch with task IDs |
46
+ | Long tasks block the agent | `background: true` on any tool |
76
47
  | Results lost between tool calls | Session store with `{{key}}` interpolation |
77
- | Different transfer methods for diff sizes | Auto-selects SFTP / netcat / aria2c |
48
+ | Different transfer methods for diff sizes | Auto-selects SFTP / netcat+LZ4 / aria2c |
78
49
  | SSH connections drop | Multi-path failover + circuit breaker |
79
50
 
80
51
  ---
@@ -94,9 +65,9 @@ graph TB
94
65
  direction TB
95
66
  MCP["MCP Protocol Layer<br/>stdio | SSE | REST"]
96
67
 
97
- subgraph tools["54 Tools"]
68
+ subgraph tools["55 Tools"]
98
69
  direction LR
99
- EXEC["Execution<br/>exec run batch<br/>broadcast pipeline"]
70
+ EXEC["Execution<br/>exec run batch<br/>broadcast pipeline bg"]
100
71
  AGENT["Agentic<br/>store watch task<br/>a2a events locks"]
101
72
  FILES["Files & Deploy<br/>read write transfer<br/>deploy find"]
102
73
  SYS["System & DevOps<br/>docker services<br/>cron env git syslog"]
@@ -106,7 +77,7 @@ graph TB
106
77
  subgraph engine["Core Engine"]
107
78
  direction LR
108
79
  POOL["SSH2 Pool<br/>persistent compressed<br/>circuit breaker"]
109
- XFER["Transfer Engine<br/>SFTP netcat+gzip<br/>aria2c 16-conn"]
80
+ XFER["Transfer Engine<br/>SFTP netcat+LZ4<br/>aria2c 16-conn"]
110
81
  CSYNC["Sync Engine<br/>PostgreSQL XChaCha20<br/>parallel reconcile"]
111
82
  end
112
83
  end
@@ -152,6 +123,7 @@ omniwire_run multi-line script (compact UI)
152
123
  omniwire_batch N commands, 1 tool call, chaining
153
124
  omniwire_broadcast parallel across all nodes
154
125
  omniwire_pipeline multi-step DAG with data flow
126
+ omniwire_bg poll/list background tasks
155
127
  ```
156
128
 
157
129
  </td>
@@ -175,7 +147,7 @@ omniwire_workflow reusable named DAGs
175
147
  ### Adaptive File Transfer
176
148
  ```
177
149
  < 10 MB SFTP native, 80ms
178
- 10M-1GB netcat+gzip compressed, 100ms
150
+ 10M-1GB netcat+LZ4 compressed, 100ms
179
151
  > 1 GB aria2c 16-parallel, max speed
180
152
  ```
181
153
 
@@ -189,9 +161,9 @@ Connected --> Health Ping (30s, parallel)
189
161
  Failure --> Multi-path Failover
190
162
  | WireGuard -> Tailscale -> Public IP
191
163
  |
192
- +--> Retry (500ms -> 1s -> ... -> 15s)
164
+ +--> Retry (300ms -> 600ms -> ... -> 10s)
193
165
  |
194
- 3 fails --> Circuit OPEN (20s) -> Auto-recover
166
+ 3 fails --> Circuit OPEN (15s) -> Auto-recover
195
167
  ```
196
168
 
197
169
  </td>
@@ -199,6 +171,18 @@ Failure --> Multi-path Failover
199
171
  <tr>
200
172
  <td>
201
173
 
174
+ ### Background Dispatch
175
+ ```
176
+ # Any tool supports background: true
177
+ exec(background=true) -> "bg-abc123"
178
+ bg(action="poll", id=..) -> "RUNNING (3.2s)"
179
+ bg(action="result", id=..) -> full output
180
+ bg(action="list") -> all tasks + status
181
+ ```
182
+
183
+ </td>
184
+ <td>
185
+
202
186
  ### Agentic Chaining
203
187
  ```
204
188
  exec(store_as="ip") store result
@@ -209,36 +193,21 @@ exec(retry=3, assert="ok") resilient
209
193
  watch(assert="ready") poll until
210
194
  ```
211
195
 
212
- </td>
213
- <td>
214
-
215
- ### CyberSync + CyberBase
216
- ```
217
- Nodes --push--> PostgreSQL (cyberbase)
218
- | |
219
- | XChaCha20-Poly1305
220
- | encrypted at rest
221
- |
222
- +--mirror--> Obsidian Vault
223
- |
224
- Obsidian Sync (cloud)
225
- ```
226
-
227
196
  </td>
228
197
  </tr>
229
198
  </table>
230
199
 
231
200
  ---
232
201
 
233
- ## All 54 Tools
202
+ ## All 55 Tools
234
203
 
235
- > **Every tool** supports `background: true` returns a task ID immediately. Poll with `omniwire_bg`.
204
+ > **Every tool** supports `background: true` -- returns a task ID immediately. Poll with `omniwire_bg`.
236
205
 
237
206
  ### Execution (6)
238
207
 
239
208
  | Tool | Description |
240
209
  |------|-------------|
241
- | `omniwire_exec` | Run command on any node. `retry`, `assert`, `store_as`, `format:"json"`, `{{key}}` interpolation. |
210
+ | `omniwire_exec` | Run command on any node. `retry`, `assert`, `store_as`, `format:"json"`, `{{key}}`, `via_vpn` for anonymous scanning. |
242
211
  | `omniwire_run` | Execute multi-line scripts via temp file. Keeps tool call UI clean. |
243
212
  | `omniwire_batch` | N commands in 1 call. Chaining with `{{prev}}`, `abort_on_fail`, parallel or sequential. |
244
213
  | `omniwire_broadcast` | Execute on all nodes simultaneously. JSON format support. |
@@ -298,10 +267,11 @@ Nodes --push--> PostgreSQL (cyberbase)
298
267
  | `omniwire_git` | Git commands on repos on any node |
299
268
  | `omniwire_syslog` | Query journalctl with filters |
300
269
 
301
- ### Network & Misc (5)
270
+ ### Network & VPN (6)
302
271
 
303
272
  | Tool | Description |
304
273
  |------|-------------|
274
+ | `omniwire_vpn` | Manage VPN (Mullvad/OpenVPN/WireGuard/Tailscale). Split-tunnel + full-node modes. Mesh stays connected. |
305
275
  | `omniwire_port_forward` | Create/list/close SSH tunnels |
306
276
  | `omniwire_open_browser` | Open URL in browser on a node |
307
277
  | `omniwire_shell` | Persistent PTY session (preserves cwd/env) |
@@ -327,30 +297,33 @@ Nodes --push--> PostgreSQL (cyberbase)
327
297
 
328
298
  ## Performance
329
299
 
330
- | Operation | Latency | v2.5 Optimization |
331
- |-----------|---------|-------------------|
332
- | **Command exec** | **~80ms** | AES-128-GCM cipher, persistent SSH2 channel, zero-fork `:` ping |
333
- | **Mesh status** | **~100ms** | Parallel probes, 5s cache, single `/proc` read (no pipes) |
334
- | **File read (<1MB)** | **~60ms** | SFTP-first path (skips `cat` shell fork) |
335
- | **Transfer (10MB)** | **~120ms** | LZ4 compression (10x faster than gzip), 50ms bind delay |
336
- | **Transfer (1GB)** | **~8s** | aria2c 16-connection parallel, 150ms server startup |
300
+ | Operation | Latency | Optimization |
301
+ |-----------|---------|-------------|
302
+ | **Command exec** | **~80ms** | AES-128-GCM cipher, persistent SSH2, zero-fork `:` ping |
303
+ | **Mesh status** | **~100ms** | Parallel probes, 5s cache, single `/proc` read |
304
+ | **File read (<1MB)** | **~60ms** | SFTP-first (skips `cat` fork) |
305
+ | **Transfer (10MB)** | **~120ms** | LZ4 compression (10x faster than gzip) |
306
+ | **Transfer (1GB)** | **~8s** | aria2c 16-connection parallel |
337
307
  | **Pipeline (5 steps)** | **~400ms** | `{{prev}}` interpolation, no extra tool calls |
338
- | **Health check (all)** | **~90ms** | Parallel Promise.allSettled, structured JSON |
308
+ | **Health check (all)** | **~90ms** | Parallel Promise.allSettled |
339
309
  | **A2A message** | **~85ms** | File-append queue, atomic dequeue |
340
- | **Config push** | **~150ms** | Parallel deploy + Obsidian mirror |
341
- | **Reconnect** | **~300ms** | 300ms initial delay (was 500ms), 2s keepalive detection |
342
-
343
- **Optimizations in v2.5:**
344
- - **Cipher**: AES-128-GCM (AES-NI accelerated) preferred over default negotiation
345
- - **Key exchange**: curve25519-sha256 preferred (fastest modern KEX)
346
- - **Keepalive**: 2s interval, 2 retries = 4s dead detection (was 6s)
347
- - **Port finder**: `shuf` (pure bash) replaces `python3 -c socket` (saves ~30ms per transfer)
348
- - **Compression**: LZ4-1 for transfers (10x faster than gzip, ~same ratio for mixed data)
349
- - **Buffer**: Array push + join replaces string concatenation (O(n) vs O(n^2) for large outputs)
310
+ | **Reconnect** | **~300ms** | 300ms initial, 2s keepalive, 15s circuit breaker |
311
+
312
+ <details>
313
+ <summary><b>Optimization details</b></summary>
314
+
315
+ - **Cipher**: AES-128-GCM (AES-NI hardware accelerated)
316
+ - **Key exchange**: curve25519-sha256 (fastest modern KEX)
317
+ - **Keepalive**: 2s interval, 2 retries = 4s dead detection
318
+ - **Port finder**: `shuf` (pure bash) replaces `python3 -c socket` (-30ms)
319
+ - **Compression**: LZ4-1 for transfers (10x faster than gzip)
320
+ - **Buffer**: Array push + join (O(n) vs O(n^2) string concat)
350
321
  - **Status**: Single `/proc` read replaces multiple piped commands
351
- - **Health ping**: `:` builtin replaces `true` (no hash lookup, no fork)
352
- - **Reads**: SFTP subsystem tried first, falls back to `cat` only on failure
353
- - **Circuit breaker**: 15s recovery (was 20s), 10s reconnect cap (was 15s)
322
+ - **Health ping**: `:` builtin (no hash lookup, no fork)
323
+ - **Reads**: SFTP tried first, `cat` fallback only on failure
324
+ - **Circuit breaker**: 15s recovery, 10s reconnect cap
325
+
326
+ </details>
354
327
 
355
328
  ---
356
329
 
@@ -362,7 +335,7 @@ Nodes --push--> PostgreSQL (cyberbase)
362
335
  - XChaCha20-Poly1305 at-rest encryption for synced configs
363
336
  - 2MB output guard prevents memory exhaustion
364
337
  - 4KB auto-truncation prevents context window bloat
365
- - Circuit breaker with 20s auto-recovery isolates failing nodes
338
+ - Circuit breaker isolates failing nodes
366
339
  - CORS restricted to localhost on REST API
367
340
 
368
341
  ---
@@ -402,56 +375,59 @@ Create `~/.omniwire/mesh.json`:
402
375
  ## Changelog
403
376
 
404
377
  <details>
405
- <summary><b>v2.5.0 -- Performance Overhaul, A2A Protocol Expansion</b></summary>
378
+ <summary><b>v2.6.0 -- VPN Integration, Mesh-Safe Anonymous Scanning</b></summary>
406
379
 
407
- **Performance**: AES-128-GCM cipher, curve25519-sha256 KEX, 2s keepalive, LZ4 transfers (10x faster), `shuf` port finder (-30ms), SFTP-first reads, array buffer concat, `/proc` single-read status, `:` builtin health ping, 300ms reconnect start, 15s circuit breaker.
380
+ **`omniwire_vpn`** tool: Mullvad, OpenVPN, WireGuard, Tailscale. Split-tunnel (per-command) + full-node modes. Mesh connectivity (wg0, wg1, Tailscale) always preserved via route exclusions and network namespace isolation.
408
381
 
409
- **4 new A2A tools** (49 -> 53): agent_registry (capability discovery), blackboard (swarm collaboration), task_queue (distributed work), capability (node routing).
382
+ **`via_vpn` on exec**: Route any command through VPN using Linux network namespaces. Only the command's traffic goes through VPN — SSH/WireGuard mesh stays on real interface.
410
383
 
411
- **Connectivity**: Always-on 2s keepalive with 4s dead detection. 5s connect timeout. 10s reconnect cap. 15s circuit recovery.
384
+ **Modes**: `connect` (split-tunnel), `full-on` (node-wide with mesh exclusions), `rotate` (new exit IP), `status`, `list`, `ip`.
412
385
 
413
386
  </details>
414
387
 
415
388
  <details>
416
- <summary><b>v2.4.0 -- Agentic Loop, A2A, Multi-Agent Orchestration</b></summary>
389
+ <summary><b>v2.5.1 -- Universal Background Dispatch</b></summary>
417
390
 
418
- **9 new agentic tools** (40 -> 49): store, pipeline, watch, healthcheck, agent_task, a2a_message, semaphore, event, workflow
391
+ **`background: true`** auto-injected into all 55 tools via server-level wrapper. Returns task ID, poll with `omniwire_bg`. New `omniwire_bg` tool for list/poll/result.
419
392
 
420
- **Agentic upgrades to existing tools**: `format:"json"`, `retry`, `assert`, `store_as`, `{{key}}` interpolation on exec/broadcast/batch
393
+ </details>
394
+
395
+ <details>
396
+ <summary><b>v2.5.0 -- Performance Overhaul, A2A Protocol Expansion</b></summary>
421
397
 
422
- **Dynamic response processing**: Structured JSON output, step-to-step data flow, session result store, abort-on-fail chains
398
+ **Performance**: AES-128-GCM cipher, curve25519-sha256 KEX, 2s keepalive, LZ4 transfers (10x faster), `shuf` port finder (-30ms), SFTP-first reads, array buffer concat, `/proc` single-read status, `:` builtin health ping, 300ms reconnect start, 15s circuit breaker.
399
+
400
+ **4 new A2A tools** (49 -> 53): agent_registry (capability discovery), blackboard (swarm collaboration), task_queue (distributed work), capability (node routing).
423
401
 
424
402
  </details>
425
403
 
426
404
  <details>
427
- <summary><b>v2.3.0 -- Compact Output, Speed, New Tools</b></summary>
405
+ <summary><b>v2.4.0 -- Agentic Loop, A2A, Multi-Agent Orchestration</b></summary>
428
406
 
429
- 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).
407
+ 9 new agentic tools (40 -> 49): store, pipeline, watch, healthcheck, agent_task, a2a_message, semaphore, event, workflow. Agentic upgrades: `format:"json"`, `retry`, `assert`, `store_as`, `{{key}}` interpolation.
430
408
 
431
409
  </details>
432
410
 
433
411
  <details>
434
- <summary><b>v2.2.1 -- Security & Bug Fixes</b></summary>
412
+ <summary><b>v2.3.0 -- Compact Output, Speed, New Tools</b></summary>
435
413
 
436
- Fixed script-only exec, shell race condition, transfer size guard, CORS restriction, input validation.
414
+ Output overhaul (auto-truncation, smart time, tabular multi-node). 6 new DevOps tools (cron, env, network, clipboard, git, syslog).
437
415
 
438
416
  </details>
439
417
 
440
418
  <details>
441
- <summary><b>v2.1.0 -- Multi-Path Failover & Performance</b></summary>
419
+ <summary><b>v2.2.1 -- v2.1.0</b></summary>
442
420
 
443
- Multi-path SSH (WireGuard/Tailscale/Public), SSH key caching, CyberBase integration, VaultBridge Obsidian mirror.
421
+ Security fixes, multi-path SSH failover, CyberBase integration, VaultBridge Obsidian mirror.
444
422
 
445
423
  </details>
446
424
 
447
425
  ---
448
426
 
449
- ## Architecture
450
-
451
427
  ```
452
428
  omniwire/
453
429
  src/
454
- mcp/ MCP server (54 tools, 3 transports)
430
+ mcp/ MCP server (55 tools, 3 transports)
455
431
  nodes/ SSH2 pool, transfer engine, PTY, tunnels
456
432
  sync/ CyberSync + CyberBase (PostgreSQL, Obsidian, encryption)
457
433
  protocol/ Mesh config, types, path parsing
@@ -459,12 +435,7 @@ omniwire/
459
435
  ui/ Terminal formatting
460
436
  ```
461
437
 
462
- ## Requirements
463
-
464
- - **Node.js** >= 20
465
- - **SSH access** to remote nodes (key-based auth)
466
- - **PostgreSQL** (only for CyberSync)
467
- - **WireGuard + Tailscale** recommended (multi-path failover)
438
+ **Requirements:** Node.js >= 20 &bull; SSH key access to nodes &bull; PostgreSQL (CyberSync only) &bull; WireGuard recommended
468
439
 
469
440
  ---
470
441
 
@@ -0,0 +1,82 @@
1
+ <svg width="900" height="220" xmlns="http://www.w3.org/2000/svg">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#0D1117"/>
5
+ <stop offset="40%" style="stop-color:#0D1B2A"/>
6
+ <stop offset="70%" style="stop-color:#162B44"/>
7
+ <stop offset="100%" style="stop-color:#1A3A5C"/>
8
+ </linearGradient>
9
+ <linearGradient id="textGrad" x1="0%" y1="0%" x2="100%" y2="0%">
10
+ <stop offset="0%" style="stop-color:#59C2FF"/>
11
+ <stop offset="50%" style="stop-color:#7DD3FC"/>
12
+ <stop offset="100%" style="stop-color:#59C2FF"/>
13
+ </linearGradient>
14
+ <filter id="glow">
15
+ <feGaussianBlur stdDeviation="3" result="blur"/>
16
+ <feMerge>
17
+ <feMergeNode in="blur"/>
18
+ <feMergeNode in="SourceGraphic"/>
19
+ </feMerge>
20
+ </filter>
21
+ <filter id="softGlow">
22
+ <feGaussianBlur stdDeviation="8" result="blur"/>
23
+ <feMerge>
24
+ <feMergeNode in="blur"/>
25
+ <feMergeNode in="SourceGraphic"/>
26
+ </feMerge>
27
+ </filter>
28
+ </defs>
29
+
30
+ <!-- Background -->
31
+ <rect width="900" height="220" fill="url(#bg)" rx="0"/>
32
+
33
+ <!-- Decorative dots/grid pattern -->
34
+ <g opacity="0.08" fill="#59C2FF">
35
+ <circle cx="50" cy="30" r="1.5"/>
36
+ <circle cx="100" cy="50" r="1"/>
37
+ <circle cx="150" cy="25" r="1.5"/>
38
+ <circle cx="200" cy="60" r="1"/>
39
+ <circle cx="250" cy="35" r="1.5"/>
40
+ <circle cx="700" cy="40" r="1.5"/>
41
+ <circle cx="750" cy="55" r="1"/>
42
+ <circle cx="800" cy="30" r="1.5"/>
43
+ <circle cx="850" cy="65" r="1"/>
44
+ <circle cx="120" cy="180" r="1"/>
45
+ <circle cx="780" cy="185" r="1.5"/>
46
+ <circle cx="400" cy="195" r="1"/>
47
+ <circle cx="550" cy="190" r="1.5"/>
48
+ </g>
49
+
50
+ <!-- Accent line -->
51
+ <line x1="300" y1="105" x2="600" y2="105" stroke="#59C2FF" stroke-width="1" opacity="0.15"/>
52
+
53
+ <!-- Main title -->
54
+ <text x="450" y="80" font-family="'Segoe UI', system-ui, -apple-system, sans-serif" font-size="72" font-weight="700" fill="url(#textGrad)" text-anchor="middle" filter="url(#glow)">OmniWire</text>
55
+
56
+ <!-- Lightning bolt accent -->
57
+ <text x="248" y="78" font-size="40" fill="#59C2FF" opacity="0.6" filter="url(#softGlow)">&#x26A1;</text>
58
+
59
+ <!-- Tagline -->
60
+ <text x="450" y="130" font-family="'Segoe UI', system-ui, -apple-system, sans-serif" font-size="20" font-weight="400" fill="#8B949E" text-anchor="middle">The infrastructure layer for AI agent swarms</text>
61
+
62
+ <!-- Stats bar -->
63
+ <g font-family="'Segoe UI Mono', 'SF Mono', monospace" font-size="13" fill="#59C2FF" opacity="0.7">
64
+ <text x="175" y="175" text-anchor="middle">55 MCP Tools</text>
65
+ <text x="325" y="175" text-anchor="middle">A2A Protocol</text>
66
+ <text x="450" y="175" text-anchor="middle">~80ms Latency</text>
67
+ <text x="575" y="175" text-anchor="middle">LZ4 Transfer</text>
68
+ <text x="725" y="175" text-anchor="middle">AES-128-GCM</text>
69
+ </g>
70
+
71
+ <!-- Separator dots between stats -->
72
+ <g fill="#59C2FF" opacity="0.3">
73
+ <circle cx="250" cy="172" r="2"/>
74
+ <circle cx="387" cy="172" r="2"/>
75
+ <circle cx="513" cy="172" r="2"/>
76
+ <circle cx="650" cy="172" r="2"/>
77
+ </g>
78
+
79
+ <!-- Bottom wave -->
80
+ <path d="M0,200 Q150,185 300,200 Q450,215 600,200 Q750,185 900,200 L900,220 L0,220 Z" fill="#59C2FF" opacity="0.08"/>
81
+ <path d="M0,205 Q200,190 400,205 Q600,220 900,205 L900,220 L0,220 Z" fill="#59C2FF" opacity="0.05"/>
82
+ </svg>
@@ -0,0 +1,75 @@
1
+ <svg width="900" height="220" xmlns="http://www.w3.org/2000/svg">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" style="stop-color:#FFFFFF"/>
5
+ <stop offset="40%" style="stop-color:#F0F4F8"/>
6
+ <stop offset="70%" style="stop-color:#D8E2EE"/>
7
+ <stop offset="100%" style="stop-color:#B8CCE0"/>
8
+ </linearGradient>
9
+ <linearGradient id="textGrad" x1="0%" y1="0%" x2="100%" y2="0%">
10
+ <stop offset="0%" style="stop-color:#0D1117"/>
11
+ <stop offset="50%" style="stop-color:#1A3A5C"/>
12
+ <stop offset="100%" style="stop-color:#0D1117"/>
13
+ </linearGradient>
14
+ <filter id="glow">
15
+ <feGaussianBlur stdDeviation="2" result="blur"/>
16
+ <feMerge>
17
+ <feMergeNode in="blur"/>
18
+ <feMergeNode in="SourceGraphic"/>
19
+ </feMerge>
20
+ </filter>
21
+ </defs>
22
+
23
+ <!-- Background -->
24
+ <rect width="900" height="220" fill="url(#bg)" rx="0"/>
25
+
26
+ <!-- Decorative dots -->
27
+ <g opacity="0.1" fill="#1A3A5C">
28
+ <circle cx="50" cy="30" r="1.5"/>
29
+ <circle cx="100" cy="50" r="1"/>
30
+ <circle cx="150" cy="25" r="1.5"/>
31
+ <circle cx="200" cy="60" r="1"/>
32
+ <circle cx="250" cy="35" r="1.5"/>
33
+ <circle cx="700" cy="40" r="1.5"/>
34
+ <circle cx="750" cy="55" r="1"/>
35
+ <circle cx="800" cy="30" r="1.5"/>
36
+ <circle cx="850" cy="65" r="1"/>
37
+ <circle cx="120" cy="180" r="1"/>
38
+ <circle cx="780" cy="185" r="1.5"/>
39
+ <circle cx="400" cy="195" r="1"/>
40
+ <circle cx="550" cy="190" r="1.5"/>
41
+ </g>
42
+
43
+ <!-- Accent line -->
44
+ <line x1="300" y1="105" x2="600" y2="105" stroke="#1A3A5C" stroke-width="1" opacity="0.12"/>
45
+
46
+ <!-- Main title -->
47
+ <text x="450" y="80" font-family="'Segoe UI', system-ui, -apple-system, sans-serif" font-size="72" font-weight="700" fill="url(#textGrad)" text-anchor="middle" filter="url(#glow)">OmniWire</text>
48
+
49
+ <!-- Lightning bolt accent -->
50
+ <text x="248" y="78" font-size="40" fill="#1A3A5C" opacity="0.5">&#x26A1;</text>
51
+
52
+ <!-- Tagline -->
53
+ <text x="450" y="130" font-family="'Segoe UI', system-ui, -apple-system, sans-serif" font-size="20" font-weight="400" fill="#586069" text-anchor="middle">The infrastructure layer for AI agent swarms</text>
54
+
55
+ <!-- Stats bar -->
56
+ <g font-family="'Segoe UI Mono', 'SF Mono', monospace" font-size="13" fill="#1A3A5C" opacity="0.6">
57
+ <text x="175" y="175" text-anchor="middle">55 MCP Tools</text>
58
+ <text x="325" y="175" text-anchor="middle">A2A Protocol</text>
59
+ <text x="450" y="175" text-anchor="middle">~80ms Latency</text>
60
+ <text x="575" y="175" text-anchor="middle">LZ4 Transfer</text>
61
+ <text x="725" y="175" text-anchor="middle">AES-128-GCM</text>
62
+ </g>
63
+
64
+ <!-- Separator dots between stats -->
65
+ <g fill="#1A3A5C" opacity="0.25">
66
+ <circle cx="250" cy="172" r="2"/>
67
+ <circle cx="387" cy="172" r="2"/>
68
+ <circle cx="513" cy="172" r="2"/>
69
+ <circle cx="650" cy="172" r="2"/>
70
+ </g>
71
+
72
+ <!-- Bottom wave -->
73
+ <path d="M0,200 Q150,185 300,200 Q450,215 600,200 Q750,185 900,200 L900,220 L0,220 Z" fill="#59C2FF" opacity="0.12"/>
74
+ <path d="M0,205 Q200,190 400,205 Q600,220 900,205 L900,220 L0,220 Z" fill="#59C2FF" opacity="0.08"/>
75
+ </svg>