154 lines
5.6 KiB
TypeScript
154 lines
5.6 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { processInteractionForImprovement } from '../src/improvement-wiring.js';
|
|
|
|
describe('improvement-wiring', () => {
|
|
const baseParams = {
|
|
workspaceId: 'ws-1',
|
|
sessionId: 'sess-1',
|
|
toolsUsed: [],
|
|
agentResponse: 'Here is the result.',
|
|
userMessage: '',
|
|
};
|
|
|
|
// ── Correction detection ─────────────────────────────────────
|
|
|
|
describe('correction detection', () => {
|
|
it('detects corrections in user messages', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: "No, that's wrong. I told you to use bullet points, not paragraphs.",
|
|
});
|
|
expect(result.wasCorrection).toBe(true);
|
|
expect(result.correctionDetail).toBeDefined();
|
|
expect(result.correctionDetail!.length).toBeGreaterThan(0);
|
|
});
|
|
|
|
it('returns wasCorrection false for normal messages', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: 'Can you help me write a function to sort an array?',
|
|
});
|
|
expect(result.wasCorrection).toBe(false);
|
|
expect(result.correctionDetail).toBeUndefined();
|
|
});
|
|
|
|
it('returns wasCorrection false for very short messages', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: 'ok',
|
|
});
|
|
expect(result.wasCorrection).toBe(false);
|
|
});
|
|
|
|
it('detects "I said" corrections', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: 'I said to use markdown headers, not plain text.',
|
|
});
|
|
expect(result.wasCorrection).toBe(true);
|
|
});
|
|
|
|
it('detects "actually instead use" corrections', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: 'Actually, instead use TypeScript for this module.',
|
|
});
|
|
expect(result.wasCorrection).toBe(true);
|
|
});
|
|
});
|
|
|
|
// ── Capability gap detection ─────────────────────────────────
|
|
|
|
describe('capability gap detection', () => {
|
|
it('identifies capability gaps from tool-not-found in response', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: 'Read this PDF for me.',
|
|
agentResponse: 'Tool "pdf_reader" not found. I cannot read PDFs directly.',
|
|
});
|
|
expect(result.capabilityGap).toBe('pdf_reader');
|
|
});
|
|
|
|
it('identifies capability gaps from "I don\'t have a tool" in response', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: 'Can you send this to Slack?',
|
|
agentResponse: "I don't have a tool for sending Slack messages.",
|
|
});
|
|
expect(result.capabilityGap).toBe('sending Slack messages');
|
|
});
|
|
|
|
it('identifies gaps from user requesting integration', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: 'Can you send to Slack the summary?',
|
|
agentResponse: 'Let me try to do that.',
|
|
toolsUsed: [],
|
|
});
|
|
expect(result.capabilityGap).toBe('slack');
|
|
});
|
|
|
|
it('returns no gap for normal interactions', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: 'What is the weather today?',
|
|
agentResponse: 'The weather today is sunny and 72F.',
|
|
});
|
|
expect(result.capabilityGap).toBeUndefined();
|
|
});
|
|
});
|
|
|
|
// ── Workflow pattern detection ───────────────────────────────
|
|
|
|
describe('workflow pattern detection', () => {
|
|
it('detects multi-step workflow patterns with "then"', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: 'First research the competitors, then compare their features, then draft a summary report.',
|
|
});
|
|
expect(result.workflowPattern).toBeDefined();
|
|
});
|
|
|
|
it('does not flag single-step requests as workflow patterns', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: 'Write a summary of this document.',
|
|
});
|
|
expect(result.workflowPattern).toBeUndefined();
|
|
});
|
|
|
|
it('returns undefined for simple questions', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: 'What is the status of the project?',
|
|
});
|
|
expect(result.workflowPattern).toBeUndefined();
|
|
});
|
|
});
|
|
|
|
// ── Combined signals ─────────────────────────────────────────
|
|
|
|
describe('combined signals', () => {
|
|
it('can detect correction and gap simultaneously', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: "No, that's wrong. I told you to use the Jira tool.",
|
|
agentResponse: 'Tool "jira_create" not found.',
|
|
});
|
|
expect(result.wasCorrection).toBe(true);
|
|
expect(result.capabilityGap).toBe('jira_create');
|
|
});
|
|
|
|
it('returns all-false for benign exchange', () => {
|
|
const result = processInteractionForImprovement({
|
|
...baseParams,
|
|
userMessage: 'Thanks, that looks great!',
|
|
agentResponse: "You're welcome! Let me know if you need anything else.",
|
|
});
|
|
expect(result.wasCorrection).toBe(false);
|
|
expect(result.capabilityGap).toBeUndefined();
|
|
expect(result.workflowPattern).toBeUndefined();
|
|
});
|
|
});
|
|
});
|