@sena-ai/core 1.4.0 → 1.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.
Files changed (41) hide show
  1. package/dist/__tests__/config.test.js +2 -0
  2. package/dist/__tests__/config.test.js.map +1 -1
  3. package/dist/__tests__/engine.test.js +176 -2
  4. package/dist/__tests__/engine.test.js.map +1 -1
  5. package/dist/__tests__/helpers.d.ts +6 -1
  6. package/dist/__tests__/helpers.d.ts.map +1 -1
  7. package/dist/__tests__/helpers.js +14 -0
  8. package/dist/__tests__/helpers.js.map +1 -1
  9. package/dist/__tests__/runtime-hooks.test.d.ts +2 -0
  10. package/dist/__tests__/runtime-hooks.test.d.ts.map +1 -0
  11. package/dist/__tests__/runtime-hooks.test.js +140 -0
  12. package/dist/__tests__/runtime-hooks.test.js.map +1 -0
  13. package/dist/__tests__/worker.test.js +88 -2
  14. package/dist/__tests__/worker.test.js.map +1 -1
  15. package/dist/config.d.ts +1 -0
  16. package/dist/config.d.ts.map +1 -1
  17. package/dist/config.js +1 -0
  18. package/dist/config.js.map +1 -1
  19. package/dist/engine.d.ts +2 -0
  20. package/dist/engine.d.ts.map +1 -1
  21. package/dist/engine.js +33 -1
  22. package/dist/engine.js.map +1 -1
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/orchestrator.d.ts +5 -1
  28. package/dist/orchestrator.d.ts.map +1 -1
  29. package/dist/orchestrator.js +36 -4
  30. package/dist/orchestrator.js.map +1 -1
  31. package/dist/runtime-hooks.d.ts +115 -0
  32. package/dist/runtime-hooks.d.ts.map +1 -0
  33. package/dist/runtime-hooks.js +48 -0
  34. package/dist/runtime-hooks.js.map +1 -0
  35. package/dist/types.d.ts +10 -1
  36. package/dist/types.d.ts.map +1 -1
  37. package/dist/worker.d.ts +9 -0
  38. package/dist/worker.d.ts.map +1 -1
  39. package/dist/worker.js +45 -7
  40. package/dist/worker.js.map +1 -1
  41. package/package.json +1 -1
@@ -15,6 +15,7 @@ describe('defineConfig()', () => {
15
15
  });
16
16
  expect(config.name).toBe('test-agent');
17
17
  expect(config.cwd).toBe(process.cwd());
18
+ expect(config.cwdConfigured).toBe(false);
18
19
  expect(config.runtime.name).toBe('mock');
19
20
  expect(config.connectors).toEqual([]);
20
21
  expect(config.tools).toEqual([]);
@@ -36,6 +37,7 @@ describe('defineConfig()', () => {
36
37
  runtime: mockRuntime,
37
38
  });
38
39
  expect(config.cwd).toBe('/custom/path');
40
+ expect(config.cwdConfigured).toBe(true);
39
41
  });
40
42
  it('throws on duplicate tool names', () => {
41
43
  const tool1 = defineTool({
@@ -1 +1 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { describe, it, expect } from 'vitest';
1
+ import { describe, it, expect, vi } from 'vitest';
2
2
  import { createTurnEngine } from '../engine.js';
3
- import { createMockRuntime, createMockHook, createSpyEndHook, createStreamingMockRuntime, createSpyErrorHook } from './helpers.js';
3
+ import { createMockRuntime, createMockHook, createSpyEndHook, createStreamingMockRuntime, createSpyErrorHook, createHookCapturingRuntime } from './helpers.js';
4
4
  describe('TurnEngine', () => {
5
5
  it('executes a basic turn and returns a TurnTrace', async () => {
6
6
  const engine = createTurnEngine({
@@ -215,5 +215,179 @@ describe('TurnEngine', () => {
215
215
  expect(trace.error).toBe('Aborted');
216
216
  expect(trace.result).toBeNull();
217
217
  });
218
+ // === RuntimeHooks integration tests ===
219
+ it('passes runtimeHooks through to runtime via RuntimeStreamOptions', async () => {
220
+ let capturedOptions = null;
221
+ const onTurnEndCallback = vi.fn();
222
+ const runtimeHooks = {
223
+ onTurnEnd: [{ callback: onTurnEndCallback }],
224
+ };
225
+ const engine = createTurnEngine({
226
+ name: 'test',
227
+ cwd: '/tmp',
228
+ runtime: createHookCapturingRuntime((opts) => { capturedOptions = opts; }),
229
+ hooks: {},
230
+ tools: [],
231
+ runtimeHooks,
232
+ });
233
+ await engine.processTurn({ input: 'hi' });
234
+ expect(capturedOptions).not.toBeNull();
235
+ expect(capturedOptions.runtimeHooks).toBeDefined();
236
+ // The merged hooks should contain the onTurnEnd callback we provided
237
+ expect(capturedOptions.runtimeHooks.onTurnEnd).toHaveLength(1);
238
+ });
239
+ it('calls runtimeHooks.onTurnEnd after successful turn with correct TurnEndInput', async () => {
240
+ const onTurnEndCallback = vi.fn();
241
+ const runtimeHooks = {
242
+ onTurnEnd: [{ callback: onTurnEndCallback }],
243
+ };
244
+ const engine = createTurnEngine({
245
+ name: 'test',
246
+ cwd: '/tmp',
247
+ runtime: createMockRuntime('hello world'),
248
+ hooks: {},
249
+ tools: [],
250
+ runtimeHooks,
251
+ });
252
+ await engine.processTurn({ input: 'hi' });
253
+ expect(onTurnEndCallback).toHaveBeenCalledTimes(1);
254
+ const input = onTurnEndCallback.mock.calls[0][0];
255
+ expect(input.hookEventName).toBe('turnEnd');
256
+ expect(input.result.text).toBe('hello world');
257
+ expect(input.turnContext.input).toBe('hi');
258
+ });
259
+ it('calls both legacy hooks and runtimeHooks (merged)', async () => {
260
+ const legacyEndHook = createSpyEndHook('legacy-end');
261
+ const runtimeEndCallback = vi.fn();
262
+ const runtimeHooks = {
263
+ onTurnEnd: [{ callback: runtimeEndCallback }],
264
+ };
265
+ const engine = createTurnEngine({
266
+ name: 'test',
267
+ cwd: '/tmp',
268
+ runtime: createMockRuntime('merged result'),
269
+ hooks: { onTurnEnd: [legacyEndHook] },
270
+ tools: [],
271
+ runtimeHooks,
272
+ });
273
+ await engine.processTurn({ input: 'go' });
274
+ // Legacy hook was called
275
+ expect(legacyEndHook.calls).toHaveLength(1);
276
+ expect(legacyEndHook.calls[0].result.text).toBe('merged result');
277
+ // RuntimeHooks callback was also called (via merged hooks)
278
+ expect(runtimeEndCallback).toHaveBeenCalledTimes(1);
279
+ const input = runtimeEndCallback.mock.calls[0][0];
280
+ expect(input.result.text).toBe('merged result');
281
+ });
282
+ it('isolates runtimeHooks.onTurnEnd errors (hook throws but turn succeeds)', async () => {
283
+ const throwingCallback = vi.fn().mockRejectedValue(new Error('hook exploded'));
284
+ const runtimeHooks = {
285
+ onTurnEnd: [{ callback: throwingCallback }],
286
+ };
287
+ const engine = createTurnEngine({
288
+ name: 'test',
289
+ cwd: '/tmp',
290
+ runtime: createMockRuntime('success'),
291
+ hooks: {},
292
+ tools: [],
293
+ runtimeHooks,
294
+ });
295
+ const trace = await engine.processTurn({ input: 'go' });
296
+ // The turn should still succeed despite the hook error
297
+ expect(trace.error).toBeNull();
298
+ expect(trace.result).not.toBeNull();
299
+ expect(trace.result.text).toBe('success');
300
+ expect(throwingCallback).toHaveBeenCalledTimes(1);
301
+ });
302
+ it('calls runtimeHooks.onError when runtime fails', async () => {
303
+ const failRuntime = {
304
+ name: 'fail',
305
+ async *createStream() {
306
+ throw new Error('runtime broke');
307
+ },
308
+ };
309
+ const onErrorCallback = vi.fn();
310
+ const runtimeHooks = {
311
+ onError: [{ callback: onErrorCallback }],
312
+ };
313
+ const engine = createTurnEngine({
314
+ name: 'test',
315
+ cwd: '/tmp',
316
+ runtime: failRuntime,
317
+ hooks: {},
318
+ tools: [],
319
+ runtimeHooks,
320
+ });
321
+ const trace = await engine.processTurn({ input: 'fail' });
322
+ expect(trace.error).toBe('runtime broke');
323
+ expect(onErrorCallback).toHaveBeenCalledTimes(1);
324
+ const input = onErrorCallback.mock.calls[0][0];
325
+ expect(input.hookEventName).toBe('error');
326
+ expect(input.error.message).toBe('runtime broke');
327
+ });
328
+ it('passes onStop hooks through to runtime via runtimeHooks (AC-10)', async () => {
329
+ let capturedOptions = null;
330
+ const onStopCallback = vi.fn();
331
+ const runtimeHooks = {
332
+ onStop: [{ callback: onStopCallback }],
333
+ };
334
+ const engine = createTurnEngine({
335
+ name: 'test',
336
+ cwd: '/tmp',
337
+ runtime: createHookCapturingRuntime((opts) => { capturedOptions = opts; }),
338
+ hooks: {},
339
+ tools: [],
340
+ runtimeHooks,
341
+ });
342
+ await engine.processTurn({ input: 'hi' });
343
+ expect(capturedOptions).not.toBeNull();
344
+ expect(capturedOptions.runtimeHooks).toBeDefined();
345
+ expect(capturedOptions.runtimeHooks.onStop).toHaveLength(1);
346
+ expect(capturedOptions.runtimeHooks.onStop[0].callback).toBe(onStopCallback);
347
+ });
348
+ it('passes onTurnStart hooks through to runtime via runtimeHooks (AC-09)', async () => {
349
+ let capturedOptions = null;
350
+ const onTurnStartCallback = vi.fn(async () => ({ decision: 'block', reason: 'denied' }));
351
+ const runtimeHooks = {
352
+ onTurnStart: [{ callback: onTurnStartCallback }],
353
+ };
354
+ const engine = createTurnEngine({
355
+ name: 'test',
356
+ cwd: '/tmp',
357
+ runtime: createHookCapturingRuntime((opts) => { capturedOptions = opts; }),
358
+ hooks: {},
359
+ tools: [],
360
+ runtimeHooks,
361
+ });
362
+ await engine.processTurn({ input: 'hi' });
363
+ expect(capturedOptions).not.toBeNull();
364
+ expect(capturedOptions.runtimeHooks).toBeDefined();
365
+ expect(capturedOptions.runtimeHooks.onTurnStart).toHaveLength(1);
366
+ expect(capturedOptions.runtimeHooks.onTurnStart[0].callback).toBe(onTurnStartCallback);
367
+ });
368
+ it('isolates runtimeHooks.onError errors', async () => {
369
+ const failRuntime = {
370
+ name: 'fail',
371
+ async *createStream() {
372
+ throw new Error('runtime broke');
373
+ },
374
+ };
375
+ const throwingErrorCallback = vi.fn().mockRejectedValue(new Error('error hook exploded'));
376
+ const runtimeHooks = {
377
+ onError: [{ callback: throwingErrorCallback }],
378
+ };
379
+ const engine = createTurnEngine({
380
+ name: 'test',
381
+ cwd: '/tmp',
382
+ runtime: failRuntime,
383
+ hooks: {},
384
+ tools: [],
385
+ runtimeHooks,
386
+ });
387
+ // Should not throw despite the hook error
388
+ const trace = await engine.processTurn({ input: 'fail' });
389
+ expect(trace.error).toBe('runtime broke');
390
+ expect(throwingErrorCallback).toHaveBeenCalledTimes(1);
391
+ });
218
392
  });
219
393
  //# sourceMappingURL=engine.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.test.js","sourceRoot":"","sources":["../../src/__tests__/engine.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.test.js","sourceRoot":"","sources":["../../src/__tests__/engine.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { Runtime, RuntimeEvent, TurnStartHook, TurnEndHook, ErrorHook, TurnContext, ContextFragment, TurnResult } from '../types.js';
1
+ import type { Runtime, RuntimeEvent, RuntimeStreamOptions, TurnStartHook, TurnEndHook, ErrorHook, TurnContext, ContextFragment, TurnResult } from '../types.js';
2
2
  export declare function createMockRuntime(response?: string): Runtime;
3
3
  export declare function createMockHook(name: string, fragments: ContextFragment[]): TurnStartHook;
4
4
  export declare function createSpyEndHook(name: string): TurnEndHook & {
@@ -13,4 +13,9 @@ export declare function createSpyErrorHook(name: string): ErrorHook & {
13
13
  error: Error;
14
14
  }[];
15
15
  };
16
+ /**
17
+ * Creates a mock runtime that captures the RuntimeStreamOptions passed to createStream.
18
+ * Useful for verifying that runtimeHooks and other options are forwarded correctly.
19
+ */
20
+ export declare function createHookCapturingRuntime(onOptions: (opts: RuntimeStreamOptions) => void, response?: string): Runtime;
16
21
  //# sourceMappingURL=helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEzI,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAwB,GAAG,OAAO,CAQ7E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,aAAa,CAOxF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG;IAAE,KAAK,EAAE;QAAE,OAAO,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,EAAE,CAAA;CAAE,CAStH;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAS1E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,KAAK,EAAE;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,EAAE,CAAA;CAAE,CAS1F"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE/J,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAwB,GAAG,OAAO,CAQ7E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,aAAa,CAOxF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG;IAAE,KAAK,EAAE;QAAE,OAAO,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,EAAE,CAAA;CAAE,CAStH;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAS1E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,KAAK,EAAE;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,EAAE,CAAA;CAAE,CAS1F;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,EAC/C,QAAQ,GAAE,MAAwB,GACjC,OAAO,CAST"}
@@ -45,4 +45,18 @@ export function createSpyErrorHook(name) {
45
45
  };
46
46
  return hook;
47
47
  }
48
+ /**
49
+ * Creates a mock runtime that captures the RuntimeStreamOptions passed to createStream.
50
+ * Useful for verifying that runtimeHooks and other options are forwarded correctly.
51
+ */
52
+ export function createHookCapturingRuntime(onOptions, response = 'mock response') {
53
+ return {
54
+ name: 'hook-capturing',
55
+ async *createStream(options) {
56
+ onOptions(options);
57
+ yield { type: 'session.init', sessionId: 'sess-capture' };
58
+ yield { type: 'result', text: response };
59
+ },
60
+ };
61
+ }
48
62
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,WAAmB,eAAe;IAClE,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,KAAK,CAAC,CAAC,YAAY;YACjB,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;YACnD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QAC1C,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,SAA4B;IACvE,OAAO;QACL,IAAI;QACJ,KAAK,CAAC,OAAO,CAAC,IAAiB;YAC7B,OAAO,SAAS,CAAA;QAClB,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG;QACX,IAAI;QACJ,KAAK,EAAE,EAAoD;QAC3D,KAAK,CAAC,OAAO,CAAC,OAAoB,EAAE,MAAkB;YACpD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;QACtC,CAAC;KACF,CAAA;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAsB;IAC/D,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,KAAK,CAAC,CAAC,YAAY;YACjB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,IAAI,GAAG;QACX,IAAI;QACJ,KAAK,EAAE,EAAwB;QAC/B,KAAK,CAAC,OAAO,CAAC,IAAiB,EAAE,KAAY;YAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5B,CAAC;KACF,CAAA;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/__tests__/helpers.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,WAAmB,eAAe;IAClE,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,KAAK,CAAC,CAAC,YAAY;YACjB,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;YACnD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QAC1C,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,SAA4B;IACvE,OAAO;QACL,IAAI;QACJ,KAAK,CAAC,OAAO,CAAC,IAAiB;YAC7B,OAAO,SAAS,CAAA;QAClB,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG;QACX,IAAI;QACJ,KAAK,EAAE,EAAoD;QAC3D,KAAK,CAAC,OAAO,CAAC,OAAoB,EAAE,MAAkB;YACpD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;QACtC,CAAC;KACF,CAAA;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAsB;IAC/D,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,KAAK,CAAC,CAAC,YAAY;YACjB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,IAAI,GAAG;QACX,IAAI;QACJ,KAAK,EAAE,EAAwB;QAC/B,KAAK,CAAC,OAAO,CAAC,IAAiB,EAAE,KAAY;YAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5B,CAAC;KACF,CAAA;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,SAA+C,EAC/C,WAAmB,eAAe;IAElC,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,KAAK,CAAC,CAAC,YAAY,CAAC,OAA6B;YAC/C,SAAS,CAAC,OAAO,CAAC,CAAA;YAClB,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,CAAA;YACzD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QAC1C,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=runtime-hooks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-hooks.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/runtime-hooks.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,140 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { adaptLegacyHooks } from '../runtime-hooks.js';
3
+ const makeTurnContext = (overrides) => ({
4
+ turnId: 'turn-1',
5
+ agentName: 'test-agent',
6
+ trigger: 'programmatic',
7
+ input: 'hello',
8
+ sessionId: null,
9
+ metadata: {},
10
+ ...overrides,
11
+ });
12
+ const makeTurnResult = (overrides) => ({
13
+ text: 'response',
14
+ sessionId: null,
15
+ durationMs: 100,
16
+ toolCalls: [],
17
+ ...overrides,
18
+ });
19
+ describe('adaptLegacyHooks()', () => {
20
+ it('returns empty hooks for empty input', () => {
21
+ const hooks = adaptLegacyHooks({});
22
+ expect(hooks.onTurnStart).toBeUndefined();
23
+ expect(hooks.onTurnEnd).toBeUndefined();
24
+ expect(hooks.onError).toBeUndefined();
25
+ });
26
+ it('converts TurnStartHook to onTurnStart', async () => {
27
+ const fragments = [
28
+ { source: 'test', role: 'system', content: 'system prompt' },
29
+ { source: 'test', role: 'prepend', content: 'prepend content' },
30
+ ];
31
+ const legacyHook = {
32
+ name: 'my-hook',
33
+ execute: vi.fn().mockResolvedValue(fragments),
34
+ };
35
+ const hooks = adaptLegacyHooks({ onTurnStart: [legacyHook] });
36
+ expect(hooks.onTurnStart).toHaveLength(1);
37
+ const input = {
38
+ hookEventName: 'turnStart',
39
+ prompt: 'hello',
40
+ turnContext: makeTurnContext(),
41
+ };
42
+ const result = await hooks.onTurnStart[0].callback(input);
43
+ expect(legacyHook.execute).toHaveBeenCalledWith(input.turnContext);
44
+ expect(result).toEqual({
45
+ decision: 'allow',
46
+ additionalContext: 'system prompt\nprepend content',
47
+ });
48
+ });
49
+ it('TurnStartHook with empty fragments returns allow without additionalContext', async () => {
50
+ const legacyHook = {
51
+ name: 'empty-hook',
52
+ execute: vi.fn().mockResolvedValue([]),
53
+ };
54
+ const hooks = adaptLegacyHooks({ onTurnStart: [legacyHook] });
55
+ const input = {
56
+ hookEventName: 'turnStart',
57
+ prompt: 'hello',
58
+ turnContext: makeTurnContext(),
59
+ };
60
+ const result = await hooks.onTurnStart[0].callback(input);
61
+ expect(result).toEqual({ decision: 'allow' });
62
+ });
63
+ it('converts TurnEndHook to onTurnEnd', async () => {
64
+ const turnResult = makeTurnResult({ text: 'done', durationMs: 200 });
65
+ const legacyHook = {
66
+ name: 'end-hook',
67
+ execute: vi.fn().mockResolvedValue(undefined),
68
+ };
69
+ const hooks = adaptLegacyHooks({ onTurnEnd: [legacyHook] });
70
+ expect(hooks.onTurnEnd).toHaveLength(1);
71
+ const input = {
72
+ hookEventName: 'turnEnd',
73
+ result: turnResult,
74
+ turnContext: makeTurnContext(),
75
+ };
76
+ await hooks.onTurnEnd[0].callback(input);
77
+ expect(legacyHook.execute).toHaveBeenCalledWith(input.turnContext, turnResult);
78
+ });
79
+ it('converts ErrorHook to onError', async () => {
80
+ const error = new Error('something broke');
81
+ const legacyHook = {
82
+ name: 'error-hook',
83
+ execute: vi.fn().mockResolvedValue(undefined),
84
+ };
85
+ const hooks = adaptLegacyHooks({ onError: [legacyHook] });
86
+ expect(hooks.onError).toHaveLength(1);
87
+ const input = {
88
+ hookEventName: 'error',
89
+ error,
90
+ turnContext: makeTurnContext(),
91
+ };
92
+ await hooks.onError[0].callback(input);
93
+ expect(legacyHook.execute).toHaveBeenCalledWith(input.turnContext, error);
94
+ });
95
+ it('merges with existing RuntimeHooks', async () => {
96
+ const existingCallback = vi.fn().mockResolvedValue({ decision: 'allow' });
97
+ const existing = {
98
+ onTurnStart: [{ callback: existingCallback }],
99
+ };
100
+ const legacyHook = {
101
+ name: 'legacy',
102
+ execute: vi.fn().mockResolvedValue([]),
103
+ };
104
+ const hooks = adaptLegacyHooks({ onTurnStart: [legacyHook] }, existing);
105
+ // Legacy hooks come first, existing hooks come after
106
+ expect(hooks.onTurnStart).toHaveLength(2);
107
+ expect(hooks.onTurnStart[1].callback).toBe(existingCallback);
108
+ });
109
+ it('emits deprecation warnings when legacy hooks are adapted (AC-12)', () => {
110
+ const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
111
+ const legacyStart = { name: 'start', execute: vi.fn().mockResolvedValue([]) };
112
+ const legacyEnd = { name: 'end', execute: vi.fn().mockResolvedValue(undefined) };
113
+ const legacyError = { name: 'err', execute: vi.fn().mockResolvedValue(undefined) };
114
+ adaptLegacyHooks({
115
+ onTurnStart: [legacyStart],
116
+ onTurnEnd: [legacyEnd],
117
+ onError: [legacyError],
118
+ });
119
+ expect(warnSpy).toHaveBeenCalledTimes(3);
120
+ expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('onTurnStart hooks are deprecated'));
121
+ expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('onTurnEnd hooks are deprecated'));
122
+ expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('onError hooks are deprecated'));
123
+ warnSpy.mockRestore();
124
+ });
125
+ it('preserves existing hooks on fields not covered by legacy', () => {
126
+ const existingErrorCallback = vi.fn().mockResolvedValue(undefined);
127
+ const existing = {
128
+ onError: [{ callback: existingErrorCallback }],
129
+ };
130
+ const legacyHook = {
131
+ name: 'legacy-start',
132
+ execute: vi.fn().mockResolvedValue([]),
133
+ };
134
+ const hooks = adaptLegacyHooks({ onTurnStart: [legacyHook] }, existing);
135
+ expect(hooks.onTurnStart).toHaveLength(1);
136
+ expect(hooks.onError).toHaveLength(1);
137
+ expect(hooks.onError[0].callback).toBe(existingErrorCallback);
138
+ });
139
+ });
140
+ //# sourceMappingURL=runtime-hooks.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-hooks.test.js","sourceRoot":"","sources":["../../src/__tests__/runtime-hooks.test.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,24 @@ const mockRuntime = {
9
9
  yield { type: 'result', text: 'hello from worker' };
10
10
  },
11
11
  };
12
+ function createNoopConnector(name = 'noop-connector') {
13
+ return {
14
+ name,
15
+ registerRoutes(server) {
16
+ server.post(`/${name}/noop`, (_req, res) => {
17
+ res.status(200).json({ ok: true });
18
+ });
19
+ },
20
+ createOutput() {
21
+ return {
22
+ async showProgress() { },
23
+ async sendResult() { },
24
+ async sendError() { },
25
+ async dispose() { },
26
+ };
27
+ },
28
+ };
29
+ }
12
30
  // Helper to make HTTP requests to the worker
13
31
  async function request(port, path, options = {}) {
14
32
  const { method = 'GET', body } = options;
@@ -39,6 +57,7 @@ describe('createWorker', () => {
39
57
  stopFn = null;
40
58
  }
41
59
  process.send = originalProcessSend;
60
+ delete process.env.SENA_CONFIG_PATH;
42
61
  });
43
62
  it('creates a worker with engine', () => {
44
63
  const config = defineConfig({ name: 'test-worker', runtime: mockRuntime });
@@ -47,7 +66,11 @@ describe('createWorker', () => {
47
66
  expect(worker.engine).toBeDefined();
48
67
  });
49
68
  it('serves /health endpoint', async () => {
50
- const config = defineConfig({ name: 'test-worker', runtime: mockRuntime });
69
+ const config = defineConfig({
70
+ name: 'test-worker',
71
+ runtime: mockRuntime,
72
+ connectors: [createNoopConnector('health-noop')],
73
+ });
51
74
  const port = 19876 + Math.floor(Math.random() * 1000);
52
75
  const worker = createWorker({ config, port });
53
76
  await worker.start();
@@ -59,7 +82,11 @@ describe('createWorker', () => {
59
82
  expect(res.text).toBe('ok');
60
83
  });
61
84
  it('returns 404 for unknown routes', async () => {
62
- const config = defineConfig({ name: 'test-worker', runtime: mockRuntime });
85
+ const config = defineConfig({
86
+ name: 'test-worker',
87
+ runtime: mockRuntime,
88
+ connectors: [createNoopConnector('missing-route-noop')],
89
+ });
63
90
  const port = 19876 + Math.floor(Math.random() * 1000);
64
91
  const worker = createWorker({ config, port });
65
92
  await worker.start();
@@ -151,6 +178,65 @@ describe('createWorker', () => {
151
178
  });
152
179
  expect(receivedBody).toEqual({ key: 'value', nested: { a: 1 } });
153
180
  });
181
+ it('passes config directory as prompt base dir when cwd is omitted', () => {
182
+ process.env.SENA_CONFIG_PATH = '/tmp/project/sena.config.ts';
183
+ let receivedContext;
184
+ const contextCapture = {
185
+ name: 'context-capture',
186
+ registerRoutes(_server, _engine, context) {
187
+ receivedContext = context;
188
+ },
189
+ createOutput() {
190
+ return {
191
+ async showProgress() { },
192
+ async sendResult() { },
193
+ async sendError() { },
194
+ async dispose() { },
195
+ };
196
+ },
197
+ };
198
+ const config = defineConfig({
199
+ name: 'context-worker',
200
+ runtime: mockRuntime,
201
+ connectors: [contextCapture],
202
+ });
203
+ createWorker({ config, port: 0 });
204
+ expect(receivedContext).toEqual({
205
+ cwd: process.cwd(),
206
+ configDir: '/tmp/project',
207
+ promptBaseDir: '/tmp/project',
208
+ });
209
+ });
210
+ it('passes explicit cwd as prompt base dir when cwd is configured', () => {
211
+ process.env.SENA_CONFIG_PATH = '/tmp/project/sena.config.ts';
212
+ let receivedContext;
213
+ const contextCapture = {
214
+ name: 'context-capture',
215
+ registerRoutes(_server, _engine, context) {
216
+ receivedContext = context;
217
+ },
218
+ createOutput() {
219
+ return {
220
+ async showProgress() { },
221
+ async sendResult() { },
222
+ async sendError() { },
223
+ async dispose() { },
224
+ };
225
+ },
226
+ };
227
+ const config = defineConfig({
228
+ name: 'context-worker',
229
+ cwd: '/custom/base',
230
+ runtime: mockRuntime,
231
+ connectors: [contextCapture],
232
+ });
233
+ createWorker({ config, port: 0 });
234
+ expect(receivedContext).toEqual({
235
+ cwd: '/custom/base',
236
+ configDir: '/tmp/project',
237
+ promptBaseDir: '/custom/base',
238
+ });
239
+ });
154
240
  it('starts and stops scheduler when schedules are configured', async () => {
155
241
  const runtimeCalls = [];
156
242
  const schedulerRuntime = {