@celsoft/platform 0.11.0 → 0.12.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.
- package/dist/config.d.ts +1 -0
- package/dist/config.js +3 -1
- package/dist/config.js.map +1 -1
- package/dist/runtime/auth.d.ts +2782 -0
- package/dist/runtime/auth.js +19 -3
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/guard.js +5 -0
- package/dist/runtime/guard.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.js +41 -2
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/mcp.d.ts +11 -0
- package/dist/runtime/mcp.js +61 -0
- package/dist/runtime/mcp.js.map +1 -0
- package/dist/runtime/screens.d.ts +1 -1
- package/dist/runtime/screens.js +45 -5
- package/dist/runtime/screens.js.map +1 -1
- package/dist/schema.d.ts +5119 -485
- package/dist/schema.js +171 -2
- package/dist/schema.js.map +1 -1
- package/dist/wrangler-config.js +2 -2
- package/dist/wrangler-config.js.map +1 -1
- package/package.json +4 -1
- package/schema.json +5 -0
package/dist/runtime/auth.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { betterAuth } from "better-auth";
|
|
2
2
|
import { drizzleAdapter } from "better-auth/adapters/drizzle";
|
|
3
|
-
import {
|
|
3
|
+
import { mcp } from "@better-auth/mcp";
|
|
4
|
+
import { admin, jwt, organization } from "better-auth/plugins";
|
|
4
5
|
import { adminAc, userAc } from "better-auth/plugins/admin/access";
|
|
5
6
|
import { sql } from "drizzle-orm";
|
|
6
7
|
import { authSchema } from "../schema.js";
|
|
@@ -12,6 +13,8 @@ export function createAuth({ db, secret, baseURL, email, requireVerification })
|
|
|
12
13
|
baseURL,
|
|
13
14
|
basePath: AUTH_PATH,
|
|
14
15
|
database: drizzleAdapter(db, { provider: "pg", schema: authSchema }),
|
|
16
|
+
// The JWT plugin's session-to-token route is not part of the platform.
|
|
17
|
+
disabledPaths: ["/token"],
|
|
15
18
|
// Postgres fills every id with uuidv7(), so Better Auth leaves the column out.
|
|
16
19
|
advanced: { database: { generateId: "uuid" } },
|
|
17
20
|
// The Workers rate limiting binding guards these routes before Better Auth sees them.
|
|
@@ -45,8 +48,8 @@ export function createAuth({ db, secret, baseURL, email, requireVerification })
|
|
|
45
48
|
},
|
|
46
49
|
},
|
|
47
50
|
},
|
|
48
|
-
// Always installed so
|
|
49
|
-
// unless platform.jsonc turns organizations on.
|
|
51
|
+
// Always installed so their tables and types never change; the runtime hides their routes
|
|
52
|
+
// unless platform.jsonc turns organizations or MCP on.
|
|
50
53
|
plugins: [
|
|
51
54
|
admin({ defaultRole: "user", adminRoles: [OWNER_ROLE, "admin"], roles: { [OWNER_ROLE]: adminAc, admin: adminAc, user: userAc } }),
|
|
52
55
|
organization({
|
|
@@ -59,6 +62,19 @@ export function createAuth({ db, secret, baseURL, email, requireVerification })
|
|
|
59
62
|
});
|
|
60
63
|
},
|
|
61
64
|
}),
|
|
65
|
+
// The OAuth server AI clients sign in through to reach the app's MCP endpoints; its tokens
|
|
66
|
+
// are JWTs bound to the app's /mcp, signed with keys the JWT plugin keeps.
|
|
67
|
+
jwt(),
|
|
68
|
+
mcp({
|
|
69
|
+
loginPage: "/login",
|
|
70
|
+
consentPage: "/consent",
|
|
71
|
+
resource: `${baseURL}/mcp`,
|
|
72
|
+
scopes: ["openid", "profile", "email", "offline_access"],
|
|
73
|
+
allowDynamicClientRegistration: true,
|
|
74
|
+
allowUnauthenticatedClientRegistration: true,
|
|
75
|
+
// Clients that leave out their type are judged by their redirect URIs, so local ones work.
|
|
76
|
+
clientRegistrationDefaultApplicationType: "infer",
|
|
77
|
+
}),
|
|
62
78
|
],
|
|
63
79
|
});
|
|
64
80
|
}
|
package/dist/runtime/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/runtime/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/runtime/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/guard.js
CHANGED
|
@@ -2,11 +2,16 @@ import { AUTH_PATH } from "./auth.js";
|
|
|
2
2
|
export const PUBLIC_API = "/api/public/";
|
|
3
3
|
const FORM_TYPES = ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"];
|
|
4
4
|
const UNSAFE = ["POST", "PUT", "PATCH", "DELETE"];
|
|
5
|
+
// OAuth endpoints AI clients post forms to directly; they prove themselves with a code or token,
|
|
6
|
+
// never a cookie, so a forged browser form gains nothing.
|
|
7
|
+
const OAUTH_FORM_PATHS = ["/oauth2/token", "/oauth2/revoke", "/oauth2/introspect"].map((p) => `${AUTH_PATH}${p}`);
|
|
5
8
|
// A browser sends any site's form to any other without asking, cookies included; it always
|
|
6
9
|
// sends an Origin with it, so a missing or foreign one is refused.
|
|
7
10
|
export function isCrossSiteForm(request, url) {
|
|
8
11
|
if (!UNSAFE.includes(request.method))
|
|
9
12
|
return false;
|
|
13
|
+
if (OAUTH_FORM_PATHS.includes(url.pathname))
|
|
14
|
+
return false;
|
|
10
15
|
const type = request.headers.get("content-type")?.split(";", 1)[0].trim().toLowerCase() ?? "";
|
|
11
16
|
if (!FORM_TYPES.includes(type))
|
|
12
17
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/runtime/guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,CAAC,MAAM,UAAU,GAAG,cAAc,CAAC;AAEzC,MAAM,UAAU,GAAG,CAAC,mCAAmC,EAAE,qBAAqB,EAAE,YAAY,CAAC,CAAC;AAC9F,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAElD,2FAA2F;AAC3F,mEAAmE;AACnE,MAAM,UAAU,eAAe,CAAC,OAAgB,EAAE,GAAQ;IACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/F,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC;AACtD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,8FAA8F;IAC9F,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,SAAS,GAAG,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;AACzH,CAAC;AAMD,qEAAqE;AACrE,MAAM,OAAO,GAAmC;IAC9C,CAAC,GAAG,SAAS,gBAAgB,CAAC,EAAE,OAAO;IACvC,CAAC,GAAG,SAAS,yBAAyB,CAAC,EAAE,OAAO;IAChD,CAAC,GAAG,SAAS,iBAAiB,CAAC,EAAE,IAAI;IACrC,CAAC,GAAG,SAAS,gBAAgB,CAAC,EAAE,IAAI;CACrC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAgB,EAAE,QAAgB,EAAE,OAAgC;IACpG,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7B,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,SAAS,CAAC;IACnE,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAwB,CAAC;QACrF,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChF,CAAC;IACD,OAAO,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,QAAQ,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AAC3E,CAAC"}
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/runtime/guard.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/index.d.ts
CHANGED
package/dist/runtime/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { apiHandler } from "./endpoints.js";
|
|
|
6
6
|
import { createFiles } from "./files.js";
|
|
7
7
|
import { isCrossSiteForm, needsSession, rateLimited } from "./guard.js";
|
|
8
8
|
import { anyMessage, CLIENT_PATH, clientScript, createLive, joinRoom, LIVE_PATH, liveRoom } from "./live.js";
|
|
9
|
+
import { MCP_PATH, mcpChallenge, mcpUserId, serveMcp, WELL_KNOWN } from "./mcp.js";
|
|
9
10
|
import { isScreen, renderScreen } from "./screens.js";
|
|
10
11
|
export { EndpointError } from "./endpoint-error.js";
|
|
11
12
|
export { endpoint } from "./endpoints.js";
|
|
@@ -41,6 +42,11 @@ export function defineApp(handler, options = {}) {
|
|
|
41
42
|
const live = await liveRoute(request, url, env, app, options);
|
|
42
43
|
if (live)
|
|
43
44
|
return live;
|
|
45
|
+
if (env.MCP === "on" && env.BETTER_AUTH_SECRET) {
|
|
46
|
+
const answered = await mcpRoute(request, url, env, ctx, app, options);
|
|
47
|
+
if (answered)
|
|
48
|
+
return answered;
|
|
49
|
+
}
|
|
44
50
|
if (env.BETTER_AUTH_SECRET) {
|
|
45
51
|
const platform = await platformRoute(request, url, env, app, options);
|
|
46
52
|
if (platform)
|
|
@@ -80,7 +86,9 @@ export function defineApp(handler, options = {}) {
|
|
|
80
86
|
}, check),
|
|
81
87
|
};
|
|
82
88
|
}
|
|
83
|
-
function createContext(request, env, ctx, options
|
|
89
|
+
function createContext(request, env, ctx, options,
|
|
90
|
+
// Set when the caller is already known, as for an MCP client signed in with a token.
|
|
91
|
+
knownSession) {
|
|
84
92
|
const openPool = options.pool ?? defaultPool;
|
|
85
93
|
let pool;
|
|
86
94
|
let db;
|
|
@@ -117,7 +125,7 @@ function createContext(request, env, ctx, options) {
|
|
|
117
125
|
return (live ??= createLive(env.LIVE, env.LIVE_ROOMS === "on", messageCheck(options.live?.message)));
|
|
118
126
|
},
|
|
119
127
|
session() {
|
|
120
|
-
return (session ??= env.BETTER_AUTH_SECRET ? app.auth.api.getSession({ headers: request.headers }) : Promise.resolve(null));
|
|
128
|
+
return (session ??= knownSession ? knownSession() : env.BETTER_AUTH_SECRET ? app.auth.api.getSession({ headers: request.headers }) : Promise.resolve(null));
|
|
121
129
|
},
|
|
122
130
|
async requireUser() {
|
|
123
131
|
const current = await app.session();
|
|
@@ -129,6 +137,33 @@ function createContext(request, env, ctx, options) {
|
|
|
129
137
|
};
|
|
130
138
|
return { app, close: () => void (pool && ctx.waitUntil(pool.end())) };
|
|
131
139
|
}
|
|
140
|
+
// The OAuth server's routes, which exist only for MCP.
|
|
141
|
+
const MCP_AUTH_PATHS = ["/oauth2/", "/admin/oauth2/", "/jwks", "/.well-known/"];
|
|
142
|
+
// MCP for AI clients: OAuth discovery under /.well-known/, and /mcp, where each call runs as the
|
|
143
|
+
// user its token was issued to.
|
|
144
|
+
async function mcpRoute(request, url, env, ctx, app, options) {
|
|
145
|
+
if (url.pathname.startsWith(WELL_KNOWN))
|
|
146
|
+
return app.auth.handler(request);
|
|
147
|
+
if (url.pathname !== MCP_PATH)
|
|
148
|
+
return undefined;
|
|
149
|
+
const origin = env.APP_URL ?? url.origin;
|
|
150
|
+
const userId = await mcpUserId(request, app.auth, `${origin}${MCP_PATH}`);
|
|
151
|
+
if (!userId)
|
|
152
|
+
return mcpChallenge(origin);
|
|
153
|
+
const known = async () => {
|
|
154
|
+
const user = await (await app.auth.$context).internalAdapter.findUserById(userId);
|
|
155
|
+
return user ? { user, session: { id: "mcp", userId, token: "", expiresAt: new Date(Date.now() + 60_000), createdAt: new Date(), updatedAt: new Date() } } : null;
|
|
156
|
+
};
|
|
157
|
+
const { app: asUser, close } = createContext(request, env, ctx, options, known);
|
|
158
|
+
try {
|
|
159
|
+
if (!(await asUser.session()))
|
|
160
|
+
return mcpChallenge(origin);
|
|
161
|
+
return await serveMcp(request, asUser, env.APP_NAME ?? url.hostname, options.endpoints ?? {});
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
close();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
132
167
|
// Live rooms answer for themselves: the browser client, and joining a room once the app agrees.
|
|
133
168
|
async function liveRoute(request, url, env, app, options) {
|
|
134
169
|
if (!url.pathname.startsWith(LIVE_PATH) || env.LIVE_ROOMS !== "on" || !env.LIVE)
|
|
@@ -146,12 +181,16 @@ async function liveRoute(request, url, env, app, options) {
|
|
|
146
181
|
// check in front of every private /api route.
|
|
147
182
|
async function platformRoute(request, url, env, app, options) {
|
|
148
183
|
const path = url.pathname;
|
|
184
|
+
if (path === "/consent" && env.MCP !== "on")
|
|
185
|
+
return undefined;
|
|
149
186
|
if (request.method === "GET" && isScreen(path))
|
|
150
187
|
return renderScreen(path, env.APP_NAME ?? url.hostname, options.screens?.stylesheet);
|
|
151
188
|
if (await rateLimited(request, path, env.AUTH_LIMIT))
|
|
152
189
|
return json({ error: "too many attempts; wait a minute" }, 429);
|
|
153
190
|
if (path.startsWith(`${AUTH_PATH}/organization/`) && env.AUTH_ORGANIZATIONS !== "on")
|
|
154
191
|
return json({ error: "not found" }, 404);
|
|
192
|
+
if (env.MCP !== "on" && MCP_AUTH_PATHS.some((p) => path.startsWith(`${AUTH_PATH}${p}`)))
|
|
193
|
+
return json({ error: "not found" }, 404);
|
|
155
194
|
if (path.startsWith(`${AUTH_PATH}/`))
|
|
156
195
|
return app.auth.handler(request);
|
|
157
196
|
if (needsSession(path))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAa,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAkC,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,UAAU,EAAiB,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAkC,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAoB,MAAM,YAAY,CAAC;AAE1F,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAoD,MAAM,WAAW,CAAC;AAE/J,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAkE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { Auth } from "./auth.js";
|
|
3
|
+
import type { Endpoint } from "./endpoints.js";
|
|
4
|
+
export declare const MCP_PATH = "/mcp";
|
|
5
|
+
export declare const WELL_KNOWN = "/.well-known/";
|
|
6
|
+
export declare const servesMcp: (e: {
|
|
7
|
+
serve?: readonly string[];
|
|
8
|
+
}) => boolean;
|
|
9
|
+
export declare function mcpUserId(request: Request, auth: Auth, resource: string): Promise<string | undefined>;
|
|
10
|
+
export declare function mcpChallenge(origin: string): Response;
|
|
11
|
+
export declare function serveMcp<App>(request: Request, app: App, name: string, endpoints: Record<string, Endpoint<z.ZodType, z.ZodType, App>>): Promise<Response>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
|
|
3
|
+
import { verifyJwsAccessToken } from "better-auth/oauth2";
|
|
4
|
+
import { EndpointError } from "./endpoint-error.js";
|
|
5
|
+
export const MCP_PATH = "/mcp";
|
|
6
|
+
export const WELL_KNOWN = "/.well-known/";
|
|
7
|
+
export const servesMcp = (e) => (e.serve ?? ["api"]).includes("mcp");
|
|
8
|
+
// The access token's subject, verified against the app's own signing keys, read from its database
|
|
9
|
+
// rather than fetched over the network, since a Worker cannot fetch its own hostname.
|
|
10
|
+
export async function mcpUserId(request, auth, resource) {
|
|
11
|
+
const token = /^Bearer (.+)$/i.exec(request.headers.get("authorization") ?? "")?.[1];
|
|
12
|
+
if (!token)
|
|
13
|
+
return undefined;
|
|
14
|
+
const { baseURL } = await auth.$context;
|
|
15
|
+
try {
|
|
16
|
+
const claims = await verifyJwsAccessToken(token, {
|
|
17
|
+
jwksFetch: async () => (await auth.api.getJwks()),
|
|
18
|
+
verifyOptions: { issuer: baseURL, audience: resource, requiredClaims: ["azp", "sub"] },
|
|
19
|
+
});
|
|
20
|
+
return typeof claims.sub === "string" ? claims.sub : undefined;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// RFC 9728: tells an MCP client where to find out how to sign in.
|
|
27
|
+
export function mcpChallenge(origin) {
|
|
28
|
+
return Response.json({ jsonrpc: "2.0", error: { code: -32001, message: "sign in first" }, id: null }, { status: 401, headers: { "www-authenticate": `Bearer resource_metadata="${origin}${WELL_KNOWN}oauth-protected-resource${MCP_PATH}"` } });
|
|
29
|
+
}
|
|
30
|
+
// A stateless MCP server: each request lists or calls the app's MCP endpoints as tools, with the
|
|
31
|
+
// same checks the API applies, and a failure reported as a tool error, as MCP asks.
|
|
32
|
+
export async function serveMcp(request, app, name, endpoints) {
|
|
33
|
+
const server = new McpServer({ name, version: "1.0.0" });
|
|
34
|
+
for (const [tool, e] of Object.entries(endpoints)) {
|
|
35
|
+
if (!servesMcp(e))
|
|
36
|
+
continue;
|
|
37
|
+
// The SDK's types expect its own Zod shape; the app's Zod 4 object schema is what it validates against.
|
|
38
|
+
const register = server.registerTool.bind(server);
|
|
39
|
+
register(tool, { description: e.description ?? tool, inputSchema: e.input }, async (args) => {
|
|
40
|
+
try {
|
|
41
|
+
const output = e.output.parse(await e.handler(args, app));
|
|
42
|
+
return { content: [{ type: "text", text: JSON.stringify(output) }] };
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
return { isError: true, content: [{ type: "text", text: await toolError(tool, error) }] };
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const transport = new WebStandardStreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true });
|
|
50
|
+
await server.connect(transport);
|
|
51
|
+
return transport.handleRequest(request);
|
|
52
|
+
}
|
|
53
|
+
async function toolError(tool, error) {
|
|
54
|
+
if (error instanceof EndpointError)
|
|
55
|
+
return error.message;
|
|
56
|
+
if (error instanceof Response)
|
|
57
|
+
return (await error.json().catch(() => ({}))).error ?? error.statusText;
|
|
58
|
+
console.error(`MCP tool ${tool} failed`, error);
|
|
59
|
+
return "the tool failed; see the app's logs";
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/runtime/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const SCREEN_PATHS: readonly ["/login", "/signup", "/forgot", "/reset"];
|
|
1
|
+
export declare const SCREEN_PATHS: readonly ["/login", "/signup", "/forgot", "/reset", "/consent"];
|
|
2
2
|
export type ScreenPath = (typeof SCREEN_PATHS)[number];
|
|
3
3
|
export declare function isScreen(pathname: string): pathname is ScreenPath;
|
|
4
4
|
export declare function renderScreen(path: ScreenPath, appName: string, stylesheet: string | undefined): Response;
|
package/dist/runtime/screens.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Sign-in, sign-up and password screens every app with auth gets. Class names are part of the
|
|
2
2
|
// public interface: an app restyles them with its own stylesheet, loaded after this one.
|
|
3
|
-
export const SCREEN_PATHS = ["/login", "/signup", "/forgot", "/reset"];
|
|
3
|
+
export const SCREEN_PATHS = ["/login", "/signup", "/forgot", "/reset", "/consent"];
|
|
4
4
|
// Password managers pair a saved password with the field marked "username", even when it holds an email.
|
|
5
5
|
const email = { name: "email", label: "Email", type: "email", autocomplete: "username" };
|
|
6
6
|
const password = (autocomplete, label = "Password") => ({ name: "password", label, type: "password", autocomplete });
|
|
@@ -30,6 +30,14 @@ const SCREENS = {
|
|
|
30
30
|
button: "Change password",
|
|
31
31
|
links: [["/login", "Back to sign in"]],
|
|
32
32
|
},
|
|
33
|
+
// Where an AI client a person is connecting asks to act as them, through the app's MCP server.
|
|
34
|
+
"/consent": {
|
|
35
|
+
title: "Allow access",
|
|
36
|
+
intro: "An AI app wants to use this app as you.",
|
|
37
|
+
fields: [],
|
|
38
|
+
button: "Allow",
|
|
39
|
+
links: [["#deny", "Deny"]],
|
|
40
|
+
},
|
|
33
41
|
};
|
|
34
42
|
export function isScreen(pathname) {
|
|
35
43
|
return SCREEN_PATHS.includes(pathname);
|
|
@@ -90,7 +98,15 @@ const SCRIPT = `
|
|
|
90
98
|
const page = document.body.dataset.page;
|
|
91
99
|
const params = new URLSearchParams(location.search);
|
|
92
100
|
const next = (p => p && p.startsWith("/") && !p.startsWith("//") ? p : "/")(params.get("next"));
|
|
93
|
-
|
|
101
|
+
// An AI client signing in through OAuth arrives with a signed query; it rides along on sign-in,
|
|
102
|
+
// sign-up and consent, and the answer says where to go next. Kept to the signed parameters only.
|
|
103
|
+
const oauthQuery = (() => {
|
|
104
|
+
if (!params.has("sig")) return undefined;
|
|
105
|
+
const signed = new Set(params.getAll("ba_param"));
|
|
106
|
+
if (!signed.size) return undefined;
|
|
107
|
+
return new URLSearchParams([...params].filter(([k]) => k === "sig" || k === "ba_param" || signed.has(k))).toString();
|
|
108
|
+
})();
|
|
109
|
+
const carried = new URLSearchParams([...params].filter(([k]) => k === "next" || k === "invitation" || oauthQuery)).toString();
|
|
94
110
|
for (const a of document.querySelectorAll("[data-carry]")) if (carried) a.href += "?" + carried;
|
|
95
111
|
const form = document.querySelector(".platform-form");
|
|
96
112
|
const error = document.querySelector(".platform-error");
|
|
@@ -109,6 +125,11 @@ function say(...parts) {
|
|
|
109
125
|
message.hidden = false;
|
|
110
126
|
}
|
|
111
127
|
|
|
128
|
+
function follow(data) {
|
|
129
|
+
if (data && data.url) { location.assign(data.url); return true; }
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
|
|
112
133
|
async function finish() {
|
|
113
134
|
const invitation = params.get("invitation");
|
|
114
135
|
if (invitation) await post("/api/auth/organization/accept-invitation", { invitationId: invitation }).catch(() => {});
|
|
@@ -116,16 +137,35 @@ async function finish() {
|
|
|
116
137
|
}
|
|
117
138
|
|
|
118
139
|
const actions = {
|
|
119
|
-
login: async v => { await post("/api/auth/sign-in/email", { email: v.email, password: v.password })
|
|
140
|
+
login: async v => { if (!follow(await post("/api/auth/sign-in/email", { email: v.email, password: v.password, oauth_query: oauthQuery }))) await finish(); },
|
|
120
141
|
signup: async v => {
|
|
121
|
-
const data = await post("/api/auth/sign-up/email", { name: v.name, email: v.email, password: v.password, callbackURL: "/login" + (carried ? "?" + carried : "") });
|
|
142
|
+
const data = await post("/api/auth/sign-up/email", { name: v.name, email: v.email, password: v.password, oauth_query: oauthQuery, callbackURL: "/login" + (carried ? "?" + carried : "") });
|
|
143
|
+
if (follow(data)) return;
|
|
122
144
|
if (data.token) return finish();
|
|
123
145
|
say("Check your email for a link to confirm your address. It signs you in.");
|
|
124
146
|
},
|
|
125
147
|
forgot: async v => { await post("/api/auth/request-password-reset", { email: v.email, redirectTo: "/reset?email=" + encodeURIComponent(v.email) }); say("If that address has an account, a reset link is on its way."); },
|
|
126
148
|
reset: async v => { await post("/api/auth/reset-password", { newPassword: v.password, token: params.get("token") }); say("Your password is changed. Sign in with it now."); },
|
|
149
|
+
consent: async () => { follow(await post("/api/auth/oauth2/consent", { accept: true, oauth_query: oauthQuery })); },
|
|
127
150
|
};
|
|
128
151
|
|
|
152
|
+
if (page === "consent") {
|
|
153
|
+
const deny = document.querySelector('a[href^="#deny"]');
|
|
154
|
+
deny.addEventListener("click", async e => {
|
|
155
|
+
e.preventDefault();
|
|
156
|
+
try { follow(await post("/api/auth/oauth2/consent", { accept: false, oauth_query: oauthQuery })); }
|
|
157
|
+
catch (err) { error.textContent = err.message; error.hidden = false; }
|
|
158
|
+
});
|
|
159
|
+
const scopes = { openid: "know who you are", profile: "see your name", email: "see your email address", offline_access: "stay connected until you disconnect it" };
|
|
160
|
+
const wants = (params.get("scope") || "").split(" ").filter(Boolean).map(s => scopes[s] || s);
|
|
161
|
+
fetch("/api/auth/oauth2/public-client?client_id=" + encodeURIComponent(params.get("client_id") || ""), { credentials: "same-origin" })
|
|
162
|
+
.then(r => r.ok ? r.json() : {}).catch(() => ({}))
|
|
163
|
+
.then(c => {
|
|
164
|
+
const intro = document.querySelector(".platform-intro");
|
|
165
|
+
intro.textContent = (c.client_name || "An AI app") + " wants to use this app as you" + (wants.length ? ", to " + wants.join(", ") : "") + ".";
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
129
169
|
form.addEventListener("submit", async e => {
|
|
130
170
|
e.preventDefault();
|
|
131
171
|
error.hidden = true;
|
|
@@ -140,6 +180,6 @@ form.addEventListener("submit", async e => {
|
|
|
140
180
|
// The reset link carries the email, so a password manager knows which saved login to update.
|
|
141
181
|
if (page === "reset") document.getElementById("email").value = params.get("email") || "";
|
|
142
182
|
if (page === "reset" && (params.get("error") || !params.get("token"))) say("That reset link has expired or was already used. Ask for a new one from the sign-in page.");
|
|
143
|
-
if (page === "login") fetch("/api/auth/get-session", { credentials: "same-origin" }).then(r => r.json()).then(s => s && s.session && finish()).catch(() => {});
|
|
183
|
+
if (page === "login" && !oauthQuery) fetch("/api/auth/get-session", { credentials: "same-origin" }).then(r => r.json()).then(s => s && s.session && finish()).catch(() => {});
|
|
144
184
|
`;
|
|
145
185
|
//# sourceMappingURL=screens.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screens.js","sourceRoot":"","sources":["../../src/runtime/screens.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,yFAAyF;AAEzF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"screens.js","sourceRoot":"","sources":["../../src/runtime/screens.ts"],"names":[],"mappings":"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"}
|