mock-mcp 0.3.1 → 0.5.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.
Files changed (44) hide show
  1. package/README.md +212 -124
  2. package/dist/adapter/index.cjs +712 -0
  3. package/dist/adapter/index.d.cts +55 -0
  4. package/dist/adapter/index.d.ts +55 -0
  5. package/dist/adapter/index.js +672 -0
  6. package/dist/client/connect.cjs +913 -0
  7. package/dist/client/connect.d.cts +211 -0
  8. package/dist/client/connect.d.ts +204 -7
  9. package/dist/client/connect.js +863 -20
  10. package/dist/client/index.cjs +914 -0
  11. package/dist/client/index.d.cts +4 -0
  12. package/dist/client/index.d.ts +4 -2
  13. package/dist/client/index.js +873 -2
  14. package/dist/daemon/index.cjs +667 -0
  15. package/dist/daemon/index.d.cts +62 -0
  16. package/dist/daemon/index.d.ts +62 -0
  17. package/dist/daemon/index.js +628 -0
  18. package/dist/discovery-Dc2LdF8q.d.cts +105 -0
  19. package/dist/discovery-Dc2LdF8q.d.ts +105 -0
  20. package/dist/index.cjs +2238 -0
  21. package/dist/index.d.cts +472 -0
  22. package/dist/index.d.ts +472 -11
  23. package/dist/index.js +2185 -53
  24. package/dist/protocol-CiwaQFOt.d.ts +239 -0
  25. package/dist/protocol-xZu-wb0n.d.cts +239 -0
  26. package/dist/shared/index.cjs +386 -0
  27. package/dist/shared/index.d.cts +4 -0
  28. package/dist/shared/index.d.ts +4 -0
  29. package/dist/shared/index.js +310 -0
  30. package/dist/types-BKREdsyr.d.cts +32 -0
  31. package/dist/types-BKREdsyr.d.ts +32 -0
  32. package/package.json +44 -4
  33. package/dist/client/batch-mock-collector.d.ts +0 -111
  34. package/dist/client/batch-mock-collector.js +0 -308
  35. package/dist/client/util.d.ts +0 -1
  36. package/dist/client/util.js +0 -3
  37. package/dist/connect.cjs +0 -400
  38. package/dist/connect.d.cts +0 -82
  39. package/dist/server/index.d.ts +0 -1
  40. package/dist/server/index.js +0 -1
  41. package/dist/server/test-mock-mcp-server.d.ts +0 -73
  42. package/dist/server/test-mock-mcp-server.js +0 -419
  43. package/dist/types.d.ts +0 -45
  44. package/dist/types.js +0 -2
@@ -0,0 +1,386 @@
1
+ 'use strict';
2
+
3
+ var fs = require('fs/promises');
4
+ var fssync = require('fs');
5
+ var os = require('os');
6
+ var path = require('path');
7
+ var crypto = require('crypto');
8
+ var child_process = require('child_process');
9
+ var http = require('http');
10
+ var url = require('url');
11
+ var module$1 = require('module');
12
+
13
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
14
+
15
+ var fs__default = /*#__PURE__*/_interopDefault(fs);
16
+ var fssync__default = /*#__PURE__*/_interopDefault(fssync);
17
+ var os__default = /*#__PURE__*/_interopDefault(os);
18
+ var path__default = /*#__PURE__*/_interopDefault(path);
19
+ var crypto__default = /*#__PURE__*/_interopDefault(crypto);
20
+ var http__default = /*#__PURE__*/_interopDefault(http);
21
+
22
+ var __importMetaUrl = (function() {
23
+ if (typeof document !== 'undefined') {
24
+ return document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href;
25
+ }
26
+ // Node.js CJS context
27
+ // When this bundle is re-bundled by another tool (e.g., esbuild, webpack),
28
+ // __filename may not be defined or may not be a valid file path.
29
+ // We need to handle these cases gracefully.
30
+ try {
31
+ if (typeof __filename !== 'undefined' && __filename) {
32
+ var url = require('url');
33
+ var path = require('path');
34
+ // Check if __filename looks like a valid file path
35
+ if (path.isAbsolute(__filename) || __filename.startsWith('./') || __filename.startsWith('../')) {
36
+ return url.pathToFileURL(__filename).href;
37
+ }
38
+ }
39
+ } catch (e) {
40
+ // Fallback if pathToFileURL fails
41
+ }
42
+ // Fallback: use process.cwd() as the base URL
43
+ // This is not perfect but allows the code to continue working
44
+ try {
45
+ var url = require('url');
46
+ return url.pathToFileURL(require('path').join(process.cwd(), 'index.cjs')).href;
47
+ } catch (e) {
48
+ return 'file:///unknown';
49
+ }
50
+ })();
51
+ function debugLog(_msg) {
52
+ }
53
+ var __curDirname = (() => {
54
+ try {
55
+ const metaUrl = __importMetaUrl;
56
+ if (metaUrl && typeof metaUrl === "string" && metaUrl.startsWith("file://")) {
57
+ return path__default.default.dirname(url.fileURLToPath(metaUrl));
58
+ }
59
+ } catch {
60
+ }
61
+ return process.cwd();
62
+ })();
63
+ function resolveProjectRoot(startDir = process.cwd()) {
64
+ let current = path__default.default.resolve(startDir);
65
+ const root = path__default.default.parse(current).root;
66
+ while (current !== root) {
67
+ const gitPath = path__default.default.join(current, ".git");
68
+ try {
69
+ const stat = fssync__default.default.statSync(gitPath);
70
+ if (stat.isDirectory() || stat.isFile()) {
71
+ return current;
72
+ }
73
+ } catch {
74
+ }
75
+ const pkgPath = path__default.default.join(current, "package.json");
76
+ try {
77
+ fssync__default.default.accessSync(pkgPath, fssync__default.default.constants.F_OK);
78
+ return current;
79
+ } catch {
80
+ }
81
+ current = path__default.default.dirname(current);
82
+ }
83
+ return path__default.default.resolve(startDir);
84
+ }
85
+ function computeProjectId(projectRoot) {
86
+ const real = fssync__default.default.realpathSync(projectRoot);
87
+ return crypto__default.default.createHash("sha256").update(real).digest("hex").slice(0, 16);
88
+ }
89
+ function getCacheDir(override) {
90
+ if (override) {
91
+ return override;
92
+ }
93
+ const envCacheDir = process.env.MOCK_MCP_CACHE_DIR;
94
+ if (envCacheDir) {
95
+ return envCacheDir;
96
+ }
97
+ const xdg = process.env.XDG_CACHE_HOME;
98
+ if (xdg) {
99
+ return xdg;
100
+ }
101
+ if (process.platform === "win32" && process.env.LOCALAPPDATA) {
102
+ return process.env.LOCALAPPDATA;
103
+ }
104
+ const home = os__default.default.homedir();
105
+ if (home) {
106
+ return path__default.default.join(home, ".cache");
107
+ }
108
+ return os__default.default.tmpdir();
109
+ }
110
+ function getPaths(projectId, cacheDir) {
111
+ const base = path__default.default.join(getCacheDir(cacheDir), "mock-mcp");
112
+ const registryPath = path__default.default.join(base, `${projectId}.json`);
113
+ const lockPath = path__default.default.join(base, `${projectId}.lock`);
114
+ const ipcPath = process.platform === "win32" ? `\\\\.\\pipe\\mock-mcp-${projectId}` : path__default.default.join(base, `${projectId}.sock`);
115
+ return { base, registryPath, lockPath, ipcPath };
116
+ }
117
+ async function readRegistry(registryPath) {
118
+ try {
119
+ const txt = await fs__default.default.readFile(registryPath, "utf-8");
120
+ return JSON.parse(txt);
121
+ } catch (error) {
122
+ debugLog(`readRegistry error for ${registryPath}: ${error instanceof Error ? error.message : String(error)}`);
123
+ return null;
124
+ }
125
+ }
126
+ async function writeRegistry(registryPath, registry) {
127
+ await fs__default.default.writeFile(registryPath, JSON.stringify(registry, null, 2), {
128
+ encoding: "utf-8",
129
+ mode: 384
130
+ // Read/write for owner only
131
+ });
132
+ }
133
+ async function healthCheck(ipcPath, timeoutMs = 2e3) {
134
+ return new Promise((resolve) => {
135
+ const req = http__default.default.request(
136
+ {
137
+ method: "GET",
138
+ socketPath: ipcPath,
139
+ path: "/health",
140
+ timeout: timeoutMs
141
+ },
142
+ (res) => {
143
+ resolve(res.statusCode === 200);
144
+ }
145
+ );
146
+ req.on("error", () => resolve(false));
147
+ req.on("timeout", () => {
148
+ req.destroy();
149
+ resolve(false);
150
+ });
151
+ req.end();
152
+ });
153
+ }
154
+ async function tryAcquireLock(lockPath) {
155
+ try {
156
+ const fh = await fs__default.default.open(lockPath, "wx");
157
+ await fh.write(`${process.pid}
158
+ `);
159
+ return fh;
160
+ } catch {
161
+ return null;
162
+ }
163
+ }
164
+ async function releaseLock(lockPath, fh) {
165
+ await fh.close();
166
+ await fs__default.default.rm(lockPath).catch(() => {
167
+ });
168
+ }
169
+ function randomToken() {
170
+ return crypto__default.default.randomBytes(24).toString("base64url");
171
+ }
172
+ function getDaemonEntryPath() {
173
+ try {
174
+ const cwdRequire = module$1.createRequire(url.pathToFileURL(path__default.default.join(process.cwd(), "index.js")).href);
175
+ const resolved = cwdRequire.resolve("mock-mcp");
176
+ const distDir = path__default.default.dirname(resolved);
177
+ const daemonEntry = path__default.default.join(distDir, "index.js");
178
+ if (fssync__default.default.existsSync(daemonEntry)) {
179
+ return daemonEntry;
180
+ }
181
+ } catch {
182
+ }
183
+ try {
184
+ const packageRoot = resolveProjectRoot(__curDirname);
185
+ const distPath = path__default.default.join(packageRoot, "dist", "index.js");
186
+ if (fssync__default.default.existsSync(distPath)) {
187
+ return distPath;
188
+ }
189
+ } catch {
190
+ }
191
+ if (process.argv[1]) {
192
+ return process.argv[1];
193
+ }
194
+ return path__default.default.join(process.cwd(), "dist", "index.js");
195
+ }
196
+ async function ensureDaemonRunning(opts = {}) {
197
+ const projectRoot = opts.projectRoot ?? resolveProjectRoot();
198
+ const projectId = computeProjectId(projectRoot);
199
+ const { base, registryPath, lockPath, ipcPath } = getPaths(
200
+ projectId,
201
+ opts.cacheDir
202
+ );
203
+ const timeoutMs = opts.timeoutMs ?? 1e4;
204
+ await fs__default.default.mkdir(base, { recursive: true });
205
+ const existing = await readRegistry(registryPath);
206
+ debugLog(`Registry read result: ${existing ? "Found (PID " + existing.pid + ")" : "Null"}`);
207
+ if (existing) {
208
+ let healthy = false;
209
+ for (let i = 0; i < 3; i++) {
210
+ debugLog(`Checking health attempt ${i + 1}/3 on ${existing.ipcPath}`);
211
+ healthy = await healthCheck(existing.ipcPath);
212
+ if (healthy) break;
213
+ await new Promise((r) => setTimeout(r, 200));
214
+ }
215
+ if (healthy) {
216
+ return existing;
217
+ }
218
+ }
219
+ if (process.platform !== "win32") {
220
+ try {
221
+ await fs__default.default.rm(ipcPath);
222
+ } catch {
223
+ }
224
+ }
225
+ const lock = await tryAcquireLock(lockPath);
226
+ if (lock) {
227
+ try {
228
+ const recheckReg = await readRegistry(registryPath);
229
+ if (recheckReg && await healthCheck(recheckReg.ipcPath)) {
230
+ return recheckReg;
231
+ }
232
+ const token = randomToken();
233
+ const daemonEntry = getDaemonEntryPath();
234
+ const child = child_process.spawn(
235
+ process.execPath,
236
+ [daemonEntry, "daemon", "--project-root", projectRoot, "--token", token],
237
+ {
238
+ detached: true,
239
+ stdio: ["ignore", "pipe", "pipe"],
240
+ env: {
241
+ ...process.env,
242
+ MOCK_MCP_CACHE_DIR: opts.cacheDir ?? ""
243
+ }
244
+ }
245
+ );
246
+ let daemonStderr = "";
247
+ let daemonStdout = "";
248
+ child.stdout?.on("data", (data) => {
249
+ const str = data.toString();
250
+ debugLog(`Daemon stdout: ${str}`);
251
+ });
252
+ child.stderr?.on("data", (data) => {
253
+ daemonStderr += data.toString();
254
+ debugLog(`Daemon stderr: ${data.toString()}`);
255
+ });
256
+ child.on("error", (err) => {
257
+ console.error(`[mock-mcp] Daemon spawn error: ${err.message}`);
258
+ });
259
+ child.on("exit", (code, signal) => {
260
+ if (code !== null && code !== 0) {
261
+ console.error(`[mock-mcp] Daemon exited with code: ${code}`);
262
+ if (daemonStderr) {
263
+ console.error(`[mock-mcp] Daemon stderr: ${daemonStderr.slice(0, 500)}`);
264
+ }
265
+ } else if (signal) {
266
+ console.error(`[mock-mcp] Daemon killed by signal: ${signal}`);
267
+ }
268
+ });
269
+ child.unref();
270
+ const deadline2 = Date.now() + timeoutMs;
271
+ while (Date.now() < deadline2) {
272
+ const reg = await readRegistry(registryPath);
273
+ if (reg && await healthCheck(reg.ipcPath)) {
274
+ return reg;
275
+ }
276
+ await sleep(50);
277
+ }
278
+ console.error("[mock-mcp] Daemon failed to start within timeout");
279
+ if (daemonStderr) {
280
+ console.error(`[mock-mcp] Daemon stderr:
281
+ ${daemonStderr}`);
282
+ }
283
+ throw new Error(
284
+ `Daemon start timeout after ${timeoutMs}ms. Check logs for details.`
285
+ );
286
+ } finally {
287
+ await releaseLock(lockPath, lock);
288
+ }
289
+ }
290
+ const deadline = Date.now() + timeoutMs;
291
+ while (Date.now() < deadline) {
292
+ const reg = await readRegistry(registryPath);
293
+ if (reg && await healthCheck(reg.ipcPath)) {
294
+ return reg;
295
+ }
296
+ await sleep(50);
297
+ }
298
+ throw new Error(
299
+ `Waiting for daemon timed out after ${timeoutMs}ms. Another process may have failed to start it.`
300
+ );
301
+ }
302
+ function sleep(ms) {
303
+ return new Promise((resolve) => setTimeout(resolve, ms));
304
+ }
305
+
306
+ // src/shared/protocol.ts
307
+ var HELLO_TEST = "HELLO_TEST";
308
+ var HELLO_ACK = "HELLO_ACK";
309
+ var BATCH_MOCK_REQUEST = "BATCH_MOCK_REQUEST";
310
+ var BATCH_MOCK_RESULT = "BATCH_MOCK_RESULT";
311
+ var HEARTBEAT = "HEARTBEAT";
312
+ var HEARTBEAT_ACK = "HEARTBEAT_ACK";
313
+ var RPC_GET_STATUS = "getStatus";
314
+ var RPC_LIST_RUNS = "listRuns";
315
+ var RPC_CLAIM_NEXT_BATCH = "claimNextBatch";
316
+ var RPC_PROVIDE_BATCH = "provideBatch";
317
+ var RPC_RELEASE_BATCH = "releaseBatch";
318
+ var RPC_GET_BATCH = "getBatch";
319
+ var RPC_ERROR_PARSE = -32700;
320
+ var RPC_ERROR_INVALID_REQUEST = -32600;
321
+ var RPC_ERROR_METHOD_NOT_FOUND = -32601;
322
+ var RPC_ERROR_INVALID_PARAMS = -32602;
323
+ var RPC_ERROR_INTERNAL = -32603;
324
+ var RPC_ERROR_NOT_FOUND = -32e3;
325
+ var RPC_ERROR_UNAUTHORIZED = -32001;
326
+ var RPC_ERROR_CONFLICT = -32002;
327
+ var RPC_ERROR_EXPIRED = -32003;
328
+ function isHelloTestMessage(msg) {
329
+ if (!msg || typeof msg !== "object") return false;
330
+ const m = msg;
331
+ return m.type === HELLO_TEST && typeof m.token === "string" && typeof m.runId === "string" && typeof m.pid === "number" && typeof m.cwd === "string";
332
+ }
333
+ function isBatchMockRequestMessage(msg) {
334
+ if (!msg || typeof msg !== "object") return false;
335
+ const m = msg;
336
+ return m.type === BATCH_MOCK_REQUEST && typeof m.runId === "string" && Array.isArray(m.requests);
337
+ }
338
+ function isHeartbeatMessage(msg) {
339
+ if (!msg || typeof msg !== "object") return false;
340
+ const m = msg;
341
+ return m.type === HEARTBEAT && typeof m.runId === "string";
342
+ }
343
+ function isJsonRpcRequest(msg) {
344
+ if (!msg || typeof msg !== "object") return false;
345
+ const m = msg;
346
+ return m.jsonrpc === "2.0" && (typeof m.id === "string" || typeof m.id === "number") && typeof m.method === "string";
347
+ }
348
+
349
+ exports.BATCH_MOCK_REQUEST = BATCH_MOCK_REQUEST;
350
+ exports.BATCH_MOCK_RESULT = BATCH_MOCK_RESULT;
351
+ exports.HEARTBEAT = HEARTBEAT;
352
+ exports.HEARTBEAT_ACK = HEARTBEAT_ACK;
353
+ exports.HELLO_ACK = HELLO_ACK;
354
+ exports.HELLO_TEST = HELLO_TEST;
355
+ exports.RPC_CLAIM_NEXT_BATCH = RPC_CLAIM_NEXT_BATCH;
356
+ exports.RPC_ERROR_CONFLICT = RPC_ERROR_CONFLICT;
357
+ exports.RPC_ERROR_EXPIRED = RPC_ERROR_EXPIRED;
358
+ exports.RPC_ERROR_INTERNAL = RPC_ERROR_INTERNAL;
359
+ exports.RPC_ERROR_INVALID_PARAMS = RPC_ERROR_INVALID_PARAMS;
360
+ exports.RPC_ERROR_INVALID_REQUEST = RPC_ERROR_INVALID_REQUEST;
361
+ exports.RPC_ERROR_METHOD_NOT_FOUND = RPC_ERROR_METHOD_NOT_FOUND;
362
+ exports.RPC_ERROR_NOT_FOUND = RPC_ERROR_NOT_FOUND;
363
+ exports.RPC_ERROR_PARSE = RPC_ERROR_PARSE;
364
+ exports.RPC_ERROR_UNAUTHORIZED = RPC_ERROR_UNAUTHORIZED;
365
+ exports.RPC_GET_BATCH = RPC_GET_BATCH;
366
+ exports.RPC_GET_STATUS = RPC_GET_STATUS;
367
+ exports.RPC_LIST_RUNS = RPC_LIST_RUNS;
368
+ exports.RPC_PROVIDE_BATCH = RPC_PROVIDE_BATCH;
369
+ exports.RPC_RELEASE_BATCH = RPC_RELEASE_BATCH;
370
+ exports.computeProjectId = computeProjectId;
371
+ exports.ensureDaemonRunning = ensureDaemonRunning;
372
+ exports.getCacheDir = getCacheDir;
373
+ exports.getDaemonEntryPath = getDaemonEntryPath;
374
+ exports.getPaths = getPaths;
375
+ exports.healthCheck = healthCheck;
376
+ exports.isBatchMockRequestMessage = isBatchMockRequestMessage;
377
+ exports.isHeartbeatMessage = isHeartbeatMessage;
378
+ exports.isHelloTestMessage = isHelloTestMessage;
379
+ exports.isJsonRpcRequest = isJsonRpcRequest;
380
+ exports.randomToken = randomToken;
381
+ exports.readRegistry = readRegistry;
382
+ exports.releaseLock = releaseLock;
383
+ exports.resolveProjectRoot = resolveProjectRoot;
384
+ exports.sleep = sleep;
385
+ exports.tryAcquireLock = tryAcquireLock;
386
+ exports.writeRegistry = writeRegistry;
@@ -0,0 +1,4 @@
1
+ export { j as DaemonPaths, D as DaemonRegistry, E as EnsureDaemonOptions, c as computeProjectId, i as ensureDaemonRunning, g as getCacheDir, f as getDaemonEntryPath, a as getPaths, h as healthCheck, e as randomToken, b as readRegistry, d as releaseLock, r as resolveProjectRoot, s as sleep, t as tryAcquireLock, w as writeRegistry } from '../discovery-Dc2LdF8q.cjs';
2
+ export { B as BATCH_MOCK_REQUEST, b as BATCH_MOCK_RESULT, y as BatchMockRequestMessage, z as BatchMockResultMessage, W as BatchRecord, U as BatchStatus, G as ClaimNextBatchParams, I as ClaimNextBatchResult, M as GetBatchParams, S as GetBatchResult, N as GetStatusResult, c as HEARTBEAT, d as HEARTBEAT_ACK, a as HELLO_ACK, H as HELLO_TEST, C as HeartbeatAckMessage, A as HeartbeatMessage, x as HelloAckMessage, w as HelloTestMessage, F as JsonRpcError, J as JsonRpcRequest, E as JsonRpcResponse, O as ListRunsResult, P as ProvideBatchParams, K as ProvideBatchResult, f as RPC_CLAIM_NEXT_BATCH, q as RPC_ERROR_CONFLICT, r as RPC_ERROR_EXPIRED, n as RPC_ERROR_INTERNAL, m as RPC_ERROR_INVALID_PARAMS, k as RPC_ERROR_INVALID_REQUEST, l as RPC_ERROR_METHOD_NOT_FOUND, o as RPC_ERROR_NOT_FOUND, j as RPC_ERROR_PARSE, p as RPC_ERROR_UNAUTHORIZED, i as RPC_GET_BATCH, R as RPC_GET_STATUS, e as RPC_LIST_RUNS, g as RPC_PROVIDE_BATCH, h as RPC_RELEASE_BATCH, L as ReleaseBatchParams, Q as RunInfo, V as RunRecord, T as TestChannelIncomingMessage, D as TestChannelOutgoingMessage, t as isBatchMockRequestMessage, u as isHeartbeatMessage, s as isHelloTestMessage, v as isJsonRpcRequest } from '../protocol-xZu-wb0n.cjs';
3
+ import 'node:fs';
4
+ import '../types-BKREdsyr.cjs';
@@ -0,0 +1,4 @@
1
+ export { j as DaemonPaths, D as DaemonRegistry, E as EnsureDaemonOptions, c as computeProjectId, i as ensureDaemonRunning, g as getCacheDir, f as getDaemonEntryPath, a as getPaths, h as healthCheck, e as randomToken, b as readRegistry, d as releaseLock, r as resolveProjectRoot, s as sleep, t as tryAcquireLock, w as writeRegistry } from '../discovery-Dc2LdF8q.js';
2
+ export { B as BATCH_MOCK_REQUEST, b as BATCH_MOCK_RESULT, y as BatchMockRequestMessage, z as BatchMockResultMessage, W as BatchRecord, U as BatchStatus, G as ClaimNextBatchParams, I as ClaimNextBatchResult, M as GetBatchParams, S as GetBatchResult, N as GetStatusResult, c as HEARTBEAT, d as HEARTBEAT_ACK, a as HELLO_ACK, H as HELLO_TEST, C as HeartbeatAckMessage, A as HeartbeatMessage, x as HelloAckMessage, w as HelloTestMessage, F as JsonRpcError, J as JsonRpcRequest, E as JsonRpcResponse, O as ListRunsResult, P as ProvideBatchParams, K as ProvideBatchResult, f as RPC_CLAIM_NEXT_BATCH, q as RPC_ERROR_CONFLICT, r as RPC_ERROR_EXPIRED, n as RPC_ERROR_INTERNAL, m as RPC_ERROR_INVALID_PARAMS, k as RPC_ERROR_INVALID_REQUEST, l as RPC_ERROR_METHOD_NOT_FOUND, o as RPC_ERROR_NOT_FOUND, j as RPC_ERROR_PARSE, p as RPC_ERROR_UNAUTHORIZED, i as RPC_GET_BATCH, R as RPC_GET_STATUS, e as RPC_LIST_RUNS, g as RPC_PROVIDE_BATCH, h as RPC_RELEASE_BATCH, L as ReleaseBatchParams, Q as RunInfo, V as RunRecord, T as TestChannelIncomingMessage, D as TestChannelOutgoingMessage, t as isBatchMockRequestMessage, u as isHeartbeatMessage, s as isHelloTestMessage, v as isJsonRpcRequest } from '../protocol-CiwaQFOt.js';
3
+ import 'node:fs';
4
+ import '../types-BKREdsyr.js';