feat(cli): allow safe tools to execute concurrently while agent is busy (#21988)

This commit is contained in:
Spencer
2026-03-12 12:03:53 -04:00
committed by GitHub
parent e700a9220b
commit 73c589f9e3
8 changed files with 59 additions and 1 deletions
@@ -94,6 +94,12 @@ afterEach(() => {
});
const mockSlashCommands: SlashCommand[] = [
{
name: 'stats',
description: 'Check stats',
kind: CommandKind.BUILT_IN,
isSafeConcurrent: true,
},
{
name: 'clear',
kind: CommandKind.BUILT_IN,
@@ -3876,6 +3882,13 @@ describe('InputPrompt', () => {
shouldSubmit: false,
errorMessage: 'Slash commands cannot be queued',
},
{
name: 'should allow concurrent-safe slash commands',
bufferText: '/stats',
shellMode: false,
shouldSubmit: true,
errorMessage: null,
},
{
name: 'should prevent shell commands',
bufferText: 'ls',
+19 -1
View File
@@ -58,6 +58,7 @@ import {
isAutoExecutableCommand,
isSlashCommand,
} from '../utils/commandUtils.js';
import { parseSlashCommand } from '../../utils/commands.js';
import * as path from 'node:path';
import { SCREEN_READER_USER_PREFIX } from '../textConstants.js';
import { getSafeLowColorBackground } from '../themes/color-utils.js';
@@ -408,6 +409,17 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
(isSlash || isShell) &&
streamingState === StreamingState.Responding
) {
if (isSlash) {
const { commandToExecute } = parseSlashCommand(
trimmedMessage,
slashCommands,
);
if (commandToExecute?.isSafeConcurrent) {
inputHistory.handleSubmit(trimmedMessage);
return;
}
}
setQueueErrorMessage(
`${isShell ? 'Shell' : 'Slash'} commands cannot be queued`,
);
@@ -415,7 +427,13 @@ export const InputPrompt: React.FC<InputPromptProps> = ({
}
inputHistory.handleSubmit(trimmedMessage);
},
[inputHistory, shellModeActive, streamingState, setQueueErrorMessage],
[
inputHistory,
shellModeActive,
streamingState,
setQueueErrorMessage,
slashCommands,
],
);
// Effect to reset completion if history navigation just occurred and set the text