feat(commands): Implement argument handling for custom commands via a prompt pipeline (#4702)

This commit is contained in:
Abhi
2025-07-23 16:11:23 -04:00
committed by GitHub
parent 2d1eafae95
commit bbe95f1eaa
9 changed files with 393 additions and 18 deletions

View File

@@ -14,6 +14,15 @@ import { SessionStatsState } from '../contexts/SessionContext.js';
// Grouped dependencies for clarity and easier mocking
export interface CommandContext {
// Invocation properties for when commands are called.
invocation?: {
/** The raw, untrimmed input string from the user. */
raw: string;
/** The primary name of the command that was matched. */
name: string;
/** The arguments string that follows the command name. */
args: string;
};
// Core services and configuration
services: {
// TODO(abhipatel12): Ensure that config is never null.
@@ -132,7 +141,7 @@ export interface SlashCommand {
// The action to run. Optional for parent commands that only group sub-commands.
action?: (
context: CommandContext,
args: string,
args: string, // TODO: Remove args. CommandContext now contains the complete invocation.
) =>
| void
| SlashCommandActionReturn

View File

@@ -238,7 +238,18 @@ export const useSlashCommandProcessor = (
const args = parts.slice(pathIndex).join(' ');
if (commandToExecute.action) {
const result = await commandToExecute.action(commandContext, args);
const fullCommandContext: CommandContext = {
...commandContext,
invocation: {
raw: trimmed,
name: commandToExecute.name,
args,
},
};
const result = await commandToExecute.action(
fullCommandContext,
args,
);
if (result) {
switch (result.type) {
@@ -288,9 +299,9 @@ export const useSlashCommandProcessor = (
await config
?.getGeminiClient()
?.setHistory(result.clientHistory);
commandContext.ui.clear();
fullCommandContext.ui.clear();
result.history.forEach((item, index) => {
commandContext.ui.addItem(item, index);
fullCommandContext.ui.addItem(item, index);
});
return { type: 'handled' };
}