mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-06-17 23:50:21 +08:00
Chromium exposes the same pasted image on both DataTransfer.items and .files as distinct Blob objects, which attached twice. Prefer items and skip the files mirror when items already yielded images.
78 lines
2.2 KiB
TypeScript
78 lines
2.2 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
|
|
import { blobDedupeKey, detectTrigger, extractClipboardImageBlobs } from './text-utils'
|
|
|
|
describe('detectTrigger', () => {
|
|
it('detects a bare slash trigger with an empty query', () => {
|
|
expect(detectTrigger('/')).toEqual({ kind: '/', query: '', tokenLength: 1 })
|
|
})
|
|
|
|
it('detects a slash command query', () => {
|
|
expect(detectTrigger('/skill')).toEqual({ kind: '/', query: 'skill', tokenLength: 6 })
|
|
})
|
|
|
|
it('detects a bare at-mention trigger with an empty query', () => {
|
|
expect(detectTrigger('@')).toEqual({ kind: '@', query: '', tokenLength: 1 })
|
|
})
|
|
|
|
it('detects an at-mention query', () => {
|
|
expect(detectTrigger('@file')).toEqual({ kind: '@', query: 'file', tokenLength: 5 })
|
|
})
|
|
|
|
it('returns null for plain text', () => {
|
|
expect(detectTrigger('hello there')).toBeNull()
|
|
})
|
|
})
|
|
|
|
describe('extractClipboardImageBlobs', () => {
|
|
it('dedupes the same image exposed on both items and files', () => {
|
|
const image = new File([new Uint8Array([1, 2, 3])], 'paste.png', {
|
|
type: 'image/png',
|
|
lastModified: 1_700_000_000_000
|
|
})
|
|
|
|
const clipboard = {
|
|
files: {
|
|
length: 1,
|
|
item: (index: number) => (index === 0 ? image : null)
|
|
},
|
|
getData: () => '',
|
|
items: [
|
|
{
|
|
kind: 'file',
|
|
type: 'image/png',
|
|
getAsFile: () => image
|
|
}
|
|
]
|
|
} as unknown as DataTransfer
|
|
|
|
expect(extractClipboardImageBlobs(clipboard)).toEqual([image])
|
|
})
|
|
|
|
it('falls back to files when items has no image', () => {
|
|
const image = new File([new Uint8Array([4, 5])], 'shot.jpg', {
|
|
type: 'image/jpeg',
|
|
lastModified: 1_700_000_000_001
|
|
})
|
|
|
|
const clipboard = {
|
|
files: {
|
|
length: 1,
|
|
item: (index: number) => (index === 0 ? image : null)
|
|
},
|
|
getData: () => '',
|
|
items: []
|
|
} as unknown as DataTransfer
|
|
|
|
expect(extractClipboardImageBlobs(clipboard)).toEqual([image])
|
|
})
|
|
})
|
|
|
|
describe('blobDedupeKey', () => {
|
|
it('uses file metadata for File blobs', () => {
|
|
const file = new File([], 'a.png', { type: 'image/png', lastModified: 42 })
|
|
|
|
expect(blobDedupeKey(file)).toBe('file:a.png:0:image/png:42')
|
|
})
|
|
})
|