@animalabs/agent-framework 0.6.0 → 0.6.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 (104) hide show
  1. package/dist/src/agent.d.ts +4 -0
  2. package/dist/src/agent.d.ts.map +1 -1
  3. package/dist/src/agent.js +15 -0
  4. package/dist/src/agent.js.map +1 -1
  5. package/dist/src/framework.d.ts +176 -0
  6. package/dist/src/framework.d.ts.map +1 -1
  7. package/dist/src/framework.js +911 -90
  8. package/dist/src/framework.js.map +1 -1
  9. package/dist/src/gate/event-gate.d.ts +20 -1
  10. package/dist/src/gate/event-gate.d.ts.map +1 -1
  11. package/dist/src/gate/event-gate.js +60 -4
  12. package/dist/src/gate/event-gate.js.map +1 -1
  13. package/dist/src/index.d.ts +3 -0
  14. package/dist/src/index.d.ts.map +1 -1
  15. package/dist/src/index.js +4 -0
  16. package/dist/src/index.js.map +1 -1
  17. package/dist/src/mcpl/channel-registry.d.ts +17 -1
  18. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  19. package/dist/src/mcpl/channel-registry.js +34 -3
  20. package/dist/src/mcpl/channel-registry.js.map +1 -1
  21. package/dist/src/mcpl/push-handler.d.ts.map +1 -1
  22. package/dist/src/mcpl/push-handler.js +4 -0
  23. package/dist/src/mcpl/push-handler.js.map +1 -1
  24. package/dist/src/mcpl/server-connection.d.ts +29 -0
  25. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  26. package/dist/src/mcpl/server-connection.js +102 -4
  27. package/dist/src/mcpl/server-connection.js.map +1 -1
  28. package/dist/src/mcpl/types.d.ts +17 -1
  29. package/dist/src/mcpl/types.d.ts.map +1 -1
  30. package/dist/src/mcpl/types.js.map +1 -1
  31. package/dist/src/module-registry.d.ts +15 -1
  32. package/dist/src/module-registry.d.ts.map +1 -1
  33. package/dist/src/module-registry.js +92 -4
  34. package/dist/src/module-registry.js.map +1 -1
  35. package/dist/src/types/agent.d.ts +37 -0
  36. package/dist/src/types/agent.d.ts.map +1 -1
  37. package/dist/src/types/module.d.ts +46 -0
  38. package/dist/src/types/module.d.ts.map +1 -1
  39. package/dist/src/types/trace.d.ts +42 -0
  40. package/dist/src/types/trace.d.ts.map +1 -1
  41. package/dist/test/agent-cache-ttl.test.d.ts +2 -0
  42. package/dist/test/agent-cache-ttl.test.d.ts.map +1 -0
  43. package/dist/test/agent-cache-ttl.test.js +25 -0
  44. package/dist/test/agent-cache-ttl.test.js.map +1 -0
  45. package/dist/test/conversation-fork-injection-scoping.test.d.ts +2 -0
  46. package/dist/test/conversation-fork-injection-scoping.test.d.ts.map +1 -0
  47. package/dist/test/conversation-fork-injection-scoping.test.js +184 -0
  48. package/dist/test/conversation-fork-injection-scoping.test.js.map +1 -0
  49. package/dist/test/gather-context-timeout.test.d.ts +2 -0
  50. package/dist/test/gather-context-timeout.test.d.ts.map +1 -0
  51. package/dist/test/gather-context-timeout.test.js +120 -0
  52. package/dist/test/gather-context-timeout.test.js.map +1 -0
  53. package/dist/test/inference-exhaustion-rewind.test.d.ts +2 -0
  54. package/dist/test/inference-exhaustion-rewind.test.d.ts.map +1 -0
  55. package/dist/test/inference-exhaustion-rewind.test.js +181 -0
  56. package/dist/test/inference-exhaustion-rewind.test.js.map +1 -0
  57. package/dist/test/inference-failure-observability.test.js +4 -0
  58. package/dist/test/inference-failure-observability.test.js.map +1 -1
  59. package/dist/test/mcpl-reconnect-events.test.d.ts +2 -0
  60. package/dist/test/mcpl-reconnect-events.test.d.ts.map +1 -0
  61. package/dist/test/mcpl-reconnect-events.test.js +119 -0
  62. package/dist/test/mcpl-reconnect-events.test.js.map +1 -0
  63. package/dist/test/mcpl-reconnect-reregistration.test.d.ts +2 -0
  64. package/dist/test/mcpl-reconnect-reregistration.test.d.ts.map +1 -0
  65. package/dist/test/mcpl-reconnect-reregistration.test.js +181 -0
  66. package/dist/test/mcpl-reconnect-reregistration.test.js.map +1 -0
  67. package/dist/test/mcpl-request-timeout.test.d.ts +2 -0
  68. package/dist/test/mcpl-request-timeout.test.d.ts.map +1 -0
  69. package/dist/test/mcpl-request-timeout.test.js +123 -0
  70. package/dist/test/mcpl-request-timeout.test.js.map +1 -0
  71. package/dist/test/mcpl-runtime-lifecycle.test.d.ts +7 -0
  72. package/dist/test/mcpl-runtime-lifecycle.test.d.ts.map +1 -0
  73. package/dist/test/mcpl-runtime-lifecycle.test.js +142 -0
  74. package/dist/test/mcpl-runtime-lifecycle.test.js.map +1 -0
  75. package/dist/test/refusal-rewind.test.d.ts +2 -0
  76. package/dist/test/refusal-rewind.test.d.ts.map +1 -0
  77. package/dist/test/refusal-rewind.test.js +108 -0
  78. package/dist/test/refusal-rewind.test.js.map +1 -0
  79. package/dist/test/state-scaling-e2e.test.d.ts +22 -0
  80. package/dist/test/state-scaling-e2e.test.d.ts.map +1 -0
  81. package/dist/test/state-scaling-e2e.test.js +200 -0
  82. package/dist/test/state-scaling-e2e.test.js.map +1 -0
  83. package/dist/test/state-scaling.test.d.ts +12 -0
  84. package/dist/test/state-scaling.test.d.ts.map +1 -0
  85. package/dist/test/state-scaling.test.js +243 -0
  86. package/dist/test/state-scaling.test.js.map +1 -0
  87. package/dist/test/tool-result-content.test.d.ts +2 -0
  88. package/dist/test/tool-result-content.test.d.ts.map +1 -0
  89. package/dist/test/tool-result-content.test.js +37 -0
  90. package/dist/test/tool-result-content.test.js.map +1 -0
  91. package/dist/tsconfig.tsbuildinfo +1 -1
  92. package/package.json +3 -2
  93. package/src/agent.ts +16 -0
  94. package/src/framework.ts +1069 -99
  95. package/src/gate/event-gate.ts +56 -4
  96. package/src/index.ts +10 -0
  97. package/src/mcpl/channel-registry.ts +34 -3
  98. package/src/mcpl/push-handler.ts +4 -0
  99. package/src/mcpl/server-connection.ts +110 -4
  100. package/src/mcpl/types.ts +19 -1
  101. package/src/module-registry.ts +113 -4
  102. package/src/types/agent.ts +38 -0
  103. package/src/types/module.ts +52 -0
  104. package/src/types/trace.ts +51 -0
@@ -0,0 +1,184 @@
1
+ import { describe, it, beforeEach, afterEach } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { tmpdir } from 'node:os';
4
+ import { mkdtempSync, rmSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ import { AgentFramework } from '../src/index.js';
7
+ import { ChannelRegistry } from '../src/mcpl/channel-registry.js';
8
+ import { MockMembrane, createMockResponse } from './helpers/mock-membrane.js';
9
+ const FORK_AGENT = 'conversation-chanA-g1';
10
+ class InjectionModule {
11
+ injections;
12
+ name = 'injection';
13
+ triggerAgents;
14
+ constructor(injections, triggerAgents = []) {
15
+ this.injections = injections;
16
+ this.triggerAgents = triggerAgents;
17
+ }
18
+ async start(_ctx) { }
19
+ async stop() { }
20
+ getTools() { return []; }
21
+ async handleToolCall(_call) {
22
+ return { success: false, error: 'No tools', isError: true };
23
+ }
24
+ async onProcess(_event) {
25
+ return this.triggerAgents.length > 0
26
+ ? { requestInference: this.triggerAgents }
27
+ : {};
28
+ }
29
+ async gatherContext(_agentName) {
30
+ return this.injections;
31
+ }
32
+ }
33
+ function systemInjection(text, namespace) {
34
+ const injection = {
35
+ position: 'system',
36
+ content: [{ type: 'text', text }],
37
+ };
38
+ if (namespace !== undefined) {
39
+ injection.namespace = namespace;
40
+ }
41
+ return injection;
42
+ }
43
+ function frameworkInternals(framework) {
44
+ return framework;
45
+ }
46
+ function installChannelRegistry(framework, channelIds = ['chanA', 'chanB']) {
47
+ const internals = frameworkInternals(framework);
48
+ const registry = new ChannelRegistry({ getServer: () => null }, {}, () => { }, () => { }, {
49
+ homeChannelResolver: (agentName) => internals.conversationAgentHomes.get(agentName),
50
+ });
51
+ for (const channelId of channelIds) {
52
+ registry.ensureChannelRegistered('srv', channelId);
53
+ }
54
+ internals.channelRegistry = registry;
55
+ }
56
+ function bindForkHome(framework, agentName = FORK_AGENT, channelId = 'chanA') {
57
+ frameworkInternals(framework).conversationAgentHomes.set(agentName, channelId);
58
+ }
59
+ function installHookInjections(framework, injections) {
60
+ frameworkInternals(framework).hookOrchestrator = {
61
+ beforeInference: async () => injections,
62
+ };
63
+ }
64
+ function triggerEvent() {
65
+ return {
66
+ type: 'external-message',
67
+ source: 'test',
68
+ content: 'trigger',
69
+ metadata: {},
70
+ };
71
+ }
72
+ function assertContains(text, needle) {
73
+ assert.ok(text?.includes(needle), `expected system prompt to include ${needle}`);
74
+ }
75
+ function assertOmits(text, needle) {
76
+ assert.ok(!text?.includes(needle), `expected system prompt to omit ${needle}`);
77
+ }
78
+ describe('conversation fork injection scoping', () => {
79
+ let tempDir;
80
+ let membrane;
81
+ let framework;
82
+ beforeEach(() => {
83
+ tempDir = mkdtempSync(join(tmpdir(), 'conv-injection-scope-test-'));
84
+ membrane = new MockMembrane();
85
+ framework = null;
86
+ });
87
+ afterEach(async () => {
88
+ await framework?.stop();
89
+ rmSync(tempDir, { recursive: true, force: true });
90
+ });
91
+ async function makeFramework(moduleInjections, triggerAgents) {
92
+ framework = await AgentFramework.create({
93
+ storePath: join(tempDir, 'test.chronicle'),
94
+ membrane: membrane.asMembrane(),
95
+ agents: [
96
+ { name: 'assistant', model: 'test-model', systemPrompt: 'Assistant system.' },
97
+ { name: FORK_AGENT, model: 'test-model', systemPrompt: 'Fork system.' },
98
+ ],
99
+ modules: [new InjectionModule(moduleInjections, triggerAgents)],
100
+ });
101
+ return framework;
102
+ }
103
+ it('scopes module gatherContext injections for conversation forks and keeps hook scoping', async () => {
104
+ membrane.pushResponse(createMockResponse([]));
105
+ const framework = await makeFramework([
106
+ systemInjection('module chanA context', 'chanA'),
107
+ systemInjection('module chanB context', 'chanB'),
108
+ systemInjection('module retrieval context', 'retrieval'),
109
+ systemInjection('module unnamespaced context'),
110
+ ], [FORK_AGENT]);
111
+ installChannelRegistry(framework);
112
+ bindForkHome(framework);
113
+ installHookInjections(framework, [
114
+ systemInjection('hook chanA context', 'chanA'),
115
+ systemInjection('hook chanB context', 'chanB'),
116
+ systemInjection('hook retrieval context', 'retrieval'),
117
+ ]);
118
+ framework.pushEvent(triggerEvent());
119
+ await framework.runUntilIdle();
120
+ assert.equal(membrane.calls.length, 1);
121
+ const system = membrane.calls[0].system;
122
+ assertContains(system, 'module chanA context');
123
+ assertOmits(system, 'module chanB context');
124
+ assertContains(system, 'module retrieval context');
125
+ assertContains(system, 'module unnamespaced context');
126
+ assertContains(system, 'hook chanA context');
127
+ assertOmits(system, 'hook chanB context');
128
+ assertContains(system, 'hook retrieval context');
129
+ });
130
+ it('passes module injections through for non-conversation agents', async () => {
131
+ membrane.pushResponse(createMockResponse([]));
132
+ const framework = await makeFramework([
133
+ systemInjection('module chanA context', 'chanA'),
134
+ systemInjection('module chanB context', 'chanB'),
135
+ ], ['assistant']);
136
+ installChannelRegistry(framework);
137
+ framework.pushEvent(triggerEvent());
138
+ await framework.runUntilIdle();
139
+ assert.equal(membrane.calls.length, 1);
140
+ const system = membrane.calls[0].system;
141
+ assertContains(system, 'module chanA context');
142
+ assertContains(system, 'module chanB context');
143
+ });
144
+ it('scopes full-fidelity previewActivation module injections like real inference', async () => {
145
+ const framework = await makeFramework([
146
+ systemInjection('preview module chanA context', 'chanA'),
147
+ systemInjection('preview module chanB context', 'chanB'),
148
+ ], []);
149
+ installChannelRegistry(framework);
150
+ bindForkHome(framework);
151
+ installHookInjections(framework, [
152
+ systemInjection('preview hook chanA context', 'chanA'),
153
+ systemInjection('preview hook chanB context', 'chanB'),
154
+ ]);
155
+ const request = await framework.previewActivation(FORK_AGENT, { injections: true });
156
+ assertContains(request.system, 'preview module chanA context');
157
+ assertOmits(request.system, 'preview module chanB context');
158
+ assertContains(request.system, 'preview hook chanA context');
159
+ assertOmits(request.system, 'preview hook chanB context');
160
+ assert.equal(membrane.calls.length, 0, 'previewActivation must not call the membrane');
161
+ });
162
+ it('fails open when the channel registry is absent', async () => {
163
+ membrane.pushResponse(createMockResponse([]));
164
+ const framework = await makeFramework([
165
+ systemInjection('module chanB context', 'chanB'),
166
+ ], [FORK_AGENT]);
167
+ bindForkHome(framework);
168
+ framework.pushEvent(triggerEvent());
169
+ await framework.runUntilIdle();
170
+ assert.equal(membrane.calls.length, 1);
171
+ assertContains(membrane.calls[0].system, 'module chanB context');
172
+ });
173
+ it('handles empty module injection lists without throwing', async () => {
174
+ membrane.pushResponse(createMockResponse([]));
175
+ const framework = await makeFramework([], [FORK_AGENT]);
176
+ installChannelRegistry(framework);
177
+ bindForkHome(framework);
178
+ framework.pushEvent(triggerEvent());
179
+ await framework.runUntilIdle();
180
+ assert.equal(membrane.calls.length, 1);
181
+ assert.equal(membrane.calls[0].system, 'Fork system.');
182
+ });
183
+ });
184
+ //# sourceMappingURL=conversation-fork-injection-scoping.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-fork-injection-scoping.test.js","sourceRoot":"","sources":["../../test/conversation-fork-injection-scoping.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gather-context-timeout.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gather-context-timeout.test.d.ts","sourceRoot":"","sources":["../../test/gather-context-timeout.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * gatherContext per-module timeout (3.5): the flat 5s default silently
3
+ * dropped any module whose gatherContext does real work (e.g. a retrieval
4
+ * module making 2 sequential LLM calls with provider backoff) — fail-open
5
+ * meant "guaranteed timeout, every turn, invisibly".
6
+ *
7
+ * A module can now declare `contextTimeoutMs` for its own budget; the
8
+ * registry default was raised to 15s. Fail-open behavior is preserved for
9
+ * modules that actually exceed their budget.
10
+ */
11
+ import { test, mock } from 'node:test';
12
+ import assert from 'node:assert/strict';
13
+ import { ModuleRegistry } from '../src/module-registry.js';
14
+ function makeRegistry(modules) {
15
+ const registry = Object.create(ModuleRegistry.prototype);
16
+ registry.modules = new Map(modules.map((m) => [m.name, m]));
17
+ return registry;
18
+ }
19
+ function slowModule(name, delayMs, contextTimeoutMs) {
20
+ return {
21
+ name,
22
+ ...(contextTimeoutMs !== undefined ? { contextTimeoutMs } : {}),
23
+ start: async () => { },
24
+ stop: async () => { },
25
+ getTools: () => [],
26
+ handleToolCall: async () => ({ success: true }),
27
+ onProcess: async () => ({}),
28
+ gatherContext: async () => {
29
+ await new Promise((r) => setTimeout(r, delayMs));
30
+ return [{
31
+ namespace: name,
32
+ position: 'system',
33
+ content: [{ type: 'text', text: `from ${name}` }],
34
+ }];
35
+ },
36
+ };
37
+ }
38
+ test('a module slower than the shared default completes within its own contextTimeoutMs', async () => {
39
+ // Registry default budget of 100ms, module takes 300ms but declares 1000ms.
40
+ const registry = makeRegistry([slowModule('retrieval', 300, 1000)]);
41
+ const injections = await registry.gatherContext('agent', 100);
42
+ assert.equal(injections.length, 1, 'the slow module must inject, not silently time out');
43
+ assert.deepEqual(injections[0].content, [{ type: 'text', text: 'from retrieval' }]);
44
+ });
45
+ test('a module exceeding its own budget still fails open (skipped, no throw)', async () => {
46
+ const errs = [];
47
+ const orig = console.error;
48
+ console.error = (...a) => { errs.push(a.join(' ')); };
49
+ try {
50
+ const registry = makeRegistry([slowModule('laggard', 500, 50)]);
51
+ const injections = await registry.gatherContext('agent', 5000);
52
+ assert.equal(injections.length, 0);
53
+ assert.ok(errs.some((e) => e.includes('[laggard]') && e.includes('timed out after 50ms')));
54
+ }
55
+ finally {
56
+ console.error = orig;
57
+ }
58
+ });
59
+ test('modules without contextTimeoutMs use the shared default; fast ones are unaffected', async () => {
60
+ const registry = makeRegistry([
61
+ slowModule('fast', 10),
62
+ slowModule('slow-no-override', 400),
63
+ ]);
64
+ const errs = [];
65
+ const orig = console.error;
66
+ console.error = (...a) => { errs.push(a.join(' ')); };
67
+ try {
68
+ const injections = await registry.gatherContext('agent', 100);
69
+ assert.equal(injections.length, 1, 'only the fast module injects');
70
+ assert.deepEqual(injections[0].content, [{ type: 'text', text: 'from fast' }]);
71
+ }
72
+ finally {
73
+ console.error = orig;
74
+ }
75
+ });
76
+ test('a self-declared contextTimeoutMs is CLAMPED so no module can hold every turn hostage', async () => {
77
+ // A module declaring an absurd 10-minute budget must still be cut off at the
78
+ // 30s ceiling, or one wedged module stalls every inference turn of every
79
+ // agent. Fake timers so the test doesn't actually wait 30s.
80
+ mock.timers.enable({ apis: ['setTimeout'] });
81
+ const errs = [];
82
+ const orig = console.error;
83
+ console.error = (...a) => { errs.push(a.join(' ')); };
84
+ try {
85
+ const hanging = {
86
+ name: 'wedged',
87
+ contextTimeoutMs: 600_000, // 10 minutes — must be clamped to 30s
88
+ start: async () => { },
89
+ stop: async () => { },
90
+ getTools: () => [],
91
+ handleToolCall: async () => ({ success: true }),
92
+ onProcess: async () => ({}),
93
+ gatherContext: () => new Promise(() => { }), // never resolves
94
+ };
95
+ const registry = makeRegistry([hanging]);
96
+ const p = registry.gatherContext('agent', 5000);
97
+ // Advance to the 30s ceiling; if the budget weren't clamped, nothing fires.
98
+ mock.timers.tick(30_000);
99
+ const injections = await p;
100
+ assert.equal(injections.length, 0, 'the wedged module fails open at the ceiling');
101
+ assert.ok(errs.some((e) => e.includes('[wedged]') && e.includes('timed out after 30000ms')), `expected clamp to 30000ms, saw: ${errs.join(' | ')}`);
102
+ }
103
+ finally {
104
+ console.error = orig;
105
+ mock.timers.reset();
106
+ }
107
+ });
108
+ test('per-module budgets run in parallel — total time is bounded by the largest budget, not the sum', async () => {
109
+ const registry = makeRegistry([
110
+ slowModule('a', 150, 1000),
111
+ slowModule('b', 150, 1000),
112
+ slowModule('c', 150, 1000),
113
+ ]);
114
+ const started = Date.now();
115
+ const injections = await registry.gatherContext('agent', 100);
116
+ const elapsed = Date.now() - started;
117
+ assert.equal(injections.length, 3);
118
+ assert.ok(elapsed < 450, `parallel gather took ${elapsed}ms`);
119
+ });
120
+ //# sourceMappingURL=gather-context-timeout.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gather-context-timeout.test.js","sourceRoot":"","sources":["../../test/gather-context-timeout.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=inference-exhaustion-rewind.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inference-exhaustion-rewind.test.d.ts","sourceRoot":"","sources":["../../test/inference-exhaustion-rewind.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Poison-history breaker (6.5): noteInferenceExhausted used to only log at
3
+ * streak>=3 ("[inference-hard-down]") while injecting a marker into the SAME
4
+ * poisoned history — every new push event woke the agent onto a context the
5
+ * API rejects, forever, until a manual /unstick.
6
+ *
7
+ * Now, at the hard-down threshold with a known NON-retryable failure, the
8
+ * breaker auto-quarantines: sheds the newest complete exchange (the same
9
+ * shedNewestTurn primitive the refusal auto-rewind and /unstick use — never
10
+ * orphaning a tool_use/thinking block), drops ONE consolidated marker, and
11
+ * queues a retry — bounded by the refusalHandling.maxRewinds cap so it can
12
+ * never eat the whole history.
13
+ */
14
+ import { test } from 'node:test';
15
+ import assert from 'node:assert/strict';
16
+ import { AgentFramework } from '../src/framework.js';
17
+ function makeHarness(opts) {
18
+ const messages = opts?.messages ?? [
19
+ { id: 'u1', participant: 'human', content: [{ type: 'text', text: 'go' }], metadata: { messageId: '1' } },
20
+ { id: 'a1', participant: 'agent', content: [{ type: 'tool_use', name: 'shell', id: 't1' }] },
21
+ { id: 'r1', participant: 'user', content: [{ type: 'tool_result', toolUseId: 't1', content: 'X'.repeat(9_000_000) }] },
22
+ ];
23
+ const removed = [];
24
+ const added = [];
25
+ const cm = {
26
+ getAllMessages: () => messages,
27
+ removeMessage: (id) => {
28
+ removed.push(id);
29
+ const i = messages.findIndex((m) => m.id === id);
30
+ if (i >= 0)
31
+ messages.splice(i, 1);
32
+ },
33
+ addMessage: (_p, content, meta) => {
34
+ const id = `marker-${added.length}`;
35
+ added.push({ content, meta });
36
+ messages.push({ id, participant: 'user', content, metadata: meta });
37
+ return id;
38
+ },
39
+ editMessage: (id, content) => {
40
+ const m = messages.find((x) => x.id === id);
41
+ if (m)
42
+ m.content = content;
43
+ },
44
+ };
45
+ const fw = Object.create(AgentFramework.prototype);
46
+ fw.consecutiveInferenceFailures = new Map();
47
+ fw.exhaustionRewinds = new Map();
48
+ fw.rewindEpisode = new Map();
49
+ fw.lastInferenceAt = new Map(); // upstream last-inference tracking; noteInferenceExhausted writes it
50
+ fw.pendingRequests = [];
51
+ fw.traceListeners = [];
52
+ fw.inferenceFailureEscalationThreshold = 3;
53
+ fw.agents = new Map([['cairn', {
54
+ name: 'cairn',
55
+ refusalHandling: { maxRewinds: opts?.maxRewinds ?? 3 },
56
+ getContextManager: () => cm,
57
+ }]]);
58
+ const errs = [];
59
+ const orig = console.error;
60
+ console.error = (...a) => { errs.push(a.join(' ')); };
61
+ const restore = () => { console.error = orig; };
62
+ return { fw, messages, removed, added, errs, restore };
63
+ }
64
+ const REASON = '400 invalid_request: tool_use ids must have a corresponding tool_result';
65
+ test('at the threshold, invalid_request failures trigger an automatic rewind + retry', () => {
66
+ const { fw, removed, added, errs, restore } = makeHarness();
67
+ try {
68
+ fw.noteInferenceExhausted('cairn', REASON, false, 'invalid_request'); // 1
69
+ fw.noteInferenceExhausted('cairn', REASON, false, 'invalid_request'); // 2
70
+ assert.equal(removed.length, 0, 'no rewind before the threshold');
71
+ fw.noteInferenceExhausted('cairn', REASON, false, 'invalid_request'); // 3 → breaker trips
72
+ }
73
+ finally {
74
+ restore();
75
+ }
76
+ // The poisoned tool exchange was shed as a COMPLETE pair (no orphans).
77
+ assert.deepEqual([...removed].sort(), ['a1', 'r1']);
78
+ // One consolidated rewind marker, attributed to the API rejection.
79
+ const marker = added.find((m) => m.meta.kind === 'refusal-rewind');
80
+ assert.ok(marker, 'rewind marker added');
81
+ assert.equal(marker.meta.cause, 'inference-failure');
82
+ assert.match(marker.content[0].text, /set aside/);
83
+ assert.match(marker.content[0].text, /rejecting/);
84
+ // A retry was queued so the rewound history is verified immediately.
85
+ assert.equal(fw.pendingRequests.length, 1);
86
+ assert.equal(fw.pendingRequests[0].reason, 'inference-failure-rewind-retry');
87
+ assert.ok(errs.some((e) => e.includes('[inference-rewind]') && e.includes('auto-quarantined')));
88
+ });
89
+ test('retryable / unknown-retryability failures NEVER shed history (outages cost nothing)', () => {
90
+ const { fw, removed, restore } = makeHarness();
91
+ try {
92
+ for (let i = 0; i < 6; i++)
93
+ fw.noteInferenceExhausted('cairn', '529 overloaded', true, 'server');
94
+ for (let i = 0; i < 6; i++)
95
+ fw.noteInferenceExhausted('cairn', 'weird transport error', undefined, undefined);
96
+ }
97
+ finally {
98
+ restore();
99
+ }
100
+ assert.equal(removed.length, 0, 'transient failures must not consume history');
101
+ assert.equal(fw.pendingRequests.length, 0);
102
+ });
103
+ test('non-retryable but NON-poison failures (auth/context_length/abort) NEVER shed history', () => {
104
+ // The breaker keys on the membrane error TYPE, not on `retryable`. membrane
105
+ // marks auth (expired key), context_length, abort, safety and unsupported all
106
+ // non-retryable — but none of them mean the history is poisoned. Shedding
107
+ // good exchanges + stamping a false "the API kept rejecting your history"
108
+ // marker on an expired API key is exactly the category error this guards.
109
+ for (const errorType of ['auth', 'context_length', 'abort', 'safety', 'unsupported']) {
110
+ const { fw, removed, added, restore } = makeHarness();
111
+ try {
112
+ // Well past the hard-down threshold, all with retryable === false.
113
+ for (let i = 0; i < 6; i++)
114
+ fw.noteInferenceExhausted('cairn', `non-retryable ${errorType}`, false, errorType);
115
+ }
116
+ finally {
117
+ restore();
118
+ }
119
+ assert.equal(removed.length, 0, `${errorType}: history must not be shed`);
120
+ assert.equal(fw.pendingRequests.length, 0, `${errorType}: no rewind-retry queued`);
121
+ assert.equal(added.filter((m) => m.meta.kind === 'refusal-rewind').length, 0, `${errorType}: no false rejection marker`);
122
+ }
123
+ });
124
+ test('the breaker is capped: repeated failures stop shedding at maxRewinds', () => {
125
+ const { fw, removed, errs, restore } = makeHarness({
126
+ maxRewinds: 2,
127
+ messages: [
128
+ { id: 'm1', participant: 'human', content: [{ type: 'text', text: 'a' }], metadata: { messageId: '1' } },
129
+ { id: 'm2', participant: 'human', content: [{ type: 'text', text: 'b' }], metadata: { messageId: '2' } },
130
+ { id: 'm3', participant: 'human', content: [{ type: 'text', text: 'c' }], metadata: { messageId: '3' } },
131
+ { id: 'm4', participant: 'human', content: [{ type: 'text', text: 'd' }], metadata: { messageId: '4' } },
132
+ ],
133
+ });
134
+ try {
135
+ // 10 consecutive non-retryable failures: the breaker fires from streak 3 on,
136
+ // but only sheds up to the cap (2), then holds.
137
+ for (let i = 0; i < 10; i++)
138
+ fw.noteInferenceExhausted('cairn', REASON, false, 'invalid_request');
139
+ }
140
+ finally {
141
+ restore();
142
+ }
143
+ assert.equal(removed.length, 2, `cap of 2 respected, shed: ${removed.join(', ')}`);
144
+ assert.equal(fw.pendingRequests.length, 2, 'retries stop when the cap is hit');
145
+ assert.ok(errs.some((e) => e.includes('rewind cap 2 reached')));
146
+ // History still has the untouched older messages — the breaker cannot eat it all.
147
+ assert.equal(fw.exhaustionRewinds.get('cairn'), 2);
148
+ });
149
+ test('a successful inference resets both the streak and the rewind budget', () => {
150
+ const { fw, removed, restore } = makeHarness();
151
+ try {
152
+ fw.noteInferenceExhausted('cairn', REASON, false, 'invalid_request');
153
+ fw.noteInferenceExhausted('cairn', REASON, false, 'invalid_request');
154
+ fw.noteInferenceExhausted('cairn', REASON, false, 'invalid_request'); // shed #1
155
+ assert.equal(removed.length, 2); // one complete tool exchange
156
+ fw.emitTrace({ type: 'inference:completed', agentName: 'cairn' });
157
+ assert.equal(fw.consecutiveInferenceFailures.get('cairn'), 0);
158
+ assert.equal(fw.exhaustionRewinds.get('cairn'), 0);
159
+ }
160
+ finally {
161
+ restore();
162
+ }
163
+ });
164
+ test('nothing left to shed: the breaker degrades to logging, no crash, no loop', () => {
165
+ const { fw, removed, errs, restore } = makeHarness({
166
+ messages: [
167
+ { id: 'mk', participant: 'user', content: [{ type: 'text', text: 'sys' }], metadata: { system: true } },
168
+ ],
169
+ });
170
+ try {
171
+ for (let i = 0; i < 5; i++)
172
+ fw.noteInferenceExhausted('cairn', REASON, false, 'invalid_request');
173
+ }
174
+ finally {
175
+ restore();
176
+ }
177
+ assert.equal(removed.length, 0);
178
+ assert.equal(fw.pendingRequests.length, 0, 'no retry queued when nothing was repaired');
179
+ assert.ok(errs.some((e) => e.includes('nothing left to shed')));
180
+ });
181
+ //# sourceMappingURL=inference-exhaustion-rewind.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inference-exhaustion-rewind.test.js","sourceRoot":"","sources":["../../test/inference-exhaustion-rewind.test.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,10 @@ function makeHarness() {
10
10
  const fw = Object.create(AgentFramework.prototype);
11
11
  fw.consecutiveInferenceFailures = new Map();
12
12
  fw.inferenceFailureEscalationThreshold = 3;
13
+ fw.exhaustionRewinds = new Map();
14
+ fw.rewindEpisode = new Map();
15
+ fw.lastInferenceAt = new Map(); // upstream last-inference tracking; noteInferenceExhausted writes it
16
+ fw.pendingRequests = [];
13
17
  const markers = [];
14
18
  fw.agents = new Map([['cairn', {
15
19
  getContextManager: () => ({
@@ -1 +1 @@
1
- {"version":3,"file":"inference-failure-observability.test.js","sourceRoot":"","sources":["../../test/inference-failure-observability.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inference-failure-observability.test.js","sourceRoot":"","sources":["../../test/inference-failure-observability.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcpl-reconnect-events.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpl-reconnect-events.test.d.ts","sourceRoot":"","sources":["../../test/mcpl-reconnect-events.test.ts"],"names":[],"mappings":""}