messageDisplay.test.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { describe, expect, it } from 'vitest'
  2. import { displayContentForMessage } from '@/utils/messageDisplay'
  3. import { normalizeChatMessage } from '@/utils/normalize'
  4. describe('displayContentForMessage', () => {
  5. it('turns persisted user @file markers into attachment cards and removes marker text', () => {
  6. const message = normalizeChatMessage({
  7. id: 'user-file', role: 'user', timestamp: 1,
  8. content: '刘博士的技术介绍。\n\n[用户附加文件:大模型推理优化报告.docx]\n@file:\\/Users/samien/.hermes/attachments/大模型推理优化报告.docx',
  9. }, 'session-1', 'default')
  10. expect(message.content).toBe('刘博士的技术介绍。')
  11. expect(message.attachments).toEqual([expect.objectContaining({
  12. name: '大模型推理优化报告.docx',
  13. path: '/Users/samien/.hermes/attachments/大模型推理优化报告.docx',
  14. kind: 'file',
  15. })])
  16. })
  17. it('hides expanded attached context while restoring a missing reference', () => {
  18. const content = [
  19. '帮我看看这个文件',
  20. '',
  21. '--- Attached Context ---',
  22. '',
  23. '📄 @file:`/Users/samien/My Notes/方案.md` (981 tokens)',
  24. '```markdown',
  25. '# 很长的附加正文',
  26. '```',
  27. ].join('\n')
  28. expect(displayContentForMessage('user', content)).toBe(
  29. '@file:`/Users/samien/My Notes/方案.md`\n\n帮我看看这个文件',
  30. )
  31. })
  32. it('keeps visible references in place and deduplicates attached references', () => {
  33. const reference = '@url:`https://example.com/a b`'
  34. const content = [
  35. reference,
  36. '总结这篇文章',
  37. '',
  38. '--- Attached Context ---',
  39. '',
  40. `🌐 ${reference} (1200 tokens)`,
  41. '正文一',
  42. `🌐 ${reference} (1200 tokens)`,
  43. '正文二',
  44. ].join('\n')
  45. expect(displayContentForMessage('user', content)).toBe(`${reference}\n总结这篇文章`)
  46. })
  47. it('supports quoted refs and removes context warnings from user display', () => {
  48. const content = [
  49. '分析附件',
  50. '',
  51. '--- Attached Context ---',
  52. '',
  53. "📁 @folder:'/Users/samien/中文 文件夹' (20 tokens)",
  54. 'folder listing',
  55. '🛠 @tool:"desktop capture" (10 tokens)',
  56. 'tool output',
  57. ].join('\n')
  58. expect(displayContentForMessage('user', content)).toBe([
  59. "@folder:'/Users/samien/中文 文件夹'",
  60. '@tool:"desktop capture"',
  61. '',
  62. '分析附件',
  63. ].join('\n'))
  64. expect(displayContentForMessage('user', '继续\n\n--- Context Warnings ---\n抓取失败')).toBe('继续')
  65. })
  66. it('never rewrites assistant or system content', () => {
  67. const content = '回答\n\n--- Attached Context ---\n\n不应隐藏'
  68. expect(displayContentForMessage('assistant', content)).toBe(content)
  69. expect(displayContentForMessage('system', content)).toBe(content)
  70. })
  71. })