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":"community-remote-revocations.js","sourceRoot":"","sources":["../../src/community-remote-revocations.ts"],"names":[],"mappings":"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","sourcesContent":["import {ownedByUser,windows} from \"./platform.js\";\nimport { revocationsSchema } from \"./config-schemas.js\";\nimport { GatewayError,errorCode,parseJSON,record } from \"./validation.js\";\n// P0-C owner-local revocations: read afresh per request. This is NOT an IdP\n// revocation service, token introspection, or a cross-UID security boundary.\nimport { randomBytes } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { lstat,mkdir,open,rename,rmdir,unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst MAX_BYTES=65536,MAX_ITEMS=2048;\nfunction fail(code: string): never{const err=new GatewayError(code);throw err;}\nfunction validateFilename(file: unknown) {\n if(typeof file!==\"string\"||!path.isAbsolute(file)||path.basename(file)!==\"remote-revocations.json\")\n fail(\"REVOCATION_PATH_MUST_BE_ABSOLUTE_PRIVATE_FILE\");\n return file;\n}\nasync function validateDirectory(file: string) {\n let s;\n try{s=await lstat(path.dirname(file));}catch{fail(\"REVOCATION_PARENT_UNAVAILABLE\");}\n if(!s.isDirectory()||s.isSymbolicLink()||!ownedByUser(path.dirname(file),s,true))fail(\"REVOCATION_PARENT_UNSAFE\");\n}\nfunction normalized(value: unknown) {\n const state=record(value,\"REVOCATION_STATE_INVALID\");\n if(!state||typeof state!==\"object\"||Array.isArray(state)||\n Object.keys(state).sort().join(\",\")!==\"revokedJtis,revokedSubjects,version\"||\n state.version!==1)fail(\"REVOCATION_STATE_INVALID\");\n for(const key of [\"revokedSubjects\",\"revokedJtis\"]){\n const entries=state[key];\n if(!Array.isArray(entries)||entries.length>MAX_ITEMS||\n entries.some(x=>typeof x!==\"string\"||x.length<1||x.length>512||\n x.trim()!==x)||new Set(entries).size!==entries.length)\n fail(\"REVOCATION_STATE_INVALID\");\n }\n return revocationsSchema.parse(state);\n}\nexport async function readRemoteRevocations(value: unknown) {\n const file=validateFilename(value);\n await validateDirectory(file);\n let handle;\n try{\n if((await lstat(file)).isSymbolicLink())fail(\"REVOCATION_FILE_UNSAFE\");\n handle=await open(file,constants.O_RDONLY|constants.O_NOFOLLOW|constants.O_NONBLOCK);\n const stat=await handle.stat();\n if(!stat.isFile()||!ownedByUser(file,stat,true)||stat.nlink!==1||\n (!windows&&(stat.mode&0o777)!==0o600)||stat.size>MAX_BYTES)\n fail(\"REVOCATION_FILE_UNSAFE\");\n const text=await handle.readFile(\"utf8\");\n return normalized(parseJSON(text));\n }catch(err){\n if(errorCode(err)?.startsWith(\"REVOCATION_\"))throw err;\n fail(\"REVOCATION_STATE_UNAVAILABLE\");\n }finally{await handle?.close();}\n}\nexport async function initializeRemoteRevocations(value: unknown) {\n const file=validateFilename(value);\n await validateDirectory(file);\n let handle;\n try{\n handle=await open(file,constants.O_WRONLY|constants.O_CREAT|\n constants.O_EXCL|constants.O_NOFOLLOW,0o600);\n await handle.writeFile(JSON.stringify({version:1,revokedSubjects:[],revokedJtis:[]})+\"\\n\");\n await handle.sync();\n }catch(err){\n if(errorCode(err)===\"EEXIST\")fail(\"REVOCATION_ALREADY_INITIALIZED\");\n fail(\"REVOCATION_INITIALIZATION_FAILED\");\n }finally{await handle?.close();}\n return {initialized:true};\n}\nexport async function revokeRemoteIdentity(file: string,{subject,jti}: {subject?: string|undefined; jti?: string|undefined}={}) {\n if(Boolean(subject)===Boolean(jti))fail(\"REVOCATION_SINGLE_TARGET_REQUIRED\");\n const key=subject?\"revokedSubjects\":\"revokedJtis\";\n const value=subject||jti;\n if(typeof value!==\"string\"||value.length<1||value.length>512||value.trim()!==value)\n fail(\"REVOCATION_TARGET_INVALID\");\n file=validateFilename(file);\n // Exclusive same-UID writer lock prevents losing a revocation to concurrent\n // owner CLI invocations. A stale lock intentionally blocks edits; readers\n // continue honoring the last committed state until the owner repairs it.\n const lock=file+\".lock\";\n await validateDirectory(file);\n try{await mkdir(lock,{mode:0o700});}\n catch{fail(\"REVOCATION_OWNER_UPDATE_LOCKED\");}\n let tmp;\n let handle;\n try {\n const current=await readRemoteRevocations(file);\n if(current[key].includes(value))return {changed:false,revoked:true};\n const next=normalized({...current,[key]:[...current[key],value]});\n const suffix=randomBytes(12).toString(\"hex\");\n tmp=path.join(path.dirname(file),\".remote-revocations-\"+suffix+\".tmp\");\n handle=await open(tmp,constants.O_WRONLY|constants.O_CREAT|\n constants.O_EXCL|constants.O_NOFOLLOW,0o600);\n await handle.writeFile(JSON.stringify(next)+\"\\n\");\n await handle.sync();await handle.close();handle=null;\n await rename(tmp,file);\n return {changed:true,revoked:true};\n }finally{\n await handle?.close();\n if(tmp)await unlink(tmp).catch(()=>{});\n await rmdir(lock).catch(()=>{});\n }\n}\nexport function isRemoteIdentityRevoked(state: ReturnType<typeof normalized>,payload: import(\"jose\").JWTPayload) {\n return (typeof payload.sub===\"string\"&&state.revokedSubjects.includes(payload.sub))||\n (typeof payload.jti===\"string\"&&state.revokedJtis.includes(payload.jti));\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-schemas.js","sourceRoot":"","sources":["../../src/config-schemas.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nconst common = {projectRoot:z.string(), mode:z.enum(['read-only','read-write']), connection:z.enum(['tunnel','https']), port:z.number().int()};\nexport const setupSchema = z.discriminatedUnion('version',[\n z.object({...common,version:z.literal(1)}).strict(),\n z.object({...common,version:z.literal(2),accessRole:z.enum(['restricted','trusted'])}).strict(),\n z.object({...common,version:z.literal(3),accessRole:z.literal('trusted'),writeScope:z.literal('home-only')}).strict()\n]);\nexport type GatewayConfig = z.infer<typeof setupSchema>;\nexport const grantsSchema = z.object({version:z.literal(1),homeRead:z.boolean(),outsideRead:z.boolean(),custom:z.array(z.object({path:z.string(),mode:z.enum(['read-only','read-write'])}).strict())}).strict();\nexport const denySchema = z.object({version:z.literal(1),deniedTools:z.array(z.string()),deniedDirectories:z.array(z.string())}).strict();\nexport const revocationsSchema = z.object({version:z.literal(1),revokedSubjects:z.array(z.string()),revokedJtis:z.array(z.string())}).strict();\nexport const upstreamDefinitionSchema = z.object({id:z.string(),transport:z.literal('stdio'),command:z.string(),args:z.array(z.string()),env:z.record(z.string()).optional(),allowTools:z.array(z.string())}).strict();\nexport type UpstreamDefinition = z.infer<typeof upstreamDefinitionSchema>;\nexport const ownerSchema = z.object({port:z.number().int(),pid:z.number().int().min(2),token:z.string().regex(/^[a-f0-9]{48}$/),launcher:z.enum(['cli','app']),runId:z.string().regex(/^[a-f0-9]{32}$/)}).passthrough();\nexport const privateAgentSchema = z.object({Label:z.string(),ProgramArguments:z.tuple([z.string(),z.string()]),EnvironmentVariables:z.record(z.string()),WorkingDirectory:z.string(),StandardOutPath:z.string().optional(),StandardErrorPath:z.string().optional(),RunAtLoad:z.boolean().optional()}).passthrough();\nexport type PrivateAgent = z.infer<typeof privateAgentSchema>;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"configured-mcp-upstreams.js","sourceRoot":"","sources":["../../src/configured-mcp-upstreams.ts"],"names":[],"mappings":"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","sourcesContent":["import {ownedByUser,childEnvKeys} from \"./platform.js\";\nimport { upstreamDefinitionSchema } from \"./config-schemas.js\";\nimport type { AuditSink,RouteDefinition,Tool,ToolInvocation,UpstreamStatus } from \"./contracts.js\";\nimport { toolResult } from \"./mcp-results.js\";\nimport { GatewayError,errorCode,parseJSON,record } from \"./validation.js\";\n// Operator-owned, opt-in multi-upstream configuration. No marketplace code\n// execution or public authorization is implied by discovery.\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { lstat,readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst ROUTE=/^[a-z][a-z0-9_-]{0,39}$/;\nconst TOOL=/^[A-Za-z0-9_.:-]{1,128}$/;\nconst MAX_CONFIG_BYTES=65536;\nfunction invalid(code: string): never{const err=new GatewayError(code);throw err;}\nfunction validate(value: unknown){\n const def=record(value,\"UPSTREAM_CONFIG_INVALID\");\n if(!def||typeof def!==\"object\"||Array.isArray(def)||\n Object.keys(def).some(k=>![\"id\",\"transport\",\"command\",\"args\",\"env\",\"allowTools\"].includes(k)))\n invalid(\"UPSTREAM_CONFIG_INVALID\");\n if((typeof def.id!==\"string\"||!ROUTE.test(def.id))||def.id===\"desktop\"||def.id===\"health_check\")invalid(\"UPSTREAM_ROUTE_INVALID\");\n if(def.transport!==\"stdio\")invalid(\"UPSTREAM_TRANSPORT_UNSUPPORTED\");\n if(typeof def.command!==\"string\"||!path.isAbsolute(def.command)||def.command.includes(\"\\0\"))\n invalid(\"UPSTREAM_COMMAND_MUST_BE_ABSOLUTE\");\n if(!Array.isArray(def.args)||def.args.length>40||\n def.args.some(s=>typeof s!==\"string\"||s.length>4096||s.includes(\"\\0\")))\n invalid(\"UPSTREAM_ARGUMENTS_INVALID\");\n if(!Array.isArray(def.allowTools)||def.allowTools.length>200||\n new Set(def.allowTools).size!==def.allowTools.length||\n def.allowTools.some(t=>typeof t!==\"string\"||!TOOL.test(t)))\n invalid(\"UPSTREAM_ALLOWLIST_REQUIRED\");\n if(def.env!==undefined&&(!def.env||typeof def.env!==\"object\"||Array.isArray(def.env)||\n Object.entries(def.env).length>20||\n Object.entries(def.env).some(([k,v])=>!/^[A-Z][A-Z0-9_]*$/.test(k)||\n typeof v!==\"string\"||v.length>4096||v.includes(\"\\0\"))))\n invalid(\"UPSTREAM_ENV_INVALID\");\n const checked=upstreamDefinitionSchema.parse(def);\n return Object.freeze({\n id:checked.id,transport:\"stdio\" as const,command:checked.command,args:Object.freeze([...checked.args]),\n allowTools:Object.freeze([...checked.allowTools]),env:Object.freeze({...checked.env})\n });\n}\nexport function validateConfiguredUpstreams(value: unknown){\n const config=record(value,\"UPSTREAM_CONFIG_VERSION_OR_SIZE\");\n if(!config||typeof config!==\"object\"||Array.isArray(config)||\n config.version!==1||Object.keys(config).some(k=>![\"version\",\"upstreams\"].includes(k))||\n !Array.isArray(config.upstreams)||config.upstreams.length>12)\n invalid(\"UPSTREAM_CONFIG_VERSION_OR_SIZE\");\n const defs=config.upstreams.map(validate);\n if(new Set(defs.map(d=>d.id)).size!==defs.length)invalid(\"UPSTREAM_ROUTE_DUPLICATE\");\n return defs;\n}\nexport async function readConfiguredUpstreams(configFile: string){\n if(typeof configFile!==\"string\"||!path.isAbsolute(configFile))invalid(\"UPSTREAM_CONFIG_ABSOLUTE_PATH_REQUIRED\");\n const stat=await lstat(configFile);\n if(!stat.isFile()||stat.isSymbolicLink()||stat.nlink!==1||\n !ownedByUser(configFile,stat,true)||stat.size>MAX_CONFIG_BYTES)\n invalid(\"UPSTREAM_CONFIG_OWNER_OR_MODE_DENIED\");\n const raw=await readFile(configFile,\"utf8\");\n let value;\n try{value=parseJSON(raw);}catch{invalid(\"UPSTREAM_CONFIG_JSON_INVALID\");}\n return validateConfiguredUpstreams(value);\n}\nfunction cleanEnv(additions: Readonly<Record<string,string>>){\n const env: Record<string,string>={};\n for(const key of childEnvKeys)\n if(process.env[key])env[key]=process.env[key]!;\n return {...env,...additions};\n}\nexport class ConfiguredStdioUpstream {\n #client: Client|null=null;\n #catalog: Tool[]=[];\n #connecting: Promise<void>|null=null;\n #state: UpstreamStatus[\"status\"]=\"DISCONNECTED\";\n #lastError: string|null=null;\n readonly definition: ReturnType<typeof validate>;\n readonly id: string;\n constructor(def: unknown){this.definition=validate(def);this.id=this.definition.id;}\n get upstreamCatalog(){return structuredClone(this.#catalog);}\n get status(){return Object.freeze({id:this.id,status:this.#state,toolCount:this.#catalog.length,\n lastError:this.#lastError});}\n async connect(){\n if(this.#client)return;\n if(this.#connecting)return this.#connecting;\n this.#connecting=(async()=>{\n const client=new Client({name:\"gateway-configured-\"+this.id,version:\"0.1.0\"},{capabilities:{}});\n try{\n const transport=new StdioClientTransport({\n command:this.definition.command,args:[...this.definition.args],\n env:cleanEnv(this.definition.env),stderr:\"ignore\"\n });\n // Bound discovery: an unresponsive optional child must not freeze the\n // primary Desktop Commander Gateway startup indefinitely.\n await client.connect(transport,{timeout:7000});\n const catalog=(await client.listTools(undefined,{timeout:7000})).tools;\n if(!Array.isArray(catalog)||new Set(catalog.map(x=>x.name)).size!==catalog.length||\n catalog.some(x=>!x.name||!x.inputSchema))\n invalid(\"UPSTREAM_TOOL_CATALOG_INVALID\");\n if(this.#catalog.length&&JSON.stringify(catalog)!==JSON.stringify(this.#catalog))\n invalid(\"UPSTREAM_SCHEMA_CHANGED_RESTART_GATEWAY\");\n if(!this.#catalog.length)this.#catalog=structuredClone(catalog);\n this.#client=client;\n this.#state=\"READY\";this.#lastError=null;\n client.onclose=()=>{\n // A disconnected child is not healthy merely because nobody called it.\n if(this.#client===client){\n this.#client=null;\n this.#state=\"UNAVAILABLE\";this.#lastError=\"UPSTREAM_DISCONNECTED\";\n }\n };\n }catch(error){\n await client.close().catch(()=>{});\n this.#state=\"UNAVAILABLE\";this.#lastError=errorCode(error)||\"UPSTREAM_CONNECT_FAILED\";\n throw error;\n }\n })().finally(()=>{this.#connecting=null;});\n return this.#connecting;\n }\n async forwardWorkspaceInvocation(invocation: ToolInvocation){\n if(!invocation||!this.#catalog.some(x=>x.name===invocation.name))\n invalid(\"UPSTREAM_TOOL_UNKNOWN\");\n if(!this.#client){\n try{await this.connect();}catch{invalid(\"UPSTREAM_UNAVAILABLE\");}\n }\n try{\n return toolResult(await this.#client!.callTool(invocation));\n }catch{\n this.#state=\"UNAVAILABLE\";this.#lastError=\"UPSTREAM_CALL_UNCERTAIN\";\n const client=this.#client;this.#client=null;\n await client?.close().catch(()=>{});\n // Crucial: never retry a call with possibly completed side effects.\n invalid(\"UPSTREAM_CALL_UNCERTAIN\");\n }\n }\n async close(){\n const client=this.#client;this.#client=null;this.#state=\"CLOSED\";\n await client?.close().catch(()=>{});\n }\n}\nexport async function bootstrapConfiguredUpstreams(configFile: string|undefined, audit: AuditSink=()=>{}){\n if(!configFile)return {routes:[],upstreams:[],status:()=>[]};\n const defs=await readConfiguredUpstreams(configFile);\n const upstreams: ConfiguredStdioUpstream[]=[],routes: RouteDefinition[]=[];\n for(const def of defs){\n const upstream=new ConfiguredStdioUpstream(def);\n upstreams.push(upstream);\n try{\n await upstream.connect();\n const allow=new Set(def.allowTools);\n routes.push({id:def.id,upstream,authorize:(name,args)=>{\n if(!allow.has(name))invalid(\"UPSTREAM_TOOL_NOT_GRANTED\");\n return args;\n }});\n audit({event:\"UPSTREAM_DISCOVERED\",route:def.id,tools:upstream.upstreamCatalog.length});\n }catch(error){\n // One failed child does not prevent the Desktop Commander route from starting.\n audit({event:\"UPSTREAM_STARTUP_UNAVAILABLE\",route:def.id,\n code:errorCode(error)||\"UPSTREAM_CONNECT_FAILED\"});\n }\n }\n return {routes,upstreams,status:()=>upstreams.map(x=>x.status)};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/contracts.ts"],"names":[],"mappings":"","sourcesContent":["import type { CallToolRequest,CallToolResult,ReadResourceResult,Resource,ResourceTemplate,Tool } from '@modelcontextprotocol/sdk/types.js';\nexport type { CallToolResult,ReadResourceResult,Resource,ResourceTemplate,Tool };\nexport type ToolArguments = NonNullable<CallToolRequest['params']['arguments']>;\nexport type ToolInvocation = CallToolRequest['params'];\nexport type AuditEvent = {event: string; [key: string]: unknown};\nexport type AuditSink = (event: AuditEvent) => void;\nexport interface McpUpstream {\n readonly upstreamCatalog: readonly Tool[];\n forwardWorkspaceInvocation(invocation: ToolInvocation): Promise<CallToolResult>;\n}\nexport interface NativeResources {\n listNativeResources(): Promise<Resource[]>;\n readNativeResource(uri: string): Promise<ReadResourceResult>;\n listNativeResourceTemplates?(): Promise<ResourceTemplate[]>;\n}\nexport interface ResourceProvider {\n listResources(): Promise<Resource[]>;\n readResource(uri: string): Promise<ReadResourceResult>;\n listResourceTemplates?(): Promise<ResourceTemplate[]>;\n}\nexport interface RouteDefinition {\n id: string;\n upstream: McpUpstream & Partial<NativeResources>;\n exposeNativeNames?: boolean;\n authorize?: ((name: string, args: ToolArguments) => ToolArguments | Promise<ToolArguments>) | null;\n}\nexport interface RouteInfo {id: string; toolCount: number; nativeNames?: boolean}\nexport interface UpstreamStatus {id: string; status: 'DISCONNECTED'|'READY'|'UNAVAILABLE'|'CLOSED'; toolCount: number; lastError: string|null}\nexport interface UpstreamRouter extends McpUpstream, Partial<ResourceProvider> {\n readonly routes: readonly RouteInfo[];\n routeFor(publicName: string): string|null;\n authorizeExtension(publicName: string, args: ToolArguments): Promise<ToolInvocation>;\n}\nexport interface WorkspacePolicy {\n readonly root: string;\n readonly mode: string;\n readonly developerCommands: string;\n validateGitPath(file: unknown): Promise<string>;\n prepare(name: string, args?: ToolArguments): Promise<ToolInvocation>;\n observe?(name: string, result: CallToolResult, args: ToolArguments): void;\n prepareDiskUsage?(path: unknown, depth?: unknown): Promise<ToolInvocation>;\n grantsSnapshot?(): Promise<GrantsConfig>;\n}\nexport interface GrantsConfig {version: 1; homeRead: boolean; outsideRead: boolean; custom: {path: string; mode: 'read-only'|'read-write'}[]}\nexport interface DenyConfig {version: 1; deniedTools: string[]; deniedDirectories: string[]}\nexport type WorkspaceGrants = Awaited<ReturnType<typeof import('./workspace-grants.js').createWorkspaceGrants>>;\nexport type DenyRules = Awaited<ReturnType<typeof import('./explicit-deny-rules.js').createDenyRules>>;\nexport type GitWorkflow = ReturnType<typeof import('./project-git-workflow.js').createGitWorkflow>;\nexport interface VerifiedPrincipal {readonly kind: 'verified-remote'; readonly subjectHash: string; readonly scopes: readonly string[]}\nexport type RequestContext = {readonly requestId: string; readonly identity: VerifiedPrincipal | {readonly kind:'verified-oauth';readonly connectionId:string;readonly subjectHash:string;readonly scopes:readonly string[];readonly permission:'owner-default'} | {readonly kind:'verified-api-key';readonly credentialId:string;readonly permission:'owner-default'} | {readonly kind: 'unverified-local'}};\nexport type AuthenticationResult = {status: 200; principal: VerifiedPrincipal} | {status: 401|403|503; revoked?: boolean};\nexport type GatewayStatus = {\n event: 'GATEWAY_STATUS'; profile: 'live'|'setup'; installed: boolean; registered: boolean;\n label: string; port: number|null; health: string|null; workspaceMode: string|null;\n accessMode?: 'ingress'|'api-key'|'oauth'|'unavailable'|null; writeScope?: string|null; executionMode: string; listenerPid: number|null;\n loginAutostart: string; tcc?: string; coreControl: string; coreLauncher: string; coreOwnerPid: number|null;\n};\nexport interface PostResult {status: number; message?: string; location?: string}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"current-permission-probe.js","sourceRoot":"","sources":["../../src/current-permission-probe.ts"],"names":[],"mappings":"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","sourcesContent":["import { errorCode } from \"./validation.js\";\n// Read-only capability check from the *actual Gateway Core process*.\n// Opening six well-known macOS protected directories is cheaper and safer\n// than scanning contents with du, and does not inspect or retain filenames.\n// This reports proven directory access, NOT the state of macOS's FDA toggle.\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport const protectedDirectories=Object.freeze([\n {id:\"cloudDocs\",label:\"iCloud 文件\",suffix:\"Library/Application Support/CloudDocs\"},\n {id:\"mobileSync\",label:\"设备备份\",suffix:\"Library/Application Support/MobileSync\"},\n {id:\"tcc\",label:\"隐私数据库目录\",suffix:\"Library/Application Support/com.apple.TCC\"},\n {id:\"addressBook\",label:\"通讯录\",suffix:\"Library/Application Support/AddressBook\"},\n {id:\"faceTime\",label:\"FaceTime\",suffix:\"Library/Application Support/FaceTime\"},\n {id:\"knowledge\",label:\"系统知识库\",suffix:\"Library/Application Support/Knowledge\"}\n]);\nexport function classifyDirectoryAccess(error: unknown){\n if(!error)return \"READ_OK\";\n if([\"EACCES\",\"EPERM\"].includes(errorCode(error)||\"\"))return \"OS_DENIED\";\n if(errorCode(error)===\"ENOENT\")return \"MISSING\";\n return \"INCONCLUSIVE\";\n}\nexport function summarizeDirectoryAccess(checks: readonly {state:string}[]){\n if(checks.length===0)return \"unknown\";\n if(checks.every(c=>c.state===\"READ_OK\"))return \"verified\";\n if(checks.some(c=>c.state===\"OS_DENIED\"))return \"needs-attention\";\n return \"partial-or-unknown\";\n}\nexport async function probeCurrentDirectoryAccess({\n home=os.homedir(),openDirectory=(name: string)=>fs.opendir(name),now=()=>new Date()\n}={}){\n const checks=[];\n for(const directory of process.platform===\"darwin\"?protectedDirectories:[]){\n let handle=null;let state=\"INCONCLUSIVE\";\n try{\n handle=await openDirectory(path.join(home,directory.suffix));\n state=\"READ_OK\";\n }catch(error){\n state=classifyDirectoryAccess(error);\n }finally{\n if(handle)try{await handle.close();}catch{state=\"INCONCLUSIVE\";}\n }\n checks.push({id:directory.id,label:directory.label,state});\n }\n return {\n schemaVersion:1,context:\"gateway-process\",method:\"open-directory-without-reading-entries\",\n checkedAt:now().toISOString(),summary:summarizeDirectoryAccess(checks),\n checks\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"dc-workspace-http.js","sourceRoot":"","sources":["../../src/dc-workspace-http.ts"],"names":[],"mappings":"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","sourcesContent":["import {resourceMetadata,metadataUrl,oauthChallenge,OAuthError} from './oauth-resource.js';\nimport {randomUUID} from 'node:crypto';\nimport {createAccessControl} from './access-control.js';\nimport {accessPage,accessPost,accessHeaders} from './access-dashboard.js';\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\n// SDK 1.32.1 transport callback optionality predates exactOptionalPropertyTypes.\n// The transport satisfies the runtime interface; keep the compatibility cast local.\nimport type { AuditSink } from \"./contracts.js\";\nimport { isSafeInteger } from \"./validation.js\";\n// Explicit project-root Desktop Commander MCP endpoint. Never exposed to public Caddy.\n// Start only with owner-approved MAC_MCP_PROJECT_ROOT; no default HOME traversal.\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { createServer } from \"node:http\";\nimport { createAuthorizedWorkspacePolicy } from \"./authorized-workspace-roots.js\";\nimport { bootstrapConfiguredUpstreams } from \"./configured-mcp-upstreams.js\";\nimport { probeCurrentDirectoryAccess } from \"./current-permission-probe.js\";\nimport { applyDenyPost,denyPageHeaders,renderDenyDashboard } from \"./deny-dashboard.js\";\nimport { createDesktopCommanderBridge } from \"./desktop-commander-facade.js\";\nimport { createDenyRules } from \"./explicit-deny-rules.js\";\nimport { LocalDesktopReadProbe } from \"./local-desktop-read-probe.js\";\nimport { createManagedWorkspacePolicy } from \"./managed-workspace-policy.js\";\nimport { createMCPUpstreamRouter } from \"./mcp-upstream-router.js\";\nimport { collectOperationsSnapshot,dashboardHeaders,renderOperationsHtml,instancePage } from \"./ops-dashboard.js\";\nimport { applyPermissionPost,permissionHeaders,renderPermissionDashboard } from \"./permissions-dashboard.js\";\nimport { createPrivateMCPActivity } from \"./private-mcp-activity.js\";\nimport { createGitWorkflow } from \"./project-git-workflow.js\";\nimport { createProjectPolicy } from \"./project-workspace-policy.js\";\nimport { createWorkspaceGrants } from \"./workspace-grants.js\";\n\nexport interface RuntimeOptions {env?: NodeJS.ProcessEnv; audit?: AuditSink}\nexport interface GatewayRuntime {start(): Promise<void>; close(): Promise<void>; readonly port: number|null}\n/** Construction and imports are inert; only start acquires resources. */\nexport function createGatewayRuntime(options: RuntimeOptions={}): GatewayRuntime {\n let running: Awaited<ReturnType<typeof initializeGateway>>|null=null;\n let starting: Promise<void>|null=null;\n let closing: Promise<void>|null=null;\n return {\n get port(){return running?.port??null;},\n async start(){\n if(closing)await closing;\n if(running)return;\n if(!starting)starting=initializeGateway(options).then(value=>{running=value;}).finally(()=>{starting=null;});\n await starting;\n },\n async close(){\n if(closing)return closing;\n closing=(async()=>{\n if(starting)await starting.catch(()=>{});\n const current=running;running=null;\n await current?.close();\n })().finally(()=>{closing=null;});\n await closing;\n }\n };\n}\nasync function initializeGateway({env=process.env,audit:externalAudit}: RuntimeOptions){\nconst access=await createAccessControl(env.MAC_MCP_ACCESS_FILE);\nconst page=(html:string)=>instancePage(html,env.MAC_MCP_INSTANCE_NAME,env.MAC_MCP_INSTANCE_ID);\nconst root=env.MAC_MCP_PROJECT_ROOT;\nif(!root)throw new Error(\"OWNER_APPROVED_PROJECT_ROOT_REQUIRED\");\nconst mode=env.MAC_MCP_WORKSPACE_MODE||\"read-only\";\nconst developerCommands=env.MAC_MCP_DEV_COMMANDS||\"presets\";\nconst nativeAccessMode=env.MAC_MCP_DC_ACCESS_MODE||\"workspace\";\nconst writeScope=env.MAC_MCP_DC_WRITE_SCOPE||\"unrestricted\";\nif(![\"unrestricted\",\"home-only\"].includes(writeScope)||\n (writeScope===\"home-only\"&&nativeAccessMode!==\"native\"))\n throw Error(\"HOME_WRITE_SCOPE_REQUIRES_NATIVE_ROLE\");\nif(writeScope===\"home-only\"&&env.MAC_MCP_UPSTREAMS_FILE)\n throw Error(\"HOME_WRITE_SCOPE_UNSANDBOXED_EXTRA_UPSTREAMS\");\nif(![\"workspace\",\"native\"].includes(nativeAccessMode)||\n (nativeAccessMode===\"native\"&&\n (developerCommands!==\"trusted-project\"||mode!==\"read-write\")))\n throw new Error(\"NATIVE_ACCESS_REQUIRES_OWNER_TRUSTED_DEVELOPER_PROFILE\");\nconst policy=await createProjectPolicy({root,mode,developerCommands,\n allowTrustedHomeRoot:nativeAccessMode===\"native\"&&developerCommands===\"trusted-project\"});\nconst desiredPort=Number(env.MAC_MCP_PROJECT_PORT||8793);\nif(!isSafeInteger(desiredPort)||desiredPort<0||desiredPort>65535)\n throw new Error(\"INVALID_PORT\");\nlet activity: ReturnType<typeof createPrivateMCPActivity>|null=null;\nconst audit: AuditSink=e=>{\n activity?.observeAudit(e);\n if(externalAudit){externalAudit(e);return;}\n process.stdout.write(JSON.stringify({\n at:new Date().toISOString(),profile:\"project-workspace\",...e\n})+\"\\n\");\n};\nconst upstream=new LocalDesktopReadProbe({writeScope});\nlet configured: Awaited<ReturnType<typeof bootstrapConfiguredUpstreams>>|undefined;\nlet http: import('node:http').Server|undefined;\nconst bridges=new Set<import('@modelcontextprotocol/sdk/server/index.js').Server>();\nasync function close(){\n const server=http;\n const stopped=server?.listening ? new Promise<void>((resolve,reject)=>server.close(e=>e?reject(e):resolve())) : Promise.resolve();\n server?.closeAllConnections();\n await Promise.allSettled([...bridges].map(bridge=>bridge.close()));\n await Promise.allSettled([upstream.close(),...(configured?.upstreams??[]).map(child=>child.close())]);\n await stopped;\n}\ntry {\nawait upstream.connect();\n// Default configuration remains the original Desktop Commander-only profile.\n// Additional trusted operator-owned routes require an explicit private config.\nconfigured=await bootstrapConfiguredUpstreams(env.MAC_MCP_UPSTREAMS_FILE,audit);\nconst router=createMCPUpstreamRouter({routes:[\n {id:\"desktop\",upstream,exposeNativeNames:true},...configured.routes\n]});\n// Owner explicitly opts in on isolated development runs only.\n// Not enabled in the currently deployed 8793 process.\nif(env.MAC_MCP_PRIVATE_ACTIVITY_OBSERVER===\"1\")\n activity=createPrivateMCPActivity({routeFor:name=>router.routeFor(name)});\nconst worktreeMode=env.MAC_MCP_WORKTREE_MODE||\"off\";\nif(![\"off\",\"linked\"].includes(worktreeMode))throw Error(\"INVALID_WORKTREE_MODE\");\nconst worktreePolicy=createAuthorizedWorkspacePolicy({\n basePolicy:policy,linkedGitWorktrees:worktreeMode\n});\n// Explicit opt-in: existing/private deployments remain unchanged without this file.\nconst grants=env.MAC_MCP_GRANTS_FILE?\n await createWorkspaceGrants({file:env.MAC_MCP_GRANTS_FILE,audit}):null;\nconst workspacePolicy=grants?\n createManagedWorkspacePolicy({basePolicy:worktreePolicy,grants}):worktreePolicy;\n// Optional explicit deny preferences: default empty, independent from DC tools.\n// Owner-managed only via the same local token as Workspace Permissions.\nif(env.MAC_MCP_DENY_FILE&&!grants)\n throw Error(\"DENY_CONSOLE_REQUIRES_OWNER_GRANTS\");\nconst denyRules=env.MAC_MCP_DENY_FILE?\n await createDenyRules({file:env.MAC_MCP_DENY_FILE,audit}):null;\nconst gitMode=env.MAC_MCP_GIT_MODE||\"off\";\nif(![\"off\",\"review\",\"write\",\"push\"].includes(gitMode))throw new Error(\"INVALID_GIT_MODE\");\nif(writeScope===\"home-only\"&&gitMode!==\"off\")\n throw Error(\"HOME_WRITE_SCOPE_GATEWAY_GIT_MUST_BE_OFF\");\nconst gitWorkflow=gitMode===\"off\"?null:createGitWorkflow({\n policy,upstream,writesEnabled:gitMode===\"write\"||gitMode===\"push\",\n pushEnabled:gitMode===\"push\"\n});\nhttp=createServer(async(req,res)=>{\n const local=req.socket.remoteAddress===\"127.0.0.1\";\n const address=http?.address();\n const port=address&&typeof address!==\"string\"?address.port:null;\n const hostOk=[`127.0.0.1:${port}`,`localhost:${port}`].includes(req.headers.host??\"\");\n if(!local||!hostOk){res.writeHead(403).end(\"Denied\");return;}\n const route=new URL(req.url||\"/\",\"http://localhost\").pathname;\n if(route.startsWith('/.well-known/oauth-protected-resource')&&(req.method==='GET'||req.method==='OPTIONS')){\n try{\n const config=await access.oauthSettings();\n if(!config||![new URL(metadataUrl(config)).pathname,'/.well-known/oauth-protected-resource'].includes(route)){\n res.writeHead(404).end('Not found');return;\n }\n res.writeHead(req.method==='OPTIONS'?204:200,{'content-type':'application/json','cache-control':'no-store',\n 'access-control-allow-origin':'*','access-control-allow-methods':'GET, OPTIONS'});\n res.end(req.method==='OPTIONS'?undefined:JSON.stringify(resourceMetadata(config)));\n }catch{res.writeHead(503).end('Access configuration unavailable');}\n return;\n }\n // Only the owner authorization form accepts an Origin; MCP remains no-CORS.\n if(req.headers.origin&&!(\n (route===\"/permissions\"||route===\"/filters\"||route===\"/access\")&&req.method===\"POST\")){\n res.writeHead(403).end(\"Denied\");return;\n }\n if(route===\"/access\"){\n try{\n if(req.method===\"GET\"){\n res.writeHead(200,{...accessHeaders,\"content-type\":\"text/html; charset=utf-8\"}).end(page(accessPage(await access.snapshot())));\n }else if(req.method===\"POST\"){\n const result=await accessPost(req,access);\n if(result.status===200&&env.MAC_MCP_INSTANCE_ID){\n const {changeRegistry,instancePaths}=await import('./instance-store.js');\n await changeRegistry(async registry=>{\n const instance=registry.instances.find(i=>i.id===env.MAC_MCP_INSTANCE_ID);\n if(instance&&instancePaths(instance).access===access.file)instance.requiredAccess=(await access.snapshot()).mode;\n });\n }\n res.writeHead(result.status,{...accessHeaders,\"content-type\":\"text/html; charset=utf-8\"}).end(page(result.html||\"Access update rejected\"));\n }else res.writeHead(405).end();\n }catch{res.writeHead(503,{...accessHeaders}).end(\"Access configuration unavailable\");}\n return;\n }\n if(route===\"/filters\"&&denyRules&&grants){\n if(req.method===\"GET\"){\n try{\n const state=await denyRules.snapshot();\n res.writeHead(200,{...denyPageHeaders,\n \"content-type\":\"text/html; charset=utf-8\"});\n res.end(renderDenyDashboard({rules:state,toolCatalog:[\n ...router.upstreamCatalog,...(gitWorkflow?gitWorkflow.names.map(name=>({name})):[]),\n ...(workspacePolicy.prepareDiskUsage?[{name:\"gateway_disk_usage\"}]:[]),\n {name:\"health_check\"}\n ]}));\n }catch{\n res.writeHead(503,{...denyPageHeaders}).end(\"Tool filters unavailable\");\n }\n return;\n }\n if(req.method===\"POST\"){\n const result=await applyDenyPost(req,denyRules,\n token=>grants.authorized(token),req.headers.host);\n res.writeHead(result.status,{...denyPageHeaders,\n ...(result.location?{location:result.location}:{}),\n \"content-type\":\"text/plain; charset=utf-8\"});\n res.end(result.message||\"Updated\");\n return;\n }\n res.writeHead(405).end(\"Method not allowed\");return;\n }\n if(route===\"/permissions\"&&grants){\n if(req.method===\"GET\"){\n try{\n const data=await grants.snapshot({validatePaths:false});\n res.writeHead(200,{...permissionHeaders,\n \"content-type\":\"text/html; charset=utf-8\"});\n res.end(page(renderPermissionDashboard({\n project:{path:policy.root,mode:policy.mode},home:grants.home,config:data,\n nativeAccessEnabled:nativeAccessMode===\"native\"\n })));\n }catch{\n res.writeHead(503,{...permissionHeaders}).end(\"Permissions unavailable\");\n }\n return;\n }\n if(req.method===\"POST\"){\n const result=await applyPermissionPost(req,grants,req.headers.host);\n res.writeHead(result.status,{...permissionHeaders,\n ...(result.location?{location:result.location}:{}),\n \"content-type\":\"text/plain; charset=utf-8\"});\n res.end(result.message||\"Updated\");\n return;\n }\n res.writeHead(405).end(\"Method not allowed\");return;\n }\n if((route===\"/dashboard\"||route===\"/dashboard.json\")&&req.method===\"GET\"){\n try{\n const snapshot={...await collectOperationsSnapshot(),configuredUpstreams:configured!.status(),\n ...(env.MAC_MCP_INSTANCE_ID?{instance:{id:env.MAC_MCP_INSTANCE_ID,name:env.MAC_MCP_INSTANCE_NAME??env.MAC_MCP_INSTANCE_ID,port:desiredPort}}:{}),\n accessControl:await access.snapshot(),\n permissionManagementEnabled:Boolean(grants),\n nativeAccessEnabled:nativeAccessMode===\"native\",\n denyRuleManagementEnabled:Boolean(denyRules)};\n const json=route.endsWith(\".json\");\n res.writeHead(200,{...dashboardHeaders,\n \"content-type\":json?\"application/json; charset=utf-8\":\"text/html; charset=utf-8\"});\n res.end(json?JSON.stringify(snapshot):renderOperationsHtml(snapshot));\n }catch{\n res.writeHead(503,{...dashboardHeaders,\"content-type\":\"text/plain\"});\n res.end(\"Dashboard temporarily unavailable\");\n }\n return;\n }\n if(route===\"/activity.json\"&&req.method===\"GET\"&&activity){\n res.writeHead(200,{...dashboardHeaders,\n \"content-type\":\"application/json; charset=utf-8\"});\n res.end(JSON.stringify(activity.snapshot()));\n return;\n }\n // A lightweight, read-only capability probe in the actual Core\n // process. Never reports macOS TCC toggle state or any file names.\n if(route===\"/privacy/status\"&&req.method===\"GET\"){\n try{\n const state=await probeCurrentDirectoryAccess();\n res.writeHead(200,{\"content-type\":\"application/json; charset=utf-8\",\n \"cache-control\":\"no-store\",\"x-content-type-options\":\"nosniff\"});\n res.end(JSON.stringify(state));\n }catch{\n res.writeHead(503,{\"cache-control\":\"no-store\"}).end(\"Permission check unavailable\");\n }\n return;\n }\n if(route===\"/healthz\"&&req.method===\"GET\"){\n res.writeHead(200,{\"content-type\":\"application/json\",\"cache-control\":\"no-store\"});\n const accessMode=await access.snapshot().then(s=>s.mode).catch(()=>\"unavailable\");\n res.end(JSON.stringify({status:\"ok\",service:\"dc-project-workspace\",mode,\n writeScope,accessMode,...(env.MAC_MCP_INSTANCE_ID?{instanceId:env.MAC_MCP_INSTANCE_ID,instanceName:env.MAC_MCP_INSTANCE_NAME}:{})}));\n return;\n }\n if(route!==\"/mcp\"){\n res.writeHead(404).end(\"Not found\");return;\n }\n if(Number(req.headers[\"content-length\"]||0)>65536){\n res.writeHead(413).end(\"Too large\");return;\n }\n let identity: import('./contracts.js').RequestContext['identity'];\n try{identity=await access.authenticate(req.headers.authorization);}\n catch(error){\n const config=await access.oauthSettings().catch(()=>null);\n const status=error instanceof OAuthError?error.status:error instanceof Error&&error.message==='ACCESS_UNAUTHORIZED'?401:503;\n const challenge=config?oauthChallenge(config,status===403?403:401):'Bearer realm=\"Gateway\"';\n res.writeHead(status,{\"cache-control\":\"no-store\",...(status!==503?{\"www-authenticate\":challenge}:{})}).end(status===503?\"Access configuration unavailable\":\"Authentication required or access denied\");return;\n }\n if(req.method!=='POST'){res.writeHead(405,{allow:'POST'}).end('Method not allowed');return;}\n const oauth=identity.kind==='verified-oauth'?await access.oauthSettings().catch(()=>null):null;\n if(identity.kind==='verified-oauth'&&!oauth){res.writeHead(503).end('Access configuration unavailable');return;}\n const request={requestId:randomUUID(),identity};\n audit({event:'MCP_REQUEST_ACCEPTED',requestId:request.requestId,identityKind:identity.kind,\n ...(identity.kind==='verified-api-key'?{credentialId:identity.credentialId}:identity.kind==='verified-oauth'?{connectionId:identity.connectionId}:{})});\n const transport=new StreamableHTTPServerTransport({\n enableJsonResponse:true\n });\n const gateway=createDesktopCommanderBridge(router,audit,{\n request,...(oauth?{oauthScope:oauth.scope}:{}),workspacePolicy,upstreamRouter:router,\n nativePassthrough:nativeAccessMode===\"native\",denyRules,\n ...(gitWorkflow?{gitWorkflow}:{})\n });\n bridges.add(gateway);\n res.on(\"close\",()=>{bridges.delete(gateway);void transport.close();void gateway.close();});\n try{await gateway.connect(transport as Transport);await transport.handleRequest(req,res);}\n catch{if(!res.headersSent)res.writeHead(500).end(\"MCP failure\");}\n});\nhttp.requestTimeout=12000;\nhttp.headersTimeout=10000;\nawait new Promise<void>((resolve,reject)=>{\n http!.once('error',reject);\n http!.listen(desiredPort,'127.0.0.1',()=>{http!.off('error',reject);resolve();});\n});\nconst address=http.address();\nif(!address||typeof address==='string')throw Error('INVALID_LISTENER_ADDRESS');\naudit({event:'PROJECT_WORKSPACE_LISTENING',port:address.port,mode});\nreturn {port:address.port,close};\n}catch(error){await close().catch(()=>{});throw error;}\n}\n/** Only the process entrypoint owns signal handlers. */\nexport async function runGateway(options: RuntimeOptions={}) {\n const runtime=createGatewayRuntime(options);\n await runtime.start();\n const stop=()=>{\n void runtime.close().catch(()=>{process.exitCode=1;}).finally(()=>{\n process.off('SIGINT',stop);process.off('SIGTERM',stop);\n process.off('message',message);process.off('disconnect',stop);\n if(process.connected)process.disconnect();\n });\n };\n const message=(value:unknown)=>{if(value&&typeof value==='object'&&'type' in value&&value.type==='gateway-stop')stop();};\n if(process.send){process.on('message',message);process.on('disconnect',stop);}\n process.on('SIGINT',stop);process.on('SIGTERM',stop);\n return runtime;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"deny-dashboard.js","sourceRoot":"","sources":["../../src/deny-dashboard.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,iEAAiE;AACjE,0EAA0E;AAC1E,4EAA4E;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,MAAM,CAAC,GAAC,CAAC,CAAU,EAAC,EAAE,CAAA,MAAM,CAAC,CAAC,IAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAC,CAAC,CAAA,EAAE,CACxD,CAAC,EAAC,GAAG,EAAC,OAAO,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,QAAQ,EAAC,GAAG,EAAC,OAAO,EAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;AACtE,MAAM,CAAC,MAAM,eAAe,GAAC,iBAAiB,CAAC;AAC/C,MAAM,QAAQ,GAAC,CAAC,EAAU,EAAC,KAAa,EAAC,KAAa,EAAC,EAAE,CAAA,wCAAwC;IAC/F,wCAAwC,GAAC,CAAC,CAAC,EAAE,CAAC,GAAC,IAAI;IACnD,2CAA2C,GAAC,CAAC,CAAC,KAAK,CAAC,GAAC,IAAI;IACzD,uFAAuF;IACvF,wBAAwB,GAAC,CAAC,CAAC,KAAK,CAAC,GAAC,kBAAkB,CAAC;AACvD,MAAM,UAAU,mBAAmB,CAAC,EAAC,KAAK,EAAC,WAAW,GAAC,EAAE,EAA2D;IAClH,MAAM,MAAM,GAAC,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,CAAC,IAAI,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,IAAI,GAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE;QAC/B,MAAM,OAAO,GAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,OAAO,gBAAgB,GAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAC,kBAAkB;YACrD,CAAC,OAAO,CAAA,CAAC,CAAA,KAAK,CAAA,CAAC,CAAA,MAAM,CAAC,GAAC,WAAW;YAClC,QAAQ,CAAC,OAAO,CAAA,CAAC,CAAA,aAAa,CAAA,CAAC,CAAA,cAAc,EAAC,IAAI,CAAC,IAAI,EACrD,OAAO,CAAA,CAAC,CAAA,MAAM,CAAA,CAAC,CAAA,MAAM,CAAC,GAAC,YAAY,CAAC;IAC1C,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,KAAK,GAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAC7D,gBAAgB,GAAC,CAAC,CAAC,CAAC,CAAC,GAAC,oCAAoC;QACxD,QAAQ,CAAC,aAAa,EAAC,CAAC,EAAC,MAAM,CAAC,GAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CACzC,gBAAgB,GAAC,CAAC,CAAC,CAAC,CAAC,GAAC,kBAAkB;QACxC,QAAQ,CAAC,iBAAiB,EAAC,CAAC,EAAC,MAAM,CAAC,GAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,OAAO,gEAAgE;QACrE,qEAAqE;QACrE,uCAAuC;QACvC,4EAA4E;QAC5E,mEAAmE;QACnE,oEAAoE;QACpE,uEAAuE;QACvE,kEAAkE;QAClE,mDAAmD;QACnD,8CAA8C;QAC9C,qFAAqF;QACrF,iCAAiC;QACjC,+DAA+D;QAC/D,sCAAsC;QACtC,+BAA+B;QAC/B,4EAA4E;QAC5E,sBAAsB,GAAC,IAAI,GAAC,KAAK,GAAC,4BAA4B;QAC9D,4BAA4B;QAC5B,0BAA0B;QAC1B,mDAAmD;QACnD,iCAAiC;QACjC,kDAAkD;QAClD,gEAAgE;QAChE,CAAC,KAAK,IAAE,wCAAwC,CAAC;QACjD,kCAAkC;QAClC,wCAAwC;QACxC,wDAAwD;QACxD,0EAA0E;QAC1E,uFAAuF;QACvF,4CAA4C;QAC5C,sDAAsD;QACtD,uDAAuD;QACvD,qCAAqC;QACrC,4CAA4C;QAC5C,8CAA8C;QAC9C,gBAAgB,CAAC;AACrB,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAoB,EAAC,SAAoB,EAAC,SAA2C,EAAC,IAAqB;IAC7I,IAAG,GAAG,CAAC,OAAO,CAAC,MAAM,KAAG,SAAS,GAAC,IAAI;QACnC,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAG,mCAAmC;QACtF,OAAO,EAAC,MAAM,EAAC,GAAG,EAAC,OAAO,EAAC,8BAA8B,EAAC,CAAC;IAC7D,MAAM,MAAM,GAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAE,CAAC,CAAC,CAAC;IACtD,IAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAE,MAAM,GAAC,CAAC,IAAE,MAAM,GAAC,IAAI;QAC9C,OAAO,EAAC,MAAM,EAAC,GAAG,EAAC,OAAO,EAAC,iBAAiB,EAAC,CAAC;IAChD,IAAI,IAAI,GAAC,EAAE,CAAC;IACZ,IAAI,KAAK,EAAC,MAAM,KAAK,IAAI,GAAG,EAAC,CAAC;QAC5B,IAAI,IAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAC,IAAI;YAAC,OAAO,EAAC,MAAM,EAAC,GAAG,EAAC,OAAO,EAAC,iBAAiB,EAAC,CAAC;IAChF,CAAC;IACD,MAAM,IAAI,GAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,KAAI,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;QACxB,IAAG,CAAC,CAAC,IAAI,EAAC,OAAO,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAG,CAAC;YAC/D,OAAO,EAAC,MAAM,EAAC,GAAG,EAAC,OAAO,EAAC,cAAc,EAAC,CAAC;IAC/C,IAAG,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,EAAC,MAAM,EAAC,GAAG,EAAC,OAAO,EAAC,8BAA8B,EAAC,CAAC;IAC7D,MAAM,EAAE,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAE,EAAE,CAAC;IAC5B,IAAG,CAAC,CAAC,aAAa,EAAC,cAAc,EAAC,gBAAgB,EAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChF,OAAO,EAAC,MAAM,EAAC,GAAG,EAAC,OAAO,EAAC,mBAAmB,EAAC,CAAC;IAClD,IAAG,CAAC;QACF,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,EAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7C,OAAO,EAAC,MAAM,EAAC,GAAG,EAAC,QAAQ,EAAC,UAAU,EAAC,CAAC;IAC1C,CAAC;IAAA,MAAK,CAAC;QACL,OAAO,EAAC,MAAM,EAAC,GAAG,EAAC,OAAO,EAAC,wCAAwC,EAAC,CAAC;IACvE,CAAC;AACH,CAAC","sourcesContent":["import type { IncomingMessage } from \"node:http\";\nimport type { DenyConfig,DenyRules,PostResult } from \"./contracts.js\";\nimport { isSafeInteger } from \"./validation.js\";\n// Owner-only, local Dashboard for optional tool/path deny rules.\n// The page has no JavaScript. Existing grants owner token and same-origin\n// form checks are reused; remote MCP tool calls cannot modify this profile.\nimport { permissionHeaders } from \"./permissions-dashboard.js\";\nconst h=(x: unknown)=>String(x??\"\").replace(/[&<>\"']/g,c=>\n ({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"}[c]!));\nexport const denyPageHeaders=permissionHeaders;\nconst controls=(op: string,value: string,label: string)=>'<form method=\"post\" action=\"/filters\">'+\n '<input type=\"hidden\" name=\"op\" value=\"'+h(op)+'\">'+\n '<input type=\"hidden\" name=\"value\" value=\"'+h(value)+'\">'+\n '<input type=\"password\" name=\"token\" autocomplete=\"off\" placeholder=\"本机管理密钥\" required>'+\n '<button type=\"submit\">'+h(label)+'</button></form>';\nexport function renderDenyDashboard({rules,toolCatalog=[]}: {rules:DenyConfig;toolCatalog?:readonly {name:string}[]}){\n const byName=new Map(toolCatalog.map(t=>[t.name,t]));\n const rows=toolCatalog.map(tool=>{\n const blocked=rules.deniedTools.includes(tool.name);\n return '<tr><td><code>'+h(tool.name)+'</code></td><td>'+\n (blocked?\"已禁用\":\"默认允许\")+'</td><td>'+\n controls(blocked?\"enable-tool\":\"disable-tool\",tool.name,\n blocked?\"重新启用\":\"禁用工具\")+'</td></tr>';\n }).join(\"\");\n const stale=rules.deniedTools.filter(n=>!byName.has(n)).map(n=>\n '<tr><td><code>'+h(n)+'</code></td><td>禁用(当前未发现)</td><td>'+\n controls(\"enable-tool\",n,\"撤销禁用\")+'</td></tr>').join(\"\");\n const paths=rules.deniedDirectories.map(n=>\n '<tr><td><code>'+h(n)+'</code></td><td>'+\n controls(\"allow-directory\",n,\"移除过滤\")+'</td></tr>').join(\"\");\n return '<!doctype html><html lang=\"zh-CN\"><head><meta charset=\"utf-8\">'+\n '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">'+\n '<title>Starmux · Tool Filters</title>'+\n '<style>body{font:15px system-ui,-apple-system,sans-serif;max-width:1000px;'+\n 'margin:28px auto;padding:0 20px;background:#f6f7fa;color:#233045}'+\n 'section{background:white;border:1px solid #ddd;border-radius:12px;'+\n 'padding:20px;margin:15px 0}table{width:100%;border-collapse:collapse}'+\n 'td,th{padding:10px;border-bottom:1px solid #ddd;text-align:left}'+\n 'input,button{padding:7px;margin:3px;font:inherit}'+\n 'input[name=value]{width:80%;max-width:600px}'+\n 'code{overflow-wrap:anywhere}small{display:block;color:#657083}</style></head><body>'+\n '<h1>Starmux · Tool Filters</h1>'+\n '<p><strong>Default Allow / Explicit Deny</strong>:上游工具默认全部可用。'+\n '只有设备所有者明确禁用的工具会从 AI 的 tools/list 消失;'+\n '旧客户端直接调用时也会被拒绝。新工具默认自动可用。</p>'+\n '<section><h2>工具黑名单</h2><table><thead><tr><th>工具</th><th>状态</th><th>操作</th>'+\n '</tr></thead><tbody>'+rows+stale+'</tbody></table></section>'+\n '<section><h2>目录过滤(可选)</h2>'+\n '<p>仅检查具有明确文件路径参数的直接工具调用。'+\n '<strong>不限制 Shell、Python、脚本或上游工具间接访问文件。</strong> '+\n '也不是操作系统沙箱;对目录的递归枚举或搜索亦不能提供可靠隔离。'+\n '需要真正隔离时,应由 Desktop Commander / macOS / 容器负责。</p>'+\n '<table><thead><tr><th>过滤目录</th><th>操作</th></tr></thead><tbody>'+\n (paths||'<tr><td colspan=\"2\">没有目录过滤规则</td></tr>')+\n '</tbody></table><h3>添加禁止的目录</h3>'+\n '<form method=\"post\" action=\"/filters\">'+\n '<input type=\"hidden\" name=\"op\" value=\"deny-directory\">'+\n '<input name=\"value\" type=\"text\" placeholder=\"/absolute/folder\" required>'+\n '<input type=\"password\" name=\"token\" autocomplete=\"off\" placeholder=\"本机管理密钥\" required>'+\n '<button type=\"submit\">添加过滤</button></form>'+\n '<small>启用后,含路径参数的直接工具调用要求绝对路径;未设置过滤时不改变原生调用。</small>'+\n '</section><p><a href=\"/dashboard\">运行 Dashboard</a> · '+\n '<a href=\"/permissions\">目录授权</a></p>'+\n '<small>黑名单是防误操作护栏,不是抵御恶意 Shell 或提示注入的安全边界。'+\n '这里的管理密钥只由设备所有者在 Mac 本机使用,不得发送给远程 AI。</small>'+\n '</body></html>';\n}\nexport async function applyDenyPost(req: IncomingMessage,ruleStore: DenyRules,authorize:(token:unknown)=>Promise<boolean>,host:string|undefined): Promise<PostResult>{\n if(req.headers.origin!==\"http://\"+host||\n (req.headers[\"content-type\"]||\"\").split(\";\")[0]!==\"application/x-www-form-urlencoded\")\n return {status:403,message:\"Owner authorization required\"};\n const length=Number(req.headers[\"content-length\"]||0);\n if(!isSafeInteger(length)||length<1||length>4096)\n return {status:413,message:\"Invalid request\"};\n let body=\"\";\n for await(const chunk of req){\n body+=chunk.toString(\"utf8\");\n if(Buffer.byteLength(body)>4096)return {status:413,message:\"Invalid request\"};\n }\n const form=new URLSearchParams(body);\n for(const k of form.keys())\n if(![\"op\",\"value\",\"token\"].includes(k)||form.getAll(k).length!==1)\n return {status:400,message:\"Invalid form\"};\n if(!await authorize(form.get(\"token\")))\n return {status:403,message:\"Owner authorization required\"};\n const op=form.get(\"op\")??\"\";\n if(![\"enable-tool\",\"disable-tool\",\"deny-directory\",\"allow-directory\"].includes(op))\n return {status:400,message:\"Invalid operation\"};\n try{\n await ruleStore.update(op,form.get(\"value\"));\n return {status:303,location:\"/filters\"};\n }catch{\n return {status:400,message:\"Rule rejected: check name or directory\"};\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"desktop-commander-facade.js","sourceRoot":"","sources":["../../src/desktop-commander-facade.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RequestContext,AuditSink,DenyRules,GitWorkflow,McpUpstream,ResourceProvider,UpstreamRouter,WorkspacePolicy } from \"./contracts.js\";\nimport type { InvocationMiddleware } from \"./invocation.js\";\nimport { createInvocationPipeline,safeAuditSink } from \"./invocation.js\";\nimport type { LocalDesktopReadProbe } from './local-desktop-read-probe.js';\nimport { createToolDispatcher } from \"./tool-dispatch.js\";\nexport type BridgeUpstream = McpUpstream & Partial<ResourceProvider> & Partial<Pick<LocalDesktopReadProbe,'callApprovedRead'|'callApprovedProjectRead'|'callApprovedCanaryWrite'|'callApprovedSystemName'>>;\nexport interface BridgeOptions {oauthScope?:string;request?:RequestContext;workspacePolicy?:WorkspacePolicy;upstreamRouter?:UpstreamRouter;nativePassthrough?:boolean;denyRules?:DenyRules|null;gitWorkflow?:GitWorkflow;middleware?:readonly InvocationMiddleware[]}\n// Desktop Commander tool-schema facade. Upstream catalog remains unmodified.\n// Preserve all native upstream tools; owner-approved native mode forwards unchanged.\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\nCallToolRequestSchema,\nListResourcesRequestSchema,\nListResourceTemplatesRequestSchema,\nListToolsRequestSchema,\nReadResourceRequestSchema\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { gitTools } from \"./project-git-workflow.js\";\n\nexport function createDesktopCommanderBridge(upstream: BridgeUpstream, audit: AuditSink=()=>{}, options: BridgeOptions={}) {\n const safeAudit = safeAuditSink(audit);\n const resourcesEnabled=typeof upstream.listResources===\"function\"&&\n typeof upstream.readResource===\"function\";\n const server=new Server({\n name:\"mac-mcp-gateway-desktop-commander-bridge\",version:\"0.1.0\"\n },{capabilities:{tools:{},...(resourcesEnabled?{resources:{}}:{})}});\n if(resourcesEnabled){\n server.setRequestHandler(ListResourcesRequestSchema,async()=>{\n return {resources:await upstream.listResources!()};\n });\n server.setRequestHandler(ReadResourceRequestSchema,async(request)=>{\n const uri=request.params.uri;\n const resources=await upstream.listResources!();\n if(!resources.some(item=>item.uri===uri))\n throw Error(\"MCP_UI_RESOURCE_NOT_ADVERTISED\");\n return upstream.readResource!(uri);\n });\n server.setRequestHandler(ListResourceTemplatesRequestSchema,async()=>({\n resourceTemplates:typeof upstream.listResourceTemplates===\"function\"?\n await upstream.listResourceTemplates():[]\n }));\n }\n server.setRequestHandler(ListToolsRequestSchema,async()=>{\n const state=options.denyRules?await options.denyRules.snapshot():null;\n return {tools:[...upstream.upstreamCatalog,...(options.gitWorkflow?gitTools:[]),\n ...(options.workspacePolicy?.prepareDiskUsage?[{\n name:\"gateway_disk_usage\",\n description:\"Read-only disk usage in KiB of an authorized directory, executed by local Desktop Commander\",\n inputSchema:{type:\"object\",properties:{path:{type:\"string\"},\n depth:{type:\"integer\",minimum:0,maximum:1,default:1}},\n required:[\"path\"],additionalProperties:false},\n annotations:{readOnlyHint:true,destructiveHint:false}\n }]:[]),{\n name:\"health_check\",\n description:\"Mac MCP Gateway bridge connection and genuine upstream availability check\",\n inputSchema:{type:\"object\",properties:{},additionalProperties:false},\n annotations:{readOnlyHint:true,destructiveHint:false}\n }].filter(tool=>!state?.deniedTools.includes(tool.name)).map(tool=>options.oauthScope?{...tool,\n securitySchemes:[{type:'oauth2',scopes:[options.oauthScope]}],\n _meta:{...('_meta' in tool?tool._meta:{}),securitySchemes:[{type:'oauth2',scopes:[options.oauthScope]}]}}:tool)};\n });\n const invoke = createInvocationPipeline({\n dispatch: createToolDispatcher(upstream, safeAudit, options),\n audit: safeAudit,\n ...(options.request ? {request:options.request} : {}),\n ...(options.denyRules ? {denyRules: options.denyRules} : {}),\n ...(options.middleware ? {middleware: options.middleware} : {})\n });\n server.setRequestHandler(CallToolRequestSchema, request => invoke(request.params));\n return server;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"explicit-deny-rules.js","sourceRoot":"","sources":["../../src/explicit-deny-rules.ts"],"names":[],"mappings":"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","sourcesContent":["import {withPrivateLock} from './private-store-lock.js';\nimport {ownedByUser,createPrivateDirectory,within} from \"./platform.js\";\nimport { denySchema } from \"./config-schemas.js\";\nimport type { AuditSink,DenyConfig,ToolArguments } from \"./contracts.js\";\nimport { GatewayError,errorCode,parseJSON,record } from \"./validation.js\";\n// Optional explicit-deny preferences. Never a sandbox; native tools and command\n// semantics belong to upstream Desktop Commander and the macOS execution user.\n// Reads the owner-only 0600 profile on EVERY discovery/call, so revocation applies\n// to stale-client tool calls without restarting the Gateway.\nimport { randomBytes } from \"node:crypto\";\nimport { lstat,mkdir,readFile,realpath,rename,rm,writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nfunction issue(code: string): never {const e=new GatewayError(code);throw e;};\nconst toolName=/^[a-zA-Z_][a-zA-Z0-9_.:-]{0,127}$/;\nconst pathKeys=new Set([\"path\",\"file_path\",\"paths\",\"source\",\"destination\",\"outputPath\"]);\nconst defaults=(): DenyConfig=>({version:1,deniedTools:[],deniedDirectories:[]});\nexport const defaultDenyRulesPath=(home=homedir())=>\n path.join(home,\".config\",\"mac-mcp-gateway\",\"deny-rules-v1.json\");\nfunction verify(value: unknown): DenyConfig {\n const obj=record(value,\"DENY_RULES_INVALID\");\n if(!obj||typeof obj!==\"object\"||Array.isArray(obj)||\n Object.keys(obj).sort().join()!==\"deniedDirectories,deniedTools,version\"||\n obj.version!==1||!Array.isArray(obj.deniedTools)||\n !Array.isArray(obj.deniedDirectories)||\n obj.deniedTools.length>64||obj.deniedDirectories.length>24)\n issue(\"DENY_RULES_INVALID\");\n if(obj.deniedTools.some(n=>typeof n!==\"string\"||!toolName.test(n))||\n new Set(obj.deniedTools).size!==obj.deniedTools.length)issue(\"DENY_TOOL_INVALID\");\n if(obj.deniedDirectories.some(p=>typeof p!==\"string\"||!path.isAbsolute(p)||\n p.includes(\"\\0\")||p.length>1024||path.normalize(p)!==p)||\n new Set(obj.deniedDirectories).size!==obj.deniedDirectories.length)\n issue(\"DENY_DIRECTORY_INVALID\");\n return denySchema.parse(obj);\n}\nasync function secureFile(file: string,{optional=false,directory=false}={}){\n const st=await lstat(file).catch(e=>errorCode(e)===\"ENOENT\"&&optional?null:Promise.reject(e));\n if(!st)return null;\n if(st.isSymbolicLink()||!ownedByUser(file,st,true)||\n (directory?!st.isDirectory():(!st.isFile()||st.nlink!==1)))issue(\"DENY_FILE_UNSAFE\");\n return st;\n}\nasync function atomic(file: string,payload: string){\n const temp=path.join(path.dirname(file),\".\"+path.basename(file)+\".\"+randomBytes(8).toString(\"hex\"));\n try{\n await writeFile(temp,payload,{flag:\"wx\",mode:0o600});\n await rename(temp,file);\n }finally{await rm(temp,{force:true});}\n}\nasync function canonical(raw: unknown,{mustExist=false}={}){\n if(typeof raw!==\"string\"||!path.isAbsolute(raw)||raw.length>1024||\n raw.includes(\"\\0\")||raw.split(path.sep).includes(\"..\")||path.normalize(raw)!==raw)\n issue(\"DENY_ABSOLUTE_DIRECTORY_REQUIRED\");\n let at=raw,tail=[];\n while(true){\n try{\n const resolved=await realpath(at);\n const c=path.join(resolved,...tail.reverse());\n if(mustExist){\n const st=await lstat(c);\n if(!st.isDirectory())issue(\"DENY_DIRECTORY_NOT_FOUND\");\n }\n return c;\n }catch(e){\n if(errorCode(e)!==\"ENOENT\")throw e;\n if(mustExist)issue(\"DENY_DIRECTORY_NOT_FOUND\");\n const parent=path.dirname(at);\n if(parent===at)issue(\"DENY_ROOT_UNAVAILABLE\");\n tail.push(path.basename(at));at=parent;\n }\n }\n}\nconst isWithin=within;\nfunction referencedPaths(name: string,args: ToolArguments){\n if(name===\"start_process\"||name===\"interact_with_process\"||name===\"get_config\"||\n name===\"set_config_value\")return [];\n if(!args||typeof args!==\"object\"||Array.isArray(args))return [];\n const values=[];\n for(const [key,val] of Object.entries(args)){\n if(!pathKeys.has(key))continue;\n if(typeof val===\"string\")values.push(val);\n else if(Array.isArray(val)&&val.every(x=>typeof x===\"string\"))\n values.push(...val);\n }\n return values;\n}\nexport async function createDenyRules({file=defaultDenyRulesPath(),audit=()=>{}}: {file?: string; audit?: AuditSink}={}){\n if(typeof file!==\"string\"||!path.isAbsolute(file)||path.basename(file).length>160)\n issue(\"DENY_RULES_FILE_PATH_REQUIRED\");\n const folder=path.dirname(file);\n createPrivateDirectory(folder);\n await secureFile(folder,{directory:true});\n await withPrivateLock(file+\".lock\",async()=>{\n if(!await secureFile(file,{optional:true}))\n await atomic(file,JSON.stringify(defaults(),null,2)+\"\\n\");\n });\n let sequence: Promise<unknown>=Promise.resolve();\n async function snapshot(){\n const st=await secureFile(file);\n if(st!.size>16384)issue(\"DENY_RULES_TOO_LARGE\");\n return verify(parseJSON(await readFile(file,\"utf8\")));\n }\n async function update(op: string,value: unknown){\n async function change(){\n const state=await snapshot();\n if(op===\"disable-tool\"||op===\"enable-tool\"){\n if(typeof value!==\"string\"||!toolName.test(value))issue(\"DENY_TOOL_INVALID\");\n if(op===\"disable-tool\"&&!state.deniedTools.includes(value))\n state.deniedTools.push(value);\n if(op===\"enable-tool\")state.deniedTools=state.deniedTools.filter(x=>x!==value);\n }else if(op===\"deny-directory\"||op===\"allow-directory\"){\n const canon=op===\"deny-directory\"?await canonical(value,{mustExist:true}):value;\n if(typeof canon!==\"string\"||!path.isAbsolute(canon)||\n canon.length>1024||path.normalize(canon)!==canon)issue(\"DENY_DIRECTORY_INVALID\");\n if(op===\"deny-directory\"&&!state.deniedDirectories.includes(canon))\n state.deniedDirectories.push(canon);\n if(op===\"allow-directory\")state.deniedDirectories=\n state.deniedDirectories.filter(x=>x!==canon);\n }else issue(\"DENY_RULE_OPERATION_INVALID\");\n verify(state);\n await atomic(file,JSON.stringify(state,null,2)+\"\\n\");\n audit({event:\"OWNER_DENY_RULE_CHANGED\",action:op,\n ...(op.endsWith(\"tool\")?{tool:value}:{ruleType:\"directory\"})});\n return state;\n }\n const next=sequence.then(()=>withPrivateLock(file+\".lock\",change));\n sequence=next.catch(()=>{});\n return next;\n }\n async function check(name: string,args: ToolArguments){\n const s=await snapshot();\n if(s.deniedTools.includes(name))issue(\"TOOL_DISABLED_BY_OWNER\");\n if(s.deniedDirectories.length===0)return;\n for(const candidate of referencedPaths(name,args)){\n // Relative path resolution may be upstream-specific. With explicit path\n // bans, fail closed instead of accidentally checking the wrong directory.\n if(!path.isAbsolute(candidate))issue(\"DENY_PATH_UNRESOLVED\");\n const resolved=await canonical(candidate);\n if(s.deniedDirectories.some(root=>isWithin(resolved,root)))\n issue(\"DIRECTORY_DISABLED_BY_OWNER\");\n }\n }\n await snapshot();\n return Object.freeze({file,snapshot,update,check});\n}\n"]}
@@ -1,66 +0,0 @@
1
- import { isInteger } from "./validation.js";
2
- // Human-facing status for the one local Gateway Core.
3
- // Keep runtime JSON stable for scripts, show only observed facts to humans.
4
- const RULE = "─".repeat(48);
5
- function value(v, fallback = "—") { return v === null || v === undefined || v === "" ? fallback : String(v); }
6
- function stateOf(s) {
7
- if (s.health === "ok" && s.coreControl === "RUNNING")
8
- return ["● RUNNING", "Healthy", "healthy"];
9
- if (s.executionMode === "stopped" && ["not-running", null].includes(s.health))
10
- return ["○ STOPPED", "Not running", "stopped"];
11
- if (s.health === "ok")
12
- return ["● DETECTED", "Ownership not verified", "warning"];
13
- if (s.executionMode === "unknown-listener")
14
- return ["! UNKNOWN", "Unrecognized listener", "warning"];
15
- return ["! ATTENTION", value(s.health, "Unavailable"), "warning"];
16
- }
17
- function tint(label, kind, color) {
18
- if (!color)
19
- return label;
20
- const ansi = { healthy: "\u001b[32m", stopped: "\u001b[90m", warning: "\u001b[33m" };
21
- return (ansi[kind] || "") + label + "\u001b[0m";
22
- }
23
- export function formatGatewayStatus(s, { version = "", color = false } = {}) {
24
- if (s?.event !== "GATEWAY_STATUS")
25
- throw Error("EXPECTED_GATEWAY_STATUS");
26
- const [state, description, kind] = stateOf(s);
27
- const port = isInteger(s.port) ? s.port : null;
28
- const active = s.health === "ok" && s.coreControl === "RUNNING";
29
- const endpoint = port ? "http://127.0.0.1:" + port : "Not configured";
30
- const launcher = s.coreLauncher === "app" ? "Menu bar App" :
31
- s.coreLauncher === "cli" ? "CLI" : s.coreLauncher === "unknown" ? "Unknown" : value(s.coreLauncher);
32
- const session = s.executionMode === "foreground" ? "Foreground" :
33
- s.executionMode === "stopped" ? "Stopped" : value(s.executionMode);
34
- const autostart = s.loginAutostart === "disabled" ? "Off" :
35
- s.loginAutostart === "enabled" ? "On" : value(s.loginAutostart, "Unknown");
36
- const permission = s.workspaceMode === "read-only" ? "Read only" :
37
- s.workspaceMode === "read-write" ? "Read / write" : "Not confirmed";
38
- const line = (label, data) => " " + label.padEnd(16) + data;
39
- const lines = [
40
- "",
41
- " Mac MCP Gateway" + (version ? " v" + version : ""),
42
- " " + RULE,
43
- line("Core", tint(state, kind, color) + " " + description),
44
- line("Local endpoint", endpoint),
45
- line("Dashboard", port ? endpoint + "/dashboard" : "Not available"),
46
- line("Access control", s.accessMode === "oauth" ? "OAuth required" : s.accessMode === "api-key" ? "Gateway API key required" : s.accessMode === "ingress" ? "Managed by ingress" : s.accessMode === "unavailable" ? "Unavailable · MCP blocked" : "Not confirmed"),
47
- line("Permissions", permission),
48
- line("Write scope", s.writeScope === "home-only" ? "Home only · Outside read-only" :
49
- s.writeScope === "unrestricted" ? "Unrestricted (trusted)" : "Not confirmed"),
50
- line("Launcher", active ? launcher + " · " + session : session),
51
- line("Core PID", active ? value(s.listenerPid) : "—"),
52
- line("Controller PID", active ? value(s.coreOwnerPid) : "—"),
53
- line("Login autostart", autostart),
54
- " " + RULE
55
- ];
56
- if (active)
57
- lines.push(" CLI controls: mac-mcp-gateway stop | mac-mcp-gateway run");
58
- else if (kind === "stopped")
59
- lines.push(" CLI start: mac-mcp-gateway run");
60
- else if (kind === "warning")
61
- lines.push(" Tip: Check the local listener and Core ownership before restarting.");
62
- lines.push(" Remote Tunnel / HTTPS connections are not verified here.");
63
- lines.push(" Machine output: mac-mcp-gateway status --json", "");
64
- return lines.join("\n") + "\n";
65
- }
66
- //# sourceMappingURL=gateway-status-format.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gateway-status-format.js","sourceRoot":"","sources":["../../src/gateway-status-format.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GatewayStatus } from \"./contracts.js\";\nimport { isInteger } from \"./validation.js\";\n// Human-facing status for the one local Gateway Core.\n// Keep runtime JSON stable for scripts, show only observed facts to humans.\nconst RULE=\"─\".repeat(48);\nfunction value(v: unknown,fallback=\"—\"){return v===null||v===undefined||v===\"\"?fallback:String(v);}\nfunction stateOf(s: GatewayStatus): [string,string,string] {\n if(s.health===\"ok\"&&s.coreControl===\"RUNNING\")return [\"● RUNNING\",\"Healthy\",\"healthy\"];\n if(s.executionMode===\"stopped\"&&[\"not-running\",null].includes(s.health))\n return [\"○ STOPPED\",\"Not running\",\"stopped\"];\n if(s.health===\"ok\")return [\"● DETECTED\",\"Ownership not verified\",\"warning\"];\n if(s.executionMode===\"unknown-listener\")return [\"! UNKNOWN\",\"Unrecognized listener\",\"warning\"];\n return [\"! ATTENTION\",value(s.health,\"Unavailable\"),\"warning\"];\n}\nfunction tint(label: string,kind: string,color: boolean){\n if(!color)return label;\n const ansi: Record<string,string>={healthy:\"\\u001b[32m\",stopped:\"\\u001b[90m\",warning:\"\\u001b[33m\"};\n return (ansi[kind]||\"\")+label+\"\\u001b[0m\";\n}\nexport function formatGatewayStatus(s: GatewayStatus,{version=\"\",color=false}={}){\n if(s?.event!==\"GATEWAY_STATUS\")throw Error(\"EXPECTED_GATEWAY_STATUS\");\n const [state,description,kind]=stateOf(s);\n const port=isInteger(s.port)?s.port:null;\n const active=s.health===\"ok\"&&s.coreControl===\"RUNNING\";\n const endpoint=port?\"http://127.0.0.1:\"+port:\"Not configured\";\n const launcher=s.coreLauncher===\"app\"?\"Menu bar App\":\n s.coreLauncher===\"cli\"?\"CLI\":s.coreLauncher===\"unknown\"?\"Unknown\":value(s.coreLauncher);\n const session=s.executionMode===\"foreground\"?\"Foreground\":\n s.executionMode===\"stopped\"?\"Stopped\":value(s.executionMode);\n const autostart=s.loginAutostart===\"disabled\"?\"Off\":\n s.loginAutostart===\"enabled\"?\"On\":value(s.loginAutostart,\"Unknown\");\n const permission=s.workspaceMode===\"read-only\"?\"Read only\":\n s.workspaceMode===\"read-write\"?\"Read / write\":\"Not confirmed\";\n const line=(label: string,data: string)=>\" \"+label.padEnd(16)+data;\n const lines=[\n \"\",\n \" Mac MCP Gateway\"+(version?\" v\"+version:\"\"),\n \" \"+RULE,\n line(\"Core\",tint(state,kind,color)+\" \"+description),\n line(\"Local endpoint\",endpoint),\n line(\"Dashboard\",port?endpoint+\"/dashboard\":\"Not available\"),\n line(\"Access control\",s.accessMode===\"oauth\"?\"OAuth required\":s.accessMode===\"api-key\"?\"Gateway API key required\":s.accessMode===\"ingress\"?\"Managed by ingress\":s.accessMode===\"unavailable\"?\"Unavailable · MCP blocked\":\"Not confirmed\"),\n line(\"Permissions\",permission),\n line(\"Write scope\",s.writeScope===\"home-only\"?\"Home only · Outside read-only\":\n s.writeScope===\"unrestricted\"?\"Unrestricted (trusted)\": \"Not confirmed\"),\n line(\"Launcher\",active?launcher+\" · \"+session:session),\n line(\"Core PID\",active?value(s.listenerPid):\"—\"),\n line(\"Controller PID\",active?value(s.coreOwnerPid):\"—\"),\n line(\"Login autostart\",autostart),\n \" \"+RULE\n ];\n if(active)\n lines.push(\" CLI controls: mac-mcp-gateway stop | mac-mcp-gateway run\");\n else if(kind===\"stopped\")\n lines.push(\" CLI start: mac-mcp-gateway run\");\n else if(kind===\"warning\")\n lines.push(\" Tip: Check the local listener and Core ownership before restarting.\");\n lines.push(\" Remote Tunnel / HTTPS connections are not verified here.\");\n lines.push(\" Machine output: mac-mcp-gateway status --json\",\"\");\n return lines.join(\"\\n\")+\"\\n\";\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"global-core-control.js","sourceRoot":"","sources":["../../src/global-core-control.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,sBAAsB,EAAC,WAAW,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAC,SAAS,EAAC,aAAa,EAAC,SAAS,EAAC,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAIxF,uEAAuE;AACvE,kFAAkF;AAClF,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE3D,SAAS,KAAK,CAAC,KAAY,EAAC,KAAY,IAAE,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA,CAAC;AAChH,SAAS,IAAI,CAAC,MAAc,IAAU,MAAM,CAAC,GAAC,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA,MAAM,CAAC,CAAC,CAAA,CAAC;AAAA,CAAC;AACjF,MAAM,SAAS,GAAC,CAAC,CAAU,EAAc,EAAE,CAAA,aAAa,CAAC,CAAC,CAAC,IAAE,CAAC,IAAE,IAAI,IAAE,CAAC,IAAE,KAAK,CAAC;AAC/E,MAAM,UAAU,YAAY,CAAC,IAAY,EAAC,IAAI,GAAC,WAAW,EAAE;IAC1D,IAAG,CAAC,SAAS,CAAC,IAAI,CAAC;QAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;IAChD,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,QAAQ,EAAC,IAAI,GAAC,WAAW;QACzC,IAAI,EAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAC,YAAY,CAAC,EAAC,MAAM,EAAC,OAAO,CAAA,CAAC,CAAA,gCAAgC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAC,EAAE,CAAC,EAAE,CAAA,CAAC,CAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAC,cAAc,CAAC,EAAC,CAAC;AACtN,CAAC;AACD,SAAS,SAAS,CAAC,CAAS,EAAC,MAAM,GAAC,KAAK;IACvC,IAAG,MAAM;QAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,EAAE,GAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACzB,IAAG,CAAC,EAAE,CAAC,WAAW,EAAE,IAAE,EAAE,CAAC,cAAc,EAAE,IAAE,CAAC,WAAW,CAAC,CAAC,EAAC,EAAE,EAAC,IAAI,CAAC;QAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;AAC9G,CAAC;AACD,SAAS,UAAU,CAAC,CAAS,EAAC,IAAY;IACxC,MAAM,EAAE,GAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACzB,IAAG,EAAE,CAAC,cAAc,EAAE,IAAE,CAAC,WAAW,CAAC,CAAC,EAAC,EAAE,EAAC,IAAI,CAAC;QAC5C,CAAC,CAAC,IAAI,KAAG,MAAM,CAAA,CAAC,CAAA,EAAE,CAAC,MAAM,EAAE,CAAA,CAAC,CAAA,EAAE,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,6BAA6B,CAAC,CAAC;AAC3C,CAAC;AACD,SAAS,SAAS,CAAC,KAAmB;IACpC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAAA,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,UAAU,CAAC,KAAK,CAAC,IAAI,EAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,IAAG,CAAC,CAAC,MAAM,GAAC,IAAI;QAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IACvD,MAAM,OAAO,GAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnE,IAAG,CAAC,OAAO,CAAC,OAAO;QAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAC,OAAO,CAAC,IAAI,CAAC;IACzB,IAAG,KAAK,CAAC,IAAI,KAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,IAAE,KAAK,CAAC,GAAG,GAAC,CAAC;QACtC,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACnC,CAAC,CAAC,KAAK,EAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;QACvC,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC7E,OAAO,KAAK,CAAC;AACf,CAAC;AACD,KAAK,UAAU,QAAQ,CAAC,KAAmB,EAAC,KAAY,EAAC,MAAuB,EAAC,SAAS,GAAC,KAAK;IAC9F,IAAG,CAAC,OAAO;QAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAC,QAAQ,CAAC,CAAC;IAC9C,OAAO,MAAM,IAAI,OAAO,CAAe,CAAC,OAAO,EAAC,MAAM,EAAC,EAAE;QACvD,IAAI,IAAI,GAAC,EAAE,EAAC,IAAI,GAAC,KAAK,CAAC;QACvB,MAAM,MAAM,GAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,KAAK,GAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,KAAK,GAAC,UAAU,CAAC,GAAE,EAAE,CAAA,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAC,SAAS,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAC,CAAC,KAAc,EAAC,MAAqB,EAAC,EAAE;YACnD,IAAG,IAAI;gBAAC,OAAO;YAAA,IAAI,GAAC,IAAI,CAAC;YAAA,YAAY,CAAC,KAAK,CAAC,CAAC;YAAA,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9D,IAAG,KAAK;gBAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;gBAAK,OAAO,CAAC,MAAO,CAAC,CAAC;QAC/C,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,SAAS,EAAC,GAAE,EAAE,CAAA,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YACpD,OAAO,EAAC,CAAC,EAAC,GAAG,CAAC,OAAO,CAAA,CAAC,CAAA,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAC,KAAK,GAAC,GAAG,GAAC,KAAK,CAAC,KAAK,GAAC,GAAG,GAAC,MAAM,CAAC,EAAC,CAAA,CAAC,CAAA,EAAC,KAAK,EAAC,KAAK,CAAC,KAAK,EAAC,CAAC,EAAC,KAAK,EAAC,KAAK,CAAC,KAAK,EAAC,MAAM;SAAC,CAAC,GAAC,IAAI,CAAC,CAAC,CAAC;QACjJ,MAAM,CAAC,EAAE,CAAC,MAAM,EAAC,CAAC,CAAA,EAAE;YAClB,IAAI,IAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzB,IAAG,IAAI,CAAC,MAAM,GAAC,IAAI;gBAAC,OAAO,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACzE,IAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAC,OAAO;YAC/B,IAAG,CAAC;gBACF,MAAM,KAAK,GAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;gBACpD,IAAG,OAAO,IAAE,KAAK,CAAC,KAAK,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAC,KAAK,GAAC,GAAG,GAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAAC,MAAM,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBAC9H,IAAG,KAAK,CAAC,KAAK,KAAG,KAAK,CAAC,KAAK,IAAE,CAAC,CAAC,SAAS,EAAC,UAAU,EAAC,SAAS;oBACzD,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAAC,MAAM,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAC7F,MAAM,CAAC,IAAI,EAAC,EAAC,MAAM,EAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,KAAK,CAAC,KAAK,EAAC,QAAQ,EAAC,KAAK,CAAC,QAAQ,EAAC,CAAC,CAAC;YACvF,CAAC;YAAA,OAAM,CAAC,EAAC,CAAC;gBAAA,MAAM,CAAC,CAAC,CAAC,CAAC;YAAA,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAC,CAAC,CAAA,EAAE,CAAA,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAC,GAAE,EAAE,GAAC,IAAG,CAAC,IAAI;YAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC;AACD,SAAS,KAAK,CAAC,GAAW;IACxB,IAAG,CAAC;QAAA,OAAO,CAAC,IAAI,CAAC,GAAG,EAAC,CAAC,CAAC,CAAC;QAAA,OAAO,IAAI,CAAC;IAAA,CAAC;IAAA,OAAM,CAAC,EAAC,CAAC;QAAA,OAAO,SAAS,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC;IAAA,CAAC;AAC/E,CAAC;AACD,SAAS,UAAU,CAAC,KAAmB;IACrC,IAAG,CAAC;QAAA,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAC,EAAC,IAAI,EAAC,KAAK,EAAC,CAAC,CAAC;IAAA,CAAC;IAC/C,OAAM,CAAC,EAAC,CAAC;QAAA,IAAG,SAAS,CAAC,CAAC,CAAC,KAAG,QAAQ;YAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAAA,MAAM,CAAC,CAAC;IAAA,CAAC;IAChF,IAAG,CAAC;QACF,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAAA,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAAA,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC;QACV,IAAG,CAAC;YAAA,KAAK,GAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAAA,CAAC;QAC5B,OAAM,CAAC,EAAC,CAAC;YACP,oEAAoE;YACpE,mEAAmE;YACnE,IAAG,SAAS,CAAC,CAAC,CAAC,KAAG,QAAQ;gBAAC,MAAM,CAAC,CAAC;YACnC,MAAM,GAAG,GAAC,IAAI,CAAC,GAAG,EAAE,GAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACtD,IAAG,GAAG,GAAC,IAAI;gBAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC5C,CAAC;QACD,IAAG,KAAK,IAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;YAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,IAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,YAAY,EAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACrC,KAAI,MAAM,CAAC,IAAI,KAAK,EAAC,CAAC;YACpB,MAAM,IAAI,GAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAC,CAAC,CAAC,CAAC;YACnC,MAAM,EAAE,GAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAG,CAAC,WAAW,CAAC,IAAI,EAAC,EAAE,EAAC,IAAI,CAAC,IAAE,EAAE,CAAC,WAAW,EAAE;gBAC7C,IAAI,CAAC,8BAA8B,CAAC,CAAC;YACvC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;YAAO,CAAC;QACP,IAAG,CAAC;YAAA,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAAA,CAAC;QAAA,MAAK,CAAC,CAAA,CAAC;IAC3C,CAAC;AACH,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAC,EAAC,IAAI,KAA6B,EAAE;IAClF,MAAM,KAAK,GAAC,YAAY,CAAC,IAAI,EAAC,IAAI,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC;IACV,IAAG,CAAC;QAAA,KAAK,GAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAAA,CAAC;IAC5B,OAAM,CAAC,EAAC,CAAC;QACP,IAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAE,EAAE,CAAC;YAAC,OAAO,IAAI,CAAC;QACrD,MAAM,CAAC,CAAC;IACV,CAAC;IACD,MAAM,MAAM,GAAC,MAAM,QAAQ,CAAC,KAAK,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,CAAC,CAAC;IACvD,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,CAAC;AACxB,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAC,EAAC,IAAI,KAA6B,EAAE;IAChF,MAAM,KAAK,GAAC,YAAY,CAAC,IAAI,EAAC,IAAI,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC;IACV,IAAG,CAAC;QAAA,KAAK,GAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAAA,CAAC;IAAA,OAAM,CAAC,EAAC,CAAC;QACnC,IAAG,SAAS,CAAC,CAAC,CAAC,KAAG,QAAQ;YAAC,OAAO,EAAC,MAAM,EAAC,kBAAkB,EAAC,CAAC;QAC9D,MAAM,CAAC,CAAC;IACV,CAAC;IACD,MAAM,MAAM,GAAC,MAAM,QAAQ,CAAC,KAAK,EAAC,KAAK,EAAC,MAAM,CAAC,CAAC;IAChD,IAAG,MAAM,CAAC,MAAM,KAAG,SAAS;QAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC1D,OAAO,EAAC,MAAM,EAAC,SAAS,EAAC,QAAQ,EAAC,KAAK,CAAC,QAAQ,EAAC,QAAQ,EAAC,KAAK,CAAC,GAAG,EAAC,CAAC;AACvE,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAC,EAAC,IAAI,EAAC,QAAQ,GAAC,KAAK,KAAqD,EAAE;IAC3H,IAAG,CAAC,CAAC,KAAK,EAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACnE,MAAM,KAAK,GAAC,YAAY,CAAC,IAAI,EAAC,IAAI,CAAC,CAAC;IACpC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAC,IAAI,CAAC,CAAC;IAC3B,KAAI,IAAI,OAAO,GAAC,CAAC,EAAC,OAAO,GAAC,EAAE,EAAC,OAAO,EAAE,EAAC,CAAC;QACtC,IAAG,CAAC;YAAA,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAC,EAAC,IAAI,EAAC,KAAK,EAAC,CAAC,CAAC;YAAA,MAAM;QAAA,CAAC;QACjD,OAAM,CAAC,EAAC,CAAC;YACP,IAAG,SAAS,CAAC,CAAC,CAAC,KAAG,QAAQ;gBAAC,MAAM,CAAC,CAAC;YACnC,IAAG,CAAC;gBACF,MAAM,IAAI,GAAC,MAAM,YAAY,CAAC,IAAI,EAAC,EAAC,IAAI,EAAC,CAAC,CAAC;gBAC3C,IAAG,IAAI;oBAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACvC,CAAC;YAAA,OAAM,KAAK,EAAC,CAAC;gBACZ,IAAG,SAAS,CAAC,KAAK,CAAC,KAAG,sBAAsB;oBAAC,MAAM,KAAK,CAAC;gBACzD,MAAM,KAAK,GAAC,CAAC,GAAE,EAAE,GAAC,IAAG,CAAC;oBAAA,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;gBAAA,CAAC;gBAAA,MAAK,CAAC;oBAAA,OAAO,IAAI,CAAC;gBAAA,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC;gBACvE,IAAG,KAAK,IAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;oBAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YAC9E,CAAC;YACD,IAAG,CAAC;gBAAA,UAAU,CAAC,KAAK,CAAC,CAAC;YAAA,CAAC;YACvB,OAAM,CAAC,EAAC,CAAC;gBACP,IAAG,CAAC,CAAC,uBAAuB,EAAC,4BAA4B,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAE,EAAE,CAAC;oBAAC,MAAM,CAAC,CAAC;gBAC9F,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QACD,IAAG,OAAO,KAAG,EAAE;YAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACrD,CAAC;IACD,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,KAAK,GAAC,EAAC,OAAO,EAAC,CAAC,EAAC,IAAI,EAAC,GAAG,EAAC,OAAO,CAAC,GAAG,EAAC,QAAQ;QAClD,KAAK,EAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5C,KAAK,EAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAC,CAAC;IAChD,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAC,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,CAAC;IAC1E,IAAI,MAAM,GAA6B,IAAI,EAAC,KAAK,GAAC,UAAU,CAAC;IAC7D,MAAM,OAAO,GAAC,IAAI,GAAG,EAAc,CAAC;IACpC,MAAM,MAAM,GAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAA,EAAE;QACpC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAAA,MAAM,CAAC,UAAU,CAAC,KAAK,EAAC,GAAE,EAAE,CAAA,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAC,GAAE,EAAE,CAAA,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAChD,IAAI,GAAG,GAAC,EAAE,CAAC;QACX,MAAM,CAAC,EAAE,CAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAA,EAAE;YAC5B,GAAG,IAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAG,GAAG,CAAC,MAAM,GAAC,IAAI,EAAC,CAAC;gBAAA,MAAM,CAAC,OAAO,EAAE,CAAC;gBAAA,OAAO;YAAA,CAAC;YAC7C,IAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAC,OAAO;YAC9B,MAAM,IAAI,GAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAAA,GAAG,GAAC,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC;YACZ,IAAG,CAAC;gBAAA,OAAO,GAAC,MAAM,CAAC,SAAS,CAAC,IAAK,CAAC,CAAC,CAAC;YAAA,CAAC;YAAA,MAAK,CAAC;gBAAA,MAAM,CAAC,OAAO,EAAE,CAAC;gBAAA,OAAO;YAAA,CAAC;YACrE,IAAG,OAAO,CAAC,OAAO,KAAG,CAAC;gBACnB,CAAC,OAAO,CAAA,CAAC,CAAA,OAAO,OAAO,CAAC,KAAK,KAAG,QAAQ,IAAE,OAAO,CAAC,KAAK,CAAC,MAAM,KAAG,EAAE,IAAE,OAAO,CAAC,KAAK,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAC,OAAO,CAAC,KAAK,GAAC,GAAG,GAAC,KAAK,CAAC,KAAK,GAAC,GAAG,GAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA,CAAC,CAAA,OAAO,CAAC,KAAK,KAAG,KAAK,CAAC,KAAK,CAAC;gBAC7L,OAAO,CAAC,KAAK,KAAG,KAAK,CAAC,KAAK,EAAC,CAAC;gBAAA,MAAM,CAAC,OAAO,EAAE,CAAC;gBAAA,OAAO;YAAA,CAAC;YACzD,IAAI,MAAM,GAAC,aAAa,CAAC;YACzB,IAAG,OAAO,CAAC,MAAM,KAAG,QAAQ;gBAAC,MAAM,GAAC,KAAK,CAAC;iBACrC,IAAG,OAAO,CAAC,MAAM,KAAG,MAAM,IAAE,MAAM,EAAC,CAAC;gBACvC,IAAG,CAAC;oBAAA,MAAM,GAAC,MAAM,MAAM,EAAE,CAAC;gBAAA,CAAC;gBAAA,MAAK,CAAC;oBAAA,MAAM,GAAC,aAAa,CAAC;gBAAA,CAAC;YACzD,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,CAAC,KAAK,EAAC,QAAQ,EAAC,KAAK,CAAC,QAAQ,EAAC,GAAG,CAAC,OAAO,CAAA,CAAC,CAAA,EAAC,KAAK,EAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAC,GAAG,GAAC,MAAM,CAAC,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAC,CAAC,GAAC,IAAI,CAAC,CAAC;QAClK,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,IAAG,CAAC;QACF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAC,MAAM,EAAC,EAAE;YACxC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAC,MAAM,CAAC,CAAC;YAC5B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAC,GAAE,EAAE,GAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAC,MAAM,CAAC,CAAC,CAAA,OAAO,EAAE,CAAC,CAAA,CAAC,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QACH,IAAG,CAAC,OAAO;YAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAC,KAAK,CAAC,CAAC;QAC7C,IAAG,CAAC,OAAO;YAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAAA,OAAM,CAAC,EAAC,CAAC;QACR,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,IAAG,CAAC;YAAA,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAAA,CAAC;QAAA,MAAK,CAAC,CAAA,CAAC;QACtC,IAAG,CAAC;YAAA,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAAA,CAAC;QAAA,MAAK,CAAC,CAAA,CAAC;QACxC,IAAG,CAAC;YAAA,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAAA,CAAC;QAAA,MAAK,CAAC,CAAA,CAAC;QACrC,MAAM,CAAC,CAAC;IACV,CAAC;IACD,IAAI,OAAO,GAAC,KAAK,CAAC;IAClB,OAAO;QACL,KAAK;QACL,WAAW,KAAG,KAAK,GAAC,SAAS,CAAC,CAAA,CAAC;QAC/B,WAAW,KAAG,KAAK,GAAC,SAAS,CAAC,CAAA,CAAC;QAC/B,MAAM,CAAC,EAAuB,IAAE,MAAM,GAAC,EAAE,CAAC,CAAA,CAAC;QAC3C,KAAK,CAAC,OAAO;YACX,IAAG,OAAO;gBAAC,OAAO;YAAA,OAAO,GAAC,IAAI,CAAC;YAC/B,sDAAsD;YACtD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAA,EAAE;gBACzB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACtB,UAAU,CAAC,GAAE,EAAE,GAAC,KAAI,MAAM,CAAC,IAAI,OAAO;oBAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA,CAAC,EAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACrE,CAAC,CAAC,CAAC;YACH,IAAG,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,KAAG,KAAK,CAAC,KAAK;gBACrC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YACrC,kEAAkE;YAClE,oEAAoE;YACpE,IAAG,CAAC;gBAAA,IAAG,CAAC,OAAO;oBAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAAA,CAAC;YAC7C,OAAM,CAAC,EAAC,CAAC;gBAAA,IAAG,SAAS,CAAC,CAAC,CAAC,KAAG,QAAQ;oBAAC,MAAM,CAAC,CAAC;YAAA,CAAC;YAC7C,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1B,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,uEAAuE;AACvE,MAAM,UAAU,yBAAyB,CAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,KAAK,EAAgE;IAClI,MAAM,KAAK,GAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAE,QAAQ,GAAC,CAAC;QACpC,OAAO,CAAC,IAAI,KAAG,QAAQ,IAAE,KAAK,CAAC,GAAG,KAAG,QAAQ;QAC7C,KAAK,CAAC,IAAI,KAAG,IAAI,IAAE,KAAK,CAAC,KAAK,KAAG,KAAK,IAAE,KAAK,CAAC,KAAK,KAAG,KAAK;QAC5D,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import {ownedByUser,createPrivateDirectory,controlRoot,windows} from \"./platform.js\";\nimport { ownerSchema } from \"./config-schemas.js\";\nimport { GatewayError,errorCode,isSafeInteger,parseJSON,record } from \"./validation.js\";\ntype ControlPaths=ReturnType<typeof controlPaths>;\ntype Owner=ReturnType<typeof ownerSchema.parse>;\ninterface ControlReply {result:string;runId:string;launcher:string}\n// One Core / two equal frontends. Owner-only local supervisor control.\n// The socket is never an MCP/public endpoint, and never signals a discovered PID.\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport net from \"node:net\";\nimport path from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nfunction proof(token:string,value:string){return crypto.createHmac(\"sha256\",token).update(value).digest(\"hex\");}\nfunction deny(reason: string): never {const e=new GatewayError(reason);throw e;};\nconst validPort=(p: unknown): p is number=>isSafeInteger(p)&&p>=1024&&p<=65535;\nexport function controlPaths(port: number,root=controlRoot()){\n if(!validPort(port))deny(\"CORE_INVALID_PORT\");\n const lock=path.join(root,`core-${port}.lease`);\n return {root,lock,recovery:lock+\".recovery\",\n meta:path.join(lock,\"owner.json\"),socket:windows?`\\\\\\\\.\\\\pipe\\\\mac-mcp-gateway-${crypto.createHash(\"sha256\").update(path.resolve(lock).toLowerCase()).digest(\"hex\").slice(0,32)}`:path.join(lock,\"control.sock\")};\n}\nfunction secureDir(p: string,create=false){\n if(create)createPrivateDirectory(p);\n const st=fs.lstatSync(p);\n if(!st.isDirectory()||st.isSymbolicLink()||!ownedByUser(p,st,true))deny(\"CORE_CONTROL_DIRECTORY_UNTRUSTED\");\n}\nfunction secureFile(p: string,type: string){\n const st=fs.lstatSync(p);\n if(st.isSymbolicLink()||!ownedByUser(p,st,true)||\n !(type===\"file\"?st.isFile():st.isSocket()))\n deny(\"CORE_CONTROL_FILE_UNTRUSTED\");\n}\nfunction readOwner(paths: ControlPaths){\n secureDir(paths.root);secureDir(paths.lock);\n secureFile(paths.meta,\"file\");\n const d=fs.readFileSync(paths.meta);\n if(d.length>1024)deny(\"CORE_CONTROL_METADATA_INVALID\");\n const checked=ownerSchema.safeParse(parseJSON(d.toString(\"utf8\")));\n if(!checked.success)deny(\"CORE_CONTROL_METADATA_INVALID\");\n const owner=checked.data;\n if(owner.port!==Number(path.basename(paths.lock).match(/\\d+/)?.[0])||\n !isSafeInteger(owner.pid)||owner.pid<2||\n !/^[a-f0-9]{48}$/.test(owner.token)||\n ![\"cli\",\"app\"].includes(owner.launcher)||\n !/^[a-f0-9]{32}$/.test(owner.runId))deny(\"CORE_CONTROL_METADATA_INVALID\");\n return owner;\n}\nasync function exchange(paths: ControlPaths,owner: Owner,method: \"status\"|\"stop\",timeoutMs=11500){\n if(!windows)secureFile(paths.socket,\"socket\");\n return await new Promise<ControlReply>((resolve,reject)=>{\n let body=\"\",done=false;\n const client=net.createConnection(paths.socket);\n const nonce=crypto.randomBytes(24).toString(\"hex\");\n const timer=setTimeout(()=>finish(Error(\"CORE_CONTROL_TIMEOUT\")),timeoutMs);\n const finish=(error: unknown,result?: ControlReply)=>{\n if(done)return;done=true;clearTimeout(timer);client.destroy();\n if(error)reject(error);else resolve(result!);\n };\n client.once(\"connect\",()=>client.write(JSON.stringify({\n version:1,...(windows?{nonce,proof:proof(owner.token,nonce+\":\"+owner.runId+\":\"+method)}:{token:owner.token}),runId:owner.runId,method})+\"\\n\"));\n client.on(\"data\",d=>{\n body+=d.toString(\"utf8\");\n if(body.length>2048)return finish(Error(\"CORE_CONTROL_REPLY_TOO_LARGE\"));\n if(!body.includes(\"\\n\"))return;\n try{\n const reply=record(parseJSON(body.split(\"\\n\")[0]!));\n if(windows&&reply.proof!==proof(owner.token,nonce+\":\"+String(reply.result)))throw Error(\"CORE_CONTROL_REPLY_UNAUTHENTICATED\");\n if(reply.runId!==owner.runId||![\"RUNNING\",\"STARTING\",\"STOPPED\",\n \"STOP_FAILED\"].includes(String(reply.result)))throw Error(\"CORE_CONTROL_REPLY_INVALID\");\n finish(null,{result:String(reply.result),runId:owner.runId,launcher:owner.launcher});\n }catch(e){finish(e);}\n });\n client.once(\"error\",e=>finish(e));\n client.once(\"end\",()=>{if(!done)finish(Error(\"CORE_CONTROL_EOF\"));});\n });\n}\nfunction alive(pid: number){\n try{process.kill(pid,0);return true;}catch(e){return errorCode(e)===\"EPERM\";}\n}\nfunction cleanStale(paths: ControlPaths){\n try{fs.mkdirSync(paths.recovery,{mode:0o700});}\n catch(e){if(errorCode(e)===\"EEXIST\")deny(\"CORE_CONTROL_RECOVERY_BUSY\");throw e;}\n try{\n secureDir(paths.root);secureDir(paths.recovery);secureDir(paths.lock);\n let owner;\n try{owner=readOwner(paths);}\n catch(e){\n // Only truly missing metadata is recoverable; malformed metadata is\n // untrusted and must never justify deleting another running owner.\n if(errorCode(e)!==\"ENOENT\")throw e;\n const age=Date.now()-fs.lstatSync(paths.lock).mtimeMs;\n if(age<2500)deny(\"CORE_CONTROL_STARTING\");\n }\n if(owner&&alive(owner.pid))deny(\"CORE_CONTROL_OWNER_ACTIVE_OR_UNREACHABLE\");\n const names=fs.readdirSync(paths.lock);\n if(names.some(n=>![\"owner.json\",\"control.sock\"].includes(n)))\n deny(\"CORE_CONTROL_UNKNOWN_FILES\");\n for(const n of names){\n const item=path.join(paths.lock,n);\n const st=fs.lstatSync(item);\n if(!ownedByUser(item,st,true)||st.isDirectory())\n deny(\"CORE_CONTROL_STALE_UNTRUSTED\");\n fs.unlinkSync(item);\n }\n fs.rmdirSync(paths.lock);\n }finally{\n try{fs.rmdirSync(paths.recovery);}catch{}\n }\n}\nexport async function connectOwner(port: number,{root}: {root?: string|undefined}={}){\n const paths=controlPaths(port,root);\n let owner;\n try{owner=readOwner(paths);}\n catch(e){\n if([\"ENOENT\"].includes(errorCode(e)||\"\"))return null;\n throw e;\n }\n const result=await exchange(paths,owner,\"status\",1500);\n return {owner,result};\n}\nexport async function globalStop(port: number,{root}: {root?: string|undefined}={}){\n const paths=controlPaths(port,root);\n let owner;\n try{owner=readOwner(paths);}catch(e){\n if(errorCode(e)===\"ENOENT\")return {result:\"NO_CONTROL_OWNER\"};\n throw e;\n }\n const result=await exchange(paths,owner,\"stop\");\n if(result.result!==\"STOPPED\")deny(\"CORE_STOP_UNVERIFIED\");\n return {result:\"STOPPED\",launcher:owner.launcher,ownerPid:owner.pid};\n}\nexport async function acquireControl(port: number,{root,launcher=\"cli\"}: {root?: string|undefined; launcher?: \"cli\"|\"app\"}={}){\n if(![\"cli\",\"app\"].includes(launcher))deny(\"CORE_LAUNCHER_INVALID\");\n const paths=controlPaths(port,root);\n secureDir(paths.root,true);\n for(let attempt=0;attempt<12;attempt++){\n try{fs.mkdirSync(paths.lock,{mode:0o700});break;}\n catch(e){\n if(errorCode(e)!==\"EEXIST\")throw e;\n try{\n const live=await connectOwner(port,{root});\n if(live)deny(\"CORE_ALREADY_RUNNING\");\n }catch(error){\n if(errorCode(error)===\"CORE_ALREADY_RUNNING\")throw error;\n const owner=(()=>{try{return readOwner(paths);}catch{return null;}})();\n if(owner&&alive(owner.pid))deny(\"CORE_CONTROL_OWNER_ACTIVE_OR_UNREACHABLE\");\n }\n try{cleanStale(paths);}\n catch(e){\n if(![\"CORE_CONTROL_STARTING\",\"CORE_CONTROL_RECOVERY_BUSY\"].includes(errorCode(e)||\"\"))throw e;\n await delay(250);\n }\n }\n if(attempt===11)deny(\"CORE_CONTROL_CLAIM_TIMEOUT\");\n }\n secureDir(paths.lock);\n const owner={version:1,port,pid:process.pid,launcher,\n token:crypto.randomBytes(24).toString(\"hex\"),\n runId:crypto.randomBytes(16).toString(\"hex\")};\n fs.writeFileSync(paths.meta,JSON.stringify(owner),{mode:0o600,flag:\"wx\"});\n let onStop: (()=>Promise<string>)|null=null,phase=\"STARTING\";\n const clients=new Set<net.Socket>();\n const server=net.createServer(socket=>{\n clients.add(socket);socket.setTimeout(12000,()=>socket.destroy());\n socket.once(\"close\",()=>clients.delete(socket));\n let raw=\"\";\n socket.on(\"data\",async chunk=>{\n raw+=chunk.toString(\"utf8\");\n if(raw.length>2048){socket.destroy();return;}\n if(!raw.includes(\"\\n\"))return;\n const line=raw.split(\"\\n\")[0];raw=\"\";\n let request;\n try{request=record(parseJSON(line!));}catch{socket.destroy();return;}\n if(request.version!==1||\n (windows?typeof request.nonce!==\"string\"||request.nonce.length!==48||request.proof!==proof(owner.token,request.nonce+\":\"+owner.runId+\":\"+String(request.method)):request.token!==owner.token)||\n request.runId!==owner.runId){socket.destroy();return;}\n let result=\"STOP_FAILED\";\n if(request.method===\"status\")result=phase;\n else if(request.method===\"stop\"&&onStop){\n try{result=await onStop();}catch{result=\"STOP_FAILED\";}\n }\n socket.end(JSON.stringify({result,runId:owner.runId,launcher:owner.launcher,...(windows?{proof:proof(owner.token,String(request.nonce)+\":\"+result)}:{})})+\"\\n\");\n });\n });\n try{\n await new Promise<void>((resolve,reject)=>{\n server.once(\"error\",reject);\n server.listen(paths.socket,()=>{server.removeListener(\"error\",reject);resolve();});\n });\n if(!windows)fs.chmodSync(paths.socket,0o600);\n if(!windows)secureFile(paths.socket,\"socket\");\n }catch(e){\n server.close();\n try{fs.unlinkSync(paths.meta);}catch{}\n try{fs.unlinkSync(paths.socket);}catch{}\n try{fs.rmdirSync(paths.lock);}catch{}\n throw e;\n }\n let closing=false;\n return {\n owner,\n markRunning(){phase=\"RUNNING\";},\n markStopped(){phase=\"STOPPED\";},\n onStop(fn: ()=>Promise<string>){onStop=fn;},\n async release(){\n if(closing)return;closing=true;\n // Response sockets close before the lease disappears.\n await new Promise(resolve=>{\n server.close(resolve);\n setTimeout(()=>{for(const s of clients)s.destroy();},1200).unref();\n });\n if(readOwner(paths).runId!==owner.runId)\n deny(\"CORE_CONTROL_LEASE_CHANGED\");\n // node:net automatically unlinks a Unix socket on server.close().\n // A second unlink is not required and must not abort lease cleanup.\n try{if(!windows)fs.unlinkSync(paths.socket);}\n catch(e){if(errorCode(e)!==\"ENOENT\")throw e;}\n fs.unlinkSync(paths.meta);\n fs.rmdirSync(paths.lock);\n }\n };\n}\n\n// Private worker handoff for the setup profile. This is a same-UID\n// supervisor identity check, not an OS boundary against the Mac owner.\nexport function verifyInternalSetupWorker({port,ownerPid,runId,token}: {port:number; ownerPid:unknown; runId:unknown; token:unknown}){\n const paths=controlPaths(port);\n const owner=readOwner(paths);\n if(!isSafeInteger(ownerPid)||ownerPid<2||\n process.ppid!==ownerPid||owner.pid!==ownerPid||\n owner.port!==port||owner.runId!==runId||owner.token!==token)\n deny(\"CORE_SETUP_WORKER_NOT_SUPERVISED\");\n return true;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"home-write-sandbox.js","sourceRoot":"","sources":["../../src/home-write-sandbox.ts"],"names":[],"mappings":"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","sourcesContent":["import { GatewayError,currentUid,errorCode } from \"./validation.js\";\n// Opt-in Seatbelt restriction for the Desktop Commander subprocess tree.\n// Permits reads subject to TCC/POSIX, but grants file-write only under Home.\n// sandbox-exec is a deprecated macOS API: fail closed if it is missing or\n// cannot launch. Never advertise this as absolute isolation from all IPC.\nimport { constants } from \"node:fs\";\nimport { access,lstat,realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nfunction denied(reason: string): never{const e=new GatewayError(reason);throw e;}\nexport function homeWriteProfile(home: unknown){\n if(typeof home!==\"string\"||!path.isAbsolute(home)||home.includes(\"\\0\")||\n home.includes(\"\\n\")||home.includes(\"\\r\")||home.length>1024||\n [\"/\",\"/Users\",\"/Volumes\",\"/private\",\"/private/tmp\"].includes(home))\n denied(\"HOME_WRITE_SANDBOX_UNSAFE_HOME\");\n const segments=home.split(\"/\").filter(Boolean);\n if(segments.length<2)denied(\"HOME_WRITE_SANDBOX_UNSAFE_HOME\");\n // Seatbelt SBPL uses double-quoted string literals.\n const quoted=home.replaceAll(\"\\\\\",\"\\\\\\\\\").replaceAll('\"','\\\\\"');\n return `(version 1)\\n(allow default)\\n(deny file-write*)\\n(allow file-write* (subpath \"${quoted}\"))\\n`;\n}\nexport async function sandboxedDesktopSpawn({\n home, nodeBinary, entryArgs,\n binary=\"/usr/bin/sandbox-exec\"\n}: {home?: string|undefined; nodeBinary?: string; entryArgs?: string[]; binary?: string}={}){\n if(process.platform!==\"darwin\")denied(\"HOME_WRITE_SANDBOX_PLATFORM_UNSUPPORTED\");\n if(typeof nodeBinary!==\"string\"||!path.isAbsolute(nodeBinary)||\n !Array.isArray(entryArgs)||entryArgs.some(a=>typeof a!==\"string\"))\n denied(\"HOME_WRITE_SANDBOX_INVALID_EXEC\");\n let h;\n try{\n if(typeof home!==\"string\")denied(\"HOME_WRITE_SANDBOX_UNAVAILABLE\");\n h=await realpath(home);\n const stat=await lstat(home);\n if(stat.isSymbolicLink()||!stat.isDirectory()||stat.uid!==currentUid())\n denied(\"HOME_WRITE_SANDBOX_HOME_OWNER\");\n if(path.resolve(home)!==h)denied(\"HOME_WRITE_SANDBOX_NOT_CANONICAL\");\n await access(binary,constants.X_OK);\n }catch(error){\n if(errorCode(error)?.startsWith(\"HOME_WRITE_SANDBOX_\"))throw error;\n denied(\"HOME_WRITE_SANDBOX_UNAVAILABLE\");\n }\n return {\n command:binary,\n args:[\"-p\",homeWriteProfile(h),nodeBinary,...entryArgs]\n };\n}\n"]}