messageDisplay.test.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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: [
  9. '刘博士的技术介绍。',
  10. '',
  11. '[用户附加文件:大模型推理优化报告.docx]',
  12. '@file:\\/Users/samien/.hermes/attachments/大模型推理优化报告.docx',
  13. '',
  14. '[用户附加文件:MMLU_PRO_多模型协同评测系统_技术报告PPT_(1).pptx]',
  15. '@file:`/Users/samien/.hermes/attachments/MMLU_PRO_多模型协同评测系统_技术报告PPT_(1).pptx`',
  16. ].join('\n'),
  17. }, 'session-1', 'default')
  18. expect(message.content).toBe('刘博士的技术介绍。')
  19. expect(message.attachments).toEqual([
  20. expect.objectContaining({
  21. name: '大模型推理优化报告.docx',
  22. path: '/Users/samien/.hermes/attachments/大模型推理优化报告.docx',
  23. kind: 'file',
  24. }),
  25. expect.objectContaining({
  26. name: 'MMLU_PRO_多模型协同评测系统_技术报告PPT_(1).pptx',
  27. path: '/Users/samien/.hermes/attachments/MMLU_PRO_多模型协同评测系统_技术报告PPT_(1).pptx',
  28. kind: 'file',
  29. }),
  30. ])
  31. })
  32. it('turns iOS relative attachment markers into attachment cards', () => {
  33. const message = normalizeChatMessage({
  34. id: 'ios-user-file', role: 'user', timestamp: 1,
  35. content: '[用户附加文件:车位 四号车库-B2307 罗益民 33600元.pdf]\n@file:`attachments/车位 四号车库-B2307 罗益民 33600元.pdf`',
  36. }, 'session-1', 'default')
  37. expect(message.content).toBe('')
  38. expect(message.attachments).toEqual([
  39. expect.objectContaining({
  40. name: '车位 四号车库-B2307 罗益民 33600元.pdf',
  41. path: 'attachments/车位 四号车库-B2307 罗益民 33600元.pdf',
  42. url: '/attachments/%E8%BD%A6%E4%BD%8D%20%E5%9B%9B%E5%8F%B7%E8%BD%A6%E5%BA%93-B2307%20%E7%BD%97%E7%9B%8A%E6%B0%91%2033600%E5%85%83.pdf',
  43. kind: 'pdf',
  44. }),
  45. ])
  46. })
  47. it('hides expanded attached context while restoring a missing reference', () => {
  48. const content = [
  49. '帮我看看这个文件',
  50. '',
  51. '--- Attached Context ---',
  52. '',
  53. '📄 @file:`/Users/samien/My Notes/方案.md` (981 tokens)',
  54. '```markdown',
  55. '# 很长的附加正文',
  56. '```',
  57. ].join('\n')
  58. expect(displayContentForMessage('user', content)).toBe(
  59. '@file:`/Users/samien/My Notes/方案.md`\n\n帮我看看这个文件',
  60. )
  61. })
  62. it('keeps visible references in place and deduplicates attached references', () => {
  63. const reference = '@url:`https://example.com/a b`'
  64. const content = [
  65. reference,
  66. '总结这篇文章',
  67. '',
  68. '--- Attached Context ---',
  69. '',
  70. `🌐 ${reference} (1200 tokens)`,
  71. '正文一',
  72. `🌐 ${reference} (1200 tokens)`,
  73. '正文二',
  74. ].join('\n')
  75. expect(displayContentForMessage('user', content)).toBe(`${reference}\n总结这篇文章`)
  76. })
  77. it('supports quoted refs and removes context warnings from user display', () => {
  78. const content = [
  79. '分析附件',
  80. '',
  81. '--- Attached Context ---',
  82. '',
  83. "📁 @folder:'/Users/samien/中文 文件夹' (20 tokens)",
  84. 'folder listing',
  85. '🛠 @tool:"desktop capture" (10 tokens)',
  86. 'tool output',
  87. ].join('\n')
  88. expect(displayContentForMessage('user', content)).toBe([
  89. "@folder:'/Users/samien/中文 文件夹'",
  90. '@tool:"desktop capture"',
  91. '',
  92. '分析附件',
  93. ].join('\n'))
  94. expect(displayContentForMessage('user', '继续\n\n--- Context Warnings ---\n抓取失败')).toBe('继续')
  95. })
  96. it('never rewrites assistant or system content', () => {
  97. const content = '回答\n\n--- Attached Context ---\n\n不应隐藏'
  98. expect(displayContentForMessage('assistant', content)).toBe(content)
  99. expect(displayContentForMessage('system', content)).toBe(content)
  100. })
  101. })