@wix/pathgrade 1.0.19 → 1.0.20

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.
@@ -33,7 +33,10 @@ type Observer = (identity: {
33
33
  serverName: string;
34
34
  toolName: string;
35
35
  }) => void;
36
+ type ResourceObserver = (activeTransports: number) => void;
36
37
  /** Non-public acceptance seam. It observes only authenticated manifest-member calls. */
37
38
  export declare function __setScriptedMcpMockObserverForTesting(observer: Observer | null): void;
39
+ /** Non-public regression seam for request-scoped transport retention. */
40
+ export declare function __setScriptedMcpMockResourceObserverForTesting(observer: ResourceObserver | null): void;
38
41
  export declare function startScriptedMcpMockHost(plan: CompiledMcpMockSession): Promise<ScriptedMcpMockHost>;
39
42
  export {};
@@ -10,10 +10,15 @@ import { getOriginalMcpInput } from '../sdk/mcp-event-input.js';
10
10
  import { cloneToolEventWithRuntimeMetadata } from '../sdk/tool-event-secrets.js';
11
11
  import { createMcpArgumentDigest, createMcpReceiptKey, matchesMcpApprovalArguments, } from '../sdk/mcp-mock-approvals.js';
12
12
  let testObserver = null;
13
+ let testResourceObserver = null;
13
14
  /** Non-public acceptance seam. It observes only authenticated manifest-member calls. */
14
15
  export function __setScriptedMcpMockObserverForTesting(observer) {
15
16
  testObserver = observer;
16
17
  }
18
+ /** Non-public regression seam for request-scoped transport retention. */
19
+ export function __setScriptedMcpMockResourceObserverForTesting(observer) {
20
+ testResourceObserver = observer;
21
+ }
17
22
  const MAX_BODY_BYTES = 1024 * 1024;
18
23
  const MATCH_TIMEOUT_MS = 250;
19
24
  function isRecord(value) {
@@ -173,9 +178,37 @@ export async function startScriptedMcpMockHost(plan) {
173
178
  });
174
179
  const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
175
180
  activeTransports.add(transport);
176
- transport.onclose = () => activeTransports.delete(transport);
177
- await server.connect(transport);
178
- await transport.handleRequest(req, res, body);
181
+ testResourceObserver?.(activeTransports.size);
182
+ const releaseTransport = () => {
183
+ if (activeTransports.delete(transport))
184
+ testResourceObserver?.(activeTransports.size);
185
+ };
186
+ transport.onclose = releaseTransport;
187
+ let cleanupPromise;
188
+ const cleanup = () => {
189
+ cleanupPromise ??= (async () => {
190
+ try {
191
+ await server.close();
192
+ }
193
+ catch {
194
+ await transport.close().catch(() => undefined);
195
+ }
196
+ finally {
197
+ releaseTransport();
198
+ }
199
+ })();
200
+ return cleanupPromise;
201
+ };
202
+ const cleanupOnResponseClose = () => { void cleanup(); };
203
+ res.once('close', cleanupOnResponseClose);
204
+ try {
205
+ await server.connect(transport);
206
+ await transport.handleRequest(req, res, body);
207
+ }
208
+ finally {
209
+ res.off('close', cleanupOnResponseClose);
210
+ await cleanup();
211
+ }
179
212
  }
180
213
  catch (error) {
181
214
  latch(error instanceof Error ? error : new Error(String(error)));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/pathgrade",
3
- "version": "1.0.19",
3
+ "version": "1.0.20",
4
4
  "packageManager": "yarn@4.12.0",
5
5
  "description": "Evaluate whether AI agents discover and use your skills correctly",
6
6
  "exports": {
@@ -144,5 +144,5 @@
144
144
  "typescript": "^5.9.3",
145
145
  "zod": "4.3.6"
146
146
  },
147
- "falconPackageHash": "82ad7f930663da420f522fe4822a1d55bef437f4ae29dcafa31b9e19"
147
+ "falconPackageHash": "4b55cfec1102172799601d1b5a3a8089a73b9c5e093a4533316f1e7c"
148
148
  }