starmux 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/CONTRIBUTING.md +1 -1
  2. package/README.md +169 -97
  3. package/SECURITY.md +3 -3
  4. package/dist/src/access-control.js +23 -20
  5. package/dist/src/access-control.js.map +1 -1
  6. package/dist/src/access-dashboard.js +8 -2
  7. package/dist/src/access-dashboard.js.map +1 -1
  8. package/dist/src/cli/instances.js +87 -14
  9. package/dist/src/cli/instances.js.map +1 -1
  10. package/dist/src/cli/mac-mcp-gateway.js +4 -3
  11. package/dist/src/cli/mac-mcp-gateway.js.map +1 -1
  12. package/dist/src/cli/starmux-status.js +122 -0
  13. package/dist/src/cli/starmux-status.js.map +1 -0
  14. package/dist/src/cli/starmux.js +222 -49
  15. package/dist/src/cli/starmux.js.map +1 -1
  16. package/dist/src/deny-dashboard.js +2 -2
  17. package/dist/src/deny-dashboard.js.map +1 -1
  18. package/dist/src/instance-runtime.js +11 -2
  19. package/dist/src/instance-runtime.js.map +1 -1
  20. package/dist/src/instance-store.js +3 -1
  21. package/dist/src/instance-store.js.map +1 -1
  22. package/dist/src/ops-dashboard.js +4 -4
  23. package/dist/src/ops-dashboard.js.map +1 -1
  24. package/dist/src/permissions-dashboard.js +2 -2
  25. package/dist/src/permissions-dashboard.js.map +1 -1
  26. package/dist/src/runtime-paths.js +3 -3
  27. package/dist/src/runtime-paths.js.map +1 -1
  28. package/dist/src/starmux-migration.js +1 -1
  29. package/dist/src/starmux-migration.js.map +1 -1
  30. package/dist/vendor/desktop-commander/LICENSE +21 -0
  31. package/dist/vendor/desktop-commander/dist/bootstrap.js +22 -0
  32. package/dist/vendor/desktop-commander/dist/command-manager.js +246 -0
  33. package/dist/vendor/desktop-commander/dist/config-field-definitions.js +37 -0
  34. package/dist/vendor/desktop-commander/dist/config-manager.js +634 -0
  35. package/dist/vendor/desktop-commander/dist/config-recovery.js +81 -0
  36. package/dist/vendor/desktop-commander/dist/config.js +19 -0
  37. package/dist/vendor/desktop-commander/dist/custom-stdio.js +358 -0
  38. package/dist/vendor/desktop-commander/dist/error-handlers.js +15 -0
  39. package/dist/vendor/desktop-commander/dist/handlers/edit-search-handlers.js +6 -0
  40. package/dist/vendor/desktop-commander/dist/handlers/filesystem-handlers.js +450 -0
  41. package/dist/vendor/desktop-commander/dist/handlers/history-handlers.js +67 -0
  42. package/dist/vendor/desktop-commander/dist/handlers/index.js +7 -0
  43. package/dist/vendor/desktop-commander/dist/handlers/process-handlers.js +15 -0
  44. package/dist/vendor/desktop-commander/dist/handlers/search-answers.js +172 -0
  45. package/dist/vendor/desktop-commander/dist/handlers/search-handlers.js +136 -0
  46. package/dist/vendor/desktop-commander/dist/handlers/terminal-handlers.js +35 -0
  47. package/dist/vendor/desktop-commander/dist/index.js +88 -0
  48. package/dist/vendor/desktop-commander/dist/search-manager.js +1262 -0
  49. package/dist/vendor/desktop-commander/dist/server.js +1414 -0
  50. package/dist/vendor/desktop-commander/dist/terminal-manager.js +757 -0
  51. package/dist/vendor/desktop-commander/dist/tools/config.js +211 -0
  52. package/dist/vendor/desktop-commander/dist/tools/edit.js +455 -0
  53. package/dist/vendor/desktop-commander/dist/tools/feedback.js +10 -0
  54. package/dist/vendor/desktop-commander/dist/tools/filesystem.js +1047 -0
  55. package/dist/vendor/desktop-commander/dist/tools/fuzzySearch.js +74 -0
  56. package/dist/vendor/desktop-commander/dist/tools/fuzzySearchCore.js +125 -0
  57. package/dist/vendor/desktop-commander/dist/tools/improved-process-tools.js +726 -0
  58. package/dist/vendor/desktop-commander/dist/tools/mime-types.js +28 -0
  59. package/dist/vendor/desktop-commander/dist/tools/pdf/extract-images.js +131 -0
  60. package/dist/vendor/desktop-commander/dist/tools/pdf/index.js +4 -0
  61. package/dist/vendor/desktop-commander/dist/tools/pdf/lib/pdf2md.js +78 -0
  62. package/dist/vendor/desktop-commander/dist/tools/pdf/manipulations.js +112 -0
  63. package/dist/vendor/desktop-commander/dist/tools/pdf/markdown.js +30 -0
  64. package/dist/vendor/desktop-commander/dist/tools/pdf/utils.js +45 -0
  65. package/dist/vendor/desktop-commander/dist/tools/process.js +90 -0
  66. package/dist/vendor/desktop-commander/dist/tools/prompts.js +259 -0
  67. package/dist/vendor/desktop-commander/dist/tools/schemas.js +242 -0
  68. package/dist/vendor/desktop-commander/dist/tools/usage.js +24 -0
  69. package/dist/vendor/desktop-commander/dist/types.js +1 -0
  70. package/dist/vendor/desktop-commander/dist/ui/config-editor/config-editor-runtime.js +150 -0
  71. package/dist/vendor/desktop-commander/dist/ui/config-editor/index.html +13 -0
  72. package/dist/vendor/desktop-commander/dist/ui/config-editor/styles.css +587 -0
  73. package/dist/vendor/desktop-commander/dist/ui/contracts.js +57 -0
  74. package/dist/vendor/desktop-commander/dist/ui/file-preview/index.html +16 -0
  75. package/dist/vendor/desktop-commander/dist/ui/file-preview/preview-runtime.js +471 -0
  76. package/dist/vendor/desktop-commander/dist/ui/file-preview/shared/preview-file-types.js +59 -0
  77. package/dist/vendor/desktop-commander/dist/ui/file-preview/styles.css +1631 -0
  78. package/dist/vendor/desktop-commander/dist/ui/resources.js +93 -0
  79. package/dist/vendor/desktop-commander/dist/utils/ab-test.js +122 -0
  80. package/dist/vendor/desktop-commander/dist/utils/atomic-write.js +80 -0
  81. package/dist/vendor/desktop-commander/dist/utils/capture.js +40 -0
  82. package/dist/vendor/desktop-commander/dist/utils/dockerPrompt.js +9 -0
  83. package/dist/vendor/desktop-commander/dist/utils/exit-process.js +31 -0
  84. package/dist/vendor/desktop-commander/dist/utils/feature-flags.js +18 -0
  85. package/dist/vendor/desktop-commander/dist/utils/files/base.js +5 -0
  86. package/dist/vendor/desktop-commander/dist/utils/files/binary.js +65 -0
  87. package/dist/vendor/desktop-commander/dist/utils/files/docx.js +694 -0
  88. package/dist/vendor/desktop-commander/dist/utils/files/excel.js +497 -0
  89. package/dist/vendor/desktop-commander/dist/utils/files/factory.js +168 -0
  90. package/dist/vendor/desktop-commander/dist/utils/files/image.js +89 -0
  91. package/dist/vendor/desktop-commander/dist/utils/files/index.js +14 -0
  92. package/dist/vendor/desktop-commander/dist/utils/files/pdf.js +124 -0
  93. package/dist/vendor/desktop-commander/dist/utils/files/text.js +423 -0
  94. package/dist/vendor/desktop-commander/dist/utils/fuzzySearchLogger.js +126 -0
  95. package/dist/vendor/desktop-commander/dist/utils/internal-facts.js +23 -0
  96. package/dist/vendor/desktop-commander/dist/utils/lazy-package.js +44 -0
  97. package/dist/vendor/desktop-commander/dist/utils/lineEndingHandler.js +77 -0
  98. package/dist/vendor/desktop-commander/dist/utils/logger.js +72 -0
  99. package/dist/vendor/desktop-commander/dist/utils/mcp-ui-ab-test.js +62 -0
  100. package/dist/vendor/desktop-commander/dist/utils/open-browser.js +2 -0
  101. package/dist/vendor/desktop-commander/dist/utils/process-detection.js +260 -0
  102. package/dist/vendor/desktop-commander/dist/utils/process-tree.js +223 -0
  103. package/dist/vendor/desktop-commander/dist/utils/rename.js +74 -0
  104. package/dist/vendor/desktop-commander/dist/utils/ripgrep-resolver.js +69 -0
  105. package/dist/vendor/desktop-commander/dist/utils/shell.js +187 -0
  106. package/dist/vendor/desktop-commander/dist/utils/system-info.js +727 -0
  107. package/dist/vendor/desktop-commander/dist/utils/terminal-timestamps.js +18 -0
  108. package/dist/vendor/desktop-commander/dist/utils/toolHistory.js +309 -0
  109. package/dist/vendor/desktop-commander/dist/utils/trackTools.js +55 -0
  110. package/dist/vendor/desktop-commander/dist/utils/unsupportedParams.js +66 -0
  111. package/dist/vendor/desktop-commander/dist/utils/usageTracker.js +225 -0
  112. package/dist/vendor/desktop-commander/dist/utils/welcome-onboarding.js +2 -0
  113. package/dist/vendor/desktop-commander/dist/utils/withTimeout.js +85 -0
  114. package/dist/vendor/desktop-commander/dist/version.js +1 -0
  115. package/dist/vendor/desktop-commander/package.json +15 -0
  116. package/docs/ACCESS_CONTROL.md +5 -5
  117. package/docs/CLIENTS.md +11 -19
  118. package/docs/CONNECT_CHATGPT.md +4 -6
  119. package/docs/INSTALL.md +9 -5
  120. package/docs/INSTANCES.md +5 -2
  121. package/docs/OAUTH.md +6 -14
  122. package/docs/PLATFORMS.md +4 -4
  123. package/docs/README.md +2 -11
  124. package/docs/REMOTE_SETUP.md +13 -13
  125. package/docs/SECURITY.md +5 -5
  126. package/docs/assets/starmux-architecture.svg +315 -0
  127. package/package.json +14 -2
  128. package/docs/ARCHITECTURE.md +0 -51
  129. package/docs/MIGRATION.md +0 -37
  130. package/docs/RELEASE_STATUS.md +0 -31
  131. package/docs/TYPESCRIPT_MIGRATION.md +0 -56
  132. package/docs/VALIDATION_OAUTH.md +0 -79
  133. package/docs/VALIDATION_TUNNEL.md +0 -39
  134. package/docs/VALIDATION_WORKBUDDY.md +0 -59
  135. package/docs/assets/mcp-connection-route.svg +0 -104
  136. package/docs/assets/mcp-gateway-simple.svg +0 -62
@@ -0,0 +1,315 @@
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>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "starmux",
3
- "version": "0.11.0",
3
+ "version": "0.13.0",
4
4
  "description": "Connect AI clients to files, terminals and development tools on your own computer.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -28,22 +28,34 @@
28
28
  "build:test": "npm run build",
29
29
  "prepare": "node scripts/prepare.mjs",
30
30
  "prepack": "npm run build",
31
+ "sync:upstream": "npm install --save-dev --save-exact @wonderwhy-er/desktop-commander@latest --ignore-scripts && npm run build",
31
32
  "test:oauth:keycloak": "npm run build && node --test dist/test/keycloak.integration.js"
32
33
  },
33
34
  "dependencies": {
34
35
  "@modelcontextprotocol/sdk": "1.32.1",
35
- "@wonderwhy-er/desktop-commander": "0.3.0",
36
+ "@opendocsg/pdf2md": "0.3.4",
37
+ "@vscode/ripgrep": "1.18.0",
38
+ "exceljs": "4.4.0",
39
+ "fastest-levenshtein": "1.0.16",
40
+ "isbinaryfile": "5.0.7",
36
41
  "jose": "6.2.12",
37
42
  "jsonc-parser": "3.3.1",
43
+ "pdf-lib": "1.17.1",
44
+ "pizzip": "3.3.0",
45
+ "proper-lockfile": "4.1.2",
46
+ "sharp": "0.35.5",
47
+ "unpdf": "1.8.0",
38
48
  "zod": "3.25.76",
39
49
  "zod-to-json-schema": "3.25.2"
40
50
  },
41
51
  "devDependencies": {
42
52
  "@types/node": "22.20.5",
53
+ "@wonderwhy-er/desktop-commander": "0.3.1",
43
54
  "typescript": "5.9.3"
44
55
  },
45
56
  "files": [
46
57
  "dist/src",
58
+ "dist/vendor",
47
59
  "src/dc-workspace-http.mjs",
48
60
  "scripts/prepare.mjs",
49
61
  "test/fixtures/p1-fixture.txt",
@@ -1,51 +0,0 @@
1
- # Architecture
2
-
3
- ```text
4
- Remote MCP Client(s)
5
- |
6
- +--> Authenticated Direct HTTPS (public TLS 443 + caller auth) --+
7
- | |
8
- +--> Secure MCP Tunnel (outbound, OpenAI infrastructure) --------+
9
- |
10
- Starmux Core
11
- localhost MCP + policy
12
- |
13
- Desktop Commander MCP (stdio)
14
- |
15
- User's Mac OS / tools
16
- ```
17
-
18
- The menu bar App and CLI are two controllers for **one** local Core. Remote transports are separate from those controllers. Gateway owns ingress/routing/authorization boundaries and doesn't reimplement the actual upstream MCP file/Git/Shell tools. Real remote caller identity and authorization must be checked **before** granting trusted developer capabilities.
19
-
20
- Foreground startup separates configuration from executable selection. Automatic selection prefers the saved onboarding configuration, then a validated legacy configuration if no onboarding file exists. Legacy configuration supplies settings only: the Core and Node process come from the invoked CLI installation. `run` prints the configuration path, actual compiled Core module path, package version/code fingerprint and port in English; `run --json` and App-parent launches emit structured lifecycle events. Advanced profile selection changes configuration, not the executable version.
21
-
22
- This release provides a single-Mac Gateway that was owner-tested with 25 native Desktop Commander tools and 2 Gateway tools. Operator-configured stdio upstreams are supported with explicit tool grants and namespaced tool names; public external client verification, unified multi-Mac management, generalized user-script middleware and GUI Computer Use are **not** fully shipped.
23
-
24
- ## Core implementation
25
-
26
- Gateway Core and CLI are one ESM npm package written in strict TypeScript. SwiftUI remains the native App interface. `tsc` uses NodeNext resolution and ES2022 output; relative source imports end in `.js`. Production entrypoints run emitted JavaScript without a TypeScript loader.
27
-
28
- | Boundary | Implementation |
29
- | --- | --- |
30
- | Shared protocol and configuration | `src/contracts.ts`, SDK MCP types, `src/config-schemas.ts` (Zod 3) |
31
- | Upstream lifecycle and native forwarding | `local-desktop-read-probe.ts`, `configured-mcp-upstreams.ts` |
32
- | Names, collisions and default resources | `mcp-upstream-router.ts` |
33
- | Internal identity and revocation primitives (not wired into Core HTTP) | `remote-auth.ts`, `community-remote-revocations.ts` |
34
- | Workspace authorization and argument preparation | workspace policies, grants, explicit deny rules |
35
- | Internal execution and observations | `invocation.ts`, `tool-dispatch.ts` |
36
- | Explicit HTTP lifecycle | `createGatewayRuntime()` in `dc-workspace-http.ts` |
37
- | CLI and owner control | `src/cli/`, `operator-cli.ts`, `global-core-control.ts` |
38
-
39
- Calls pass through explicit deny checks, internal `beforeCall` hooks, target dispatch, policy preparation, execution, and `afterCall` observation. Dispatch preserves the priority of Gateway tools, extension routes, owner-enabled native mode, workspace mode and fixed fixtures. The executor consumes an internal authorized invocation once before awaiting an upstream response. An uncertain call is never automatically replayed. Hooks receive frozen copies; failed observers or audit sinks cannot replace an obtained result. The original MCP result is returned, including structured content, resource/image content and extension fields.
40
-
41
- These hooks are package-internal code contracts. There is no public Middleware SDK, user-script loader or package-level SDK export. The internal authenticator checks JWT identity, an explicitly required scope and revocation state; it is not an HTTP service and is not connected to Core requests. Core requests remain explicitly `unverified-local` because loopback and ordinary headers do not establish that identity. Remote deployments must supply their actual authenticated access boundary. Owner control uses its separate private socket/lease protocol.
42
-
43
- The former optional two-tool read-only ingress and its dedicated doctor command have been removed. Normal Core permission profiles, explicit deny rules and trusted native Desktop Commander forwarding are unchanged. The retained `remote:revoke` helper manages revocation data for the internal authenticator only; it does not disconnect an existing Tunnel or revoke access in an external identity provider.
44
-
45
- Importing Core modules or constructing a runtime does not listen, start upstream processes or register signal handlers. `start()` and `close()` manage an instance; `runGateway()` is the process entrypoint that owns signals. Remaining `bin/*.mjs` adapters and `src/dc-workspace-http.mjs` load `dist/src` implementations. Installation paths resolve from the compiled package location, including child CLI restarts, independently of the caller's current directory. Source builds clear `dist` before compiling so removed modules cannot remain in published artifacts.
46
-
47
- ## Named instance management
48
-
49
- `instance-store.ts` owns the private registry, JSONC parsing, generated JSON Schema, source revisions and independent state paths. App and CLI use the same commands. `instance-runtime.ts` supervises one Core process per instance, with authenticated instance-ID/run-ID control plus the existing global port lease. The supervisor applies immutable configuration snapshots, restarts only its worker and restores the prior snapshot once on launch failure. Dynamic credential and authorization state is never restored from a startup snapshot. `instance-migration.ts` provides read-only legacy discovery followed by an explicit switch. Legacy entrypoints remain available before migration.
50
-
51
- Swift `InstanceController` invokes the shared CLI and tracks only its own child supervisors. The manager window edits stopped instances and shows saved versus active configuration. Quitting stops that App session's children without adopting CLI instances. The old diagnostic views remain available as supporting code; the primary menu now opens instance management.
package/docs/MIGRATION.md DELETED
@@ -1,37 +0,0 @@
1
- # Migrate from Mac MCP Gateway
2
-
3
- Starmux 0.10.0 replaces the old public command name. It uses `~/.config/starmux`; migration retains the original data in `~/.config/mac-mcp-gateway`.
4
-
5
- ```sh
6
- starmux migrate # Preview discovered sources
7
- starmux migrate registry # Migrate existing named instances
8
- # For an installation that only has a legacy profile:
9
- starmux migrate setup
10
- # Or: starmux migrate live
11
- ```
12
-
13
- Migration asks before stopping the selected old processes. Add `-y` for unattended operation. Migrate the registry when present, so previously imported profiles are not duplicated. The destination must be empty. After migration:
14
-
15
- ```sh
16
- starmux ls
17
- starmux up
18
- starmux status
19
- ```
20
-
21
- The registry migration retains stable IDs, the default selection, saved permissions, keys, OAuth settings and revocations, management tokens, policies, secrets and successful configuration snapshots. Managed paths are rewritten; externally linked configuration remains in place. Runtime locks and PID records are recreated by a new start. If interrupted before commit, rerun the same migration to rebuild the recognized staging directory from the originals.
22
-
23
- Existing Home-only configurations retain that boundary. To choose full OS-account coding permissions explicitly, run `starmux up --code` and confirm.
24
-
25
- | Previous workflow | Starmux |
26
- | --- | --- |
27
- | `setup` / `instance create` | `init`, or simply `up` |
28
- | `run` | `up` (background), `up --foreground` |
29
- | `stop` | `down` / `stop` |
30
- | `instance list` | `ls` |
31
- | `access create` + `access mode api-key` | `auth key "Name"` |
32
- | `access status` / `access list` | `auth` |
33
- | `access revoke` / `access revoke-oauth` | `auth revoke ID` |
34
- | `access owner-token` | `dashboard --token` |
35
- | `instance import/copy/rename/archive/restore/default` | corresponding `config` subcommand |
36
-
37
- Update scripts to `starmux` and `-i NAME`. Public environment settings use `STARMUX_*`; ordinary commands ignore old `MAC_MCP_*` overlays. Use `STARMUX_TOKEN` for local authenticated verification. Old `mgw_` credentials remain valid until expiry or revocation.
@@ -1,31 +0,0 @@
1
- # Starmux 0.11.0 preview
2
-
3
- This release restores the product story, connection overview and native App showcase in the README, and includes the complete user documentation and a real screenshot of the restored status monitor in the npm package. It retains the CLI workflow introduced in 0.10.0: background `up`, CWD-based first setup, `--code` / `--write`, unified authentication and explicit migration.
4
-
5
- The macOS App source restores the status monitor as the main interface, with advanced instance management behind a secondary entry. It shows the selected instance’s active configuration, actual port and anonymous tool activity. UI acceptance covered stopping a CLI instance, starting it under App ownership, opening permissions and advanced settings, and quitting the App while an independent CLI instance kept running.
6
-
7
- The npm package includes the App screenshot and build guide; the native `.app` is distributed separately. Updating npm does not replace an installed macOS App.
8
-
9
- ## Included
10
-
11
- - TypeScript CLI/Core, automatic local initialization and supervised background processes.
12
- - Read-only and full OS-account coding modes, independent instances and JSONC configuration with apply/rollback.
13
- - Ingress, API-key and OAuth authentication; local Access console and persistent revocation.
14
- - Complete user guides, connection diagrams and the native App screenshot.
15
- - macOS App source and development build tooling in the source repository.
16
-
17
- ## Release validation
18
-
19
- The 0.11.0 release workflow checks the final tarball contents, installs it in an isolated prefix and exercises startup, MCP verification, API-key authentication and shutdown. After publication, the same workflow is repeated from the public registry and the package integrity is compared with the tested archive.
20
-
21
- The preceding public 0.10.0 package passed this install-and-run workflow on macOS. The restored App also passed its native build, self-tests and UI ownership checks.
22
-
23
- ## Tested deployment history
24
-
25
- ChatGPT web OAuth over Tunnel has passed login, coding, session revocation and fresh-login recovery on the earlier Core. WorkBuddy HTTPS + API key has passed remote file reads/writes. Those results describe the recorded deployments; this CLI rebrand does not rerun their external services automatically. See [clients](CLIENTS.md) and the [validation archives](README.md#validation-archives).
26
-
27
- ## Preview limits
28
-
29
- Windows native installation and the new CLI's Linux release acceptance remain pending. The macOS App is not distributed as a signed, notarized public download. OAuth provider provisioning, general user-defined script hooks and multi-computer orchestration are future work.
30
-
31
- [Install](INSTALL.md) · [Remote setup](REMOTE_SETUP.md) · [Platforms](PLATFORMS.md)