starmux 0.13.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.
package/README.md CHANGED
@@ -19,7 +19,7 @@ Cloud AI assistants (like **ChatGPT Web**, **Claude**, **Codex**, or **WorkBuddy
19
19
  **Starmux** (`Star` topology + `Multiplexer`) is a self-hosted MCP gateway that connects remote AI clients to the real tools on your own computers over Direct HTTPS or a Secure Tunnel:
20
20
 
21
21
  <div align="center">
22
- <img src="docs/assets/starmux-architecture.svg" width="100%" alt="Starmux architecture: Many AI clients connecting to self-hosted computers via Direct HTTPS or Secure MCP Tunnel" />
22
+ <img src="https://raw.githubusercontent.com/cookyecat/starmux/main/docs/assets/starmux-architecture.svg" width="100%" alt="Starmux architecture: Many AI clients connecting to self-hosted computers via Direct HTTPS or Secure MCP Tunnel" />
23
23
  </div>
24
24
 
25
25
  - **Batteries-Included Workspace Tools:** Powered by a built-in [Desktop Commander](https://github.com/wonderwhy-er/DesktopCommanderMCP) engine (installed automatically via npm). Out of the box, your AI can read/write files, search code, run Shell commands, and manage Git.
@@ -213,7 +213,7 @@ See [Instances and Configuration](docs/INSTANCES.md) for advanced JSONC configur
213
213
  Prefer a visual interface? The native SwiftUI menu bar App puts service health, workspace permissions, live MCP connection topology, and recent tool calls in one compact panel.
214
214
 
215
215
  <div align="center">
216
- <img src="docs/assets/starmux-app-en.png" width="380" alt="Starmux native macOS menu bar app showing service status, MCP connection topology, and recent tool calls" />
216
+ <img src="https://raw.githubusercontent.com/cookyecat/starmux/main/docs/assets/starmux-app-en.png" width="380" alt="Starmux native macOS menu bar app showing service status, MCP connection topology, and recent tool calls" />
217
217
  <p><sub>Native macOS Menu Bar App (English & Chinese) · Controls the same instances as the CLI</sub></p>
218
218
  </div>
219
219
 
@@ -14,7 +14,7 @@ import { handle } from './instances.js';
14
14
  import { desktopCommanderEntry } from '../runtime-paths.js';
15
15
  import { shellQuote } from '../platform.js';
16
16
  import { formatStarmuxStatus } from './starmux-status.js';
17
- const version = '0.13.0';
17
+ const version = '0.13.1';
18
18
  const strings = ['instance', 'port', 'lines', 'expires', 'issuer', 'resource', 'resource-aliases', 'client-id', 'subject', 'subjects', 'registration', 'token-auth', 'callback', 'revision', 'patch', 'file', 'output', 'name', 'target', 'mode', 'app-parent-pid'];
19
19
  const booleans = ['help', 'version', 'json', 'write', 'code', 'read', 'yes', 'foreground', 'follow', 'archived', 'all', 'effective', 'link', 'allow-loopback-http', 'token-stdin', 'no-open', 'token'];
20
20
  const options = {};
@@ -1 +1 @@
1
- {"version":3,"file":"starmux.js","sourceRoot":"","sources":["../../../src/cli/starmux.ts"],"names":[],"mappings":"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","sourcesContent":["import {parseArgs} from 'node:util';\nimport {spawn} from 'node:child_process';\nimport {createInterface} from 'node:readline/promises';\nimport {open,realpath,readFile,stat} from 'node:fs/promises';\nimport {homedir} from 'node:os';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport type {Transport} from '@modelcontextprotocol/sdk/shared/transport.js';\nimport {Client} from '@modelcontextprotocol/sdk/client/index.js';\nimport {StreamableHTTPClientTransport} from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport {createAccessControl} from '../access-control.js';\nimport {instanceStatus,instanceRequest,runInstance} from '../instance-runtime.js';\nimport {atomicPrivate,availablePort,changeRegistry,configJSONSchema,createInstance,ensureAccessReady,exists,instanceConfigSchema,instancePaths,loadInstanceConfig,parseConfig,patchInstanceConfig,readRegistry,readTrusted,resolveInstance,saveInstanceConfig,suggestPort,validateConfig,type Instance,type InstanceConfig} from '../instance-store.js';\nimport {handle} from './instances.js';\nimport {desktopCommanderEntry} from '../runtime-paths.js';\nimport {shellQuote} from '../platform.js';\nimport {formatStarmuxStatus} from './starmux-status.js';\n\nconst version='0.13.0';\nconst strings=['instance','port','lines','expires','issuer','resource','resource-aliases','client-id','subject','subjects','registration','token-auth','callback','revision','patch','file','output','name','target','mode','app-parent-pid'];\nconst booleans=['help','version','json','write','code','read','yes','foreground','follow','archived','all','effective','link','allow-loopback-http','token-stdin','no-open','token'];\nconst options:Record<string,{type:'string'|'boolean';short?:string}>={};\nfor(const k of strings)options[k]={type:'string',...(k==='instance'?{short:'i'}:{})};\nfor(const k of booleans)options[k]={type:'boolean',...(k==='yes'?{short:'y'}:k==='follow'?{short:'f'}:k==='help'?{short:'h'}:k==='version'?{short:'v'}:{})};\nlet parsed:ReturnType<typeof parseArgs>;\ntry{parsed=parseArgs({args:process.argv.slice(2),options,allowPositionals:true,strict:true});}catch(error){process.stderr.write((error instanceof Error?error.message:String(error))+'\\n');process.exit(1);}\nconst flags=parsed.values;const positional=parsed.positionals;const command=positional.shift()??'help';\nconst string=(key:string)=>typeof flags[key]==='string'?flags[key] as string:undefined;\nconst yes=()=>flags.yes===true;const json=flags.json===true;\nconst print=(value:unknown)=>process.stdout.write(JSON.stringify(value,null,2)+'\\n');\nfunction fail(message:string):never{throw Error(message);}\nconst absolute=(value:string)=>path.resolve(value==='~'?homedir():value.startsWith('~/')?path.join(homedir(),value.slice(2)):value);\nconst pause=(ms:number)=>new Promise(resolve=>setTimeout(resolve,ms));\n\nfunction help(){\n const requested=command==='help'?positional[0]:command;\n const topic=requested==='stop'?'down':requested;\n const sections:Record<string,string>={\n up:'up [path] [--read | --write | --code] [-y] [--port N] [--foreground]\\n Initialize and start. First use defaults to CWD; later starts reuse saved settings.',\n init:'init [path] [--read | --write | --code] [-y] [--port N]\\n Save settings without starting. --write and --code enable full account coding permissions.',\n auth:'auth\\n auth key \"Client name\" [--expires 30d]\\n auth mode none|ingress|api-key|oauth\\n auth revoke ID\\n auth oauth init-keycloak --resource URL --callback URL\\n auth oauth setup --issuer URL --resource URL --client-id ID --subject USER_ID\\n auth oauth doctor',\n config:'config [show] [--effective]\\n config edit | diff | apply | validate | path | schema | recover\\n config default NAME | rename NEW_NAME -i SOURCE | copy NEW_NAME -i SOURCE\\n config archive -i NAME | restore -i NAME | import FILE [-i NAME] [--link]\\n config export [--output FILE] | secret set|remove NAME',\n dashboard:'dashboard [--no-open | --token]\\n Open the local Access console. --no-open prints a private login link.',\n verify:'verify [--token-stdin]\\n Test MCP initialization, tool discovery and workspace read. Authenticated instances use STARMUX_TOKEN or stdin.',\n doctor:'doctor\\n Check Node, bundled dependencies, workspace, configuration, port and authentication.',\n logs:'logs [-f | --follow] [--lines 1..200]\\n Follow continues across restarts. Ctrl+C exits the follower only.',\n migrate:'migrate [registry|setup|live] [-y]\\n No source: preview. Select a source to migrate, retaining originals.',\n status:'status [--all]\\n Show the selected instance, its actual endpoint and connection guide.',\n ls:'ls [--archived]\\n List local workspace instances.',\n rm:'rm [NAME] (alias for: config archive)\\n Stop and archive an instance.',\n down:'down (alias: stop)\\n Stop the selected instance.',\n permissions:'permissions [status | token]\\n permissions disable-tool|enable-tool|deny-directory|allow-directory TARGET\\n Manage the selected instance’s tool and directory permissions.',\n privacy:'privacy [--all] [--target PATH]\\n Check privacy access through the running instance.'\n };\n if(topic&&topic!=='help'&&!sections[topic])fail('Unknown command: '+topic+'. Run starmux --help.');\n const overview=[\n 'Connect AI clients to your computer’s files, shell and development tools.',\n '',\n 'Workspace Lifecycle:',\n ' starmux up [path] [--code] Start in the background (default: Read-only)',\n ' starmux down Stop the running instance (alias: stop)',\n ' starmux status Show health, endpoint and connection guide',\n ' starmux logs [-f] View or stream gateway logs',\n '',\n 'Access & Verification:',\n ' starmux auth Manage auth mode, API keys and OAuth',\n ' starmux dashboard Open the local Web Access Console',\n ' starmux verify Test local MCP handshake and workspace read',\n ' starmux doctor Check runtime, config, port and auth state',\n '',\n 'Multi-Instance & Config:',\n ' starmux ls List workspace instances',\n ' starmux rm [name] Stop and archive an instance',\n ' starmux init [path] Save instance settings without starting',\n ' starmux config Inspect, edit or apply configuration',\n ' starmux migrate Import settings from a legacy installation'\n ].join('\\n');\n process.stdout.write(`Starmux ${version}\\n\\n${sections[topic??'']??overview}\\n\\nGlobal: -i, --instance NAME_OR_ID --json -h, --help\\nUse starmux COMMAND --help for details.\\n`);\n}\nasync function confirm(message:string){\n if(yes())return;\n if(!process.stdin.isTTY)fail(message+' Re-run with -y to confirm.');\n const rl=createInterface({input:process.stdin,output:process.stderr});\n try{if(!/^y(es)?$/i.test((await rl.question(message+' [y/N] ')).trim()))fail('Cancelled.');}finally{rl.close();}\n}\nasync function consent(instance:Instance|undefined,config:InstanceConfig){\n if(config.accessRole!=='trusted'||config.writeScope!=='unrestricted')return;\n if(instance&&await exists(path.join(instancePaths(instance).state,'coding-consent.json'))){\n const record=JSON.parse(await readTrusted(path.join(instancePaths(instance).state,'coding-consent.json'))) as {version?:number;scope?:string};\n if(record.version===1&&record.scope==='os-account')return;\n }\n await confirm('Coding mode can modify files accessible to your OS account and execute Shell and Git. Enable?');\n}\nasync function rememberConsent(instance:Instance,config:InstanceConfig){\n if(config.accessRole==='trusted'&&config.writeScope==='unrestricted'&&!await exists(path.join(instancePaths(instance).state,'coding-consent.json')))await atomicPrivate(path.join(instancePaths(instance).state,'coding-consent.json'),JSON.stringify({version:1,scope:'os-account',approvedAt:new Date().toISOString()}));\n}\nasync function selected(){return resolveInstance(string('instance'));}\nasync function configure(){\n if(positional.length>1)fail('Usage: starmux '+command+' [path]');\n const registry=await readRegistry();let instance:Instance|undefined;\n const selector=string('instance');\n if(selector)instance=registry.instances.find(i=>i.id===selector||i.name===selector);\n else if(registry.instances.length)instance=await resolveInstance();\n if(instance?.archived)fail('Instance is archived. Use starmux config restore -i '+instance.name);\n if(!instance&&await exists(path.join(homedir(),'.config','mac-mcp-gateway'))&&!registry.instances.length)fail('Existing installation found. Run starmux migrate first.');\n const loaded=instance?await loadInstanceConfig(instance):undefined;\n const writing=flags.write||flags.code;\n if(flags.read&&writing)fail('--read cannot be combined with --write or --code.');\n const project=positional[0]??loaded?.config.projectRoot??process.cwd();\n const config=await validateConfig(instanceConfigSchema.parse({...loaded?.config,\n projectRoot:await realpath(absolute(project)),schemaVersion:1,\n port:string('port')?Number(string('port')):loaded?.config.port??(selector?await suggestPort():18893),\n ...(writing?{accessRole:'trusted',mode:'read-write',writeScope:'unrestricted'}:{}),\n ...(flags.read?{accessRole:'restricted',mode:'read-only',writeScope:'unrestricted',gitMode:'off',worktreeMode:'off',upstreams:[]}:{}),\n }));\n await consent(instance,config);\n if(!instance)instance=await createInstance(selector??'default',{config});\n else if(JSON.stringify(config)!==JSON.stringify(loaded!.config))await patchInstanceConfig(instance,config,loaded!.revision);\n await rememberConsent(instance,config);return instance;\n}\nasync function isDefaultInstance(instance:Instance){\n const registry=await readRegistry().catch(()=>({defaultInstanceId:null,instances:[] as Instance[]}));\n return instance.name==='default'&&(registry.defaultInstanceId===instance.id||registry.instances.filter(i=>!i.archived).length<=1);\n}\nasync function instanceFlag(instance:Instance){\n if(await isDefaultInstance(instance))return '';\n const selector=/^[A-Za-z0-9_.-]+$/.test(instance.name)&&!instance.name.startsWith('-')?instance.name:shellQuote(instance.name);\n return instance.name.startsWith('-')?`--instance=${selector}`:`-i ${selector}`;\n}\nasync function show(instance:Instance){\n const status=await instanceStatus(instance);\n if(json){print(status);return;}\n const config=status.phase==='running'?status.active?.config:(await loadInstanceConfig(instance).catch(()=>null))?.config;\n process.stdout.write(await formatStarmuxStatus(instance,status,config,{isDefault:await isDefaultInstance(instance)}));\n}\nasync function start(instance:Instance){\n const state=await instanceStatus(instance);\n if(state.phase==='running'){\n if(state.configState==='pending')await instanceRequest(instance,'apply',(await loadInstanceConfig(instance)).revision);\n await show(instance);return;\n }\n await ensureAccessReady(instance);\n const config=(await loadInstanceConfig(instance)).config;\n if(!await availablePort(config.port))fail(`Port ${config.port} is in use. Choose another with starmux up --port PORT.`);\n if(flags.foreground||string('app-parent-pid')){\n await runInstance(instance,{json,...(!json?{onReady:()=>show(instance)}:{}),...(string('app-parent-pid')?{appParentPid:Number(string('app-parent-pid'))}:{})});return;\n }\n const log=path.join(instancePaths(instance).logs,'supervisor.log');\n if(await exists(log))await readTrusted(log,true,32*1024*1024);\n const fd=await open(log,'a',0o600);\n const child=spawn(process.execPath,[fileURLToPath(new URL('./starmux-supervisor.js',import.meta.url)),instance.id],{detached:true,stdio:['ignore',fd.fd,fd.fd],env:process.env,windowsHide:true});\n let launchError:Error|undefined;child.once('error',e=>{launchError=e;});await fd.close();child.unref();\n for(let n=0;n<150;n++){\n if(launchError)throw launchError;\n const status=await instanceStatus(instance);\n if(status.phase==='running'&&status.health==='ok'){await show(instance);return;}\n if(child.exitCode!==null||child.signalCode!==null)fail('Startup failed. Inspect '+log);\n await pause(200);\n }\n child.kill('SIGTERM');fail('Startup timed out. Inspect '+log);\n}\nasync function bearer(){\n if(!flags['token-stdin'])return process.env.STARMUX_TOKEN;\n let value='';for await(const part of process.stdin){value+=String(part);if(value.length>16384)fail('Token input too large.');}return value.trim();\n}\nasync function verify(instance:Instance){\n const status=await instanceStatus(instance);if(status.phase!=='running'||!status.port)fail('Start this instance with starmux up first.');\n const token=await bearer();const client=new Client({name:'starmux-verify',version});\n const endpoint=`http://127.0.0.1:${status.port}/mcp`;\n const transport=new StreamableHTTPClientTransport(new URL(endpoint),{requestInit:{headers:token?{Authorization:'Bearer '+token}:{}}});\n let toolCount=0;\n try{\n await client.connect(transport as Transport);\n const listed=await client.listTools();toolCount=listed.tools.length;\n const result=await client.callTool({name:'list_directory',arguments:{path:'.',depth:0}});\n if(result.isError)fail('Directory read failed.');\n }\n catch(e){throw Error('Verification failed: '+String(e)+'. For authenticated instances provide STARMUX_TOKEN or --token-stdin.');}\n finally{await client.close();}\n if(json)print({result:'PASS',instanceId:instance.id,port:status.port,remoteClientVerified:false});\n else{\n const cfg=status.active?.config;\n const mode=cfg?.accessRole==='trusted'?'Coding mode':'Read-only mode';\n const root=cfg?.projectRoot??'.';\n process.stdout.write(\n `✓ MCP handshake ${endpoint}\\n`+\n `✓ Tool discovery ${toolCount} tools available (${mode})\\n`+\n `✓ Workspace read ${root}\\n`+\n `PASS · MCP handshake, tool discovery and workspace read.\\n`\n );\n }\n}\nfunction expires(value:string|undefined){\n if(!value)return null;\n const match=/^([1-9]\\d*)([mhdw])$/.exec(value);\n const date=match?new Date(Date.now()+Number(match[1])*({m:60000,h:3600000,d:86400000,w:604800000}[match[2]!]??0)):new Date(value);\n if(!Number.isFinite(date.getTime())||date.getTime()<=Date.now())fail('Expiry must be a future ISO timestamp or positive duration such as 30d.');\n return date.toISOString();\n}\nasync function auth(instance:Instance){\n const access=await createAccessControl(instancePaths(instance).access);const op=positional[0];\n if(!op){\n const state=await access.snapshot();\n if(json){print(state);return;}\n const flag=await instanceFlag(instance);\n const cmd=(action:string)=>`starmux ${action}${flag?' '+flag:''}`;\n const activeKeys=state.credentials.filter(c=>c.status==='active').length;\n const modeDesc=state.mode==='ingress'\n ?'None (no Starmux token · local or ingress proxy)'\n :state.mode==='api-key'\n ?`API key (Bearer token · ${activeKeys} active)`\n :'OAuth (browser sign-in)';\n const lines=[\n ...(flag?[`Instance ${instance.name}`]:[]),\n `Auth mode ${modeDesc}`,\n `API keys ${activeKeys} active (${state.credentials.length} total)`,\n `OAuth ${state.oauth?`${state.oauth.issuer} (${state.oauthConnections.filter(c=>!c.revokedAt).length} active sessions)`:'Not configured'}`\n ];\n if(state.credentials.length){\n lines.push('','API Keys');\n for(const c of state.credentials){\n const exp=c.expiresAt?` expires ${c.expiresAt.slice(0,10)}`:'';\n lines.push(` ${c.id.padEnd(26)} ${c.name.padEnd(20)} ${c.status}${exp}`);\n }\n }\n if(state.oauthConnections.length){\n lines.push('','OAuth Sessions');\n for(const c of state.oauthConnections){\n lines.push(` ${c.id.padEnd(26)} OAuth ${c.clientId.padEnd(14)} ${c.revokedAt?'revoked':'active'}`);\n }\n }\n lines.push(\n '',\n 'Commands',\n ` Create API key ${cmd('auth key \"My AI Client\"')}`,\n ` Switch mode ${cmd('auth mode <none|api-key|oauth>')}`,\n ...(activeKeys>0||state.oauthConnections.some(c=>!c.revokedAt)?[` Revoke access ${cmd('auth revoke <ID>')}`]:[])\n );\n process.stdout.write(lines.join('\\n')+'\\n');\n return;\n }\n if(op==='key'){\n const result=await access.create(positional[1]??'',expires(string('expires')),true);\n await changeRegistry(async r=>{r.instances.find(i=>i.id===instance.id)!.requiredAccess='api-key';});\n if(json){print({...result,mode:'api-key'});return;}\n const cfg=(await loadInstanceConfig(instance).catch(()=>null))?.config;\n const port=cfg?.port??18893;\n process.stdout.write(\n `API key enabled for ${result.name} (ID: ${result.id})\\n`+\n `Copy this key now; it is shown only once:\\n\\n`+\n ` ${result.key}\\n\\n`+\n `Option A — Fill in AI client form UI:\\n`+\n ` Transport Streamable HTTP\\n`+\n ` URL (Local) http://127.0.0.1:${port}/mcp\\n`+\n ` URL (Remote) https://<your-domain-or-tunnel>/mcp\\n`+\n ` Authentication Bearer API key\\n`+\n ` Header Authorization: Bearer ${result.key}\\n\\n`+\n `Option B — Or paste JSON config (mcpServers):\\n`+\n ` {\\n`+\n ` \"mcpServers\": {\\n`+\n ` \"starmux\": {\\n`+\n ` \"type\": \"streamable-http\",\\n`+\n ` \"url\": \"https://<your-domain-or-tunnel>/mcp\",\\n`+\n ` \"headers\": {\\n`+\n ` \"Authorization\": \"Bearer ${result.key}\"\\n`+\n ` }\\n`+\n ` }\\n`+\n ` }\\n`+\n ` }\\n`\n );\n return;\n }\n if(op==='mode'){\n const raw=positional[1];\n const mode=raw==='none'?'ingress':raw;\n if(mode!=='ingress'&&mode!=='api-key'&&mode!=='oauth')fail('Choose none (or ingress), api-key or oauth.');\n await access.setMode(mode);await changeRegistry(async r=>{r.instances.find(i=>i.id===instance.id)!.requiredAccess=mode;});\n const label=mode==='ingress'?'none (ingress)':mode;\n if(json)print(await access.snapshot());else process.stdout.write('Authentication: '+label+'\\n');return;\n }\n if(op==='revoke'){\n const id=positional[1]??'';const state=await access.snapshot();\n if(state.credentials.some(c=>c.id===id))await access.revoke(id);\n else if(state.oauthConnections.some(c=>c.id===id))await access.revokeOAuth(id);else fail('Credential or OAuth session not found: '+id);\n if(json)print({result:'REVOKED',id});else process.stdout.write('Revoked '+id+'\\n');return;\n }\n if(op==='oauth'){\n process.env.MAC_MCP_ACCESS_FILE=instancePaths(instance).access;\n const action=positional[1]??'status';const map:Record<string,string>={'init-keycloak':'keycloak-realm',setup:'configure',doctor:'doctor',status:'status'};\n if(!map[action])fail('Unknown OAuth command. See starmux auth --help.');\n const args=[map[action]!];for(const key of ['issuer','resource','resource-aliases','client-id','subject','subjects','registration','token-auth','callback','allow-loopback-http'])if(flags[key]!==undefined)args.push('--'+(key==='subject'?'subjects':key),...(typeof flags[key]==='string'?[flags[key] as string]:[]));\n if(json)args.push('--json');await (await import('./oauth.js')).oauthCommand(args);return;\n }\n fail('Unknown auth command. See starmux auth --help.');\n}\nasync function dashboard(instance:Instance){\n const access=await createAccessControl(instancePaths(instance).access);const token=await access.ownerToken();\n if(flags.token){if(json)print({token});else process.stdout.write(token+'\\n');return;}\n const status=await instanceStatus(instance);if(status.phase!=='running'||!status.port)fail('Start this instance with starmux up first.');\n const url=`http://127.0.0.1:${status.port}/access#token=${token}`;\n if(flags['no-open']){if(json)print({url});else process.stdout.write(url+'\\n');return;}\n const executable=process.platform==='darwin'?'open':process.platform==='win32'?'rundll32.exe':'xdg-open';\n const child=spawn(executable,process.platform==='win32'?['url.dll,FileProtocolHandler',url]:[url],{stdio:'ignore'});\n await new Promise<void>((resolve,reject)=>{child.once('error',()=>reject(Error('Browser unavailable. Use starmux dashboard --no-open.')));child.once('exit',code=>code===0?resolve():reject(Error('Browser failed. Use starmux dashboard --no-open.')));});\n if(json)print({result:'OPENED'});else process.stdout.write('Opened local Access console.\\n');\n}\nasync function logs(instance:Instance){\n const count=Number(string('lines')??60);if(!Number.isInteger(count)||count<1||count>200)fail('--lines must be 1..200.');\n const file=path.join(instancePaths(instance).logs,'core.log');let offset=0;\n const text=await exists(file)?await readTrusted(file,true,32*1024*1024):'';offset=Buffer.byteLength(text);\n const lines=text.split('\\n');if(text.endsWith('\\n'))lines.pop();\n const output=lines.slice(-count).join('\\n')+(text.endsWith('\\n')?'\\n':'');\n if(json)print({instanceId:instance.id,output});else process.stdout.write(output||'No logs yet.\\n');\n if(!flags.follow)return;\n let done=false;const stop=()=>{done=true;};process.once('SIGINT',stop);process.once('SIGTERM',stop);\n try{while(!done){await pause(300);if(!await exists(file))continue;const size=(await stat(file)).size;if(size<offset)offset=0;if(size===offset)continue;const f=await open(file,'r');try{const buffer=Buffer.alloc(Math.min(size-offset,65536));const {bytesRead}=await f.read(buffer,0,buffer.length,offset);offset+=bytesRead;const output=buffer.subarray(0,bytesRead).toString();if(json)print({instanceId:instance.id,output});else process.stdout.write(output);}finally{await f.close();}}}finally{process.off('SIGINT',stop);process.off('SIGTERM',stop);}\n}\nasync function configCommand(){\n const op=positional[0]??'show';const selector=string('instance');\n if(op==='schema'){print(configJSONSchema());return;}\n if(op==='import'){\n const file=positional[1];if(!file)fail('config import requires a file.');const config=await validateConfig(parseConfig(await readTrusted(absolute(file),false)));await consent(undefined,config);\n const instance=await createInstance(selector??string('name')??path.basename(file,path.extname(file)),{file:absolute(file),link:flags.link===true});await rememberConsent(instance,config);print({instance});return;\n }\n if(['copy','rename','default','archive','restore'].includes(op)){\n const target=op==='default'?positional[1]:selector??(await selected()).id;\n const args=[op,target??''];if(op==='copy'||op==='rename')args.push(positional[1]??'');if(json)args.push('--json');await handle('instance',args);return;\n }\n const instance=await selected();\n if(op==='save'){\n let text=string('file')?await readTrusted(absolute(string('file')!),false):'';\n if(!string('file'))for await(const part of process.stdin){text+=String(part);if(text.length>262144)fail('Config input too large.');}\n const config=await validateConfig(parseConfig(text));await consent(instance,config);\n const saved=await saveInstanceConfig(instance,text,string('revision')??'');await rememberConsent(instance,config);print({result:'SAVED',revision:saved.revision});return;\n }\n if(op==='patch'&&!string('patch')){\n let text='';for await(const part of process.stdin){text+=String(part);if(text.length>262144)fail('Config input too large.');}flags.patch=text;\n }\n if(op==='apply'||op==='patch'){\n let config=(await loadInstanceConfig(instance)).config;\n if(op==='patch'&&string('patch'))config=await validateConfig(instanceConfigSchema.parse({...config,...JSON.parse(string('patch')!)}));\n await consent(instance,config);await rememberConsent(instance,config);\n }\n const args=[...positional,'--instance',instance.id];\n for(const [key,value] of Object.entries(flags))if(!['instance','help','yes'].includes(key)&&value!==undefined)args.push('--'+key,...(typeof value==='string'?[value]:[]));\n // The shared operation layer retains its internal approval contract.\n if(op==='patch')args.push('--approve-trusted-developer','--approve-unrestricted');\n await handle('config',args);\n}\nfunction validateSubcommand(){\n if(command!=='config'&&command!=='auth')return;\n const op=positional[0]??(command==='config'?'show':'');\n let name=command+(op?' '+op:'');let count=positional.length-(positional.length?1:0);\n let minimum=0;let maximum=0;let supported:string[]|undefined;\n if(command==='config'){\n const commands:Record<string,string[]>={show:['effective'],path:[],edit:[],validate:[],diff:[],apply:['revision','yes'],schema:[],recover:[],\n import:['name','link','yes'],copy:[],rename:[],default:[],archive:[],restore:[],export:['output'],relink:['file'],manage:[],\n save:['file','revision','yes'],patch:['patch','revision','yes'],secret:[]};\n supported=commands[op];\n if(['import','copy','rename','default'].includes(op))minimum=maximum=1;\n if(op==='relink'){minimum=string('file')?0:1;maximum=minimum;}\n if(op==='secret'){minimum=maximum=2;if(!['set','remove'].includes(positional[1]??''))fail('Usage: starmux config secret set|remove NAME');}\n }else if(op==='oauth'){\n const action=positional[1]??'status';name+=' '+action;count=Math.max(0,positional.length-2);\n const actions:Record<string,string[]>={status:[],doctor:[],\n 'init-keycloak':['resource','callback','allow-loopback-http'],\n setup:['issuer','resource','resource-aliases','client-id','subject','subjects','registration','token-auth','allow-loopback-http']};\n supported=actions[action];\n if(flags.subject!==undefined&&flags.subjects!==undefined)fail('Use either --subject or --subjects.');\n }else{\n const commands:Record<string,string[]>={'':[],key:['expires'],mode:[],revoke:[]};supported=commands[op];\n if(['key','mode','revoke'].includes(op))minimum=maximum=1;\n }\n if(!supported)fail('Unknown command: '+name+'. See starmux '+command+' --help.');\n if(count<minimum||count>maximum||positional.slice(1).some(value=>!value.trim()))fail('Invalid arguments for starmux '+name+'. See starmux '+command+' --help.');\n for(const key of Object.keys(flags))if(!['instance','json','help','version'].includes(key)&&!supported.includes(key))fail('Option --'+key+' is not supported by '+name+'.');\n}\nasync function main(){\n if(flags.version){process.stdout.write(version+'\\n');return;}\n if(command==='help'||flags.help){help();return;}\n const allowed:Record<string,string[]>={\n up:['port','read','write','code','yes','foreground','app-parent-pid'],init:['port','read','write','code','yes'],\n status:['all'],ls:['archived'],rm:[],down:[],stop:[],logs:['lines','follow'],doctor:[],verify:['token-stdin'],dashboard:['token','no-open'],migrate:['yes'],\n auth:['expires','issuer','resource','resource-aliases','client-id','subject','subjects','registration','token-auth','callback','allow-loopback-http'],\n config:['yes','archived','effective','link','name','revision','patch','file','output'],permissions:['target','mode'],privacy:['all','target']\n };\n for(const key of Object.keys(flags))if(!['instance','json','help','version'].includes(key)&&!allowed[command]?.includes(key))fail('Option --'+key+' is not supported by '+command+'.');\n if(string('instance')!==undefined&&!string('instance')!.trim())fail('--instance requires a non-empty name or ID.');\n validateSubcommand();\n if(['status','ls','down','stop','logs','doctor','verify','dashboard'].includes(command)&&positional.length)fail('Unexpected argument: '+positional[0]);\n if(command==='rm'&&positional.length>1)fail('Usage: starmux rm [NAME]');\n if(command==='auth'&&['key','mode','revoke'].includes(positional[0]??'')&&positional.length!==2)fail('Usage: starmux auth '+positional[0]+' VALUE');\n if(command==='migrate'&&positional.length>1)fail('Usage: starmux migrate [registry|setup|live] [-y]');\n // Public commands never inherit old environment overlays. Core's private protocol is retained.\n for(const key of Object.keys(process.env))if(key.startsWith('MAC_MCP_'))delete process.env[key];\n for(const [key,value] of Object.entries(process.env))if(key.startsWith('STARMUX_')&&key!=='STARMUX_TOKEN')process.env['MAC_MCP_'+key.slice(8)]=value;\n if(command==='up'||command==='init'){\n const instance=await configure();\n if(command==='up')await start(instance);\n else if(json)print({result:'SAVED',instance});\n else{\n const flag=await instanceFlag(instance);\n process.stdout.write(`Saved ${instance.name}. Start with starmux up${flag?' '+flag:''}\\n`);\n }\n return;\n }\n if(command==='migrate'){await (await import('../starmux-migration.js')).migrate(positional[0],yes(),json);return;}\n if(command==='ls'||command==='status'&&flags.all){await handle('instance',['list',...(flags.archived?['--archived']:[]),...(json?['--json']:[])]);return;}\n if(command==='rm'){\n const target=positional[0]??string('instance')??(await selected()).id;\n await handle('instance',['archive',target,...(json?['--json']:[])]);return;\n }\n if(command==='config'){await configCommand();return;}\n if(!['status','down','stop','auth','dashboard','verify','doctor','logs','permissions','privacy'].includes(command))fail('Unknown command: '+command+'. Run starmux --help.');\n if(!(await readRegistry()).instances.length){if(command==='status'||command==='down'||command==='stop'){if(json)print({phase:'stopped',initialized:false});else process.stdout.write('Not initialized. Run starmux up in your project.\\n');return;}}\n const instance=await selected();\n if(command==='status')await show(instance);\n else if(command==='down'||command==='stop'){await instanceRequest(instance,'stop');if(json)print({result:'STOPPED',instanceId:instance.id});else process.stdout.write('Stopped '+instance.name+'\\n');}\n else if(command==='auth')await auth(instance);\n else if(command==='dashboard')await dashboard(instance);\n else if(command==='verify')await verify(instance);\n else if(command==='logs')await logs(instance);\n else if(command==='doctor'){\n if(Number(process.versions.node.split('.')[0])<22||(process.versions.node.startsWith('22.')&&Number(process.versions.node.split('.')[1])<12))fail('Node 22.12 or newer is required.');\n await stat(desktopCommanderEntry);const loaded=await loadInstanceConfig(instance);await ensureAccessReady(instance);const state=await instanceStatus(instance);\n if(state.phase!=='running'&&!await availablePort(loaded.config.port))fail('Configured port is in use: '+loaded.config.port);\n if(json)print({result:'PASS',node:process.version,instanceId:instance.id,configState:state.configState});\n else{\n const isDef=await isDefaultInstance(instance);\n const access=await (await createAccessControl(instancePaths(instance).access,{initialize:false})).snapshot();\n const modeLabel=loaded.config.accessRole==='trusted'?'Coding mode':'Read-only mode';\n const authLabel=access.mode==='ingress'?'None (no token required)':access.mode==='api-key'?`API key (${access.credentials.filter(c=>c.status==='active').length} active)`:'OAuth';\n const portState=state.phase==='running'?`Running on 127.0.0.1:${state.port}`:`Stopped · port ${loaded.config.port} available`;\n process.stdout.write(\n `✓ Runtime Node ${process.version} & Desktop Commander engine ready\\n`+\n `✓ Service ${portState}${isDef?'':` (instance: ${instance.name})`}\\n`+\n `✓ Workspace ${loaded.config.projectRoot} (${modeLabel})\\n`+\n `✓ Configuration ${instance.source.path} (${state.configState})\\n`+\n `✓ Authentication ${authLabel}\\n`+\n `PASS · Node, dependencies, workspace, configuration, port and authentication.\\n`\n );\n }\n }else{\n const args=[...positional,'--instance',instance.id];for(const [key,value] of Object.entries(flags))if(key!=='instance'&&value!==undefined)args.push('--'+key,...(typeof value==='string'?[value]:[]));await handle(command,args);\n }\n}\ntry{await main();}catch(error){const message=error instanceof Error?error.message:String(error);if(json)print({schemaVersion:1,error:message});else process.stderr.write(message+'\\n');process.exitCode=1;}\n"]}
1
+ {"version":3,"file":"starmux.js","sourceRoot":"","sources":["../../../src/cli/starmux.ts"],"names":[],"mappings":"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","sourcesContent":["import {parseArgs} from 'node:util';\nimport {spawn} from 'node:child_process';\nimport {createInterface} from 'node:readline/promises';\nimport {open,realpath,readFile,stat} from 'node:fs/promises';\nimport {homedir} from 'node:os';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport type {Transport} from '@modelcontextprotocol/sdk/shared/transport.js';\nimport {Client} from '@modelcontextprotocol/sdk/client/index.js';\nimport {StreamableHTTPClientTransport} from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport {createAccessControl} from '../access-control.js';\nimport {instanceStatus,instanceRequest,runInstance} from '../instance-runtime.js';\nimport {atomicPrivate,availablePort,changeRegistry,configJSONSchema,createInstance,ensureAccessReady,exists,instanceConfigSchema,instancePaths,loadInstanceConfig,parseConfig,patchInstanceConfig,readRegistry,readTrusted,resolveInstance,saveInstanceConfig,suggestPort,validateConfig,type Instance,type InstanceConfig} from '../instance-store.js';\nimport {handle} from './instances.js';\nimport {desktopCommanderEntry} from '../runtime-paths.js';\nimport {shellQuote} from '../platform.js';\nimport {formatStarmuxStatus} from './starmux-status.js';\n\nconst version='0.13.1';\nconst strings=['instance','port','lines','expires','issuer','resource','resource-aliases','client-id','subject','subjects','registration','token-auth','callback','revision','patch','file','output','name','target','mode','app-parent-pid'];\nconst booleans=['help','version','json','write','code','read','yes','foreground','follow','archived','all','effective','link','allow-loopback-http','token-stdin','no-open','token'];\nconst options:Record<string,{type:'string'|'boolean';short?:string}>={};\nfor(const k of strings)options[k]={type:'string',...(k==='instance'?{short:'i'}:{})};\nfor(const k of booleans)options[k]={type:'boolean',...(k==='yes'?{short:'y'}:k==='follow'?{short:'f'}:k==='help'?{short:'h'}:k==='version'?{short:'v'}:{})};\nlet parsed:ReturnType<typeof parseArgs>;\ntry{parsed=parseArgs({args:process.argv.slice(2),options,allowPositionals:true,strict:true});}catch(error){process.stderr.write((error instanceof Error?error.message:String(error))+'\\n');process.exit(1);}\nconst flags=parsed.values;const positional=parsed.positionals;const command=positional.shift()??'help';\nconst string=(key:string)=>typeof flags[key]==='string'?flags[key] as string:undefined;\nconst yes=()=>flags.yes===true;const json=flags.json===true;\nconst print=(value:unknown)=>process.stdout.write(JSON.stringify(value,null,2)+'\\n');\nfunction fail(message:string):never{throw Error(message);}\nconst absolute=(value:string)=>path.resolve(value==='~'?homedir():value.startsWith('~/')?path.join(homedir(),value.slice(2)):value);\nconst pause=(ms:number)=>new Promise(resolve=>setTimeout(resolve,ms));\n\nfunction help(){\n const requested=command==='help'?positional[0]:command;\n const topic=requested==='stop'?'down':requested;\n const sections:Record<string,string>={\n up:'up [path] [--read | --write | --code] [-y] [--port N] [--foreground]\\n Initialize and start. First use defaults to CWD; later starts reuse saved settings.',\n init:'init [path] [--read | --write | --code] [-y] [--port N]\\n Save settings without starting. --write and --code enable full account coding permissions.',\n auth:'auth\\n auth key \"Client name\" [--expires 30d]\\n auth mode none|ingress|api-key|oauth\\n auth revoke ID\\n auth oauth init-keycloak --resource URL --callback URL\\n auth oauth setup --issuer URL --resource URL --client-id ID --subject USER_ID\\n auth oauth doctor',\n config:'config [show] [--effective]\\n config edit | diff | apply | validate | path | schema | recover\\n config default NAME | rename NEW_NAME -i SOURCE | copy NEW_NAME -i SOURCE\\n config archive -i NAME | restore -i NAME | import FILE [-i NAME] [--link]\\n config export [--output FILE] | secret set|remove NAME',\n dashboard:'dashboard [--no-open | --token]\\n Open the local Access console. --no-open prints a private login link.',\n verify:'verify [--token-stdin]\\n Test MCP initialization, tool discovery and workspace read. Authenticated instances use STARMUX_TOKEN or stdin.',\n doctor:'doctor\\n Check Node, bundled dependencies, workspace, configuration, port and authentication.',\n logs:'logs [-f | --follow] [--lines 1..200]\\n Follow continues across restarts. Ctrl+C exits the follower only.',\n migrate:'migrate [registry|setup|live] [-y]\\n No source: preview. Select a source to migrate, retaining originals.',\n status:'status [--all]\\n Show the selected instance, its actual endpoint and connection guide.',\n ls:'ls [--archived]\\n List local workspace instances.',\n rm:'rm [NAME] (alias for: config archive)\\n Stop and archive an instance.',\n down:'down (alias: stop)\\n Stop the selected instance.',\n permissions:'permissions [status | token]\\n permissions disable-tool|enable-tool|deny-directory|allow-directory TARGET\\n Manage the selected instance’s tool and directory permissions.',\n privacy:'privacy [--all] [--target PATH]\\n Check privacy access through the running instance.'\n };\n if(topic&&topic!=='help'&&!sections[topic])fail('Unknown command: '+topic+'. Run starmux --help.');\n const overview=[\n 'Connect AI clients to your computer’s files, shell and development tools.',\n '',\n 'Workspace Lifecycle:',\n ' starmux up [path] [--code] Start in the background (default: Read-only)',\n ' starmux down Stop the running instance (alias: stop)',\n ' starmux status Show health, endpoint and connection guide',\n ' starmux logs [-f] View or stream gateway logs',\n '',\n 'Access & Verification:',\n ' starmux auth Manage auth mode, API keys and OAuth',\n ' starmux dashboard Open the local Web Access Console',\n ' starmux verify Test local MCP handshake and workspace read',\n ' starmux doctor Check runtime, config, port and auth state',\n '',\n 'Multi-Instance & Config:',\n ' starmux ls List workspace instances',\n ' starmux rm [name] Stop and archive an instance',\n ' starmux init [path] Save instance settings without starting',\n ' starmux config Inspect, edit or apply configuration',\n ' starmux migrate Import settings from a legacy installation'\n ].join('\\n');\n process.stdout.write(`Starmux ${version}\\n\\n${sections[topic??'']??overview}\\n\\nGlobal: -i, --instance NAME_OR_ID --json -h, --help\\nUse starmux COMMAND --help for details.\\n`);\n}\nasync function confirm(message:string){\n if(yes())return;\n if(!process.stdin.isTTY)fail(message+' Re-run with -y to confirm.');\n const rl=createInterface({input:process.stdin,output:process.stderr});\n try{if(!/^y(es)?$/i.test((await rl.question(message+' [y/N] ')).trim()))fail('Cancelled.');}finally{rl.close();}\n}\nasync function consent(instance:Instance|undefined,config:InstanceConfig){\n if(config.accessRole!=='trusted'||config.writeScope!=='unrestricted')return;\n if(instance&&await exists(path.join(instancePaths(instance).state,'coding-consent.json'))){\n const record=JSON.parse(await readTrusted(path.join(instancePaths(instance).state,'coding-consent.json'))) as {version?:number;scope?:string};\n if(record.version===1&&record.scope==='os-account')return;\n }\n await confirm('Coding mode can modify files accessible to your OS account and execute Shell and Git. Enable?');\n}\nasync function rememberConsent(instance:Instance,config:InstanceConfig){\n if(config.accessRole==='trusted'&&config.writeScope==='unrestricted'&&!await exists(path.join(instancePaths(instance).state,'coding-consent.json')))await atomicPrivate(path.join(instancePaths(instance).state,'coding-consent.json'),JSON.stringify({version:1,scope:'os-account',approvedAt:new Date().toISOString()}));\n}\nasync function selected(){return resolveInstance(string('instance'));}\nasync function configure(){\n if(positional.length>1)fail('Usage: starmux '+command+' [path]');\n const registry=await readRegistry();let instance:Instance|undefined;\n const selector=string('instance');\n if(selector)instance=registry.instances.find(i=>i.id===selector||i.name===selector);\n else if(registry.instances.length)instance=await resolveInstance();\n if(instance?.archived)fail('Instance is archived. Use starmux config restore -i '+instance.name);\n if(!instance&&await exists(path.join(homedir(),'.config','mac-mcp-gateway'))&&!registry.instances.length)fail('Existing installation found. Run starmux migrate first.');\n const loaded=instance?await loadInstanceConfig(instance):undefined;\n const writing=flags.write||flags.code;\n if(flags.read&&writing)fail('--read cannot be combined with --write or --code.');\n const project=positional[0]??loaded?.config.projectRoot??process.cwd();\n const config=await validateConfig(instanceConfigSchema.parse({...loaded?.config,\n projectRoot:await realpath(absolute(project)),schemaVersion:1,\n port:string('port')?Number(string('port')):loaded?.config.port??(selector?await suggestPort():18893),\n ...(writing?{accessRole:'trusted',mode:'read-write',writeScope:'unrestricted'}:{}),\n ...(flags.read?{accessRole:'restricted',mode:'read-only',writeScope:'unrestricted',gitMode:'off',worktreeMode:'off',upstreams:[]}:{}),\n }));\n await consent(instance,config);\n if(!instance)instance=await createInstance(selector??'default',{config});\n else if(JSON.stringify(config)!==JSON.stringify(loaded!.config))await patchInstanceConfig(instance,config,loaded!.revision);\n await rememberConsent(instance,config);return instance;\n}\nasync function isDefaultInstance(instance:Instance){\n const registry=await readRegistry().catch(()=>({defaultInstanceId:null,instances:[] as Instance[]}));\n return instance.name==='default'&&(registry.defaultInstanceId===instance.id||registry.instances.filter(i=>!i.archived).length<=1);\n}\nasync function instanceFlag(instance:Instance){\n if(await isDefaultInstance(instance))return '';\n const selector=/^[A-Za-z0-9_.-]+$/.test(instance.name)&&!instance.name.startsWith('-')?instance.name:shellQuote(instance.name);\n return instance.name.startsWith('-')?`--instance=${selector}`:`-i ${selector}`;\n}\nasync function show(instance:Instance){\n const status=await instanceStatus(instance);\n if(json){print(status);return;}\n const config=status.phase==='running'?status.active?.config:(await loadInstanceConfig(instance).catch(()=>null))?.config;\n process.stdout.write(await formatStarmuxStatus(instance,status,config,{isDefault:await isDefaultInstance(instance)}));\n}\nasync function start(instance:Instance){\n const state=await instanceStatus(instance);\n if(state.phase==='running'){\n if(state.configState==='pending')await instanceRequest(instance,'apply',(await loadInstanceConfig(instance)).revision);\n await show(instance);return;\n }\n await ensureAccessReady(instance);\n const config=(await loadInstanceConfig(instance)).config;\n if(!await availablePort(config.port))fail(`Port ${config.port} is in use. Choose another with starmux up --port PORT.`);\n if(flags.foreground||string('app-parent-pid')){\n await runInstance(instance,{json,...(!json?{onReady:()=>show(instance)}:{}),...(string('app-parent-pid')?{appParentPid:Number(string('app-parent-pid'))}:{})});return;\n }\n const log=path.join(instancePaths(instance).logs,'supervisor.log');\n if(await exists(log))await readTrusted(log,true,32*1024*1024);\n const fd=await open(log,'a',0o600);\n const child=spawn(process.execPath,[fileURLToPath(new URL('./starmux-supervisor.js',import.meta.url)),instance.id],{detached:true,stdio:['ignore',fd.fd,fd.fd],env:process.env,windowsHide:true});\n let launchError:Error|undefined;child.once('error',e=>{launchError=e;});await fd.close();child.unref();\n for(let n=0;n<150;n++){\n if(launchError)throw launchError;\n const status=await instanceStatus(instance);\n if(status.phase==='running'&&status.health==='ok'){await show(instance);return;}\n if(child.exitCode!==null||child.signalCode!==null)fail('Startup failed. Inspect '+log);\n await pause(200);\n }\n child.kill('SIGTERM');fail('Startup timed out. Inspect '+log);\n}\nasync function bearer(){\n if(!flags['token-stdin'])return process.env.STARMUX_TOKEN;\n let value='';for await(const part of process.stdin){value+=String(part);if(value.length>16384)fail('Token input too large.');}return value.trim();\n}\nasync function verify(instance:Instance){\n const status=await instanceStatus(instance);if(status.phase!=='running'||!status.port)fail('Start this instance with starmux up first.');\n const token=await bearer();const client=new Client({name:'starmux-verify',version});\n const endpoint=`http://127.0.0.1:${status.port}/mcp`;\n const transport=new StreamableHTTPClientTransport(new URL(endpoint),{requestInit:{headers:token?{Authorization:'Bearer '+token}:{}}});\n let toolCount=0;\n try{\n await client.connect(transport as Transport);\n const listed=await client.listTools();toolCount=listed.tools.length;\n const result=await client.callTool({name:'list_directory',arguments:{path:'.',depth:0}});\n if(result.isError)fail('Directory read failed.');\n }\n catch(e){throw Error('Verification failed: '+String(e)+'. For authenticated instances provide STARMUX_TOKEN or --token-stdin.');}\n finally{await client.close();}\n if(json)print({result:'PASS',instanceId:instance.id,port:status.port,remoteClientVerified:false});\n else{\n const cfg=status.active?.config;\n const mode=cfg?.accessRole==='trusted'?'Coding mode':'Read-only mode';\n const root=cfg?.projectRoot??'.';\n process.stdout.write(\n `✓ MCP handshake ${endpoint}\\n`+\n `✓ Tool discovery ${toolCount} tools available (${mode})\\n`+\n `✓ Workspace read ${root}\\n`+\n `PASS · MCP handshake, tool discovery and workspace read.\\n`\n );\n }\n}\nfunction expires(value:string|undefined){\n if(!value)return null;\n const match=/^([1-9]\\d*)([mhdw])$/.exec(value);\n const date=match?new Date(Date.now()+Number(match[1])*({m:60000,h:3600000,d:86400000,w:604800000}[match[2]!]??0)):new Date(value);\n if(!Number.isFinite(date.getTime())||date.getTime()<=Date.now())fail('Expiry must be a future ISO timestamp or positive duration such as 30d.');\n return date.toISOString();\n}\nasync function auth(instance:Instance){\n const access=await createAccessControl(instancePaths(instance).access);const op=positional[0];\n if(!op){\n const state=await access.snapshot();\n if(json){print(state);return;}\n const flag=await instanceFlag(instance);\n const cmd=(action:string)=>`starmux ${action}${flag?' '+flag:''}`;\n const activeKeys=state.credentials.filter(c=>c.status==='active').length;\n const modeDesc=state.mode==='ingress'\n ?'None (no Starmux token · local or ingress proxy)'\n :state.mode==='api-key'\n ?`API key (Bearer token · ${activeKeys} active)`\n :'OAuth (browser sign-in)';\n const lines=[\n ...(flag?[`Instance ${instance.name}`]:[]),\n `Auth mode ${modeDesc}`,\n `API keys ${activeKeys} active (${state.credentials.length} total)`,\n `OAuth ${state.oauth?`${state.oauth.issuer} (${state.oauthConnections.filter(c=>!c.revokedAt).length} active sessions)`:'Not configured'}`\n ];\n if(state.credentials.length){\n lines.push('','API Keys');\n for(const c of state.credentials){\n const exp=c.expiresAt?` expires ${c.expiresAt.slice(0,10)}`:'';\n lines.push(` ${c.id.padEnd(26)} ${c.name.padEnd(20)} ${c.status}${exp}`);\n }\n }\n if(state.oauthConnections.length){\n lines.push('','OAuth Sessions');\n for(const c of state.oauthConnections){\n lines.push(` ${c.id.padEnd(26)} OAuth ${c.clientId.padEnd(14)} ${c.revokedAt?'revoked':'active'}`);\n }\n }\n lines.push(\n '',\n 'Commands',\n ` Create API key ${cmd('auth key \"My AI Client\"')}`,\n ` Switch mode ${cmd('auth mode <none|api-key|oauth>')}`,\n ...(activeKeys>0||state.oauthConnections.some(c=>!c.revokedAt)?[` Revoke access ${cmd('auth revoke <ID>')}`]:[])\n );\n process.stdout.write(lines.join('\\n')+'\\n');\n return;\n }\n if(op==='key'){\n const result=await access.create(positional[1]??'',expires(string('expires')),true);\n await changeRegistry(async r=>{r.instances.find(i=>i.id===instance.id)!.requiredAccess='api-key';});\n if(json){print({...result,mode:'api-key'});return;}\n const cfg=(await loadInstanceConfig(instance).catch(()=>null))?.config;\n const port=cfg?.port??18893;\n process.stdout.write(\n `API key enabled for ${result.name} (ID: ${result.id})\\n`+\n `Copy this key now; it is shown only once:\\n\\n`+\n ` ${result.key}\\n\\n`+\n `Option A — Fill in AI client form UI:\\n`+\n ` Transport Streamable HTTP\\n`+\n ` URL (Local) http://127.0.0.1:${port}/mcp\\n`+\n ` URL (Remote) https://<your-domain-or-tunnel>/mcp\\n`+\n ` Authentication Bearer API key\\n`+\n ` Header Authorization: Bearer ${result.key}\\n\\n`+\n `Option B — Or paste JSON config (mcpServers):\\n`+\n ` {\\n`+\n ` \"mcpServers\": {\\n`+\n ` \"starmux\": {\\n`+\n ` \"type\": \"streamable-http\",\\n`+\n ` \"url\": \"https://<your-domain-or-tunnel>/mcp\",\\n`+\n ` \"headers\": {\\n`+\n ` \"Authorization\": \"Bearer ${result.key}\"\\n`+\n ` }\\n`+\n ` }\\n`+\n ` }\\n`+\n ` }\\n`\n );\n return;\n }\n if(op==='mode'){\n const raw=positional[1];\n const mode=raw==='none'?'ingress':raw;\n if(mode!=='ingress'&&mode!=='api-key'&&mode!=='oauth')fail('Choose none (or ingress), api-key or oauth.');\n await access.setMode(mode);await changeRegistry(async r=>{r.instances.find(i=>i.id===instance.id)!.requiredAccess=mode;});\n const label=mode==='ingress'?'none (ingress)':mode;\n if(json)print(await access.snapshot());else process.stdout.write('Authentication: '+label+'\\n');return;\n }\n if(op==='revoke'){\n const id=positional[1]??'';const state=await access.snapshot();\n if(state.credentials.some(c=>c.id===id))await access.revoke(id);\n else if(state.oauthConnections.some(c=>c.id===id))await access.revokeOAuth(id);else fail('Credential or OAuth session not found: '+id);\n if(json)print({result:'REVOKED',id});else process.stdout.write('Revoked '+id+'\\n');return;\n }\n if(op==='oauth'){\n process.env.MAC_MCP_ACCESS_FILE=instancePaths(instance).access;\n const action=positional[1]??'status';const map:Record<string,string>={'init-keycloak':'keycloak-realm',setup:'configure',doctor:'doctor',status:'status'};\n if(!map[action])fail('Unknown OAuth command. See starmux auth --help.');\n const args=[map[action]!];for(const key of ['issuer','resource','resource-aliases','client-id','subject','subjects','registration','token-auth','callback','allow-loopback-http'])if(flags[key]!==undefined)args.push('--'+(key==='subject'?'subjects':key),...(typeof flags[key]==='string'?[flags[key] as string]:[]));\n if(json)args.push('--json');await (await import('./oauth.js')).oauthCommand(args);return;\n }\n fail('Unknown auth command. See starmux auth --help.');\n}\nasync function dashboard(instance:Instance){\n const access=await createAccessControl(instancePaths(instance).access);const token=await access.ownerToken();\n if(flags.token){if(json)print({token});else process.stdout.write(token+'\\n');return;}\n const status=await instanceStatus(instance);if(status.phase!=='running'||!status.port)fail('Start this instance with starmux up first.');\n const url=`http://127.0.0.1:${status.port}/access#token=${token}`;\n if(flags['no-open']){if(json)print({url});else process.stdout.write(url+'\\n');return;}\n const executable=process.platform==='darwin'?'open':process.platform==='win32'?'rundll32.exe':'xdg-open';\n const child=spawn(executable,process.platform==='win32'?['url.dll,FileProtocolHandler',url]:[url],{stdio:'ignore'});\n await new Promise<void>((resolve,reject)=>{child.once('error',()=>reject(Error('Browser unavailable. Use starmux dashboard --no-open.')));child.once('exit',code=>code===0?resolve():reject(Error('Browser failed. Use starmux dashboard --no-open.')));});\n if(json)print({result:'OPENED'});else process.stdout.write('Opened local Access console.\\n');\n}\nasync function logs(instance:Instance){\n const count=Number(string('lines')??60);if(!Number.isInteger(count)||count<1||count>200)fail('--lines must be 1..200.');\n const file=path.join(instancePaths(instance).logs,'core.log');let offset=0;\n const text=await exists(file)?await readTrusted(file,true,32*1024*1024):'';offset=Buffer.byteLength(text);\n const lines=text.split('\\n');if(text.endsWith('\\n'))lines.pop();\n const output=lines.slice(-count).join('\\n')+(text.endsWith('\\n')?'\\n':'');\n if(json)print({instanceId:instance.id,output});else process.stdout.write(output||'No logs yet.\\n');\n if(!flags.follow)return;\n let done=false;const stop=()=>{done=true;};process.once('SIGINT',stop);process.once('SIGTERM',stop);\n try{while(!done){await pause(300);if(!await exists(file))continue;const size=(await stat(file)).size;if(size<offset)offset=0;if(size===offset)continue;const f=await open(file,'r');try{const buffer=Buffer.alloc(Math.min(size-offset,65536));const {bytesRead}=await f.read(buffer,0,buffer.length,offset);offset+=bytesRead;const output=buffer.subarray(0,bytesRead).toString();if(json)print({instanceId:instance.id,output});else process.stdout.write(output);}finally{await f.close();}}}finally{process.off('SIGINT',stop);process.off('SIGTERM',stop);}\n}\nasync function configCommand(){\n const op=positional[0]??'show';const selector=string('instance');\n if(op==='schema'){print(configJSONSchema());return;}\n if(op==='import'){\n const file=positional[1];if(!file)fail('config import requires a file.');const config=await validateConfig(parseConfig(await readTrusted(absolute(file),false)));await consent(undefined,config);\n const instance=await createInstance(selector??string('name')??path.basename(file,path.extname(file)),{file:absolute(file),link:flags.link===true});await rememberConsent(instance,config);print({instance});return;\n }\n if(['copy','rename','default','archive','restore'].includes(op)){\n const target=op==='default'?positional[1]:selector??(await selected()).id;\n const args=[op,target??''];if(op==='copy'||op==='rename')args.push(positional[1]??'');if(json)args.push('--json');await handle('instance',args);return;\n }\n const instance=await selected();\n if(op==='save'){\n let text=string('file')?await readTrusted(absolute(string('file')!),false):'';\n if(!string('file'))for await(const part of process.stdin){text+=String(part);if(text.length>262144)fail('Config input too large.');}\n const config=await validateConfig(parseConfig(text));await consent(instance,config);\n const saved=await saveInstanceConfig(instance,text,string('revision')??'');await rememberConsent(instance,config);print({result:'SAVED',revision:saved.revision});return;\n }\n if(op==='patch'&&!string('patch')){\n let text='';for await(const part of process.stdin){text+=String(part);if(text.length>262144)fail('Config input too large.');}flags.patch=text;\n }\n if(op==='apply'||op==='patch'){\n let config=(await loadInstanceConfig(instance)).config;\n if(op==='patch'&&string('patch'))config=await validateConfig(instanceConfigSchema.parse({...config,...JSON.parse(string('patch')!)}));\n await consent(instance,config);await rememberConsent(instance,config);\n }\n const args=[...positional,'--instance',instance.id];\n for(const [key,value] of Object.entries(flags))if(!['instance','help','yes'].includes(key)&&value!==undefined)args.push('--'+key,...(typeof value==='string'?[value]:[]));\n // The shared operation layer retains its internal approval contract.\n if(op==='patch')args.push('--approve-trusted-developer','--approve-unrestricted');\n await handle('config',args);\n}\nfunction validateSubcommand(){\n if(command!=='config'&&command!=='auth')return;\n const op=positional[0]??(command==='config'?'show':'');\n let name=command+(op?' '+op:'');let count=positional.length-(positional.length?1:0);\n let minimum=0;let maximum=0;let supported:string[]|undefined;\n if(command==='config'){\n const commands:Record<string,string[]>={show:['effective'],path:[],edit:[],validate:[],diff:[],apply:['revision','yes'],schema:[],recover:[],\n import:['name','link','yes'],copy:[],rename:[],default:[],archive:[],restore:[],export:['output'],relink:['file'],manage:[],\n save:['file','revision','yes'],patch:['patch','revision','yes'],secret:[]};\n supported=commands[op];\n if(['import','copy','rename','default'].includes(op))minimum=maximum=1;\n if(op==='relink'){minimum=string('file')?0:1;maximum=minimum;}\n if(op==='secret'){minimum=maximum=2;if(!['set','remove'].includes(positional[1]??''))fail('Usage: starmux config secret set|remove NAME');}\n }else if(op==='oauth'){\n const action=positional[1]??'status';name+=' '+action;count=Math.max(0,positional.length-2);\n const actions:Record<string,string[]>={status:[],doctor:[],\n 'init-keycloak':['resource','callback','allow-loopback-http'],\n setup:['issuer','resource','resource-aliases','client-id','subject','subjects','registration','token-auth','allow-loopback-http']};\n supported=actions[action];\n if(flags.subject!==undefined&&flags.subjects!==undefined)fail('Use either --subject or --subjects.');\n }else{\n const commands:Record<string,string[]>={'':[],key:['expires'],mode:[],revoke:[]};supported=commands[op];\n if(['key','mode','revoke'].includes(op))minimum=maximum=1;\n }\n if(!supported)fail('Unknown command: '+name+'. See starmux '+command+' --help.');\n if(count<minimum||count>maximum||positional.slice(1).some(value=>!value.trim()))fail('Invalid arguments for starmux '+name+'. See starmux '+command+' --help.');\n for(const key of Object.keys(flags))if(!['instance','json','help','version'].includes(key)&&!supported.includes(key))fail('Option --'+key+' is not supported by '+name+'.');\n}\nasync function main(){\n if(flags.version){process.stdout.write(version+'\\n');return;}\n if(command==='help'||flags.help){help();return;}\n const allowed:Record<string,string[]>={\n up:['port','read','write','code','yes','foreground','app-parent-pid'],init:['port','read','write','code','yes'],\n status:['all'],ls:['archived'],rm:[],down:[],stop:[],logs:['lines','follow'],doctor:[],verify:['token-stdin'],dashboard:['token','no-open'],migrate:['yes'],\n auth:['expires','issuer','resource','resource-aliases','client-id','subject','subjects','registration','token-auth','callback','allow-loopback-http'],\n config:['yes','archived','effective','link','name','revision','patch','file','output'],permissions:['target','mode'],privacy:['all','target']\n };\n for(const key of Object.keys(flags))if(!['instance','json','help','version'].includes(key)&&!allowed[command]?.includes(key))fail('Option --'+key+' is not supported by '+command+'.');\n if(string('instance')!==undefined&&!string('instance')!.trim())fail('--instance requires a non-empty name or ID.');\n validateSubcommand();\n if(['status','ls','down','stop','logs','doctor','verify','dashboard'].includes(command)&&positional.length)fail('Unexpected argument: '+positional[0]);\n if(command==='rm'&&positional.length>1)fail('Usage: starmux rm [NAME]');\n if(command==='auth'&&['key','mode','revoke'].includes(positional[0]??'')&&positional.length!==2)fail('Usage: starmux auth '+positional[0]+' VALUE');\n if(command==='migrate'&&positional.length>1)fail('Usage: starmux migrate [registry|setup|live] [-y]');\n // Public commands never inherit old environment overlays. Core's private protocol is retained.\n for(const key of Object.keys(process.env))if(key.startsWith('MAC_MCP_'))delete process.env[key];\n for(const [key,value] of Object.entries(process.env))if(key.startsWith('STARMUX_')&&key!=='STARMUX_TOKEN')process.env['MAC_MCP_'+key.slice(8)]=value;\n if(command==='up'||command==='init'){\n const instance=await configure();\n if(command==='up')await start(instance);\n else if(json)print({result:'SAVED',instance});\n else{\n const flag=await instanceFlag(instance);\n process.stdout.write(`Saved ${instance.name}. Start with starmux up${flag?' '+flag:''}\\n`);\n }\n return;\n }\n if(command==='migrate'){await (await import('../starmux-migration.js')).migrate(positional[0],yes(),json);return;}\n if(command==='ls'||command==='status'&&flags.all){await handle('instance',['list',...(flags.archived?['--archived']:[]),...(json?['--json']:[])]);return;}\n if(command==='rm'){\n const target=positional[0]??string('instance')??(await selected()).id;\n await handle('instance',['archive',target,...(json?['--json']:[])]);return;\n }\n if(command==='config'){await configCommand();return;}\n if(!['status','down','stop','auth','dashboard','verify','doctor','logs','permissions','privacy'].includes(command))fail('Unknown command: '+command+'. Run starmux --help.');\n if(!(await readRegistry()).instances.length){if(command==='status'||command==='down'||command==='stop'){if(json)print({phase:'stopped',initialized:false});else process.stdout.write('Not initialized. Run starmux up in your project.\\n');return;}}\n const instance=await selected();\n if(command==='status')await show(instance);\n else if(command==='down'||command==='stop'){await instanceRequest(instance,'stop');if(json)print({result:'STOPPED',instanceId:instance.id});else process.stdout.write('Stopped '+instance.name+'\\n');}\n else if(command==='auth')await auth(instance);\n else if(command==='dashboard')await dashboard(instance);\n else if(command==='verify')await verify(instance);\n else if(command==='logs')await logs(instance);\n else if(command==='doctor'){\n if(Number(process.versions.node.split('.')[0])<22||(process.versions.node.startsWith('22.')&&Number(process.versions.node.split('.')[1])<12))fail('Node 22.12 or newer is required.');\n await stat(desktopCommanderEntry);const loaded=await loadInstanceConfig(instance);await ensureAccessReady(instance);const state=await instanceStatus(instance);\n if(state.phase!=='running'&&!await availablePort(loaded.config.port))fail('Configured port is in use: '+loaded.config.port);\n if(json)print({result:'PASS',node:process.version,instanceId:instance.id,configState:state.configState});\n else{\n const isDef=await isDefaultInstance(instance);\n const access=await (await createAccessControl(instancePaths(instance).access,{initialize:false})).snapshot();\n const modeLabel=loaded.config.accessRole==='trusted'?'Coding mode':'Read-only mode';\n const authLabel=access.mode==='ingress'?'None (no token required)':access.mode==='api-key'?`API key (${access.credentials.filter(c=>c.status==='active').length} active)`:'OAuth';\n const portState=state.phase==='running'?`Running on 127.0.0.1:${state.port}`:`Stopped · port ${loaded.config.port} available`;\n process.stdout.write(\n `✓ Runtime Node ${process.version} & Desktop Commander engine ready\\n`+\n `✓ Service ${portState}${isDef?'':` (instance: ${instance.name})`}\\n`+\n `✓ Workspace ${loaded.config.projectRoot} (${modeLabel})\\n`+\n `✓ Configuration ${instance.source.path} (${state.configState})\\n`+\n `✓ Authentication ${authLabel}\\n`+\n `PASS · Node, dependencies, workspace, configuration, port and authentication.\\n`\n );\n }\n }else{\n const args=[...positional,'--instance',instance.id];for(const [key,value] of Object.entries(flags))if(key!=='instance'&&value!==undefined)args.push('--'+key,...(typeof value==='string'?[value]:[]));await handle(command,args);\n }\n}\ntry{await main();}catch(error){const message=error instanceof Error?error.message:String(error);if(json)print({schemaVersion:1,error:message});else process.stderr.write(message+'\\n');process.exitCode=1;}\n"]}
package/package.json CHANGED
@@ -1,8 +1,16 @@
1
1
  {
2
2
  "name": "starmux",
3
- "version": "0.13.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"
@@ -65,8 +73,6 @@
65
73
  "SECURITY.md",
66
74
  "bin/starmux.mjs",
67
75
  "docs/*.md",
68
- "docs/assets/*.svg",
69
- "docs/assets/starmux-app-en.png",
70
76
  "app/README.md"
71
77
  ]
72
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>