starmux 0.13.0 → 0.14.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 (144) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +20 -30
  3. package/dist/src/access-control.js +1 -2
  4. package/dist/src/access-dashboard.js +2 -3
  5. package/dist/src/account-access-policy.js +54 -0
  6. package/dist/src/authorized-workspace-roots.js +0 -1
  7. package/dist/src/batch-read-policy.js +30 -0
  8. package/dist/src/cli/instances.js +6 -175
  9. package/dist/src/cli/oauth.js +0 -1
  10. package/dist/src/cli/starmux-status.js +10 -14
  11. package/dist/src/cli/starmux-supervisor.js +0 -1
  12. package/dist/src/cli/starmux.js +13 -25
  13. package/dist/src/config-schemas.js +0 -9
  14. package/dist/src/configured-mcp-upstreams.js +0 -1
  15. package/dist/src/contracts.js +0 -1
  16. package/dist/src/current-permission-probe.js +0 -1
  17. package/dist/src/dc-workspace-http.js +57 -33
  18. package/dist/src/deny-dashboard.js +2 -3
  19. package/dist/src/desktop-commander-facade.js +4 -4
  20. package/dist/src/explicit-deny-rules.js +2 -3
  21. package/dist/src/global-core-control.js +2 -3
  22. package/dist/src/home-write-sandbox.js +0 -1
  23. package/dist/src/http-host-policy.js +20 -0
  24. package/dist/src/instance-runtime.js +3 -3
  25. package/dist/src/instance-store.js +28 -22
  26. package/dist/src/instance-worker.js +2 -3
  27. package/dist/src/invocation.js +1 -2
  28. package/dist/src/local-desktop-read-probe.js +5 -88
  29. package/dist/src/managed-workspace-policy.js +38 -4
  30. package/dist/src/mcp-results.js +0 -1
  31. package/dist/src/mcp-upstream-router.js +0 -1
  32. package/dist/src/oauth-keycloak.js +0 -1
  33. package/dist/src/oauth-resource.js +0 -1
  34. package/dist/src/ops-dashboard.js +2 -179
  35. package/dist/src/permissions-dashboard.js +3 -4
  36. package/dist/src/platform.js +3 -4
  37. package/dist/src/privacy-diagnostics.js +0 -1
  38. package/dist/src/private-mcp-activity.js +0 -1
  39. package/dist/src/private-store-lock.js +0 -1
  40. package/dist/src/project-dev-presets.js +0 -1
  41. package/dist/src/project-git-workflow.js +0 -1
  42. package/dist/src/project-workspace-policy.js +10 -6
  43. package/dist/src/runtime-identity.js +0 -14
  44. package/dist/src/runtime-paths.js +0 -3
  45. package/dist/src/tool-dispatch.js +45 -46
  46. package/dist/src/validation.js +0 -1
  47. package/dist/src/workspace-grants.js +1 -2
  48. package/package.json +13 -17
  49. package/scripts/prepare.mjs +1 -1
  50. package/CONTRIBUTING.md +0 -18
  51. package/SECURITY.md +0 -7
  52. package/app/README.md +0 -29
  53. package/dist/src/access-control.js.map +0 -1
  54. package/dist/src/access-dashboard.js.map +0 -1
  55. package/dist/src/authorized-workspace-roots.js.map +0 -1
  56. package/dist/src/cli/access.js +0 -53
  57. package/dist/src/cli/access.js.map +0 -1
  58. package/dist/src/cli/community-remote-revoke.js +0 -32
  59. package/dist/src/cli/community-remote-revoke.js.map +0 -1
  60. package/dist/src/cli/instances.js.map +0 -1
  61. package/dist/src/cli/live-home-settings.js +0 -35
  62. package/dist/src/cli/live-home-settings.js.map +0 -1
  63. package/dist/src/cli/mac-mcp-gateway.js +0 -257
  64. package/dist/src/cli/mac-mcp-gateway.js.map +0 -1
  65. package/dist/src/cli/oauth.js.map +0 -1
  66. package/dist/src/cli/permissions-owner.js +0 -27
  67. package/dist/src/cli/permissions-owner.js.map +0 -1
  68. package/dist/src/cli/service-setup.js +0 -26
  69. package/dist/src/cli/service-setup.js.map +0 -1
  70. package/dist/src/cli/setup-wizard.js +0 -149
  71. package/dist/src/cli/setup-wizard.js.map +0 -1
  72. package/dist/src/cli/starmux-status.js.map +0 -1
  73. package/dist/src/cli/starmux-supervisor.js.map +0 -1
  74. package/dist/src/cli/starmux.js.map +0 -1
  75. package/dist/src/cli/verify-setup.js +0 -53
  76. package/dist/src/cli/verify-setup.js.map +0 -1
  77. package/dist/src/community-remote-revocations.js +0 -135
  78. package/dist/src/community-remote-revocations.js.map +0 -1
  79. package/dist/src/config-schemas.js.map +0 -1
  80. package/dist/src/configured-mcp-upstreams.js.map +0 -1
  81. package/dist/src/contracts.js.map +0 -1
  82. package/dist/src/current-permission-probe.js.map +0 -1
  83. package/dist/src/dc-workspace-http.js.map +0 -1
  84. package/dist/src/deny-dashboard.js.map +0 -1
  85. package/dist/src/desktop-commander-facade.js.map +0 -1
  86. package/dist/src/explicit-deny-rules.js.map +0 -1
  87. package/dist/src/gateway-status-format.js +0 -66
  88. package/dist/src/gateway-status-format.js.map +0 -1
  89. package/dist/src/global-core-control.js.map +0 -1
  90. package/dist/src/home-write-sandbox.js.map +0 -1
  91. package/dist/src/instance-migration.js +0 -138
  92. package/dist/src/instance-migration.js.map +0 -1
  93. package/dist/src/instance-runtime.js.map +0 -1
  94. package/dist/src/instance-store.js.map +0 -1
  95. package/dist/src/instance-worker.js.map +0 -1
  96. package/dist/src/invocation.js.map +0 -1
  97. package/dist/src/live-profile-home-settings.js +0 -80
  98. package/dist/src/live-profile-home-settings.js.map +0 -1
  99. package/dist/src/local-desktop-read-probe.js.map +0 -1
  100. package/dist/src/managed-workspace-policy.js.map +0 -1
  101. package/dist/src/mcp-results.js.map +0 -1
  102. package/dist/src/mcp-upstream-router.js.map +0 -1
  103. package/dist/src/oauth-keycloak.js.map +0 -1
  104. package/dist/src/oauth-resource.js.map +0 -1
  105. package/dist/src/operator-cli.js +0 -559
  106. package/dist/src/operator-cli.js.map +0 -1
  107. package/dist/src/ops-dashboard.js.map +0 -1
  108. package/dist/src/permissions-dashboard.js.map +0 -1
  109. package/dist/src/platform.js.map +0 -1
  110. package/dist/src/privacy-diagnostics.js.map +0 -1
  111. package/dist/src/private-mcp-activity.js.map +0 -1
  112. package/dist/src/private-store-lock.js.map +0 -1
  113. package/dist/src/project-dev-presets.js.map +0 -1
  114. package/dist/src/project-git-workflow.js.map +0 -1
  115. package/dist/src/project-workspace-policy.js.map +0 -1
  116. package/dist/src/read-scope.js +0 -44
  117. package/dist/src/read-scope.js.map +0 -1
  118. package/dist/src/release1-onboarding.js +0 -120
  119. package/dist/src/release1-onboarding.js.map +0 -1
  120. package/dist/src/release1-service.js +0 -131
  121. package/dist/src/release1-service.js.map +0 -1
  122. package/dist/src/remote-auth.js +0 -47
  123. package/dist/src/remote-auth.js.map +0 -1
  124. package/dist/src/runtime-identity.js.map +0 -1
  125. package/dist/src/runtime-paths.js.map +0 -1
  126. package/dist/src/starmux-migration.js +0 -172
  127. package/dist/src/starmux-migration.js.map +0 -1
  128. package/dist/src/tool-dispatch.js.map +0 -1
  129. package/dist/src/validation.js.map +0 -1
  130. package/dist/src/workspace-grants.js.map +0 -1
  131. package/docs/ACCESS_CONTROL.md +0 -51
  132. package/docs/CLIENTS.md +0 -22
  133. package/docs/CONNECT_CHATGPT.md +0 -148
  134. package/docs/INSTALL.md +0 -62
  135. package/docs/INSTANCES.md +0 -83
  136. package/docs/OAUTH.md +0 -116
  137. package/docs/PLATFORMS.md +0 -29
  138. package/docs/README.md +0 -16
  139. package/docs/REMOTE_SETUP.md +0 -280
  140. package/docs/SECURITY.md +0 -15
  141. package/docs/assets/starmux-app-en.png +0 -0
  142. package/docs/assets/starmux-architecture.svg +0 -315
  143. package/src/dc-workspace-http.mjs +0 -3
  144. package/test/fixtures/p1-fixture.txt +0 -2
@@ -1 +0,0 @@
1
- {"version":3,"file":"operator-cli.js","sourceRoot":"","sources":["../../src/operator-cli.ts"],"names":[],"mappings":"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","sourcesContent":["import {ownedByUser,supportedHost,windows,childEnvKeys} from \"./platform.js\";\nimport { privateAgentSchema,type PrivateAgent } from \"./config-schemas.js\";\nimport type { GatewayStatus } from \"./contracts.js\";\nimport { legacyCliEntry as cliEntry,packageRoot } from \"./runtime-paths.js\";\nimport { runtimeIdentity,formatStartup } from \"./runtime-identity.js\";\nimport { GatewayError,errorCode,errorMessage,errorStderr,isInteger,isSafeInteger,parseJSON,record } from \"./validation.js\";\nexport interface CliOptions {home?:string;profile?:string;entry?:string;port?:number;controlRoot?:string;appParentPid?:number;json?:boolean;all?:boolean;target?:string;lines?:number}\ntype ServiceInfo={label:string;plist:string;installed:boolean;files:string[]} & ({kind:\"live\";agent:PrivateAgent}|{kind:\"setup\"});\ninterface LifecycleOperations {registered:boolean;portBusy:boolean;disable:()=>Promise<unknown>;enable:()=>Promise<unknown>;bootout:()=>Promise<unknown>;bootstrap:()=>Promise<unknown>;waitPortFree:()=>Promise<boolean>;waitHealthy:()=>Promise<boolean>;port:number}\nexport type CliResult = GatewayStatus | {event:\"GATEWAY_LOGS\";output:string} | {event:\"GATEWAY_RUN_EXIT\";code:number} | {event:\"GATEWAY_CORE\";result:string;port:number;launcher?:string;ownerPid?:number} | Awaited<ReturnType<typeof import('./privacy-diagnostics.js').privacyReport>>;\n// Operator-facing foreground CLI and explicit, per-user launchd lifecycle.\n// Adopt existing private service without overwriting its checked plist.\nimport { execFile as execFileCallback,spawn } from \"node:child_process\";\nimport { access,lstat,readFile } from \"node:fs/promises\";\nimport net from \"node:net\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { acquireControl,connectOwner,globalStop } from \"./global-core-control.js\";\nimport { defaultSetupPath,loadSetupConfig,setupRuntimeEnv } from \"./release1-onboarding.js\";\nimport { SERVICE_LABEL,launchAgentPaths,serviceCommand } from \"./release1-service.js\";\nconst execFile=promisify(execFileCallback);\nconst PRIVATE_LABEL=\"ai.home.mac-mcp-project-workspace\";\nfunction failure(x: string): never {const e=new GatewayError(x);throw e;};\nconst goodPort=(n: unknown): n is number=>isSafeInteger(n)&&n>=1024&&n<=65535;\nexport function classifyServiceRuntime({registered=false,portBusy=false,healthy=false,ownedPid=false}={}){\n if(registered)return healthy?\"service-healthy\":\"service-unhealthy\";\n if(!portBusy)return \"stopped\";\n if(healthy&&ownedPid)return \"foreground\";\n return \"unknown-listener\";\n}\nexport function serviceActionDecision(action: string,{registered=false,portBusy=false}={}){\n if(action===\"start\"){\n if(registered)return \"ALREADY_RUNNING\";\n return portBusy?\"PORT_IN_USE\":\"START\";\n }\n if(action===\"restart\"){\n if(!registered&&portBusy)return \"FOREGROUND_IN_USE\";\n return registered?\"RESTART\":\"START\";\n }\n if(action===\"stop\")return registered?\"STOP\":\"ALREADY_STOPPED\";\n throw Error(\"INVALID_SERVICE_ACTION\");\n}\nconst privatePlist=(home: string)=>path.join(home,\"Library\",\"LaunchAgents\",PRIVATE_LABEL+\".plist\");\nasync function owned(p: string,uid: number,required=false){\n let st;\n try{st=await lstat(p);}catch(e){\n if(errorCode(e)===\"ENOENT\"&&!required)return false;\n throw e;\n }\n if(st.isSymbolicLink()||!st.isFile()||st.nlink!==1||!ownedByUser(p,st)||(process.platform!==\"win32\"&&(st.mode&0o022)))failure(\"UNTRUSTED_OWNER_FILE\");\n return true;\n}\nasync function parsePlist(p: string){\n const {stdout}=await execFile(\"/usr/bin/plutil\",[\"-convert\",\"json\",\"-o\",\"-\",p],\n {timeout:5000,maxBuffer:20000});\n let a;try{a=parseJSON(stdout);}catch{failure(\"PLIST_INVALID\");}\n return a;\n}\nfunction validatePrivate(value: unknown,home: string){\n const parsed=privateAgentSchema.safeParse(value);\n if(!parsed.success)failure(\"PRIVATE_RUNTIME_UNRECOGNIZED\");\n const a=parsed.data;\n const files=a?.ProgramArguments;\n const env=a?.EnvironmentVariables;\n if(a?.Label!==PRIVATE_LABEL||!Array.isArray(files)||files.length!==2||\n typeof files[0]!==\"string\"||typeof files[1]!==\"string\"||\n !files[1].startsWith(path.join(home,\"Library\",\"Application Support\",\n \"Mac-MCP-Gateway\",\"releases\")+path.sep)||\n path.basename(files[1])!==\"dc-workspace-http.mjs\"||\n a.WorkingDirectory!==path.dirname(path.dirname(files[1]))||\n !env||env.MAC_MCP_PROJECT_PORT!==\"8793\")\n failure(\"PRIVATE_RUNTIME_UNRECOGNIZED\");\n return a;\n}\nasync function locate(home: string,uid: number,profile=\"auto\"): Promise<ServiceInfo>{\n if(![\"live\",\"setup\",\"auto\"].includes(profile))failure(\"INVALID_PROFILE\");\n if(process.platform!==\"darwin\"){\n if(profile===\"live\")failure(\"LEGACY_PROFILE_MACOS_ONLY\");\n return {kind:\"setup\",label:SERVICE_LABEL,plist:\"\",installed:false,files:[]};\n }\n const privateFile=privatePlist(home);\n const hasSetup=profile===\"auto\"&&await owned(defaultSetupPath(home),uid);\n if(profile===\"live\"||(profile===\"auto\"&&!hasSetup&&await owned(privateFile,uid))){\n await owned(privateFile,uid,true);\n const a=validatePrivate(await parsePlist(privateFile),home);\n return {kind:\"live\",label:PRIVATE_LABEL,plist:privateFile,agent:a,installed:true,\n files:[a.StandardOutPath,a.StandardErrorPath].filter((value):value is string=>typeof value===\"string\" && value.length>0)};\n }\n const pl=launchAgentPaths(home);\n return {kind:\"setup\",label:SERVICE_LABEL,plist:pl.plist,\n installed:await owned(pl.plist,uid),\n files:[path.join(pl.logs,\"out.log\"),path.join(pl.logs,\"err.log\")]};\n}\nasync function registered(label: string,uid: number){\n if(process.platform!==\"darwin\")return false;\n try{await execFile(\"/bin/launchctl\",[\"print\",\"gui/\"+uid+\"/\"+label],\n {timeout:5000,maxBuffer:10000});return true;}catch{return false;}\n}\nasync function launch(command: string,uid: number,plist: string){\n try{await execFile(\"/bin/launchctl\",[command,\"gui/\"+uid,plist],\n {timeout:12000,maxBuffer:20000});}\n catch(e){failure(\"LAUNCHCTL_\"+command.toUpperCase()+\"_FAILED \"+\n String(errorStderr(e)||errorMessage(e)).slice(0,120));}\n}\nasync function available(port: number): Promise<boolean>{\n return new Promise(resolve=>{\n const server=net.createServer();\n server.once(\"error\",()=>resolve(false));\n server.listen(port,\"127.0.0.1\",()=>server.close(()=>resolve(true)));\n });\n}\nasync function disabledFlag(label: string,uid: number){\n if(process.platform!==\"darwin\")return true;\n try{\n const {stdout}=await execFile(\"/bin/launchctl\",[\"print-disabled\",\"gui/\"+uid],\n {timeout:5000,maxBuffer:120000});\n const line=stdout.split(\"\\n\").find(s=>s.includes('\"'+label+'\" =>'));\n if(!line)return null;\n return line.includes(\"=> disabled\");\n }catch{return null;}\n}\nasync function setAutostart(label: string,uid: number,enabled: boolean){\n try{\n await execFile(\"/bin/launchctl\",[enabled?\"enable\":\"disable\",\n \"gui/\"+uid+\"/\"+label],{timeout:7000,maxBuffer:15000});\n }catch(e){failure(\"LAUNCHCTL_AUTOSTART_CHANGE_FAILED \"+\n String(errorStderr(e)||errorMessage(e)).slice(0,90));}\n}\nasync function listenerOwner(port: number,expectedEntry: string){\n if(process.platform!==\"darwin\")return null;\n try{\n const {stdout}=await execFile(\"/usr/sbin/lsof\",[\n \"-nP\",\"-t\",\"-iTCP:\"+port,\"-sTCP:LISTEN\"],{timeout:4000});\n const pid=Number(stdout.trim().split(\"\\n\")[0]);\n if(!isSafeInteger(pid)||pid<2)return null;\n const info=await execFile(\"/bin/ps\",[\"-p\",String(pid),\"-o\",\"command=\"],\n {timeout:4000});\n return {pid,matchingEntry:info.stdout.trim().includes(expectedEntry)};\n }catch{return null;}\n}\nasync function waitForHealthy(port: number,attempts=24){\n for(let i=0;i<attempts;i++){\n try{\n const r=await fetch(\"http://127.0.0.1:\"+port+\"/healthz\",{\n signal:AbortSignal.timeout(700)});\n if(r.ok&&record(await r.json()).status===\"ok\")return true;\n }catch{}\n await new Promise(resolve=>setTimeout(resolve,250));\n }\n return false;\n}\nasync function waitUntilFree(port: number,attempts=24){\n for(let i=0;i<attempts;i++){\n if(await available(port))return true;\n await new Promise(resolve=>setTimeout(resolve,250));\n }\n return false;\n}\nasync function envFor(info: ServiceInfo,home: string): Promise<NodeJS.ProcessEnv>{\n return info.kind===\"live\"?{...info.agent.EnvironmentVariables}:\n setupRuntimeEnv(await loadSetupConfig(defaultSetupPath(home)));\n}\nasync function currentStatus(info: ServiceInfo,uid: number,home: string,portOverride?:number): Promise<Omit<GatewayStatus,\"event\"|\"coreControl\"|\"coreLauncher\"|\"coreOwnerPid\">>{\n const active=await registered(info.label,uid);\n // First-run setup is a user-owned 0600 profile, NOT an installed\n // launchd Service. Inspect it directly to discover the Core port.\n let env: NodeJS.ProcessEnv|null=info.kind===\"live\"?info.agent.EnvironmentVariables:null;\n if(info.kind===\"setup\"){\n try{env=await envFor(info,home);}\n catch(e){\n if(![\"ENOENT\",\"SETUP_CONFIG_MISSING\"].includes(errorCode(e)||\"\"))throw e;\n }\n }\n const port=portOverride??(env?Number(env.MAC_MCP_PROJECT_PORT):null);\n const portBusy=goodPort(port)?!(await available(port)):false;\n let health=portBusy?\"unreachable\":\"not-running\";\n let workspaceMode=null;\n let writeScope=null;\n let accessMode: GatewayStatus[\"accessMode\"]=null;\n if(portBusy&&port!==null){\n try{\n const r=await fetch(\"http://127.0.0.1:\"+port+\"/healthz\",{\n signal:AbortSignal.timeout(2000)});\n const data=record(await r.json());\n if(data.accessMode===\"ingress\"||data.accessMode===\"api-key\"||data.accessMode===\"oauth\"||data.accessMode===\"unavailable\")accessMode=data.accessMode;\n if(r.ok&&data.status===\"ok\"&&typeof data.mode===\"string\"&&[\"read-only\",\"read-write\"].includes(data.mode))\n workspaceMode=data.mode;\n if(r.ok&&data.status===\"ok\"&&typeof data.writeScope===\"string\"&&[\"home-only\",\"unrestricted\"].includes(data.writeScope))\n writeScope=data.writeScope;\n health=r.ok&&data.status===\"ok\"&&\n data.service===\"dc-project-workspace\"?\"ok\":\"unrecognized\";\n }catch{health=\"unreachable\";}\n }\n const owner=portBusy&&port!==null?await listenerOwner(port,\n info.kind===\"live\"?info.agent.ProgramArguments[1]:\"dc-workspace-http.mjs\"):null;\n let trustedControl=false;\n if(portBusy&&goodPort(port)){\n try{\n const lease=await connectOwner(port);\n trustedControl=lease?.result.result===\"RUNNING\";\n }catch{/* Do not trust a malformed/unresponsive owner lease. */}\n }\n const executionMode=classifyServiceRuntime({\n registered:active,portBusy,healthy:health===\"ok\",\n ownedPid:trustedControl||owner?.matchingEntry===true\n });\n const autostart=await disabledFlag(info.label,uid);\n return {profile:info.kind,installed:info.installed,registered:active,\n label:info.label,port,health,workspaceMode,writeScope,accessMode,executionMode,listenerPid:owner?.pid??null,\n loginAutostart:autostart===null?((info.kind===\"live\"?info.agent.RunAtLoad:undefined)===true?\"default-enabled\":\"unknown\"):autostart?\"disabled\":\"enabled\",\n tcc:process.platform===\"darwin\"?\"Foreground Termius vs background launchd may have different macOS privacy access\":\"Access follows the current OS account permissions\"};\n}\nexport async function executeServiceLifecycle(action: string,{\n registered:running,portBusy:busy,disable,enable,bootout,bootstrap,\n waitPortFree,waitHealthy,port\n}: LifecycleOperations){\n const decision=serviceActionDecision(action,{registered:running,portBusy:busy});\n if(decision===\"PORT_IN_USE\"||decision===\"FOREGROUND_IN_USE\")\n failure(\"FOREGROUND_OR_OTHER_LISTENER_ACTIVE: port \"+port+\n \" already in use; refusing to start competing service\");\n if(action===\"stop\"){\n if(running)await bootout();\n await disable();\n const freed=running?await waitPortFree():!busy;\n return {result:decision===\"STOP\"?\"STOPPED\":\"ALREADY_STOPPED\",\n loginAutostart:\"disabled\",portReleased:freed,\n foregroundInstanceUntouched:!running&&busy};\n }\n if(decision===\"ALREADY_RUNNING\")return {result:decision};\n if(decision===\"RESTART\"){\n await bootout();\n if(!await waitPortFree()){\n await disable();\n failure(\"SERVICE_RESTART_PORT_NOT_RELEASED\");\n }\n }\n await enable();\n try{await bootstrap();}catch(e){\n await disable();throw e;\n }\n if(!await waitHealthy()){\n try{await bootout();}catch{ /* job may already have exited */ }\n await disable();\n failure(\"SERVICE_START_HEALTH_TIMEOUT_ROLLED_BACK\");\n }\n return {result:decision===\"RESTART\"?\"RESTARTED\":\"STARTED\",\n loginAutostart:\"enabled\",health:\"ok\"};\n}\nasync function manage(info: ServiceInfo,action: string,uid: number,home: string,entry: string){\n if(process.platform!==\"darwin\")failure(\"BACKGROUND_SERVICE_UNSUPPORTED_USE_RUN\");\n if(action===\"install\"){\n if(info.kind===\"live\")failure(\"ALREADY_INSTALLED_NO_OVERWRITE\");\n const created=await serviceCommand(\"install\",{\n home,entry,configFile:defaultSetupPath(home)});\n // An installed LaunchAgent does not start again at login until the\n // owner explicitly invokes start; install is not implicit consent.\n await setAutostart(info.label,uid,false);\n return {...created,loginAutostart:\"disabled\"};\n }\n if(!info.installed)failure(\"SERVICE_NOT_INSTALLED\");\n const running=await registered(info.label,uid);\n const env=await envFor(info,home);\n const port=Number(env.MAC_MCP_PROJECT_PORT);\n if(!goodPort(port))failure(\"INVALID_SERVICE_PORT\");\n const busy=!(await available(port));\n const result=await executeServiceLifecycle(action,{\n registered:running,portBusy:busy,port,\n disable:()=>setAutostart(info.label,uid,false),\n enable:()=>setAutostart(info.label,uid,true),\n bootout:()=>launch(\"bootout\",uid,info.plist),\n bootstrap:()=>launch(\"bootstrap\",uid,info.plist),\n waitPortFree:()=>waitUntilFree(port),\n waitHealthy:()=>waitForHealthy(port)\n });\n if(result.result===\"ALREADY_RUNNING\")\n return {...result,health:(await currentStatus(info,uid,home)).health};\n return result;\n}\nasync function logs(info: ServiceInfo,lines: number,uid: number){\n if(!isSafeInteger(lines)||lines<1||lines>200)failure(\"INVALID_LINES\");\n let output=\"\";\n for(const p of info.files){\n if(typeof p!==\"string\"||!path.isAbsolute(p))continue;\n if(!await owned(p,uid))continue;\n const stdout=(await readFile(p,\"utf8\")).split(\"\\n\").slice(-lines-1).join(\"\\n\");\n // Only print to the owner's own terminal; no remote log upload.\n output+=\"== \"+p+\" ==\\n\"+stdout;\n }\n return output||\"No logs yet.\\n\";\n}\nasync function runForeground(info: ServiceInfo,options: CliOptions,home: string,entry: string,uid: number): Promise<number>{\n // App-managed foreground is still this exact CLI/Core, not a second\n // execution engine. Bind the run to its *actual* immediate GUI parent.\n const appParent=options.appParentPid;\n if(appParent!==undefined&&(\n !isSafeInteger(appParent)||appParent<=1||\n process.ppid!==appParent))failure(\"APP_PARENT_IDENTITY_MISMATCH\");\n const env=await envFor(info,home);\n const configuredPort=Number(env.MAC_MCP_PROJECT_PORT);\n const port=options.port??configuredPort;\n if(!goodPort(port))failure(\"INVALID_PORT\");\n // Setup is the user's durable 0600 product configuration. An ad hoc\n // --port must never make App status/topology disagree with the real Core.\n if(info.kind===\"setup\"&&port!==configuredPort)\n failure(\"SETUP_PORT_OVERRIDE_DENIED_RECONFIGURE\");\n // The atomic owner lease arbitrates CLI vs App, not the local 8793\n // listener. No second Gateway is ever spawned while the lease is held.\n const control=await acquireControl(port,{\n launcher:appParent===undefined?\"cli\":\"app\",root:options.controlRoot\n });\n try {\n if(!await available(port))\n failure(\"PORT_IN_USE: a Gateway or unknown local listener already uses this port\");\n env.MAC_MCP_PROJECT_PORT=String(port);\n if(info.kind===\"setup\"){\n env.MAC_MCP_INTERNAL_SETUP_OWNER_PID=String(process.pid);\n env.MAC_MCP_INTERNAL_SETUP_RUN_ID=control.owner.runId;\n env.MAC_MCP_INTERNAL_SETUP_TOKEN=control.owner.token;\n }\n // Legacy configuration supplies settings only, never a different executable.\n const args=info.kind===\"live\"?[process.execPath,path.join(packageRoot,\"src\",\"dc-workspace-http.mjs\")]:[\n process.execPath,entry,\"start-setup\"];\n const cwd=packageRoot;\n await owned(args[1]!, uid,true);\n await access(cwd);\n const identity=await runtimeIdentity();\n const details={...identity,configSource:info.kind===\"live\"?info.plist:defaultSetupPath(home),port};\n const structured=options.json===true||appParent!==undefined;\n process.stdout.write(structured?JSON.stringify({event:\"GATEWAY_FOREGROUND_START\",\n ...details,mode:info.kind,stop:\"Ctrl+C\",existingService:\"untouched\"})+\"\\n\":formatStartup(details));\n // Do not pass unrelated credentials from the operator's shell.\n const inherited: NodeJS.ProcessEnv={};\n for(const key of childEnvKeys){\n if(typeof process.env[key]===\"string\")inherited[key]=process.env[key]!;\n }\n if(process.env.MAC_MCP_ACCESS_FILE)env.MAC_MCP_ACCESS_FILE=process.env.MAC_MCP_ACCESS_FILE;\n const child=spawn(args[0]!,args.slice(1),{\n cwd,env:{...inherited,...env},stdio:windows?[\"inherit\",\"inherit\",\"inherit\",\"ipc\"]:\"inherit\"});\n const stopChild=(signal:NodeJS.Signals)=>{\n if(child.exitCode!==null)return;\n if(windows&&child.connected)child.send({type:\"gateway-stop\"},()=>{});\n else child.kill(signal);\n };\n const exited=new Promise(resolve=>child.once(\"exit\",()=>resolve(true)));\n control.onStop(async()=>{\n stopChild(\"SIGTERM\");\n const ended=await Promise.race([\n exited,new Promise(resolve=>{setTimeout(()=>resolve(false),8000).unref();})\n ]);\n if(!ended)return \"STOP_FAILED\";\n return await waitUntilFree(port,14)?\"STOPPED\":\"STOP_FAILED\";\n });\n control.markRunning();\n return await new Promise<number>((resolve,reject)=>{\n const interrupt=()=>{stopChild(\"SIGINT\");};\n const terminate=()=>{stopChild(\"SIGTERM\");};\n process.on(\"SIGINT\",interrupt);process.on(\"SIGTERM\",terminate);\n // A force-quit/crash of the menu-bar App must not orphan the owned Core.\n // Never monitor, signal or adopt any external listener. This check is\n // activated only by --app-parent-pid; manual CLI Ctrl+C is unchanged.\n const parentWatch=appParent===undefined?null:setInterval(()=>{\n if(process.ppid!==appParent){terminate();}\n },400);\n parentWatch?.unref();\n const cleanup=()=>{\n process.off(\"SIGINT\",interrupt);process.off(\"SIGTERM\",terminate);\n if(parentWatch)clearInterval(parentWatch);\n };\n child.once(\"error\",e=>{cleanup();reject(e);});\n child.once(\"exit\",(code,signal)=>{\n cleanup();\n process.stdout.write(structured?JSON.stringify({event:\"GATEWAY_FOREGROUND_STOP\",code,signal})+\"\\n\":\n `\\n Core exited (${signal??code??\"unknown\"}).\\n`);\n control.markStopped();\n resolve(code===null?(signal===\"SIGINT\"?130:1):code);\n });\n });\n } finally {\n await control.release();\n }\n}\nexport function parseArgs(argv: string[]){\n const action=argv[0]||\"help\";\n const options: CliOptions={};\n for(let i=1;i<argv.length;i++){\n const option=argv[i]!;\n if(option===\"--json\"&&[\"status\",\"run\"].includes(action)){\n if(options.json)failure(\"DUPLICATE_JSON_OPTION\");\n options.json=true;continue;\n }\n if(option===\"--all\"&&action===\"privacy\"){\n options.all=true;continue;\n }\n const v=argv[++i];\n if(v===undefined)failure(\"MISSING_OPTION_VALUE\");\n if(option===\"--profile\"&&[\"live\",\"setup\",\"auto\"].includes(v)){\n options.profile=v;\n }else if(option===\"--port\"&&[\"run\",\"stop\",\"status\"].includes(action)&&goodPort(Number(v))){\n options.port=Number(v);\n }else if(option===\"--app-parent-pid\"&&action===\"run\"&&\n /^[1-9][0-9]*$/.test(v)&&isSafeInteger(Number(v))){\n options.appParentPid=Number(v);\n }else if(option===\"--target\"&&action===\"privacy\"&&path.isAbsolute(v)&&\n !v.includes(\"\\0\")){\n options.target=v;\n }else if(option===\"--lines\"&&action===\"logs\"&&\n isInteger(Number(v))&&Number(v)>=1&&Number(v)<=200){\n options.lines=Number(v);\n }else failure(\"INVALID_OPTION\");\n }\n return {action,options};\n}\nexport async function operatorCommand(action: string,options: CliOptions={}): Promise<CliResult>{\n supportedHost();\n if(process.getuid?.()===0)failure(\"DO_NOT_RUN_AS_ROOT\");\n const home=options.home||homedir(),uid=process.getuid?.()??0;\n const info=await locate(home,uid,options.profile||\"auto\");\n const entry=options.entry??cliEntry();\n if(action===\"status\"){\n const result=await currentStatus(info,uid,home,options.port);\n const port=options.port??result.port??8793;\n let controller=null;\n try{controller=await connectOwner(port,{root:options.controlRoot});}\n catch { /* An unrecognized or stale local owner never grants stop rights. */ }\n return {event:\"GATEWAY_STATUS\",...result,\n coreControl:controller?.result.result??\"unavailable\",\n coreLauncher:controller?.owner.launcher??\"unknown\",\n coreOwnerPid:controller?.owner.pid??null};\n }\n if(action===\"logs\")return {event:\"GATEWAY_LOGS\",\n output:await logs(info,options.lines??60,uid)};\n if(action===\"privacy\"){\n if(process.platform!==\"darwin\")failure(\"PRIVACY_DIAGNOSTICS_MACOS_ONLY\");\n const env=await envFor(info,home);\n const {privacyReport}=await import(\"./privacy-diagnostics.js\");\n return privacyReport({port:Number(env.MAC_MCP_PROJECT_PORT),home,\n all:options.all===true,target:options.target??null});\n }\n if(action===\"run\")return {event:\"GATEWAY_RUN_EXIT\",\n code:await runForeground(info,options,home,entry,uid)};\n if(action===\"stop\"){\n const status=await currentStatus(info,uid,home,options.port);\n const port=options.port??status.port??8793;\n const control=await globalStop(port,{root:options.controlRoot});\n if(control.result===\"NO_CONTROL_OWNER\"){\n if(!await available(port))failure(\"CORE_STOP_REFUSED_UNKNOWN_LISTENER\");\n return {event:\"GATEWAY_CORE\",result:\"ALREADY_STOPPED\",port};\n }\n if(!await waitUntilFree(port,12))\n failure(\"CORE_STOP_UNVERIFIED_PORT_STILL_OCCUPIED\");\n return {event:\"GATEWAY_CORE\",...control,port};\n }\n if([\"install\",\"start\",\"restart\"].includes(action))\n failure(\"SERVICE_MODE_DEFERRED\");\n failure(\"INVALID_ACTION\");\n}\n\n/** Validated legacy settings for the explicit instance migration workflow. */\nexport async function legacyProfileDetails(profile:'setup'|'live',home=homedir()){\n const uid=process.getuid?.()??0;const info=await locate(home,uid,profile);\n const env=await envFor(info,home);\n return {kind:info.kind,source:info.kind==='setup'?defaultSetupPath(home):info.plist,\n env,label:info.label,plist:info.plist,installed:info.installed,registered:await registered(info.label,uid)};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ops-dashboard.js","sourceRoot":"","sources":["../../src/ops-dashboard.ts"],"names":[],"mappings":"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","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"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"permissions-dashboard.js","sourceRoot":"","sources":["../../src/permissions-dashboard.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from \"node:http\";\nimport type { GrantsConfig,PostResult,WorkspaceGrants } from \"./contracts.js\";\nimport { isSafeInteger } from \"./validation.js\";\n// Local owner-facing permissions console. No scripts, cookies or remote MCP\n// tool capable of elevating its own grants.\nconst e=(s: unknown)=>String(s??\"\").replace(/[&<>\"']/g,c=>\n ({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"}[c]!));\nexport const permissionHeaders=Object.freeze({\n \"cache-control\":\"no-store\",\"x-content-type-options\":\"nosniff\",\n \"referrer-policy\":\"no-referrer\",\n \"content-security-policy\":\"default-src 'none'; style-src 'unsafe-inline'; form-action 'self'; base-uri 'none'; frame-ancestors 'none'\"\n});\nconst selector=(grant: unknown,op: string,label: string,warning=\"\")=>\n '<form method=\"post\" action=\"/permissions\">'+\n '<input type=\"hidden\" name=\"op\" value=\"'+e(op)+'\">'+\n '<label>设备所有者管理密钥 <input name=\"token\" type=\"password\" required autocomplete=\"off\"></label> '+\n '<button type=\"submit\">'+e(label)+'</button>'+\n (warning?'<small>'+e(warning)+'</small>':\"\")+\n '</form>';\nexport function renderPermissionDashboard({project,home,config,warning=\"\",nativeAccessEnabled=false}: {project:{path:string;mode:string};home:string;config:GrantsConfig;warning?:string;nativeAccessEnabled?:boolean}){\n const rows=config.custom.map(grant=>\n '<tr><td><code>'+e(grant.path)+'</code></td><td>'+e(grant.mode)+\n '</td><td><form method=\"post\" action=\"/permissions\">'+\n '<input type=\"hidden\" name=\"op\" value=\"revoke\">'+\n '<input type=\"hidden\" name=\"target\" value=\"'+e(grant.path)+'\">'+\n '<input type=\"password\" name=\"token\" autocomplete=\"off\" required placeholder=\"管理密钥\">'+\n '<button type=\"submit\">撤销</button></form></td></tr>').join(\"\");\n return '<!doctype html><html lang=\"zh-CN\"><head>'+\n '<meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">'+\n '<title>Starmux · Workspace Permissions</title>'+\n '<style>body{font:15px system-ui,-apple-system,sans-serif;max-width:940px;margin:30px auto;padding:0 20px;color:#233045;background:#f6f7fa}'+\n 'section{background:white;border:1px solid #ddd;padding:20px;margin:15px 0;border-radius:12px}'+\n 'table{border-collapse:collapse;width:100%}td,th{padding:10px;border-bottom:1px solid #ddd;text-align:left}'+\n 'input,select,button{font:inherit;padding:6px;margin:4px}input[name=target]{width:90%;max-width:550px}'+\n 'small{display:block;color:#657083}code{overflow-wrap:anywhere}button{cursor:pointer}</style></head><body>'+\n '<h1>Starmux · 目录授权</h1>'+\n '<p>本页在 Mac 本机管理 Gateway 权限。远程 AI 不可自行增加权限。'+\n '增加或撤销授权后,下一次工具调用立即使用新权限。</p>'+\n (warning?'<section role=\"alert\">'+e(warning)+'</section>':\"\")+\n (nativeAccessEnabled?'<section role=\"alert\"><h2>可信开发模式 · 完整本地执行权限</h2>'+\n '<p>此设备所有者启用了原生 Desktop Commander 工具透传。'+\n '以下 Home/外部/自定义目录开关<strong>不限制原生 DC 文件和 Shell 工具</strong>;'+\n '可访问范围由 Desktop Commander 和 macOS 用户账户决定。'+\n '开关仅在切回受限工作区模式后生效。请勿将此服务暴露给未经认证的客户端。</p>'+\n '</section>':\"\")+\n '<section><h2>工作目录 · 读写范围</h2><code>'+e(project.path)+'</code>'+\n '<p>工作模式:<b>'+e(project.mode)+'</b>。该项目沿用原有 Gateway 安全规则。</p></section>'+\n '<section><h2>Home · 只读</h2><code>'+e(home)+'</code>'+\n '<p>当前:<b>'+(config.homeRead?\"已开启只读扫描\":\"未授权\")+'</b></p>'+\n selector(null,config.homeRead?\"home-disable\":\"home-enable\",\n config.homeRead?\"关闭 Home 读取\":\"允许 Home 只读\",\n \"默认仍保护 SSH、密钥、凭据及配置路径。\")+'</section>'+\n '<section><h2>Home 外 · 只读</h2>'+\n '<p>当前:<b>'+(config.outsideRead?\"已开启只读扫描\":\"未授权\")+'</b></p>'+\n selector(null,config.outsideRead?\"outside-disable\":\"outside-enable\",\n config.outsideRead?\"关闭 Home 外读取\":\"允许 Home 外只读\",\n \"不会授予删除、任意 Shell 或写操作。\")+'</section>'+\n '<section><h2>自定义目录 · 单独授权</h2>'+\n '<table><thead><tr><th>目录</th><th>权限</th><th>操作</th></tr></thead><tbody>'+\n (rows||'<tr><td colspan=\"3\">暂无自定义授权</td></tr>')+'</tbody></table>'+\n '<h3>新增或修改</h3><form method=\"post\" action=\"/permissions\">'+\n '<input type=\"hidden\" name=\"op\" value=\"add\">'+\n '<label>绝对路径 <input type=\"text\" name=\"target\" required placeholder=\"/Volumes/Disk/Folder\"></label>'+\n '<label>权限 <select name=\"mode\"><option value=\"read-only\">只读</option>'+\n '<option value=\"read-write\">读写</option></select></label>'+\n '<label>管理密钥 <input type=\"password\" name=\"token\" required autocomplete=\"off\"></label>'+\n '<button type=\"submit\">确认授权</button></form></section>'+\n '<p><a href=\"/dashboard\">返回运行 Dashboard</a> · '+\n '<a href=\"/filters\">工具黑名单</a></p>'+\n '<small>授权管理密钥仅在 Mac 本地终端显示;不可交给远程 Agent。'+\n '本页不改变 trusted-project 的同 UID Shell 风险。</small></body></html>';\n}\nexport async function applyPermissionPost(req: IncomingMessage,grants: WorkspaceGrants,host: string|undefined): Promise<PostResult>{\n if(req.headers.origin!==\"http://\"+host||\n (req.headers[\"content-type\"]||\"\").split(\";\")[0]!==\"application/x-www-form-urlencoded\")\n return {status:403,message:\"Owner authorization required\"};\n const size=Number(req.headers[\"content-length\"]||0);\n if(!isSafeInteger(size)||size>4096||size<1)\n return {status:413,message:\"Invalid request\"};\n let body=\"\";\n for await(const chunk of req){\n body+=chunk.toString(\"utf8\");\n if(Buffer.byteLength(body)>4096)return {status:413,message:\"Invalid request\"};\n }\n const q=new URLSearchParams(body);\n for(const key of q.keys())\n if(![\"op\",\"target\",\"mode\",\"token\"].includes(key)||q.getAll(key).length!==1)\n return {status:400,message:\"Invalid form\"};\n if(!await grants.authorized(q.get(\"token\")))\n return {status:403,message:\"Owner authorization required\"};\n const operation=q.get(\"op\")??\"\";\n if(![\"home-enable\",\"home-disable\",\"outside-enable\",\"outside-disable\",\"add\",\"revoke\"]\n .includes(operation))return {status:400,message:\"Invalid operation\"};\n if(operation===\"add\"&&![\"read-only\",\"read-write\"].includes(q.get(\"mode\")??\"\"))\n return {status:400,message:\"Invalid mode\"};\n try{\n await grants.update(operation,{target:q.get(\"target\"),mode:q.get(\"mode\")});\n return {status:303,location:\"/permissions\"};\n }catch{\n return {status:400,message:\"Grant rejected: verify directory and permissions\"};\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":"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","sourcesContent":["// Host integration for the shared CLI. macOS App and legacy paths stay stable.\nimport {execFileSync} from 'node:child_process';\nimport {lstatSync,mkdirSync,type Stats} from 'node:fs';\nimport {homedir,tmpdir} from 'node:os';\nimport path from 'node:path';\nimport {createHash} from 'node:crypto';\nexport const windows=process.platform==='win32';\nexport function supportedHost(){\n if(!['darwin','linux','win32'].includes(process.platform)||Number(process.versions.node.split('.')[0])<22)\n throw Error('REQUIRES_SUPPORTED_OS_NODE_22');\n}\nfunction powershell(script:string,file=''){\n return execFileSync('powershell.exe',['-NoLogo','-NoProfile','-NonInteractive','-EncodedCommand',Buffer.from('$ErrorActionPreference=\"Stop\"; '+script,'utf16le').toString('base64')],\n {encoding:'utf8',timeout:15000,windowsHide:true,env:{...process.env,GATEWAY_ACL_PATH:file}}).trim();\n}\n// Paths are passed as data, never interpolated into a PowerShell program.\nexport function ownedByUser(file:string,stat:Stats,privateMode=false):boolean{\n if(stat.isSymbolicLink())return false;\n if(!windows)return stat.uid===process.getuid?.()&&(!privateMode||(stat.mode&0o077)===0);\n try{\n return powershell(`$me=[System.Security.Principal.WindowsIdentity]::GetCurrent().User;\n $acl=Get-Acl -LiteralPath $env:GATEWAY_ACL_PATH;\n # Elevated Windows processes may create files owned by Administrators.\n # These privileged principals can already override a user's ACL.\n if($acl.GetOwner([System.Security.Principal.SecurityIdentifier]).Value -notin @($me.Value,'S-1-5-18','S-1-5-32-544')){exit 1};\n ${privateMode?`$hasOwnerRule=$false; foreach($r in $acl.GetAccessRules($true,$true,[System.Security.Principal.SecurityIdentifier])){\n if($r.AccessControlType -eq 'Allow' -and $r.IdentityReference.Value -eq $me.Value){$hasOwnerRule=$true};\n if($r.AccessControlType -eq 'Allow' -and $r.IdentityReference.Value -notin @($me.Value,'S-1-5-18','S-1-5-32-544')){exit 1}\n }; if(-not $hasOwnerRule){exit 1}`:''}\n Write-Output 'OK'`,file)==='OK';\n }catch{return false;}\n}\nexport function createPrivateDirectory(folder:string){\n try{const st=lstatSync(folder);if(!st.isDirectory()||!ownedByUser(folder,st,true))throw Error('PRIVATE_DIRECTORY_UNSAFE');return;}\n catch(e){if(!(e instanceof Error&&'code' in e&&e.code==='ENOENT'))throw e;}\n mkdirSync(folder,{recursive:true,mode:0o700});\n if(windows){\n if(!ownedByUser(folder,lstatSync(folder)))throw Error('PRIVATE_DIRECTORY_UNSAFE');\n powershell(`$me=[System.Security.Principal.WindowsIdentity]::GetCurrent().User;\n $acl=New-Object System.Security.AccessControl.DirectorySecurity;\n $acl.SetOwner($me);$acl.SetAccessRuleProtection($true,$false);\n $rule=New-Object System.Security.AccessControl.FileSystemAccessRule($me,'FullControl','ContainerInherit,ObjectInherit','None','Allow');\n $acl.AddAccessRule($rule);Set-Acl -LiteralPath $env:GATEWAY_ACL_PATH -AclObject $acl`,folder);\n }\n if(!ownedByUser(folder,lstatSync(folder),true))throw Error('PRIVATE_DIRECTORY_UNSAFE');\n}\nexport function controlRoot(){\n if(process.platform==='darwin')return `/private/tmp/mac-mcp-gateway-${process.getuid!()}`;\n const id=windows?createHash('sha256').update(homedir().toLowerCase()).digest('hex').slice(0,16):String(process.getuid!());\n return path.join(tmpdir(),`mac-mcp-gateway-${id}`);\n}\nexport function within(candidate:string,root:string){\n const relative=path.relative(root,candidate);\n return relative===''||(!path.isAbsolute(relative)&&relative!=='..'&&!relative.startsWith('..'+path.sep));\n}\nexport const childEnvKeys=['PATH','Path','HOME','USERPROFILE','HOMEDRIVE','HOMEPATH','SystemRoot','SYSTEMROOT','WINDIR','ComSpec','COMSPEC','PATHEXT','APPDATA','LOCALAPPDATA','TEMP','TMP','TMPDIR','LANG','LC_ALL','LC_CTYPE','USER','USERNAME','LOGNAME','TERM','COLORTERM'];\nexport function shellQuote(value:string){\n if(/[\\r\\n\\0]/.test(value))throw Error('SHELL_ARGUMENT_INVALID');\n return windows?\"'\"+value.replaceAll(\"'\",\"''\")+\"'\":\"'\"+value.replaceAll(\"'\",\"'\\\\''\")+\"'\";\n}\nexport function commandOptions(command:string){return windows?{command,shell:'powershell.exe'}:{command};}\nexport function inDirectory(root:string,command:string){\n return windows?`Set-Location -LiteralPath ${shellQuote(root)} -ErrorAction Stop; ${command}`:`cd ${shellQuote(root)} && ${command}`;\n}\nexport const gitBinary=process.platform==='darwin'?'/usr/bin/git':'git';\nexport const systemNameCommand=windows?'[System.Environment]::OSVersion.Platform.ToString()':'/usr/bin/uname -s';\n// Windows reports logical KiB; Unix du reports allocated KiB. Neither follows\n// reparse points/symlinks into unapproved trees. This command only reads sizes.\nexport function diskUsageCommand(target:string,depth:number){\n if(!windows)return (depth===0?'/usr/bin/du -sk -- ':'/usr/bin/du -k -d 1 -- ')+shellQuote(target);\n return `$ErrorActionPreference='Stop';\n function Measure-Tree($item){\n if($item.Attributes -band [IO.FileAttributes]::ReparsePoint){return [long]0};\n if(-not $item.PSIsContainer){return [long]$item.Length};\n [long]$bytes=0;\n foreach($child in Get-ChildItem -LiteralPath $item.FullName -Force){$bytes+=Measure-Tree $child};\n return $bytes\n };\n $root=Get-Item -LiteralPath ${shellQuote(target)} -Force;\n ${depth===1?`foreach($entry in Get-ChildItem -LiteralPath $root.FullName -Force -Directory){\n '{0} {1}' -f [math]::Ceiling((Measure-Tree $entry)/1024),$entry.FullName\n };`:''}\n '{0} {1}' -f [math]::Ceiling((Measure-Tree $root)/1024),$root.FullName`;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"privacy-diagnostics.js","sourceRoot":"","sources":["../../src/privacy-diagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["import { ListToolsResultSchema } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { CallToolResult } from \"./contracts.js\";\nimport { toolResult } from \"./mcp-results.js\";\nimport { errorCode,errorMessage,errorStderr,isSafeInteger,record } from \"./validation.js\";\n// Read-only, operator-invoked macOS privacy parity probe.\n// The gateway RPC is intentionally used to test the execution context that\n// actually touches protected files; \"node\", UID or a successful /healthz\n// cannot establish TCC access by themselves.\nimport { execFile as callback } from \"node:child_process\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nconst execFile=promisify(callback);\nfunction failure(message: string): never {throw new Error(message);};\nconst protectedSuffixes=[\n \"Library/Application Support/CloudDocs\",\n \"Library/Application Support/MobileSync\",\n \"Library/Application Support/com.apple.TCC\",\n \"Library/Application Support/AddressBook\",\n \"Library/Application Support/FaceTime\",\n \"Library/Application Support/Knowledge\"\n];\nconst validPort=(p: unknown): p is number=>isSafeInteger(p)&&p>=1024&&p<=65535;\nconst sizeMatch=/(?:^|\\n)\\s*(\\d+)\\s+(.+)(?:\\n|$)/;\nexport function parseDuOutput(stdout=\"\",stderr=\"\",exitCode: unknown=0){\n const error=String(stderr||\"\");\n if(/Operation not permitted|Permission denied/i.test(error))\n return {state:\"OS_DENIED\",reason:\"macOS filesystem access denied; TCC attribution not independently proven\"};\n if(exitCode===null&&/Operation not permitted|Permission denied/i.test(stdout))\n return {state:\"OS_DENIED\",reason:\"macOS filesystem access denied; TCC attribution not independently proven\"};\n const m=String(stdout||\"\").match(sizeMatch);\n if(exitCode===0&&m)return {state:\"READ_OK\",kib:Number(m[1])};\n return {state:\"INCONCLUSIVE\",reason:exitCode===null?\"No final process result\":\n \"du exited \"+exitCode};\n}\nasync function rpc(port: number,method: string,params: Record<string,unknown>={}){\n const response=await fetch(\"http://127.0.0.1:\"+port+\"/mcp\",{\n method:\"POST\",\n headers:{\"content-type\":\"application/json\",\"accept\":\"application/json, text/event-stream\"},\n body:JSON.stringify({jsonrpc:\"2.0\",id:44,method,params}),\n signal:AbortSignal.timeout(6000)\n });\n if(!response.ok)failure(\"MCP_HTTP_\"+response.status);\n const value=record(await response.json());\n if(value.error)failure(\"MCP_JSONRPC_ERROR\");\n if(!value.result||typeof value.result!==\"object\")failure(\"MCP_RESULT_MISSING\");\n return record(value.result);\n}\nconst extractText=(reply: CallToolResult)=>(reply.content||[]).filter(x=>x.type===\"text\")\n .map(x=>String(x.text)).join(\"\\n\");\nexport function parseMcpDu(reply: CallToolResult){\n const text=extractText(reply);\n if(/WORKSPACE_DENIED|TOOL_DISABLED_BY_OWNER|DIRECTORY_DISABLED_BY_OWNER/.test(text))\n return {state:\"GATEWAY_DENIED\",reason:\"Owner Gateway policy denied invocation\"};\n if(/Operation not permitted|Permission denied/i.test(text))\n return {state:\"OS_DENIED\",reason:\"macOS filesystem access denied in Gateway execution context\"};\n const match=text.match(sizeMatch);\n if(match)return {state:\"READ_OK\",kib:Number(match[1])};\n return {state:reply.isError?\"UPSTREAM_ERROR\":\"INCONCLUSIVE\",\n reason:\"No terminal result captured; not proof of OS access\"};\n}\nasync function direct(target: string){\n try{\n const r=await execFile(\"/usr/bin/du\",[\"-sk\",target],{\n timeout:9000,maxBuffer:12000,encoding:\"utf8\"\n });\n return parseDuOutput(r.stdout,r.stderr,0);\n }catch(e){\n if(errorCode(e)===\"ENOENT\")return {state:\"MISSING\"};\n const details=record(e);\n if(details.killed)return {state:\"TIMEOUT\"};\n return parseDuOutput(typeof details.stdout===\"string\"?details.stdout:\"\",errorStderr(e)||\"\",details.code??1);\n }\n}\nasync function throughGateway(port: number,target: string){\n try{\n const catalog=ListToolsResultSchema.parse(await rpc(port,\"tools/list\"));\n if(!catalog.tools?.some(x=>x.name===\"start_process\"))\n return {state:\"TOOL_UNAVAILABLE\",reason:\"start_process is disabled or missing\"};\n // Single-quote for shell arguments; no shell interpolation from target.\n const quoted=\"'\"+target.replace(/'/g,\"'\\\\''\")+\"'\";\n let reply=toolResult(await rpc(port,\"tools/call\",{\n name:\"start_process\",\n arguments:{command:\"/usr/bin/du -sk \"+quoted,timeout_ms:3000}\n }));\n let result=parseMcpDu(reply);\n const message=extractText(reply);\n if(result.state===\"INCONCLUSIVE\"&&catalog.tools.some(x=>x.name===\"read_process_output\")){\n const match=message.match(/Process started with PID\\s+(\\d+)/);\n if(match){\n await new Promise(r=>setTimeout(r,150));\n try{\n reply=toolResult(await rpc(port,\"tools/call\",{name:\"read_process_output\",\n arguments:{pid:Number(match[1]),offset:0,length:100,timeout_ms:1000}}));\n result=parseMcpDu(reply);\n }catch{\n // A missed asynchronous output is inconclusive, not denied.\n }\n }\n }\n return result;\n }catch(e){\n return {state:\"GATEWAY_UNAVAILABLE\",reason:String(errorMessage(e)||e).slice(0,95)};\n }\n}\nexport function classifyPrivacy(directState: string,gatewayState: string){\n if(directState===\"READ_OK\"&&gatewayState===\"READ_OK\")\n return \"PARITY_OK\";\n if(directState===\"READ_OK\"&&gatewayState===\"OS_DENIED\")\n return \"EXECUTION_CONTEXT_MISMATCH\";\n if(gatewayState===\"GATEWAY_DENIED\")\n return \"GATEWAY_POLICY\";\n if(directState===\"OS_DENIED\"&&gatewayState===\"OS_DENIED\")\n return \"BOTH_DENIED\";\n if(directState===\"MISSING\")return \"DIRECTORY_NOT_FOUND\";\n return \"NEEDS_REVIEW\";\n}\nexport async function privacyReport({port,home=os.homedir(),all=false,target=null}: {port:number;home?:string;all?:boolean;target?:string|null}){\n if(!validPort(port))failure(\"PRIVACY_INVALID_PORT\");\n if(target!==null&&(typeof target!==\"string\"||!path.isAbsolute(target)||\n target.includes(\"\\0\")||target.length>2048))failure(\"PRIVACY_TARGET_ABSOLUTE_REQUIRED\");\n if(target&&all)failure(\"PRIVACY_TARGET_AND_ALL_CONFLICT\");\n const paths=target?[target]:protectedSuffixes.slice(0,all?undefined:1)\n .map(s=>path.join(home,s));\n const entries=[];\n for(const p of paths){\n const d=await direct(p);\n const g=await throughGateway(port,p);\n entries.push({target:p,terminal:d,gateway:g,\n comparison:classifyPrivacy(d.state,g.state)});\n }\n return {\n event:\"GATEWAY_PRIVACY_DIAGNOSIS\" as const,\n timestamp:new Date().toISOString(),port,\n source:\"actual /usr/bin/du -sk in terminal and loopback MCP Desktop Commander\",\n readOnly:true,\n entries,\n note:\"This tests actual directory access, not the TCC database or the responsible app identity. launchd and Termius may differ. No permission is changed.\"\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"private-mcp-activity.js","sourceRoot":"","sources":["../../src/private-mcp-activity.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AuditEvent } from \"./contracts.js\";\n// Opt-in, in-memory, owner-local recent MCP tool activity only.\n// Never retain caller identity, MCP params, tool name, payload, filenames,\n// network headers, token, arbitrary audit fields or request IDs.\nconst MAX_EVENTS=8;\nconst WINDOW_MS=15*60*1000;\nconst ROUTE=/^[a-z][a-z0-9_-]{0,39}$/;\nconst COMPLETED=new Set([\"DC_NATIVE_COMPLETED\",\"DC_BRIDGE_COMPLETED\",\n \"MCP_ROUTE_COMPLETED\",\"GIT_WORKFLOW_COMPLETE\",\n \"GATEWAY_DISK_USAGE_COMPLETED\"]);\nconst BLOCKED=new Set([\"TOOL_EXPLICITLY_DENIED\",\"DC_BRIDGE_DENIED\",\n \"GATEWAY_DISK_USAGE_DENIED\",\"MCP_ROUTE_DENIED\",\n \"GIT_WORKFLOW_DENIED\",\"GATEWAY_CONFIG_MUTATION_DENIED\"]);\nconst FAILED=new Set([\"DC_NATIVE_UPSTREAM_FAILED\",\"DC_BRIDGE_UPSTREAM_FAILED\",\n \"MCP_ROUTE_UPSTREAM_FAILED\",\"GATEWAY_DISK_USAGE_UPSTREAM_FAILED\",\n \"GIT_WORKFLOW_UPSTREAM_FAILED\"]);\nexport function createPrivateMCPActivity({now=()=>Date.now(),routeFor=()=>null}: {now?:()=>number;routeFor?:(name:string)=>string|null}={}){\n let events: {at:number;route:string|null;outcome:string}[]=[];\n function observation(audit: AuditEvent){\n const event=typeof audit?.event===\"string\"?audit.event:\"\";\n // COMPLETED means the transport got a tool response, not that the\n // tool succeeded. Preserve this distinction without retaining the\n // message, arguments, name, path or upstream error details.\n const outcome=BLOCKED.has(event)?\"blocked\":\n FAILED.has(event)?\"error\":\n COMPLETED.has(event)?(audit.isError===true?\"error\":\"complete\"):null;\n if(!outcome)return false;\n // Named health probes and config summaries are *not* AI activity.\n if(typeof audit.tool===\"string\"&&audit.tool===\"health_check\")return false;\n if(event===\"GATEWAY_CONFIG_MUTATION_DENIED\")return false;\n const via=typeof audit.tool===\"string\"?routeFor(audit.tool):null;\n const route=ROUTE.test(via||\"\")?via:\n event.startsWith(\"GATEWAY_DISK_USAGE_\")?\"desktop\":\n event.startsWith(\"GIT_\")?\"gateway\":\n event===\"TOOL_EXPLICITLY_DENIED\"?\"unknown\":\"desktop\";\n const at=now();\n if(!Number.isFinite(at)||at<0)return false;\n events.push({at,route,outcome});\n events=events.filter(x=>at-x.at>=0&&at-x.at<=WINDOW_MS).slice(-MAX_EVENTS);\n return true;\n }\n function snapshot(){\n const at=now();\n const recent=events.filter(x=>at-x.at>=0&&at-x.at<=WINDOW_MS);\n return Object.freeze({\n schemaVersion:1,\n enabled:true,\n evidence:\"gateway-tool-dispatch-audit\",\n attribution:\"unverified\",\n scope:\"owner-local-memory\",\n idleExpirySeconds:WINDOW_MS/1000,\n lastToolCallAt:recent.length?new Date(recent.at(-1)!.at).toISOString():null,\n recent:recent.slice(-5).reverse().map(x=>({\n at:new Date(x.at).toISOString(),route:x.route,outcome:x.outcome\n }))\n });\n }\n return Object.freeze({observeAudit:observation,snapshot});\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"private-store-lock.js","sourceRoot":"","sources":["../../src/private-store-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,EAAE,EAAC,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,sBAAsB,EAAC,MAAM,eAAe,CAAC;AACrD,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAI,IAAW,EAAC,MAAqB;IACxE,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,GAAG,EAAC,CAAC,EAAE,EAAC,CAAC;QACrB,IAAG,CAAC;YAAA,MAAM,KAAK,CAAC,IAAI,EAAC,EAAC,IAAI,EAAC,KAAK,EAAC,CAAC,CAAC;YAAA,MAAM;QAAA,CAAC;QAAA,OAAM,CAAC,EAAC,CAAC;YACjD,IAAI,CAA2B,CAAC,IAAI,KAAG,QAAQ;gBAAC,MAAM,CAAC,CAAC;YACxD,IAAG,CAAC,KAAG,EAAE;gBAAC,MAAM,KAAK,CAAC,+EAA+E,CAAC,CAAC;YACvG,MAAM,IAAI,OAAO,CAAC,CAAC,CAAA,EAAE,CAAA,UAAU,CAAC,CAAC,EAAC,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,IAAG,CAAC;QAAA,OAAO,MAAM,MAAM,EAAE,CAAC;IAAA,CAAC;YAAO,CAAC;QAAA,MAAM,EAAE,CAAC,IAAI,EAAC,EAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC;IAAA,CAAC;AACtE,CAAC","sourcesContent":["import {mkdir,rm} from 'node:fs/promises';\nimport path from 'node:path';\nimport {createPrivateDirectory} from './platform.js';\n/** Cross-process writer lock. Stale locks fail closed rather than guessing ownership. */\nexport async function withPrivateLock<T>(file:string,action:()=>Promise<T>):Promise<T>{\n createPrivateDirectory(path.dirname(file));\n for(let i=0;i<100;i++){\n try{await mkdir(file,{mode:0o700});break;}catch(e){\n if((e as NodeJS.ErrnoException).code!=='EEXIST')throw e;\n if(i===99)throw Error('INSTANCE_STORE_BUSY: retry; do not remove locks while an operation is running');\n await new Promise(r=>setTimeout(r,20));\n }\n }\n try{return await action();}finally{await rm(file,{recursive:true});}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-dev-presets.js","sourceRoot":"","sources":["../../src/project-dev-presets.ts"],"names":[],"mappings":"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","sourcesContent":["import {shellQuote,gitBinary,inDirectory,commandOptions} from \"./platform.js\";\nimport type { CallToolResult,ToolArguments } from \"./contracts.js\";\nimport { isSafeInteger } from \"./validation.js\";\n// Strict project development command presets executed by upstream Desktop Commander.\n// The AI selects only a named preset; no arbitrary shell text reaches the engine.\nexport class DevPresetDenied extends Error{\n constructor(public readonly code: string){super(code);}\n}\nfunction deny(code: string): never{throw new DevPresetDenied(code);}\nexport function createDevPresets(projectRoot: string,mode: string,{now=()=>Date.now()}={}){\n const dir=shellQuote(projectRoot);\n const preset: Readonly<Record<string, {command:string;timeout_ms:number;readOnly:boolean}>>=Object.freeze({\n project_git_status:{\n command:gitBinary+\" -C \"+dir+\" status --short --untracked-files=normal\",\n timeout_ms:5000,readOnly:true\n },\n project_git_diff_stat:{\n command:gitBinary+\" -C \"+dir+\" diff --stat --\",\n timeout_ms:5000,readOnly:true\n },\n project_smoke_tests:{\n command:inDirectory(projectRoot,\"npm run test:p0\"),\n timeout_ms:15000,readOnly:false\n },\n project_full_tests:{\n command:inDirectory(projectRoot,\"npm test\"),\n timeout_ms:30000,readOnly:false\n }\n });\n const owned=new Map<number,number>();\n return Object.freeze({\n prepareStart(args: ToolArguments){\n if(!args||Object.keys(args).some(x=>![\"command\",\"timeout_ms\"].includes(x))||\n typeof args.command!==\"string\")deny(\"PRESET_NOT_APPROVED\");\n const p=preset[args.command];\n if(!p)deny(\"PRESET_NOT_APPROVED\");\n if(!p.readOnly&&mode!==\"read-write\")deny(\"TEST_NEEDS_WRITE_MODE\");\n if(args.timeout_ms!==p.timeout_ms)deny(\"PRESET_TIMEOUT_REQUIRED\");\n return {name:\"start_process\",arguments:{...commandOptions(p.command),timeout_ms:p.timeout_ms}};\n },\n observe(name: string,result: CallToolResult,args: ToolArguments){\n if(name===\"read_process_output\"){\n // Only a real, non-error upstream response can extend an owned PID lease.\n // Request validation alone must not keep a dead/reused PID authorized.\n if(result?.isError!==true&&isSafeInteger(args?.pid)&&owned.has(args.pid))\n owned.set(args.pid,now());\n return;\n }\n if(name!==\"start_process\"||result?.isError===true)return;\n const text=(result?.content||[]).filter(c=>c.type===\"text\").map(c=>c.text).join(\"\\n\");\n const pid=Number(text.match(/Process started with PID (\\d+)/)?.[1]);\n if(isSafeInteger(pid)&&pid>0){\n owned.set(pid,now());\n for(const [id,time] of owned)if(now()-time>600000)owned.delete(id);\n }\n },\n prepareReadOutput(args: ToolArguments){\n if(!args||Object.keys(args).some(x=>![\"pid\",\"timeout_ms\",\"offset\",\"length\"].includes(x)))\n deny(\"OUTPUT_ARGUMENTS_DENIED\");\n const checkedAt=now();\n if(!isSafeInteger(args.pid)||!owned.has(args.pid)||\n checkedAt-owned.get(args.pid)!>600000)deny(\"PROCESS_NOT_OWNED\");\n const offset=args.offset??0,length=args.length??100;\n const timeout_ms=args.timeout_ms??1500;\n // DC supports negative offsets for tail reads. Bound the tail window.\n if(!isSafeInteger(offset)||offset < -300||\n !isSafeInteger(length)||length<1||length>300||\n !isSafeInteger(timeout_ms)||timeout_ms<0||timeout_ms>3000)\n deny(\"OUTPUT_LIMIT\");\n // Do not extend the lease yet: only observe() after an upstream response\n // establishes actual continued availability of this native DC session.\n return {name:\"read_process_output\",arguments:{\n pid:args.pid,offset,length,timeout_ms\n }};\n },\n names:Object.keys(preset)\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-git-workflow.js","sourceRoot":"","sources":["../../src/project-git-workflow.ts"],"names":[],"mappings":"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","sourcesContent":["import {shellQuote,gitBinary,commandOptions,windows} from \"./platform.js\";\nimport type { CallToolResult,McpUpstream,Tool,ToolArguments,WorkspacePolicy } from \"./contracts.js\";\ninterface Ticket {path: string; created: number; hash?: string; head?: string}\n// Git review/stage/commit/push adapter. Actual Git work is delegated to\n// the already connected upstream Desktop Commander start_process MCP tool.\n// Explicit project scope and opt-in write policy; NOT a separate Git engine.\nimport { randomUUID } from \"node:crypto\";\nexport const gitTools: readonly Tool[]=Object.freeze([\n {name:\"gateway_git_review\",description:\"Review Git status and full single-file patch inside the selected project. Returns a short-lived review token for that exact file content.\",inputSchema:{type:\"object\",properties:{path:{type:\"string\"}},required:[\"path\"],additionalProperties:false}},\n {name:\"gateway_git_stage\",description:\"Stage exactly one previously reviewed project file via Desktop Commander Git. Requires matching review token; no git add -A.\",inputSchema:{type:\"object\",properties:{path:{type:\"string\"},reviewToken:{type:\"string\"}},required:[\"path\",\"reviewToken\"],additionalProperties:false}},\n {name:\"gateway_git_commit\",description:\"Commit only the single staged reviewed project file via Desktop Commander Git; requires a stage token and explicit commit message. Never commits unrelated staged files.\",inputSchema:{type:\"object\",properties:{path:{type:\"string\"},stageToken:{type:\"string\"},message:{type:\"string\"}},required:[\"path\",\"stageToken\",\"message\"],additionalProperties:false}},\n {name:\"gateway_git_push\",description:\"Push only the just-created reviewed commit to origin via Desktop Commander Git; separately disabled unless owner opts in.\",inputSchema:{type:\"object\",properties:{commitToken:{type:\"string\"}},required:[\"commitToken\"],additionalProperties:false}}\n]);\nexport class GitWorkflowDenied extends Error{\n constructor(public readonly code: string){super(code);}\n}\nfunction fail(code: string): never{throw new GitWorkflowDenied(code);}\nconst quote=shellQuote;\nfunction strict(o: ToolArguments,keys: string[]){\n if(!o||typeof o!==\"object\"||Array.isArray(o)||Object.keys(o).length!==keys.length||\n Object.keys(o).some(k=>!keys.includes(k)))fail(\"INVALID_ARGUMENTS\");\n}\nfunction output(result: CallToolResult){\n if(result?.isError===true||!Array.isArray(result?.content))fail(\"UPSTREAM_REJECTED\");\n const data=result.content.filter(x=>x.type===\"text\").map(x=>x.text).join(\"\\n\");\n if(!/finished execution/.test(data))fail(\"PROCESS_NOT_CONFIRMED_COMPLETE\");\n if(data.length>24000)fail(\"OUTPUT_LIMIT\");\n return data;\n}\nfunction sha(data: string){\n const hits=[...data.matchAll(/\\b([a-f0-9]{40})\\b/g)];\n if(hits.length!==1)fail(\"GIT_HASH_UNAVAILABLE\");\n return hits[0]![1]!;\n}\nexport function createGitWorkflow({policy,upstream,writesEnabled=false,pushEnabled=false}: {policy: WorkspacePolicy; upstream: McpUpstream; writesEnabled?: boolean; pushEnabled?: boolean}){\n if(!policy||!upstream)throw new TypeError(\"Git workflow needs project policy and real Desktop Commander MCP client\");\n const reviews=new Map<string, Ticket>(),staged=new Map<string, Ticket>(),committed=new Map<string, Ticket>();\n const next=windows?\"; if($LASTEXITCODE -ne 0){exit $LASTEXITCODE}; \":\" && \";\n const dir=quote(policy.root);\n const cmdHead=gitBinary+\" -C \"+dir+\" \";\n async function run(command: string,timeout_ms=15000){\n return output(await upstream.forwardWorkspaceInvocation({\n name:\"start_process\",arguments:{...commandOptions(command),timeout_ms}\n }));\n }\n async function hashWorking(p: string){\n return sha(await run(cmdHead+\"hash-object -- \"+quote(p),5000));\n }\n async function hashStaged(p: string){\n return sha(await run(cmdHead+\"rev-parse \"+quote(\":\"+p),5000));\n }\n function ticket(map: Map<string,Ticket>,token: unknown,path: string|undefined){\n if(typeof token!==\"string\"||!map.has(token))fail(\"REVIEW_OR_APPROVAL_REQUIRED\");\n const item=map.get(token)!;\n if(item.path!==path||Date.now()-item.created>600000)fail(\"TOKEN_EXPIRED_OR_PATH_CHANGED\");\n return item;\n }\n function textResponse(message: string,tokenType: string|null,token: string|null,raw: string): CallToolResult{\n return {content:[{type:\"text\",text:JSON.stringify({\n result:message,...(token?{[tokenType!]:token}:{}),\n ...(raw?{desktopCommanderOutput:raw}:{})\n })}]};\n }\n return {\n names:gitTools.map(x=>x.name),\n async handle(name: string,args: ToolArguments): Promise<CallToolResult>{\n if(name===\"gateway_git_review\"){\n strict(args,[\"path\"]);\n const p=await policy.validateGitPath(args.path);\n const contentHash=await hashWorking(p);\n // One file only, no arbitrary shell fragments or outside-directory paths.\n const show=await run(cmdHead+\"status --short -- \"+quote(p)+\n next+cmdHead+\"diff -- \"+quote(p)+\n next+cmdHead+\"diff --cached -- \"+quote(p),10000);\n if(show.length>16000)fail(\"PATCH_TOO_LARGE\");\n const token=randomUUID();\n reviews.set(token,{path:p,hash:contentHash,created:Date.now()});\n return textResponse(\"REVIEW_READY\",\"reviewToken\",token,show);\n }\n if(name===\"gateway_git_stage\"){\n strict(args,[\"path\",\"reviewToken\"]);\n if(!writesEnabled||policy.mode!==\"read-write\")fail(\"GIT_WRITE_DISABLED\");\n const p=await policy.validateGitPath(args.path);\n const record=ticket(reviews,args.reviewToken,p);\n if(await hashWorking(p)!==record.hash)fail(\"CONTENT_CHANGED_SINCE_REVIEW\");\n const done=await run(cmdHead+\"add -- \"+quote(p));\n if(await hashStaged(p)!==record.hash)fail(\"STAGE_CONTENT_MISMATCH\");\n reviews.delete(String(args.reviewToken));\n const token=randomUUID();\n staged.set(token,{...record,created:Date.now()});\n return textResponse(\"ONE_FILE_STAGED\",\"stageToken\",token,done);\n }\n if(name===\"gateway_git_commit\"){\n strict(args,[\"path\",\"stageToken\",\"message\"]);\n if(!writesEnabled||policy.mode!==\"read-write\")fail(\"GIT_WRITE_DISABLED\");\n const p=await policy.validateGitPath(args.path);\n const record=ticket(staged,args.stageToken,p);\n if(typeof args.message!==\"string\"||args.message.length<5||args.message.length>120||\n /[\\r\\n\\0]/.test(args.message))fail(\"INVALID_COMMIT_MESSAGE\");\n if(await hashStaged(p)!==record.hash)fail(\"INDEX_CHANGED_SINCE_STAGE\");\n // --only makes the pathspec explicit, preserving unrelated staged files.\n const done=await run(cmdHead+\"commit --only -m \"+quote(args.message)+\" -- \"+quote(p),15000);\n const head=sha(await run(cmdHead+\"rev-parse HEAD\",5000));\n staged.delete(String(args.stageToken));\n const token=randomUUID();\n committed.set(token,{path:p,head,created:Date.now()});\n return textResponse(\"ONE_FILE_COMMITTED\",\"commitToken\",token,done);\n }\n if(name===\"gateway_git_push\"){\n strict(args,[\"commitToken\"]);\n if(!writesEnabled||!pushEnabled)fail(\"GIT_PUSH_DISABLED\");\n const record=ticket(committed,args.commitToken,committed.get(String(args.commitToken))?.path);\n const head=sha(await run(cmdHead+\"rev-parse HEAD\",5000));\n if(head!==record.head)fail(\"HEAD_MOVED_SINCE_COMMIT\");\n const done=await run(cmdHead+\"push origin HEAD\",30000);\n committed.delete(String(args.commitToken));\n return textResponse(\"REVIEWED_HEAD_PUSHED\",null,null,done);\n }\n fail(\"UNKNOWN_GIT_TOOL\");\n }\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-workspace-policy.js","sourceRoot":"","sources":["../../src/project-workspace-policy.ts"],"names":[],"mappings":"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","sourcesContent":["import {ownedByUser,windows,within,inDirectory,commandOptions} from \"./platform.js\";\nimport type { ToolArguments,WorkspacePolicy } from \"./contracts.js\";\nimport { errorCode,isInteger,isSafeInteger } from \"./validation.js\";\n// User-selected project workspace admission policy for real Desktop Commander tools.\n// This validates path/arguments but is NOT an OS sandbox against same-UID races.\nimport { lstat,realpath } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { createDevPresets } from \"./project-dev-presets.js\";\n\nexport class WorkspaceDenied extends Error {\n constructor(public readonly code: string){super(code);this.name=\"WorkspaceDenied\";}\n}\nconst deniedParts=new Set([\".git\",\".env\",\".ssh\",\".aws\",\".config\",\"node_modules\",\n \".npm\",\".cache\",\"private\",\"secrets\",\"credentials\"]);\nfunction fail(code: string): never{throw new WorkspaceDenied(code);}\nfunction keysExact(args: ToolArguments,required: string[],optional: string[]=[]){\n if(!args||typeof args!==\"object\"||Array.isArray(args))fail(\"BAD_ARGUMENTS\");\n if(required.some(k=>!Object.hasOwn(args,k))||\n Object.keys(args).some(k=>![...required,...optional].includes(k)))\n fail(\"ARGUMENTS_NOT_ALLOWED\");\n}\nasync function checked(target: string,kind: string,bytes?: number){\n const st=await lstat(target).catch(e=>{\n if(errorCode(e)===\"ENOENT\")return null;\n throw e;\n });\n if(!st){if(kind!==\"new\")fail(\"NOT_FOUND\");return;}\n if(st.isSymbolicLink()||!ownedByUser(target,st))fail(\"UNSAFE_OWNER_OR_LINK\");\n if(kind===\"directory\"&&!st.isDirectory())fail(\"NOT_DIRECTORY\");\n if(kind===\"file\"&&!st.isFile())fail(\"NOT_FILE\");\n if(kind===\"new\"&&(!st.isFile()||st.nlink!==1))fail(\"UNSAFE_EXISTING_FILE\");\n if(kind===\"file\"&&st.nlink!==1)fail(\"HARDLINK\");\n if(bytes&&st.size>bytes)fail(\"FILE_TOO_LARGE\");\n}\nexport async function createProjectPolicy({root,mode=\"read-only\",\n developerCommands=\"presets\",allowOwnerSelectedRoot=false,allowTrustedHomeRoot=false,\n maxReadBytes=1024*1024,maxWriteBytes=128*1024}: {root: unknown; mode?: string; developerCommands?: string; allowOwnerSelectedRoot?: boolean; allowTrustedHomeRoot?: boolean; maxReadBytes?: number; maxWriteBytes?: number}): Promise<WorkspacePolicy>{\n if(![\"read-only\",\"read-write\"].includes(mode))fail(\"INVALID_MODE\");\n if(![\"presets\",\"trusted-project\"].includes(developerCommands))fail(\"INVALID_DEVELOPMENT_PROFILE\");\n if(developerCommands===\"trusted-project\"&&mode!==\"read-write\")fail(\"DEVELOPMENT_REQUIRES_WRITE\");\n if(allowTrustedHomeRoot&&(developerCommands!==\"trusted-project\"||mode!==\"read-write\"))\n fail(\"TRUSTED_HOME_REQUIRES_NATIVE_DEVELOPER_ROLE\");\n if(typeof root!==\"string\"||!path.isAbsolute(root))fail(\"ROOT_REQUIRED\");\n const base=await realpath(root);\n const segments=base.split(path.sep).filter(Boolean);\n if((base===homedir()&&!allowTrustedHomeRoot)||base===path.parse(base).root||base===\"/Users\"||base===\"/Volumes\"||\n ((allowOwnerSelectedRoot||allowTrustedHomeRoot)?segments.length<2:segments.length<(process.platform===\"darwin\"?4:2)))\n fail(\"ROOT_TOO_BROAD\");\n if(path.resolve(root)!==base)fail(\"ROOT_MUST_BE_CANONICAL\");\n await checked(base,\"directory\");\n const devPresets=createDevPresets(base,mode);\n async function scoped(raw: unknown,kind: string,bytes?: number){\n if(typeof raw!==\"string\"||!raw||raw.length>1024||\n raw.includes(\"\\0\")||(!windows&&raw.includes(\"\\\\\"))||\n raw.startsWith(\"~\")||/^[a-z]+:\\/\\//i.test(raw))\n fail(\"INVALID_PATH\");\n const relative=path.isAbsolute(raw)?path.relative(base,raw):raw;\n const parts=(relative===\".\"||relative===\"\")?[]:relative.split(windows?/[\\\\/]/:/\\//);\n if(parts.some(x=>(windows&&(/[<>:\"|?*]/.test(x)||/[. ]$/.test(x)))||!x||x===\".\"||x===\"..\"||deniedParts.has(x.toLowerCase())||\n /^\\.env(\\.|$)/i.test(x)||/\\.(pem|key|p12|pfx)$/i.test(x)))\n fail(\"PROTECTED_OR_TRAVERSAL\");\n const final=path.resolve(base,...parts);\n if(!within(final,base))fail(\"OUTSIDE_PROJECT\");\n let current=base;\n for(let i=0;i<parts.length;i++){\n current=path.join(current,parts[i]!);\n await checked(current,i===parts.length-1?kind:\"directory\",\n i===parts.length-1?bytes:undefined);\n }\n if(parts.length===0&&kind!==\"directory\")fail(\"ROOT_IS_DIRECTORY\");\n return final;\n }\n return Object.freeze<WorkspacePolicy>({\n root:base,mode,developerCommands,\n async validateGitPath(file){\n const absolute=await scoped(file,\"file\",maxReadBytes);\n return path.relative(base,absolute);\n },\n observe(name,result,args){devPresets.observe(name,result,args);},\n async prepare(name,args={}){\n if(name===\"start_process\"&&developerCommands===\"trusted-project\"){\n keysExact(args,[\"command\",\"timeout_ms\"]);\n if(typeof args.command!==\"string\"||!args.command.trim()||\n Buffer.byteLength(args.command,\"utf8\")>32768||args.command.includes(\"\\0\")||\n !isSafeInteger(args.timeout_ms)||args.timeout_ms<100||\n args.timeout_ms>30000)fail(\"DEVELOPER_COMMAND_INVALID\");\n // cwd is NOT a file-system sandbox. All effective user privileges remain.\n return {name,arguments:{...commandOptions(inDirectory(base,args.command)),\n timeout_ms:args.timeout_ms}};\n }\n if(name===\"start_process\")return devPresets.prepareStart(args);\n if(name===\"read_process_output\")return devPresets.prepareReadOutput(args);\n if(name===\"list_directory\"){\n keysExact(args,[\"path\"],[\"depth\"]);\n if(args.depth!==undefined&&(!isInteger(args.depth)||args.depth<0||args.depth>2))\n fail(\"DEPTH_LIMIT\");\n return {name,arguments:{path:await scoped(args.path,\"directory\"),depth:args.depth??1}};\n }\n if(name===\"get_file_info\"){\n keysExact(args,[\"path\"]);\n return {name,arguments:{path:await scoped(args.path,\"any\")}};\n }\n if(name===\"read_file\"){\n keysExact(args,[\"path\"],[\"offset\",\"length\"]);\n if(args.offset!==undefined&&(!isInteger(args.offset)||args.offset<0))\n fail(\"OFFSET_LIMIT\");\n if(args.length!==undefined&&(!isInteger(args.length)||args.length<1||args.length>1000))\n fail(\"LENGTH_LIMIT\");\n return {name,arguments:{path:await scoped(args.path,\"file\",maxReadBytes),\n offset:args.offset??0,length:args.length??1000}};\n }\n if(mode!==\"read-write\")fail(\"WRITE_NOT_APPROVED\");\n if(name===\"write_file\"){\n keysExact(args,[\"path\",\"content\"],[\"mode\"]);\n if(typeof args.content!==\"string\"||Buffer.byteLength(args.content)>maxWriteBytes)\n fail(\"CONTENT_TOO_LARGE\");\n if(args.mode!==undefined&&args.mode!==\"rewrite\")fail(\"MODE_NOT_APPROVED\");\n return {name,arguments:{path:await scoped(args.path,\"new\"),\n content:args.content,mode:\"rewrite\"}};\n }\n if(name===\"edit_block\"){\n keysExact(args,[\"file_path\",\"old_string\",\"new_string\"],[\"expected_replacements\"]);\n if(typeof args.old_string!==\"string\"||!args.old_string||\n typeof args.new_string!==\"string\"||\n Buffer.byteLength(args.old_string)>maxWriteBytes||\n Buffer.byteLength(args.new_string)>maxWriteBytes||\n (args.expected_replacements!==undefined&&args.expected_replacements!==1))\n fail(\"EDIT_NOT_APPROVED\");\n return {name,arguments:{file_path:await scoped(args.file_path,\"file\",maxReadBytes),\n old_string:args.old_string,new_string:args.new_string,expected_replacements:1}};\n }\n fail(\"TOOL_NOT_APPROVED\");\n }\n });\n}\n"]}
@@ -1,44 +0,0 @@
1
- import { isSafeInteger } from "./validation.js";
2
- // P1 local-only file path and file type gate. Not an OS sandbox.
3
- import { lstat, realpath } from "node:fs/promises";
4
- import path from "node:path";
5
- export class ScopeDenied extends Error {
6
- code;
7
- constructor(code) {
8
- super("File scope denied: " + code);
9
- this.code = code;
10
- this.name = "ScopeDenied";
11
- }
12
- }
13
- export async function resolveScopedRead({ root, relativePath, allowedFiles, maxBytes = 4096 }) {
14
- if (typeof root !== "string" || !path.isAbsolute(root))
15
- throw new ScopeDenied("INVALID_ROOT");
16
- if (typeof relativePath !== "string" || relativePath.length === 0 || relativePath.length > 200 ||
17
- relativePath.includes("\0") || path.isAbsolute(relativePath) || relativePath.includes("\\"))
18
- throw new ScopeDenied("INVALID_NAME");
19
- const components = relativePath.split("/");
20
- if (components.some(x => x === "" || x === "." || x === ".."))
21
- throw new ScopeDenied("TRAVERSAL");
22
- if (!Array.isArray(allowedFiles) || !allowedFiles.includes(relativePath))
23
- throw new ScopeDenied("NOT_ALLOWLISTED");
24
- if (!isSafeInteger(maxBytes) || maxBytes < 1 || maxBytes > 1048576)
25
- throw new ScopeDenied("INVALID_LIMIT");
26
- const canonicalRoot = await realpath(root);
27
- // Refuse every symlink in untrusted path components (not just final target).
28
- let next = canonicalRoot;
29
- for (const component of components) {
30
- next = path.join(next, component);
31
- if ((await lstat(next)).isSymbolicLink())
32
- throw new ScopeDenied("SYMLINK");
33
- }
34
- const resolved = await realpath(path.join(canonicalRoot, ...components));
35
- if (!resolved.startsWith(canonicalRoot + path.sep))
36
- throw new ScopeDenied("ESCAPES_ROOT");
37
- const metadata = await lstat(resolved);
38
- if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.nlink !== 1)
39
- throw new ScopeDenied("UNSAFE_FILE_TYPE");
40
- if (metadata.size > maxBytes)
41
- throw new ScopeDenied("TOO_LARGE");
42
- return Object.freeze({ absolutePath: resolved, size: metadata.size });
43
- }
44
- //# sourceMappingURL=read-scope.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"read-scope.js","sourceRoot":"","sources":["../../src/read-scope.ts"],"names":[],"mappings":"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","sourcesContent":["import { isSafeInteger } from \"./validation.js\";\n// P1 local-only file path and file type gate. Not an OS sandbox.\nimport { lstat,realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport class ScopeDenied extends Error {\n constructor(public readonly code: string) { super(\"File scope denied: \"+code); this.name=\"ScopeDenied\"; }\n}\nexport async function resolveScopedRead({ root, relativePath, allowedFiles, maxBytes=4096 }: {root: unknown; relativePath: unknown; allowedFiles: readonly string[]; maxBytes?: number}) {\n if (typeof root!==\"string\" || !path.isAbsolute(root)) throw new ScopeDenied(\"INVALID_ROOT\");\n if (typeof relativePath!==\"string\" || relativePath.length===0 || relativePath.length>200 ||\n relativePath.includes(\"\\0\") || path.isAbsolute(relativePath) || relativePath.includes(\"\\\\\"))\n throw new ScopeDenied(\"INVALID_NAME\");\n const components=relativePath.split(\"/\");\n if (components.some(x=>x===\"\" || x===\".\" || x===\"..\"))\n throw new ScopeDenied(\"TRAVERSAL\");\n if (!Array.isArray(allowedFiles) || !allowedFiles.includes(relativePath))\n throw new ScopeDenied(\"NOT_ALLOWLISTED\");\n if (!isSafeInteger(maxBytes) || maxBytes<1 || maxBytes>1048576)\n throw new ScopeDenied(\"INVALID_LIMIT\");\n const canonicalRoot=await realpath(root);\n // Refuse every symlink in untrusted path components (not just final target).\n let next=canonicalRoot;\n for (const component of components) {\n next=path.join(next,component);\n if ((await lstat(next)).isSymbolicLink()) throw new ScopeDenied(\"SYMLINK\");\n }\n const resolved=await realpath(path.join(canonicalRoot,...components));\n if (!resolved.startsWith(canonicalRoot+path.sep)) throw new ScopeDenied(\"ESCAPES_ROOT\");\n const metadata=await lstat(resolved);\n if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.nlink !== 1)\n throw new ScopeDenied(\"UNSAFE_FILE_TYPE\");\n if (metadata.size>maxBytes) throw new ScopeDenied(\"TOO_LARGE\");\n return Object.freeze({absolutePath:resolved,size:metadata.size});\n}\n"]}