@animalabs/agent-framework 0.6.3 → 0.6.4

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 (51) hide show
  1. package/dist/src/agent.d.ts +3 -1
  2. package/dist/src/agent.d.ts.map +1 -1
  3. package/dist/src/agent.js +7 -2
  4. package/dist/src/agent.js.map +1 -1
  5. package/dist/src/framework.d.ts +2 -0
  6. package/dist/src/framework.d.ts.map +1 -1
  7. package/dist/src/framework.js +16 -3
  8. package/dist/src/framework.js.map +1 -1
  9. package/dist/src/index.d.ts +1 -0
  10. package/dist/src/index.d.ts.map +1 -1
  11. package/dist/src/index.js +1 -0
  12. package/dist/src/index.js.map +1 -1
  13. package/dist/src/modules/discord/index.d.ts +1 -0
  14. package/dist/src/modules/discord/index.d.ts.map +1 -1
  15. package/dist/src/modules/discord/index.js +4 -1
  16. package/dist/src/modules/discord/index.js.map +1 -1
  17. package/dist/src/modules/discord/types.d.ts +2 -0
  18. package/dist/src/modules/discord/types.d.ts.map +1 -1
  19. package/dist/src/modules/health/index.d.ts +2 -0
  20. package/dist/src/modules/health/index.d.ts.map +1 -1
  21. package/dist/src/modules/health/index.js +15 -4
  22. package/dist/src/modules/health/index.js.map +1 -1
  23. package/dist/src/timezone.d.ts +14 -0
  24. package/dist/src/timezone.d.ts.map +1 -0
  25. package/dist/src/timezone.js +74 -0
  26. package/dist/src/timezone.js.map +1 -0
  27. package/dist/src/types/agent.d.ts +5 -2
  28. package/dist/src/types/agent.d.ts.map +1 -1
  29. package/dist/src/types/framework.d.ts +6 -0
  30. package/dist/src/types/framework.d.ts.map +1 -1
  31. package/dist/test/agent-cache-ttl.test.js +18 -2
  32. package/dist/test/agent-cache-ttl.test.js.map +1 -1
  33. package/dist/test/health-snapshot.test.d.ts +2 -0
  34. package/dist/test/health-snapshot.test.d.ts.map +1 -0
  35. package/dist/test/health-snapshot.test.js +74 -0
  36. package/dist/test/health-snapshot.test.js.map +1 -0
  37. package/dist/test/timezone.test.d.ts +2 -0
  38. package/dist/test/timezone.test.d.ts.map +1 -0
  39. package/dist/test/timezone.test.js +18 -0
  40. package/dist/test/timezone.test.js.map +1 -0
  41. package/dist/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +1 -1
  43. package/src/agent.ts +8 -3
  44. package/src/framework.ts +18 -3
  45. package/src/index.ts +1 -0
  46. package/src/modules/discord/index.ts +4 -1
  47. package/src/modules/discord/types.ts +3 -0
  48. package/src/modules/health/index.ts +20 -4
  49. package/src/timezone.ts +90 -0
  50. package/src/types/agent.ts +6 -2
  51. package/src/types/framework.ts +7 -0
@@ -15,11 +15,27 @@ describe('Agent cacheTtl forwarding', () => {
15
15
  assert.equal(request.promptCaching, true);
16
16
  assert.equal(request.cacheTtl, '1h');
17
17
  });
18
- it('omits cacheTtl entirely when unset, leaving the provider default', async () => {
18
+ it('defaults cacheTtl to 1h when unset', async () => {
19
19
  const agent = createAgent({});
20
20
  const request = await agent.buildActivationRequest([]);
21
21
  assert.equal(request.promptCaching, true);
22
- assert.equal('cacheTtl' in request, false);
22
+ assert.equal(request.cacheTtl, '1h');
23
+ });
24
+ it('preserves an explicit 5m override', async () => {
25
+ const agent = createAgent({ cacheTtl: '5m' });
26
+ const request = await agent.buildActivationRequest([]);
27
+ assert.equal(request.cacheTtl, '5m');
28
+ });
29
+ });
30
+ describe('Agent provider parameter forwarding', () => {
31
+ it('forwards stateless Responses reasoning and compaction settings unchanged', async () => {
32
+ const providerParams = {
33
+ reasoning: { effort: 'high', context: 'all_turns' },
34
+ context_management: [{ type: 'compaction', compact_threshold: 850000 }],
35
+ };
36
+ const agent = createAgent({ providerParams });
37
+ const request = await agent.buildActivationRequest([]);
38
+ assert.deepEqual(request.providerParams, providerParams);
23
39
  });
24
40
  });
25
41
  //# sourceMappingURL=agent-cache-ttl.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-cache-ttl.test.js","sourceRoot":"","sources":["../../test/agent-cache-ttl.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAKxC,8EAA8E;AAC9E,MAAM,kBAAkB,GAAG;IACzB,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;CACjC,CAAC;AAE/B,SAAS,WAAW,CAAC,MAA4B;IAC/C,OAAO,IAAI,KAAK,CACd,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,EACvE,kBAAkB,EAClB,EAAc,CACf,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"agent-cache-ttl.test.js","sourceRoot":"","sources":["../../test/agent-cache-ttl.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAKxC,8EAA8E;AAC9E,MAAM,kBAAkB,GAAG;IACzB,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;CACjC,CAAC;AAE/B,SAAS,WAAW,CAAC,MAA4B;IAC/C,OAAO,IAAI,KAAK,CACd,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,EACvE,kBAAkB,EAClB,EAAc,CACf,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,cAAc,GAAG;YACrB,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;YACnD,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC;SACxE,CAAC;QACF,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=health-snapshot.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-snapshot.test.d.ts","sourceRoot":"","sources":["../../test/health-snapshot.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { HealthModule } from '../src/modules/health/index.js';
4
+ /**
5
+ * buildSnapshot only needs queryInferenceLogs (store/ctx paths are skipped
6
+ * when includeSubagents=false and no ctx is bound), so a minimal framework
7
+ * stub exercises the projectSummary presentation path directly.
8
+ */
9
+ function frameworkStub(entries) {
10
+ return {
11
+ queryInferenceLogs: () => ({ entries, total: entries.length, hasMore: false }),
12
+ };
13
+ }
14
+ function snapshotCall() {
15
+ return {
16
+ id: 'call-1',
17
+ name: 'snapshot',
18
+ input: { includeSubagents: false, includeTokens: false },
19
+ };
20
+ }
21
+ describe('HealthModule snapshot timestamp resilience', () => {
22
+ it('degrades gracefully when a legacy record lacks a timestamp', async () => {
23
+ const entries = [
24
+ {
25
+ sequence: 0,
26
+ // Legacy persisted record: no timestamp field at all.
27
+ entry: { agentName: 'legacy', requestId: 'r0', success: false, error: 'boom', request: {}, durationMs: 1 },
28
+ },
29
+ {
30
+ sequence: 1,
31
+ entry: { timestamp: 1751900000000, agentName: 'ok', requestId: 'r1', success: true, request: {}, durationMs: 1 },
32
+ },
33
+ ];
34
+ const health = new HealthModule({ timeZone: 'UTC' });
35
+ health.bind(frameworkStub(entries), {});
36
+ const result = await health.handleToolCall(snapshotCall());
37
+ // One bad record must not sink the whole snapshot.
38
+ assert.equal(result.success, true, `snapshot failed: ${result.error}`);
39
+ const data = result.data;
40
+ assert.equal(data.inferences.successCount, 1);
41
+ assert.equal(data.inferences.errorCount, 1);
42
+ // The bad record's timestamp degrades to null (undefined ?? null).
43
+ assert.equal(data.inferences.recentErrors[0].timestamp, null);
44
+ });
45
+ it('emits the raw value for a non-numeric timestamp instead of throwing', async () => {
46
+ const entries = [
47
+ {
48
+ sequence: 0,
49
+ entry: { timestamp: 'not-a-date', agentName: 'weird', requestId: 'r2', success: false, error: 'x', request: {}, durationMs: 1 },
50
+ },
51
+ ];
52
+ const health = new HealthModule({ timeZone: 'UTC' });
53
+ health.bind(frameworkStub(entries), {});
54
+ const result = await health.handleToolCall(snapshotCall());
55
+ assert.equal(result.success, true, `snapshot failed: ${result.error}`);
56
+ const data = result.data;
57
+ assert.equal(data.inferences.recentErrors[0].timestamp, 'not-a-date');
58
+ });
59
+ it('still formats valid timestamps in the configured zone', async () => {
60
+ const entries = [
61
+ {
62
+ sequence: 0,
63
+ entry: { timestamp: Date.UTC(2026, 0, 2, 3, 4, 5), agentName: 'ok', requestId: 'r3', success: false, error: 'y', request: {}, durationMs: 1 },
64
+ },
65
+ ];
66
+ const health = new HealthModule({ timeZone: 'UTC' });
67
+ health.bind(frameworkStub(entries), {});
68
+ const result = await health.handleToolCall(snapshotCall());
69
+ assert.equal(result.success, true, `snapshot failed: ${result.error}`);
70
+ const data = result.data;
71
+ assert.equal(data.inferences.recentErrors[0].timestamp, '2026-01-02T03:04:05.000+00:00 [UTC]');
72
+ });
73
+ });
74
+ //# sourceMappingURL=health-snapshot.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-snapshot.test.js","sourceRoot":"","sources":["../../test/health-snapshot.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=timezone.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timezone.test.d.ts","sourceRoot":"","sources":["../../test/timezone.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { formatZonedDateTime, formatZonedTime, isValidTimeZone, resolveTimeZone } from '../src/timezone.js';
4
+ describe('agent-visible timezone formatting', () => {
5
+ const winter = new Date('2026-01-15T12:34:56.789Z');
6
+ const summer = new Date('2026-07-15T12:34:56.789Z');
7
+ it('renders the configured zone with the correct DST offset', () => {
8
+ assert.equal(formatZonedDateTime(winter, 'America/Los_Angeles'), '2026-01-15T04:34:56.789-08:00 [America/Los_Angeles]');
9
+ assert.equal(formatZonedDateTime(summer, 'America/Los_Angeles'), '2026-07-15T05:34:56.789-07:00 [America/Los_Angeles]');
10
+ assert.equal(formatZonedTime(summer, 'America/Los_Angeles'), '05:34');
11
+ });
12
+ it('validates IANA zones', () => {
13
+ assert.equal(isValidTimeZone('Europe/Paris'), true);
14
+ assert.equal(isValidTimeZone('Definitely/Not_A_Zone'), false);
15
+ assert.throws(() => resolveTimeZone('Definitely/Not_A_Zone'), /Invalid IANA time zone/);
16
+ });
17
+ });
18
+ //# sourceMappingURL=timezone.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timezone.test.js","sourceRoot":"","sources":["../../test/timezone.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE5G,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAEpD,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,KAAK,CACV,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAClD,qDAAqD,CACtD,CAAC;QACF,MAAM,CAAC,KAAK,CACV,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAClD,qDAAqD,CACtD,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,uBAAuB,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,uBAAuB,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}