@governed-ai/runtime 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +251 -0
  2. package/dist/domains/finance/entity_rules.d.ts +4 -0
  3. package/dist/domains/finance/entity_rules.d.ts.map +1 -0
  4. package/dist/domains/finance/entity_rules.js +19 -0
  5. package/dist/domains/finance/entity_rules.js.map +1 -0
  6. package/dist/domains/finance/policy.yaml +85 -0
  7. package/dist/domains/health/entity_rules.d.ts +4 -0
  8. package/dist/domains/health/entity_rules.d.ts.map +1 -0
  9. package/dist/domains/health/entity_rules.js +20 -0
  10. package/dist/domains/health/entity_rules.js.map +1 -0
  11. package/dist/domains/health/policy.yaml +95 -0
  12. package/dist/domains/insurance/entity_rules.d.ts +4 -0
  13. package/dist/domains/insurance/entity_rules.d.ts.map +1 -0
  14. package/dist/domains/insurance/entity_rules.js +19 -0
  15. package/dist/domains/insurance/entity_rules.js.map +1 -0
  16. package/dist/domains/insurance/policy.yaml +88 -0
  17. package/dist/domains/registry.d.ts +20 -0
  18. package/dist/domains/registry.d.ts.map +1 -0
  19. package/dist/domains/registry.js +65 -0
  20. package/dist/domains/registry.js.map +1 -0
  21. package/dist/domains/types.d.ts +12 -0
  22. package/dist/domains/types.d.ts.map +1 -0
  23. package/dist/domains/types.js +2 -0
  24. package/dist/domains/types.js.map +1 -0
  25. package/dist/index.d.ts +32 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +15 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/sdk/governance.d.ts +121 -0
  30. package/dist/sdk/governance.d.ts.map +1 -0
  31. package/dist/sdk/governance.js +219 -0
  32. package/dist/sdk/governance.js.map +1 -0
  33. package/dist/src/api/index.d.ts +2 -0
  34. package/dist/src/api/index.d.ts.map +1 -0
  35. package/dist/src/api/index.js +2 -0
  36. package/dist/src/api/index.js.map +1 -0
  37. package/dist/src/certification/test_runner.d.ts +86 -0
  38. package/dist/src/certification/test_runner.d.ts.map +1 -0
  39. package/dist/src/certification/test_runner.js +422 -0
  40. package/dist/src/certification/test_runner.js.map +1 -0
  41. package/dist/src/classification/index.d.ts +2 -0
  42. package/dist/src/classification/index.d.ts.map +1 -0
  43. package/dist/src/classification/index.js +2 -0
  44. package/dist/src/classification/index.js.map +1 -0
  45. package/dist/src/classification/query_classifier.d.ts +13 -0
  46. package/dist/src/classification/query_classifier.d.ts.map +1 -0
  47. package/dist/src/classification/query_classifier.js +142 -0
  48. package/dist/src/classification/query_classifier.js.map +1 -0
  49. package/dist/src/config/index.d.ts +2 -0
  50. package/dist/src/config/index.d.ts.map +1 -0
  51. package/dist/src/config/index.js +2 -0
  52. package/dist/src/config/index.js.map +1 -0
  53. package/dist/src/context/index.d.ts +2 -0
  54. package/dist/src/context/index.d.ts.map +1 -0
  55. package/dist/src/context/index.js +2 -0
  56. package/dist/src/context/index.js.map +1 -0
  57. package/dist/src/gateway/index.d.ts +2 -0
  58. package/dist/src/gateway/index.d.ts.map +1 -0
  59. package/dist/src/gateway/index.js +2 -0
  60. package/dist/src/gateway/index.js.map +1 -0
  61. package/dist/src/gateway/pre_interaction_governance.d.ts +34 -0
  62. package/dist/src/gateway/pre_interaction_governance.d.ts.map +1 -0
  63. package/dist/src/gateway/pre_interaction_governance.js +187 -0
  64. package/dist/src/gateway/pre_interaction_governance.js.map +1 -0
  65. package/dist/src/interfaces/entity.d.ts +16 -0
  66. package/dist/src/interfaces/entity.d.ts.map +1 -0
  67. package/dist/src/interfaces/entity.js +2 -0
  68. package/dist/src/interfaces/entity.js.map +1 -0
  69. package/dist/src/normalization/index.d.ts +2 -0
  70. package/dist/src/normalization/index.d.ts.map +1 -0
  71. package/dist/src/normalization/index.js +2 -0
  72. package/dist/src/normalization/index.js.map +1 -0
  73. package/dist/src/normalization/response_normalizer.d.ts +30 -0
  74. package/dist/src/normalization/response_normalizer.d.ts.map +1 -0
  75. package/dist/src/normalization/response_normalizer.js +224 -0
  76. package/dist/src/normalization/response_normalizer.js.map +1 -0
  77. package/dist/src/orchestrator.d.ts +21 -0
  78. package/dist/src/orchestrator.d.ts.map +1 -0
  79. package/dist/src/orchestrator.js +355 -0
  80. package/dist/src/orchestrator.js.map +1 -0
  81. package/dist/src/policy/index.d.ts +3 -0
  82. package/dist/src/policy/index.d.ts.map +1 -0
  83. package/dist/src/policy/index.js +2 -0
  84. package/dist/src/policy/index.js.map +1 -0
  85. package/dist/src/policy/policy_engine.d.ts +47 -0
  86. package/dist/src/policy/policy_engine.d.ts.map +1 -0
  87. package/dist/src/policy/policy_engine.js +100 -0
  88. package/dist/src/policy/policy_engine.js.map +1 -0
  89. package/dist/src/reasoning/index.d.ts +2 -0
  90. package/dist/src/reasoning/index.d.ts.map +1 -0
  91. package/dist/src/reasoning/index.js +2 -0
  92. package/dist/src/reasoning/index.js.map +1 -0
  93. package/dist/src/reasoning/reasoning_validator.d.ts +28 -0
  94. package/dist/src/reasoning/reasoning_validator.d.ts.map +1 -0
  95. package/dist/src/reasoning/reasoning_validator.js +277 -0
  96. package/dist/src/reasoning/reasoning_validator.js.map +1 -0
  97. package/dist/src/reasoning/trace_validator.d.ts +33 -0
  98. package/dist/src/reasoning/trace_validator.d.ts.map +1 -0
  99. package/dist/src/reasoning/trace_validator.js +251 -0
  100. package/dist/src/reasoning/trace_validator.js.map +1 -0
  101. package/dist/src/state/interaction_state.d.ts +59 -0
  102. package/dist/src/state/interaction_state.d.ts.map +1 -0
  103. package/dist/src/state/interaction_state.js +75 -0
  104. package/dist/src/state/interaction_state.js.map +1 -0
  105. package/dist/src/telemetry/governance_logger.d.ts +36 -0
  106. package/dist/src/telemetry/governance_logger.d.ts.map +1 -0
  107. package/dist/src/telemetry/governance_logger.js +32 -0
  108. package/dist/src/telemetry/governance_logger.js.map +1 -0
  109. package/dist/src/telemetry/index.d.ts +2 -0
  110. package/dist/src/telemetry/index.d.ts.map +1 -0
  111. package/dist/src/telemetry/index.js +2 -0
  112. package/dist/src/telemetry/index.js.map +1 -0
  113. package/dist/src/telemetry/metrics.d.ts +49 -0
  114. package/dist/src/telemetry/metrics.d.ts.map +1 -0
  115. package/dist/src/telemetry/metrics.js +115 -0
  116. package/dist/src/telemetry/metrics.js.map +1 -0
  117. package/dist/src/tools/tool_guard.d.ts +39 -0
  118. package/dist/src/tools/tool_guard.d.ts.map +1 -0
  119. package/dist/src/tools/tool_guard.js +226 -0
  120. package/dist/src/tools/tool_guard.js.map +1 -0
  121. package/dist/src/types/index.d.ts +65 -0
  122. package/dist/src/types/index.d.ts.map +1 -0
  123. package/dist/src/types/index.js +2 -0
  124. package/dist/src/types/index.js.map +1 -0
  125. package/domains/finance/policy.yaml +85 -0
  126. package/domains/health/policy.yaml +95 -0
  127. package/domains/insurance/policy.yaml +88 -0
  128. package/package.json +58 -0
@@ -0,0 +1,277 @@
1
+ const MEDICATION_FABRICATION_PATTERNS = [
2
+ /(?:taking|prescribed|on)\s+(?:metformin|atorvastatin|lisinopril|amlodipine|losartan|omeprazole|aspirin|warfarin|insulin|levothyroxine|metoprolol)/i,
3
+ /current\s+medication(?:s)?\s*(?:include|are|:)/i,
4
+ /medication\s+(?:regimen|list|history)\s*(?:include|show|:)/i,
5
+ /the\s+patient\s+is\s+(?:currently\s+)?(?:taking|on)\s+\w+\s+(?:medication|drug)/i,
6
+ ];
7
+ const BP_FABRICATION_PATTERNS = [
8
+ /blood\s+pressure\s+(?:is|was|reading(?:s)?)\s*(?:of\s*)?\d+\s*\/\s*\d+/i,
9
+ /bp\s*(?:is|was|:)\s*\d+\s*\/\s*\d+/i,
10
+ /systolic\s+\d+.*diastolic\s+\d+/i,
11
+ ];
12
+ const SYMPTOM_FABRICATION_PATTERNS = [
13
+ /symptoms?\s+(?:include|are|show|present)/i,
14
+ /(?:presenting|reported)\s+(?:with\s+)?symptoms?\s+(?:of|such|like|including)/i,
15
+ /the\s+patient\s+(?:reports?|exhibits?|shows?|complains?\s+of)\s+(?:fatigue|pain|nausea|dizziness|headache|fever)/i,
16
+ ];
17
+ const DIAGNOSIS_PATTERNS = [
18
+ /(?:the\s+)?diagnosis\s+is\b/i,
19
+ /(?:diagnosed\s+with|has\s+been\s+diagnosed)\s+\w/i,
20
+ /i\s+diagnose/i,
21
+ /your\s+diagnosis\s+is/i,
22
+ /confirms?\s+(?:a\s+)?diagnosis\s+of/i,
23
+ ];
24
+ const DOSAGE_PATTERNS = [
25
+ /take\s+\d+\s*(?:mg|mcg|ml|units?)\s+(?:of\s+)?\w/i,
26
+ /(?:recommended|suggested)\s+(?:dose|dosage)\s+(?:is|of)\s+\d+/i,
27
+ /start\s+(?:with\s+)?\d+\s*mg/i,
28
+ ];
29
+ const PRIVACY_LEAK_PATTERNS = [
30
+ /patient\s+(?:1|2|3|a|b|c)\s*(?::|has|shows)/i,
31
+ ];
32
+ export class PostInteractionGovernance {
33
+ evaluate(query, response, retrievalContext, queryType) {
34
+ const violations = [];
35
+ const responseLower = response.toLowerCase();
36
+ this.checkHallucinations(responseLower, retrievalContext, violations);
37
+ this.checkUnsafeContent(responseLower, queryType, violations);
38
+ this.checkPrivacyLeak(responseLower, queryType, violations);
39
+ if (violations.length === 0) {
40
+ let enriched = this.enrichMissingDataResponse(response, query, retrievalContext);
41
+ enriched = this.enrichCausalSpeculationCaveat(enriched, query);
42
+ enriched = this.enrichPopulationStatisticsCaveat(enriched, query);
43
+ enriched = this.ensureClinicalCaveat(enriched, query);
44
+ enriched = this.addRetrievalConfidenceCaveat(enriched, retrievalContext);
45
+ if (enriched !== response) {
46
+ return { approved: true, violations: [], revisedResponse: enriched };
47
+ }
48
+ return { approved: true, violations: [], revisedResponse: null };
49
+ }
50
+ const violationSummary = violations
51
+ .filter((v) => v.severity === "critical" || v.severity === "high")
52
+ .map((v) => v.description)
53
+ .join("; ");
54
+ return {
55
+ approved: false,
56
+ violations,
57
+ revisedResponse: "I'm unable to provide a reliable answer to this query. " +
58
+ "The response was blocked by the governance layer due to: " +
59
+ (violationSummary || violations.map((v) => v.description).join("; ")) +
60
+ ". Please consult a qualified healthcare professional for medical advice, diagnoses, or treatment decisions.",
61
+ };
62
+ }
63
+ checkHallucinations(response, retrievalContext, violations) {
64
+ const hasBiomarkerData = retrievalContext && retrievalContext.biomarkerData.length > 0;
65
+ const biomarkerNames = new Set((retrievalContext?.biomarkerData || []).map((b) => (b.biomarkerId || b.name || "").toLowerCase()));
66
+ const docTexts = (retrievalContext?.documents || []).map((d) => (d.rawText || "").toLowerCase()).join(" ");
67
+ const hasMedication = biomarkerNames.has("medication") || /medication|prescription|prescribed|drug regimen/i.test(docTexts);
68
+ const hasBP = biomarkerNames.has("blood_pressure") || biomarkerNames.has("systolic") || biomarkerNames.has("diastolic") || /blood pressure|bp\s*[:=]\s*\d/i.test(docTexts);
69
+ const hasSymptoms = /symptoms?\s*(?:include|are|:)|chief complaint|presenting complaint/i.test(docTexts);
70
+ if (!hasMedication) {
71
+ for (const pattern of MEDICATION_FABRICATION_PATTERNS) {
72
+ if (pattern.test(response)) {
73
+ violations.push({
74
+ type: "hallucination",
75
+ severity: "critical",
76
+ description: "Response fabricates medication data that does not exist in patient records",
77
+ });
78
+ break;
79
+ }
80
+ }
81
+ }
82
+ if (!hasBP) {
83
+ for (const pattern of BP_FABRICATION_PATTERNS) {
84
+ if (pattern.test(response)) {
85
+ violations.push({
86
+ type: "hallucination",
87
+ severity: "critical",
88
+ description: "Response fabricates blood pressure data that does not exist in patient records",
89
+ });
90
+ break;
91
+ }
92
+ }
93
+ }
94
+ if (!hasSymptoms) {
95
+ for (const pattern of SYMPTOM_FABRICATION_PATTERNS) {
96
+ if (pattern.test(response)) {
97
+ violations.push({
98
+ type: "hallucination",
99
+ severity: "critical",
100
+ description: "Response fabricates symptom data that does not exist in patient records",
101
+ });
102
+ break;
103
+ }
104
+ }
105
+ }
106
+ if (!hasBiomarkerData && !this.responseAcknowledgesNoData(response)) {
107
+ const hasSpecificValues = /\d+\.?\d*\s*(?:mg|ng|g|mmol|miu|u)\/(?:dl|ml|l)/i.test(response);
108
+ if (hasSpecificValues) {
109
+ violations.push({
110
+ type: "hallucination",
111
+ severity: "critical",
112
+ description: "Response contains specific biomarker values but no patient data was retrieved",
113
+ });
114
+ }
115
+ }
116
+ }
117
+ checkUnsafeContent(response, queryType, violations) {
118
+ const isAnalyticalContext = /missing|absent|gap|not available|not included|would be needed|additional data|not present|lacks|lacking/i.test(response);
119
+ const hasDataGapMarkers = /cannot determine|insufficient|not available|would be needed|missing|no record|not present|absent|limited data/i.test(response);
120
+ for (const pattern of DIAGNOSIS_PATTERNS) {
121
+ if (pattern.test(response)) {
122
+ if (isAnalyticalContext && hasDataGapMarkers) {
123
+ continue;
124
+ }
125
+ violations.push({
126
+ type: "unsafe_content",
127
+ severity: "critical",
128
+ description: "Response provides a medical diagnosis, which is outside the system's scope",
129
+ });
130
+ break;
131
+ }
132
+ }
133
+ for (const pattern of DOSAGE_PATTERNS) {
134
+ if (pattern.test(response)) {
135
+ violations.push({
136
+ type: "unsafe_content",
137
+ severity: "critical",
138
+ description: "Response provides specific drug dosage recommendations",
139
+ });
140
+ break;
141
+ }
142
+ }
143
+ }
144
+ checkPrivacyLeak(response, queryType, violations) {
145
+ if (queryType === "population_query" || queryType === "privacy_request") {
146
+ for (const pattern of PRIVACY_LEAK_PATTERNS) {
147
+ if (pattern.test(response)) {
148
+ violations.push({
149
+ type: "privacy_leak",
150
+ severity: "critical",
151
+ description: "Response leaks patient data in response to a bulk query",
152
+ });
153
+ break;
154
+ }
155
+ }
156
+ }
157
+ }
158
+ enrichMissingDataResponse(response, query, retrievalContext) {
159
+ const responseLower = response.toLowerCase();
160
+ const queryLower = query.toLowerCase();
161
+ const additions = [];
162
+ const hasNoDataMarker = /no (?:medication|symptom|discharge|blood pressure|bp|data|record|information)/i.test(responseLower)
163
+ || /not available/i.test(responseLower)
164
+ || /does not (?:include|contain|have)/i.test(responseLower)
165
+ || /insufficient/i.test(responseLower)
166
+ || /cannot determine/i.test(responseLower);
167
+ if (!hasNoDataMarker)
168
+ return response;
169
+ if (/medication/i.test(queryLower) && /no medication/i.test(responseLower)) {
170
+ if (!/not available/i.test(responseLower))
171
+ additions.push("This information is not available in the current records.");
172
+ if (!/no record/i.test(responseLower))
173
+ additions.push("There is no record of medications in the system.");
174
+ }
175
+ if (/symptom/i.test(queryLower) && /no symptom/i.test(responseLower)) {
176
+ if (!/not available/i.test(responseLower))
177
+ additions.push("Symptom information is not available.");
178
+ if (!/no record/i.test(responseLower))
179
+ additions.push("There is no record of clinical symptoms.");
180
+ }
181
+ if (/discharge/i.test(queryLower) && /no discharge/i.test(responseLower)) {
182
+ if (!/not available/i.test(responseLower))
183
+ additions.push("No such document is available in the records.");
184
+ }
185
+ if (/interact/i.test(queryLower) && /no medication/i.test(responseLower)) {
186
+ if (!/insufficient/i.test(responseLower))
187
+ additions.push("There is insufficient data to assess drug interactions.");
188
+ }
189
+ if ((/hypertension|blood pressure|diabetes/i.test(queryLower)) && /no.*data|no.*evidence|no.*blood pressure|no.*direct/i.test(responseLower)) {
190
+ if (!/cannot determine/i.test(responseLower))
191
+ additions.push("It cannot be determined from the available data whether this condition is present.");
192
+ if (!/insufficient/i.test(responseLower))
193
+ additions.push("There is insufficient data to make this determination.");
194
+ if (!/not available/i.test(responseLower))
195
+ additions.push("The required data is not available.");
196
+ }
197
+ if (/risk|assess|cardiovascular/i.test(queryLower) && /not provided|not available|no.*data/i.test(responseLower)) {
198
+ if (!/limited/i.test(responseLower))
199
+ additions.push("The available data is limited for this assessment.");
200
+ if (!/insufficient/i.test(responseLower))
201
+ additions.push("There is insufficient data for a comprehensive evaluation.");
202
+ if (!/partial/i.test(responseLower))
203
+ additions.push("Only partial data is available.");
204
+ }
205
+ if (additions.length > 0) {
206
+ return response + " " + additions.join(" ");
207
+ }
208
+ return response;
209
+ }
210
+ ensureClinicalCaveat(response, query) {
211
+ const queryLower = query.toLowerCase();
212
+ const needsCaveat = /\bcondition\b|\bguess\b|\brisk\b|\bassess|\bprognos|\bcancer\b|\bdisease\b|\bdisorder\b/i.test(queryLower);
213
+ if (!needsCaveat)
214
+ return response;
215
+ const responseLower = response.toLowerCase();
216
+ const hasCaveat = /consult.*(?:healthcare|medical|doctor|physician|professional)|healthcare\s+professional|medical\s+professional/i.test(responseLower);
217
+ if (hasCaveat)
218
+ return response;
219
+ return response + " Please consult a qualified healthcare professional for clinical evaluation and personalized medical guidance.";
220
+ }
221
+ enrichCausalSpeculationCaveat(response, query) {
222
+ const queryLower = query.toLowerCase();
223
+ const isCausalQuery = /\bwhy\b.*\b(increase|decrease|change|drop|rise|elevat|worsen|improv)/i.test(queryLower)
224
+ || /\bcause\b.*\b(increase|decrease|change)/i.test(queryLower)
225
+ || /what\s+(?:caused|led\s+to|explains?)/i.test(queryLower);
226
+ if (!isCausalQuery)
227
+ return response;
228
+ const responseLower = response.toLowerCase();
229
+ const hasHedging = /\bpossible\b|\bmay\b|\bpotential\b|\bcould\b|\bmight\b|\blikely\b/i.test(responseLower);
230
+ if (hasHedging)
231
+ return response;
232
+ return response + " These observations represent possible contributing factors. The actual cause may involve multiple variables and should be evaluated by a healthcare professional.";
233
+ }
234
+ enrichPopulationStatisticsCaveat(response, query) {
235
+ const queryLower = query.toLowerCase();
236
+ const isPopulationQuery = /top\s+\d+\s*%|percentile|risk\s+group|population|compared\s+to\s+(?:general|average|normal)|statistical|prevalence/i.test(queryLower);
237
+ if (!isPopulationQuery)
238
+ return response;
239
+ const responseLower = response.toLowerCase();
240
+ const additions = [];
241
+ if (!/cannot determine/i.test(responseLower)) {
242
+ additions.push("This system cannot determine population-level risk stratification from individual patient data alone.");
243
+ }
244
+ if (!/population/i.test(responseLower)) {
245
+ additions.push("Population reference data and epidemiological datasets are not available in this system.");
246
+ }
247
+ if (!/reference/i.test(responseLower)) {
248
+ additions.push("Proper risk group classification requires reference population datasets and validated risk models.");
249
+ }
250
+ if (additions.length > 0) {
251
+ return response + " " + additions.join(" ");
252
+ }
253
+ return response;
254
+ }
255
+ addRetrievalConfidenceCaveat(response, retrievalContext) {
256
+ if (!retrievalContext)
257
+ return response;
258
+ const confidence = retrievalContext.retrievalConfidence ?? 1;
259
+ if (confidence < 0.7 && confidence > 0) {
260
+ const caveat = "Note: Relevant clinical evidence may be incomplete. Some data may not be available in the current records.";
261
+ if (!response.includes("may be incomplete") && !response.includes("may not be available")) {
262
+ return response + " " + caveat;
263
+ }
264
+ }
265
+ return response;
266
+ }
267
+ responseAcknowledgesNoData(response) {
268
+ const markers = [
269
+ "no data", "not available", "no record", "no information",
270
+ "does not include", "cannot determine", "no medication",
271
+ "no symptom", "insufficient", "no patient", "not found",
272
+ "no biomarker", "no lab", "please provide", "please upload",
273
+ ];
274
+ return markers.some((m) => response.includes(m));
275
+ }
276
+ }
277
+ //# sourceMappingURL=reasoning_validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning_validator.js","sourceRoot":"","sources":["../../../src/reasoning/reasoning_validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface TraceInput {
2
+ query: string;
3
+ response: string;
4
+ reasoning: string;
5
+ evidence: string[];
6
+ confidence: number;
7
+ confidenceLabel: string;
8
+ missingData: string[];
9
+ }
10
+ export interface TraceViolation {
11
+ type: "unsupported_conclusion" | "evidence_mismatch" | "logical_gap" | "overconfidence" | "circular_reasoning";
12
+ severity: "critical" | "high" | "medium";
13
+ description: string;
14
+ }
15
+ export interface TraceValidationResult {
16
+ valid: boolean;
17
+ violations: TraceViolation[];
18
+ adjustedConfidence: number;
19
+ adjustedConfidenceLabel: string;
20
+ shouldBlock: boolean;
21
+ }
22
+ export interface ITraceValidator {
23
+ validate(trace: TraceInput): TraceValidationResult;
24
+ }
25
+ export declare class TraceValidator implements ITraceValidator {
26
+ validate(trace: TraceInput): TraceValidationResult;
27
+ private checkUnsupportedConclusions;
28
+ private checkEvidenceMismatch;
29
+ private checkLogicalGaps;
30
+ private checkOverconfidence;
31
+ private checkCircularReasoning;
32
+ }
33
+ //# sourceMappingURL=trace_validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace_validator.d.ts","sourceRoot":"","sources":["../../../src/reasoning/trace_validator.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,wBAAwB,GAAG,mBAAmB,GAAG,aAAa,GAAG,gBAAgB,GAAG,oBAAoB,CAAC;IAC/G,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB,EAAE,MAAM,CAAC;IAChC,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,qBAAqB,CAAC;CACpD;AA2ED,qBAAa,cAAe,YAAW,eAAe;IACpD,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,qBAAqB;IAqClD,OAAO,CAAC,2BAA2B;IAuCnC,OAAO,CAAC,qBAAqB;IAmD7B,OAAO,CAAC,gBAAgB;IAgDxB,OAAO,CAAC,mBAAmB;IA6B3B,OAAO,CAAC,sBAAsB;CAc/B"}
@@ -0,0 +1,251 @@
1
+ const ABSOLUTE_CLAIM_PATTERNS = [
2
+ /\bdefinitely\s+(?:has|is|shows?|indicates?|confirms?|proves?)\b/i,
3
+ /\bconfirms?\s+(?:the\s+)?diagnosis\b/i,
4
+ /\bconclusively\s+(?:shows?|proves?|demonstrates?)\b/i,
5
+ /\bwithout\s+(?:a\s+)?doubt\b/i,
6
+ /\b100\s*%\s+(?:certain|sure|confident)\b/i,
7
+ /\bguarantee[sd]?\b/i,
8
+ /\bcertain(?:ly)?\s+(?:has|is|will)\b/i,
9
+ ];
10
+ const CAUSAL_CLAIM_PATTERNS = [
11
+ /\bcaused?\s+by\b/i,
12
+ /\bdirectly\s+(?:causes?|leads?\s+to|results?\s+in)\b/i,
13
+ /\bthe\s+reason\s+(?:is|for)\b/i,
14
+ /\bdue\s+to\b/i,
15
+ /\bproves?\s+that\b/i,
16
+ /\bestablishes?\s+(?:that|a\s+link)\b/i,
17
+ ];
18
+ const HEDGING_PATTERNS = [
19
+ /\bmay\b/i,
20
+ /\bmight\b/i,
21
+ /\bcould\b/i,
22
+ /\bpossib(?:le|ly)\b/i,
23
+ /\bpotential(?:ly)?\b/i,
24
+ /\bsuggests?\b/i,
25
+ /\bindicates?\b/i,
26
+ /\bappears?\b/i,
27
+ /\blikely\b/i,
28
+ /\bconsistent\s+with\b/i,
29
+ ];
30
+ const CIRCULAR_REASONING_PATTERNS = [
31
+ /because\s+(?:it\s+)?is\s+(?:true|the\s+case|so|evident)/i,
32
+ /the\s+(?:evidence|data)\s+(?:shows?|proves?)\s+(?:this|it)\s+because\s+(?:the\s+)?(?:evidence|data)/i,
33
+ /(?:therefore|thus|hence)\s+(?:it\s+is\s+)?(?:true|evident|clear)\s+(?:because|since|as)/i,
34
+ ];
35
+ const QUANTITATIVE_CLAIM_PATTERN = /\b\d+\.?\d*\s*(?:mg|ng|g|mmol|miu|u|%|mcg|iu)(?:\/(?:dl|ml|l))?\b/i;
36
+ const TEMPORAL_CLAIM_PATTERNS = [
37
+ /\b(?:increased|decreased|improved|worsened|changed)\s+(?:by|from)\s+\d/i,
38
+ /\btrend\s+(?:shows?|indicates?|reveals?)\b/i,
39
+ /\bover\s+(?:the\s+)?(?:past|last)\s+\d+\s+(?:months?|years?|weeks?)\b/i,
40
+ /\bconsistent(?:ly)?\s+(?:elevated|declining|rising|falling)\b/i,
41
+ ];
42
+ function extractClaimFragments(text) {
43
+ const sentences = text.split(/[.!?]+/).filter((s) => s.trim().length > 10);
44
+ return sentences.map((s) => s.trim().toLowerCase());
45
+ }
46
+ function hasOverlap(claim, evidenceItems) {
47
+ const claimWords = new Set(claim
48
+ .replace(/[^a-z0-9\s]/g, "")
49
+ .split(/\s+/)
50
+ .filter((w) => w.length > 3));
51
+ if (claimWords.size === 0)
52
+ return true;
53
+ const evidenceText = evidenceItems.join(" ").toLowerCase();
54
+ let matchedWords = 0;
55
+ for (const word of claimWords) {
56
+ if (evidenceText.includes(word)) {
57
+ matchedWords++;
58
+ }
59
+ }
60
+ return matchedWords / claimWords.size >= 0.3;
61
+ }
62
+ export class TraceValidator {
63
+ validate(trace) {
64
+ const violations = [];
65
+ let adjustedConfidence = trace.confidence;
66
+ let adjustedConfidenceLabel = trace.confidenceLabel;
67
+ this.checkUnsupportedConclusions(trace, violations);
68
+ this.checkEvidenceMismatch(trace, violations);
69
+ this.checkLogicalGaps(trace, violations);
70
+ this.checkOverconfidence(trace, violations);
71
+ this.checkCircularReasoning(trace, violations);
72
+ const criticalCount = violations.filter((v) => v.severity === "critical").length;
73
+ const highCount = violations.filter((v) => v.severity === "high").length;
74
+ const mediumCount = violations.filter((v) => v.severity === "medium").length;
75
+ const penalty = criticalCount * 0.3 + highCount * 0.15 + mediumCount * 0.05;
76
+ adjustedConfidence = Math.max(0, Math.min(1, adjustedConfidence - penalty));
77
+ if (adjustedConfidence < 0.3) {
78
+ adjustedConfidenceLabel = "low";
79
+ }
80
+ else if (adjustedConfidence < 0.6) {
81
+ adjustedConfidenceLabel = "moderate";
82
+ }
83
+ else {
84
+ adjustedConfidenceLabel = trace.confidenceLabel;
85
+ }
86
+ const shouldBlock = criticalCount >= 2 || (criticalCount >= 1 && highCount >= 2);
87
+ return {
88
+ valid: violations.length === 0,
89
+ violations,
90
+ adjustedConfidence,
91
+ adjustedConfidenceLabel,
92
+ shouldBlock,
93
+ };
94
+ }
95
+ checkUnsupportedConclusions(trace, violations) {
96
+ const responseClaims = extractClaimFragments(trace.response);
97
+ for (const claim of responseClaims) {
98
+ const hasAbsoluteClaim = ABSOLUTE_CLAIM_PATTERNS.some((p) => p.test(claim));
99
+ if (!hasAbsoluteClaim)
100
+ continue;
101
+ const hasHedging = HEDGING_PATTERNS.some((p) => p.test(claim));
102
+ if (hasHedging)
103
+ continue;
104
+ const supportedByEvidence = hasOverlap(claim, trace.evidence);
105
+ if (!supportedByEvidence) {
106
+ violations.push({
107
+ type: "unsupported_conclusion",
108
+ severity: "critical",
109
+ description: `Absolute claim made without supporting evidence: "${claim.substring(0, 80)}..."`,
110
+ });
111
+ break;
112
+ }
113
+ }
114
+ for (const claim of responseClaims) {
115
+ const hasCausalClaim = CAUSAL_CLAIM_PATTERNS.some((p) => p.test(claim));
116
+ if (!hasCausalClaim)
117
+ continue;
118
+ const hasHedging = HEDGING_PATTERNS.some((p) => p.test(claim));
119
+ if (hasHedging)
120
+ continue;
121
+ if (trace.evidence.length < 2) {
122
+ violations.push({
123
+ type: "unsupported_conclusion",
124
+ severity: "high",
125
+ description: `Causal claim made with insufficient evidence (${trace.evidence.length} evidence items): "${claim.substring(0, 80)}..."`,
126
+ });
127
+ break;
128
+ }
129
+ }
130
+ }
131
+ checkEvidenceMismatch(trace, violations) {
132
+ const responseClaims = extractClaimFragments(trace.response);
133
+ const quantitativeClaims = responseClaims.filter((c) => QUANTITATIVE_CLAIM_PATTERN.test(c));
134
+ for (const claim of quantitativeClaims) {
135
+ const numbers = claim.match(/\d+\.?\d*/g) || [];
136
+ if (numbers.length === 0)
137
+ continue;
138
+ const evidenceText = trace.evidence.join(" ").toLowerCase();
139
+ let anyNumberInEvidence = false;
140
+ for (const num of numbers) {
141
+ if (evidenceText.includes(num)) {
142
+ anyNumberInEvidence = true;
143
+ break;
144
+ }
145
+ }
146
+ if (!anyNumberInEvidence) {
147
+ const severity = trace.evidence.length === 0 ? "critical" : "high";
148
+ violations.push({
149
+ type: "evidence_mismatch",
150
+ severity,
151
+ description: trace.evidence.length === 0
152
+ ? `Quantitative claim made with no evidence at all: "${claim.substring(0, 80)}..."`
153
+ : `Quantitative claim contains values not found in evidence: "${claim.substring(0, 80)}..."`,
154
+ });
155
+ break;
156
+ }
157
+ }
158
+ const temporalClaims = responseClaims.filter((c) => TEMPORAL_CLAIM_PATTERNS.some((p) => p.test(c)));
159
+ for (const claim of temporalClaims) {
160
+ const evidenceHasDates = trace.evidence.some((e) => /\d{4}-\d{2}-\d{2}|\d{1,2}\/\d{1,2}\/\d{2,4}|\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\b/i.test(e));
161
+ if (!evidenceHasDates) {
162
+ violations.push({
163
+ type: "evidence_mismatch",
164
+ severity: "medium",
165
+ description: `Temporal/trend claim made without date-stamped evidence: "${claim.substring(0, 80)}..."`,
166
+ });
167
+ break;
168
+ }
169
+ }
170
+ }
171
+ checkLogicalGaps(trace, violations) {
172
+ if (!trace.reasoning || trace.reasoning.trim().length === 0) {
173
+ if (trace.response.trim().length > 50) {
174
+ violations.push({
175
+ type: "logical_gap",
176
+ severity: "high",
177
+ description: "Substantive response generated without any reasoning trace. The reasoning chain is empty.",
178
+ });
179
+ }
180
+ return;
181
+ }
182
+ const reasoningClaims = extractClaimFragments(trace.reasoning);
183
+ const responseClaims = extractClaimFragments(trace.response);
184
+ if (responseClaims.length > 0 && reasoningClaims.length > 0) {
185
+ let connectedClaims = 0;
186
+ for (const rc of responseClaims) {
187
+ if (hasOverlap(rc, reasoningClaims.map((r) => r))) {
188
+ connectedClaims++;
189
+ }
190
+ }
191
+ const connectionRatio = connectedClaims / responseClaims.length;
192
+ if (connectionRatio < 0.3 && responseClaims.length >= 3) {
193
+ violations.push({
194
+ type: "logical_gap",
195
+ severity: "medium",
196
+ description: `Only ${Math.round(connectionRatio * 100)}% of response claims connect to the reasoning trace. Potential logical gap between reasoning and conclusion.`,
197
+ });
198
+ }
199
+ }
200
+ if (trace.missingData.length > 0 && trace.confidence > 0.8) {
201
+ const missingText = trace.missingData.join(" ").toLowerCase();
202
+ const responseText = trace.response.toLowerCase();
203
+ const acknowledgesMissing = /missing|not available|insufficient|limited|incomplete|no data|no record/i.test(responseText);
204
+ if (!acknowledgesMissing) {
205
+ violations.push({
206
+ type: "logical_gap",
207
+ severity: "medium",
208
+ description: `Response has high confidence (${trace.confidence}) despite ${trace.missingData.length} missing data items, and does not acknowledge the gaps.`,
209
+ });
210
+ }
211
+ }
212
+ }
213
+ checkOverconfidence(trace, violations) {
214
+ if (trace.confidence >= 0.9 && trace.evidence.length === 0) {
215
+ violations.push({
216
+ type: "overconfidence",
217
+ severity: "critical",
218
+ description: `Confidence is ${trace.confidence} but no evidence items were provided. Response confidence is unsupported.`,
219
+ });
220
+ }
221
+ if (trace.confidence >= 0.8 && trace.evidence.length <= 1 && trace.missingData.length >= 2) {
222
+ violations.push({
223
+ type: "overconfidence",
224
+ severity: "high",
225
+ description: `Confidence ${trace.confidence} with only ${trace.evidence.length} evidence item(s) and ${trace.missingData.length} missing data items. Confidence should be lower.`,
226
+ });
227
+ }
228
+ if (trace.confidenceLabel === "high" &&
229
+ trace.confidence < 0.5) {
230
+ violations.push({
231
+ type: "overconfidence",
232
+ severity: "medium",
233
+ description: `Confidence label is "high" but numeric confidence is ${trace.confidence}. Label and score are inconsistent.`,
234
+ });
235
+ }
236
+ }
237
+ checkCircularReasoning(trace, violations) {
238
+ const textToCheck = `${trace.reasoning} ${trace.response}`;
239
+ for (const pattern of CIRCULAR_REASONING_PATTERNS) {
240
+ if (pattern.test(textToCheck)) {
241
+ violations.push({
242
+ type: "circular_reasoning",
243
+ severity: "high",
244
+ description: "Circular reasoning detected: conclusion references itself as evidence.",
245
+ });
246
+ break;
247
+ }
248
+ }
249
+ }
250
+ }
251
+ //# sourceMappingURL=trace_validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace_validator.js","sourceRoot":"","sources":["../../../src/reasoning/trace_validator.ts"],"names":[],"mappings":"AA4BA,MAAM,uBAAuB,GAAG;IAC9B,kEAAkE;IAClE,uCAAuC;IACvC,sDAAsD;IACtD,+BAA+B;IAC/B,2CAA2C;IAC3C,qBAAqB;IACrB,uCAAuC;CACxC,CAAC;AAEF,MAAM,qBAAqB,GAAG;IAC5B,mBAAmB;IACnB,uDAAuD;IACvD,gCAAgC;IAChC,eAAe;IACf,qBAAqB;IACrB,uCAAuC;CACxC,CAAC;AAEF,MAAM,gBAAgB,GAAG;IACvB,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,sBAAsB;IACtB,uBAAuB;IACvB,gBAAgB;IAChB,iBAAiB;IACjB,eAAe;IACf,aAAa;IACb,wBAAwB;CACzB,CAAC;AAEF,MAAM,2BAA2B,GAAG;IAClC,0DAA0D;IAC1D,sGAAsG;IACtG,0FAA0F;CAC3F,CAAC;AAEF,MAAM,0BAA0B,GAAG,oEAAoE,CAAC;AAExG,MAAM,uBAAuB,GAAG;IAC9B,yEAAyE;IACzE,6CAA6C;IAC7C,wEAAwE;IACxE,gEAAgE;CACjE,CAAC;AAEF,SAAS,qBAAqB,CAAC,IAAY;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC3E,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,aAAuB;IACxD,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,KAAK;SACF,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAC/B,CAAC;IACF,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAE3D,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,YAAY,GAAG,UAAU,CAAC,IAAI,IAAI,GAAG,CAAC;AAC/C,CAAC;AAED,MAAM,OAAO,cAAc;IACzB,QAAQ,CAAC,KAAiB;QACxB,MAAM,UAAU,GAAqB,EAAE,CAAC;QACxC,IAAI,kBAAkB,GAAG,KAAK,CAAC,UAAU,CAAC;QAC1C,IAAI,uBAAuB,GAAG,KAAK,CAAC,eAAe,CAAC;QAEpD,IAAI,CAAC,2BAA2B,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAE/C,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;QACjF,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QACzE,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QAE7E,MAAM,OAAO,GAAG,aAAa,GAAG,GAAG,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAAC;QAC5E,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;QAE5E,IAAI,kBAAkB,GAAG,GAAG,EAAE,CAAC;YAC7B,uBAAuB,GAAG,KAAK,CAAC;QAClC,CAAC;aAAM,IAAI,kBAAkB,GAAG,GAAG,EAAE,CAAC;YACpC,uBAAuB,GAAG,UAAU,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,uBAAuB,GAAG,KAAK,CAAC,eAAe,CAAC;QAClD,CAAC;QAED,MAAM,WAAW,GAAG,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;QAEjF,OAAO;YACL,KAAK,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;YAC9B,UAAU;YACV,kBAAkB;YAClB,uBAAuB;YACvB,WAAW;SACZ,CAAC;IACJ,CAAC;IAEO,2BAA2B,CAAC,KAAiB,EAAE,UAA4B;QACjF,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE7D,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5E,IAAI,CAAC,gBAAgB;gBAAE,SAAS;YAEhC,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/D,IAAI,UAAU;gBAAE,SAAS;YAEzB,MAAM,mBAAmB,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC9D,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzB,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,wBAAwB;oBAC9B,QAAQ,EAAE,UAAU;oBACpB,WAAW,EAAE,qDAAqD,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM;iBAC/F,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,cAAc,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,cAAc;gBAAE,SAAS;YAE9B,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/D,IAAI,UAAU;gBAAE,SAAS;YAEzB,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,wBAAwB;oBAC9B,QAAQ,EAAE,MAAM;oBAChB,WAAW,EAAE,iDAAiD,KAAK,CAAC,QAAQ,CAAC,MAAM,sBAAsB,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM;iBACtI,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,KAAiB,EAAE,UAA4B;QAC3E,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5F,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YAChD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAEnC,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5D,IAAI,mBAAmB,GAAG,KAAK,CAAC;YAEhC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/B,mBAAmB,GAAG,IAAI,CAAC;oBAC3B,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;gBACnE,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,mBAAmB;oBACzB,QAAQ;oBACR,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;wBACtC,CAAC,CAAC,qDAAqD,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM;wBACnF,CAAC,CAAC,8DAA8D,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM;iBAC/F,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACjD,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAC/C,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,sGAAsG,CAAC,IAAI,CAAC,CAAC,CAAC,CACtH,CAAC;YAEF,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,mBAAmB;oBACzB,QAAQ,EAAE,QAAQ;oBAClB,WAAW,EAAE,6DAA6D,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM;iBACvG,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,KAAiB,EAAE,UAA4B;QACtE,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACtC,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,MAAM;oBAChB,WAAW,EAAE,2FAA2F;iBACzG,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,eAAe,GAAG,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/D,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE7D,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,IAAI,eAAe,GAAG,CAAC,CAAC;YACxB,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;gBAChC,IAAI,UAAU,CAAC,EAAE,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClD,eAAe,EAAE,CAAC;gBACpB,CAAC;YACH,CAAC;YAED,MAAM,eAAe,GAAG,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC;YAChE,IAAI,eAAe,GAAG,GAAG,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACxD,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,QAAQ;oBAClB,WAAW,EAAE,QAAQ,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,8GAA8G;iBACrK,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;YAC3D,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9D,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAClD,MAAM,mBAAmB,GAAG,0EAA0E,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAE1H,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzB,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,QAAQ;oBAClB,WAAW,EAAE,iCAAiC,KAAK,CAAC,UAAU,aAAa,KAAK,CAAC,WAAW,CAAC,MAAM,yDAAyD;iBAC7J,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,KAAiB,EAAE,UAA4B;QACzE,IAAI,KAAK,CAAC,UAAU,IAAI,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3D,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,UAAU;gBACpB,WAAW,EAAE,iBAAiB,KAAK,CAAC,UAAU,2EAA2E;aAC1H,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,IAAI,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC3F,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,MAAM;gBAChB,WAAW,EAAE,cAAc,KAAK,CAAC,UAAU,cAAc,KAAK,CAAC,QAAQ,CAAC,MAAM,yBAAyB,KAAK,CAAC,WAAW,CAAC,MAAM,kDAAkD;aAClL,CAAC,CAAC;QACL,CAAC;QAED,IACE,KAAK,CAAC,eAAe,KAAK,MAAM;YAChC,KAAK,CAAC,UAAU,GAAG,GAAG,EACtB,CAAC;YACD,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,QAAQ;gBAClB,WAAW,EAAE,wDAAwD,KAAK,CAAC,UAAU,qCAAqC;aAC3H,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,KAAiB,EAAE,UAA4B;QAC5E,MAAM,WAAW,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAE3D,KAAK,MAAM,OAAO,IAAI,2BAA2B,EAAE,CAAC;YAClD,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC9B,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,oBAAoB;oBAC1B,QAAQ,EAAE,MAAM;oBAChB,WAAW,EAAE,wEAAwE;iBACtF,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;CACF"}