@backendkit-labs/agent-web 0.4.0 → 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.
- package/README.md +664 -20
- package/dist/__tests__/JwtAuth.test.d.ts +2 -0
- package/dist/__tests__/JwtAuth.test.d.ts.map +1 -0
- package/dist/__tests__/JwtAuth.test.js +149 -0
- package/dist/__tests__/JwtAuth.test.js.map +1 -0
- package/dist/__tests__/SessionManager.test.d.ts +2 -0
- package/dist/__tests__/SessionManager.test.d.ts.map +1 -0
- package/dist/__tests__/SessionManager.test.js +303 -0
- package/dist/__tests__/SessionManager.test.js.map +1 -0
- package/dist/__tests__/TriggerBus.test.d.ts +2 -0
- package/dist/__tests__/TriggerBus.test.d.ts.map +1 -0
- package/dist/__tests__/TriggerBus.test.js +433 -0
- package/dist/__tests__/TriggerBus.test.js.map +1 -0
- package/package.json +7 -3
|
@@ -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.
|
|
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": {
|