@backendkit-labs/agent-web 0.4.1 → 0.4.2

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=JwtAuth.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JwtAuth.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/JwtAuth.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
7
+ const JwtAuth_1 = require("../auth/JwtAuth");
8
+ const SECRET = 'test-secret-at-least-32-chars-long!';
9
+ function makeReq(overrides = {}) {
10
+ return {
11
+ headers: overrides.headers ?? {},
12
+ query: overrides.query ?? {},
13
+ };
14
+ }
15
+ function makeReply() {
16
+ const r = {};
17
+ r['code'] = jest.fn().mockReturnValue(r);
18
+ r['send'] = jest.fn().mockReturnValue(r);
19
+ return r;
20
+ }
21
+ // ── constructor ───────────────────────────────────────────────────────────────
22
+ describe('JwtAuth constructor', () => {
23
+ it('throws when neither secret nor publicKey is provided', () => {
24
+ expect(() => new JwtAuth_1.JwtAuth({})).toThrow('provide either secret');
25
+ });
26
+ it('does not throw when secret is provided', () => {
27
+ expect(() => new JwtAuth_1.JwtAuth({ secret: SECRET })).not.toThrow();
28
+ });
29
+ it('does not throw when publicKey is provided', () => {
30
+ const { generateKeyPairSync } = require('crypto');
31
+ const { publicKey } = generateKeyPairSync('rsa', { modulusLength: 2048 });
32
+ const pem = publicKey.export({ type: 'pkcs1', format: 'pem' });
33
+ expect(() => new JwtAuth_1.JwtAuth({ publicKey: pem })).not.toThrow();
34
+ });
35
+ });
36
+ // ── verify() ─────────────────────────────────────────────────────────────────
37
+ describe('JwtAuth.verify()', () => {
38
+ const auth = new JwtAuth_1.JwtAuth({ secret: SECRET });
39
+ it('decodes a valid HS256 token and returns the payload', () => {
40
+ const token = jsonwebtoken_1.default.sign({ sub: 'user-1', email: 'a@b.com', roles: ['admin'] }, SECRET);
41
+ const user = auth.verify(token);
42
+ expect(user.sub).toBe('user-1');
43
+ expect(user.email).toBe('a@b.com');
44
+ expect(user.roles).toEqual(['admin']);
45
+ });
46
+ it('throws on a completely invalid token string', () => {
47
+ expect(() => auth.verify('not.a.token')).toThrow();
48
+ });
49
+ it('throws when the token was signed with a different secret', () => {
50
+ const token = jsonwebtoken_1.default.sign({ sub: 'x' }, 'wrong-secret');
51
+ expect(() => auth.verify(token)).toThrow();
52
+ });
53
+ it('throws on an expired token', () => {
54
+ const token = jsonwebtoken_1.default.sign({ sub: 'x' }, SECRET, { expiresIn: -10 });
55
+ expect(() => auth.verify(token)).toThrow();
56
+ });
57
+ it('validates audience when configured', () => {
58
+ const strictAuth = new JwtAuth_1.JwtAuth({ secret: SECRET, audience: 'my-api' });
59
+ const good = jsonwebtoken_1.default.sign({ sub: 'x', aud: 'my-api' }, SECRET);
60
+ const bad = jsonwebtoken_1.default.sign({ sub: 'x', aud: 'other' }, SECRET);
61
+ expect(() => strictAuth.verify(good)).not.toThrow();
62
+ expect(() => strictAuth.verify(bad)).toThrow();
63
+ });
64
+ it('validates issuer when configured', () => {
65
+ const strictAuth = new JwtAuth_1.JwtAuth({ secret: SECRET, issuer: 'auth.example.com' });
66
+ const good = jsonwebtoken_1.default.sign({ sub: 'x' }, SECRET, { issuer: 'auth.example.com' });
67
+ const bad = jsonwebtoken_1.default.sign({ sub: 'x' }, SECRET, { issuer: 'attacker.com' });
68
+ expect(() => strictAuth.verify(good)).not.toThrow();
69
+ expect(() => strictAuth.verify(bad)).toThrow();
70
+ });
71
+ });
72
+ // ── hook() ────────────────────────────────────────────────────────────────────
73
+ describe('JwtAuth.hook()', () => {
74
+ let auth;
75
+ let validToken;
76
+ beforeEach(() => {
77
+ auth = new JwtAuth_1.JwtAuth({ secret: SECRET });
78
+ validToken = jsonwebtoken_1.default.sign({ sub: 'user-42', roles: ['editor'] }, SECRET);
79
+ });
80
+ it('returns 401 when no token is present in headers or query', async () => {
81
+ const hook = auth.hook();
82
+ const req = makeReq();
83
+ const reply = makeReply();
84
+ await hook(req, reply);
85
+ expect(reply.code).toHaveBeenCalledWith(401);
86
+ expect(reply.send).toHaveBeenCalledWith({ error: 'Missing authentication token' });
87
+ });
88
+ it('sets req.user from a valid Authorization: Bearer header', async () => {
89
+ const hook = auth.hook();
90
+ const req = makeReq({ headers: { authorization: `Bearer ${validToken}` } });
91
+ const reply = makeReply();
92
+ await hook(req, reply);
93
+ expect(reply.code).not.toHaveBeenCalled();
94
+ expect(req.user.sub).toBe('user-42');
95
+ });
96
+ it('sets req.user from a valid ?token= query param', async () => {
97
+ const hook = auth.hook();
98
+ const req = makeReq({ query: { token: validToken } });
99
+ const reply = makeReply();
100
+ await hook(req, reply);
101
+ expect(reply.code).not.toHaveBeenCalled();
102
+ expect(req.user.sub).toBe('user-42');
103
+ });
104
+ it('prefers the Authorization header over the ?token= query param', async () => {
105
+ const otherToken = jsonwebtoken_1.default.sign({ sub: 'interloper' }, SECRET);
106
+ const hook = auth.hook();
107
+ const req = makeReq({
108
+ headers: { authorization: `Bearer ${validToken}` },
109
+ query: { token: otherToken },
110
+ });
111
+ const reply = makeReply();
112
+ await hook(req, reply);
113
+ const user = req.user;
114
+ expect(user.sub).toBe('user-42');
115
+ });
116
+ it('returns 401 when the token is invalid', async () => {
117
+ const hook = auth.hook();
118
+ const req = makeReq({ headers: { authorization: 'Bearer invalid.token.payload' } });
119
+ const reply = makeReply();
120
+ await hook(req, reply);
121
+ expect(reply.code).toHaveBeenCalledWith(401);
122
+ expect(reply.send).toHaveBeenCalledWith({ error: 'Invalid or expired token' });
123
+ });
124
+ it('returns 401 when the token is expired', async () => {
125
+ const expired = jsonwebtoken_1.default.sign({ sub: 'x' }, SECRET, { expiresIn: -10 });
126
+ const hook = auth.hook();
127
+ const req = makeReq({ headers: { authorization: `Bearer ${expired}` } });
128
+ const reply = makeReply();
129
+ await hook(req, reply);
130
+ expect(reply.code).toHaveBeenCalledWith(401);
131
+ expect(reply.send).toHaveBeenCalledWith({ error: 'Invalid or expired token' });
132
+ });
133
+ it('does not set req.user when auth fails', async () => {
134
+ const hook = auth.hook();
135
+ const req = makeReq({ headers: { authorization: 'Bearer bad' } });
136
+ const reply = makeReply();
137
+ await hook(req, reply);
138
+ expect(req.user).toBeUndefined();
139
+ });
140
+ it('ignores an Authorization header that does not start with "Bearer "', async () => {
141
+ const hook = auth.hook();
142
+ const req = makeReq({ headers: { authorization: `Basic ${validToken}` } });
143
+ const reply = makeReply();
144
+ await hook(req, reply);
145
+ // No token extracted → 401
146
+ expect(reply.code).toHaveBeenCalledWith(401);
147
+ });
148
+ });
149
+ //# sourceMappingURL=JwtAuth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JwtAuth.test.js","sourceRoot":"","sources":["../../src/__tests__/JwtAuth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SessionManager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionManager.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/SessionManager.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,303 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const SessionManager_1 = require("../session/SessionManager");
4
+ function makeSocket() {
5
+ const listeners = {};
6
+ return {
7
+ on: jest.fn((event, cb) => {
8
+ (listeners[event] ??= []).push(cb);
9
+ }),
10
+ send: jest.fn(),
11
+ close: jest.fn(),
12
+ readyState: 1,
13
+ _trigger(event, ...args) {
14
+ listeners[event]?.forEach(h => h(...args));
15
+ },
16
+ };
17
+ }
18
+ function makeEngine() {
19
+ return {
20
+ run: jest.fn().mockResolvedValue(undefined),
21
+ abort: jest.fn(),
22
+ use: jest.fn(),
23
+ getTools: jest.fn().mockReturnValue([]),
24
+ };
25
+ }
26
+ function makeMonitorBus() {
27
+ return {
28
+ notifySessionOpen: jest.fn(),
29
+ notifySessionClose: jest.fn(),
30
+ broadcast: jest.fn(),
31
+ broadcastRunInput: jest.fn(),
32
+ subscribe: jest.fn(),
33
+ size: 0,
34
+ };
35
+ }
36
+ function makeMetrics() {
37
+ return {
38
+ sessionOpened: jest.fn(),
39
+ sessionClosed: jest.fn(),
40
+ };
41
+ }
42
+ function makeStore() {
43
+ return {
44
+ set: jest.fn().mockResolvedValue(undefined),
45
+ delete: jest.fn().mockResolvedValue(undefined),
46
+ close: jest.fn().mockResolvedValue(undefined),
47
+ getAll: jest.fn().mockResolvedValue([]),
48
+ };
49
+ }
50
+ // ── Tests ─────────────────────────────────────────────────────────────────────
51
+ describe('SessionManager', () => {
52
+ let engine;
53
+ let engineFactory;
54
+ beforeEach(() => {
55
+ engine = makeEngine();
56
+ engineFactory = jest.fn().mockReturnValue(engine);
57
+ });
58
+ // ── create() ──────────────────────────────────────────────────────────────
59
+ describe('create()', () => {
60
+ it('returns a session with a uuid id and timestamps', () => {
61
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
62
+ const session = mgr.create(makeSocket());
63
+ expect(session.id).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
64
+ expect(session.createdAt).toBeInstanceOf(Date);
65
+ expect(session.lastActivityAt).toBeInstanceOf(Date);
66
+ expect(session.engine).toBe(engine);
67
+ mgr.close();
68
+ });
69
+ it('stores the optional userId', () => {
70
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
71
+ const session = mgr.create(makeSocket(), 'usr-99');
72
+ expect(session.userId).toBe('usr-99');
73
+ mgr.close();
74
+ });
75
+ it('increments size', () => {
76
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
77
+ expect(mgr.size).toBe(0);
78
+ mgr.create(makeSocket());
79
+ expect(mgr.size).toBe(1);
80
+ mgr.create(makeSocket());
81
+ expect(mgr.size).toBe(2);
82
+ mgr.close();
83
+ });
84
+ it('calls engineFactory with the session id and a transport', () => {
85
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
86
+ const session = mgr.create(makeSocket());
87
+ expect(engineFactory).toHaveBeenCalledWith(session.id, expect.any(Object));
88
+ mgr.close();
89
+ });
90
+ it('throws when maxSessions is reached', () => {
91
+ const mgr = new SessionManager_1.SessionManager({ engineFactory, maxSessions: 2 });
92
+ mgr.create(makeSocket());
93
+ mgr.create(makeSocket());
94
+ expect(() => mgr.create(makeSocket())).toThrow('Max concurrent sessions (2) reached');
95
+ mgr.close();
96
+ });
97
+ it('notifies monitorBus.notifySessionOpen', () => {
98
+ const monitorBus = makeMonitorBus();
99
+ const mgr = new SessionManager_1.SessionManager({ engineFactory, monitorBus });
100
+ const session = mgr.create(makeSocket());
101
+ expect(monitorBus.notifySessionOpen).toHaveBeenCalledWith(session.id);
102
+ mgr.close();
103
+ });
104
+ it('calls metrics.sessionOpened()', () => {
105
+ const metrics = makeMetrics();
106
+ const mgr = new SessionManager_1.SessionManager({ engineFactory, metrics });
107
+ mgr.create(makeSocket());
108
+ expect(metrics.sessionOpened).toHaveBeenCalledTimes(1);
109
+ mgr.close();
110
+ });
111
+ it('calls store.set() with session metadata', async () => {
112
+ const store = makeStore();
113
+ const mgr = new SessionManager_1.SessionManager({ engineFactory, store });
114
+ const session = mgr.create(makeSocket());
115
+ await Promise.resolve(); // flush micro-tasks
116
+ expect(store.set).toHaveBeenCalledWith(session.id, expect.objectContaining({ id: session.id }));
117
+ mgr.close();
118
+ });
119
+ it('fan-outs AgentEvents to monitorBus.broadcast', () => {
120
+ const monitorBus = makeMonitorBus();
121
+ const mgr = new SessionManager_1.SessionManager({ engineFactory, monitorBus });
122
+ const session = mgr.create(makeSocket());
123
+ // Simulate the engine emitting an event via the transport
124
+ const event = { type: 'token', content: 'hi' };
125
+ session.transport.emit(event);
126
+ expect(monitorBus.broadcast).toHaveBeenCalledWith(session.id, event);
127
+ mgr.close();
128
+ });
129
+ it('destroys the session automatically on socket close', () => {
130
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
131
+ const socket = makeSocket();
132
+ mgr.create(socket);
133
+ expect(mgr.size).toBe(1);
134
+ socket._trigger('close');
135
+ expect(mgr.size).toBe(0);
136
+ mgr.close();
137
+ });
138
+ });
139
+ // ── get() ─────────────────────────────────────────────────────────────────
140
+ describe('get()', () => {
141
+ it('returns undefined for an unknown id', () => {
142
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
143
+ expect(mgr.get('does-not-exist')).toBeUndefined();
144
+ mgr.close();
145
+ });
146
+ it('returns the session for a known id', () => {
147
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
148
+ const created = mgr.create(makeSocket());
149
+ const fetched = mgr.get(created.id);
150
+ expect(fetched).toBeDefined();
151
+ expect(fetched.id).toBe(created.id);
152
+ mgr.close();
153
+ });
154
+ it('updates lastActivityAt on each call', async () => {
155
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
156
+ const session = mgr.create(makeSocket());
157
+ const before = session.lastActivityAt.getTime();
158
+ await new Promise(r => setTimeout(r, 5));
159
+ mgr.get(session.id);
160
+ expect(session.lastActivityAt.getTime()).toBeGreaterThan(before);
161
+ mgr.close();
162
+ });
163
+ });
164
+ // ── destroy() ─────────────────────────────────────────────────────────────
165
+ describe('destroy()', () => {
166
+ it('removes the session from the map', () => {
167
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
168
+ const session = mgr.create(makeSocket());
169
+ mgr.destroy(session.id);
170
+ expect(mgr.size).toBe(0);
171
+ expect(mgr.get(session.id)).toBeUndefined();
172
+ mgr.close();
173
+ });
174
+ it('calls engine.abort()', () => {
175
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
176
+ const session = mgr.create(makeSocket());
177
+ mgr.destroy(session.id);
178
+ expect(engine.abort).toHaveBeenCalled();
179
+ mgr.close();
180
+ });
181
+ it('notifies monitorBus.notifySessionClose', () => {
182
+ const monitorBus = makeMonitorBus();
183
+ const mgr = new SessionManager_1.SessionManager({ engineFactory, monitorBus });
184
+ const session = mgr.create(makeSocket());
185
+ mgr.destroy(session.id);
186
+ expect(monitorBus.notifySessionClose).toHaveBeenCalledWith(session.id);
187
+ mgr.close();
188
+ });
189
+ it('calls metrics.sessionClosed()', () => {
190
+ const metrics = makeMetrics();
191
+ const mgr = new SessionManager_1.SessionManager({ engineFactory, metrics });
192
+ const session = mgr.create(makeSocket());
193
+ mgr.destroy(session.id);
194
+ expect(metrics.sessionClosed).toHaveBeenCalledTimes(1);
195
+ mgr.close();
196
+ });
197
+ it('calls store.delete()', async () => {
198
+ const store = makeStore();
199
+ const mgr = new SessionManager_1.SessionManager({ engineFactory, store });
200
+ const session = mgr.create(makeSocket());
201
+ mgr.destroy(session.id);
202
+ await Promise.resolve();
203
+ expect(store.delete).toHaveBeenCalledWith(session.id);
204
+ mgr.close();
205
+ });
206
+ it('is a no-op for an unknown id', () => {
207
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
208
+ expect(() => mgr.destroy('ghost')).not.toThrow();
209
+ mgr.close();
210
+ });
211
+ it('does not double-decrement when the same id is destroyed twice', () => {
212
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
213
+ const session = mgr.create(makeSocket());
214
+ mgr.destroy(session.id);
215
+ expect(() => mgr.destroy(session.id)).not.toThrow();
216
+ expect(engine.abort).toHaveBeenCalledTimes(1);
217
+ mgr.close();
218
+ });
219
+ });
220
+ // ── list() ────────────────────────────────────────────────────────────────
221
+ describe('list()', () => {
222
+ it('returns an empty array when no sessions exist', () => {
223
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
224
+ expect(mgr.list()).toEqual([]);
225
+ mgr.close();
226
+ });
227
+ it('returns metadata for all active sessions', () => {
228
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
229
+ mgr.create(makeSocket(), 'alice');
230
+ mgr.create(makeSocket(), 'bob');
231
+ const list = mgr.list();
232
+ expect(list).toHaveLength(2);
233
+ expect(list[0]).toHaveProperty('id');
234
+ expect(list[0]).toHaveProperty('createdAt');
235
+ expect(list[0]).toHaveProperty('lastActivityAt');
236
+ });
237
+ it('does not expose engine or transport on list items', () => {
238
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
239
+ mgr.create(makeSocket());
240
+ const [item] = mgr.list();
241
+ expect(item).not.toHaveProperty('engine');
242
+ expect(item).not.toHaveProperty('transport');
243
+ mgr.close();
244
+ });
245
+ });
246
+ // ── close() ───────────────────────────────────────────────────────────────
247
+ describe('close()', () => {
248
+ it('destroys all sessions', () => {
249
+ const mgr = new SessionManager_1.SessionManager({ engineFactory });
250
+ mgr.create(makeSocket());
251
+ mgr.create(makeSocket());
252
+ mgr.close();
253
+ expect(mgr.size).toBe(0);
254
+ });
255
+ it('calls engine.abort() for every open session', () => {
256
+ const eng2 = makeEngine();
257
+ const fac = jest.fn()
258
+ .mockReturnValueOnce(engine)
259
+ .mockReturnValueOnce(eng2);
260
+ const mgr = new SessionManager_1.SessionManager({ engineFactory: fac });
261
+ mgr.create(makeSocket());
262
+ mgr.create(makeSocket());
263
+ mgr.close();
264
+ expect(engine.abort).toHaveBeenCalled();
265
+ expect(eng2.abort).toHaveBeenCalled();
266
+ });
267
+ });
268
+ // ── idle sweep ────────────────────────────────────────────────────────────
269
+ describe('idle sweep', () => {
270
+ beforeEach(() => jest.useFakeTimers());
271
+ afterEach(() => {
272
+ jest.clearAllTimers();
273
+ jest.useRealTimers();
274
+ });
275
+ it('evicts sessions idle longer than maxIdleMs', () => {
276
+ const mgr = new SessionManager_1.SessionManager({ engineFactory, maxIdleMs: 5_000 });
277
+ const session = mgr.create(makeSocket());
278
+ // Simulate the session being idle for 6 seconds
279
+ session.lastActivityAt = new Date(Date.now() - 6_000);
280
+ jest.advanceTimersByTime(60_001);
281
+ expect(mgr.size).toBe(0);
282
+ mgr.close();
283
+ });
284
+ it('keeps sessions that are still within maxIdleMs', () => {
285
+ const mgr = new SessionManager_1.SessionManager({ engineFactory, maxIdleMs: 120_000 });
286
+ mgr.create(makeSocket());
287
+ // Sweep fires (60s), session is only 60s old, max is 120s
288
+ jest.advanceTimersByTime(60_001);
289
+ expect(mgr.size).toBe(1);
290
+ mgr.close();
291
+ });
292
+ it('does not fire if close() was called before the interval', () => {
293
+ const mgr = new SessionManager_1.SessionManager({ engineFactory, maxIdleMs: 1 });
294
+ const session = mgr.create(makeSocket());
295
+ session.lastActivityAt = new Date(Date.now() - 10_000);
296
+ mgr.close(); // clears the timer
297
+ jest.advanceTimersByTime(60_001);
298
+ // sweep never ran — the session was already destroyed by close()
299
+ expect(engine.abort).toHaveBeenCalledTimes(1); // only from close()
300
+ });
301
+ });
302
+ });
303
+ //# sourceMappingURL=SessionManager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionManager.test.js","sourceRoot":"","sources":["../../src/__tests__/SessionManager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=TriggerBus.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriggerBus.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/TriggerBus.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,433 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const crypto = __importStar(require("crypto"));
37
+ const TriggerBus_1 = require("../trigger/TriggerBus");
38
+ // ── Mock node-cron (optional dep) ─────────────────────────────────────────────
39
+ jest.mock('node-cron', () => ({
40
+ schedule: jest.fn().mockReturnValue({ stop: jest.fn() }),
41
+ validate: jest.fn().mockReturnValue(true),
42
+ }));
43
+ // ── Helpers ───────────────────────────────────────────────────────────────────
44
+ function makeEngine() {
45
+ return {
46
+ run: jest.fn().mockResolvedValue(undefined),
47
+ abort: jest.fn(),
48
+ use: jest.fn(),
49
+ getTools: jest.fn().mockReturnValue([]),
50
+ };
51
+ }
52
+ function makeMonitorBus() {
53
+ return {
54
+ notifySessionOpen: jest.fn(),
55
+ notifySessionClose: jest.fn(),
56
+ broadcast: jest.fn(),
57
+ broadcastRunInput: jest.fn(),
58
+ subscribe: jest.fn(),
59
+ size: 0,
60
+ };
61
+ }
62
+ function makeFastify() {
63
+ const routes = {};
64
+ const app = {
65
+ post: jest.fn((path, handler) => { routes[`POST ${path}`] = handler; }),
66
+ get: jest.fn((path, handler) => { routes[`GET ${path}`] = handler; }),
67
+ put: jest.fn((path, handler) => { routes[`PUT ${path}`] = handler; }),
68
+ };
69
+ return { app, routes };
70
+ }
71
+ function makeReq(overrides = {}) {
72
+ return { body: overrides.body ?? {}, headers: overrides.headers ?? {} };
73
+ }
74
+ function makeReply() {
75
+ const r = {};
76
+ r['code'] = jest.fn().mockReturnValue(r);
77
+ r['send'] = jest.fn().mockReturnValue(r);
78
+ return r;
79
+ }
80
+ function hmacSig(body, secret) {
81
+ return `sha256=${crypto.createHmac('sha256', secret).update(JSON.stringify(body)).digest('hex')}`;
82
+ }
83
+ /** Flush all pending microtasks and macro-tasks to let async fire() complete. */
84
+ async function flushAsync(rounds = 10) {
85
+ for (let i = 0; i < rounds; i++) {
86
+ await new Promise(r => setImmediate(r));
87
+ }
88
+ }
89
+ // ── Tests ─────────────────────────────────────────────────────────────────────
90
+ describe('TriggerBus', () => {
91
+ let engine;
92
+ let engineFactory;
93
+ let nodeCron;
94
+ beforeEach(() => {
95
+ engine = makeEngine();
96
+ engineFactory = jest.fn().mockReturnValue(engine);
97
+ nodeCron = jest.requireMock('node-cron');
98
+ nodeCron.schedule.mockClear().mockReturnValue({ stop: jest.fn() });
99
+ nodeCron.validate.mockClear().mockReturnValue(true);
100
+ });
101
+ // ── fluent API ────────────────────────────────────────────────────────────
102
+ describe('fluent API', () => {
103
+ it('addCron() returns this', () => {
104
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
105
+ const ret = bus.addCron({ name: 'r', schedule: '* * * * *', buildPrompt: () => 'x' });
106
+ expect(ret).toBe(bus);
107
+ });
108
+ it('addWebhook() returns this', () => {
109
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
110
+ expect(bus.addWebhook({ name: 'w', path: '/wh', buildPrompt: () => 'x' })).toBe(bus);
111
+ });
112
+ it('addQueue() returns this', () => {
113
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
114
+ expect(bus.addQueue({
115
+ name: 'q', queueName: 'jobs', connection: 'redis://localhost', buildPrompt: () => 'x',
116
+ })).toBe(bus);
117
+ });
118
+ });
119
+ // ── start() ───────────────────────────────────────────────────────────────
120
+ describe('start()', () => {
121
+ it('schedules cron tasks via node-cron', () => {
122
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
123
+ bus.addCron({ name: 'r', schedule: '0 9 * * 1-5', buildPrompt: () => 'go' });
124
+ bus.start();
125
+ expect(nodeCron.schedule).toHaveBeenCalledWith('0 9 * * 1-5', expect.any(Function));
126
+ bus.close();
127
+ });
128
+ it('is idempotent — a second start() does not re-register crons', () => {
129
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
130
+ bus.addCron({ name: 'r', schedule: '* * * * *', buildPrompt: () => 'go' });
131
+ bus.start();
132
+ bus.start();
133
+ expect(nodeCron.schedule).toHaveBeenCalledTimes(1);
134
+ bus.close();
135
+ });
136
+ it('fires runOnStart crons immediately without waiting for the schedule', async () => {
137
+ const onComplete = jest.fn();
138
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
139
+ bus.addCron({
140
+ name: 'r', schedule: '0 9 * * 1-5', runOnStart: true,
141
+ buildPrompt: () => 'immediate', onComplete,
142
+ });
143
+ bus.start();
144
+ await flushAsync();
145
+ expect(engineFactory).toHaveBeenCalled();
146
+ expect(engine.run).toHaveBeenCalledWith('immediate');
147
+ await bus.close();
148
+ });
149
+ it('skips an invalid cron schedule and logs an error', () => {
150
+ nodeCron.validate.mockReturnValueOnce(false);
151
+ const spy = jest.spyOn(console, 'error').mockImplementation(() => { });
152
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
153
+ bus.addCron({ name: 'bad', schedule: 'not-valid', buildPrompt: () => 'x' });
154
+ bus.start();
155
+ expect(spy).toHaveBeenCalledWith(expect.stringContaining('Invalid cron schedule'));
156
+ expect(nodeCron.schedule).not.toHaveBeenCalled();
157
+ spy.mockRestore();
158
+ bus.close();
159
+ });
160
+ it('warns when node-cron is missing and cron defs are registered', () => {
161
+ // Temporarily make require('node-cron') throw
162
+ jest.resetModules();
163
+ jest.doMock('node-cron', () => { throw new Error('not found'); });
164
+ const spy = jest.spyOn(console, 'warn').mockImplementation(() => { });
165
+ // Re-require TriggerBus from scratch so it picks up the new mock
166
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
167
+ const { TriggerBus: TB } = require('../trigger/TriggerBus');
168
+ const bus = new TB(engineFactory);
169
+ bus.addCron({ name: 'r', schedule: '* * * * *', buildPrompt: () => 'x' });
170
+ bus.start();
171
+ expect(spy).toHaveBeenCalledWith(expect.stringContaining('node-cron not found'));
172
+ spy.mockRestore();
173
+ // Restore the original mock
174
+ jest.resetModules();
175
+ jest.doMock('node-cron', () => ({
176
+ schedule: jest.fn().mockReturnValue({ stop: jest.fn() }),
177
+ validate: jest.fn().mockReturnValue(true),
178
+ }));
179
+ bus.close();
180
+ });
181
+ });
182
+ // ── close() ───────────────────────────────────────────────────────────────
183
+ describe('close()', () => {
184
+ it('stops all scheduled cron tasks', async () => {
185
+ const stopFn = jest.fn();
186
+ nodeCron.schedule.mockReturnValue({ stop: stopFn });
187
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
188
+ bus.addCron({ name: 'r', schedule: '* * * * *', buildPrompt: () => 'go' });
189
+ bus.start();
190
+ await bus.close();
191
+ expect(stopFn).toHaveBeenCalled();
192
+ });
193
+ it('allows start() again after close()', async () => {
194
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
195
+ bus.addCron({ name: 'r', schedule: '* * * * *', buildPrompt: () => 'go' });
196
+ bus.start();
197
+ await bus.close();
198
+ bus.start();
199
+ expect(nodeCron.schedule).toHaveBeenCalledTimes(2);
200
+ await bus.close();
201
+ });
202
+ });
203
+ // ── registerRoutes() ──────────────────────────────────────────────────────
204
+ describe('registerRoutes()', () => {
205
+ it('registers a POST route by default', () => {
206
+ const { app } = makeFastify();
207
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
208
+ bus.addWebhook({ name: 'gh', path: '/triggers/github', buildPrompt: () => 'x' });
209
+ bus.registerRoutes(app);
210
+ expect(app.post).toHaveBeenCalledWith('/triggers/github', expect.any(Function));
211
+ });
212
+ it('registers a GET route when method is GET', () => {
213
+ const { app } = makeFastify();
214
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
215
+ bus.addWebhook({ name: 'p', path: '/poll', method: 'GET', buildPrompt: () => 'x' });
216
+ bus.registerRoutes(app);
217
+ expect(app.get).toHaveBeenCalledWith('/poll', expect.any(Function));
218
+ });
219
+ it('registers a PUT route when method is PUT', () => {
220
+ const { app } = makeFastify();
221
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
222
+ bus.addWebhook({ name: 'u', path: '/update', method: 'PUT', buildPrompt: () => 'x' });
223
+ bus.registerRoutes(app);
224
+ expect(app.put).toHaveBeenCalledWith('/update', expect.any(Function));
225
+ });
226
+ it('responds 202 immediately on a valid webhook hit', async () => {
227
+ const { app, routes } = makeFastify();
228
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
229
+ bus.addWebhook({ name: 'test', path: '/wh', buildPrompt: () => 'hi' });
230
+ bus.registerRoutes(app);
231
+ const req = makeReq({ body: { x: 1 } });
232
+ const reply = makeReply();
233
+ await routes['POST /wh'](req, reply);
234
+ expect(reply.code).toHaveBeenCalledWith(202);
235
+ expect(reply.send).toHaveBeenCalledWith({ queued: true, trigger: 'test' });
236
+ });
237
+ // ── HMAC ──────────────────────────────────────────────────────────────
238
+ describe('HMAC validation', () => {
239
+ it('rejects a request with an invalid signature', async () => {
240
+ const { app, routes } = makeFastify();
241
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
242
+ bus.addWebhook({ name: 's', path: '/wh', secret: 'mysecret', buildPrompt: () => 'x' });
243
+ bus.registerRoutes(app);
244
+ const req = makeReq({ body: {}, headers: { 'x-hub-signature-256': 'sha256=wrong' } });
245
+ const reply = makeReply();
246
+ await routes['POST /wh'](req, reply);
247
+ expect(reply.code).toHaveBeenCalledWith(401);
248
+ expect(reply.send).toHaveBeenCalledWith({ error: 'Invalid webhook signature' });
249
+ expect(engineFactory).not.toHaveBeenCalled();
250
+ });
251
+ it('accepts a request with a valid GitHub-compatible HMAC signature', async () => {
252
+ const { app, routes } = makeFastify();
253
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
254
+ bus.addWebhook({ name: 's', path: '/wh', secret: 'mysecret', buildPrompt: () => 'x' });
255
+ bus.registerRoutes(app);
256
+ const body = { action: 'opened', number: 42 };
257
+ const req = makeReq({ body, headers: { 'x-hub-signature-256': hmacSig(body, 'mysecret') } });
258
+ const reply = makeReply();
259
+ await routes['POST /wh'](req, reply);
260
+ expect(reply.code).toHaveBeenCalledWith(202);
261
+ });
262
+ it('rejects when the signature header is missing entirely', async () => {
263
+ const { app, routes } = makeFastify();
264
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
265
+ bus.addWebhook({ name: 's', path: '/wh', secret: 'mysecret', buildPrompt: () => 'x' });
266
+ bus.registerRoutes(app);
267
+ const req = makeReq({ body: {} });
268
+ const reply = makeReply();
269
+ await routes['POST /wh'](req, reply);
270
+ expect(reply.code).toHaveBeenCalledWith(401);
271
+ });
272
+ });
273
+ });
274
+ // ── fire() (exercised via webhook route) ──────────────────────────────────
275
+ describe('fire()', () => {
276
+ async function triggerAndFlush(overrides = {}) {
277
+ const { app, routes } = makeFastify();
278
+ const onComplete = jest.fn();
279
+ const onError = jest.fn();
280
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
281
+ bus.addWebhook({
282
+ name: 'fire-test',
283
+ path: '/wh',
284
+ buildPrompt: (payload) => `prompt:${JSON.stringify(payload)}`,
285
+ onComplete,
286
+ onError,
287
+ ...overrides,
288
+ });
289
+ bus.registerRoutes(app);
290
+ const reply = makeReply();
291
+ await routes['POST /wh'](makeReq({ body: { n: 1 } }), reply);
292
+ await flushAsync();
293
+ return { onComplete, onError, bus };
294
+ }
295
+ it('calls engineFactory with a trigger- prefixed sessionId', async () => {
296
+ const { bus } = await triggerAndFlush();
297
+ expect(engineFactory).toHaveBeenCalledWith(expect.stringMatching(/^trigger-/), expect.any(Object));
298
+ await bus.close();
299
+ });
300
+ it('passes the webhook body to buildPrompt', async () => {
301
+ const { bus } = await triggerAndFlush();
302
+ expect(engine.run).toHaveBeenCalledWith('prompt:{"n":1}');
303
+ await bus.close();
304
+ });
305
+ it('calls onComplete with a TriggerResult after a successful run', async () => {
306
+ const { onComplete, bus } = await triggerAndFlush();
307
+ expect(onComplete).toHaveBeenCalledWith(expect.objectContaining({
308
+ triggerName: 'fire-test',
309
+ sessionId: expect.stringMatching(/^trigger-/),
310
+ durationMs: expect.any(Number),
311
+ output: expect.any(String),
312
+ events: expect.any(Array),
313
+ }));
314
+ await bus.close();
315
+ });
316
+ it('calls onError when engine.run() throws', async () => {
317
+ engine.run = jest.fn().mockRejectedValue(new Error('boom'));
318
+ const { onError, bus } = await triggerAndFlush();
319
+ expect(onError).toHaveBeenCalledWith(expect.any(Error), 'fire-test');
320
+ await bus.close();
321
+ });
322
+ it('passes a non-Error throw wrapped in Error to onError', async () => {
323
+ engine.run = jest.fn().mockRejectedValue('string error');
324
+ const { onError, bus } = await triggerAndFlush();
325
+ expect(onError).toHaveBeenCalledWith(expect.any(Error), 'fire-test');
326
+ await bus.close();
327
+ });
328
+ it('does not call onComplete when the run fails', async () => {
329
+ engine.run = jest.fn().mockRejectedValue(new Error('fail'));
330
+ const { onComplete, bus } = await triggerAndFlush();
331
+ expect(onComplete).not.toHaveBeenCalled();
332
+ await bus.close();
333
+ });
334
+ it('notifies monitorBus open and close around the run', async () => {
335
+ const monitorBus = makeMonitorBus();
336
+ const { app, routes } = makeFastify();
337
+ const bus = new TriggerBus_1.TriggerBus(engineFactory, monitorBus);
338
+ bus.addWebhook({ name: 'm', path: '/wh', buildPrompt: () => 'x' });
339
+ bus.registerRoutes(app);
340
+ await routes['POST /wh'](makeReq({}), makeReply());
341
+ await flushAsync();
342
+ expect(monitorBus.notifySessionOpen).toHaveBeenCalledWith(expect.stringMatching(/^trigger-/));
343
+ expect(monitorBus.notifySessionClose).toHaveBeenCalledWith(expect.stringMatching(/^trigger-/));
344
+ await bus.close();
345
+ });
346
+ it('fan-outs engine events to monitorBus.broadcast', async () => {
347
+ const monitorBus = makeMonitorBus();
348
+ const firedEvents = [];
349
+ engine.run = jest.fn().mockImplementation(async (_, transport) => {
350
+ // The transport passed to engineFactory is what we need
351
+ // We intercept via the spy on broadcast
352
+ });
353
+ // Capture whatever the factory receives
354
+ let capturedTransport;
355
+ engineFactory = jest.fn().mockImplementation((_id, t) => {
356
+ capturedTransport = t;
357
+ return engine;
358
+ });
359
+ const { app, routes } = makeFastify();
360
+ const bus = new TriggerBus_1.TriggerBus(engineFactory, monitorBus);
361
+ bus.addWebhook({ name: 'ev', path: '/wh', buildPrompt: () => 'x' });
362
+ bus.registerRoutes(app);
363
+ engine.run = jest.fn().mockImplementation(async () => {
364
+ // Emit an event after the engine factory has been called
365
+ capturedTransport?.emit({ type: 'token', content: 'hello' });
366
+ });
367
+ await routes['POST /wh'](makeReq({}), makeReply());
368
+ await flushAsync();
369
+ expect(monitorBus.broadcast).toHaveBeenCalledWith(expect.stringMatching(/^trigger-/), expect.objectContaining({ type: 'token' }));
370
+ void firedEvents;
371
+ await bus.close();
372
+ });
373
+ it('closes the transport in the finally block even when the run throws', async () => {
374
+ engine.run = jest.fn().mockRejectedValue(new Error('crash'));
375
+ const { app, routes } = makeFastify();
376
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
377
+ bus.addWebhook({ name: 't', path: '/wh', buildPrompt: () => 'x' });
378
+ bus.registerRoutes(app);
379
+ await routes['POST /wh'](makeReq({}), makeReply());
380
+ await flushAsync();
381
+ // No assertion on transport.close() directly — verified indirectly:
382
+ // if close() was NOT called in finally, HeadlessTransport._closed stays false.
383
+ // We instead verify the whole flow does not throw and onError is not called
384
+ // (no onError registered here → the catch in registerRoutes silences it).
385
+ expect(engineFactory).toHaveBeenCalled();
386
+ await bus.close();
387
+ });
388
+ });
389
+ // ── cron callback (integration via schedule mock) ─────────────────────────
390
+ describe('cron callback', () => {
391
+ it('fires the engine when the cron callback is invoked', async () => {
392
+ let cronCallback;
393
+ nodeCron.schedule.mockImplementation((_expr, cb) => {
394
+ cronCallback = cb;
395
+ return { stop: jest.fn() };
396
+ });
397
+ const onComplete = jest.fn();
398
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
399
+ bus.addCron({
400
+ name: 'daily', schedule: '0 0 * * *',
401
+ buildPrompt: () => 'run daily report',
402
+ onComplete,
403
+ });
404
+ bus.start();
405
+ expect(cronCallback).toBeDefined();
406
+ cronCallback();
407
+ await flushAsync();
408
+ expect(engine.run).toHaveBeenCalledWith('run daily report');
409
+ expect(onComplete).toHaveBeenCalled();
410
+ await bus.close();
411
+ });
412
+ it('calls onError when the cron-triggered run fails', async () => {
413
+ let cronCallback;
414
+ nodeCron.schedule.mockImplementation((_expr, cb) => {
415
+ cronCallback = cb;
416
+ return { stop: jest.fn() };
417
+ });
418
+ engine.run = jest.fn().mockRejectedValue(new Error('cron fail'));
419
+ const onError = jest.fn();
420
+ const bus = new TriggerBus_1.TriggerBus(engineFactory);
421
+ bus.addCron({
422
+ name: 'fail-cron', schedule: '* * * * *',
423
+ buildPrompt: () => 'x', onError,
424
+ });
425
+ bus.start();
426
+ cronCallback();
427
+ await flushAsync();
428
+ expect(onError).toHaveBeenCalledWith(expect.any(Error), 'fail-cron');
429
+ await bus.close();
430
+ });
431
+ });
432
+ });
433
+ //# sourceMappingURL=TriggerBus.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriggerBus.test.js","sourceRoot":"","sources":["../../src/__tests__/TriggerBus.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backendkit-labs/agent-web",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "description": "HTTP/WebSocket server layer for agent-core — browser-ready streaming agent sessions",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -13,6 +13,7 @@
13
13
  "build": "tsc",
14
14
  "dev": "tsc --watch",
15
15
  "typecheck": "tsc --noEmit",
16
+ "test": "jest",
16
17
  "prepublishOnly": "npm run build"
17
18
  },
18
19
  "peerDependencies": {
@@ -32,12 +33,15 @@
32
33
  },
33
34
  "devDependencies": {
34
35
  "@backendkit-labs/agent-core": "*",
36
+ "@types/jest": "^29.5.14",
35
37
  "@types/jsonwebtoken": "^9.0.0",
36
- "@types/node-cron": "^3.0.0",
37
- "bullmq": "^5.0.0",
38
38
  "@types/node": "^20.0.0",
39
+ "@types/node-cron": "^3.0.0",
39
40
  "@types/uuid": "^10.0.0",
40
41
  "@types/ws": "^8.0.0",
42
+ "bullmq": "^5.0.0",
43
+ "jest": "^29.7.0",
44
+ "ts-jest": "^29.4.11",
41
45
  "typescript": "^5.4.0"
42
46
  },
43
47
  "engines": {