network-ai 3.8.0 → 4.0.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.
@@ -0,0 +1,445 @@
1
+ "use strict";
2
+ /**
3
+ * MCP SSE/HTTP Transport — Phase 6 Part 1
4
+ *
5
+ * Makes the MCP bridge network-accessible over HTTP + Server-Sent Events so
6
+ * any MCP-compatible AI (Claude Desktop, Cursor, Cline, etc.) can connect
7
+ * to Network-AI from outside the process.
8
+ *
9
+ * Architecture:
10
+ *
11
+ * External AI agent
12
+ * │ POST /mcp (JSON-RPC 2.0 request)
13
+ * ▼
14
+ * McpSseServer (HTTP, port 3001)
15
+ * │ handleRPC()
16
+ * ▼
17
+ * McpCombinedBridge
18
+ * ├── blackboard tools (read/write/list/delete/exists)
19
+ * ├── extended tools (budget/token/audit)
20
+ * └── control tools (config/agent/fsm)
21
+ *
22
+ * External AI agent
23
+ * │ GET /sse (SSE connection — server pushes events)
24
+ * ▼
25
+ * McpSseServer broadcasts events to all connected clients
26
+ *
27
+ * Zero external dependencies — uses Node.js built-in `node:http` only.
28
+ *
29
+ * @module mcp-transport-sse
30
+ * @version 1.0.0
31
+ */
32
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
33
+ if (k2 === undefined) k2 = k;
34
+ var desc = Object.getOwnPropertyDescriptor(m, k);
35
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
36
+ desc = { enumerable: true, get: function() { return m[k]; } };
37
+ }
38
+ Object.defineProperty(o, k2, desc);
39
+ }) : (function(o, m, k, k2) {
40
+ if (k2 === undefined) k2 = k;
41
+ o[k2] = m[k];
42
+ }));
43
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
44
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
45
+ }) : function(o, v) {
46
+ o["default"] = v;
47
+ });
48
+ var __importStar = (this && this.__importStar) || (function () {
49
+ var ownKeys = function(o) {
50
+ ownKeys = Object.getOwnPropertyNames || function (o) {
51
+ var ar = [];
52
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
53
+ return ar;
54
+ };
55
+ return ownKeys(o);
56
+ };
57
+ return function (mod) {
58
+ if (mod && mod.__esModule) return mod;
59
+ var result = {};
60
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
61
+ __setModuleDefault(result, mod);
62
+ return result;
63
+ };
64
+ })();
65
+ Object.defineProperty(exports, "__esModule", { value: true });
66
+ exports.McpSseTransport = exports.McpSseServer = exports.McpBlackboardBridgeAdapter = exports.McpCombinedBridge = void 0;
67
+ const http = __importStar(require("node:http"));
68
+ const https = __importStar(require("node:https"));
69
+ const node_url_1 = require("node:url");
70
+ // ============================================================================
71
+ // COMBINED BRIDGE — aggregates multiple tool providers
72
+ // ============================================================================
73
+ /**
74
+ * Aggregates multiple `McpToolProvider` instances into a single MCP bridge.
75
+ *
76
+ * Handles `tools/list` by merging all definitions, and routes `tools/call`
77
+ * to the first provider that owns the requested tool name.
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * const combined = new McpCombinedBridge('network-ai');
82
+ * combined.register(new McpBlackboardBridgeAdapter(myBridge));
83
+ * combined.register(new ExtendedMcpTools({ budget }));
84
+ * combined.register(new ControlMcpTools({ config, orchestrator }));
85
+ *
86
+ * const server = new McpSseServer(combined, { port: 3001 });
87
+ * await server.listen();
88
+ * ```
89
+ */
90
+ class McpCombinedBridge {
91
+ name;
92
+ _providers = [];
93
+ _toolIndex = new Map();
94
+ constructor(name = 'network-ai') {
95
+ this.name = name;
96
+ }
97
+ /**
98
+ * Register a tool provider. Tools names must be globally unique across all
99
+ * registered providers — duplicate names are silently overwritten with the
100
+ * latest registration.
101
+ */
102
+ register(provider) {
103
+ this._providers.push(provider);
104
+ for (const def of provider.getDefinitions()) {
105
+ this._toolIndex.set(def.name, provider);
106
+ }
107
+ }
108
+ /** All tool definitions across every registered provider. */
109
+ allDefinitions() {
110
+ return this._providers.flatMap(p => p.getDefinitions());
111
+ }
112
+ /**
113
+ * Handle a single JSON-RPC 2.0 request. Never rejects — errors are encoded
114
+ * in the response `error` field.
115
+ */
116
+ async handleRPC(request) {
117
+ if (!request || request.jsonrpc !== '2.0') {
118
+ return this._error(null, -32600 /* McpErrorCode.InvalidRequest */, 'Invalid JSON-RPC 2.0 request');
119
+ }
120
+ const { id, method } = request;
121
+ try {
122
+ switch (method) {
123
+ case 'tools/list':
124
+ return this._ok(id, { tools: this.allDefinitions() });
125
+ case 'tools/call': {
126
+ const params = request.params;
127
+ if (!params || typeof params !== 'object') {
128
+ return this._error(id, -32602 /* McpErrorCode.InvalidParams */, 'tools/call requires params object');
129
+ }
130
+ const toolName = params['name'];
131
+ const toolArgs = (params['arguments'] ?? {});
132
+ if (typeof toolName !== 'string' || !toolName) {
133
+ return this._error(id, -32602 /* McpErrorCode.InvalidParams */, 'tools/call: "name" must be a non-empty string');
134
+ }
135
+ const provider = this._toolIndex.get(toolName);
136
+ if (!provider) {
137
+ return this._error(id, -32601 /* McpErrorCode.MethodNotFound */, `Unknown tool: "${toolName}"`);
138
+ }
139
+ const result = await provider.call(toolName, toolArgs);
140
+ return this._ok(id, {
141
+ content: [{ type: 'text', text: JSON.stringify(result) }],
142
+ isError: !result.ok,
143
+ });
144
+ }
145
+ default:
146
+ return this._error(id, -32601 /* McpErrorCode.MethodNotFound */, `Method not found: "${method}"`);
147
+ }
148
+ }
149
+ catch (err) {
150
+ return this._error(id, -32603 /* McpErrorCode.InternalError */, err instanceof Error ? err.message : String(err));
151
+ }
152
+ }
153
+ _ok(id, result) {
154
+ return { jsonrpc: '2.0', id, result };
155
+ }
156
+ _error(id, code, message) {
157
+ return { jsonrpc: '2.0', id, error: { code, message } };
158
+ }
159
+ }
160
+ exports.McpCombinedBridge = McpCombinedBridge;
161
+ // ============================================================================
162
+ // BRIDGE ADAPTER — wraps McpBlackboardBridge as a McpToolProvider
163
+ // ============================================================================
164
+ /**
165
+ * Wraps an existing `McpBlackboardBridge` as a `McpToolProvider` so it can be
166
+ * registered with `McpCombinedBridge` alongside extended and control tools.
167
+ */
168
+ class McpBlackboardBridgeAdapter {
169
+ bridge;
170
+ constructor(bridge) {
171
+ this.bridge = bridge;
172
+ }
173
+ getDefinitions() {
174
+ return this.bridge.listTools();
175
+ }
176
+ async call(toolName, args) {
177
+ return this.bridge.callTool(toolName, args);
178
+ }
179
+ }
180
+ exports.McpBlackboardBridgeAdapter = McpBlackboardBridgeAdapter;
181
+ /**
182
+ * HTTP server that exposes a `McpCombinedBridge` (or any object with
183
+ * `handleRPC`) over two endpoints:
184
+ *
185
+ * - `GET /sse` — Server-Sent Events stream; sends initial `endpoint` event
186
+ * - `POST /mcp` — Receive JSON-RPC 2.0 requests, return responses
187
+ * - `GET /health` — Health check returning `{ status: 'ok', bridge, clients }`
188
+ * - `GET /tools` — List all available tools as JSON
189
+ *
190
+ * No external packages required — built on Node.js `node:http`.
191
+ */
192
+ class McpSseServer {
193
+ _bridge;
194
+ _opts;
195
+ _server;
196
+ _sseClients = new Set();
197
+ constructor(bridge, options = {}) {
198
+ this._bridge = bridge;
199
+ this._opts = {
200
+ port: options.port ?? 3001,
201
+ host: options.host ?? '0.0.0.0',
202
+ heartbeatMs: options.heartbeatMs ?? 15000,
203
+ };
204
+ }
205
+ /** Start listening. Resolves when the server is ready. */
206
+ listen() {
207
+ this._server = http.createServer((req, res) => this._handleRequest(req, res));
208
+ return new Promise(resolve => {
209
+ this._server.listen(this._opts.port, this._opts.host, () => resolve());
210
+ });
211
+ }
212
+ /** Stop the server and close all SSE streams. */
213
+ close() {
214
+ for (const client of this._sseClients) {
215
+ try {
216
+ client.end();
217
+ }
218
+ catch { /* ignore */ }
219
+ }
220
+ this._sseClients.clear();
221
+ return new Promise((resolve, reject) => {
222
+ this._server.close(err => (err ? reject(err) : resolve()));
223
+ });
224
+ }
225
+ /** Current TCP port (useful when port was auto-assigned). */
226
+ get port() { return this._opts.port; }
227
+ /** Number of currently connected SSE clients. */
228
+ get clientCount() { return this._sseClients.size; }
229
+ /**
230
+ * Broadcast an event to every connected SSE client.
231
+ * Useful for pushing agent status updates, budget alerts, etc.
232
+ */
233
+ broadcast(eventName, data) {
234
+ const msg = `event: ${eventName}\ndata: ${JSON.stringify(data)}\n\n`;
235
+ for (const client of this._sseClients) {
236
+ try {
237
+ client.write(msg);
238
+ }
239
+ catch { /* client disconnected */ }
240
+ }
241
+ }
242
+ // --------------------------------------------------------------------------
243
+ // REQUEST ROUTING
244
+ // --------------------------------------------------------------------------
245
+ _handleRequest(req, res) {
246
+ // CORS — allow any MCP client to connect
247
+ res.setHeader('Access-Control-Allow-Origin', '*');
248
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
249
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
250
+ if (req.method === 'OPTIONS') {
251
+ res.writeHead(204);
252
+ res.end();
253
+ return;
254
+ }
255
+ const base = `http://${req.headers.host ?? `localhost:${this._opts.port}`}`;
256
+ let parsed;
257
+ try {
258
+ parsed = new node_url_1.URL(req.url ?? '/', base);
259
+ }
260
+ catch {
261
+ res.writeHead(400);
262
+ res.end('Bad request');
263
+ return;
264
+ }
265
+ const path = parsed.pathname;
266
+ if (req.method === 'GET' && path === '/sse') {
267
+ this._handleSse(req, res);
268
+ }
269
+ else if (req.method === 'POST' && path === '/mcp') {
270
+ this._handlePost(req, res);
271
+ }
272
+ else if (req.method === 'GET' && path === '/health') {
273
+ this._handleHealth(res);
274
+ }
275
+ else if (req.method === 'GET' && path === '/tools') {
276
+ this._handleTools(res);
277
+ }
278
+ else {
279
+ res.writeHead(404, { 'Content-Type': 'application/json' });
280
+ res.end(JSON.stringify({ error: 'Not found', endpoints: ['/sse', '/mcp', '/health', '/tools'] }));
281
+ }
282
+ }
283
+ _handleSse(req, res) {
284
+ res.writeHead(200, {
285
+ 'Content-Type': 'text/event-stream',
286
+ 'Cache-Control': 'no-cache',
287
+ 'Connection': 'keep-alive',
288
+ 'X-Accel-Buffering': 'no', // Disable nginx buffering
289
+ });
290
+ // MCP SSE protocol: send endpoint URL so client knows where to POST
291
+ res.write(`event: endpoint\ndata: /mcp\n\n`);
292
+ this._sseClients.add(res);
293
+ // Heartbeat keeps the connection alive through proxies/load balancers
294
+ let heartbeat = null;
295
+ if (this._opts.heartbeatMs > 0) {
296
+ heartbeat = setInterval(() => {
297
+ try {
298
+ res.write(': heartbeat\n\n');
299
+ }
300
+ catch { /* closed */ }
301
+ }, this._opts.heartbeatMs);
302
+ }
303
+ req.on('close', () => {
304
+ if (heartbeat)
305
+ clearInterval(heartbeat);
306
+ this._sseClients.delete(res);
307
+ });
308
+ }
309
+ _handlePost(req, res) {
310
+ let body = '';
311
+ const MAX_BODY = 4 * 1024 * 1024; // 4 MB
312
+ let bodySize = 0;
313
+ req.on('data', (chunk) => {
314
+ bodySize += chunk.length;
315
+ if (bodySize > MAX_BODY) {
316
+ res.writeHead(413, { 'Content-Type': 'application/json' });
317
+ res.end(JSON.stringify({ error: 'Request body too large' }));
318
+ req.destroy();
319
+ return;
320
+ }
321
+ body += chunk.toString();
322
+ });
323
+ req.on('end', async () => {
324
+ try {
325
+ const rpc = JSON.parse(body);
326
+ const response = await this._bridge.handleRPC(rpc);
327
+ res.writeHead(200, { 'Content-Type': 'application/json' });
328
+ res.end(JSON.stringify(response));
329
+ // Optionally broadcast the call as an event to SSE clients
330
+ if (this._sseClients.size > 0 && rpc.method === 'tools/call') {
331
+ this.broadcast('tool_called', { method: rpc.method, params: rpc.params, ts: Date.now() });
332
+ }
333
+ }
334
+ catch (err) {
335
+ const errMsg = err instanceof Error ? err.message : String(err);
336
+ res.writeHead(400, { 'Content-Type': 'application/json' });
337
+ res.end(JSON.stringify({
338
+ jsonrpc: '2.0',
339
+ id: null,
340
+ error: { code: -32700 /* McpErrorCode.ParseError */, message: `Parse error: ${errMsg}` },
341
+ }));
342
+ }
343
+ });
344
+ req.on('error', () => {
345
+ try {
346
+ res.writeHead(500);
347
+ res.end();
348
+ }
349
+ catch { /* already sent */ }
350
+ });
351
+ }
352
+ _handleHealth(res) {
353
+ res.writeHead(200, { 'Content-Type': 'application/json' });
354
+ res.end(JSON.stringify({
355
+ status: 'ok',
356
+ bridge: this._bridge.name ?? 'network-ai',
357
+ clients: this._sseClients.size,
358
+ ts: new Date().toISOString(),
359
+ }));
360
+ }
361
+ _handleTools(res) {
362
+ const defs = this._bridge.allDefinitions?.() ?? [];
363
+ res.writeHead(200, { 'Content-Type': 'application/json' });
364
+ res.end(JSON.stringify({ tools: defs, count: defs.length }));
365
+ }
366
+ }
367
+ exports.McpSseServer = McpSseServer;
368
+ // ============================================================================
369
+ // SSE TRANSPORT (CLIENT SIDE)
370
+ // ============================================================================
371
+ /**
372
+ * `McpTransport` implementation that sends JSON-RPC requests to a remote
373
+ * `McpSseServer` via HTTP POST.
374
+ *
375
+ * Use this when the MCP client and server are in different processes or
376
+ * machines. Pairs with `McpBridgeClient` as a drop-in replacement for
377
+ * `McpInProcessTransport`.
378
+ *
379
+ * @example
380
+ * ```typescript
381
+ * import { McpBridgeClient } from 'network-ai';
382
+ * import { McpSseTransport } from 'network-ai';
383
+ *
384
+ * const transport = new McpSseTransport('http://localhost:3001');
385
+ * const client = new McpBridgeClient(transport);
386
+ *
387
+ * const tools = await client.listTools();
388
+ * const result = await client.callTool('blackboard_read', { key: 'status', agent_id: 'my-agent' });
389
+ * ```
390
+ */
391
+ class McpSseTransport {
392
+ _postUrl;
393
+ _idCounter = 0;
394
+ /**
395
+ * @param baseUrl Base URL of the `McpSseServer`, e.g. `'http://localhost:3001'`.
396
+ * The transport will POST to `<baseUrl>/mcp`.
397
+ */
398
+ constructor(baseUrl) {
399
+ const clean = baseUrl.replace(/\/+$/, '');
400
+ this._postUrl = clean.endsWith('/mcp') ? clean : `${clean}/mcp`;
401
+ }
402
+ /** Send a JSON-RPC request and wait for the response. */
403
+ async send(request) {
404
+ const body = JSON.stringify(request);
405
+ const parsed = new node_url_1.URL(this._postUrl);
406
+ const isHttps = parsed.protocol === 'https:';
407
+ const lib = isHttps ? https : http;
408
+ return new Promise((resolve, reject) => {
409
+ const options = {
410
+ hostname: parsed.hostname,
411
+ port: parseInt(parsed.port || (isHttps ? '443' : '80'), 10),
412
+ path: parsed.pathname + (parsed.search || ''),
413
+ method: 'POST',
414
+ headers: {
415
+ 'Content-Type': 'application/json',
416
+ 'Content-Length': Buffer.byteLength(body),
417
+ },
418
+ };
419
+ const req = lib.request(options, resp => {
420
+ let data = '';
421
+ resp.on('data', (chunk) => { data += chunk.toString(); });
422
+ resp.on('end', () => {
423
+ try {
424
+ resolve(JSON.parse(data));
425
+ }
426
+ catch {
427
+ reject(new Error(`McpSseTransport: invalid JSON from server: ${data.slice(0, 200)}`));
428
+ }
429
+ });
430
+ });
431
+ req.on('error', reject);
432
+ req.setTimeout(30000, () => {
433
+ req.destroy(new Error('McpSseTransport: request timed out after 30s'));
434
+ });
435
+ req.write(body);
436
+ req.end();
437
+ });
438
+ }
439
+ /** Generate a unique request ID. */
440
+ nextId() {
441
+ return ++this._idCounter;
442
+ }
443
+ }
444
+ exports.McpSseTransport = McpSseTransport;
445
+ //# sourceMappingURL=mcp-transport-sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-transport-sse.js","sourceRoot":"","sources":["../../lib/mcp-transport-sse.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "name": "network-ai",
3
- "version": "3.8.0",
3
+ "version": "4.0.0",
4
4
  "description": "AI agent orchestration framework for TypeScript/Node.js - plug-and-play multi-agent coordination with 12 frameworks (LangChain, AutoGen, CrewAI, OpenAI Assistants, LlamaIndex, Semantic Kernel, Haystack, DSPy, Agno, MCP, OpenClaw). Built-in security, swarm intelligence, and agentic workflow patterns.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "network-ai-server": "./dist/bin/mcp-server.js"
9
+ },
7
10
  "scripts": {
8
11
  "build": "tsc -p tsconfig.build.json",
9
12
  "build:all": "tsc",
@@ -20,6 +23,8 @@
20
23
  "test:phase5d": "npx ts-node test-phase5d.ts",
21
24
  "test:phase5e": "npx ts-node test-phase5e.ts",
22
25
  "test:phase5f": "npx ts-node test-phase5f.ts",
26
+ "test:phase5g": "npx ts-node test-phase5g.ts",
27
+ "test:phase6": "npx ts-node test-phase6.ts",
23
28
  "test:all": "npx ts-node run-tests.ts",
24
29
  "setup": "npx ts-node setup.ts",
25
30
  "setup:check": "npx ts-node setup.ts --check",
@@ -83,6 +88,7 @@
83
88
  },
84
89
  "files": [
85
90
  "dist/",
91
+ "bin/",
86
92
  "types/",
87
93
  "scripts/",
88
94
  "README.md",
@@ -1,9 +0,0 @@
1
- /**
2
- * Test runner — executes all test suites sequentially as isolated child
3
- * processes. Each suite is fully cleaned up before the next one starts,
4
- * preventing memory accumulation that crashes VS Code's integrated terminal.
5
- *
6
- * Usage: npx ts-node run-tests.ts
7
- */
8
- export {};
9
- //# sourceMappingURL=run-tests.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-tests.d.ts","sourceRoot":"","sources":["../run-tests.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
package/dist/run-tests.js DELETED
@@ -1,76 +0,0 @@
1
- "use strict";
2
- /**
3
- * Test runner — executes all test suites sequentially as isolated child
4
- * processes. Each suite is fully cleaned up before the next one starts,
5
- * preventing memory accumulation that crashes VS Code's integrated terminal.
6
- *
7
- * Usage: npx ts-node run-tests.ts
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- const child_process_1 = require("child_process");
11
- const path_1 = require("path");
12
- const SUITES = [
13
- 'test-standalone.ts',
14
- 'test-security.ts',
15
- 'test-adapters.ts',
16
- 'test-priority.ts',
17
- 'test-phase4.ts',
18
- 'test-phase5.ts',
19
- 'test-phase5b.ts',
20
- 'test-phase5c.ts',
21
- 'test-phase5d.ts',
22
- 'test-phase5e.ts',
23
- 'test-phase5f.ts',
24
- ];
25
- const WIDTH = 60;
26
- const cwd = (0, path_1.resolve)(__dirname);
27
- let totalPassed = 0;
28
- let totalFailed = 0;
29
- const results = [];
30
- console.log('='.repeat(WIDTH));
31
- console.log(' Network-AI Full Test Suite');
32
- console.log('='.repeat(WIDTH));
33
- for (const suite of SUITES) {
34
- process.stdout.write(`\nRunning ${suite} ... `);
35
- const result = (0, child_process_1.spawnSync)(process.execPath, // node
36
- ['-e', `require('ts-node/register'); require('./${suite}')`], {
37
- cwd,
38
- encoding: 'utf8',
39
- maxBuffer: 10 * 1024 * 1024, // 10 MB output buffer
40
- env: {
41
- ...process.env,
42
- NODE_OPTIONS: '--max-old-space-size=512', // cap per-process RAM
43
- },
44
- });
45
- // Count pass/fail markers — suites use either [PASS]/[FAIL] or [v]/[x]
46
- const stdout = result.stdout ?? '';
47
- const stderr = result.stderr ?? '';
48
- const passed = (stdout.match(/\[PASS\]|\[v\]/g) ?? []).length;
49
- const failed = (stdout.match(/\[FAIL\]|\[x\]/g) ?? []).length;
50
- const ok = result.status === 0 && failed === 0;
51
- totalPassed += passed;
52
- totalFailed += failed;
53
- results.push({ suite, passed, failed, ok });
54
- if (ok) {
55
- console.log(`OK (${passed} passed)`);
56
- }
57
- else {
58
- console.log(`FAIL (${passed} passed, ${failed} failed)`);
59
- // Print the last 20 lines of output for quick diagnosis
60
- const lines = (stdout + stderr).split('\n').filter(Boolean);
61
- lines.slice(-20).forEach(l => console.log(' ' + l));
62
- }
63
- }
64
- console.log('\n' + '='.repeat(WIDTH));
65
- console.log(` Results: ${totalPassed} passed, ${totalFailed} failed`);
66
- console.log('='.repeat(WIDTH));
67
- const allOk = results.every(r => r.ok);
68
- if (allOk) {
69
- console.log(`\nALL ${totalPassed} TESTS PASSED\n`);
70
- }
71
- else {
72
- console.log('\nFAILED SUITES:');
73
- results.filter(r => !r.ok).forEach(r => console.log(` - ${r.suite} (${r.failed} failed)`));
74
- process.exit(1);
75
- }
76
- //# sourceMappingURL=run-tests.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-tests.js","sourceRoot":"","sources":["../run-tests.ts"],"names":[],"mappings":"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"}