@animalabs/agent-framework 0.7.3 → 0.8.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.map +1 -1
- package/dist/src/agent.js +28 -1
- package/dist/src/agent.js.map +1 -1
- package/dist/src/code-execution/index.d.ts +1 -1
- package/dist/src/code-execution/index.d.ts.map +1 -1
- package/dist/src/code-execution/index.js.map +1 -1
- package/dist/src/code-execution/py-runner.d.ts +23 -1
- package/dist/src/code-execution/py-runner.d.ts.map +1 -1
- package/dist/src/code-execution/py-runner.js +40 -4
- package/dist/src/code-execution/py-runner.js.map +1 -1
- package/dist/src/code-execution/runtime-py.d.ts +15 -2
- package/dist/src/code-execution/runtime-py.d.ts.map +1 -1
- package/dist/src/code-execution/runtime-py.js +156 -7
- package/dist/src/code-execution/runtime-py.js.map +1 -1
- package/dist/src/code-execution/tool-definition.d.ts.map +1 -1
- package/dist/src/code-execution/tool-definition.js +27 -2
- package/dist/src/code-execution/tool-definition.js.map +1 -1
- package/dist/src/framework.d.ts +92 -0
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +932 -60
- package/dist/src/framework.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +28 -2
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +53 -7
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/transport.d.ts +1 -1
- package/dist/src/mcpl/transport.d.ts.map +1 -1
- package/dist/src/mcpl/transport.js +25 -7
- package/dist/src/mcpl/transport.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +10 -0
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js.map +1 -1
- package/dist/src/module-registry.d.ts +12 -0
- package/dist/src/module-registry.d.ts.map +1 -1
- package/dist/src/module-registry.js +26 -0
- package/dist/src/module-registry.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts +20 -0
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +48 -15
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/sync.d.ts +4 -0
- package/dist/src/modules/workspace/sync.d.ts.map +1 -1
- package/dist/src/modules/workspace/sync.js +1 -1
- package/dist/src/modules/workspace/sync.js.map +1 -1
- package/dist/src/types/agent.d.ts +12 -0
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +10 -0
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/module.d.ts +22 -0
- package/dist/src/types/module.d.ts.map +1 -1
- package/dist/test/agent-runtime-settings.test.js +37 -0
- package/dist/test/agent-runtime-settings.test.js.map +1 -1
- package/dist/test/assistant-persist-refusal.test.d.ts +2 -0
- package/dist/test/assistant-persist-refusal.test.d.ts.map +1 -0
- package/dist/test/assistant-persist-refusal.test.js +63 -0
- package/dist/test/assistant-persist-refusal.test.js.map +1 -0
- package/dist/test/busy-agent-scheduler.test.js +1 -0
- package/dist/test/busy-agent-scheduler.test.js.map +1 -1
- package/dist/test/code-execution.test.js +327 -1
- package/dist/test/code-execution.test.js.map +1 -1
- package/dist/test/deferred-wake-integrity.test.d.ts +29 -0
- package/dist/test/deferred-wake-integrity.test.d.ts.map +1 -0
- package/dist/test/deferred-wake-integrity.test.js +320 -0
- package/dist/test/deferred-wake-integrity.test.js.map +1 -0
- package/dist/test/machine-close-provenance.test.d.ts +2 -0
- package/dist/test/machine-close-provenance.test.d.ts.map +1 -0
- package/dist/test/machine-close-provenance.test.js +110 -0
- package/dist/test/machine-close-provenance.test.js.map +1 -0
- package/dist/test/mcpl-access-provider.test.d.ts +2 -0
- package/dist/test/mcpl-access-provider.test.d.ts.map +1 -0
- package/dist/test/mcpl-access-provider.test.js +20 -0
- package/dist/test/mcpl-access-provider.test.js.map +1 -0
- package/dist/test/module-context-integration.test.d.ts +18 -0
- package/dist/test/module-context-integration.test.d.ts.map +1 -0
- package/dist/test/module-context-integration.test.js +181 -0
- package/dist/test/module-context-integration.test.js.map +1 -0
- package/dist/test/present-while-acting.test.js +72 -0
- package/dist/test/present-while-acting.test.js.map +1 -1
- package/dist/test/utils-surface.test.d.ts +2 -0
- package/dist/test/utils-surface.test.d.ts.map +1 -0
- package/dist/test/utils-surface.test.js +145 -0
- package/dist/test/utils-surface.test.js.map +1 -0
- package/dist/test/workspace-read-image.test.js +71 -0
- package/dist/test/workspace-read-image.test.js.map +1 -1
- package/dist/test/workspace-restore-order.test.d.ts +16 -0
- package/dist/test/workspace-restore-order.test.d.ts.map +1 -0
- package/dist/test/workspace-restore-order.test.js +140 -0
- package/dist/test/workspace-restore-order.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/agent.ts +31 -1
- package/src/code-execution/index.ts +1 -0
- package/src/code-execution/py-runner.ts +56 -4
- package/src/code-execution/runtime-py.ts +156 -7
- package/src/code-execution/tool-definition.ts +27 -2
- package/src/framework.ts +1055 -63
- package/src/mcpl/channel-registry.ts +98 -4
- package/src/mcpl/transport.ts +26 -7
- package/src/mcpl/types.ts +11 -0
- package/src/module-registry.ts +34 -0
- package/src/modules/workspace/index.ts +49 -15
- package/src/modules/workspace/sync.ts +1 -1
- package/src/types/agent.ts +12 -0
- package/src/types/framework.ts +10 -0
- package/src/types/module.ts +24 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for the module-facing framework seams added for issue #5,
|
|
3
|
+
* run through the REAL ModuleContextImpl (not hand-written mocks — a detached
|
|
4
|
+
* or mis-bound method must fail here the way it would in production):
|
|
5
|
+
*
|
|
6
|
+
* - ModuleContext.notifyOps reaches the framework ops channel (ops:alert
|
|
7
|
+
* trace) when invoked as a method on the context object;
|
|
8
|
+
* - ctx.callTool routes synthesized channel_* tools to the ChannelRegistry
|
|
9
|
+
* with trusted module origin (the route was missing entirely — module
|
|
10
|
+
* closes failed as "Invalid tool name format" since subscription-GC moved
|
|
11
|
+
* onto the generic channel_close);
|
|
12
|
+
* - the PUBLIC executeToolCall (the promise-based entry shared with
|
|
13
|
+
* ephemeral/model callers) stamps agent origin no matter what machine
|
|
14
|
+
* fields the input claims — module provenance is conferred by which
|
|
15
|
+
* internal path was used, never by which public method.
|
|
16
|
+
*/
|
|
17
|
+
import { test } from 'node:test';
|
|
18
|
+
import assert from 'node:assert/strict';
|
|
19
|
+
import { tmpdir } from 'node:os';
|
|
20
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { AgentFramework } from '../src/index.js';
|
|
23
|
+
class CtxCaptureModule {
|
|
24
|
+
name = 'ctx-capture';
|
|
25
|
+
ctx = null;
|
|
26
|
+
async start(ctx) {
|
|
27
|
+
this.ctx = ctx;
|
|
28
|
+
}
|
|
29
|
+
async stop() {
|
|
30
|
+
this.ctx = null;
|
|
31
|
+
}
|
|
32
|
+
getTools() {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
async handleToolCall() {
|
|
36
|
+
return { success: false, error: 'no tools', isError: true };
|
|
37
|
+
}
|
|
38
|
+
async onProcess() {
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function minimalMembrane() {
|
|
43
|
+
return {
|
|
44
|
+
complete: async (_req) => {
|
|
45
|
+
throw new Error('not used');
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async function makeFramework(module) {
|
|
50
|
+
const tempDir = mkdtempSync(join(tmpdir(), 'af-ctx-integration-'));
|
|
51
|
+
const framework = await AgentFramework.create({
|
|
52
|
+
storePath: join(tempDir, 'test.chronicle'),
|
|
53
|
+
membrane: minimalMembrane(),
|
|
54
|
+
agents: [{ name: 'assistant', model: 'test-model', systemPrompt: 'test' }],
|
|
55
|
+
modules: [module],
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
framework,
|
|
59
|
+
cleanup: async () => {
|
|
60
|
+
await framework.stop();
|
|
61
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
test('ctx.notifyOps reaches the ops channel through the real ModuleContextImpl', async () => {
|
|
66
|
+
const mod = new CtxCaptureModule();
|
|
67
|
+
const { framework, cleanup } = await makeFramework(mod);
|
|
68
|
+
try {
|
|
69
|
+
const alerts = [];
|
|
70
|
+
framework.onTrace((e) => {
|
|
71
|
+
if (e.type === 'ops:alert')
|
|
72
|
+
alerts.push(e);
|
|
73
|
+
});
|
|
74
|
+
assert.ok(mod.ctx, 'module received its context');
|
|
75
|
+
// Called as a METHOD on the context — the shape hosts must use. A
|
|
76
|
+
// detached `const f = ctx.notifyOps; f(...)` would lose `this` and is
|
|
77
|
+
// exactly the bug class this test exists to catch on the provider side.
|
|
78
|
+
mod.ctx.notifyOps?.('test-kind', 'assistant', 'receipt message', { channelId: 'c1' });
|
|
79
|
+
assert.equal(alerts.length, 1);
|
|
80
|
+
assert.equal(alerts[0].kind, 'test-kind');
|
|
81
|
+
assert.equal(alerts[0].agentName, 'assistant');
|
|
82
|
+
assert.equal(alerts[0].message, 'receipt message');
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
await cleanup();
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
test('ctx.callTool routes channel_* to the ChannelRegistry with module origin', async () => {
|
|
89
|
+
const mod = new CtxCaptureModule();
|
|
90
|
+
const { framework, cleanup } = await makeFramework(mod);
|
|
91
|
+
try {
|
|
92
|
+
// No MCPL servers in this harness, so no live ChannelRegistry — inject a
|
|
93
|
+
// capture in the private slot (test-only cast, same pattern as the
|
|
94
|
+
// registry tests' private access) to observe exactly what executeToolCall
|
|
95
|
+
// forwards.
|
|
96
|
+
const routed = [];
|
|
97
|
+
framework.channelRegistry = {
|
|
98
|
+
handleChannelToolCall: async (name, input, origin) => {
|
|
99
|
+
routed.push({ name, input, origin });
|
|
100
|
+
return { success: true, data: { channelId: 'c1', status: 'closed' } };
|
|
101
|
+
},
|
|
102
|
+
// framework.stop() walks the registry lifecycle.
|
|
103
|
+
stopAll: () => { },
|
|
104
|
+
};
|
|
105
|
+
const result = await mod.ctx.callTool({
|
|
106
|
+
id: 'gc-test-1',
|
|
107
|
+
name: 'channel_close',
|
|
108
|
+
input: { channelId: 'c1', serverId: 'discord', source: 'subscription-gc' },
|
|
109
|
+
});
|
|
110
|
+
assert.equal(result.success, true);
|
|
111
|
+
assert.equal(routed.length, 1);
|
|
112
|
+
assert.equal(routed[0].name, 'channel_close');
|
|
113
|
+
// Trusted dispatch context, not caller-asserted input.
|
|
114
|
+
assert.deepEqual(routed[0].origin, { kind: 'module' });
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
await cleanup();
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
test('public executeToolCall stamps agent origin even when input forges machine fields', async () => {
|
|
121
|
+
const mod = new CtxCaptureModule();
|
|
122
|
+
const { framework, cleanup } = await makeFramework(mod);
|
|
123
|
+
try {
|
|
124
|
+
const routed = [];
|
|
125
|
+
framework.channelRegistry = {
|
|
126
|
+
handleChannelToolCall: async (name, input, origin) => {
|
|
127
|
+
routed.push({ name, input, origin });
|
|
128
|
+
return { success: true, data: { channelId: 'c1', status: 'closed' } };
|
|
129
|
+
},
|
|
130
|
+
stopAll: () => { },
|
|
131
|
+
};
|
|
132
|
+
// The exact spoof from review: an ephemeral/model caller entering
|
|
133
|
+
// through the shared public method, claiming GC provenance in input.
|
|
134
|
+
const result = await framework.executeToolCall({
|
|
135
|
+
id: 'ephemeral-spoof-1',
|
|
136
|
+
name: 'channel_close',
|
|
137
|
+
callerAgentName: 'ephemeral-worker',
|
|
138
|
+
input: {
|
|
139
|
+
channelId: 'c1',
|
|
140
|
+
serverId: 'discord',
|
|
141
|
+
source: 'subscription-gc',
|
|
142
|
+
overrideExplicitOpen: true,
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
assert.equal(result.success, true);
|
|
146
|
+
assert.equal(routed.length, 1);
|
|
147
|
+
// Agent origin from dispatch context; the forged fields ride along in
|
|
148
|
+
// input where handleToolClose ignores them for non-module origin and
|
|
149
|
+
// records 'agent-tool'.
|
|
150
|
+
assert.deepEqual(routed[0].origin, { kind: 'agent', agentName: 'ephemeral-worker' });
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
await cleanup();
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
test('public executeToolCall without callerAgentName fails safe to agent semantics', async () => {
|
|
157
|
+
const mod = new CtxCaptureModule();
|
|
158
|
+
const { framework, cleanup } = await makeFramework(mod);
|
|
159
|
+
try {
|
|
160
|
+
const routed = [];
|
|
161
|
+
framework.channelRegistry = {
|
|
162
|
+
handleChannelToolCall: async (_name, _input, origin) => {
|
|
163
|
+
routed.push({ origin });
|
|
164
|
+
return { success: true, data: { channelId: 'c1', status: 'closed' } };
|
|
165
|
+
},
|
|
166
|
+
stopAll: () => { },
|
|
167
|
+
};
|
|
168
|
+
await framework.executeToolCall({
|
|
169
|
+
id: 'legacy-caller-1',
|
|
170
|
+
name: 'channel_close',
|
|
171
|
+
input: { channelId: 'c1', serverId: 'discord', source: 'housekeeping' },
|
|
172
|
+
});
|
|
173
|
+
assert.equal(routed.length, 1);
|
|
174
|
+
// An unidentified legacy caller is still not a module.
|
|
175
|
+
assert.deepEqual(routed[0].origin, { kind: 'agent', agentName: '__ephemeral__' });
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
await cleanup();
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
//# sourceMappingURL=module-context-integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-context-integration.test.js","sourceRoot":"","sources":["../../test/module-context-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -255,6 +255,78 @@ describe('present while acting', () => {
|
|
|
255
255
|
]);
|
|
256
256
|
await framework.stop();
|
|
257
257
|
});
|
|
258
|
+
it('an ADDRESSED mid-turn injection re-pins the locus for subsequent prose', async () => {
|
|
259
|
+
// 2026-07-31 Mythos misroutes (n=6): someone explicitly addresses the
|
|
260
|
+
// agent from another channel mid-turn (mention / reply / DM); the
|
|
261
|
+
// agent's trailing prose answers THEM but the frozen pin delivered it
|
|
262
|
+
// to the stale locus (the hospital scene into antra's DM, and its
|
|
263
|
+
// mirror). Addressed conversational injections — the chat:addressed
|
|
264
|
+
// signal turn-START batching already prefers — now move the pin, with a
|
|
265
|
+
// one-line [routing] notice riding the same injection batch so window
|
|
266
|
+
// and wire agree. Ambient injections still cannot (previous test).
|
|
267
|
+
membrane.pushResponse(createMockResponse([
|
|
268
|
+
{ type: 'text', text: 'Station four, proceeding.' },
|
|
269
|
+
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
270
|
+
], 'tool_use'));
|
|
271
|
+
membrane.pushResponse(createMockResponse([
|
|
272
|
+
{ type: 'text', text: 'Answering the person who addressed me.' },
|
|
273
|
+
]));
|
|
274
|
+
const framework = await createFramework();
|
|
275
|
+
const routed = stubChannelRegistry(framework);
|
|
276
|
+
module.toolDelayMs = 25;
|
|
277
|
+
module.interjection = 'hey, quick question over here?';
|
|
278
|
+
module.interjectionMetadata = { channelId: 'discord:dm:antra', tags: ['chat:addressed'] };
|
|
279
|
+
const notices = [];
|
|
280
|
+
framework.onTrace((event) => {
|
|
281
|
+
const e = event;
|
|
282
|
+
if (e.type === 'message:added' && e.source === 'routing-notice')
|
|
283
|
+
notices.push(e.source);
|
|
284
|
+
});
|
|
285
|
+
trigger(framework);
|
|
286
|
+
await framework.runUntilIdle();
|
|
287
|
+
// Round-1 prose predates the injection and belongs to the old pin;
|
|
288
|
+
// trailing prose follows the addressed speaker.
|
|
289
|
+
assert.deepEqual(routed, [
|
|
290
|
+
{ text: 'Station four, proceeding.', locus: 'chan-live-1' },
|
|
291
|
+
{ text: 'Answering the person who addressed me.', locus: 'discord:dm:antra' },
|
|
292
|
+
]);
|
|
293
|
+
// Boot-baseline announcement + the mid-turn re-pin notice.
|
|
294
|
+
assert.equal(notices.length, 2, 'the re-pin produced exactly one routing notice');
|
|
295
|
+
// The notice rode the injection batch to the live stream (window == wire).
|
|
296
|
+
const injectedBatches = membrane.lastStream.receivedToolResultOptions
|
|
297
|
+
.map((o) => o?.injectedMessages ?? []);
|
|
298
|
+
const wired = injectedBatches.flat().map((m) => JSON.stringify(m.content));
|
|
299
|
+
assert.ok(wired.some((s) => s.includes('quick question')), 'the addressed message itself was injected');
|
|
300
|
+
assert.ok(wired.some((s) => s.includes('[routing] You were just addressed from discord:dm:antra')), 'the re-pin notice was injected alongside it');
|
|
301
|
+
await framework.stop();
|
|
302
|
+
});
|
|
303
|
+
it('an addressed injection from the CURRENT locus does not chatter a notice', async () => {
|
|
304
|
+
// Same-channel addressed input is the ordinary case (the person the
|
|
305
|
+
// agent is already talking to sends another message mid-turn): the pin
|
|
306
|
+
// is already right, so no re-pin and — critically for KV — no notice.
|
|
307
|
+
membrane.pushResponse(createMockResponse([
|
|
308
|
+
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
309
|
+
], 'tool_use'));
|
|
310
|
+
membrane.pushResponse(createMockResponse([
|
|
311
|
+
{ type: 'text', text: 'Continuing right here.' },
|
|
312
|
+
]));
|
|
313
|
+
const framework = await createFramework();
|
|
314
|
+
const routed = stubChannelRegistry(framework);
|
|
315
|
+
module.toolDelayMs = 25;
|
|
316
|
+
module.interjection = 'and one more thing';
|
|
317
|
+
module.interjectionMetadata = { channelId: 'chan-live-1', tags: ['chat:addressed'] };
|
|
318
|
+
const notices = [];
|
|
319
|
+
framework.onTrace((event) => {
|
|
320
|
+
const e = event;
|
|
321
|
+
if (e.type === 'message:added' && e.source === 'routing-notice')
|
|
322
|
+
notices.push(e.source);
|
|
323
|
+
});
|
|
324
|
+
trigger(framework);
|
|
325
|
+
await framework.runUntilIdle();
|
|
326
|
+
assert.deepEqual(routed, [{ text: 'Continuing right here.', locus: 'chan-live-1' }]);
|
|
327
|
+
assert.equal(notices.length, 1, 'only the boot-baseline announcement — no re-pin chatter');
|
|
328
|
+
await framework.stop();
|
|
329
|
+
});
|
|
258
330
|
it('reactions and system markers injected mid-turn do not clear send suppression', async () => {
|
|
259
331
|
// A reaction (`chat:reaction` tag) or a `system: true` marker is not
|
|
260
332
|
// conversational input: prose following an explicit send stays suppressed,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"present-while-acting.test.js","sourceRoot":"","sources":["../../test/present-while-acting.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"present-while-acting.test.js","sourceRoot":"","sources":["../../test/present-while-acting.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-surface.test.d.ts","sourceRoot":"","sources":["../../test/utils-surface.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// The utils meta-tool: rarely-used capabilities live behind ONE slot
|
|
2
|
+
// (Module.getUtilities) instead of each taxing every inference with a schema.
|
|
3
|
+
// list/describe/run, arg validation that teaches by bounce, and dispatch that
|
|
4
|
+
// arrives at the module's ordinary handleToolCall.
|
|
5
|
+
import { describe, it } from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
7
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
8
|
+
import { tmpdir } from 'node:os';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { AutobiographicalStrategy } from '@animalabs/context-manager';
|
|
11
|
+
import { AgentFramework } from '../src/index.js';
|
|
12
|
+
const membrane = {};
|
|
13
|
+
function strategy() {
|
|
14
|
+
return new AutobiographicalStrategy({
|
|
15
|
+
adaptiveResolution: true,
|
|
16
|
+
foldingStrategy: 'kv-stable',
|
|
17
|
+
recentWindowTokens: 30_000,
|
|
18
|
+
kvStableReachTokens: 8_000,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/** A module with one first-class tool and two utilities, sharing a handler. */
|
|
22
|
+
class StubModule {
|
|
23
|
+
name = 'stub';
|
|
24
|
+
calls = [];
|
|
25
|
+
async start(_ctx) { }
|
|
26
|
+
async stop() { }
|
|
27
|
+
getTools() {
|
|
28
|
+
return [{ name: 'frontline', description: 'Always-on tool.', inputSchema: { type: 'object' } }];
|
|
29
|
+
}
|
|
30
|
+
getUtilities() {
|
|
31
|
+
return [
|
|
32
|
+
{
|
|
33
|
+
name: 'rare_op',
|
|
34
|
+
description: 'A rarely-used operation. Second sentence with detail.',
|
|
35
|
+
inputSchema: {
|
|
36
|
+
type: 'object',
|
|
37
|
+
properties: {
|
|
38
|
+
mode: { type: 'string', enum: ['soft', 'hard'] },
|
|
39
|
+
count: { type: 'number' },
|
|
40
|
+
},
|
|
41
|
+
required: ['mode'],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{ name: 'other_op', description: 'Another one.', inputSchema: { type: 'object' } },
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
async handleToolCall(call) {
|
|
48
|
+
this.calls.push(call);
|
|
49
|
+
return { success: true, data: { handled: call.name, input: call.input } };
|
|
50
|
+
}
|
|
51
|
+
async onProcess() {
|
|
52
|
+
return {};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function makeFramework(modules) {
|
|
56
|
+
const dir = mkdtempSync(join(tmpdir(), 'utils-surface-'));
|
|
57
|
+
const framework = await AgentFramework.create({
|
|
58
|
+
storePath: join(dir, 'store'),
|
|
59
|
+
membrane,
|
|
60
|
+
agents: [{
|
|
61
|
+
name: 'agent',
|
|
62
|
+
model: 'test-model',
|
|
63
|
+
systemPrompt: 'test',
|
|
64
|
+
strategy: strategy(),
|
|
65
|
+
contextBudgetTokens: 100_000,
|
|
66
|
+
maxTokens: 10_000,
|
|
67
|
+
}],
|
|
68
|
+
modules,
|
|
69
|
+
});
|
|
70
|
+
return { framework, dir };
|
|
71
|
+
}
|
|
72
|
+
describe('utils surface', () => {
|
|
73
|
+
it('utils tool appears only when a module contributes utilities', async () => {
|
|
74
|
+
const bare = await makeFramework([]);
|
|
75
|
+
try {
|
|
76
|
+
assert.ok(!bare.framework.getAllTools().some((t) => t.name === 'utils'), 'no utilities → no utils tool, surface unchanged');
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
await bare.framework.stop();
|
|
80
|
+
rmSync(bare.dir, { recursive: true, force: true });
|
|
81
|
+
}
|
|
82
|
+
const stub = new StubModule();
|
|
83
|
+
const { framework, dir } = await makeFramework([stub]);
|
|
84
|
+
try {
|
|
85
|
+
const tools = framework.getAllTools();
|
|
86
|
+
assert.ok(tools.some((t) => t.name === 'utils'), 'utilities present → utils tool exposed');
|
|
87
|
+
assert.ok(tools.some((t) => t.name === 'stub--frontline'), 'first-class tools unaffected');
|
|
88
|
+
assert.ok(!tools.some((t) => t.name === 'stub--rare_op'), 'utilities do NOT appear as first-class tools');
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
await framework.stop();
|
|
92
|
+
rmSync(dir, { recursive: true, force: true });
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
it('list / describe / run round-trip through the ordinary module handler', async () => {
|
|
96
|
+
const stub = new StubModule();
|
|
97
|
+
const { framework, dir } = await makeFramework([stub]);
|
|
98
|
+
try {
|
|
99
|
+
const call = (input) => framework.executeToolCall({ id: 'c1', name: 'utils', input, callerAgentName: 'agent' });
|
|
100
|
+
const list = await call({ action: 'list' });
|
|
101
|
+
assert.ok(list.success);
|
|
102
|
+
assert.deepEqual(list.data, [
|
|
103
|
+
{ name: 'stub--rare_op', description: 'A rarely-used operation.' },
|
|
104
|
+
{ name: 'stub--other_op', description: 'Another one.' },
|
|
105
|
+
]);
|
|
106
|
+
const desc = await call({ action: 'describe', name: 'stub--rare_op' });
|
|
107
|
+
assert.ok(desc.success);
|
|
108
|
+
assert.equal(desc.data.inputSchema.required?.[0], 'mode');
|
|
109
|
+
const run = await call({ action: 'run', name: 'stub--rare_op', args: { mode: 'soft', count: 2 } });
|
|
110
|
+
assert.ok(run.success, run.error);
|
|
111
|
+
assert.deepEqual(run.data, { handled: 'rare_op', input: { mode: 'soft', count: 2 } });
|
|
112
|
+
assert.equal(stub.calls[0].name, 'rare_op', 'module sees the un-prefixed name, as with tools');
|
|
113
|
+
assert.equal(stub.calls[0].callerAgentName, 'agent');
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
await framework.stop();
|
|
117
|
+
rmSync(dir, { recursive: true, force: true });
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
it('arg misses teach by bounce: schema rides the error', async () => {
|
|
121
|
+
const stub = new StubModule();
|
|
122
|
+
const { framework, dir } = await makeFramework([stub]);
|
|
123
|
+
try {
|
|
124
|
+
const call = (input) => framework.executeToolCall({ id: 'c2', name: 'utils', input, callerAgentName: 'agent' });
|
|
125
|
+
const missing = await call({ action: 'run', name: 'stub--rare_op', args: {} });
|
|
126
|
+
assert.ok(!missing.success && missing.isError);
|
|
127
|
+
assert.match(missing.error, /missing required "mode"/);
|
|
128
|
+
assert.match(missing.error, /"enum":\["soft","hard"\]/, 'schema included for the retry');
|
|
129
|
+
const badEnum = await call({ action: 'run', name: 'stub--rare_op', args: { mode: 'loud' } });
|
|
130
|
+
assert.match(badEnum.error, /"mode" must be one of \["soft","hard"\]/);
|
|
131
|
+
const badType = await call({ action: 'run', name: 'stub--rare_op', args: { mode: 'soft', count: 'three' } });
|
|
132
|
+
assert.match(badType.error, /"count" must be number, got string/);
|
|
133
|
+
assert.equal(stub.calls.length, 0, 'handler never reached on a validation miss');
|
|
134
|
+
const unknown = await call({ action: 'run', name: 'stub--nope', args: {} });
|
|
135
|
+
assert.match(unknown.error, /No utility "stub--nope"\. Available: stub--rare_op, stub--other_op/);
|
|
136
|
+
const badAction = await call({ action: 'zap' });
|
|
137
|
+
assert.match(badAction.error, /action must be "list", "describe", or "run"/);
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
await framework.stop();
|
|
141
|
+
rmSync(dir, { recursive: true, force: true });
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=utils-surface.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-surface.test.js","sourceRoot":"","sources":["../../test/utils-surface.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -515,4 +515,75 @@ test('process logging persists a redacted image receipt while the live round kee
|
|
|
515
515
|
redacted: true,
|
|
516
516
|
});
|
|
517
517
|
});
|
|
518
|
+
test('lazy sync never ingests binaries: tree stays clean and read_image serves shell-created files from disk', async (t) => {
|
|
519
|
+
const { mountDir, store, workspace, treeStateId } = setupWorkspace(t);
|
|
520
|
+
const image = TINY_IMAGES.png;
|
|
521
|
+
// A binary created OUTSIDE workspace tools (shell/curl) — the Fable avatar case.
|
|
522
|
+
writeFileSync(join(mountDir, 'shell-made.png'), image.bytes);
|
|
523
|
+
// readBinary triggers lazy sync; the binary must be SKIPPED, not utf-8-mangled.
|
|
524
|
+
const read = await workspace.readBinary('work/shell-made.png');
|
|
525
|
+
assert.ok('error' in read, 'binary must not be lazily synced into the tree');
|
|
526
|
+
assert.equal(store.treeGet(treeStateId, 'shell-made.png'), null);
|
|
527
|
+
// The module read_image handler serves it from disk, bytes exact.
|
|
528
|
+
const result = await callReadImage(workspace, 'work/shell-made.png');
|
|
529
|
+
expectImageResult(result, 'work/shell-made.png', image);
|
|
530
|
+
// Text files keep lazy-syncing as before.
|
|
531
|
+
writeFileSync(join(mountDir, 'note.txt'), 'plain text survives lazy sync');
|
|
532
|
+
const text = await workspace.readBinary('work/note.txt');
|
|
533
|
+
assert.ok('data' in text);
|
|
534
|
+
assert.equal(text.data.toString('utf-8'), 'plain text survives lazy sync');
|
|
535
|
+
});
|
|
536
|
+
test('bare read_image dispatch falls back to disk when the tree blob is utf-8 mangled (pre-fix stores)', async (t) => {
|
|
537
|
+
const root = mkdtempSync(join(tmpdir(), 'af-read-image-mangled-'));
|
|
538
|
+
const mountDir = join(root, 'mount');
|
|
539
|
+
mkdirSync(mountDir, { recursive: true });
|
|
540
|
+
const image = TINY_IMAGES.png;
|
|
541
|
+
writeFileSync(join(mountDir, 'grid-1.png'), image.bytes);
|
|
542
|
+
const membrane = new MockMembrane();
|
|
543
|
+
const workspaceModule = new WorkspaceModule({
|
|
544
|
+
mounts: [{ name: 'work', path: mountDir, mode: 'read-write', watch: 'never' }],
|
|
545
|
+
});
|
|
546
|
+
// BARE tool name — the framework-synthesized surface Fable actually called.
|
|
547
|
+
membrane.pushResponse(createStreamResponse([
|
|
548
|
+
{ type: 'tool_use', id: 'img-mangled-1', name: 'read_image', input: { path: 'work/grid-1.png' } },
|
|
549
|
+
], 'tool_use'));
|
|
550
|
+
membrane.pushResponse(createStreamResponse([{ type: 'text', text: 'Done.' }]));
|
|
551
|
+
const framework = await AgentFramework.create({
|
|
552
|
+
storePath: join(root, 'framework.chronicle'),
|
|
553
|
+
membrane: membrane.asMembrane(),
|
|
554
|
+
agents: [{ name: 'assistant', model: 'mock', systemPrompt: 'test' }],
|
|
555
|
+
modules: [workspaceModule, createInferenceKickModule()],
|
|
556
|
+
syncIntervalMs: 0,
|
|
557
|
+
maintenanceIntervalMs: 0,
|
|
558
|
+
});
|
|
559
|
+
workspaceModule.initStore(framework.getStore());
|
|
560
|
+
t.after(async () => {
|
|
561
|
+
await framework.stop().catch(() => { });
|
|
562
|
+
rmSync(root, { recursive: true, force: true });
|
|
563
|
+
});
|
|
564
|
+
// Poison the tree exactly the way the old ensureSynced did: utf-8 round-trip.
|
|
565
|
+
const store = framework.getStore();
|
|
566
|
+
const mangled = Buffer.from(image.bytes.toString('utf-8'), 'utf-8');
|
|
567
|
+
assert.notDeepEqual(mangled, image.bytes, 'sanity: utf-8 round-trip must corrupt the PNG');
|
|
568
|
+
store.treeSet('workspace/work/tree', 'grid-1.png', {
|
|
569
|
+
blobHash: store.storeBlob(mangled, 'text/plain'),
|
|
570
|
+
size: mangled.byteLength,
|
|
571
|
+
mode: 0o644,
|
|
572
|
+
});
|
|
573
|
+
framework.pushEvent({
|
|
574
|
+
type: 'external-message',
|
|
575
|
+
source: 'test',
|
|
576
|
+
content: 'Read work/grid-1.png',
|
|
577
|
+
metadata: {},
|
|
578
|
+
});
|
|
579
|
+
await framework.runUntilIdle();
|
|
580
|
+
const live = membrane.lastStream?.receivedToolResults[0];
|
|
581
|
+
assert.ok(live, 'tool result must reach the live round');
|
|
582
|
+
assert.equal(live[0].toolUseId, 'img-mangled-1');
|
|
583
|
+
assert.equal(live[0].isError, false, 'mangled tree blob must fall back to disk, not error');
|
|
584
|
+
const imageBlock = live[0].content.find((b) => b.type === 'image');
|
|
585
|
+
assert.ok(imageBlock?.source);
|
|
586
|
+
assert.equal(imageBlock.source.data, image.bytes.toString('base64'), 'bytes must be the DISK bytes, exact');
|
|
587
|
+
assert.equal(imageBlock.source.mediaType, 'image/png');
|
|
588
|
+
});
|
|
518
589
|
//# sourceMappingURL=workspace-read-image.test.js.map
|