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,149 +0,0 @@
1
- #!/usr/bin/env node
2
- import { errorCode, errorMessage } from "../validation.js";
3
- // Guided Release 1 setup, with a non-interactive test path. No arbitrary shell,
4
- // downloads, OAuth tokens, cert files, public listeners or launchd changes.
5
- import { lstat, realpath } from "node:fs/promises";
6
- import { homedir } from "node:os";
7
- import path from "node:path";
8
- import { stdin as input, stdout as output } from "node:process";
9
- import { createInterface } from "node:readline/promises";
10
- import { defaultSetupPath, saveSetupConfig } from "../release1-onboarding.js";
11
- const help = `Mac MCP Gateway · Release 1 setup
12
-
13
- Usage:
14
- mac-mcp-gateway setup
15
- mac-mcp-gateway setup --project /absolute/project --connection tunnel|https --mode read-only|read-write [--port 18893] [--approve-write] [--replace]
16
- mac-mcp-gateway setup --access-role trusted --connection tunnel|https [--project /default-directory] [--port 18893] --approve-trusted-developer
17
- mac-mcp-gateway setup --access-role restricted --project /specific/project --connection tunnel|https [--port 18893]
18
-
19
- On Linux/Windows, trusted mode additionally requires --approve-unrestricted.
20
-
21
- After setup:
22
- mac-mcp-gateway doctor
23
- mac-mcp-gateway run
24
-
25
- Setup does not establish a remote connection. It configures a safe local
26
- Gateway and prints verified manual steps for Tunnel or authenticated HTTPS.
27
- Do not expose :8793 or another local HTTP port directly on the internet.
28
- `;
29
- function parse(argv) {
30
- const result = {};
31
- const bare = new Set(["--replace", "--approve-write", "--approve-trusted-developer", "--approve-unrestricted", "--help", "--app-json"]);
32
- const valued = new Map([["--project", "project"], ["--mode", "mode"],
33
- ["--connection", "connection"], ["--port", "port"], ["--access-role", "accessRole"]]);
34
- for (let i = 0; i < argv.length; i++) {
35
- const arg = argv[i];
36
- if (bare.has(arg)) {
37
- result[arg.slice(2)] = true;
38
- continue;
39
- }
40
- const key = valued.get(arg);
41
- if (!key || !argv[i + 1] || argv[i + 1].startsWith("--") || result[key] !== undefined)
42
- throw Error("SETUP_ARGUMENT_INVALID");
43
- result[key] = argv[++i];
44
- }
45
- return result;
46
- }
47
- const args = parse(process.argv.slice(2));
48
- const appJSON = Boolean(args["app-json"]);
49
- const say = (message) => { if (!appJSON)
50
- output.write(message); };
51
- if (args.help) {
52
- output.write(help);
53
- process.exit(0);
54
- }
55
- const interactive = process.stdin.isTTY === true;
56
- if (!interactive && ((!args.project && args.accessRole !== "trusted") || !args.connection || (!args.mode && !args.accessRole)))
57
- throw Error("SETUP_NON_INTERACTIVE_REQUIRES_PROJECT_MODE_CONNECTION");
58
- const rl = interactive ? createInterface({ input, output }) : null;
59
- try {
60
- say("Mac MCP Gateway · Release 1 onboarding\n");
61
- say("No Desktop Commander hosted relay is used. Local MCP tools still run as your OS user.\n");
62
- const accessRole = args.accessRole;
63
- const root = args.project || (accessRole === "trusted" ? homedir() :
64
- await rl.question("Approved project directory (absolute path): "));
65
- if (accessRole !== undefined && !["restricted", "trusted"].includes(String(accessRole)))
66
- throw Error("SETUP_ACCESS_ROLE_INVALID");
67
- if (args["approve-trusted-developer"] && accessRole !== "trusted")
68
- throw Error("SETUP_TRUSTED_APPROVAL_WITHOUT_ROLE");
69
- const mode = accessRole ?
70
- (accessRole === "trusted" ? "read-write" : "read-only") :
71
- args.mode || (await rl.question("Access (read-only [default] / read-write): ")) || "read-only";
72
- if (accessRole && args.mode && args.mode !== mode)
73
- throw Error("SETUP_ACCESS_ROLE_MISMATCH");
74
- if (accessRole === "trusted" && !args["approve-trusted-developer"])
75
- throw Error("SETUP_TRUSTED_DEVELOPER_APPROVAL_REQUIRED");
76
- if (accessRole === "trusted" && process.platform !== "darwin" && !args["approve-unrestricted"])
77
- throw Error("SETUP_UNRESTRICTED_APPROVAL_REQUIRED: add --approve-unrestricted to allow native tools and Shell with your OS account permissions; Home-only sandbox is unavailable on this platform");
78
- const connection = args.connection || (await rl.question("Remote connection (tunnel / https): ")) || "tunnel";
79
- const port = Number(args.port || (interactive ? ((await rl.question("Loopback port [18893]: ")) || "18893") : "18893"));
80
- if (mode === "read-write" && accessRole !== "trusted" && !args["approve-write"]) {
81
- const confirm = interactive ? await rl.question("Read-write can change files in the approved workspace. Type WRITE to allow: ") : "";
82
- if (confirm !== "WRITE")
83
- throw Error("SETUP_WRITE_NOT_APPROVED");
84
- }
85
- const selected = String(root).trim();
86
- const expanded = selected === "~" ? homedir() :
87
- selected.startsWith("~/") ? path.join(homedir(), selected.slice(2)) : selected;
88
- if (!path.isAbsolute(expanded))
89
- throw Error("SETUP_ROOT_ABSOLUTE_REQUIRED");
90
- const inputRoot = path.resolve(expanded);
91
- if ((await lstat(inputRoot)).isSymbolicLink())
92
- throw Error("SETUP_ROOT_SYMLINK_DENIED");
93
- // macOS /var and /tmp may be aliases; normalize to the real canonical path.
94
- // v1 stays backward-compatible. Explicit access role is recorded in
95
- // schema v2; never silently escalate a legacy profile.
96
- const config = accessRole === "trusted" && process.platform !== "darwin" ?
97
- { version: 2, projectRoot: await realpath(inputRoot), mode, connection, port, accessRole } :
98
- accessRole === "trusted" ?
99
- { version: 3, projectRoot: await realpath(inputRoot), mode, connection, port,
100
- accessRole, writeScope: "home-only" } :
101
- accessRole === "restricted" ?
102
- { version: 2, projectRoot: await realpath(inputRoot), mode, connection, port, accessRole } :
103
- { version: 1, projectRoot: await realpath(inputRoot), mode, connection, port };
104
- const location = await saveSetupConfig(config, { file: defaultSetupPath(), replace: Boolean(args.replace) });
105
- say("\nSETUP_LOCAL_PROFILE_SAVED\n");
106
- say("Profile: " + location + " (private, owner-only)\n");
107
- say(accessRole === "trusted" && process.platform !== "darwin" ?
108
- "Role: Trusted Developer; native tools and Shell run with your OS account permissions. No Home-only OS sandbox is applied.\n" :
109
- accessRole === "trusted" ?
110
- "Role: Trusted Home-Write Developer; Home file writes allowed, outside Home read-only for sandboxed Desktop Commander and its subprocesses (subject to OS permissions). This does not secure unrelated upstreams or external apps reached via IPC.\n" :
111
- "Role: Restricted; Gateway read/write workspace checks active; arbitrary Shell and Git writes disabled.\n");
112
- say("Next 1. mac-mcp-gateway doctor\nNext 2. mac-mcp-gateway run\n");
113
- say("Next 3. Verify loopback health and tool discovery at http://127.0.0.1:" + port + "/mcp\n");
114
- if (connection === "tunnel") {
115
- say("\nTunnel (private, outbound-only):\n");
116
- say("Install/configure the supported tunnel-client after verifying workspace eligibility.\n");
117
- say("Use local MCP URL http://127.0.0.1:" + port + "/mcp; never paste tokens into setup logs.\n");
118
- say("Docs: https://developers.openai.com/api/docs/guides/secure-mcp-tunnels\n");
119
- say("ChatGPT: Plugins > Add custom MCP server > Tunnel; discover and test real tools.\n");
120
- say("SETUP_REMOTE_PENDING: tunnel permission, identity, and tool call not yet validated.\n");
121
- }
122
- else {
123
- say("\nHTTPS (publicly reachable domain, including IPv6 when reachable):\n");
124
- say("DO NOT expose the loopback Gateway via Caddy until authentication is deployed and tested.\n");
125
- say("TLS, DNS AAAA, public endpoint reachability, OAuth and authorization remain separate gates.\n");
126
- say("ChatGPT: Plugins > Add custom MCP server > public HTTPS /mcp URL (after certification).\n");
127
- say("SETUP_REMOTE_PENDING: direct ingress not provisioned or authenticated.\n");
128
- }
129
- say("You may stop this local server with Ctrl+C; setup never starts public services.\n");
130
- if (appJSON)
131
- output.write(JSON.stringify({ event: "SETUP_SAVE_OK" }) + "\n");
132
- }
133
- catch (error) {
134
- const raw = String(errorCode(error) || errorMessage(error) || "UNKNOWN");
135
- // Preserve stable, non-sensitive *reason codes* from workspace admission.
136
- // Never emit the rejected absolute path or untrusted raw exception text.
137
- const mapped = { "ROOT_TOO_BROAD": "SETUP_ROOT_TOO_BROAD",
138
- "ROOT_MUST_BE_CANONICAL": "SETUP_ROOT_MUST_BE_CANONICAL" };
139
- const code = mapped[raw] || (/^SETUP_[A-Z0-9_]+$/.test(raw) ? raw : "SETUP_UNAVAILABLE");
140
- if (appJSON)
141
- output.write(JSON.stringify({ event: "SETUP_SAVE_FAILED", code }) + "\n");
142
- else
143
- output.write("SETUP_FAILED " + raw.slice(0, 160) + "\n");
144
- process.exitCode = 1;
145
- }
146
- finally {
147
- rl?.close();
148
- }
149
- //# sourceMappingURL=setup-wizard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup-wizard.js","sourceRoot":"","sources":["../../../src/cli/setup-wizard.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAC,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC1D,gFAAgF;AAChF,4EAA4E;AAC5E,OAAO,EAAE,KAAK,EAAC,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,IAAI,KAAK,EAAC,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAC,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE7E,MAAM,IAAI,GAAC;;;;;;;;;;;;;;;;;CAiBV,CAAC;AACF,SAAS,KAAK,CAAC,IAAc;IAC3B,MAAM,MAAM,GAA0C,EAAE,CAAC;IACzD,MAAM,IAAI,GAAC,IAAI,GAAG,CAAC,CAAC,WAAW,EAAC,iBAAiB,EAAC,6BAA6B,EAAC,wBAAwB,EAAC,QAAQ,EAAC,YAAY,CAAC,CAAC,CAAC;IACjI,MAAM,MAAM,GAAC,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,EAAC,SAAS,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,CAAC;QAC7D,CAAC,cAAc,EAAC,YAAY,CAAC,EAAC,CAAC,QAAQ,EAAC,MAAM,CAAC,EAAC,CAAC,eAAe,EAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACnF,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,IAAI,CAAC,MAAM,EAAC,CAAC,EAAE,EAAC,CAAC;QAC7B,MAAM,GAAG,GAAC,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,IAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAC,CAAC;YAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC;YAAA,SAAS;QAAA,CAAC;QACtD,MAAM,GAAG,GAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAG,CAAC,GAAG,IAAE,CAAC,IAAI,CAAC,CAAC,GAAC,CAAC,CAAC,IAAE,IAAI,CAAC,CAAC,GAAC,CAAC,CAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAE,MAAM,CAAC,GAAG,CAAC,KAAG,SAAS;YACvE,MAAM,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,GAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,MAAM,IAAI,GAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,MAAM,OAAO,GAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACxC,MAAM,GAAG,GAAC,CAAC,OAAe,EAAC,EAAE,GAAC,IAAG,CAAC,OAAO;IAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA,CAAC,CAAC;AAClE,IAAG,IAAI,CAAC,IAAI,EAAC,CAAC;IAAA,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAAA,CAAC;AAClD,MAAM,WAAW,GAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAG,IAAI,CAAC;AAC7C,IAAG,CAAC,WAAW,IAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAE,IAAI,CAAC,UAAU,KAAG,SAAS,CAAC,IAAE,CAAC,IAAI,CAAC,UAAU,IAAE,CAAC,CAAC,IAAI,CAAC,IAAI,IAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/G,MAAM,KAAK,CAAC,wDAAwD,CAAC,CAAC;AACxE,MAAM,EAAE,GAAC,WAAW,CAAA,CAAC,CAAA,eAAe,CAAC,EAAC,KAAK,EAAC,MAAM,EAAC,CAAC,CAAA,CAAC,CAAA,IAAI,CAAC;AAC1D,IAAG,CAAC;IACF,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAChD,GAAG,CAAC,yFAAyF,CAAC,CAAC;IAC/F,MAAM,UAAU,GAAC,IAAI,CAAC,UAAU,CAAC;IACjC,MAAM,IAAI,GAAC,IAAI,CAAC,OAAO,IAAE,CAAC,UAAU,KAAG,SAAS,CAAA,CAAC,CAAA,OAAO,EAAE,CAAA,CAAC;QACzD,MAAM,EAAG,CAAC,QAAQ,CAAC,8CAA8C,CAAC,CAAC,CAAC;IACtE,IAAG,UAAU,KAAG,SAAS,IAAE,CAAC,CAAC,YAAY,EAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/E,MAAM,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC3C,IAAG,IAAI,CAAC,2BAA2B,CAAC,IAAE,UAAU,KAAG,SAAS;QAC1D,MAAM,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACrD,MAAM,IAAI,GAAC,UAAU,CAAA,CAAC;QACpB,CAAC,UAAU,KAAG,SAAS,CAAA,CAAC,CAAA,YAAY,CAAA,CAAC,CAAA,WAAW,CAAC,CAAA,CAAC;QAClD,IAAI,CAAC,IAAI,IAAE,CAAC,MAAM,EAAG,CAAC,QAAQ,CAAC,6CAA6C,CAAC,CAAC,IAAE,WAAW,CAAC;IAC9F,IAAG,UAAU,IAAE,IAAI,CAAC,IAAI,IAAE,IAAI,CAAC,IAAI,KAAG,IAAI;QACxC,MAAM,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC5C,IAAG,UAAU,KAAG,SAAS,IAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC;QAC3D,MAAM,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC3D,IAAG,UAAU,KAAG,SAAS,IAAE,OAAO,CAAC,QAAQ,KAAG,QAAQ,IAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC;QACnF,MAAM,KAAK,CAAC,sLAAsL,CAAC,CAAC;IACtM,MAAM,UAAU,GAAC,IAAI,CAAC,UAAU,IAAE,CAAC,MAAM,EAAG,CAAC,QAAQ,CAAC,sCAAsC,CAAC,CAAC,IAAE,QAAQ,CAAC;IACzG,MAAM,IAAI,GAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAE,CAAC,WAAW,CAAA,CAAC,CAAA,CAAC,CAAC,MAAM,EAAG,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,IAAE,OAAO,CAAC,CAAA,CAAC,CAAA,OAAO,CAAC,CAAC,CAAC;IAC/G,IAAG,IAAI,KAAG,YAAY,IAAE,UAAU,KAAG,SAAS,IAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAC,CAAC;QACtE,MAAM,OAAO,GAAC,WAAW,CAAA,CAAC,CAAA,MAAM,EAAG,CAAC,QAAQ,CAC1C,8EAA8E,CAAC,CAAA,CAAC,CAAA,EAAE,CAAC;QACrF,IAAG,OAAO,KAAG,OAAO;YAAC,MAAM,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,QAAQ,GAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAC,QAAQ,KAAG,GAAG,CAAA,CAAC,CAAA,OAAO,EAAE,CAAA,CAAC;QACtC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA,CAAC,CAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,QAAQ,CAAC;IAC5E,IAAG,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAC,MAAM,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAG,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,EAAE;QAAC,MAAM,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACtF,4EAA4E;IAC5E,oEAAoE;IACpE,uDAAuD;IACvD,MAAM,MAAM,GAAC,UAAU,KAAG,SAAS,IAAE,OAAO,CAAC,QAAQ,KAAG,QAAQ,CAAA,CAAC;QAC/D,EAAC,OAAO,EAAC,CAAC,EAAC,WAAW,EAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,EAAC,IAAI,EAAC,UAAU,EAAC,IAAI,EAAC,UAAU,EAAC,CAAA,CAAC;QAClF,UAAU,KAAG,SAAS,CAAA,CAAC;YACvB,EAAC,OAAO,EAAC,CAAC,EAAC,WAAW,EAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,EAAC,IAAI,EAAC,UAAU,EAAC,IAAI;gBACnE,UAAU,EAAC,UAAU,EAAC,WAAW,EAAC,CAAA,CAAC;YACrC,UAAU,KAAG,YAAY,CAAA,CAAC;gBACxB,EAAC,OAAO,EAAC,CAAC,EAAC,WAAW,EAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,EAAC,IAAI,EAAC,UAAU,EAAC,IAAI,EAAC,UAAU,EAAC,CAAA,CAAC;gBAClF,EAAC,OAAO,EAAC,CAAC,EAAC,WAAW,EAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,EAAC,IAAI,EAAC,UAAU,EAAC,IAAI,EAAC,CAAC;IAC3E,MAAM,QAAQ,GAAC,MAAM,eAAe,CAAC,MAAM,EAAC,EAAC,IAAI,EAAC,gBAAgB,EAAE,EAAC,OAAO,EAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAC,CAAC,CAAC;IACrG,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACrC,GAAG,CAAC,WAAW,GAAC,QAAQ,GAAC,0BAA0B,CAAC,CAAC;IACrD,GAAG,CAAC,UAAU,KAAG,SAAS,IAAE,OAAO,CAAC,QAAQ,KAAG,QAAQ,CAAA,CAAC;QACtD,6HAA6H,CAAA,CAAC;QAC9H,UAAU,KAAG,SAAS,CAAA,CAAC;YACvB,qPAAqP,CAAA,CAAC;YACtP,0GAA0G,CAAC,CAAC;IAC9G,GAAG,CAAC,+DAA+D,CAAC,CAAC;IACrE,GAAG,CAAC,wEAAwE,GAAC,IAAI,GAAC,QAAQ,CAAC,CAAC;IAC5F,IAAG,UAAU,KAAG,QAAQ,EAAC,CAAC;QACxB,GAAG,CAAC,sCAAsC,CAAC,CAAC;QAC5C,GAAG,CAAC,wFAAwF,CAAC,CAAC;QAC9F,GAAG,CAAC,qCAAqC,GAAC,IAAI,GAAC,6CAA6C,CAAC,CAAC;QAC9F,GAAG,CAAC,0EAA0E,CAAC,CAAC;QAChF,GAAG,CAAC,oFAAoF,CAAC,CAAC;QAC1F,GAAG,CAAC,uFAAuF,CAAC,CAAC;IAC/F,CAAC;SAAI,CAAC;QACJ,GAAG,CAAC,uEAAuE,CAAC,CAAC;QAC7E,GAAG,CAAC,6FAA6F,CAAC,CAAC;QACnG,GAAG,CAAC,+FAA+F,CAAC,CAAC;QACrG,GAAG,CAAC,2FAA2F,CAAC,CAAC;QACjG,GAAG,CAAC,0EAA0E,CAAC,CAAC;IAClF,CAAC;IACD,GAAG,CAAC,mFAAmF,CAAC,CAAC;IACzF,IAAG,OAAO;QAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,KAAK,EAAC,eAAe,EAAC,CAAC,GAAC,IAAI,CAAC,CAAC;AACxE,CAAC;AAAA,OAAM,KAAK,EAAC,CAAC;IACZ,MAAM,GAAG,GAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAE,YAAY,CAAC,KAAK,CAAC,IAAE,SAAS,CAAC,CAAC;IACnE,0EAA0E;IAC1E,yEAAyE;IACzE,MAAM,MAAM,GAAwB,EAAC,gBAAgB,EAAC,sBAAsB;QAC1E,wBAAwB,EAAC,8BAA8B,EAAC,CAAC;IAC3D,MAAM,IAAI,GAAC,MAAM,CAAC,GAAG,CAAC,IAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,CAAA,GAAG,CAAA,CAAC,CAAA,mBAAmB,CAAC,CAAC;IACjF,IAAG,OAAO;QAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,KAAK,EAAC,mBAAmB,EAAC,IAAI,EAAC,CAAC,GAAC,IAAI,CAAC,CAAC;;QAC1E,MAAM,CAAC,KAAK,CAAC,eAAe,GAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAC,GAAG,CAAC,GAAC,IAAI,CAAC,CAAC;IACzD,OAAO,CAAC,QAAQ,GAAC,CAAC,CAAC;AACrB,CAAC;QAAO,CAAC;IAAA,EAAE,EAAE,KAAK,EAAE,CAAC;AAAA,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { errorCode,errorMessage } from \"../validation.js\";\n// Guided Release 1 setup, with a non-interactive test path. No arbitrary shell,\n// downloads, OAuth tokens, cert files, public listeners or launchd changes.\nimport { lstat,realpath } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { stdin as input,stdout as output } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\nimport { defaultSetupPath,saveSetupConfig } from \"../release1-onboarding.js\";\n\nconst help=`Mac MCP Gateway · Release 1 setup\n\nUsage:\n mac-mcp-gateway setup\n mac-mcp-gateway setup --project /absolute/project --connection tunnel|https --mode read-only|read-write [--port 18893] [--approve-write] [--replace]\n mac-mcp-gateway setup --access-role trusted --connection tunnel|https [--project /default-directory] [--port 18893] --approve-trusted-developer\n mac-mcp-gateway setup --access-role restricted --project /specific/project --connection tunnel|https [--port 18893]\n\nOn Linux/Windows, trusted mode additionally requires --approve-unrestricted.\n\nAfter setup:\n mac-mcp-gateway doctor\n mac-mcp-gateway run\n\nSetup does not establish a remote connection. It configures a safe local\nGateway and prints verified manual steps for Tunnel or authenticated HTTPS.\nDo not expose :8793 or another local HTTP port directly on the internet.\n`;\nfunction parse(argv: string[]){\n const result: Record<string,string|boolean|undefined>={};\n const bare=new Set([\"--replace\",\"--approve-write\",\"--approve-trusted-developer\",\"--approve-unrestricted\",\"--help\",\"--app-json\"]);\n const valued=new Map([[\"--project\",\"project\"],[\"--mode\",\"mode\"],\n [\"--connection\",\"connection\"],[\"--port\",\"port\"],[\"--access-role\",\"accessRole\"]]);\n for(let i=0;i<argv.length;i++){\n const arg=argv[i]!;\n if(bare.has(arg)){result[arg.slice(2)]=true;continue;}\n const key=valued.get(arg);\n if(!key||!argv[i+1]||argv[i+1]!.startsWith(\"--\")||result[key]!==undefined)\n throw Error(\"SETUP_ARGUMENT_INVALID\");\n result[key]=argv[++i];\n }\n return result;\n}\nconst args=parse(process.argv.slice(2));\nconst appJSON=Boolean(args[\"app-json\"]);\nconst say=(message: string)=>{if(!appJSON)output.write(message);};\nif(args.help){output.write(help);process.exit(0);}\nconst interactive=process.stdin.isTTY===true;\nif(!interactive&&((!args.project&&args.accessRole!==\"trusted\")||!args.connection||(!args.mode&&!args.accessRole)))\n throw Error(\"SETUP_NON_INTERACTIVE_REQUIRES_PROJECT_MODE_CONNECTION\");\nconst rl=interactive?createInterface({input,output}):null;\ntry{\n say(\"Mac MCP Gateway · Release 1 onboarding\\n\");\n say(\"No Desktop Commander hosted relay is used. Local MCP tools still run as your OS user.\\n\");\n const accessRole=args.accessRole;\n const root=args.project||(accessRole===\"trusted\"?homedir():\n await rl!.question(\"Approved project directory (absolute path): \"));\n if(accessRole!==undefined&&![\"restricted\",\"trusted\"].includes(String(accessRole)))\n throw Error(\"SETUP_ACCESS_ROLE_INVALID\");\n if(args[\"approve-trusted-developer\"]&&accessRole!==\"trusted\")\n throw Error(\"SETUP_TRUSTED_APPROVAL_WITHOUT_ROLE\");\n const mode=accessRole?\n (accessRole===\"trusted\"?\"read-write\":\"read-only\"):\n args.mode||(await rl!.question(\"Access (read-only [default] / read-write): \"))||\"read-only\";\n if(accessRole&&args.mode&&args.mode!==mode)\n throw Error(\"SETUP_ACCESS_ROLE_MISMATCH\");\n if(accessRole===\"trusted\"&&!args[\"approve-trusted-developer\"])\n throw Error(\"SETUP_TRUSTED_DEVELOPER_APPROVAL_REQUIRED\");\n if(accessRole===\"trusted\"&&process.platform!==\"darwin\"&&!args[\"approve-unrestricted\"])\n throw Error(\"SETUP_UNRESTRICTED_APPROVAL_REQUIRED: add --approve-unrestricted to allow native tools and Shell with your OS account permissions; Home-only sandbox is unavailable on this platform\");\n const connection=args.connection||(await rl!.question(\"Remote connection (tunnel / https): \"))||\"tunnel\";\n const port=Number(args.port||(interactive?((await rl!.question(\"Loopback port [18893]: \"))||\"18893\"):\"18893\"));\n if(mode===\"read-write\"&&accessRole!==\"trusted\"&&!args[\"approve-write\"]){\n const confirm=interactive?await rl!.question(\n \"Read-write can change files in the approved workspace. Type WRITE to allow: \"):\"\";\n if(confirm!==\"WRITE\")throw Error(\"SETUP_WRITE_NOT_APPROVED\");\n }\n const selected=String(root).trim();\n const expanded=selected===\"~\"?homedir():\n selected.startsWith(\"~/\")?path.join(homedir(),selected.slice(2)):selected;\n if(!path.isAbsolute(expanded))throw Error(\"SETUP_ROOT_ABSOLUTE_REQUIRED\");\n const inputRoot=path.resolve(expanded);\n if((await lstat(inputRoot)).isSymbolicLink())throw Error(\"SETUP_ROOT_SYMLINK_DENIED\");\n // macOS /var and /tmp may be aliases; normalize to the real canonical path.\n // v1 stays backward-compatible. Explicit access role is recorded in\n // schema v2; never silently escalate a legacy profile.\n const config=accessRole===\"trusted\"&&process.platform!==\"darwin\"?\n {version:2,projectRoot:await realpath(inputRoot),mode,connection,port,accessRole}:\n accessRole===\"trusted\"?\n {version:3,projectRoot:await realpath(inputRoot),mode,connection,port,\n accessRole,writeScope:\"home-only\"}:\n accessRole===\"restricted\"?\n {version:2,projectRoot:await realpath(inputRoot),mode,connection,port,accessRole}:\n {version:1,projectRoot:await realpath(inputRoot),mode,connection,port};\n const location=await saveSetupConfig(config,{file:defaultSetupPath(),replace:Boolean(args.replace)});\n say(\"\\nSETUP_LOCAL_PROFILE_SAVED\\n\");\n say(\"Profile: \"+location+\" (private, owner-only)\\n\");\n say(accessRole===\"trusted\"&&process.platform!==\"darwin\"?\n \"Role: Trusted Developer; native tools and Shell run with your OS account permissions. No Home-only OS sandbox is applied.\\n\":\n accessRole===\"trusted\"?\n \"Role: Trusted Home-Write Developer; Home file writes allowed, outside Home read-only for sandboxed Desktop Commander and its subprocesses (subject to OS permissions). This does not secure unrelated upstreams or external apps reached via IPC.\\n\":\n \"Role: Restricted; Gateway read/write workspace checks active; arbitrary Shell and Git writes disabled.\\n\");\n say(\"Next 1. mac-mcp-gateway doctor\\nNext 2. mac-mcp-gateway run\\n\");\n say(\"Next 3. Verify loopback health and tool discovery at http://127.0.0.1:\"+port+\"/mcp\\n\");\n if(connection===\"tunnel\"){\n say(\"\\nTunnel (private, outbound-only):\\n\");\n say(\"Install/configure the supported tunnel-client after verifying workspace eligibility.\\n\");\n say(\"Use local MCP URL http://127.0.0.1:\"+port+\"/mcp; never paste tokens into setup logs.\\n\");\n say(\"Docs: https://developers.openai.com/api/docs/guides/secure-mcp-tunnels\\n\");\n say(\"ChatGPT: Plugins > Add custom MCP server > Tunnel; discover and test real tools.\\n\");\n say(\"SETUP_REMOTE_PENDING: tunnel permission, identity, and tool call not yet validated.\\n\");\n }else{\n say(\"\\nHTTPS (publicly reachable domain, including IPv6 when reachable):\\n\");\n say(\"DO NOT expose the loopback Gateway via Caddy until authentication is deployed and tested.\\n\");\n say(\"TLS, DNS AAAA, public endpoint reachability, OAuth and authorization remain separate gates.\\n\");\n say(\"ChatGPT: Plugins > Add custom MCP server > public HTTPS /mcp URL (after certification).\\n\");\n say(\"SETUP_REMOTE_PENDING: direct ingress not provisioned or authenticated.\\n\");\n }\n say(\"You may stop this local server with Ctrl+C; setup never starts public services.\\n\");\n if(appJSON)output.write(JSON.stringify({event:\"SETUP_SAVE_OK\"})+\"\\n\");\n}catch(error){\n const raw=String(errorCode(error)||errorMessage(error)||\"UNKNOWN\");\n // Preserve stable, non-sensitive *reason codes* from workspace admission.\n // Never emit the rejected absolute path or untrusted raw exception text.\n const mapped: Record<string,string>={\"ROOT_TOO_BROAD\":\"SETUP_ROOT_TOO_BROAD\",\n \"ROOT_MUST_BE_CANONICAL\":\"SETUP_ROOT_MUST_BE_CANONICAL\"};\n const code=mapped[raw]||(/^SETUP_[A-Z0-9_]+$/.test(raw)?raw:\"SETUP_UNAVAILABLE\");\n if(appJSON)output.write(JSON.stringify({event:\"SETUP_SAVE_FAILED\",code})+\"\\n\");\n else output.write(\"SETUP_FAILED \"+raw.slice(0,160)+\"\\n\");\n process.exitCode=1;\n}finally{rl?.close();}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"starmux-status.js","sourceRoot":"","sources":["../../../src/cli/starmux-status.ts"],"names":[],"mappings":"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","sourcesContent":["import {createAccessControl} from '../access-control.js';\nimport type {instanceStatus} from '../instance-runtime.js';\nimport {exists,instancePaths,type Instance,type InstanceConfig} from '../instance-store.js';\nimport {shellQuote} from '../platform.js';\n\ntype Status=Awaited<ReturnType<typeof instanceStatus>>;\ntype AuthMode='ingress'|'api-key'|'oauth';\ntype OAuthSummary={issuer:string;resource:string;clientId:string;scope:string;tokenAuth:string};\ntype AuthSummary={mode:AuthMode|null;activeKeys:number;oauth:OAuthSummary|null;problem:string|null};\n\nasync function authentication(instance:Instance,status:Status):Promise<AuthSummary>{\n const file=instancePaths(instance).access;\n try{\n const state=await (await createAccessControl(file,{initialize:false})).snapshot();\n if(status.phase==='running'&&status.health==='ok'&&status.accessMode!==state.mode){\n return {mode:null,activeKeys:0,oauth:null,problem:'Authentication changed while checking. Run status again.'};\n }\n const incomplete=status.phase!=='running'&&instance.requiredAccess!=='ingress'&&state.mode!==instance.requiredAccess;\n return {mode:state.mode,activeKeys:state.credentials.filter(c=>c.status==='active').length,\n oauth:state.oauth?{issuer:state.oauth.issuer,resource:state.oauth.resource,clientId:state.oauth.clientId,scope:state.oauth.scope,tokenAuth:state.oauth.tokenEndpointAuthMethod}:null,\n problem:incomplete?`This instance requires ${instance.requiredAccess} authentication before starting.`:null};\n }catch(error){\n // A new, never-started instance has an ingress default, but a lost store must\n // never be presented as an intentional switch to unauthenticated access.\n if((error as NodeJS.ErrnoException).code==='ENOENT'&&status.phase==='stopped'&&instance.requiredAccess==='ingress'&&!await exists(file+'.initialized')){\n return {mode:'ingress',activeKeys:0,oauth:null,problem:null};\n }\n return {mode:null,activeKeys:0,oauth:null,problem:'Authentication settings are unavailable. Inspect them with the Auth command below.'};\n }\n}\n\nexport async function formatStarmuxStatus(instance:Instance,status:Status,config:InstanceConfig|undefined,options:{isDefault?:boolean}={}){\n const auth=await authentication(instance,status);\n // Omit `-i default` for the default instance to keep everyday single-instance output clean.\n const omitSelector=options.isDefault===true&&instance.name==='default';\n const selector=/^[A-Za-z0-9_.-]+$/.test(instance.name)&&!instance.name.startsWith('-')?instance.name:shellQuote(instance.name);\n const flag=omitSelector?'':(instance.name.startsWith('-')?` --instance=${selector}`:` -i ${selector}`);\n const command=(action:string)=>`starmux ${action}${flag}`;\n const ready=status.phase==='running'&&status.health==='ok';\n const hasProblem=Boolean(status.configProblem||status.runtimeProblem||auth.problem);\n const indicator=hasProblem?'!':ready?'●':status.phase==='running'?'◐':'○';\n const labels={\n ingress:'None (no token required)',\n 'api-key':`API key (Bearer token; ${auth.activeKeys} active ${auth.activeKeys===1?'key':'keys'})`,\n oauth:'OAuth (browser sign-in)'\n };\n const saved=status.phase==='running'?' (saved; live state unavailable)':' (saved for next start)';\n const row=(label:string,value:string)=>' '+label.padEnd(16)+value;\n const codingCmd=command('up --code');\n const mode=!config\n ?'Unavailable'\n :config.accessRole==='trusted'\n ?(config.writeScope==='home-only'?'Coding (Home sandbox · edits, shell & git)':'Coding (OS account · edits, shell & git)')\n :config.mode==='read-write'\n ?'File writes (restricted)'\n :`Read-only (run '${codingCmd}' to enable edits & shell)`;\n const runtime=status.executionMode==='background'\n ?'Background · continues after this terminal closes'\n :status.executionMode==='foreground-owned'\n ?(status.runtime?.launcher==='app'?'App-owned · stops when the app closes':'Foreground · Ctrl+C stops this instance')\n :'Stopped';\n const title=omitSelector\n ?`${indicator} Starmux is ${status.phase}`\n :`${indicator} Starmux is ${status.phase} (instance: ${instance.name})`;\n const lines=['',title];\n if(ready&&status.port){\n lines.push(row('Listen',`http://127.0.0.1:${status.port}/mcp (this computer only)`));\n }\n lines.push(\n row('Workspace',config?.projectRoot??'Unavailable'),\n row('Mode',mode),\n row('Auth',auth.mode?labels[auth.mode]+(ready?'':saved):'Unavailable'),\n row('Runtime',runtime)\n );\n if(ready&&status.port&&auth.mode==='oauth'&&auth.oauth){\n lines.push(row('Client URL',auth.oauth.resource),row('Issuer',auth.oauth.issuer));\n }\n if(status.configProblem||status.runtimeProblem)lines.push(row('Problem',status.configProblem??status.runtimeProblem!));\n if(auth.problem)lines.push(row('Auth issue',auth.problem));\n\n const keyCommand=command('auth key \"My AI Client\"');\n if(ready&&!auth.problem){\n lines.push('','Connect an AI client (MCP settings)');\n lines.push(row('Transport','Streamable HTTP'));\n if(auth.mode==='ingress'){\n lines.push(\n row('URL (Local)',`http://127.0.0.1:${status.port}/mcp (AI client on this computer)`),\n row('URL (Remote)',`https://<your-domain-or-tunnel>/mcp (via protected HTTPS proxy or tunnel -> 127.0.0.1:${status.port})`),\n row('Authentication',`None (optional Bearer API key: ${keyCommand})`)\n );\n }else if(auth.mode==='api-key'){\n lines.push(\n row('URL (Local)',`http://127.0.0.1:${status.port}/mcp (AI client on this computer)`),\n row('URL (Remote)',`https://<your-domain-or-tunnel>/mcp (via protected HTTPS proxy or tunnel -> 127.0.0.1:${status.port})`),\n row('Authentication',`Bearer API key (${auth.activeKeys} active ${auth.activeKeys===1?'key':'keys'})`),\n row('Header','Authorization: Bearer <YOUR_API_KEY>')\n );\n if(!auth.activeKeys){\n lines.push(row('Create key',`${keyCommand} (no active keys; required before connecting)`));\n }\n }else if(auth.mode==='oauth'&&auth.oauth){\n lines.push(\n row('URL (Remote)',auth.oauth.resource),\n row('Authentication','OAuth (browser sign-in)'),\n row('Issuer',auth.oauth.issuer),\n row('Client ID',`${auth.oauth.clientId} (Scope: ${auth.oauth.scope} · Token auth: ${auth.oauth.tokenAuth})`)\n );\n }\n }\n\n lines.push('','Commands');\n if(auth.problem){\n lines.push(row('Check auth',command('auth')));\n }else if(!ready){\n if(status.phase==='stopped'&&!status.configProblem&&!status.runtimeProblem){\n if(auth.mode==='api-key'&&!auth.activeKeys)lines.push(row('Create key',keyCommand));\n lines.push(row('Start',command('up')),row('Start coding',codingCmd));\n }else{\n lines.push(row('Diagnose',command('doctor')));\n }\n }else{\n if(auth.mode==='api-key'&&auth.activeKeys){\n lines.push(\n row('Verify',`STARMUX_TOKEN=<key> ${command('verify')}`),\n row('New API key',keyCommand)\n );\n }else if(auth.mode==='oauth'){\n lines.push(\n row('Check OAuth',command('auth oauth doctor')),\n row('Verify',command('verify'))\n );\n }else{\n lines.push(row('Verify',command('verify')));\n }\n }\n if(status.configState==='pending')lines.push(row('Apply config',command('config apply')));\n lines.push(row('Auth & keys',command('auth')));\n if(ready)lines.push(row('Dashboard',`${command('dashboard')} (view & copy settings in browser)`));\n lines.push(row('Logs',command('logs -f')));\n if(status.phase==='running')lines.push(row('Stop',command('down')));\n return lines.join('\\n')+'\\n';\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"starmux-supervisor.js","sourceRoot":"","sources":["../../../src/cli/starmux-supervisor.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EAAC,eAAe,EAAC,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAC;AACnD,IAAI,CAAC;IAAC,MAAM,WAAW,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAC,EAAC,IAAI,EAAC,IAAI,EAAC,UAAU,EAAC,IAAI,EAAC,CAAC,CAAC;AAAC,CAAC;AAC9F,OAAM,KAAK,EAAC,CAAC;IAAA,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAC,IAAI,CAAC,CAAC;IAAA,OAAO,CAAC,QAAQ,GAAC,CAAC,CAAC;AAAA,CAAC","sourcesContent":["// Private detached-process entrypoint. No public command aliases.\nimport {resolveInstance} from '../instance-store.js';\nimport {runInstance} from '../instance-runtime.js';\ntry { await runInstance(await resolveInstance(process.argv[2]),{json:true,background:true}); }\ncatch(error){process.stderr.write(String(error)+'\\n');process.exitCode=1;}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"starmux.js","sourceRoot":"","sources":["../../../src/cli/starmux.ts"],"names":[],"mappings":"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","sourcesContent":["import {parseArgs} from 'node:util';\nimport {spawn} from 'node:child_process';\nimport {createInterface} from 'node:readline/promises';\nimport {open,realpath,readFile,stat} from 'node:fs/promises';\nimport {homedir} from 'node:os';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport type {Transport} from '@modelcontextprotocol/sdk/shared/transport.js';\nimport {Client} from '@modelcontextprotocol/sdk/client/index.js';\nimport {StreamableHTTPClientTransport} from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport {createAccessControl} from '../access-control.js';\nimport {instanceStatus,instanceRequest,runInstance} from '../instance-runtime.js';\nimport {atomicPrivate,availablePort,changeRegistry,configJSONSchema,createInstance,ensureAccessReady,exists,instanceConfigSchema,instancePaths,loadInstanceConfig,parseConfig,patchInstanceConfig,readRegistry,readTrusted,resolveInstance,saveInstanceConfig,suggestPort,validateConfig,type Instance,type InstanceConfig} from '../instance-store.js';\nimport {handle} from './instances.js';\nimport {desktopCommanderEntry} from '../runtime-paths.js';\nimport {shellQuote} from '../platform.js';\nimport {formatStarmuxStatus} from './starmux-status.js';\n\nconst version='0.13.0';\nconst strings=['instance','port','lines','expires','issuer','resource','resource-aliases','client-id','subject','subjects','registration','token-auth','callback','revision','patch','file','output','name','target','mode','app-parent-pid'];\nconst booleans=['help','version','json','write','code','read','yes','foreground','follow','archived','all','effective','link','allow-loopback-http','token-stdin','no-open','token'];\nconst options:Record<string,{type:'string'|'boolean';short?:string}>={};\nfor(const k of strings)options[k]={type:'string',...(k==='instance'?{short:'i'}:{})};\nfor(const k of booleans)options[k]={type:'boolean',...(k==='yes'?{short:'y'}:k==='follow'?{short:'f'}:k==='help'?{short:'h'}:k==='version'?{short:'v'}:{})};\nlet parsed:ReturnType<typeof parseArgs>;\ntry{parsed=parseArgs({args:process.argv.slice(2),options,allowPositionals:true,strict:true});}catch(error){process.stderr.write((error instanceof Error?error.message:String(error))+'\\n');process.exit(1);}\nconst flags=parsed.values;const positional=parsed.positionals;const command=positional.shift()??'help';\nconst string=(key:string)=>typeof flags[key]==='string'?flags[key] as string:undefined;\nconst yes=()=>flags.yes===true;const json=flags.json===true;\nconst print=(value:unknown)=>process.stdout.write(JSON.stringify(value,null,2)+'\\n');\nfunction fail(message:string):never{throw Error(message);}\nconst absolute=(value:string)=>path.resolve(value==='~'?homedir():value.startsWith('~/')?path.join(homedir(),value.slice(2)):value);\nconst pause=(ms:number)=>new Promise(resolve=>setTimeout(resolve,ms));\n\nfunction help(){\n const requested=command==='help'?positional[0]:command;\n const topic=requested==='stop'?'down':requested;\n const sections:Record<string,string>={\n up:'up [path] [--read | --write | --code] [-y] [--port N] [--foreground]\\n Initialize and start. First use defaults to CWD; later starts reuse saved settings.',\n init:'init [path] [--read | --write | --code] [-y] [--port N]\\n Save settings without starting. --write and --code enable full account coding permissions.',\n auth:'auth\\n auth key \"Client name\" [--expires 30d]\\n auth mode none|ingress|api-key|oauth\\n auth revoke ID\\n auth oauth init-keycloak --resource URL --callback URL\\n auth oauth setup --issuer URL --resource URL --client-id ID --subject USER_ID\\n auth oauth doctor',\n config:'config [show] [--effective]\\n config edit | diff | apply | validate | path | schema | recover\\n config default NAME | rename NEW_NAME -i SOURCE | copy NEW_NAME -i SOURCE\\n config archive -i NAME | restore -i NAME | import FILE [-i NAME] [--link]\\n config export [--output FILE] | secret set|remove NAME',\n dashboard:'dashboard [--no-open | --token]\\n Open the local Access console. --no-open prints a private login link.',\n verify:'verify [--token-stdin]\\n Test MCP initialization, tool discovery and workspace read. Authenticated instances use STARMUX_TOKEN or stdin.',\n doctor:'doctor\\n Check Node, bundled dependencies, workspace, configuration, port and authentication.',\n logs:'logs [-f | --follow] [--lines 1..200]\\n Follow continues across restarts. Ctrl+C exits the follower only.',\n migrate:'migrate [registry|setup|live] [-y]\\n No source: preview. Select a source to migrate, retaining originals.',\n status:'status [--all]\\n Show the selected instance, its actual endpoint and connection guide.',\n ls:'ls [--archived]\\n List local workspace instances.',\n rm:'rm [NAME] (alias for: config archive)\\n Stop and archive an instance.',\n down:'down (alias: stop)\\n Stop the selected instance.',\n permissions:'permissions [status | token]\\n permissions disable-tool|enable-tool|deny-directory|allow-directory TARGET\\n Manage the selected instance’s tool and directory permissions.',\n privacy:'privacy [--all] [--target PATH]\\n Check privacy access through the running instance.'\n };\n if(topic&&topic!=='help'&&!sections[topic])fail('Unknown command: '+topic+'. Run starmux --help.');\n const overview=[\n 'Connect AI clients to your computer’s files, shell and development tools.',\n '',\n 'Workspace Lifecycle:',\n ' starmux up [path] [--code] Start in the background (default: Read-only)',\n ' starmux down Stop the running instance (alias: stop)',\n ' starmux status Show health, endpoint and connection guide',\n ' starmux logs [-f] View or stream gateway logs',\n '',\n 'Access & Verification:',\n ' starmux auth Manage auth mode, API keys and OAuth',\n ' starmux dashboard Open the local Web Access Console',\n ' starmux verify Test local MCP handshake and workspace read',\n ' starmux doctor Check runtime, config, port and auth state',\n '',\n 'Multi-Instance & Config:',\n ' starmux ls List workspace instances',\n ' starmux rm [name] Stop and archive an instance',\n ' starmux init [path] Save instance settings without starting',\n ' starmux config Inspect, edit or apply configuration',\n ' starmux migrate Import settings from a legacy installation'\n ].join('\\n');\n process.stdout.write(`Starmux ${version}\\n\\n${sections[topic??'']??overview}\\n\\nGlobal: -i, --instance NAME_OR_ID --json -h, --help\\nUse starmux COMMAND --help for details.\\n`);\n}\nasync function confirm(message:string){\n if(yes())return;\n if(!process.stdin.isTTY)fail(message+' Re-run with -y to confirm.');\n const rl=createInterface({input:process.stdin,output:process.stderr});\n try{if(!/^y(es)?$/i.test((await rl.question(message+' [y/N] ')).trim()))fail('Cancelled.');}finally{rl.close();}\n}\nasync function consent(instance:Instance|undefined,config:InstanceConfig){\n if(config.accessRole!=='trusted'||config.writeScope!=='unrestricted')return;\n if(instance&&await exists(path.join(instancePaths(instance).state,'coding-consent.json'))){\n const record=JSON.parse(await readTrusted(path.join(instancePaths(instance).state,'coding-consent.json'))) as {version?:number;scope?:string};\n if(record.version===1&&record.scope==='os-account')return;\n }\n await confirm('Coding mode can modify files accessible to your OS account and execute Shell and Git. Enable?');\n}\nasync function rememberConsent(instance:Instance,config:InstanceConfig){\n if(config.accessRole==='trusted'&&config.writeScope==='unrestricted'&&!await exists(path.join(instancePaths(instance).state,'coding-consent.json')))await atomicPrivate(path.join(instancePaths(instance).state,'coding-consent.json'),JSON.stringify({version:1,scope:'os-account',approvedAt:new Date().toISOString()}));\n}\nasync function selected(){return resolveInstance(string('instance'));}\nasync function configure(){\n if(positional.length>1)fail('Usage: starmux '+command+' [path]');\n const registry=await readRegistry();let instance:Instance|undefined;\n const selector=string('instance');\n if(selector)instance=registry.instances.find(i=>i.id===selector||i.name===selector);\n else if(registry.instances.length)instance=await resolveInstance();\n if(instance?.archived)fail('Instance is archived. Use starmux config restore -i '+instance.name);\n if(!instance&&await exists(path.join(homedir(),'.config','mac-mcp-gateway'))&&!registry.instances.length)fail('Existing installation found. Run starmux migrate first.');\n const loaded=instance?await loadInstanceConfig(instance):undefined;\n const writing=flags.write||flags.code;\n if(flags.read&&writing)fail('--read cannot be combined with --write or --code.');\n const project=positional[0]??loaded?.config.projectRoot??process.cwd();\n const config=await validateConfig(instanceConfigSchema.parse({...loaded?.config,\n projectRoot:await realpath(absolute(project)),schemaVersion:1,\n port:string('port')?Number(string('port')):loaded?.config.port??(selector?await suggestPort():18893),\n ...(writing?{accessRole:'trusted',mode:'read-write',writeScope:'unrestricted'}:{}),\n ...(flags.read?{accessRole:'restricted',mode:'read-only',writeScope:'unrestricted',gitMode:'off',worktreeMode:'off',upstreams:[]}:{}),\n }));\n await consent(instance,config);\n if(!instance)instance=await createInstance(selector??'default',{config});\n else if(JSON.stringify(config)!==JSON.stringify(loaded!.config))await patchInstanceConfig(instance,config,loaded!.revision);\n await rememberConsent(instance,config);return instance;\n}\nasync function isDefaultInstance(instance:Instance){\n const registry=await readRegistry().catch(()=>({defaultInstanceId:null,instances:[] as Instance[]}));\n return instance.name==='default'&&(registry.defaultInstanceId===instance.id||registry.instances.filter(i=>!i.archived).length<=1);\n}\nasync function instanceFlag(instance:Instance){\n if(await isDefaultInstance(instance))return '';\n const selector=/^[A-Za-z0-9_.-]+$/.test(instance.name)&&!instance.name.startsWith('-')?instance.name:shellQuote(instance.name);\n return instance.name.startsWith('-')?`--instance=${selector}`:`-i ${selector}`;\n}\nasync function show(instance:Instance){\n const status=await instanceStatus(instance);\n if(json){print(status);return;}\n const config=status.phase==='running'?status.active?.config:(await loadInstanceConfig(instance).catch(()=>null))?.config;\n process.stdout.write(await formatStarmuxStatus(instance,status,config,{isDefault:await isDefaultInstance(instance)}));\n}\nasync function start(instance:Instance){\n const state=await instanceStatus(instance);\n if(state.phase==='running'){\n if(state.configState==='pending')await instanceRequest(instance,'apply',(await loadInstanceConfig(instance)).revision);\n await show(instance);return;\n }\n await ensureAccessReady(instance);\n const config=(await loadInstanceConfig(instance)).config;\n if(!await availablePort(config.port))fail(`Port ${config.port} is in use. Choose another with starmux up --port PORT.`);\n if(flags.foreground||string('app-parent-pid')){\n await runInstance(instance,{json,...(!json?{onReady:()=>show(instance)}:{}),...(string('app-parent-pid')?{appParentPid:Number(string('app-parent-pid'))}:{})});return;\n }\n const log=path.join(instancePaths(instance).logs,'supervisor.log');\n if(await exists(log))await readTrusted(log,true,32*1024*1024);\n const fd=await open(log,'a',0o600);\n const child=spawn(process.execPath,[fileURLToPath(new URL('./starmux-supervisor.js',import.meta.url)),instance.id],{detached:true,stdio:['ignore',fd.fd,fd.fd],env:process.env,windowsHide:true});\n let launchError:Error|undefined;child.once('error',e=>{launchError=e;});await fd.close();child.unref();\n for(let n=0;n<150;n++){\n if(launchError)throw launchError;\n const status=await instanceStatus(instance);\n if(status.phase==='running'&&status.health==='ok'){await show(instance);return;}\n if(child.exitCode!==null||child.signalCode!==null)fail('Startup failed. Inspect '+log);\n await pause(200);\n }\n child.kill('SIGTERM');fail('Startup timed out. Inspect '+log);\n}\nasync function bearer(){\n if(!flags['token-stdin'])return process.env.STARMUX_TOKEN;\n let value='';for await(const part of process.stdin){value+=String(part);if(value.length>16384)fail('Token input too large.');}return value.trim();\n}\nasync function verify(instance:Instance){\n const status=await instanceStatus(instance);if(status.phase!=='running'||!status.port)fail('Start this instance with starmux up first.');\n const token=await bearer();const client=new Client({name:'starmux-verify',version});\n const endpoint=`http://127.0.0.1:${status.port}/mcp`;\n const transport=new StreamableHTTPClientTransport(new URL(endpoint),{requestInit:{headers:token?{Authorization:'Bearer '+token}:{}}});\n let toolCount=0;\n try{\n await client.connect(transport as Transport);\n const listed=await client.listTools();toolCount=listed.tools.length;\n const result=await client.callTool({name:'list_directory',arguments:{path:'.',depth:0}});\n if(result.isError)fail('Directory read failed.');\n }\n catch(e){throw Error('Verification failed: '+String(e)+'. For authenticated instances provide STARMUX_TOKEN or --token-stdin.');}\n finally{await client.close();}\n if(json)print({result:'PASS',instanceId:instance.id,port:status.port,remoteClientVerified:false});\n else{\n const cfg=status.active?.config;\n const mode=cfg?.accessRole==='trusted'?'Coding mode':'Read-only mode';\n const root=cfg?.projectRoot??'.';\n process.stdout.write(\n `✓ MCP handshake ${endpoint}\\n`+\n `✓ Tool discovery ${toolCount} tools available (${mode})\\n`+\n `✓ Workspace read ${root}\\n`+\n `PASS · MCP handshake, tool discovery and workspace read.\\n`\n );\n }\n}\nfunction expires(value:string|undefined){\n if(!value)return null;\n const match=/^([1-9]\\d*)([mhdw])$/.exec(value);\n const date=match?new Date(Date.now()+Number(match[1])*({m:60000,h:3600000,d:86400000,w:604800000}[match[2]!]??0)):new Date(value);\n if(!Number.isFinite(date.getTime())||date.getTime()<=Date.now())fail('Expiry must be a future ISO timestamp or positive duration such as 30d.');\n return date.toISOString();\n}\nasync function auth(instance:Instance){\n const access=await createAccessControl(instancePaths(instance).access);const op=positional[0];\n if(!op){\n const state=await access.snapshot();\n if(json){print(state);return;}\n const flag=await instanceFlag(instance);\n const cmd=(action:string)=>`starmux ${action}${flag?' '+flag:''}`;\n const activeKeys=state.credentials.filter(c=>c.status==='active').length;\n const modeDesc=state.mode==='ingress'\n ?'None (no Starmux token · local or ingress proxy)'\n :state.mode==='api-key'\n ?`API key (Bearer token · ${activeKeys} active)`\n :'OAuth (browser sign-in)';\n const lines=[\n ...(flag?[`Instance ${instance.name}`]:[]),\n `Auth mode ${modeDesc}`,\n `API keys ${activeKeys} active (${state.credentials.length} total)`,\n `OAuth ${state.oauth?`${state.oauth.issuer} (${state.oauthConnections.filter(c=>!c.revokedAt).length} active sessions)`:'Not configured'}`\n ];\n if(state.credentials.length){\n lines.push('','API Keys');\n for(const c of state.credentials){\n const exp=c.expiresAt?` expires ${c.expiresAt.slice(0,10)}`:'';\n lines.push(` ${c.id.padEnd(26)} ${c.name.padEnd(20)} ${c.status}${exp}`);\n }\n }\n if(state.oauthConnections.length){\n lines.push('','OAuth Sessions');\n for(const c of state.oauthConnections){\n lines.push(` ${c.id.padEnd(26)} OAuth ${c.clientId.padEnd(14)} ${c.revokedAt?'revoked':'active'}`);\n }\n }\n lines.push(\n '',\n 'Commands',\n ` Create API key ${cmd('auth key \"My AI Client\"')}`,\n ` Switch mode ${cmd('auth mode <none|api-key|oauth>')}`,\n ...(activeKeys>0||state.oauthConnections.some(c=>!c.revokedAt)?[` Revoke access ${cmd('auth revoke <ID>')}`]:[])\n );\n process.stdout.write(lines.join('\\n')+'\\n');\n return;\n }\n if(op==='key'){\n const result=await access.create(positional[1]??'',expires(string('expires')),true);\n await changeRegistry(async r=>{r.instances.find(i=>i.id===instance.id)!.requiredAccess='api-key';});\n if(json){print({...result,mode:'api-key'});return;}\n const cfg=(await loadInstanceConfig(instance).catch(()=>null))?.config;\n const port=cfg?.port??18893;\n process.stdout.write(\n `API key enabled for ${result.name} (ID: ${result.id})\\n`+\n `Copy this key now; it is shown only once:\\n\\n`+\n ` ${result.key}\\n\\n`+\n `Option A — Fill in AI client form UI:\\n`+\n ` Transport Streamable HTTP\\n`+\n ` URL (Local) http://127.0.0.1:${port}/mcp\\n`+\n ` URL (Remote) https://<your-domain-or-tunnel>/mcp\\n`+\n ` Authentication Bearer API key\\n`+\n ` Header Authorization: Bearer ${result.key}\\n\\n`+\n `Option B — Or paste JSON config (mcpServers):\\n`+\n ` {\\n`+\n ` \"mcpServers\": {\\n`+\n ` \"starmux\": {\\n`+\n ` \"type\": \"streamable-http\",\\n`+\n ` \"url\": \"https://<your-domain-or-tunnel>/mcp\",\\n`+\n ` \"headers\": {\\n`+\n ` \"Authorization\": \"Bearer ${result.key}\"\\n`+\n ` }\\n`+\n ` }\\n`+\n ` }\\n`+\n ` }\\n`\n );\n return;\n }\n if(op==='mode'){\n const raw=positional[1];\n const mode=raw==='none'?'ingress':raw;\n if(mode!=='ingress'&&mode!=='api-key'&&mode!=='oauth')fail('Choose none (or ingress), api-key or oauth.');\n await access.setMode(mode);await changeRegistry(async r=>{r.instances.find(i=>i.id===instance.id)!.requiredAccess=mode;});\n const label=mode==='ingress'?'none (ingress)':mode;\n if(json)print(await access.snapshot());else process.stdout.write('Authentication: '+label+'\\n');return;\n }\n if(op==='revoke'){\n const id=positional[1]??'';const state=await access.snapshot();\n if(state.credentials.some(c=>c.id===id))await access.revoke(id);\n else if(state.oauthConnections.some(c=>c.id===id))await access.revokeOAuth(id);else fail('Credential or OAuth session not found: '+id);\n if(json)print({result:'REVOKED',id});else process.stdout.write('Revoked '+id+'\\n');return;\n }\n if(op==='oauth'){\n process.env.MAC_MCP_ACCESS_FILE=instancePaths(instance).access;\n const action=positional[1]??'status';const map:Record<string,string>={'init-keycloak':'keycloak-realm',setup:'configure',doctor:'doctor',status:'status'};\n if(!map[action])fail('Unknown OAuth command. See starmux auth --help.');\n const args=[map[action]!];for(const key of ['issuer','resource','resource-aliases','client-id','subject','subjects','registration','token-auth','callback','allow-loopback-http'])if(flags[key]!==undefined)args.push('--'+(key==='subject'?'subjects':key),...(typeof flags[key]==='string'?[flags[key] as string]:[]));\n if(json)args.push('--json');await (await import('./oauth.js')).oauthCommand(args);return;\n }\n fail('Unknown auth command. See starmux auth --help.');\n}\nasync function dashboard(instance:Instance){\n const access=await createAccessControl(instancePaths(instance).access);const token=await access.ownerToken();\n if(flags.token){if(json)print({token});else process.stdout.write(token+'\\n');return;}\n const status=await instanceStatus(instance);if(status.phase!=='running'||!status.port)fail('Start this instance with starmux up first.');\n const url=`http://127.0.0.1:${status.port}/access#token=${token}`;\n if(flags['no-open']){if(json)print({url});else process.stdout.write(url+'\\n');return;}\n const executable=process.platform==='darwin'?'open':process.platform==='win32'?'rundll32.exe':'xdg-open';\n const child=spawn(executable,process.platform==='win32'?['url.dll,FileProtocolHandler',url]:[url],{stdio:'ignore'});\n await new Promise<void>((resolve,reject)=>{child.once('error',()=>reject(Error('Browser unavailable. Use starmux dashboard --no-open.')));child.once('exit',code=>code===0?resolve():reject(Error('Browser failed. Use starmux dashboard --no-open.')));});\n if(json)print({result:'OPENED'});else process.stdout.write('Opened local Access console.\\n');\n}\nasync function logs(instance:Instance){\n const count=Number(string('lines')??60);if(!Number.isInteger(count)||count<1||count>200)fail('--lines must be 1..200.');\n const file=path.join(instancePaths(instance).logs,'core.log');let offset=0;\n const text=await exists(file)?await readTrusted(file,true,32*1024*1024):'';offset=Buffer.byteLength(text);\n const lines=text.split('\\n');if(text.endsWith('\\n'))lines.pop();\n const output=lines.slice(-count).join('\\n')+(text.endsWith('\\n')?'\\n':'');\n if(json)print({instanceId:instance.id,output});else process.stdout.write(output||'No logs yet.\\n');\n if(!flags.follow)return;\n let done=false;const stop=()=>{done=true;};process.once('SIGINT',stop);process.once('SIGTERM',stop);\n try{while(!done){await pause(300);if(!await exists(file))continue;const size=(await stat(file)).size;if(size<offset)offset=0;if(size===offset)continue;const f=await open(file,'r');try{const buffer=Buffer.alloc(Math.min(size-offset,65536));const {bytesRead}=await f.read(buffer,0,buffer.length,offset);offset+=bytesRead;const output=buffer.subarray(0,bytesRead).toString();if(json)print({instanceId:instance.id,output});else process.stdout.write(output);}finally{await f.close();}}}finally{process.off('SIGINT',stop);process.off('SIGTERM',stop);}\n}\nasync function configCommand(){\n const op=positional[0]??'show';const selector=string('instance');\n if(op==='schema'){print(configJSONSchema());return;}\n if(op==='import'){\n const file=positional[1];if(!file)fail('config import requires a file.');const config=await validateConfig(parseConfig(await readTrusted(absolute(file),false)));await consent(undefined,config);\n const instance=await createInstance(selector??string('name')??path.basename(file,path.extname(file)),{file:absolute(file),link:flags.link===true});await rememberConsent(instance,config);print({instance});return;\n }\n if(['copy','rename','default','archive','restore'].includes(op)){\n const target=op==='default'?positional[1]:selector??(await selected()).id;\n const args=[op,target??''];if(op==='copy'||op==='rename')args.push(positional[1]??'');if(json)args.push('--json');await handle('instance',args);return;\n }\n const instance=await selected();\n if(op==='save'){\n let text=string('file')?await readTrusted(absolute(string('file')!),false):'';\n if(!string('file'))for await(const part of process.stdin){text+=String(part);if(text.length>262144)fail('Config input too large.');}\n const config=await validateConfig(parseConfig(text));await consent(instance,config);\n const saved=await saveInstanceConfig(instance,text,string('revision')??'');await rememberConsent(instance,config);print({result:'SAVED',revision:saved.revision});return;\n }\n if(op==='patch'&&!string('patch')){\n let text='';for await(const part of process.stdin){text+=String(part);if(text.length>262144)fail('Config input too large.');}flags.patch=text;\n }\n if(op==='apply'||op==='patch'){\n let config=(await loadInstanceConfig(instance)).config;\n if(op==='patch'&&string('patch'))config=await validateConfig(instanceConfigSchema.parse({...config,...JSON.parse(string('patch')!)}));\n await consent(instance,config);await rememberConsent(instance,config);\n }\n const args=[...positional,'--instance',instance.id];\n for(const [key,value] of Object.entries(flags))if(!['instance','help','yes'].includes(key)&&value!==undefined)args.push('--'+key,...(typeof value==='string'?[value]:[]));\n // The shared operation layer retains its internal approval contract.\n if(op==='patch')args.push('--approve-trusted-developer','--approve-unrestricted');\n await handle('config',args);\n}\nfunction validateSubcommand(){\n if(command!=='config'&&command!=='auth')return;\n const op=positional[0]??(command==='config'?'show':'');\n let name=command+(op?' '+op:'');let count=positional.length-(positional.length?1:0);\n let minimum=0;let maximum=0;let supported:string[]|undefined;\n if(command==='config'){\n const commands:Record<string,string[]>={show:['effective'],path:[],edit:[],validate:[],diff:[],apply:['revision','yes'],schema:[],recover:[],\n import:['name','link','yes'],copy:[],rename:[],default:[],archive:[],restore:[],export:['output'],relink:['file'],manage:[],\n save:['file','revision','yes'],patch:['patch','revision','yes'],secret:[]};\n supported=commands[op];\n if(['import','copy','rename','default'].includes(op))minimum=maximum=1;\n if(op==='relink'){minimum=string('file')?0:1;maximum=minimum;}\n if(op==='secret'){minimum=maximum=2;if(!['set','remove'].includes(positional[1]??''))fail('Usage: starmux config secret set|remove NAME');}\n }else if(op==='oauth'){\n const action=positional[1]??'status';name+=' '+action;count=Math.max(0,positional.length-2);\n const actions:Record<string,string[]>={status:[],doctor:[],\n 'init-keycloak':['resource','callback','allow-loopback-http'],\n setup:['issuer','resource','resource-aliases','client-id','subject','subjects','registration','token-auth','allow-loopback-http']};\n supported=actions[action];\n if(flags.subject!==undefined&&flags.subjects!==undefined)fail('Use either --subject or --subjects.');\n }else{\n const commands:Record<string,string[]>={'':[],key:['expires'],mode:[],revoke:[]};supported=commands[op];\n if(['key','mode','revoke'].includes(op))minimum=maximum=1;\n }\n if(!supported)fail('Unknown command: '+name+'. See starmux '+command+' --help.');\n if(count<minimum||count>maximum||positional.slice(1).some(value=>!value.trim()))fail('Invalid arguments for starmux '+name+'. See starmux '+command+' --help.');\n for(const key of Object.keys(flags))if(!['instance','json','help','version'].includes(key)&&!supported.includes(key))fail('Option --'+key+' is not supported by '+name+'.');\n}\nasync function main(){\n if(flags.version){process.stdout.write(version+'\\n');return;}\n if(command==='help'||flags.help){help();return;}\n const allowed:Record<string,string[]>={\n up:['port','read','write','code','yes','foreground','app-parent-pid'],init:['port','read','write','code','yes'],\n status:['all'],ls:['archived'],rm:[],down:[],stop:[],logs:['lines','follow'],doctor:[],verify:['token-stdin'],dashboard:['token','no-open'],migrate:['yes'],\n auth:['expires','issuer','resource','resource-aliases','client-id','subject','subjects','registration','token-auth','callback','allow-loopback-http'],\n config:['yes','archived','effective','link','name','revision','patch','file','output'],permissions:['target','mode'],privacy:['all','target']\n };\n for(const key of Object.keys(flags))if(!['instance','json','help','version'].includes(key)&&!allowed[command]?.includes(key))fail('Option --'+key+' is not supported by '+command+'.');\n if(string('instance')!==undefined&&!string('instance')!.trim())fail('--instance requires a non-empty name or ID.');\n validateSubcommand();\n if(['status','ls','down','stop','logs','doctor','verify','dashboard'].includes(command)&&positional.length)fail('Unexpected argument: '+positional[0]);\n if(command==='rm'&&positional.length>1)fail('Usage: starmux rm [NAME]');\n if(command==='auth'&&['key','mode','revoke'].includes(positional[0]??'')&&positional.length!==2)fail('Usage: starmux auth '+positional[0]+' VALUE');\n if(command==='migrate'&&positional.length>1)fail('Usage: starmux migrate [registry|setup|live] [-y]');\n // Public commands never inherit old environment overlays. Core's private protocol is retained.\n for(const key of Object.keys(process.env))if(key.startsWith('MAC_MCP_'))delete process.env[key];\n for(const [key,value] of Object.entries(process.env))if(key.startsWith('STARMUX_')&&key!=='STARMUX_TOKEN')process.env['MAC_MCP_'+key.slice(8)]=value;\n if(command==='up'||command==='init'){\n const instance=await configure();\n if(command==='up')await start(instance);\n else if(json)print({result:'SAVED',instance});\n else{\n const flag=await instanceFlag(instance);\n process.stdout.write(`Saved ${instance.name}. Start with starmux up${flag?' '+flag:''}\\n`);\n }\n return;\n }\n if(command==='migrate'){await (await import('../starmux-migration.js')).migrate(positional[0],yes(),json);return;}\n if(command==='ls'||command==='status'&&flags.all){await handle('instance',['list',...(flags.archived?['--archived']:[]),...(json?['--json']:[])]);return;}\n if(command==='rm'){\n const target=positional[0]??string('instance')??(await selected()).id;\n await handle('instance',['archive',target,...(json?['--json']:[])]);return;\n }\n if(command==='config'){await configCommand();return;}\n if(!['status','down','stop','auth','dashboard','verify','doctor','logs','permissions','privacy'].includes(command))fail('Unknown command: '+command+'. Run starmux --help.');\n if(!(await readRegistry()).instances.length){if(command==='status'||command==='down'||command==='stop'){if(json)print({phase:'stopped',initialized:false});else process.stdout.write('Not initialized. Run starmux up in your project.\\n');return;}}\n const instance=await selected();\n if(command==='status')await show(instance);\n else if(command==='down'||command==='stop'){await instanceRequest(instance,'stop');if(json)print({result:'STOPPED',instanceId:instance.id});else process.stdout.write('Stopped '+instance.name+'\\n');}\n else if(command==='auth')await auth(instance);\n else if(command==='dashboard')await dashboard(instance);\n else if(command==='verify')await verify(instance);\n else if(command==='logs')await logs(instance);\n else if(command==='doctor'){\n if(Number(process.versions.node.split('.')[0])<22||(process.versions.node.startsWith('22.')&&Number(process.versions.node.split('.')[1])<12))fail('Node 22.12 or newer is required.');\n await stat(desktopCommanderEntry);const loaded=await loadInstanceConfig(instance);await ensureAccessReady(instance);const state=await instanceStatus(instance);\n if(state.phase!=='running'&&!await availablePort(loaded.config.port))fail('Configured port is in use: '+loaded.config.port);\n if(json)print({result:'PASS',node:process.version,instanceId:instance.id,configState:state.configState});\n else{\n const isDef=await isDefaultInstance(instance);\n const access=await (await createAccessControl(instancePaths(instance).access,{initialize:false})).snapshot();\n const modeLabel=loaded.config.accessRole==='trusted'?'Coding mode':'Read-only mode';\n const authLabel=access.mode==='ingress'?'None (no token required)':access.mode==='api-key'?`API key (${access.credentials.filter(c=>c.status==='active').length} active)`:'OAuth';\n const portState=state.phase==='running'?`Running on 127.0.0.1:${state.port}`:`Stopped · port ${loaded.config.port} available`;\n process.stdout.write(\n `✓ Runtime Node ${process.version} & Desktop Commander engine ready\\n`+\n `✓ Service ${portState}${isDef?'':` (instance: ${instance.name})`}\\n`+\n `✓ Workspace ${loaded.config.projectRoot} (${modeLabel})\\n`+\n `✓ Configuration ${instance.source.path} (${state.configState})\\n`+\n `✓ Authentication ${authLabel}\\n`+\n `PASS · Node, dependencies, workspace, configuration, port and authentication.\\n`\n );\n }\n }else{\n const args=[...positional,'--instance',instance.id];for(const [key,value] of Object.entries(flags))if(key!=='instance'&&value!==undefined)args.push('--'+key,...(typeof value==='string'?[value]:[]));await handle(command,args);\n }\n}\ntry{await main();}catch(error){const message=error instanceof Error?error.message:String(error);if(json)print({schemaVersion:1,error:message});else process.stderr.write(message+'\\n');process.exitCode=1;}\n"]}
@@ -1,53 +0,0 @@
1
- #!/usr/bin/env node
2
- import { errorCode, errorMessage, isRecord, record } from "../validation.js";
3
- // Operator-initiated local verification only. Does not claim ChatGPT reached Mac.
4
- import { loadSetupConfig } from "../release1-onboarding.js";
5
- async function main() {
6
- const profile = await loadSetupConfig(process.env.MAC_MCP_SETUP_FILE);
7
- const endpoint = "http://127.0.0.1:" + profile.port;
8
- const opts = { signal: AbortSignal.timeout(4000) };
9
- const health = await fetch(endpoint + "/healthz", opts);
10
- if (!health.ok)
11
- throw Error("LOCAL_GATEWAY_NOT_READY");
12
- async function request(method, params = {}) {
13
- const response = await fetch(endpoint + "/mcp", {
14
- method: "POST",
15
- headers: { "content-type": "application/json", accept: "application/json, text/event-stream", ...(process.env.MAC_MCP_API_KEY ? { authorization: "Bearer " + process.env.MAC_MCP_API_KEY } : {}) },
16
- body: JSON.stringify({ jsonrpc: "2.0", id: 19, method, params }),
17
- signal: AbortSignal.timeout(10000)
18
- });
19
- if (response.status === 401)
20
- throw Error("GATEWAY_KEY_REQUIRED_SET_MAC_MCP_API_KEY");
21
- if (!response.ok)
22
- throw Error("LOCAL_MCP_HTTP_FAILURE");
23
- const json = record(await response.json());
24
- if (json.error)
25
- throw Error("LOCAL_MCP_RPC_FAILURE");
26
- return record(json.result);
27
- }
28
- const list = await request("tools/list");
29
- if (!Array.isArray(list.tools) || !list.tools.some((t) => isRecord(t) && t.name === "read_file"))
30
- throw Error("LOCAL_DC_TOOLS_MISSING");
31
- const read = await request("tools/call", {
32
- name: "list_directory", arguments: { path: ".", depth: 0 }
33
- });
34
- if (read.isError)
35
- throw Error("LOCAL_APPROVED_WORKSPACE_READ_DENIED");
36
- process.stdout.write(JSON.stringify({
37
- event: "SETUP_LOCAL_VERIFICATION", result: "PASS",
38
- toolCount: list.tools.length, remoteClientVerified: false,
39
- ingressConfigured: false, profile: profile.mode,
40
- next: "Complete remote ChatGPT connection and invoke a tool from that client"
41
- }) + "\n");
42
- }
43
- try {
44
- await main();
45
- }
46
- catch (error) {
47
- process.stderr.write("SETUP_LOCAL_VERIFY_FAIL " +
48
- String(errorCode(error) || errorMessage(error) || "UNKNOWN").slice(0, 100) + "\n");
49
- if (errorMessage(error) === "fetch failed")
50
- process.stderr.write("Start the setup Core with mac-mcp-gateway run in another terminal, keep it running, then retry mac-mcp-gateway verify. Setup and doctor do not start an HTTP listener.\n");
51
- process.exitCode = 1;
52
- }
53
- //# sourceMappingURL=verify-setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verify-setup.js","sourceRoot":"","sources":["../../../src/cli/verify-setup.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { errorCode,errorMessage,isRecord,record } from \"../validation.js\";\n// Operator-initiated local verification only. Does not claim ChatGPT reached Mac.\nimport { loadSetupConfig } from \"../release1-onboarding.js\";\nasync function main(){\n const profile=await loadSetupConfig(process.env.MAC_MCP_SETUP_FILE);\n const endpoint=\"http://127.0.0.1:\"+profile.port;\n const opts={signal:AbortSignal.timeout(4000)};\n const health=await fetch(endpoint+\"/healthz\",opts);\n if(!health.ok)throw Error(\"LOCAL_GATEWAY_NOT_READY\");\n async function request(method: string,params: Record<string,unknown>={}){\n const response=await fetch(endpoint+\"/mcp\",{\n method:\"POST\",\n headers:{\"content-type\":\"application/json\",accept:\"application/json, text/event-stream\",...(process.env.MAC_MCP_API_KEY?{authorization:\"Bearer \"+process.env.MAC_MCP_API_KEY}:{})},\n body:JSON.stringify({jsonrpc:\"2.0\",id:19,method,params}),\n signal:AbortSignal.timeout(10000)\n });\n if(response.status===401)throw Error(\"GATEWAY_KEY_REQUIRED_SET_MAC_MCP_API_KEY\");\n if(!response.ok)throw Error(\"LOCAL_MCP_HTTP_FAILURE\");\n const json=record(await response.json());\n if(json.error)throw Error(\"LOCAL_MCP_RPC_FAILURE\");\n return record(json.result);\n }\n const list=await request(\"tools/list\");\n if(!Array.isArray(list.tools)||!list.tools.some((t: unknown)=>isRecord(t)&&t.name===\"read_file\"))\n throw Error(\"LOCAL_DC_TOOLS_MISSING\");\n const read=await request(\"tools/call\",{\n name:\"list_directory\",arguments:{path:\".\",depth:0}\n });\n if(read.isError)throw Error(\"LOCAL_APPROVED_WORKSPACE_READ_DENIED\");\n process.stdout.write(JSON.stringify({\n event:\"SETUP_LOCAL_VERIFICATION\",result:\"PASS\",\n toolCount:list.tools.length,remoteClientVerified:false,\n ingressConfigured:false,profile:profile.mode,\n next:\"Complete remote ChatGPT connection and invoke a tool from that client\"\n })+\"\\n\");\n}\ntry{await main();}\ncatch(error){\n process.stderr.write(\"SETUP_LOCAL_VERIFY_FAIL \"+\n String(errorCode(error)||errorMessage(error)||\"UNKNOWN\").slice(0,100)+\"\\n\");\n if(errorMessage(error)===\"fetch failed\")\n process.stderr.write(\"Start the setup Core with mac-mcp-gateway run in another terminal, keep it running, then retry mac-mcp-gateway verify. Setup and doctor do not start an HTTP listener.\\n\");\n process.exitCode=1;\n}\n"]}
@@ -1,135 +0,0 @@
1
- import { ownedByUser, windows } from "./platform.js";
2
- import { revocationsSchema } from "./config-schemas.js";
3
- import { GatewayError, errorCode, parseJSON, record } from "./validation.js";
4
- // P0-C owner-local revocations: read afresh per request. This is NOT an IdP
5
- // revocation service, token introspection, or a cross-UID security boundary.
6
- import { randomBytes } from "node:crypto";
7
- import { constants } from "node:fs";
8
- import { lstat, mkdir, open, rename, rmdir, unlink } from "node:fs/promises";
9
- import path from "node:path";
10
- const MAX_BYTES = 65536, MAX_ITEMS = 2048;
11
- function fail(code) { const err = new GatewayError(code); throw err; }
12
- function validateFilename(file) {
13
- if (typeof file !== "string" || !path.isAbsolute(file) || path.basename(file) !== "remote-revocations.json")
14
- fail("REVOCATION_PATH_MUST_BE_ABSOLUTE_PRIVATE_FILE");
15
- return file;
16
- }
17
- async function validateDirectory(file) {
18
- let s;
19
- try {
20
- s = await lstat(path.dirname(file));
21
- }
22
- catch {
23
- fail("REVOCATION_PARENT_UNAVAILABLE");
24
- }
25
- if (!s.isDirectory() || s.isSymbolicLink() || !ownedByUser(path.dirname(file), s, true))
26
- fail("REVOCATION_PARENT_UNSAFE");
27
- }
28
- function normalized(value) {
29
- const state = record(value, "REVOCATION_STATE_INVALID");
30
- if (!state || typeof state !== "object" || Array.isArray(state) ||
31
- Object.keys(state).sort().join(",") !== "revokedJtis,revokedSubjects,version" ||
32
- state.version !== 1)
33
- fail("REVOCATION_STATE_INVALID");
34
- for (const key of ["revokedSubjects", "revokedJtis"]) {
35
- const entries = state[key];
36
- if (!Array.isArray(entries) || entries.length > MAX_ITEMS ||
37
- entries.some(x => typeof x !== "string" || x.length < 1 || x.length > 512 ||
38
- x.trim() !== x) || new Set(entries).size !== entries.length)
39
- fail("REVOCATION_STATE_INVALID");
40
- }
41
- return revocationsSchema.parse(state);
42
- }
43
- export async function readRemoteRevocations(value) {
44
- const file = validateFilename(value);
45
- await validateDirectory(file);
46
- let handle;
47
- try {
48
- if ((await lstat(file)).isSymbolicLink())
49
- fail("REVOCATION_FILE_UNSAFE");
50
- handle = await open(file, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
51
- const stat = await handle.stat();
52
- if (!stat.isFile() || !ownedByUser(file, stat, true) || stat.nlink !== 1 ||
53
- (!windows && (stat.mode & 0o777) !== 0o600) || stat.size > MAX_BYTES)
54
- fail("REVOCATION_FILE_UNSAFE");
55
- const text = await handle.readFile("utf8");
56
- return normalized(parseJSON(text));
57
- }
58
- catch (err) {
59
- if (errorCode(err)?.startsWith("REVOCATION_"))
60
- throw err;
61
- fail("REVOCATION_STATE_UNAVAILABLE");
62
- }
63
- finally {
64
- await handle?.close();
65
- }
66
- }
67
- export async function initializeRemoteRevocations(value) {
68
- const file = validateFilename(value);
69
- await validateDirectory(file);
70
- let handle;
71
- try {
72
- handle = await open(file, constants.O_WRONLY | constants.O_CREAT |
73
- constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
74
- await handle.writeFile(JSON.stringify({ version: 1, revokedSubjects: [], revokedJtis: [] }) + "\n");
75
- await handle.sync();
76
- }
77
- catch (err) {
78
- if (errorCode(err) === "EEXIST")
79
- fail("REVOCATION_ALREADY_INITIALIZED");
80
- fail("REVOCATION_INITIALIZATION_FAILED");
81
- }
82
- finally {
83
- await handle?.close();
84
- }
85
- return { initialized: true };
86
- }
87
- export async function revokeRemoteIdentity(file, { subject, jti } = {}) {
88
- if (Boolean(subject) === Boolean(jti))
89
- fail("REVOCATION_SINGLE_TARGET_REQUIRED");
90
- const key = subject ? "revokedSubjects" : "revokedJtis";
91
- const value = subject || jti;
92
- if (typeof value !== "string" || value.length < 1 || value.length > 512 || value.trim() !== value)
93
- fail("REVOCATION_TARGET_INVALID");
94
- file = validateFilename(file);
95
- // Exclusive same-UID writer lock prevents losing a revocation to concurrent
96
- // owner CLI invocations. A stale lock intentionally blocks edits; readers
97
- // continue honoring the last committed state until the owner repairs it.
98
- const lock = file + ".lock";
99
- await validateDirectory(file);
100
- try {
101
- await mkdir(lock, { mode: 0o700 });
102
- }
103
- catch {
104
- fail("REVOCATION_OWNER_UPDATE_LOCKED");
105
- }
106
- let tmp;
107
- let handle;
108
- try {
109
- const current = await readRemoteRevocations(file);
110
- if (current[key].includes(value))
111
- return { changed: false, revoked: true };
112
- const next = normalized({ ...current, [key]: [...current[key], value] });
113
- const suffix = randomBytes(12).toString("hex");
114
- tmp = path.join(path.dirname(file), ".remote-revocations-" + suffix + ".tmp");
115
- handle = await open(tmp, constants.O_WRONLY | constants.O_CREAT |
116
- constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
117
- await handle.writeFile(JSON.stringify(next) + "\n");
118
- await handle.sync();
119
- await handle.close();
120
- handle = null;
121
- await rename(tmp, file);
122
- return { changed: true, revoked: true };
123
- }
124
- finally {
125
- await handle?.close();
126
- if (tmp)
127
- await unlink(tmp).catch(() => { });
128
- await rmdir(lock).catch(() => { });
129
- }
130
- }
131
- export function isRemoteIdentityRevoked(state, payload) {
132
- return (typeof payload.sub === "string" && state.revokedSubjects.includes(payload.sub)) ||
133
- (typeof payload.jti === "string" && state.revokedJtis.includes(payload.jti));
134
- }
135
- //# sourceMappingURL=community-remote-revocations.js.map