starmux 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CONTRIBUTING.md +1 -1
  2. package/README.md +184 -59
  3. package/SECURITY.md +3 -3
  4. package/app/README.md +6 -2
  5. package/dist/src/access-control.js +23 -20
  6. package/dist/src/access-control.js.map +1 -1
  7. package/dist/src/access-dashboard.js +8 -2
  8. package/dist/src/access-dashboard.js.map +1 -1
  9. package/dist/src/cli/instances.js +87 -14
  10. package/dist/src/cli/instances.js.map +1 -1
  11. package/dist/src/cli/starmux-status.js +122 -0
  12. package/dist/src/cli/starmux-status.js.map +1 -0
  13. package/dist/src/cli/starmux.js +222 -49
  14. package/dist/src/cli/starmux.js.map +1 -1
  15. package/dist/src/deny-dashboard.js +2 -2
  16. package/dist/src/deny-dashboard.js.map +1 -1
  17. package/dist/src/instance-runtime.js +11 -2
  18. package/dist/src/instance-runtime.js.map +1 -1
  19. package/dist/src/instance-store.js +3 -1
  20. package/dist/src/instance-store.js.map +1 -1
  21. package/dist/src/ops-dashboard.js +4 -4
  22. package/dist/src/ops-dashboard.js.map +1 -1
  23. package/dist/src/permissions-dashboard.js +2 -2
  24. package/dist/src/permissions-dashboard.js.map +1 -1
  25. package/dist/src/starmux-migration.js +1 -1
  26. package/dist/src/starmux-migration.js.map +1 -1
  27. package/docs/ACCESS_CONTROL.md +5 -5
  28. package/docs/CLIENTS.md +11 -19
  29. package/docs/CONNECT_CHATGPT.md +4 -6
  30. package/docs/INSTALL.md +9 -5
  31. package/docs/INSTANCES.md +5 -2
  32. package/docs/OAUTH.md +6 -14
  33. package/docs/PLATFORMS.md +4 -4
  34. package/docs/README.md +2 -11
  35. package/docs/REMOTE_SETUP.md +13 -13
  36. package/docs/SECURITY.md +5 -5
  37. package/docs/assets/starmux-app-en.png +0 -0
  38. package/docs/assets/starmux-architecture.svg +315 -0
  39. package/package.json +1 -1
  40. package/docs/ARCHITECTURE.md +0 -51
  41. package/docs/MIGRATION.md +0 -37
  42. package/docs/RELEASE_STATUS.md +0 -22
  43. package/docs/TYPESCRIPT_MIGRATION.md +0 -56
  44. package/docs/VALIDATION_OAUTH.md +0 -79
  45. package/docs/VALIDATION_TUNNEL.md +0 -39
  46. package/docs/VALIDATION_WORKBUDDY.md +0 -59
  47. package/docs/assets/mcp-connection-route.svg +0 -104
  48. package/docs/assets/mcp-gateway-simple.svg +0 -62
@@ -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,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,packageRoot} from '../runtime-paths.js';\n\nconst version='0.10.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 topic=command==='help'?positional[0]:command;\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 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|path|edit|validate|diff|apply|schema|recover\\n config import FILE [-i NAME] [--link] [-y]\\n config copy NEW_NAME -i SOURCE\\n config rename NEW_NAME -i SOURCE\\n config default NAME\\n config archive|restore -i NAME\\n config export --output FILE\\n config relink --file FILE | manage\\n config save --file FILE --revision REV\\n config patch --patch JSON --revision REV [-y]\\n config 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 and a directory 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 Dashboard.',\n ls:'ls [--archived]\\n List local instances.',\n down:'down (alias: stop)\\n Stop the selected instance.'\n };\n process.stdout.write(`Starmux ${version}\\n\\n${sections[topic??'']??'Connect AI clients to your computer’s files and development tools.\\n\\n starmux up [path] [--code] Start in the background\\n starmux init [path] Save settings\\n starmux status Show local endpoints\\n starmux verify | doctor Check tools or environment\\n starmux logs [-f] Read logs\\n starmux down Stop\\n starmux auth Manage client access\\n starmux dashboard Open local Access console\\n starmux ls List instances\\n starmux config Advanced configuration\\n starmux migrate Import an old installation'}\\n\\nGlobal: -i, --instance NAME_OR_ID --json -h, --help\\nUse starmux COMMAND --help for details.\\nDocumentation: ${path.join(packageRoot,'docs','README.md')}\\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 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(`\\nStarmux · ${instance.name} · ${status.phase}\\nWorkspace ${config?.projectRoot??'Unavailable'}\\nMode ${config?.accessRole==='trusted'?(config.writeScope==='home-only'?'Coding (Home sandbox)':'Coding (OS account)'):config?.mode==='read-write'?'File writes (restricted)':'Read-only'}\\nRuntime ${status.executionMode}\\n`);\n if(status.port&&status.phase==='running')process.stdout.write(`MCP http://127.0.0.1:${status.port}/mcp\\nDashboard http://127.0.0.1:${status.port}/access\\n`);\n if(status.configProblem||status.runtimeProblem)process.stdout.write(`Problem ${status.configProblem??status.runtimeProblem}\\n`);\n process.stdout.write(`Logs starmux logs -f -i ${JSON.stringify(instance.name)}\\n`);\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,...(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 transport=new StreamableHTTPClientTransport(new URL(`http://127.0.0.1:${status.port}/mcp`),{requestInit:{headers:token?{Authorization:'Bearer '+token}:{}}});\n try{await client.connect(transport as Transport);await client.listTools();const result=await client.callTool({name:'list_directory',arguments:{path:'.',depth:0}});if(result.isError)fail('Directory read failed.');}\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});else process.stdout.write('PASS · MCP handshake, tool discovery and workspace read.\\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){const state=await access.snapshot();if(json)print(state);else{process.stdout.write(`Authentication: ${state.mode}\\n`);for(const c of state.credentials)process.stdout.write(`${c.id} ${c.name} ${c.status}\\n`);for(const c of state.oauthConnections)process.stdout.write(`${c.id} OAuth ${c.clientId} ${c.revokedAt?'revoked':'active'}\\n`);}return;}\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'});else process.stdout.write(`API key enabled for ${result.name}\\nID: ${result.id}\\n\\n${result.key}\\n\\nCopy this key now; it is shown once.\\n`);return;\n }\n if(op==='mode'){\n const mode=positional[1];if(mode!=='ingress'&&mode!=='api-key'&&mode!=='oauth')fail('Choose 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 if(json)print(await access.snapshot());else process.stdout.write('Authentication: '+mode+'\\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 if(await exists(file)){const text=await readTrusted(file,true,32*1024*1024);offset=Buffer.byteLength(text);const output=text.split('\\n').slice(-count).join('\\n');if(json)print({instanceId:instance.id,output});else process.stdout.write(output);}\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==='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}\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'],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(['status','ls','down','stop','logs','doctor','verify','dashboard'].includes(command)&&positional.length)fail('Unexpected argument: '+positional[0]);\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();if(command==='up')await start(instance);else if(json)print({result:'SAVED',instance});else process.stdout.write(`Saved ${instance.name}. Start with starmux up -i ${JSON.stringify(instance.name)}\\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==='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});else process.stdout.write('PASS · Node, dependencies, workspace, configuration, port and authentication.\\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.12.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"]}
@@ -24,7 +24,7 @@ export function renderDenyDashboard({ rules, toolCatalog = [] }) {
24
24
  controls("allow-directory", n, "移除过滤") + '</td></tr>').join("");
25
25
  return '<!doctype html><html lang="zh-CN"><head><meta charset="utf-8">' +
26
26
  '<meta name="viewport" content="width=device-width,initial-scale=1">' +
27
- '<title>Mac MCP Gateway · Explicit Deny</title>' +
27
+ '<title>Starmux · Tool Filters</title>' +
28
28
  '<style>body{font:15px system-ui,-apple-system,sans-serif;max-width:1000px;' +
29
29
  'margin:28px auto;padding:0 20px;background:#f6f7fa;color:#233045}' +
30
30
  'section{background:white;border:1px solid #ddd;border-radius:12px;' +
@@ -33,7 +33,7 @@ export function renderDenyDashboard({ rules, toolCatalog = [] }) {
33
33
  'input,button{padding:7px;margin:3px;font:inherit}' +
34
34
  'input[name=value]{width:80%;max-width:600px}' +
35
35
  'code{overflow-wrap:anywhere}small{display:block;color:#657083}</style></head><body>' +
36
- '<h1>Mac MCP Gateway · Tool Filters</h1>' +
36
+ '<h1>Starmux · Tool Filters</h1>' +
37
37
  '<p><strong>Default Allow / Explicit Deny</strong>:上游工具默认全部可用。' +
38
38
  '只有设备所有者明确禁用的工具会从 AI 的 tools/list 消失;' +
39
39
  '旧客户端直接调用时也会被拒绝。新工具默认自动可用。</p>' +
@@ -1 +1 @@
1
- {"version":3,"file":"deny-dashboard.js","sourceRoot":"","sources":["../../src/deny-dashboard.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from \"node:http\";\nimport type { DenyConfig,DenyRules,PostResult } from \"./contracts.js\";\nimport { isSafeInteger } from \"./validation.js\";\n// Owner-only, local Dashboard for optional tool/path deny rules.\n// The page has no JavaScript. Existing grants owner token and same-origin\n// form checks are reused; remote MCP tool calls cannot modify this profile.\nimport { permissionHeaders } from \"./permissions-dashboard.js\";\nconst h=(x: unknown)=>String(x??\"\").replace(/[&<>\"']/g,c=>\n ({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"}[c]!));\nexport const denyPageHeaders=permissionHeaders;\nconst controls=(op: string,value: string,label: string)=>'<form method=\"post\" action=\"/filters\">'+\n '<input type=\"hidden\" name=\"op\" value=\"'+h(op)+'\">'+\n '<input type=\"hidden\" name=\"value\" value=\"'+h(value)+'\">'+\n '<input type=\"password\" name=\"token\" autocomplete=\"off\" placeholder=\"本机管理密钥\" required>'+\n '<button type=\"submit\">'+h(label)+'</button></form>';\nexport function renderDenyDashboard({rules,toolCatalog=[]}: {rules:DenyConfig;toolCatalog?:readonly {name:string}[]}){\n const byName=new Map(toolCatalog.map(t=>[t.name,t]));\n const rows=toolCatalog.map(tool=>{\n const blocked=rules.deniedTools.includes(tool.name);\n return '<tr><td><code>'+h(tool.name)+'</code></td><td>'+\n (blocked?\"已禁用\":\"默认允许\")+'</td><td>'+\n controls(blocked?\"enable-tool\":\"disable-tool\",tool.name,\n blocked?\"重新启用\":\"禁用工具\")+'</td></tr>';\n }).join(\"\");\n const stale=rules.deniedTools.filter(n=>!byName.has(n)).map(n=>\n '<tr><td><code>'+h(n)+'</code></td><td>禁用(当前未发现)</td><td>'+\n controls(\"enable-tool\",n,\"撤销禁用\")+'</td></tr>').join(\"\");\n const paths=rules.deniedDirectories.map(n=>\n '<tr><td><code>'+h(n)+'</code></td><td>'+\n controls(\"allow-directory\",n,\"移除过滤\")+'</td></tr>').join(\"\");\n return '<!doctype html><html lang=\"zh-CN\"><head><meta charset=\"utf-8\">'+\n '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">'+\n '<title>Mac MCP Gateway · Explicit Deny</title>'+\n '<style>body{font:15px system-ui,-apple-system,sans-serif;max-width:1000px;'+\n 'margin:28px auto;padding:0 20px;background:#f6f7fa;color:#233045}'+\n 'section{background:white;border:1px solid #ddd;border-radius:12px;'+\n 'padding:20px;margin:15px 0}table{width:100%;border-collapse:collapse}'+\n 'td,th{padding:10px;border-bottom:1px solid #ddd;text-align:left}'+\n 'input,button{padding:7px;margin:3px;font:inherit}'+\n 'input[name=value]{width:80%;max-width:600px}'+\n 'code{overflow-wrap:anywhere}small{display:block;color:#657083}</style></head><body>'+\n '<h1>Mac MCP Gateway · Tool Filters</h1>'+\n '<p><strong>Default Allow / Explicit Deny</strong>:上游工具默认全部可用。'+\n '只有设备所有者明确禁用的工具会从 AI 的 tools/list 消失;'+\n '旧客户端直接调用时也会被拒绝。新工具默认自动可用。</p>'+\n '<section><h2>工具黑名单</h2><table><thead><tr><th>工具</th><th>状态</th><th>操作</th>'+\n '</tr></thead><tbody>'+rows+stale+'</tbody></table></section>'+\n '<section><h2>目录过滤(可选)</h2>'+\n '<p>仅检查具有明确文件路径参数的直接工具调用。'+\n '<strong>不限制 Shell、Python、脚本或上游工具间接访问文件。</strong> '+\n '也不是操作系统沙箱;对目录的递归枚举或搜索亦不能提供可靠隔离。'+\n '需要真正隔离时,应由 Desktop Commander / macOS / 容器负责。</p>'+\n '<table><thead><tr><th>过滤目录</th><th>操作</th></tr></thead><tbody>'+\n (paths||'<tr><td colspan=\"2\">没有目录过滤规则</td></tr>')+\n '</tbody></table><h3>添加禁止的目录</h3>'+\n '<form method=\"post\" action=\"/filters\">'+\n '<input type=\"hidden\" name=\"op\" value=\"deny-directory\">'+\n '<input name=\"value\" type=\"text\" placeholder=\"/absolute/folder\" required>'+\n '<input type=\"password\" name=\"token\" autocomplete=\"off\" placeholder=\"本机管理密钥\" required>'+\n '<button type=\"submit\">添加过滤</button></form>'+\n '<small>启用后,含路径参数的直接工具调用要求绝对路径;未设置过滤时不改变原生调用。</small>'+\n '</section><p><a href=\"/dashboard\">运行 Dashboard</a> · '+\n '<a href=\"/permissions\">目录授权</a></p>'+\n '<small>黑名单是防误操作护栏,不是抵御恶意 Shell 或提示注入的安全边界。'+\n '这里的管理密钥只由设备所有者在 Mac 本机使用,不得发送给远程 AI。</small>'+\n '</body></html>';\n}\nexport async function applyDenyPost(req: IncomingMessage,ruleStore: DenyRules,authorize:(token:unknown)=>Promise<boolean>,host:string|undefined): Promise<PostResult>{\n if(req.headers.origin!==\"http://\"+host||\n (req.headers[\"content-type\"]||\"\").split(\";\")[0]!==\"application/x-www-form-urlencoded\")\n return {status:403,message:\"Owner authorization required\"};\n const length=Number(req.headers[\"content-length\"]||0);\n if(!isSafeInteger(length)||length<1||length>4096)\n return {status:413,message:\"Invalid request\"};\n let body=\"\";\n for await(const chunk of req){\n body+=chunk.toString(\"utf8\");\n if(Buffer.byteLength(body)>4096)return {status:413,message:\"Invalid request\"};\n }\n const form=new URLSearchParams(body);\n for(const k of form.keys())\n if(![\"op\",\"value\",\"token\"].includes(k)||form.getAll(k).length!==1)\n return {status:400,message:\"Invalid form\"};\n if(!await authorize(form.get(\"token\")))\n return {status:403,message:\"Owner authorization required\"};\n const op=form.get(\"op\")??\"\";\n if(![\"enable-tool\",\"disable-tool\",\"deny-directory\",\"allow-directory\"].includes(op))\n return {status:400,message:\"Invalid operation\"};\n try{\n await ruleStore.update(op,form.get(\"value\"));\n return {status:303,location:\"/filters\"};\n }catch{\n return {status:400,message:\"Rule rejected: check name or directory\"};\n }\n}\n"]}
1
+ {"version":3,"file":"deny-dashboard.js","sourceRoot":"","sources":["../../src/deny-dashboard.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from \"node:http\";\nimport type { DenyConfig,DenyRules,PostResult } from \"./contracts.js\";\nimport { isSafeInteger } from \"./validation.js\";\n// Owner-only, local Dashboard for optional tool/path deny rules.\n// The page has no JavaScript. Existing grants owner token and same-origin\n// form checks are reused; remote MCP tool calls cannot modify this profile.\nimport { permissionHeaders } from \"./permissions-dashboard.js\";\nconst h=(x: unknown)=>String(x??\"\").replace(/[&<>\"']/g,c=>\n ({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"}[c]!));\nexport const denyPageHeaders=permissionHeaders;\nconst controls=(op: string,value: string,label: string)=>'<form method=\"post\" action=\"/filters\">'+\n '<input type=\"hidden\" name=\"op\" value=\"'+h(op)+'\">'+\n '<input type=\"hidden\" name=\"value\" value=\"'+h(value)+'\">'+\n '<input type=\"password\" name=\"token\" autocomplete=\"off\" placeholder=\"本机管理密钥\" required>'+\n '<button type=\"submit\">'+h(label)+'</button></form>';\nexport function renderDenyDashboard({rules,toolCatalog=[]}: {rules:DenyConfig;toolCatalog?:readonly {name:string}[]}){\n const byName=new Map(toolCatalog.map(t=>[t.name,t]));\n const rows=toolCatalog.map(tool=>{\n const blocked=rules.deniedTools.includes(tool.name);\n return '<tr><td><code>'+h(tool.name)+'</code></td><td>'+\n (blocked?\"已禁用\":\"默认允许\")+'</td><td>'+\n controls(blocked?\"enable-tool\":\"disable-tool\",tool.name,\n blocked?\"重新启用\":\"禁用工具\")+'</td></tr>';\n }).join(\"\");\n const stale=rules.deniedTools.filter(n=>!byName.has(n)).map(n=>\n '<tr><td><code>'+h(n)+'</code></td><td>禁用(当前未发现)</td><td>'+\n controls(\"enable-tool\",n,\"撤销禁用\")+'</td></tr>').join(\"\");\n const paths=rules.deniedDirectories.map(n=>\n '<tr><td><code>'+h(n)+'</code></td><td>'+\n controls(\"allow-directory\",n,\"移除过滤\")+'</td></tr>').join(\"\");\n return '<!doctype html><html lang=\"zh-CN\"><head><meta charset=\"utf-8\">'+\n '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">'+\n '<title>Starmux · Tool Filters</title>'+\n '<style>body{font:15px system-ui,-apple-system,sans-serif;max-width:1000px;'+\n 'margin:28px auto;padding:0 20px;background:#f6f7fa;color:#233045}'+\n 'section{background:white;border:1px solid #ddd;border-radius:12px;'+\n 'padding:20px;margin:15px 0}table{width:100%;border-collapse:collapse}'+\n 'td,th{padding:10px;border-bottom:1px solid #ddd;text-align:left}'+\n 'input,button{padding:7px;margin:3px;font:inherit}'+\n 'input[name=value]{width:80%;max-width:600px}'+\n 'code{overflow-wrap:anywhere}small{display:block;color:#657083}</style></head><body>'+\n '<h1>Starmux · Tool Filters</h1>'+\n '<p><strong>Default Allow / Explicit Deny</strong>:上游工具默认全部可用。'+\n '只有设备所有者明确禁用的工具会从 AI 的 tools/list 消失;'+\n '旧客户端直接调用时也会被拒绝。新工具默认自动可用。</p>'+\n '<section><h2>工具黑名单</h2><table><thead><tr><th>工具</th><th>状态</th><th>操作</th>'+\n '</tr></thead><tbody>'+rows+stale+'</tbody></table></section>'+\n '<section><h2>目录过滤(可选)</h2>'+\n '<p>仅检查具有明确文件路径参数的直接工具调用。'+\n '<strong>不限制 Shell、Python、脚本或上游工具间接访问文件。</strong> '+\n '也不是操作系统沙箱;对目录的递归枚举或搜索亦不能提供可靠隔离。'+\n '需要真正隔离时,应由 Desktop Commander / macOS / 容器负责。</p>'+\n '<table><thead><tr><th>过滤目录</th><th>操作</th></tr></thead><tbody>'+\n (paths||'<tr><td colspan=\"2\">没有目录过滤规则</td></tr>')+\n '</tbody></table><h3>添加禁止的目录</h3>'+\n '<form method=\"post\" action=\"/filters\">'+\n '<input type=\"hidden\" name=\"op\" value=\"deny-directory\">'+\n '<input name=\"value\" type=\"text\" placeholder=\"/absolute/folder\" required>'+\n '<input type=\"password\" name=\"token\" autocomplete=\"off\" placeholder=\"本机管理密钥\" required>'+\n '<button type=\"submit\">添加过滤</button></form>'+\n '<small>启用后,含路径参数的直接工具调用要求绝对路径;未设置过滤时不改变原生调用。</small>'+\n '</section><p><a href=\"/dashboard\">运行 Dashboard</a> · '+\n '<a href=\"/permissions\">目录授权</a></p>'+\n '<small>黑名单是防误操作护栏,不是抵御恶意 Shell 或提示注入的安全边界。'+\n '这里的管理密钥只由设备所有者在 Mac 本机使用,不得发送给远程 AI。</small>'+\n '</body></html>';\n}\nexport async function applyDenyPost(req: IncomingMessage,ruleStore: DenyRules,authorize:(token:unknown)=>Promise<boolean>,host:string|undefined): Promise<PostResult>{\n if(req.headers.origin!==\"http://\"+host||\n (req.headers[\"content-type\"]||\"\").split(\";\")[0]!==\"application/x-www-form-urlencoded\")\n return {status:403,message:\"Owner authorization required\"};\n const length=Number(req.headers[\"content-length\"]||0);\n if(!isSafeInteger(length)||length<1||length>4096)\n return {status:413,message:\"Invalid request\"};\n let body=\"\";\n for await(const chunk of req){\n body+=chunk.toString(\"utf8\");\n if(Buffer.byteLength(body)>4096)return {status:413,message:\"Invalid request\"};\n }\n const form=new URLSearchParams(body);\n for(const k of form.keys())\n if(![\"op\",\"value\",\"token\"].includes(k)||form.getAll(k).length!==1)\n return {status:400,message:\"Invalid form\"};\n if(!await authorize(form.get(\"token\")))\n return {status:403,message:\"Owner authorization required\"};\n const op=form.get(\"op\")??\"\";\n if(![\"enable-tool\",\"disable-tool\",\"deny-directory\",\"allow-directory\"].includes(op))\n return {status:400,message:\"Invalid operation\"};\n try{\n await ruleStore.update(op,form.get(\"value\"));\n return {status:303,location:\"/filters\"};\n }catch{\n return {status:400,message:\"Rule rejected: check name or directory\"};\n }\n}\n"]}
@@ -176,7 +176,14 @@ export async function runInstance(instance, options = {}) {
176
176
  let finish;
177
177
  const finished = new Promise(r => { finish = r; });
178
178
  const serialize = (fn) => { const next = sequence.then(fn); sequence = next.catch(() => { }); return next; };
179
- function emit(event) { process.stdout.write(JSON.stringify({ event, ...state }) + '\n'); }
179
+ function emit(event) {
180
+ if (options.json || !options.onReady)
181
+ process.stdout.write(JSON.stringify({ event, ...state }) + '\n');
182
+ else if (event === 'INSTANCE_ERROR' || event === 'INSTANCE_APPLY_FAILED')
183
+ process.stderr.write(`\n${instance.name}: ${state.problem}\nInspect logs: starmux logs -i ${instance.id}\n`);
184
+ else if (event === 'INSTANCE_STOPPED')
185
+ process.stdout.write(`\nStopped ${instance.name}.\n`);
186
+ }
180
187
  async function stopWorker() {
181
188
  const child = worker;
182
189
  if (!child)
@@ -360,7 +367,9 @@ export async function runInstance(instance, options = {}) {
360
367
  portLease = await acquireControl(initial.config.port, { launcher: owner.launcher });
361
368
  portLease.onStop(async () => { void serialize(shutdown); return 'STOPPED'; });
362
369
  await serialize(() => startWorker(active(initial), portLease));
363
- if (!options.json)
370
+ if (options.onReady)
371
+ await options.onReady();
372
+ else if (!options.json)
364
373
  process.stderr.write(`\n${instance.name}: http://127.0.0.1:${state.port}/mcp\nConfig: ${instance.source.path}\nCtrl+C stops this instance.\n`);
365
374
  await finished;
366
375
  }