starmux 0.12.0 → 0.13.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.
Files changed (96) hide show
  1. package/README.md +2 -2
  2. package/dist/src/cli/mac-mcp-gateway.js +4 -3
  3. package/dist/src/cli/mac-mcp-gateway.js.map +1 -1
  4. package/dist/src/cli/starmux.js +1 -1
  5. package/dist/src/cli/starmux.js.map +1 -1
  6. package/dist/src/runtime-paths.js +3 -3
  7. package/dist/src/runtime-paths.js.map +1 -1
  8. package/dist/vendor/desktop-commander/LICENSE +21 -0
  9. package/dist/vendor/desktop-commander/dist/bootstrap.js +22 -0
  10. package/dist/vendor/desktop-commander/dist/command-manager.js +246 -0
  11. package/dist/vendor/desktop-commander/dist/config-field-definitions.js +37 -0
  12. package/dist/vendor/desktop-commander/dist/config-manager.js +634 -0
  13. package/dist/vendor/desktop-commander/dist/config-recovery.js +81 -0
  14. package/dist/vendor/desktop-commander/dist/config.js +19 -0
  15. package/dist/vendor/desktop-commander/dist/custom-stdio.js +358 -0
  16. package/dist/vendor/desktop-commander/dist/error-handlers.js +15 -0
  17. package/dist/vendor/desktop-commander/dist/handlers/edit-search-handlers.js +6 -0
  18. package/dist/vendor/desktop-commander/dist/handlers/filesystem-handlers.js +450 -0
  19. package/dist/vendor/desktop-commander/dist/handlers/history-handlers.js +67 -0
  20. package/dist/vendor/desktop-commander/dist/handlers/index.js +7 -0
  21. package/dist/vendor/desktop-commander/dist/handlers/process-handlers.js +15 -0
  22. package/dist/vendor/desktop-commander/dist/handlers/search-answers.js +172 -0
  23. package/dist/vendor/desktop-commander/dist/handlers/search-handlers.js +136 -0
  24. package/dist/vendor/desktop-commander/dist/handlers/terminal-handlers.js +35 -0
  25. package/dist/vendor/desktop-commander/dist/index.js +88 -0
  26. package/dist/vendor/desktop-commander/dist/search-manager.js +1262 -0
  27. package/dist/vendor/desktop-commander/dist/server.js +1414 -0
  28. package/dist/vendor/desktop-commander/dist/terminal-manager.js +757 -0
  29. package/dist/vendor/desktop-commander/dist/tools/config.js +211 -0
  30. package/dist/vendor/desktop-commander/dist/tools/edit.js +455 -0
  31. package/dist/vendor/desktop-commander/dist/tools/feedback.js +10 -0
  32. package/dist/vendor/desktop-commander/dist/tools/filesystem.js +1047 -0
  33. package/dist/vendor/desktop-commander/dist/tools/fuzzySearch.js +74 -0
  34. package/dist/vendor/desktop-commander/dist/tools/fuzzySearchCore.js +125 -0
  35. package/dist/vendor/desktop-commander/dist/tools/improved-process-tools.js +726 -0
  36. package/dist/vendor/desktop-commander/dist/tools/mime-types.js +28 -0
  37. package/dist/vendor/desktop-commander/dist/tools/pdf/extract-images.js +131 -0
  38. package/dist/vendor/desktop-commander/dist/tools/pdf/index.js +4 -0
  39. package/dist/vendor/desktop-commander/dist/tools/pdf/lib/pdf2md.js +78 -0
  40. package/dist/vendor/desktop-commander/dist/tools/pdf/manipulations.js +112 -0
  41. package/dist/vendor/desktop-commander/dist/tools/pdf/markdown.js +30 -0
  42. package/dist/vendor/desktop-commander/dist/tools/pdf/utils.js +45 -0
  43. package/dist/vendor/desktop-commander/dist/tools/process.js +90 -0
  44. package/dist/vendor/desktop-commander/dist/tools/prompts.js +259 -0
  45. package/dist/vendor/desktop-commander/dist/tools/schemas.js +242 -0
  46. package/dist/vendor/desktop-commander/dist/tools/usage.js +24 -0
  47. package/dist/vendor/desktop-commander/dist/types.js +1 -0
  48. package/dist/vendor/desktop-commander/dist/ui/config-editor/config-editor-runtime.js +150 -0
  49. package/dist/vendor/desktop-commander/dist/ui/config-editor/index.html +13 -0
  50. package/dist/vendor/desktop-commander/dist/ui/config-editor/styles.css +587 -0
  51. package/dist/vendor/desktop-commander/dist/ui/contracts.js +57 -0
  52. package/dist/vendor/desktop-commander/dist/ui/file-preview/index.html +16 -0
  53. package/dist/vendor/desktop-commander/dist/ui/file-preview/preview-runtime.js +471 -0
  54. package/dist/vendor/desktop-commander/dist/ui/file-preview/shared/preview-file-types.js +59 -0
  55. package/dist/vendor/desktop-commander/dist/ui/file-preview/styles.css +1631 -0
  56. package/dist/vendor/desktop-commander/dist/ui/resources.js +93 -0
  57. package/dist/vendor/desktop-commander/dist/utils/ab-test.js +122 -0
  58. package/dist/vendor/desktop-commander/dist/utils/atomic-write.js +80 -0
  59. package/dist/vendor/desktop-commander/dist/utils/capture.js +40 -0
  60. package/dist/vendor/desktop-commander/dist/utils/dockerPrompt.js +9 -0
  61. package/dist/vendor/desktop-commander/dist/utils/exit-process.js +31 -0
  62. package/dist/vendor/desktop-commander/dist/utils/feature-flags.js +18 -0
  63. package/dist/vendor/desktop-commander/dist/utils/files/base.js +5 -0
  64. package/dist/vendor/desktop-commander/dist/utils/files/binary.js +65 -0
  65. package/dist/vendor/desktop-commander/dist/utils/files/docx.js +694 -0
  66. package/dist/vendor/desktop-commander/dist/utils/files/excel.js +497 -0
  67. package/dist/vendor/desktop-commander/dist/utils/files/factory.js +168 -0
  68. package/dist/vendor/desktop-commander/dist/utils/files/image.js +89 -0
  69. package/dist/vendor/desktop-commander/dist/utils/files/index.js +14 -0
  70. package/dist/vendor/desktop-commander/dist/utils/files/pdf.js +124 -0
  71. package/dist/vendor/desktop-commander/dist/utils/files/text.js +423 -0
  72. package/dist/vendor/desktop-commander/dist/utils/fuzzySearchLogger.js +126 -0
  73. package/dist/vendor/desktop-commander/dist/utils/internal-facts.js +23 -0
  74. package/dist/vendor/desktop-commander/dist/utils/lazy-package.js +44 -0
  75. package/dist/vendor/desktop-commander/dist/utils/lineEndingHandler.js +77 -0
  76. package/dist/vendor/desktop-commander/dist/utils/logger.js +72 -0
  77. package/dist/vendor/desktop-commander/dist/utils/mcp-ui-ab-test.js +62 -0
  78. package/dist/vendor/desktop-commander/dist/utils/open-browser.js +2 -0
  79. package/dist/vendor/desktop-commander/dist/utils/process-detection.js +260 -0
  80. package/dist/vendor/desktop-commander/dist/utils/process-tree.js +223 -0
  81. package/dist/vendor/desktop-commander/dist/utils/rename.js +74 -0
  82. package/dist/vendor/desktop-commander/dist/utils/ripgrep-resolver.js +69 -0
  83. package/dist/vendor/desktop-commander/dist/utils/shell.js +187 -0
  84. package/dist/vendor/desktop-commander/dist/utils/system-info.js +727 -0
  85. package/dist/vendor/desktop-commander/dist/utils/terminal-timestamps.js +18 -0
  86. package/dist/vendor/desktop-commander/dist/utils/toolHistory.js +309 -0
  87. package/dist/vendor/desktop-commander/dist/utils/trackTools.js +55 -0
  88. package/dist/vendor/desktop-commander/dist/utils/unsupportedParams.js +66 -0
  89. package/dist/vendor/desktop-commander/dist/utils/usageTracker.js +225 -0
  90. package/dist/vendor/desktop-commander/dist/utils/welcome-onboarding.js +2 -0
  91. package/dist/vendor/desktop-commander/dist/utils/withTimeout.js +85 -0
  92. package/dist/vendor/desktop-commander/dist/version.js +1 -0
  93. package/dist/vendor/desktop-commander/package.json +15 -0
  94. package/package.json +22 -4
  95. package/docs/assets/starmux-app-en.png +0 -0
  96. package/docs/assets/starmux-architecture.svg +0 -315
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Executes a promise with a timeout. If the promise doesn't resolve or reject within
3
+ * the specified timeout, returns the provided default value.
4
+ *
5
+ * @param operation The promise to execute
6
+ * @param timeoutMs Timeout in milliseconds
7
+ * @param operationName Name of the operation (for logs)
8
+ * @param defaultValue Value to return if the operation times out
9
+ * @returns Promise that resolves with the operation result or the default value on timeout
10
+ */
11
+ export function withTimeout(operation, timeoutMs, operationName, defaultValue) {
12
+ // Don't sanitize operation name for logs - only telemetry will sanitize if needed
13
+ return new Promise((resolve, reject) => {
14
+ let isCompleted = false;
15
+ // Set up timeout
16
+ const timeoutId = setTimeout(() => {
17
+ if (!isCompleted) {
18
+ isCompleted = true;
19
+ if (defaultValue !== null) {
20
+ resolve(defaultValue);
21
+ }
22
+ else {
23
+ // Keep the original operation name in the error message
24
+ // Telemetry sanitization happens at the capture level
25
+ reject(`__ERROR__: ${operationName} timed out after ${timeoutMs / 1000} seconds`);
26
+ }
27
+ }
28
+ }, timeoutMs);
29
+ // Execute the operation
30
+ operation
31
+ .then(result => {
32
+ if (!isCompleted) {
33
+ isCompleted = true;
34
+ clearTimeout(timeoutId);
35
+ resolve(result);
36
+ }
37
+ })
38
+ .catch(error => {
39
+ if (!isCompleted) {
40
+ isCompleted = true;
41
+ clearTimeout(timeoutId);
42
+ if (defaultValue !== null) {
43
+ resolve(defaultValue);
44
+ }
45
+ else {
46
+ // Pass the original error unchanged - sanitization for telemetry happens in capture
47
+ reject(error);
48
+ }
49
+ }
50
+ });
51
+ });
52
+ }
53
+ /**
54
+ * Run an operation under a timeout WITH real cancellation.
55
+ *
56
+ * Unlike withTimeout (which only races a timer and leaves the underlying work
57
+ * running — holding its libuv thread/fd until the OS call returns), this passes
58
+ * an AbortSignal into the operation and aborts it when the timeout fires, so a
59
+ * read/stream that honors the signal is cancelled and its resources released.
60
+ *
61
+ * Rejects with an Error whose `.code` is 'ETIMEDOUT' on timeout (so existing
62
+ * ETIMEDOUT handling / permission-error mapping keeps working).
63
+ *
64
+ * Caveat: an operation wedged inside a single un-interruptible syscall only
65
+ * observes the abort once that syscall returns; library reads that ignore the
66
+ * signal (e.g. Excel/PDF parsers) still get the timeout rejection but keep
67
+ * running in the background until they finish on their own.
68
+ */
69
+ export function runWithAbortableTimeout(operation, timeoutMs, operationName) {
70
+ const controller = new AbortController();
71
+ let timeoutId;
72
+ const timeout = new Promise((_, reject) => {
73
+ timeoutId = setTimeout(() => {
74
+ controller.abort();
75
+ const error = new Error(`${operationName} timed out after ${timeoutMs / 1000} seconds`);
76
+ error.code = 'ETIMEDOUT';
77
+ reject(error);
78
+ }, timeoutMs);
79
+ });
80
+ const op = operation(controller.signal);
81
+ // Swallow the late abort rejection so it can't surface as an unhandled
82
+ // rejection after the timeout has already settled the race.
83
+ op.catch(() => { });
84
+ return Promise.race([op, timeout]).finally(() => clearTimeout(timeoutId));
85
+ }
@@ -0,0 +1 @@
1
+ export const VERSION = '0.3.1';
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "@wonderwhy-er/desktop-commander",
3
+ "version": "0.3.1",
4
+ "description": "Purified zero-telemetry build of Desktop Commander MCP for Starmux",
5
+ "license": "MIT",
6
+ "author": "Eduards Ruzga",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/wonderwhy-er/DesktopCommanderMCP.git"
10
+ },
11
+ "type": "module",
12
+ "bin": {
13
+ "desktop-commander": "dist/index.js"
14
+ }
15
+ }
package/package.json CHANGED
@@ -1,8 +1,16 @@
1
1
  {
2
2
  "name": "starmux",
3
- "version": "0.12.0",
3
+ "version": "0.13.1",
4
4
  "description": "Connect AI clients to files, terminals and development tools on your own computer.",
5
5
  "license": "MIT",
6
+ "homepage": "https://github.com/cookyecat/starmux#readme",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/cookyecat/starmux.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/cookyecat/starmux/issues"
13
+ },
6
14
  "type": "module",
7
15
  "engines": {
8
16
  "node": ">=22.12.0"
@@ -28,22 +36,34 @@
28
36
  "build:test": "npm run build",
29
37
  "prepare": "node scripts/prepare.mjs",
30
38
  "prepack": "npm run build",
39
+ "sync:upstream": "npm install --save-dev --save-exact @wonderwhy-er/desktop-commander@latest --ignore-scripts && npm run build",
31
40
  "test:oauth:keycloak": "npm run build && node --test dist/test/keycloak.integration.js"
32
41
  },
33
42
  "dependencies": {
34
43
  "@modelcontextprotocol/sdk": "1.32.1",
35
- "@wonderwhy-er/desktop-commander": "0.3.0",
44
+ "@opendocsg/pdf2md": "0.3.4",
45
+ "@vscode/ripgrep": "1.18.0",
46
+ "exceljs": "4.4.0",
47
+ "fastest-levenshtein": "1.0.16",
48
+ "isbinaryfile": "5.0.7",
36
49
  "jose": "6.2.12",
37
50
  "jsonc-parser": "3.3.1",
51
+ "pdf-lib": "1.17.1",
52
+ "pizzip": "3.3.0",
53
+ "proper-lockfile": "4.1.2",
54
+ "sharp": "0.35.5",
55
+ "unpdf": "1.8.0",
38
56
  "zod": "3.25.76",
39
57
  "zod-to-json-schema": "3.25.2"
40
58
  },
41
59
  "devDependencies": {
42
60
  "@types/node": "22.20.5",
61
+ "@wonderwhy-er/desktop-commander": "0.3.1",
43
62
  "typescript": "5.9.3"
44
63
  },
45
64
  "files": [
46
65
  "dist/src",
66
+ "dist/vendor",
47
67
  "src/dc-workspace-http.mjs",
48
68
  "scripts/prepare.mjs",
49
69
  "test/fixtures/p1-fixture.txt",
@@ -53,8 +73,6 @@
53
73
  "SECURITY.md",
54
74
  "bin/starmux.mjs",
55
75
  "docs/*.md",
56
- "docs/assets/*.svg",
57
- "docs/assets/starmux-app-en.png",
58
76
  "app/README.md"
59
77
  ]
60
78
  }
Binary file
@@ -1,315 +0,0 @@
1
- <?xml version='1.0' encoding='UTF-8'?>
2
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1672 941" width="1672" height="941" role="img" aria-labelledby="diagram-title diagram-desc">
3
- <title id="diagram-title">Starmux — Cloud MCP clients. Real computers on earth.</title>
4
- <desc id="diagram-desc">Editable vector diagram: cloud MCP clients connect through Direct HTTPS or a Secure Tunnel to independent self-hosted Starmux instances. Each instance acts as programmable MCP middleware for policies, routing and tool adapters before reaching MCP servers such as Desktop Commander on real macOS, Windows and Linux computers.</desc>
5
- <defs>
6
- <linearGradient id="brandText" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="#2765f4"/><stop offset="1" stop-color="#1c55e9"/></linearGradient>
7
- <linearGradient id="panel" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#fcfdff"/><stop offset="1" stop-color="#f9fbff"/></linearGradient>
8
- <linearGradient id="directBg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#f8fffc"/><stop offset="1" stop-color="#f1faf8"/></linearGradient>
9
- <linearGradient id="tunnelBg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#faf7ff"/><stop offset="1" stop-color="#f4f0ff"/></linearGradient>
10
- <linearGradient id="machineBlue" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#f0f7ff"/><stop offset="1" stop-color="#eaf3ff"/></linearGradient>
11
- <linearGradient id="machineGreen" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#f1fffc"/><stop offset="1" stop-color="#e6fbf7"/></linearGradient>
12
- <linearGradient id="machinePurple" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#f8f4ff"/><stop offset="1" stop-color="#f1edff"/></linearGradient>
13
- <linearGradient id="gateway" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#f3f9ff"/><stop offset="1" stop-color="#e5f2ff"/></linearGradient>
14
- <linearGradient id="blueDisc" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#d7ecff"/><stop offset="1" stop-color="#c2e3ff"/></linearGradient>
15
- <linearGradient id="greenDisc" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#d3fff2"/><stop offset="1" stop-color="#aff2d8"/></linearGradient>
16
- <linearGradient id="purpleDisc" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#ebe0ff"/><stop offset="1" stop-color="#d7c6ff"/></linearGradient>
17
- <linearGradient id="workbuddyBadge" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#1fd0a2"/><stop offset="1" stop-color="#1f8bff"/></linearGradient>
18
- <filter id="softShadow" x="-20%" y="-35%" width="140%" height="190%"><feGaussianBlur in="SourceAlpha" stdDeviation="7" result="blur"/><feOffset dy="5" result="offset"/><feComponentTransfer in="offset" result="dim"><feFuncA type="linear" slope="0.09"/></feComponentTransfer><feMerge><feMergeNode in="dim"/><feMergeNode in="SourceGraphic"/></feMerge></filter>
19
- <marker id="arrBlue" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto" markerUnits="userSpaceOnUse"><path d="M0 0 L8 4 L0 8 L2.0 4 Z" fill="#298cff"/></marker>
20
- <marker id="arrPurple" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto" markerUnits="userSpaceOnUse"><path d="M0 0 L8 4 L0 8 L2.0 4 Z" fill="#8059f5"/></marker>
21
- <marker id="arrLavender" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto" markerUnits="userSpaceOnUse"><path d="M0 0 L8 4 L0 8 L2.0 4 Z" fill="#a084f4"/></marker>
22
- <marker id="arrGreen" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto" markerUnits="userSpaceOnUse"><path d="M0 0 L8 4 L0 8 L2.0 4 Z" fill="#14b78a"/></marker>
23
- <marker id="arrDark" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto" markerUnits="userSpaceOnUse"><path d="M0 0 L8 4 L0 8 L2.0 4 Z" fill="#48475c"/></marker>
24
-
25
- <linearGradient id="workbuddyOfficialGreen" x1="0" y1="0" x2="0" y2="1" gradientUnits="objectBoundingBox">
26
- <stop offset="0" stop-color="#10C8A6"/>
27
- <stop offset="1" stop-color="#05C98B"/>
28
- </linearGradient>
29
- <linearGradient id="workbuddyOfficialCream" x1="0" y1="1" x2="1" y2="0" gradientUnits="objectBoundingBox">
30
- <stop offset="0" stop-color="#DDF8EF"/>
31
- <stop offset="1" stop-color="#EEFBF8"/>
32
- </linearGradient>
33
- <clipPath id="workbuddyOfficialRoundedSquare"><rect x="0" y="0" width="104" height="104" rx="20"/></clipPath>
34
-
35
- </defs>
36
- <style>
37
- text { font-family: 'Inter', 'Arial', sans-serif; font-feature-settings: 'kern'; }
38
- .connector { fill:none; stroke-width:3; stroke-linecap:round; stroke-linejoin:round; }
39
- .pill { font-size:17px; font-weight:500; }
40
- </style>
41
-
42
- <rect x="0" y="0" width="1672" height="941" rx="0" fill="#ffffff" stroke="none" stroke-width="1.5"/>
43
- <g id="heading">
44
- <text x="317" y="61" fill="#090d34" font-size="50" font-weight="790" text-anchor="start" letter-spacing="0">Cloud AI clients.</text>
45
- <text x="741" y="61" fill="url(#brandText)" font-size="50" font-weight="790" text-anchor="start" letter-spacing="0">Real computers on earth.</text>
46
- <text x="836" y="103" fill="#475778" font-size="21.3" font-weight="400" text-anchor="middle" letter-spacing="0">Use Direct HTTPS or Secure Tunnel to let cloud MCP clients securely access MCP servers and tools on your computers anywhere on earth.</text>
47
- </g>
48
- <g id="four-column-panels">
49
- <rect x="28" y="137" width="366" height="591" rx="17" fill="url(#panel)" stroke="#e5edf8" stroke-width="1.5"/>
50
- <rect x="423" y="137" width="315" height="591" rx="17" fill="url(#panel)" stroke="#e5edf8" stroke-width="1.5"/>
51
- <rect x="764" y="137" width="420" height="591" rx="17" fill="url(#panel)" stroke="#e5edf8" stroke-width="1.5"/>
52
- <rect x="1210" y="137" width="431" height="591" rx="17" fill="url(#panel)" stroke="#e5edf8" stroke-width="1.5"/>
53
- </g>
54
- <g id="connections">
55
- <title>Client, transport and gateway connection routes</title>
56
- <path d="M 335 257.5 C 392 257.5 393 323 439 335" stroke="#298cff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrBlue)"/>
57
- <path d="M 335 275.5 C 392 275.5 398 493 439 505" stroke="#8059f5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrPurple)"/>
58
- <path d="M 335 339.5 C 392 339.5 393 336 439 348" stroke="#298cff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrBlue)"/>
59
- <path d="M 335 356.5 C 392 356.5 398 502 439 514" stroke="#a084f4" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrLavender)"/>
60
- <path d="M 335 425.5 C 402 422.5 393 374 439 364" stroke="#14b78a" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrGreen)"/>
61
- <path d="M 335 443.5 C 402 443.5 398 516 439 528" stroke="#298cff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrBlue)"/>
62
- <path d="M 335 499.5 C 402 496.5 393 354 439 344" stroke="#14b78a" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrGreen)"/>
63
- <path d="M 335 518.5 C 402 518.5 398 536 439 548" stroke="#8059f5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrPurple)"/>
64
- <path d="M 335 585.5 C 402 582.5 398 563 439 553" stroke="#8059f5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrPurple)"/>
65
- <path d="M 335 665.5 C 402 662.5 393 375 439 365" stroke="#14b78a" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrGreen)"/>
66
- <path d="M 718 334 C 754 335 751 292 782 292" stroke="#12b784" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrGreen)"/>
67
- <path d="M 718 356 C 751 357 747 448 782 447" stroke="#48475c" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrDark)"/>
68
- <path d="M 718 381 C 753 399 744 602 782 603" stroke="#12b784" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrGreen)"/>
69
- <path d="M 718 522 C 750 515 752 320 782 315" stroke="#a084f4" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrLavender)"/>
70
- <path d="M 718 537 C 752 541 747 481 782 478" stroke="#8059f5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrPurple)"/>
71
- <path d="M 718 553 C 751 557 748 628 782 631" stroke="#8059f5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none" class="connector" marker-end="url(#arrPurple)"/>
72
- <path d="M 1160 308 L 1228 308" stroke="#298cff" stroke-width="3.4" stroke-linecap="round" stroke-linejoin="round" fill="none" marker-end="url(#arrBlue)"/>
73
- <path d="M 1160 466 L 1228 466" stroke="#10b787" stroke-width="3.4" stroke-linecap="round" stroke-linejoin="round" fill="none" marker-end="url(#arrGreen)"/>
74
- <path d="M 1160 626 L 1228 626" stroke="#8059f5" stroke-width="3.4" stroke-linecap="round" stroke-linejoin="round" fill="none" marker-end="url(#arrPurple)"/>
75
- </g>
76
- <g id="panel-headings">
77
- <text x="58" y="184" fill="#080d34" font-size="29.5" font-weight="760" text-anchor="start" letter-spacing="0">Cloud MCP Clients</text>
78
- <text x="58" y="213" fill="#607193" font-size="18.5" font-weight="400" text-anchor="start" letter-spacing="0">Any MCP-capable cloud AI client</text>
79
- <text x="447" y="190" fill="#080d34" font-size="24.8" font-weight="760" text-anchor="start" letter-spacing="0">MCP connection options</text>
80
- <text x="790" y="184" fill="#080d34" font-size="27" font-weight="760" text-anchor="start" letter-spacing="0">Self-hosted Starmux</text>
81
- <text x="790" y="211" fill="#607193" font-size="16.2" font-weight="400" text-anchor="start" letter-spacing="0">Programmable MCP middleware on each computer</text>
82
- <text x="1238" y="183" fill="#080d34" font-size="28" font-weight="760" text-anchor="start" letter-spacing="0">Your computers on earth</text>
83
- <text x="1238" y="211" fill="#607193" font-size="16.5" font-weight="400" text-anchor="start" letter-spacing="0">MCP servers running on your machines</text>
84
- </g>
85
- <g id="client-chatgpt">
86
- <rect x="52" y="232" width="283" height="67" rx="14" fill="#ffffff" stroke="#dde8f3" stroke-width="1.35" filter="url(#softShadow)"/>
87
- <g id="chatgpt-vector-mark">
88
- <rect x="73" y="238.5" width="54" height="54" rx="12" fill="#10a780" stroke="none" stroke-width="1.5"/>
89
- <g transform="translate(100 265.5) rotate(0)">
90
- <path d="M -2 -19 C 9 -22 19 -12 17 -2 C 16 5 10 9 4 12" stroke="#ffffff" stroke-width="2.15" stroke-linecap="round" stroke-linejoin="round" fill="none" opacity="0.98"/>
91
- </g>
92
- <g transform="translate(100 265.5) rotate(60)">
93
- <path d="M -2 -19 C 9 -22 19 -12 17 -2 C 16 5 10 9 4 12" stroke="#ffffff" stroke-width="2.15" stroke-linecap="round" stroke-linejoin="round" fill="none" opacity="0.98"/>
94
- </g>
95
- <g transform="translate(100 265.5) rotate(120)">
96
- <path d="M -2 -19 C 9 -22 19 -12 17 -2 C 16 5 10 9 4 12" stroke="#ffffff" stroke-width="2.15" stroke-linecap="round" stroke-linejoin="round" fill="none" opacity="0.98"/>
97
- </g>
98
- <g transform="translate(100 265.5) rotate(180)">
99
- <path d="M -2 -19 C 9 -22 19 -12 17 -2 C 16 5 10 9 4 12" stroke="#ffffff" stroke-width="2.15" stroke-linecap="round" stroke-linejoin="round" fill="none" opacity="0.98"/>
100
- </g>
101
- <g transform="translate(100 265.5) rotate(240)">
102
- <path d="M -2 -19 C 9 -22 19 -12 17 -2 C 16 5 10 9 4 12" stroke="#ffffff" stroke-width="2.15" stroke-linecap="round" stroke-linejoin="round" fill="none" opacity="0.98"/>
103
- </g>
104
- <g transform="translate(100 265.5) rotate(300)">
105
- <path d="M -2 -19 C 9 -22 19 -12 17 -2 C 16 5 10 9 4 12" stroke="#ffffff" stroke-width="2.15" stroke-linecap="round" stroke-linejoin="round" fill="none" opacity="0.98"/>
106
- </g>
107
- <path d="M 95 261.5 L 103 256.5 L 110 262.5 L 109 271.5 L 101 275.5 L 93 269.5 Z" stroke="#ffffff" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
108
- </g>
109
- <text x="153" y="274" fill="#101436" font-size="19.5" font-weight="565" text-anchor="start" letter-spacing="0">ChatGPT</text>
110
- </g>
111
- <g id="client-claude">
112
- <rect x="52" y="312" width="283" height="67" rx="14" fill="#ffffff" stroke="#dde8f3" stroke-width="1.35" filter="url(#softShadow)"/>
113
- <g id="claude-vector-mark">
114
- <g transform="translate(100 345.5) rotate(0)">
115
- <path d="M 0 -9 L -2.8 -23 Q 0 -26 2.8 -23 L 0 -9 Z" stroke="#e57553" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#e57553"/>
116
- </g>
117
- <g transform="translate(100 345.5) rotate(30)">
118
- <path d="M 0 -9 L -2.8 -23 Q 0 -26 2.8 -23 L 0 -9 Z" stroke="#e57553" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#e57553"/>
119
- </g>
120
- <g transform="translate(100 345.5) rotate(60)">
121
- <path d="M 0 -9 L -2.8 -23 Q 0 -26 2.8 -23 L 0 -9 Z" stroke="#e57553" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#e57553"/>
122
- </g>
123
- <g transform="translate(100 345.5) rotate(90)">
124
- <path d="M 0 -9 L -2.8 -23 Q 0 -26 2.8 -23 L 0 -9 Z" stroke="#e57553" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#e57553"/>
125
- </g>
126
- <g transform="translate(100 345.5) rotate(120)">
127
- <path d="M 0 -9 L -2.8 -23 Q 0 -26 2.8 -23 L 0 -9 Z" stroke="#e57553" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#e57553"/>
128
- </g>
129
- <g transform="translate(100 345.5) rotate(150)">
130
- <path d="M 0 -9 L -2.8 -23 Q 0 -26 2.8 -23 L 0 -9 Z" stroke="#e57553" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#e57553"/>
131
- </g>
132
- <g transform="translate(100 345.5) rotate(180)">
133
- <path d="M 0 -9 L -2.8 -23 Q 0 -26 2.8 -23 L 0 -9 Z" stroke="#e57553" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#e57553"/>
134
- </g>
135
- <g transform="translate(100 345.5) rotate(210)">
136
- <path d="M 0 -9 L -2.8 -23 Q 0 -26 2.8 -23 L 0 -9 Z" stroke="#e57553" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#e57553"/>
137
- </g>
138
- <g transform="translate(100 345.5) rotate(240)">
139
- <path d="M 0 -9 L -2.8 -23 Q 0 -26 2.8 -23 L 0 -9 Z" stroke="#e57553" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#e57553"/>
140
- </g>
141
- <g transform="translate(100 345.5) rotate(270)">
142
- <path d="M 0 -9 L -2.8 -23 Q 0 -26 2.8 -23 L 0 -9 Z" stroke="#e57553" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#e57553"/>
143
- </g>
144
- <g transform="translate(100 345.5) rotate(300)">
145
- <path d="M 0 -9 L -2.8 -23 Q 0 -26 2.8 -23 L 0 -9 Z" stroke="#e57553" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#e57553"/>
146
- </g>
147
- <g transform="translate(100 345.5) rotate(330)">
148
- <path d="M 0 -9 L -2.8 -23 Q 0 -26 2.8 -23 L 0 -9 Z" stroke="#e57553" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#e57553"/>
149
- </g>
150
- <circle cx="100" cy="345.5" r="8" fill="#e57553" stroke="none" stroke-width="1.5"/>
151
- </g>
152
- <text x="153" y="354" fill="#101436" font-size="19.5" font-weight="565" text-anchor="start" letter-spacing="0">Claude</text>
153
- </g>
154
- <g id="client-cursor">
155
- <rect x="52" y="392" width="283" height="67" rx="14" fill="#ffffff" stroke="#dde8f3" stroke-width="1.35" filter="url(#softShadow)"/>
156
- <g id="cursor-vector-mark">
157
- <rect x="73" y="398.5" width="54" height="54" rx="12" fill="#222326" stroke="none" stroke-width="1.5"/>
158
- <path d="M 81 418.5 L 105 406.5 L 119 415.5 L 109 439.5 L 94 446.5 L 81 428.5 Z" stroke="#ffffff" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#ffffff"/>
159
- <path d="M 81 418.5 L 101 427.5 L 105 406.5 Z" stroke="#b0b5bc" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#b0b5bc"/>
160
- <path d="M 101 427.5 L 119 415.5 L 109 439.5 Z" stroke="#5e626a" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#5e626a"/>
161
- <path d="M 94 446.5 L 101 427.5 L 109 439.5 Z" stroke="#dddddf" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#dddddf"/>
162
- </g>
163
- <text x="153" y="434" fill="#101436" font-size="19.5" font-weight="565" text-anchor="start" letter-spacing="0">Cursor</text>
164
- </g>
165
- <g id="client-workbuddy">
166
- <rect x="52" y="472" width="283" height="67" rx="14" fill="#ffffff" stroke="#dde8f3" stroke-width="1.35" filter="url(#softShadow)"/>
167
- <g id="workbuddy-vector-mark" aria-label="WorkBuddy icon vectorized from the uploaded official PNG">
168
- <g transform="translate(73 478.5) scale(0.519230769)">
169
- <g clip-path="url(#workbuddyOfficialRoundedSquare)">
170
- <rect x="0" y="0" width="104" height="104" fill="url(#workbuddyOfficialGreen)"/>
171
- <path d="M 81.3,7.1 C 76.6,6.7 70.8,25.0 65.7,33.8 C 55.1,37.0 43.6,45.0 34.1,51.3 C 23.6,49.7 10.9,48.3 6.4,50.5 C 1.8,53.3 10.6,72.1 15.8,79.0 C 16.9,83.6 17.4,87.5 16.8,90.4 C 14.6,94.7 13.7,98.7 14.6,104 L 36.6,104 C 31.6,97.9 28.4,90.7 28.9,83.0 C 29.4,71.0 41.6,64.9 57.0,55.2 C 69.7,47.3 79.5,42.2 86.1,41.8 C 92.9,40.5 99.5,44.7 104,47.9 L 104,34.5 C 98.5,25.3 86.9,7.5 81.3,7.1 Z" fill="url(#workbuddyOfficialCream)"/>
172
- <path d="M 82.6,62.3 C 86.5,61.1 88.0,67.7 90.2,71.3 C 92.5,75.1 94.5,78.1 90.7,80.7 C 87.0,83.5 84.2,78.2 82.2,74.4 L 78.8,68.3 C 77.3,65.3 79.6,62.7 82.6,62.3 Z" fill="#FFFFFF"/>
173
- <path d="M 54.2,78.5 C 58.3,77.4 59.9,83.2 61.8,86.3 C 63.9,90.0 67.0,94.2 62.6,96.9 C 58.5,99.7 55.8,94.2 53.9,90.6 L 50.8,85.2 C 48.8,81.6 51.2,79.0 54.2,78.5 Z" fill="#FFFFFF"/>
174
- </g>
175
- </g>
176
- </g>
177
- <text x="153" y="514" fill="#101436" font-size="19.5" font-weight="565" text-anchor="start" letter-spacing="0">WorkBuddy</text>
178
- </g>
179
- <g id="client-vscode">
180
- <rect x="52" y="552" width="283" height="67" rx="14" fill="#ffffff" stroke="#dde8f3" stroke-width="1.35" filter="url(#softShadow)"/>
181
- <g id="vscode-vector-mark">
182
- <path d="M 77 573.5 L 86 565.5 L 101 580.5 L 115 565.5 L 126 570.5 L 126 602.5 L 115 608.5 L 101 593.5 L 86 608.5 L 77 599.5 L 93 584.5 Z" stroke="#1878f6" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#1878f6"/>
183
- <path d="M 115 565.5 L 115 608.5 L 126 602.5 L 126 570.5 Z" stroke="#45a4ff" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#45a4ff"/>
184
- <path d="M 86 565.5 L 115 587.5 L 101 593.5 L 77 573.5 Z" stroke="#0065ce" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" fill="#0065ce"/>
185
- </g>
186
- <text x="153" y="594" fill="#101436" font-size="19.5" font-weight="565" text-anchor="start" letter-spacing="0">VS Code / CLI</text>
187
- </g>
188
- <g id="client-other">
189
- <rect x="52" y="632" width="283" height="67" rx="14" fill="#ffffff" stroke="#dde8f3" stroke-width="1.35" filter="url(#softShadow)"/>
190
- <circle cx="100" cy="665.5" r="27" fill="#e2e7ed" stroke="none" stroke-width="1.5"/>
191
- <circle cx="90" cy="665.5" r="2.7" fill="#2c4a78" stroke="none" stroke-width="1.5"/>
192
- <circle cx="100" cy="665.5" r="2.7" fill="#2c4a78" stroke="none" stroke-width="1.5"/>
193
- <circle cx="110" cy="665.5" r="2.7" fill="#2c4a78" stroke="none" stroke-width="1.5"/>
194
- <text x="153" y="674" fill="#101436" font-size="19.5" font-weight="565" text-anchor="start" letter-spacing="0">Other MCP client</text>
195
- </g>
196
- <g id="transport-direct-https">
197
- <rect x="445" y="270" width="273" height="153" rx="17" fill="url(#directBg)" stroke="#44cdb0" stroke-width="1.5" filter="url(#softShadow)"/>
198
- <circle cx="485" cy="331" r="31" fill="url(#greenDisc)"/>
199
- <path d="M 474 331 V 324 C 474 307 496 307 496 324 V 331" fill="none" stroke="#008963" stroke-width="3.6" stroke-linecap="round"/>
200
- <rect x="473" y="329" width="25" height="23" rx="5" fill="#03996d"/>
201
- <circle cx="485.5" cy="340.2" r="2.5" fill="#ffffff"/>
202
- <path d="M 485.5 342 L 485.5 348" fill="none" stroke="#ffffff" stroke-width="2.5"/>
203
- <text x="529" y="325" font-size="22" font-weight="750" fill="#0c1236">Direct HTTPS</text>
204
- <rect x="528" y="344" width="177" height="58" rx="11" fill="#d5f7eb"/>
205
- <text x="540" y="368" font-size="15" font-weight="500" fill="#04755e">Preferred when your</text>
206
- <text x="540" y="388" font-size="15" font-weight="500" fill="#04755e">network is reachable</text>
207
- </g>
208
- <g id="transport-secure-tunnel">
209
- <rect x="445" y="473" width="273" height="153" rx="17" fill="url(#tunnelBg)" stroke="#a783ff" stroke-width="1.5" filter="url(#softShadow)"/>
210
- <circle cx="485" cy="536" r="31" fill="url(#purpleDisc)"/>
211
- <path d="M 474 542 L 494 527 M 479 549 L 496 554" fill="none" stroke="#4a23bc" stroke-width="3.2" stroke-linecap="round"/>
212
- <circle cx="472" cy="542" r="6.2" fill="#e7ddff" stroke="#4a23bc" stroke-width="3"/>
213
- <circle cx="496" cy="523" r="6.2" fill="#e7ddff" stroke="#4a23bc" stroke-width="3"/>
214
- <circle cx="496" cy="555" r="6.2" fill="#e7ddff" stroke="#4a23bc" stroke-width="3"/>
215
- <text x="529" y="529" font-size="21.5" font-weight="740" fill="#101036">Secure Tunnel</text>
216
- <rect x="528" y="547" width="177" height="58" rx="11" fill="#e9e1ff"/>
217
- <text x="540" y="571" font-size="15.5" font-weight="500" fill="#5938e4">Best for restrictive</text>
218
- <text x="540" y="591" font-size="15.5" font-weight="500" fill="#5938e4">networks</text>
219
- </g>
220
- <g id="starmux-instance-A" transform="translate(-116 0)">
221
- <rect x="904" y="247" width="372" height="122" rx="15" fill="url(#gateway)" stroke="#3b9cff" stroke-width="1.5" filter="url(#softShadow)"/>
222
- <g transform="translate(959 308) scale(1)">
223
- <circle cx="0" cy="0" r="38" fill="url(#blueDisc)" stroke="none" stroke-width="1.5"/>
224
- <path d="M -15 -10 L 1 15 L 17 -10 M -15 -10 L 17 -10" stroke="#1265c7" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
225
- <circle cx="-15" cy="-12" r="7" fill="#ecf7ff" stroke="#1265c7" stroke-width="3.2"/>
226
- <circle cx="17" cy="-12" r="7" fill="#ecf7ff" stroke="#1265c7" stroke-width="3.2"/>
227
- <circle cx="1" cy="17" r="7" fill="#ecf7ff" stroke="#1265c7" stroke-width="3.2"/>
228
- </g>
229
- <text x="1017" y="290" fill="#0a1039" font-size="23" font-weight="750" text-anchor="start" letter-spacing="0">Starmux A</text>
230
- <text x="1017" y="319" fill="#2462b0" font-size="17" font-weight="455" text-anchor="start" letter-spacing="0">Local runtime</text>
231
- <rect x="1017" y="331" width="92" height="27" rx="14" fill="#dbfaeb" stroke="#b2edcf" stroke-width="1.1"/>
232
- <circle cx="1034" cy="344.5" r="6.4" fill="#0bb585" stroke="none" stroke-width="1.5"/>
233
- <text x="1047" y="350" fill="#008863" font-size="16" font-weight="540" text-anchor="start" letter-spacing="0">Online</text>
234
- <g id="programmable-middleware-A"><path d="M 1137 264 L 1137 352" fill="none" stroke="#c7dff8" stroke-width="1.3"/><rect x="1147" y="263" width="113" height="90" rx="11" fill="#ffffff" fill-opacity=".70" stroke="#c7dff8" stroke-width="1.1"/><text x="1203.5" y="282" fill="#2361a4" font-size="13.0" font-weight="730" text-anchor="middle">Programmable</text><rect x="1156" y="293" width="44" height="23" rx="11.5" fill="#e6f1ff" stroke="#d5e8fb" stroke-width=".8"/><text x="1178.0" y="308.5" fill="#2363a3" font-size="11.5" font-weight="560" text-anchor="middle">Policy</text><rect x="1204" y="293" width="48" height="23" rx="11.5" fill="#e6f1ff" stroke="#d5e8fb" stroke-width=".8"/><text x="1228.0" y="308.5" fill="#2363a3" font-size="11.1" font-weight="560" text-anchor="middle">Routing</text><rect x="1156" y="321" width="96" height="23" rx="11.5" fill="#e7f7f4" stroke="#c8eee6" stroke-width=".8"/><text x="1204" y="336.5" fill="#087e72" font-size="11.7" font-weight="570" text-anchor="middle">Tool adapters</text></g></g>
235
- <g id="starmux-instance-B" transform="translate(-116 0)">
236
- <rect x="904" y="402" width="372" height="122" rx="15" fill="url(#gateway)" stroke="#3b9cff" stroke-width="1.5" filter="url(#softShadow)"/>
237
- <g transform="translate(959 463) scale(1)">
238
- <circle cx="0" cy="0" r="38" fill="url(#blueDisc)" stroke="none" stroke-width="1.5"/>
239
- <path d="M -15 -10 L 1 15 L 17 -10 M -15 -10 L 17 -10" stroke="#1265c7" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
240
- <circle cx="-15" cy="-12" r="7" fill="#ecf7ff" stroke="#1265c7" stroke-width="3.2"/>
241
- <circle cx="17" cy="-12" r="7" fill="#ecf7ff" stroke="#1265c7" stroke-width="3.2"/>
242
- <circle cx="1" cy="17" r="7" fill="#ecf7ff" stroke="#1265c7" stroke-width="3.2"/>
243
- </g>
244
- <text x="1017" y="445" fill="#0a1039" font-size="23" font-weight="750" text-anchor="start" letter-spacing="0">Starmux B</text>
245
- <text x="1017" y="474" fill="#2462b0" font-size="17" font-weight="455" text-anchor="start" letter-spacing="0">Local runtime</text>
246
- <rect x="1017" y="486" width="92" height="27" rx="14" fill="#dbfaeb" stroke="#b2edcf" stroke-width="1.1"/>
247
- <circle cx="1034" cy="499.5" r="6.4" fill="#0bb585" stroke="none" stroke-width="1.5"/>
248
- <text x="1047" y="505" fill="#008863" font-size="16" font-weight="540" text-anchor="start" letter-spacing="0">Online</text>
249
- <g id="programmable-middleware-B"><path d="M 1137 419 L 1137 507" fill="none" stroke="#c7dff8" stroke-width="1.3"/><rect x="1147" y="418" width="113" height="90" rx="11" fill="#ffffff" fill-opacity=".70" stroke="#c7dff8" stroke-width="1.1"/><text x="1203.5" y="437" fill="#2361a4" font-size="13.0" font-weight="730" text-anchor="middle">Programmable</text><rect x="1156" y="448" width="44" height="23" rx="11.5" fill="#e6f1ff" stroke="#d5e8fb" stroke-width=".8"/><text x="1178.0" y="463.5" fill="#2363a3" font-size="11.5" font-weight="560" text-anchor="middle">Policy</text><rect x="1204" y="448" width="48" height="23" rx="11.5" fill="#e6f1ff" stroke="#d5e8fb" stroke-width=".8"/><text x="1228.0" y="463.5" fill="#2363a3" font-size="11.1" font-weight="560" text-anchor="middle">Routing</text><rect x="1156" y="476" width="96" height="23" rx="11.5" fill="#e7f7f4" stroke="#c8eee6" stroke-width=".8"/><text x="1204" y="491.5" fill="#087e72" font-size="11.7" font-weight="570" text-anchor="middle">Tool adapters</text></g></g>
250
- <g id="starmux-instance-C" transform="translate(-116 0)">
251
- <rect x="904" y="563" width="372" height="122" rx="15" fill="url(#gateway)" stroke="#3b9cff" stroke-width="1.5" filter="url(#softShadow)"/>
252
- <g transform="translate(959 624) scale(1)">
253
- <circle cx="0" cy="0" r="38" fill="url(#blueDisc)" stroke="none" stroke-width="1.5"/>
254
- <path d="M -15 -10 L 1 15 L 17 -10 M -15 -10 L 17 -10" stroke="#1265c7" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
255
- <circle cx="-15" cy="-12" r="7" fill="#ecf7ff" stroke="#1265c7" stroke-width="3.2"/>
256
- <circle cx="17" cy="-12" r="7" fill="#ecf7ff" stroke="#1265c7" stroke-width="3.2"/>
257
- <circle cx="1" cy="17" r="7" fill="#ecf7ff" stroke="#1265c7" stroke-width="3.2"/>
258
- </g>
259
- <text x="1017" y="606" fill="#0a1039" font-size="23" font-weight="750" text-anchor="start" letter-spacing="0">Starmux C</text>
260
- <text x="1017" y="635" fill="#2462b0" font-size="17" font-weight="455" text-anchor="start" letter-spacing="0">Local runtime</text>
261
- <rect x="1017" y="647" width="92" height="27" rx="14" fill="#dbfaeb" stroke="#b2edcf" stroke-width="1.1"/>
262
- <circle cx="1034" cy="660.5" r="6.4" fill="#0bb585" stroke="none" stroke-width="1.5"/>
263
- <text x="1047" y="666" fill="#008863" font-size="16" font-weight="540" text-anchor="start" letter-spacing="0">Online</text>
264
- <g id="programmable-middleware-C"><path d="M 1137 580 L 1137 668" fill="none" stroke="#c7dff8" stroke-width="1.3"/><rect x="1147" y="579" width="113" height="90" rx="11" fill="#ffffff" fill-opacity=".70" stroke="#c7dff8" stroke-width="1.1"/><text x="1203.5" y="598" fill="#2361a4" font-size="13.0" font-weight="730" text-anchor="middle">Programmable</text><rect x="1156" y="609" width="44" height="23" rx="11.5" fill="#e6f1ff" stroke="#d5e8fb" stroke-width=".8"/><text x="1178.0" y="624.5" fill="#2363a3" font-size="11.5" font-weight="560" text-anchor="middle">Policy</text><rect x="1204" y="609" width="48" height="23" rx="11.5" fill="#e6f1ff" stroke="#d5e8fb" stroke-width=".8"/><text x="1228.0" y="624.5" fill="#2363a3" font-size="11.1" font-weight="560" text-anchor="middle">Routing</text><rect x="1156" y="637" width="96" height="23" rx="11.5" fill="#e7f7f4" stroke="#c8eee6" stroke-width=".8"/><text x="1204" y="652.5" fill="#087e72" font-size="11.7" font-weight="570" text-anchor="middle">Tool adapters</text></g></g>
265
- <g id="macos-tools" transform="translate(-64 0)">
266
- <rect x="1298" y="232" width="355" height="151" rx="15" fill="url(#machineBlue)" stroke="#c5e1ff" stroke-width="1.5"/>
267
- <rect x="1329" y="250" width="46" height="33" rx="3" fill="none" stroke="#1062cd" stroke-width="3.3"/>
268
- <path d="M 1323 287 L 1381 287 L 1374 292 L 1331 292 Z" stroke="#1062cd" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="#1062cd"/>
269
- <text x="1407" y="266" fill="#0a1036" font-size="21" font-weight="725" text-anchor="start" letter-spacing="0">macOS</text>
270
- <g id="macos-tools-server-badge"><rect x="1407" y="279" width="170" height="25" rx="12.5" fill="#ffffff" fill-opacity=".90" stroke="#1062cd" stroke-width="1.0"/><text x="1492" y="296" fill="#1062cd" font-size="13.2" font-weight="620" text-anchor="middle" letter-spacing="0">Desktop Commander</text></g><g id="macos-tools-tool-capabilities" role="group"><line x1="1327" y1="326" x2="1624" y2="326" stroke="#bfdaf9" stroke-width="1.15" stroke-linecap="round"/><rect x="1327" y="338" width="74" height="29" rx="14.5" fill="#daedff" stroke="none"/><text x="1364.0" y="357" fill="#1062cd" font-size="15.4" font-weight="500" text-anchor="middle" letter-spacing="0">Files</text><rect x="1415" y="338" width="94" height="29" rx="14.5" fill="#daedff" stroke="none"/><text x="1462.0" y="357" fill="#1062cd" font-size="15.4" font-weight="500" text-anchor="middle" letter-spacing="0">Terminal</text><rect x="1523" y="338" width="101" height="29" rx="14.5" fill="#daedff" stroke="none"/><text x="1573.5" y="357" fill="#1062cd" font-size="15.4" font-weight="500" text-anchor="middle" letter-spacing="0">Services</text></g></g>
271
- <g id="windows-tools" transform="translate(-64 0)">
272
- <rect x="1298" y="401" width="355" height="151" rx="15" fill="url(#machineGreen)" stroke="#aaeedf" stroke-width="1.5"/>
273
- <rect x="1329" y="419" width="46" height="33" rx="3" fill="none" stroke="#008c70" stroke-width="3.3"/>
274
- <path d="M 1340 429 L 1351 427 L 1351 441 L 1340 441 Z" stroke="#008c70" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" fill="#008c70"/>
275
- <path d="M 1354 427 L 1365 425 L 1365 441 L 1354 441 Z" stroke="#008c70" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" fill="#008c70"/>
276
- <path d="M 1340 444 L 1351 444 L 1351 458 L 1340 456 Z" stroke="#008c70" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" fill="#008c70"/>
277
- <path d="M 1354 444 L 1365 444 L 1365 460 L 1354 458 Z" stroke="#008c70" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" fill="#008c70"/>
278
- <path d="M 1323 456 L 1381 456 L 1374 461 L 1331 461 Z" stroke="#008c70" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="#008c70"/>
279
- <text x="1407" y="435" fill="#0a1036" font-size="21" font-weight="725" text-anchor="start" letter-spacing="0">Windows</text>
280
- <g id="windows-tools-server-badge"><rect x="1407" y="448" width="170" height="25" rx="12.5" fill="#ffffff" fill-opacity=".90" stroke="#008c70" stroke-width="1.0"/><text x="1492" y="465" fill="#008c70" font-size="13.2" font-weight="620" text-anchor="middle" letter-spacing="0">Desktop Commander</text></g><g id="windows-tools-tool-capabilities" role="group"><line x1="1327" y1="495" x2="1624" y2="495" stroke="#b7e9df" stroke-width="1.15" stroke-linecap="round"/><rect x="1327" y="507" width="74" height="29" rx="14.5" fill="#d1f5f0" stroke="none"/><text x="1364.0" y="526" fill="#008c70" font-size="15.4" font-weight="500" text-anchor="middle" letter-spacing="0">Files</text><rect x="1415" y="507" width="94" height="29" rx="14.5" fill="#d1f5f0" stroke="none"/><text x="1462.0" y="526" fill="#008c70" font-size="15.4" font-weight="500" text-anchor="middle" letter-spacing="0">Terminal</text><rect x="1523" y="507" width="101" height="29" rx="14.5" fill="#d1f5f0" stroke="none"/><text x="1573.5" y="526" fill="#008c70" font-size="15.4" font-weight="500" text-anchor="middle" letter-spacing="0">Services</text></g></g>
281
- <g id="linux-tools" transform="translate(-64 0)">
282
- <rect x="1298" y="564" width="355" height="151" rx="15" fill="url(#machinePurple)" stroke="#d9c9ff" stroke-width="1.5"/>
283
- <rect x="1329" y="583" width="46" height="20" rx="4" fill="#4b3ebb" stroke="none" stroke-width="1.5"/>
284
- <rect x="1329" y="606" width="46" height="20" rx="4" fill="#4b3ebb" stroke="none" stroke-width="1.5"/>
285
- <circle cx="1339" cy="593" r="2" fill="#d8d5fb" stroke="none" stroke-width="1.5"/>
286
- <path d="M 1348 593 L 1366 593" stroke="#d8d5fb" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
287
- <circle cx="1339" cy="616" r="2" fill="#d8d5fb" stroke="none" stroke-width="1.5"/>
288
- <path d="M 1348 616 L 1366 616" stroke="#d8d5fb" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
289
- <text x="1407" y="598" fill="#0a1036" font-size="21" font-weight="725" text-anchor="start" letter-spacing="0">Linux / Workstation</text>
290
- <g id="linux-tools-server-badge"><rect x="1407" y="611" width="170" height="25" rx="12.5" fill="#ffffff" fill-opacity=".90" stroke="#4b3ebb" stroke-width="1.0"/><text x="1492" y="628" fill="#4b3ebb" font-size="13.2" font-weight="620" text-anchor="middle" letter-spacing="0">Desktop Commander</text></g><g id="linux-tools-tool-capabilities" role="group"><line x1="1327" y1="658" x2="1624" y2="658" stroke="#d5c9fa" stroke-width="1.15" stroke-linecap="round"/><rect x="1327" y="670" width="74" height="29" rx="14.5" fill="#e7dfff" stroke="none"/><text x="1364.0" y="689" fill="#4b3ebb" font-size="15.4" font-weight="500" text-anchor="middle" letter-spacing="0">Files</text><rect x="1415" y="670" width="94" height="29" rx="14.5" fill="#e7dfff" stroke="none"/><text x="1462.0" y="689" fill="#4b3ebb" font-size="15.4" font-weight="500" text-anchor="middle" letter-spacing="0">Terminal</text><rect x="1523" y="670" width="101" height="29" rx="14.5" fill="#e7dfff" stroke="none"/><text x="1573.5" y="689" fill="#4b3ebb" font-size="15.4" font-weight="500" text-anchor="middle" letter-spacing="0">Services</text></g></g>
291
- <g id="product-value-strip">
292
- <rect x="29" y="746" width="1611" height="125" rx="16" fill="#ffffff" stroke="#e2eaf7" stroke-width="1.4"/>
293
- <path d="M 528 773 L 528 847" stroke="#e3eaf4" stroke-width="1.35" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
294
- <path d="M 1080 773 L 1080 847" stroke="#e3eaf4" stroke-width="1.35" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
295
- <circle cx="97" cy="807" r="39" fill="#d7ebff" stroke="none" stroke-width="1.5"/>
296
- <path d="M 97 784 L 114 791 L 114 807 C 114 820 104 827 97 830 C 90 827 80 820 80 807 L 80 791 Z" stroke="#0059cf" stroke-width="3.0" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
297
- <path d="M 97 790 L 108 794 L 108 807 C 108 815 103 820 97 824 C 91 820 86 815 86 807 L 86 794 Z" stroke="#d7ebff" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
298
- <text x="153" y="802" fill="#0c1036" font-size="21" font-weight="750" text-anchor="start" letter-spacing="0">Self-hosted control</text>
299
- <text x="153" y="830" fill="#647595" font-size="16" font-weight="440" text-anchor="start" letter-spacing="0">Your gateways. Your machines. Your data.</text>
300
- <circle cx="610" cy="807" r="39" fill="#d4f9ed" stroke="none" stroke-width="1.5"/>
301
- <polygon points="610.0,789.0 616.0,784.8 619.0,791.4 622.7,794.3 629.9,795.5 627.4,802.3 628.0,807.0 632.2,813.0 625.6,816.0 622.7,819.7 621.5,826.9 614.7,824.4 610.0,825.0 604.0,829.2 601.0,822.6 597.3,819.7 590.1,818.5 592.6,811.7 592.0,807.0 587.8,801.0 594.4,798.0 597.3,794.3 598.5,787.1 605.3,789.6" fill="none" stroke="#008e69" stroke-width="3" stroke-linejoin="round"/>
302
- <circle cx="610" cy="807" r="7" fill="none" stroke="#008e69" stroke-width="3"/>
303
- <text x="666" y="790" fill="#0c1036" font-size="20" font-weight="735" text-anchor="start" letter-spacing="0">Use your real environments</text>
304
- <text x="666" y="817" fill="#647595" font-size="16" font-weight="400" text-anchor="start" letter-spacing="0">Work with your files, terminal, Git and services</text>
305
- <text x="666" y="841" fill="#647595" font-size="16" font-weight="400" text-anchor="start" letter-spacing="0">on your own computers.</text>
306
- <circle cx="1169" cy="807" r="39" fill="#e8e0ff" stroke="none" stroke-width="1.5"/>
307
- <text x="1227" y="790" fill="#0c1036" font-size="20" font-weight="735" text-anchor="start" letter-spacing="0">Programmable middleware</text>
308
- <text x="1227" y="817" fill="#647595" font-size="16" font-weight="400" text-anchor="start" letter-spacing="0">Define policies, routing and tool adapters</text>
309
- <text x="1227" y="841" fill="#647595" font-size="16" font-weight="400" text-anchor="start" letter-spacing="0">for each host environment.</text>
310
- <g id="programmable-middleware-symbol"><path d="M 1154 790 L 1154 823" fill="none" stroke="#4937c8" stroke-width="3" stroke-linecap="round"/><circle cx="1154" cy="803" r="5.3" fill="#f2edff" stroke="#4937c8" stroke-width="2.8"/><path d="M 1169 790 L 1169 823" fill="none" stroke="#4937c8" stroke-width="3" stroke-linecap="round"/><circle cx="1169" cy="813" r="5.3" fill="#f2edff" stroke="#4937c8" stroke-width="2.8"/><path d="M 1184 790 L 1184 823" fill="none" stroke="#4937c8" stroke-width="3" stroke-linecap="round"/><circle cx="1184" cy="798" r="5.3" fill="#f2edff" stroke="#4937c8" stroke-width="2.8"/></g></g>
311
- <path d="M 30 888 L 1641 888" stroke="#eaf0f8" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
312
- <g id="technical-footnote">
313
- <text x="836" y="914" fill="#637495" font-size="14.4" font-weight="400" text-anchor="middle" letter-spacing="0">Direct HTTPS avoids a managed relay. Secure Tunnel uses OpenAI forwarding. Multi-computer orchestration is a deployment pattern, not a single built-in unified control plane.</text>
314
- </g>
315
- </svg>