couchloop-eq-mcp 1.0.1 → 1.0.3

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 (90) hide show
  1. package/README.md +30 -5
  2. package/dist/clients/shrinkChatClient.d.ts +10 -0
  3. package/dist/clients/shrinkChatClient.d.ts.map +1 -1
  4. package/dist/clients/shrinkChatClient.js +4 -0
  5. package/dist/clients/shrinkChatClient.js.map +1 -1
  6. package/dist/db/client.d.ts.map +1 -1
  7. package/dist/db/client.js +5 -3
  8. package/dist/db/client.js.map +1 -1
  9. package/dist/db/schema.d.ts +363 -0
  10. package/dist/db/schema.d.ts.map +1 -1
  11. package/dist/db/schema.js +47 -0
  12. package/dist/db/schema.js.map +1 -1
  13. package/dist/governance/config.d.ts +66 -0
  14. package/dist/governance/config.d.ts.map +1 -0
  15. package/dist/governance/config.js +238 -0
  16. package/dist/governance/config.js.map +1 -0
  17. package/dist/governance/detectors/hallucination.d.ts +61 -0
  18. package/dist/governance/detectors/hallucination.d.ts.map +1 -0
  19. package/dist/governance/detectors/hallucination.js +338 -0
  20. package/dist/governance/detectors/hallucination.js.map +1 -0
  21. package/dist/governance/detectors/inconsistency.d.ts +99 -0
  22. package/dist/governance/detectors/inconsistency.d.ts.map +1 -0
  23. package/dist/governance/detectors/inconsistency.js +548 -0
  24. package/dist/governance/detectors/inconsistency.js.map +1 -0
  25. package/dist/governance/detectors/toneDrift.d.ts +63 -0
  26. package/dist/governance/detectors/toneDrift.d.ts.map +1 -0
  27. package/dist/governance/detectors/toneDrift.js +421 -0
  28. package/dist/governance/detectors/toneDrift.js.map +1 -0
  29. package/dist/governance/detectors/unsafeReasoning.d.ts +54 -0
  30. package/dist/governance/detectors/unsafeReasoning.d.ts.map +1 -0
  31. package/dist/governance/detectors/unsafeReasoning.js +473 -0
  32. package/dist/governance/detectors/unsafeReasoning.js.map +1 -0
  33. package/dist/governance/evaluationEngine.d.ts +112 -0
  34. package/dist/governance/evaluationEngine.d.ts.map +1 -0
  35. package/dist/governance/evaluationEngine.js +265 -0
  36. package/dist/governance/evaluationEngine.js.map +1 -0
  37. package/dist/governance/intervention.d.ts +81 -0
  38. package/dist/governance/intervention.d.ts.map +1 -0
  39. package/dist/governance/intervention.js +405 -0
  40. package/dist/governance/intervention.js.map +1 -0
  41. package/dist/server/chatgpt-mcp.d.ts +10 -0
  42. package/dist/server/chatgpt-mcp.d.ts.map +1 -0
  43. package/dist/server/chatgpt-mcp.js +233 -0
  44. package/dist/server/chatgpt-mcp.js.map +1 -0
  45. package/dist/server/index.d.ts.map +1 -1
  46. package/dist/server/index.js +94 -3
  47. package/dist/server/index.js.map +1 -1
  48. package/dist/server/middleware/localNetworkAccess.d.ts +16 -0
  49. package/dist/server/middleware/localNetworkAccess.d.ts.map +1 -0
  50. package/dist/server/middleware/localNetworkAccess.js +97 -0
  51. package/dist/server/middleware/localNetworkAccess.js.map +1 -0
  52. package/dist/server/sse.d.ts +16 -0
  53. package/dist/server/sse.d.ts.map +1 -0
  54. package/dist/server/sse.js +215 -0
  55. package/dist/server/sse.js.map +1 -0
  56. package/dist/tools/checkpoint.d.ts.map +1 -1
  57. package/dist/tools/index.d.ts +1 -0
  58. package/dist/tools/index.d.ts.map +1 -1
  59. package/dist/tools/index.js +4 -2
  60. package/dist/tools/index.js.map +1 -1
  61. package/dist/tools/insight.d.ts +1 -0
  62. package/dist/tools/insight.d.ts.map +1 -1
  63. package/dist/tools/sendMessage-complex-backup.d.ts +6 -0
  64. package/dist/tools/sendMessage-complex-backup.d.ts.map +1 -0
  65. package/dist/tools/sendMessage-complex-backup.js +545 -0
  66. package/dist/tools/sendMessage-complex-backup.js.map +1 -0
  67. package/dist/tools/sendMessage-revised.d.ts +11 -0
  68. package/dist/tools/sendMessage-revised.d.ts.map +1 -0
  69. package/dist/tools/sendMessage-revised.js +429 -0
  70. package/dist/tools/sendMessage-revised.js.map +1 -0
  71. package/dist/tools/sendMessage-truly-simple.d.ts +8 -0
  72. package/dist/tools/sendMessage-truly-simple.d.ts.map +1 -0
  73. package/dist/tools/sendMessage-truly-simple.js +299 -0
  74. package/dist/tools/sendMessage-truly-simple.js.map +1 -0
  75. package/dist/tools/sendMessage.d.ts +4 -2
  76. package/dist/tools/sendMessage.d.ts.map +1 -1
  77. package/dist/tools/sendMessage.js +240 -186
  78. package/dist/tools/sendMessage.js.map +1 -1
  79. package/dist/tools/session.d.ts.map +1 -1
  80. package/dist/tools/session.js +35 -29
  81. package/dist/tools/session.js.map +1 -1
  82. package/dist/types/auth.d.ts +9 -1
  83. package/dist/types/auth.d.ts.map +1 -1
  84. package/dist/types/auth.js +37 -10
  85. package/dist/types/auth.js.map +1 -1
  86. package/dist/types/insight.d.ts +10 -0
  87. package/dist/types/insight.d.ts.map +1 -1
  88. package/dist/types/session.d.ts +10 -0
  89. package/dist/types/session.d.ts.map +1 -1
  90. package/package.json +10 -5
@@ -0,0 +1,548 @@
1
+ /**
2
+ * CouchLoop Behavioral Governance Layer - Inconsistency Checker
3
+ *
4
+ * Detects contradictions with earlier turns, sudden reversals in advice,
5
+ * and logical incoherence across conversation history
6
+ */
7
+ import { getDb } from '../../db/client.js';
8
+ import { checkpoints } from '../../db/schema.js';
9
+ import { eq, desc } from 'drizzle-orm';
10
+ export class InconsistencyChecker {
11
+ config;
12
+ lookbackLimit;
13
+ constructor(config) {
14
+ this.config = config;
15
+ this.lookbackLimit = config.metadata?.lookbackLimit || 10;
16
+ }
17
+ /**
18
+ * Main check method - detects inconsistencies with conversation history
19
+ */
20
+ async check(response, context) {
21
+ if (!context?.sessionId) {
22
+ // Can't check consistency without context
23
+ return {
24
+ detected: false,
25
+ confidence: 0,
26
+ patterns: [],
27
+ details: { reason: 'No session context provided' }
28
+ };
29
+ }
30
+ // Load conversation history if not provided
31
+ const history = await this.loadConversationHistory(context);
32
+ // Extract claims from current response
33
+ const currentClaims = this.extractClaims(response);
34
+ // Extract claims from history
35
+ const historicalClaims = this.extractHistoricalClaims(history);
36
+ // Find contradictions
37
+ const contradictions = this.findContradictions(currentClaims, historicalClaims);
38
+ // Check for logical incoherence
39
+ const logicalIssues = this.checkLogicalCoherence(response);
40
+ // Check for sudden tone/approach reversals
41
+ const reversals = this.checkReversals(response, history);
42
+ // Calculate confidence score
43
+ const confidence = this.calculateConfidence(contradictions, logicalIssues, reversals);
44
+ // Compile detected patterns
45
+ const patterns = [
46
+ ...contradictions.map(c => this.formatContradiction(c)),
47
+ ...logicalIssues,
48
+ ...reversals
49
+ ];
50
+ const detected = confidence >= this.config.threshold;
51
+ return {
52
+ detected,
53
+ confidence,
54
+ patterns,
55
+ details: {
56
+ contradictionCount: contradictions.length,
57
+ logicalIssues: logicalIssues.length,
58
+ reversals: reversals.length,
59
+ historicalMessagesChecked: history.length,
60
+ threshold: this.config.threshold
61
+ }
62
+ };
63
+ }
64
+ /**
65
+ * Load conversation history from database
66
+ */
67
+ async loadConversationHistory(context) {
68
+ if (context.conversationHistory) {
69
+ return context.conversationHistory.map(msg => ({
70
+ role: msg.role,
71
+ content: msg.content
72
+ }));
73
+ }
74
+ // Load from database
75
+ const db = getDb();
76
+ const sessionCheckpoints = await db
77
+ .select()
78
+ .from(checkpoints)
79
+ .where(eq(checkpoints.sessionId, context.sessionId))
80
+ .orderBy(desc(checkpoints.createdAt))
81
+ .limit(this.lookbackLimit * 2); // Get both user and assistant messages
82
+ const history = [];
83
+ for (const checkpoint of sessionCheckpoints) {
84
+ if (checkpoint.key === 'user-message' || checkpoint.key === 'assistant-message') {
85
+ const value = checkpoint.value;
86
+ history.push({
87
+ role: checkpoint.key === 'user-message' ? 'user' : 'assistant',
88
+ content: value.message || value.content || ''
89
+ });
90
+ }
91
+ }
92
+ return history.reverse(); // Return in chronological order
93
+ }
94
+ /**
95
+ * Extract claims from text
96
+ */
97
+ extractClaims(text) {
98
+ const claims = [];
99
+ // Extract factual statements
100
+ const factPatterns = [
101
+ /([A-Z][^.!?]+) (is|are|was|were) ([^.!?]+)[.!?]/g,
102
+ /([A-Z][^.!?]+) (will|would|can|could|should) ([^.!?]+)[.!?]/g,
103
+ /([A-Z][^.!?]+) (causes|leads to|results in) ([^.!?]+)[.!?]/g,
104
+ ];
105
+ for (const pattern of factPatterns) {
106
+ let match;
107
+ while ((match = pattern.exec(text)) !== null) {
108
+ claims.push({
109
+ content: match[0],
110
+ type: 'fact',
111
+ subject: match[1],
112
+ predicate: match[3],
113
+ confidence: 0.8
114
+ });
115
+ }
116
+ }
117
+ // Extract advice statements
118
+ const advicePatterns = [
119
+ /you (should|must|need to|ought to) ([^.!?]+)[.!?]/gi,
120
+ /I (recommend|suggest|advise) ([^.!?]+)[.!?]/gi,
121
+ /(try|consider|think about) ([^.!?]+)[.!?]/gi,
122
+ ];
123
+ for (const pattern of advicePatterns) {
124
+ let match;
125
+ while ((match = pattern.exec(text)) !== null) {
126
+ claims.push({
127
+ content: match[0],
128
+ type: 'advice',
129
+ confidence: 0.9
130
+ });
131
+ }
132
+ }
133
+ // Extract commitments/promises
134
+ const commitmentPatterns = [
135
+ /I (will|can|am going to) ([^.!?]+)[.!?]/gi,
136
+ /we (will|can) ([^.!?]+)[.!?]/gi,
137
+ /(always|never) ([^.!?]+)[.!?]/gi,
138
+ ];
139
+ for (const pattern of commitmentPatterns) {
140
+ let match;
141
+ while ((match = pattern.exec(text)) !== null) {
142
+ claims.push({
143
+ content: match[0],
144
+ type: 'commitment',
145
+ confidence: 0.9
146
+ });
147
+ }
148
+ }
149
+ return claims;
150
+ }
151
+ /**
152
+ * Extract claims from historical messages
153
+ */
154
+ extractHistoricalClaims(history) {
155
+ const claims = [];
156
+ history.forEach((msg, index) => {
157
+ if (msg.role === 'assistant') {
158
+ const msgClaims = this.extractClaims(msg.content || '');
159
+ msgClaims.forEach(claim => {
160
+ claim.messageIndex = index;
161
+ });
162
+ claims.push(...msgClaims);
163
+ }
164
+ });
165
+ return claims;
166
+ }
167
+ /**
168
+ * Find contradictions between current and historical claims
169
+ */
170
+ findContradictions(currentClaims, historicalClaims) {
171
+ const contradictions = [];
172
+ for (const current of currentClaims) {
173
+ for (const historical of historicalClaims) {
174
+ // Check for direct contradictions
175
+ if (this.areContradictory(current, historical)) {
176
+ contradictions.push({
177
+ current,
178
+ previous: historical,
179
+ type: 'direct',
180
+ severity: this.assessSeverity(current, historical)
181
+ });
182
+ }
183
+ // Check for reversals in advice
184
+ if (current.type === 'advice' && historical.type === 'advice') {
185
+ if (this.isReversal(current.content, historical.content)) {
186
+ contradictions.push({
187
+ current,
188
+ previous: historical,
189
+ type: 'reversal',
190
+ severity: 'medium'
191
+ });
192
+ }
193
+ }
194
+ }
195
+ }
196
+ return contradictions;
197
+ }
198
+ /**
199
+ * Check if two claims are contradictory
200
+ */
201
+ areContradictory(claim1, claim2) {
202
+ if (!claim1.subject || !claim2.subject) {
203
+ return false;
204
+ }
205
+ // Check if claims are about the same subject
206
+ const sameSubject = this.fuzzyMatch(claim1.subject, claim2.subject);
207
+ if (!sameSubject) {
208
+ return false;
209
+ }
210
+ const text1 = claim1.content.toLowerCase();
211
+ const text2 = claim2.content.toLowerCase();
212
+ // Check for opposite modals
213
+ const opposites = [
214
+ ['is', 'is not'],
215
+ ['are', 'are not'],
216
+ ['will', 'will not'],
217
+ ['can', 'cannot'],
218
+ ['should', 'should not'],
219
+ ['must', 'must not'],
220
+ ['always', 'never'],
221
+ ['all', 'none'],
222
+ ['everyone', 'no one']
223
+ ];
224
+ for (const [pos, neg] of opposites) {
225
+ if (text1 && text2 && pos && neg &&
226
+ ((text1.includes(pos) && text2.includes(neg)) ||
227
+ (text1.includes(neg) && text2.includes(pos)))) {
228
+ return true;
229
+ }
230
+ }
231
+ // Check for contradictory predicates
232
+ if (claim1.predicate && claim2.predicate) {
233
+ const pred1 = claim1.predicate.toLowerCase();
234
+ const pred2 = claim2.predicate.toLowerCase();
235
+ const contradictoryPredicates = [
236
+ ['helpful', 'harmful'],
237
+ ['safe', 'dangerous'],
238
+ ['effective', 'ineffective'],
239
+ ['good', 'bad'],
240
+ ['increase', 'decrease'],
241
+ ['improve', 'worsen']
242
+ ];
243
+ for (const [p1, p2] of contradictoryPredicates) {
244
+ if (p1 && p2 && pred1 && pred2 &&
245
+ ((pred1.includes(p1) && pred2.includes(p2)) ||
246
+ (pred1.includes(p2) && pred2.includes(p1)))) {
247
+ return true;
248
+ }
249
+ }
250
+ }
251
+ return false;
252
+ }
253
+ /**
254
+ * Check if advice has been reversed
255
+ */
256
+ isReversal(current, previous) {
257
+ const curr = current.toLowerCase();
258
+ const prev = previous.toLowerCase();
259
+ // Extract the core advice (what to do)
260
+ const currAction = this.extractAction(curr);
261
+ const prevAction = this.extractAction(prev);
262
+ if (!currAction || !prevAction) {
263
+ return false;
264
+ }
265
+ // Check if actions are opposites
266
+ const oppositeActions = [
267
+ ['continue', 'stop'],
268
+ ['start', 'stop'],
269
+ ['increase', 'decrease'],
270
+ ['more', 'less'],
271
+ ['focus on', 'avoid'],
272
+ ['embrace', 'resist']
273
+ ];
274
+ // TypeScript requires explicit non-null assertion after the check
275
+ const currActionStr = currAction;
276
+ const prevActionStr = prevAction;
277
+ for (const [a1, a2] of oppositeActions) {
278
+ if (a1 && a2 &&
279
+ ((currActionStr.includes(a1) && prevActionStr.includes(a2)) ||
280
+ (currActionStr.includes(a2) && prevActionStr.includes(a1)))) {
281
+ return true;
282
+ }
283
+ }
284
+ return false;
285
+ }
286
+ /**
287
+ * Extract action from advice statement
288
+ */
289
+ extractAction(advice) {
290
+ // Remove common advice prefixes
291
+ let action = advice
292
+ .replace(/you (should|must|need to|ought to) /i, '')
293
+ .replace(/I (recommend|suggest|advise) /i, '')
294
+ .replace(/(try|consider|think about) /i, '');
295
+ const trimmed = action.trim();
296
+ return trimmed.length > 0 ? trimmed : null;
297
+ }
298
+ /**
299
+ * Check for logical coherence issues
300
+ */
301
+ checkLogicalCoherence(response) {
302
+ const issues = [];
303
+ // Check for self-contradictions within the response
304
+ const sentences = response.match(/[^.!?]+[.!?]/g) || [];
305
+ for (let i = 0; i < sentences.length; i++) {
306
+ for (let j = i + 1; j < sentences.length; j++) {
307
+ const sent1 = sentences[i];
308
+ const sent2 = sentences[j];
309
+ if (sent1 && sent2 && this.areSentencesContradictory(sent1, sent2)) {
310
+ issues.push(`Self-contradiction: "${sent1.trim()}" vs "${sent2.trim()}"`);
311
+ }
312
+ }
313
+ }
314
+ // Check for impossible combinations
315
+ const impossiblePatterns = [
316
+ /always .+ and never/i,
317
+ /both .+ and not/i,
318
+ /completely .+ but also not/i,
319
+ /100% .+ but sometimes/i
320
+ ];
321
+ for (const pattern of impossiblePatterns) {
322
+ if (pattern.test(response)) {
323
+ const match = response.match(pattern);
324
+ if (match) {
325
+ issues.push(`Logical impossibility: "${match[0]}"`);
326
+ }
327
+ }
328
+ }
329
+ // Check for circular reasoning
330
+ if (this.detectCircularReasoning(response)) {
331
+ issues.push('Circular reasoning detected');
332
+ }
333
+ return issues;
334
+ }
335
+ /**
336
+ * Check if two sentences within the same response are contradictory
337
+ */
338
+ areSentencesContradictory(sent1, sent2) {
339
+ const s1 = sent1.toLowerCase().trim();
340
+ const s2 = sent2.toLowerCase().trim();
341
+ // Look for opposite statements about the same thing
342
+ const subject1 = this.extractSubject(s1);
343
+ const subject2 = this.extractSubject(s2);
344
+ if (subject1 && subject2 && this.fuzzyMatch(subject1, subject2)) {
345
+ // Check for opposite predicates
346
+ if ((s1.includes(' is ') && s2.includes(' is not ')) ||
347
+ (s1.includes(' will ') && s2.includes(' won\'t ')) ||
348
+ (s1.includes(' can ') && s2.includes(' cannot '))) {
349
+ return true;
350
+ }
351
+ }
352
+ return false;
353
+ }
354
+ /**
355
+ * Extract subject from sentence
356
+ */
357
+ extractSubject(sentence) {
358
+ const patterns = [
359
+ /^([a-z\s]+) (is|are|will|can|should)/i,
360
+ /^(this|that|it) /i
361
+ ];
362
+ for (const pattern of patterns) {
363
+ const match = sentence.match(pattern);
364
+ if (match && match[1]) {
365
+ return match[1].trim();
366
+ }
367
+ }
368
+ return null;
369
+ }
370
+ /**
371
+ * Detect circular reasoning patterns
372
+ */
373
+ detectCircularReasoning(text) {
374
+ const patterns = [
375
+ /because .+ therefore .+ because/i,
376
+ /this is true because .+ which is true because/i,
377
+ /A causes B.+B causes A/i
378
+ ];
379
+ return patterns.some(p => p.test(text));
380
+ }
381
+ /**
382
+ * Check for sudden reversals in approach or tone
383
+ */
384
+ checkReversals(response, history) {
385
+ const reversals = [];
386
+ // Get the last assistant message
387
+ const lastAssistantMsg = history
388
+ .filter(msg => msg.role === 'assistant')
389
+ .pop();
390
+ if (!lastAssistantMsg) {
391
+ return reversals;
392
+ }
393
+ // Check for approach reversal
394
+ const lastApproach = this.identifyApproach(lastAssistantMsg.content);
395
+ const currentApproach = this.identifyApproach(response);
396
+ if (lastApproach && currentApproach && lastApproach !== currentApproach) {
397
+ if (this.areApproachesOpposite(lastApproach, currentApproach)) {
398
+ reversals.push(`Approach reversal: from ${lastApproach} to ${currentApproach}`);
399
+ }
400
+ }
401
+ // Check for stance reversal on key topics
402
+ const lastStances = this.extractStances(lastAssistantMsg.content);
403
+ const currentStances = this.extractStances(response);
404
+ for (const [topic, lastStance] of Object.entries(lastStances)) {
405
+ if (currentStances[topic] && currentStances[topic] !== lastStance) {
406
+ reversals.push(`Stance reversal on ${topic}: from ${lastStance} to ${currentStances[topic]}`);
407
+ }
408
+ }
409
+ return reversals;
410
+ }
411
+ /**
412
+ * Identify the therapeutic approach being used
413
+ */
414
+ identifyApproach(text) {
415
+ const approaches = {
416
+ 'directive': ['you must', 'you should', 'you need to', 'it\'s important that you'],
417
+ 'exploratory': ['what do you think', 'how do you feel', 'tell me more', 'let\'s explore'],
418
+ 'supportive': ['I understand', 'that must be', 'I hear you', 'it\'s okay'],
419
+ 'challenging': ['have you considered', 'what if', 'perhaps', 'might it be']
420
+ };
421
+ const textLower = text.toLowerCase();
422
+ for (const [approach, markers] of Object.entries(approaches)) {
423
+ if (markers.some(marker => textLower.includes(marker))) {
424
+ return approach;
425
+ }
426
+ }
427
+ return null;
428
+ }
429
+ /**
430
+ * Check if two approaches are opposite
431
+ */
432
+ areApproachesOpposite(approach1, approach2) {
433
+ const opposites = [
434
+ ['directive', 'exploratory'],
435
+ ['supportive', 'challenging']
436
+ ];
437
+ return opposites.some(([a, b]) => (approach1 === a && approach2 === b) || (approach1 === b && approach2 === a));
438
+ }
439
+ /**
440
+ * Extract stances on various topics
441
+ */
442
+ extractStances(text) {
443
+ const stances = {};
444
+ const textLower = text.toLowerCase();
445
+ // Check stance on medication
446
+ if (textLower.includes('medication')) {
447
+ if (textLower.includes('important') || textLower.includes('necessary')) {
448
+ stances['medication'] = 'pro';
449
+ }
450
+ else if (textLower.includes('optional') || textLower.includes('not necessary')) {
451
+ stances['medication'] = 'neutral';
452
+ }
453
+ else if (textLower.includes('avoid') || textLower.includes('harmful')) {
454
+ stances['medication'] = 'against';
455
+ }
456
+ }
457
+ // Check stance on therapy
458
+ if (textLower.includes('therapy') || textLower.includes('therapist')) {
459
+ if (textLower.includes('helpful') || textLower.includes('beneficial')) {
460
+ stances['therapy'] = 'positive';
461
+ }
462
+ else if (textLower.includes('not helpful') || textLower.includes('waste')) {
463
+ stances['therapy'] = 'negative';
464
+ }
465
+ }
466
+ return stances;
467
+ }
468
+ /**
469
+ * Assess severity of contradiction
470
+ */
471
+ assessSeverity(claim1, claim2) {
472
+ // High severity for medical/safety contradictions
473
+ if (claim1.content.match(/medication|treatment|therapy|harm|safety/i)) {
474
+ return 'high';
475
+ }
476
+ // High severity for factual contradictions
477
+ if (claim1.type === 'fact' && claim2.type === 'fact') {
478
+ return 'high';
479
+ }
480
+ // Medium severity for advice reversals
481
+ if (claim1.type === 'advice' && claim2.type === 'advice') {
482
+ return 'medium';
483
+ }
484
+ return 'low';
485
+ }
486
+ /**
487
+ * Calculate overall confidence score
488
+ */
489
+ calculateConfidence(contradictions, logicalIssues, reversals) {
490
+ let confidence = 0;
491
+ // Weight contradictions by severity
492
+ for (const contradiction of contradictions) {
493
+ switch (contradiction.severity) {
494
+ case 'high':
495
+ confidence += 0.3;
496
+ break;
497
+ case 'medium':
498
+ confidence += 0.2;
499
+ break;
500
+ case 'low':
501
+ confidence += 0.1;
502
+ break;
503
+ }
504
+ }
505
+ // Add confidence for logical issues
506
+ confidence += logicalIssues.length * 0.15;
507
+ // Add confidence for reversals
508
+ confidence += reversals.length * 0.2;
509
+ // Cap at 1.0
510
+ return Math.min(confidence, 1.0);
511
+ }
512
+ /**
513
+ * Format contradiction for output
514
+ */
515
+ formatContradiction(contradiction) {
516
+ const type = contradiction.type === 'direct' ? 'Contradiction' :
517
+ contradiction.type === 'reversal' ? 'Reversal' : 'Logical issue';
518
+ return `${type} (${contradiction.severity}): Current: "${contradiction.current.content}" vs Previous: "${contradiction.previous.content}"`;
519
+ }
520
+ /**
521
+ * Fuzzy string matching
522
+ */
523
+ fuzzyMatch(str1, str2) {
524
+ const s1 = str1.toLowerCase().trim();
525
+ const s2 = str2.toLowerCase().trim();
526
+ // Direct match
527
+ if (s1 === s2)
528
+ return true;
529
+ // Substring match
530
+ if (s1.includes(s2) || s2.includes(s1))
531
+ return true;
532
+ // Word overlap
533
+ const words1 = new Set(s1.split(/\s+/));
534
+ const words2 = new Set(s2.split(/\s+/));
535
+ const intersection = new Set([...words1].filter(x => words2.has(x)));
536
+ const overlapRatio = intersection.size / Math.min(words1.size, words2.size);
537
+ return overlapRatio > 0.6;
538
+ }
539
+ /**
540
+ * Update configuration
541
+ */
542
+ updateConfig(config) {
543
+ this.config = config;
544
+ this.lookbackLimit = config.metadata?.lookbackLimit || 10;
545
+ }
546
+ }
547
+ export default InconsistencyChecker;
548
+ //# sourceMappingURL=inconsistency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inconsistency.js","sourceRoot":"","sources":["../../../src/governance/detectors/inconsistency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * CouchLoop Behavioral Governance Layer - Tone Drift Monitor
3
+ *
4
+ * Detects escalation from neutral to emotionally loaded, over-reassurance,
5
+ * over-alarmism, and manipulative or dependency-forming language
6
+ */
7
+ import type { DetectionResult, SessionContext } from '../evaluationEngine.js';
8
+ import type { CriterionConfig } from '../config.js';
9
+ export declare class ToneDriftMonitor {
10
+ private config;
11
+ private manipulativePatterns;
12
+ private overReassurancePatterns;
13
+ private alarmistPatterns;
14
+ private dependencyPatterns;
15
+ private directivePatterns;
16
+ constructor(config: CriterionConfig);
17
+ /**
18
+ * Main monitoring method
19
+ */
20
+ monitor(response: string, context?: SessionContext): Promise<DetectionResult>;
21
+ /**
22
+ * Analyze tone profile of text
23
+ */
24
+ private analyzeTone;
25
+ /**
26
+ * Get baseline tone from conversation history
27
+ */
28
+ private getBaselineTone;
29
+ /**
30
+ * Calculate drift between current and baseline tone
31
+ */
32
+ private calculateDrift;
33
+ /**
34
+ * Detect manipulative language patterns
35
+ */
36
+ private detectManipulation;
37
+ /**
38
+ * Detect over-reassurance patterns
39
+ */
40
+ private detectOverReassurance;
41
+ /**
42
+ * Detect alarmist language
43
+ */
44
+ private detectAlarmism;
45
+ /**
46
+ * Detect dependency-forming language
47
+ */
48
+ private detectDependencyForming;
49
+ /**
50
+ * Detect over-directive language
51
+ */
52
+ private detectOverDirectiveness;
53
+ /**
54
+ * Detect emotional escalation
55
+ */
56
+ private detectEmotionalEscalation;
57
+ /**
58
+ * Update configuration
59
+ */
60
+ updateConfig(config: CriterionConfig): void;
61
+ }
62
+ export default ToneDriftMonitor;
63
+ //# sourceMappingURL=toneDrift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toneDrift.d.ts","sourceRoot":"","sources":["../../../src/governance/detectors/toneDrift.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAmBpD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,oBAAoB,CAAW;IACvC,OAAO,CAAC,uBAAuB,CAAW;IAC1C,OAAO,CAAC,gBAAgB,CAAW;IACnC,OAAO,CAAC,kBAAkB,CAAW;IACrC,OAAO,CAAC,iBAAiB,CAAW;gBAExB,MAAM,EAAE,eAAe;IA4EnC;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAkFnF;;OAEG;IACH,OAAO,CAAC,WAAW;IAkDnB;;OAEG;YACW,eAAe;IA4C7B;;OAEG;IACH,OAAO,CAAC,cAAc;IA8DtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAmB7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAkB/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAmB/B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAsBjC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;CAG5C;AAED,eAAe,gBAAgB,CAAC"}