@wirecat/zoom-cli 0.56.0 → 0.57.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 (145) hide show
  1. package/README.md +1 -1
  2. package/dist/bin/zm.js +35 -5
  3. package/dist/bundle/all-profiles-EKHWTGOY.js +25 -0
  4. package/dist/bundle/answer-policy-KH2IFXPN.js +96 -0
  5. package/dist/bundle/anthropic-VL54IUGF.js +70 -0
  6. package/dist/bundle/bun-ADJVI4HY.js +169 -0
  7. package/dist/bundle/bun-sqlite-2SDA3YOT.js +69 -0
  8. package/dist/bundle/chunk-2IKY7VBH.js +9 -0
  9. package/dist/bundle/chunk-2WOGZDZG.js +431 -0
  10. package/dist/bundle/chunk-4R7HYNZS.js +73 -0
  11. package/dist/bundle/chunk-4VCA7QU3.js +538 -0
  12. package/dist/bundle/chunk-4YLS4YLS.js +29 -0
  13. package/dist/bundle/chunk-5D4AEUVA.js +24783 -0
  14. package/dist/bundle/chunk-5F7IOESV.js +281 -0
  15. package/dist/bundle/chunk-5QESMCQK.js +122 -0
  16. package/dist/bundle/chunk-6M6FJV5D.js +138 -0
  17. package/dist/bundle/chunk-6MX5T6AQ.js +17 -0
  18. package/dist/bundle/chunk-6P3YHT54.js +385 -0
  19. package/dist/bundle/chunk-7A6PZUDR.js +938 -0
  20. package/dist/bundle/chunk-7GUG6UZS.js +884 -0
  21. package/dist/bundle/chunk-7JZJMHQY.js +487 -0
  22. package/dist/bundle/chunk-A4ETXPMZ.js +98 -0
  23. package/dist/bundle/chunk-ADLS6FVG.js +24600 -0
  24. package/dist/bundle/chunk-AE4BOXH7.js +5292 -0
  25. package/dist/bundle/chunk-AN3GVZTU.js +76 -0
  26. package/dist/bundle/chunk-BAYNCCNM.js +215 -0
  27. package/dist/bundle/chunk-BW2WPOXP.js +166 -0
  28. package/dist/bundle/chunk-BW52AJ4R.js +3387 -0
  29. package/dist/bundle/chunk-CB5UTASG.js +18 -0
  30. package/dist/bundle/chunk-CLMXBW53.js +1028 -0
  31. package/dist/bundle/chunk-DCTXOMOR.js +35 -0
  32. package/dist/bundle/chunk-DFDN6AUB.js +21 -0
  33. package/dist/bundle/chunk-EOQFWJJD.js +1095 -0
  34. package/dist/bundle/chunk-G4R4ZIGD.js +3569 -0
  35. package/dist/bundle/chunk-G4VZDINN.js +161 -0
  36. package/dist/bundle/chunk-GARCOIB6.js +409 -0
  37. package/dist/bundle/chunk-GKMGS7G5.js +1938 -0
  38. package/dist/bundle/chunk-HCNMFFG3.js +82 -0
  39. package/dist/bundle/chunk-HG5KRV55.js +1970 -0
  40. package/dist/bundle/chunk-HKYLSIZ2.js +82 -0
  41. package/dist/bundle/chunk-HTQTIKWP.js +928 -0
  42. package/dist/bundle/chunk-I4VQDXFR.js +100 -0
  43. package/dist/bundle/chunk-ICSKEDPI.js +36139 -0
  44. package/dist/bundle/chunk-IP4OK7RQ.js +24 -0
  45. package/dist/bundle/chunk-IVQ6342B.js +2 -0
  46. package/dist/bundle/chunk-K72SEMYI.js +160 -0
  47. package/dist/bundle/chunk-LHRCJYFC.js +19 -0
  48. package/dist/bundle/chunk-LPTIQLDW.js +192 -0
  49. package/dist/bundle/chunk-LQ3T2ZIX.js +124 -0
  50. package/dist/bundle/chunk-LSVI3A5X.js +836 -0
  51. package/dist/bundle/chunk-LW2G4U6W.js +570 -0
  52. package/dist/bundle/chunk-LXB6ONWC.js +3517 -0
  53. package/dist/bundle/chunk-LY26NW3I.js +6848 -0
  54. package/dist/bundle/chunk-MAEFLDHG.js +6092 -0
  55. package/dist/bundle/chunk-MZH4GDR4.js +45 -0
  56. package/dist/bundle/chunk-NN5B24KP.js +1109 -0
  57. package/dist/bundle/chunk-NO7CJEYV.js +22 -0
  58. package/dist/bundle/chunk-NTDWAAGL.js +18435 -0
  59. package/dist/bundle/chunk-NW3X3G5X.js +264 -0
  60. package/dist/bundle/chunk-O66V2WHK.js +48 -0
  61. package/dist/bundle/chunk-OCGPZHXW.js +25 -0
  62. package/dist/bundle/chunk-OIHDCGV4.js +151 -0
  63. package/dist/bundle/chunk-OVSWVPXL.js +8190 -0
  64. package/dist/bundle/chunk-PIN5RZ3D.js +63 -0
  65. package/dist/bundle/chunk-QLIB3PEC.js +1146 -0
  66. package/dist/bundle/chunk-QTR6D5HT.js +58 -0
  67. package/dist/bundle/chunk-QUJPQMHJ.js +2315 -0
  68. package/dist/bundle/chunk-R3HPOCZD.js +188 -0
  69. package/dist/bundle/chunk-RMV4C2YL.js +482 -0
  70. package/dist/bundle/chunk-RRRBMQ2E.js +844 -0
  71. package/dist/bundle/chunk-S4S7E54J.js +60 -0
  72. package/dist/bundle/chunk-SB6WOSHG.js +1109 -0
  73. package/dist/bundle/chunk-SE75DPBY.js +31 -0
  74. package/dist/bundle/chunk-SQJ7EH2D.js +97 -0
  75. package/dist/bundle/chunk-TKCHUT2H.js +422 -0
  76. package/dist/bundle/chunk-TLQUKHEM.js +193 -0
  77. package/dist/bundle/chunk-TZ2MKETI.js +100 -0
  78. package/dist/bundle/chunk-UC44ZMQV.js +78 -0
  79. package/dist/bundle/chunk-UI5UTMSZ.js +275 -0
  80. package/dist/bundle/chunk-VPPYYWOH.js +630 -0
  81. package/dist/bundle/chunk-WJHK5D7Z.js +35612 -0
  82. package/dist/bundle/chunk-WQ24UC44.js +239 -0
  83. package/dist/bundle/chunk-X5DFDGWS.js +2 -0
  84. package/dist/bundle/chunk-Y5E2WNWB.js +35 -0
  85. package/dist/bundle/chunk-YB4DMKYX.js +119 -0
  86. package/dist/bundle/chunk-Z4TZ6TAF.js +288 -0
  87. package/dist/bundle/chunk-ZVVMGPBJ.js +50 -0
  88. package/dist/bundle/cli-72EQATJF.js +825 -0
  89. package/dist/bundle/command-contract-4MHSZUN3.js +38 -0
  90. package/dist/bundle/config-GFIJK6G2.js +79 -0
  91. package/dist/bundle/dist-IBNHCQXT.js +136 -0
  92. package/dist/bundle/dist-XUFQCJXW.js +7577 -0
  93. package/dist/bundle/echarts-RFTK737T.js +42501 -0
  94. package/dist/bundle/embed-7QYA2ZZE.js +35 -0
  95. package/dist/bundle/embedder-YNN6PCHG.js +108 -0
  96. package/dist/bundle/first-run-EVSRQKZJ.js +23 -0
  97. package/dist/bundle/first-screen-RG4GUKW7.js +36 -0
  98. package/dist/bundle/folders-JEPOMYM4.js +13 -0
  99. package/dist/bundle/instructions-FHNL7CMW.js +9 -0
  100. package/dist/bundle/main-NYGJXPH7.js +130 -0
  101. package/dist/bundle/mcp-IXFC2VVR.js +165 -0
  102. package/dist/bundle/mcp-VGSZDCKK.js +189 -0
  103. package/dist/bundle/mcp-XKP2PXLS.js +92 -0
  104. package/dist/bundle/meetings-IBPI4MM4.js +215 -0
  105. package/dist/bundle/node-P4E63KXA.js +2340 -0
  106. package/dist/bundle/node-TLZSIHIJ.js +21 -0
  107. package/dist/bundle/node-ZMCACJVS.js +176 -0
  108. package/dist/bundle/node-sqlite-ZNGOBA5Q.js +45 -0
  109. package/dist/bundle/oauth-Q6LKF7DB.js +17 -0
  110. package/dist/bundle/open-LJ332Y5O.js +19 -0
  111. package/dist/bundle/output-file-RYQZ3RTE.js +63 -0
  112. package/dist/bundle/process-ZPTLNVQS.js +91 -0
  113. package/dist/bundle/program-IBRQBQ6W.js +5845 -0
  114. package/dist/bundle/prompt-RT7GUUXH.js +12 -0
  115. package/dist/bundle/recognize-QXGE7YJH.js +190 -0
  116. package/dist/bundle/remote-FD4MZQV3.js +26 -0
  117. package/dist/bundle/rerank-V6AVV755.js +49 -0
  118. package/dist/bundle/run-log-RE2EI3UU.js +111 -0
  119. package/dist/bundle/serve-HIJTFAW7.js +19 -0
  120. package/dist/bundle/server-3QOXOYYL.js +53 -0
  121. package/dist/bundle/server-WLJCU7KK.js +812 -0
  122. package/dist/bundle/services-KC5KQFBS.js +330 -0
  123. package/dist/bundle/speech-5JOXLYDA.js +44 -0
  124. package/dist/bundle/state-PPGRB3T6.js +33 -0
  125. package/dist/bundle/store-LODVDPK3.js +141 -0
  126. package/dist/bundle/store-WB5BICTG.js +124 -0
  127. package/dist/bundle/store-connection-EG6Z5ITP.js +76 -0
  128. package/dist/bundle/store-maintenance-command-Q5WMFUZ2.js +54 -0
  129. package/dist/bundle/streaming-UGFFNOXL.js +15 -0
  130. package/dist/bundle/tokens-AF5CPY2F.js +17 -0
  131. package/dist/bundle/zm.js +8 -0
  132. package/dist/contract-overrides.d.ts.map +1 -1
  133. package/dist/contract-overrides.js +18 -16
  134. package/dist/contract-overrides.js.map +1 -1
  135. package/dist/mcp-command.d.ts +3 -2
  136. package/dist/mcp-command.d.ts.map +1 -1
  137. package/dist/mcp-command.js +62 -10
  138. package/dist/mcp-command.js.map +1 -1
  139. package/dist/program-bindings.d.ts.map +1 -1
  140. package/dist/program-bindings.js +1 -0
  141. package/dist/program-bindings.js.map +1 -1
  142. package/dist/version.d.ts +1 -1
  143. package/dist/version.js +1 -1
  144. package/package.json +7 -5
  145. package/skills/zoom-cli/SKILL.md +2 -0
@@ -0,0 +1,288 @@
1
+ import { createRequire as __bundleRequire } from "node:module";
2
+ const require = __bundleRequire(import.meta.url);
3
+ import {
4
+ ACCESS_SECONDS,
5
+ REFRESH_SECONDS,
6
+ readStored
7
+ } from "./chunk-G4VZDINN.js";
8
+ import {
9
+ OAuthError,
10
+ OAuthErrorCode
11
+ } from "./chunk-5D4AEUVA.js";
12
+ import {
13
+ __name
14
+ } from "./chunk-ZVVMGPBJ.js";
15
+
16
+ // node_modules/.pnpm/@wirecat+cli-core@0.469.0_@wirecat+cli-base@0.65.0_commander@15.0.0_typescript@7.0.2_vi_80b586dbc8b099637a6e461856c2ee6b/node_modules/@wirecat/cli-core/dist/mcp/http/oauth.js
17
+ import { createHash, randomBytes, randomInt, timingSafeEqual } from "node:crypto";
18
+ import { chmodSync, mkdirSync, renameSync, rmSync, writeFileSync } from "node:fs";
19
+ import { dirname } from "node:path";
20
+ var AUTH_CODE_MS = 60 * 1e3;
21
+ var LOGIN_CODE_MS = 10 * 60 * 1e3;
22
+ var WRONG_TRIES = 5;
23
+ var WRONG_CODE_WAIT_MS = 3e4;
24
+ var MAX_CLIENTS = 10;
25
+ var CODE_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
26
+ var hash = /* @__PURE__ */ __name((value) => createHash("sha256").update(value).digest("base64url"), "hash");
27
+ var secret = /* @__PURE__ */ __name(() => randomBytes(32).toString("base64url"), "secret");
28
+ var same = /* @__PURE__ */ __name((given, expected) => {
29
+ const left = Buffer.from(given);
30
+ const right = Buffer.from(expected);
31
+ return left.byteLength === right.byteLength && timingSafeEqual(left, right);
32
+ }, "same");
33
+ var tokenFile = /* @__PURE__ */ __name((path) => ({
34
+ read: /* @__PURE__ */ __name(() => readStored(path), "read"),
35
+ write: /* @__PURE__ */ __name((stored) => {
36
+ mkdirSync(dirname(path), { recursive: true, mode: 448 });
37
+ const temporary = `${path}.${randomBytes(16).toString("hex")}.tmp`;
38
+ writeFileSync(temporary, JSON.stringify(stored), { mode: 384, flag: "wx" });
39
+ chmodSync(temporary, 384);
40
+ renameSync(temporary, path);
41
+ }, "write")
42
+ }), "tokenFile");
43
+ var revokeAll = /* @__PURE__ */ __name((path) => rmSync(path, { force: true }), "revokeAll");
44
+ var json = /* @__PURE__ */ __name((body, status = 200) => new Response(JSON.stringify(body), {
45
+ status,
46
+ headers: { "content-type": "application/json", "cache-control": "no-store" }
47
+ }), "json");
48
+ var oauthError = /* @__PURE__ */ __name((error, description, status = 400) => json({ error, error_description: description }, status), "oauthError");
49
+ var escapeHtml = /* @__PURE__ */ __name((value) => value.replace(/[&<>"']/g, (character) => `&#${character.charCodeAt(0)};`), "escapeHtml");
50
+ var redirectAllowed = /* @__PURE__ */ __name((uri) => {
51
+ try {
52
+ const url = new URL(uri);
53
+ if (url.hash)
54
+ return false;
55
+ return url.protocol === "https:" || url.protocol === "http:" && ["localhost", "127.0.0.1"].includes(url.hostname);
56
+ } catch {
57
+ return false;
58
+ }
59
+ }, "redirectAllowed");
60
+ var ownerLogin = /* @__PURE__ */ __name(({ issuer, resource, file, appName, onCode, now = /* @__PURE__ */ __name(() => Date.now(), "now") }) => {
61
+ const store = tokenFile(file);
62
+ const codes = /* @__PURE__ */ new Map();
63
+ let login = { value: "", expires: 0 };
64
+ let wrong = 0;
65
+ let retryAt = 0;
66
+ let renewal;
67
+ const freshCode = /* @__PURE__ */ __name(() => {
68
+ const part = /* @__PURE__ */ __name(() => Array.from({ length: 4 }, () => CODE_ALPHABET[randomInt(CODE_ALPHABET.length)]).join(""), "part");
69
+ login = { value: `${part()}-${part()}`, expires: now() + LOGIN_CODE_MS };
70
+ clearTimeout(renewal);
71
+ renewal = setTimeout(freshCode, LOGIN_CODE_MS);
72
+ renewal.unref();
73
+ onCode(login.value, new Date(login.expires));
74
+ }, "freshCode");
75
+ freshCode();
76
+ const base = issuer.pathname.replace(/\/+$/, "");
77
+ const endpoint = /* @__PURE__ */ __name((path) => new URL(`${base}${path}`, issuer.origin).href, "endpoint");
78
+ const metadata = {
79
+ issuer: issuer.href,
80
+ authorization_endpoint: endpoint("/authorize"),
81
+ token_endpoint: endpoint("/token"),
82
+ registration_endpoint: endpoint("/register"),
83
+ response_types_supported: ["code"],
84
+ grant_types_supported: ["authorization_code", "refresh_token"],
85
+ code_challenge_methods_supported: ["S256"],
86
+ token_endpoint_auth_methods_supported: ["none", "client_secret_post", "client_secret_basic"]
87
+ };
88
+ const issue = /* @__PURE__ */ __name((stored, clientId) => {
89
+ const access = secret();
90
+ const refresh = secret();
91
+ const seconds = Math.floor(now() / 1e3);
92
+ stored.tokens = stored.tokens.filter((one) => one.expiresAt > seconds);
93
+ stored.tokens.push({ hash: hash(access), kind: "access", clientId, expiresAt: seconds + ACCESS_SECONDS }, { hash: hash(refresh), kind: "refresh", clientId, expiresAt: seconds + REFRESH_SECONDS });
94
+ store.write(stored);
95
+ return json({ access_token: access, token_type: "Bearer", expires_in: ACCESS_SECONDS, refresh_token: refresh });
96
+ }, "issue");
97
+ const clientOf = /* @__PURE__ */ __name((stored, request, form) => {
98
+ let id = form.get("client_id") ?? "";
99
+ let given = form.get("client_secret") ?? void 0;
100
+ const basic = request.headers.get("authorization");
101
+ if (basic?.startsWith("Basic ")) {
102
+ const [user = "", password = ""] = Buffer.from(basic.slice(6), "base64").toString().split(":");
103
+ id = decodeURIComponent(user);
104
+ given = decodeURIComponent(password);
105
+ }
106
+ const client = stored.clients.find((one) => one.id === id);
107
+ if (!client)
108
+ return void 0;
109
+ if (client.authMethod === "none")
110
+ return client;
111
+ return given !== void 0 && client.secretHash && same(hash(given), client.secretHash) ? client : void 0;
112
+ }, "clientOf");
113
+ const register = /* @__PURE__ */ __name(async (request) => {
114
+ const body = await request.json().catch(() => null);
115
+ const uris = Array.isArray(body?.redirect_uris) ? body.redirect_uris.filter((one) => typeof one === "string") : [];
116
+ if (uris.length === 0 || !uris.every(redirectAllowed))
117
+ return oauthError("invalid_redirect_uri", "redirect_uris must be https URLs");
118
+ const requested = body?.token_endpoint_auth_method;
119
+ const authMethod = requested === "client_secret_post" || requested === "client_secret_basic" ? requested : "none";
120
+ const clientSecret = authMethod === "none" ? void 0 : secret();
121
+ const name = typeof body?.client_name === "string" ? body.client_name.slice(0, 100) : void 0;
122
+ const client = {
123
+ id: secret(),
124
+ redirectUris: uris,
125
+ authMethod,
126
+ issuedAt: Math.floor(now() / 1e3),
127
+ ...name ? { name } : {},
128
+ ...clientSecret ? { secretHash: hash(clientSecret) } : {}
129
+ };
130
+ const stored = store.read();
131
+ const seconds = Math.floor(now() / 1e3);
132
+ const holding = new Set(stored.tokens.filter((one) => one.expiresAt > seconds).map((one) => one.clientId));
133
+ stored.clients.push(client);
134
+ while (stored.clients.length > MAX_CLIENTS) {
135
+ const idle = stored.clients.findIndex((one) => !holding.has(one.id));
136
+ if (idle === -1)
137
+ return oauthError("invalid_client_metadata", "too many logged-in apps \u2014 run mcp revoke first");
138
+ stored.clients.splice(idle, 1);
139
+ }
140
+ store.write(stored);
141
+ return json({
142
+ client_id: client.id,
143
+ client_id_issued_at: client.issuedAt,
144
+ redirect_uris: uris,
145
+ token_endpoint_auth_method: authMethod,
146
+ grant_types: ["authorization_code", "refresh_token"],
147
+ response_types: ["code"],
148
+ ...name ? { client_name: name } : {},
149
+ ...clientSecret ? { client_secret: clientSecret, client_secret_expires_at: 0 } : {}
150
+ }, 201);
151
+ }, "register");
152
+ const page = /* @__PURE__ */ __name((params, client, message) => {
153
+ const hidden = ["response_type", "client_id", "redirect_uri", "code_challenge", "code_challenge_method", "state"].map((name) => `<input type="hidden" name="${name}" value="${escapeHtml(params.get(name) ?? "")}">`).join("");
154
+ const who = escapeHtml(client.name ?? "an application");
155
+ const target = new URL(params.get("redirect_uri") ?? "");
156
+ const html = `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${escapeHtml(appName)} login</title><style>body{font:16px system-ui,sans-serif;max-width:28rem;margin:3rem auto;padding:0 1rem;color:#1d2430}input[type=text]{font:20px ui-monospace,monospace;letter-spacing:.1em;width:100%;padding:.5rem;margin:.5rem 0 1rem;box-sizing:border-box}button{font:inherit;padding:.5rem 1rem}.error{color:#b42318}</style></head><body><h1>${escapeHtml(appName)}</h1><p>An app that calls itself <strong>${who}</strong> asks to reach your messages through <code>${escapeHtml(appName)} mcp --http</code>.</p><p>After you allow it, the login goes to <strong>${escapeHtml(target.host)}</strong>. Allow only if that is the app you are connecting, such as chatgpt.com or claude.ai.</p><p>Type the code shown in WireCat Desktop, or in the terminal where the server runs. If you did not start this login, close this page.</p>${message ? `<p class="error">${escapeHtml(message)}</p>` : ""}<form method="post" action="${escapeHtml(`${base}/authorize`)}">${hidden}<label>Login code<input type="text" name="login_code" autocomplete="off" autofocus required></label><button type="submit">Allow</button></form></body></html>`;
157
+ return new Response(html, {
158
+ status: message ? 400 : 200,
159
+ headers: {
160
+ "content-type": "text/html; charset=utf-8",
161
+ "cache-control": "no-store",
162
+ "x-frame-options": "DENY",
163
+ "content-security-policy": `default-src 'none'; style-src 'unsafe-inline'; form-action 'self' ${target.origin}; frame-ancestors 'none'`,
164
+ // no-referrer makes the browser post this form with `Origin: null`, which the Origin check refuses.
165
+ "referrer-policy": "same-origin"
166
+ }
167
+ });
168
+ }, "page");
169
+ const authorize = /* @__PURE__ */ __name(async (request) => {
170
+ const params = request.method === "POST" ? new URLSearchParams(await request.text()) : new URL(request.url).searchParams;
171
+ const stored = store.read();
172
+ const client = stored.clients.find((one) => one.id === params.get("client_id"));
173
+ const redirectUri = params.get("redirect_uri") ?? "";
174
+ if (!client?.redirectUris.includes(redirectUri))
175
+ return new Response("Unknown client or redirect address.", { status: 400 });
176
+ if (params.get("response_type") !== "code" || params.get("code_challenge_method") !== "S256" || !params.get("code_challenge"))
177
+ return new Response("This server needs response_type=code and PKCE with S256.", { status: 400 });
178
+ if (request.method !== "POST")
179
+ return page(params, client);
180
+ const throttled = /* @__PURE__ */ __name(() => new Response("Too many wrong codes. Wait, then try the new code.", {
181
+ status: 429,
182
+ headers: { "retry-after": String(Math.ceil((retryAt - now()) / 1e3)) }
183
+ }), "throttled");
184
+ if (wrong >= WRONG_TRIES) {
185
+ if (now() < retryAt)
186
+ return throttled();
187
+ wrong = 0;
188
+ freshCode();
189
+ }
190
+ const typed = (params.get("login_code") ?? "").trim().toUpperCase();
191
+ if (login.expires < now()) {
192
+ freshCode();
193
+ return page(params, client, "The code expired. A new one is shown in WireCat Desktop and in the terminal.");
194
+ }
195
+ if (!same(typed, login.value)) {
196
+ wrong += 1;
197
+ if (wrong >= WRONG_TRIES) {
198
+ retryAt = now() + WRONG_CODE_WAIT_MS;
199
+ return throttled();
200
+ }
201
+ return page(params, client, `Wrong code. Each code works for one login: after an app logs in, a new one appears in WireCat Desktop and in "${appName} mcp server status". ${WRONG_TRIES - wrong} tries left.`);
202
+ }
203
+ wrong = 0;
204
+ freshCode();
205
+ const code = secret();
206
+ codes.set(hash(code), {
207
+ clientId: client.id,
208
+ redirectUri,
209
+ challenge: params.get("code_challenge") ?? "",
210
+ expires: now() + AUTH_CODE_MS
211
+ });
212
+ const target = new URL(redirectUri);
213
+ target.searchParams.set("code", code);
214
+ const state = params.get("state");
215
+ if (state)
216
+ target.searchParams.set("state", state);
217
+ target.searchParams.set("iss", issuer.href);
218
+ return new Response(null, { status: 302, headers: { location: target.href, "cache-control": "no-store" } });
219
+ }, "authorize");
220
+ const token = /* @__PURE__ */ __name(async (request) => {
221
+ const form = new URLSearchParams(await request.text());
222
+ const stored = store.read();
223
+ const client = clientOf(stored, request, form);
224
+ if (!client)
225
+ return oauthError("invalid_client", "unknown client or wrong secret", 401);
226
+ const requestedResource = form.get("resource");
227
+ if (requestedResource && requestedResource !== resource.href)
228
+ return oauthError("invalid_target", "this server issues tokens only for its own MCP endpoint");
229
+ if (form.get("grant_type") === "authorization_code") {
230
+ const key = hash(form.get("code") ?? "");
231
+ const entry = codes.get(key);
232
+ codes.delete(key);
233
+ const verifier2 = form.get("code_verifier") ?? "";
234
+ const challenge = createHash("sha256").update(verifier2).digest("base64url");
235
+ if (!entry || entry.expires < now() || entry.clientId !== client.id || entry.redirectUri !== form.get("redirect_uri") || !same(challenge, entry.challenge))
236
+ return oauthError("invalid_grant", "the code is wrong, used or expired");
237
+ return issue(stored, client.id);
238
+ }
239
+ if (form.get("grant_type") === "refresh_token") {
240
+ const key = hash(form.get("refresh_token") ?? "");
241
+ const seconds = Math.floor(now() / 1e3);
242
+ const found = stored.tokens.find((one) => one.kind === "refresh" && one.hash === key);
243
+ if (!found || found.clientId !== client.id || found.expiresAt <= seconds)
244
+ return oauthError("invalid_grant", "the refresh token is wrong, used or expired");
245
+ stored.tokens = stored.tokens.filter((one) => one !== found);
246
+ return issue(stored, client.id);
247
+ }
248
+ return oauthError("unsupported_grant_type", "use authorization_code or refresh_token");
249
+ }, "token");
250
+ const verifier = {
251
+ verifyAccessToken: /* @__PURE__ */ __name(async (presented) => {
252
+ const seconds = Math.floor(now() / 1e3);
253
+ const stored = store.read();
254
+ const found = stored.tokens.find((one) => one.kind === "access" && one.hash === hash(presented));
255
+ if (!found || found.expiresAt <= seconds)
256
+ throw new OAuthError(OAuthErrorCode.InvalidToken, "the token is unknown or expired");
257
+ const clientName = stored.clients.find((one) => one.id === found.clientId)?.name;
258
+ return {
259
+ token: presented,
260
+ clientId: found.clientId,
261
+ scopes: [],
262
+ expiresAt: found.expiresAt,
263
+ resource,
264
+ ...clientName ? { extra: { clientName } } : {}
265
+ };
266
+ }, "verifyAccessToken")
267
+ };
268
+ return {
269
+ code: /* @__PURE__ */ __name(() => login.value, "code"),
270
+ close: /* @__PURE__ */ __name(() => clearTimeout(renewal), "close"),
271
+ metadata,
272
+ verifier,
273
+ handle: /* @__PURE__ */ __name(async (request, path = new URL(request.url).pathname) => {
274
+ if (path === `${base}/register` && request.method === "POST")
275
+ return register(request);
276
+ if (path === `${base}/authorize` && (request.method === "GET" || request.method === "POST"))
277
+ return authorize(request);
278
+ if (path === `${base}/token` && request.method === "POST")
279
+ return token(request);
280
+ return void 0;
281
+ }, "handle")
282
+ };
283
+ }, "ownerLogin");
284
+
285
+ export {
286
+ revokeAll,
287
+ ownerLogin
288
+ };
@@ -0,0 +1,50 @@
1
+ import { createRequire as __bundleRequire } from "node:module";
2
+ const require = __bundleRequire(import.meta.url);
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
11
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
12
+ }) : x)(function(x) {
13
+ if (typeof require !== "undefined") return require.apply(this, arguments);
14
+ throw Error('Dynamic require of "' + x + '" is not supported');
15
+ });
16
+ var __commonJS = (cb, mod) => function __require2() {
17
+ try {
18
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
19
+ } catch (e) {
20
+ throw mod = 0, e;
21
+ }
22
+ };
23
+ var __export = (target, all) => {
24
+ for (var name in all)
25
+ __defProp(target, name, { get: all[name], enumerable: true });
26
+ };
27
+ var __copyProps = (to, from, except, desc) => {
28
+ if (from && typeof from === "object" || typeof from === "function") {
29
+ for (let key of __getOwnPropNames(from))
30
+ if (!__hasOwnProp.call(to, key) && key !== except)
31
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
32
+ }
33
+ return to;
34
+ };
35
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
36
+ // If the importer is in node compatibility mode or this is not an ESM
37
+ // file that has been converted to a CommonJS file using a Babel-
38
+ // compatible transform (i.e. "__esModule" has not been set), then set
39
+ // "default" to the CommonJS "module.exports" for node compatibility.
40
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
41
+ mod
42
+ ));
43
+
44
+ export {
45
+ __name,
46
+ __require,
47
+ __commonJS,
48
+ __export,
49
+ __toESM
50
+ };