@amodalai/runtime 0.3.70 → 0.3.72
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/src/agent/local-server.js +7 -0
- package/dist/src/agent/local-server.js.map +1 -1
- package/dist/src/agent/local-server.test.js +96 -1
- package/dist/src/agent/local-server.test.js.map +1 -1
- package/dist/src/agent/routes/logs.d.ts +12 -0
- package/dist/src/agent/routes/logs.js +46 -0
- package/dist/src/agent/routes/logs.js.map +1 -0
- package/dist/src/agent/snapshot-server.js +4 -0
- package/dist/src/agent/snapshot-server.js.map +1 -1
- package/dist/src/auth/__fixtures__/custom-strategy.d.ts +8 -0
- package/dist/src/auth/__fixtures__/custom-strategy.js +27 -0
- package/dist/src/auth/__fixtures__/custom-strategy.js.map +1 -0
- package/dist/src/auth/compose.d.ts +55 -0
- package/dist/src/auth/compose.js +142 -0
- package/dist/src/auth/compose.js.map +1 -0
- package/dist/src/auth/compose.test.d.ts +6 -0
- package/dist/src/auth/compose.test.js +159 -0
- package/dist/src/auth/compose.test.js.map +1 -0
- package/dist/src/auth/config.d.ts +261 -0
- package/dist/src/auth/config.js +107 -0
- package/dist/src/auth/config.js.map +1 -0
- package/dist/src/auth/config.test.d.ts +6 -0
- package/dist/src/auth/config.test.js +85 -0
- package/dist/src/auth/config.test.js.map +1 -0
- package/dist/src/auth/factory.d.ts +19 -0
- package/dist/src/auth/factory.js +57 -0
- package/dist/src/auth/factory.js.map +1 -0
- package/dist/src/auth/factory.test.d.ts +6 -0
- package/dist/src/auth/factory.test.js +60 -0
- package/dist/src/auth/factory.test.js.map +1 -0
- package/dist/src/auth/index.d.ts +48 -0
- package/dist/src/auth/index.js +19 -0
- package/dist/src/auth/index.js.map +1 -0
- package/dist/src/auth/strategies/amodal.d.ts +36 -0
- package/dist/src/auth/strategies/amodal.js +28 -0
- package/dist/src/auth/strategies/amodal.js.map +1 -0
- package/dist/src/auth/strategies/api-key.d.ts +41 -0
- package/dist/src/auth/strategies/api-key.js +63 -0
- package/dist/src/auth/strategies/api-key.js.map +1 -0
- package/dist/src/auth/strategies/auth-modes.integration.test.d.ts +6 -0
- package/dist/src/auth/strategies/auth-modes.integration.test.js +363 -0
- package/dist/src/auth/strategies/auth-modes.integration.test.js.map +1 -0
- package/dist/src/auth/strategies/cookie.d.ts +41 -0
- package/dist/src/auth/strategies/cookie.js +84 -0
- package/dist/src/auth/strategies/cookie.js.map +1 -0
- package/dist/src/auth/strategies/custom-loader.d.ts +17 -0
- package/dist/src/auth/strategies/custom-loader.js +37 -0
- package/dist/src/auth/strategies/custom-loader.js.map +1 -0
- package/dist/src/auth/strategies/header.d.ts +35 -0
- package/dist/src/auth/strategies/header.js +42 -0
- package/dist/src/auth/strategies/header.js.map +1 -0
- package/dist/src/auth/strategies/jwks.d.ts +38 -0
- package/dist/src/auth/strategies/jwks.js +86 -0
- package/dist/src/auth/strategies/jwks.js.map +1 -0
- package/dist/src/auth/strategies/jwt-secret.d.ts +25 -0
- package/dist/src/auth/strategies/jwt-secret.js +82 -0
- package/dist/src/auth/strategies/jwt-secret.js.map +1 -0
- package/dist/src/auth/strategies/jwt-secret.test.d.ts +6 -0
- package/dist/src/auth/strategies/jwt-secret.test.js +75 -0
- package/dist/src/auth/strategies/jwt-secret.test.js.map +1 -0
- package/dist/src/auth/strategies/none.d.ts +37 -0
- package/dist/src/auth/strategies/none.js +31 -0
- package/dist/src/auth/strategies/none.js.map +1 -0
- package/dist/src/auth/strategies/oidc.d.ts +48 -0
- package/dist/src/auth/strategies/oidc.integration.test.d.ts +6 -0
- package/dist/src/auth/strategies/oidc.integration.test.js +290 -0
- package/dist/src/auth/strategies/oidc.integration.test.js.map +1 -0
- package/dist/src/auth/strategies/oidc.js +284 -0
- package/dist/src/auth/strategies/oidc.js.map +1 -0
- package/dist/src/auth/strategies/oidc.test.d.ts +6 -0
- package/dist/src/auth/strategies/oidc.test.js +111 -0
- package/dist/src/auth/strategies/oidc.test.js.map +1 -0
- package/dist/src/auth/strategies/strategies.test.d.ts +6 -0
- package/dist/src/auth/strategies/strategies.test.js +190 -0
- package/dist/src/auth/strategies/strategies.test.js.map +1 -0
- package/dist/src/auth/types.d.ts +95 -0
- package/dist/src/auth/types.js +7 -0
- package/dist/src/auth/types.js.map +1 -0
- package/dist/src/index.d.ts +4 -2
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/logger.d.ts +4 -3
- package/dist/src/logger.js +2 -1
- package/dist/src/logger.js.map +1 -1
- package/dist/src/logger.test.js +22 -1
- package/dist/src/logger.test.js.map +1 -1
- package/dist/src/runtime-log-store.d.ts +37 -0
- package/dist/src/runtime-log-store.js +132 -0
- package/dist/src/runtime-log-store.js.map +1 -0
- package/dist/src/server.js +7 -0
- package/dist/src/server.js.map +1 -1
- package/dist/src/session/manager.d.ts +1 -0
- package/dist/src/session/manager.js +18 -7
- package/dist/src/session/manager.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -4
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* OIDC strategy tests focus on the bits we own: cookie verification on
|
|
8
|
+
* subsequent requests, route mounting, logout. The OAuth dance itself
|
|
9
|
+
* (login redirect, callback exchange) is delegated to `openid-client`
|
|
10
|
+
* and exercised at the boundary by mocking that module.
|
|
11
|
+
*/
|
|
12
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
13
|
+
import { SignJWT } from 'jose';
|
|
14
|
+
import express from 'express';
|
|
15
|
+
import supertest from 'supertest';
|
|
16
|
+
const oidcMocks = {
|
|
17
|
+
discovery: vi.fn(),
|
|
18
|
+
randomPKCECodeVerifier: vi.fn(() => 'pkce-verifier'),
|
|
19
|
+
calculatePKCECodeChallenge: vi.fn(() => Promise.resolve('pkce-challenge')),
|
|
20
|
+
randomState: vi.fn(() => 'state-abc'),
|
|
21
|
+
buildAuthorizationUrl: vi.fn((_cfg, params) => {
|
|
22
|
+
const u = new URL('https://acme.okta.com/oauth2/v1/authorize');
|
|
23
|
+
for (const [k, v] of Object.entries(params))
|
|
24
|
+
u.searchParams.set(k, String(v));
|
|
25
|
+
return u;
|
|
26
|
+
}),
|
|
27
|
+
authorizationCodeGrant: vi.fn(),
|
|
28
|
+
};
|
|
29
|
+
vi.mock('openid-client', () => oidcMocks);
|
|
30
|
+
const { OidcAuthStrategy } = await import('./oidc.js');
|
|
31
|
+
const SESSION_SECRET = 'a-secret-of-at-least-16-chars';
|
|
32
|
+
const KEY = new TextEncoder().encode(SESSION_SECRET);
|
|
33
|
+
function reqWith(cookie) {
|
|
34
|
+
return { headers: cookie ? { cookie } : {} };
|
|
35
|
+
}
|
|
36
|
+
async function mintSession(payload) {
|
|
37
|
+
return new SignJWT(payload)
|
|
38
|
+
.setProtectedHeader({ alg: 'HS256' })
|
|
39
|
+
.setIssuer('amodal-runtime')
|
|
40
|
+
.setSubject('u-1')
|
|
41
|
+
.setIssuedAt()
|
|
42
|
+
.setExpirationTime('1h')
|
|
43
|
+
.sign(KEY);
|
|
44
|
+
}
|
|
45
|
+
function newStrategy() {
|
|
46
|
+
return new OidcAuthStrategy({
|
|
47
|
+
issuer: 'https://acme.okta.com',
|
|
48
|
+
clientId: 'abc',
|
|
49
|
+
clientSecret: 'shh',
|
|
50
|
+
callbackUrl: 'https://agent.example.com/auth/callback',
|
|
51
|
+
sessionSecret: SESSION_SECRET,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
describe('OidcAuthStrategy — cookie verification', () => {
|
|
55
|
+
beforeEach(() => {
|
|
56
|
+
Object.values(oidcMocks).forEach((m) => {
|
|
57
|
+
if (typeof m.mockReset === 'function') {
|
|
58
|
+
m.mockReset();
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
it('valid() is false without the session cookie', () => {
|
|
63
|
+
const s = newStrategy();
|
|
64
|
+
expect(s.valid(reqWith())).toBe(false);
|
|
65
|
+
});
|
|
66
|
+
it('authenticates with a valid session cookie', async () => {
|
|
67
|
+
const token = await mintSession({ sub: 'u-1', email: 'a@b', name: 'Alice', claims: { groups: ['eng'] } });
|
|
68
|
+
const s = newStrategy();
|
|
69
|
+
const r = await s.authenticate(reqWith(`amodal_session=${token}`));
|
|
70
|
+
expect(r.kind).toBe('authenticated');
|
|
71
|
+
if (r.kind === 'authenticated') {
|
|
72
|
+
expect(r.session.user).toEqual({ id: 'u-1', email: 'a@b', name: 'Alice' });
|
|
73
|
+
expect(r.session.method).toBe('oidc');
|
|
74
|
+
expect(r.session.claims).toEqual({ groups: ['eng'] });
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
it('rejects a session cookie signed with the wrong secret', async () => {
|
|
78
|
+
const token = await new SignJWT({ sub: 'u' })
|
|
79
|
+
.setProtectedHeader({ alg: 'HS256' })
|
|
80
|
+
.setIssuer('amodal-runtime')
|
|
81
|
+
.setIssuedAt()
|
|
82
|
+
.setExpirationTime('1h')
|
|
83
|
+
.sign(new TextEncoder().encode('different-secret-of-16-chars'));
|
|
84
|
+
const s = newStrategy();
|
|
85
|
+
const r = await s.authenticate(reqWith(`amodal_session=${token}`));
|
|
86
|
+
expect(r.kind).toBe('rejected');
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe('OidcAuthStrategy — routes', () => {
|
|
90
|
+
it('GET /auth/login redirects to the IdP authorize URL', async () => {
|
|
91
|
+
const s = newStrategy();
|
|
92
|
+
const app = express();
|
|
93
|
+
app.use(s.routes());
|
|
94
|
+
const res = await supertest(app).get('/auth/login');
|
|
95
|
+
expect(res.status).toBe(302);
|
|
96
|
+
expect(res.headers['location']).toContain('https://acme.okta.com/oauth2/v1/authorize');
|
|
97
|
+
expect(res.headers['location']).toContain('state=state-abc');
|
|
98
|
+
// Sets the OAuth state cookie for the callback to recover
|
|
99
|
+
expect(res.headers['set-cookie']?.[0]).toMatch(/amodal_oauth_state=/);
|
|
100
|
+
});
|
|
101
|
+
it('POST /auth/logout clears the session cookie', async () => {
|
|
102
|
+
const s = newStrategy();
|
|
103
|
+
const app = express();
|
|
104
|
+
app.use(s.routes());
|
|
105
|
+
const res = await supertest(app).post('/auth/logout');
|
|
106
|
+
expect(res.status).toBe(200);
|
|
107
|
+
expect(res.body).toEqual({ ok: true });
|
|
108
|
+
expect(res.headers['set-cookie']?.[0]).toMatch(/amodal_session=; .*Max-Age=0/);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=oidc.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc.test.js","sourceRoot":"","sources":["../../../../src/auth/strategies/oidc.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
|
+
import { ApiKeyAuthStrategy } from './api-key.js';
|
|
8
|
+
import { HeaderAuthStrategy } from './header.js';
|
|
9
|
+
import { NoneAuthStrategy } from './none.js';
|
|
10
|
+
const jwtVerifyMock = vi.fn();
|
|
11
|
+
const createRemoteJWKSetMock = vi.fn(() => () => Promise.resolve({}));
|
|
12
|
+
vi.mock('jose', () => ({
|
|
13
|
+
jwtVerify: jwtVerifyMock,
|
|
14
|
+
createRemoteJWKSet: createRemoteJWKSetMock,
|
|
15
|
+
}));
|
|
16
|
+
const { JwksAuthStrategy } = await import('./jwks.js');
|
|
17
|
+
const { CookieSessionStrategy } = await import('./cookie.js');
|
|
18
|
+
function reqAuth(value) {
|
|
19
|
+
return { headers: value === null ? {} : { authorization: value } };
|
|
20
|
+
}
|
|
21
|
+
function reqHeaders(headers) {
|
|
22
|
+
return { headers };
|
|
23
|
+
}
|
|
24
|
+
describe('JwksAuthStrategy', () => {
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
jwtVerifyMock.mockReset();
|
|
27
|
+
createRemoteJWKSetMock.mockClear();
|
|
28
|
+
});
|
|
29
|
+
it('valid() is false when there is no Bearer header', () => {
|
|
30
|
+
const s = new JwksAuthStrategy({ jwksUrl: 'https://example.com/.well-known/jwks.json' });
|
|
31
|
+
expect(s.valid(reqAuth(null))).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
it('valid() is false on ak_-prefixed tokens (lets ApiKeyAuthStrategy handle)', () => {
|
|
34
|
+
const s = new JwksAuthStrategy({ jwksUrl: 'https://example.com/.well-known/jwks.json' });
|
|
35
|
+
expect(s.valid(reqAuth('Bearer ak_xyz'))).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
it('valid() is true on a 3-segment Bearer token', () => {
|
|
38
|
+
const s = new JwksAuthStrategy({ jwksUrl: 'https://example.com/.well-known/jwks.json' });
|
|
39
|
+
expect(s.valid(reqAuth('Bearer aa.bb.cc'))).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
it('rejects with reason when jwtVerify rejects', async () => {
|
|
42
|
+
jwtVerifyMock.mockRejectedValue(new Error('signature verification failed'));
|
|
43
|
+
const s = new JwksAuthStrategy({ jwksUrl: 'https://example.com/.well-known/jwks.json' });
|
|
44
|
+
const r = await s.authenticate(reqAuth('Bearer aa.bb.cc'));
|
|
45
|
+
expect(r.kind).toBe('rejected');
|
|
46
|
+
if (r.kind === 'rejected') {
|
|
47
|
+
expect(r.reason).toMatch(/signature verification failed/);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
it('builds an authenticated session from the verified payload', async () => {
|
|
51
|
+
jwtVerifyMock.mockResolvedValue({
|
|
52
|
+
payload: { sub: 'user-42', email: 'user@example.com', agent_id: 'agent-1', scope_id: 'tenant-7' },
|
|
53
|
+
});
|
|
54
|
+
const s = new JwksAuthStrategy({ jwksUrl: 'https://example.com/.well-known/jwks.json' });
|
|
55
|
+
const r = await s.authenticate(reqAuth('Bearer aa.bb.cc'));
|
|
56
|
+
expect(r.kind).toBe('authenticated');
|
|
57
|
+
if (r.kind === 'authenticated') {
|
|
58
|
+
expect(r.session.user).toEqual({ id: 'user-42', email: 'user@example.com' });
|
|
59
|
+
expect(r.session.agentId).toBe('agent-1');
|
|
60
|
+
expect(r.session.scopeId).toBe('tenant-7');
|
|
61
|
+
expect(r.session.method).toBe('jwks');
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
it('passes jwksOptions through to createRemoteJWKSet', () => {
|
|
65
|
+
new JwksAuthStrategy({
|
|
66
|
+
jwksUrl: 'https://example.com/.well-known/jwks.json',
|
|
67
|
+
jwksOptions: { cooldownDuration: 30_000 },
|
|
68
|
+
});
|
|
69
|
+
expect(createRemoteJWKSetMock).toHaveBeenCalledWith(expect.any(URL), expect.objectContaining({ cooldownDuration: 30_000 }));
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('ApiKeyAuthStrategy', () => {
|
|
73
|
+
it('valid() is false without ak_ prefix', () => {
|
|
74
|
+
const s = new ApiKeyAuthStrategy({ validate: () => Promise.resolve(null) });
|
|
75
|
+
expect(s.valid(reqAuth('Bearer aa.bb.cc'))).toBe(false);
|
|
76
|
+
expect(s.valid(reqAuth(null))).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
it('valid() is true on ak_ Bearer', () => {
|
|
79
|
+
const s = new ApiKeyAuthStrategy({ validate: () => Promise.resolve(null) });
|
|
80
|
+
expect(s.valid(reqAuth('Bearer ak_abc'))).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
it('rejects when validate returns null', async () => {
|
|
83
|
+
const s = new ApiKeyAuthStrategy({ validate: () => Promise.resolve(null) });
|
|
84
|
+
const r = await s.authenticate(reqAuth('Bearer ak_bad'));
|
|
85
|
+
expect(r.kind).toBe('rejected');
|
|
86
|
+
});
|
|
87
|
+
it('authenticates when validate returns a result', async () => {
|
|
88
|
+
const s = new ApiKeyAuthStrategy({
|
|
89
|
+
validate: () => Promise.resolve({ userId: 'u1', email: 'a@b', agentId: 'agent-1' }),
|
|
90
|
+
});
|
|
91
|
+
const r = await s.authenticate(reqAuth('Bearer ak_good'));
|
|
92
|
+
expect(r.kind).toBe('authenticated');
|
|
93
|
+
if (r.kind === 'authenticated') {
|
|
94
|
+
expect(r.session.user).toEqual({ id: 'u1', email: 'a@b' });
|
|
95
|
+
expect(r.session.agentId).toBe('agent-1');
|
|
96
|
+
expect(r.session.method).toBe('api-key');
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
it('LRU cache hits skip the validate callback', async () => {
|
|
100
|
+
const validate = vi.fn(() => Promise.resolve({ userId: 'u1' }));
|
|
101
|
+
const s = new ApiKeyAuthStrategy({ validate, cacheMaxEntries: 100 });
|
|
102
|
+
await s.authenticate(reqAuth('Bearer ak_x'));
|
|
103
|
+
await s.authenticate(reqAuth('Bearer ak_x'));
|
|
104
|
+
expect(validate).toHaveBeenCalledTimes(1);
|
|
105
|
+
});
|
|
106
|
+
it('LRU evicts oldest when cap is hit', async () => {
|
|
107
|
+
const validate = vi.fn(() => Promise.resolve({ userId: 'u' }));
|
|
108
|
+
const s = new ApiKeyAuthStrategy({ validate, cacheMaxEntries: 2 });
|
|
109
|
+
await s.authenticate(reqAuth('Bearer ak_a'));
|
|
110
|
+
await s.authenticate(reqAuth('Bearer ak_b'));
|
|
111
|
+
await s.authenticate(reqAuth('Bearer ak_c')); // evicts ak_a
|
|
112
|
+
await s.authenticate(reqAuth('Bearer ak_a')); // miss → revalidate
|
|
113
|
+
expect(validate).toHaveBeenCalledTimes(4);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('HeaderAuthStrategy', () => {
|
|
117
|
+
it('valid() is false without the configured header', () => {
|
|
118
|
+
const s = new HeaderAuthStrategy({});
|
|
119
|
+
expect(s.valid(reqHeaders({}))).toBe(false);
|
|
120
|
+
});
|
|
121
|
+
it('reads from default X-Auth-User', async () => {
|
|
122
|
+
const s = new HeaderAuthStrategy({});
|
|
123
|
+
const r = await s.authenticate(reqHeaders({ 'x-auth-user': 'u-1' }));
|
|
124
|
+
expect(r.kind).toBe('authenticated');
|
|
125
|
+
if (r.kind === 'authenticated') {
|
|
126
|
+
expect(r.session.user.id).toBe('u-1');
|
|
127
|
+
expect(r.session.scopeId).toBe('u-1');
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
it('honors custom header name (case-insensitive)', async () => {
|
|
131
|
+
const s = new HeaderAuthStrategy({ headerName: 'X-Subject' });
|
|
132
|
+
const r = await s.authenticate(reqHeaders({ 'x-subject': 'u-2' }));
|
|
133
|
+
expect(r.kind).toBe('authenticated');
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('NoneAuthStrategy', () => {
|
|
137
|
+
it('valid() is always true (chain stops here)', () => {
|
|
138
|
+
const s = new NoneAuthStrategy();
|
|
139
|
+
expect(s.valid({})).toBe(true);
|
|
140
|
+
});
|
|
141
|
+
it('produces a synthetic anonymous session', async () => {
|
|
142
|
+
const s = new NoneAuthStrategy();
|
|
143
|
+
const r = await s.authenticate({});
|
|
144
|
+
expect(r.kind).toBe('authenticated');
|
|
145
|
+
if (r.kind === 'authenticated') {
|
|
146
|
+
expect(r.session.user.id).toBe('anonymous');
|
|
147
|
+
expect(r.session.method).toBe('none');
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
it('honors a custom userId', async () => {
|
|
151
|
+
const s = new NoneAuthStrategy({ userId: 'guest' });
|
|
152
|
+
const r = await s.authenticate({});
|
|
153
|
+
if (r.kind === 'authenticated') {
|
|
154
|
+
expect(r.session.user.id).toBe('guest');
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe('CookieSessionStrategy', () => {
|
|
159
|
+
beforeEach(() => {
|
|
160
|
+
jwtVerifyMock.mockReset();
|
|
161
|
+
});
|
|
162
|
+
it('valid() is false when the cookie is absent', () => {
|
|
163
|
+
const s = new CookieSessionStrategy({ jwksUrl: 'https://example.com/jwks' });
|
|
164
|
+
expect(s.valid(reqHeaders({}))).toBe(false);
|
|
165
|
+
});
|
|
166
|
+
it('valid() is true when the configured cookie is present', () => {
|
|
167
|
+
const s = new CookieSessionStrategy({ jwksUrl: 'https://example.com/jwks' });
|
|
168
|
+
expect(s.valid(reqHeaders({ cookie: 'amodal_session=abc.def.ghi; other=x' }))).toBe(true);
|
|
169
|
+
});
|
|
170
|
+
it('verifies the cookie JWT and builds a session', async () => {
|
|
171
|
+
jwtVerifyMock.mockResolvedValue({ payload: { sub: 'cu-1', email: 'c@x' } });
|
|
172
|
+
const s = new CookieSessionStrategy({ jwksUrl: 'https://example.com/jwks' });
|
|
173
|
+
const r = await s.authenticate(reqHeaders({ cookie: 'amodal_session=aa.bb.cc' }));
|
|
174
|
+
expect(r.kind).toBe('authenticated');
|
|
175
|
+
if (r.kind === 'authenticated') {
|
|
176
|
+
expect(r.session.user).toEqual({ id: 'cu-1', email: 'c@x' });
|
|
177
|
+
expect(r.session.method).toBe('cookie');
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
it('rejects when JWT verify fails', async () => {
|
|
181
|
+
jwtVerifyMock.mockRejectedValue(new Error('expired'));
|
|
182
|
+
const s = new CookieSessionStrategy({ jwksUrl: 'https://example.com/jwks' });
|
|
183
|
+
const r = await s.authenticate(reqHeaders({ cookie: 'amodal_session=aa.bb.cc' }));
|
|
184
|
+
expect(r.kind).toBe('rejected');
|
|
185
|
+
if (r.kind === 'rejected') {
|
|
186
|
+
expect(r.reason).toMatch(/expired/);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
//# sourceMappingURL=strategies.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategies.test.js","sourceRoot":"","sources":["../../../../src/auth/strategies/strategies.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Auth strategy interface — modeled on Rails' Warden.
|
|
8
|
+
*
|
|
9
|
+
* Each strategy is two methods:
|
|
10
|
+
*
|
|
11
|
+
* - `valid(req)`: cheap, synchronous check — does this strategy apply to
|
|
12
|
+
* the request at all? (E.g. JwksStrategy returns false when there's no
|
|
13
|
+
* Bearer header; ApiKeyStrategy returns false when the token doesn't
|
|
14
|
+
* start with `ak_`.) Strategies that return false are skipped without
|
|
15
|
+
* running their `authenticate` step.
|
|
16
|
+
*
|
|
17
|
+
* - `authenticate(req)`: the slow path. Verify the token / call the IdP /
|
|
18
|
+
* read the cookie. Returns a discriminated union:
|
|
19
|
+
*
|
|
20
|
+
* { kind: 'authenticated', session } ← chain stops, request proceeds
|
|
21
|
+
* { kind: 'rejected', reason } ← chain stops, request 401s
|
|
22
|
+
*
|
|
23
|
+
* No exceptions for control flow. Plugin authors can't accidentally
|
|
24
|
+
* bypass auth by returning the wrong sentinel.
|
|
25
|
+
*
|
|
26
|
+
* Strategies that own a login flow (OAuth dance, magic link, etc.)
|
|
27
|
+
* implement the optional `routes()` method to mount their own routes
|
|
28
|
+
* onto the auth controller's router (`/auth/<strategy>/start`,
|
|
29
|
+
* `/auth/<strategy>/callback`, etc.).
|
|
30
|
+
*
|
|
31
|
+
* Order = priority. Compose strategies into a chain via `authenticate(...)`.
|
|
32
|
+
* The first strategy whose `valid(req)` returns true and whose
|
|
33
|
+
* `authenticate(req)` returns 'authenticated' wins. No merging across
|
|
34
|
+
* strategies.
|
|
35
|
+
*/
|
|
36
|
+
import type { Request, Router } from 'express';
|
|
37
|
+
/**
|
|
38
|
+
* The authenticated identity attached to `res.locals.session` by the
|
|
39
|
+
* auth middleware. Every strategy populates `user.id` (required); other
|
|
40
|
+
* fields are optional or strategy-specific.
|
|
41
|
+
*/
|
|
42
|
+
export interface AuthSession {
|
|
43
|
+
user: {
|
|
44
|
+
/** Stable identifier for the principal. Required. */
|
|
45
|
+
id: string;
|
|
46
|
+
email?: string;
|
|
47
|
+
name?: string;
|
|
48
|
+
};
|
|
49
|
+
/** Strategy that authenticated the request (`'jwks'`, `'api-key'`, etc.). */
|
|
50
|
+
method: string;
|
|
51
|
+
/**
|
|
52
|
+
* Stable identifier for the agent this session is scoped to, when the
|
|
53
|
+
* strategy carries it (e.g. platform JWTs include `agent_id`). Optional.
|
|
54
|
+
*/
|
|
55
|
+
agentId?: string;
|
|
56
|
+
/**
|
|
57
|
+
* End-user scope id — used for per-user data isolation when the agent
|
|
58
|
+
* has end-user auth configured. Optional.
|
|
59
|
+
*/
|
|
60
|
+
scopeId?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Raw provider claims, opaque to the runtime. Strategies that have
|
|
63
|
+
* additional payload (OIDC `groups`, custom JWT fields) put it here.
|
|
64
|
+
*/
|
|
65
|
+
claims?: Record<string, unknown>;
|
|
66
|
+
}
|
|
67
|
+
export type AuthResult = {
|
|
68
|
+
kind: 'authenticated';
|
|
69
|
+
session: AuthSession;
|
|
70
|
+
} | {
|
|
71
|
+
kind: 'rejected';
|
|
72
|
+
reason: string;
|
|
73
|
+
};
|
|
74
|
+
export interface AuthStrategy {
|
|
75
|
+
/** Stable identifier (`'jwks'`, `'oidc'`, `'api-key'`, etc.). */
|
|
76
|
+
readonly name: string;
|
|
77
|
+
/**
|
|
78
|
+
* Cheap, synchronous check: does this strategy apply to the request?
|
|
79
|
+
* Strategies must return false promptly when they don't recognize the
|
|
80
|
+
* incoming credential shape so the chain falls through to the next
|
|
81
|
+
* strategy without paying the `authenticate` cost.
|
|
82
|
+
*/
|
|
83
|
+
valid(req: Request): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Slow path: actually verify the credential. Called only when
|
|
86
|
+
* `valid(req)` returned true. Must return either an authenticated
|
|
87
|
+
* session or a rejection reason — never throw for control flow.
|
|
88
|
+
*/
|
|
89
|
+
authenticate(req: Request): Promise<AuthResult>;
|
|
90
|
+
/**
|
|
91
|
+
* Optional: mount strategy-specific routes (login redirects, OAuth
|
|
92
|
+
* callbacks, magic-link handlers, etc.) onto the auth router.
|
|
93
|
+
*/
|
|
94
|
+
routes?(): Router;
|
|
95
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ export { createStoresRouter } from './agent/routes/stores.js';
|
|
|
27
27
|
export type { StoreRouterOptions } from './agent/routes/stores.js';
|
|
28
28
|
export { getAuthContext } from './middleware/auth.js';
|
|
29
29
|
export type { AuthContext } from './middleware/auth.js';
|
|
30
|
+
export { authenticate, authRouter, getSession, JwksAuthStrategy, ApiKeyAuthStrategy, HeaderAuthStrategy, NoneAuthStrategy, CookieSessionStrategy, JwtSecretAuthStrategy, OidcAuthStrategy, AmodalAuthStrategy, AuthConfigSchema, parseAuthConfig, createAuthStrategy, loadCustomStrategy, } from './auth/index.js';
|
|
31
|
+
export type { AuthStrategy, AuthResult, AuthSession, AuthLogEvent, AuthenticateOptions, JwksAuthStrategyOptions, ApiKeyAuthStrategyOptions, ApiKeyValidationResult, HeaderAuthStrategyOptions, NoneAuthStrategyOptions, CookieSessionStrategyOptions, JwtSecretAuthStrategyOptions, OidcAuthStrategyOptions, AmodalAuthStrategyOptions, AuthConfig, NoneAuthConfig, JwtSecretAuthConfig, OidcAuthConfig, HeaderAuthConfig, CustomAuthConfig, AmodalAuthConfig, } from './auth/index.js';
|
|
30
32
|
export { commitSetup, composeAmodalJson, SetupNotReadyError, } from './setup/commit-setup.js';
|
|
31
33
|
export type { CommitSetupOptions, CommitSetupResult, CommitSetupSuccess, CommitSetupNotReady, CommitSetupNoState, } from './setup/commit-setup.js';
|
|
32
34
|
export { resolveScope } from './scope.js';
|
|
@@ -44,8 +46,8 @@ export { routeOutput } from './output/output-router.js';
|
|
|
44
46
|
export { errorHandler } from './middleware/error-handler.js';
|
|
45
47
|
export { AmodalError, ProviderError, RateLimitError, ProviderTimeoutError, ToolExecutionError, StoreError, ConnectionError, SessionError, CompactionError, ConfigError, } from './errors.js';
|
|
46
48
|
export type { Result } from './errors.js';
|
|
47
|
-
export { log, setLogLevel, getLogLevel, setLogFormat, getLogFormat, setSanitize, LogLevel, initLogLevel, interceptConsole, verbosityToLogLevel, createLogger } from './logger.js';
|
|
48
|
-
export type { Logger, LoggerConfig, LogFormat } from './logger.js';
|
|
49
|
+
export { log, setLogLevel, getLogLevel, setLogFormat, getLogFormat, setSanitize, subscribeToLogs, LogLevel, initLogLevel, interceptConsole, verbosityToLogLevel, createLogger } from './logger.js';
|
|
50
|
+
export type { Logger, LoggerConfig, LogEntry, LogFormat, LogListener } from './logger.js';
|
|
49
51
|
export { loadConfig } from './config.js';
|
|
50
52
|
export type { AgentConfig as LegacyAgentConfig, ConfigOverrides, LoadConfigOptions, McpServerConfig } from './config.js';
|
|
51
53
|
export { createProvider } from './providers/create-provider.js';
|
package/dist/src/index.js
CHANGED
|
@@ -33,6 +33,8 @@ export { createTaskRouter } from './agent/routes/task.js';
|
|
|
33
33
|
export { createStoresRouter } from './agent/routes/stores.js';
|
|
34
34
|
// Auth types (middleware implementation provided by hosting layer)
|
|
35
35
|
export { getAuthContext } from './middleware/auth.js';
|
|
36
|
+
// Pluggable auth — Warden-shape primitive layer.
|
|
37
|
+
export { authenticate, authRouter, getSession, JwksAuthStrategy, ApiKeyAuthStrategy, HeaderAuthStrategy, NoneAuthStrategy, CookieSessionStrategy, JwtSecretAuthStrategy, OidcAuthStrategy, AmodalAuthStrategy, AuthConfigSchema, parseAuthConfig, createAuthStrategy, loadCustomStrategy, } from './auth/index.js';
|
|
36
38
|
// Setup-completion primitive (Phase E.2). Used by both the agent
|
|
37
39
|
// `request_complete_setup` / `force_complete_setup` tools and the
|
|
38
40
|
// Studio "Finish setup" button via /api/admin-chat/commit-setup.
|
|
@@ -57,7 +59,7 @@ export { errorHandler } from './middleware/error-handler.js';
|
|
|
57
59
|
// Typed error classes
|
|
58
60
|
export { AmodalError, ProviderError, RateLimitError, ProviderTimeoutError, ToolExecutionError, StoreError, ConnectionError, SessionError, CompactionError, ConfigError, } from './errors.js';
|
|
59
61
|
// Logger
|
|
60
|
-
export { log, setLogLevel, getLogLevel, setLogFormat, getLogFormat, setSanitize, LogLevel, initLogLevel, interceptConsole, verbosityToLogLevel, createLogger } from './logger.js';
|
|
62
|
+
export { log, setLogLevel, getLogLevel, setLogFormat, getLogFormat, setSanitize, subscribeToLogs, LogLevel, initLogLevel, interceptConsole, verbosityToLogLevel, createLogger } from './logger.js';
|
|
61
63
|
// Config
|
|
62
64
|
export { loadConfig } from './config.js';
|
|
63
65
|
// LLM Provider (Vercel AI SDK abstraction)
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,YAAY,EAAuB,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,oBAAoB,EAA8B,MAAM,uBAAuB,CAAC;AAEzF,0DAA0D;AAC1D,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,OAAO,EACP,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAO5B,aAAa;AACb,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,gBAAgB;AAChB,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGlE,gFAAgF;AAChF,2EAA2E;AAC3E,8EAA8E;AAC9E,wCAAwC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,kEAAkE;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D,mEAAmE;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,iEAAiE;AACjE,kEAAkE;AAClE,iEAAiE;AACjE,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AASjC,yEAAyE;AACzE,2EAA2E;AAC3E,qEAAqE;AACrE,0CAA0C;AAC1C,gEAAgE;AAEhE,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,wBAAwB;AACxB,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE9F,OAAO,EACL,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAM5B,iFAAiF;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,kDAAkD;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,sBAAsB;AACtB,OAAO,EACL,WAAW,EACX,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,eAAe,EACf,WAAW,GACZ,MAAM,aAAa,CAAC;AAGrB,SAAS;AACT,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/logger.d.ts
CHANGED
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
* The Logger interface and core implementation live in @amodalai/core.
|
|
11
11
|
* This module re-exports them and adds runtime-only functions.
|
|
12
12
|
*/
|
|
13
|
-
import { createLogger as coreCreateLogger, setLogLevel as coreSetLogLevel, getLogLevel as coreGetLogLevel, setLogFormat as coreSetLogFormat, getLogFormat as coreGetLogFormat, setSanitize as coreSetSanitize, LogLevel } from '@amodalai/core';
|
|
14
|
-
import type { Logger, LoggerConfig, LogFormat } from '@amodalai/core';
|
|
13
|
+
import { createLogger as coreCreateLogger, setLogLevel as coreSetLogLevel, getLogLevel as coreGetLogLevel, setLogFormat as coreSetLogFormat, getLogFormat as coreGetLogFormat, setSanitize as coreSetSanitize, subscribeToLogs as coreSubscribeToLogs, LogLevel } from '@amodalai/core';
|
|
14
|
+
import type { Logger, LoggerConfig, LogEntry, LogFormat, LogListener } from '@amodalai/core';
|
|
15
15
|
export { LogLevel };
|
|
16
|
-
export type { Logger, LoggerConfig, LogFormat };
|
|
16
|
+
export type { Logger, LoggerConfig, LogEntry, LogFormat, LogListener };
|
|
17
17
|
export declare const log: Logger;
|
|
18
18
|
export declare const createLogger: typeof coreCreateLogger;
|
|
19
19
|
export declare const setLogLevel: typeof coreSetLogLevel;
|
|
@@ -21,6 +21,7 @@ export declare const getLogLevel: typeof coreGetLogLevel;
|
|
|
21
21
|
export declare const setLogFormat: typeof coreSetLogFormat;
|
|
22
22
|
export declare const getLogFormat: typeof coreGetLogFormat;
|
|
23
23
|
export declare const setSanitize: typeof coreSetSanitize;
|
|
24
|
+
export declare const subscribeToLogs: typeof coreSubscribeToLogs;
|
|
24
25
|
/**
|
|
25
26
|
* Convert -v count and --quiet flag to a LogLevel.
|
|
26
27
|
* --quiet → ERROR, default → INFO, -v → DEBUG, -vv → TRACE
|
package/dist/src/logger.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* The Logger interface and core implementation live in @amodalai/core.
|
|
11
11
|
* This module re-exports them and adds runtime-only functions.
|
|
12
12
|
*/
|
|
13
|
-
import { log as coreLog, createLogger as coreCreateLogger, setLogLevel as coreSetLogLevel, getLogLevel as coreGetLogLevel, setLogFormat as coreSetLogFormat, getLogFormat as coreGetLogFormat, setSanitize as coreSetSanitize, LogLevel, } from '@amodalai/core';
|
|
13
|
+
import { log as coreLog, createLogger as coreCreateLogger, setLogLevel as coreSetLogLevel, getLogLevel as coreGetLogLevel, setLogFormat as coreSetLogFormat, getLogFormat as coreGetLogFormat, setSanitize as coreSetSanitize, subscribeToLogs as coreSubscribeToLogs, LogLevel, } from '@amodalai/core';
|
|
14
14
|
// Re-export core logger API
|
|
15
15
|
export { LogLevel };
|
|
16
16
|
export const log = coreLog;
|
|
@@ -20,6 +20,7 @@ export const getLogLevel = coreGetLogLevel;
|
|
|
20
20
|
export const setLogFormat = coreSetLogFormat;
|
|
21
21
|
export const getLogFormat = coreGetLogFormat;
|
|
22
22
|
export const setSanitize = coreSetSanitize;
|
|
23
|
+
export const subscribeToLogs = coreSubscribeToLogs;
|
|
23
24
|
/**
|
|
24
25
|
* Convert -v count and --quiet flag to a LogLevel.
|
|
25
26
|
* --quiet → ERROR, default → INFO, -v → DEBUG, -vv → TRACE
|
package/dist/src/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;GAMG;AAEH,OAAO,EACL,GAAG,IAAI,OAAO,EACd,YAAY,IAAI,gBAAgB,EAChC,WAAW,IAAI,eAAe,EAC9B,WAAW,IAAI,eAAe,EAC9B,YAAY,IAAI,gBAAgB,EAChC,YAAY,IAAI,gBAAgB,EAChC,WAAW,IAAI,eAAe,EAC9B,QAAQ,GACT,MAAM,gBAAgB,CAAC;AAIxB,4BAA4B;AAC5B,OAAO,EAAE,QAAQ,EAAE,CAAC;AAGpB,MAAM,CAAC,MAAM,GAAG,GAAW,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAC7C,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;AAC3C,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;AAC3C,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAC7C,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/src/logger.test.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
-
import { log, createLogger, setLogLevel, setLogFormat, setSanitize, LogLevel, } from './logger.js';
|
|
7
|
+
import { log, createLogger, setLogLevel, setLogFormat, setSanitize, subscribeToLogs, LogLevel, } from './logger.js';
|
|
8
8
|
describe('Logger', () => {
|
|
9
9
|
let stderrWrite;
|
|
10
10
|
let originalWrite;
|
|
@@ -175,6 +175,27 @@ describe('Logger', () => {
|
|
|
175
175
|
expect(output).toContain('"service":"scheduler"');
|
|
176
176
|
});
|
|
177
177
|
});
|
|
178
|
+
describe('log subscribers', () => {
|
|
179
|
+
it('receives sanitized structured log entries', () => {
|
|
180
|
+
setSanitize((data) => ({ ...data, token: data['token'] ? '[REDACTED]' : data['token'] }));
|
|
181
|
+
const entries = [];
|
|
182
|
+
const unsubscribe = subscribeToLogs((entry) => {
|
|
183
|
+
entries.push(entry);
|
|
184
|
+
});
|
|
185
|
+
log.warn('credential_checked', { token: 'secret-token', provider: 'test' });
|
|
186
|
+
unsubscribe();
|
|
187
|
+
expect(entries).toHaveLength(1);
|
|
188
|
+
expect(entries[0]).toMatchObject({
|
|
189
|
+
level: 'warn',
|
|
190
|
+
event: 'credential_checked',
|
|
191
|
+
data: {
|
|
192
|
+
token: '[REDACTED]',
|
|
193
|
+
provider: 'test',
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
expect(stderrWrite.mock.calls[0]?.[0]).not.toContain('secret-token');
|
|
197
|
+
});
|
|
198
|
+
});
|
|
178
199
|
describe('circular reference safety', () => {
|
|
179
200
|
it('does not throw on circular data in text mode', () => {
|
|
180
201
|
const circular = { a: 1 };
|