@amodalai/runtime 0.3.70 → 0.3.71

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 (74) hide show
  1. package/dist/src/auth/__fixtures__/custom-strategy.d.ts +8 -0
  2. package/dist/src/auth/__fixtures__/custom-strategy.js +27 -0
  3. package/dist/src/auth/__fixtures__/custom-strategy.js.map +1 -0
  4. package/dist/src/auth/compose.d.ts +55 -0
  5. package/dist/src/auth/compose.js +142 -0
  6. package/dist/src/auth/compose.js.map +1 -0
  7. package/dist/src/auth/compose.test.d.ts +6 -0
  8. package/dist/src/auth/compose.test.js +159 -0
  9. package/dist/src/auth/compose.test.js.map +1 -0
  10. package/dist/src/auth/config.d.ts +261 -0
  11. package/dist/src/auth/config.js +107 -0
  12. package/dist/src/auth/config.js.map +1 -0
  13. package/dist/src/auth/config.test.d.ts +6 -0
  14. package/dist/src/auth/config.test.js +85 -0
  15. package/dist/src/auth/config.test.js.map +1 -0
  16. package/dist/src/auth/factory.d.ts +19 -0
  17. package/dist/src/auth/factory.js +57 -0
  18. package/dist/src/auth/factory.js.map +1 -0
  19. package/dist/src/auth/factory.test.d.ts +6 -0
  20. package/dist/src/auth/factory.test.js +60 -0
  21. package/dist/src/auth/factory.test.js.map +1 -0
  22. package/dist/src/auth/index.d.ts +48 -0
  23. package/dist/src/auth/index.js +19 -0
  24. package/dist/src/auth/index.js.map +1 -0
  25. package/dist/src/auth/strategies/amodal.d.ts +36 -0
  26. package/dist/src/auth/strategies/amodal.js +28 -0
  27. package/dist/src/auth/strategies/amodal.js.map +1 -0
  28. package/dist/src/auth/strategies/api-key.d.ts +41 -0
  29. package/dist/src/auth/strategies/api-key.js +63 -0
  30. package/dist/src/auth/strategies/api-key.js.map +1 -0
  31. package/dist/src/auth/strategies/auth-modes.integration.test.d.ts +6 -0
  32. package/dist/src/auth/strategies/auth-modes.integration.test.js +363 -0
  33. package/dist/src/auth/strategies/auth-modes.integration.test.js.map +1 -0
  34. package/dist/src/auth/strategies/cookie.d.ts +41 -0
  35. package/dist/src/auth/strategies/cookie.js +84 -0
  36. package/dist/src/auth/strategies/cookie.js.map +1 -0
  37. package/dist/src/auth/strategies/custom-loader.d.ts +17 -0
  38. package/dist/src/auth/strategies/custom-loader.js +37 -0
  39. package/dist/src/auth/strategies/custom-loader.js.map +1 -0
  40. package/dist/src/auth/strategies/header.d.ts +35 -0
  41. package/dist/src/auth/strategies/header.js +42 -0
  42. package/dist/src/auth/strategies/header.js.map +1 -0
  43. package/dist/src/auth/strategies/jwks.d.ts +38 -0
  44. package/dist/src/auth/strategies/jwks.js +86 -0
  45. package/dist/src/auth/strategies/jwks.js.map +1 -0
  46. package/dist/src/auth/strategies/jwt-secret.d.ts +25 -0
  47. package/dist/src/auth/strategies/jwt-secret.js +82 -0
  48. package/dist/src/auth/strategies/jwt-secret.js.map +1 -0
  49. package/dist/src/auth/strategies/jwt-secret.test.d.ts +6 -0
  50. package/dist/src/auth/strategies/jwt-secret.test.js +75 -0
  51. package/dist/src/auth/strategies/jwt-secret.test.js.map +1 -0
  52. package/dist/src/auth/strategies/none.d.ts +37 -0
  53. package/dist/src/auth/strategies/none.js +31 -0
  54. package/dist/src/auth/strategies/none.js.map +1 -0
  55. package/dist/src/auth/strategies/oidc.d.ts +48 -0
  56. package/dist/src/auth/strategies/oidc.integration.test.d.ts +6 -0
  57. package/dist/src/auth/strategies/oidc.integration.test.js +290 -0
  58. package/dist/src/auth/strategies/oidc.integration.test.js.map +1 -0
  59. package/dist/src/auth/strategies/oidc.js +284 -0
  60. package/dist/src/auth/strategies/oidc.js.map +1 -0
  61. package/dist/src/auth/strategies/oidc.test.d.ts +6 -0
  62. package/dist/src/auth/strategies/oidc.test.js +111 -0
  63. package/dist/src/auth/strategies/oidc.test.js.map +1 -0
  64. package/dist/src/auth/strategies/strategies.test.d.ts +6 -0
  65. package/dist/src/auth/strategies/strategies.test.js +190 -0
  66. package/dist/src/auth/strategies/strategies.test.js.map +1 -0
  67. package/dist/src/auth/types.d.ts +95 -0
  68. package/dist/src/auth/types.js +7 -0
  69. package/dist/src/auth/types.js.map +1 -0
  70. package/dist/src/index.d.ts +2 -0
  71. package/dist/src/index.js +2 -0
  72. package/dist/src/index.js.map +1 -1
  73. package/dist/tsconfig.tsbuildinfo +1 -1
  74. package/package.json +9 -4
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * NoneAuthStrategy — synthesizes an anonymous identity. Always matches
8
+ * (`valid()` returns true) and always authenticates with the same
9
+ * synthetic session, so the chain stops at this strategy.
10
+ *
11
+ * Place LAST in the chain to act as a default. For public agents (no
12
+ * end-user auth) or local dev where you want the runtime to accept any
13
+ * caller.
14
+ *
15
+ * Security: NoneAuthStrategy makes the agent reachable without
16
+ * authentication. Only use when the agent is intentionally public —
17
+ * ideally combined with cf-worker's `accessMode: 'public'` upstream.
18
+ */
19
+ import type { Request } from 'express';
20
+ import type { AuthResult, AuthStrategy } from '../types.js';
21
+ export interface NoneAuthStrategyOptions {
22
+ /** User id to synthesize for anonymous callers. Defaults to `'anonymous'`. */
23
+ userId?: string;
24
+ /** Optional `agentId` to attach. */
25
+ agentId?: string;
26
+ /** Override `AuthSession.method`. Defaults to `'none'`. */
27
+ authMethod?: string;
28
+ }
29
+ export declare class NoneAuthStrategy implements AuthStrategy {
30
+ readonly name = "none";
31
+ private readonly userId;
32
+ private readonly agentId?;
33
+ private readonly authMethod;
34
+ constructor(options?: NoneAuthStrategyOptions);
35
+ valid(_req: Request): boolean;
36
+ authenticate(_req: Request): Promise<AuthResult>;
37
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export class NoneAuthStrategy {
7
+ name = 'none';
8
+ userId;
9
+ agentId;
10
+ authMethod;
11
+ constructor(options = {}) {
12
+ this.userId = options.userId ?? 'anonymous';
13
+ if (options.agentId !== undefined)
14
+ this.agentId = options.agentId;
15
+ this.authMethod = options.authMethod ?? 'none';
16
+ }
17
+ valid(_req) {
18
+ return true;
19
+ }
20
+ async authenticate(_req) {
21
+ return {
22
+ kind: 'authenticated',
23
+ session: {
24
+ user: { id: this.userId },
25
+ method: this.authMethod,
26
+ ...(this.agentId ? { agentId: this.agentId } : {}),
27
+ },
28
+ };
29
+ }
30
+ }
31
+ //# sourceMappingURL=none.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"none.js","sourceRoot":"","sources":["../../../../src/auth/strategies/none.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2BH,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,MAAM,CAAC;IACN,MAAM,CAAS;IACf,OAAO,CAAU;IACjB,UAAU,CAAS;IAEpC,YAAY,UAAmC,EAAE;QAC/C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC;QAC5C,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAClE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,IAAa;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAa;QAC9B,OAAO;YACL,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE;gBACP,IAAI,EAAE,EAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAC;gBACvB,MAAM,EAAE,IAAI,CAAC,UAAU;gBACvB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aACjD;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import type { Request, Router as ExpressRouter } from 'express';
7
+ import type { JWTPayload } from 'jose';
8
+ import type { AuthResult, AuthSession, AuthStrategy } from '../types.js';
9
+ export interface OidcAuthStrategyOptions {
10
+ issuer: string;
11
+ clientId: string;
12
+ clientSecret: string;
13
+ callbackUrl: string;
14
+ scopes?: readonly string[];
15
+ /** HMAC secret used to sign the session JWT cookie. Min 16 chars. */
16
+ sessionSecret: string;
17
+ /** Cookie name. Defaults to `'amodal_session'`. */
18
+ cookieName?: string;
19
+ /** Session TTL in seconds. Defaults to 24h. */
20
+ sessionTtlSeconds?: number;
21
+ /**
22
+ * Authorize hook — given the verified id_token claims, return the
23
+ * AuthSession.user fields the runtime should use, or `null` to deny.
24
+ * Defaults to allowing any authenticated user with `id` from `sub`.
25
+ */
26
+ authorize?: (claims: JWTPayload) => Promise<AuthSession['user'] | null> | AuthSession['user'] | null;
27
+ authMethod?: string;
28
+ /**
29
+ * Allow plain-HTTP discovery + token exchange. Off by default —
30
+ * `openid-client` enforces HTTPS in production. Tests against an
31
+ * in-process IdP need this; production deploys must not enable it.
32
+ */
33
+ allowInsecureRequests?: boolean;
34
+ }
35
+ export declare class OidcAuthStrategy implements AuthStrategy {
36
+ readonly name = "oidc";
37
+ private readonly opts;
38
+ private readonly sessionKey;
39
+ private discoveryPromise;
40
+ constructor(options: OidcAuthStrategyOptions);
41
+ valid(req: Request): boolean;
42
+ authenticate(req: Request): Promise<AuthResult>;
43
+ routes(): ExpressRouter;
44
+ private config;
45
+ private handleLogin;
46
+ private handleCallback;
47
+ private resolveUser;
48
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export {};
@@ -0,0 +1,290 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * End-to-end OIDC test driving the full auth-code+PKCE dance against an
8
+ * in-process `node-oidc-provider`. Boots a real IdP on a random port,
9
+ * mounts `OidcAuthStrategy` on a real Express app, and walks login →
10
+ * IdP /auth → interaction (auto-resolved) → callback → session cookie →
11
+ * protected route hit. Catches integration bugs that unit tests can't:
12
+ * cookie wiring, redirect handling, state/PKCE round-trip, callback URL
13
+ * matching.
14
+ */
15
+ import http from 'node:http';
16
+ import { randomBytes } from 'node:crypto';
17
+ import express from 'express';
18
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
19
+ import Provider from 'oidc-provider';
20
+ import { OidcAuthStrategy } from './oidc.js';
21
+ import { authenticate, authRouter, getSession } from '../compose.js';
22
+ const TEST_USER = {
23
+ sub: 'user-42',
24
+ email: 'alice@example.com',
25
+ name: 'Alice Example',
26
+ };
27
+ async function resolveInteraction(provider, req, res) {
28
+ const details = await provider.interactionDetails(req, res);
29
+ if (details.prompt.name === 'login') {
30
+ await provider.interactionFinished(req, res, { login: { accountId: TEST_USER.sub } }, { mergeWithLastSubmission: false });
31
+ return;
32
+ }
33
+ // consent prompt — grant everything requested
34
+ const grant = new provider.Grant({
35
+ accountId: TEST_USER.sub,
36
+ clientId: 'test-client',
37
+ });
38
+ const missingScopes = details.prompt.details['missingOIDCScope'];
39
+ if (Array.isArray(missingScopes)) {
40
+ for (const scope of missingScopes) {
41
+ if (typeof scope === 'string')
42
+ grant.addOIDCScope(scope);
43
+ }
44
+ }
45
+ const grantId = await grant.save();
46
+ await provider.interactionFinished(req, res, { consent: { grantId } }, { mergeWithLastSubmission: true });
47
+ }
48
+ async function reservePort() {
49
+ return new Promise((resolve, reject) => {
50
+ const s = http.createServer();
51
+ s.on('error', reject);
52
+ s.listen(0, '127.0.0.1', () => {
53
+ const addr = s.address();
54
+ s.close(() => resolve(addr.port));
55
+ });
56
+ });
57
+ }
58
+ async function startIdp(issuerUrl, redirectUri) {
59
+ const provider = new Provider(issuerUrl, {
60
+ clients: [
61
+ {
62
+ client_id: 'test-client',
63
+ client_secret: 'test-secret',
64
+ redirect_uris: [redirectUri],
65
+ grant_types: ['authorization_code'],
66
+ response_types: ['code'],
67
+ token_endpoint_auth_method: 'client_secret_basic',
68
+ },
69
+ ],
70
+ pkce: { required: () => true },
71
+ findAccount: (_ctx, sub) => ({
72
+ accountId: sub,
73
+ claims: () => ({
74
+ sub,
75
+ email: TEST_USER.email,
76
+ name: TEST_USER.name,
77
+ }),
78
+ }),
79
+ cookies: {
80
+ keys: ['integration-test-cookie-key-please-rotate'],
81
+ },
82
+ // Most real IdPs (Okta, Auth0, Azure AD with optional claims) put
83
+ // scoped claims directly on the id_token. Match that behaviour so
84
+ // the strategy's `claims['email']` / `claims['name']` reads work.
85
+ conformIdTokenClaims: false,
86
+ claims: {
87
+ openid: ['sub'],
88
+ email: ['email', 'email_verified'],
89
+ profile: ['name', 'family_name', 'given_name', 'preferred_username'],
90
+ },
91
+ features: {
92
+ // The full IdP UI isn't relevant to us — we drive interactions via
93
+ // a custom resolver below.
94
+ devInteractions: { enabled: false },
95
+ },
96
+ // node-oidc-provider redirects to this URL when an interaction
97
+ // (login / consent) is required. The app provides routes there.
98
+ interactions: {
99
+ url: (_ctx, interaction) => `/interaction/${interaction.uid}`,
100
+ },
101
+ });
102
+ const app = express();
103
+ app.set('trust proxy', true);
104
+ // Auto-resolve every interaction as "this user has logged in and consented."
105
+ // Saves us from rendering or POSTing a real form.
106
+ app.get('/interaction/:uid', (req, res, next) => {
107
+ void resolveInteraction(provider, req, res).catch(next);
108
+ });
109
+ const oidcCallback = provider.callback();
110
+ app.use((req, res, next) => {
111
+ void oidcCallback(req, res).catch(next);
112
+ });
113
+ // Surface internal failures so the test can print them.
114
+ app.use((err, _req, res, _next) => {
115
+ const detail = err instanceof Error ? err.stack ?? err.message : String(err);
116
+ process.stderr.write(`[idp error] ${detail}\n`);
117
+ res.status(500).json({ error: detail });
118
+ });
119
+ const idpUrl = new URL(issuerUrl);
120
+ return new Promise((resolve, reject) => {
121
+ const server = http.createServer(app);
122
+ server.on('error', reject);
123
+ server.listen(Number(idpUrl.port), idpUrl.hostname, () => {
124
+ resolve({
125
+ url: issuerUrl,
126
+ close: () => new Promise((closeResolve, closeReject) => {
127
+ server.close((err) => (err ? closeReject(err) : closeResolve()));
128
+ }),
129
+ });
130
+ });
131
+ });
132
+ }
133
+ async function startApp(strategy, port) {
134
+ const app = express();
135
+ app.use(authRouter(strategy));
136
+ app.get('/protected', authenticate(strategy), (_req, res) => {
137
+ const session = getSession(res);
138
+ res.json({ user: session?.user, method: session?.method });
139
+ });
140
+ return new Promise((resolve, reject) => {
141
+ const server = http.createServer(app);
142
+ server.on('error', reject);
143
+ server.listen(port, '127.0.0.1', () => {
144
+ resolve({
145
+ url: `http://127.0.0.1:${port}`,
146
+ close: () => new Promise((closeResolve, closeReject) => {
147
+ server.close((err) => (err ? closeReject(err) : closeResolve()));
148
+ }),
149
+ });
150
+ });
151
+ });
152
+ }
153
+ function makeCookieJar() {
154
+ const store = new Map();
155
+ return {
156
+ store,
157
+ header: () => [...store.entries()].map(([name, value]) => `${name}=${value}`).join('; '),
158
+ ingest(setCookie) {
159
+ if (!setCookie)
160
+ return;
161
+ const list = Array.isArray(setCookie) ? setCookie : [setCookie];
162
+ for (const raw of list) {
163
+ const [pair] = raw.split(';');
164
+ if (!pair)
165
+ continue;
166
+ const eq = pair.indexOf('=');
167
+ if (eq === -1)
168
+ continue;
169
+ const name = pair.slice(0, eq).trim();
170
+ const value = pair.slice(eq + 1).trim();
171
+ if (value === '') {
172
+ store.delete(name);
173
+ }
174
+ else {
175
+ store.set(name, value);
176
+ }
177
+ }
178
+ },
179
+ };
180
+ }
181
+ async function followRedirects(start, jar, maxHops = 12) {
182
+ let current = start;
183
+ const trail = [];
184
+ for (let i = 0; i < maxHops; i++) {
185
+ const res = await fetch(current, {
186
+ redirect: 'manual',
187
+ headers: jar.store.size > 0 ? { cookie: jar.header() } : {},
188
+ });
189
+ const setCookie = res.headers.getSetCookie?.() ?? res.headers.get('set-cookie');
190
+ jar.ingest(setCookie ?? undefined);
191
+ trail.push(`${res.status} ${current}`);
192
+ if (res.status >= 300 && res.status < 400) {
193
+ const location = res.headers.get('location');
194
+ if (!location) {
195
+ return {
196
+ status: res.status,
197
+ url: current,
198
+ headers: headerObject(res.headers),
199
+ body: '',
200
+ trail,
201
+ };
202
+ }
203
+ current = new URL(location, current).toString();
204
+ continue;
205
+ }
206
+ const body = await res.text();
207
+ return { status: res.status, url: current, headers: headerObject(res.headers), body, trail };
208
+ }
209
+ throw new Error(`Too many redirects starting at ${start}\n${trail.join('\n')}`);
210
+ }
211
+ function headerObject(h) {
212
+ const out = {};
213
+ h.forEach((value, key) => {
214
+ out[key] = value;
215
+ });
216
+ return out;
217
+ }
218
+ describe('OidcAuthStrategy — integration', () => {
219
+ let idp;
220
+ let app;
221
+ let strategy;
222
+ const sessionSecret = randomBytes(32).toString('hex');
223
+ beforeAll(async () => {
224
+ // Reserve both ports up front so we can pin issuer + callback URLs
225
+ // into both the IdP config and the strategy config before either
226
+ // starts listening.
227
+ const idpPort = await reservePort();
228
+ const appPort = await reservePort();
229
+ const issuerUrl = `http://127.0.0.1:${idpPort}`;
230
+ const callbackUrl = `http://127.0.0.1:${appPort}/auth/callback`;
231
+ idp = await startIdp(issuerUrl, callbackUrl);
232
+ strategy = new OidcAuthStrategy({
233
+ issuer: issuerUrl,
234
+ clientId: 'test-client',
235
+ clientSecret: 'test-secret',
236
+ callbackUrl,
237
+ sessionSecret,
238
+ allowInsecureRequests: true,
239
+ });
240
+ app = await startApp(strategy, appPort);
241
+ }, 30_000);
242
+ afterAll(async () => {
243
+ if (app)
244
+ await app.close();
245
+ if (idp)
246
+ await idp.close();
247
+ });
248
+ it('rejects an unauthenticated request', async () => {
249
+ const res = await fetch(`${app.url}/protected`);
250
+ expect(res.status).toBe(401);
251
+ });
252
+ it('discovery doc is reachable on the IdP', async () => {
253
+ const res = await fetch(`${idp.url}/.well-known/openid-configuration`);
254
+ expect(res.status).toBe(200);
255
+ const body = (await res.json());
256
+ expect(body.issuer).toBe(idp.url);
257
+ });
258
+ it('walks the full authorization-code + PKCE dance and authenticates', async () => {
259
+ const jar = makeCookieJar();
260
+ // /auth/login → IdP /auth → interaction (auto-resolved twice: login + consent)
261
+ // → IdP /auth/<uid> → our /auth/callback?code=... → 302 to returnTo ('/').
262
+ // The trail terminates on the app's '/' (404 here only because the test
263
+ // app didn't register one — that's fine; what matters is we got back to
264
+ // the app's domain and the session cookie was issued in the callback hop.
265
+ const final = await followRedirects(`${app.url}/auth/login`, jar, 20);
266
+ if (final.status >= 500) {
267
+ process.stderr.write(`[trail]\n${final.trail.join('\n')}\n[final body] ${final.body}\n`);
268
+ throw new Error(`Unexpected 5xx during OIDC dance: ${final.status}`);
269
+ }
270
+ expect(final.url.startsWith(app.url)).toBe(true);
271
+ // session cookie should now be set
272
+ expect(jar.store.has('amodal_session')).toBe(true);
273
+ // protected route should work with the session cookie
274
+ const res = await fetch(`${app.url}/protected`, {
275
+ headers: { cookie: jar.header() },
276
+ });
277
+ expect(res.status).toBe(200);
278
+ const body = (await res.json());
279
+ expect(body.user.id).toBe(TEST_USER.sub);
280
+ expect(body.user.email).toBe(TEST_USER.email);
281
+ expect(body.method).toBe('oidc');
282
+ }, 30_000);
283
+ it('rejects a request with a tampered session cookie', async () => {
284
+ const res = await fetch(`${app.url}/protected`, {
285
+ headers: { cookie: 'amodal_session=garbage.token.here' },
286
+ });
287
+ expect(res.status).toBe(401);
288
+ });
289
+ });
290
+ //# sourceMappingURL=oidc.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc.integration.test.js","sourceRoot":"","sources":["../../../../src/auth/strategies/oidc.integration.test.ts"],"names":[],"mappings":"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"}