import test from 'node:test'; import assert from 'node:assert/strict'; import { createRequire } from 'node:module'; import { VOICE_SYSTEM_PROMPT } from '../skills/voice-prompt.js'; const require = createRequire(import.meta.url); const compaction = require('../vendor/agent-harness/agent/compaction.js'); const prompts = require('../vendor/agent-harness/agent/prompts.js'); function hugeTools() { return Array.from({ length: 24 }, (_, i) => ({ name: 'tool_' + i, description: 'schema '.repeat(80), parameters: { type: 'object', properties: { q: { type: 'string' } } }, })); } test('short voice chats do not compact just because tool schemas are large', () => { const tools = hugeTools(); const hist = [ { role: 'system', content: VOICE_SYSTEM_PROMPT }, { role: 'assistant', content: 'Hello! How can I help you today?' }, { role: 'user', content: 'Hi, please tell me about my computer.' }, ]; assert.equal(compaction.shouldCompact(hist, tools, 8192), false); const out = compaction.compact(hist, { budgetTokens: compaction.historyBudget(8192, tools, 0), tools, voice: true, }); assert.equal(out.length, hist.length); assert.equal(out[2].content, hist[2].content); assert.equal(JSON.stringify(out).includes('Earlier turns were compacted'), false); }); test('heuristic compact does not double-count tools against the history budget', () => { const tools = hugeTools(); const hist = [ { role: 'system', content: 'You are Jarvis' }, { role: 'assistant', content: 'Hello! How can I help you today?' }, { role: 'user', content: 'Hi, please tell me about my computer.' }, { role: 'assistant', content: 'Let me check that.' }, { role: 'user', content: 'Please continue.' }, ]; const budget = compaction.historyBudget(8192, tools, 0); assert.ok(budget <= 240 || compaction.toolTokens(tools) > 1000); const out = compaction.heuristicCompact(hist, { budgetTokens: budget, tools }); assert.ok(out.some((m) => String(m.content).includes('tell me about my computer'))); assert.equal(JSON.stringify(out).includes('Earlier turns were compacted'), false); }); test('voice compaction does not auto-continue a new greeting', () => { const cont = compaction.autoContinue([{ role: 'assistant', content: 'Hello!' }], { voice: true }); assert.equal(cont, null); assert.match(compaction.compactReminder({ voice: true }), /Do not greet again/); }); test('voice assemble uses only the Jarvis prompt', () => { const sys = prompts.assemble({ personality: 'voice', extra: VOICE_SYSTEM_PROMPT, cwd: '/home/raven/.local/share/jarvis-qvac', hostWorkspace: true, fsRead: () => 'You are a local coding agent. Read AGENTS.md.', }); assert.match(sys, /You are Jarvis/); assert.doesNotMatch(sys, /You are a local coding agent/); assert.doesNotMatch(sys, /AGENTS.md/); }); test('LLM compact skips a two-turn voice chat', async () => { let called = false; const hist = [ { role: 'system', content: 'You are Jarvis' }, { role: 'assistant', content: 'Hello! How can I help you today?' }, { role: 'user', content: 'Hi, please tell me about my computer.' }, ]; const out = await compaction.compactWithLlm(hist, { voice: true, complete: async () => { called = true; return { text: '1. Latest user request\n2. Facts\n3. Answered\n4. Follow-ups\n' }; }, }); assert.equal(called, false); assert.equal(out.length, hist.length); assert.equal(out[2].content, hist[2].content); });