@animalabs/agent-framework 0.8.0 → 0.10.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 +11 -1
- 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/framework.d.ts +184 -18
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +1323 -246
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +73 -7
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +399 -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/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 +3 -1
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +163 -36
- 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-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 +11 -2
- package/dist/src/mcpl/prose-stream-router.d.ts.map +1 -1
- package/dist/src/mcpl/prose-stream-router.js +73 -13
- 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.map +1 -1
- package/dist/src/mcpl/transport.js +10 -0
- package/dist/src/mcpl/transport.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +159 -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/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 +48 -0
- 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 +18 -8
- 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 +20 -0
- package/dist/src/tool-result-history.d.ts.map +1 -1
- package/dist/src/tool-result-history.js +26 -5
- package/dist/src/tool-result-history.js.map +1 -1
- package/dist/src/types/agent.d.ts +39 -1
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +16 -0
- package/dist/src/types/framework.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/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/conversation-fork-injection-scoping.test.js +8 -3
- package/dist/test/conversation-fork-injection-scoping.test.js.map +1 -1
- 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/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/explicit-prose-routing.test.js +137 -7
- package/dist/test/explicit-prose-routing.test.js.map +1 -1
- package/dist/test/fixtures/awareness-barrier-mcpl-server.mjs +276 -0
- package/dist/test/fixtures/flaky-mcpl-server.mjs +41 -0
- package/dist/test/machine-close-provenance.test.js +6 -0
- package/dist/test/machine-close-provenance.test.js.map +1 -1
- 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/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 +199 -1
- package/dist/test/present-while-acting.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/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 +472 -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/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 +5 -4
- package/src/agent.ts +38 -4
- package/src/framework.ts +1488 -272
- package/src/gate/event-gate.ts +427 -24
- package/src/gate/types.ts +58 -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 +167 -39
- 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-grammar.ts +21 -0
- package/src/mcpl/prose-stream-router.ts +65 -14
- 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 +11 -0
- package/src/mcpl/types.ts +176 -78
- package/src/modules/workspace/index.ts +48 -0
- package/src/modules/workspace/sync.ts +30 -7
- package/src/refusal-reactions.ts +37 -0
- package/src/tool-result-history.ts +27 -5
- package/src/types/agent.ts +40 -1
- package/src/types/framework.ts +17 -0
- package/src/types/trace.ts +22 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* §17 host-side manifest tracking (RFC-003, af#78).
|
|
3
|
+
*
|
|
4
|
+
* The load-bearing orderings, each pinned:
|
|
5
|
+
* - reduction applies BEFORE the post-manifest policy Request is sent
|
|
6
|
+
* (§6.7: security cannot wait on consent);
|
|
7
|
+
* - expansion activates only AFTER the receipt (an unanswered Request
|
|
8
|
+
* leaves the interim reduced grant standing);
|
|
9
|
+
* - a failed fetch teaches nothing — the previous manifest stands;
|
|
10
|
+
* - exactly ONE receipt trace per change, host-derived vocabulary;
|
|
11
|
+
* - announcements coalesce under the §17.8 fetch floor.
|
|
12
|
+
*/
|
|
13
|
+
import { test } from 'node:test';
|
|
14
|
+
import assert from 'node:assert/strict';
|
|
15
|
+
import { EventEmitter } from 'node:events';
|
|
16
|
+
import { AgentFramework } from '../src/framework.js';
|
|
17
|
+
import { FeatureSetManager } from '../src/mcpl/feature-set-manager.js';
|
|
18
|
+
import { CapabilityGrant, computeGrant, expandAdvertisementShorthand } from '../src/mcpl/capability-grant.js';
|
|
19
|
+
const INITIAL = {
|
|
20
|
+
version: '0.5',
|
|
21
|
+
pushEvents: true,
|
|
22
|
+
channels: { incoming: true, publish: true },
|
|
23
|
+
featureSets: {
|
|
24
|
+
chat: { description: 'chat', uses: ['pushEvents', 'channels.incoming', 'channels.publish'] },
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
class ManifestFake extends EventEmitter {
|
|
28
|
+
id = 'srv';
|
|
29
|
+
capabilities = null;
|
|
30
|
+
willReconnect = false;
|
|
31
|
+
mcpToolsAdvertised = false;
|
|
32
|
+
allowHostCommands = false;
|
|
33
|
+
grant = CapabilityGrant.empty();
|
|
34
|
+
policyEstablished = false;
|
|
35
|
+
manifestState = { lastValidatedRevision: null, lastFetchedAt: null, lastNegotiatedAt: null };
|
|
36
|
+
droppedCapabilities = new Set();
|
|
37
|
+
/** Ordered record of what the host did to us, for ordering assertions. */
|
|
38
|
+
events = [];
|
|
39
|
+
/** Next mcpl/manifest answer; a function may throw to model fetch failure. */
|
|
40
|
+
nextManifest = () => INITIAL;
|
|
41
|
+
/** How featureSets/update Requests are answered. */
|
|
42
|
+
answerPolicy = 'accept';
|
|
43
|
+
closed = false;
|
|
44
|
+
close() { this.closed = true; return Promise.resolve(); }
|
|
45
|
+
establishGrant(grant) {
|
|
46
|
+
this.grant = grant;
|
|
47
|
+
this.policyEstablished = true;
|
|
48
|
+
this.events.push({ kind: 'grant', detail: grant.effectiveList() });
|
|
49
|
+
}
|
|
50
|
+
sendManifestRequest() {
|
|
51
|
+
this.events.push({ kind: 'fetch' });
|
|
52
|
+
return Promise.resolve(this.nextManifest());
|
|
53
|
+
}
|
|
54
|
+
sendFeatureSetsUpdateRequest(params) {
|
|
55
|
+
this.events.push({ kind: 'policy-request', detail: params });
|
|
56
|
+
switch (this.answerPolicy) {
|
|
57
|
+
case 'never': return new Promise(() => { });
|
|
58
|
+
case 'refuse-mcp-only': return Promise.resolve({ accepted: false, fallback: 'mcp-only' });
|
|
59
|
+
case 'refuse-close': return Promise.resolve({ accepted: false, fallback: 'close' });
|
|
60
|
+
default: return Promise.resolve({ accepted: true });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
sendFeatureSetsUpdate() { }
|
|
64
|
+
}
|
|
65
|
+
function makeHarness() {
|
|
66
|
+
const traces = [];
|
|
67
|
+
const fw = Object.create(AgentFramework.prototype);
|
|
68
|
+
fw.traceListeners = [(e) => traces.push(e)];
|
|
69
|
+
fw.featureSetManager = new FeatureSetManager();
|
|
70
|
+
fw.mcplTools = [];
|
|
71
|
+
fw.mcplToolRefreshInFlight = false;
|
|
72
|
+
fw.mcplToolRefreshPending = false;
|
|
73
|
+
fw.agents = new Map();
|
|
74
|
+
fw.manifestRefreshState = new Map();
|
|
75
|
+
fw.handleToolsListChanged = () => { };
|
|
76
|
+
const config = { id: 'srv', command: 'unused' };
|
|
77
|
+
fw.mcplServerConfigs = new Map([[config.id, config]]);
|
|
78
|
+
const connection = new ManifestFake();
|
|
79
|
+
connection.capabilities = expandAdvertisementShorthand(INITIAL);
|
|
80
|
+
fw.mcplServerRegistry = { getAllServers: () => [connection], getServer: (id) => (id === 'srv' ? connection : null) };
|
|
81
|
+
// Model post-§5.3 state: initial policy done, full grant active.
|
|
82
|
+
const grant = computeGrant(connection.capabilities, config, { mcpToolsAdvertised: false });
|
|
83
|
+
fw.featureSetManager.initializeServer('srv', connection.capabilities, {}, grant);
|
|
84
|
+
connection.establishGrant(grant);
|
|
85
|
+
connection.events = []; // discard setup noise
|
|
86
|
+
return { fw, connection, traces };
|
|
87
|
+
}
|
|
88
|
+
const settle = () => new Promise((r) => setImmediate(r));
|
|
89
|
+
test('reduction applies BEFORE the policy Request; receipt names it applied', async () => {
|
|
90
|
+
const { fw, connection, traces } = makeHarness();
|
|
91
|
+
// New manifest drops channels.publish (and the chat set with it, since
|
|
92
|
+
// uses requires it).
|
|
93
|
+
connection.nextManifest = () => ({
|
|
94
|
+
version: '0.5',
|
|
95
|
+
pushEvents: true,
|
|
96
|
+
channels: { incoming: true },
|
|
97
|
+
featureSets: { chat: { description: 'chat', uses: ['pushEvents', 'channels.incoming', 'channels.publish'] } },
|
|
98
|
+
});
|
|
99
|
+
await fw.handleManifestChanged(connection, { revision: 'sha256:x', domains: ['capabilities'] });
|
|
100
|
+
const kinds = connection.events.map((e) => e.kind);
|
|
101
|
+
const firstGrant = kinds.indexOf('grant');
|
|
102
|
+
const policyIdx = kinds.indexOf('policy-request');
|
|
103
|
+
assert.ok(firstGrant >= 0 && policyIdx >= 0 && firstGrant < policyIdx, `reduction must land before the Request (got order: ${kinds.join(',')})`);
|
|
104
|
+
const interim = connection.events[firstGrant].detail;
|
|
105
|
+
assert.ok(!interim.includes('channels.publish'), 'interim grant must not carry the revoked path');
|
|
106
|
+
// After the receipt: final grant matches the new manifest; chat degraded
|
|
107
|
+
// by §6.4 (its uses still names the revoked path).
|
|
108
|
+
assert.ok(!connection.grant.has('channels.publish'));
|
|
109
|
+
assert.equal(fw.featureSetManager.isEnabled('srv', 'chat'), false);
|
|
110
|
+
const receipts = traces.filter((t) => t.type === 'mcpl:manifest-change-receipt');
|
|
111
|
+
assert.equal(receipts.length, 1, 'exactly ONE receipt per change');
|
|
112
|
+
const impacts = receipts[0].impacts;
|
|
113
|
+
assert.ok(impacts.some((i) => i.impact === 'capability-revoked' && i.subject === 'channels.publish' && i.disposition === 'applied'));
|
|
114
|
+
assert.ok(impacts.some((i) => i.impact === 'feature-degraded' && i.subject === 'chat'));
|
|
115
|
+
});
|
|
116
|
+
test('expansion activates only after the receipt; unanswered Request leaves it inactive', async () => {
|
|
117
|
+
const { fw, connection } = makeHarness();
|
|
118
|
+
connection.answerPolicy = 'never'; // server never answers the new policy
|
|
119
|
+
connection.nextManifest = () => ({
|
|
120
|
+
version: '0.5',
|
|
121
|
+
pushEvents: true,
|
|
122
|
+
channels: { incoming: true, publish: true, streaming: true }, // + streaming
|
|
123
|
+
featureSets: {
|
|
124
|
+
chat: { description: 'chat', uses: ['pushEvents', 'channels.incoming', 'channels.publish'] },
|
|
125
|
+
// NEW set backed by the NEW capability — the §84-review probe.
|
|
126
|
+
streamy: { description: 's', uses: ['channels.streaming'] },
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
// Fire and give the pipeline a beat; the policy Request hangs forever.
|
|
130
|
+
const p = fw.handleManifestChanged(connection, { revision: 'sha256:y', domains: ['capabilities'] });
|
|
131
|
+
await settle();
|
|
132
|
+
await settle();
|
|
133
|
+
assert.ok(!connection.grant.has('channels.streaming'), 'unanswered expansion must not activate (§6.7)');
|
|
134
|
+
assert.ok(connection.grant.has('channels.publish'), 'no reduction occurred, so the standing grant survives');
|
|
135
|
+
// Sol's #84 blocker: a NEW capability-backed feature set must not be
|
|
136
|
+
// host-enabled while its capability is absent from the ACTIVE grant.
|
|
137
|
+
assert.equal(fw.featureSetManager.isEnabled('srv', 'streamy'), false, 'feature state must not run ahead of active authority');
|
|
138
|
+
assert.equal(fw.featureSetManager.isEnabled('srv', 'chat'), true, 'interim-derived state keeps what active authority supports');
|
|
139
|
+
void p; // intentionally left pending — models the wedged server
|
|
140
|
+
});
|
|
141
|
+
test('refusal with fallback mcp-only: empty grant, empty-derived feature state', async () => {
|
|
142
|
+
const { fw, connection } = makeHarness();
|
|
143
|
+
connection.answerPolicy = 'refuse-mcp-only';
|
|
144
|
+
connection.nextManifest = () => INITIAL;
|
|
145
|
+
await fw.handleManifestChanged(connection, { revision: 'sha256:r1', domains: ['capabilities'] });
|
|
146
|
+
assert.deepEqual(connection.grant.effectiveList(), [], 'mcp-only = empty grant, like the §5.3 path');
|
|
147
|
+
assert.equal(fw.featureSetManager.isEnabled('srv', 'chat'), false, 'feature state derives from the (empty) active grant');
|
|
148
|
+
assert.equal(connection.closed, false);
|
|
149
|
+
});
|
|
150
|
+
test('refusal with fallback close: the transport is closed', async () => {
|
|
151
|
+
const { fw, connection } = makeHarness();
|
|
152
|
+
connection.answerPolicy = 'refuse-close';
|
|
153
|
+
connection.nextManifest = () => INITIAL;
|
|
154
|
+
await fw.handleManifestChanged(connection, { revision: 'sha256:r2', domains: ['capabilities'] });
|
|
155
|
+
assert.equal(connection.closed, true, 'fallback close must be honored (§6.7)');
|
|
156
|
+
});
|
|
157
|
+
test('failed fetch: previous manifest and grant stand untouched', async () => {
|
|
158
|
+
const { fw, connection, traces } = makeHarness();
|
|
159
|
+
const before = connection.grant.effectiveList();
|
|
160
|
+
connection.nextManifest = () => { throw new Error('boom'); };
|
|
161
|
+
await fw.handleManifestChanged(connection, { revision: 'sha256:z', domains: ['featureSets'] });
|
|
162
|
+
assert.deepEqual(connection.grant.effectiveList(), before);
|
|
163
|
+
assert.equal(traces.filter((t) => t.type === 'mcpl:manifest-change-receipt').length, 0, 'no receipt for a change the host could not observe');
|
|
164
|
+
});
|
|
165
|
+
test('announcements coalesce: rapid-fire N announces cause one immediate fetch', async () => {
|
|
166
|
+
const { fw, connection } = makeHarness();
|
|
167
|
+
connection.nextManifest = () => INITIAL;
|
|
168
|
+
const first = fw.handleManifestChanged(connection, { revision: 'sha256:a', domains: [] });
|
|
169
|
+
// While the first is in flight (or inside the floor window) these coalesce.
|
|
170
|
+
void fw.handleManifestChanged(connection, { revision: 'sha256:b', domains: [] });
|
|
171
|
+
void fw.handleManifestChanged(connection, { revision: 'sha256:c', domains: [] });
|
|
172
|
+
await first;
|
|
173
|
+
await settle();
|
|
174
|
+
const fetches = connection.events.filter((e) => e.kind === 'fetch').length;
|
|
175
|
+
assert.equal(fetches, 1, `rapid announcements must coalesce (§17.8), got ${fetches} fetches`);
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=mcpl-manifest-changed.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpl-manifest-changed.test.js","sourceRoot":"","sources":["../../test/mcpl-manifest-changed.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;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,eAAe,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAG9G,MAAM,OAAO,GAAqB;IAChC,OAAO,EAAE,KAAK;IACd,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IAC3C,WAAW,EAAE;QACX,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,CAAC,EAAE;KAC7F;CAC6B,CAAC;AAEjC,MAAM,YAAa,SAAQ,YAAY;IAC5B,EAAE,GAAG,KAAK,CAAC;IACpB,YAAY,GAA4B,IAAI,CAAC;IAC7C,aAAa,GAAG,KAAK,CAAC;IACtB,kBAAkB,GAAG,KAAK,CAAC;IAC3B,iBAAiB,GAAG,KAAK,CAAC;IAC1B,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,CAAC;IAChC,iBAAiB,GAAG,KAAK,CAAC;IAC1B,aAAa,GAAG,EAAE,qBAAqB,EAAE,IAAqB,EAAE,aAAa,EAAE,IAAqB,EAAE,gBAAgB,EAAE,IAAqB,EAAE,CAAC;IAChJ,mBAAmB,GAAwB,IAAI,GAAG,EAAE,CAAC;IAErD,0EAA0E;IAC1E,MAAM,GAA8C,EAAE,CAAC;IACvD,8EAA8E;IAC9E,YAAY,GAA2B,GAAG,EAAE,CAAC,OAAO,CAAC;IACrD,oDAAoD;IACpD,YAAY,GAA4D,QAAQ,CAAC;IACjF,MAAM,GAAG,KAAK,CAAC;IACf,KAAK,KAAoB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAExE,cAAc,CAAC,KAAsB;QACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,mBAAmB;QACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACpC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,4BAA4B,CAAC,MAAe;QAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1B,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC3C,KAAK,iBAAiB,CAAC,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1F,KAAK,cAAc,CAAC,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YACpF,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IACD,qBAAqB,KAAU,CAAC;CACjC;AAED,SAAS,WAAW;IAClB,MAAM,MAAM,GAAkD,EAAE,CAAC;IACjE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAQ,CAAC;IAC1D,EAAE,CAAC,cAAc,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAU,CAAC,CAAC,CAAC;IAC9D,EAAE,CAAC,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC/C,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC;IAClB,EAAE,CAAC,uBAAuB,GAAG,KAAK,CAAC;IACnC,EAAE,CAAC,sBAAsB,GAAG,KAAK,CAAC;IAClC,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;IACtB,EAAE,CAAC,oBAAoB,GAAG,IAAI,GAAG,EAAE,CAAC;IACpC,EAAE,CAAC,sBAAsB,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IAErC,MAAM,MAAM,GAAqB,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAClE,EAAE,CAAC,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,IAAI,YAAY,EAAE,CAAC;IACtC,UAAU,CAAC,YAAY,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAChE,EAAE,CAAC,kBAAkB,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAE7H,iEAAiE;IACjE,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3F,EAAE,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,YAAa,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAClF,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACjC,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,sBAAsB;IAE9C,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzD,IAAI,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;IACvF,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACjD,uEAAuE;IACvE,qBAAqB;IACrB,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,CAAC;QAC/B,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC5B,WAAW,EAAE,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,CAAC,EAAE,EAAE;KAC9G,CAAgC,CAAC;IAElC,MAAM,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAEhG,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,CAAC,UAAU,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,UAAU,GAAG,SAAS,EACnE,sDAAsD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAkB,CAAC;IACjE,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,+CAA+C,CAAC,CAAC;IAElG,yEAAyE;IACzE,mDAAmD;IACnD,MAAM,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,8BAA8B,CAAC,CAAC;IACjF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,gCAAgC,CAAC,CAAC;IACnE,MAAM,OAAO,GAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,OAA2E,CAAC;IACzG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,oBAAoB,IAAI,CAAC,CAAC,OAAO,KAAK,kBAAkB,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC;IACrI,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,kBAAkB,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC;AAC1F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;IACnG,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,WAAW,EAAE,CAAC;IACzC,UAAU,CAAC,YAAY,GAAG,OAAO,CAAC,CAAC,sCAAsC;IACzE,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,CAAC;QAC/B,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,cAAc;QAC5E,WAAW,EAAE;YACX,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,CAAC,EAAE;YAC5F,+DAA+D;YAC/D,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,oBAAoB,CAAC,EAAE;SAC5D;KACF,CAAgC,CAAC;IAElC,uEAAuE;IACvE,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACpG,MAAM,MAAM,EAAE,CAAC;IAAC,MAAM,MAAM,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,EACnD,+CAA+C,CAAC,CAAC;IACnD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAChD,uDAAuD,CAAC,CAAC;IAC3D,qEAAqE;IACrE,qEAAqE;IACrE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,EAClE,sDAAsD,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,IAAI,EAC9D,4DAA4D,CAAC,CAAC;IAChE,KAAK,CAAC,CAAC,CAAC,wDAAwD;AAClE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;IAC1F,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,WAAW,EAAE,CAAC;IACzC,UAAU,CAAC,YAAY,GAAG,iBAAiB,CAAC;IAC5C,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;IAExC,MAAM,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAEjG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,4CAA4C,CAAC,CAAC;IACrG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,EAC/D,qDAAqD,CAAC,CAAC;IACzD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;IACtE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,WAAW,EAAE,CAAC;IACzC,UAAU,CAAC,YAAY,GAAG,cAAc,CAAC;IACzC,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;IAExC,MAAM,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAEjG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,uCAAuC,CAAC,CAAC;AACjF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;IAC3E,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAChD,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7D,MAAM,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAE/F,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,8BAA8B,CAAC,CAAC,MAAM,EAAE,CAAC,EACpF,oDAAoD,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;IAC1F,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,WAAW,EAAE,CAAC;IACzC,UAAU,CAAC,YAAY,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;IAExC,MAAM,KAAK,GAAG,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1F,4EAA4E;IAC5E,KAAK,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACjF,KAAK,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACjF,MAAM,KAAK,CAAC;IAAC,MAAM,MAAM,EAAE,CAAC;IAE5B,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,kDAAkD,OAAO,UAAU,CAAC,CAAC;AAChG,CAAC,CAAC,CAAC"}
|
|
@@ -13,6 +13,7 @@ import assert from 'node:assert';
|
|
|
13
13
|
import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
14
14
|
import { join } from 'node:path';
|
|
15
15
|
import { McplServerConnection } from '../src/mcpl/server-connection.js';
|
|
16
|
+
import { CapabilityGrant } from '../src/mcpl/capability-grant.js';
|
|
16
17
|
// The .mjs fixture is not compiled/copied by tsc, so when this test runs from
|
|
17
18
|
// dist/test it must reach back into the source tree for it.
|
|
18
19
|
const FIXTURE = [
|
|
@@ -22,9 +23,9 @@ const FIXTURE = [
|
|
|
22
23
|
const TMP_DIR = join(import.meta.dirname, '../.test-tmp-reconnect');
|
|
23
24
|
const FLAG_FILE = join(TMP_DIR, 'server-healthy');
|
|
24
25
|
const HOST_CAPS = {
|
|
25
|
-
version: '0.
|
|
26
|
+
version: '0.5',
|
|
26
27
|
pushEvents: true,
|
|
27
|
-
contextHooks: { beforeInference: true
|
|
28
|
+
contextHooks: { beforeInference: true },
|
|
28
29
|
featureSets: true,
|
|
29
30
|
};
|
|
30
31
|
function makeConfig(overrides) {
|
|
@@ -115,5 +116,29 @@ describe('McplServerConnection — reconnect lifecycle events', () => {
|
|
|
115
116
|
assert.strictEqual(reconnected.length, 0);
|
|
116
117
|
connection = null;
|
|
117
118
|
});
|
|
119
|
+
it('clears the previous transport grant before publishing a reconnected handshake', async () => {
|
|
120
|
+
writeFileSync(FLAG_FILE, '');
|
|
121
|
+
connection = await McplServerConnection.connect(makeConfig(), HOST_CAPS);
|
|
122
|
+
connection.establishGrant(new CapabilityGrant(new Set(['pushEvents']), []));
|
|
123
|
+
assert.strictEqual(connection.policyEstablished, true);
|
|
124
|
+
assert.deepStrictEqual(connection.grant.effectiveList(), ['pushEvents']);
|
|
125
|
+
let stateAtReconnect = null;
|
|
126
|
+
connection.on('reconnect', () => {
|
|
127
|
+
stateAtReconnect = {
|
|
128
|
+
policyEstablished: connection.policyEstablished,
|
|
129
|
+
grant: connection.grant.effectiveList(),
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
connection.ready();
|
|
133
|
+
// Crash the old transport. The replacement handshake is a fresh policy
|
|
134
|
+
// epoch: no authority from the prior process may survive until the host's
|
|
135
|
+
// new §5.3 Request receives its degradation receipt.
|
|
136
|
+
connection.sendToolsList().catch(() => { });
|
|
137
|
+
await waitFor(() => stateAtReconnect !== null, 5000, 'reconnect after granted transport');
|
|
138
|
+
assert.deepStrictEqual(stateAtReconnect, {
|
|
139
|
+
policyEstablished: false,
|
|
140
|
+
grant: [],
|
|
141
|
+
});
|
|
142
|
+
});
|
|
118
143
|
});
|
|
119
144
|
//# sourceMappingURL=mcpl-reconnect-events.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcpl-reconnect-events.test.js","sourceRoot":"","sources":["../../test/mcpl-reconnect-events.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"mcpl-reconnect-events.test.js","sourceRoot":"","sources":["../../test/mcpl-reconnect-events.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,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"}
|