import { PopupMenu, type PopupMenuItem } from "../../ui.js"; import type { ActivePopupMenu, Entry, ModelMenuValue, ModelThinkingMenuState, ParsedSlashInput, PixMenuController, PixMenuItem, PixMenuOptions, PixMenuSelectOptions, PopupMenuPlacement, QueueMessageMenuValue, RenderedLine, ResumeMenuValue, SlashCommand, ThinkingLevel, ThinkingMenuValue, UserMessageJumpMenuValue, UserMessageMenuValue } from "../types.js"; import type { AgentSession, SessionInfo } from "@earendil-works/pi-coding-agent"; type SlashCommandMenuValue = SlashCommand; type ModelPopupMenuValue = ModelMenuValue; type ResumePopupMenuValue = ResumeMenuValue; type UserMessagePopupMenuValue = UserMessageMenuValue; type UserMessageJumpPopupMenuValue = UserMessageJumpMenuValue; type QueueMessagePopupMenuValue = QueueMessageMenuValue; type SdkPopupMenuValue = PixMenuItem; type PopupMenuRendererPort = { popupMenuWidth(columns: number): number; popupMenuMargin(columns: number): number; effectivePopupMenuWidth(columns: number): number; styleOverlayLine(row: number, line: RenderedLine, width: number, activeMenu: PopupMenu): string; overlayPlainText(line: RenderedLine, width: number): string; renderUserMessageMenu(width: number, menu: PopupMenu): RenderedLine[]; renderSlashCommandMenu(width: number, menu: PopupMenu): RenderedLine[]; renderModelMenu(width: number, menu: PopupMenu, state: ModelThinkingMenuState): RenderedLine[]; renderResumeMenu(width: number, menu: PopupMenu, state: { directQuery: string; allSessionsLoaded: boolean; loadedSessionCount: number; draft: boolean; }): RenderedLine[]; renderUserMessageJumpMenu(width: number, menu: PopupMenu, directQuery: string): RenderedLine[]; renderQueueMessageMenu(width: number, menu: PopupMenu): RenderedLine[]; renderSdkMenu(width: number, menu: PopupMenu, request: { options: PixMenuOptions; } | undefined, directQuery: string): RenderedLine[]; }; export type DirectPopupMenu = Exclude; export type AppPopupMenuControllerHost = { readonly entries: readonly Entry[]; readonly session: AgentSession | undefined; currentThinkingLevel?(): ThinkingLevel | undefined; rememberedThinkingLevel?(modelRef: string): ThinkingLevel | undefined; readonly resumeLoading: boolean; readonly resumeSessionCount: number; isRunning(): boolean; getInput(): string; setInput(value: string): void; parseSlashInput(text: string): ParsedSlashInput | undefined; getSlashCommandMenuItems(query: string): PopupMenuItem[]; getModelMenuItems(query: string, includeHidden?: boolean): PopupMenuItem[]; getThinkingMenuItems(query: string): PopupMenuItem[]; getResumeMenuItems(query: string, limit?: number, options?: { draft?: boolean; }): PopupMenuItem[]; getUserMessageMenuItems(): PopupMenuItem[]; getUserMessageJumpMenuItems(query: string): PopupMenuItem[]; getQueueMessageMenuItems(): PopupMenuItem[]; hasUserEntry(entryId: string): boolean; hasQueuedEntry(entryId: string): boolean; setStatus(status: string): void; restoreSessionStatus(): void; render(): void; }; export declare class AppPopupMenuController { private readonly host; private readonly renderer; readonly menuController: PixMenuController; private readonly slashCommandMenu; private readonly modelMenu; private readonly resumeMenu; private readonly userMessageMenu; private readonly userMessageJumpMenu; private readonly queueMessageMenu; private readonly sdkMenu; private sdkMenuRequest; private slashCommandMenuQuery; private dismissedSlashCommandMenuInput; private modelMenuQuery; private dismissedModelMenuInput; private modelThinkingInputQuery; private dismissedThinkingMenuInput; private modelThinkingLevel; private modelThinkingSelectedRef; private readonly stagedThinkingByModel; private modelThinkingSource; private modelVisibilityMode; private directPopupMenu; private directPopupMenuPreserveStatus; private directPopupMenuPlacement; private directPopupMenuQuery; private resumeMenuQuery; private resumeMenuSessionLimit; private resumeMenuAllSessionsLoaded; private resumeMenuMode; private activeUserMessageEntryId; private activeQueuedMessageEntryId; constructor(host: AppPopupMenuControllerHost, renderer: PopupMenuRendererPort); get directMenu(): DirectPopupMenu | undefined; get directQuery(): string; draftSessionSelectorActive(): boolean; closeDraftSessionSelectorForTabLifecycle(): void; setResumeMenuMode(mode: "resume" | "draft"): void; setDirectMenu(menu: DirectPopupMenu | undefined): void; setDirectPreserveStatus(preserveStatus: boolean): void; setDirectQuery(query: string): void; resetInputMenuDismissals(): void; showSdkMenu(items: readonly PixMenuItem[], options: PixMenuOptions): Promise; selectSdkMenu(title: string, options: readonly string[], menuOptions?: PixMenuSelectOptions): Promise; closeSdkMenu(value: unknown | undefined, options?: { render?: boolean; restoreStatus?: boolean; }): void; getActivePopupMenu(active: ActivePopupMenu): PopupMenu; moveActivePopupMenuSelection(delta: number): boolean; moveActiveModelThinkingLevel(delta: number): boolean; toggleModelVisibilityMode(): boolean; modelVisibilityModeActive(): boolean; scrollActivePopupMenu(delta: number): boolean; selectActivePopupMenuIndex(index: number): ActivePopupMenu | undefined; handleDirectPopupInput(char: string): boolean; openDirectPopupMenu(menu: DirectPopupMenu, options?: { preserveStatus?: boolean; placement?: PopupMenuPlacement; }): void; popupMenuPlacement(): PopupMenuPlacement; openUserMessageMenu(entryId: string): boolean; openQueueMessageMenu(entryId: string): boolean; openResumeMenuWithQuery(query: string): void; closeResumeMenu(): void; closeUserMessageMenu(): void; closeUserMessageJumpMenu(): void; closeQueueMessageMenu(): void; resetConversationMenuState(): void; closeModelSelection(): void; closeSlashCommandSelection(): void; closeMenusForTabSwitch(): void; cancelActivePopupMenu(): void; autocompleteSlashCommand(): void; autocompleteModel(): boolean; selectedSlashCommand(): SlashCommand | undefined; selectedModel(): { value: ModelMenuValue; direct: boolean; } | undefined; selectedModelThinking(): { value: ModelMenuValue; thinkingLevel: ThinkingLevel; direct: boolean; source: "model" | "thinking"; } | undefined; selectedResume(): ResumeMenuValue | undefined; selectedUserMessageAction(): { value: UserMessageMenuValue; label: string; entryId: string; } | undefined; selectedUserMessageJump(): UserMessageJumpMenuValue | undefined; selectedQueueMessageAction(): { value: QueueMessageMenuValue; label: string; entryId: string; } | undefined; submitSelectedSdkMenu(): boolean; syncActivePopupMenu(): ActivePopupMenu | undefined; renderActivePopupMenu(width: number): RenderedLine[]; popupMenuWidth(columns: number): number; popupMenuMargin(columns: number): number; effectivePopupMenuWidth(columns: number): number; styleOverlayLine(row: number, line: RenderedLine, width: number): string; overlayPlainText(line: RenderedLine, width: number): string; isDynamicConversationBlock(entry: Entry): boolean; hasDynamicConversationBlock(): boolean; renderInlineUserMessageMenu(entry: Extract, options: { userContentWidth: number; userContentLeft: number; userLine: (text: string, entryId?: string, syntaxHighlight?: RenderedLine["syntaxHighlight"]) => RenderedLine; }): RenderedLine[]; private withoutCloseMenuItems; private resetPopupMenuSelection; private resetResumeMenuLazyState; private maybeGrowResumeMenuWindow; private updateResumeMenuLoadedState; private resumeMenuLoadedSessionCount; private syncModelMenu; private modelThinkingQuery; private stageThinkingFromQuery; private modelThinkingMenuState; private syncModelThinkingToSelectedModel; private rememberStagedThinking; private selectedModelThinkingLevels; private clampThinkingLevel; private resetModelThinkingState; private syncResumeMenu; private syncUserMessageMenu; private syncUserMessageJumpMenu; private syncQueueMessageMenu; private syncSdkMenu; private syncSlashCommandMenu; private closeMenusExcept; private getSdkMenuItems; } export type SessionInfoMenuItemsLoader = { readonly total: number; items(limit?: number): PopupMenuItem[]; }; export declare function createSessionInfoMenuItemsLoader(sessions: readonly SessionInfo[], currentSessionFile: string | undefined, query: string): SessionInfoMenuItemsLoader; export declare function formatSessionInfoMenuItems(sessions: readonly SessionInfo[], currentSessionFile: string | undefined, query: string, options?: { limit?: number; }): PopupMenuItem[]; export type UserMessageJumpSourceItem = { text: string; entryId?: string; sessionEntryId?: string; }; export declare function buildUserMessageJumpItems(entries: readonly Entry[] | readonly UserMessageJumpSourceItem[]): PopupMenuItem[]; export declare function filterUserMessageJumpItems(items: readonly PopupMenuItem[], query: string): PopupMenuItem[]; export type { ModelPopupMenuValue, QueueMessagePopupMenuValue, ResumePopupMenuValue, SlashCommandMenuValue, UserMessageJumpPopupMenuValue, UserMessagePopupMenuValue, };