components

package
v0.183.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 27, 2026 License: Apache-2.0 Imports: 67 Imported by: 0

Documentation

Index

Constants

View Source
const AutoCollapseDelay = 3 * time.Second

AutoCollapseDelay is the duration to wait before auto-collapsing after an update

Variables

This section is empty.

Functions

func FormatAnnotations

func FormatAnnotations(root string, sels []SnippetSelection) string

FormatAnnotations builds an LLM-ready context block from a set of snippet selections. Selections are grouped by file (deduping file reads). Only the selected line ranges are emitted - never the whole file - each as a fenced block headed by `<file> (lines X-Y):`, optionally followed by a `note:` line when the user attached an instruction.

The output format is:

<file> (lines <start>-<end>):
```<ext>
<the selected lines, raw>
```
note: <annotation>   (only when an annotation was attached)

This is a pure function (no receiver state) so it is independently unit-testable.

func ScheduleAutoCollapse

func ScheduleAutoCollapse() tea.Cmd

ScheduleAutoCollapse returns a command that will send AutoCollapseTickMsg after the delay

Types

type A2AAgentsViewImpl

type A2AAgentsViewImpl struct {
	// contains filtered or unexported fields
}

A2AAgentsViewImpl is a read-only, filterable list of the registered A2A agents and their readiness. Like the tools view it is display-only for now.

func NewA2AAgentsView

func NewA2AAgentsView(stateManager AgentReadinessManager, styleProvider *styles.Provider) *A2AAgentsViewImpl

NewA2AAgentsView creates the A2A agents list view. Items are populated by Reset on every entry because agent readiness changes as agents start up.

func (*A2AAgentsViewImpl) Init

func (m *A2AAgentsViewImpl) Init() tea.Cmd

func (*A2AAgentsViewImpl) IsCancelled

func (m *A2AAgentsViewImpl) IsCancelled() bool

IsCancelled returns true once the user has dismissed the view.

func (*A2AAgentsViewImpl) Reset

func (m *A2AAgentsViewImpl) Reset()

Reset returns the view to its initial state and rebuilds the items so the list reflects the latest agent readiness.

func (*A2AAgentsViewImpl) SetHeight

func (m *A2AAgentsViewImpl) SetHeight(height int)

SetHeight sets the height of the agents view.

func (*A2AAgentsViewImpl) SetWidth

func (m *A2AAgentsViewImpl) SetWidth(width int)

SetWidth sets the width of the agents view.

func (*A2AAgentsViewImpl) Update

func (m *A2AAgentsViewImpl) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*A2AAgentsViewImpl) View

func (m *A2AAgentsViewImpl) View() tea.View

type AgentReadinessManager

type AgentReadinessManager interface {
	InitializeAgentReadiness(totalAgents int)
	UpdateAgentStatus(name string, state agentdomain.AgentState, message string, url string, image string)
	SetAgentError(name string, err error)
	GetAgentReadiness() *tui.AgentReadinessState
	AreAllAgentsReady() bool
	ClearAgentReadiness()
	RemoveAgent(name string)
}

InputStatusBar displays input status information like model, theme, agents AgentReadinessManager handles A2A agent readiness tracking

type ApplicationViewRenderer

type ApplicationViewRenderer struct {
	// contains filtered or unexported fields
}

ApplicationViewRenderer handles rendering of different application views

func NewApplicationViewRenderer

func NewApplicationViewRenderer(styleProvider *styles.Provider) *ApplicationViewRenderer

NewApplicationViewRenderer creates a new application view renderer

func (*ApplicationViewRenderer) RenderChatInterface

func (r *ApplicationViewRenderer) RenderChatInterface(
	data ChatInterfaceData,
	conversationView tui.ConversationRenderer,
	inputView tui.InputComponent,
	autocomplete tui.AutocompleteComponent,
	inputStatusBar tui.InputStatusBarComponent,
	statusView tui.StatusComponent,
	modeIndicator *ModeIndicator,
	helpBar tui.HelpBarComponent,
	queueBoxView *QueueBoxView,
	todoBoxView *TodoBoxView,
	approvalBoxView *ApprovalBoxView,
	questionFormView *QuestionFormView,
	snippetAttachments *SnippetAttachmentsView,
) string

RenderChatInterface renders the main chat interface

func (*ApplicationViewRenderer) RenderFileSelection

func (r *ApplicationViewRenderer) RenderFileSelection(
	data FileSelectionData,
	fileSelectionView *FileSelectionView,
) string

RenderFileSelection renders the file selection view

type ApprovalBoxView

type ApprovalBoxView struct {
	// contains filtered or unexported fields
}

func NewApprovalBoxView

func NewApprovalBoxView(styleProvider *styles.Provider, stateManager agentdomain.ApprovalUIManager, toolFormatter agentdomain.ToolFormatter) *ApprovalBoxView

func (*ApprovalBoxView) Begin

func (av *ApprovalBoxView) Begin() tea.Cmd

Begin builds the action select for the approval currently in the StateManager. Call it when a ToolApprovalRequestedEvent has set up the state.

func (*ApprovalBoxView) Forward

func (av *ApprovalBoxView) Forward(msg tea.Msg) tea.Cmd

Forward delegates a message to the action select. On completion it emits the ToolApprovalResponseEvent that the approval coordinator consumes.

func (*ApprovalBoxView) Init

func (av *ApprovalBoxView) Init() tea.Cmd

func (*ApprovalBoxView) IsActive

func (av *ApprovalBoxView) IsActive() bool

IsActive reports whether an approval is *currently* being shown, so the caller can route ctrl+o to this box instead of the conversation. It consults the live StateManager (like Render does) rather than trusting av.active/av.form alone: those fields are only reset by the form's own completion, so after an approval is cleared externally (rejection resolved, timeout) they can linger — and a stale true here would swallow ctrl+o from the rejected result the user is trying to expand.

func (*ApprovalBoxView) IsExpanded

func (av *ApprovalBoxView) IsExpanded() bool

IsExpanded reports whether the diff is in the scrollable expanded view, so the caller can route up/down to scroll it instead of the conversation.

func (*ApprovalBoxView) Render

func (av *ApprovalBoxView) Render() string

func (*ApprovalBoxView) ScrollDiff

func (av *ApprovalBoxView) ScrollDiff(delta int)

ScrollDiff moves the expanded diff window by delta lines (up/down). It is a no-op unless the diff is expanded; the top is clamped here and the bottom at render time (which is where the window height is known).

func (*ApprovalBoxView) SetHeight

func (av *ApprovalBoxView) SetHeight(height int)

func (*ApprovalBoxView) SetKeyHintFormatter

func (av *ApprovalBoxView) SetKeyHintFormatter(formatter *hints.Formatter)

func (*ApprovalBoxView) SetWidth

func (av *ApprovalBoxView) SetWidth(width int)

func (*ApprovalBoxView) ToggleExpanded

func (av *ApprovalBoxView) ToggleExpanded()

ToggleExpanded flips between the capped diff preview and the scrollable full-diff window, matching the ctrl+o tool-result expansion in the conversation view.

func (*ApprovalBoxView) Update

func (av *ApprovalBoxView) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*ApprovalBoxView) View

func (av *ApprovalBoxView) View() tea.View

type AutoCollapseTickMsg

type AutoCollapseTickMsg struct{}

AutoCollapseTickMsg is sent to trigger auto-collapse check

type BackgroundTaskDisplay

type BackgroundTaskDisplay struct {
	TaskID             string
	AgentName          string
	AgentURL           string
	Model              string
	State              string
	Message            string
	UsageJSON          string
	ExecutionStatsJSON string
	ErrorMsg           string
	IsTerminal         bool
	StartedAt          time.Time
	CompletedAt        time.Time
}

BackgroundTaskDisplay tracks the live state of a remote A2A task for inline visualisation under the originating A2A_SubmitTask tool result. It is UI-only ephemeral state and is not persisted with the conversation.

type BackgroundTaskRemovalTickMsg

type BackgroundTaskRemovalTickMsg struct {
	TaskID string
}

BackgroundTaskRemovalTickMsg is dispatched backgroundTaskRemovalDelay after a task reaches a terminal state to remove its inline indicator from the view.

type ChatInterfaceData

type ChatInterfaceData struct {
	Width          int
	Height         int
	ToolExecution  *agentdomain.ToolExecutionSession
	QueuedMessages []convdomain.QueuedMessage
}

ChatInterfaceData holds the data needed to render the chat interface

type ConversationSelectorImpl

type ConversationSelectorImpl struct {
	// contains filtered or unexported fields
}

ConversationSelectorImpl implements conversation selection UI

func NewConversationSelector

func NewConversationSelector(repo shortcuts.PersistentConversationRepository, styleProvider *styles.Provider) *ConversationSelectorImpl

NewConversationSelector creates a new conversation selector

func (*ConversationSelectorImpl) GetSelected

GetSelected returns the selected conversation

func (*ConversationSelectorImpl) Init

func (c *ConversationSelectorImpl) Init() tea.Cmd

func (*ConversationSelectorImpl) IsCancelled

func (c *ConversationSelectorImpl) IsCancelled() bool

IsCancelled returns true if selection was cancelled

func (*ConversationSelectorImpl) IsSelected

func (c *ConversationSelectorImpl) IsSelected() bool

IsSelected returns true if a conversation was selected

func (*ConversationSelectorImpl) NeedsInitialization

func (c *ConversationSelectorImpl) NeedsInitialization() bool

NeedsInitialization returns true if the component needs to load data

func (*ConversationSelectorImpl) Reset

func (c *ConversationSelectorImpl) Reset()

Reset resets the conversation selector state for reuse

func (*ConversationSelectorImpl) SetHeight

func (c *ConversationSelectorImpl) SetHeight(height int)

SetHeight sets the height of the conversation selector

func (*ConversationSelectorImpl) SetWidth

func (c *ConversationSelectorImpl) SetWidth(width int)

SetWidth sets the width of the conversation selector

func (*ConversationSelectorImpl) Update

func (c *ConversationSelectorImpl) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*ConversationSelectorImpl) View

func (c *ConversationSelectorImpl) View() tea.View

type ConversationView

type ConversationView struct {
	Viewport viewport.Model
	// contains filtered or unexported fields
}

ConversationView handles the chat conversation display. It is confined to the Bubble Tea event loop: all state is read and written from Update/View only, so it holds no locks. Off-loop producers must go through Program.Send.

func NewConversationView

func NewConversationView(styleProvider *styles.Provider) *ConversationView

func (*ConversationView) BackgroundTasksBarHeight

func (cv *ConversationView) BackgroundTasksBarHeight() int

BackgroundTasksBarHeight returns the line count the sticky indicator will occupy, for use in the parent layout's height budgeting. Terminal states render across multiple lines (header + usage + execution_stats), so this counts the actual rendered newlines rather than just the task count.

func (*ConversationView) CanScrollDown

func (cv *ConversationView) CanScrollDown() bool

func (*ConversationView) CanScrollUp

func (cv *ConversationView) CanScrollUp() bool

func (*ConversationView) EnterMessageHistoryMode

func (cv *ConversationView) EnterMessageHistoryMode(snapshots []tui.MessageSnapshot)

EnterMessageHistoryMode switches the conversation view to message history navigation mode

func (*ConversationView) ExitMessageHistoryMode

func (cv *ConversationView) ExitMessageHistoryMode()

ExitMessageHistoryMode returns the conversation view to normal mode

func (*ConversationView) GetPlainTextLines

func (cv *ConversationView) GetPlainTextLines() []string

GetPlainTextLines returns the conversation as plain text lines for selection mode This returns the actual rendered content that was displayed in the viewport, preserving the same text wrapping and formatting

func (*ConversationView) GetScrollOffset

func (cv *ConversationView) GetScrollOffset() int

func (*ConversationView) GetSelectedMessageIndex

func (cv *ConversationView) GetSelectedMessageIndex() int

GetSelectedMessageIndex returns the conversation index of the selected message

func (*ConversationView) GetSelectedMessageSnapshot

func (cv *ConversationView) GetSelectedMessageSnapshot() *tui.MessageSnapshot

GetSelectedMessageSnapshot returns the full snapshot of the selected message

func (*ConversationView) HasBackgroundTasks

func (cv *ConversationView) HasBackgroundTasks() bool

HasBackgroundTasks reports whether there is at least one tracked background task (A2A task or local subagent) to render in the sticky bar.

func (*ConversationView) Init

func (cv *ConversationView) Init() tea.Cmd

Bubble Tea interface

func (*ConversationView) IsInMessageHistoryMode

func (cv *ConversationView) IsInMessageHistoryMode() bool

IsInMessageHistoryMode returns true if currently in message history navigation mode

func (*ConversationView) IsRawFormat

func (cv *ConversationView) IsRawFormat() bool

IsRawFormat returns true if raw format (no markdown rendering) is enabled

func (*ConversationView) IsThinkingExpanded

func (cv *ConversationView) IsThinkingExpanded(index int) bool

func (*ConversationView) IsToolResultExpanded

func (cv *ConversationView) IsToolResultExpanded(index int) bool

IsToolResultExpanded returns the effective expansion of a tool result: an explicit user choice (set via ctrl+o or a per-entry toggle) if present, otherwise the per-tool default from defaultExpandedTools.

func (*ConversationView) NavigateHistoryDown

func (cv *ConversationView) NavigateHistoryDown()

NavigateHistoryDown moves the selection down in message history

func (*ConversationView) NavigateHistoryUp

func (cv *ConversationView) NavigateHistoryUp()

NavigateHistoryUp moves the selection up in message history

func (*ConversationView) RefreshTheme

func (cv *ConversationView) RefreshTheme()

RefreshTheme rebuilds the markdown renderer with current theme colors

func (*ConversationView) Render

func (cv *ConversationView) Render() string

func (*ConversationView) RenderBackgroundTasksBar

func (cv *ConversationView) RenderBackgroundTasksBar(width int) string

RenderBackgroundTasksBar returns the sticky multi-line indicator block rendered above the input area. Each tracked task gets one line. Order is stable (lexicographic by TaskID) so concurrent tasks don't jitter between renders. Returns "" when there are no tasks to show. The width controls non-terminal truncation of the model= segment; pass 0 to disable truncation entirely (used in some tests).

func (*ConversationView) ResetUserScroll

func (cv *ConversationView) ResetUserScroll()

ResetUserScroll resets the user scroll state, enabling auto-scroll to bottom. Call this when a new message is sent to ensure the user sees the latest response.

func (*ConversationView) SetAgentModelResolver

func (cv *ConversationView) SetAgentModelResolver(resolver func(url string) string)

SetAgentModelResolver injects a URL→model lookup used when rendering the background-agent indicator's "model=" segment. Pass nil to omit that segment (the visual then drops "model=" cleanly).

func (*ConversationView) SetAgentNameResolver

func (cv *ConversationView) SetAgentNameResolver(resolver func(url string) string)

SetAgentNameResolver injects a URL→friendly-name lookup used when rendering background-agent indicators. Pass nil to disable resolution (the visual then falls back to the agent URL).

func (*ConversationView) SetConfigPath

func (cv *ConversationView) SetConfigPath(configPath string)

SetConfigPath sets the config path for the welcome message

func (*ConversationView) SetConversation

func (cv *ConversationView) SetConversation(conversation []convdomain.ConversationEntry)

func (*ConversationView) SetDefaultExpandedTools

func (cv *ConversationView) SetDefaultExpandedTools(names map[string]bool)

SetDefaultExpandedTools overrides which tool names render expanded by default.

func (*ConversationView) SetHeight

func (cv *ConversationView) SetHeight(height int)

func (*ConversationView) SetKeyHintFormatter

func (cv *ConversationView) SetKeyHintFormatter(formatter *hints.Formatter)

SetKeyHintFormatter sets the key hint formatter for displaying keybinding hints

func (*ConversationView) SetStateManager

func (cv *ConversationView) SetStateManager(stateManager agentdomain.PlanApprovalUIManager)

SetStateManager sets the state manager for accessing plan approval state

func (*ConversationView) SetToolCallRenderer

func (cv *ConversationView) SetToolCallRenderer(renderer *ToolCallRenderer)

SetToolCallRenderer sets the tool call renderer for displaying real-time tool execution status

func (*ConversationView) SetToolFormatter

func (cv *ConversationView) SetToolFormatter(formatter agentdomain.ToolFormatter)

SetToolFormatter sets the tool formatter for this conversation view

func (*ConversationView) SetVersionInfo

func (cv *ConversationView) SetVersionInfo(info tui.VersionInfo)

SetVersionInfo sets the version information for the welcome message

func (*ConversationView) SetWidth

func (cv *ConversationView) SetWidth(width int)

func (*ConversationView) ToggleAllThinkingExpansion

func (cv *ConversationView) ToggleAllThinkingExpansion()

func (*ConversationView) ToggleAllToolResultsExpansion

func (cv *ConversationView) ToggleAllToolResultsExpansion()

func (*ConversationView) ToggleRawFormat

func (cv *ConversationView) ToggleRawFormat()

ToggleRawFormat toggles between raw and rendered markdown display

func (*ConversationView) ToggleToolResultExpansion

func (cv *ConversationView) ToggleToolResultExpansion(index int)

func (*ConversationView) Update

func (cv *ConversationView) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*ConversationView) View

func (cv *ConversationView) View() tea.View

type DiffViewerImpl

type DiffViewerImpl struct {
	// contains filtered or unexported fields
}

DiffViewerImpl is the VS Code-style "Changes" side panel: a left tree of changed files (grouped Staged/Changes → folder → file) plus a scrollable diff pane for the selected file. It owns its full [sidebar | divider | diff] region; the chat input row is composed beneath the diff pane by the caller.

func NewDiffViewer

func NewDiffViewer(source gitdiff.Source, styleProvider *styles.Provider, themeService tui.ThemeService, kb config.KeybindingsConfig) *DiffViewerImpl

NewDiffViewer creates a changes panel backed by the given git source.

func (*DiffViewerImpl) FooterBar

func (t *DiffViewerImpl) FooterBar(width int) string

FooterBar renders the per-mode keybinding legend shown beneath the diff pane, greedy-wrapped to width so no binding is truncated (issue #875).

func (*DiffViewerImpl) HintText

func (t *DiffViewerImpl) HintText() string

HintText returns the footer hint for the current mode (tree vs patch).

func (*DiffViewerImpl) Init

func (t *DiffViewerImpl) Init() tea.Cmd

Init loads the current diff once. It refreshes thereafter on view-entry (reopen re-runs this), on in-loop tool/bash completion events, on git stage/unstage/discard actions, and on the manual refresh key - no polling tick.

func (*DiffViewerImpl) IsCancelled

func (t *DiffViewerImpl) IsCancelled() bool

func (*DiffViewerImpl) IsDone

func (t *DiffViewerImpl) IsDone() bool

func (*DiffViewerImpl) PaneWidth

func (t *DiffViewerImpl) PaneWidth() int

PaneWidth returns the current diff-pane width (after SetWidth), so the caller can size the input row that sits beneath the diff pane.

func (*DiffViewerImpl) Render

func (t *DiffViewerImpl) Render(inputRow string) string

Render lays out the full region: a full-height sidebar and divider on the left, and on the right the diff pane with the (already-rendered) input row stacked beneath it - so the input visibly shifts right of the sidebar. Pass "" for inputRow to render the diff pane at full height (no input).

func (*DiffViewerImpl) Reset

func (t *DiffViewerImpl) Reset()

Reset clears state so the panel can be reused on a later open.

func (*DiffViewerImpl) SetHeight

func (t *DiffViewerImpl) SetHeight(h int)

func (*DiffViewerImpl) SetWidth

func (t *DiffViewerImpl) SetWidth(w int)

func (*DiffViewerImpl) Update

func (t *DiffViewerImpl) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*DiffViewerImpl) View

func (t *DiffViewerImpl) View() tea.View

View satisfies tea.Model. The app composes the real layout via Render (which stacks the input beneath the diff pane); this is a standalone fallback.

type FileExplorerImpl

type FileExplorerImpl struct {
	// contains filtered or unexported fields
}

FileExplorerImpl is the VS Code-style file explorer side panel: a left tree of the working directory (lazy, collapsible, .gitignore-aware) plus a scrollable, syntax-highlighted preview of the selected file. A `/` fuzzy finder jumps to any file; `v` opens the selection in the user's real editor. It owns its full [sidebar | divider | pane] region; the chat input is composed beneath the pane.

func NewFileExplorer

func NewFileExplorer(root string, styleProvider *styles.Provider, themeService tui.ThemeService, kb config.KeybindingsConfig) *FileExplorerImpl

NewFileExplorer creates an explorer rooted at the given working directory.

func (*FileExplorerImpl) HintText

func (t *FileExplorerImpl) HintText() string

HintText returns the footer hint for the current mode.

func (*FileExplorerImpl) Init

func (t *FileExplorerImpl) Init() tea.Cmd

Init does no work: the constructor and Reset already seed the root, and the tree refreshes on view-entry (reopen re-runs this), on in-loop tool/bash completion events, and on the manual refresh key - no polling tick.

func (*FileExplorerImpl) IsCancelled

func (t *FileExplorerImpl) IsCancelled() bool

func (*FileExplorerImpl) IsDone

func (t *FileExplorerImpl) IsDone() bool

func (*FileExplorerImpl) PaneWidth

func (t *FileExplorerImpl) PaneWidth() int

PaneWidth returns the current preview-pane width so the caller can size the input row that sits beneath the pane.

func (*FileExplorerImpl) Render

func (t *FileExplorerImpl) Render(inputRow string) string

Render lays out the full region: a full-height sidebar and divider on the left, and on the right the preview pane with the (already-rendered) input row stacked beneath it. Pass "" for inputRow to render the pane at full height.

func (*FileExplorerImpl) Reset

func (t *FileExplorerImpl) Reset()

Reset clears state so the panel can be reused on a later open.

func (*FileExplorerImpl) Selections

func (t *FileExplorerImpl) Selections() []SnippetSelection

Selections returns the annotated line ranges captured during select mode. The app reads this when the explorer closes (IsDone) and carries them into chat as attachments sent with the next message.

func (*FileExplorerImpl) SetHeight

func (t *FileExplorerImpl) SetHeight(h int)

func (*FileExplorerImpl) SetWidth

func (t *FileExplorerImpl) SetWidth(w int)

func (*FileExplorerImpl) Update

func (t *FileExplorerImpl) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*FileExplorerImpl) View

func (t *FileExplorerImpl) View() tea.View

View satisfies tea.Model. The app composes the real layout via Render.

type FileSelectionAction

type FileSelectionAction int

FileSelectionAction represents the type of action taken in file selection

const (
	FileSelectionActionNone FileSelectionAction = iota
	FileSelectionActionSelect
	FileSelectionActionCancel
)

type FileSelectionData

type FileSelectionData struct {
	Width         int
	Files         []string
	SearchQuery   string
	SelectedIndex int
}

FileSelectionData holds the data needed to render the file selection view

type FileSelectionHandler

type FileSelectionHandler struct {
	// contains filtered or unexported fields
}

FileSelectionHandler handles file selection logic and state management

func NewFileSelectionHandler

func NewFileSelectionHandler(styleProvider *styles.Provider) *FileSelectionHandler

NewFileSelectionHandler creates a new file selection handler

func (*FileSelectionHandler) CreateStatusMessage

func (h *FileSelectionHandler) CreateStatusMessage(action FileSelectionAction, selectedFile string) tea.Cmd

CreateStatusMessage creates appropriate status messages for file selection actions

func (*FileSelectionHandler) HandleKeyEvent

func (h *FileSelectionHandler) HandleKeyEvent(
	keyMsg tea.KeyPressMsg,
	files []string,
	searchQuery string,
	selectedIndex int,
) (newSearchQuery string, newSelectedIndex int, action FileSelectionAction, selectedFile string)

HandleKeyEvent processes key events for file selection

func (*FileSelectionHandler) RenderFileSelection

func (h *FileSelectionHandler) RenderFileSelection(data FileSelectionData) string

RenderFileSelection renders the file selection view

func (*FileSelectionHandler) UpdateInputWithSelectedFile

func (h *FileSelectionHandler) UpdateInputWithSelectedFile(currentInput string, cursor int, selectedFile string) (newInput string, newCursor int)

UpdateInputWithSelectedFile updates input text with the selected file

type FileSelectionView

type FileSelectionView struct {
	// contains filtered or unexported fields
}

func NewFileSelectionView

func NewFileSelectionView(styleProvider *styles.Provider) *FileSelectionView

func (*FileSelectionView) RenderView

func (f *FileSelectionView) RenderView(allFiles []string, searchQuery string, selectedIndex int) string

func (*FileSelectionView) SetWidth

func (f *FileSelectionView) SetWidth(width int)

type HelpBar

type HelpBar struct {
	// contains filtered or unexported fields
}

HelpBar displays keyboard shortcuts at the bottom of the screen

func NewHelpBar

func NewHelpBar(styleProvider *styles.Provider) *HelpBar

func (*HelpBar) Init

func (hb *HelpBar) Init() tea.Cmd

Bubble Tea interface

func (*HelpBar) IsEnabled

func (hb *HelpBar) IsEnabled() bool

func (*HelpBar) Render

func (hb *HelpBar) Render() string

Render draws the shortcuts as a multi-column cheat sheet using bubbles/v2/help, which handles column layout, key/description alignment, and width-aware truncation. Colours follow the active theme.

func (*HelpBar) SetEnabled

func (hb *HelpBar) SetEnabled(enabled bool)

func (*HelpBar) SetHeight

func (hb *HelpBar) SetHeight(height int)

func (*HelpBar) SetShortcuts

func (hb *HelpBar) SetShortcuts(shortcuts []key.Binding)

func (*HelpBar) SetWidth

func (hb *HelpBar) SetWidth(width int)

func (*HelpBar) Update

func (hb *HelpBar) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*HelpBar) View

func (hb *HelpBar) View() tea.View

type HelpCommand

type HelpCommand struct {
	Name        string
	Description string
}

HelpCommand is a single slash-command row in the help overlay.

type HelpViewImpl

type HelpViewImpl struct {
	// contains filtered or unexported fields
}

HelpViewImpl is a full-screen, scrollable overlay documenting every available slash command and keybinding in two lipgloss tables. Both tables are sized to the terminal width - long descriptions wrap rather than truncate - and the whole view lives inside a viewport, so every row stays reachable even on a narrow or short terminal. It is read-only: esc/q returns to the chat.

func NewHelpView

func NewHelpView(themeService tui.ThemeService, styleProvider *styles.Provider) *HelpViewImpl

NewHelpView creates a new help overlay component.

func (*HelpViewImpl) Init

func (h *HelpViewImpl) Init() tea.Cmd

func (*HelpViewImpl) IsCancelled

func (h *HelpViewImpl) IsCancelled() bool

IsCancelled reports whether the user dismissed the help overlay.

func (*HelpViewImpl) Reset

func (h *HelpViewImpl) Reset()

Reset clears the cancelled flag and scroll position for reuse.

func (*HelpViewImpl) SetContent

func (h *HelpViewImpl) SetContent(commands []HelpCommand, keybindings []tui.KeyShortcut)

SetContent loads the rows to display, rebuilds the rendered tables and resets the scroll position to the top.

func (*HelpViewImpl) SetHeight

func (h *HelpViewImpl) SetHeight(height int)

SetHeight sets the overlay height, reserving the bottom two lines for the footer hint. The rendered tables depend only on width, so changing the height just resizes the viewport window - no rebuild required.

func (*HelpViewImpl) SetWidth

func (h *HelpViewImpl) SetWidth(width int)

SetWidth sets the overlay width and rebuilds the tables to fit. Rebuilding is skipped when the width is unchanged so steady-state renders stay cheap.

func (*HelpViewImpl) Update

func (h *HelpViewImpl) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*HelpViewImpl) View

func (h *HelpViewImpl) View() tea.View

type InputStatusBar

type InputStatusBar struct {
	// contains filtered or unexported fields
}

func NewInputStatusBar

func NewInputStatusBar(styleProvider *styles.Provider) *InputStatusBar

NewInputStatusBar creates a new input status bar

func (*InputStatusBar) Blur

func (isb *InputStatusBar) Blur()

Blur returns the indicator row to its passive display-only state.

func (*InputStatusBar) Focus

func (isb *InputStatusBar) Focus() bool

Focus moves keyboard focus onto the indicator row, selecting the first actionable indicator. Reports false when nothing is actionable so the caller can keep focus in the input.

func (*InputStatusBar) Init

func (isb *InputStatusBar) Init() tea.Cmd

Bubble Tea interface

func (*InputStatusBar) IsFocused

func (isb *InputStatusBar) IsFocused() bool

IsFocused reports whether the indicator row holds keyboard focus.

func (*InputStatusBar) Render

func (isb *InputStatusBar) Render() string

func (*InputStatusBar) SelectNext

func (isb *InputStatusBar) SelectNext()

SelectNext moves the selection to the next actionable indicator, wrapping.

func (*InputStatusBar) SelectPrev

func (isb *InputStatusBar) SelectPrev()

SelectPrev moves the selection to the previous actionable indicator, wrapping.

func (*InputStatusBar) SelectedAction

func (isb *InputStatusBar) SelectedAction() tui.StatusIndicatorAction

SelectedAction returns the action of the selected indicator, clamping the selection when indicators disappeared since it was set (e.g. jobs finished).

func (*InputStatusBar) SetBackgroundShellService

func (isb *InputStatusBar) SetBackgroundShellService(service scheddomain.BackgroundShellService)

SetBackgroundShellService sets the background shell service

func (*InputStatusBar) SetBackgroundTaskRegistry

func (isb *InputStatusBar) SetBackgroundTaskRegistry(registry scheddomain.BackgroundTaskRegistry)

SetBackgroundTaskRegistry sets the unified background task registry, the single source for the live A2A/shell/subagent counts shown in the status line.

func (*InputStatusBar) SetBackgroundTaskService

func (isb *InputStatusBar) SetBackgroundTaskService(service scheddomain.BackgroundTaskService)

SetBackgroundTaskService sets the background task service

func (*InputStatusBar) SetBrowserConnected added in v0.182.0

func (isb *InputStatusBar) SetBrowserConnected(connected bool)

SetBrowserConnected toggles the browser-extension indicator.

func (*InputStatusBar) SetConfig

func (isb *InputStatusBar) SetConfig(cfg *config.Config)

SetConfig sets the config for the status bar

func (*InputStatusBar) SetConversationRepo

func (isb *InputStatusBar) SetConversationRepo(repo convdomain.ConversationRepository)

SetConversationRepo sets the conversation repository

func (*InputStatusBar) SetEffortSource

func (isb *InputStatusBar) SetEffortSource(src effortSource)

SetEffortSource sets the source of the runtime reasoning effort level.

func (*InputStatusBar) SetHeight

func (isb *InputStatusBar) SetHeight(height int)

func (*InputStatusBar) SetInputText

func (isb *InputStatusBar) SetInputText(text string)

SetInputText sets the current input text for mode detection

func (*InputStatusBar) SetModelService

func (isb *InputStatusBar) SetModelService(modelService convdomain.ModelService)

SetModelService sets the model service

func (*InputStatusBar) SetStateManager

func (isb *InputStatusBar) SetStateManager(stateManager statusBarState)

SetStateManager sets the state manager

func (*InputStatusBar) SetThemeService

func (isb *InputStatusBar) SetThemeService(themeService tui.ThemeService)

SetThemeService sets the theme service

func (*InputStatusBar) SetTokenEstimator

func (isb *InputStatusBar) SetTokenEstimator(estimator convdomain.TokenEstimator)

SetTokenEstimator sets the token estimator

func (*InputStatusBar) SetToolService

func (isb *InputStatusBar) SetToolService(toolService agentdomain.ToolService)

SetToolService sets the tool service

func (*InputStatusBar) SetWidth

func (isb *InputStatusBar) SetWidth(width int)

func (*InputStatusBar) Update

func (isb *InputStatusBar) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*InputStatusBar) UpdateMCPStatus

func (isb *InputStatusBar) UpdateMCPStatus(status *agentdomain.MCPServerStatus)

UpdateMCPStatus updates the MCP server status (called by event handler)

func (*InputStatusBar) View

func (isb *InputStatusBar) View() tea.View

type InputView

type InputView struct {
	// contains filtered or unexported fields
}

InputView handles user input with history, delegating text editing to charm.land/bubbles/v2/textarea.

func NewInputView

func NewInputView(modelService convdomain.ModelService) *InputView

func NewInputViewWithName

func NewInputViewWithName(modelService convdomain.ModelService, configDir, name string, store storage.ShellHistoryStorage) *InputView

NewInputViewWithName creates the input view. The main agent's history (name == "") goes through the storage backend when a store is provided; named subagent histories and the no-store fallback stay file-based under <configDir>/history/.

func (*InputView) AcceptHistorySuggestion

func (iv *InputView) AcceptHistorySuggestion() bool

AcceptHistorySuggestion applies the current suggestion to the input

func (*InputView) AddImageAttachment

func (iv *InputView) AddImageAttachment(image agentdomain.ImageAttachment)

AddImageAttachment adds an image attachment to the pending list

func (*InputView) AddToHistory

func (iv *InputView) AddToHistory(text string) error

AddToHistory adds the current input to the history

func (*InputView) CanHandle

func (iv *InputView) CanHandle(key tea.KeyPressMsg) bool

func (*InputView) ClearCustomHint

func (iv *InputView) ClearCustomHint()

ClearCustomHint clears the custom hint Note: The input is re-enabled separately by handleViewSpecificMessages when exiting navigation mode

func (*InputView) ClearImageAttachments

func (iv *InputView) ClearImageAttachments()

ClearImageAttachments clears all pending image attachments

func (*InputView) ClearInput

func (iv *InputView) ClearInput()

func (*InputView) GetCursor

func (iv *InputView) GetCursor() int

GetCursor returns the cursor position as a byte offset into GetInput(). The textarea reports a rune column, so the current line's rune prefix is converted back to bytes before adding it to the preceding lines' lengths.

func (*InputView) GetHistoryManager

func (iv *InputView) GetHistoryManager() *history.HistoryManager

GetHistoryManager returns the history manager for external use

func (*InputView) GetImageAttachments

func (iv *InputView) GetImageAttachments() []agentdomain.ImageAttachment

GetImageAttachments returns the list of pending image attachments

func (*InputView) GetInput

func (iv *InputView) GetInput() string

func (*InputView) GetUsageHint

func (iv *InputView) GetUsageHint() string

GetUsageHint returns the current usage hint

func (*InputView) HandleKey

func (iv *InputView) HandleKey(k tea.KeyPressMsg) (tea.Model, tea.Cmd)

func (*InputView) HasHistorySuggestion

func (iv *InputView) HasHistorySuggestion() bool

HasHistorySuggestion returns true if there's a history suggestion available

func (*InputView) Init

func (iv *InputView) Init() tea.Cmd

Bubble Tea interface

func (*InputView) InvalidateGitBranchCache

func (iv *InputView) InvalidateGitBranchCache()

InvalidateGitBranchCache clears the git branch cache to force a refresh.

func (*InputView) IsDisabled

func (iv *InputView) IsDisabled() bool

IsDisabled returns whether the input is disabled

func (*InputView) IsNavigatingHistory

func (iv *InputView) IsNavigatingHistory() bool

IsNavigatingHistory reports whether input-history navigation is active, i.e. whether arrow-down still has an entry to return to

func (*InputView) NavigateHistoryDown

func (iv *InputView) NavigateHistoryDown()

NavigateHistoryDown moves down in history (to newer messages) - public method for interface

func (*InputView) NavigateHistoryUp

func (iv *InputView) NavigateHistoryUp()

NavigateHistoryUp moves up in history (to older messages) - public method for interface

func (*InputView) Render

func (iv *InputView) Render() string

func (*InputView) SetConfig

func (iv *InputView) SetConfig(cfg *config.Config)

SetConfig sets the config for this input view

func (*InputView) SetConversationRepo

func (iv *InputView) SetConversationRepo(repo convdomain.ConversationRepository)

SetConversationRepo sets the conversation repository for context usage display

func (*InputView) SetCursor

func (iv *InputView) SetCursor(position int)

SetCursor moves the cursor to the given byte offset into GetInput().

func (*InputView) SetCustomHint

func (iv *InputView) SetCustomHint(hint string)

SetCustomHint sets a custom hint Note: The input is disabled separately by handleViewSpecificMessages based on navigation mode

func (*InputView) SetDisabled

func (iv *InputView) SetDisabled(disabled bool)

SetDisabled sets whether the input is disabled (prevents typing) When disabling, saves the current text and clears the input When re-enabling, restores the saved text

func (*InputView) SetFileService

func (iv *InputView) SetFileService(fileService agentdomain.FileService)

SetFileService sets the file service so "@<path>" references to real files can be highlighted in the input.

func (*InputView) SetGitHubIssueService

func (iv *InputView) SetGitHubIssueService(s agentdomain.GitHubIssueService)

SetGitHubIssueService enables "#<number>" highlighting in the input. The validator only checks the digit shape - resolution against actual repo issues happens at submit time in the expansion path.

func (*InputView) SetHeight

func (iv *InputView) SetHeight(height int)

func (*InputView) SetImageService

func (iv *InputView) SetImageService(imageService agentdomain.ImageService)

SetImageService sets the image service for this input view

func (*InputView) SetMessageQueue

func (iv *InputView) SetMessageQueue(mq convdomain.MessageQueue)

SetMessageQueue sets the message queue so arrow-up can restore queued message content into the input field instead of navigating history.

func (*InputView) SetPlaceholder

func (iv *InputView) SetPlaceholder(text string)

func (*InputView) SetShortcutRegistry

func (iv *InputView) SetShortcutRegistry(registry *shortcuts.Registry)

SetShortcutRegistry sets the shortcut registry so "/<shortcut>" tokens can be highlighted in the input.

func (*InputView) SetSkillsService

func (iv *InputView) SetSkillsService(skillsService agentdomain.SkillsService)

SetSkillsService sets the skills service so "/<skill>" tokens can be highlighted in the input to signal they route to the agent.

func (*InputView) SetStateManager

func (iv *InputView) SetStateManager(stateManager inputViewState)

SetStateManager sets the state manager for this input view

func (*InputView) SetText

func (iv *InputView) SetText(text string)

func (*InputView) SetThemeService

func (iv *InputView) SetThemeService(themeService tui.ThemeService)

SetThemeService sets the theme service for this input view

func (*InputView) SetUsageHint

func (iv *InputView) SetUsageHint(hint string)

SetUsageHint sets the usage hint for ghost text display

func (*InputView) SetWidth

func (iv *InputView) SetWidth(width int)

func (*InputView) TryHandleHistorySuggestionTab

func (iv *InputView) TryHandleHistorySuggestionTab() bool

TryHandleHistorySuggestionTab handles Tab key for history suggestions Returns true if handled (either cycled or accepted), false if no suggestion available

func (*InputView) Update

func (iv *InputView) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*InputView) View

func (iv *InputView) View() tea.View

type InstallOpentaskView added in v0.182.0

type InstallOpentaskView struct {
	// contains filtered or unexported fields
}

InstallOpentaskView drives the GitHub App setup wizard with huh forms. The flow is split across two forms so that the browser can be opened between the "create a new app?" answer and the App ID prompt: confirm -> (open browser when creating new) -> App ID -> private key (skipped when org secrets already exist for that App ID).

func NewInstallOpentaskView added in v0.182.0

func NewInstallOpentaskView(styleProvider *styles.Provider) *InstallOpentaskView

NewInstallOpentaskView creates a new GitHub App setup wizard.

func (*InstallOpentaskView) GetInstallationURL added in v0.182.0

func (v *InstallOpentaskView) GetInstallationURL(repoOwner, repoName string) string

GetInstallationURL returns the URL to install the GitHub App on a repository

func (*InstallOpentaskView) GetResult added in v0.182.0

func (v *InstallOpentaskView) GetResult() (appID, privateKeyPath string, err error)

GetResult returns the wizard result.

func (*InstallOpentaskView) Init added in v0.182.0

func (v *InstallOpentaskView) Init() tea.Cmd

func (*InstallOpentaskView) IsCancelled added in v0.182.0

func (v *InstallOpentaskView) IsCancelled() bool

IsCancelled returns whether the wizard was cancelled.

func (*InstallOpentaskView) IsDone added in v0.182.0

func (v *InstallOpentaskView) IsDone() bool

IsDone returns whether the wizard is complete.

func (*InstallOpentaskView) Reset added in v0.182.0

func (v *InstallOpentaskView) Reset()

Reset resets the view state for reuse.

func (*InstallOpentaskView) SetHeight added in v0.182.0

func (v *InstallOpentaskView) SetHeight(height int)

SetHeight sets the height of the view.

func (*InstallOpentaskView) SetRepositoryInfo added in v0.182.0

func (v *InstallOpentaskView) SetRepositoryInfo(owner string, isOrg bool)

SetRepositoryInfo sets the repository owner and whether it's an org.

func (*InstallOpentaskView) SetSecretsExistChecker added in v0.182.0

func (v *InstallOpentaskView) SetSecretsExistChecker(checker func(appID string) bool)

SetSecretsExistChecker sets the callback to check if org secrets exist.

func (*InstallOpentaskView) SetWidth added in v0.182.0

func (v *InstallOpentaskView) SetWidth(width int)

SetWidth sets the width of the view.

func (*InstallOpentaskView) Update added in v0.182.0

func (v *InstallOpentaskView) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*InstallOpentaskView) View added in v0.182.0

func (v *InstallOpentaskView) View() tea.View

type KeyHintFormatter

type KeyHintFormatter interface {
	GetKeyHint(actionID, defaultLabel string) string
}

KeyHintFormatter provides formatted key hints for actions

type ModeIndicator

type ModeIndicator struct {
	// contains filtered or unexported fields
}

ModeIndicator displays the current agent mode (PLAN/AUTO) on its own line

func NewModeIndicator

func NewModeIndicator(styleProvider *styles.Provider) *ModeIndicator

NewModeIndicator creates a new mode indicator

func (*ModeIndicator) Render

func (mi *ModeIndicator) Render() string

Render renders the mode indicator line

func (*ModeIndicator) SetStateManager

func (mi *ModeIndicator) SetStateManager(stateManager agentdomain.AgentModeManager)

SetStateManager sets the state manager

func (*ModeIndicator) SetWidth

func (mi *ModeIndicator) SetWidth(width int)

SetWidth sets the width of the mode indicator

type ModelSelectorImpl

type ModelSelectorImpl struct {
	// contains filtered or unexported fields
}

ModelSelectorImpl implements model selection UI as a huh select with the pricing tabs (keys 1-4) layered on top: switching a tab rebuilds the form with that tab's option set. Search is a dedicated textinput (entered with `/`) filtering on the model name; huh's built-in filter is disabled since it renders the query into the select's title line instead of a real input.

func NewModelSelector

func NewModelSelector(models []string, modelService convdomain.ModelService, pricingService convdomain.PricingService, cfg *config.Config, styleProvider *styles.Provider) *ModelSelectorImpl

NewModelSelector creates a new model selector

func (*ModelSelectorImpl) GetSelected

func (m *ModelSelectorImpl) GetSelected() string

GetSelected returns the selected model

func (*ModelSelectorImpl) Init

func (m *ModelSelectorImpl) Init() tea.Cmd

func (*ModelSelectorImpl) IsCancelled

func (m *ModelSelectorImpl) IsCancelled() bool

IsCancelled returns true if selection was cancelled

func (*ModelSelectorImpl) IsSelected

func (m *ModelSelectorImpl) IsSelected() bool

IsSelected returns true if a model was selected

func (*ModelSelectorImpl) Reset

func (m *ModelSelectorImpl) Reset()

Reset clears the done/cancelled flags and rebuilds the form so the selector can be re-entered after a previous selection.

func (*ModelSelectorImpl) SetHeight

func (m *ModelSelectorImpl) SetHeight(height int)

SetHeight sets the height of the model selector

func (*ModelSelectorImpl) SetWidth

func (m *ModelSelectorImpl) SetWidth(width int)

SetWidth sets the width of the model selector

func (*ModelSelectorImpl) Update

func (m *ModelSelectorImpl) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*ModelSelectorImpl) View

func (m *ModelSelectorImpl) View() tea.View

type ModelViewMode

type ModelViewMode int

ModelViewMode defines the different filter modes for models

const (
	ModelViewAll ModelViewMode = iota
	ModelViewFree
	ModelViewPayAsYouGo
	ModelViewSubscription
)
type NavigationMode int

NavigationMode represents the current navigation state of the conversation view

const (
	// NavigationModeNormal is the default mode for displaying conversation
	NavigationModeNormal NavigationMode = iota
	// NavigationModeMessageHistory is the mode for navigating message history
	NavigationModeMessageHistory
)

type QuestionFormView

type QuestionFormView struct {
	// contains filtered or unexported fields
}

QuestionFormView drives the interactive AskUserQuestion form as a bordered box floating above the input (mirroring ApprovalBoxView). It owns the answer-in-progress state as one huh form per question; the StateManager only carries the questions, the overlay-active flag, and the response channel. The agent loop is blocked in the tool goroutine until the answers are sent on the channel (or it is closed, signalling cancellation).

func NewQuestionFormView

func NewQuestionFormView(styleProvider *styles.Provider, stateManager agentdomain.UserQuestionUIManager) *QuestionFormView

func (*QuestionFormView) Begin

func (qv *QuestionFormView) Begin() tea.Cmd

Begin starts a new form for the questions currently in the StateManager. Call it when a UserQuestionRequestedEvent has set up the state.

func (*QuestionFormView) Forward

func (qv *QuestionFormView) Forward(msg tea.Msg) tea.Cmd

Forward delegates a message to the active form and reacts to completion or abort. All messages (keys and huh's internal command messages) must be routed here while the form is up, or group/field navigation breaks.

func (*QuestionFormView) Init

func (qv *QuestionFormView) Init() tea.Cmd

func (*QuestionFormView) Render

func (qv *QuestionFormView) Render() string

func (*QuestionFormView) SetHeight

func (qv *QuestionFormView) SetHeight(height int)

func (*QuestionFormView) SetWidth

func (qv *QuestionFormView) SetWidth(width int)

func (*QuestionFormView) Update

func (qv *QuestionFormView) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*QuestionFormView) View

func (qv *QuestionFormView) View() tea.View

type QueueBoxView

type QueueBoxView struct {
	// contains filtered or unexported fields
}

func NewQueueBoxView

func NewQueueBoxView(styleProvider *styles.Provider) *QueueBoxView

func (*QueueBoxView) Init

func (qv *QueueBoxView) Init() tea.Cmd

func (*QueueBoxView) Render

func (qv *QueueBoxView) Render(queuedMessages []convdomain.QueuedMessage) string

func (*QueueBoxView) SetHeight

func (qv *QueueBoxView) SetHeight(height int)

func (*QueueBoxView) SetToolFormatter

func (qv *QueueBoxView) SetToolFormatter(f agentdomain.ToolFormatter)

SetToolFormatter wires the shared tool formatter so queued tool calls show their width-aware argument preview instead of a bare "Name(...)".

func (*QueueBoxView) SetWidth

func (qv *QueueBoxView) SetWidth(width int)

func (*QueueBoxView) Update

func (qv *QueueBoxView) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*QueueBoxView) View

func (qv *QueueBoxView) View() tea.View

type SnippetAttachmentsView

type SnippetAttachmentsView struct {
	// contains filtered or unexported fields
}

SnippetAttachmentsView renders the pending snippet attachments as a small tree below the chat input: one parent row per file, one indented child row per captured line range. It is a passive renderer driven by ChatApplication (mirroring TodoBoxView) - focus, cursor and the snippet list are pushed in before each render. The selected content is sent with the next chat message.

func NewSnippetAttachmentsView

func NewSnippetAttachmentsView(styleProvider *styles.Provider) *SnippetAttachmentsView

NewSnippetAttachmentsView creates an empty attachments view.

func (*SnippetAttachmentsView) Blur

func (v *SnippetAttachmentsView) Blur()

Blur removes key focus from the tree.

func (*SnippetAttachmentsView) Count

func (v *SnippetAttachmentsView) Count() int

Count returns the number of attached snippets.

func (*SnippetAttachmentsView) Focus

func (v *SnippetAttachmentsView) Focus()

Focus gives the tree key focus, clamping the cursor into range.

func (*SnippetAttachmentsView) GetHeight

func (v *SnippetAttachmentsView) GetHeight() int

GetHeight returns the rendered line count (0 when there is nothing to show).

func (*SnippetAttachmentsView) IsFocused

func (v *SnippetAttachmentsView) IsFocused() bool

IsFocused reports whether the tree currently has key focus.

func (*SnippetAttachmentsView) MoveCursor

func (v *SnippetAttachmentsView) MoveCursor(delta int)

MoveCursor moves the selection by delta rows, clamping to the list bounds.

func (*SnippetAttachmentsView) Render

func (v *SnippetAttachmentsView) Render() string

Render returns the framed tree, or "" when there are no attachments.

func (*SnippetAttachmentsView) SelectedIndex

func (v *SnippetAttachmentsView) SelectedIndex() int

SelectedIndex returns the index into the app's pending list for the focused row, or -1 when empty.

func (*SnippetAttachmentsView) SetData

func (v *SnippetAttachmentsView) SetData(sels []SnippetSelection)

SetData stores a copy of the pending selections and recomputes display order.

func (*SnippetAttachmentsView) SetFocusHint

func (v *SnippetAttachmentsView) SetFocusHint(key string)

SetFocusHint sets the key label shown in the unfocused header.

func (*SnippetAttachmentsView) SetWidth

func (v *SnippetAttachmentsView) SetWidth(width int)

SetWidth sets the component width.

type SnippetSelection

type SnippetSelection struct {
	File       string
	StartLine  int
	EndLine    int
	Annotation string
}

SnippetSelection is one annotated line range captured in explorer select mode. Line numbers are 1-indexed and inclusive. The Annotation is the natural-language instruction the user attached to the highlighted range.

type StatusState

type StatusState struct {
	// contains filtered or unexported fields
}

StatusState represents a saved status state

type StatusView

type StatusView struct {
	// contains filtered or unexported fields
}

StatusView handles status messages, errors, and loading spinners

func NewStatusView

func NewStatusView(styleProvider *styles.Provider) *StatusView

func (*StatusView) ClearStatus

func (sv *StatusView) ClearStatus()

func (*StatusView) HasSavedState

func (sv *StatusView) HasSavedState() bool

HasSavedState returns true if there's a saved state that can be restored

func (*StatusView) Init

func (sv *StatusView) Init() tea.Cmd

Bubble Tea interface

func (*StatusView) IsShowingError

func (sv *StatusView) IsShowingError() bool

func (*StatusView) IsShowingSpinner

func (sv *StatusView) IsShowingSpinner() bool

func (*StatusView) Render

func (sv *StatusView) Render() string

func (*StatusView) RestoreSavedState

func (sv *StatusView) RestoreSavedState() tea.Cmd

RestoreSavedState restores the previously saved status state

func (*StatusView) SaveCurrentState

func (sv *StatusView) SaveCurrentState()

SaveCurrentState saves the current status state for later restoration

func (*StatusView) SetHeight

func (sv *StatusView) SetHeight(height int)

func (*StatusView) SetKeyHintFormatter

func (sv *StatusView) SetKeyHintFormatter(formatter *hints.Formatter)

SetKeyHintFormatter sets the key hint formatter for displaying keybinding hints

func (*StatusView) SetStateManager

func (sv *StatusView) SetStateManager(stateManager statusViewState)

SetStateManager wires the state manager so the spinner line can reflect connection health (retries and stalled streams) while waiting for chunks.

func (*StatusView) SetWidth

func (sv *StatusView) SetWidth(width int)

func (*StatusView) ShowError

func (sv *StatusView) ShowError(message string)

func (*StatusView) ShowSpinner

func (sv *StatusView) ShowSpinner(message string)

func (*StatusView) ShowSpinnerWithType

func (sv *StatusView) ShowSpinnerWithType(message string, statusType tui.StatusType, progress *tui.StatusProgress)

func (*StatusView) ShowStatus

func (sv *StatusView) ShowStatus(message string)

func (*StatusView) ShowStatusWithType

func (sv *StatusView) ShowStatusWithType(message string, statusType tui.StatusType, progress *tui.StatusProgress)

func (*StatusView) Update

func (sv *StatusView) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*StatusView) UpdateSpinnerMessage

func (sv *StatusView) UpdateSpinnerMessage(message string, statusType tui.StatusType)

func (*StatusView) View

func (sv *StatusView) View() tea.View

type TaskInfo

type TaskInfo struct {
	agentdomain.TaskPollingState
	Status      string
	ElapsedTime time.Duration
	TaskRef     *scheddomain.TaskInfo
	Kind        scheddomain.JobKind
	Label       string
	Detail      string
	Output      string
}

TaskInfo extends TaskPollingState with additional metadata for UI display. Kind/Label/Detail carry the background-work kind (A2A task, shell, subagent) and its kind-specific columns so the view can render one table per kind from a single flat, selectable list. A2A rows keep using the embedded TaskPollingState/TaskRef; shell and subagent rows populate Kind/Label/Detail. Output carries the job's captured output (shell stdout/stderr or subagent result) for the detail panel.

type TaskManagerImpl

type TaskManagerImpl struct {
	// contains filtered or unexported fields
}

TaskManagerImpl implements task management UI similar to conversation selection

func NewTaskManager

func NewTaskManager(
	themeService tui.ThemeService,
	styleProvider *styles.Provider,
	taskRetentionService scheddomain.TaskRetentionService,
	backgroundTaskService scheddomain.BackgroundTaskService,
) *TaskManagerImpl

NewTaskManager creates a new task manager UI component

func (*TaskManagerImpl) GetSelectedTask

func (t *TaskManagerImpl) GetSelectedTask() *TaskInfo

GetSelectedTask returns the currently selected task (used by parent components)

func (*TaskManagerImpl) Init

func (t *TaskManagerImpl) Init() tea.Cmd

func (*TaskManagerImpl) IsCancelled

func (t *TaskManagerImpl) IsCancelled() bool

IsCancelled returns true if the user cancelled the task manager

func (*TaskManagerImpl) IsDone

func (t *TaskManagerImpl) IsDone() bool

IsDone returns true if the user has finished with the task manager

func (*TaskManagerImpl) Reset

func (t *TaskManagerImpl) Reset()

Reset resets the task manager state for reuse

func (*TaskManagerImpl) SetBackgroundTaskRegistry

func (t *TaskManagerImpl) SetBackgroundTaskRegistry(registry scheddomain.BackgroundTaskRegistry)

SetBackgroundTaskRegistry wires the unified registry so the view can show live counts of every background-work kind (A2A tasks, shells, subagents), not just the A2A tasks listed in the table below.

func (*TaskManagerImpl) SetHeight

func (t *TaskManagerImpl) SetHeight(height int)

SetHeight sets the height of the task manager

func (*TaskManagerImpl) SetWidth

func (t *TaskManagerImpl) SetWidth(width int)

SetWidth sets the width of the task manager

func (*TaskManagerImpl) Update

func (t *TaskManagerImpl) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*TaskManagerImpl) View

func (t *TaskManagerImpl) View() tea.View

type TaskViewMode

type TaskViewMode int
const (
	TaskViewAll TaskViewMode = iota
	TaskViewActive
	TaskViewInputRequired
	TaskViewCompleted
	TaskViewCanceled
)

type ThemeSelectorImpl

type ThemeSelectorImpl struct {
	// contains filtered or unexported fields
}

ThemeSelectorImpl implements theme selection UI on top of bubbles/v2/list, which provides cursor movement, fuzzy filtering (press /), pagination and help for free.

func NewThemeSelector

func NewThemeSelector(themeService tui.ThemeService, styleProvider *styles.Provider) *ThemeSelectorImpl

NewThemeSelector creates a new theme selector.

func (*ThemeSelectorImpl) GetSelected

func (m *ThemeSelectorImpl) GetSelected() string

GetSelected returns the selected theme.

func (*ThemeSelectorImpl) Init

func (m *ThemeSelectorImpl) Init() tea.Cmd

func (*ThemeSelectorImpl) IsCancelled

func (m *ThemeSelectorImpl) IsCancelled() bool

IsCancelled returns true if selection was cancelled.

func (*ThemeSelectorImpl) IsSelected

func (m *ThemeSelectorImpl) IsSelected() bool

IsSelected returns true if a theme was selected.

func (*ThemeSelectorImpl) Reset

func (m *ThemeSelectorImpl) Reset()

Reset returns the selector to its initial state, rebuilding the items so the active-theme marker reflects any theme change since it was last shown.

func (*ThemeSelectorImpl) SetHeight

func (m *ThemeSelectorImpl) SetHeight(height int)

SetHeight sets the height of the theme selector.

func (*ThemeSelectorImpl) SetWidth

func (m *ThemeSelectorImpl) SetWidth(width int)

SetWidth sets the width of the theme selector.

func (*ThemeSelectorImpl) Update

func (m *ThemeSelectorImpl) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*ThemeSelectorImpl) View

func (m *ThemeSelectorImpl) View() tea.View

type TodoBoxView

type TodoBoxView struct {
	// contains filtered or unexported fields
}

TodoBoxView displays a collapsible todo list component

func NewTodoBoxView

func NewTodoBoxView(styleProvider *styles.Provider) *TodoBoxView

NewTodoBoxView creates a new todo box view

func (*TodoBoxView) AutoCollapse

func (tv *TodoBoxView) AutoCollapse() bool

AutoCollapse collapses if auto-expanded and delay has passed

func (*TodoBoxView) GetHeight

func (tv *TodoBoxView) GetHeight() int

GetHeight returns the height of the rendered component

func (*TodoBoxView) GetTodos

func (tv *TodoBoxView) GetTodos() []agentdomain.TodoItem

GetTodos returns the current todos

func (*TodoBoxView) HasTodos

func (tv *TodoBoxView) HasTodos() bool

HasTodos returns whether there are any todos

func (*TodoBoxView) Init

func (tv *TodoBoxView) Init() tea.Cmd

Init initializes the component

func (*TodoBoxView) IsExpanded

func (tv *TodoBoxView) IsExpanded() bool

IsExpanded returns whether the component is expanded

func (*TodoBoxView) Render

func (tv *TodoBoxView) Render() string

Render renders the todo box

func (*TodoBoxView) SetExpanded

func (tv *TodoBoxView) SetExpanded(expanded bool)

SetExpanded sets the expanded state (user action)

func (*TodoBoxView) SetHeight

func (tv *TodoBoxView) SetHeight(height int)

SetHeight sets the component height

func (*TodoBoxView) SetTodos

func (tv *TodoBoxView) SetTodos(todos []agentdomain.TodoItem)

SetTodos updates the todo list and triggers auto-expand

func (*TodoBoxView) SetWidth

func (tv *TodoBoxView) SetWidth(width int)

SetWidth sets the component width

func (*TodoBoxView) ShouldAutoCollapse

func (tv *TodoBoxView) ShouldAutoCollapse() bool

ShouldAutoCollapse returns true if the component should auto-collapse

func (*TodoBoxView) Toggle

func (tv *TodoBoxView) Toggle()

Toggle toggles the expanded state

func (*TodoBoxView) Update

func (tv *TodoBoxView) Update(msg tea.Msg) (tea.Model, tea.Cmd)

Update handles messages

func (*TodoBoxView) View

func (tv *TodoBoxView) View() tea.View

View returns the rendered view

type ToolCallInfo

type ToolCallInfo struct {
	Name string
	Args map[string]any
}

type ToolCallRenderer

type ToolCallRenderer struct {
	// contains filtered or unexported fields
}

func NewToolCallRenderer

func NewToolCallRenderer(styleProvider *styles.Provider) *ToolCallRenderer

func (*ToolCallRenderer) ClearPreviews

func (r *ToolCallRenderer) ClearPreviews()

func (*ToolCallRenderer) HasActivePreviews

func (r *ToolCallRenderer) HasActivePreviews() bool

func (*ToolCallRenderer) Init

func (r *ToolCallRenderer) Init() tea.Cmd

func (*ToolCallRenderer) RenderPreviews

func (r *ToolCallRenderer) RenderPreviews() string

func (*ToolCallRenderer) SetKeyHintFormatter

func (r *ToolCallRenderer) SetKeyHintFormatter(formatter KeyHintFormatter)

SetKeyHintFormatter sets the key hint formatter for dynamic keybinding hints

func (*ToolCallRenderer) SetStateManager

func (r *ToolCallRenderer) SetStateManager(stateManager approvalOverlayReader)

SetStateManager wires the state manager so running-tool timers can pause while an approval or question overlay is blocked on the user.

func (*ToolCallRenderer) SetToolFormatter

func (r *ToolCallRenderer) SetToolFormatter(f agentdomain.ToolFormatter)

SetToolFormatter wires the shared tool formatter so live previews render the same width-aware "<icon> Name(args) <status>" summary as the collapsed results, instead of a byte-truncated raw-JSON preview.

func (*ToolCallRenderer) SetWidth

func (r *ToolCallRenderer) SetWidth(width int)

func (*ToolCallRenderer) Update

func (r *ToolCallRenderer) Update(msg tea.Msg) (*ToolCallRenderer, tea.Cmd)

type ToolRenderState

type ToolRenderState struct {
	CallID           string
	ToolName         string
	Status           string
	Arguments        string
	StartTime        time.Time
	EndTime          *time.Time
	LastUpdate       time.Time
	OutputBuffer     []string
	TotalOutputLines int
	IsComplete       bool
	IsExpanded       bool
}

ToolRenderState represents the unified rendering state for all tool executions

type ToolsViewImpl

type ToolsViewImpl struct {
	// contains filtered or unexported fields
}

ToolsViewImpl is a read-only, filterable list of the tools currently available to the agent. It reuses the bubbles/v2 list plumbing from the theme selector; enter deliberately does nothing yet - selecting a tool to inspect or execute it is future work.

func NewToolsView

func NewToolsView(toolService agentdomain.ToolService, stateManager agentdomain.AgentModeManager, styleProvider *styles.Provider) *ToolsViewImpl

NewToolsView creates the tools list view. Items are populated by Reset on every entry because the tool set changes with the agent mode and with async MCP tool registration.

func (*ToolsViewImpl) Init

func (m *ToolsViewImpl) Init() tea.Cmd

func (*ToolsViewImpl) IsCancelled

func (m *ToolsViewImpl) IsCancelled() bool

IsCancelled returns true once the user has dismissed the view.

func (*ToolsViewImpl) Reset

func (m *ToolsViewImpl) Reset()

Reset returns the view to its initial state and rebuilds the items so the list reflects the current agent mode and any MCP tools registered since it was last shown. The delegate and title styles are rebuilt too so a theme switch is picked up on re-entry.

func (*ToolsViewImpl) SetHeight

func (m *ToolsViewImpl) SetHeight(height int)

SetHeight sets the height of the tools view.

func (*ToolsViewImpl) SetWidth

func (m *ToolsViewImpl) SetWidth(width int)

SetWidth sets the width of the tools view.

func (*ToolsViewImpl) Update

func (m *ToolsViewImpl) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (*ToolsViewImpl) View

func (m *ToolsViewImpl) View() tea.View

Directories

Path Synopsis
Package diffview renders unified or side-by-side file diffs to a string of ANSI-styled output, using go-udiff for the underlying diff algorithm and chroma for in-line syntax highlighting.
Package diffview renders unified or side-by-side file diffs to a string of ANSI-styled output, using go-udiff for the underlying diff algorithm and chroma for in-line syntax highlighting.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL