@zackbart/connecta 0.1.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 (116) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +21 -0
  3. package/README.md +249 -0
  4. package/SECURITY.md +25 -0
  5. package/assets/connecta-clay-hero.png +0 -0
  6. package/dist/activity.d.ts +82 -0
  7. package/dist/activity.d.ts.map +1 -0
  8. package/dist/activity.js +51 -0
  9. package/dist/activity.js.map +1 -0
  10. package/dist/auth/bearer.d.ts +10 -0
  11. package/dist/auth/bearer.d.ts.map +1 -0
  12. package/dist/auth/bearer.js +47 -0
  13. package/dist/auth/bearer.js.map +1 -0
  14. package/dist/auth/clerk.d.ts +20 -0
  15. package/dist/auth/clerk.d.ts.map +1 -0
  16. package/dist/auth/clerk.js +167 -0
  17. package/dist/auth/clerk.js.map +1 -0
  18. package/dist/auth/downstream-oauth.d.ts +78 -0
  19. package/dist/auth/downstream-oauth.d.ts.map +1 -0
  20. package/dist/auth/downstream-oauth.js +180 -0
  21. package/dist/auth/downstream-oauth.js.map +1 -0
  22. package/dist/catalog.d.ts +11 -0
  23. package/dist/catalog.d.ts.map +1 -0
  24. package/dist/catalog.js +144 -0
  25. package/dist/catalog.js.map +1 -0
  26. package/dist/connectors/api.d.ts +34 -0
  27. package/dist/connectors/api.d.ts.map +1 -0
  28. package/dist/connectors/api.js +36 -0
  29. package/dist/connectors/api.js.map +1 -0
  30. package/dist/connectors/remote-mcp.d.ts +33 -0
  31. package/dist/connectors/remote-mcp.d.ts.map +1 -0
  32. package/dist/connectors/remote-mcp.js +255 -0
  33. package/dist/connectors/remote-mcp.js.map +1 -0
  34. package/dist/credentials.d.ts +33 -0
  35. package/dist/credentials.d.ts.map +1 -0
  36. package/dist/credentials.js +177 -0
  37. package/dist/credentials.js.map +1 -0
  38. package/dist/execute.d.ts +40 -0
  39. package/dist/execute.d.ts.map +1 -0
  40. package/dist/execute.js +424 -0
  41. package/dist/execute.js.map +1 -0
  42. package/dist/executors/quickjs.d.ts +26 -0
  43. package/dist/executors/quickjs.d.ts.map +1 -0
  44. package/dist/executors/quickjs.js +267 -0
  45. package/dist/executors/quickjs.js.map +1 -0
  46. package/dist/favicon.d.ts +2 -0
  47. package/dist/favicon.d.ts.map +1 -0
  48. package/dist/favicon.js +49 -0
  49. package/dist/favicon.js.map +1 -0
  50. package/dist/index.d.ts +85 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +73 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/mcp-result.d.ts +9 -0
  55. package/dist/mcp-result.d.ts.map +1 -0
  56. package/dist/mcp-result.js +35 -0
  57. package/dist/mcp-result.js.map +1 -0
  58. package/dist/meta-tools.d.ts +100 -0
  59. package/dist/meta-tools.d.ts.map +1 -0
  60. package/dist/meta-tools.js +797 -0
  61. package/dist/meta-tools.js.map +1 -0
  62. package/dist/node.d.ts +9 -0
  63. package/dist/node.d.ts.map +1 -0
  64. package/dist/node.js +57 -0
  65. package/dist/node.js.map +1 -0
  66. package/dist/registry.d.ts +78 -0
  67. package/dist/registry.d.ts.map +1 -0
  68. package/dist/registry.js +299 -0
  69. package/dist/registry.js.map +1 -0
  70. package/dist/server.d.ts +31 -0
  71. package/dist/server.d.ts.map +1 -0
  72. package/dist/server.js +543 -0
  73. package/dist/server.js.map +1 -0
  74. package/dist/skills.d.ts +8 -0
  75. package/dist/skills.d.ts.map +1 -0
  76. package/dist/skills.js +60 -0
  77. package/dist/skills.js.map +1 -0
  78. package/dist/storage/file.d.ts +8 -0
  79. package/dist/storage/file.d.ts.map +1 -0
  80. package/dist/storage/file.js +53 -0
  81. package/dist/storage/file.js.map +1 -0
  82. package/dist/storage/memory.d.ts +4 -0
  83. package/dist/storage/memory.d.ts.map +1 -0
  84. package/dist/storage/memory.js +29 -0
  85. package/dist/storage/memory.js.map +1 -0
  86. package/dist/types.d.ts +219 -0
  87. package/dist/types.d.ts.map +1 -0
  88. package/dist/types.js +3 -0
  89. package/dist/types.js.map +1 -0
  90. package/dist/ui.d.ts +91 -0
  91. package/dist/ui.d.ts.map +1 -0
  92. package/dist/ui.js +1031 -0
  93. package/dist/ui.js.map +1 -0
  94. package/package.json +96 -0
  95. package/src/activity.ts +144 -0
  96. package/src/auth/bearer.ts +54 -0
  97. package/src/auth/clerk.ts +226 -0
  98. package/src/auth/downstream-oauth.ts +202 -0
  99. package/src/catalog.ts +166 -0
  100. package/src/connectors/api.ts +80 -0
  101. package/src/connectors/remote-mcp.ts +324 -0
  102. package/src/credentials.ts +259 -0
  103. package/src/execute.ts +550 -0
  104. package/src/executors/quickjs.ts +321 -0
  105. package/src/favicon.ts +53 -0
  106. package/src/index.ts +197 -0
  107. package/src/mcp-result.ts +43 -0
  108. package/src/meta-tools.ts +1120 -0
  109. package/src/node.ts +62 -0
  110. package/src/registry.ts +400 -0
  111. package/src/server.ts +758 -0
  112. package/src/skills.ts +63 -0
  113. package/src/storage/file.ts +62 -0
  114. package/src/storage/memory.ts +34 -0
  115. package/src/types.ts +254 -0
  116. package/src/ui.ts +1121 -0
package/dist/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "@zackbart/connecta",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "sideEffects": false,
6
+ "description": "One MCP to rule them all — a single MCP endpoint aggregating many downstream connectors behind nine meta-tools.",
7
+ "license": "MIT",
8
+ "engines": {
9
+ "node": ">=20.9.0"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/zackbart/connecta.git"
17
+ },
18
+ "homepage": "https://github.com/zackbart/connecta#readme",
19
+ "bugs": {
20
+ "url": "https://github.com/zackbart/connecta/issues"
21
+ },
22
+ "keywords": [
23
+ "mcp",
24
+ "model-context-protocol",
25
+ "cloudflare-workers",
26
+ "connectors"
27
+ ],
28
+ "files": [
29
+ "dist",
30
+ "src",
31
+ "assets",
32
+ "README.md",
33
+ "CHANGELOG.md",
34
+ "SECURITY.md",
35
+ "LICENSE"
36
+ ],
37
+ "exports": {
38
+ ".": {
39
+ "types": "./dist/index.d.ts",
40
+ "import": "./dist/index.js"
41
+ },
42
+ "./node": {
43
+ "types": "./dist/node.d.ts",
44
+ "import": "./dist/node.js"
45
+ },
46
+ "./quickjs": {
47
+ "types": "./dist/executors/quickjs.d.ts",
48
+ "import": "./dist/executors/quickjs.js"
49
+ },
50
+ "./auth/clerk": {
51
+ "types": "./dist/auth/clerk.d.ts",
52
+ "import": "./dist/auth/clerk.js"
53
+ }
54
+ },
55
+ "scripts": {
56
+ "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
57
+ "build": "npm run clean && tsc -p tsconfig.build.json",
58
+ "typecheck": "tsc -p tsconfig.json --noEmit",
59
+ "test": "vitest run",
60
+ "check:examples": "tsc -p tsconfig.examples.node.json && tsc -p tsconfig.examples.worker.json",
61
+ "check:security": "npm audit --omit=dev --audit-level=high",
62
+ "check:package": "node scripts/check-package.mjs",
63
+ "check": "npm run typecheck && npm run test && npm run build && npm run check:examples",
64
+ "release:check": "npm run check && npm run check:security && npm run check:package",
65
+ "prepack": "npm run check",
66
+ "prepublishOnly": "npm run check:security"
67
+ },
68
+ "dependencies": {
69
+ "@cfworker/json-schema": "^4.1.1",
70
+ "@modelcontextprotocol/sdk": "1.29.0",
71
+ "zod": "^4.4.3"
72
+ },
73
+ "peerDependencies": {
74
+ "@clerk/backend": "^3.12.0",
75
+ "quickjs-emscripten": "^0.32.0"
76
+ },
77
+ "peerDependenciesMeta": {
78
+ "@clerk/backend": {
79
+ "optional": true
80
+ },
81
+ "quickjs-emscripten": {
82
+ "optional": true
83
+ }
84
+ },
85
+ "devDependencies": {
86
+ "@clerk/backend": "^3.12.0",
87
+ "@cloudflare/codemode": "^0.4.4",
88
+ "@cloudflare/workers-types": "^4.20250101.0 || ^5.0.0",
89
+ "@types/node": "^22.0.0",
90
+ "quickjs-emscripten": "^0.32.0",
91
+ "tsx": "^4.23.1",
92
+ "typescript": "^5.6.0",
93
+ "vitest": "^4.1.6",
94
+ "wrangler": "^4.114.0"
95
+ }
96
+ }
@@ -0,0 +1,144 @@
1
+ import type { Logger } from "./types.js";
2
+
3
+ export type ActivityCallSource =
4
+ | "call_tool"
5
+ | "call_destructive_tool"
6
+ | "batch_call"
7
+ | "execute_code";
8
+
9
+ export type ActivityOutcome = "success" | "error" | "timeout";
10
+
11
+ /**
12
+ * Authenticated identity attached to an activity event. `id` is intentionally
13
+ * optional: open deployments and shared bearer tokens cannot honestly identify
14
+ * a person.
15
+ */
16
+ export interface ActivityActor {
17
+ kind: string;
18
+ id?: string;
19
+ }
20
+
21
+ /**
22
+ * Privacy-minimal history of one resolved downstream connector call.
23
+ *
24
+ * Arguments, results, generated code, search text, and raw errors are excluded
25
+ * by construction. Deployments that need a safe human summary can add a
26
+ * separate, explicit connector-level feature later.
27
+ */
28
+ export interface ToolCallActivityEvent {
29
+ schemaVersion: 1;
30
+ id: string;
31
+ occurredAt: string;
32
+ requestId: string;
33
+ actor: ActivityActor;
34
+ connectorId: string;
35
+ toolName: string;
36
+ address: string;
37
+ source: ActivityCallSource;
38
+ outcome: ActivityOutcome;
39
+ durationMs: number;
40
+ attempts: number;
41
+ errorCode?: string;
42
+ serverName: string;
43
+ serverVersion: string;
44
+ deploymentId?: string;
45
+ }
46
+
47
+ export interface ActivityPage {
48
+ events: ToolCallActivityEvent[];
49
+ nextCursor?: string;
50
+ }
51
+
52
+ /** Write-only deployments can implement only this small, vendor-neutral seam. */
53
+ export interface ActivitySink {
54
+ record(event: ToolCallActivityEvent): void | Promise<void>;
55
+ }
56
+
57
+ /** Optional read side used by Connecta's authenticated Activity UI. */
58
+ export interface ActivityReader {
59
+ list(options: { cursor?: string; limit: number }): Promise<ActivityPage>;
60
+ }
61
+
62
+ export interface ActivityStore extends ActivitySink {
63
+ list?: ActivityReader["list"];
64
+ }
65
+
66
+ /** Reader implementations throw this for an opaque cursor they cannot decode. */
67
+ export class InvalidActivityCursorError extends Error {
68
+ override name = "InvalidActivityCursorError";
69
+
70
+ constructor() {
71
+ super("invalid activity cursor");
72
+ }
73
+ }
74
+
75
+ export type ActivityReadGate = (
76
+ actor: ActivityActor,
77
+ ) => boolean | Promise<boolean>;
78
+
79
+ /** Request-scoped context shared by direct, batch, and code-mode call paths. */
80
+ export interface ActivityRequestContext {
81
+ sink: ActivitySink;
82
+ actor: ActivityActor;
83
+ requestId: string;
84
+ serverInfo: { name: string; version: string };
85
+ deploymentId?: string;
86
+ defer?: (promise: Promise<unknown>) => void;
87
+ logger: Logger;
88
+ }
89
+
90
+ export type ActivityEventInput = Pick<
91
+ ToolCallActivityEvent,
92
+ | "connectorId"
93
+ | "toolName"
94
+ | "address"
95
+ | "source"
96
+ | "outcome"
97
+ | "durationMs"
98
+ | "attempts"
99
+ | "errorCode"
100
+ >;
101
+
102
+ /**
103
+ * Best-effort by design: activity storage can never change a tool result.
104
+ * Workers attach async sinks to waitUntil; synchronous sinks such as Analytics
105
+ * Engine complete inline; Node promises remain detached from the response.
106
+ */
107
+ export function recordToolActivity(
108
+ context: ActivityRequestContext | undefined,
109
+ input: ActivityEventInput,
110
+ ): void {
111
+ if (!context) return;
112
+ const event: ToolCallActivityEvent = {
113
+ schemaVersion: 1,
114
+ id: crypto.randomUUID(),
115
+ occurredAt: new Date().toISOString(),
116
+ requestId: context.requestId,
117
+ actor: context.actor,
118
+ connectorId: input.connectorId,
119
+ toolName: input.toolName,
120
+ address: input.address,
121
+ source: input.source,
122
+ outcome: input.outcome,
123
+ durationMs: Math.max(0, Math.trunc(input.durationMs)),
124
+ attempts: Math.max(1, Math.trunc(input.attempts)),
125
+ ...(input.errorCode ? { errorCode: input.errorCode } : {}),
126
+ serverName: context.serverInfo.name,
127
+ serverVersion: context.serverInfo.version,
128
+ ...(context.deploymentId
129
+ ? { deploymentId: context.deploymentId }
130
+ : {}),
131
+ };
132
+ try {
133
+ const result = context.sink.record(event);
134
+ if (!result || typeof (result as Promise<unknown>).then !== "function") {
135
+ return;
136
+ }
137
+ const pending = Promise.resolve(result).catch((error) => {
138
+ context.logger.warn("[connecta] activity record failed", error);
139
+ });
140
+ if (context.defer) context.defer(pending);
141
+ } catch (error) {
142
+ context.logger.warn("[connecta] activity record failed", error);
143
+ }
144
+ }
@@ -0,0 +1,54 @@
1
+ import type { AuthResult, InboundAuth } from "../types.js";
2
+
3
+ const encoder = new TextEncoder();
4
+
5
+ /** Constant-time byte comparison. Differing lengths still iterate to reduce leak. */
6
+ function timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean {
7
+ if (a.length !== b.length) {
8
+ let r = 1;
9
+ const n = Math.max(a.length, b.length);
10
+ for (let i = 0; i < n; i++) r |= (a[i] ?? 0) ^ (b[i] ?? 0);
11
+ return false;
12
+ }
13
+ let r = 0;
14
+ for (let i = 0; i < a.length; i++) r |= a[i] ^ b[i];
15
+ return r === 0;
16
+ }
17
+
18
+ /**
19
+ * Static bearer-token inbound auth. Constant-time compares the Bearer token
20
+ * against `secret`. Checked BEFORE the Clerk gate in the server; a mismatch
21
+ * falls through so a co-configured Clerk provider can still admit the request.
22
+ */
23
+ export function bearerToken(
24
+ secret: string,
25
+ options: { subjectId?: string } = {},
26
+ ): InboundAuth {
27
+ const secretBytes = encoder.encode(secret);
28
+ return {
29
+ kind: "bearer",
30
+ authorize(request): AuthResult {
31
+ const header = request.headers.get("authorization") ?? "";
32
+ const match = /^Bearer\s+(.+)$/i.exec(header);
33
+ if (match && timingSafeEqual(encoder.encode(match[1]), secretBytes)) {
34
+ return {
35
+ ok: true,
36
+ ...(options.subjectId ? { subjectId: options.subjectId } : {}),
37
+ };
38
+ }
39
+ return {
40
+ ok: false,
41
+ response: new Response(
42
+ JSON.stringify({ error: "unauthorized" }),
43
+ {
44
+ status: 401,
45
+ headers: {
46
+ "Content-Type": "application/json",
47
+ "WWW-Authenticate": "Bearer",
48
+ },
49
+ },
50
+ ),
51
+ };
52
+ },
53
+ };
54
+ }
@@ -0,0 +1,226 @@
1
+ // Clerk as the OAuth 2.1 authorization server; connecta is the resource server.
2
+ // Single tenant, no tenant-tag requirement, optional gate() with ~60s identity
3
+ // caching.
4
+
5
+ import { createClerkClient } from "@clerk/backend";
6
+ import type { AuthResult, InboundAuth } from "../types.js";
7
+
8
+ type ClerkClient = ReturnType<typeof createClerkClient>;
9
+
10
+ export interface ClerkAuthOptions {
11
+ publishableKey: string;
12
+ secretKey: string;
13
+ /** Public base URL of this deployment. Defaults to the request origin. */
14
+ publicUrl?: string;
15
+ /** Optional allow-list hook. Return false to reject an authenticated user. */
16
+ gate?: (userId: string, clerk: ClerkClient) => boolean | Promise<boolean>;
17
+ /** Advertised scopes in protected-resource metadata. */
18
+ scopes?: string[];
19
+ /** Optional hosted Account Portal sign-in URL for `/ui`. */
20
+ signInUrl?: string;
21
+ /** Optional hosted Account Portal sign-up URL for `/ui`. */
22
+ signUpUrl?: string;
23
+ }
24
+
25
+ const CORS_HEADERS = {
26
+ "Access-Control-Allow-Origin": "*",
27
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
28
+ "Access-Control-Allow-Headers":
29
+ "Content-Type, Authorization, mcp-protocol-version",
30
+ };
31
+
32
+ /** Coarse bearer shape for diagnostics — never the token itself. */
33
+ function tokenShape(request: Request): string {
34
+ const header = request.headers.get("authorization");
35
+ if (!header) return "none";
36
+ const token = header.replace(/^Bearer\s+/i, "");
37
+ if (token.startsWith("oat_")) return "oauth-opaque";
38
+ if (token.startsWith("eyJ")) return "jwt";
39
+ return "other";
40
+ }
41
+
42
+ /** Clerk Frontend API origin, derived from pk_(test|live)_<b64 domain>. */
43
+ function fapiUrl(publishableKey: string): string {
44
+ const key = publishableKey.replace(/^pk_(test|live)_/, "");
45
+ const decoded = atob(key).replace(/\$$/, "");
46
+ return `https://${decoded}`;
47
+ }
48
+
49
+ const GATE_ALLOWED_TTL_MS = 60 * 1000;
50
+ const GATE_FORBIDDEN_TTL_MS = 30 * 1000;
51
+
52
+ export function clerkAuth(opts: ClerkAuthOptions): InboundAuth {
53
+ const clerk = createClerkClient({
54
+ secretKey: opts.secretKey,
55
+ publishableKey: opts.publishableKey,
56
+ });
57
+ const scopes = opts.scopes ?? ["openid", "profile", "email"];
58
+ const gateCache = new Map<string, { allowed: boolean; exp: number }>();
59
+
60
+ const resolveBase = (baseUrl: string) => opts.publicUrl ?? baseUrl;
61
+
62
+ const unauthorized = (baseUrl: string, tokenPresent: boolean): Response => {
63
+ const error = tokenPresent ? `error="invalid_token", ` : "";
64
+ const meta = `${resolveBase(baseUrl)}/.well-known/oauth-protected-resource`;
65
+ return new Response(
66
+ JSON.stringify({ error: "unauthorized" }),
67
+ {
68
+ status: 401,
69
+ headers: {
70
+ "Content-Type": "application/json",
71
+ "WWW-Authenticate": `Bearer ${error}resource_metadata="${meta}"`,
72
+ },
73
+ },
74
+ );
75
+ };
76
+
77
+ const forbidden = (): Response =>
78
+ new Response(
79
+ JSON.stringify({ error: "forbidden" }),
80
+ { status: 403, headers: { "Content-Type": "application/json" } },
81
+ );
82
+
83
+ const checkGate = async (userId: string): Promise<boolean> => {
84
+ if (!opts.gate) return true;
85
+ const hit = gateCache.get(userId);
86
+ if (hit && Date.now() < hit.exp) return hit.allowed;
87
+ let allowed = false;
88
+ try {
89
+ allowed = await opts.gate(userId, clerk);
90
+ } catch {
91
+ allowed = false;
92
+ }
93
+ gateCache.set(userId, {
94
+ allowed,
95
+ exp:
96
+ Date.now() +
97
+ (allowed ? GATE_ALLOWED_TTL_MS : GATE_FORBIDDEN_TTL_MS),
98
+ });
99
+ return allowed;
100
+ };
101
+
102
+ return {
103
+ kind: "clerk",
104
+ uiAuth: {
105
+ kind: "clerk",
106
+ publishableKey: opts.publishableKey,
107
+ frontendApiUrl: fapiUrl(opts.publishableKey),
108
+ ...(opts.signInUrl ? { signInUrl: opts.signInUrl } : {}),
109
+ ...(opts.signUpUrl ? { signUpUrl: opts.signUpUrl } : {}),
110
+ },
111
+
112
+ async handleMetadata(request, baseUrl) {
113
+ const { pathname } = new URL(request.url);
114
+ if (!pathname.startsWith("/.well-known/")) return null;
115
+
116
+ if (request.method === "OPTIONS") {
117
+ return new Response(null, { status: 204, headers: CORS_HEADERS });
118
+ }
119
+
120
+ const base = resolveBase(baseUrl);
121
+ if (
122
+ pathname === "/.well-known/oauth-protected-resource" ||
123
+ pathname === "/.well-known/oauth-protected-resource/mcp"
124
+ ) {
125
+ return Response.json(
126
+ {
127
+ resource: `${base}/mcp`,
128
+ authorization_servers: [fapiUrl(opts.publishableKey)],
129
+ bearer_methods_supported: ["header"],
130
+ scopes_supported: scopes,
131
+ },
132
+ { headers: CORS_HEADERS },
133
+ );
134
+ }
135
+
136
+ if (pathname === "/.well-known/oauth-authorization-server") {
137
+ try {
138
+ const upstream = await fetch(
139
+ `${fapiUrl(opts.publishableKey)}/.well-known/oauth-authorization-server`,
140
+ );
141
+ if (!upstream.ok) {
142
+ return Response.json(
143
+ { error: "upstream authorization server metadata unavailable" },
144
+ { status: 502, headers: CORS_HEADERS },
145
+ );
146
+ }
147
+ return Response.json(await upstream.json(), { headers: CORS_HEADERS });
148
+ } catch {
149
+ return Response.json(
150
+ { error: "upstream authorization server metadata unavailable" },
151
+ { status: 502, headers: CORS_HEADERS },
152
+ );
153
+ }
154
+ }
155
+
156
+ return null;
157
+ },
158
+
159
+ async authorize(request, baseUrl): Promise<AuthResult> {
160
+ const tokenPresent = Boolean(request.headers.get("authorization"));
161
+ let userId: string | undefined;
162
+ try {
163
+ const state = await clerk.authenticateRequest(request, {
164
+ // MCP clients use Clerk OAuth access tokens; the browser dashboard
165
+ // uses the signed-in operator's short-lived Clerk session token.
166
+ // authorizedParties must NOT be passed here: OAuth access tokens may
167
+ // be JWTs without an azp claim, and Clerk rejects azp=undefined when
168
+ // that option is set. The sibling-subdomain pin it provided is
169
+ // enforced below, only for session tokens that actually carry azp.
170
+ acceptsToken: ["oauth_token", "session_token"],
171
+ });
172
+ const auth = state.toAuth();
173
+ if (!auth?.isAuthenticated) {
174
+ // Reason (not the token) in the logs: bearer rejections are
175
+ // otherwise indistinguishable 401s in `wrangler tail`.
176
+ const detail = state as { reason?: string; message?: string };
177
+ console.warn(
178
+ `[connecta] clerk rejected request: status=${state.status}` +
179
+ ` reason=${detail.reason ?? "?"} message=${detail.message ?? ""}` +
180
+ ` tokenShape=${tokenShape(request)}`,
181
+ );
182
+ return {
183
+ ok: false,
184
+ response: unauthorized(baseUrl, tokenPresent),
185
+ };
186
+ }
187
+ // Session JWTs carry `azp` (the origin they were minted for); pin it
188
+ // to this connecta deployment so a sibling subdomain's cookie/token
189
+ // cannot be replayed here. OAuth access tokens may have no azp.
190
+ const typed = auth as {
191
+ tokenType?: string;
192
+ sessionClaims?: { azp?: string } | null;
193
+ userId?: string | null;
194
+ };
195
+ if (typed.tokenType === "session_token") {
196
+ const azp = typed.sessionClaims?.azp;
197
+ const origin = new URL(resolveBase(baseUrl)).origin;
198
+ if (azp && azp !== origin) {
199
+ console.warn(
200
+ `[connecta] session token azp mismatch: azp=${azp} expected=${origin}`,
201
+ );
202
+ return {
203
+ ok: false,
204
+ response: unauthorized(baseUrl, tokenPresent),
205
+ };
206
+ }
207
+ }
208
+ userId = typed.userId ?? undefined;
209
+ } catch (error) {
210
+ console.warn(
211
+ `[connecta] clerk authenticateRequest threw: ${
212
+ error instanceof Error ? error.message : String(error)
213
+ } tokenShape=${tokenShape(request)}`,
214
+ );
215
+ return { ok: false, response: unauthorized(baseUrl, true) };
216
+ }
217
+ if (!userId) {
218
+ return { ok: false, response: unauthorized(baseUrl, true) };
219
+ }
220
+ if (!(await checkGate(userId))) {
221
+ return { ok: false, response: forbidden() };
222
+ }
223
+ return { ok: true, userId };
224
+ },
225
+ };
226
+ }