@animalabs/agent-framework 0.7.4 → 0.9.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 +10 -0
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +33 -3
- 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 +234 -5
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +1818 -188
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +11 -0
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +66 -0
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/capability-grant.d.ts +115 -0
- package/dist/src/mcpl/capability-grant.d.ts.map +1 -0
- package/dist/src/mcpl/capability-grant.js +291 -0
- package/dist/src/mcpl/capability-grant.js.map +1 -0
- package/dist/src/mcpl/capability-mask.d.ts +51 -0
- package/dist/src/mcpl/capability-mask.d.ts.map +1 -0
- package/dist/src/mcpl/capability-mask.js +190 -0
- package/dist/src/mcpl/capability-mask.js.map +1 -0
- package/dist/src/mcpl/channel-registry.d.ts +30 -2
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +216 -43
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/checkpoint-manager.d.ts +8 -3
- package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -1
- package/dist/src/mcpl/checkpoint-manager.js +28 -8
- package/dist/src/mcpl/checkpoint-manager.js.map +1 -1
- package/dist/src/mcpl/errors.d.ts +6 -0
- package/dist/src/mcpl/errors.d.ts.map +1 -1
- package/dist/src/mcpl/errors.js +6 -0
- package/dist/src/mcpl/errors.js.map +1 -1
- package/dist/src/mcpl/feature-set-manager.d.ts +10 -1
- package/dist/src/mcpl/feature-set-manager.d.ts.map +1 -1
- package/dist/src/mcpl/feature-set-manager.js +45 -4
- package/dist/src/mcpl/feature-set-manager.js.map +1 -1
- package/dist/src/mcpl/hook-orchestrator.d.ts +10 -14
- package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -1
- package/dist/src/mcpl/hook-orchestrator.js +58 -67
- package/dist/src/mcpl/hook-orchestrator.js.map +1 -1
- package/dist/src/mcpl/index.d.ts +1 -1
- package/dist/src/mcpl/index.d.ts.map +1 -1
- package/dist/src/mcpl/index.js.map +1 -1
- package/dist/src/mcpl/prose-stream-router.d.ts +9 -0
- package/dist/src/mcpl/prose-stream-router.d.ts.map +1 -1
- package/dist/src/mcpl/prose-stream-router.js +16 -0
- package/dist/src/mcpl/prose-stream-router.js.map +1 -1
- package/dist/src/mcpl/push-handler.d.ts.map +1 -1
- package/dist/src/mcpl/push-handler.js +20 -2
- package/dist/src/mcpl/push-handler.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +93 -9
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +231 -32
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/server-registry.d.ts.map +1 -1
- package/dist/src/mcpl/server-registry.js +4 -3
- package/dist/src/mcpl/server-registry.js.map +1 -1
- package/dist/src/mcpl/tags.d.ts +24 -0
- package/dist/src/mcpl/tags.d.ts.map +1 -0
- package/dist/src/mcpl/tags.js +52 -0
- package/dist/src/mcpl/tags.js.map +1 -0
- 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 +35 -7
- package/dist/src/mcpl/transport.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +169 -64
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js +16 -2
- 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/refusal-reactions.d.ts +27 -0
- package/dist/src/refusal-reactions.d.ts.map +1 -0
- package/dist/src/refusal-reactions.js +35 -0
- package/dist/src/refusal-reactions.js.map +1 -0
- package/dist/src/tool-result-history.d.ts +10 -0
- package/dist/src/tool-result-history.d.ts.map +1 -1
- package/dist/src/tool-result-history.js +16 -5
- package/dist/src/tool-result-history.js.map +1 -1
- package/dist/src/types/agent.d.ts +35 -0
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +26 -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/src/types/trace.d.ts +24 -0
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/test/busy-agent-scheduler.test.js +1 -0
- package/dist/test/busy-agent-scheduler.test.js.map +1 -1
- package/dist/test/channel-registry-routing.test.js +38 -10
- package/dist/test/channel-registry-routing.test.js.map +1 -1
- package/dist/test/channel-registry-typing.test.js +10 -1
- package/dist/test/channel-registry-typing.test.js.map +1 -1
- package/dist/test/checkpoint-attribution.test.js +168 -8
- package/dist/test/checkpoint-attribution.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/conversation-fork-injection-scoping.test.js +8 -3
- package/dist/test/conversation-fork-injection-scoping.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/event-gate-selfwake.test.d.ts +15 -0
- package/dist/test/event-gate-selfwake.test.d.ts.map +1 -0
- package/dist/test/event-gate-selfwake.test.js +125 -0
- package/dist/test/event-gate-selfwake.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 +116 -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/mcpl-awareness-barrier.test.js +10 -0
- package/dist/test/mcpl-awareness-barrier.test.js.map +1 -1
- package/dist/test/mcpl-capability-grant.test.d.ts +10 -0
- package/dist/test/mcpl-capability-grant.test.d.ts.map +1 -0
- package/dist/test/mcpl-capability-grant.test.js +109 -0
- package/dist/test/mcpl-capability-grant.test.js.map +1 -0
- package/dist/test/mcpl-capability-scoping.test.d.ts +2 -0
- package/dist/test/mcpl-capability-scoping.test.d.ts.map +1 -0
- package/dist/test/mcpl-capability-scoping.test.js +266 -0
- package/dist/test/mcpl-capability-scoping.test.js.map +1 -0
- package/dist/test/mcpl-gate-roundtrip.test.js +13 -0
- package/dist/test/mcpl-gate-roundtrip.test.js.map +1 -1
- package/dist/test/mcpl-list-status.test.d.ts +2 -0
- package/dist/test/mcpl-list-status.test.d.ts.map +1 -0
- package/dist/test/mcpl-list-status.test.js +78 -0
- package/dist/test/mcpl-list-status.test.js.map +1 -0
- package/dist/test/mcpl-manifest-changed.test.d.ts +2 -0
- package/dist/test/mcpl-manifest-changed.test.d.ts.map +1 -0
- package/dist/test/mcpl-manifest-changed.test.js +177 -0
- package/dist/test/mcpl-manifest-changed.test.js.map +1 -0
- package/dist/test/mcpl-reconnect-events.test.js +27 -2
- package/dist/test/mcpl-reconnect-events.test.js.map +1 -1
- package/dist/test/mcpl-reconnect-reregistration.test.js +53 -17
- package/dist/test/mcpl-reconnect-reregistration.test.js.map +1 -1
- package/dist/test/mcpl-request-timeout.test.js +1 -1
- package/dist/test/mcpl-request-timeout.test.js.map +1 -1
- 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/physical-window-restart.test.d.ts +14 -0
- package/dist/test/physical-window-restart.test.d.ts.map +1 -0
- package/dist/test/physical-window-restart.test.js +222 -0
- package/dist/test/physical-window-restart.test.js.map +1 -0
- package/dist/test/present-while-acting.test.js +270 -0
- package/dist/test/present-while-acting.test.js.map +1 -1
- package/dist/test/refusal-reaction-baseline.test.d.ts +2 -0
- package/dist/test/refusal-reaction-baseline.test.d.ts.map +1 -0
- package/dist/test/refusal-reaction-baseline.test.js +74 -0
- package/dist/test/refusal-reaction-baseline.test.js.map +1 -0
- package/dist/test/state-scaling-e2e.test.js +7 -1
- package/dist/test/state-scaling-e2e.test.js.map +1 -1
- package/dist/test/state-scaling.test.js +9 -1
- package/dist/test/state-scaling.test.js.map +1 -1
- package/dist/test/tool-result-spill.test.d.ts +13 -0
- package/dist/test/tool-result-spill.test.d.ts.map +1 -0
- package/dist/test/tool-result-spill.test.js +463 -0
- package/dist/test/tool-result-spill.test.js.map +1 -0
- package/dist/test/trunk-channel-routing.test.js +45 -0
- package/dist/test/trunk-channel-routing.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 +4 -4
- package/src/agent.ts +37 -3
- 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 +2080 -203
- package/src/gate/event-gate.ts +72 -0
- package/src/index.ts +1 -0
- package/src/mcpl/capability-grant.ts +319 -0
- package/src/mcpl/capability-mask.ts +228 -0
- package/src/mcpl/channel-registry.ts +265 -43
- package/src/mcpl/checkpoint-manager.ts +28 -8
- package/src/mcpl/errors.ts +7 -0
- package/src/mcpl/feature-set-manager.ts +50 -5
- package/src/mcpl/hook-orchestrator.ts +64 -86
- package/src/mcpl/index.ts +0 -2
- package/src/mcpl/prose-stream-router.ts +17 -0
- package/src/mcpl/push-handler.ts +18 -2
- package/src/mcpl/server-connection.ts +262 -34
- package/src/mcpl/server-registry.ts +4 -3
- package/src/mcpl/tags.ts +50 -0
- package/src/mcpl/transport.ts +37 -7
- package/src/mcpl/types.ts +187 -78
- 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/refusal-reactions.ts +37 -0
- package/src/tool-result-history.ts +17 -5
- package/src/types/agent.ts +36 -0
- package/src/types/framework.ts +27 -0
- package/src/types/module.ts +24 -0
- package/src/types/trace.ts +22 -0
|
@@ -23,6 +23,7 @@ import { AgentFramework } from '../src/framework.js';
|
|
|
23
23
|
import { FeatureSetManager } from '../src/mcpl/feature-set-manager.js';
|
|
24
24
|
import { ScopeManager } from '../src/mcpl/scope-manager.js';
|
|
25
25
|
import { CheckpointManager } from '../src/mcpl/checkpoint-manager.js';
|
|
26
|
+
import { CapabilityGrant } from '../src/mcpl/capability-grant.js';
|
|
26
27
|
import { PushHandler } from '../src/mcpl/push-handler.js';
|
|
27
28
|
/** In-memory JsStore stub — CheckpointManager only needs the state-slot API. */
|
|
28
29
|
function makeStoreStub() {
|
|
@@ -35,7 +36,12 @@ function makeStoreStub() {
|
|
|
35
36
|
};
|
|
36
37
|
}
|
|
37
38
|
const CAPABILITIES = {
|
|
38
|
-
version: '0.
|
|
39
|
+
version: '0.5',
|
|
40
|
+
// §6.4 derivation runs against the computed grant now: the advertisement
|
|
41
|
+
// must cover each feature set's `uses` or derivation disables it before
|
|
42
|
+
// any push is attempted.
|
|
43
|
+
pushEvents: true,
|
|
44
|
+
tools: true,
|
|
39
45
|
featureSets: {
|
|
40
46
|
chat: { description: 'chat events', uses: ['pushEvents'] },
|
|
41
47
|
mem: { description: 'stateful memory', uses: ['tools'], hostState: true, rollback: true },
|
|
@@ -47,6 +53,24 @@ class FakeConnection extends EventEmitter {
|
|
|
47
53
|
willReconnect = true;
|
|
48
54
|
featureSetUpdates = [];
|
|
49
55
|
onReady;
|
|
56
|
+
// 0.5 surface (§5.3/§6.7): the framework now sends the initial policy as a
|
|
57
|
+
// Request and activates the grant on the receipt. The fake answers
|
|
58
|
+
// accepted — modeling a conforming 0.5 server — so registration reaches
|
|
59
|
+
// establishGrant and post-policy tests exercise delivery, not denial.
|
|
60
|
+
grant = CapabilityGrant.empty();
|
|
61
|
+
// §5.1: `tools` comes from the OUTER standard MCP capabilities — the
|
|
62
|
+
// experimental advert can't mint it. mem uses ['tools'], so the fake
|
|
63
|
+
// models a server whose initialize carried capabilities.tools.
|
|
64
|
+
mcpToolsAdvertised = true;
|
|
65
|
+
policyEstablished = false;
|
|
66
|
+
establishGrant(grant) {
|
|
67
|
+
this.grant = grant;
|
|
68
|
+
this.policyEstablished = true;
|
|
69
|
+
}
|
|
70
|
+
sendFeatureSetsUpdateRequest(params) {
|
|
71
|
+
this.featureSetUpdates.push(params);
|
|
72
|
+
return Promise.resolve({ accepted: true });
|
|
73
|
+
}
|
|
50
74
|
constructor(id) {
|
|
51
75
|
super();
|
|
52
76
|
this.id = id;
|
|
@@ -62,7 +86,7 @@ class FakeConnection extends EventEmitter {
|
|
|
62
86
|
callback?.();
|
|
63
87
|
}
|
|
64
88
|
}
|
|
65
|
-
function makeHarness() {
|
|
89
|
+
async function makeHarness() {
|
|
66
90
|
const store = makeStoreStub();
|
|
67
91
|
const traces = [];
|
|
68
92
|
const pushed = [];
|
|
@@ -96,8 +120,12 @@ function makeHarness() {
|
|
|
96
120
|
fw.discordAwarenessBarrier = null;
|
|
97
121
|
fw.discordAwarenessBarrierGeneration = 0;
|
|
98
122
|
fw.wireMcplEvents(connection);
|
|
99
|
-
fw.registerMcplServerFeatures(config, connection);
|
|
100
|
-
|
|
123
|
+
await fw.registerMcplServerFeatures(config, connection);
|
|
124
|
+
// The push handler responds synchronously when no awareness barrier is
|
|
125
|
+
// up, but during reconnect the §5.3 policy round-trip holds the barrier
|
|
126
|
+
// across a microtask — so the harness settles the loop once before
|
|
127
|
+
// asserting. (Was 'must respond synchronously' pre-0.5.)
|
|
128
|
+
const sendPush = async (eventId) => {
|
|
101
129
|
let result;
|
|
102
130
|
connection.emit('push-event', {
|
|
103
131
|
featureSet: 'chat',
|
|
@@ -106,23 +134,25 @@ function makeHarness() {
|
|
|
106
134
|
payload: { content: [{ type: 'text', text: 'hello' }] },
|
|
107
135
|
}, {
|
|
108
136
|
respond: (r) => { result = r; },
|
|
109
|
-
respondError: () => {
|
|
137
|
+
respondError: (_c, m) => { result = { accepted: false, reason: m }; },
|
|
110
138
|
});
|
|
111
|
-
|
|
139
|
+
if (!result)
|
|
140
|
+
await new Promise((r) => setImmediate(r));
|
|
141
|
+
assert.ok(result, 'push handler must respond within one settle');
|
|
112
142
|
return result;
|
|
113
143
|
};
|
|
114
144
|
return { fw, store, connection, config, sendPush, pushed, traces };
|
|
115
145
|
}
|
|
116
|
-
test('reconnect re-registers the server: pushes are accepted again after close→reconnect', () => {
|
|
117
|
-
const { fw, connection, sendPush, pushed } = makeHarness();
|
|
146
|
+
test('reconnect re-registers the server: pushes are accepted again after close→reconnect', async () => {
|
|
147
|
+
const { fw, connection, sendPush, pushed } = await makeHarness();
|
|
118
148
|
// Sanity: initial registration accepts pushes.
|
|
119
|
-
assert.equal(sendPush('e1').accepted, true);
|
|
149
|
+
assert.equal((await sendPush('e1')).accepted, true);
|
|
120
150
|
assert.equal(pushed.length, 1);
|
|
121
151
|
// Transient crash: transport closed, background reconnect pending.
|
|
122
152
|
connection.willReconnect = true;
|
|
123
153
|
connection.emit('close', null, 'SIGKILL');
|
|
124
154
|
// While down, the server is deregistered — pushes are rejected.
|
|
125
|
-
const down = sendPush('e2');
|
|
155
|
+
const down = await sendPush('e2');
|
|
126
156
|
assert.equal(down.accepted, false);
|
|
127
157
|
assert.match(down.reason ?? '', /Unknown server/);
|
|
128
158
|
// Reconnect succeeded (fresh handshake refreshed capabilities).
|
|
@@ -130,19 +160,25 @@ test('reconnect re-registers the server: pushes are accepted again after close
|
|
|
130
160
|
// push already buffered on the fresh transport: ready() flushes it in the
|
|
131
161
|
// reconnect listener's stack, after host-side feature re-registration.
|
|
132
162
|
let duringReconnect;
|
|
133
|
-
|
|
163
|
+
let e3;
|
|
164
|
+
connection.onReady = () => { e3 = sendPush('e3'); };
|
|
134
165
|
connection.emit('reconnect', { attempts: 1 });
|
|
166
|
+
// Re-registration is async since the §5.3 policy Request: the reconnect
|
|
167
|
+
// listener awaits the receipt before releasing the data plane, so settle
|
|
168
|
+
// the microtask chain before asserting what happened at ready().
|
|
169
|
+
await new Promise((r) => setImmediate(r));
|
|
170
|
+
duringReconnect = await e3;
|
|
135
171
|
assert.equal(duringReconnect?.accepted, true);
|
|
136
172
|
// THE regression: before the fix this stayed rejected forever.
|
|
137
|
-
const revived = sendPush('e4');
|
|
173
|
+
const revived = await sendPush('e4');
|
|
138
174
|
assert.equal(revived.accepted, true, `push after reconnect must be accepted, got: ${revived.reason}`);
|
|
139
175
|
assert.equal(pushed.length, 3);
|
|
140
176
|
// The server was told its enabled feature sets again on re-registration.
|
|
141
177
|
assert.equal(connection.featureSetUpdates.length, 2, 'featureSets/update re-sent on reconnect');
|
|
142
178
|
assert.ok(fw.featureSetManager.isEnabled('srv', 'chat'));
|
|
143
179
|
});
|
|
144
|
-
test('checkpoint state SURVIVES a transient close + reconnect', () => {
|
|
145
|
-
const { fw, store, connection } = makeHarness();
|
|
180
|
+
test('checkpoint state SURVIVES a transient close + reconnect', async () => {
|
|
181
|
+
const { fw, store, connection } = await makeHarness();
|
|
146
182
|
// Record durable checkpoint state for the stateful feature set.
|
|
147
183
|
fw.checkpointManager.recordCheckpoint('srv', 'mem', {
|
|
148
184
|
checkpoint: 'cp1',
|
|
@@ -160,7 +196,7 @@ test('checkpoint state SURVIVES a transient close + reconnect', () => {
|
|
|
160
196
|
assert.equal(fw.checkpointManager.getCurrentCheckpoint('srv', 'mem'), 'cp1');
|
|
161
197
|
assert.deepEqual(fw.checkpointManager.getCurrentState('srv', 'mem'), { counter: 42 });
|
|
162
198
|
});
|
|
163
|
-
test('the close handler NEVER destroys checkpoints — even with willReconnect=false', () => {
|
|
199
|
+
test('the close handler NEVER destroys checkpoints — even with willReconnect=false', async () => {
|
|
164
200
|
// A clean AgentFramework.stop() sets reconnectEnabled=false BEFORE emitting
|
|
165
201
|
// 'close', so willReconnect is false on an ordinary host restart just as much
|
|
166
202
|
// as on a permanent teardown. Gating checkpoint destruction on willReconnect
|
|
@@ -168,7 +204,7 @@ test('the close handler NEVER destroys checkpoints — even with willReconnect=f
|
|
|
168
204
|
// (while a SIGKILL, whose 'close' carries willReconnect=true, preserved them).
|
|
169
205
|
// Permanent removal is owned solely by disconnectMcplServer; the close handler
|
|
170
206
|
// must leave the persisted tree intact for loadFromStore() to resume.
|
|
171
|
-
const { fw, store, connection } = makeHarness();
|
|
207
|
+
const { fw, store, connection } = await makeHarness();
|
|
172
208
|
fw.checkpointManager.recordCheckpoint('srv', 'mem', { checkpoint: 'cp1', data: { x: 1 } });
|
|
173
209
|
// Even a "permanent-looking" close (reconnect disabled) must not delete state.
|
|
174
210
|
connection.willReconnect = false;
|
|
@@ -178,7 +214,7 @@ test('the close handler NEVER destroys checkpoints — even with willReconnect=f
|
|
|
178
214
|
assert.ok(persisted.trees['srv:mem'], 'the persisted tree survives a clean shutdown for later resume');
|
|
179
215
|
});
|
|
180
216
|
test('disconnectMcplServer destroys checkpoints even when the connection already closed transiently', async () => {
|
|
181
|
-
const { fw, connection, config } = makeHarness();
|
|
217
|
+
const { fw, connection, config } = await makeHarness();
|
|
182
218
|
fw.checkpointManager.recordCheckpoint('srv', 'mem', { checkpoint: 'cp1', data: { x: 1 } });
|
|
183
219
|
// Transient close first (checkpoints preserved for the pending reconnect)…
|
|
184
220
|
connection.willReconnect = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpl-reconnect-reregistration.test.js","sourceRoot":"","sources":["../../test/mcpl-reconnect-reregistration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG1D,gFAAgF;AAChF,SAAS,aAAa;IACpB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IACzC,OAAO;QACL,KAAK;QACL,aAAa,EAAE,CAAC,KAAuC,EAAE,EAAE,GAAE,CAAC;QAC9D,YAAY,EAAE,CAAC,EAAU,EAAE,KAAc,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,YAAY,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAAqB;IACrC,OAAO,EAAE,KAAK;IACd,WAAW,EAAE;QACX,IAAI,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,YAAY,CAAC,EAAE;QAC1D,GAAG,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC1F;CAC6B,CAAC;AAEjC,MAAM,cAAe,SAAQ,YAAY;IAC9B,EAAE,CAAS;IACpB,YAAY,GAA4B,YAAY,CAAC;IACrD,aAAa,GAAG,IAAI,CAAC;IACrB,iBAAiB,GAAc,EAAE,CAAC;IAClC,OAAO,CAA2B;IAClC,YAAY,EAAU;QACpB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IACD,qBAAqB,CAAC,MAAe;QACnC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,cAAc,KAAU,CAAC;IACzB,iBAAiB,KAAU,CAAC;IAC5B,KAAK;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,QAAQ,EAAE,EAAE,CAAC;IACf,CAAC;CACF;AAED,
|
|
1
|
+
{"version":3,"file":"mcpl-reconnect-reregistration.test.js","sourceRoot":"","sources":["../../test/mcpl-reconnect-reregistration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ setInterval(() => {}, 1 << 30); // stay alive
|
|
|
30
30
|
const HOST_CAPS = {
|
|
31
31
|
version: '0.4',
|
|
32
32
|
pushEvents: true,
|
|
33
|
-
contextHooks: { beforeInference: true
|
|
33
|
+
contextHooks: { beforeInference: true },
|
|
34
34
|
featureSets: true,
|
|
35
35
|
};
|
|
36
36
|
function config(overrides) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpl-request-timeout.test.js","sourceRoot":"","sources":["../../test/mcpl-request-timeout.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAGxE,6EAA6E;AAC7E,mEAAmE;AACnE,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;CAgBnB,CAAC;AAEF,MAAM,SAAS,GAAyB;IACtC,OAAO,EAAE,KAAK;IACd,UAAU,EAAE,IAAI;IAChB,YAAY,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE
|
|
1
|
+
{"version":3,"file":"mcpl-request-timeout.test.js","sourceRoot":"","sources":["../../test/mcpl-request-timeout.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=module-context-integration.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-context-integration.test.d.ts","sourceRoot":"","sources":["../../test/module-context-integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Issue #92 — mid-turn physical-window projection.
|
|
3
|
+
*
|
|
4
|
+
* A turn's continuation rounds append tool results to the compiled request
|
|
5
|
+
* without recompiling, so a turn that starts near the compile target can
|
|
6
|
+
* walk past the provider's HARD context cap mid-turn and take a wire 400.
|
|
7
|
+
* When AgentConfig.physicalWindowTokens is set, the framework projects each
|
|
8
|
+
* continuation round's real size (cache-INCLUSIVE prior input + blocks about
|
|
9
|
+
* to be appended + reserve for response) and breaks the stream through the
|
|
10
|
+
* budget-restart path — fresh compile — instead of dispatching a doomed
|
|
11
|
+
* request. Unset → behavior unchanged.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=physical-window-restart.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physical-window-restart.test.d.ts","sourceRoot":"","sources":["../../test/physical-window-restart.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|