truthguard-ai 0.3.0 → 0.4.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,37 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * TruthGuard MCP Server — Thin (HTTP-only) Client
4
+ *
5
+ * This is the npm-published version of the MCP server.
6
+ * It delegates ALL evaluation to the remote TruthGuard server via HTTP.
7
+ * No local grounding engine, rules, registry, or policy modules required.
8
+ *
9
+ * Transport: stdio with newline-delimited JSON-RPC 2.0
10
+ * Dependencies: Node built-ins only (http, https)
11
+ *
12
+ * Tools:
13
+ * verify_response — Evaluate a trace (remote)
14
+ * list_rules — List detection rules (remote)
15
+ * get_failure_info — Get failure details + remediation (remote)
16
+ * evaluate_with_policy — Evaluate with custom policy (remote)
17
+ * quick_check — Fast lightweight check (remote)
18
+ * check_trace_quality — Assess trace completeness (remote)
19
+ * get_live_traces — List recent proxy evaluations (remote)
20
+ * get_trace_report — Full report for one trace (remote)
21
+ *
22
+ * Usage (VS Code mcp.json):
23
+ * {
24
+ * "servers": {
25
+ * "truthguard": {
26
+ * "command": "npx",
27
+ * "args": ["-y", "truthguard-ai", "mcp"],
28
+ * "env": {
29
+ * "TRUTHGUARD_API_KEY": "tg_live_...",
30
+ * "TRUTHGUARD_SERVER": "https://app.truthguard.dev"
31
+ * }
32
+ * }
33
+ * }
34
+ * }
35
+ */
36
+ export declare function startMCPServer(): void;
37
+ //# sourceMappingURL=thin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thin.d.ts","sourceRoot":"","sources":["../../src/MCP/thin.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAueH,wBAAgB,cAAc,IAAI,IAAI,CAqCrC"}
@@ -0,0 +1,542 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * TruthGuard MCP Server — Thin (HTTP-only) Client
5
+ *
6
+ * This is the npm-published version of the MCP server.
7
+ * It delegates ALL evaluation to the remote TruthGuard server via HTTP.
8
+ * No local grounding engine, rules, registry, or policy modules required.
9
+ *
10
+ * Transport: stdio with newline-delimited JSON-RPC 2.0
11
+ * Dependencies: Node built-ins only (http, https)
12
+ *
13
+ * Tools:
14
+ * verify_response — Evaluate a trace (remote)
15
+ * list_rules — List detection rules (remote)
16
+ * get_failure_info — Get failure details + remediation (remote)
17
+ * evaluate_with_policy — Evaluate with custom policy (remote)
18
+ * quick_check — Fast lightweight check (remote)
19
+ * check_trace_quality — Assess trace completeness (remote)
20
+ * get_live_traces — List recent proxy evaluations (remote)
21
+ * get_trace_report — Full report for one trace (remote)
22
+ *
23
+ * Usage (VS Code mcp.json):
24
+ * {
25
+ * "servers": {
26
+ * "truthguard": {
27
+ * "command": "npx",
28
+ * "args": ["-y", "truthguard-ai", "mcp"],
29
+ * "env": {
30
+ * "TRUTHGUARD_API_KEY": "tg_live_...",
31
+ * "TRUTHGUARD_SERVER": "https://app.truthguard.dev"
32
+ * }
33
+ * }
34
+ * }
35
+ * }
36
+ */
37
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
38
+ if (k2 === undefined) k2 = k;
39
+ var desc = Object.getOwnPropertyDescriptor(m, k);
40
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
41
+ desc = { enumerable: true, get: function() { return m[k]; } };
42
+ }
43
+ Object.defineProperty(o, k2, desc);
44
+ }) : (function(o, m, k, k2) {
45
+ if (k2 === undefined) k2 = k;
46
+ o[k2] = m[k];
47
+ }));
48
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
49
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
50
+ }) : function(o, v) {
51
+ o["default"] = v;
52
+ });
53
+ var __importStar = (this && this.__importStar) || (function () {
54
+ var ownKeys = function(o) {
55
+ ownKeys = Object.getOwnPropertyNames || function (o) {
56
+ var ar = [];
57
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
58
+ return ar;
59
+ };
60
+ return ownKeys(o);
61
+ };
62
+ return function (mod) {
63
+ if (mod && mod.__esModule) return mod;
64
+ var result = {};
65
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
66
+ __setModuleDefault(result, mod);
67
+ return result;
68
+ };
69
+ })();
70
+ Object.defineProperty(exports, "__esModule", { value: true });
71
+ exports.startMCPServer = startMCPServer;
72
+ // ---------------------------------------------------------------------------
73
+ // Config
74
+ // ---------------------------------------------------------------------------
75
+ const TG_API_KEY = process.env.TRUTHGUARD_API_KEY ?? '';
76
+ const TG_SERVER = (process.env.TRUTHGUARD_SERVER ?? 'https://app.truthguard.dev').replace(/\/$/, '');
77
+ // ---------------------------------------------------------------------------
78
+ // Minimal HTTP client — Node built-ins only
79
+ // ---------------------------------------------------------------------------
80
+ async function tgFetch(method, path, body) {
81
+ const httpsModule = await Promise.resolve().then(() => __importStar(require('https')));
82
+ const httpModule = await Promise.resolve().then(() => __importStar(require('http')));
83
+ const url = new URL(TG_SERVER + path);
84
+ const isHttps = url.protocol === 'https:';
85
+ const lib = isHttps ? httpsModule : httpModule;
86
+ const bodyStr = body !== undefined ? JSON.stringify(body) : undefined;
87
+ return new Promise((resolve, reject) => {
88
+ const req = lib.request({
89
+ hostname: url.hostname,
90
+ port: url.port || (isHttps ? 443 : undefined),
91
+ path: url.pathname + url.search,
92
+ method,
93
+ headers: {
94
+ 'Content-Type': 'application/json',
95
+ 'Authorization': `Bearer ${TG_API_KEY}`,
96
+ ...(bodyStr ? { 'Content-Length': Buffer.byteLength(bodyStr) } : {}),
97
+ },
98
+ timeout: 30000,
99
+ }, (res) => {
100
+ let data = '';
101
+ res.on('data', (chunk) => { data += chunk.toString(); });
102
+ res.on('end', () => {
103
+ if (!res.statusCode || res.statusCode >= 400) {
104
+ reject(new Error(`TruthGuard API ${res.statusCode}: ${data.slice(0, 300)}`));
105
+ return;
106
+ }
107
+ try {
108
+ resolve(JSON.parse(data));
109
+ }
110
+ catch {
111
+ reject(new Error(`Invalid JSON from TruthGuard API: ${data.slice(0, 200)}`));
112
+ }
113
+ });
114
+ });
115
+ req.on('error', reject);
116
+ req.on('timeout', () => { req.destroy(); reject(new Error('TruthGuard API request timed out')); });
117
+ if (bodyStr)
118
+ req.write(bodyStr);
119
+ req.end();
120
+ });
121
+ }
122
+ // ---------------------------------------------------------------------------
123
+ // Trace normalizer — pure data transformation, no engine deps
124
+ // ---------------------------------------------------------------------------
125
+ const ROLE_MAP = {
126
+ system: 'system_prompt',
127
+ user: 'user_input',
128
+ tool: 'tool_output',
129
+ };
130
+ function normalizeTrace(raw) {
131
+ const trace = raw;
132
+ if (!Array.isArray(trace.steps))
133
+ return trace;
134
+ // Pass 1: Normalise OpenAI-style roles
135
+ const lastAssistantIdx = trace.steps.reduce((acc, s, idx) => (s.role === 'assistant' ? idx : acc), -1);
136
+ for (let i = 0; i < trace.steps.length; i++) {
137
+ const step = trace.steps[i];
138
+ const rawRole = step.role;
139
+ if (ROLE_MAP[rawRole]) {
140
+ step.role = ROLE_MAP[rawRole];
141
+ }
142
+ else if (rawRole === 'assistant') {
143
+ const s = trace.steps[i];
144
+ if (s.toolCalls && s.toolCalls.length > 0)
145
+ step.role = 'tool_call';
146
+ else if (i === lastAssistantIdx)
147
+ step.role = 'final_response';
148
+ else
149
+ step.role = 'llm_call';
150
+ }
151
+ }
152
+ // Pass 2: Auto-generate stepIds and populate toolOutputs
153
+ for (let i = 0; i < trace.steps.length; i++) {
154
+ const step = trace.steps[i];
155
+ if (!step.stepId)
156
+ step.stepId = `step_${i + 1}`;
157
+ if (step.role === 'tool_output' &&
158
+ (!step.toolOutputs || step.toolOutputs.length === 0) &&
159
+ step.content && step.content.trim().length > 0) {
160
+ let parsed = step.content;
161
+ try {
162
+ parsed = JSON.parse(step.content);
163
+ }
164
+ catch { /* plain text */ }
165
+ let toolName = 'unknown';
166
+ if (i > 0) {
167
+ const prev = trace.steps[i - 1];
168
+ if (prev.role === 'tool_call' && prev.toolCalls?.[0]?.toolName) {
169
+ toolName = prev.toolCalls[0].toolName;
170
+ }
171
+ }
172
+ step.toolOutputs = [{ toolName, output: parsed }];
173
+ }
174
+ if (step.role === 'tool_call' &&
175
+ (!step.toolCalls || step.toolCalls.length === 0) &&
176
+ step.content && step.content.trim().length > 0) {
177
+ const match = step.content.match(/^Tool call:\s*(.+)/i);
178
+ const toolName = match ? match[1].trim() : 'unknown';
179
+ step.toolCalls = [{ toolName, parameters: {} }];
180
+ }
181
+ }
182
+ // Infer startedAt from tool_call parameters
183
+ if (!trace.startedAt) {
184
+ let earliest;
185
+ for (const step of trace.steps) {
186
+ if (step.role === 'tool_call') {
187
+ for (const tc of step.toolCalls ?? []) {
188
+ const paramStr = JSON.stringify(tc.parameters ?? {});
189
+ const dateMatches = paramStr.match(/\d{4}-\d{2}-\d{2}/g);
190
+ if (dateMatches) {
191
+ for (const d of dateMatches) {
192
+ if (!earliest || d < earliest)
193
+ earliest = d;
194
+ }
195
+ }
196
+ }
197
+ }
198
+ }
199
+ if (earliest)
200
+ trace.startedAt = earliest + 'T00:00:00Z';
201
+ }
202
+ return trace;
203
+ }
204
+ const TOOL_DEFINITIONS = [
205
+ {
206
+ name: 'verify_response',
207
+ description: 'Evaluate an AI agent trace for grounding failures. Returns grounding score, detected failures with severity, and diagnostic advice with remediation hints.',
208
+ inputSchema: {
209
+ type: 'object',
210
+ properties: {
211
+ trace: {
212
+ type: 'object',
213
+ description: 'The agent execution trace. Must have traceId (string) and steps (array of {stepId, role, content, toolCalls?, toolOutputs?}).',
214
+ properties: {
215
+ traceId: { type: 'string' },
216
+ steps: { type: 'array', items: { type: 'object', properties: { stepId: { type: 'string' }, role: { type: 'string' }, content: { type: 'string' }, toolCalls: { type: 'array' }, toolOutputs: { type: 'array' } }, required: ['role', 'content'] } },
217
+ },
218
+ required: ['traceId', 'steps'],
219
+ },
220
+ mode: { type: 'string', description: '"guardrail" (default) or "analytics"', enum: ['guardrail', 'analytics'] },
221
+ },
222
+ required: ['trace'],
223
+ },
224
+ },
225
+ {
226
+ name: 'list_rules',
227
+ description: 'List all TruthGuard detection rules with severity, category, and description.',
228
+ inputSchema: {
229
+ type: 'object',
230
+ properties: {
231
+ category: { type: 'string', description: 'Filter: "grounding", "reasoning", or "safety"', enum: ['grounding', 'reasoning', 'safety'] },
232
+ },
233
+ },
234
+ },
235
+ {
236
+ name: 'get_failure_info',
237
+ description: 'Get detailed info about a failure type: description, severity, and remediation hints.',
238
+ inputSchema: {
239
+ type: 'object',
240
+ properties: {
241
+ failureType: { type: 'string', description: 'e.g. "grounding.empty_fabrication"' },
242
+ },
243
+ required: ['failureType'],
244
+ },
245
+ },
246
+ {
247
+ name: 'evaluate_with_policy',
248
+ description: 'Evaluate a trace with custom enforcement policy. Each failure type can block, warn, or be observed.',
249
+ inputSchema: {
250
+ type: 'object',
251
+ properties: {
252
+ trace: { type: 'object', description: 'Same format as verify_response', properties: { traceId: { type: 'string' }, steps: { type: 'array' } }, required: ['traceId', 'steps'] },
253
+ policy: { type: 'object', description: 'Policy overrides', properties: { rules: { type: 'object' }, fallbackAction: { type: 'string', enum: ['block', 'warn', 'observe'] }, minimumSeverity: { type: 'string', enum: ['critical', 'high', 'medium', 'low'] } } },
254
+ },
255
+ required: ['trace'],
256
+ },
257
+ },
258
+ {
259
+ name: 'quick_check',
260
+ description: 'Fast lightweight check (~500 tokens, <1s). Detects empty fabrication, missing tool calls, incomplete response, data mismatches.',
261
+ inputSchema: {
262
+ type: 'object',
263
+ properties: {
264
+ trace: { type: 'object', description: 'Same format as verify_response', properties: { traceId: { type: 'string' }, steps: { type: 'array' } }, required: ['traceId', 'steps'] },
265
+ },
266
+ required: ['trace'],
267
+ },
268
+ },
269
+ {
270
+ name: 'check_trace_quality',
271
+ description: 'Assess trace completeness before evaluation. Returns quality level (HIGH/MEDIUM/LOW), checklist, and recommendations.',
272
+ inputSchema: {
273
+ type: 'object',
274
+ properties: {
275
+ trace: { type: 'object', description: 'The trace to check', properties: { traceId: { type: 'string' }, steps: { type: 'array' } }, required: ['traceId', 'steps'] },
276
+ },
277
+ required: ['trace'],
278
+ },
279
+ },
280
+ {
281
+ name: 'get_live_traces',
282
+ description: 'List recent AI evaluations captured by the TruthGuard proxy. Returns scores, failure counts, and trace IDs.',
283
+ inputSchema: {
284
+ type: 'object',
285
+ properties: {
286
+ limit: { type: 'number', description: 'Max traces to return (default: 10, max: 50)' },
287
+ minScore: { type: 'number', description: 'Only traces with score <= this value (0.0–1.0)' },
288
+ },
289
+ },
290
+ },
291
+ {
292
+ name: 'get_trace_report',
293
+ description: 'Full grounding analysis for a specific conversation. Returns trace, claims with verdicts, failures, and advice.',
294
+ inputSchema: {
295
+ type: 'object',
296
+ properties: {
297
+ traceId: { type: 'string', description: 'Trace ID from get_live_traces' },
298
+ },
299
+ required: ['traceId'],
300
+ },
301
+ },
302
+ ];
303
+ async function dispatchTool(toolName, toolArgs) {
304
+ if (!TG_API_KEY) {
305
+ return {
306
+ content: [{
307
+ type: 'text',
308
+ text: 'TruthGuard MCP requires a server API key.\n\n' +
309
+ 'Set TRUTHGUARD_API_KEY in your MCP env config:\n\n' +
310
+ '{\n "servers": {\n "truthguard": {\n "command": "npx",\n' +
311
+ ' "args": ["-y", "truthguard-ai", "mcp"],\n "env": {\n' +
312
+ ' "TRUTHGUARD_API_KEY": "tg_live_your_key",\n' +
313
+ ' "TRUTHGUARD_SERVER": "https://app.truthguard.dev"\n' +
314
+ ' }\n }\n }\n}\n\n' +
315
+ 'Get your API key at https://app.truthguard.dev',
316
+ }],
317
+ isError: true,
318
+ };
319
+ }
320
+ switch (toolName) {
321
+ case 'verify_response': {
322
+ const trace = normalizeTrace(toolArgs.trace);
323
+ const mode = toolArgs.mode === 'analytics' ? 'analytics' : 'guardrail';
324
+ const report = await tgFetch('POST', '/api/evaluate', { trace, mode });
325
+ const visible = report.detectedFailures.filter((f) => f.role !== 'suppressed');
326
+ const confirmed = visible.filter((f) => f.confidence === 'high');
327
+ const possible = visible.filter((f) => f.confidence === 'medium');
328
+ const fmtF = (f) => {
329
+ const icon = f.severity === 'critical' ? '🔴' : f.severity === 'high' ? '🟠' : f.severity === 'medium' ? '🟡' : '⚪';
330
+ return ` ${icon} ${f.type} (${f.severity}) — ${f.description}`;
331
+ };
332
+ const verifiable = report.claimsTotal - report.claimsSkipped;
333
+ let findings = '';
334
+ if (confirmed.length > 0)
335
+ findings += `✅ CONFIRMED issues (high confidence):\n${confirmed.map(fmtF).join('\n')}`;
336
+ if (possible.length > 0) {
337
+ if (findings)
338
+ findings += '\n\n';
339
+ findings += `⚠️ POSSIBLE issues (medium confidence):\n${possible.map(fmtF).join('\n')}`;
340
+ }
341
+ if (visible.length === 0)
342
+ findings = "No issues detected in the agent's behaviour.";
343
+ const summary = `📋 TruthGuard Agent Diagnosis:\n\nScore: ${report.groundingScore.toFixed(2)} (${report.claimsVerified}/${verifiable} claims verified)\n\n${findings}`;
344
+ return { content: [{ type: 'text', text: `${summary}\n\n---\n${JSON.stringify(report, null, 2)}` }] };
345
+ }
346
+ case 'list_rules': {
347
+ const qs = toolArgs.category ? `?category=${encodeURIComponent(toolArgs.category)}` : '';
348
+ const data = await tgFetch('GET', `/api/rules${qs}`);
349
+ const byCategory = new Map();
350
+ for (const r of data.rules) {
351
+ const list = byCategory.get(r.category) ?? [];
352
+ list.push(r);
353
+ byCategory.set(r.category, list);
354
+ }
355
+ const formatted = Array.from(byCategory.entries())
356
+ .map(([cat, entries]) => `${cat.charAt(0).toUpperCase() + cat.slice(1)} (${entries.length}):\n` + entries.map((r) => ` ${r.type} [${r.defaultSeverity}] — ${r.description}`).join('\n'))
357
+ .join('\n\n');
358
+ return { content: [{ type: 'text', text: `Detection Rules (${data.total}):\n\n${formatted}` }] };
359
+ }
360
+ case 'get_failure_info': {
361
+ if (!toolArgs.failureType)
362
+ throw new Error('Missing required parameter: failureType');
363
+ const info = await tgFetch('GET', `/api/rules/${encodeURIComponent(toolArgs.failureType)}`);
364
+ const hintsText = info.hints.map((h) => ` [${h.type}] ${h.direction}\n Example: ${h.example}\n Caveat: ${h.caveat}`).join('\n');
365
+ return { content: [{ type: 'text', text: `${info.label} (${info.type})\nSeverity: ${info.defaultSeverity} | Action: ${info.defaultAction} | Status: ${info.status}\n\n${info.description}\n\nRemediation hints:\n${hintsText}` }] };
366
+ }
367
+ case 'evaluate_with_policy': {
368
+ if (!toolArgs.trace)
369
+ throw new Error('Missing required parameter: trace');
370
+ const trace = normalizeTrace(toolArgs.trace);
371
+ const report = await tgFetch('POST', '/api/evaluate', { trace });
372
+ const policy = toolArgs.policy;
373
+ const visible = report.detectedFailures.filter((f) => f.role !== 'suppressed');
374
+ const getAction = (f) => policy?.rules?.[f.type] ?? f.defaultAction ?? policy?.fallbackAction ?? 'observe';
375
+ const blocking = visible.filter((f) => getAction(f) === 'block');
376
+ const warning = visible.filter((f) => getAction(f) === 'warn');
377
+ const observed = visible.filter((f) => getAction(f) === 'observe');
378
+ const shouldBlock = blocking.length > 0;
379
+ const action = shouldBlock ? 'block' : warning.length > 0 ? 'warn' : 'observe';
380
+ const summary = [`Score: ${report.groundingScore.toFixed(2)}`, `Decision: ${action.toUpperCase()}${shouldBlock ? ' — BLOCKED' : ''}`,
381
+ blocking.length > 0 ? `Blocking: ${blocking.map((f) => f.type).join(', ')}` : '',
382
+ warning.length > 0 ? `Warnings: ${warning.map((f) => f.type).join(', ')}` : '',
383
+ ].filter(Boolean).join('\n');
384
+ return { content: [{ type: 'text', text: `${summary}\n\n---\n${JSON.stringify({ traceId: report.traceId, groundingScore: report.groundingScore, decision: { action, shouldBlock, blockingFailures: blocking.map((f) => f.type), warningFailures: warning.map((f) => f.type), observedFailures: observed.map((f) => f.type) } }, null, 2)}` }] };
385
+ }
386
+ case 'quick_check': {
387
+ if (!toolArgs.trace)
388
+ throw new Error('Missing required parameter: trace');
389
+ const trace = normalizeTrace(toolArgs.trace);
390
+ const result = await tgFetch('POST', '/api/quick-check', { trace });
391
+ return { content: [{ type: 'text', text: result.summary }] };
392
+ }
393
+ case 'check_trace_quality': {
394
+ if (!toolArgs.trace)
395
+ throw new Error('Missing required parameter: trace');
396
+ const trace = normalizeTrace(toolArgs.trace);
397
+ const tq = await tgFetch('POST', '/api/check-trace-quality', { trace });
398
+ const checklist = tq.checklist.map((item) => ` ${item.present ? '✔' : '✘'} ${item.element}${item.required ? ' (required)' : ''}`).join('\n');
399
+ return { content: [{ type: 'text', text: [`Trace Quality: ${tq.quality} (${tq.completeness}% complete)`, `Grounding ready: ${tq.groundingReady ? 'yes' : 'no'}`, '', checklist, ...(tq.cannotVerify.length > 0 ? ['', 'Cannot verify:', ...tq.cannotVerify.map((v) => ` • ${v}`)] : []), ...(tq.recommendations.length > 0 ? ['', 'Recommendations:', ...tq.recommendations.map((r) => ` → ${r}`)] : [])].join('\n') }] };
400
+ }
401
+ case 'get_live_traces': {
402
+ const cap = Math.min(Math.max(toolArgs.limit ?? 10, 1), 50);
403
+ const minScore = toolArgs.minScore;
404
+ const qs = `?limit=${minScore !== undefined ? 200 : cap}`;
405
+ const data = await tgFetch('GET', `/api/live${qs}`);
406
+ let filtered = data.records;
407
+ if (minScore !== undefined)
408
+ filtered = filtered.filter((r) => r.groundingScore <= minScore);
409
+ filtered = filtered.slice(0, cap);
410
+ if (filtered.length === 0) {
411
+ return { content: [{ type: 'text', text: data.total === 0 ? 'No proxy evaluations found. Make sure the TruthGuard proxy is configured.' : `No traces match the filter (${data.total} total).` }] };
412
+ }
413
+ const lines = filtered.map((r, i) => [
414
+ `${i + 1}. [${r.groundingScore.toFixed(2)}] ${r.traceId}`,
415
+ ` Question: ${r.question.slice(0, 80)}${r.question.length > 80 ? '...' : ''}`,
416
+ ` Claims: ${r.claimsVerified}/${r.claimsTotal} verified | Failures: ${r.failures}`,
417
+ ` Time: ${r.storedAt}`,
418
+ ].join('\n'));
419
+ return { content: [{ type: 'text', text: [`📋 Live Proxy Evaluations (${filtered.length}/${data.total} shown${minScore !== undefined ? `, score ≤ ${minScore}` : ''})`, '', ...lines, '', 'Use get_trace_report with a traceId to see the full analysis.'].join('\n') }] };
420
+ }
421
+ case 'get_trace_report': {
422
+ if (!toolArgs.traceId)
423
+ throw new Error('Missing required parameter: traceId');
424
+ const record = await tgFetch('GET', `/api/live/${encodeURIComponent(toolArgs.traceId)}`);
425
+ const { trace, report } = record;
426
+ const conv = [];
427
+ for (const step of trace.steps) {
428
+ if (step.role === 'user_input')
429
+ conv.push(`👤 User: ${step.content.slice(0, 200)}`);
430
+ else if (step.role === 'tool_call')
431
+ for (const tc of step.toolCalls ?? [])
432
+ conv.push(`🔧 Tool call: ${tc.toolName}(${JSON.stringify(tc.parameters).slice(0, 150)})`);
433
+ else if (step.role === 'tool_output')
434
+ for (const to of step.toolOutputs ?? []) {
435
+ const s = JSON.stringify(to.output ?? '');
436
+ conv.push(`📦 Tool output [${to.toolName}]: ${s.slice(0, 300)}${s.length > 300 ? '...' : ''}`);
437
+ }
438
+ else if (step.role === 'final_response')
439
+ conv.push(`🤖 Response: ${step.content.slice(0, 300)}${step.content.length > 300 ? '...' : ''}`);
440
+ }
441
+ const verdicts = report.verdicts.map((v) => {
442
+ const icon = v.verdict === 'GROUNDED' ? '✅' : v.verdict === 'UNVERIFIABLE' ? '⏭' : v.verdict === 'APPROXIMATE_MATCH' ? '🔶' : '❌';
443
+ return ` ${icon} [${v.verdict}] ${v.claim.type}=${JSON.stringify(v.claim.value)} — ${v.explanation ?? v.ruleUsed ?? ''}`;
444
+ });
445
+ const failures = report.detectedFailures.filter((f) => f.role !== 'suppressed').map((f) => ` 🔴 [${f.severity}] ${f.type} — ${f.description}`);
446
+ return { content: [{ type: 'text', text: [
447
+ `📋 Full Trace Report: ${trace.traceId}`,
448
+ `Score: ${report.groundingScore.toFixed(2)} (${report.claimsVerified}/${report.claimsTotal} verified, ${report.claimsFailed} failed)`,
449
+ `Stored: ${record.storedAt}`, '',
450
+ '── Conversation ──', ...conv, '',
451
+ `── Claims & Verdicts (${report.verdicts.length}) ──`, ...verdicts, '',
452
+ ...(failures.length > 0 ? [`── Detected Failures (${failures.length}) ──`, ...failures] : ['No failures detected ✅']),
453
+ ].join('\n') }] };
454
+ }
455
+ default:
456
+ throw new Error(`Unknown tool: ${toolName}`);
457
+ }
458
+ }
459
+ function jsonRpcOk(id, result) {
460
+ return JSON.stringify({ jsonrpc: '2.0', id, result });
461
+ }
462
+ function jsonRpcError(id, code, message) {
463
+ return JSON.stringify({ jsonrpc: '2.0', id, error: { code, message } });
464
+ }
465
+ async function handleRequest(request) {
466
+ const { id, method, params } = request;
467
+ if (id === undefined || id === null)
468
+ return null; // notification
469
+ switch (method) {
470
+ case 'initialize': {
471
+ const clientVersion = params?.protocolVersion;
472
+ return jsonRpcOk(id, {
473
+ protocolVersion: typeof clientVersion === 'string' ? clientVersion : '2024-11-05',
474
+ capabilities: { tools: { listChanged: false } },
475
+ serverInfo: { name: 'truthguard', version: '0.4.0' },
476
+ });
477
+ }
478
+ case 'ping':
479
+ return jsonRpcOk(id, {});
480
+ case 'tools/list':
481
+ return jsonRpcOk(id, { tools: TOOL_DEFINITIONS });
482
+ case 'tools/call': {
483
+ const toolName = params?.name;
484
+ const toolArgs = params?.arguments ?? {};
485
+ if (!toolName)
486
+ return jsonRpcError(id, -32602, 'Missing required parameter: name');
487
+ try {
488
+ const result = await dispatchTool(toolName, toolArgs);
489
+ return jsonRpcOk(id, result);
490
+ }
491
+ catch (err) {
492
+ return jsonRpcOk(id, { content: [{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` }], isError: true });
493
+ }
494
+ }
495
+ default:
496
+ return jsonRpcError(id, -32601, `Method not found: ${method}`);
497
+ }
498
+ }
499
+ // ---------------------------------------------------------------------------
500
+ // stdio transport
501
+ // ---------------------------------------------------------------------------
502
+ function startMCPServer() {
503
+ let lineBuffer = '';
504
+ process.stdin.resume();
505
+ process.stdin.setEncoding('utf-8');
506
+ if (!TG_API_KEY) {
507
+ process.stderr.write('[TruthGuard] WARNING: TRUTHGUARD_API_KEY is not set.\n' +
508
+ '[TruthGuard] All tool calls will return an error until you configure the API key.\n' +
509
+ '[TruthGuard] See https://app.truthguard.dev\n');
510
+ }
511
+ else {
512
+ process.stderr.write(`TruthGuard MCP server started (server: ${TG_SERVER})\n`);
513
+ }
514
+ process.stdin.on('data', (chunk) => {
515
+ lineBuffer += chunk;
516
+ let newlineIdx;
517
+ while ((newlineIdx = lineBuffer.indexOf('\n')) !== -1) {
518
+ const line = lineBuffer.slice(0, newlineIdx).trim();
519
+ lineBuffer = lineBuffer.slice(newlineIdx + 1);
520
+ if (line.length === 0)
521
+ continue;
522
+ try {
523
+ const request = JSON.parse(line);
524
+ handleRequest(request).then((response) => {
525
+ if (response !== null)
526
+ process.stdout.write(response + '\n');
527
+ }).catch(() => {
528
+ process.stdout.write(jsonRpcError(null, -32603, 'Internal error') + '\n');
529
+ });
530
+ }
531
+ catch {
532
+ process.stdout.write(jsonRpcError(null, -32700, 'Parse error') + '\n');
533
+ }
534
+ }
535
+ });
536
+ process.stdin.on('end', () => process.exit(0));
537
+ }
538
+ /* istanbul ignore next */
539
+ if (require.main === module) {
540
+ startMCPServer();
541
+ }
542
+ //# sourceMappingURL=thin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thin.js","sourceRoot":"","sources":["../../src/MCP/thin.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAueH,wCAqCC;AAxgBD,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;AACxD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,4BAA4B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAErG,8EAA8E;AAC9E,4CAA4C;AAC5C,8EAA8E;AAE9E,KAAK,UAAU,OAAO,CACpB,MAAsB,EACtB,IAAY,EACZ,IAAc;IAEd,MAAM,WAAW,GAAG,wDAAa,OAAO,GAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,wDAAa,MAAM,GAAC,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtE,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CACrB;YACE,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7C,IAAI,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM;YAC/B,MAAM;YACN,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,UAAU,EAAE;gBACvC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrE;YACD,OAAO,EAAE,KAAM;SAChB,EACD,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;oBAC7C,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC7E,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC,CAAC;gBAAC,CAAC;gBACvC,MAAM,CAAC;oBAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAAC,CAAC;YACzF,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnG,IAAI,OAAO;YAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,8DAA8D;AAC9D,8EAA8E;AAE9E,MAAM,QAAQ,GAA2B;IACvC,MAAM,EAAE,eAAe;IACvB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,aAAa;CACpB,CAAC;AAEF,SAAS,cAAc,CAAC,GAA4B;IAClD,MAAM,KAAK,GAAG,GAAuB,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9C,uCAAuC;IACvC,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CACzC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAE,CAAC,CAAC,IAAe,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CACtE,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAuC,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAc,CAAC;QACpC,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;iBAC9D,IAAI,CAAC,KAAK,gBAAgB;gBAAE,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;;gBACzD,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAEhD,IACE,IAAI,CAAC,IAAI,KAAK,aAAa;YAC3B,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAC9C,CAAC;YACD,IAAI,MAAM,GAAY,IAAI,CAAC,OAAO,CAAC;YACnC,IAAI,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;YACrE,IAAI,QAAQ,GAAG,SAAS,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACV,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChC,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;oBAC/D,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACxC,CAAC;YACH,CAAC;YACD,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,IACE,IAAI,CAAC,IAAI,KAAK,WAAW;YACzB,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAC9C,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACrD,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,IAAI,QAA4B,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;oBACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;oBACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;oBACzD,IAAI,WAAW,EAAE,CAAC;wBAChB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;4BAC5B,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,QAAQ;gCAAE,QAAQ,GAAG,CAAC,CAAC;wBAC9C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,QAAQ;YAAE,KAAK,CAAC,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC1D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAYD,MAAM,gBAAgB,GAAwB;IAC5C;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,4JAA4J;QACzK,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+HAA+H;oBAC5I,UAAU,EAAE;wBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE;qBACpP;oBACD,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;iBAC/B;gBACD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE;aAChH;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,+EAA+E;QAC5F,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE;aACvI;SACF;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,uFAAuF;QACpG,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oCAAoC,EAAE;aACnF;YACD,QAAQ,EAAE,CAAC,aAAa,CAAC;SAC1B;KACF;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,qGAAqG;QAClH,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE;gBAC/K,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE;aACjQ;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,iIAAiI;QAC9I,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE;aAChL;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,uHAAuH;QACpI,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE;aACpK;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,6GAA6G;QAC1H,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6CAA6C,EAAE;gBACrF,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gDAAgD,EAAE;aAC5F;SACF;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,iHAAiH;QAC9H,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;aAC1E;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;CACF,CAAC;AAQF,KAAK,UAAU,YAAY,CACzB,QAAgB,EAChB,QAAiC;IAEjC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,+CAA+C;wBACnD,oDAAoD;wBACpD,mEAAmE;wBACnE,iEAAiE;wBACjE,qDAAqD;wBACrD,6DAA6D;wBAC7D,4BAA4B;wBAC5B,gDAAgD;iBACnD,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,KAAgC,CAAC,CAAC;YACxE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;YACvE,MAAM,MAAM,GAAG,MAAM,OAAO,CAKzB,MAAM,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAE7C,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAC/E,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC;YAClE,MAAM,IAAI,GAAG,CAAC,CAAoB,EAAE,EAAE;gBACpC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;gBACpH,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAClE,CAAC,CAAC;YACF,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC;YAC7D,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,QAAQ,IAAI,0CAA0C,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACjH,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAAC,IAAI,QAAQ;oBAAE,QAAQ,IAAI,MAAM,CAAC;gBAAC,QAAQ,IAAI,4CAA4C,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,CAAC;YACvJ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,QAAQ,GAAG,8CAA8C,CAAC;YACpF,MAAM,OAAO,GAAG,4CAA4C,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,cAAc,IAAI,UAAU,wBAAwB,QAAQ,EAAE,CAAC;YACvK,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,YAAY,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACxG,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,kBAAkB,CAAC,QAAQ,CAAC,QAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnG,MAAM,IAAI,GAAG,MAAM,OAAO,CAAoH,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;YACxK,MAAM,UAAU,GAAG,IAAI,GAAG,EAA6B,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAAC,CAAC;YAC9H,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;iBAC/C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,eAAe,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACxL,IAAI,CAAC,MAAM,CAAC,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,IAAI,CAAC,KAAK,SAAS,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;QACnG,CAAC;QAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,WAAW;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACtF,MAAM,IAAI,GAAG,MAAM,OAAO,CAGvB,KAAK,EAAE,cAAc,kBAAkB,CAAC,QAAQ,CAAC,WAAqB,CAAC,EAAE,CAAC,CAAC;YAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,SAAS,kBAAkB,CAAC,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvI,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,gBAAgB,IAAI,CAAC,eAAe,cAAc,IAAI,CAAC,aAAa,cAAc,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,WAAW,2BAA2B,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;QACtO,CAAC;QAED,KAAK,sBAAsB,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC1E,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,KAAgC,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,MAAM,OAAO,CAGzB,MAAM,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAiF,CAAC;YAC1G,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAC/E,MAAM,SAAS,GAAG,CAAC,CAAoB,EAAU,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,IAAI,MAAM,EAAE,cAAc,IAAI,SAAS,CAAC;YACtI,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;YACnE,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/E,MAAM,OAAO,GAAG,CAAC,UAAU,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,aAAa,MAAM,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE;gBAClI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;gBAChF,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;aAC/E,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,YAAY,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAClV,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,QAAQ,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC1E,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,KAAgC,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAmG,MAAM,EAAE,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACtK,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC/D,CAAC;QAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC1E,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,KAAgC,CAAC,CAAC;YACxE,MAAM,EAAE,GAAG,MAAM,OAAO,CAIrB,MAAM,EAAE,0BAA0B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9I,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,YAAY,aAAa,EAAE,oBAAoB,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9Z,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAE,QAAQ,CAAC,KAA4B,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpF,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAA8B,CAAC;YACzD,MAAM,EAAE,GAAG,UAAU,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YAC1D,MAAM,IAAI,GAAG,MAAM,OAAO,CAGvB,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAC5B,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;YAC5B,IAAI,QAAQ,KAAK,SAAS;gBAAE,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,IAAI,QAAQ,CAAC,CAAC;YAC5F,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAClC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,2EAA2E,CAAC,CAAC,CAAC,+BAA+B,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC,EAAE,CAAC;YACrM,CAAC;YACD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;gBACzD,gBAAgB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/E,cAAc,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,WAAW,yBAAyB,CAAC,CAAC,QAAQ,EAAE;gBACpF,YAAY,CAAC,CAAC,QAAQ,EAAE;aACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,8BAA8B,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,SAAS,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,+DAA+D,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7Q,CAAC;QAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YAC9E,MAAM,MAAM,GAAG,MAAM,OAAO,CAIzB,KAAK,EAAE,aAAa,kBAAkB,CAAC,QAAQ,CAAC,OAAiB,CAAC,EAAE,CAAC,CAAC;YACzE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;YACjC,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;oBAAE,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;qBAC/E,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;oBAAE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE;wBAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;qBAChK,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;oBAAE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;wBAAC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;wBAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,QAAQ,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAAC,CAAC;qBACxN,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB;oBAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5I,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACzC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;gBAClI,OAAO,KAAK,IAAI,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC5H,CAAC,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAChJ,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;4BACvC,yBAAyB,KAAK,CAAC,OAAO,EAAE;4BACxC,UAAU,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,WAAW,cAAc,MAAM,CAAC,YAAY,UAAU;4BACrI,WAAW,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE;4BAChC,oBAAoB,EAAE,GAAG,IAAI,EAAE,EAAE;4BACjC,yBAAyB,MAAM,CAAC,QAAQ,CAAC,MAAM,MAAM,EAAE,GAAG,QAAQ,EAAE,EAAE;4BACtE,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,QAAQ,CAAC,MAAM,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;yBACtH,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACpB,CAAC;QAED;YACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAaD,SAAS,SAAS,CAAC,EAAmB,EAAE,MAAe;IACrD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,YAAY,CAAC,EAA0B,EAAE,IAAY,EAAE,OAAe;IAC7E,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,OAAuB;IAClD,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACvC,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,CAAC,eAAe;IAEjE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,aAAa,GAAI,MAAkC,EAAE,eAAe,CAAC;YAC3E,OAAO,SAAS,CAAC,EAAE,EAAE;gBACnB,eAAe,EAAE,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY;gBACjF,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE;gBAC/C,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE;aACrD,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3B,KAAK,YAAY;YACf,OAAO,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACpD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,QAAQ,GAAI,MAAkC,EAAE,IAAc,CAAC;YACrE,MAAM,QAAQ,GAAK,MAAkC,EAAE,SAAqC,IAAI,EAAE,CAAC;YACnG,IAAI,CAAC,QAAQ;gBAAE,OAAO,YAAY,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,kCAAkC,CAAC,CAAC;YACnF,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACtD,OAAO,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3I,CAAC;QACH,CAAC;QACD;YACE,OAAO,YAAY,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,qBAAqB,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,SAAgB,cAAc;IAC5B,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAEnC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wDAAwD;YACxD,qFAAqF;YACrF,+CAA+C,CAChD,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,SAAS,KAAK,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QACzC,UAAU,IAAI,KAAK,CAAC;QACpB,IAAI,UAAkB,CAAC;QACvB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;YACpD,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;gBACnD,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACvC,IAAI,QAAQ,KAAK,IAAI;wBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;oBACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC5E,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,0BAA0B;AAC1B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,cAAc,EAAE,CAAC;AACnB,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * TruthGuard CLI — Thin (npm-published) entry point.
4
+ * Currently supports only the `mcp` subcommand which starts the MCP server.
5
+ */
6
+ declare const arg: string;
7
+ //# sourceMappingURL=cli-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-entry.d.ts","sourceRoot":"","sources":["../src/cli-entry.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,QAAA,MAAM,GAAG,QAAkB,CAAC"}
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * TruthGuard CLI — Thin (npm-published) entry point.
5
+ * Currently supports only the `mcp` subcommand which starts the MCP server.
6
+ */
7
+ const arg = process.argv[2];
8
+ if (arg === 'mcp') {
9
+ // Dynamic import to keep startup fast for other future commands
10
+ require('./MCP/thin').startMCPServer();
11
+ }
12
+ else {
13
+ const pkg = require('../package.json');
14
+ console.log(`truthguard-ai v${pkg.version}`);
15
+ console.log('');
16
+ console.log('Usage:');
17
+ console.log(' truthguard-ai mcp Start MCP server (stdio) for VS Code / Cursor');
18
+ console.log('');
19
+ console.log('MCP requires TRUTHGUARD_API_KEY env variable.');
20
+ console.log('Get your key at https://app.truthguard.dev');
21
+ process.exit(arg === '--help' || arg === '-h' ? 0 : 1);
22
+ }
23
+ //# sourceMappingURL=cli-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-entry.js","sourceRoot":"","sources":["../src/cli-entry.ts"],"names":[],"mappings":";;AACA;;;GAGG;AAEH,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE5B,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;IAClB,gEAAgE;IAChE,OAAO,CAAC,YAAY,CAAC,CAAC,cAAc,EAAE,CAAC;AACzC,CAAC;KAAM,CAAC;IACN,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC"}
package/package.json CHANGED
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "name": "truthguard-ai",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "TruthGuard — Standardized grounding validation for tool-calling AI agents. Detect, diagnose, and prevent grounding failures.",
5
5
  "main": "dist-npm/thin.js",
6
6
  "types": "dist-npm/thin.d.ts",
7
+ "bin": {
8
+ "truthguard-ai": "dist-npm/cli-entry.js"
9
+ },
7
10
  "files": [
8
11
  "dist-npm/",
9
12
  "README.md",