| 1 | import { describe, expect, it } from 'vitest';
|
| 2 | import { parseFinalizationAssessment } from '../connectors/botpress/src/finalization.js';
|
| 3 |
|
| 4 | const validAssessment = {
|
| 5 | outcome: 'partial',
|
| 6 | summary: 'The request was handled, including the {quoted} detail.',
|
| 7 | criteria: [
|
| 8 | {
|
| 9 | criterion: 'Provide a sourced result',
|
| 10 | status: 'partially_met',
|
| 11 | explanation: 'A result was provided without a source.',
|
| 12 | evidenceReferences: ['receipt:1'],
|
| 13 | },
|
| 14 | ],
|
| 15 | deliverables: ['One result'],
|
| 16 | actionsTaken: ['Searched the available catalogue'],
|
| 17 | blockers: ['No current inventory feed'],
|
| 18 | corrections: [],
|
| 19 | evidenceReferences: ['receipt:1'],
|
| 20 | confidence: 0.7,
|
| 21 | ratings: {
|
| 22 | overall_satisfaction: 0.6,
|
| 23 | outcome_satisfaction: 0.5,
|
| 24 | communication: 0.9,
|
| 25 | timeliness: 0.8,
|
| 26 | scope_adherence: 0.8,
|
| 27 | evidence_quality: 0.3,
|
| 28 | correction_handling: 0.7,
|
| 29 | reliability: 0.5,
|
| 30 | },
|
| 31 | wouldWorkAgain: 'unsure',
|
| 32 | reasonCodes: ['missing_source'],
|
| 33 | privateComment: 'Structured feedback only.',
|
| 34 | rawTranscript: 'This must never be retained.',
|
| 35 | };
|
| 36 |
|
| 37 | describe('Botpress automatic finalization', () => {
|
| 38 | it('extracts a structured assessment without retaining unknown raw content', () => {
|
| 39 | const parsed = parseFinalizationAssessment(
|
| 40 | `OPENCLASP_FINALIZATION\n${JSON.stringify(validAssessment)}`,
|
| 41 | 'interaction-1',
|
| 42 | );
|
| 43 |
|
| 44 | expect(parsed.interactionId).toBe('interaction-1');
|
| 45 | expect(parsed.summary).toContain('{quoted}');
|
| 46 | expect(parsed.ratings.communication).toBe(0.9);
|
| 47 | expect(parsed).not.toHaveProperty('rawTranscript');
|
| 48 | });
|
| 49 |
|
| 50 | it('rejects incomplete ratings', () => {
|
| 51 | const invalid = structuredClone(validAssessment);
|
| 52 | delete (invalid.ratings as Partial<typeof invalid.ratings>).reliability;
|
| 53 |
|
| 54 | expect(() =>
|
| 55 | parseFinalizationAssessment(
|
| 56 | `OPENCLASP_FINALIZATION ${JSON.stringify(invalid)}`,
|
| 57 | 'interaction-2',
|
| 58 | ),
|
| 59 | ).toThrow('Finalization rating reliability is invalid');
|
| 60 | });
|
| 61 |
|
| 62 | it('rejects output without a JSON assessment', () => {
|
| 63 | expect(() => parseFinalizationAssessment('Conversation complete.', 'interaction-3')).toThrow(
|
| 64 | 'Finalization JSON object is missing',
|
| 65 | );
|
| 66 | });
|
| 67 | });
|