Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions packages/web-shell/client/components/QueuedPromptDisplay.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,36 @@ describe('QueuedPromptDisplay', () => {
expect(container.textContent).toContain('排队消息二');
});

it('shows server queue status without an insert action', () => {
const onInsert = vi.fn();
const { container } = setup({
prompts: [{ id: 1, text: '等待处理', serverState: 'queued' }],
onInsert,
});

expect(container.textContent).toContain('服务器排队中...');
expect(container.querySelector('[role="status"]')).toBeTruthy();
expect(
container.querySelector('[class*="queuedPromptSpinner"]'),
).toBeNull();
const buttons = [...container.querySelectorAll('button')];
expect(buttons).toHaveLength(2);
expect(buttons.every((button) => !button.disabled)).toBe(true);
expect(container.textContent).not.toContain('插入');
expect(onInsert).not.toHaveBeenCalled();
});

it('keeps the spinner while a prompt is still submitting', () => {
const { container } = setup({
prompts: [{ id: 1, text: '正在发送', serverState: 'submitting' }],
});

expect(container.textContent).toContain('提交中...');
expect(
container.querySelector('[class*="queuedPromptSpinner"]'),
).toBeTruthy();
});

it('renders queued reference annotations as tags', () => {
const serialized = '<context id="orders">orders</context>';
const text = `inspect ${serialized} now`;
Expand Down
15 changes: 10 additions & 5 deletions packages/web-shell/client/components/QueuedPromptDisplay.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ export function QueuedPromptDisplay({
const imageCount = prompt.images?.length ?? 0;
const isCommand = isCommandPrompt(prompt.text);
const isSubmitting = prompt.serverState === 'submitting';
const isQueued = prompt.serverState === 'queued';
const isRunning = prompt.serverState === 'running';
const isRemoving = prompt.isRemoving === true;
const isBusy =
Expand Down Expand Up @@ -208,19 +209,23 @@ export function QueuedPromptDisplay({
{imageCount > 0
? ` ${t('queue.imageCount', { count: imageCount })}`
: ''}
{isSubmitting || prompt.isEditing || isRemoving ? (
<span className={styles.queuedPromptState}>
<span className={styles.queuedPromptSpinner} />
{isSubmitting || isQueued || prompt.isEditing || isRemoving ? (
<span className={styles.queuedPromptState} role="status">
{(isSubmitting || prompt.isEditing || isRemoving) && (
<span className={styles.queuedPromptSpinner} />
)}
{isRemoving
? t('queue.removing')
: prompt.isEditing
? t('queue.editing')
: t('queue.submitting')}
: isQueued
? t('queue.serverQueued')
: t('queue.submitting')}
</span>
) : null}
</span>
<span className={styles.queuedPromptActions}>
{imageCount === 0 && (
{imageCount === 0 && !isQueued && (
<button
type="button"
className={styles.queuedPromptAction}
Expand Down
2 changes: 2 additions & 0 deletions packages/web-shell/client/i18n.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1204,6 +1204,7 @@ const EN: Messages = {
'queue.insertCommandDisabled':
"Commands can't be inserted into the running turn; they run after it finishes.",
'queue.submitting': 'Submitting...',
'queue.serverQueued': 'Queued on server...',
'queue.editing': 'Editing...',
'queue.removing': 'Updating...',
'queue.submittingDisabled': 'Submitting queued message...',
Expand Down Expand Up @@ -3676,6 +3677,7 @@ const ZH: Messages = {
'queue.inserted': '已插入,下次模型调用生效。',
'queue.insertCommandDisabled': '命令无法插入当前回合。',
'queue.submitting': '提交中...',
'queue.serverQueued': '服务器排队中...',
'queue.editing': '编辑中...',
'queue.removing': '处理中...',
'queue.submittingDisabled': '排队消息正在提交中...',
Expand Down
Loading