@animalabs/agent-framework 0.9.0 → 0.11.0
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/dist/src/agent.d.ts +1 -1
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js.map +1 -1
- package/dist/src/framework.d.ts +72 -4
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +699 -48
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +62 -7
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +333 -22
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/gate/types.d.ts +56 -0
- package/dist/src/gate/types.d.ts.map +1 -1
- package/dist/src/mcpl/prose-grammar.d.ts +11 -0
- package/dist/src/mcpl/prose-grammar.d.ts.map +1 -1
- package/dist/src/mcpl/prose-grammar.js +21 -0
- package/dist/src/mcpl/prose-grammar.js.map +1 -1
- package/dist/src/mcpl/prose-stream-router.d.ts +2 -2
- package/dist/src/mcpl/prose-stream-router.d.ts.map +1 -1
- package/dist/src/mcpl/prose-stream-router.js +57 -13
- package/dist/src/mcpl/prose-stream-router.js.map +1 -1
- package/dist/src/modules/discord/index.d.ts.map +1 -1
- package/dist/src/modules/discord/index.js +21 -5
- package/dist/src/modules/discord/index.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts +23 -0
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +53 -3
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/sync.d.ts +11 -2
- package/dist/src/modules/workspace/sync.d.ts.map +1 -1
- package/dist/src/modules/workspace/sync.js +27 -11
- package/dist/src/modules/workspace/sync.js.map +1 -1
- package/dist/src/modules/workspace/watcher.d.ts.map +1 -1
- package/dist/src/modules/workspace/watcher.js +9 -6
- package/dist/src/modules/workspace/watcher.js.map +1 -1
- package/dist/src/queue.d.ts.map +1 -1
- package/dist/src/queue.js +9 -2
- package/dist/src/queue.js.map +1 -1
- package/dist/src/tool-result-history.d.ts +12 -2
- package/dist/src/tool-result-history.d.ts.map +1 -1
- package/dist/src/tool-result-history.js +12 -2
- package/dist/src/tool-result-history.js.map +1 -1
- package/dist/src/types/agent.d.ts +6 -1
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +1 -1
- package/dist/src/types/trace.d.ts +7 -0
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/test/busy-agent-scheduler.test.js +29 -0
- package/dist/test/busy-agent-scheduler.test.js.map +1 -1
- package/dist/test/discord-history-delete-window.test.d.ts +2 -0
- package/dist/test/discord-history-delete-window.test.d.ts.map +1 -0
- package/dist/test/discord-history-delete-window.test.js +81 -0
- package/dist/test/discord-history-delete-window.test.js.map +1 -0
- package/dist/test/discord-history-sync.test.d.ts +2 -0
- package/dist/test/discord-history-sync.test.d.ts.map +1 -0
- package/dist/test/discord-history-sync.test.js +56 -0
- package/dist/test/discord-history-sync.test.js.map +1 -0
- package/dist/test/event-gate-passthrough.test.d.ts +15 -0
- package/dist/test/event-gate-passthrough.test.d.ts.map +1 -0
- package/dist/test/event-gate-passthrough.test.js +289 -0
- package/dist/test/event-gate-passthrough.test.js.map +1 -0
- package/dist/test/explicit-prose-routing.test.js +179 -7
- package/dist/test/explicit-prose-routing.test.js.map +1 -1
- package/dist/test/framework.test.js +33 -0
- package/dist/test/framework.test.js.map +1 -1
- package/dist/test/prose-stream-router.test.js +43 -0
- package/dist/test/prose-stream-router.test.js.map +1 -1
- package/dist/test/provider-acceleration-cooldown.test.d.ts +2 -0
- package/dist/test/provider-acceleration-cooldown.test.d.ts.map +1 -0
- package/dist/test/provider-acceleration-cooldown.test.js +286 -0
- package/dist/test/provider-acceleration-cooldown.test.js.map +1 -0
- package/dist/test/puppet-tool-call.test.d.ts +2 -0
- package/dist/test/puppet-tool-call.test.d.ts.map +1 -0
- package/dist/test/puppet-tool-call.test.js +106 -0
- package/dist/test/puppet-tool-call.test.js.map +1 -0
- package/dist/test/release-changelog.test.d.ts +2 -0
- package/dist/test/release-changelog.test.d.ts.map +1 -0
- package/dist/test/release-changelog.test.js +159 -0
- package/dist/test/release-changelog.test.js.map +1 -0
- package/dist/test/tool-result-spill.test.d.ts +1 -1
- package/dist/test/tool-result-spill.test.js +18 -9
- package/dist/test/tool-result-spill.test.js.map +1 -1
- package/dist/test/workspace-path-containment.test.d.ts +19 -0
- package/dist/test/workspace-path-containment.test.d.ts.map +1 -0
- package/dist/test/workspace-path-containment.test.js +91 -0
- package/dist/test/workspace-path-containment.test.js.map +1 -0
- package/dist/test/workspace-watcher.test.js +15 -3
- package/dist/test/workspace-watcher.test.js.map +1 -1
- package/dist/test/xml-round-persist.test.d.ts +19 -0
- package/dist/test/xml-round-persist.test.d.ts.map +1 -0
- package/dist/test/xml-round-persist.test.js +235 -0
- package/dist/test/xml-round-persist.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/src/agent.ts +1 -1
- package/src/framework.ts +733 -48
- package/src/gate/event-gate.ts +355 -24
- package/src/gate/types.ts +58 -0
- package/src/mcpl/prose-grammar.ts +21 -0
- package/src/mcpl/prose-stream-router.ts +48 -14
- package/src/modules/discord/index.ts +24 -6
- package/src/modules/workspace/index.ts +53 -3
- package/src/modules/workspace/sync.ts +39 -10
- package/src/modules/workspace/watcher.ts +9 -6
- package/src/queue.ts +8 -2
- package/src/tool-result-history.ts +12 -2
- package/src/types/agent.ts +6 -1
- package/src/types/framework.ts +1 -1
- package/src/types/trace.ts +13 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XML-mode per-round persist: the framework must store each round's text
|
|
3
|
+
* exactly once.
|
|
4
|
+
*
|
|
5
|
+
* Regression for the Evander 2026-08-08 scaffold-leak pyramid: membrane's
|
|
6
|
+
* `ToolContext.preamble` is CUMULATIVE in XML mode (whole turn so far,
|
|
7
|
+
* including harness-injected <function_results> XML). The per-round persist
|
|
8
|
+
* fallback stored it per round, so a 3-call turn wrote round-1's text 3×,
|
|
9
|
+
* round-2's 2×, and re-persisted injected results as the agent's own words —
|
|
10
|
+
* which the anthropic-xml formatter then replayed to the model as
|
|
11
|
+
* scaffold-in-its-own-voice.
|
|
12
|
+
*
|
|
13
|
+
* With membrane ≥0.5.79 the context carries `roundPreamble` (this round's
|
|
14
|
+
* delta only) and the framework must prefer it. With an older membrane
|
|
15
|
+
* (no `roundPreamble`) the cumulative fallback remains — pinned here so the
|
|
16
|
+
* compat shape stays visible and deliberate.
|
|
17
|
+
*/
|
|
18
|
+
import { describe, it } from 'node:test';
|
|
19
|
+
import assert from 'node:assert';
|
|
20
|
+
import { tmpdir } from 'node:os';
|
|
21
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
22
|
+
import { join } from 'node:path';
|
|
23
|
+
import { AgentFramework } from '../src/index.js';
|
|
24
|
+
const R1 = 'ROUND_ONE_TEXT_alpha';
|
|
25
|
+
const R2 = 'ROUND_TWO_TEXT_beta';
|
|
26
|
+
const FINAL = 'FINAL_TEXT_gamma';
|
|
27
|
+
const INJECTED = 'INJECTED_RESULTS_XML_delta';
|
|
28
|
+
const RAW1 = '<function_calls><invoke name="test--echo"><parameter name="message">round1</parameter></invoke></function_calls>';
|
|
29
|
+
const RAW2 = '<function_calls><invoke name="test--echo"><parameter name="message">round2</parameter></invoke></function_calls>';
|
|
30
|
+
/**
|
|
31
|
+
* Mock yielding stream simulating membrane's XML tool mode: tool-calls
|
|
32
|
+
* events carry NO roundContent; `preamble` is cumulative (with injected
|
|
33
|
+
* results XML between rounds), `roundPreamble` optionally carries the
|
|
34
|
+
* per-round delta.
|
|
35
|
+
*/
|
|
36
|
+
class XmlMockStream {
|
|
37
|
+
rounds;
|
|
38
|
+
finalText;
|
|
39
|
+
withRoundPreamble;
|
|
40
|
+
events = [];
|
|
41
|
+
_done = false;
|
|
42
|
+
_isWaitingForTools = false;
|
|
43
|
+
_round = 0;
|
|
44
|
+
pendingResolve = null;
|
|
45
|
+
constructor(rounds, finalText, withRoundPreamble) {
|
|
46
|
+
this.rounds = rounds;
|
|
47
|
+
this.finalText = finalText;
|
|
48
|
+
this.withRoundPreamble = withRoundPreamble;
|
|
49
|
+
this.emitRound();
|
|
50
|
+
}
|
|
51
|
+
cumulativePreamble(uptoRound) {
|
|
52
|
+
// preamble before round N's call = r0 text + raw0 + injected results +
|
|
53
|
+
// r1 text + ... + rN text (matches membrane: beforeText minus prefill).
|
|
54
|
+
let out = '';
|
|
55
|
+
for (let i = 0; i < uptoRound; i++) {
|
|
56
|
+
out += this.rounds[i].text + '\n' + this.rounds[i].rawText +
|
|
57
|
+
`\n<function_results>${INJECTED}</function_results>\n`;
|
|
58
|
+
}
|
|
59
|
+
out += this.rounds[uptoRound].text + '\n';
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
emitRound() {
|
|
63
|
+
const round = this.rounds[this._round];
|
|
64
|
+
if (!round) {
|
|
65
|
+
const response = {
|
|
66
|
+
content: [{ type: 'text', text: this.finalText }],
|
|
67
|
+
stopReason: 'end_turn',
|
|
68
|
+
rawAssistantText: this.finalText,
|
|
69
|
+
toolCalls: [],
|
|
70
|
+
toolResults: [],
|
|
71
|
+
usage: { inputTokens: 10, outputTokens: 5 },
|
|
72
|
+
details: { raw: {} },
|
|
73
|
+
};
|
|
74
|
+
this.events.push({ type: 'complete', response });
|
|
75
|
+
this._done = true;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this._isWaitingForTools = true;
|
|
79
|
+
this.events.push({
|
|
80
|
+
type: 'tool-calls',
|
|
81
|
+
calls: [{ id: round.callId, name: 'test--echo', input: round.callInput }],
|
|
82
|
+
context: {
|
|
83
|
+
rawText: round.rawText,
|
|
84
|
+
preamble: this.cumulativePreamble(this._round),
|
|
85
|
+
depth: this._round,
|
|
86
|
+
previousResults: [],
|
|
87
|
+
accumulated: this.cumulativePreamble(this._round) + round.rawText,
|
|
88
|
+
...(this.withRoundPreamble ? { roundPreamble: round.text + '\n' } : {}),
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
provideToolResults(_results) {
|
|
93
|
+
if (!this._isWaitingForTools)
|
|
94
|
+
throw new Error('Not waiting for tools');
|
|
95
|
+
this._isWaitingForTools = false;
|
|
96
|
+
this._round++;
|
|
97
|
+
this.emitRound();
|
|
98
|
+
if (this.pendingResolve) {
|
|
99
|
+
const resolve = this.pendingResolve;
|
|
100
|
+
this.pendingResolve = null;
|
|
101
|
+
resolve();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
cancel() {
|
|
105
|
+
this._done = true;
|
|
106
|
+
this.events.push({ type: 'aborted', reason: 'user' });
|
|
107
|
+
if (this.pendingResolve) {
|
|
108
|
+
const r = this.pendingResolve;
|
|
109
|
+
this.pendingResolve = null;
|
|
110
|
+
r();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
get isWaitingForTools() { return this._isWaitingForTools; }
|
|
114
|
+
get pendingToolCallIds() {
|
|
115
|
+
const round = this.rounds[this._round];
|
|
116
|
+
return this._isWaitingForTools && round ? [round.callId] : [];
|
|
117
|
+
}
|
|
118
|
+
get toolDepth() { return this._round; }
|
|
119
|
+
async *[Symbol.asyncIterator]() {
|
|
120
|
+
while (true) {
|
|
121
|
+
while (this.events.length > 0) {
|
|
122
|
+
const event = this.events.shift();
|
|
123
|
+
yield event;
|
|
124
|
+
if (event.type === 'complete' || event.type === 'error' || event.type === 'aborted') {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (this._done)
|
|
129
|
+
return;
|
|
130
|
+
await new Promise((resolve) => { this.pendingResolve = resolve; });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
class XmlMockMembrane {
|
|
135
|
+
withRoundPreamble;
|
|
136
|
+
constructor(withRoundPreamble) {
|
|
137
|
+
this.withRoundPreamble = withRoundPreamble;
|
|
138
|
+
}
|
|
139
|
+
calls = [];
|
|
140
|
+
async complete(request) {
|
|
141
|
+
this.calls.push(request);
|
|
142
|
+
throw new Error('not used');
|
|
143
|
+
}
|
|
144
|
+
streamYielding(request) {
|
|
145
|
+
this.calls.push(request);
|
|
146
|
+
return new XmlMockStream([
|
|
147
|
+
{ text: R1, rawText: RAW1, callId: 'call_1', callInput: { message: 'round1' } },
|
|
148
|
+
{ text: R2, rawText: RAW2, callId: 'call_2', callInput: { message: 'round2' } },
|
|
149
|
+
], FINAL, this.withRoundPreamble);
|
|
150
|
+
}
|
|
151
|
+
asMembrane() {
|
|
152
|
+
return this;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
class EchoModule {
|
|
156
|
+
name = 'test';
|
|
157
|
+
async start(_ctx) { }
|
|
158
|
+
async stop() { }
|
|
159
|
+
getTools() {
|
|
160
|
+
return [{
|
|
161
|
+
name: 'echo',
|
|
162
|
+
description: 'Echoes the input',
|
|
163
|
+
inputSchema: {
|
|
164
|
+
type: 'object',
|
|
165
|
+
properties: { message: { type: 'string', description: 'Message to echo' } },
|
|
166
|
+
required: ['message'],
|
|
167
|
+
},
|
|
168
|
+
}];
|
|
169
|
+
}
|
|
170
|
+
async handleToolCall(call) {
|
|
171
|
+
const input = call.input;
|
|
172
|
+
return { success: true, data: { echoed: input.message } };
|
|
173
|
+
}
|
|
174
|
+
async onProcess(event, _state) {
|
|
175
|
+
if (event.type === 'external-message') {
|
|
176
|
+
return {
|
|
177
|
+
addMessages: [{ participant: 'User', content: [{ type: 'text', text: String(event.content) }] }],
|
|
178
|
+
requestInference: true,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return {};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async function runTurn(withRoundPreamble) {
|
|
185
|
+
const tempDir = mkdtempSync(join(tmpdir(), 'xml-round-persist-'));
|
|
186
|
+
const membrane = new XmlMockMembrane(withRoundPreamble);
|
|
187
|
+
const framework = await AgentFramework.create({
|
|
188
|
+
storePath: join(tempDir, 'test.chronicle'),
|
|
189
|
+
membrane: membrane.asMembrane(),
|
|
190
|
+
agents: [{ name: 'assistant', model: 'test-model', systemPrompt: 'Test' }],
|
|
191
|
+
modules: [new EchoModule()],
|
|
192
|
+
});
|
|
193
|
+
try {
|
|
194
|
+
framework.pushEvent({
|
|
195
|
+
type: 'external-message',
|
|
196
|
+
source: 'test',
|
|
197
|
+
content: 'Do two echoes',
|
|
198
|
+
metadata: {},
|
|
199
|
+
});
|
|
200
|
+
await framework.runUntilIdle();
|
|
201
|
+
const cm = framework.getAgent('assistant').getContextManager();
|
|
202
|
+
const msgs = (cm.queryMessages({}).messages ?? []);
|
|
203
|
+
return msgs
|
|
204
|
+
.flatMap((m) => m.content)
|
|
205
|
+
.filter((b) => b.type === 'text')
|
|
206
|
+
.map((b) => b.text ?? '')
|
|
207
|
+
.join('\n---\n');
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
await framework.stop();
|
|
211
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
function count(haystack, needle) {
|
|
215
|
+
return haystack.split(needle).length - 1;
|
|
216
|
+
}
|
|
217
|
+
describe('XML-mode per-round persist (scaffold-leak pyramid regression)', () => {
|
|
218
|
+
it('stores each round exactly once when membrane provides roundPreamble', async () => {
|
|
219
|
+
const storedText = await runTurn(true);
|
|
220
|
+
assert.strictEqual(count(storedText, R1), 1, `round-1 text stored once, got: ${count(storedText, R1)}`);
|
|
221
|
+
assert.strictEqual(count(storedText, R2), 1, 'round-2 text stored once');
|
|
222
|
+
assert.strictEqual(count(storedText, FINAL), 1, 'final text stored once');
|
|
223
|
+
assert.strictEqual(count(storedText, INJECTED), 0, 'injected <function_results> XML must never persist as agent text');
|
|
224
|
+
});
|
|
225
|
+
it('legacy membrane without roundPreamble keeps the cumulative fallback (pinned)', async () => {
|
|
226
|
+
const storedText = await runTurn(false);
|
|
227
|
+
// The old shape, deliberately pinned: round-1 in rounds 1+2 = 2 copies,
|
|
228
|
+
// injected results re-persisted once. When the fleet's membrane floor
|
|
229
|
+
// reaches 0.5.79 this contract can be dropped along with the fallback.
|
|
230
|
+
assert.strictEqual(count(storedText, R1), 2, 'cumulative fallback: round-1 text twice');
|
|
231
|
+
assert.strictEqual(count(storedText, R2), 1, 'round-2 text once');
|
|
232
|
+
assert.strictEqual(count(storedText, INJECTED), 1, 'injected XML persisted once by fallback');
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
//# sourceMappingURL=xml-round-persist.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml-round-persist.test.js","sourceRoot":"","sources":["../../test/xml-round-persist.test.ts"],"names":[],"mappings":"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"}
|