buroventures-harald-code
Version:
Harald Code - AI-powered coding assistant CLI
138 lines (137 loc) • 4.83 kB
TypeScript
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import { Content } from '@google/genai';
import { HistoryItemWithoutId } from '../types.js';
import { Config, GitService, Logger } from 'buroventures-harald-code-core';
import { LoadedSettings } from '../../config/settings.js';
import { UseHistoryManagerReturn } from '../hooks/useHistoryManager.js';
import type { HistoryItem } from '../types.js';
import { SessionStatsState } from '../contexts/SessionContext.js';
export interface CommandContext {
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;
};
services: {
config: Config | null;
settings: LoadedSettings;
git: GitService | undefined;
logger: Logger;
};
ui: {
/** Adds a new item to the history display. */
addItem: UseHistoryManagerReturn['addItem'];
/** Clears all history items and the console screen. */
clear: () => void;
/**
* Sets the transient debug message displayed in the application footer in debug mode.
*/
setDebugMessage: (message: string) => void;
/** The currently pending history item, if any. */
pendingItem: HistoryItemWithoutId | null;
/**
* Sets a pending item in the history, which is useful for indicating
* that a long-running operation is in progress.
*
* @param item The history item to display as pending, or `null` to clear.
*/
setPendingItem: (item: HistoryItemWithoutId | null) => void;
/**
* Loads a new set of history items, replacing the current history.
*
* @param history The array of history items to load.
*/
loadHistory: UseHistoryManagerReturn['loadHistory'];
/** Toggles a special display mode. */
toggleCorgiMode: () => void;
toggleVimEnabled: () => Promise<boolean>;
};
session: {
stats: SessionStatsState;
resetSession: () => void;
/** A transient list of shell commands the user has approved for this session. */
sessionShellAllowlist: Set<string>;
};
}
/**
* The return type for a command action that results in scheduling a tool call.
*/
export interface ToolActionReturn {
type: 'tool';
toolName: string;
toolArgs: Record<string, unknown>;
}
/** The return type for a command action that results in the app quitting. */
export interface QuitActionReturn {
type: 'quit';
messages: HistoryItem[];
}
/**
* The return type for a command action that results in a simple message
* being displayed to the user.
*/
export interface MessageActionReturn {
type: 'message';
messageType: 'info' | 'error';
content: string;
}
/**
* The return type for a command action that needs to open a dialog.
*/
export interface OpenDialogActionReturn {
type: 'dialog';
dialog: 'auth' | 'theme' | 'editor' | 'privacy';
}
/**
* The return type for a command action that results in replacing
* the entire conversation history.
*/
export interface LoadHistoryActionReturn {
type: 'load_history';
history: HistoryItemWithoutId[];
clientHistory: Content[];
}
/**
* The return type for a command action that should immediately submit
* content as a prompt to the Gemini model.
*/
export interface SubmitPromptActionReturn {
type: 'submit_prompt';
content: string;
}
/**
* The return type for a command action that needs to pause and request
* confirmation for a set of shell commands before proceeding.
*/
export interface ConfirmShellCommandsActionReturn {
type: 'confirm_shell_commands';
/** The list of shell commands that require user confirmation. */
commandsToConfirm: string[];
/** The original invocation context to be re-run after confirmation. */
originalInvocation: {
raw: string;
};
}
export type SlashCommandActionReturn = ToolActionReturn | MessageActionReturn | QuitActionReturn | OpenDialogActionReturn | LoadHistoryActionReturn | SubmitPromptActionReturn | ConfirmShellCommandsActionReturn;
export declare enum CommandKind {
BUILT_IN = "built-in",
FILE = "file",
MCP_PROMPT = "mcp-prompt"
}
export interface SlashCommand {
name: string;
altNames?: string[];
description: string;
kind: CommandKind;
extensionName?: string;
action?: (context: CommandContext, args: string) => void | SlashCommandActionReturn | Promise<void | SlashCommandActionReturn>;
completion?: (context: CommandContext, partialArg: string) => Promise<string[]>;
subCommands?: SlashCommand[];
}