@animalabs/agent-framework 0.5.7 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/dist/src/agent.d.ts +4 -0
  2. package/dist/src/agent.d.ts.map +1 -1
  3. package/dist/src/agent.js +15 -0
  4. package/dist/src/agent.js.map +1 -1
  5. package/dist/src/framework.d.ts +243 -0
  6. package/dist/src/framework.d.ts.map +1 -1
  7. package/dist/src/framework.js +1378 -114
  8. package/dist/src/framework.js.map +1 -1
  9. package/dist/src/gate/event-gate.d.ts +64 -2
  10. package/dist/src/gate/event-gate.d.ts.map +1 -1
  11. package/dist/src/gate/event-gate.js +212 -12
  12. package/dist/src/gate/event-gate.js.map +1 -1
  13. package/dist/src/gate/gate-script-worker.d.ts +2 -0
  14. package/dist/src/gate/gate-script-worker.d.ts.map +1 -0
  15. package/dist/src/gate/gate-script-worker.js +69 -0
  16. package/dist/src/gate/gate-script-worker.js.map +1 -0
  17. package/dist/src/gate/gate-script.d.ts +44 -0
  18. package/dist/src/gate/gate-script.d.ts.map +1 -0
  19. package/dist/src/gate/gate-script.js +164 -0
  20. package/dist/src/gate/gate-script.js.map +1 -0
  21. package/dist/src/gate/types.d.ts +18 -3
  22. package/dist/src/gate/types.d.ts.map +1 -1
  23. package/dist/src/index.d.ts +3 -0
  24. package/dist/src/index.d.ts.map +1 -1
  25. package/dist/src/index.js +4 -0
  26. package/dist/src/index.js.map +1 -1
  27. package/dist/src/mcpl/channel-registry.d.ts +60 -2
  28. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  29. package/dist/src/mcpl/channel-registry.js +114 -9
  30. package/dist/src/mcpl/channel-registry.js.map +1 -1
  31. package/dist/src/mcpl/checkpoint-manager.d.ts +7 -0
  32. package/dist/src/mcpl/checkpoint-manager.d.ts.map +1 -1
  33. package/dist/src/mcpl/checkpoint-manager.js +15 -0
  34. package/dist/src/mcpl/checkpoint-manager.js.map +1 -1
  35. package/dist/src/mcpl/push-handler.d.ts.map +1 -1
  36. package/dist/src/mcpl/push-handler.js +5 -0
  37. package/dist/src/mcpl/push-handler.js.map +1 -1
  38. package/dist/src/mcpl/server-connection.d.ts +64 -30
  39. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  40. package/dist/src/mcpl/server-connection.js +247 -210
  41. package/dist/src/mcpl/server-connection.js.map +1 -1
  42. package/dist/src/mcpl/transport.d.ts +98 -0
  43. package/dist/src/mcpl/transport.d.ts.map +1 -0
  44. package/dist/src/mcpl/transport.js +281 -0
  45. package/dist/src/mcpl/transport.js.map +1 -0
  46. package/dist/src/mcpl/types.d.ts +59 -3
  47. package/dist/src/mcpl/types.d.ts.map +1 -1
  48. package/dist/src/mcpl/types.js.map +1 -1
  49. package/dist/src/module-registry.d.ts +17 -1
  50. package/dist/src/module-registry.d.ts.map +1 -1
  51. package/dist/src/module-registry.js +101 -6
  52. package/dist/src/module-registry.js.map +1 -1
  53. package/dist/src/prose-segments.d.ts +18 -0
  54. package/dist/src/prose-segments.d.ts.map +1 -0
  55. package/dist/src/prose-segments.js +39 -0
  56. package/dist/src/prose-segments.js.map +1 -0
  57. package/dist/src/runtime/liveness-watchdog-worker.d.ts +2 -0
  58. package/dist/src/runtime/liveness-watchdog-worker.d.ts.map +1 -0
  59. package/dist/src/runtime/liveness-watchdog-worker.js +57 -0
  60. package/dist/src/runtime/liveness-watchdog-worker.js.map +1 -0
  61. package/dist/src/runtime/liveness-watchdog.d.ts +36 -0
  62. package/dist/src/runtime/liveness-watchdog.d.ts.map +1 -0
  63. package/dist/src/runtime/liveness-watchdog.js +106 -0
  64. package/dist/src/runtime/liveness-watchdog.js.map +1 -0
  65. package/dist/src/types/agent.d.ts +47 -0
  66. package/dist/src/types/agent.d.ts.map +1 -1
  67. package/dist/src/types/framework.d.ts +14 -0
  68. package/dist/src/types/framework.d.ts.map +1 -1
  69. package/dist/src/types/module.d.ts +58 -0
  70. package/dist/src/types/module.d.ts.map +1 -1
  71. package/dist/src/types/trace.d.ts +42 -0
  72. package/dist/src/types/trace.d.ts.map +1 -1
  73. package/dist/test/agent-cache-ttl.test.d.ts +2 -0
  74. package/dist/test/agent-cache-ttl.test.d.ts.map +1 -0
  75. package/dist/test/agent-cache-ttl.test.js +25 -0
  76. package/dist/test/agent-cache-ttl.test.js.map +1 -0
  77. package/dist/test/channel-registry-routing.test.js +108 -1
  78. package/dist/test/channel-registry-routing.test.js.map +1 -1
  79. package/dist/test/checkpoint-attribution.test.d.ts +2 -0
  80. package/dist/test/checkpoint-attribution.test.d.ts.map +1 -0
  81. package/dist/test/checkpoint-attribution.test.js +40 -0
  82. package/dist/test/checkpoint-attribution.test.js.map +1 -0
  83. package/dist/test/conversation-fork-injection-scoping.test.d.ts +2 -0
  84. package/dist/test/conversation-fork-injection-scoping.test.d.ts.map +1 -0
  85. package/dist/test/conversation-fork-injection-scoping.test.js +184 -0
  86. package/dist/test/conversation-fork-injection-scoping.test.js.map +1 -0
  87. package/dist/test/event-gate-policy-mutation.test.d.ts +2 -0
  88. package/dist/test/event-gate-policy-mutation.test.d.ts.map +1 -0
  89. package/dist/test/event-gate-policy-mutation.test.js +137 -0
  90. package/dist/test/event-gate-policy-mutation.test.js.map +1 -0
  91. package/dist/test/event-gate-script.test.d.ts +2 -0
  92. package/dist/test/event-gate-script.test.d.ts.map +1 -0
  93. package/dist/test/event-gate-script.test.js +95 -0
  94. package/dist/test/event-gate-script.test.js.map +1 -0
  95. package/dist/test/event-gate-tags.test.d.ts +2 -0
  96. package/dist/test/event-gate-tags.test.d.ts.map +1 -0
  97. package/dist/test/event-gate-tags.test.js +76 -0
  98. package/dist/test/event-gate-tags.test.js.map +1 -0
  99. package/dist/test/gather-context-timeout.test.d.ts +2 -0
  100. package/dist/test/gather-context-timeout.test.d.ts.map +1 -0
  101. package/dist/test/gather-context-timeout.test.js +120 -0
  102. package/dist/test/gather-context-timeout.test.js.map +1 -0
  103. package/dist/test/inference-exhaustion-rewind.test.d.ts +2 -0
  104. package/dist/test/inference-exhaustion-rewind.test.d.ts.map +1 -0
  105. package/dist/test/inference-exhaustion-rewind.test.js +181 -0
  106. package/dist/test/inference-exhaustion-rewind.test.js.map +1 -0
  107. package/dist/test/inference-failure-observability.test.js +4 -0
  108. package/dist/test/inference-failure-observability.test.js.map +1 -1
  109. package/dist/test/liveness-watchdog.test.d.ts +2 -0
  110. package/dist/test/liveness-watchdog.test.d.ts.map +1 -0
  111. package/dist/test/liveness-watchdog.test.js +78 -0
  112. package/dist/test/liveness-watchdog.test.js.map +1 -0
  113. package/dist/test/mcpl-reconnect-events.test.d.ts +2 -0
  114. package/dist/test/mcpl-reconnect-events.test.d.ts.map +1 -0
  115. package/dist/test/mcpl-reconnect-events.test.js +119 -0
  116. package/dist/test/mcpl-reconnect-events.test.js.map +1 -0
  117. package/dist/test/mcpl-reconnect-reregistration.test.d.ts +2 -0
  118. package/dist/test/mcpl-reconnect-reregistration.test.d.ts.map +1 -0
  119. package/dist/test/mcpl-reconnect-reregistration.test.js +181 -0
  120. package/dist/test/mcpl-reconnect-reregistration.test.js.map +1 -0
  121. package/dist/test/mcpl-request-timeout.test.d.ts +2 -0
  122. package/dist/test/mcpl-request-timeout.test.d.ts.map +1 -0
  123. package/dist/test/mcpl-request-timeout.test.js +123 -0
  124. package/dist/test/mcpl-request-timeout.test.js.map +1 -0
  125. package/dist/test/mcpl-runtime-lifecycle.test.d.ts +7 -0
  126. package/dist/test/mcpl-runtime-lifecycle.test.d.ts.map +1 -0
  127. package/dist/test/mcpl-runtime-lifecycle.test.js +142 -0
  128. package/dist/test/mcpl-runtime-lifecycle.test.js.map +1 -0
  129. package/dist/test/mcpl-ws-transport.test.d.ts +2 -0
  130. package/dist/test/mcpl-ws-transport.test.d.ts.map +1 -0
  131. package/dist/test/mcpl-ws-transport.test.js +155 -0
  132. package/dist/test/mcpl-ws-transport.test.js.map +1 -0
  133. package/dist/test/prose-segments.test.d.ts +2 -0
  134. package/dist/test/prose-segments.test.d.ts.map +1 -0
  135. package/dist/test/prose-segments.test.js +52 -0
  136. package/dist/test/prose-segments.test.js.map +1 -0
  137. package/dist/test/refusal-rewind.test.d.ts +2 -0
  138. package/dist/test/refusal-rewind.test.d.ts.map +1 -0
  139. package/dist/test/refusal-rewind.test.js +108 -0
  140. package/dist/test/refusal-rewind.test.js.map +1 -0
  141. package/dist/test/state-scaling-e2e.test.d.ts +22 -0
  142. package/dist/test/state-scaling-e2e.test.d.ts.map +1 -0
  143. package/dist/test/state-scaling-e2e.test.js +200 -0
  144. package/dist/test/state-scaling-e2e.test.js.map +1 -0
  145. package/dist/test/state-scaling.test.d.ts +12 -0
  146. package/dist/test/state-scaling.test.d.ts.map +1 -0
  147. package/dist/test/state-scaling.test.js +243 -0
  148. package/dist/test/state-scaling.test.js.map +1 -0
  149. package/dist/test/tool-result-content.test.d.ts +2 -0
  150. package/dist/test/tool-result-content.test.d.ts.map +1 -0
  151. package/dist/test/tool-result-content.test.js +37 -0
  152. package/dist/test/tool-result-content.test.js.map +1 -0
  153. package/dist/test/trunk-channel-routing.test.d.ts +19 -0
  154. package/dist/test/trunk-channel-routing.test.d.ts.map +1 -0
  155. package/dist/test/trunk-channel-routing.test.js +175 -0
  156. package/dist/test/trunk-channel-routing.test.js.map +1 -0
  157. package/dist/tsconfig.tsbuildinfo +1 -1
  158. package/package.json +4 -3
  159. package/src/agent.ts +16 -0
  160. package/src/framework.ts +1576 -121
  161. package/src/gate/event-gate.ts +209 -12
  162. package/src/gate/gate-script-worker.ts +73 -0
  163. package/src/gate/gate-script.ts +180 -0
  164. package/src/gate/types.ts +19 -3
  165. package/src/index.ts +10 -0
  166. package/src/mcpl/channel-registry.ts +143 -8
  167. package/src/mcpl/checkpoint-manager.ts +16 -0
  168. package/src/mcpl/push-handler.ts +5 -0
  169. package/src/mcpl/server-connection.ts +262 -227
  170. package/src/mcpl/transport.ts +307 -0
  171. package/src/mcpl/types.ts +68 -3
  172. package/src/module-registry.ts +126 -6
  173. package/src/prose-segments.ts +42 -0
  174. package/src/runtime/liveness-watchdog-worker.ts +66 -0
  175. package/src/runtime/liveness-watchdog.ts +122 -0
  176. package/src/types/agent.ts +48 -0
  177. package/src/types/framework.ts +15 -0
  178. package/src/types/module.ts +65 -0
  179. package/src/types/trace.ts +51 -0
@@ -0,0 +1,181 @@
1
+ /**
2
+ * MCPL auto-reconnect must RE-REGISTER the server, not just refresh tools.
3
+ *
4
+ * Before the fix, the 'close' handler removed the server from the
5
+ * FeatureSetManager (and destroyed its checkpoint trees), while the
6
+ * 'reconnect' handler only re-listed tools. Result: after any transient
7
+ * crash + successful reconnect, validateInbound threw "Unknown server"
8
+ * forever — every push event and inference request rejected until a full
9
+ * host restart — and the server's durable checkpoint state was gone.
10
+ *
11
+ * These tests exercise the framework's wireMcplEvents close/reconnect
12
+ * handlers with the REAL FeatureSetManager / CheckpointManager / PushHandler
13
+ * and a fake connection (EventEmitter), asserting:
14
+ * 1. a push event after close→reconnect is ACCEPTED again;
15
+ * 2. checkpoint state SURVIVES any close (transient OR clean shutdown);
16
+ * 3. checkpoint state is destroyed only via disconnectMcplServer (explicit
17
+ * permanent removal), never by the close handler.
18
+ */
19
+ import { test } from 'node:test';
20
+ import assert from 'node:assert/strict';
21
+ import { EventEmitter } from 'node:events';
22
+ import { AgentFramework } from '../src/framework.js';
23
+ import { FeatureSetManager } from '../src/mcpl/feature-set-manager.js';
24
+ import { ScopeManager } from '../src/mcpl/scope-manager.js';
25
+ import { CheckpointManager } from '../src/mcpl/checkpoint-manager.js';
26
+ import { PushHandler } from '../src/mcpl/push-handler.js';
27
+ /** In-memory JsStore stub — CheckpointManager only needs the state-slot API. */
28
+ function makeStoreStub() {
29
+ const slots = new Map();
30
+ return {
31
+ slots,
32
+ registerState: (_opts) => { },
33
+ setStateJson: (id, value) => { slots.set(id, structuredClone(value)); },
34
+ getStateJson: (id) => slots.get(id) ?? null,
35
+ };
36
+ }
37
+ const CAPABILITIES = {
38
+ version: '0.4',
39
+ featureSets: {
40
+ chat: { description: 'chat events', uses: ['pushEvents'] },
41
+ mem: { description: 'stateful memory', uses: ['tools'], hostState: true, rollback: true },
42
+ },
43
+ };
44
+ class FakeConnection extends EventEmitter {
45
+ id;
46
+ capabilities = CAPABILITIES;
47
+ willReconnect = true;
48
+ featureSetUpdates = [];
49
+ constructor(id) {
50
+ super();
51
+ this.id = id;
52
+ }
53
+ sendFeatureSetsUpdate(params) {
54
+ this.featureSetUpdates.push(params);
55
+ }
56
+ }
57
+ function makeHarness() {
58
+ const store = makeStoreStub();
59
+ const traces = [];
60
+ const pushed = [];
61
+ const fw = Object.create(AgentFramework.prototype);
62
+ fw.traceListeners = [];
63
+ fw.consecutiveInferenceFailures = new Map();
64
+ fw.exhaustionRewinds = new Map();
65
+ fw.agents = new Map();
66
+ fw.mcplTools = [];
67
+ fw.mcplToolRefreshInFlight = false;
68
+ fw.mcplToolRefreshPending = false;
69
+ fw.mcplServerRegistry = null; // handleToolsListChanged no-ops without it
70
+ fw.channelRegistry = null;
71
+ fw.inferenceRouter = null;
72
+ fw.eventGate = null;
73
+ fw.featureSetManager = new FeatureSetManager();
74
+ fw.scopeManager = new ScopeManager();
75
+ fw.checkpointManager = new CheckpointManager(store, (e) => traces.push(e));
76
+ fw.pushHandler = new PushHandler(fw.featureSetManager, (e) => pushed.push(e), (e) => traces.push(e));
77
+ const config = {
78
+ id: 'srv',
79
+ command: 'unused',
80
+ enabledFeatureSets: ['chat', 'mem'],
81
+ reconnect: true,
82
+ };
83
+ fw.mcplServerConfigs = new Map([[config.id, config]]);
84
+ const connection = new FakeConnection('srv');
85
+ fw.wireMcplEvents(connection);
86
+ fw.registerMcplServerFeatures(config, connection);
87
+ const sendPush = (eventId) => {
88
+ let result;
89
+ connection.emit('push-event', {
90
+ featureSet: 'chat',
91
+ eventId,
92
+ timestamp: new Date().toISOString(),
93
+ payload: { content: [{ type: 'text', text: 'hello' }] },
94
+ }, {
95
+ respond: (r) => { result = r; },
96
+ respondError: () => { assert.fail('push responded with a JSON-RPC error'); },
97
+ });
98
+ assert.ok(result, 'push handler must respond synchronously');
99
+ return result;
100
+ };
101
+ return { fw, store, connection, config, sendPush, pushed, traces };
102
+ }
103
+ test('reconnect re-registers the server: pushes are accepted again after close→reconnect', () => {
104
+ const { fw, connection, sendPush, pushed } = makeHarness();
105
+ // Sanity: initial registration accepts pushes.
106
+ assert.equal(sendPush('e1').accepted, true);
107
+ assert.equal(pushed.length, 1);
108
+ // Transient crash: transport closed, background reconnect pending.
109
+ connection.willReconnect = true;
110
+ connection.emit('close', null, 'SIGKILL');
111
+ // While down, the server is deregistered — pushes are rejected.
112
+ const down = sendPush('e2');
113
+ assert.equal(down.accepted, false);
114
+ assert.match(down.reason ?? '', /Unknown server/);
115
+ // Reconnect succeeded (fresh handshake refreshed capabilities).
116
+ connection.emit('reconnect', { attempts: 1 });
117
+ // THE regression: before the fix this stayed rejected forever.
118
+ const revived = sendPush('e3');
119
+ assert.equal(revived.accepted, true, `push after reconnect must be accepted, got: ${revived.reason}`);
120
+ assert.equal(pushed.length, 2);
121
+ // The server was told its enabled feature sets again on re-registration.
122
+ assert.equal(connection.featureSetUpdates.length, 2, 'featureSets/update re-sent on reconnect');
123
+ assert.ok(fw.featureSetManager.isEnabled('srv', 'chat'));
124
+ });
125
+ test('checkpoint state SURVIVES a transient close + reconnect', () => {
126
+ const { fw, store, connection } = makeHarness();
127
+ // Record durable checkpoint state for the stateful feature set.
128
+ fw.checkpointManager.recordCheckpoint('srv', 'mem', {
129
+ checkpoint: 'cp1',
130
+ data: { counter: 42 },
131
+ });
132
+ assert.equal(fw.checkpointManager.getCurrentCheckpoint('srv', 'mem'), 'cp1');
133
+ // Transient close: reconnect loop is active.
134
+ connection.willReconnect = true;
135
+ connection.emit('close', 1, null);
136
+ assert.equal(fw.checkpointManager.getCurrentCheckpoint('srv', 'mem'), 'cp1', 'a transient disconnect must NOT destroy checkpoint trees');
137
+ const persisted = store.slots.get('mcpl/checkpoints');
138
+ assert.ok(persisted.trees['srv:mem'], 'the persisted tree must not be deleted from Chronicle');
139
+ // Reconnect: idempotent re-registration resumes (not resets) the tree.
140
+ connection.emit('reconnect', { attempts: 1 });
141
+ assert.equal(fw.checkpointManager.getCurrentCheckpoint('srv', 'mem'), 'cp1');
142
+ assert.deepEqual(fw.checkpointManager.getCurrentState('srv', 'mem'), { counter: 42 });
143
+ });
144
+ test('the close handler NEVER destroys checkpoints — even with willReconnect=false', () => {
145
+ // A clean AgentFramework.stop() sets reconnectEnabled=false BEFORE emitting
146
+ // 'close', so willReconnect is false on an ordinary host restart just as much
147
+ // as on a permanent teardown. Gating checkpoint destruction on willReconnect
148
+ // would therefore erase every durable checkpoint tree on a polite restart
149
+ // (while a SIGKILL, whose 'close' carries willReconnect=true, preserved them).
150
+ // Permanent removal is owned solely by disconnectMcplServer; the close handler
151
+ // must leave the persisted tree intact for loadFromStore() to resume.
152
+ const { fw, store, connection } = makeHarness();
153
+ fw.checkpointManager.recordCheckpoint('srv', 'mem', { checkpoint: 'cp1', data: { x: 1 } });
154
+ // Even a "permanent-looking" close (reconnect disabled) must not delete state.
155
+ connection.willReconnect = false;
156
+ connection.emit('close', 0, null);
157
+ assert.equal(fw.checkpointManager.getCurrentCheckpoint('srv', 'mem'), 'cp1', 'the close handler must not destroy checkpoints on a clean shutdown');
158
+ const persisted = store.slots.get('mcpl/checkpoints');
159
+ assert.ok(persisted.trees['srv:mem'], 'the persisted tree survives a clean shutdown for later resume');
160
+ });
161
+ test('disconnectMcplServer destroys checkpoints even when the connection already closed transiently', async () => {
162
+ const { fw, connection, config } = makeHarness();
163
+ fw.checkpointManager.recordCheckpoint('srv', 'mem', { checkpoint: 'cp1', data: { x: 1 } });
164
+ // Transient close first (checkpoints preserved for the pending reconnect)…
165
+ connection.willReconnect = true;
166
+ connection.emit('close', 1, null);
167
+ assert.equal(fw.checkpointManager.getCurrentCheckpoint('srv', 'mem'), 'cp1');
168
+ // …then the operator permanently removes the server. close() on an
169
+ // already-closed connection emits no second 'close', so the explicit
170
+ // cleanup in disconnectMcplServer must handle it.
171
+ fw.mcplServerRegistry = {
172
+ removeServer: async () => { },
173
+ getAllServers: () => [],
174
+ getServer: () => null,
175
+ };
176
+ fw.mcplPrefixMap = new Map([[`mcpl--srv`, 'srv']]);
177
+ await fw.disconnectMcplServer(config.id);
178
+ assert.equal(fw.checkpointManager.getCurrentCheckpoint('srv', 'mem'), null);
179
+ assert.equal(fw.featureSetManager.isEnabled('srv', 'chat'), false);
180
+ });
181
+ //# sourceMappingURL=mcpl-reconnect-reregistration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpl-reconnect-reregistration.test.js","sourceRoot":"","sources":["../../test/mcpl-reconnect-reregistration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcpl-request-timeout.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpl-request-timeout.test.d.ts","sourceRoot":"","sources":["../../test/mcpl-request-timeout.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * MCPL per-request timeout (6.2): a live-but-stuck server — accepts a
3
+ * request, never responds, never closes its transport — must not freeze the
4
+ * awaiting caller forever. sendRequest rejects after requestTimeoutMs with a
5
+ * descriptive error; the framework maps that rejection to an isError
6
+ * tool_result, so the agent turn completes instead of hanging.
7
+ */
8
+ import { test, afterEach } from 'node:test';
9
+ import assert from 'node:assert/strict';
10
+ import { McplServerConnection } from '../src/mcpl/server-connection.js';
11
+ // Stdio server: answers initialize and tools/list, but swallows tools/call —
12
+ // the "zulip HTML-error / event-loop-wedge" profile (alive, deaf).
13
+ const HUNG_SERVER = `
14
+ let buf = '';
15
+ process.stdin.on('data', (c) => {
16
+ buf += c.toString('utf8');
17
+ let i;
18
+ while ((i = buf.indexOf('\\n')) >= 0) {
19
+ const line = buf.slice(0, i); buf = buf.slice(i + 1);
20
+ if (!line.trim()) continue;
21
+ let m; try { m = JSON.parse(line); } catch { continue; }
22
+ const reply = (result) => process.stdout.write(JSON.stringify({ jsonrpc: '2.0', id: m.id, result }) + '\\n');
23
+ if (m.method === 'initialize') reply({ capabilities: {} });
24
+ else if (m.method === 'tools/list') reply({ tools: [{ name: 'stuck', description: 's', inputSchema: { type: 'object' } }] });
25
+ // tools/call: deliberately NO response, connection stays open.
26
+ }
27
+ });
28
+ setInterval(() => {}, 1 << 30); // stay alive
29
+ `;
30
+ const HOST_CAPS = {
31
+ version: '0.4',
32
+ pushEvents: true,
33
+ contextHooks: { beforeInference: true, afterInference: { blocking: true } },
34
+ featureSets: true,
35
+ };
36
+ function config(overrides) {
37
+ return {
38
+ id: 'hung',
39
+ command: process.execPath,
40
+ args: ['-e', HUNG_SERVER],
41
+ ...overrides,
42
+ };
43
+ }
44
+ let connection = null;
45
+ afterEach(async () => {
46
+ await connection?.close();
47
+ connection = null;
48
+ });
49
+ test('tools/call against a hung server rejects within the configured timeout', async () => {
50
+ connection = await McplServerConnection.connect(config({ requestTimeoutMs: 250 }), HOST_CAPS);
51
+ connection.ready();
52
+ const started = Date.now();
53
+ await assert.rejects(connection.sendToolsCall('stuck', {}), (err) => {
54
+ assert.match(err.message, /did not respond to tools\/call/);
55
+ assert.match(err.message, /250ms/);
56
+ assert.match(err.message, /hung/);
57
+ return true;
58
+ });
59
+ const elapsed = Date.now() - started;
60
+ assert.ok(elapsed >= 200 && elapsed < 5000, `rejected in ${elapsed}ms (expected ~250ms)`);
61
+ // The connection survives the abandoned request: a request the server DOES
62
+ // answer still works afterwards.
63
+ const list = await connection.sendToolsList();
64
+ assert.equal(list.tools[0]?.name, 'stuck');
65
+ });
66
+ test('a request the server answers in time is unaffected by the timeout', async () => {
67
+ connection = await McplServerConnection.connect(config({ requestTimeoutMs: 2000 }), HOST_CAPS);
68
+ connection.ready();
69
+ const list = await connection.sendToolsList();
70
+ assert.equal(list.tools.length, 1);
71
+ });
72
+ test('requestTimeoutMs: 0 disables the per-request watchdog', async () => {
73
+ connection = await McplServerConnection.connect(config({ requestTimeoutMs: 0 }), HOST_CAPS);
74
+ connection.ready();
75
+ let settled = false;
76
+ const call = connection.sendToolsCall('stuck', {}).catch(() => { }).finally(() => { settled = true; });
77
+ await new Promise((r) => setTimeout(r, 300));
78
+ assert.equal(settled, false, 'with timeout disabled the request stays pending');
79
+ // Cleanup: closing the connection rejects the pending request.
80
+ await connection.close();
81
+ connection = null;
82
+ await call;
83
+ assert.equal(settled, true);
84
+ });
85
+ test('the timeout error warns the model the tool may have completed server-side', async () => {
86
+ connection = await McplServerConnection.connect(config({ requestTimeoutMs: 150 }), HOST_CAPS);
87
+ connection.ready();
88
+ await assert.rejects(connection.sendToolsCall('stuck', {}), (err) => {
89
+ // The model reads this string; it must not imply the call was cancelled.
90
+ assert.match(err.message, /may still have completed server-side/);
91
+ assert.match(err.message, /verify state before retrying/);
92
+ return true;
93
+ });
94
+ });
95
+ test('a timed-out request that later receives a response does not crash (orphaned response ignored)', async () => {
96
+ // Server that answers tools/call after 500ms — beyond a 100ms timeout.
97
+ const SLOW_SERVER = HUNG_SERVER.replace('// tools/call: deliberately NO response, connection stays open.', "else if (m.method === 'tools/call') setTimeout(() => reply({ content: [] }), 500);");
98
+ connection = await McplServerConnection.connect({ id: 'slow', command: process.execPath, args: ['-e', SLOW_SERVER], requestTimeoutMs: 100 }, HOST_CAPS);
99
+ connection.ready();
100
+ await assert.rejects(connection.sendToolsCall('stuck', {}), /did not respond/);
101
+ // Wait past the server's late response; it must be ignored, not crash.
102
+ await new Promise((r) => setTimeout(r, 600));
103
+ const list = await connection.sendToolsList();
104
+ assert.equal(list.tools.length, 1);
105
+ });
106
+ test('a late STATEFUL orphaned response is surfaced via mcpl:orphaned-response (not silently dropped)', async () => {
107
+ // Server answers tools/call after 500ms with a checkpoint-carrying result —
108
+ // beyond a 100ms timeout. The host advanced no checkpoint; the server did.
109
+ // That divergence must be greppable, so the connection emits an event.
110
+ const STATEFUL_SLOW = HUNG_SERVER.replace('// tools/call: deliberately NO response, connection stays open.', "else if (m.method === 'tools/call') setTimeout(() => reply({ content: [], state: { checkpoint: 'cp-late', data: { n: 1 } } }), 500);");
111
+ connection = await McplServerConnection.connect({ id: 'slow-stateful', command: process.execPath, args: ['-e', STATEFUL_SLOW], requestTimeoutMs: 100 }, HOST_CAPS);
112
+ connection.ready();
113
+ const orphaned = [];
114
+ connection.on('orphaned-response', (info) => orphaned.push(info));
115
+ await assert.rejects(connection.sendToolsCall('stuck', {}), /did not respond/);
116
+ await new Promise((r) => setTimeout(r, 600));
117
+ assert.equal(orphaned.length, 1, 'the dropped stateful response must be surfaced');
118
+ assert.equal(orphaned[0].hadState, true, 'the event records that state was carried');
119
+ // The connection still works afterwards.
120
+ const list = await connection.sendToolsList();
121
+ assert.equal(list.tools.length, 1);
122
+ });
123
+ //# sourceMappingURL=mcpl-request-timeout.test.js.map
@@ -0,0 +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,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;IAC3E,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF,SAAS,MAAM,CAAC,SAAqC;IACnD,OAAO;QACL,EAAE,EAAE,MAAM;QACV,OAAO,EAAE,OAAO,CAAC,QAAQ;QACzB,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC;QACzB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,IAAI,UAAU,GAAgC,IAAI,CAAC;AACnD,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,UAAU,EAAE,KAAK,EAAE,CAAC;IAC1B,UAAU,GAAG,IAAI,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;IACxF,UAAU,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9F,UAAU,CAAC,KAAK,EAAE,CAAC;IAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,MAAM,CAAC,OAAO,CAClB,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,EACrC,CAAC,GAAU,EAAE,EAAE;QACb,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,gCAAgC,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC,CACF,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,OAAO,IAAI,GAAG,IAAI,OAAO,GAAG,IAAI,EAAE,eAAe,OAAO,sBAAsB,CAAC,CAAC;IAE1F,2EAA2E;IAC3E,iCAAiC;IACjC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;IACnF,UAAU,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/F,UAAU,CAAC,KAAK,EAAE,CAAC;IAEnB,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;IACvE,UAAU,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5F,UAAU,CAAC,KAAK,EAAE,CAAC;IAEnB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,IAAI,GAAG,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtG,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,iDAAiD,CAAC,CAAC;IAEhF,+DAA+D;IAC/D,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;IACzB,UAAU,GAAG,IAAI,CAAC;IAClB,MAAM,IAAI,CAAC;IACX,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;IAC3F,UAAU,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9F,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,MAAM,MAAM,CAAC,OAAO,CAClB,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,EACrC,CAAC,GAAU,EAAE,EAAE;QACb,yEAAyE;QACzE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,sCAAsC,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;IAC/G,uEAAuE;IACvE,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CACrC,iEAAiE,EACjE,oFAAoF,CACrF,CAAC;IACF,UAAU,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAC7C,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAC3F,SAAS,CACV,CAAC;IACF,UAAU,CAAC,KAAK,EAAE,CAAC;IAEnB,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC/E,uEAAuE;IACvE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iGAAiG,EAAE,KAAK,IAAI,EAAE;IACjH,4EAA4E;IAC5E,2EAA2E;IAC3E,uEAAuE;IACvE,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CACvC,iEAAiE,EACjE,sIAAsI,CACvI,CAAC;IACF,UAAU,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAC7C,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,EACtG,SAAS,CACV,CAAC;IACF,UAAU,CAAC,KAAK,EAAE,CAAC;IAEnB,MAAM,QAAQ,GAAyD,EAAE,CAAC;IAC1E,UAAU,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAElE,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC/E,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAE7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,gDAAgD,CAAC,CAAC;IACnF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,0CAA0C,CAAC,CAAC;IAErF,yCAAyC;IACzC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Runtime MCPL server lifecycle — connectMcplServer / disconnectMcplServer /
3
+ * restartMcplServer on a live framework, including lazy MCPL subsystem
4
+ * initialization when the framework started with zero configured servers.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=mcpl-runtime-lifecycle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpl-runtime-lifecycle.test.d.ts","sourceRoot":"","sources":["../../test/mcpl-runtime-lifecycle.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Runtime MCPL server lifecycle — connectMcplServer / disconnectMcplServer /
3
+ * restartMcplServer on a live framework, including lazy MCPL subsystem
4
+ * initialization when the framework started with zero configured servers.
5
+ */
6
+ import { test } from 'node:test';
7
+ import assert from 'node:assert';
8
+ import { tmpdir } from 'node:os';
9
+ import { mkdtempSync, rmSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { WebSocketServer } from 'ws';
12
+ import { AgentFramework } from '../src/index.js';
13
+ import { MockMembrane } from './helpers/mock-membrane.js';
14
+ // A tiny stdio MCPL server (same shape as mcpl-ws-transport.test.ts): reads
15
+ // NDJSON on stdin, answers initialize / tools/list / tools/call on stdout.
16
+ const STDIO_SERVER = `
17
+ let buf = '';
18
+ process.stdin.on('data', (c) => {
19
+ buf += c.toString('utf8');
20
+ let i;
21
+ while ((i = buf.indexOf('\\n')) >= 0) {
22
+ const line = buf.slice(0, i); buf = buf.slice(i + 1);
23
+ if (!line.trim()) continue;
24
+ let m; try { m = JSON.parse(line); } catch { continue; }
25
+ const reply = (result) => process.stdout.write(JSON.stringify({ jsonrpc: '2.0', id: m.id, result }) + '\\n');
26
+ if (m.method === 'initialize') reply({ capabilities: { experimental: { mcpl: { version: '0.4', pushEvents: true } } } });
27
+ else if (m.method === 'tools/list') reply({ tools: [{ name: 'echo', description: 'e', inputSchema: { type: 'object' } }] });
28
+ else if (m.method === 'tools/call') reply({ content: [{ type: 'text', text: String((m.params && m.params.arguments && m.params.arguments.text) || '') }] });
29
+ }
30
+ });
31
+ `;
32
+ function serverConfig(id, extra) {
33
+ return { id, command: process.execPath, args: ['-e', STDIO_SERVER], ...extra };
34
+ }
35
+ async function withFramework(withServer, fn) {
36
+ const tempDir = mkdtempSync(join(tmpdir(), 'mcpl-lifecycle-'));
37
+ const membrane = new MockMembrane();
38
+ const framework = await AgentFramework.create({
39
+ storePath: join(tempDir, 'test.chronicle'),
40
+ membrane: membrane.asMembrane(),
41
+ agents: [{ name: 'assistant', model: 'test-model', systemPrompt: 'test' }],
42
+ modules: [],
43
+ ...(withServer ? { mcplServers: [serverConfig('first')] } : {}),
44
+ });
45
+ try {
46
+ await fn(framework);
47
+ }
48
+ finally {
49
+ await framework.stop();
50
+ rmSync(tempDir, { recursive: true, force: true });
51
+ }
52
+ }
53
+ test('connectMcplServer lazily initializes MCPL on a zero-server framework and exposes tools', async () => {
54
+ await withFramework(false, async (framework) => {
55
+ assert.deepEqual(framework.listMcplServers(), [], 'no servers configured at start');
56
+ await framework.connectMcplServer(serverConfig('dyn'));
57
+ const servers = framework.listMcplServers();
58
+ assert.equal(servers.length, 1);
59
+ assert.equal(servers[0].id, 'dyn');
60
+ assert.equal(servers[0].connected, true);
61
+ assert.equal(servers[0].toolCount, 1);
62
+ const toolNames = framework.getAllTools().map(t => t.name);
63
+ assert.ok(toolNames.includes('mcpl--dyn--echo'), `expected mcpl--dyn--echo in ${toolNames}`);
64
+ });
65
+ });
66
+ test('disconnectMcplServer removes the server and its tools', async () => {
67
+ await withFramework(true, async (framework) => {
68
+ assert.ok(framework.getAllTools().some(t => t.name === 'mcpl--first--echo'), 'startup server tools present');
69
+ await framework.disconnectMcplServer('first');
70
+ assert.deepEqual(framework.listMcplServers(), [], 'server gone from list');
71
+ assert.ok(!framework.getAllTools().some(t => t.name.startsWith('mcpl--first--')), 'tools removed after disconnect');
72
+ });
73
+ });
74
+ test('restartMcplServer respawns the server and keeps tools available', async () => {
75
+ await withFramework(true, async (framework) => {
76
+ await framework.restartMcplServer('first');
77
+ const servers = framework.listMcplServers();
78
+ assert.equal(servers.length, 1);
79
+ assert.equal(servers[0].connected, true);
80
+ assert.equal(servers[0].toolCount, 1);
81
+ assert.ok(framework.getAllTools().some(t => t.name === 'mcpl--first--echo'));
82
+ });
83
+ });
84
+ test('restartMcplServer accepts an updated config (new toolPrefix)', async () => {
85
+ await withFramework(true, async (framework) => {
86
+ await framework.restartMcplServer('first', serverConfig('first', { toolPrefix: 'renamed' }));
87
+ const toolNames = framework.getAllTools().map(t => t.name);
88
+ assert.ok(toolNames.includes('renamed--echo'), `expected renamed--echo in ${toolNames}`);
89
+ assert.ok(!toolNames.some(n => n.startsWith('mcpl--first--')), 'old prefix gone');
90
+ });
91
+ });
92
+ test('connectMcplServer rejects a duplicate id and a colliding prefix', async () => {
93
+ await withFramework(true, async (framework) => {
94
+ await assert.rejects(framework.connectMcplServer(serverConfig('first')), /already registered/);
95
+ await assert.rejects(framework.connectMcplServer(serverConfig('second', { toolPrefix: 'mcpl--first' })), /collides with server "first"/);
96
+ });
97
+ });
98
+ test('connectMcplServer hot-connects a network-only (WebSocket) MCPL server', async () => {
99
+ // Minimal in-process MCPL server over WebSocket (same shape as
100
+ // mcpl-ws-transport.test.ts) — no child process involved.
101
+ const wss = new WebSocketServer({ port: 0, host: '127.0.0.1' });
102
+ wss.on('connection', (ws) => {
103
+ ws.on('message', (data) => {
104
+ let msg;
105
+ try {
106
+ msg = JSON.parse(String(data));
107
+ }
108
+ catch {
109
+ return;
110
+ }
111
+ const reply = (result) => ws.send(JSON.stringify({ jsonrpc: '2.0', id: msg.id, result }));
112
+ if (msg.method === 'initialize')
113
+ reply({ capabilities: { experimental: { mcpl: { version: '0.4', pushEvents: true } } } });
114
+ else if (msg.method === 'tools/list')
115
+ reply({ tools: [{ name: 'echo', description: 'e', inputSchema: { type: 'object' } }] });
116
+ });
117
+ });
118
+ await new Promise((resolve) => (wss.address() ? resolve() : wss.once('listening', () => resolve())));
119
+ const url = `ws://127.0.0.1:${wss.address().port}/mcpl`;
120
+ try {
121
+ await withFramework(false, async (framework) => {
122
+ await framework.connectMcplServer({ id: 'netsrv', url });
123
+ const servers = framework.listMcplServers();
124
+ assert.equal(servers.length, 1);
125
+ assert.equal(servers[0].connected, true);
126
+ assert.equal(servers[0].url, url);
127
+ assert.ok(framework.getAllTools().some(t => t.name === 'mcpl--netsrv--echo'));
128
+ await framework.disconnectMcplServer('netsrv');
129
+ assert.ok(!framework.getAllTools().some(t => t.name.startsWith('mcpl--netsrv--')));
130
+ });
131
+ }
132
+ finally {
133
+ wss.close();
134
+ }
135
+ });
136
+ test('disconnecting an unknown server is a no-op (routing state cleared, no throw)', async () => {
137
+ await withFramework(true, async (framework) => {
138
+ await framework.disconnectMcplServer('nope');
139
+ assert.equal(framework.listMcplServers().length, 1, 'existing server untouched');
140
+ });
141
+ });
142
+ //# sourceMappingURL=mcpl-runtime-lifecycle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpl-runtime-lifecycle.test.js","sourceRoot":"","sources":["../../test/mcpl-runtime-lifecycle.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcpl-ws-transport.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpl-ws-transport.test.d.ts","sourceRoot":"","sources":["../../test/mcpl-ws-transport.test.ts"],"names":[],"mappings":""}