@creeperhost/modlens-mcp 1.6.20 → 1.6.22

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 (116) hide show
  1. package/ATTRIBUTION.md +8 -1
  2. package/README.md +77 -2
  3. package/RUNTIME.md +262 -0
  4. package/TESTING.md +8 -0
  5. package/dist/hosted-mod-license.d.ts +36 -0
  6. package/dist/hosted-mod-license.d.ts.map +1 -0
  7. package/dist/hosted-mod-license.js +65 -0
  8. package/dist/hosted-mod-license.js.map +1 -0
  9. package/dist/hosted-oauth.d.ts +36 -0
  10. package/dist/hosted-oauth.d.ts.map +1 -0
  11. package/dist/hosted-oauth.js +522 -0
  12. package/dist/hosted-oauth.js.map +1 -0
  13. package/dist/hosted-policy.d.ts +36 -0
  14. package/dist/hosted-policy.d.ts.map +1 -0
  15. package/dist/hosted-policy.js +354 -0
  16. package/dist/hosted-policy.js.map +1 -0
  17. package/dist/launcher.js +104 -89
  18. package/dist/launcher.js.map +1 -1
  19. package/dist/license-notices.d.ts +8 -0
  20. package/dist/license-notices.d.ts.map +1 -0
  21. package/dist/license-notices.js +10 -0
  22. package/dist/license-notices.js.map +1 -0
  23. package/dist/license-source-references.d.ts +12 -0
  24. package/dist/license-source-references.d.ts.map +1 -0
  25. package/dist/license-source-references.js +18 -0
  26. package/dist/license-source-references.js.map +1 -0
  27. package/dist/license-templates.d.ts +6 -0
  28. package/dist/license-templates.d.ts.map +1 -0
  29. package/dist/license-templates.js +55 -0
  30. package/dist/license-templates.js.map +1 -0
  31. package/dist/local-mod.d.ts +31 -0
  32. package/dist/local-mod.d.ts.map +1 -0
  33. package/dist/local-mod.js +71 -0
  34. package/dist/local-mod.js.map +1 -0
  35. package/dist/minecraft.d.ts +2 -0
  36. package/dist/minecraft.d.ts.map +1 -1
  37. package/dist/minecraft.js +16 -0
  38. package/dist/minecraft.js.map +1 -1
  39. package/dist/mod-license.d.ts +53 -0
  40. package/dist/mod-license.d.ts.map +1 -0
  41. package/dist/mod-license.js +617 -0
  42. package/dist/mod-license.js.map +1 -0
  43. package/dist/repositories/mcVersion.d.ts +1 -0
  44. package/dist/repositories/mcVersion.d.ts.map +1 -1
  45. package/dist/repositories/mcVersion.js +11 -0
  46. package/dist/repositories/mcVersion.js.map +1 -1
  47. package/dist/runtime/cli.d.ts +2 -0
  48. package/dist/runtime/cli.d.ts.map +1 -0
  49. package/dist/runtime/cli.js +163 -0
  50. package/dist/runtime/cli.js.map +1 -0
  51. package/dist/runtime/companion.d.ts +32 -0
  52. package/dist/runtime/companion.d.ts.map +1 -0
  53. package/dist/runtime/companion.js +135 -0
  54. package/dist/runtime/companion.js.map +1 -0
  55. package/dist/runtime/guidance.d.ts +73 -0
  56. package/dist/runtime/guidance.d.ts.map +1 -0
  57. package/dist/runtime/guidance.js +40 -0
  58. package/dist/runtime/guidance.js.map +1 -0
  59. package/dist/runtime/hub.d.ts +150 -0
  60. package/dist/runtime/hub.d.ts.map +1 -0
  61. package/dist/runtime/hub.js +561 -0
  62. package/dist/runtime/hub.js.map +1 -0
  63. package/dist/runtime/modlens-agent.jar +0 -0
  64. package/dist/runtime/protocol.d.ts +202 -0
  65. package/dist/runtime/protocol.d.ts.map +1 -0
  66. package/dist/runtime/protocol.js +91 -0
  67. package/dist/runtime/protocol.js.map +1 -0
  68. package/dist/runtime/requests.d.ts +367 -0
  69. package/dist/runtime/requests.d.ts.map +1 -0
  70. package/dist/runtime/requests.js +57 -0
  71. package/dist/runtime/requests.js.map +1 -0
  72. package/dist/server.js +186 -39
  73. package/dist/server.js.map +1 -1
  74. package/dist/tools/hosted-mc-index.d.ts +8 -0
  75. package/dist/tools/hosted-mc-index.d.ts.map +1 -0
  76. package/dist/tools/hosted-mc-index.js +92 -0
  77. package/dist/tools/hosted-mc-index.js.map +1 -0
  78. package/dist/tools/mc-fts.d.ts +2 -0
  79. package/dist/tools/mc-fts.d.ts.map +1 -1
  80. package/dist/tools/mc-fts.js +8 -0
  81. package/dist/tools/mc-fts.js.map +1 -1
  82. package/dist/tools/project.d.ts +7 -3
  83. package/dist/tools/project.d.ts.map +1 -1
  84. package/dist/tools/project.js +45 -3
  85. package/dist/tools/project.js.map +1 -1
  86. package/dist/tools/report-issue.d.ts +77 -0
  87. package/dist/tools/report-issue.d.ts.map +1 -0
  88. package/dist/tools/report-issue.js +92 -0
  89. package/dist/tools/report-issue.js.map +1 -0
  90. package/dist/tools/runtime.d.ts +6 -0
  91. package/dist/tools/runtime.d.ts.map +1 -0
  92. package/dist/tools/runtime.js +18 -0
  93. package/dist/tools/runtime.js.map +1 -0
  94. package/dist/tools/source.d.ts +1 -1
  95. package/dist/tools/source.d.ts.map +1 -1
  96. package/dist/tools/source.js +5 -1
  97. package/dist/tools/source.js.map +1 -1
  98. package/dist/tools/vanilla.d.ts +30 -1
  99. package/dist/tools/vanilla.d.ts.map +1 -1
  100. package/dist/tools/vanilla.js +184 -25
  101. package/dist/tools/vanilla.js.map +1 -1
  102. package/package.json +5 -1
  103. package/scripts/build-runtime-agent.mjs +64 -0
  104. package/scripts/fixtures/mod-license-corpus.json +154 -0
  105. package/scripts/gradle/modlens-runtime.init.gradle +17 -0
  106. package/scripts/runtime-test-client.mjs +36 -0
  107. package/scripts/test-hosted-oauth.mjs +186 -0
  108. package/scripts/test-hosted-policy.mjs +182 -0
  109. package/scripts/test-mod-licenses-live.mjs +86 -0
  110. package/scripts/test-package.mjs +44 -0
  111. package/scripts/test-project-http.mjs +46 -3
  112. package/scripts/test-runtime-gradle.mjs +107 -0
  113. package/scripts/test-runtime-minecraft.mjs +190 -0
  114. package/scripts/test-runtime-native.mjs +120 -0
  115. package/scripts/test-runtime-remote.mjs +209 -0
  116. package/scripts/update-license-templates.mjs +14 -0
@@ -0,0 +1,522 @@
1
+ import { createCipheriv, createDecipheriv, createHash, randomBytes } from "node:crypto";
2
+ import { getDb } from "./db.js";
3
+ export class HostedOAuthError extends Error {
4
+ status;
5
+ code;
6
+ constructor(message, status = 400, code = "invalid_request") {
7
+ super(message);
8
+ this.status = status;
9
+ this.code = code;
10
+ }
11
+ }
12
+ const sha = (value) => createHash("sha256").update(value).digest("hex");
13
+ const token = (prefix) => prefix + randomBytes(32).toString("base64url");
14
+ const now = () => Math.floor(Date.now() / 1000);
15
+ const json = (res, status, value, headers = {}) => {
16
+ res.writeHead(status, { "Content-Type": "application/json", "Cache-Control": "no-store", ...headers });
17
+ res.end(JSON.stringify(value));
18
+ };
19
+ const redirect = (res, url) => {
20
+ res.writeHead(302, { Location: url.toString(), "Cache-Control": "no-store" });
21
+ res.end();
22
+ };
23
+ const field = (value, path) => path.split(".").reduce((current, part) => current && typeof current === "object" && !Array.isArray(current) ? current[part] : undefined, value);
24
+ function secureUrl(raw, label, loopback = false) {
25
+ let url;
26
+ try {
27
+ url = new URL(raw);
28
+ }
29
+ catch {
30
+ throw new Error(`${label} must be an absolute URL`);
31
+ }
32
+ if ((url.protocol !== "https:" && !(loopback && url.protocol === "http:"
33
+ && ["127.0.0.1", "[::1]"].includes(url.hostname))) || url.username || url.password || url.hash || url.search)
34
+ throw new Error(`${label} must be HTTPS (or loopback HTTP), without credentials, query or fragment`);
35
+ return url;
36
+ }
37
+ function callbackSafe(raw) {
38
+ try {
39
+ const url = new URL(raw);
40
+ return raw.length <= 2048 && !url.username && !url.password && !url.hash &&
41
+ (url.protocol === "https:" || (url.protocol === "http:" &&
42
+ ["127.0.0.1", "[::1]", "localhost"].includes(url.hostname))) && url.toString() === raw;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ async function body(req) {
49
+ const chunks = [];
50
+ let size = 0;
51
+ for await (const chunk of req) {
52
+ size += chunk.length;
53
+ if (size > 32 * 1024)
54
+ throw new HostedOAuthError("Request too large", 413);
55
+ chunks.push(Buffer.from(chunk));
56
+ }
57
+ return Buffer.concat(chunks).toString("utf8");
58
+ }
59
+ function form(raw) {
60
+ const params = new URLSearchParams(raw);
61
+ const seen = new Set();
62
+ for (const [key] of params) {
63
+ if (seen.has(key))
64
+ throw new HostedOAuthError("Duplicate form parameter");
65
+ seen.add(key);
66
+ }
67
+ return params;
68
+ }
69
+ function uniqueQuery(params) {
70
+ const seen = new Set();
71
+ for (const [key] of params) {
72
+ if (seen.has(key))
73
+ throw new HostedOAuthError("Duplicate query parameter");
74
+ seen.add(key);
75
+ }
76
+ }
77
+ function required(params, key) {
78
+ const value = params.get(key);
79
+ if (!value)
80
+ throw new HostedOAuthError(`Missing ${key}`);
81
+ return value;
82
+ }
83
+ function challenge(verifier) {
84
+ if (!/^[A-Za-z0-9._~-]{43,128}$/.test(verifier))
85
+ throw new HostedOAuthError("Invalid PKCE verifier", 400, "invalid_grant");
86
+ return createHash("sha256").update(verifier).digest("base64url");
87
+ }
88
+ export class HostedOAuth {
89
+ config;
90
+ database;
91
+ ready;
92
+ requestCounts = new Map();
93
+ constructor(config, database) {
94
+ this.config = config;
95
+ this.database = database;
96
+ }
97
+ static async create(env = process.env, database = getDb) {
98
+ const resource = secureUrl(env.MODLENS_OAUTH_PUBLIC_URL ?? "", "MODLENS_OAUTH_PUBLIC_URL", true);
99
+ const issuer = secureUrl(env.MODLENS_OAUTH_ISSUER ?? "", "MODLENS_OAUTH_ISSUER", true).toString().replace(/\/$/, "");
100
+ const clientId = env.MODLENS_OAUTH_CLIENT_ID;
101
+ if (!clientId)
102
+ throw new Error("MODLENS_OAUTH_CLIENT_ID is required");
103
+ const scopes = env.MODLENS_OAUTH_SCOPES?.trim();
104
+ if (!scopes || scopes.length > 2048 || !/^[\x21-\x7e]+(?: [\x21-\x7e]+)*$/.test(scopes))
105
+ throw new Error("MODLENS_OAUTH_SCOPES must be a space-separated scope list");
106
+ const key = Buffer.from(env.MODLENS_OAUTH_STORAGE_KEY ?? "", "base64");
107
+ if (key.length !== 32)
108
+ throw new Error("MODLENS_OAUTH_STORAGE_KEY must be a base64-encoded 32-byte key");
109
+ const subjectField = env.MODLENS_OAUTH_SUBJECT_FIELD ?? "sub";
110
+ const requiredField = env.MODLENS_OAUTH_REQUIRED_FIELD;
111
+ if (![subjectField, requiredField].filter(Boolean).every(value => /^[A-Za-z_][A-Za-z0-9_.]*$/.test(value)))
112
+ throw new Error("OAuth profile field names must be dotted JSON paths");
113
+ if (!!requiredField !== (env.MODLENS_OAUTH_REQUIRED_VALUE !== undefined))
114
+ throw new Error("MODLENS_OAUTH_REQUIRED_FIELD and MODLENS_OAUTH_REQUIRED_VALUE must be configured together");
115
+ const path = new URL(issuer).pathname.replace(/\/$/, "");
116
+ const metadataUrl = new URL(`/.well-known/oauth-authorization-server${path === "/" ? "" : path}`, issuer);
117
+ let response = await fetch(metadataUrl, { redirect: "error", signal: AbortSignal.timeout(10000) });
118
+ if (response.status === 404)
119
+ response = await fetch(new URL(".well-known/openid-configuration", issuer + "/"), { redirect: "error", signal: AbortSignal.timeout(10000) });
120
+ if (!response.ok)
121
+ throw new Error("OAuth provider metadata unavailable");
122
+ const metadata = await response.json();
123
+ if (metadata.issuer !== issuer)
124
+ throw new Error("OAuth provider issuer mismatch");
125
+ const authorizeUrl = secureUrl(String(metadata.authorization_endpoint ?? ""), "authorization endpoint", true).toString();
126
+ const tokenUrl = secureUrl(String(metadata.token_endpoint ?? ""), "token endpoint", true).toString();
127
+ const profileUrl = secureUrl(String(env.MODLENS_OAUTH_PROFILE_URL ?? metadata.userinfo_endpoint ?? ""), "MODLENS_OAUTH_PROFILE_URL", true).toString();
128
+ const instance = new HostedOAuth({ resource, issuer, clientId, clientSecret: env.MODLENS_OAUTH_CLIENT_SECRET,
129
+ scopes, profileUrl, subjectField, requiredField, requiredValue: env.MODLENS_OAUTH_REQUIRED_VALUE,
130
+ key, authorizeUrl, tokenUrl, requiresIss: metadata.authorization_response_iss_parameter_supported === true }, database);
131
+ await instance.db();
132
+ return instance;
133
+ }
134
+ async db() {
135
+ const db = await this.database();
136
+ if (!this.ready)
137
+ this.ready = (async () => {
138
+ await db.$executeRawUnsafe(`CREATE TABLE IF NOT EXISTS hosted_oauth_clients (
139
+ id TEXT PRIMARY KEY, redirect_uris TEXT NOT NULL, created BIGINT NOT NULL)`);
140
+ await db.$executeRawUnsafe(`CREATE TABLE IF NOT EXISTS hosted_oauth_objects (
141
+ id TEXT PRIMARY KEY, kind TEXT NOT NULL, payload TEXT NOT NULL, expires BIGINT NOT NULL)`);
142
+ await db.$executeRawUnsafe(`CREATE TABLE IF NOT EXISTS hosted_oauth_grants (
143
+ id TEXT PRIMARY KEY, client_id TEXT NOT NULL, subject TEXT NOT NULL, resource TEXT NOT NULL,
144
+ upstream_access TEXT NOT NULL, upstream_refresh TEXT, upstream_expires BIGINT NOT NULL,
145
+ refresh_hash TEXT, refresh_expires BIGINT NOT NULL)`);
146
+ await db.$executeRawUnsafe(`CREATE TABLE IF NOT EXISTS hosted_oauth_access (
147
+ token_hash TEXT PRIMARY KEY, grant_id TEXT NOT NULL, expires BIGINT NOT NULL)`);
148
+ })().catch(error => { this.ready = undefined; throw error; });
149
+ await this.ready;
150
+ return db;
151
+ }
152
+ seal(value) {
153
+ const iv = randomBytes(12);
154
+ const cipher = createCipheriv("aes-256-gcm", this.config.key, iv);
155
+ const data = Buffer.concat([cipher.update(value, "utf8"), cipher.final()]);
156
+ return Buffer.concat([iv, cipher.getAuthTag(), data]).toString("base64url");
157
+ }
158
+ open(value) {
159
+ const bytes = Buffer.from(value, "base64url");
160
+ const decipher = createDecipheriv("aes-256-gcm", this.config.key, bytes.subarray(0, 12));
161
+ decipher.setAuthTag(bytes.subarray(12, 28));
162
+ return Buffer.concat([decipher.update(bytes.subarray(28)), decipher.final()]).toString("utf8");
163
+ }
164
+ async putObject(kind, payload, ttl) {
165
+ const id = token("mlo_");
166
+ const db = await this.db();
167
+ await db.$executeRawUnsafe(`DELETE FROM hosted_oauth_objects WHERE expires<$1`, now());
168
+ await db.$executeRawUnsafe(`INSERT INTO hosted_oauth_objects (id,kind,payload,expires) VALUES ($1,$2,$3,$4)`, sha(id), kind, this.seal(JSON.stringify(payload)), now() + ttl);
169
+ return id;
170
+ }
171
+ async takeObject(id, kind) {
172
+ const db = await this.db();
173
+ const rows = await db.$queryRawUnsafe(`DELETE FROM hosted_oauth_objects
174
+ WHERE id=$1 AND kind=$2 AND expires>$3 RETURNING id,kind,payload,expires`, sha(id), kind, now());
175
+ if (rows.length !== 1)
176
+ throw new HostedOAuthError("Expired or reused authorization", 400, "invalid_grant");
177
+ return JSON.parse(this.open(rows[0].payload));
178
+ }
179
+ async client(clientId) {
180
+ const db = await this.db();
181
+ const rows = await db.$queryRawUnsafe(`SELECT redirect_uris FROM hosted_oauth_clients WHERE id=$1`, clientId);
182
+ if (rows.length !== 1)
183
+ throw new HostedOAuthError("Unknown OAuth client", 400, "invalid_client");
184
+ return JSON.parse(rows[0].redirect_uris);
185
+ }
186
+ async upstreamToken(values) {
187
+ const headers = { "Content-Type": "application/x-www-form-urlencoded" };
188
+ values.set("client_id", this.config.clientId);
189
+ if (this.config.clientSecret)
190
+ headers.Authorization = `Basic ${Buffer.from(`${this.config.clientId}:${this.config.clientSecret}`).toString("base64")}`;
191
+ let response;
192
+ try {
193
+ response = await fetch(this.config.tokenUrl, { method: "POST", headers, body: values,
194
+ redirect: "error", signal: AbortSignal.timeout(10000) });
195
+ }
196
+ catch {
197
+ throw new HostedOAuthError("Provider token endpoint unavailable", 503, "temporarily_unavailable");
198
+ }
199
+ if (!response.ok)
200
+ throw new HostedOAuthError("Provider token exchange failed", response.status >= 500 ? 503 : 401, "invalid_grant");
201
+ let data;
202
+ try {
203
+ data = await response.json();
204
+ }
205
+ catch {
206
+ throw new HostedOAuthError("Invalid provider token response", 503, "temporarily_unavailable");
207
+ }
208
+ if (!data || typeof data.access_token !== "string" || !data.access_token ||
209
+ (data.token_type && data.token_type.toLowerCase() !== "bearer"))
210
+ throw new HostedOAuthError("Invalid provider token response", 503);
211
+ return data;
212
+ }
213
+ async profile(access) {
214
+ let response;
215
+ try {
216
+ response = await fetch(this.config.profileUrl, { headers: { Authorization: `Bearer ${access}` },
217
+ redirect: "error", signal: AbortSignal.timeout(10000) });
218
+ }
219
+ catch {
220
+ throw new HostedOAuthError("Provider profile unavailable", 503, "temporarily_unavailable");
221
+ }
222
+ if (!response.ok)
223
+ throw new HostedOAuthError("Provider profile unavailable", response.status === 401 || response.status === 403 ? 401 : 503, response.status === 401 || response.status === 403 ? "invalid_token" : "temporarily_unavailable");
224
+ let data;
225
+ try {
226
+ data = await response.json();
227
+ }
228
+ catch {
229
+ throw new HostedOAuthError("Invalid provider profile", 503, "temporarily_unavailable");
230
+ }
231
+ const rawSubject = field(data, this.config.subjectField);
232
+ const subject = typeof rawSubject === "string" ? rawSubject
233
+ : typeof rawSubject === "number" && Number.isSafeInteger(rawSubject) ? String(rawSubject) : "";
234
+ if (!subject || subject.length > 256)
235
+ throw new HostedOAuthError("Provider profile has no stable subject", 403, "access_denied");
236
+ let allowed = true;
237
+ if (this.config.requiredField) {
238
+ const actual = field(data, this.config.requiredField);
239
+ const configured = this.config.requiredValue;
240
+ let expected = configured;
241
+ try {
242
+ const parsed = JSON.parse(configured);
243
+ if (parsed === null || ["string", "number", "boolean"].includes(typeof parsed))
244
+ expected = parsed;
245
+ }
246
+ catch { /* Unquoted string values are valid configuration. */ }
247
+ allowed = actual === expected;
248
+ }
249
+ return { subject, allowed };
250
+ }
251
+ callbackUrl() { return new URL("/oauth/upstream/callback", this.config.resource).toString(); }
252
+ issuerUrl() { return this.config.resource.origin; }
253
+ metadataUrl() {
254
+ return new URL(`/.well-known/oauth-protected-resource${this.config.resource.pathname}`, this.config.resource).toString();
255
+ }
256
+ challenge(res) {
257
+ json(res, 401, { error: "unauthorized" }, { "WWW-Authenticate": `Bearer resource_metadata="${this.metadataUrl()}", scope="modlens"` });
258
+ }
259
+ async authenticate(req) {
260
+ for (const name of Object.keys(req.headers))
261
+ if (name.startsWith("x-modlens-"))
262
+ throw new HostedOAuthError("Gateway headers are not accepted in OAuth mode", 401, "invalid_token");
263
+ const value = req.headers.authorization;
264
+ if (typeof value !== "string" || !/^Bearer m[a-z]+_[A-Za-z0-9_-]{43}$/.test(value))
265
+ throw new HostedOAuthError("Bearer token required", 401, "invalid_token");
266
+ const raw = value.slice(7);
267
+ const db = await this.db();
268
+ const rows = await db.$queryRawUnsafe(`SELECT g.*, a.expires AS access_expires FROM hosted_oauth_access a
269
+ JOIN hosted_oauth_grants g ON g.id=a.grant_id WHERE a.token_hash=$1 AND a.expires>$2`, sha(raw), now());
270
+ if (rows.length !== 1 || rows[0].resource !== this.config.resource.toString())
271
+ throw new HostedOAuthError("Invalid access token", 401, "invalid_token");
272
+ const grant = rows[0];
273
+ if (Number(grant.upstream_expires) <= now())
274
+ throw new HostedOAuthError("Access token expired", 401, "invalid_token");
275
+ try {
276
+ const profile = await this.profile(this.open(grant.upstream_access));
277
+ if (!profile.allowed || profile.subject !== grant.subject) {
278
+ await this.revoke(grant.id);
279
+ throw new HostedOAuthError("Account access denied", 403, "access_denied");
280
+ }
281
+ }
282
+ catch (error) {
283
+ if (error instanceof HostedOAuthError && error.status === 401)
284
+ await this.revoke(grant.id);
285
+ throw error;
286
+ }
287
+ return sha(this.config.issuer + "\0" + grant.subject);
288
+ }
289
+ async revoke(id) {
290
+ const db = await this.db();
291
+ await db.$executeRawUnsafe(`DELETE FROM hosted_oauth_access WHERE grant_id=$1`, id);
292
+ await db.$executeRawUnsafe(`DELETE FROM hosted_oauth_grants WHERE id=$1`, id);
293
+ }
294
+ async issue(grant) {
295
+ const rawAccess = token("mla_");
296
+ const expires = Math.max(1, Math.min(300, Number(grant.upstream_expires) - now() - 5));
297
+ const db = await this.db();
298
+ await db.$executeRawUnsafe(`INSERT INTO hosted_oauth_access (token_hash,grant_id,expires) VALUES ($1,$2,$3)`, sha(rawAccess), grant.id, now() + expires);
299
+ return { access_token: rawAccess, token_type: "Bearer", expires_in: expires, scope: "modlens" };
300
+ }
301
+ limit(req, route, maximum) {
302
+ const minute = Math.floor(now() / 60);
303
+ const key = `${route}:${req.socket.remoteAddress ?? "unknown"}`;
304
+ const entry = this.requestCounts.get(key);
305
+ const count = entry?.minute === minute ? entry.count + 1 : 1;
306
+ this.requestCounts.set(key, { minute, count });
307
+ if (this.requestCounts.size > 10000) {
308
+ for (const [id, value] of this.requestCounts)
309
+ if (value.minute !== minute)
310
+ this.requestCounts.delete(id);
311
+ }
312
+ if (count > maximum)
313
+ throw new HostedOAuthError("Too many authorization requests", 429, "slow_down");
314
+ }
315
+ async handle(req, res, url) {
316
+ const route = url.pathname;
317
+ if (route === this.metadataUrlPath() || route === "/.well-known/oauth-protected-resource") {
318
+ if (req.method !== "GET")
319
+ throw new HostedOAuthError("Method not allowed", 405);
320
+ json(res, 200, { resource: this.config.resource.toString(), authorization_servers: [this.issuerUrl()],
321
+ scopes_supported: ["modlens"], bearer_methods_supported: ["header"] });
322
+ return true;
323
+ }
324
+ if (route === "/.well-known/oauth-authorization-server") {
325
+ if (req.method !== "GET")
326
+ throw new HostedOAuthError("Method not allowed", 405);
327
+ json(res, 200, { issuer: this.issuerUrl(), authorization_endpoint: this.issuerUrl() + "/oauth/authorize",
328
+ token_endpoint: this.issuerUrl() + "/oauth/token", registration_endpoint: this.issuerUrl() + "/oauth/register",
329
+ revocation_endpoint: this.issuerUrl() + "/oauth/revoke", response_types_supported: ["code"],
330
+ grant_types_supported: ["authorization_code", "refresh_token"], code_challenge_methods_supported: ["S256"],
331
+ token_endpoint_auth_methods_supported: ["none"], scopes_supported: ["modlens"],
332
+ authorization_response_iss_parameter_supported: true });
333
+ return true;
334
+ }
335
+ if (route === "/oauth/register" && req.method === "POST") {
336
+ this.limit(req, route, 120);
337
+ let registration;
338
+ try {
339
+ registration = JSON.parse(await body(req));
340
+ }
341
+ catch {
342
+ throw new HostedOAuthError("Invalid client registration");
343
+ }
344
+ const redirects = registration.redirect_uris;
345
+ if (!Array.isArray(redirects) || redirects.length < 1 || redirects.length > 10 ||
346
+ !redirects.every(value => typeof value === "string" && callbackSafe(value)) ||
347
+ (registration.token_endpoint_auth_method && registration.token_endpoint_auth_method !== "none"))
348
+ throw new HostedOAuthError("Invalid client registration");
349
+ const id = token("mlc_");
350
+ const db = await this.db();
351
+ await db.$executeRawUnsafe(`INSERT INTO hosted_oauth_clients (id,redirect_uris,created) VALUES ($1,$2,$3)`, id, JSON.stringify(redirects), now());
352
+ json(res, 201, { client_id: id, redirect_uris: redirects, grant_types: ["authorization_code", "refresh_token"],
353
+ response_types: ["code"], token_endpoint_auth_method: "none" });
354
+ return true;
355
+ }
356
+ if (route === "/oauth/authorize" && req.method === "GET") {
357
+ this.limit(req, route, 600);
358
+ const params = url.searchParams;
359
+ uniqueQuery(params);
360
+ const clientId = required(params, "client_id");
361
+ const redirects = await this.client(clientId);
362
+ const callback = required(params, "redirect_uri");
363
+ if (!redirects.includes(callback))
364
+ throw new HostedOAuthError("Unregistered redirect URI");
365
+ if (params.get("response_type") !== "code" || params.get("code_challenge_method") !== "S256" ||
366
+ !/^[A-Za-z0-9_-]{43}$/.test(required(params, "code_challenge")))
367
+ throw new HostedOAuthError("Authorization code with S256 PKCE required");
368
+ const resource = params.get("resource") ?? this.config.resource.toString();
369
+ if (resource !== this.config.resource.toString())
370
+ throw new HostedOAuthError("Invalid resource");
371
+ const scope = params.get("scope") ?? "modlens";
372
+ if (scope !== "modlens")
373
+ throw new HostedOAuthError("Unsupported scope", 400, "invalid_scope");
374
+ const verifier = randomBytes(32).toString("base64url");
375
+ const state = await this.putObject("state", { clientId, callback, resource,
376
+ challenge: params.get("code_challenge"), clientState: params.get("state") ?? "", verifier }, 600);
377
+ const upstream = new URL(this.config.authorizeUrl);
378
+ upstream.searchParams.set("response_type", "code");
379
+ upstream.searchParams.set("client_id", this.config.clientId);
380
+ upstream.searchParams.set("redirect_uri", this.callbackUrl());
381
+ upstream.searchParams.set("scope", this.config.scopes);
382
+ upstream.searchParams.set("state", state);
383
+ upstream.searchParams.set("code_challenge", challenge(verifier));
384
+ upstream.searchParams.set("code_challenge_method", "S256");
385
+ redirect(res, upstream);
386
+ return true;
387
+ }
388
+ if (route === "/oauth/upstream/callback" && req.method === "GET") {
389
+ uniqueQuery(url.searchParams);
390
+ const state = await this.takeObject(required(url.searchParams, "state"), "state");
391
+ const callback = new URL(state.callback);
392
+ if (url.searchParams.has("error")) {
393
+ callback.searchParams.set("error", url.searchParams.get("error") ?? "access_denied");
394
+ }
395
+ else {
396
+ const reportedIssuer = url.searchParams.get("iss");
397
+ if ((this.config.requiresIss && !reportedIssuer) ||
398
+ (reportedIssuer && reportedIssuer !== this.config.issuer))
399
+ throw new HostedOAuthError("Provider issuer mismatch", 400, "invalid_grant");
400
+ const values = new URLSearchParams({ grant_type: "authorization_code", code: required(url.searchParams, "code"),
401
+ redirect_uri: this.callbackUrl(), code_verifier: state.verifier });
402
+ const upstream = await this.upstreamToken(values);
403
+ const profile = await this.profile(upstream.access_token);
404
+ if (!profile.allowed)
405
+ throw new HostedOAuthError("Account access denied", 403, "access_denied");
406
+ const approval = await this.putObject("approval", { ...state, upstream, subject: profile.subject }, 600);
407
+ const destination = callback.origin.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll('"', "&quot;");
408
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8", "Cache-Control": "no-store",
409
+ "Referrer-Policy": "no-referrer", "Content-Security-Policy": "default-src 'none'; style-src 'unsafe-inline'; form-action 'self'; base-uri 'none'; frame-ancestors 'none'" });
410
+ res.end(`<!doctype html><html><meta charset="utf-8"><title>Connect to ModLens</title><body><h1>Connect to ModLens</h1><p>Allow the application at <strong>${destination}</strong> to use your hosted ModLens access?</p><form method="post" action="/oauth/approve"><input type="hidden" name="approval" value="${approval}"><button name="decision" value="allow">Allow</button><button name="decision" value="deny">Deny</button></form></body></html>`);
411
+ return true;
412
+ }
413
+ if (state.clientState)
414
+ callback.searchParams.set("state", state.clientState);
415
+ callback.searchParams.set("iss", this.issuerUrl());
416
+ redirect(res, callback);
417
+ return true;
418
+ }
419
+ if (route === "/oauth/approve" && req.method === "POST") {
420
+ const params = form(await body(req));
421
+ const approval = await this.takeObject(required(params, "approval"), "approval");
422
+ const callback = new URL(approval.callback);
423
+ if (params.get("decision") === "allow") {
424
+ const code = await this.putObject("code", approval, 60);
425
+ callback.searchParams.set("code", code);
426
+ }
427
+ else
428
+ callback.searchParams.set("error", "access_denied");
429
+ if (approval.clientState)
430
+ callback.searchParams.set("state", approval.clientState);
431
+ callback.searchParams.set("iss", this.issuerUrl());
432
+ redirect(res, callback);
433
+ return true;
434
+ }
435
+ if (route === "/oauth/token" && req.method === "POST") {
436
+ const params = form(await body(req));
437
+ const clientId = required(params, "client_id");
438
+ await this.client(clientId);
439
+ const grantType = required(params, "grant_type");
440
+ if (grantType === "authorization_code") {
441
+ const code = await this.takeObject(required(params, "code"), "code");
442
+ if (code.clientId !== clientId || code.callback !== required(params, "redirect_uri") ||
443
+ challenge(required(params, "code_verifier")) !== code.challenge ||
444
+ (params.has("resource") && params.get("resource") !== code.resource))
445
+ throw new HostedOAuthError("Authorization code binding failed", 400, "invalid_grant");
446
+ const grantId = token("mlg_");
447
+ const refresh = code.upstream.refresh_token ? token("mlr_") : undefined;
448
+ const grant = { id: grantId, client_id: clientId, subject: code.subject, resource: code.resource,
449
+ upstream_access: this.seal(code.upstream.access_token),
450
+ upstream_refresh: code.upstream.refresh_token ? this.seal(code.upstream.refresh_token) : null,
451
+ upstream_expires: now() + Math.max(1, Math.min(86400, Number(code.upstream.expires_in) || 300)),
452
+ refresh_hash: refresh ? sha(refresh) : null, refresh_expires: now() + 30 * 86400 };
453
+ const db = await this.db();
454
+ await db.$executeRawUnsafe(`INSERT INTO hosted_oauth_grants (id,client_id,subject,resource,upstream_access,upstream_refresh,
455
+ upstream_expires,refresh_hash,refresh_expires) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9)`, grant.id, grant.client_id, grant.subject, grant.resource, grant.upstream_access, grant.upstream_refresh, grant.upstream_expires, grant.refresh_hash, grant.refresh_expires);
456
+ json(res, 200, { ...await this.issue(grant), ...(refresh ? { refresh_token: refresh } : {}) });
457
+ return true;
458
+ }
459
+ if (grantType === "refresh_token") {
460
+ if (params.has("resource") && params.get("resource") !== this.config.resource.toString())
461
+ throw new HostedOAuthError("Wrong resource", 400, "invalid_grant");
462
+ if (params.has("scope") && params.get("scope") !== "modlens")
463
+ throw new HostedOAuthError("Unsupported scope", 400, "invalid_scope");
464
+ const raw = required(params, "refresh_token");
465
+ const db = await this.db();
466
+ const rows = await db.$queryRawUnsafe(`UPDATE hosted_oauth_grants SET refresh_hash=NULL
467
+ WHERE refresh_hash=$1 AND client_id=$2 AND refresh_expires>$3 RETURNING *`, sha(raw), clientId, now());
468
+ if (rows.length !== 1 || !rows[0].upstream_refresh)
469
+ throw new HostedOAuthError("Invalid refresh token", 400, "invalid_grant");
470
+ const grant = rows[0];
471
+ try {
472
+ const oldUpstreamRefresh = grant.upstream_refresh;
473
+ const upstream = await this.upstreamToken(new URLSearchParams({ grant_type: "refresh_token",
474
+ refresh_token: this.open(oldUpstreamRefresh) }));
475
+ grant.upstream_access = this.seal(upstream.access_token);
476
+ grant.upstream_refresh = this.seal(upstream.refresh_token ?? this.open(oldUpstreamRefresh));
477
+ grant.upstream_expires = now() + Math.max(1, Math.min(86400, Number(upstream.expires_in) || 300));
478
+ await db.$executeRawUnsafe(`UPDATE hosted_oauth_grants SET upstream_access=$2,upstream_refresh=$3,
479
+ upstream_expires=$4 WHERE id=$1`, grant.id, grant.upstream_access, grant.upstream_refresh, grant.upstream_expires);
480
+ const profile = await this.profile(upstream.access_token);
481
+ if (profile.subject !== grant.subject || !profile.allowed)
482
+ throw new HostedOAuthError("Account access denied", 403, "access_denied");
483
+ const next = token("mlr_");
484
+ grant.refresh_hash = sha(next);
485
+ await db.$executeRawUnsafe(`UPDATE hosted_oauth_grants SET refresh_hash=$2 WHERE id=$1`, grant.id, grant.refresh_hash);
486
+ json(res, 200, { ...await this.issue(grant), refresh_token: next });
487
+ }
488
+ catch (error) {
489
+ if (error instanceof HostedOAuthError && error.status === 503) {
490
+ await db.$executeRawUnsafe(`UPDATE hosted_oauth_grants SET refresh_hash=$2 WHERE id=$1 AND refresh_hash IS NULL`, grant.id, sha(raw));
491
+ }
492
+ else
493
+ await this.revoke(grant.id);
494
+ throw error;
495
+ }
496
+ return true;
497
+ }
498
+ throw new HostedOAuthError("Unsupported grant type", 400, "unsupported_grant_type");
499
+ }
500
+ if (route === "/oauth/revoke" && req.method === "POST") {
501
+ const params = form(await body(req));
502
+ const clientId = required(params, "client_id");
503
+ await this.client(clientId);
504
+ const raw = required(params, "token");
505
+ const db = await this.db();
506
+ const rows = await db.$queryRawUnsafe(`SELECT id FROM hosted_oauth_grants WHERE client_id=$1 AND refresh_hash=$2`, clientId, sha(raw));
507
+ if (rows.length)
508
+ await this.revoke(rows[0].id);
509
+ else {
510
+ const access = await db.$queryRawUnsafe(`SELECT g.id FROM hosted_oauth_access a JOIN hosted_oauth_grants g ON g.id=a.grant_id
511
+ WHERE g.client_id=$1 AND a.token_hash=$2`, clientId, sha(raw));
512
+ if (access.length)
513
+ await this.revoke(access[0].id);
514
+ }
515
+ json(res, 200, {});
516
+ return true;
517
+ }
518
+ return false;
519
+ }
520
+ metadataUrlPath() { return new URL(this.metadataUrl()).pathname; }
521
+ }
522
+ //# sourceMappingURL=hosted-oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-oauth.js","sourceRoot":"","sources":["../src/hosted-oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { IncomingHttpHeaders } from "node:http";
2
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
3
+ export interface HostedLimits {
4
+ lines: number;
5
+ responseBytes: number;
6
+ dailyBytes: number;
7
+ periodBytes: number;
8
+ dailyRequests: number;
9
+ minuteRequests: number;
10
+ }
11
+ export declare function hostedLimits(env?: NodeJS.ProcessEnv): HostedLimits;
12
+ export declare class HostedPolicyError extends Error {
13
+ }
14
+ /** Only an authenticated gateway may choose the stable account identifier. */
15
+ export declare function hostedPrincipal(headers: IncomingHttpHeaders, secret?: string): string;
16
+ /** Team claims are accepted only from the authenticated gateway. */
17
+ export declare function hostedMinecraftSourceTeams(env?: NodeJS.ProcessEnv, secret?: string): Set<string>;
18
+ export declare function hostedMinecraftSourceAccess(headers: IncomingHttpHeaders, teams: ReadonlySet<string>): boolean;
19
+ export declare const HOSTED_ACTIONS: Record<string, readonly string[]>;
20
+ export declare function hostedActions(tool: string, allowMinecraftSource?: boolean): readonly string[] | undefined;
21
+ export declare function prepareHostedArgs(tool: string, input: Record<string, unknown>, limits: HostedLimits, allowMinecraftSource?: boolean): Record<string, unknown>;
22
+ export interface BudgetDatabase {
23
+ $executeRawUnsafe(query: string, ...values: any[]): Promise<number>;
24
+ $queryRawUnsafe<T>(query: string, ...values: any[]): Promise<T>;
25
+ }
26
+ /** Atomic shared-database accounting: session churn, parallel calls and restarts do not reset it. */
27
+ export declare class HostedBudget {
28
+ private database;
29
+ private now;
30
+ private ready?;
31
+ constructor(database?: () => Promise<BudgetDatabase>, now?: () => number);
32
+ charge(subject: string, limits: HostedLimits, requests: number, bytes: number): Promise<void>;
33
+ }
34
+ export declare function boundHostedResult(tool: string, args: Record<string, unknown>, result: CallToolResult, limits: HostedLimits, allowMinecraftSource?: boolean): CallToolResult;
35
+ export declare function runHostedTool(tool: string, input: Record<string, unknown>, subject: string, limits: HostedLimits, budget: HostedBudget, run: (args: Record<string, unknown>) => Promise<CallToolResult>, allowMinecraftSource?: boolean): Promise<CallToolResult>;
36
+ //# sourceMappingURL=hosted-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-policy.d.ts","sourceRoot":"","sources":["../src/hosted-policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAIzE,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,YAAY,CAiB/E;AAED,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAE/C,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,OAAO,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAUrF;AAED,oEAAoE;AACpE,wBAAgB,0BAA0B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAQ7G;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAG7G;AAID,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CA2B5D,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,oBAAoB,UAAQ,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAIvG;AAQD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,oBAAoB,UAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6C3J;AAED,MAAM,WAAW,cAAc;IAC3B,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpE,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACnE;AAED,qGAAqG;AACrG,qBAAa,YAAY;IAET,OAAO,CAAC,QAAQ;IAAyC,OAAO,CAAC,GAAG;IADhF,OAAO,CAAC,KAAK,CAAC,CAAgB;gBACV,QAAQ,GAAE,MAAM,OAAO,CAAC,cAAc,CAAS,EAAU,GAAG,eAAW;IAErF,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA6BtG;AAKD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EACvH,oBAAoB,UAAQ,GAAG,cAAc,CAuGhD;AAMD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAC7F,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,cAAc,CAAC,EAC3G,oBAAoB,UAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAoBzD"}