import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import test from 'node:test' import { fileURLToPath } from 'node:url' import { assistantCapabilities } from '../src/data/personalWorkbench.js' import { buildWorkbenchCapabilityAssistantPayload, resolveWorkbenchCapabilityAssistantEntry } from '../src/utils/personalWorkbenchAssistantEntry.js' const workbench = readFileSync( fileURLToPath(new URL('../src/components/business/PersonalWorkbench.vue', import.meta.url)), 'utf8' ) test('workbench assistant greets the current employee without the old helper tag', () => { assert.doesNotMatch(workbench, /assistant-tag/) assert.doesNotMatch(workbench, /AI 报销助手/) assert.match(workbench, /嗨,\{\{ displayUserName \}\},我是您的 AI 费用助手<\/span>/) assert.match(workbench, /placeholder="请输入费用申请、报销问题、预算查询或制度问答\.\.\."/) assert.match(workbench, /const displayUserName = computed/) assert.match(workbench, /user\.name/) }) test('workbench capability cards open assistant without injecting canned prompts', () => { assert.match(workbench, /@click="openCapabilityAssistant\(item\)"/) assert.doesNotMatch(workbench, /openPromptAssistant\(item\.prompt\)/) for (const item of assistantCapabilities) { const payload = buildWorkbenchCapabilityAssistantPayload(item, { prompt: '', source: 'workbench', files: [] }) assert.equal(payload.prompt, '') assert.equal(payload.conversation, null) assert.notEqual(payload.prompt, item.prompt) assert.ok(resolveWorkbenchCapabilityAssistantEntry(item).sessionType) } }) test('workbench capability cards keep user-entered context only', () => { const [expenseApplication] = assistantCapabilities const files = [{ name: 'invoice.pdf' }] const payload = buildWorkbenchCapabilityAssistantPayload(expenseApplication, { prompt: '我需要申请下周出差费用', source: 'workbench', files }) assert.equal(payload.prompt, '我需要申请下周出差费用') assert.equal(payload.source, 'application') assert.equal(payload.sessionType, 'application') assert.equal(payload.files, files) }) test('workbench submit shows intent recognition feedback before assistant opens', () => { assert.match(workbench, /class="assistant-intent-status"/) assert.match(workbench, /aria-live="polite"/) assert.match(workbench, /正在识别意图,准备进入对应助手/) assert.match(workbench, /startPendingAction\('intent'\)/) assert.match(workbench, /if \(open\) \{\s*clearPendingAction\(\)/) assert.match(workbench, /:readonly="isComposerPending"/) })