// @vitest-environment node import { describe, expect, it } from 'vitest'; import { planToolCall } from '../electron/gateway/skill-planner'; const spreadsheetCapability = { capabilityKey: 'minimax-xlsx', toolName: 'minimax-xlsx', skillKey: 'minimax-xlsx', slug: 'minimax-xlsx', name: 'MiniMax XLSX', displayName: 'MiniMax XLSX', description: 'Analyze spreadsheet files such as .xlsx, .csv, and .tsv.', kind: 'skill' as const, aliases: ['minimax-xlsx', 'xlsx', 'spreadsheet', 'excel'], inputKinds: ['text', 'file', 'attachment'], outputKinds: ['text', 'json', 'artifacts'], triggerHints: ['spreadsheet', 'excel', 'xlsx', 'csv'], supportedFileTypes: ['.xlsx', '.csv', '.tsv'], requiresFiles: true, enabled: true, metadata: { renderHints: { card: 'document-analysis', preferredView: 'table', skillType: 'spreadsheet', }, }, }; describe('skill planner', () => { it('plans a spreadsheet tool call when the user explicitly requests minimax-xlsx with an attachment', () => { const decision = planToolCall({ userText: '使用minimax-xlsx这个skill,帮我分析下。', message: { role: 'user', content: '使用minimax-xlsx这个skill,帮我分析下。', }, attachments: [ { fileName: 'report.xlsx', mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', fileSize: 1024, preview: null, filePath: 'C:\\tmp\\report.xlsx', source: 'user-upload', }, ], capabilities: [spreadsheetCapability], }); expect(decision.kind).toBe('tool'); expect(decision.reason).toBe('explicit_skill_request'); expect(decision.toolCall?.name).toBe('minimax-xlsx'); expect(decision.toolCall?.input).toEqual(expect.objectContaining({ filePaths: ['C:\\tmp\\report.xlsx'], skillKey: 'minimax-xlsx', })); }); it('returns a blocking no-tool decision when spreadsheet analysis is requested without an attachment', () => { const decision = planToolCall({ userText: '使用minimax-xlsx这个skill,帮我分析下。', message: { role: 'user', content: '使用minimax-xlsx这个skill,帮我分析下。', }, capabilities: [spreadsheetCapability], }); expect(decision.kind).toBe('no-tool'); expect(decision.reason).toBe('missing_required_attachment'); expect(decision.blockingIssue).toEqual(expect.objectContaining({ code: 'missing_required_attachment', })); }); });