History

cloud/local/examples: thread per-user ScopeStack through HTTP + MCP

- cloud: resolves userId from the authenticated session and builds a [userOrgScope, orgScope] stack via createScopedExecutor(userId, orgId, orgName). userId threaded through execution-stack, mcp-session, and MCP dispatch init. - cloud env refactor: deletes the lazy Proxy apps/cloud/src/env.ts in favor of cloudflare:workers env imported at call sites; adds env-augment.d.ts to type secrets not present in generated wrangler types. - cloud/server.ts: env-guarded OTEL wiring (skips instrument() when AXIOM_TOKEN absent); captures rawFetch before instrument() mutates it so dev requests still land on the Hono app. - cloud/services/db.ts: prefers DATABASE_URL over the hyperdrive proxy so local dev works without the tunnel. - vite.config.ts: devCrashGuard plugin that prints uncaught Worker errors with a stable exit. - hosts/mcp: optional debug flag surfaces verbose session logging, wired up from cloud mcp-session. - local/examples/marketing: migrated to scopes: [scope].

Rhys Sullivan committed 6 months ago

Commit d4e311e1 parent 427699c25 files · +320 −174Browse files

Showing the changes to apps/cloud/src/auth (2 of 25 files). Show all

Unified · Split

2 files
  1. apps/cloud/src/auth/handlers.ts +2 −2
  2. apps/cloud/src/auth/workos.ts +4 −4
apps/cloud/src/auth/handlers.ts+2−2
@@ -6,9 +6,9 @@ import { AUTH_PATHS, CloudAuthApi, CloudAuthPublicApi } from "./api"; · 5 unmodified lines
6import { SessionContext } from "./middleware";6import { SessionContext } from "./middleware";
7import { UserStoreService } from "./context";7import { UserStoreService } from "./context";
8import { authorizeOrganization } from "./authorize-organization";8import { authorizeOrganization } from "./authorize-organization";
9import { env } from "cloudflare:workers";
9import { WorkOSError } from "./errors";10import { WorkOSError } from "./errors";
10import { WorkOSAuth } from "./workos";11import { WorkOSAuth } from "./workos";
11import { server } from "../env";
12 12
13const COOKIE_OPTIONS = {13const COOKIE_OPTIONS = {
14 path: "/",14 path: "/",
@@ -40,7 +40,7 @@ export const CloudAuthPublicHandlers = HttpApiBuilder.group( · 25 unmodified lines
40 // Use the explicit public site URL — in dev, the request's Host40 // Use the explicit public site URL — in dev, the request's Host
41 // header points at the internal proxy target, not the public URL41 // header points at the internal proxy target, not the public URL
42 // WorkOS needs to redirect back to.42 // WorkOS needs to redirect back to.
43 const origin = server.VITE_PUBLIC_SITE_URL;43 const origin = env.VITE_PUBLIC_SITE_URL ?? "";
44 const url = workos.getAuthorizationUrl(`${origin}${AUTH_PATHS.callback}`);44 const url = workos.getAuthorizationUrl(`${origin}${AUTH_PATHS.callback}`);
45 return HttpServerResponse.redirect(url, { status: 302 });45 return HttpServerResponse.redirect(url, { status: 302 });
46 }),46 }),
apps/cloud/src/auth/workos.ts+4−4
@@ -2,10 +2,10 @@ · 1 unmodified line
2// WorkOS AuthKit — Effect-native sealed session management2// WorkOS AuthKit — Effect-native sealed session management
3// ---------------------------------------------------------------------------3// ---------------------------------------------------------------------------
4 4
5import { env } from "cloudflare:workers";
5import { Context, Effect, Layer } from "effect";6import { Context, Effect, Layer } from "effect";
6import { WorkOS } from "@workos-inc/node/worker";7import { WorkOS } from "@workos-inc/node/worker";
7import { WorkOSError, tryPromiseService, withServiceLogging } from "./errors";8import { WorkOSError, tryPromiseService, withServiceLogging } from "./errors";
8import { server } from "../env";
9 9
10const COOKIE_NAME = "wos-session";10const COOKIE_NAME = "wos-session";
11 11
@@ -14,9 +14,9 @@ const COOKIE_NAME = "wos-session"; · 2 unmodified lines
14// ---------------------------------------------------------------------------14// ---------------------------------------------------------------------------
15 15
16const make = Effect.gen(function* () {16const make = Effect.gen(function* () {
17 const apiKey = server.WORKOS_API_KEY;17 const apiKey = env.WORKOS_API_KEY;
18 const clientId = server.WORKOS_CLIENT_ID;18 const clientId = env.WORKOS_CLIENT_ID;
19 const cookiePassword = server.WORKOS_COOKIE_PASSWORD;19 const cookiePassword = env.WORKOS_COOKIE_PASSWORD;
20 20
21 if (!cookiePassword || cookiePassword.length < 32) {21 if (!cookiePassword || cookiePassword.length < 32) {
22 return yield* Effect.die(new Error("WORKOS_COOKIE_PASSWORD must be at least 32 characters"));22 return yield* Effect.die(new Error("WORKOS_COOKIE_PASSWORD must be at least 32 characters"));