@empir3/empir3-bridge 0.3.21

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.
Files changed (62) hide show
  1. package/CHANGELOG.md +1531 -0
  2. package/CODE_OF_CONDUCT.md +9 -0
  3. package/CONTRIBUTING.md +75 -0
  4. package/LICENSE +21 -0
  5. package/README.md +464 -0
  6. package/SECURITY.md +130 -0
  7. package/assets/accuracy-lab.html +2639 -0
  8. package/assets/api-clis-real.jpg +0 -0
  9. package/assets/bridge-console-hero.jpg +0 -0
  10. package/assets/browser-privacy.svg +151 -0
  11. package/assets/demo-orchestration.svg +74 -0
  12. package/assets/desktop-select-region.jpg +0 -0
  13. package/assets/in-page-chat.gif +0 -0
  14. package/assets/orchestration-hero.svg +126 -0
  15. package/assets/social-preview.png +0 -0
  16. package/assets/zara-accent.png +0 -0
  17. package/build/bootstrap.js +548 -0
  18. package/build/build.js +680 -0
  19. package/build/payload-entry.js +649 -0
  20. package/build/payload-signing-pub.json +7 -0
  21. package/docs/AGENT_GUIDE.md +259 -0
  22. package/docs/RELEASE.md +106 -0
  23. package/docs/SAFETY.md +112 -0
  24. package/docs/TESTING.md +181 -0
  25. package/installer/server.js +231 -0
  26. package/installer/ui/app.js +278 -0
  27. package/installer/ui/index.html +24 -0
  28. package/installer/ui/styles.css +146 -0
  29. package/package.json +95 -0
  30. package/scripts/bootstrap-e2e.mjs +650 -0
  31. package/scripts/certify-bridge.mjs +636 -0
  32. package/scripts/check-companion-surface.mjs +118 -0
  33. package/scripts/extract-welcome.mjs +64 -0
  34. package/scripts/gh-route-handler-check.mjs +57 -0
  35. package/scripts/gh-wire-test.mjs +107 -0
  36. package/scripts/publish-downloads.mjs +180 -0
  37. package/scripts/smoke-all-tools.mjs +509 -0
  38. package/scripts/smoke-live-bridge.mjs +696 -0
  39. package/scripts/splice-welcome.mjs +63 -0
  40. package/scripts/welcome-body.txt +2733 -0
  41. package/src/anthropic-client.ts +192 -0
  42. package/src/bootstrap-exe.ts +69 -0
  43. package/src/bridge.ts +2444 -0
  44. package/src/chat.ts +345 -0
  45. package/src/cli-runner.ts +239 -0
  46. package/src/cli.ts +649 -0
  47. package/src/config.ts +199 -0
  48. package/src/desktop-overlay.ps1 +121 -0
  49. package/src/executable-resolver.ts +330 -0
  50. package/src/handlers/agy-imagegen.ts +179 -0
  51. package/src/handlers/github-cli.ts +399 -0
  52. package/src/handlers/higgsfield-cli.ts +783 -0
  53. package/src/launch.js +337 -0
  54. package/src/mcp-server.ts +1265 -0
  55. package/src/pair-claim.ts +218 -0
  56. package/src/payload-daemon.ts +168 -0
  57. package/src/server.ts +21036 -0
  58. package/src/tool-defaults.ts +230 -0
  59. package/src/update-check.js +136 -0
  60. package/tray/build.py +76 -0
  61. package/tray/requirements.txt +2 -0
  62. package/tray/tray.py +1843 -0
Binary file
Binary file
@@ -0,0 +1,151 @@
1
+ <svg width="1180" height="600" viewBox="0 0 1180 600" fill="none" xmlns="http://www.w3.org/2000/svg" font-family="'Segoe UI', system-ui, -apple-system, 'Helvetica Neue', Arial, sans-serif">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0" y1="0" x2="1180" y2="600" gradientUnits="userSpaceOnUse">
4
+ <stop offset="0" stop-color="#0b1020"/>
5
+ <stop offset="1" stop-color="#0a0e1c"/>
6
+ </linearGradient>
7
+ <linearGradient id="win" x1="0" y1="0" x2="0" y2="1">
8
+ <stop offset="0" stop-color="#161d33"/>
9
+ <stop offset="1" stop-color="#111729"/>
10
+ </linearGradient>
11
+ <linearGradient id="wall" x1="0" y1="0" x2="0" y2="1">
12
+ <stop offset="0" stop-color="#2b3354"/>
13
+ <stop offset="1" stop-color="#1a2038"/>
14
+ </linearGradient>
15
+ <linearGradient id="violetEdge" x1="0" y1="0" x2="0" y2="1">
16
+ <stop offset="0" stop-color="#8b6ff8"/>
17
+ <stop offset="1" stop-color="#6f53e8"/>
18
+ </linearGradient>
19
+ <radialGradient id="vglow" cx="0.5" cy="0.5" r="0.5">
20
+ <stop offset="0" stop-color="#8b6ff8" stop-opacity="0.30"/>
21
+ <stop offset="1" stop-color="#8b6ff8" stop-opacity="0"/>
22
+ </radialGradient>
23
+ <filter id="soft" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="7"/></filter>
24
+ </defs>
25
+
26
+ <rect x="6" y="6" width="1168" height="588" rx="24" fill="url(#bg)" stroke="#232a42" stroke-width="1.5"/>
27
+
28
+ <!-- header -->
29
+ <text x="56" y="56" font-size="26" font-weight="700" fill="#f4f6ff" letter-spacing="0.2">empir<tspan fill="#8b6ff8">3</tspan><tspan fill="#aeb6d6" font-weight="500"> &#160;Bridge</tspan></text>
30
+ <text x="1124" y="52" text-anchor="end" font-size="14" fill="#7e88ac" letter-spacing="0.3">a real browser &#8212; walled off from your personal one</text>
31
+ <line x1="56" y1="86" x2="1124" y2="86" stroke="#1d2438" stroke-width="1"/>
32
+
33
+ <!-- ============ LEFT: your personal Chrome ============ -->
34
+ <rect x="82" y="126" width="460" height="410" rx="14" fill="url(#win)" stroke="#2c3556" stroke-width="1.5"/>
35
+ <!-- title bar -->
36
+ <path d="M82 140 a14 14 0 0 1 14 -14 h432 a14 14 0 0 1 14 14 v28 h-460 z" fill="#1b2236"/>
37
+ <circle cx="110" cy="147" r="5" fill="#566089"/>
38
+ <circle cx="128" cy="147" r="5" fill="#566089"/>
39
+ <circle cx="146" cy="147" r="5" fill="#566089"/>
40
+ <rect x="176" y="136" width="342" height="23" rx="11.5" fill="#0e1322" stroke="#2c3556" stroke-width="1"/>
41
+ <path d="M192 142 v-2 a3 3 0 0 1 6 0 v2 M190 142 h10 v8 h-10 z" fill="none" stroke="#6f7aa3" stroke-width="1.3"/>
42
+ <text x="208" y="152" font-size="12" fill="#8a93b8">mail.google.com</text>
43
+ <!-- off-limits badge -->
44
+ <rect x="384" y="184" width="138" height="26" rx="13" fill="#2a1418" stroke="#7f2630"/>
45
+ <path d="M402 191 l11 11 M413 191 l-11 11" stroke="#f87171" stroke-width="2" stroke-linecap="round"/>
46
+ <text x="424" y="201" font-size="11.5" font-weight="700" fill="#f8a3a3" letter-spacing="0.4">NO ACCESS</text>
47
+
48
+ <!-- personal rows -->
49
+ <g>
50
+ <rect x="112" y="226" width="400" height="50" rx="10" fill="#0f1424" stroke="#232a42"/>
51
+ <rect x="128" y="241" width="20" height="20" rx="4" fill="#d6492f" opacity="0.85"/>
52
+ <text x="160" y="248" font-size="14" font-weight="600" fill="#e7eafa">Gmail</text>
53
+ <text x="160" y="266" font-size="12" fill="#7e88ac">you@gmail.com &#183; signed in</text>
54
+ </g>
55
+ <g>
56
+ <rect x="112" y="288" width="400" height="50" rx="10" fill="#0f1424" stroke="#232a42"/>
57
+ <rect x="128" y="303" width="20" height="20" rx="4" fill="#2f7d4f" opacity="0.85"/>
58
+ <text x="160" y="310" font-size="14" font-weight="600" fill="#e7eafa">Your bank</text>
59
+ <text x="160" y="328" font-size="12" fill="#7e88ac">saved password &#183; 2FA cookie</text>
60
+ </g>
61
+ <g>
62
+ <rect x="112" y="350" width="400" height="50" rx="10" fill="#0f1424" stroke="#232a42"/>
63
+ <rect x="128" y="365" width="20" height="20" rx="4" fill="#5566aa" opacity="0.85"/>
64
+ <text x="160" y="372" font-size="14" font-weight="600" fill="#e7eafa">Socials, history, 200 open tabs</text>
65
+ <text x="160" y="390" font-size="12" fill="#7e88ac">everything you do, every day</text>
66
+ </g>
67
+
68
+ <!-- left footer label -->
69
+ <text x="112" y="450" font-size="12" font-weight="600" fill="#7e88ac" letter-spacing="1.4">YOUR EVERYDAY CHROME</text>
70
+ <text x="112" y="474" font-size="13" fill="#9aa3c7">logins &#183; cookies &#183; history &#8212; the bridge never touches this</text>
71
+ <text x="112" y="500" font-size="12.5" font-weight="600" fill="#86d9cd">Untouched. Unread. Yours.</text>
72
+
73
+ <!-- OFF-LIMITS: big red X crossing out the personal browser -->
74
+ <rect x="82" y="170" width="460" height="252" rx="6" fill="#ef4444" opacity="0.07"/>
75
+ <g stroke="#ef4444" stroke-linecap="round" opacity="0.22">
76
+ <line x1="130" y1="200" x2="494" y2="416" stroke-width="26"/>
77
+ <line x1="494" y1="200" x2="130" y2="416" stroke-width="26"/>
78
+ </g>
79
+ <g stroke="#ef4444" stroke-linecap="round" opacity="0.95">
80
+ <line x1="130" y1="200" x2="494" y2="416" stroke-width="14"/>
81
+ <line x1="494" y1="200" x2="130" y2="416" stroke-width="14"/>
82
+ </g>
83
+
84
+ <!-- ============ WALL ============ -->
85
+ <ellipse cx="590" cy="331" rx="120" ry="150" fill="url(#vglow)" filter="url(#soft)" opacity="0.55"/>
86
+ <rect x="560" y="150" width="60" height="362" rx="14" fill="url(#wall)" stroke="#3a456a" stroke-width="1.25"/>
87
+ <!-- brick seams -->
88
+ <g stroke="#0f1424" stroke-width="1.5" opacity="0.55">
89
+ <line x1="560" y1="210" x2="620" y2="210"/>
90
+ <line x1="560" y1="270" x2="620" y2="270"/>
91
+ <line x1="560" y1="392" x2="620" y2="392"/>
92
+ <line x1="560" y1="452" x2="620" y2="452"/>
93
+ <line x1="590" y1="150" x2="590" y2="210"/>
94
+ <line x1="590" y1="270" x2="590" y2="331"/>
95
+ <line x1="590" y1="392" x2="590" y2="452"/>
96
+ </g>
97
+ <!-- shield -->
98
+ <circle cx="590" cy="331" r="30" fill="#0e1322" stroke="#8b6ff8" stroke-width="1.5"/>
99
+ <path d="M590 313 l15 6 v13 c0 11 -7 19 -15 22 c-8 -3 -15 -11 -15 -22 v-13 z" fill="url(#violetEdge)"/>
100
+ <path d="M583 332 l5 5 l10 -11" fill="none" stroke="#0e1322" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/>
101
+ <text x="590" y="234" font-size="11" font-weight="700" fill="#cdbcff" text-anchor="middle" letter-spacing="2" transform="rotate(-90 590 234)">WALLED OFF</text>
102
+ <text x="590" y="430" font-size="9.5" font-weight="600" fill="#8089ab" text-anchor="middle" letter-spacing="1.5" transform="rotate(-90 590 430)">SEPARATE PROFILE</text>
103
+
104
+ <!-- ============ RIGHT: bridge's dedicated Chrome ============ -->
105
+ <rect x="638" y="126" width="460" height="410" rx="14" fill="url(#win)" stroke="#4b3f86" stroke-width="1.75"/>
106
+ <!-- title bar -->
107
+ <path d="M638 140 a14 14 0 0 1 14 -14 h432 a14 14 0 0 1 14 14 v28 h-460 z" fill="#1c1b36"/>
108
+ <circle cx="666" cy="147" r="5" fill="#6b5fb0"/>
109
+ <circle cx="684" cy="147" r="5" fill="#6b5fb0"/>
110
+ <circle cx="702" cy="147" r="5" fill="#6b5fb0"/>
111
+ <rect x="732" y="136" width="342" height="23" rx="11.5" fill="#0e1322" stroke="#4b3f86" stroke-width="1"/>
112
+ <path d="M748 142 v-2 a3 3 0 0 1 6 0 v2 M746 142 h10 v8 h-10 z" fill="none" stroke="#a08fe0" stroke-width="1.3"/>
113
+ <text x="764" y="152" font-size="12" fill="#b3a6e6">app.empir3.com</text>
114
+ <!-- agent-driven badge -->
115
+ <rect x="938" y="184" width="142" height="26" rx="13" fill="#1f1840" stroke="#5a49a0"/>
116
+ <circle cx="956" cy="197" r="4.5" fill="#8b6ff8"/>
117
+ <text x="968" y="201" font-size="11.5" font-weight="600" fill="#cdbcff" letter-spacing="0.4">AGENT-DRIVEN</text>
118
+
119
+ <!-- bridge rows: only granted -->
120
+ <g>
121
+ <rect x="668" y="226" width="400" height="50" rx="10" fill="#12152b" stroke="#2e2a55"/>
122
+ <circle cx="690" cy="251" r="9" fill="none" stroke="#8b6ff8" stroke-width="2.2"/>
123
+ <circle cx="690" cy="251" r="3" fill="#8b6ff8"/>
124
+ <text x="712" y="248" font-size="14" font-weight="600" fill="#e7eafa">app.empir3.com</text>
125
+ <text x="712" y="266" font-size="12" fill="#9b8fd0">a login you explicitly granted</text>
126
+ <text x="1052" y="256" font-size="12" fill="#34d399" text-anchor="end">&#10003;</text>
127
+ </g>
128
+ <g>
129
+ <rect x="668" y="288" width="400" height="50" rx="10" fill="#12152b" stroke="#2e2a55"/>
130
+ <circle cx="690" cy="313" r="9" fill="none" stroke="#8b6ff8" stroke-width="2.2"/>
131
+ <circle cx="690" cy="313" r="3" fill="#8b6ff8"/>
132
+ <text x="712" y="310" font-size="14" font-weight="600" fill="#e7eafa">github.com/your-repo</text>
133
+ <text x="712" y="328" font-size="12" fill="#9b8fd0">granted for this task</text>
134
+ <text x="1052" y="318" font-size="12" fill="#34d399" text-anchor="end">&#10003;</text>
135
+ </g>
136
+
137
+ <!-- agent driving: highlighted target + ghost cursor -->
138
+ <rect x="668" y="350" width="400" height="50" rx="10" fill="#160f33" stroke="#8b6ff8" stroke-width="1.75"/>
139
+ <rect x="936" y="362" width="92" height="26" rx="8" fill="#8b6ff8"/>
140
+ <text x="982" y="379" font-size="12.5" font-weight="700" fill="#0b1020" text-anchor="middle">Run</text>
141
+ <text x="690" y="380" font-size="13" fill="#cdbcff">the agent is acting here &#8212; visibly</text>
142
+ <!-- ghost cursor -->
143
+ <g transform="translate(1006 384)">
144
+ <path d="M0 0 L0 19 L5 14 L9 22 L12 21 L8 13 L15 13 z" fill="#ffffff" stroke="#8b6ff8" stroke-width="1.2"/>
145
+ </g>
146
+
147
+ <!-- right footer label -->
148
+ <text x="668" y="450" font-size="12" font-weight="600" fill="#9b8fd0" letter-spacing="1.4">BRIDGE&#8217;S DEDICATED CHROME</text>
149
+ <text x="668" y="474" font-size="13" fill="#b3a6e6">only the logins you grant it &#183; persists across runs</text>
150
+ <text x="668" y="500" font-size="12.5" font-weight="600" fill="#cdbcff">Real Chrome. Its own profile. Visible while it works.</text>
151
+ </svg>
@@ -0,0 +1,74 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 920 472" width="920" height="472" font-family="'SF Mono','Cascadia Code','Consolas','Menlo',monospace" role="img" aria-label="Terminal demo: one prompt drives Codex, Gemini, and a real browser from a single agent">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#0d0f15"/>
5
+ <stop offset="1" stop-color="#0a0b10"/>
6
+ </linearGradient>
7
+ <style>
8
+ .ln { opacity: 1; } /* fallback: fully visible if animation is stripped */
9
+ @keyframes a1{0%,3%{opacity:0}6%,90%{opacity:1}95%,100%{opacity:0}}
10
+ @keyframes a2{0%,7%{opacity:0}10%,90%{opacity:1}95%,100%{opacity:0}}
11
+ @keyframes a3{0%,11%{opacity:0}14%,90%{opacity:1}95%,100%{opacity:0}}
12
+ @keyframes a4{0%,24%{opacity:0}28%,90%{opacity:1}95%,100%{opacity:0}}
13
+ @keyframes a5{0%,36%{opacity:0}40%,90%{opacity:1}95%,100%{opacity:0}}
14
+ @keyframes a6{0%,48%{opacity:0}52%,90%{opacity:1}95%,100%{opacity:0}}
15
+ @keyframes a7{0%,62%{opacity:0}66%,90%{opacity:1}95%,100%{opacity:0}}
16
+ @keyframes a8{0%,66%{opacity:0}70%,90%{opacity:1}95%,100%{opacity:0}}
17
+ @keyframes blink{0%,49%{opacity:1}50%,100%{opacity:0}}
18
+ .c1{animation:a1 13s infinite} .c2{animation:a2 13s infinite} .c3{animation:a3 13s infinite}
19
+ .c4{animation:a4 13s infinite} .c5{animation:a5 13s infinite} .c6{animation:a6 13s infinite}
20
+ .c7{animation:a7 13s infinite} .c8{animation:a8 13s infinite}
21
+ .caret{animation:blink 1.1s steps(1) infinite}
22
+ text{font-size:15px}
23
+ </style>
24
+ </defs>
25
+
26
+ <!-- window -->
27
+ <rect x="1" y="1" width="918" height="470" rx="14" fill="url(#bg)" stroke="#23262f"/>
28
+ <!-- title bar -->
29
+ <rect x="1" y="1" width="918" height="44" rx="14" fill="#11141b"/>
30
+ <rect x="1" y="30" width="918" height="15" fill="#11141b"/>
31
+ <circle cx="28" cy="23" r="6" fill="#ff5f57"/>
32
+ <circle cx="50" cy="23" r="6" fill="#febc2e"/>
33
+ <circle cx="72" cy="23" r="6" fill="#28c840"/>
34
+ <text x="460" y="28" text-anchor="middle" fill="#6b7280" font-size="13.5">empir3 bridge — one prompt, the whole team</text>
35
+
36
+ <!-- body -->
37
+ <g>
38
+ <!-- command -->
39
+ <g class="ln c1">
40
+ <text x="34" y="92"><tspan fill="#4ade80">$</tspan> <tspan fill="#e6e9f0">claude</tspan></text>
41
+ </g>
42
+ <!-- request -->
43
+ <g class="ln c2">
44
+ <text x="34" y="122"><tspan fill="#a78bfa">&#8250;</tspan> <tspan fill="#e6e9f0">Have Codex scaffold the API, Gemini review the diff,</tspan></text>
45
+ </g>
46
+ <g class="ln c3">
47
+ <text x="50" y="146"><tspan fill="#e6e9f0">then open the dashboard in a real browser and screenshot it.</tspan><tspan class="caret" fill="#a78bfa" dx="6">&#9608;</tspan></text>
48
+ </g>
49
+
50
+ <!-- task lines -->
51
+ <g class="ln c4">
52
+ <text x="34" y="200"><tspan fill="#a78bfa">&#9656;</tspan> <tspan fill="#c7ccd6">codex</tspan><tspan fill="#6b7280" dx="42">scaffolding endpoints&#8230;</tspan><tspan fill="#4ade80" dx="36">&#10003;</tspan> <tspan fill="#9aa3b2">4 files written</tspan></text>
53
+ </g>
54
+ <g class="ln c5">
55
+ <text x="34" y="230"><tspan fill="#a78bfa">&#9656;</tspan> <tspan fill="#c7ccd6">gemini</tspan><tspan fill="#6b7280" dx="30">reviewing the diff&#8230;</tspan><tspan fill="#4ade80" dx="58">&#10003;</tspan> <tspan fill="#9aa3b2">2 fixes suggested</tspan></text>
56
+ </g>
57
+ <g class="ln c6">
58
+ <text x="34" y="260"><tspan fill="#a78bfa">&#9656;</tspan> <tspan fill="#c7ccd6">browser</tspan><tspan fill="#6b7280" dx="20">opening dashboard, capturing&#8230;</tspan><tspan fill="#4ade80" dx="14">&#10003;</tspan> <tspan fill="#9aa3b2">shot saved</tspan></text>
59
+ </g>
60
+
61
+ <!-- done -->
62
+ <g class="ln c7">
63
+ <text x="34" y="316"><tspan fill="#c4b5fd">&#10022;</tspan> <tspan fill="#e6e9f0">Done — Codex on your OpenAI seat, Gemini on your Google seat,</tspan></text>
64
+ </g>
65
+ <g class="ln c8">
66
+ <text x="50" y="340"><tspan fill="#8b93a4">the browser on this machine. No API keys. No per-token meter. One thread.</tspan></text>
67
+ </g>
68
+ </g>
69
+
70
+ <!-- footer strip -->
71
+ <text x="34" y="406" fill="#5b6270" font-size="13">cli_status &#183; cli_run &#183; browser_* &#183; desktop_* — 57 local tools &#183; write controls off by default</text>
72
+ <rect x="34" y="424" width="852" height="1" fill="#1b1e26"/>
73
+ <text x="34" y="450" fill="#7d8597" font-size="13"><tspan fill="#a78bfa">empir3</tspan> Bridge &#183; github.com/empir3hq/empir3-bridge</text>
74
+ </svg>
Binary file
Binary file
@@ -0,0 +1,126 @@
1
+ <svg width="1280" height="660" viewBox="0 0 1280 660" fill="none" xmlns="http://www.w3.org/2000/svg" font-family="'Segoe UI', system-ui, -apple-system, 'Helvetica Neue', Arial, sans-serif">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0" y1="0" x2="1280" y2="660" gradientUnits="userSpaceOnUse">
4
+ <stop offset="0" stop-color="#0b1020"/>
5
+ <stop offset="1" stop-color="#0a0e1c"/>
6
+ </linearGradient>
7
+ <linearGradient id="card" x1="0" y1="0" x2="0" y2="1">
8
+ <stop offset="0" stop-color="#161d33"/>
9
+ <stop offset="1" stop-color="#121829"/>
10
+ </linearGradient>
11
+ <linearGradient id="spine" x1="0" y1="0" x2="0" y2="1" gradientUnits="objectBoundingBox">
12
+ <stop offset="0" stop-color="#9b82fb"/>
13
+ <stop offset="1" stop-color="#6f53e8"/>
14
+ </linearGradient>
15
+ <linearGradient id="violetFlow" x1="0" y1="0" x2="1" y2="0">
16
+ <stop offset="0" stop-color="#8b6ff8" stop-opacity="0.25"/>
17
+ <stop offset="1" stop-color="#8b6ff8" stop-opacity="0.95"/>
18
+ </linearGradient>
19
+ <linearGradient id="tealFlow" x1="0" y1="0" x2="1" y2="0">
20
+ <stop offset="0" stop-color="#2dd4bf" stop-opacity="0.25"/>
21
+ <stop offset="1" stop-color="#2dd4bf" stop-opacity="0.95"/>
22
+ </linearGradient>
23
+ <radialGradient id="glow" cx="0.5" cy="0.5" r="0.5">
24
+ <stop offset="0" stop-color="#8b6ff8" stop-opacity="0.35"/>
25
+ <stop offset="1" stop-color="#8b6ff8" stop-opacity="0"/>
26
+ </radialGradient>
27
+ <filter id="soft" x="-40%" y="-40%" width="180%" height="180%">
28
+ <feGaussianBlur stdDeviation="6"/>
29
+ </filter>
30
+ <marker id="arrowV" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
31
+ <path d="M0 0 L10 5 L0 10 z" fill="#8b6ff8"/>
32
+ </marker>
33
+ <marker id="arrowT" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
34
+ <path d="M0 0 L10 5 L0 10 z" fill="#2dd4bf"/>
35
+ </marker>
36
+ </defs>
37
+
38
+ <!-- frame -->
39
+ <rect x="6" y="6" width="1268" height="648" rx="24" fill="url(#bg)" stroke="#232a42" stroke-width="1.5"/>
40
+ <ellipse cx="586" cy="375" rx="240" ry="240" fill="url(#glow)" filter="url(#soft)" opacity="0.6"/>
41
+
42
+ <!-- header -->
43
+ <text x="56" y="56" font-size="26" font-weight="700" fill="#f4f6ff" letter-spacing="0.2">empir<tspan fill="#8b6ff8">3</tspan><tspan fill="#aeb6d6" font-weight="500"> &#160;Bridge</tspan></text>
44
+ <text x="1224" y="52" text-anchor="end" font-size="14" fill="#7e88ac" letter-spacing="0.3">one agent &#183; every CLI you already pay for &#183; your browser &amp; desktop</text>
45
+ <line x1="56" y1="86" x2="1224" y2="86" stroke="#1d2438" stroke-width="1"/>
46
+
47
+ <!-- ===== arrows (drawn under nodes) ===== -->
48
+ <!-- agent -> bridge -->
49
+ <path d="M296 375 L548 375" stroke="#8b6ff8" stroke-width="4" fill="none" marker-end="url(#arrowV)"/>
50
+ <text x="422" y="365" font-size="11.5" font-weight="600" fill="#b9a6ff" text-anchor="middle" letter-spacing="0.6">delegates</text>
51
+ <!-- bridge -> model seats (violet) -->
52
+ <path d="M624 375 C 676 375, 668 178, 712 178" stroke="url(#violetFlow)" stroke-width="2.5" fill="none" marker-end="url(#arrowV)"/>
53
+ <path d="M624 375 C 676 375, 668 244, 712 244" stroke="url(#violetFlow)" stroke-width="2.5" fill="none" marker-end="url(#arrowV)"/>
54
+ <path d="M624 375 C 676 375, 668 310, 712 310" stroke="url(#violetFlow)" stroke-width="2.5" fill="none" marker-end="url(#arrowV)"/>
55
+ <path d="M624 375 C 676 375, 700 376, 712 376" stroke="url(#violetFlow)" stroke-width="2.5" fill="none" marker-end="url(#arrowV)"/>
56
+ <!-- bridge -> machine (teal) -->
57
+ <path d="M624 375 C 690 375, 660 480, 712 480" stroke="url(#tealFlow)" stroke-width="2.5" fill="none" marker-end="url(#arrowT)"/>
58
+ <path d="M624 375 C 690 375, 660 566, 712 566" stroke="url(#tealFlow)" stroke-width="2.5" fill="none" marker-end="url(#arrowT)"/>
59
+
60
+ <!-- ===== driving agent ===== -->
61
+ <text x="56" y="294" font-size="12" font-weight="600" fill="#7e88ac" letter-spacing="1.6">ONE CONVERSATION</text>
62
+ <rect x="56" y="304" width="240" height="142" rx="16" fill="url(#card)" stroke="#2c3556" stroke-width="1.5"/>
63
+ <circle cx="92" cy="344" r="16" fill="#8b6ff8" opacity="0.18"/>
64
+ <path d="M84 340 h16 a2 2 0 0 1 2 2 v8 a2 2 0 0 1 -2 2 h-9 l-5 4 v-4 h-2 a2 2 0 0 1 -2 -2 v-8 a2 2 0 0 1 2 -2 z" fill="#8b6ff8"/>
65
+ <text x="120" y="349" font-size="18" font-weight="700" fill="#f4f6ff">The driving agent</text>
66
+ <text x="80" y="392" font-size="13.5" fill="#9aa3c7">Claude Code &#183; Cursor &#183; Codex</text>
67
+ <text x="80" y="414" font-size="13.5" fill="#9aa3c7">&#8230; any MCP client</text>
68
+ <text x="80" y="436" font-size="12" fill="#5f6b91">it composes &#8212; the bridge executes</text>
69
+
70
+ <!-- ===== bridge spine (hub) ===== -->
71
+ <rect x="556" y="150" width="62" height="450" rx="31" fill="url(#spine)"/>
72
+ <rect x="556" y="150" width="62" height="450" rx="31" fill="none" stroke="#b9a6ff" stroke-width="1" opacity="0.5"/>
73
+ <text x="587" y="375" font-size="17" font-weight="700" fill="#ffffff" text-anchor="middle" letter-spacing="3" transform="rotate(-90 587 375)">EMPIR3 BRIDGE</text>
74
+ <text x="587" y="138" font-size="11.5" font-weight="600" fill="#7e88ac" text-anchor="middle" letter-spacing="0.8">127.0.0.1 &#183; local</text>
75
+ <text x="587" y="624" font-size="11.5" font-weight="600" fill="#7e88ac" text-anchor="middle" letter-spacing="0.8">read-only by default</text>
76
+
77
+ <!-- ===== model seats ===== -->
78
+ <text x="712" y="138" font-size="12" font-weight="600" fill="#7e88ac" letter-spacing="1.2">YOUR MODEL SEATS<tspan fill="#5f6b91" font-weight="500" letter-spacing="0.2"> &#183; no API keys, no extra cost</tspan></text>
79
+
80
+ <g>
81
+ <rect x="712" y="150" width="316" height="56" rx="12" fill="url(#card)" stroke="#2c3556" stroke-width="1.25"/>
82
+ <circle cx="740" cy="178" r="5" fill="#e6e6e6"/>
83
+ <text x="760" y="183" font-size="16" font-weight="600" fill="#eef1fb">Codex</text>
84
+ <text x="1012" y="183" font-size="12" fill="#34d399" text-anchor="end">&#10003; ready</text>
85
+ </g>
86
+ <g>
87
+ <rect x="712" y="216" width="316" height="56" rx="12" fill="url(#card)" stroke="#2c3556" stroke-width="1.25"/>
88
+ <circle cx="740" cy="244" r="5" fill="#9aa0aa"/>
89
+ <text x="760" y="249" font-size="16" font-weight="600" fill="#eef1fb">Grok</text>
90
+ <text x="1012" y="249" font-size="12" fill="#34d399" text-anchor="end">&#10003; ready</text>
91
+ </g>
92
+ <g>
93
+ <rect x="712" y="282" width="316" height="56" rx="12" fill="url(#card)" stroke="#2c3556" stroke-width="1.25"/>
94
+ <circle cx="740" cy="310" r="5" fill="#5b9dff"/>
95
+ <text x="760" y="315" font-size="16" font-weight="600" fill="#eef1fb">Gemini</text>
96
+ <text x="1012" y="315" font-size="12" fill="#34d399" text-anchor="end">&#10003; ready</text>
97
+ </g>
98
+ <g>
99
+ <rect x="712" y="348" width="316" height="56" rx="12" fill="url(#card)" stroke="#2c3556" stroke-width="1.25"/>
100
+ <circle cx="740" cy="376" r="5" fill="#d97757"/>
101
+ <text x="760" y="381" font-size="16" font-weight="600" fill="#eef1fb">Claude</text>
102
+ <text x="1012" y="381" font-size="12" fill="#34d399" text-anchor="end">&#10003; ready</text>
103
+ </g>
104
+
105
+ <!-- ===== your machine ===== -->
106
+ <text x="712" y="432" font-size="12" font-weight="600" fill="#7e88ac" letter-spacing="1.2">YOUR MACHINE<tspan fill="#5f6b91" font-weight="500" letter-spacing="0.2"> &#183; you choose what it touches</tspan></text>
107
+
108
+ <!-- chrome card -->
109
+ <rect x="712" y="444" width="440" height="72" rx="14" fill="url(#card)" stroke="#27506a" stroke-width="1.25"/>
110
+ <circle cx="746" cy="480" r="15" fill="#2dd4bf" opacity="0.15"/>
111
+ <circle cx="746" cy="480" r="9" fill="none" stroke="#2dd4bf" stroke-width="2.5"/>
112
+ <circle cx="746" cy="480" r="3" fill="#2dd4bf"/>
113
+ <text x="776" y="476" font-size="16" font-weight="600" fill="#eef1fb">Dedicated Chrome</text>
114
+ <text x="776" y="498" font-size="12.5" fill="#86d9cd">a real browser, walled off from your personal one</text>
115
+
116
+ <!-- desktop card -->
117
+ <rect x="712" y="528" width="440" height="72" rx="14" fill="url(#card)" stroke="#27506a" stroke-width="1.25"/>
118
+ <rect x="734" y="552" width="26" height="18" rx="2.5" fill="none" stroke="#2dd4bf" stroke-width="2.5"/>
119
+ <line x1="747" y1="570" x2="747" y2="576" stroke="#2dd4bf" stroke-width="2.5"/>
120
+ <line x1="741" y1="576" x2="753" y2="576" stroke="#2dd4bf" stroke-width="2.5"/>
121
+ <text x="776" y="560" font-size="16" font-weight="600" fill="#eef1fb">Your desktop</text>
122
+ <text x="776" y="582" font-size="12.5" fill="#86d9cd">scoped to a box you draw &#8212; everything else stays private</text>
123
+
124
+ <!-- footer -->
125
+ <line x1="56" y1="620" x2="1224" y2="620" stroke="#1d2438" stroke-width="1"/>
126
+ </svg>
Binary file
Binary file