Why: a busy conversation rejected further input, and the file list lived only behind the workspace overlay. Evidence: npx tsc --noEmit and vitest 42 tests, including outbox append/edit/promote. The queue uses Collapsible and design tokens. The files tab reuses ArtifactsPanel. Impact: while a run is active, Enter queues the draft (edit, delete, or send-now). Finished and failed runs drain the queue. HTTP 409 also enqueues instead of only toasting. Backend serialization is unchanged. Refs: task feature/input-queue Co-authored-by: Cursor <cursoragent@cursor.com>
29 lines
1.0 KiB
TypeScript
29 lines
1.0 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
enqueueMessage, enqueueMessageFront, newQueuedMessage, promoteQueuedMessage,
|
|
removeQueuedMessage, replaceQueuedText,
|
|
} from '../src/outbox'
|
|
|
|
describe('outbox', () => {
|
|
it('appends, edits, promotes, and removes', () => {
|
|
const a = newQueuedMessage('a', [], [])
|
|
const b = newQueuedMessage('b', ['f1'], ['note.md'])
|
|
let q = enqueueMessage(enqueueMessage([], a), b)
|
|
expect(q.map(x => x.text)).toEqual(['a', 'b'])
|
|
q = replaceQueuedText(q, a.id, 'a2')
|
|
expect(q[0].text).toBe('a2')
|
|
q = promoteQueuedMessage(q, b.id)
|
|
expect(q.map(x => x.text)).toEqual(['b', 'a2'])
|
|
q = removeQueuedMessage(q, b.id)
|
|
expect(q.map(x => x.text)).toEqual(['a2'])
|
|
})
|
|
|
|
it('puts a busy conflict back at the front without duplicating', () => {
|
|
const a = newQueuedMessage('a', [], [])
|
|
const b = newQueuedMessage('b', [], [])
|
|
const q = enqueueMessageFront(enqueueMessage([], a), b)
|
|
const again = enqueueMessageFront(q, b)
|
|
expect(again.map(x => x.id)).toEqual([b.id, a.id])
|
|
})
|
|
})
|