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":"instance-runtime.js","sourceRoot":"","sources":["../../src/instance-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import {createHash,createHmac,randomBytes,timingSafeEqual} from 'node:crypto';\nimport {createServer,createConnection,type Server} from 'node:net';\nimport {fork,type ChildProcess} from 'node:child_process';\nimport {mkdir,rm,readFile,open,lstat} from 'node:fs/promises';\nimport {fileURLToPath} from 'node:url';\nimport path from 'node:path';\nimport {homedir} from 'node:os';\nimport {z} from 'zod';\nimport {controlRoot,createPrivateDirectory,childEnvKeys,windows} from './platform.js';\nimport {acquireControl} from './global-core-control.js';\nimport {runtimeIdentity} from './runtime-identity.js';\nimport {atomicPrivate,changeRegistry,availablePort,ensureAccessReady,exists,instanceEnv,instancePaths,loadInstanceConfig,prepareUpstreams,readTrusted,resolveInstance,type Instance,type InstanceConfig} from './instance-store.js';\n\nconst metadataSchema=z.object({instanceId:z.string().uuid(),runId:z.string().regex(/^[a-f0-9]{32}$/),pid:z.number().int().min(2),token:z.string().regex(/^[a-f0-9]{64}$/),launcher:z.enum(['cli','app']),appParentPid:z.number().int().nullable()}).strict();\ntype Owner=z.infer<typeof metadataSchema>;\nexport type ActiveConfig={config:InstanceConfig;revision:string;effectiveRevision:string;sourcePath:string};\nexport type RuntimeState={instanceId:string;runId:string;pid:number;launcher:'cli'|'app';appParentPid:number|null;executionMode?:'foreground'|'background';\n phase:'starting'|'running'|'stopping'|'stopped'|'error';port:number|null;active:ActiveConfig|null;problem:string|null;coreProgram:string;buildVersion:string};\nfunction runtimePaths(id:string){\n const root=path.join(controlRoot(),'i-'+id);const socket=windows?'\\\\\\\\.\\\\pipe\\\\gateway-instance-'+createHash('sha256').update(root).digest('hex').slice(0,28):path.join(root,'control.sock');\n return {root,socket,meta:path.join(root,'owner.json')};\n}\nconst signature=(key:string,message:string)=>createHmac('sha256',key).update(message).digest('hex');\nfunction equal(a:unknown,b:string){return typeof a==='string'&&a.length===b.length&&timingSafeEqual(Buffer.from(a),Buffer.from(b));}\nfunction alive(pid:number){try{process.kill(pid,0);return true;}catch(e){return (e as NodeJS.ErrnoException).code!=='ESRCH';}}\nasync function ownerFor(instance:Instance){\n const p=runtimePaths(instance.id);if(!await exists(p.root))return null;\n const owner=metadataSchema.parse(JSON.parse(await readTrusted(p.meta)) as unknown);\n if(owner.instanceId!==instance.id)throw Error('INSTANCE_CONTROL_IDENTITY_INVALID');return owner;\n}\nexport async function instanceRequest(instance:Instance,method:'status'|'stop'|'apply',revision?:string):Promise<RuntimeState|null>{\n const owner=await ownerFor(instance);if(!owner||!alive(owner.pid))return null;\n const nonce=randomBytes(24).toString('hex');const body=JSON.stringify({method,revision:revision??null,runId:owner.runId,nonce});\n return new Promise((resolve,reject)=>{\n const socket=createConnection(runtimePaths(instance.id).socket);let raw='';\n socket.setTimeout(method==='status'?2000:65000,()=>socket.destroy(Error('INSTANCE_CONTROL_TIMEOUT')));\n socket.on('error',reject);socket.on('connect',()=>socket.end(JSON.stringify({body,proof:signature(owner.token,body)})+'\\n'));\n socket.on('data',data=>{raw+=String(data);if(raw.length>524288)socket.destroy(Error('INSTANCE_CONTROL_REPLY_TOO_LARGE'));});\n socket.on('end',()=>{try{\n const reply=JSON.parse(raw) as {body:string;proof:string};\n if(!equal(reply.proof,signature(owner.token,nonce+reply.body)))throw Error('INSTANCE_CONTROL_REPLY_UNTRUSTED');\n const data=JSON.parse(reply.body) as {state:RuntimeState;error?:string};\n if(data.error)throw Error(data.error);\n if(data.state.instanceId!==instance.id||data.state.runId!==owner.runId)throw Error('INSTANCE_CONTROL_IDENTITY_CHANGED');\n resolve(data.state);\n }catch(e){reject(e);}});\n });\n}\nexport async function instanceStatus(instance:Instance,home=homedir()){\n let runtime:RuntimeState|null=null;let runtimeProblem:string|null=null;\n try{runtime=await instanceRequest(instance,'status');}catch(e){runtimeProblem=(e as Error).message;}\n let saved:Awaited<ReturnType<typeof loadInstanceConfig>>|null=null;let configProblem:string|null=null;\n try{saved=await loadInstanceConfig(instance);}catch(e){configProblem=(e as Error).message;}\n let lastRuntime:RuntimeState|null=null;\n if(!runtime)try{lastRuntime=JSON.parse(await readTrusted(path.join(instancePaths(instance,home).snapshots,'last-runtime.json'))) as RuntimeState;}catch{}\n if(!runtime&&lastRuntime?.problem)runtimeProblem??=lastRuntime.problem;\n let health='not-running';let accessMode:string|null=null;let lastToolCallAt:string|null=null;\n if(runtime?.phase==='running'&&runtime.port){\n try{\n const response=await fetch(`http://127.0.0.1:${runtime.port}/healthz`,{signal:AbortSignal.timeout(1500)});\n const data=await response.json() as {status?:string;instanceId?:string;accessMode?:string};\n health=response.ok&&data.status==='ok'&&data.instanceId===instance.id?'ok':'unrecognized';accessMode=data.accessMode??null;\n const activity=await fetch(`http://127.0.0.1:${runtime.port}/activity.json`,{signal:AbortSignal.timeout(1000)}).then(r=>r.json()) as {lastToolCallAt?:string};\n lastToolCallAt=typeof activity.lastToolCallAt==='string'?activity.lastToolCallAt:null;\n }catch{health='unreachable';}\n }\n let active=runtime?.active??null;\n if(!active)try{active=JSON.parse(await readTrusted(path.join(instancePaths(instance,home).snapshots,'active.json'))) as ActiveConfig;}catch{}\n const configState=configProblem?(configProblem.includes('ENOENT')?'missing':'invalid'):runtime?.phase==='running'?(saved?.effectiveRevision===active?.effectiveRevision?'applied':'pending'):'on-next-start';\n return {schemaVersion:1,event:'GATEWAY_STATUS',instanceId:instance.id,name:instance.name,archived:instance.archived,source:instance.source,\n phase:runtime?.phase??(runtimeProblem?'error':'stopped'),configState,configProblem,runtimeProblem,runtime,\n port:runtime?.port??saved?.config.port??null,configuredPort:saved?.config.port??null,active,revision:saved?.revision??null,\n health,accessMode,lastToolCallAt,profile:instance.legacy??'setup',installed:false,registered:false,\n label:instance.name,workspaceMode:runtime?.active?.config.mode??saved?.config.mode??null,\n writeScope:runtime?.active?.config.writeScope??saved?.config.writeScope??null,coreControl:runtime?.phase==='running'?'RUNNING':'unavailable',\n coreLauncher:runtime?.launcher??'unknown',coreOwnerPid:runtime?.pid??null,listenerPid:runtime?.pid??null,\n executionMode:runtime?.phase==='running'?(runtime.executionMode==='background'?'background':'foreground-owned'):'stopped',loginAutostart:'disabled',\n connectionState:health==='ok'?(lastToolCallAt?'local-ready-activity-recorded':'local-ready-remote-unverified'):health,requiredAccess:instance.requiredAccess};\n}\nexport async function runInstance(instance:Instance,options:{home?:string;appParentPid?:number;json?:boolean;background?:boolean;workerModule?:URL}={}){\n const home=options.home??homedir();const parent=options.appParentPid;\n if(parent!==undefined&&(!Number.isSafeInteger(parent)||parent<2||process.ppid!==parent))throw Error('APP_PARENT_IDENTITY_MISMATCH');\n if(instance.archived)throw Error('INSTANCE_ARCHIVED');\n const initial=await loadInstanceConfig(instance);await ensureAccessReady(await resolveInstance(instance.id,home),home);\n const p=runtimePaths(instance.id);createPrivateDirectory(controlRoot());\n const owner:Owner={instanceId:instance.id,runId:randomBytes(16).toString('hex'),pid:process.pid,token:randomBytes(32).toString('hex'),launcher:parent?'app':'cli',appParentPid:parent??null};\n await changeRegistry(async registry=>{\n const registered=registry.instances.find(i=>i.id===instance.id);\n if(!registered||registered.archived)throw Error('INSTANCE_ARCHIVED_OR_REMOVED');\n try{await mkdir(p.root,{mode:0o700});}catch(e){\n if((e as NodeJS.ErrnoException).code!=='EEXIST')throw e;\n const old=await ownerFor(instance);if(!old||alive(old.pid))throw Error('INSTANCE_ALREADY_RUNNING_OR_CONTROL_BUSY');\n // Serialise stale recovery independently; never remove a live owner's lease.\n const recovery=p.root+'.recovery';await mkdir(recovery,{mode:0o700});\n try{const check=await ownerFor(instance);if(!check||check.runId!==old.runId||alive(check.pid))throw Error('INSTANCE_CONTROL_CHANGED');\n await rm(p.root,{recursive:true});await mkdir(p.root,{mode:0o700});\n }finally{await rm(recovery,{recursive:true,force:true});}\n }\n await atomicPrivate(p.meta,JSON.stringify(owner));\n },home);\n const identity=await runtimeIdentity();\n const state:RuntimeState={instanceId:instance.id,runId:owner.runId,pid:process.pid,launcher:owner.launcher,appParentPid:parent??null,executionMode:options.background?'background':'foreground',phase:'starting',port:null,active:null,problem:null,...identity};\n let worker:ChildProcess|null=null;let portLease:Awaited<ReturnType<typeof acquireControl>>|null=null;let server:Server|null=null;\n let ending=false;let expectedWorkerExit=false;let sequence:Promise<unknown>=Promise.resolve();\n let finish!:()=>void;const finished=new Promise<void>(r=>{finish=r;});\n const serialize=<T>(fn:()=>Promise<T>):Promise<T>=>{const next=sequence.then(fn);sequence=next.catch(()=>{});return next;};\n function emit(event:string){process.stdout.write(JSON.stringify({event,...state})+'\\n');}\n async function stopWorker(){\n const child=worker;if(!child)return;expectedWorkerExit=true;\n await new Promise<void>(resolve=>{\n if(child.exitCode!==null||child.signalCode!==null){resolve();return;}\n let forced=false;\n const timer=setTimeout(()=>{forced=true;child.kill('SIGKILL');},8000);\n child.once('exit',()=>{clearTimeout(timer);if(forced)state.problem='WORKER_STOP_FORCED';resolve();});\n if(child.connected)child.send({type:'gateway-stop'});else child.kill('SIGTERM');\n });worker=null;expectedWorkerExit=false;\n }\n async function shutdown(reason?:string){\n if(ending)return;ending=true;state.problem=reason??null;state.phase='stopping';await stopWorker();\n await portLease?.release();portLease=null;state.phase='stopped';state.port=null;emit('INSTANCE_STOPPED');finish();\n }\n async function startWorker(config:ActiveConfig,lease:Awaited<ReturnType<typeof acquireControl>>){\n await ensureAccessReady(await resolveInstance(instance.id,home),home);\n if(!await availablePort(config.config.port))throw Error('PORT_IN_USE: '+config.config.port);\n const env:NodeJS.ProcessEnv={};for(const key of childEnvKeys)if(process.env[key])env[key]=process.env[key]!;\n Object.assign(env,instanceEnv(instance,config.config,home),{MAC_MCP_INTERNAL_SETUP_OWNER_PID:String(process.pid),MAC_MCP_INTERNAL_SETUP_RUN_ID:lease.owner.runId,MAC_MCP_INTERNAL_SETUP_TOKEN:lease.owner.token});\n const upstreamFile=await prepareUpstreams(instance,config.config,home);if(upstreamFile)env.MAC_MCP_UPSTREAMS_FILE=upstreamFile;\n const log=path.join(instancePaths(instance,home).logs,'core.log');\n if(await exists(log))await readTrusted(log,true,32*1024*1024);\n const output=await open(log,'a',0o600);\n const child=fork(fileURLToPath(options.workerModule??new URL('./instance-worker.js',import.meta.url)),[],{env,stdio:['ignore',output.fd,output.fd,'ipc']});worker=child;await output.close();\n await new Promise<void>((resolve,reject)=>{\n const timer=setTimeout(()=>reject(Error('INSTANCE_START_TIMEOUT')),20000);\n const ready=(message:unknown)=>{if(message&&typeof message==='object'&&'type' in message&&message.type==='gateway-ready'){clearTimeout(timer);child.off('exit',failed);child.off('error',failed);child.off('message',ready);resolve();}};\n const failed=()=>{clearTimeout(timer);child.off('message',ready);reject(Error('INSTANCE_START_FAILED: inspect instance logs'));};\n child.once('error',failed);child.once('exit',failed);child.on('message',ready);\n });\n state.active=config;state.port=config.config.port;state.phase='running';lease.markRunning();\n await atomicPrivate(path.join(instancePaths(instance,home).snapshots,'active.json'),JSON.stringify(config,null,2));\n child.once('exit',()=>{if(!expectedWorkerExit&&!ending){state.phase='error';state.problem='INSTANCE_WORKER_EXITED';emit('INSTANCE_ERROR');void serialize(()=>shutdown('INSTANCE_WORKER_EXITED'));}});\n emit('INSTANCE_RUNNING');\n }\n const active=(loaded:typeof initial):ActiveConfig=>({config:loaded.config,revision:loaded.revision,effectiveRevision:loaded.effectiveRevision,sourcePath:loaded.source.path});\n async function apply(revision:string|null){\n if(ending)throw Error('INSTANCE_STOPPING');\n const current=await resolveInstance(instance.id,home);const next=await loadInstanceConfig(current);\n if(!revision||next.revision!==revision)throw Error('CONFIG_CONFLICT: configuration changed before apply');\n await ensureAccessReady(await resolveInstance(instance.id,home),home);await prepareUpstreams(instance,next.config,home);\n const previous=state.active;if(!previous||!portLease)throw Error('INSTANCE_NOT_RUNNING');\n const oldLease=portLease;let candidateLease=oldLease;\n if(next.config.port!==previous.config.port){\n if(!await availablePort(next.config.port))throw Error('PORT_IN_USE: '+next.config.port);\n candidateLease=await acquireControl(next.config.port,{launcher:owner.launcher});candidateLease.onStop(async()=>{void serialize(shutdown);return 'STOPPED';});\n }\n state.phase='starting';await stopWorker();state.problem=null;\n try{\n await startWorker(active(next),candidateLease);portLease=candidateLease;\n if(candidateLease!==oldLease)await oldLease.release();\n }catch(error){\n await stopWorker();if(candidateLease!==oldLease)await candidateLease.release();portLease=oldLease;\n state.problem='APPLY_FAILED_RESTORED: '+(error as Error).message;\n try{await startWorker(previous,oldLease);}catch{\n await stopWorker();state.phase='error';state.problem='APPLY_AND_RESTORE_FAILED: inspect instance logs';\n }\n emit('INSTANCE_APPLY_FAILED');throw Error(state.problem!);\n }\n }\n const signal=()=>{void serialize(shutdown);};\n const parentTimer=parent?setInterval(()=>{if(process.ppid!==parent)signal();},400):null;\n parentTimer?.unref();process.on('SIGTERM',signal);process.on('SIGINT',signal);\n try{\n server=createServer({allowHalfOpen:true},socket=>{\n socket.setTimeout(65000,()=>socket.destroy());let raw='';let handled=false;\n socket.on('error',()=>{});socket.on('data',chunk=>{\n if(handled)return;raw+=String(chunk);if(raw.length>8192){socket.destroy();return;}if(!raw.includes('\\n'))return;handled=true;\n void (async()=>{\n let nonce='';try{\n const envelope=JSON.parse(raw) as {body:string;proof:string};\n if(typeof envelope.body!=='string'||!equal(envelope.proof,signature(owner.token,envelope.body)))throw Error('CONTROL_DENIED');\n const req=JSON.parse(envelope.body) as {method:string;revision:string|null;runId:string;nonce:string};nonce=req.nonce;\n if(req.runId!==owner.runId||! /^[a-f0-9]{48}$/.test(nonce))throw Error('CONTROL_DENIED');\n if(req.method==='stop')await serialize(shutdown);\n else if(req.method==='apply')await serialize(()=>apply(req.revision));\n else if(req.method!=='status')throw Error('CONTROL_INVALID_METHOD');\n const body=JSON.stringify({state});socket.end(JSON.stringify({body,proof:signature(owner.token,nonce+body)})+'\\n');\n }catch(error){const body=JSON.stringify({state,error:(error as Error).message});socket.end(JSON.stringify({body,proof:signature(owner.token,nonce+body)})+'\\n');}\n })();\n });\n });\n await new Promise<void>((resolve,reject)=>{server!.once('error',reject);server!.listen(p.socket,()=>resolve());});\n portLease=await acquireControl(initial.config.port,{launcher:owner.launcher});\n portLease.onStop(async()=>{void serialize(shutdown);return 'STOPPED';});\n await serialize(()=>startWorker(active(initial),portLease!));\n if(!options.json)process.stderr.write(`\\n${instance.name}: http://127.0.0.1:${state.port}/mcp\\nConfig: ${instance.source.path}\\nCtrl+C stops this instance.\\n`);\n await finished;\n }catch(error){state.phase='error';state.problem=(error as Error).message;throw error;}finally{\n if(parentTimer)clearInterval(parentTimer);process.off('SIGTERM',signal);process.off('SIGINT',signal);\n await stopWorker();await portLease?.release();\n if(server)await new Promise<void>(resolve=>server!.close(()=>resolve()));\n await atomicPrivate(path.join(instancePaths(instance,home).snapshots,'last-runtime.json'),JSON.stringify(state));\n const current=await ownerFor(instance);if(current?.runId===owner.runId)await rm(p.root,{recursive:true,force:true});\n }\n}\n"]}
1
+ {"version":3,"file":"instance-runtime.js","sourceRoot":"","sources":["../../src/instance-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import {createHash,createHmac,randomBytes,timingSafeEqual} from 'node:crypto';\nimport {createServer,createConnection,type Server} from 'node:net';\nimport {fork,type ChildProcess} from 'node:child_process';\nimport {mkdir,rm,readFile,open,lstat} from 'node:fs/promises';\nimport {fileURLToPath} from 'node:url';\nimport path from 'node:path';\nimport {homedir} from 'node:os';\nimport {z} from 'zod';\nimport {controlRoot,createPrivateDirectory,childEnvKeys,windows} from './platform.js';\nimport {acquireControl} from './global-core-control.js';\nimport {runtimeIdentity} from './runtime-identity.js';\nimport {atomicPrivate,changeRegistry,availablePort,ensureAccessReady,exists,instanceEnv,instancePaths,loadInstanceConfig,prepareUpstreams,readTrusted,resolveInstance,type Instance,type InstanceConfig} from './instance-store.js';\n\nconst metadataSchema=z.object({instanceId:z.string().uuid(),runId:z.string().regex(/^[a-f0-9]{32}$/),pid:z.number().int().min(2),token:z.string().regex(/^[a-f0-9]{64}$/),launcher:z.enum(['cli','app']),appParentPid:z.number().int().nullable()}).strict();\ntype Owner=z.infer<typeof metadataSchema>;\nexport type ActiveConfig={config:InstanceConfig;revision:string;effectiveRevision:string;sourcePath:string};\nexport type RuntimeState={instanceId:string;runId:string;pid:number;launcher:'cli'|'app';appParentPid:number|null;executionMode?:'foreground'|'background';\n phase:'starting'|'running'|'stopping'|'stopped'|'error';port:number|null;active:ActiveConfig|null;problem:string|null;coreProgram:string;buildVersion:string};\nfunction runtimePaths(id:string){\n const root=path.join(controlRoot(),'i-'+id);const socket=windows?'\\\\\\\\.\\\\pipe\\\\gateway-instance-'+createHash('sha256').update(root).digest('hex').slice(0,28):path.join(root,'control.sock');\n return {root,socket,meta:path.join(root,'owner.json')};\n}\nconst signature=(key:string,message:string)=>createHmac('sha256',key).update(message).digest('hex');\nfunction equal(a:unknown,b:string){return typeof a==='string'&&a.length===b.length&&timingSafeEqual(Buffer.from(a),Buffer.from(b));}\nfunction alive(pid:number){try{process.kill(pid,0);return true;}catch(e){return (e as NodeJS.ErrnoException).code!=='ESRCH';}}\nasync function ownerFor(instance:Instance){\n const p=runtimePaths(instance.id);if(!await exists(p.root))return null;\n const owner=metadataSchema.parse(JSON.parse(await readTrusted(p.meta)) as unknown);\n if(owner.instanceId!==instance.id)throw Error('INSTANCE_CONTROL_IDENTITY_INVALID');return owner;\n}\nexport async function instanceRequest(instance:Instance,method:'status'|'stop'|'apply',revision?:string):Promise<RuntimeState|null>{\n const owner=await ownerFor(instance);if(!owner||!alive(owner.pid))return null;\n const nonce=randomBytes(24).toString('hex');const body=JSON.stringify({method,revision:revision??null,runId:owner.runId,nonce});\n return new Promise((resolve,reject)=>{\n const socket=createConnection(runtimePaths(instance.id).socket);let raw='';\n socket.setTimeout(method==='status'?2000:65000,()=>socket.destroy(Error('INSTANCE_CONTROL_TIMEOUT')));\n socket.on('error',reject);socket.on('connect',()=>socket.end(JSON.stringify({body,proof:signature(owner.token,body)})+'\\n'));\n socket.on('data',data=>{raw+=String(data);if(raw.length>524288)socket.destroy(Error('INSTANCE_CONTROL_REPLY_TOO_LARGE'));});\n socket.on('end',()=>{try{\n const reply=JSON.parse(raw) as {body:string;proof:string};\n if(!equal(reply.proof,signature(owner.token,nonce+reply.body)))throw Error('INSTANCE_CONTROL_REPLY_UNTRUSTED');\n const data=JSON.parse(reply.body) as {state:RuntimeState;error?:string};\n if(data.error)throw Error(data.error);\n if(data.state.instanceId!==instance.id||data.state.runId!==owner.runId)throw Error('INSTANCE_CONTROL_IDENTITY_CHANGED');\n resolve(data.state);\n }catch(e){reject(e);}});\n });\n}\nexport async function instanceStatus(instance:Instance,home=homedir()){\n let runtime:RuntimeState|null=null;let runtimeProblem:string|null=null;\n try{runtime=await instanceRequest(instance,'status');}catch(e){runtimeProblem=(e as Error).message;}\n let saved:Awaited<ReturnType<typeof loadInstanceConfig>>|null=null;let configProblem:string|null=null;\n try{saved=await loadInstanceConfig(instance);}catch(e){configProblem=(e as Error).message;}\n let lastRuntime:RuntimeState|null=null;\n if(!runtime)try{lastRuntime=JSON.parse(await readTrusted(path.join(instancePaths(instance,home).snapshots,'last-runtime.json'))) as RuntimeState;}catch{}\n if(!runtime&&lastRuntime?.problem)runtimeProblem??=lastRuntime.problem;\n let health='not-running';let accessMode:string|null=null;let lastToolCallAt:string|null=null;\n if(runtime?.phase==='running'&&runtime.port){\n try{\n const response=await fetch(`http://127.0.0.1:${runtime.port}/healthz`,{signal:AbortSignal.timeout(1500)});\n const data=await response.json() as {status?:string;instanceId?:string;accessMode?:string};\n health=response.ok&&data.status==='ok'&&data.instanceId===instance.id?'ok':'unrecognized';accessMode=data.accessMode??null;\n const activity=await fetch(`http://127.0.0.1:${runtime.port}/activity.json`,{signal:AbortSignal.timeout(1000)}).then(r=>r.json()) as {lastToolCallAt?:string};\n lastToolCallAt=typeof activity.lastToolCallAt==='string'?activity.lastToolCallAt:null;\n }catch{health='unreachable';}\n }\n let active=runtime?.active??null;\n if(!active)try{active=JSON.parse(await readTrusted(path.join(instancePaths(instance,home).snapshots,'active.json'))) as ActiveConfig;}catch{}\n const configState=configProblem?(configProblem.includes('ENOENT')?'missing':'invalid'):runtime?.phase==='running'?(saved?.effectiveRevision===active?.effectiveRevision?'applied':'pending'):'on-next-start';\n return {schemaVersion:1,event:'GATEWAY_STATUS',instanceId:instance.id,name:instance.name,archived:instance.archived,source:instance.source,\n phase:runtime?.phase??(runtimeProblem?'error':'stopped'),configState,configProblem,runtimeProblem,runtime,\n port:runtime?.port??saved?.config.port??null,configuredPort:saved?.config.port??null,active,revision:saved?.revision??null,\n health,accessMode,lastToolCallAt,profile:instance.legacy??'setup',installed:false,registered:false,\n label:instance.name,workspaceMode:runtime?.active?.config.mode??saved?.config.mode??null,\n writeScope:runtime?.active?.config.writeScope??saved?.config.writeScope??null,coreControl:runtime?.phase==='running'?'RUNNING':'unavailable',\n coreLauncher:runtime?.launcher??'unknown',coreOwnerPid:runtime?.pid??null,listenerPid:runtime?.pid??null,\n executionMode:runtime?.phase==='running'?(runtime.executionMode==='background'?'background':'foreground-owned'):'stopped',loginAutostart:'disabled',\n connectionState:health==='ok'?(lastToolCallAt?'local-ready-activity-recorded':'local-ready-remote-unverified'):health,requiredAccess:instance.requiredAccess};\n}\nexport async function runInstance(instance:Instance,options:{home?:string;appParentPid?:number;json?:boolean;background?:boolean;workerModule?:URL;onReady?:()=>Promise<void>}={}){\n const home=options.home??homedir();const parent=options.appParentPid;\n if(parent!==undefined&&(!Number.isSafeInteger(parent)||parent<2||process.ppid!==parent))throw Error('APP_PARENT_IDENTITY_MISMATCH');\n if(instance.archived)throw Error('INSTANCE_ARCHIVED');\n const initial=await loadInstanceConfig(instance);await ensureAccessReady(await resolveInstance(instance.id,home),home);\n const p=runtimePaths(instance.id);createPrivateDirectory(controlRoot());\n const owner:Owner={instanceId:instance.id,runId:randomBytes(16).toString('hex'),pid:process.pid,token:randomBytes(32).toString('hex'),launcher:parent?'app':'cli',appParentPid:parent??null};\n await changeRegistry(async registry=>{\n const registered=registry.instances.find(i=>i.id===instance.id);\n if(!registered||registered.archived)throw Error('INSTANCE_ARCHIVED_OR_REMOVED');\n try{await mkdir(p.root,{mode:0o700});}catch(e){\n if((e as NodeJS.ErrnoException).code!=='EEXIST')throw e;\n const old=await ownerFor(instance);if(!old||alive(old.pid))throw Error('INSTANCE_ALREADY_RUNNING_OR_CONTROL_BUSY');\n // Serialise stale recovery independently; never remove a live owner's lease.\n const recovery=p.root+'.recovery';await mkdir(recovery,{mode:0o700});\n try{const check=await ownerFor(instance);if(!check||check.runId!==old.runId||alive(check.pid))throw Error('INSTANCE_CONTROL_CHANGED');\n await rm(p.root,{recursive:true});await mkdir(p.root,{mode:0o700});\n }finally{await rm(recovery,{recursive:true,force:true});}\n }\n await atomicPrivate(p.meta,JSON.stringify(owner));\n },home);\n const identity=await runtimeIdentity();\n const state:RuntimeState={instanceId:instance.id,runId:owner.runId,pid:process.pid,launcher:owner.launcher,appParentPid:parent??null,executionMode:options.background?'background':'foreground',phase:'starting',port:null,active:null,problem:null,...identity};\n let worker:ChildProcess|null=null;let portLease:Awaited<ReturnType<typeof acquireControl>>|null=null;let server:Server|null=null;\n let ending=false;let expectedWorkerExit=false;let sequence:Promise<unknown>=Promise.resolve();\n let finish!:()=>void;const finished=new Promise<void>(r=>{finish=r;});\n const serialize=<T>(fn:()=>Promise<T>):Promise<T>=>{const next=sequence.then(fn);sequence=next.catch(()=>{});return next;};\n function emit(event:string){\n if(options.json||!options.onReady)process.stdout.write(JSON.stringify({event,...state})+'\\n');\n else if(event==='INSTANCE_ERROR'||event==='INSTANCE_APPLY_FAILED')process.stderr.write(`\\n${instance.name}: ${state.problem}\\nInspect logs: starmux logs -i ${instance.id}\\n`);\n else if(event==='INSTANCE_STOPPED')process.stdout.write(`\\nStopped ${instance.name}.\\n`);\n }\n async function stopWorker(){\n const child=worker;if(!child)return;expectedWorkerExit=true;\n await new Promise<void>(resolve=>{\n if(child.exitCode!==null||child.signalCode!==null){resolve();return;}\n let forced=false;\n const timer=setTimeout(()=>{forced=true;child.kill('SIGKILL');},8000);\n child.once('exit',()=>{clearTimeout(timer);if(forced)state.problem='WORKER_STOP_FORCED';resolve();});\n if(child.connected)child.send({type:'gateway-stop'});else child.kill('SIGTERM');\n });worker=null;expectedWorkerExit=false;\n }\n async function shutdown(reason?:string){\n if(ending)return;ending=true;state.problem=reason??null;state.phase='stopping';await stopWorker();\n await portLease?.release();portLease=null;state.phase='stopped';state.port=null;emit('INSTANCE_STOPPED');finish();\n }\n async function startWorker(config:ActiveConfig,lease:Awaited<ReturnType<typeof acquireControl>>){\n await ensureAccessReady(await resolveInstance(instance.id,home),home);\n if(!await availablePort(config.config.port))throw Error('PORT_IN_USE: '+config.config.port);\n const env:NodeJS.ProcessEnv={};for(const key of childEnvKeys)if(process.env[key])env[key]=process.env[key]!;\n Object.assign(env,instanceEnv(instance,config.config,home),{MAC_MCP_INTERNAL_SETUP_OWNER_PID:String(process.pid),MAC_MCP_INTERNAL_SETUP_RUN_ID:lease.owner.runId,MAC_MCP_INTERNAL_SETUP_TOKEN:lease.owner.token});\n const upstreamFile=await prepareUpstreams(instance,config.config,home);if(upstreamFile)env.MAC_MCP_UPSTREAMS_FILE=upstreamFile;\n const log=path.join(instancePaths(instance,home).logs,'core.log');\n if(await exists(log))await readTrusted(log,true,32*1024*1024);\n const output=await open(log,'a',0o600);\n const child=fork(fileURLToPath(options.workerModule??new URL('./instance-worker.js',import.meta.url)),[],{env,stdio:['ignore',output.fd,output.fd,'ipc']});worker=child;await output.close();\n await new Promise<void>((resolve,reject)=>{\n const timer=setTimeout(()=>reject(Error('INSTANCE_START_TIMEOUT')),20000);\n const ready=(message:unknown)=>{if(message&&typeof message==='object'&&'type' in message&&message.type==='gateway-ready'){clearTimeout(timer);child.off('exit',failed);child.off('error',failed);child.off('message',ready);resolve();}};\n const failed=()=>{clearTimeout(timer);child.off('message',ready);reject(Error('INSTANCE_START_FAILED: inspect instance logs'));};\n child.once('error',failed);child.once('exit',failed);child.on('message',ready);\n });\n state.active=config;state.port=config.config.port;state.phase='running';lease.markRunning();\n await atomicPrivate(path.join(instancePaths(instance,home).snapshots,'active.json'),JSON.stringify(config,null,2));\n child.once('exit',()=>{if(!expectedWorkerExit&&!ending){state.phase='error';state.problem='INSTANCE_WORKER_EXITED';emit('INSTANCE_ERROR');void serialize(()=>shutdown('INSTANCE_WORKER_EXITED'));}});\n emit('INSTANCE_RUNNING');\n }\n const active=(loaded:typeof initial):ActiveConfig=>({config:loaded.config,revision:loaded.revision,effectiveRevision:loaded.effectiveRevision,sourcePath:loaded.source.path});\n async function apply(revision:string|null){\n if(ending)throw Error('INSTANCE_STOPPING');\n const current=await resolveInstance(instance.id,home);const next=await loadInstanceConfig(current);\n if(!revision||next.revision!==revision)throw Error('CONFIG_CONFLICT: configuration changed before apply');\n await ensureAccessReady(await resolveInstance(instance.id,home),home);await prepareUpstreams(instance,next.config,home);\n const previous=state.active;if(!previous||!portLease)throw Error('INSTANCE_NOT_RUNNING');\n const oldLease=portLease;let candidateLease=oldLease;\n if(next.config.port!==previous.config.port){\n if(!await availablePort(next.config.port))throw Error('PORT_IN_USE: '+next.config.port);\n candidateLease=await acquireControl(next.config.port,{launcher:owner.launcher});candidateLease.onStop(async()=>{void serialize(shutdown);return 'STOPPED';});\n }\n state.phase='starting';await stopWorker();state.problem=null;\n try{\n await startWorker(active(next),candidateLease);portLease=candidateLease;\n if(candidateLease!==oldLease)await oldLease.release();\n }catch(error){\n await stopWorker();if(candidateLease!==oldLease)await candidateLease.release();portLease=oldLease;\n state.problem='APPLY_FAILED_RESTORED: '+(error as Error).message;\n try{await startWorker(previous,oldLease);}catch{\n await stopWorker();state.phase='error';state.problem='APPLY_AND_RESTORE_FAILED: inspect instance logs';\n }\n emit('INSTANCE_APPLY_FAILED');throw Error(state.problem!);\n }\n }\n const signal=()=>{void serialize(shutdown);};\n const parentTimer=parent?setInterval(()=>{if(process.ppid!==parent)signal();},400):null;\n parentTimer?.unref();process.on('SIGTERM',signal);process.on('SIGINT',signal);\n try{\n server=createServer({allowHalfOpen:true},socket=>{\n socket.setTimeout(65000,()=>socket.destroy());let raw='';let handled=false;\n socket.on('error',()=>{});socket.on('data',chunk=>{\n if(handled)return;raw+=String(chunk);if(raw.length>8192){socket.destroy();return;}if(!raw.includes('\\n'))return;handled=true;\n void (async()=>{\n let nonce='';try{\n const envelope=JSON.parse(raw) as {body:string;proof:string};\n if(typeof envelope.body!=='string'||!equal(envelope.proof,signature(owner.token,envelope.body)))throw Error('CONTROL_DENIED');\n const req=JSON.parse(envelope.body) as {method:string;revision:string|null;runId:string;nonce:string};nonce=req.nonce;\n if(req.runId!==owner.runId||! /^[a-f0-9]{48}$/.test(nonce))throw Error('CONTROL_DENIED');\n if(req.method==='stop')await serialize(shutdown);\n else if(req.method==='apply')await serialize(()=>apply(req.revision));\n else if(req.method!=='status')throw Error('CONTROL_INVALID_METHOD');\n const body=JSON.stringify({state});socket.end(JSON.stringify({body,proof:signature(owner.token,nonce+body)})+'\\n');\n }catch(error){const body=JSON.stringify({state,error:(error as Error).message});socket.end(JSON.stringify({body,proof:signature(owner.token,nonce+body)})+'\\n');}\n })();\n });\n });\n await new Promise<void>((resolve,reject)=>{server!.once('error',reject);server!.listen(p.socket,()=>resolve());});\n portLease=await acquireControl(initial.config.port,{launcher:owner.launcher});\n portLease.onStop(async()=>{void serialize(shutdown);return 'STOPPED';});\n await serialize(()=>startWorker(active(initial),portLease!));\n if(options.onReady)await options.onReady();\n else if(!options.json)process.stderr.write(`\\n${instance.name}: http://127.0.0.1:${state.port}/mcp\\nConfig: ${instance.source.path}\\nCtrl+C stops this instance.\\n`);\n await finished;\n }catch(error){state.phase='error';state.problem=(error as Error).message;throw error;}finally{\n if(parentTimer)clearInterval(parentTimer);process.off('SIGTERM',signal);process.off('SIGINT',signal);\n await stopWorker();await portLease?.release();\n if(server)await new Promise<void>(resolve=>server!.close(()=>resolve()));\n await atomicPrivate(path.join(instancePaths(instance,home).snapshots,'last-runtime.json'),JSON.stringify(state));\n const current=await ownerFor(instance);if(current?.runId===owner.runId)await rm(p.root,{recursive:true,force:true});\n }\n}\n"]}
@@ -105,7 +105,9 @@ export async function resolveInstance(selector, home = homedir(), includeArchive
105
105
  const rows = registry.instances.filter(i => includeArchived || !i.archived);
106
106
  const result = selector ? rows.find(i => i.id === selector || i.name === selector) : rows.find(i => i.id === registry.defaultInstanceId) ?? (rows.length === 1 ? rows[0] : undefined);
107
107
  if (!result)
108
- throw Error(selector ? 'INSTANCE_NOT_FOUND: ' + selector : 'INSTANCE_REQUIRED: use --instance NAME or instance default NAME');
108
+ throw Error(selector ? 'INSTANCE_NOT_FOUND: ' + selector : registry.instances.length
109
+ ? 'INSTANCE_REQUIRED: select an instance with -i NAME or set a default with starmux config default NAME'
110
+ : 'INSTANCE_REQUIRED: no instances. Run starmux up in your project.');
109
111
  return result;
110
112
  }
111
113
  export function parseConfig(text) {
@@ -1 +1 @@
1
- {"version":3,"file":"instance-store.js","sourceRoot":"","sources":["../../src/instance-store.ts"],"names":[],"mappings":"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","sourcesContent":["import {withPrivateLock as withLock} from './private-store-lock.js';\nexport {withPrivateLock as withLock} from './private-store-lock.js';\nimport {randomUUID,createHash} from 'node:crypto';\nimport {lstat,readFile,writeFile,rename,rm,mkdir,realpath} from 'node:fs/promises';\nimport {homedir} from 'node:os';\nimport path from 'node:path';\nimport {createServer} from 'node:net';\nimport {parse,modify,applyEdits,printParseErrorCode,type ParseError} from 'jsonc-parser';\nimport {z} from 'zod';\nimport {zodToJsonSchema} from 'zod-to-json-schema';\nimport {validateConfiguredUpstreams} from './configured-mcp-upstreams.js';\nimport {createPrivateDirectory,ownedByUser} from './platform.js';\nimport {checkSetupValues,setupRuntimeEnv} from './release1-onboarding.js';\nimport {createAccessControl} from './access-control.js';\n\nconst nameSchema=z.string().trim().min(1).max(80).regex(/^[^\\x00-\\x1f\\x7f/\\\\]+$/);\nconst sourceSchema=z.object({kind:z.enum(['managed','linked']),path:z.string()}).strict();\nexport const instanceSchema=z.object({id:z.string().uuid(),name:nameSchema,source:sourceSchema,archived:z.boolean().default(false),\n requiredAccess:z.enum(['ingress','api-key','oauth']).default('ingress'),legacy:z.enum(['setup','live']).optional()}).strict();\nexport const registrySchema=z.object({schemaVersion:z.literal(1),defaultInstanceId:z.string().uuid().nullable(),instances:z.array(instanceSchema)}).strict();\nexport type Instance=z.infer<typeof instanceSchema>;\ntype Registry=z.infer<typeof registrySchema>;\nconst upstream=z.object({id:z.string().regex(/^[a-z][a-z0-9_-]{0,39}$/),transport:z.literal('stdio'),command:z.string().min(1),args:z.array(z.string()),\n allowTools:z.array(z.string()),envRefs:z.record(z.string().regex(/^[A-Za-z][A-Za-z0-9_-]{0,79}$/)).default({})}).strict();\nexport const instanceConfigSchema=z.object({$schema:z.string().optional(),schemaVersion:z.literal(1),projectRoot:z.string(),\n port:z.number().int().min(1024).max(65535),mode:z.enum(['read-only','read-write']).default('read-only'),\n accessRole:z.enum(['restricted','trusted']).default('restricted'),writeScope:z.enum(['home-only','unrestricted']).default('unrestricted'),\n connection:z.enum(['local','https','tunnel']).default('local'),gitMode:z.enum(['off','review','write','push']).default('off'),\n worktreeMode:z.enum(['off','linked']).default('off'),upstreams:z.array(upstream).default([])}).strict();\nexport type InstanceConfig=z.infer<typeof instanceConfigSchema>;\nexport const fingerprint=(value:string)=>createHash('sha256').update(value).digest('hex');\nexport const instancesRoot=(home=homedir())=>path.join(home,'.config','starmux');\nexport function instancePaths(instance:Instance,home=homedir()){\n const root=path.join(instancesRoot(home),'instances',instance.id);\n return {root,config:instance.source.path,state:path.join(root,'state'),logs:path.join(root,'logs'),snapshots:path.join(root,'snapshots'),\n access:path.join(root,'state','access-v1.json'),grants:path.join(root,'state','workspace-grants-v1.json'),deny:path.join(root,'state','deny-rules-v1.json')};\n}\nexport async function exists(file:string){try{await lstat(file);return true;}catch(e){if((e as NodeJS.ErrnoException).code==='ENOENT')return false;throw e;}}\nexport async function readTrusted(file:string,privateFile=true,max=262144){\n if(!path.isAbsolute(file))throw Error('CONFIG_PATH_ABSOLUTE_REQUIRED');\n const stat=await lstat(file);\n if(!stat.isFile()||stat.nlink!==1||!ownedByUser(file,stat,privateFile)||(!privateFile&&process.platform!=='win32'&&(stat.mode&0o022)!==0)||stat.size>max)\n throw Error('CONFIG_FILE_UNSAFE: use an owner-owned regular file; private state requires owner-only permissions');\n // Refuse symlinked ancestors and writable shared source directories as well.\n let parent=path.dirname(file);\n while(true){\n const st=await lstat(parent);\n if(st.isSymbolicLink()||!st.isDirectory())throw Error('CONFIG_DIRECTORY_UNSAFE');\n // Sticky system temporary directories are allowed; other shared writable parents are not.\n if(process.platform!=='win32'&&(st.mode&0o022)!==0&&(st.mode&0o1000)===0)throw Error('CONFIG_DIRECTORY_UNSAFE');\n const next=path.dirname(parent);if(next===parent)break;parent=next;\n }\n return readFile(file,'utf8');\n}\nexport async function atomicPrivate(file:string,text:string){\n createPrivateDirectory(path.dirname(file));\n if(await exists(file))await readTrusted(file);\n const temporary=file+'.'+randomUUID()+'.tmp';\n try{await writeFile(temporary,text,{flag:'wx',mode:0o600});await rename(temporary,file);}finally{await rm(temporary,{force:true});}\n}\nexport async function readRegistry(home=homedir()):Promise<Registry>{\n const file=path.join(instancesRoot(home),'registry.json');\n if(!await exists(file))return {schemaVersion:1,defaultInstanceId:null,instances:[]};\n const registry=registrySchema.parse(JSON.parse(await readTrusted(file)) as unknown);\n if(new Set(registry.instances.map(i=>i.id)).size!==registry.instances.length||new Set(registry.instances.map(i=>i.name)).size!==registry.instances.length)\n throw Error('REGISTRY_DUPLICATE_INSTANCE');\n for(const i of registry.instances){\n if(!path.isAbsolute(i.source.path))throw Error('REGISTRY_SOURCE_INVALID');\n if(i.source.kind==='managed'&&i.source.path!==path.join(instancesRoot(home),'instances',i.id,'config.jsonc'))throw Error('REGISTRY_SOURCE_INVALID');\n }\n return registry;\n}\nexport async function changeRegistry<T>(action:(registry:Registry)=>Promise<T>,home=homedir()){\n const root=instancesRoot(home);createPrivateDirectory(root);\n return withLock(path.join(root,'.registry-lock'),async()=>{\n const registry=await readRegistry(home);const result=await action(registry);\n await atomicPrivate(path.join(root,'registry.json'),JSON.stringify(registrySchema.parse(registry),null,2)+'\\n');return result;\n });\n}\nexport async function resolveInstance(selector?:string,home=homedir(),includeArchived=false){\n const registry=await readRegistry(home);const rows=registry.instances.filter(i=>includeArchived||!i.archived);\n const result=selector?rows.find(i=>i.id===selector||i.name===selector):rows.find(i=>i.id===registry.defaultInstanceId)??(rows.length===1?rows[0]:undefined);\n if(!result)throw Error(selector?'INSTANCE_NOT_FOUND: '+selector:'INSTANCE_REQUIRED: use --instance NAME or instance default NAME');\n return result;\n}\nexport function parseConfig(text:string):InstanceConfig{\n const errors:ParseError[]=[];let value:unknown=parse(text,errors,{allowTrailingComma:true});\n if(errors.length){const e=errors[0]!;const prefix=text.slice(0,e.offset);throw Error(`CONFIG_JSON_INVALID line ${prefix.split('\\n').length}, column ${e.offset-(prefix.lastIndexOf('\\n')+1)+1}: ${printParseErrorCode(e.error)}`);}\n // Import the three historical onboarding formats without changing their authority.\n if(value&&typeof value==='object'&&'version' in value){\n const legacy=value as Record<string,unknown>;\n if(![1,2,3].includes(Number(legacy.version)))throw Error('CONFIG_VERSION_UNSUPPORTED');\n const allowed=new Set(['version','projectRoot','mode','connection','port','accessRole','writeScope']);\n if(Object.keys(legacy).some(k=>!allowed.has(k)))throw Error('CONFIG_UNKNOWN_LEGACY_FIELD');\n value={schemaVersion:1,projectRoot:legacy.projectRoot,mode:legacy.mode,connection:legacy.connection,port:legacy.port,\n accessRole:legacy.version===1?'restricted':legacy.accessRole,writeScope:legacy.version===3?'home-only':'unrestricted'};\n }\n const result=instanceConfigSchema.safeParse(value);\n if(!result.success)throw Error('CONFIG_INVALID: '+result.error.issues.map(i=>`${i.path.join('.')||'config'}: ${i.message}`).join('; '));\n return result.data;\n}\nexport async function validateConfig(config:InstanceConfig){\n const {accessRole,writeScope}=config;\n if(writeScope==='home-only'&&(accessRole!=='trusted'||config.upstreams.length||config.gitMode!=='off'))\n throw Error('CONFIG_INVALID writeScope: home-only requires trusted mode without extra upstreams or Gateway Git');\n const legacy={projectRoot:config.projectRoot,mode:config.mode,port:config.port,connection:config.connection==='local'?'https':config.connection};\n await checkSetupValues(accessRole==='restricted'&&config.mode==='read-write'?{...legacy,version:1}:writeScope==='home-only'?{...legacy,version:3,accessRole,writeScope}:{...legacy,version:2,accessRole});\n validateConfiguredUpstreams({version:1,upstreams:config.upstreams.map(({envRefs,...u})=>({...u,env:Object.fromEntries(Object.keys(envRefs).map(k=>[k,'reference']))}))});\n return config;\n}\nexport const sourceRevision=(file:string,text:string)=>fingerprint(file+'\\0'+text);\nexport function configJSONSchema(){return zodToJsonSchema(instanceConfigSchema,{name:'GatewayInstance'});}\nexport async function loadInstanceConfig(instance:Instance){\n const text=await readTrusted(instance.source.path,instance.source.kind==='managed');\n const config=await validateConfig(parseConfig(text));\n return {text,config,revision:sourceRevision(instance.source.path,text),effectiveRevision:fingerprint(JSON.stringify({...config,$schema:undefined})),source:instance.source};\n}\nexport async function availablePort(port:number){\n return new Promise<boolean>(resolve=>{const server=createServer();server.once('error',()=>resolve(false));server.listen(port,'127.0.0.1',()=>server.close(()=>resolve(true)));});\n}\nexport async function suggestPort(home=homedir()){\n const used=new Set<number>();\n for(const instance of (await readRegistry(home)).instances){if(!instance.archived)try{used.add((await loadInstanceConfig(instance)).config.port);}catch{}}\n for(let port=18893;port<19893;port++)if(!used.has(port)&&await availablePort(port))return port;\n throw Error('NO_AVAILABLE_INSTANCE_PORT');\n}\nexport function configTemplate(config:InstanceConfig){return '// Gateway startup settings. Save, then apply to restart this instance.\\n// Credentials and grants live in the private instance state directory.\\n'+JSON.stringify(config,null,2)+'\\n';}\nexport async function createInstance(name:string,options:{config?:InstanceConfig;file?:string;link?:boolean;requiredAccess?:Instance['requiredAccess'];legacy?:'setup'|'live'}={},home=homedir()){\n name=nameSchema.parse(name);\n const input=options.file?path.resolve(options.file):undefined;\n if(options.link&&!input)throw Error('LINK_SOURCE_REQUIRED');\n const text=input?await readTrusted(input,false):undefined;\n if(!options.config&&!text)throw Error('INSTANCE_CONFIG_REQUIRED');\n const config=await validateConfig(options.config??parseConfig(text!));\n return changeRegistry(async registry=>{\n if(registry.instances.some(i=>i.name===name))throw Error('INSTANCE_NAME_EXISTS');\n if(input&&options.link&&registry.instances.some(i=>i.source.path===input))throw Error('CONFIG_ALREADY_BOUND');\n const id=randomUUID();const root=path.join(instancesRoot(home),'instances',id);\n const instance=instanceSchema.parse({id,name,archived:false,requiredAccess:options.requiredAccess??'ingress',\n source:{kind:options.link?'linked':'managed',path:options.link?input!:path.join(root,'config.jsonc')},...(options.legacy?{legacy:options.legacy}:{})});\n createPrivateDirectory(path.join(instancesRoot(home),'instances'));createPrivateDirectory(root);\n for(const dir of ['state','logs','snapshots'])createPrivateDirectory(path.join(root,dir));\n try{\n await atomicPrivate(path.join(instancesRoot(home),'gateway.schema.json'),JSON.stringify(configJSONSchema(),null,2)+'\\n');\n if(!options.link){\n const original=text&&!('version' in (parse(text) as object))?text:configTemplate(config);\n await atomicPrivate(instance.source.path,applyEdits(original,modify(original,['$schema'],'../../gateway.schema.json',{formattingOptions:{insertSpaces:true,tabSize:2}})));\n }\n registry.instances.push(instance);if(registry.instances.length===1)registry.defaultInstanceId=id;\n return instance;\n }catch(e){await rm(root,{recursive:true,force:true});throw e;}\n },home);\n}\nexport async function saveInstanceConfig(instance:Instance,text:string,expectedRevision:string,home=homedir()){\n await validateConfig(parseConfig(text));\n const paths=instancePaths(instance,home);\n return withLock(path.join(paths.root,'.config-lock'),async()=>{\n const registered=await resolveInstance(instance.id,home);\n if(registered.source.path!==instance.source.path||registered.source.kind!==instance.source.kind)throw Error('CONFIG_SOURCE_CHANGED: reload before saving');\n const current=await readTrusted(instance.source.path,instance.source.kind==='managed');\n if(sourceRevision(instance.source.path,current)!==expectedRevision)throw Error('CONFIG_CONFLICT: reload and review changes before saving');\n const temporary=instance.source.path+'.'+randomUUID()+'.tmp';\n try{await writeFile(temporary,text,{flag:'wx',mode:0o600});await rename(temporary,instance.source.path);}finally{await rm(temporary,{force:true});}\n return loadInstanceConfig(instance);\n });\n}\nexport async function patchInstanceConfig(instance:Instance,patch:Record<string,unknown>,revision:string,home=homedir()){\n let text=(await loadInstanceConfig(instance)).text;\n for(const [key,value] of Object.entries(patch))text=applyEdits(text,modify(text,[key],value,{formattingOptions:{insertSpaces:true,tabSize:2}}));\n return saveInstanceConfig(instance,text,revision,home);\n}\nexport function instanceEnv(instance:Instance,config:InstanceConfig,home=homedir()):NodeJS.ProcessEnv{\n const legacy={projectRoot:config.projectRoot,mode:config.mode,port:config.port,connection:config.connection==='local'?'https':config.connection,\n ...(config.accessRole==='restricted'&&config.mode==='read-write'?{version:1}:config.writeScope==='home-only'?{version:3,accessRole:config.accessRole,writeScope:'home-only'}:{version:2,accessRole:config.accessRole})};\n const p=instancePaths(instance,home);\n return {...setupRuntimeEnv(legacy),MAC_MCP_ACCESS_FILE:p.access,MAC_MCP_GRANTS_FILE:p.grants,MAC_MCP_DENY_FILE:p.deny,\n MAC_MCP_GIT_MODE:config.gitMode,MAC_MCP_WORKTREE_MODE:config.worktreeMode,MAC_MCP_INSTANCE_ID:instance.id,MAC_MCP_INSTANCE_NAME:instance.name,\n MAC_MCP_PRIVATE_ACTIVITY_OBSERVER:'1'};\n}\nexport async function ensureAccessReady(instance:Instance,home=homedir()){\n const access=await createAccessControl(instancePaths(instance,home).access);const state=await access.snapshot();\n if(instance.requiredAccess!=='ingress'&&state.mode!==instance.requiredAccess)throw Error('INSTANCE_ACCESS_INCOMPLETE: configure '+instance.requiredAccess+' for this instance before starting');\n if(state.mode==='api-key'&&!state.credentials.some(c=>c.status==='active'))throw Error('INSTANCE_ACCESS_INCOMPLETE: create an active API key');\n}\nexport async function prepareUpstreams(instance:Instance,config:InstanceConfig,home=homedir()){\n if(!config.upstreams.length)return undefined;\n const p=instancePaths(instance,home);const secretFile=path.join(p.state,'secrets.json');\n const needsSecrets=config.upstreams.some(u=>Object.keys(u.envRefs).length);\n const secrets=needsSecrets?z.record(z.string()).parse(JSON.parse(await readTrusted(secretFile)) as unknown):{};\n const definitions=config.upstreams.map(({envRefs,...u})=>({...u,env:Object.fromEntries(Object.entries(envRefs).map(([key,ref])=>{\n if(secrets[ref]===undefined)throw Error('INSTANCE_SECRET_MISSING: '+ref);return [key,secrets[ref]];\n }))}));\n const file=path.join(p.state,'resolved-upstreams.json');await atomicPrivate(file,JSON.stringify({version:1,upstreams:definitions}));return file;\n}\n"]}
1
+ {"version":3,"file":"instance-store.js","sourceRoot":"","sources":["../../src/instance-store.ts"],"names":[],"mappings":"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","sourcesContent":["import {withPrivateLock as withLock} from './private-store-lock.js';\nexport {withPrivateLock as withLock} from './private-store-lock.js';\nimport {randomUUID,createHash} from 'node:crypto';\nimport {lstat,readFile,writeFile,rename,rm,mkdir,realpath} from 'node:fs/promises';\nimport {homedir} from 'node:os';\nimport path from 'node:path';\nimport {createServer} from 'node:net';\nimport {parse,modify,applyEdits,printParseErrorCode,type ParseError} from 'jsonc-parser';\nimport {z} from 'zod';\nimport {zodToJsonSchema} from 'zod-to-json-schema';\nimport {validateConfiguredUpstreams} from './configured-mcp-upstreams.js';\nimport {createPrivateDirectory,ownedByUser} from './platform.js';\nimport {checkSetupValues,setupRuntimeEnv} from './release1-onboarding.js';\nimport {createAccessControl} from './access-control.js';\n\nconst nameSchema=z.string().trim().min(1).max(80).regex(/^[^\\x00-\\x1f\\x7f/\\\\]+$/);\nconst sourceSchema=z.object({kind:z.enum(['managed','linked']),path:z.string()}).strict();\nexport const instanceSchema=z.object({id:z.string().uuid(),name:nameSchema,source:sourceSchema,archived:z.boolean().default(false),\n requiredAccess:z.enum(['ingress','api-key','oauth']).default('ingress'),legacy:z.enum(['setup','live']).optional()}).strict();\nexport const registrySchema=z.object({schemaVersion:z.literal(1),defaultInstanceId:z.string().uuid().nullable(),instances:z.array(instanceSchema)}).strict();\nexport type Instance=z.infer<typeof instanceSchema>;\ntype Registry=z.infer<typeof registrySchema>;\nconst upstream=z.object({id:z.string().regex(/^[a-z][a-z0-9_-]{0,39}$/),transport:z.literal('stdio'),command:z.string().min(1),args:z.array(z.string()),\n allowTools:z.array(z.string()),envRefs:z.record(z.string().regex(/^[A-Za-z][A-Za-z0-9_-]{0,79}$/)).default({})}).strict();\nexport const instanceConfigSchema=z.object({$schema:z.string().optional(),schemaVersion:z.literal(1),projectRoot:z.string(),\n port:z.number().int().min(1024).max(65535),mode:z.enum(['read-only','read-write']).default('read-only'),\n accessRole:z.enum(['restricted','trusted']).default('restricted'),writeScope:z.enum(['home-only','unrestricted']).default('unrestricted'),\n connection:z.enum(['local','https','tunnel']).default('local'),gitMode:z.enum(['off','review','write','push']).default('off'),\n worktreeMode:z.enum(['off','linked']).default('off'),upstreams:z.array(upstream).default([])}).strict();\nexport type InstanceConfig=z.infer<typeof instanceConfigSchema>;\nexport const fingerprint=(value:string)=>createHash('sha256').update(value).digest('hex');\nexport const instancesRoot=(home=homedir())=>path.join(home,'.config','starmux');\nexport function instancePaths(instance:Instance,home=homedir()){\n const root=path.join(instancesRoot(home),'instances',instance.id);\n return {root,config:instance.source.path,state:path.join(root,'state'),logs:path.join(root,'logs'),snapshots:path.join(root,'snapshots'),\n access:path.join(root,'state','access-v1.json'),grants:path.join(root,'state','workspace-grants-v1.json'),deny:path.join(root,'state','deny-rules-v1.json')};\n}\nexport async function exists(file:string){try{await lstat(file);return true;}catch(e){if((e as NodeJS.ErrnoException).code==='ENOENT')return false;throw e;}}\nexport async function readTrusted(file:string,privateFile=true,max=262144){\n if(!path.isAbsolute(file))throw Error('CONFIG_PATH_ABSOLUTE_REQUIRED');\n const stat=await lstat(file);\n if(!stat.isFile()||stat.nlink!==1||!ownedByUser(file,stat,privateFile)||(!privateFile&&process.platform!=='win32'&&(stat.mode&0o022)!==0)||stat.size>max)\n throw Error('CONFIG_FILE_UNSAFE: use an owner-owned regular file; private state requires owner-only permissions');\n // Refuse symlinked ancestors and writable shared source directories as well.\n let parent=path.dirname(file);\n while(true){\n const st=await lstat(parent);\n if(st.isSymbolicLink()||!st.isDirectory())throw Error('CONFIG_DIRECTORY_UNSAFE');\n // Sticky system temporary directories are allowed; other shared writable parents are not.\n if(process.platform!=='win32'&&(st.mode&0o022)!==0&&(st.mode&0o1000)===0)throw Error('CONFIG_DIRECTORY_UNSAFE');\n const next=path.dirname(parent);if(next===parent)break;parent=next;\n }\n return readFile(file,'utf8');\n}\nexport async function atomicPrivate(file:string,text:string){\n createPrivateDirectory(path.dirname(file));\n if(await exists(file))await readTrusted(file);\n const temporary=file+'.'+randomUUID()+'.tmp';\n try{await writeFile(temporary,text,{flag:'wx',mode:0o600});await rename(temporary,file);}finally{await rm(temporary,{force:true});}\n}\nexport async function readRegistry(home=homedir()):Promise<Registry>{\n const file=path.join(instancesRoot(home),'registry.json');\n if(!await exists(file))return {schemaVersion:1,defaultInstanceId:null,instances:[]};\n const registry=registrySchema.parse(JSON.parse(await readTrusted(file)) as unknown);\n if(new Set(registry.instances.map(i=>i.id)).size!==registry.instances.length||new Set(registry.instances.map(i=>i.name)).size!==registry.instances.length)\n throw Error('REGISTRY_DUPLICATE_INSTANCE');\n for(const i of registry.instances){\n if(!path.isAbsolute(i.source.path))throw Error('REGISTRY_SOURCE_INVALID');\n if(i.source.kind==='managed'&&i.source.path!==path.join(instancesRoot(home),'instances',i.id,'config.jsonc'))throw Error('REGISTRY_SOURCE_INVALID');\n }\n return registry;\n}\nexport async function changeRegistry<T>(action:(registry:Registry)=>Promise<T>,home=homedir()){\n const root=instancesRoot(home);createPrivateDirectory(root);\n return withLock(path.join(root,'.registry-lock'),async()=>{\n const registry=await readRegistry(home);const result=await action(registry);\n await atomicPrivate(path.join(root,'registry.json'),JSON.stringify(registrySchema.parse(registry),null,2)+'\\n');return result;\n });\n}\nexport async function resolveInstance(selector?:string,home=homedir(),includeArchived=false){\n const registry=await readRegistry(home);const rows=registry.instances.filter(i=>includeArchived||!i.archived);\n const result=selector?rows.find(i=>i.id===selector||i.name===selector):rows.find(i=>i.id===registry.defaultInstanceId)??(rows.length===1?rows[0]:undefined);\n if(!result)throw Error(selector?'INSTANCE_NOT_FOUND: '+selector:registry.instances.length\n ?'INSTANCE_REQUIRED: select an instance with -i NAME or set a default with starmux config default NAME'\n :'INSTANCE_REQUIRED: no instances. Run starmux up in your project.');\n return result;\n}\nexport function parseConfig(text:string):InstanceConfig{\n const errors:ParseError[]=[];let value:unknown=parse(text,errors,{allowTrailingComma:true});\n if(errors.length){const e=errors[0]!;const prefix=text.slice(0,e.offset);throw Error(`CONFIG_JSON_INVALID line ${prefix.split('\\n').length}, column ${e.offset-(prefix.lastIndexOf('\\n')+1)+1}: ${printParseErrorCode(e.error)}`);}\n // Import the three historical onboarding formats without changing their authority.\n if(value&&typeof value==='object'&&'version' in value){\n const legacy=value as Record<string,unknown>;\n if(![1,2,3].includes(Number(legacy.version)))throw Error('CONFIG_VERSION_UNSUPPORTED');\n const allowed=new Set(['version','projectRoot','mode','connection','port','accessRole','writeScope']);\n if(Object.keys(legacy).some(k=>!allowed.has(k)))throw Error('CONFIG_UNKNOWN_LEGACY_FIELD');\n value={schemaVersion:1,projectRoot:legacy.projectRoot,mode:legacy.mode,connection:legacy.connection,port:legacy.port,\n accessRole:legacy.version===1?'restricted':legacy.accessRole,writeScope:legacy.version===3?'home-only':'unrestricted'};\n }\n const result=instanceConfigSchema.safeParse(value);\n if(!result.success)throw Error('CONFIG_INVALID: '+result.error.issues.map(i=>`${i.path.join('.')||'config'}: ${i.message}`).join('; '));\n return result.data;\n}\nexport async function validateConfig(config:InstanceConfig){\n const {accessRole,writeScope}=config;\n if(writeScope==='home-only'&&(accessRole!=='trusted'||config.upstreams.length||config.gitMode!=='off'))\n throw Error('CONFIG_INVALID writeScope: home-only requires trusted mode without extra upstreams or Gateway Git');\n const legacy={projectRoot:config.projectRoot,mode:config.mode,port:config.port,connection:config.connection==='local'?'https':config.connection};\n await checkSetupValues(accessRole==='restricted'&&config.mode==='read-write'?{...legacy,version:1}:writeScope==='home-only'?{...legacy,version:3,accessRole,writeScope}:{...legacy,version:2,accessRole});\n validateConfiguredUpstreams({version:1,upstreams:config.upstreams.map(({envRefs,...u})=>({...u,env:Object.fromEntries(Object.keys(envRefs).map(k=>[k,'reference']))}))});\n return config;\n}\nexport const sourceRevision=(file:string,text:string)=>fingerprint(file+'\\0'+text);\nexport function configJSONSchema(){return zodToJsonSchema(instanceConfigSchema,{name:'GatewayInstance'});}\nexport async function loadInstanceConfig(instance:Instance){\n const text=await readTrusted(instance.source.path,instance.source.kind==='managed');\n const config=await validateConfig(parseConfig(text));\n return {text,config,revision:sourceRevision(instance.source.path,text),effectiveRevision:fingerprint(JSON.stringify({...config,$schema:undefined})),source:instance.source};\n}\nexport async function availablePort(port:number){\n return new Promise<boolean>(resolve=>{const server=createServer();server.once('error',()=>resolve(false));server.listen(port,'127.0.0.1',()=>server.close(()=>resolve(true)));});\n}\nexport async function suggestPort(home=homedir()){\n const used=new Set<number>();\n for(const instance of (await readRegistry(home)).instances){if(!instance.archived)try{used.add((await loadInstanceConfig(instance)).config.port);}catch{}}\n for(let port=18893;port<19893;port++)if(!used.has(port)&&await availablePort(port))return port;\n throw Error('NO_AVAILABLE_INSTANCE_PORT');\n}\nexport function configTemplate(config:InstanceConfig){return '// Gateway startup settings. Save, then apply to restart this instance.\\n// Credentials and grants live in the private instance state directory.\\n'+JSON.stringify(config,null,2)+'\\n';}\nexport async function createInstance(name:string,options:{config?:InstanceConfig;file?:string;link?:boolean;requiredAccess?:Instance['requiredAccess'];legacy?:'setup'|'live'}={},home=homedir()){\n name=nameSchema.parse(name);\n const input=options.file?path.resolve(options.file):undefined;\n if(options.link&&!input)throw Error('LINK_SOURCE_REQUIRED');\n const text=input?await readTrusted(input,false):undefined;\n if(!options.config&&!text)throw Error('INSTANCE_CONFIG_REQUIRED');\n const config=await validateConfig(options.config??parseConfig(text!));\n return changeRegistry(async registry=>{\n if(registry.instances.some(i=>i.name===name))throw Error('INSTANCE_NAME_EXISTS');\n if(input&&options.link&&registry.instances.some(i=>i.source.path===input))throw Error('CONFIG_ALREADY_BOUND');\n const id=randomUUID();const root=path.join(instancesRoot(home),'instances',id);\n const instance=instanceSchema.parse({id,name,archived:false,requiredAccess:options.requiredAccess??'ingress',\n source:{kind:options.link?'linked':'managed',path:options.link?input!:path.join(root,'config.jsonc')},...(options.legacy?{legacy:options.legacy}:{})});\n createPrivateDirectory(path.join(instancesRoot(home),'instances'));createPrivateDirectory(root);\n for(const dir of ['state','logs','snapshots'])createPrivateDirectory(path.join(root,dir));\n try{\n await atomicPrivate(path.join(instancesRoot(home),'gateway.schema.json'),JSON.stringify(configJSONSchema(),null,2)+'\\n');\n if(!options.link){\n const original=text&&!('version' in (parse(text) as object))?text:configTemplate(config);\n await atomicPrivate(instance.source.path,applyEdits(original,modify(original,['$schema'],'../../gateway.schema.json',{formattingOptions:{insertSpaces:true,tabSize:2}})));\n }\n registry.instances.push(instance);if(registry.instances.length===1)registry.defaultInstanceId=id;\n return instance;\n }catch(e){await rm(root,{recursive:true,force:true});throw e;}\n },home);\n}\nexport async function saveInstanceConfig(instance:Instance,text:string,expectedRevision:string,home=homedir()){\n await validateConfig(parseConfig(text));\n const paths=instancePaths(instance,home);\n return withLock(path.join(paths.root,'.config-lock'),async()=>{\n const registered=await resolveInstance(instance.id,home);\n if(registered.source.path!==instance.source.path||registered.source.kind!==instance.source.kind)throw Error('CONFIG_SOURCE_CHANGED: reload before saving');\n const current=await readTrusted(instance.source.path,instance.source.kind==='managed');\n if(sourceRevision(instance.source.path,current)!==expectedRevision)throw Error('CONFIG_CONFLICT: reload and review changes before saving');\n const temporary=instance.source.path+'.'+randomUUID()+'.tmp';\n try{await writeFile(temporary,text,{flag:'wx',mode:0o600});await rename(temporary,instance.source.path);}finally{await rm(temporary,{force:true});}\n return loadInstanceConfig(instance);\n });\n}\nexport async function patchInstanceConfig(instance:Instance,patch:Record<string,unknown>,revision:string,home=homedir()){\n let text=(await loadInstanceConfig(instance)).text;\n for(const [key,value] of Object.entries(patch))text=applyEdits(text,modify(text,[key],value,{formattingOptions:{insertSpaces:true,tabSize:2}}));\n return saveInstanceConfig(instance,text,revision,home);\n}\nexport function instanceEnv(instance:Instance,config:InstanceConfig,home=homedir()):NodeJS.ProcessEnv{\n const legacy={projectRoot:config.projectRoot,mode:config.mode,port:config.port,connection:config.connection==='local'?'https':config.connection,\n ...(config.accessRole==='restricted'&&config.mode==='read-write'?{version:1}:config.writeScope==='home-only'?{version:3,accessRole:config.accessRole,writeScope:'home-only'}:{version:2,accessRole:config.accessRole})};\n const p=instancePaths(instance,home);\n return {...setupRuntimeEnv(legacy),MAC_MCP_ACCESS_FILE:p.access,MAC_MCP_GRANTS_FILE:p.grants,MAC_MCP_DENY_FILE:p.deny,\n MAC_MCP_GIT_MODE:config.gitMode,MAC_MCP_WORKTREE_MODE:config.worktreeMode,MAC_MCP_INSTANCE_ID:instance.id,MAC_MCP_INSTANCE_NAME:instance.name,\n MAC_MCP_PRIVATE_ACTIVITY_OBSERVER:'1'};\n}\nexport async function ensureAccessReady(instance:Instance,home=homedir()){\n const access=await createAccessControl(instancePaths(instance,home).access);const state=await access.snapshot();\n if(instance.requiredAccess!=='ingress'&&state.mode!==instance.requiredAccess)throw Error('INSTANCE_ACCESS_INCOMPLETE: configure '+instance.requiredAccess+' for this instance before starting');\n if(state.mode==='api-key'&&!state.credentials.some(c=>c.status==='active'))throw Error('INSTANCE_ACCESS_INCOMPLETE: create an active API key');\n}\nexport async function prepareUpstreams(instance:Instance,config:InstanceConfig,home=homedir()){\n if(!config.upstreams.length)return undefined;\n const p=instancePaths(instance,home);const secretFile=path.join(p.state,'secrets.json');\n const needsSecrets=config.upstreams.some(u=>Object.keys(u.envRefs).length);\n const secrets=needsSecrets?z.record(z.string()).parse(JSON.parse(await readTrusted(secretFile)) as unknown):{};\n const definitions=config.upstreams.map(({envRefs,...u})=>({...u,env:Object.fromEntries(Object.entries(envRefs).map(([key,ref])=>{\n if(secrets[ref]===undefined)throw Error('INSTANCE_SECRET_MISSING: '+ref);return [key,secrets[ref]];\n }))}));\n const file=path.join(p.state,'resolved-upstreams.json');await atomicPrivate(file,JSON.stringify({version:1,upstreams:definitions}));return file;\n}\n"]}
@@ -127,9 +127,9 @@ function phaseLabel(x) {
127
127
  export function renderOperationsHtml(data) {
128
128
  if (data.instance) {
129
129
  const i = data.instance;
130
- return `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${esc(i.name)} · Gateway</title><style>
130
+ return `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${esc(i.name)} · Starmux</title><style>
131
131
  body{font:16px system-ui;background:#f4f6fa;color:#182230;margin:0}main{max-width:850px;margin:50px auto;padding:24px}section{background:white;border:1px solid #dde3eb;border-radius:14px;padding:24px;margin:18px 0}h1{font-size:32px}h2{font-size:18px}small{color:#667085}code{overflow-wrap:anywhere}nav{display:flex;gap:24px;flex-wrap:wrap}a{color:#2459c3}dt{color:#667085;margin-top:16px}dd{margin:5px 0}
132
- </style></head><body><main><small>Mac MCP Gateway · Instance</small><h1>${esc(i.name)}</h1><small>${esc(i.id)}</small>
132
+ </style></head><body><main><small>Starmux · Instance</small><h1>${esc(i.name)}</h1><small>${esc(i.id)}</small>
133
133
  <section><h2>Local Core is running</h2><dl><dt>MCP endpoint</dt><dd><code>http://127.0.0.1:${i.port}/mcp</code></dd><dt>Authentication</dt><dd>${esc(data.accessControl?.mode ?? 'unavailable')}</dd><dt>Capability</dt><dd>${data.nativeAccessEnabled ? 'Trusted native tools' : 'Restricted workspace'}</dd></dl><p>Local health does not verify a remote connection. Configure HTTPS or a protected Tunnel separately.</p></section>
134
134
  <section><h2>Manage this instance</h2><nav><a href="/access">Credentials and OAuth sessions</a>${data.permissionManagementEnabled ? '<a href="/permissions">Workspace permissions</a>' : ''}${data.denyRuleManagementEnabled ? '<a href="/filters">Tool and directory filters</a>' : ''}</nav><p>Use the App or CLI to edit configuration, apply changes, inspect logs or stop this instance.</p></section>
135
135
  <section><h2>Additional upstreams</h2>${(data.configuredUpstreams ?? []).map(u => `<p>${esc(u.id)} · ${esc(u.status)} · ${u.toolCount} tools</p>`).join('') || '<p>No additional upstreams configured.</p>'}</section><small>Owner-local management · <a href="/dashboard.json">JSON status</a></small></main></body></html>`;
@@ -148,7 +148,7 @@ export function renderOperationsHtml(data) {
148
148
  const messages = data.errors.length ? [...data.errors] : [];
149
149
  if (expected.length)
150
150
  messages.push(expected.length + " 个主线服务不在运行");
151
- return `<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta http-equiv="refresh" content="25"><title>Mac MCP Gateway · Operations</title><style>
151
+ return `<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta http-equiv="refresh" content="25"><title>Starmux · Operations</title><style>
152
152
  :root{color-scheme:light;font-family:system-ui,-apple-system,"PingFang SC","Microsoft Yahei",sans-serif}
153
153
  *{box-sizing:border-box}body{margin:0;background:#f4f7fb;color:#142138}
154
154
  main{max-width:1220px;margin:0 auto;padding:34px 25px 64px}
@@ -173,7 +173,7 @@ export function renderOperationsHtml(data) {
173
173
  footer{color:#8291a3;font-size:12px;padding:10px}
174
174
  @media(max-width:950px){.stats{grid-template-columns:repeat(2,1fr)}.grid{grid-template-columns:1fr}}
175
175
  @media(max-width:560px){main{padding:19px 10px}.stats{grid-template-columns:1fr 1fr}th,td{padding:10px 7px}}
176
- </style></head><body><main><header><div><h1>Mac MCP Gateway <span style="color:#4777c6">/ Operations</span></h1><p class="subtitle">运行资产 · 端口占用 · 开发里程碑 · 双入口状态</p></div><div class="time">采样 ${esc(data.capturedAt)}<br>本机只读 · 每 25 秒刷新</div></header>
176
+ </style></head><body><main><header><div><h1>Starmux <span style="color:#4777c6">/ Operations</span></h1><p class="subtitle">运行资产 · 端口占用 · 开发里程碑 · 双入口状态</p></div><div class="time">采样 ${esc(data.capturedAt)}<br>本机只读 · 每 25 秒刷新</div></header>
177
177
  <section class="stats"><div class="stat"><small>当前在线服务</small><strong class="status-good">${active} / ${data.modules.length}</strong></div>
178
178
  <div class="stat"><small>正在监听的项目端口</small><strong>${new Set(livePorts).size}</strong></div>
179
179
  <div class="stat"><small>Private Tunnel 目标</small><strong class="short">${esc(data.tunnelBackend)}</strong></div>
@@ -1 +1 @@
1
- {"version":3,"file":"ops-dashboard.js","sourceRoot":"","sources":["../../src/ops-dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,iEAAiE;AACjE,kFAAkF;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,MAAM,OAAO,GAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAClC,MAAM,IAAI,GAAC,WAAW,CAAC;AACvB,MAAM,IAAI,GAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAE5B,MAAM,CAAC,MAAM,OAAO,GAAC,MAAM,CAAC,MAAM,CAAC;IACjC,EAAC,EAAE,EAAC,WAAW,EAAC,KAAK,EAAC,2BAA2B,EAAC,OAAO,EAAC,mCAAmC,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,qBAAqB,EAAC,SAAS,EAAC,UAAU,EAAC;IAC1K,EAAC,EAAE,EAAC,QAAQ,EAAC,KAAK,EAAC,0BAA0B,EAAC,OAAO,EAAC,wBAAwB,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,sBAAsB,EAAC,SAAS,EAAC,UAAU,EAAC;IAC7J,EAAC,EAAE,EAAC,YAAY,EAAC,KAAK,EAAC,6BAA6B,EAAC,OAAO,EAAC,2BAA2B,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,SAAS,EAAC,IAAI,EAAC,YAAY,EAAC,SAAS,EAAC,UAAU,EAAC;IAC7J,EAAC,EAAE,EAAC,IAAI,EAAC,KAAK,EAAC,2BAA2B,EAAC,OAAO,EAAC,4BAA4B,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,aAAa,EAAC,SAAS,EAAC,UAAU,EAAC;IACpJ,EAAC,EAAE,EAAC,QAAQ,EAAC,KAAK,EAAC,kBAAkB,EAAC,OAAO,EAAC,+BAA+B,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,cAAc,EAAC,SAAS,EAAC,UAAU,EAAC;IACnJ,EAAC,EAAE,EAAC,OAAO,EAAC,KAAK,EAAC,0BAA0B,EAAC,OAAO,EAAC,uBAAuB,EAAC,KAAK,EAAC,CAAC,EAAE,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,qBAAqB,EAAC,SAAS,EAAC,SAAS,EAAC;IAC1J,EAAC,EAAE,EAAC,QAAQ,EAAC,KAAK,EAAC,2BAA2B,EAAC,OAAO,EAAC,2BAA2B,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,UAAU,EAAC,IAAI,EAAC,mCAAmC,EAAC,SAAS,EAAC,MAAM,EAAC;CACxK,CAAC,CAAC;AACH,MAAM,GAAG,GAAC,OAAO,CAAC,GAAG,CAAC;AACtB,KAAK,UAAU,GAAG,CAAC,GAAW,EAAC,IAAc;IAC3C,IAAG,CAAC;QACF,MAAM,CAAC,GAAC,MAAM,OAAO,CAAC,GAAG,EAAC,IAAI,EAAC,EAAC,OAAO,EAAC,IAAI,EAAC,SAAS,EAAC,MAAM,EAAC,GAAG,EAAC,CAAC,CAAC;QACpE,OAAO,EAAC,EAAE,EAAC,IAAI,EAAC,MAAM,EAAC,CAAC,CAAC,MAAM,EAAC,CAAC;IACnC,CAAC;IAAA,OAAM,CAAC,EAAC,CAAC;QAAA,OAAO,EAAC,EAAE,EAAC,KAAK,EAAC,KAAK,EAAC,SAAS,CAAC,CAAC,CAAC,KAAG,WAAW,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,aAAa,EAAC,CAAC;IAAA,CAAC;AACxF,CAAC;AACD,SAAS,QAAQ,CAAC,MAAc;IAC9B,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE,CAAA,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SAClE,MAAM,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,MAAM,IAAE,CAAC,IAAE,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;SAC3D,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,EAAC,GAAG,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAE,EAAE,CAAC,CAAA,CAAC,CAAA,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,IAAI,EAAC,QAAQ,EAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AACD,SAAS,cAAc,CAAC,MAAc;IACpC,MAAM,KAAK,GAAC,IAAI,GAAG,EAAE,CAAC;IACtB,KAAI,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QAC5E,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,SAAS,CAAC,MAAc;IAC/B,MAAM,KAAK,GAAC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,MAAM,KAAK,GAAC,IAAI,GAAG,EAAmB,CAAC;IACvC,KAAI,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,CAAC;QACpC,MAAM,IAAI,GAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACzD,IAAG,CAAC,KAAK;YAAC,SAAS;QACnB,MAAM,IAAI,GAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAC,EAAC,IAAI,EAAC,OAAO,EAAC,KAAK,CAAC,CAAC,CAAE,EAAC,OAAO,EAAC,IAAI,CAAC,CAAC,CAAE;gBACzE,GAAG,EAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAE,EAAE,CAAC,CAAA,CAAC,CAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,IAAI,EAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,YAAY,CAAC,GAAW;IAC/B,8EAA8E;IAC9E,KAAI,MAAM,CAAC,IAAI,EAAC,MAAM,CAAC,IAAI;QACzB,CAAC,yBAAyB,EAAC,0BAA0B,CAAC;QACtD,CAAC,yBAAyB,EAAC,mBAAmB,CAAC;QAC/C,CAAC,qBAAqB,EAAC,yBAAyB,CAAC;QACjD,CAAC,eAAe,EAAC,WAAW,CAAC;KAAC;QAC9B,IAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAC,WAAW,CAAC;YAAC,OAAO,MAAM,CAAC;IAClD,OAAO,+BAA+B,CAAC;AACzC,CAAC;AACD,KAAK,UAAU,UAAU,CAAC,EAAU;IAClC,MAAM,CAAC,GAAC,MAAM,GAAG,CAAC,SAAS,EAAC,CAAC,IAAI,EAAC,EAAE,EAAC,QAAQ,EAAC,gBAAgB,CAAC,CAAC,CAAC;IACjE,MAAM,EAAE,GAAC,MAAM,GAAG,CAAC,SAAS,EAAC,CAAC,IAAI,EAAC,EAAE,EAAC,QAAQ,EAAC,gBAAgB,CAAC,CAAC,CAAC;IAClE,MAAM,CAAC,GAAC,MAAM,GAAG,CAAC,SAAS,EAAC,CAAC,IAAI,EAAC,EAAE,EAAC,WAAW,EAAC,SAAS,EAAC,MAAM,CAAC,CAAC,CAAC;IACpE,OAAO,EAAC,MAAM,EAAC,EAAE,CAAC,EAAE,CAAA,CAAC,CAAA,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA,CAAC,CAAA,aAAa;QACjD,MAAM,EAAC,CAAC,CAAC,EAAE,CAAA,CAAC,CAAA,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA,CAAC,CAAA,aAAa;QACzC,UAAU,EAAC,CAAC,CAAC,EAAE,CAAA,CAAC,CAAA,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA,CAAC,CAAA,IAAI,EAAC,CAAC;AACtE,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,IAAG,OAAO,CAAC,QAAQ,KAAG,QAAQ,IAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;QAAC,OAAO,EAAC,UAAU,EAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAC,IAAI,EAAC,OAAO,CAAC,QAAQ,GAAC,wBAAwB,EAAC,IAAI,EAAC,WAAW,EAAC,aAAa,EAAC,cAAc,EAAC,OAAO,EAAC,EAAE,EAAC,GAAG,EAAC,MAAM,UAAU,CAAC,IAAI,CAAC,EAAC,YAAY,EAAC,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAE,IAAI,CAAC,EAAC,MAAM,EAAC,EAAE,EAAC,UAAU,EAAC,EAAE,EAAC,CAAC;IAC9U,MAAM,GAAG,GAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAC7B,MAAM,CAAC,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,CAAC,GAAC,MAAM,OAAO,CAAC,GAAG,CAAC;QACjE,GAAG,CAAC,gBAAgB,EAAC,CAAC,MAAM,CAAC,CAAC;QAC9B,GAAG,CAAC,gBAAgB,EAAC,CAAC,gBAAgB,EAAC,MAAM,GAAC,GAAG,CAAC,CAAC;QACnD,GAAG,CAAC,gBAAgB,EAAC,CAAC,KAAK,EAAC,OAAO,EAAC,cAAc,CAAC,CAAC;QACpD,GAAG,CAAC,gBAAgB,EAAC,CAAC,OAAO,EAAC,kCAAkC,CAAC,CAAC;QAClE,UAAU,CAAC,IAAI,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAE,GAAG,EAAE,mDAAmD,CAAC,EAAC,MAAM,CAAC;aACvF,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAE,EAAE,CAAA,CAAC,EAAC,EAAE,EAAC,KAAK,EAAC,IAAI,EAAC,EAAE,EAAC,CAAC,CAAC;KAC/D,CAAC,CAAC;IACH,MAAM,MAAM,GAAC,IAAI,CAAC,EAAE,CAAA,CAAC,CAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,IAAI,GAAG,EAAsD,CAAC;IACzG,MAAM,QAAQ,GAAC,QAAQ,CAAC,EAAE,CAAA,CAAC,CAAA,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,IAAI,GAAG,EAAE,CAAC;IACrE,MAAM,KAAK,GAAC,SAAS,CAAC,EAAE,CAAA,CAAC,CAAA,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,IAAI,GAAG,EAAmB,CAAC;IAChF,MAAM,OAAO,GAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE;QAC3B,MAAM,MAAM,GAAC,CAAC,CAAC,EAAE,KAAG,QAAQ,CAAC,CAAC;YAC5B,CAAC,MAAM,CAAC,EAAE,CAAA,CAAC,CAAA,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,SAAS,CAAC,CAAC,CAAC;YACjF,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC;gBACnD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAC,CAAA,UAAU,CAAA,CAAC,CAAA,SAAS,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAgB,EAAE,CAAA,CAAC,KAAG,SAAS,CAAC,CAAC;QACtF,MAAM,KAAK,GAAC,MAAM,KAAG,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAG,CAAC;YACnD,QAAQ,CAAC,MAAM,GAAC,CAAC,CAAC,CAAC;QACrB,OAAO,EAAC,GAAG,CAAC,EAAC,MAAM,EAAC,KAAK,EAAC,GAAG,EAAC,CAAC,CAAC,EAAE,KAAG,QAAQ,CAAA,CAAC;gBAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAE,IAAI,CAAA,CAAC;gBACvD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,IAAE,IAAI,EAAC,SAAS,EAAC,QAAQ,EAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IACH,MAAM,YAAY,GAAC,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAE,IAAI,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAE,CAAC,CAAC,WAAW,EAAC,IAAI,CAAC,EAAC,CAAC,UAAU,EAAC,QAAQ,CAAC;QACrD,CAAC,MAAM,EAAC,SAAS,CAAC,EAAC,CAAC,eAAe,EAAC,MAAM,CAAC,EAAC,CAAC,cAAc,EAAC,KAAK,CAAC,CAAoC;SACrG,MAAM,CAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,EAAE,CAAA,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAC,EAAE,CAAA,IAAI,GAAC,cAAc,CAAC,CAAC;IACpE,OAAO,EAAC,UAAU,EAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAC,IAAI,EAAC,2BAA2B;QAC1E,IAAI,EAAC,WAAW,EAAC,aAAa,EAAC,KAAK,CAAC,EAAE,CAAA,CAAC,CAAA,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA,CAAC,CAAA,SAAS;QAC1E,OAAO,EAAC,GAAG,EAAC,YAAY,EAAC,MAAM;QAC/B,UAAU,EAAC;YACT,EAAC,IAAI,EAAC,sBAAsB,EAAC,MAAM,EAAC,UAAU,EAAC,MAAM,EAAC,oDAAoD,EAAC;YAC3G,EAAC,IAAI,EAAC,yBAAyB,EAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,EAAC,+CAA+C,EAAC;YACvG,EAAC,IAAI,EAAC,yBAAyB,EAAC,MAAM,EAAC,cAAc,EAAC,MAAM,EAAC,wEAAwE,EAAC;YACtI,EAAC,IAAI,EAAC,uBAAuB,EAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,EAAC,yCAAyC,EAAC;SAChG,EAAC,CAAC;AACP,CAAC;AACD,MAAM,GAAG,GAAC,CAAC,CAAU,EAAC,EAAE,CAAA,MAAM,CAAC,CAAC,IAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAC,CAAC,CAAA,EAAE,CAC1D,CAAC,EAAC,GAAG,EAAC,OAAO,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,QAAQ,EAAC,GAAG,EAAC,OAAO,EAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;AACtE,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAQ,EAAC,OAAO,EAAC,KAAK,EAAC,QAAQ,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAA2B,CAAC,CAAC,CAAC,IAAE,CAAC,CAAC;AACtG,CAAC;AACD,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAQ,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,EAAC,IAAI,EAA2B,CAAC,CAAC,CAAC,IAAE,CAAC,CAAC;AAC3G,CAAC;AACD,MAAM,UAAU,oBAAoB,CAAC,IAAqR;IACxT,IAAG,IAAI,CAAC,QAAQ,EAAC,CAAC;QAChB,MAAM,CAAC,GAAC,IAAI,CAAC,QAAQ,CAAC;QACtB,OAAO,wIAAwI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;;gFAE9E,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;mGAChB,CAAC,CAAC,IAAI,8CAA8C,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,IAAE,aAAa,CAAC,+BAA+B,IAAI,CAAC,mBAAmB,CAAA,CAAC,CAAA,sBAAsB,CAAA,CAAC,CAAA,sBAAsB;uGACjM,IAAI,CAAC,2BAA2B,CAAA,CAAC,CAAA,kDAAkD,CAAA,CAAC,CAAA,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAA,CAAC,CAAA,mDAAmD,CAAA,CAAC,CAAA,EAAE;8CACvO,CAAC,IAAI,CAAC,mBAAmB,IAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAE,4CAA4C,kHAAkH,CAAC;IAC5T,CAAC;IACD,MAAM,MAAM,GAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,MAAM,KAAG,SAAS,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,SAAS,GAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,KAAK,KAAG,QAAQ,IAAE,CAAC,CAAC,MAAM,KAAG,SAAS,CAAC,CAAC;IAChF,MAAM,EAAE,GAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,mBAAmB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,sCAAsC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,uCAAuC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,gCAAgC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA,CAAC,CAAA,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,CAAC,CAAA,aAAa,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAA,CAAC,CAAA,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,IAAI,GAAC,SAAS,GAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAC,CAAA,CAAC,CAAC,MAAM,KAAG,SAAS,CAAA,CAAC,CAAA,GAAG,CAAA,CAAC,CAAA,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3d,MAAM,UAAU,GAAC,IAAI,CAAC,mBAAmB,IAAE,EAAE,CAAC;IAC9C,MAAM,YAAY,GAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,kBAAkB,GAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAC,oBAAoB;QACpF,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAC,WAAW,GAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAC,WAAW;QACtD,GAAG,CAAC,CAAC,CAAC,SAAS,IAAE,GAAG,CAAC,GAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAC,UAAU,CAAC,MAAM,CAAA,CAAC;QACpC,mJAAmJ,GAAC,YAAY,GAAC,4BAA4B,CAAA,CAAC,CAAA,EAAE,CAAC;IACnM,MAAM,UAAU,GAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,0BAA0B,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/J,MAAM,QAAQ,GAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,CAAC,CAAA,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,EAAE,CAAC;IACtD,IAAG,QAAQ,CAAC,MAAM;QAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAC,YAAY,CAAC,CAAC;IAC/D,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;kMAyByL,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;8FACxH,MAAM,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM;sDACvE,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI;4EACD,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;kEACjC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,GAAG,CAAC,UAAU,KAAG,IAAI,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,IAAI,CAAC,GAAG,CAAC,UAAU,GAAC,SAAS;qEAC7H,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,YAAY,CAAC,UAAU,KAAG,IAAI,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,IAAI,CAAC,YAAY,CAAC,UAAU,GAAC,SAAS;iKACxE,EAAE;gDACnH,UAAU;IACtD,aAAa;IACb,IAAI,CAAC,yBAAyB,CAAA,CAAC,CAAA,kJAAkJ,CAAA,CAAC,CAAA,EAAE;IACpL,IAAI,CAAC,2BAA2B,CAAA,CAAC,CAAA,0DAA0D;QAC7F,CAAC,IAAI,CAAC,mBAAmB,CAAA,CAAC,CAAA,mFAAmF,CAAA,CAAC,CAAA,mCAAmC,CAAC;QAClJ,qDAAqD,CAAA,CAAC,CAAA,EAAE;IACtD,QAAQ,CAAC,MAAM,CAAA,CAAC,CAAA,0CAA0C,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAA,CAAC,CAAA,EAAE;;4FAEb,CAAC;AAC7F,CAAC;AACD,MAAM,CAAC,MAAM,gBAAgB,GAAC,MAAM,CAAC,MAAM,CAAC;IAC1C,eAAe,EAAC,UAAU,EAAC,wBAAwB,EAAC,SAAS;IAC7D,yBAAyB,EAAC,gIAAgI;CAC3J,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAAC,IAAW,EAAC,IAAqB,EAAC,EAAmB;IAChF,OAAO,EAAE,CAAA,CAAC,CAAA,IAAI,CAAC,OAAO,CAAC,eAAe,EAAC,mGAAmG,GAAG,CAAC,IAAI,IAAE,EAAE,CAAC,sBAAsB,GAAG,CAAC,EAAE,CAAC,sDAAsD,CAAC,CAAA,CAAC,CAAA,IAAI,CAAC;AACnP,CAAC","sourcesContent":["import {gitBinary} from \"./platform.js\";\nimport type { UpstreamStatus } from \"./contracts.js\";\nimport { packageRoot } from \"./runtime-paths.js\";\nimport { errorCode } from \"./validation.js\";\ninterface Listener {port:number;address:string;process:string;pid:number|null}\n// Read-only, loopback-only Mac MCP Gateway operations dashboard.\n// No service control, arbitrary command, file content, credentials or extra port.\nimport { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nconst execute=promisify(execFile);\nconst root=packageRoot;\nconst home=process.env.HOME;\n\nexport const MODULES=Object.freeze([\n {id:\"workspace\",label:\"Project Workspace Gateway\",service:\"ai.home.mac-mcp-project-workspace\",ports:[8793],phase:\"active\",role:\"当前 ChatGPT 文件读写编辑服务\",transport:\"loopback\"},\n {id:\"tunnel\",label:\"OpenAI Secure MCP Tunnel\",service:\"ai.home.mac-mcp-tunnel\",ports:[18891],phase:\"active\",role:\"云端出站接入;18891 为本地管理端口\",transport:\"outbound\"},\n {id:\"dc-standby\",label:\"Desktop Commander P1 Bridge\",service:\"ai.home.mac-mcp-dc-bridge\",ports:[8792],phase:\"standby\",role:\"已验收旧版本、可回滚\",transport:\"loopback\"},\n {id:\"p0\",label:\"Gateway P0 / health_check\",service:\"ai.home.mac-mcp-gateway-p0\",ports:[8787],phase:\"legacy\",role:\"历史 P0,仅健康检查\",transport:\"loopback\"},\n {id:\"canary\",label:\"Synthetic Canary\",service:\"ai.home.mac-mcp-private-pilot\",ports:[8790],phase:\"paused\",role:\"历史合成读写测试;冷备份\",transport:\"loopback\"},\n {id:\"caddy\",label:\"Caddy / Direct URL HTTPS\",service:\"ai.home.mac-mcp-caddy\",ports:[80,443],phase:\"paused\",role:\"未来公网 URL 直连;保留证书与配置\",transport:\"inbound\"},\n {id:\"uid450\",label:\"UID450 Isolated Worker v2\",service:\"ai.home.mac-mcp-worker-v2\",ports:[],phase:\"research\",role:\"系统级 Unix Socket Worker;不在当前 DC 主链\",transport:\"unix\"}\n]);\nconst env=process.env;\nasync function cmd(exe: string,args: string[]): Promise<{ok:true;stdout:string}|{ok:false;error:string;stdout?:undefined}>{\n try{\n const v=await execute(exe,args,{timeout:3000,maxBuffer:130000,env});\n return {ok:true,stdout:v.stdout};\n }catch(e){return {ok:false,error:errorCode(e)===\"ETIMEDOUT\"?\"timeout\":\"unavailable\"};}\n}\nfunction launched(stdout: string){\n return new Map(stdout.split(\"\\n\").map(line=>line.trim().split(/\\s+/))\n .filter(p=>p.length>=3&&p[2]?.startsWith(\"ai.home.mac-mcp\"))\n .map(p=>[p[2],{pid:/^\\d+$/.test(p[0]??\"\")?Number(p[0]):null,lastExit:p[1]}]));\n}\nfunction disabledLabels(stdout: string){\n const names=new Set();\n for(const m of stdout.matchAll(/\"(ai\\.home\\.mac-mcp-[^\"]+)\"\\s*=>\\s*disabled/g))\n names.add(m[1]);\n return names;\n}\nfunction listening(stdout: string){\n const known=new Set(MODULES.flatMap(x=>x.ports));\n const ports=new Map<number,Listener>();\n for(const line of stdout.split(\"\\n\")){\n const cols=line.trim().split(/\\s+/);\n const match=line.match(/TCP\\s+(\\S+):(\\d+)\\s+\\(LISTEN\\)/);\n if(!match)continue;\n const port=Number(match[2]);\n if(known.has(port)) ports.set(port,{port,address:match[1]!,process:cols[0]!,\n pid:/^\\d+$/.test(cols[1]??\"\")?Number(cols[1]):null});\n }\n return ports;\n}\nfunction tunnelTarget(xml: string){\n // Only classify known filenames; never return full plist, identity or tokens.\n for(const [file,target] of [\n [\"run_tunnel_workspace.py\",\"8793 · Project Workspace\"],\n [\"run_tunnel_dc_bridge.py\",\"8792 · DC Standby\"],\n [\"run_tunnel_pilot.py\",\"8790 · Synthetic Canary\"],\n [\"run_tunnel.py\",\"8787 · P0\"]])\n if(xml.includes(file+\"</string>\"))return target;\n return \"unknown (inspect LaunchAgent)\";\n}\nasync function projectGit(at: string){\n const r=await cmd(gitBinary,[\"-C\",at,\"status\",\"--porcelain=v1\"]);\n const br=await cmd(gitBinary,[\"-C\",at,\"branch\",\"--show-current\"]);\n const h=await cmd(gitBinary,[\"-C\",at,\"rev-parse\",\"--short\",\"HEAD\"]);\n return {branch:br.ok?br.stdout.trim():\"unavailable\",\n commit:h.ok?h.stdout.trim():\"unavailable\",\n dirtyCount:r.ok?r.stdout.split(\"\\n\").filter(Boolean).length:null};\n}\nexport async function collectOperationsSnapshot(){\n if(process.platform!==\"darwin\"||process.env.MAC_MCP_INSTANCE_ID)return {capturedAt:new Date().toISOString(),host:process.platform+\" local (loopback only)\",mode:\"read-only\",tunnelBackend:\"not verified\",modules:[],git:await projectGit(root),workspaceGit:await projectGit(process.env.MAC_MCP_PROJECT_ROOT||root),errors:[],milestones:[]};\n const uid=process.getuid?.();\n const [jobs,disables,listeners,worker,git,plist]=await Promise.all([\n cmd(\"/bin/launchctl\",[\"list\"]),\n cmd(\"/bin/launchctl\",[\"print-disabled\",\"gui/\"+uid]),\n cmd(\"/usr/sbin/lsof\",[\"-nP\",\"-iTCP\",\"-sTCP:LISTEN\"]),\n cmd(\"/bin/launchctl\",[\"print\",\"system/ai.home.mac-mcp-worker-v2\"]),\n projectGit(root),\n readFile(path.join(home||\"/\", \"Library/LaunchAgents/ai.home.mac-mcp-tunnel.plist\"),\"utf8\")\n .then(x=>({ok:true,text:x})).catch(()=>({ok:false,text:\"\"}))\n ]);\n const active=jobs.ok?launched(jobs.stdout):new Map<string,{pid:number|null;lastExit:string|undefined}>();\n const disabled=disables.ok?disabledLabels(disables.stdout):new Set();\n const ports=listeners.ok?listening(listeners.stdout):new Map<number,Listener>();\n const modules=MODULES.map(m=>{\n const status=m.id===\"uid450\" ?\n (worker.ok?/state = running/.test(worker.stdout)?\"running\":\"stopped\":\"unknown\") :\n (!jobs.ok?\"unknown\":active.has(m.service)?\"running\":\n disabled.has(m.service)?\"disabled\":\"stopped\");\n const occupied=m.ports.map(p=>ports.get(p)).filter((x): x is Listener=>x!==undefined);\n const ready=status===\"running\" && (m.ports.length===0 ||\n occupied.length>0);\n return {...m,status,ready,pid:m.id===\"uid450\"?\n Number(worker.stdout?.match(/pid = (\\d+)/)?.[1])||null:\n active.get(m.service)?.pid||null,listeners:occupied};\n });\n const workspaceGit=await projectGit(process.env.MAC_MCP_PROJECT_ROOT||root);\n const errors=([[\"launchctl\",jobs],[\"disabled\",disables],\n [\"lsof\",listeners],[\"system-worker\",worker],[\"Tunnel plist\",plist]] satisfies [string,{ok:boolean}][])\n .filter(([,value])=>!value.ok).map(([name])=>name+\" unavailable\");\n return {capturedAt:new Date().toISOString(),host:\"Mac local (loopback only)\",\n mode:\"read-only\",tunnelBackend:plist.ok?tunnelTarget(plist.text):\"unknown\",\n modules,git,workspaceGit,errors,\n milestones:[\n {name:\"P2 ChatGPT Workspace\",status:\"accepted\",detail:\"7/7 real DC calls; read/write/edit and .git denial\"},\n {name:\"P3 Operations Dashboard\",status:\"active\",detail:\"Current service/port monitor on existing 8793\"},\n {name:\"P3 Development Workflow\",status:\"limited-live\",detail:\"Git status / diff / npm smoke via real DC; Git commit approval pending\"},\n {name:\"Direct URL deployment\",status:\"paused\",detail:\"Caddy disabled; HTTP ingress not public\"}\n ]};\n}\nconst esc=(x: unknown)=>String(x??\"\").replace(/[&<>\"']/g,c=>\n ({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"}[c]!));\nfunction stateLabel(x: string){\n return ({running:\"运行中\",disabled:\"已禁用\",stopped:\"已停止\",unknown:\"未能确定\"} as Record<string,string>)[x]||x;\n}\nfunction phaseLabel(x: string){\n return ({active:\"主线\",standby:\"回退\",legacy:\"历史\",paused:\"暂停\",research:\"研究\"} as Record<string,string>)[x]||x;\n}\nexport function renderOperationsHtml(data: Awaited<ReturnType<typeof collectOperationsSnapshot>> & {instance?:{id:string;name:string;port:number};accessControl?:{mode:string};configuredUpstreams?:UpstreamStatus[];denyRuleManagementEnabled?:boolean;permissionManagementEnabled?:boolean;nativeAccessEnabled?:boolean}){\n if(data.instance){\n const i=data.instance;\n return `<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>${esc(i.name)} · Gateway</title><style>\n body{font:16px system-ui;background:#f4f6fa;color:#182230;margin:0}main{max-width:850px;margin:50px auto;padding:24px}section{background:white;border:1px solid #dde3eb;border-radius:14px;padding:24px;margin:18px 0}h1{font-size:32px}h2{font-size:18px}small{color:#667085}code{overflow-wrap:anywhere}nav{display:flex;gap:24px;flex-wrap:wrap}a{color:#2459c3}dt{color:#667085;margin-top:16px}dd{margin:5px 0}\n </style></head><body><main><small>Mac MCP Gateway · Instance</small><h1>${esc(i.name)}</h1><small>${esc(i.id)}</small>\n <section><h2>Local Core is running</h2><dl><dt>MCP endpoint</dt><dd><code>http://127.0.0.1:${i.port}/mcp</code></dd><dt>Authentication</dt><dd>${esc(data.accessControl?.mode??'unavailable')}</dd><dt>Capability</dt><dd>${data.nativeAccessEnabled?'Trusted native tools':'Restricted workspace'}</dd></dl><p>Local health does not verify a remote connection. Configure HTTPS or a protected Tunnel separately.</p></section>\n <section><h2>Manage this instance</h2><nav><a href=\"/access\">Credentials and OAuth sessions</a>${data.permissionManagementEnabled?'<a href=\"/permissions\">Workspace permissions</a>':''}${data.denyRuleManagementEnabled?'<a href=\"/filters\">Tool and directory filters</a>':''}</nav><p>Use the App or CLI to edit configuration, apply changes, inspect logs or stop this instance.</p></section>\n <section><h2>Additional upstreams</h2>${(data.configuredUpstreams??[]).map(u=>`<p>${esc(u.id)} · ${esc(u.status)} · ${u.toolCount} tools</p>`).join('')||'<p>No additional upstreams configured.</p>'}</section><small>Owner-local management · <a href=\"/dashboard.json\">JSON status</a></small></main></body></html>`;\n }\n const active=data.modules.filter(x=>x.status===\"running\").length;\n const livePorts=data.modules.flatMap(x=>x.listeners).map(x=>x.port);\n const expected=data.modules.filter(x=>x.phase===\"active\"&&x.status!==\"running\");\n const tr=data.modules.map(m=>`<tr><td><strong>${esc(m.label)}</strong><small>${esc(m.role)}</small></td><td><span class=\"pill ${esc(m.status)}\">${esc(stateLabel(m.status))}</span></td><td><span class=\"phase\">${esc(phaseLabel(m.phase))}</span></td><td class=\"mono\">${esc(m.ports.length?m.ports.join(\" / \"):\"Unix Socket\")}</td><td class=\"mono\">${esc(m.listeners.length?m.listeners.map(x=>x.port+\" · PID \"+x.pid).join(\", \"):m.status===\"running\"?\"-\":\"未监听\")}</td></tr>`).join(\"\");\n const additional=data.configuredUpstreams||[];\n const upstreamRows=additional.map(u=>\"<tr><td><strong>\"+esc(u.id)+\"</strong></td><td>\"+\n esc(u.status)+\"</td><td>\"+esc(u.toolCount)+\"</td><td>\"+\n esc(u.lastError||\"—\")+\"</td></tr>\").join(\"\");\n const upstreamPanel=additional.length?\n '<section class=\"panel\"><h2>Configured MCP Upstreams</h2><table><thead><tr><th>上游</th><th>当前状态</th><th>已发现工具</th><th>错误代码</th></tr></thead><tbody>'+upstreamRows+'</tbody></table></section>':'';\n const milestones=data.milestones.map(x=>`<li><span class=\"step\">${esc(x.status)}</span><div><b>${esc(x.name)}</b><p>${esc(x.detail)}</p></div></li>`).join(\"\");\n const messages=data.errors.length?[...data.errors]:[];\n if(expected.length)messages.push(expected.length+\" 个主线服务不在运行\");\n return `<!doctype html><html lang=\"zh-CN\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><meta http-equiv=\"refresh\" content=\"25\"><title>Mac MCP Gateway · Operations</title><style>\n :root{color-scheme:light;font-family:system-ui,-apple-system,\"PingFang SC\",\"Microsoft Yahei\",sans-serif}\n *{box-sizing:border-box}body{margin:0;background:#f4f7fb;color:#142138}\n main{max-width:1220px;margin:0 auto;padding:34px 25px 64px}\n header{display:flex;align-items:flex-end;justify-content:space-between;gap:22px;margin-bottom:27px;flex-wrap:wrap}\n h1{font-size:26px;margin:0 0 8px}h2{font-size:16px;margin:0 0 17px}p{line-height:1.55}\n .subtitle{color:#67748b;margin:0}.time{color:#697890;font-size:12px}\n .stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin:0 0 24px}\n .stat,.panel{background:white;border:1px solid #e0e7f0;border-radius:13px;padding:18px}\n .stat small{color:#6b7b93;display:block;margin-bottom:9px}.stat strong{font-size:23px}\n .stat strong.short{font-size:16px}.status-good{color:#137a53}\n .grid{display:grid;grid-template-columns:2fr 1fr;gap:18px}.panel{margin-bottom:18px;overflow:auto}\n table{border-collapse:collapse;width:100%;font-size:13px}th{text-align:left;background:#f7f9fc;color:#687991;font-weight:600}\n td,th{padding:13px 11px;border-bottom:1px solid #e9eef6;vertical-align:middle}tr:last-child td{border:0}\n td small{display:block;color:#718096;margin-top:5px}.pill{padding:5px 9px;border-radius:8px;background:#f2f4f7;font-size:12px;white-space:nowrap}\n .pill.running{color:#0c7451;background:#ddf6e9}.pill.disabled{color:#9a5409;background:#fff1d9}\n .pill.unknown{color:#aa251b;background:#ffefee}.phase{font-size:12px;color:#62728a}\n .mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;white-space:nowrap}\n ul{list-style:none;margin:0;padding:0}li{display:flex;gap:12px;padding:0 0 20px}li:last-child{padding-bottom:0}\n li p{margin:5px 0 0;color:#718096;font-size:12px}\n .step{background:#e9f0ff;color:#2755ad;border-radius:6px;padding:6px;align-self:flex-start;text-transform:uppercase;font-size:10px}\n .notice{border-left:3px solid #7598d6;background:#f0f5ff;padding:11px;color:#425b88;font-size:12px;margin-top:20px}\n footer{color:#8291a3;font-size:12px;padding:10px}\n @media(max-width:950px){.stats{grid-template-columns:repeat(2,1fr)}.grid{grid-template-columns:1fr}}\n @media(max-width:560px){main{padding:19px 10px}.stats{grid-template-columns:1fr 1fr}th,td{padding:10px 7px}}\n </style></head><body><main><header><div><h1>Mac MCP Gateway <span style=\"color:#4777c6\">/ Operations</span></h1><p class=\"subtitle\">运行资产 · 端口占用 · 开发里程碑 · 双入口状态</p></div><div class=\"time\">采样 ${esc(data.capturedAt)}<br>本机只读 · 每 25 秒刷新</div></header>\n <section class=\"stats\"><div class=\"stat\"><small>当前在线服务</small><strong class=\"status-good\">${active} / ${data.modules.length}</strong></div>\n <div class=\"stat\"><small>正在监听的项目端口</small><strong>${new Set(livePorts).size}</strong></div>\n <div class=\"stat\"><small>Private Tunnel 目标</small><strong class=\"short\">${esc(data.tunnelBackend)}</strong></div>\n <div class=\"stat\"><small>正在运行的代码</small><strong class=\"short\">${esc(data.git.branch)} · ${esc(data.git.commit)}</strong><small>${data.git.dirtyCount===null?\"状态未知\":data.git.dirtyCount+\" 个未提交变更\"}</small></div>\n <div class=\"stat\"><small>实际授权项目 Git</small><strong class=\"short\">${esc(data.workspaceGit.branch)} · ${esc(data.workspaceGit.commit)}</strong><small>${data.workspaceGit.dirtyCount===null?\"状态未知\":data.workspaceGit.dirtyCount+\" 个未提交变更\"}</small></div></section>\n <div class=\"grid\"><section class=\"panel\"><h2>服务运行清单</h2><table><thead><tr><th>模块</th><th>系统状态</th><th>研发定位</th><th>登记端口</th><th>实际监听</th></tr></thead><tbody>${tr}</tbody></table></section>\n <section class=\"panel\"><h2>里程碑与开发进度</h2><ul>${milestones}</ul><div class=\"notice\">该面板只观察,不执行任何启动、停用、Git、Shell 命令。全量 DC 工具可发现 ≠ 全部已授权。</div></section></div>\n ${upstreamPanel}\n ${data.denyRuleManagementEnabled?'<section class=\"panel\"><h2>Tool Filters · Explicit Deny</h2><p>所有上游 MCP 工具默认允许。所有者可以禁用指定工具或添加非沙箱型目录过滤。<a href=\"/filters\">管理黑名单</a></p></section>':''}\n ${data.permissionManagementEnabled?'<section class=\"panel\"><h2>Workspace Permissions</h2><p>'+\n (data.nativeAccessEnabled?'当前为可信开发原生透传:Home/自定义目录授权开关不限制原生文件及 Shell 工具;由本地 Desktop Commander 与 macOS 用户权限控制。':'当前支持 Home 与 Home 外只读扫描、自定义目录读写授权。')+\n ' <a href=\"/permissions\">查看目录授权与说明</a></p></section>':''}\n ${messages.length?`<section class=\"panel\"><h2>采集警告</h2><p>${esc(messages.join(\"; \"))}</p></section>`:\"\"}\n <section><h2>Access control</h2><p><a href=\"/access\">Manage authentication and client credentials</a></p><p>Credentials use the owner permission configuration. Network access and tool permissions are managed separately.</p></section>\n <footer>JSON 数据接口:/dashboard.json · 不另占用端口 · 127.0.0.1 本机访问</footer></main></body></html>`;\n}\nexport const dashboardHeaders=Object.freeze({\n \"cache-control\":\"no-store\",\"x-content-type-options\":\"nosniff\",\n \"content-security-policy\":\"default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; frame-ancestors 'none'; form-action 'none'; connect-src 'none'\"\n});\n\nexport function instancePage(html:string,name:string|undefined,id:string|undefined){\n return id?html.replace(/<body([^>]*)>/,`<body$1><aside style=\"padding:12px 24px;border-bottom:1px solid #ddd\">Gateway instance: <strong>${esc(name??id)}</strong> · <small>${esc(id)}</small> · <a href=\"/dashboard\">Overview</a></aside>`):html;\n}\n"]}
1
+ {"version":3,"file":"ops-dashboard.js","sourceRoot":"","sources":["../../src/ops-dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,iEAAiE;AACjE,kFAAkF;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,MAAM,OAAO,GAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAClC,MAAM,IAAI,GAAC,WAAW,CAAC;AACvB,MAAM,IAAI,GAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAE5B,MAAM,CAAC,MAAM,OAAO,GAAC,MAAM,CAAC,MAAM,CAAC;IACjC,EAAC,EAAE,EAAC,WAAW,EAAC,KAAK,EAAC,2BAA2B,EAAC,OAAO,EAAC,mCAAmC,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,qBAAqB,EAAC,SAAS,EAAC,UAAU,EAAC;IAC1K,EAAC,EAAE,EAAC,QAAQ,EAAC,KAAK,EAAC,0BAA0B,EAAC,OAAO,EAAC,wBAAwB,EAAC,KAAK,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,sBAAsB,EAAC,SAAS,EAAC,UAAU,EAAC;IAC7J,EAAC,EAAE,EAAC,YAAY,EAAC,KAAK,EAAC,6BAA6B,EAAC,OAAO,EAAC,2BAA2B,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,SAAS,EAAC,IAAI,EAAC,YAAY,EAAC,SAAS,EAAC,UAAU,EAAC;IAC7J,EAAC,EAAE,EAAC,IAAI,EAAC,KAAK,EAAC,2BAA2B,EAAC,OAAO,EAAC,4BAA4B,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,aAAa,EAAC,SAAS,EAAC,UAAU,EAAC;IACpJ,EAAC,EAAE,EAAC,QAAQ,EAAC,KAAK,EAAC,kBAAkB,EAAC,OAAO,EAAC,+BAA+B,EAAC,KAAK,EAAC,CAAC,IAAI,CAAC,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,cAAc,EAAC,SAAS,EAAC,UAAU,EAAC;IACnJ,EAAC,EAAE,EAAC,OAAO,EAAC,KAAK,EAAC,0BAA0B,EAAC,OAAO,EAAC,uBAAuB,EAAC,KAAK,EAAC,CAAC,EAAE,EAAC,GAAG,CAAC,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAC,qBAAqB,EAAC,SAAS,EAAC,SAAS,EAAC;IAC1J,EAAC,EAAE,EAAC,QAAQ,EAAC,KAAK,EAAC,2BAA2B,EAAC,OAAO,EAAC,2BAA2B,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,UAAU,EAAC,IAAI,EAAC,mCAAmC,EAAC,SAAS,EAAC,MAAM,EAAC;CACxK,CAAC,CAAC;AACH,MAAM,GAAG,GAAC,OAAO,CAAC,GAAG,CAAC;AACtB,KAAK,UAAU,GAAG,CAAC,GAAW,EAAC,IAAc;IAC3C,IAAG,CAAC;QACF,MAAM,CAAC,GAAC,MAAM,OAAO,CAAC,GAAG,EAAC,IAAI,EAAC,EAAC,OAAO,EAAC,IAAI,EAAC,SAAS,EAAC,MAAM,EAAC,GAAG,EAAC,CAAC,CAAC;QACpE,OAAO,EAAC,EAAE,EAAC,IAAI,EAAC,MAAM,EAAC,CAAC,CAAC,MAAM,EAAC,CAAC;IACnC,CAAC;IAAA,OAAM,CAAC,EAAC,CAAC;QAAA,OAAO,EAAC,EAAE,EAAC,KAAK,EAAC,KAAK,EAAC,SAAS,CAAC,CAAC,CAAC,KAAG,WAAW,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,aAAa,EAAC,CAAC;IAAA,CAAC;AACxF,CAAC;AACD,SAAS,QAAQ,CAAC,MAAc;IAC9B,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE,CAAA,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SAClE,MAAM,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,MAAM,IAAE,CAAC,IAAE,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;SAC3D,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,EAAC,GAAG,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAE,EAAE,CAAC,CAAA,CAAC,CAAA,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,IAAI,EAAC,QAAQ,EAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AACD,SAAS,cAAc,CAAC,MAAc;IACpC,MAAM,KAAK,GAAC,IAAI,GAAG,EAAE,CAAC;IACtB,KAAI,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QAC5E,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,SAAS,CAAC,MAAc;IAC/B,MAAM,KAAK,GAAC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,MAAM,KAAK,GAAC,IAAI,GAAG,EAAmB,CAAC;IACvC,KAAI,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,CAAC;QACpC,MAAM,IAAI,GAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACzD,IAAG,CAAC,KAAK;YAAC,SAAS;QACnB,MAAM,IAAI,GAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAC,EAAC,IAAI,EAAC,OAAO,EAAC,KAAK,CAAC,CAAC,CAAE,EAAC,OAAO,EAAC,IAAI,CAAC,CAAC,CAAE;gBACzE,GAAG,EAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAE,EAAE,CAAC,CAAA,CAAC,CAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,IAAI,EAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,YAAY,CAAC,GAAW;IAC/B,8EAA8E;IAC9E,KAAI,MAAM,CAAC,IAAI,EAAC,MAAM,CAAC,IAAI;QACzB,CAAC,yBAAyB,EAAC,0BAA0B,CAAC;QACtD,CAAC,yBAAyB,EAAC,mBAAmB,CAAC;QAC/C,CAAC,qBAAqB,EAAC,yBAAyB,CAAC;QACjD,CAAC,eAAe,EAAC,WAAW,CAAC;KAAC;QAC9B,IAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAC,WAAW,CAAC;YAAC,OAAO,MAAM,CAAC;IAClD,OAAO,+BAA+B,CAAC;AACzC,CAAC;AACD,KAAK,UAAU,UAAU,CAAC,EAAU;IAClC,MAAM,CAAC,GAAC,MAAM,GAAG,CAAC,SAAS,EAAC,CAAC,IAAI,EAAC,EAAE,EAAC,QAAQ,EAAC,gBAAgB,CAAC,CAAC,CAAC;IACjE,MAAM,EAAE,GAAC,MAAM,GAAG,CAAC,SAAS,EAAC,CAAC,IAAI,EAAC,EAAE,EAAC,QAAQ,EAAC,gBAAgB,CAAC,CAAC,CAAC;IAClE,MAAM,CAAC,GAAC,MAAM,GAAG,CAAC,SAAS,EAAC,CAAC,IAAI,EAAC,EAAE,EAAC,WAAW,EAAC,SAAS,EAAC,MAAM,CAAC,CAAC,CAAC;IACpE,OAAO,EAAC,MAAM,EAAC,EAAE,CAAC,EAAE,CAAA,CAAC,CAAA,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA,CAAC,CAAA,aAAa;QACjD,MAAM,EAAC,CAAC,CAAC,EAAE,CAAA,CAAC,CAAA,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA,CAAC,CAAA,aAAa;QACzC,UAAU,EAAC,CAAC,CAAC,EAAE,CAAA,CAAC,CAAA,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAA,CAAC,CAAA,IAAI,EAAC,CAAC;AACtE,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,IAAG,OAAO,CAAC,QAAQ,KAAG,QAAQ,IAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;QAAC,OAAO,EAAC,UAAU,EAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAC,IAAI,EAAC,OAAO,CAAC,QAAQ,GAAC,wBAAwB,EAAC,IAAI,EAAC,WAAW,EAAC,aAAa,EAAC,cAAc,EAAC,OAAO,EAAC,EAAE,EAAC,GAAG,EAAC,MAAM,UAAU,CAAC,IAAI,CAAC,EAAC,YAAY,EAAC,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAE,IAAI,CAAC,EAAC,MAAM,EAAC,EAAE,EAAC,UAAU,EAAC,EAAE,EAAC,CAAC;IAC9U,MAAM,GAAG,GAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAC7B,MAAM,CAAC,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,CAAC,GAAC,MAAM,OAAO,CAAC,GAAG,CAAC;QACjE,GAAG,CAAC,gBAAgB,EAAC,CAAC,MAAM,CAAC,CAAC;QAC9B,GAAG,CAAC,gBAAgB,EAAC,CAAC,gBAAgB,EAAC,MAAM,GAAC,GAAG,CAAC,CAAC;QACnD,GAAG,CAAC,gBAAgB,EAAC,CAAC,KAAK,EAAC,OAAO,EAAC,cAAc,CAAC,CAAC;QACpD,GAAG,CAAC,gBAAgB,EAAC,CAAC,OAAO,EAAC,kCAAkC,CAAC,CAAC;QAClE,UAAU,CAAC,IAAI,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAE,GAAG,EAAE,mDAAmD,CAAC,EAAC,MAAM,CAAC;aACvF,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAE,EAAE,CAAA,CAAC,EAAC,EAAE,EAAC,KAAK,EAAC,IAAI,EAAC,EAAE,EAAC,CAAC,CAAC;KAC/D,CAAC,CAAC;IACH,MAAM,MAAM,GAAC,IAAI,CAAC,EAAE,CAAA,CAAC,CAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,IAAI,GAAG,EAAsD,CAAC;IACzG,MAAM,QAAQ,GAAC,QAAQ,CAAC,EAAE,CAAA,CAAC,CAAA,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,IAAI,GAAG,EAAE,CAAC;IACrE,MAAM,KAAK,GAAC,SAAS,CAAC,EAAE,CAAA,CAAC,CAAA,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,IAAI,GAAG,EAAmB,CAAC;IAChF,MAAM,OAAO,GAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE;QAC3B,MAAM,MAAM,GAAC,CAAC,CAAC,EAAE,KAAG,QAAQ,CAAC,CAAC;YAC5B,CAAC,MAAM,CAAC,EAAE,CAAA,CAAC,CAAA,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,SAAS,CAAC,CAAC,CAAC;YACjF,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC;gBACnD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAC,CAAA,UAAU,CAAA,CAAC,CAAA,SAAS,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAgB,EAAE,CAAA,CAAC,KAAG,SAAS,CAAC,CAAC;QACtF,MAAM,KAAK,GAAC,MAAM,KAAG,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAG,CAAC;YACnD,QAAQ,CAAC,MAAM,GAAC,CAAC,CAAC,CAAC;QACrB,OAAO,EAAC,GAAG,CAAC,EAAC,MAAM,EAAC,KAAK,EAAC,GAAG,EAAC,CAAC,CAAC,EAAE,KAAG,QAAQ,CAAA,CAAC;gBAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAE,IAAI,CAAA,CAAC;gBACvD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,IAAE,IAAI,EAAC,SAAS,EAAC,QAAQ,EAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IACH,MAAM,YAAY,GAAC,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAE,IAAI,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAE,CAAC,CAAC,WAAW,EAAC,IAAI,CAAC,EAAC,CAAC,UAAU,EAAC,QAAQ,CAAC;QACrD,CAAC,MAAM,EAAC,SAAS,CAAC,EAAC,CAAC,eAAe,EAAC,MAAM,CAAC,EAAC,CAAC,cAAc,EAAC,KAAK,CAAC,CAAoC;SACrG,MAAM,CAAC,CAAC,CAAC,EAAC,KAAK,CAAC,EAAC,EAAE,CAAA,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAC,EAAE,CAAA,IAAI,GAAC,cAAc,CAAC,CAAC;IACpE,OAAO,EAAC,UAAU,EAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAC,IAAI,EAAC,2BAA2B;QAC1E,IAAI,EAAC,WAAW,EAAC,aAAa,EAAC,KAAK,CAAC,EAAE,CAAA,CAAC,CAAA,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA,CAAC,CAAA,SAAS;QAC1E,OAAO,EAAC,GAAG,EAAC,YAAY,EAAC,MAAM;QAC/B,UAAU,EAAC;YACT,EAAC,IAAI,EAAC,sBAAsB,EAAC,MAAM,EAAC,UAAU,EAAC,MAAM,EAAC,oDAAoD,EAAC;YAC3G,EAAC,IAAI,EAAC,yBAAyB,EAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,EAAC,+CAA+C,EAAC;YACvG,EAAC,IAAI,EAAC,yBAAyB,EAAC,MAAM,EAAC,cAAc,EAAC,MAAM,EAAC,wEAAwE,EAAC;YACtI,EAAC,IAAI,EAAC,uBAAuB,EAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,EAAC,yCAAyC,EAAC;SAChG,EAAC,CAAC;AACP,CAAC;AACD,MAAM,GAAG,GAAC,CAAC,CAAU,EAAC,EAAE,CAAA,MAAM,CAAC,CAAC,IAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAC,CAAC,CAAA,EAAE,CAC1D,CAAC,EAAC,GAAG,EAAC,OAAO,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,QAAQ,EAAC,GAAG,EAAC,OAAO,EAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;AACtE,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAQ,EAAC,OAAO,EAAC,KAAK,EAAC,QAAQ,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,OAAO,EAAC,MAAM,EAA2B,CAAC,CAAC,CAAC,IAAE,CAAC,CAAC;AACtG,CAAC;AACD,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAQ,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,EAAC,IAAI,EAA2B,CAAC,CAAC,CAAC,IAAE,CAAC,CAAC;AAC3G,CAAC;AACD,MAAM,UAAU,oBAAoB,CAAC,IAAqR;IACxT,IAAG,IAAI,CAAC,QAAQ,EAAC,CAAC;QAChB,MAAM,CAAC,GAAC,IAAI,CAAC,QAAQ,CAAC;QACtB,OAAO,wIAAwI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;;wEAEtF,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;mGACR,CAAC,CAAC,IAAI,8CAA8C,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,IAAE,aAAa,CAAC,+BAA+B,IAAI,CAAC,mBAAmB,CAAA,CAAC,CAAA,sBAAsB,CAAA,CAAC,CAAA,sBAAsB;uGACjM,IAAI,CAAC,2BAA2B,CAAA,CAAC,CAAA,kDAAkD,CAAA,CAAC,CAAA,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAA,CAAC,CAAA,mDAAmD,CAAA,CAAC,CAAA,EAAE;8CACvO,CAAC,IAAI,CAAC,mBAAmB,IAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAE,4CAA4C,kHAAkH,CAAC;IAC5T,CAAC;IACD,MAAM,MAAM,GAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,MAAM,KAAG,SAAS,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,SAAS,GAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,KAAK,KAAG,QAAQ,IAAE,CAAC,CAAC,MAAM,KAAG,SAAS,CAAC,CAAC;IAChF,MAAM,EAAE,GAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,mBAAmB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,sCAAsC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,uCAAuC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,gCAAgC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA,CAAC,CAAA,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,CAAC,CAAA,aAAa,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAA,CAAC,CAAA,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,IAAI,GAAC,SAAS,GAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAC,CAAA,CAAC,CAAC,MAAM,KAAG,SAAS,CAAA,CAAC,CAAA,GAAG,CAAA,CAAC,CAAA,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3d,MAAM,UAAU,GAAC,IAAI,CAAC,mBAAmB,IAAE,EAAE,CAAC;IAC9C,MAAM,YAAY,GAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,kBAAkB,GAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAC,oBAAoB;QACpF,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAC,WAAW,GAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAC,WAAW;QACtD,GAAG,CAAC,CAAC,CAAC,SAAS,IAAE,GAAG,CAAC,GAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAC,UAAU,CAAC,MAAM,CAAA,CAAC;QACpC,mJAAmJ,GAAC,YAAY,GAAC,4BAA4B,CAAA,CAAC,CAAA,EAAE,CAAC;IACnM,MAAM,UAAU,GAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,0BAA0B,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/J,MAAM,QAAQ,GAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,CAAC,CAAA,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,EAAE,CAAC;IACtD,IAAG,QAAQ,CAAC,MAAM;QAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAC,YAAY,CAAC,CAAC;IAC/D,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;0LAyBiL,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;8FAChH,MAAM,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM;sDACvE,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI;4EACD,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;kEACjC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,GAAG,CAAC,UAAU,KAAG,IAAI,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,IAAI,CAAC,GAAG,CAAC,UAAU,GAAC,SAAS;qEAC7H,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,YAAY,CAAC,UAAU,KAAG,IAAI,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,IAAI,CAAC,YAAY,CAAC,UAAU,GAAC,SAAS;iKACxE,EAAE;gDACnH,UAAU;IACtD,aAAa;IACb,IAAI,CAAC,yBAAyB,CAAA,CAAC,CAAA,kJAAkJ,CAAA,CAAC,CAAA,EAAE;IACpL,IAAI,CAAC,2BAA2B,CAAA,CAAC,CAAA,0DAA0D;QAC7F,CAAC,IAAI,CAAC,mBAAmB,CAAA,CAAC,CAAA,mFAAmF,CAAA,CAAC,CAAA,mCAAmC,CAAC;QAClJ,qDAAqD,CAAA,CAAC,CAAA,EAAE;IACtD,QAAQ,CAAC,MAAM,CAAA,CAAC,CAAA,0CAA0C,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAA,CAAC,CAAA,EAAE;;4FAEb,CAAC;AAC7F,CAAC;AACD,MAAM,CAAC,MAAM,gBAAgB,GAAC,MAAM,CAAC,MAAM,CAAC;IAC1C,eAAe,EAAC,UAAU,EAAC,wBAAwB,EAAC,SAAS;IAC7D,yBAAyB,EAAC,gIAAgI;CAC3J,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAAC,IAAW,EAAC,IAAqB,EAAC,EAAmB;IAChF,OAAO,EAAE,CAAA,CAAC,CAAA,IAAI,CAAC,OAAO,CAAC,eAAe,EAAC,mGAAmG,GAAG,CAAC,IAAI,IAAE,EAAE,CAAC,sBAAsB,GAAG,CAAC,EAAE,CAAC,sDAAsD,CAAC,CAAA,CAAC,CAAA,IAAI,CAAC;AACnP,CAAC","sourcesContent":["import {gitBinary} from \"./platform.js\";\nimport type { UpstreamStatus } from \"./contracts.js\";\nimport { packageRoot } from \"./runtime-paths.js\";\nimport { errorCode } from \"./validation.js\";\ninterface Listener {port:number;address:string;process:string;pid:number|null}\n// Read-only, loopback-only Mac MCP Gateway operations dashboard.\n// No service control, arbitrary command, file content, credentials or extra port.\nimport { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nconst execute=promisify(execFile);\nconst root=packageRoot;\nconst home=process.env.HOME;\n\nexport const MODULES=Object.freeze([\n {id:\"workspace\",label:\"Project Workspace Gateway\",service:\"ai.home.mac-mcp-project-workspace\",ports:[8793],phase:\"active\",role:\"当前 ChatGPT 文件读写编辑服务\",transport:\"loopback\"},\n {id:\"tunnel\",label:\"OpenAI Secure MCP Tunnel\",service:\"ai.home.mac-mcp-tunnel\",ports:[18891],phase:\"active\",role:\"云端出站接入;18891 为本地管理端口\",transport:\"outbound\"},\n {id:\"dc-standby\",label:\"Desktop Commander P1 Bridge\",service:\"ai.home.mac-mcp-dc-bridge\",ports:[8792],phase:\"standby\",role:\"已验收旧版本、可回滚\",transport:\"loopback\"},\n {id:\"p0\",label:\"Gateway P0 / health_check\",service:\"ai.home.mac-mcp-gateway-p0\",ports:[8787],phase:\"legacy\",role:\"历史 P0,仅健康检查\",transport:\"loopback\"},\n {id:\"canary\",label:\"Synthetic Canary\",service:\"ai.home.mac-mcp-private-pilot\",ports:[8790],phase:\"paused\",role:\"历史合成读写测试;冷备份\",transport:\"loopback\"},\n {id:\"caddy\",label:\"Caddy / Direct URL HTTPS\",service:\"ai.home.mac-mcp-caddy\",ports:[80,443],phase:\"paused\",role:\"未来公网 URL 直连;保留证书与配置\",transport:\"inbound\"},\n {id:\"uid450\",label:\"UID450 Isolated Worker v2\",service:\"ai.home.mac-mcp-worker-v2\",ports:[],phase:\"research\",role:\"系统级 Unix Socket Worker;不在当前 DC 主链\",transport:\"unix\"}\n]);\nconst env=process.env;\nasync function cmd(exe: string,args: string[]): Promise<{ok:true;stdout:string}|{ok:false;error:string;stdout?:undefined}>{\n try{\n const v=await execute(exe,args,{timeout:3000,maxBuffer:130000,env});\n return {ok:true,stdout:v.stdout};\n }catch(e){return {ok:false,error:errorCode(e)===\"ETIMEDOUT\"?\"timeout\":\"unavailable\"};}\n}\nfunction launched(stdout: string){\n return new Map(stdout.split(\"\\n\").map(line=>line.trim().split(/\\s+/))\n .filter(p=>p.length>=3&&p[2]?.startsWith(\"ai.home.mac-mcp\"))\n .map(p=>[p[2],{pid:/^\\d+$/.test(p[0]??\"\")?Number(p[0]):null,lastExit:p[1]}]));\n}\nfunction disabledLabels(stdout: string){\n const names=new Set();\n for(const m of stdout.matchAll(/\"(ai\\.home\\.mac-mcp-[^\"]+)\"\\s*=>\\s*disabled/g))\n names.add(m[1]);\n return names;\n}\nfunction listening(stdout: string){\n const known=new Set(MODULES.flatMap(x=>x.ports));\n const ports=new Map<number,Listener>();\n for(const line of stdout.split(\"\\n\")){\n const cols=line.trim().split(/\\s+/);\n const match=line.match(/TCP\\s+(\\S+):(\\d+)\\s+\\(LISTEN\\)/);\n if(!match)continue;\n const port=Number(match[2]);\n if(known.has(port)) ports.set(port,{port,address:match[1]!,process:cols[0]!,\n pid:/^\\d+$/.test(cols[1]??\"\")?Number(cols[1]):null});\n }\n return ports;\n}\nfunction tunnelTarget(xml: string){\n // Only classify known filenames; never return full plist, identity or tokens.\n for(const [file,target] of [\n [\"run_tunnel_workspace.py\",\"8793 · Project Workspace\"],\n [\"run_tunnel_dc_bridge.py\",\"8792 · DC Standby\"],\n [\"run_tunnel_pilot.py\",\"8790 · Synthetic Canary\"],\n [\"run_tunnel.py\",\"8787 · P0\"]])\n if(xml.includes(file+\"</string>\"))return target;\n return \"unknown (inspect LaunchAgent)\";\n}\nasync function projectGit(at: string){\n const r=await cmd(gitBinary,[\"-C\",at,\"status\",\"--porcelain=v1\"]);\n const br=await cmd(gitBinary,[\"-C\",at,\"branch\",\"--show-current\"]);\n const h=await cmd(gitBinary,[\"-C\",at,\"rev-parse\",\"--short\",\"HEAD\"]);\n return {branch:br.ok?br.stdout.trim():\"unavailable\",\n commit:h.ok?h.stdout.trim():\"unavailable\",\n dirtyCount:r.ok?r.stdout.split(\"\\n\").filter(Boolean).length:null};\n}\nexport async function collectOperationsSnapshot(){\n if(process.platform!==\"darwin\"||process.env.MAC_MCP_INSTANCE_ID)return {capturedAt:new Date().toISOString(),host:process.platform+\" local (loopback only)\",mode:\"read-only\",tunnelBackend:\"not verified\",modules:[],git:await projectGit(root),workspaceGit:await projectGit(process.env.MAC_MCP_PROJECT_ROOT||root),errors:[],milestones:[]};\n const uid=process.getuid?.();\n const [jobs,disables,listeners,worker,git,plist]=await Promise.all([\n cmd(\"/bin/launchctl\",[\"list\"]),\n cmd(\"/bin/launchctl\",[\"print-disabled\",\"gui/\"+uid]),\n cmd(\"/usr/sbin/lsof\",[\"-nP\",\"-iTCP\",\"-sTCP:LISTEN\"]),\n cmd(\"/bin/launchctl\",[\"print\",\"system/ai.home.mac-mcp-worker-v2\"]),\n projectGit(root),\n readFile(path.join(home||\"/\", \"Library/LaunchAgents/ai.home.mac-mcp-tunnel.plist\"),\"utf8\")\n .then(x=>({ok:true,text:x})).catch(()=>({ok:false,text:\"\"}))\n ]);\n const active=jobs.ok?launched(jobs.stdout):new Map<string,{pid:number|null;lastExit:string|undefined}>();\n const disabled=disables.ok?disabledLabels(disables.stdout):new Set();\n const ports=listeners.ok?listening(listeners.stdout):new Map<number,Listener>();\n const modules=MODULES.map(m=>{\n const status=m.id===\"uid450\" ?\n (worker.ok?/state = running/.test(worker.stdout)?\"running\":\"stopped\":\"unknown\") :\n (!jobs.ok?\"unknown\":active.has(m.service)?\"running\":\n disabled.has(m.service)?\"disabled\":\"stopped\");\n const occupied=m.ports.map(p=>ports.get(p)).filter((x): x is Listener=>x!==undefined);\n const ready=status===\"running\" && (m.ports.length===0 ||\n occupied.length>0);\n return {...m,status,ready,pid:m.id===\"uid450\"?\n Number(worker.stdout?.match(/pid = (\\d+)/)?.[1])||null:\n active.get(m.service)?.pid||null,listeners:occupied};\n });\n const workspaceGit=await projectGit(process.env.MAC_MCP_PROJECT_ROOT||root);\n const errors=([[\"launchctl\",jobs],[\"disabled\",disables],\n [\"lsof\",listeners],[\"system-worker\",worker],[\"Tunnel plist\",plist]] satisfies [string,{ok:boolean}][])\n .filter(([,value])=>!value.ok).map(([name])=>name+\" unavailable\");\n return {capturedAt:new Date().toISOString(),host:\"Mac local (loopback only)\",\n mode:\"read-only\",tunnelBackend:plist.ok?tunnelTarget(plist.text):\"unknown\",\n modules,git,workspaceGit,errors,\n milestones:[\n {name:\"P2 ChatGPT Workspace\",status:\"accepted\",detail:\"7/7 real DC calls; read/write/edit and .git denial\"},\n {name:\"P3 Operations Dashboard\",status:\"active\",detail:\"Current service/port monitor on existing 8793\"},\n {name:\"P3 Development Workflow\",status:\"limited-live\",detail:\"Git status / diff / npm smoke via real DC; Git commit approval pending\"},\n {name:\"Direct URL deployment\",status:\"paused\",detail:\"Caddy disabled; HTTP ingress not public\"}\n ]};\n}\nconst esc=(x: unknown)=>String(x??\"\").replace(/[&<>\"']/g,c=>\n ({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"}[c]!));\nfunction stateLabel(x: string){\n return ({running:\"运行中\",disabled:\"已禁用\",stopped:\"已停止\",unknown:\"未能确定\"} as Record<string,string>)[x]||x;\n}\nfunction phaseLabel(x: string){\n return ({active:\"主线\",standby:\"回退\",legacy:\"历史\",paused:\"暂停\",research:\"研究\"} as Record<string,string>)[x]||x;\n}\nexport function renderOperationsHtml(data: Awaited<ReturnType<typeof collectOperationsSnapshot>> & {instance?:{id:string;name:string;port:number};accessControl?:{mode:string};configuredUpstreams?:UpstreamStatus[];denyRuleManagementEnabled?:boolean;permissionManagementEnabled?:boolean;nativeAccessEnabled?:boolean}){\n if(data.instance){\n const i=data.instance;\n return `<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>${esc(i.name)} · Starmux</title><style>\n body{font:16px system-ui;background:#f4f6fa;color:#182230;margin:0}main{max-width:850px;margin:50px auto;padding:24px}section{background:white;border:1px solid #dde3eb;border-radius:14px;padding:24px;margin:18px 0}h1{font-size:32px}h2{font-size:18px}small{color:#667085}code{overflow-wrap:anywhere}nav{display:flex;gap:24px;flex-wrap:wrap}a{color:#2459c3}dt{color:#667085;margin-top:16px}dd{margin:5px 0}\n </style></head><body><main><small>Starmux · Instance</small><h1>${esc(i.name)}</h1><small>${esc(i.id)}</small>\n <section><h2>Local Core is running</h2><dl><dt>MCP endpoint</dt><dd><code>http://127.0.0.1:${i.port}/mcp</code></dd><dt>Authentication</dt><dd>${esc(data.accessControl?.mode??'unavailable')}</dd><dt>Capability</dt><dd>${data.nativeAccessEnabled?'Trusted native tools':'Restricted workspace'}</dd></dl><p>Local health does not verify a remote connection. Configure HTTPS or a protected Tunnel separately.</p></section>\n <section><h2>Manage this instance</h2><nav><a href=\"/access\">Credentials and OAuth sessions</a>${data.permissionManagementEnabled?'<a href=\"/permissions\">Workspace permissions</a>':''}${data.denyRuleManagementEnabled?'<a href=\"/filters\">Tool and directory filters</a>':''}</nav><p>Use the App or CLI to edit configuration, apply changes, inspect logs or stop this instance.</p></section>\n <section><h2>Additional upstreams</h2>${(data.configuredUpstreams??[]).map(u=>`<p>${esc(u.id)} · ${esc(u.status)} · ${u.toolCount} tools</p>`).join('')||'<p>No additional upstreams configured.</p>'}</section><small>Owner-local management · <a href=\"/dashboard.json\">JSON status</a></small></main></body></html>`;\n }\n const active=data.modules.filter(x=>x.status===\"running\").length;\n const livePorts=data.modules.flatMap(x=>x.listeners).map(x=>x.port);\n const expected=data.modules.filter(x=>x.phase===\"active\"&&x.status!==\"running\");\n const tr=data.modules.map(m=>`<tr><td><strong>${esc(m.label)}</strong><small>${esc(m.role)}</small></td><td><span class=\"pill ${esc(m.status)}\">${esc(stateLabel(m.status))}</span></td><td><span class=\"phase\">${esc(phaseLabel(m.phase))}</span></td><td class=\"mono\">${esc(m.ports.length?m.ports.join(\" / \"):\"Unix Socket\")}</td><td class=\"mono\">${esc(m.listeners.length?m.listeners.map(x=>x.port+\" · PID \"+x.pid).join(\", \"):m.status===\"running\"?\"-\":\"未监听\")}</td></tr>`).join(\"\");\n const additional=data.configuredUpstreams||[];\n const upstreamRows=additional.map(u=>\"<tr><td><strong>\"+esc(u.id)+\"</strong></td><td>\"+\n esc(u.status)+\"</td><td>\"+esc(u.toolCount)+\"</td><td>\"+\n esc(u.lastError||\"—\")+\"</td></tr>\").join(\"\");\n const upstreamPanel=additional.length?\n '<section class=\"panel\"><h2>Configured MCP Upstreams</h2><table><thead><tr><th>上游</th><th>当前状态</th><th>已发现工具</th><th>错误代码</th></tr></thead><tbody>'+upstreamRows+'</tbody></table></section>':'';\n const milestones=data.milestones.map(x=>`<li><span class=\"step\">${esc(x.status)}</span><div><b>${esc(x.name)}</b><p>${esc(x.detail)}</p></div></li>`).join(\"\");\n const messages=data.errors.length?[...data.errors]:[];\n if(expected.length)messages.push(expected.length+\" 个主线服务不在运行\");\n return `<!doctype html><html lang=\"zh-CN\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><meta http-equiv=\"refresh\" content=\"25\"><title>Starmux · Operations</title><style>\n :root{color-scheme:light;font-family:system-ui,-apple-system,\"PingFang SC\",\"Microsoft Yahei\",sans-serif}\n *{box-sizing:border-box}body{margin:0;background:#f4f7fb;color:#142138}\n main{max-width:1220px;margin:0 auto;padding:34px 25px 64px}\n header{display:flex;align-items:flex-end;justify-content:space-between;gap:22px;margin-bottom:27px;flex-wrap:wrap}\n h1{font-size:26px;margin:0 0 8px}h2{font-size:16px;margin:0 0 17px}p{line-height:1.55}\n .subtitle{color:#67748b;margin:0}.time{color:#697890;font-size:12px}\n .stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin:0 0 24px}\n .stat,.panel{background:white;border:1px solid #e0e7f0;border-radius:13px;padding:18px}\n .stat small{color:#6b7b93;display:block;margin-bottom:9px}.stat strong{font-size:23px}\n .stat strong.short{font-size:16px}.status-good{color:#137a53}\n .grid{display:grid;grid-template-columns:2fr 1fr;gap:18px}.panel{margin-bottom:18px;overflow:auto}\n table{border-collapse:collapse;width:100%;font-size:13px}th{text-align:left;background:#f7f9fc;color:#687991;font-weight:600}\n td,th{padding:13px 11px;border-bottom:1px solid #e9eef6;vertical-align:middle}tr:last-child td{border:0}\n td small{display:block;color:#718096;margin-top:5px}.pill{padding:5px 9px;border-radius:8px;background:#f2f4f7;font-size:12px;white-space:nowrap}\n .pill.running{color:#0c7451;background:#ddf6e9}.pill.disabled{color:#9a5409;background:#fff1d9}\n .pill.unknown{color:#aa251b;background:#ffefee}.phase{font-size:12px;color:#62728a}\n .mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;white-space:nowrap}\n ul{list-style:none;margin:0;padding:0}li{display:flex;gap:12px;padding:0 0 20px}li:last-child{padding-bottom:0}\n li p{margin:5px 0 0;color:#718096;font-size:12px}\n .step{background:#e9f0ff;color:#2755ad;border-radius:6px;padding:6px;align-self:flex-start;text-transform:uppercase;font-size:10px}\n .notice{border-left:3px solid #7598d6;background:#f0f5ff;padding:11px;color:#425b88;font-size:12px;margin-top:20px}\n footer{color:#8291a3;font-size:12px;padding:10px}\n @media(max-width:950px){.stats{grid-template-columns:repeat(2,1fr)}.grid{grid-template-columns:1fr}}\n @media(max-width:560px){main{padding:19px 10px}.stats{grid-template-columns:1fr 1fr}th,td{padding:10px 7px}}\n </style></head><body><main><header><div><h1>Starmux <span style=\"color:#4777c6\">/ Operations</span></h1><p class=\"subtitle\">运行资产 · 端口占用 · 开发里程碑 · 双入口状态</p></div><div class=\"time\">采样 ${esc(data.capturedAt)}<br>本机只读 · 每 25 秒刷新</div></header>\n <section class=\"stats\"><div class=\"stat\"><small>当前在线服务</small><strong class=\"status-good\">${active} / ${data.modules.length}</strong></div>\n <div class=\"stat\"><small>正在监听的项目端口</small><strong>${new Set(livePorts).size}</strong></div>\n <div class=\"stat\"><small>Private Tunnel 目标</small><strong class=\"short\">${esc(data.tunnelBackend)}</strong></div>\n <div class=\"stat\"><small>正在运行的代码</small><strong class=\"short\">${esc(data.git.branch)} · ${esc(data.git.commit)}</strong><small>${data.git.dirtyCount===null?\"状态未知\":data.git.dirtyCount+\" 个未提交变更\"}</small></div>\n <div class=\"stat\"><small>实际授权项目 Git</small><strong class=\"short\">${esc(data.workspaceGit.branch)} · ${esc(data.workspaceGit.commit)}</strong><small>${data.workspaceGit.dirtyCount===null?\"状态未知\":data.workspaceGit.dirtyCount+\" 个未提交变更\"}</small></div></section>\n <div class=\"grid\"><section class=\"panel\"><h2>服务运行清单</h2><table><thead><tr><th>模块</th><th>系统状态</th><th>研发定位</th><th>登记端口</th><th>实际监听</th></tr></thead><tbody>${tr}</tbody></table></section>\n <section class=\"panel\"><h2>里程碑与开发进度</h2><ul>${milestones}</ul><div class=\"notice\">该面板只观察,不执行任何启动、停用、Git、Shell 命令。全量 DC 工具可发现 ≠ 全部已授权。</div></section></div>\n ${upstreamPanel}\n ${data.denyRuleManagementEnabled?'<section class=\"panel\"><h2>Tool Filters · Explicit Deny</h2><p>所有上游 MCP 工具默认允许。所有者可以禁用指定工具或添加非沙箱型目录过滤。<a href=\"/filters\">管理黑名单</a></p></section>':''}\n ${data.permissionManagementEnabled?'<section class=\"panel\"><h2>Workspace Permissions</h2><p>'+\n (data.nativeAccessEnabled?'当前为可信开发原生透传:Home/自定义目录授权开关不限制原生文件及 Shell 工具;由本地 Desktop Commander 与 macOS 用户权限控制。':'当前支持 Home 与 Home 外只读扫描、自定义目录读写授权。')+\n ' <a href=\"/permissions\">查看目录授权与说明</a></p></section>':''}\n ${messages.length?`<section class=\"panel\"><h2>采集警告</h2><p>${esc(messages.join(\"; \"))}</p></section>`:\"\"}\n <section><h2>Access control</h2><p><a href=\"/access\">Manage authentication and client credentials</a></p><p>Credentials use the owner permission configuration. Network access and tool permissions are managed separately.</p></section>\n <footer>JSON 数据接口:/dashboard.json · 不另占用端口 · 127.0.0.1 本机访问</footer></main></body></html>`;\n}\nexport const dashboardHeaders=Object.freeze({\n \"cache-control\":\"no-store\",\"x-content-type-options\":\"nosniff\",\n \"content-security-policy\":\"default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; frame-ancestors 'none'; form-action 'none'; connect-src 'none'\"\n});\n\nexport function instancePage(html:string,name:string|undefined,id:string|undefined){\n return id?html.replace(/<body([^>]*)>/,`<body$1><aside style=\"padding:12px 24px;border-bottom:1px solid #ddd\">Gateway instance: <strong>${esc(name??id)}</strong> · <small>${esc(id)}</small> · <a href=\"/dashboard\">Overview</a></aside>`):html;\n}\n"]}