ft-scout 9.0.7 → 9.0.8

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 (75) hide show
  1. package/.firebase/hosting.d2Vi.cache +8 -8
  2. package/AUTONOMOUS_FEATURES.md +1 -1
  3. package/README.md +113 -16
  4. package/bin/src/commands/agent.js +2 -2
  5. package/bin/src/commands/agent.js.map +1 -1
  6. package/bin/src/commands/audit.js +1 -1
  7. package/bin/src/commands/audit.js.map +1 -1
  8. package/bin/src/commands/dashboard.js +1 -1
  9. package/bin/src/commands/dashboard.js.map +1 -1
  10. package/bin/src/commands/mcp.d.ts.map +1 -0
  11. package/bin/src/commands/mcp.js +393 -0
  12. package/bin/src/commands/mcp.js.map +1 -0
  13. package/bin/src/commands/owners.js +1 -1
  14. package/bin/src/commands/owners.js.map +1 -1
  15. package/bin/src/discovery/messages.js +2 -2
  16. package/bin/src/discovery/messages.js.map +1 -1
  17. package/bin/src/discovery/signals.js +3 -3
  18. package/bin/src/discovery/signals.js.map +1 -1
  19. package/bin/src/engine/agentEngine.d.ts.map +1 -1
  20. package/bin/src/engine/agentEngine.js +53 -11
  21. package/bin/src/engine/agentEngine.js.map +1 -1
  22. package/bin/src/engine/runtime/agentRuntime.d.ts.map +1 -1
  23. package/bin/src/engine/runtime/agentRuntime.js +40 -3
  24. package/bin/src/engine/runtime/agentRuntime.js.map +1 -1
  25. package/bin/src/engine/toolRegistry.d.ts.map +1 -1
  26. package/bin/src/engine/toolRegistry.js +13 -0
  27. package/bin/src/engine/toolRegistry.js.map +1 -1
  28. package/bin/src/engine/verifier.js +2 -2
  29. package/bin/src/engine/verifier.js.map +1 -1
  30. package/bin/src/index.js +85 -7
  31. package/bin/src/index.js.map +1 -1
  32. package/bin/src/mcp/client.d.ts.map +1 -0
  33. package/bin/src/mcp/client.js +127 -0
  34. package/bin/src/mcp/client.js.map +1 -0
  35. package/bin/src/mcp/discovery.d.ts.map +1 -0
  36. package/bin/src/mcp/discovery.js +91 -0
  37. package/bin/src/mcp/discovery.js.map +1 -0
  38. package/bin/src/mcp/health.d.ts.map +1 -0
  39. package/bin/src/mcp/health.js +44 -0
  40. package/bin/src/mcp/health.js.map +1 -0
  41. package/bin/src/mcp/index.d.ts.map +1 -0
  42. package/bin/src/mcp/index.js +15 -0
  43. package/bin/src/mcp/index.js.map +1 -0
  44. package/bin/src/mcp/manager.d.ts.map +1 -0
  45. package/bin/src/mcp/manager.js +535 -0
  46. package/bin/src/mcp/manager.js.map +1 -0
  47. package/bin/src/mcp/permissions.d.ts.map +1 -0
  48. package/bin/src/mcp/permissions.js +50 -0
  49. package/bin/src/mcp/permissions.js.map +1 -0
  50. package/bin/src/mcp/persistence.d.ts.map +1 -0
  51. package/bin/src/mcp/persistence.js +156 -0
  52. package/bin/src/mcp/persistence.js.map +1 -0
  53. package/bin/src/mcp/recovery.d.ts.map +1 -0
  54. package/bin/src/mcp/recovery.js +75 -0
  55. package/bin/src/mcp/recovery.js.map +1 -0
  56. package/bin/src/mcp/telemetry.d.ts.map +1 -0
  57. package/bin/src/mcp/telemetry.js +82 -0
  58. package/bin/src/mcp/telemetry.js.map +1 -0
  59. package/bin/src/mcp/toolRouter.d.ts.map +1 -0
  60. package/bin/src/mcp/toolRouter.js +127 -0
  61. package/bin/src/mcp/toolRouter.js.map +1 -0
  62. package/bin/src/mcp/transport.d.ts.map +1 -0
  63. package/bin/src/mcp/transport.js +328 -0
  64. package/bin/src/mcp/transport.js.map +1 -0
  65. package/bin/src/mcp/types.d.ts.map +1 -0
  66. package/bin/src/mcp/types.js +6 -0
  67. package/bin/src/mcp/types.js.map +1 -0
  68. package/bin/src/server/server.d.ts.map +1 -1
  69. package/bin/src/server/server.js +207 -0
  70. package/bin/src/server/server.js.map +1 -1
  71. package/bin/src/utils/branding.js +1 -1
  72. package/bin/src/utils/email.js +4 -4
  73. package/package.json +1 -1
  74. package/web/app.js +1255 -59
  75. package/web/styles.css +1474 -15
@@ -0,0 +1,535 @@
1
+ /**
2
+ * Scout MCP Ecosystem - Central Connection Manager
3
+ * Coordinates lifecycle, connection pools, tool execution, permissions, health, and persistence.
4
+ */
5
+ import crypto from 'crypto';
6
+ import { loadMCPServers, saveMCPServers, saveServerSecret, getServerSecret, deleteServerSecret, sanitizeServerConfig, } from './persistence.js';
7
+ import { HttpMcpTransport, StdioMcpTransport } from './transport.js';
8
+ import { MCPClient } from './client.js';
9
+ import { normalizeMCPTool } from './discovery.js';
10
+ import { MCPPermissionManager } from './permissions.js';
11
+ import { MCPToolRouter } from './toolRouter.js';
12
+ import { MCPTelemetry } from './telemetry.js';
13
+ import { MCPHealthMonitor } from './health.js';
14
+ import { MCPRecovery } from './recovery.js';
15
+ export class MCPManager {
16
+ static instance = null;
17
+ servers = new Map();
18
+ clients = new Map();
19
+ initialized = false;
20
+ constructor() {
21
+ this.loadState();
22
+ }
23
+ static getInstance() {
24
+ if (!MCPManager.instance) {
25
+ MCPManager.instance = new MCPManager();
26
+ }
27
+ return MCPManager.instance;
28
+ }
29
+ loadState() {
30
+ const saved = loadMCPServers();
31
+ this.servers.clear();
32
+ for (const s of saved) {
33
+ // Reset in-memory volatile status on startup if was previously connecting
34
+ if (s.status === 'connecting' || s.status === 'reconnecting') {
35
+ s.status = 'disconnected';
36
+ }
37
+ this.servers.set(s.id, s);
38
+ }
39
+ this.initialized = true;
40
+ }
41
+ persistState() {
42
+ const list = Array.from(this.servers.values());
43
+ saveMCPServers(list);
44
+ }
45
+ /**
46
+ * Find server by ID or case-insensitive Name
47
+ */
48
+ getServer(idOrName) {
49
+ if (!idOrName)
50
+ return undefined;
51
+ // Direct ID lookup
52
+ const byId = this.servers.get(idOrName);
53
+ if (byId)
54
+ return byId;
55
+ // Name lookup
56
+ const lower = idOrName.toLowerCase().trim();
57
+ for (const s of this.servers.values()) {
58
+ if (s.name.toLowerCase() === lower || s.id.toLowerCase() === lower) {
59
+ return s;
60
+ }
61
+ }
62
+ return undefined;
63
+ }
64
+ /**
65
+ * List all registered MCP servers (with secrets sanitized)
66
+ */
67
+ listServers() {
68
+ return Array.from(this.servers.values()).map((s) => sanitizeServerConfig(s));
69
+ }
70
+ /**
71
+ * Register a new MCP server configuration and optionally store credentials
72
+ */
73
+ async addServer(config, secret) {
74
+ const name = config.name.trim();
75
+ const existing = this.getServer(name);
76
+ if (existing) {
77
+ throw new Error(`An MCP server with name "${name}" already exists.`);
78
+ }
79
+ const id = config.id || name.toLowerCase().replace(/[^a-z0-9]/g, '-') || `mcp-${Date.now()}`;
80
+ const now = new Date().toISOString();
81
+ const defaultPermissions = {
82
+ enabled: true,
83
+ allowedTools: [],
84
+ disabledTools: [],
85
+ requireConfirmationForDestructive: true,
86
+ autoApproveSafe: true,
87
+ ...config.permissions,
88
+ };
89
+ const server = {
90
+ id,
91
+ name,
92
+ description: config.description || '',
93
+ transport: config.transport,
94
+ endpoint: config.endpoint,
95
+ command: config.command,
96
+ args: config.args || [],
97
+ env: config.env || {},
98
+ authType: config.authType || (secret ? 'bearer' : 'none'),
99
+ authHeader: config.authHeader,
100
+ status: 'disconnected',
101
+ health: {
102
+ status: 'disconnected',
103
+ },
104
+ tools: [],
105
+ permissions: defaultPermissions,
106
+ createdAt: now,
107
+ updatedAt: now,
108
+ };
109
+ this.servers.set(id, server);
110
+ if (secret) {
111
+ saveServerSecret(id, secret);
112
+ server.hasSecret = true;
113
+ }
114
+ this.persistState();
115
+ return sanitizeServerConfig(server);
116
+ }
117
+ /**
118
+ * Remove an MCP server and its stored secrets
119
+ */
120
+ async removeServer(idOrName) {
121
+ const server = this.getServer(idOrName);
122
+ if (!server)
123
+ return false;
124
+ await this.disconnectServer(server.id).catch(() => { });
125
+ deleteServerSecret(server.id);
126
+ this.servers.delete(server.id);
127
+ this.clients.delete(server.id);
128
+ this.persistState();
129
+ return true;
130
+ }
131
+ /**
132
+ * Create an IMCPTransport instance for the given server config
133
+ */
134
+ createTransport(server) {
135
+ if (server.transport === 'http') {
136
+ if (!server.endpoint) {
137
+ throw new Error(`HTTP MCP server "${server.name}" requires an endpoint URL.`);
138
+ }
139
+ const headers = {};
140
+ const secret = getServerSecret(server.id);
141
+ if (secret) {
142
+ const headerName = server.authHeader || 'Authorization';
143
+ if (server.authType === 'bearer' || server.authType === 'oauth') {
144
+ headers[headerName] = `Bearer ${secret}`;
145
+ }
146
+ else if (server.authType === 'api-key') {
147
+ headers[headerName] = secret;
148
+ }
149
+ else {
150
+ headers[headerName] = secret;
151
+ }
152
+ }
153
+ return new HttpMcpTransport(server.endpoint, headers);
154
+ }
155
+ else {
156
+ if (!server.command) {
157
+ throw new Error(`stdio MCP server "${server.name}" requires a command.`);
158
+ }
159
+ return new StdioMcpTransport(server.command, server.args || [], server.env || {});
160
+ }
161
+ }
162
+ /**
163
+ * Connect to an MCP server, perform initialize handshake, and discover tools
164
+ */
165
+ async connectServer(idOrName) {
166
+ const server = this.getServer(idOrName);
167
+ if (!server) {
168
+ throw new Error(`MCP server "${idOrName}" not found.`);
169
+ }
170
+ server.status = 'connecting';
171
+ this.persistState();
172
+ try {
173
+ // Disconnect old client if present
174
+ if (this.clients.has(server.id)) {
175
+ await this.clients.get(server.id)?.disconnect().catch(() => { });
176
+ this.clients.delete(server.id);
177
+ }
178
+ const transport = this.createTransport(server);
179
+ const client = new MCPClient(transport);
180
+ const initResult = await client.connectAndInitialize();
181
+ server.capabilities = initResult.capabilities;
182
+ // Discover and normalize tools
183
+ const rawTools = await client.listTools();
184
+ const normalizedTools = rawTools.map((rt) => normalizeMCPTool(rt, server.id, server.name));
185
+ // Restore disabled state if previously set
186
+ const disabledSet = new Set(server.permissions.disabledTools || []);
187
+ for (const t of normalizedTools) {
188
+ if (disabledSet.has(t.name)) {
189
+ t.enabled = false;
190
+ }
191
+ }
192
+ server.tools = normalizedTools;
193
+ server.status = 'connected';
194
+ server.lastConnectedAt = new Date().toISOString();
195
+ server.updatedAt = new Date().toISOString();
196
+ // Ping for initial latency check
197
+ try {
198
+ const latency = await client.ping();
199
+ server.health = {
200
+ status: 'connected',
201
+ latencyMs: latency,
202
+ lastCheckedAt: new Date().toISOString(),
203
+ };
204
+ }
205
+ catch {
206
+ server.health = {
207
+ status: 'connected',
208
+ lastCheckedAt: new Date().toISOString(),
209
+ };
210
+ }
211
+ this.clients.set(server.id, client);
212
+ this.persistState();
213
+ return sanitizeServerConfig(server);
214
+ }
215
+ catch (err) {
216
+ server.status = 'error';
217
+ server.health = {
218
+ status: 'error',
219
+ error: err?.message || String(err),
220
+ lastCheckedAt: new Date().toISOString(),
221
+ };
222
+ this.persistState();
223
+ throw err;
224
+ }
225
+ }
226
+ /**
227
+ * Disconnect an active MCP server
228
+ */
229
+ async disconnectServer(idOrName) {
230
+ const server = this.getServer(idOrName);
231
+ if (!server) {
232
+ throw new Error(`MCP server "${idOrName}" not found.`);
233
+ }
234
+ const client = this.clients.get(server.id);
235
+ if (client) {
236
+ await client.disconnect().catch(() => { });
237
+ this.clients.delete(server.id);
238
+ }
239
+ server.status = 'disconnected';
240
+ server.health = {
241
+ status: 'disconnected',
242
+ lastCheckedAt: new Date().toISOString(),
243
+ };
244
+ server.updatedAt = new Date().toISOString();
245
+ this.persistState();
246
+ return sanitizeServerConfig(server);
247
+ }
248
+ /**
249
+ * Reconnect to an MCP server
250
+ */
251
+ async reconnectServer(idOrName) {
252
+ const server = this.getServer(idOrName);
253
+ if (!server) {
254
+ throw new Error(`MCP server "${idOrName}" not found.`);
255
+ }
256
+ await this.disconnectServer(server.id).catch(() => { });
257
+ return await this.connectServer(server.id);
258
+ }
259
+ /**
260
+ * Check health and latency for a server, or all connected servers
261
+ */
262
+ async checkHealth(idOrName) {
263
+ const results = {};
264
+ const targets = idOrName
265
+ ? [this.getServer(idOrName)].filter(Boolean)
266
+ : Array.from(this.servers.values());
267
+ for (const server of targets) {
268
+ const client = this.clients.get(server.id);
269
+ const health = await MCPHealthMonitor.checkHealth(server, client);
270
+ server.health = health;
271
+ server.status = health.status;
272
+ results[server.id] = health;
273
+ }
274
+ this.persistState();
275
+ return results;
276
+ }
277
+ /**
278
+ * Retrieve all discovered tools for a server
279
+ */
280
+ getToolsForServer(idOrName) {
281
+ const server = this.getServer(idOrName);
282
+ return server ? server.tools : [];
283
+ }
284
+ /**
285
+ * Retrieve all discovered tools across all servers
286
+ */
287
+ getAllTools(options = {}) {
288
+ const list = [];
289
+ for (const server of this.servers.values()) {
290
+ if (options.onlyEnabled && (server.status !== 'connected' || !server.permissions.enabled)) {
291
+ continue;
292
+ }
293
+ for (const tool of server.tools) {
294
+ if (options.onlyEnabled && !tool.enabled)
295
+ continue;
296
+ list.push(tool);
297
+ }
298
+ }
299
+ return list;
300
+ }
301
+ /**
302
+ * Enable or disable an individual tool on a server
303
+ */
304
+ setToolEnabled(serverId, toolName, enabled) {
305
+ const server = this.getServer(serverId);
306
+ if (!server)
307
+ return false;
308
+ const tool = server.tools.find((t) => t.name === toolName || t.qualifiedName === toolName);
309
+ if (!tool)
310
+ return false;
311
+ tool.enabled = enabled;
312
+ const disabledSet = new Set(server.permissions.disabledTools || []);
313
+ if (enabled) {
314
+ disabledSet.delete(tool.name);
315
+ }
316
+ else {
317
+ disabledSet.add(tool.name);
318
+ }
319
+ server.permissions.disabledTools = Array.from(disabledSet);
320
+ server.updatedAt = new Date().toISOString();
321
+ this.persistState();
322
+ return true;
323
+ }
324
+ /**
325
+ * Update permissions for an MCP server
326
+ */
327
+ setServerPermissions(serverId, permissions) {
328
+ const server = this.getServer(serverId);
329
+ if (!server)
330
+ return false;
331
+ server.permissions = {
332
+ ...server.permissions,
333
+ ...permissions,
334
+ };
335
+ server.updatedAt = new Date().toISOString();
336
+ this.persistState();
337
+ return true;
338
+ }
339
+ /**
340
+ * Toggle a tool enabled/disabled state for a given server
341
+ */
342
+ toggleTool(serverId, toolName, enabled) {
343
+ const server = this.getServer(serverId);
344
+ if (!server)
345
+ return undefined;
346
+ const targetTool = server.tools.find((t) => t.originalName === toolName || t.name === toolName);
347
+ if (!targetTool)
348
+ return undefined;
349
+ targetTool.enabled = enabled !== undefined ? enabled : !targetTool.enabled;
350
+ const disabledList = new Set(server.permissions.disabledTools || []);
351
+ if (targetTool.enabled) {
352
+ disabledList.delete(targetTool.originalName);
353
+ disabledList.delete(targetTool.name);
354
+ }
355
+ else {
356
+ disabledList.add(targetTool.originalName);
357
+ }
358
+ server.permissions.disabledTools = Array.from(disabledList);
359
+ server.updatedAt = new Date().toISOString();
360
+ this.persistState();
361
+ return sanitizeServerConfig(server);
362
+ }
363
+ /**
364
+ * Route user request to relevant MCP tools
365
+ */
366
+ routeTools(userGoal) {
367
+ return MCPToolRouter.routeTools(userGoal, Array.from(this.servers.values()));
368
+ }
369
+ /**
370
+ * Find tool by either its qualified name (mcp__<serverId>__<toolName>) or its original name
371
+ */
372
+ findTool(nameOrQualified) {
373
+ for (const server of this.servers.values()) {
374
+ for (const tool of server.tools) {
375
+ if (tool.qualifiedName === nameOrQualified || tool.name === nameOrQualified) {
376
+ return { tool, server };
377
+ }
378
+ }
379
+ }
380
+ return undefined;
381
+ }
382
+ /**
383
+ * Execute an MCP tool by name, handling permissions, connection, retry, and telemetry
384
+ */
385
+ async executeTool(nameOrQualified, args = {}) {
386
+ const startedAt = new Date().toISOString();
387
+ const startTime = Date.now();
388
+ const invocationId = `mcp_inv_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`;
389
+ const target = this.findTool(nameOrQualified);
390
+ if (!target) {
391
+ const err = `Tool "${nameOrQualified}" is not registered on any connected MCP server.`;
392
+ const result = {
393
+ serverId: 'unknown',
394
+ serverName: 'Unknown',
395
+ toolName: nameOrQualified,
396
+ invocationId,
397
+ startedAt,
398
+ completedAt: new Date().toISOString(),
399
+ status: 'error',
400
+ inputSummary: JSON.stringify(args),
401
+ outputSummary: err,
402
+ result: null,
403
+ error: err,
404
+ executionDurationMs: Date.now() - startTime,
405
+ };
406
+ MCPTelemetry.recordResult(result);
407
+ return result;
408
+ }
409
+ const { tool, server } = target;
410
+ // 1. Enforce Permissions
411
+ const perm = MCPPermissionManager.checkToolAccess(server, tool);
412
+ if (!perm.allowed) {
413
+ const blockedReason = perm.reason || `Tool "${tool.name}" is restricted by Scout permissions.`;
414
+ const result = {
415
+ serverId: server.id,
416
+ serverName: server.name,
417
+ toolName: tool.name,
418
+ invocationId,
419
+ startedAt,
420
+ completedAt: new Date().toISOString(),
421
+ status: 'blocked',
422
+ inputSummary: JSON.stringify(args),
423
+ outputSummary: `[MCP PERMISSION BLOCKED]: ${blockedReason}`,
424
+ result: { success: false, error: 'PermissionBlocked', message: blockedReason },
425
+ error: blockedReason,
426
+ executionDurationMs: Date.now() - startTime,
427
+ };
428
+ MCPTelemetry.recordResult(result);
429
+ return result;
430
+ }
431
+ // 2. Ensure Client is connected
432
+ let client = this.clients.get(server.id);
433
+ if (!client || !client.isConnected()) {
434
+ try {
435
+ await this.connectServer(server.id);
436
+ client = this.clients.get(server.id);
437
+ }
438
+ catch (connErr) {
439
+ const classified = MCPRecovery.classifyError(connErr, server.name, tool.permissionLevel === 'destructive');
440
+ const result = {
441
+ serverId: server.id,
442
+ serverName: server.name,
443
+ toolName: tool.name,
444
+ invocationId,
445
+ startedAt,
446
+ completedAt: new Date().toISOString(),
447
+ status: 'error',
448
+ inputSummary: JSON.stringify(args),
449
+ outputSummary: classified.userFriendlyMessage,
450
+ result: null,
451
+ error: classified.originalError,
452
+ executionDurationMs: Date.now() - startTime,
453
+ };
454
+ MCPTelemetry.recordResult(result);
455
+ return result;
456
+ }
457
+ }
458
+ if (!client) {
459
+ throw new Error(`Could not obtain active client for MCP server "${server.name}".`);
460
+ }
461
+ // 3. Execute with bounded recovery
462
+ let execResult = null;
463
+ let execError = null;
464
+ const maxRetries = tool.permissionLevel === 'read' ? 1 : 0;
465
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
466
+ try {
467
+ execResult = await client.callTool(tool.originalName, args);
468
+ execError = null;
469
+ break;
470
+ }
471
+ catch (callErr) {
472
+ execError = callErr;
473
+ const classified = MCPRecovery.classifyError(callErr, server.name, tool.permissionLevel === 'destructive');
474
+ if (classified.isRecoverable && classified.canRetry && attempt < maxRetries) {
475
+ // Try reconnecting once before final retry
476
+ await this.reconnectServer(server.id).catch(() => { });
477
+ client = this.clients.get(server.id) || client;
478
+ continue;
479
+ }
480
+ break;
481
+ }
482
+ }
483
+ server.lastActivityAt = new Date().toISOString();
484
+ this.persistState();
485
+ const completedAt = new Date().toISOString();
486
+ const duration = Date.now() - startTime;
487
+ if (execError) {
488
+ const classified = MCPRecovery.classifyError(execError, server.name, tool.permissionLevel === 'destructive');
489
+ const result = {
490
+ serverId: server.id,
491
+ serverName: server.name,
492
+ toolName: tool.name,
493
+ invocationId,
494
+ startedAt,
495
+ completedAt,
496
+ status: classified.category === 'TIMEOUT' ? 'timeout' : 'error',
497
+ inputSummary: JSON.stringify(args),
498
+ outputSummary: classified.userFriendlyMessage,
499
+ result: null,
500
+ error: classified.originalError,
501
+ executionDurationMs: duration,
502
+ };
503
+ MCPTelemetry.recordResult(result);
504
+ return result;
505
+ }
506
+ const outSummary = typeof execResult === 'string'
507
+ ? execResult.slice(0, 300)
508
+ : (execResult?.text ? String(execResult.text).slice(0, 300) : JSON.stringify(execResult).slice(0, 300));
509
+ const successRecord = {
510
+ serverId: server.id,
511
+ serverName: server.name,
512
+ toolName: tool.name,
513
+ invocationId,
514
+ startedAt,
515
+ completedAt,
516
+ status: 'success',
517
+ inputSummary: JSON.stringify(args),
518
+ outputSummary: outSummary,
519
+ result: execResult,
520
+ executionDurationMs: duration,
521
+ };
522
+ MCPTelemetry.recordResult(successRecord);
523
+ return successRecord;
524
+ }
525
+ /**
526
+ * Get recent observable activity
527
+ */
528
+ getActivityLog(limit = 50) {
529
+ return MCPTelemetry.loadActivity(limit);
530
+ }
531
+ }
532
+ export function getMCPManager() {
533
+ return MCPManager.getInstance();
534
+ }
535
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAQ5B,OAAO,EACH,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAsB,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,aAAa,EAA4B,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,OAAO,UAAU;IACX,MAAM,CAAC,QAAQ,GAAsB,IAAI,CAAC;IAC1C,OAAO,GAAiC,IAAI,GAAG,EAAE,CAAC;IAClD,OAAO,GAA2B,IAAI,GAAG,EAAE,CAAC;IAC5C,WAAW,GAAY,KAAK,CAAC;IAErC;QACI,IAAI,CAAC,SAAS,EAAE,CAAC;IACrB,CAAC;IAEM,MAAM,CAAC,WAAW;QACrB,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YACvB,UAAU,CAAC,QAAQ,GAAG,IAAI,UAAU,EAAE,CAAC;QAC3C,CAAC;QACD,OAAO,UAAU,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAEO,SAAS;QACb,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACpB,0EAA0E;YAC1E,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;gBAC3D,CAAC,CAAC,MAAM,GAAG,cAAc,CAAC;YAC9B,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC5B,CAAC;IAEO,YAAY;QAChB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/C,cAAc,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,QAAgB;QAC7B,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAChC,mBAAmB;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAEtB,cAAc;QACd,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;gBACjE,OAAO,CAAC,CAAC;YACb,CAAC;QACL,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,WAAW;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,SAAS,CAClB,MAIC,EACD,MAAe;QAEf,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,mBAAmB,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC7F,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,MAAM,kBAAkB,GAAyB;YAC7C,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,EAAE;YAChB,aAAa,EAAE,EAAE;YACjB,iCAAiC,EAAE,IAAI;YACvC,eAAe,EAAE,IAAI;YACrB,GAAG,MAAM,CAAC,WAAW;SACxB,CAAC;QAEF,MAAM,MAAM,GAAoB;YAC5B,EAAE;YACF,IAAI;YACJ,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;YACrC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;YACvB,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YACzD,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE;gBACJ,MAAM,EAAE,cAAc;aACzB;YACD,KAAK,EAAE,EAAE;YACT,WAAW,EAAE,kBAAkB;YAC/B,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACjB,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAE7B,IAAI,MAAM,EAAE,CAAC;YACT,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC7B,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY,CAAC,QAAgB;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAExD,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,MAAuB;QAC3C,IAAI,MAAM,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,IAAI,6BAA6B,CAAC,CAAC;YAClF,CAAC;YAED,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAE1C,IAAI,MAAM,EAAE,CAAC;gBACT,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,eAAe,CAAC;gBACxD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;oBAC9D,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;gBAC7C,CAAC;qBAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACvC,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;gBACjC,CAAC;YACL,CAAC;YAED,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,IAAI,uBAAuB,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACtF,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,aAAa,CAAC,QAAgB;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,eAAe,QAAQ,cAAc,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC;QAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,IAAI,CAAC;YACD,mCAAmC;YACnC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;gBACjE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnC,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC;YAExC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,oBAAoB,EAAE,CAAC;YACvD,MAAM,CAAC,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC;YAE9C,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YAC1C,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAE3F,2CAA2C;YAC3C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;YACpE,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;gBAC9B,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1B,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC;gBACtB,CAAC;YACL,CAAC;YAED,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC;YAC/B,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC;YAC5B,MAAM,CAAC,eAAe,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAClD,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAE5C,iCAAiC;YACjC,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,CAAC,MAAM,GAAG;oBACZ,MAAM,EAAE,WAAW;oBACnB,SAAS,EAAE,OAAO;oBAClB,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBAC1C,CAAC;YACN,CAAC;YAAC,MAAM,CAAC;gBACL,MAAM,CAAC,MAAM,GAAG;oBACZ,MAAM,EAAE,WAAW;oBACnB,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBAC1C,CAAC;YACN,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,YAAY,EAAE,CAAC;YAEpB,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;YACxB,MAAM,CAAC,MAAM,GAAG;gBACZ,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;gBAClC,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAC1C,CAAC;YACF,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,eAAe,QAAQ,cAAc,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC;YACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,CAAC,MAAM,GAAG,cAAc,CAAC;QAC/B,MAAM,CAAC,MAAM,GAAG;YACZ,MAAM,EAAE,cAAc;YACtB,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC1C,CAAC;QACF,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,eAAe,CAAC,QAAgB;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,eAAe,QAAQ,cAAc,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACxD,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,WAAW,CAAC,QAAiB;QACtC,MAAM,OAAO,GAAoC,EAAE,CAAC;QAEpD,MAAM,OAAO,GAAG,QAAQ;YACpB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAsB;YACjE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAExC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;YACvB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,QAAgB;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACI,WAAW,CAAC,OAAO,GAA8B,EAAE;QACtD,MAAM,IAAI,GAAwB,EAAE,CAAC;QACrC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxF,SAAS;YACb,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO;oBAAE,SAAS;gBACnD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,QAAgB,EAAE,QAAgB,EAAE,OAAgB;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAExB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;QACpE,IAAI,OAAO,EAAE,CAAC;YACV,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACJ,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,CAAC,WAAW,CAAC,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3D,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE5C,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,oBAAoB,CAAC,QAAgB,EAAE,WAA0C;QACpF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,MAAM,CAAC,WAAW,GAAG;YACjB,GAAG,MAAM,CAAC,WAAW;YACrB,GAAG,WAAW;SACjB,CAAC;QACF,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,QAAgB,EAAE,QAAgB,EAAE,OAAiB;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAE9B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAChG,IAAI,CAAC,UAAU;YAAE,OAAO,SAAS,CAAC;QAElC,UAAU,CAAC,OAAO,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QAE3E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACrB,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YAC7C,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACJ,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,CAAC,WAAW,CAAC,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,QAAgB;QAC9B,OAAO,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAED;;OAEG;IACI,QAAQ,CAAC,eAAuB;QACnC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,aAAa,KAAK,eAAe,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBAC5B,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,WAAW,CACpB,eAAuB,EACvB,IAAI,GAAwB,EAAE;QAE9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAEvF,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,SAAS,eAAe,kDAAkD,CAAC;YACvF,MAAM,MAAM,GAAkB;gBAC1B,QAAQ,EAAE,SAAS;gBACnB,UAAU,EAAE,SAAS;gBACrB,QAAQ,EAAE,eAAe;gBACzB,YAAY;gBACZ,SAAS;gBACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,MAAM,EAAE,OAAO;gBACf,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAClC,aAAa,EAAE,GAAG;gBAClB,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,GAAG;gBACV,mBAAmB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aAC9C,CAAC;YACF,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAEhC,yBAAyB;QACzB,MAAM,IAAI,GAAG,oBAAoB,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,IAAI,CAAC,IAAI,uCAAuC,CAAC;YAC/F,MAAM,MAAM,GAAkB;gBAC1B,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,UAAU,EAAE,MAAM,CAAC,IAAI;gBACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,YAAY;gBACZ,SAAS;gBACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAClC,aAAa,EAAE,6BAA6B,aAAa,EAAE;gBAC3D,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,aAAa,EAAE;gBAC9E,KAAK,EAAE,aAAa;gBACpB,mBAAmB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aAC9C,CAAC;YACF,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,gCAAgC;QAChC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACpC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,OAAY,EAAE,CAAC;gBACpB,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,KAAK,aAAa,CAAC,CAAC;gBAC3G,MAAM,MAAM,GAAkB;oBAC1B,QAAQ,EAAE,MAAM,CAAC,EAAE;oBACnB,UAAU,EAAE,MAAM,CAAC,IAAI;oBACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,YAAY;oBACZ,SAAS;oBACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACrC,MAAM,EAAE,OAAO;oBACf,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAClC,aAAa,EAAE,UAAU,CAAC,mBAAmB;oBAC7C,MAAM,EAAE,IAAI;oBACZ,KAAK,EAAE,UAAU,CAAC,aAAa;oBAC/B,mBAAmB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBAC9C,CAAC;gBACF,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBAClC,OAAO,MAAM,CAAC;YAClB,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,kDAAkD,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QACvF,CAAC;QAED,mCAAmC;QACnC,IAAI,UAAU,GAAQ,IAAI,CAAC;QAC3B,IAAI,SAAS,GAAQ,IAAI,CAAC;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE3D,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACrD,IAAI,CAAC;gBACD,UAAU,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;gBAC5D,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACV,CAAC;YAAC,OAAO,OAAY,EAAE,CAAC;gBACpB,SAAS,GAAG,OAAO,CAAC;gBACpB,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,KAAK,aAAa,CAAC,CAAC;gBAC3G,IAAI,UAAU,CAAC,aAAa,IAAI,UAAU,CAAC,QAAQ,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBAC1E,2CAA2C;oBAC3C,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;oBACvD,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC;oBAC/C,SAAS;gBACb,CAAC;gBACD,MAAM;YACV,CAAC;QACL,CAAC;QAED,MAAM,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,IAAI,SAAS,EAAE,CAAC;YACZ,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,KAAK,aAAa,CAAC,CAAC;YAC7G,MAAM,MAAM,GAAkB;gBAC1B,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,UAAU,EAAE,MAAM,CAAC,IAAI;gBACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,YAAY;gBACZ,SAAS;gBACT,WAAW;gBACX,MAAM,EAAE,UAAU,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;gBAC/D,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAClC,aAAa,EAAE,UAAU,CAAC,mBAAmB;gBAC7C,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,UAAU,CAAC,aAAa;gBAC/B,mBAAmB,EAAE,QAAQ;aAChC,CAAC;YACF,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,UAAU,KAAK,QAAQ;YAC7C,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAC1B,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAE5G,MAAM,aAAa,GAAkB;YACjC,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,YAAY;YACZ,SAAS;YACT,WAAW;YACX,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAClC,aAAa,EAAE,UAAU;YACzB,MAAM,EAAE,UAAU;YAClB,mBAAmB,EAAE,QAAQ;SAChC,CAAC;QAEF,YAAY,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QACzC,OAAO,aAAa,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,KAAK,GAAW,EAAE;QACpC,OAAO,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;CACJ;AAED,MAAM,UAAU,aAAa;IACzB,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["permissions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEzF,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,kBAAkB,CAAC;CACvC;AAED,qBAAa,oBAAoB;IAC7B;;OAEG;IACH,OAAc,eAAe,CACzB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,iBAAiB,GACxB,wBAAwB,CA+C1B;CACJ"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Scout MCP Ecosystem - Permission Boundary Engine
3
+ * Enforces server-level and tool-level permission rules before execution or model exposure.
4
+ */
5
+ export class MCPPermissionManager {
6
+ /**
7
+ * Check if a tool can be made available to the agent or executed
8
+ */
9
+ static checkToolAccess(server, tool) {
10
+ // 1. Server-level disabled check
11
+ if (server.permissions.enabled === false) {
12
+ return {
13
+ allowed: false,
14
+ reason: `MCP server "${server.name}" is currently disabled in Scout settings.`,
15
+ requiresApproval: false,
16
+ permissionLevel: tool.permissionLevel,
17
+ };
18
+ }
19
+ // 2. Individual tool disabled check
20
+ if (tool.enabled === false ||
21
+ (server.permissions.disabledTools && server.permissions.disabledTools.includes(tool.name))) {
22
+ return {
23
+ allowed: false,
24
+ reason: `Tool "${tool.name}" on server "${server.name}" has been disabled by the user.`,
25
+ requiresApproval: false,
26
+ permissionLevel: tool.permissionLevel,
27
+ };
28
+ }
29
+ // 3. Whitelist check (if configured)
30
+ if (Array.isArray(server.permissions.allowedTools) &&
31
+ server.permissions.allowedTools.length > 0 &&
32
+ !server.permissions.allowedTools.includes(tool.name)) {
33
+ return {
34
+ allowed: false,
35
+ reason: `Tool "${tool.name}" is not included in the allowed tools whitelist for "${server.name}".`,
36
+ requiresApproval: false,
37
+ permissionLevel: tool.permissionLevel,
38
+ };
39
+ }
40
+ // 4. Approval requirements for destructive or admin actions
41
+ const isDestructive = tool.permissionLevel === 'destructive' || tool.permissionLevel === 'admin';
42
+ const requiresApproval = isDestructive && server.permissions.requireConfirmationForDestructive;
43
+ return {
44
+ allowed: true,
45
+ requiresApproval,
46
+ permissionLevel: tool.permissionLevel,
47
+ };
48
+ }
49
+ }
50
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["permissions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,OAAO,oBAAoB;IAC7B;;OAEG;IACI,MAAM,CAAC,eAAe,CACzB,MAAuB,EACvB,IAAuB;QAEvB,iCAAiC;QACjC,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACvC,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,eAAe,MAAM,CAAC,IAAI,4CAA4C;gBAC9E,gBAAgB,EAAE,KAAK;gBACvB,eAAe,EAAE,IAAI,CAAC,eAAe;aACxC,CAAC;QACN,CAAC;QAED,oCAAoC;QACpC,IACI,IAAI,CAAC,OAAO,KAAK,KAAK;YACtB,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,IAAI,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAC5F,CAAC;YACC,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,SAAS,IAAI,CAAC,IAAI,gBAAgB,MAAM,CAAC,IAAI,kCAAkC;gBACvF,gBAAgB,EAAE,KAAK;gBACvB,eAAe,EAAE,IAAI,CAAC,eAAe;aACxC,CAAC;QACN,CAAC;QAED,qCAAqC;QACrC,IACI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC;YAC9C,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YAC1C,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EACtD,CAAC;YACC,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,SAAS,IAAI,CAAC,IAAI,yDAAyD,MAAM,CAAC,IAAI,IAAI;gBAClG,gBAAgB,EAAE,KAAK;gBACvB,eAAe,EAAE,IAAI,CAAC,eAAe;aACxC,CAAC;QACN,CAAC;QAED,4DAA4D;QAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,KAAK,aAAa,IAAI,IAAI,CAAC,eAAe,KAAK,OAAO,CAAC;QACjG,MAAM,gBAAgB,GAAG,aAAa,IAAI,MAAM,CAAC,WAAW,CAAC,iCAAiC,CAAC;QAE/F,OAAO;YACH,OAAO,EAAE,IAAI;YACb,gBAAgB;YAChB,eAAe,EAAE,IAAI,CAAC,eAAe;SACxC,CAAC;IACN,CAAC;CACJ"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["persistence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAmBlD;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAoB9D;AAqBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAKhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,QAMlD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,eAAe,EAAE,CAalD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,QAKxD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAS7E"}