feat(coding-agent): Add widget placement option (#850)

* Add widget placement for extension widgets

* Remove changelog entry for widget placement

* Keep no-op widget signature

* Move widget render before attach
This commit is contained in:
Marc Krenn 2026-01-19 15:54:24 +01:00 committed by GitHub
parent 6327bfd3dc
commit abb1775ff7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 114 additions and 36 deletions

View file

@ -58,6 +58,7 @@ export type {
ExtensionShortcut,
ExtensionUIContext,
ExtensionUIDialogOptions,
ExtensionWidgetOptions,
FindToolResultEvent,
GetActiveToolsHandler,
GetAllToolsHandler,
@ -116,6 +117,7 @@ export type {
// Events - User Bash
UserBashEvent,
UserBashEventResult,
WidgetPlacement,
WriteToolResultEvent,
} from "./types.js";
// Type guards

View file

@ -68,6 +68,15 @@ export interface ExtensionUIDialogOptions {
timeout?: number;
}
/** Placement for extension widgets. */
export type WidgetPlacement = "aboveEditor" | "belowEditor";
/** Options for extension widgets. */
export interface ExtensionWidgetOptions {
/** Where the widget is rendered. Defaults to "aboveEditor". */
placement?: WidgetPlacement;
}
/**
* UI context for extensions to request interactive UI.
* Each mode (interactive, RPC, print) provides its own implementation.
@ -91,9 +100,13 @@ export interface ExtensionUIContext {
/** Set the working/loading message shown during streaming. Call with no argument to restore default. */
setWorkingMessage(message?: string): void;
/** Set a widget to display above the editor. Accepts string array or component factory. */
setWidget(key: string, content: string[] | undefined): void;
setWidget(key: string, content: ((tui: TUI, theme: Theme) => Component & { dispose?(): void }) | undefined): void;
/** Set a widget to display above or below the editor. Accepts string array or component factory. */
setWidget(key: string, content: string[] | undefined, options?: ExtensionWidgetOptions): void;
setWidget(
key: string,
content: ((tui: TUI, theme: Theme) => Component & { dispose?(): void }) | undefined,
options?: ExtensionWidgetOptions,
): void;
/** Set a custom footer component, or undefined to restore the built-in footer.
*