ui

package
v1.9.30 Latest Latest
Warning

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

Go to latest
Published: May 22, 2026 License: MIT Imports: 47 Imported by: 0

Documentation

Overview

Package ui provides the Bubble Tea TUI for agent-deck. keyboard_compat.go implements compatibility helpers for the Kitty keyboard protocol (CSI u encoding) used by Wayland compositors and modern terminals such as Ghostty, Foot, and Alacritty.

Background: Bubble Tea v1.3.10 does not parse Kitty keyboard protocol sequences. On Wayland, terminals send keys using CSI u encoding by default, which causes uppercase shortcuts and uppercase text input to be silently dropped. This file provides:

  1. DisableKittyKeyboard / RestoreKittyKeyboard — escape sequences that ask the terminal to fall back to legacy key reporting before the TUI starts.

  2. ParseCSIu — a CSI u sequence parser, available as a public API for future use or for terminals that ignore the protocol-disable request.

  3. NewCSIuReader — a reader that translates CSI u sequences to legacy bytes on the fly, as a belt-and-suspenders fallback.

Index

Constants

View Source
const (
	LayoutModeSingle  = "single"  // <50 cols: list only
	LayoutModeStacked = "stacked" // 50-79 cols: vertical stack
	LayoutModeDual    = "dual"    // 80+ cols: side-by-side
)

Layout mode names

View Source
const (
	IconClaude   = "🤖"
	IconGemini   = "✨"
	IconOpenCode = "🌐"
	IconCodex    = "💻"
	IconPi       = "π"
	IconShell    = "🐚"
)

Tool Icons

View Source
const FilterKeyActive = "%"

FilterKeyActive is the keyboard shortcut for the "open" status filter (shows all sessions except error/stopped). Change this constant to rebind.

View Source
const FilterModeActive session.Status = "active"

FilterModeActive is the filter value for "open" sessions: excludes the configured set of statuses (see DisplaySettings.ActiveFilterExcludes; default {error}). This is NOT a session status (never assigned to a session), just a filter mode.

View Source
const MaxNameLength = 50

MaxNameLength is the maximum allowed length for session and group names. Used by dialog CharLimits and Validate() methods to ensure consistency.

Variables

View Source
var (
	ColorBg      lipgloss.Color
	ColorSurface lipgloss.Color
	ColorBorder  lipgloss.Color
	ColorText    lipgloss.Color
	ColorTextDim lipgloss.Color
	ColorAccent  lipgloss.Color
	ColorPurple  lipgloss.Color
	ColorCyan    lipgloss.Color
	ColorGreen   lipgloss.Color
	ColorYellow  lipgloss.Color
	ColorOrange  lipgloss.Color
	ColorRed     lipgloss.Color
	ColorComment lipgloss.Color
)

Active color variables (set by InitTheme)

View Source
var (
	BaseStyle      lipgloss.Style
	TitleStyle     lipgloss.Style
	PanelStyle     lipgloss.Style
	HighlightStyle lipgloss.Style
	DimStyle       lipgloss.Style
	ErrorStyle     lipgloss.Style
	SuccessStyle   lipgloss.Style
	WarningStyle   lipgloss.Style
	InfoStyle      lipgloss.Style
)

Base Styles

View Source
var (
	RunningStyle        lipgloss.Style
	WaitingStyle        lipgloss.Style
	IdleStyle           lipgloss.Style
	ErrorIndicatorStyle lipgloss.Style
)

Status Indicator Styles

View Source
var (
	MenuBarStyle       lipgloss.Style
	MenuKeyStyle       lipgloss.Style
	MenuDescStyle      lipgloss.Style
	MenuSeparatorStyle lipgloss.Style
)

Menu Bar Styles

View Source
var (
	SearchBoxStyle    lipgloss.Style
	SearchPromptStyle lipgloss.Style
	SearchMatchStyle  lipgloss.Style
)

Search Styles

View Source
var (
	DialogBoxStyle          lipgloss.Style
	DialogTitleStyle        lipgloss.Style
	DialogButtonStyle       lipgloss.Style
	DialogButtonActiveStyle lipgloss.Style
)

Dialog Styles

View Source
var (
	PreviewPanelStyle   lipgloss.Style
	PreviewTitleStyle   lipgloss.Style
	PreviewHeaderStyle  lipgloss.Style
	PreviewContentStyle lipgloss.Style
	PreviewMetaStyle    lipgloss.Style
)

Preview Pane Styles

View Source
var (
	ListItemStyle       lipgloss.Style
	ListItemActiveStyle lipgloss.Style
)

List Item Styles (used by legacy list.go component in tests)

View Source
var (
	TagStyle       lipgloss.Style
	TagActiveStyle lipgloss.Style
	TagErrorStyle  lipgloss.Style
)

Tag Styles

View Source
var (
	FolderStyle          lipgloss.Style
	FolderCollapsedStyle lipgloss.Style
)

Folder Styles

View Source
var (
	SessionItemStyle         lipgloss.Style
	SessionItemSelectedStyle lipgloss.Style
)

Session Item Styles

View Source
var (
	// Tree connector styles
	TreeConnectorStyle    lipgloss.Style
	TreeConnectorSelStyle lipgloss.Style

	// Session status indicator styles
	SessionStatusRunning  lipgloss.Style
	SessionStatusWaiting  lipgloss.Style
	SessionStatusIdle     lipgloss.Style
	SessionStatusError    lipgloss.Style
	SessionStatusStopped  lipgloss.Style
	SessionStatusSelStyle lipgloss.Style

	// Session title styles by state
	SessionTitleDefault  lipgloss.Style
	SessionTitleActive   lipgloss.Style
	SessionTitleError    lipgloss.Style
	SessionTitleSelStyle lipgloss.Style

	// Selection indicator
	SessionSelectionPrefix lipgloss.Style

	// Group item styles
	GroupExpandStyle   lipgloss.Style
	GroupNameStyle     lipgloss.Style
	GroupCountStyle    lipgloss.Style
	GroupHotkeyStyle   lipgloss.Style
	GroupStatusRunning lipgloss.Style
	GroupStatusWaiting lipgloss.Style

	// Group selected styles
	GroupNameSelStyle   lipgloss.Style
	GroupCountSelStyle  lipgloss.Style
	GroupExpandSelStyle lipgloss.Style
)

Session List Rendering Styles (PERFORMANCE: cached at package level) These styles are used by renderSessionItem() and renderGroupItem() to avoid repeated allocations on every View() call

View Source
var (
	SubtitleStyle lipgloss.Style
	ColorError    lipgloss.Color
	ColorSuccess  lipgloss.Color
	ColorWarning  lipgloss.Color
	ColorPrimary  lipgloss.Color
)

Additional Styles

View Source
var DefaultToolStyle lipgloss.Style

DefaultToolStyle is used when tool is not in cache

View Source
var LogoBorderStyle lipgloss.Style

LogoBorderStyle for the grid lines

View Source
var LogoFrames = [][]string{
	{"●", "◐", "○"},
}

LogoFrames kept for backward compatibility (empty state default)

View Source
var MenuStyle lipgloss.Style

Menu Styles

View Source
var TimestampStyle lipgloss.Style

Timestamp Style

View Source
var ToolStyleCache map[string]lipgloss.Style

ToolStyleCache provides pre-allocated styles for each tool type Avoids repeated lipgloss.NewStyle() calls in renderSessionItem()

View Source
var Version = "0.0.0"

Version is set by main.go for update checking

Functions

func DetachByteFromBinding added in v0.26.4

func DetachByteFromBinding(binding string) byte

DetachByteFromBinding converts a hotkey binding string (e.g. "ctrl+q") to the corresponding ASCII byte used by the PTY attach loop. Returns 0x11 (Ctrl+Q) as the default when the binding cannot be mapped.

func DetachByteLabel added in v0.26.4

func DetachByteLabel(b byte) string

DetachByteLabel returns a human-readable label for a detach byte (e.g. "Ctrl+Q").

func DisableKittyKeyboard added in v0.26.2

func DisableKittyKeyboard(w io.Writer)

DisableKittyKeyboard writes the escape sequence that pops the Kitty keyboard protocol stack, restoring the previous keyboard mode. If nothing was on the stack, this is a safe no-op. After this call, Kitty-protocol-aware terminals stop sending CSI u sequences and revert to legacy key reporting. Terminals that do not support the protocol ignore the sequence.

func DisableModifyOtherKeys added in v1.9.23

func DisableModifyOtherKeys(w io.Writer)

DisableModifyOtherKeys writes the xterm escape sequence that returns the terminal to default key reporting (modifyOtherKeys mode 0). Call on TUI exit so the user's shell behaves normally again.

func EnableKittyKeyboard added in v1.3.2

func EnableKittyKeyboard(w io.Writer)

EnableKittyKeyboard writes the escape sequence that pushes Kitty keyboard mode 1 (disambiguate) onto the protocol stack. This re-enables extended key reporting so that sequences like Shift+Enter are sent as CSI u codes. Call this before attaching to a session that needs Kitty keyboard support (e.g. Claude Code). Pair with DisableKittyKeyboard to pop the stack on return.

func EnableModifyOtherKeys added in v1.9.23

func EnableModifyOtherKeys(w io.Writer)

EnableModifyOtherKeys writes the xterm escape sequence that requests modifyOtherKeys mode 1: terminals supporting the protocol (iTerm2, xterm, Konsole, …) start sending modified keys — including the previously indistinguishable Shift+Enter — as CSI 27;<modifier>;<codepoint>~ sequences rather than the legacy unmodified byte. Unmodified keys still arrive as their normal bytes, so plain Enter is unaffected.

This is the upstream half of the #1093 fix: without it, a fresh agent-deck launch in iTerm2 sees plain '\r' for both Enter and Shift+Enter and cannot distinguish them. With it, Shift+Enter arrives as \x1b[27;2;13~ and our csiuReader relays it through to home.go as "shift+enter".

Pair with DisableModifyOtherKeys on TUI exit so the user's shell prompt returns to default key-reporting behavior.

func GetToolStyle added in v0.8.9

func GetToolStyle(tool string) lipgloss.Style

GetToolStyle returns cached style for tool or default. Read-locked to protect against concurrent map access during live theme switches.

func InitTheme added in v0.8.16

func InitTheme(theme string)

InitTheme sets the active color palette based on theme name Must be called before any UI rendering

func MenuKey(key, description string) string

MenuKey creates a formatted menu item with key and description

func NewCSIuReader added in v0.26.2

func NewCSIuReader(r io.Reader) io.Reader

NewCSIuReader returns a reader that wraps r and translates any CSI u sequences to their legacy equivalents. This is a belt-and-suspenders fallback for terminals that do not honor DisableKittyKeyboard.

If r is a *os.File, the returned reader also implements the *os.File interface (preserving Fd() for terminal raw-mode setup by Bubble Tea). If r is any other io.Reader, a plain io.Reader is returned.

func ParseCSIu added in v0.26.2

func ParseCSIu(data []byte) *tea.KeyMsg

ParseCSIu parses a Kitty keyboard protocol (CSI u) escape sequence and returns the equivalent tea.KeyMsg. Returns nil if the data is not a valid CSI u sequence.

The CSI u format is: ESC '[' <codepoint> [';' <modifier>] 'u'

Modifier encoding (1 + bitmask):

1 = no modifier
2 = shift      (1 + 1)
3 = alt        (1 + 2)
4 = shift+alt  (1 + 1 + 2)
5 = ctrl       (1 + 4)
6 = shift+ctrl (1 + 1 + 4)

func ParseModifyOtherKeys added in v1.3.4

func ParseModifyOtherKeys(data []byte) *tea.KeyMsg

ParseModifyOtherKeys parses an xterm modifyOtherKeys escape sequence and returns the equivalent tea.KeyMsg. Returns nil if the data is not a valid modifyOtherKeys sequence.

The modifyOtherKeys format is: ESC '[' '27' ';' <modifier> ';' <codepoint> '~'

tmux with extended-keys sends this format. The modifier encoding is the same as CSI u (1 + bitmask).

func RenderLogoCompact

func RenderLogoCompact(running, waiting, idle int) string

RenderLogoCompact renders the compact inline logo for the header Shows REAL status: running=●, waiting=◐, idle=○ Format: ⟨ ● │ ◐ │ ○ ⟩ (using angle brackets for modern look)

func RenderLogoIndicator

func RenderLogoIndicator(indicator string) string

RenderLogoIndicator renders a single indicator with appropriate color

func RenderLogoLarge

func RenderLogoLarge(running, waiting, idle int) string

RenderLogoLarge renders the large logo for empty state Shows REAL status: running=●, waiting=◐, idle=○ Format:

┌──┬──┬──┐
│● │◐ │○ │
└──┴──┴──┘

func ResolvedDetachByte added in v0.26.4

func ResolvedDetachByte(overrides map[string]string) byte

ResolvedDetachByte returns the detach byte for the current hotkey configuration.

func RestoreKittyKeyboard added in v0.26.2

func RestoreKittyKeyboard(w io.Writer)

RestoreKittyKeyboard writes the escape sequence that pops the keyboard mode stack, restoring the terminal to its previous keyboard mode. Call this when the TUI exits so that the terminal returns to normal operation.

func RestoreLegacyKeyboardCmd added in v1.7.21

func RestoreLegacyKeyboardCmd(w io.Writer) tea.Cmd

RestoreLegacyKeyboardCmd returns a tea.Cmd that pops the Kitty keyboard protocol stack, restoring legacy key reporting on the given writer.

This is the cleanup half of the attach/detach symmetry: when the dashboard hands control to tmux via tea.Exec, tmux's extended-keys setting activates Kitty/modifyOtherKeys on the outer terminal. Those settings persist after the user detaches, so the outer terminal keeps sending CSI u sequences that Bubble Tea v1.3.10 cannot parse, silently dropping shifted keys (capitals) on the dashboard. Dispatching this command after tea.Exec returns undoes the state tmux set.

Takes a writer so tests can substitute a buffer for os.Stdout.

func SetVersion added in v0.4.0

func SetVersion(v string)

SetVersion sets the current version for update checking

func StatusIndicator

func StatusIndicator(status string) string

StatusIndicator returns a styled status indicator. Read-locked to protect against concurrent style access during live theme switches. Standard symbols: ● running, ◐ waiting, ○ idle, ✕ error, ⟳ starting

func ToolColor added in v0.5.7

func ToolColor(tool string) lipgloss.Color

ToolColor returns the brand color for a given tool Claude=orange (Anthropic), Gemini=purple (Google AI), Codex=cyan, Pi=accent, Aider=red

func ToolIcon

func ToolIcon(tool string) string

ToolIcon returns the icon for a given tool Checks user config for custom tools first, then falls back to built-ins

Types

type AnalyticsPanel added in v0.8.27

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

AnalyticsPanel displays session analytics in a formatted panel

func NewAnalyticsPanel added in v0.8.27

func NewAnalyticsPanel() *AnalyticsPanel

NewAnalyticsPanel creates a new analytics panel

func (*AnalyticsPanel) SetAnalytics added in v0.8.27

func (p *AnalyticsPanel) SetAnalytics(a *session.SessionAnalytics)

SetAnalytics sets the Claude analytics data to display

func (*AnalyticsPanel) SetDisplaySettings added in v0.8.53

func (p *AnalyticsPanel) SetDisplaySettings(settings session.AnalyticsDisplaySettings)

SetDisplaySettings configures which sections to show

func (*AnalyticsPanel) SetGeminiAnalytics added in v0.8.35

func (p *AnalyticsPanel) SetGeminiAnalytics(a *session.GeminiSessionAnalytics)

SetGeminiAnalytics sets the Gemini analytics data to display

func (*AnalyticsPanel) SetSize added in v0.8.27

func (p *AnalyticsPanel) SetSize(width, height int)

SetSize sets the panel dimensions

func (*AnalyticsPanel) View added in v0.8.27

func (p *AnalyticsPanel) View() string

View renders the analytics panel

type BranchPickerDialog added in v1.3.1

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

BranchPickerDialog is an in-TUI branch picker with inline filtering.

func NewBranchPickerDialog added in v1.3.1

func NewBranchPickerDialog() *BranchPickerDialog

func (*BranchPickerDialog) Hide added in v1.3.1

func (d *BranchPickerDialog) Hide()

func (*BranchPickerDialog) IsVisible added in v1.3.1

func (d *BranchPickerDialog) IsVisible() bool

func (*BranchPickerDialog) SetQuery added in v1.3.1

func (d *BranchPickerDialog) SetQuery(query string)

func (*BranchPickerDialog) SetSize added in v1.3.1

func (d *BranchPickerDialog) SetSize(width, height int)

func (*BranchPickerDialog) Show added in v1.3.1

func (d *BranchPickerDialog) Show(projectPath, query string) error

func (*BranchPickerDialog) Update added in v1.3.1

func (d *BranchPickerDialog) Update(msg tea.KeyMsg) (string, bool)

Update handles list navigation keys. Text entry should remain in the parent input.

func (*BranchPickerDialog) View added in v1.3.1

func (d *BranchPickerDialog) View() string

type Change added in v1.7.70

type Change struct {
	Field  string
	Value  string
	IsLive bool // false = applies on next Restart()
}

type ClaudeOptionsPanel added in v0.8.39

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

ClaudeOptionsPanel is a UI panel for Claude-specific launch options Used in both ForkDialog and NewDialog

func NewClaudeOptionsPanel added in v0.8.39

func NewClaudeOptionsPanel() *ClaudeOptionsPanel

NewClaudeOptionsPanel creates a new panel for NewDialog

func NewClaudeOptionsPanelForFork added in v0.8.39

func NewClaudeOptionsPanelForFork() *ClaudeOptionsPanel

NewClaudeOptionsPanelForFork creates a panel for ForkDialog (fewer options)

func (*ClaudeOptionsPanel) AtTop added in v0.10.18

func (p *ClaudeOptionsPanel) AtTop() bool

AtTop returns true if focus is on the first element

func (*ClaudeOptionsPanel) Blur added in v0.8.39

func (p *ClaudeOptionsPanel) Blur()

Blur removes focus from this panel

func (*ClaudeOptionsPanel) Focus added in v0.8.39

func (p *ClaudeOptionsPanel) Focus()

Focus sets focus to this panel

func (*ClaudeOptionsPanel) GetExtraArgs added in v1.7.21

func (p *ClaudeOptionsPanel) GetExtraArgs() []string

GetExtraArgs returns the parsed extra-args tokens (whitespace-split, empties dropped). Callers assign the result to Instance.ExtraArgs. Tokens with embedded spaces cannot be expressed through this input — use CLI `--extra-arg` for that.

func (*ClaudeOptionsPanel) GetOptions added in v0.8.39

func (p *ClaudeOptionsPanel) GetOptions() *session.ClaudeOptions

GetOptions returns current options as ClaudeOptions

func (*ClaudeOptionsPanel) GetStartQuery added in v1.7.67

func (p *ClaudeOptionsPanel) GetStartQuery() string

GetStartQuery returns the trimmed raw input, un-split. Callers assign the result to Instance.StartupQuery which emits it as a single shell-quoted positional arg on the claude command line. This is the core v1.7.67 contract — never split on spaces here (#725).

func (*ClaudeOptionsPanel) IsFocused added in v0.8.39

func (p *ClaudeOptionsPanel) IsFocused() bool

IsFocused returns true if any element in the panel has focus

func (*ClaudeOptionsPanel) ResetStartQuery added in v1.7.70

func (p *ClaudeOptionsPanel) ResetStartQuery()

ResetStartQuery clears the start-query input. Called by NewDialog on each open so the per-session StartupQuery (Instance.StartupQuery, json:"-") does not leak across dialog invocations (#741).

func (*ClaudeOptionsPanel) SetDefaults added in v0.8.39

func (p *ClaudeOptionsPanel) SetDefaults(config *session.UserConfig)

SetDefaults applies default values from config

func (*ClaudeOptionsPanel) SetExtraArgs added in v1.7.21

func (p *ClaudeOptionsPanel) SetExtraArgs(tokens []string)

SetExtraArgs pre-fills the input from a persisted slice.

func (*ClaudeOptionsPanel) SetFromOptions added in v0.20.0

func (p *ClaudeOptionsPanel) SetFromOptions(opts *session.ClaudeOptions)

SetFromOptions applies persisted ClaudeOptions to the panel fields.

func (*ClaudeOptionsPanel) SetStartQuery added in v1.7.67

func (p *ClaudeOptionsPanel) SetStartQuery(query string)

SetStartQuery pre-fills the input (used by tests; the field is not persisted, so there is no production "restore" path).

func (*ClaudeOptionsPanel) Update added in v0.8.39

func (p *ClaudeOptionsPanel) Update(msg tea.Msg) tea.Cmd

Update handles key events

func (*ClaudeOptionsPanel) View added in v0.8.39

func (p *ClaudeOptionsPanel) View() string

View renders the options panel

type ConfirmDialog

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

ConfirmDialog handles confirmation for destructive actions

func NewConfirmDialog

func NewConfirmDialog() *ConfirmDialog

NewConfirmDialog creates a new confirmation dialog

func (*ConfirmDialog) GetConfirmType

func (c *ConfirmDialog) GetConfirmType() ConfirmType

GetConfirmType returns the type of confirmation

func (*ConfirmDialog) GetFocusedButton added in v1.5.1

func (c *ConfirmDialog) GetFocusedButton() int

GetFocusedButton returns the currently focused button index.

func (*ConfirmDialog) GetPendingSession added in v0.8.99

func (c *ConfirmDialog) GetPendingSession() (name, path, command, groupPath string, toolOptionsJSON json.RawMessage, claudeExtraArgs []string, claudeStartQuery, launchModelID string, parentSessionID, parentProjectPath string)

GetPendingSession returns the pending session creation data

func (*ConfirmDialog) GetRemoteName added in v0.25.0

func (c *ConfirmDialog) GetRemoteName() string

GetRemoteName returns the remote name for remote session confirmations.

func (*ConfirmDialog) GetTargetID

func (c *ConfirmDialog) GetTargetID() string

GetTargetID returns the session ID or group path being confirmed

func (*ConfirmDialog) Hide

func (c *ConfirmDialog) Hide()

Hide hides the dialog.

func (*ConfirmDialog) IsVisible

func (c *ConfirmDialog) IsVisible() bool

IsVisible returns whether the dialog is visible

func (*ConfirmDialog) SetSize

func (c *ConfirmDialog) SetSize(width, height int)

SetSize updates dialog dimensions

func (*ConfirmDialog) ShowBulkRemoveErrored added in v1.7.61

func (c *ConfirmDialog) ShowBulkRemoveErrored(count int)

ShowBulkRemoveErrored shows confirmation for removing all errored sessions (TUI Ctrl+X). count is the number of errored sessions that will be removed.

func (*ConfirmDialog) ShowCloseRemoteSession added in v0.25.0

func (c *ConfirmDialog) ShowCloseRemoteSession(remoteName, sessionID, sessionName string)

ShowCloseRemoteSession shows confirmation for closing a remote session.

func (*ConfirmDialog) ShowCloseSession added in v0.21.0

func (c *ConfirmDialog) ShowCloseSession(sessionID string, sessionName string, sandboxed bool)

ShowCloseSession shows confirmation for non-destructive session close.

func (*ConfirmDialog) ShowCreateDirectory added in v0.8.99

func (c *ConfirmDialog) ShowCreateDirectory(
	path string,
	sessionName string,
	command string,
	groupPath string,
	toolOptionsJSON json.RawMessage,
	claudeExtraArgs []string,
	claudeStartQuery string,
	launchModelID string,
	parentSessionID string,
	parentProjectPath string,
)

ShowCreateDirectory shows confirmation for creating a missing directory.

func (*ConfirmDialog) ShowDeleteGroup

func (c *ConfirmDialog) ShowDeleteGroup(groupPath, groupName string)

ShowDeleteGroup shows confirmation for group deletion

func (*ConfirmDialog) ShowDeleteRemoteSession added in v0.25.0

func (c *ConfirmDialog) ShowDeleteRemoteSession(remoteName, sessionID, sessionName string)

ShowDeleteRemoteSession shows confirmation for deleting a remote session.

func (*ConfirmDialog) ShowDeleteSession

func (c *ConfirmDialog) ShowDeleteSession(sessionID string, sessionName string, sandboxed, worktree bool)

ShowDeleteSession shows confirmation for session deletion.

func (*ConfirmDialog) ShowInstallHooks added in v0.16.0

func (c *ConfirmDialog) ShowInstallHooks()

ShowInstallHooks shows confirmation for installing Claude Code hooks

func (*ConfirmDialog) ShowQuitWithPool added in v0.8.70

func (c *ConfirmDialog) ShowQuitWithPool(mcpCount int)

ShowQuitWithPool shows confirmation for quitting with MCP pool running

func (*ConfirmDialog) ShowRemoveSession added in v1.7.61

func (c *ConfirmDialog) ShowRemoveSession(sessionID string, sessionName string)

ShowRemoveSession shows confirmation for status-gated registry removal (TUI 'X'). Safer than ConfirmDeleteSession: the caller has already verified the session is stopped or errored, and the dialog wording reflects the registry-only intent (transcripts + worktrees are preserved).

func (*ConfirmDialog) Update

func (c *ConfirmDialog) Update(msg tea.KeyMsg) (*ConfirmDialog, tea.Cmd)

Update handles key events for arrow-key navigation between buttons.

func (*ConfirmDialog) View

func (c *ConfirmDialog) View() string

View renders the confirmation dialog

type ConfirmType

type ConfirmType int

ConfirmType indicates what action is being confirmed

const (
	ConfirmDeleteSession ConfirmType = iota
	ConfirmCloseSession
	ConfirmDeleteGroup
	ConfirmQuitWithPool
	ConfirmCreateDirectory
	ConfirmInstallHooks
	ConfirmDeleteRemoteSession
	ConfirmCloseRemoteSession
	ConfirmRemoveSession     // status-gated registry-only remove (TUI 'X')
	ConfirmBulkRemoveErrored // bulk remove of all errored sessions (TUI Ctrl+X)
)

type CreatingSession added in v1.3.1

type CreatingSession struct {
	ID        string // Temporary ID for tracking
	Title     string
	Tool      string
	GroupPath string
	StartTime time.Time
}

CreatingSession is a lightweight placeholder shown in the UI while a worktree + session is being created asynchronously. It is NOT a real session.Instance — it is excluded from save, polling, and search.

type EditPathsDialog added in v1.7.21

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

EditPathsDialog allows editing the repo paths of an existing multi-repo session.

func NewEditPathsDialog added in v1.7.21

func NewEditPathsDialog() *EditPathsDialog

func (*EditPathsDialog) GetPaths added in v1.7.21

func (d *EditPathsDialog) GetPaths() []string

GetPaths returns the validated, expanded, non-empty path list.

func (*EditPathsDialog) GetSessionID added in v1.7.21

func (d *EditPathsDialog) GetSessionID() string

func (*EditPathsDialog) HasChanged added in v1.7.21

func (d *EditPathsDialog) HasChanged() bool

HasChanged returns true if paths differ from the original set.

func (*EditPathsDialog) Hide added in v1.7.21

func (d *EditPathsDialog) Hide()

func (*EditPathsDialog) IsEditing added in v1.7.21

func (d *EditPathsDialog) IsEditing() bool

func (*EditPathsDialog) IsVisible added in v1.7.21

func (d *EditPathsDialog) IsVisible() bool

func (*EditPathsDialog) SetSize added in v1.7.21

func (d *EditPathsDialog) SetSize(w, h int)

func (*EditPathsDialog) Show added in v1.7.21

func (d *EditPathsDialog) Show(inst *session.Instance, pathSuggestions []string)

func (*EditPathsDialog) Update added in v1.7.21

func (d *EditPathsDialog) Update(msg tea.Msg) (*EditPathsDialog, tea.Cmd)

func (*EditPathsDialog) Validate added in v1.7.21

func (d *EditPathsDialog) Validate() string

Validate checks the current paths. Returns error string or "".

func (*EditPathsDialog) View added in v1.7.21

func (d *EditPathsDialog) View() string

type EditSessionDialog added in v1.7.70

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

EditSessionDialog edits the slim set of session fields users iterate on at runtime. Rare flags (TitleLocked, NoTransitionNotify, Wrapper, Channels, etc.) stay accessible via `agent-deck session set <field>`.

func NewEditSessionDialog added in v1.7.70

func NewEditSessionDialog() *EditSessionDialog

func (*EditSessionDialog) ClearError added in v1.7.70

func (d *EditSessionDialog) ClearError()

func (*EditSessionDialog) GetChanges added in v1.7.70

func (d *EditSessionDialog) GetChanges(inst *session.Instance) []Change

GetChanges returns only fields whose value differs from `inst`. The shape lets home.go batch saves and decide on the restart hint without the dialog touching persistence.

func (*EditSessionDialog) HasRestartRequiredChanges added in v1.7.70

func (d *EditSessionDialog) HasRestartRequiredChanges(inst *session.Instance) bool

func (*EditSessionDialog) Hide added in v1.7.70

func (d *EditSessionDialog) Hide()

func (*EditSessionDialog) IsVisible added in v1.7.70

func (d *EditSessionDialog) IsVisible() bool

IsVisible is nil-safe — some unit tests build a Home literal without NewHome, so d may be nil when the main key router runs.

func (*EditSessionDialog) SessionID added in v1.7.70

func (d *EditSessionDialog) SessionID() string

func (*EditSessionDialog) SetError added in v1.7.70

func (d *EditSessionDialog) SetError(msg string)

func (*EditSessionDialog) SetSize added in v1.7.70

func (d *EditSessionDialog) SetSize(w, h int)

func (*EditSessionDialog) Show added in v1.7.70

func (d *EditSessionDialog) Show(inst *session.Instance)

Show rebuilds the field slice. Claude-only rows are hidden for non-claude tools — friendlier than letting SetField reject the submit.

func (*EditSessionDialog) Update added in v1.7.70

func (d *EditSessionDialog) Update(msg tea.Msg) (*EditSessionDialog, tea.Cmd)

Update returns nil cmd on esc/enter so the outer key router can decide commit vs cancel.

func (*EditSessionDialog) Validate added in v1.7.70

func (d *EditSessionDialog) Validate() string

Validate is best-effort pre-flight feedback; SetField re-validates authoritatively at commit time.

func (*EditSessionDialog) View added in v1.7.70

func (d *EditSessionDialog) View() string

type EmptyStateConfig added in v0.5.8

type EmptyStateConfig struct {
	Icon     string
	Title    string
	Subtitle string
	Hints    []string // Full list of hints (will be reduced based on space)
}

EmptyStateConfig holds content for responsive empty state rendering

type FeedbackDialog added in v1.5.4

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

FeedbackDialog is a self-contained in-app feedback popup.

func NewFeedbackDialog added in v1.5.4

func NewFeedbackDialog() *FeedbackDialog

NewFeedbackDialog creates a new FeedbackDialog in hidden state.

func (*FeedbackDialog) Hide added in v1.5.4

func (d *FeedbackDialog) Hide()

Hide hides the dialog and resets internal state.

func (*FeedbackDialog) IsVisible added in v1.5.4

func (d *FeedbackDialog) IsVisible() bool

IsVisible returns true when the dialog is shown.

func (*FeedbackDialog) OnSent added in v1.7.37

func (d *FeedbackDialog) OnSent(msg feedbackSentMsg)

OnSent records the result of a send attempt so stepSent can render success or an explicit error message. Called by the TUI runtime on feedbackSentMsg.

func (*FeedbackDialog) SetSize added in v1.5.4

func (d *FeedbackDialog) SetSize(width, height int)

SetSize updates the dialog dimensions so it can center itself.

func (*FeedbackDialog) Show added in v1.5.4

func (d *FeedbackDialog) Show(version string, st *feedback.State, sender *feedback.Sender)

Show displays the dialog for the given version, state, and sender.

v1.7.38: when the state is opted-out (FeedbackEnabled=false), Show() is a silent no-op. Every auto-prompt caller is gated on ShouldShow already, which checks FeedbackEnabled — this is belt-and-braces so a new caller that forgets the ShouldShow gate cannot accidentally re-prompt an opted-out user. Explicit "open on demand" paths (e.g. ctrl+e) must re-enable the state BEFORE calling Show(); the dialog itself does not carry a re-enable UI.

func (*FeedbackDialog) Update added in v1.5.4

func (d *FeedbackDialog) Update(msg tea.KeyMsg) (*FeedbackDialog, tea.Cmd)

Update handles key events for the dialog.

func (*FeedbackDialog) View added in v1.5.4

func (d *FeedbackDialog) View() string

View renders the dialog. Returns "" when hidden.

type ForkDialog added in v0.4.1

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

ForkDialog handles the fork session dialog

func NewForkDialog added in v0.4.1

func NewForkDialog() *ForkDialog

NewForkDialog creates a new fork dialog

func (*ForkDialog) ClearError added in v0.8.80

func (d *ForkDialog) ClearError()

ClearError clears the inline validation error

func (*ForkDialog) GetOptions added in v0.8.39

func (d *ForkDialog) GetOptions() *session.ClaudeOptions

GetOptions returns the current Claude options

func (*ForkDialog) GetParentProjectPath added in v1.3.1

func (d *ForkDialog) GetParentProjectPath() string

GetParentProjectPath returns the project path of the selected conductor.

func (*ForkDialog) GetParentSessionID added in v1.3.1

func (d *ForkDialog) GetParentSessionID() string

GetParentSessionID returns the conductor ID selected in the dialog (empty = None).

func (*ForkDialog) GetValues added in v0.4.1

func (d *ForkDialog) GetValues() (name, group string)

GetValues returns the current input values

func (*ForkDialog) GetValuesWithWorktree added in v0.9.0

func (d *ForkDialog) GetValuesWithWorktree() (name, group, branch string, worktreeEnabled bool)

GetValuesWithWorktree returns all values including worktree settings

func (*ForkDialog) Hide added in v0.4.1

func (d *ForkDialog) Hide()

Hide hides the dialog

func (*ForkDialog) IsBranchPickerOpen added in v1.3.1

func (d *ForkDialog) IsBranchPickerOpen() bool

IsBranchPickerOpen returns whether the inline branch result list is visible.

func (*ForkDialog) IsSandboxEnabled added in v0.19.17

func (d *ForkDialog) IsSandboxEnabled() bool

IsSandboxEnabled returns whether Docker sandbox mode is enabled.

func (*ForkDialog) IsVisible added in v0.4.1

func (d *ForkDialog) IsVisible() bool

IsVisible returns whether the dialog is visible

func (*ForkDialog) IsWorktreeEnabled added in v0.9.0

func (d *ForkDialog) IsWorktreeEnabled() bool

IsWorktreeEnabled returns whether worktree mode is enabled

func (*ForkDialog) SetError added in v0.8.80

func (d *ForkDialog) SetError(msg string)

SetError sets an inline validation error displayed inside the dialog

func (*ForkDialog) SetSize added in v0.4.1

func (d *ForkDialog) SetSize(width, height int)

SetSize sets the dialog dimensions

func (*ForkDialog) Show added in v0.4.1

func (d *ForkDialog) Show(originalName, projectPath, groupPath string, conductors []*session.Instance, suggestedParentID string)

Show displays the dialog with pre-filled values

func (*ForkDialog) ToggleSandbox added in v0.19.17

func (d *ForkDialog) ToggleSandbox()

ToggleSandbox toggles Docker sandbox mode.

func (*ForkDialog) ToggleWorktree added in v0.9.0

func (d *ForkDialog) ToggleWorktree()

ToggleWorktree toggles the worktree checkbox

func (*ForkDialog) Update added in v0.4.1

func (d *ForkDialog) Update(msg tea.Msg) (*ForkDialog, tea.Cmd)

Update handles input events

func (*ForkDialog) Validate added in v0.8.80

func (d *ForkDialog) Validate() string

Validate checks if the dialog values are valid and returns an error message if not

func (*ForkDialog) View added in v0.4.1

func (d *ForkDialog) View() string

View renders the dialog

type GeminiModelDialog added in v0.8.79

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

GeminiModelDialog allows selecting a Gemini model for the current session

func NewGeminiModelDialog added in v0.8.79

func NewGeminiModelDialog() *GeminiModelDialog

NewGeminiModelDialog creates a new model selection dialog

func (*GeminiModelDialog) HandleModelsFetched added in v0.8.79

func (d *GeminiModelDialog) HandleModelsFetched(msg modelsFetchedMsg)

HandleModelsFetched processes the async model fetch result

func (*GeminiModelDialog) Hide added in v0.8.79

func (d *GeminiModelDialog) Hide()

Hide closes the dialog

func (*GeminiModelDialog) IsVisible added in v0.8.79

func (d *GeminiModelDialog) IsVisible() bool

IsVisible returns whether the dialog is visible

func (*GeminiModelDialog) SetSize added in v0.8.79

func (d *GeminiModelDialog) SetSize(width, height int)

SetSize updates the dialog dimensions

func (*GeminiModelDialog) Show added in v0.8.79

func (d *GeminiModelDialog) Show(instanceID, currentModel string) tea.Cmd

Show opens the dialog and triggers async model fetching

func (*GeminiModelDialog) Update added in v0.8.79

func (d *GeminiModelDialog) Update(msg tea.KeyMsg) (*GeminiModelDialog, tea.Cmd)

Update handles input for the dialog

func (*GeminiModelDialog) View added in v0.8.79

func (d *GeminiModelDialog) View() string

View renders the dialog

type GlobalSearch added in v0.5.3

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

GlobalSearch represents the global session search overlay

func NewGlobalSearch added in v0.5.3

func NewGlobalSearch() *GlobalSearch

NewGlobalSearch creates a new global search overlay

func (*GlobalSearch) Hide added in v0.5.3

func (gs *GlobalSearch) Hide()

Hide hides the overlay

func (*GlobalSearch) IsVisible added in v0.5.3

func (gs *GlobalSearch) IsVisible() bool

IsVisible returns whether the overlay is visible

func (*GlobalSearch) MarkInAgentDeck added in v0.5.3

func (gs *GlobalSearch) MarkInAgentDeck(instances []*session.Instance)

MarkInAgentDeck marks which results are already in Agent Deck

func (*GlobalSearch) RefreshStats added in v0.5.3

func (gs *GlobalSearch) RefreshStats()

RefreshStats updates the stats from the index

func (*GlobalSearch) Selected added in v0.5.3

func (gs *GlobalSearch) Selected() *GlobalSearchResult

Selected returns the currently selected result

func (*GlobalSearch) SetIndex added in v0.5.3

func (gs *GlobalSearch) SetIndex(index *session.GlobalSearchIndex)

SetIndex sets the search index reference

func (*GlobalSearch) SetSize added in v0.5.3

func (gs *GlobalSearch) SetSize(width, height int)

SetSize sets the dimensions of the overlay

func (*GlobalSearch) Show added in v0.5.3

func (gs *GlobalSearch) Show()

Show makes the overlay visible

func (*GlobalSearch) Update added in v0.5.3

func (gs *GlobalSearch) Update(msg tea.Msg) (*GlobalSearch, tea.Cmd)

Update handles messages for the overlay

func (*GlobalSearch) View added in v0.5.3

func (gs *GlobalSearch) View() string

View renders the overlay with split-pane layout

func (*GlobalSearch) WantsSwitchToLocal added in v0.5.3

func (gs *GlobalSearch) WantsSwitchToLocal() bool

WantsSwitchToLocal returns true if user pressed Tab to switch to local search

type GlobalSearchResult added in v0.5.3

type GlobalSearchResult struct {
	SessionID   string
	Summary     string
	Snippet     string
	Content     string // Full conversation content for preview
	CWD         string
	ModTime     time.Time // Last modified time
	Score       int       // Fuzzy match score (higher = better match)
	MatchCount  int       // Number of query matches in content
	InAgentDeck bool      // True if this session is already in Agent Deck
	InstanceID  string    // Agent Deck instance ID if exists
}

GlobalSearchResult wraps a search result for UI display

type GroupDialog

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

GroupDialog handles group creation, renaming, and moving sessions

func NewGroupDialog

func NewGroupDialog() *GroupDialog

NewGroupDialog creates a new group dialog

func (*GroupDialog) CanToggle added in v0.8.93

func (g *GroupDialog) CanToggle() bool

CanToggle returns true when the Tab toggle between Root and Subgroup is available. Only applies in Create mode when the cursor was on a group context.

func (*GroupDialog) ClearError added in v0.8.80

func (g *GroupDialog) ClearError()

ClearError clears the inline validation error

func (*GroupDialog) GetDefaultPath added in v1.9.7

func (g *GroupDialog) GetDefaultPath() string

GetDefaultPath returns the default-path input value for the group being created (Issue #918). Empty when the user left the field blank or when the dialog is in a mode that does not expose the field.

func (*GroupDialog) GetGroupPath

func (g *GroupDialog) GetGroupPath() string

GetGroupPath returns the group path being edited (or parent path for subgroup creation)

func (*GroupDialog) GetParentPath

func (g *GroupDialog) GetParentPath() string

GetParentPath returns the parent path for subgroup creation

func (*GroupDialog) GetSelectedGroup

func (g *GroupDialog) GetSelectedGroup() string

GetSelectedGroup returns the selected group for move mode

func (*GroupDialog) GetSessionID

func (g *GroupDialog) GetSessionID() string

GetSessionID returns the session ID being renamed

func (*GroupDialog) GetValue

func (g *GroupDialog) GetValue() string

GetValue returns the input value

func (*GroupDialog) HasParent

func (g *GroupDialog) HasParent() bool

HasParent returns true if creating a subgroup under a parent

func (*GroupDialog) Hide

func (g *GroupDialog) Hide()

Hide hides the dialog

func (*GroupDialog) IsVisible

func (g *GroupDialog) IsVisible() bool

IsVisible returns whether the dialog is visible

func (*GroupDialog) Mode

func (g *GroupDialog) Mode() GroupDialogMode

Mode returns the current dialog mode

func (*GroupDialog) SetError added in v0.8.80

func (g *GroupDialog) SetError(msg string)

SetError sets an inline validation error displayed inside the dialog

func (*GroupDialog) SetSize

func (g *GroupDialog) SetSize(width, height int)

SetSize sets the dialog size

func (*GroupDialog) Show

func (g *GroupDialog) Show()

Show shows the dialog in create mode (root level group)

func (*GroupDialog) ShowCreateSubgroup

func (g *GroupDialog) ShowCreateSubgroup(parentPath, parentName string)

ShowCreateSubgroup shows the dialog for creating a subgroup under a parent

func (*GroupDialog) ShowCreateWithContext added in v0.8.93

func (g *GroupDialog) ShowCreateWithContext(parentPath, parentName string)

ShowCreateWithContext opens the create dialog with cursor context for Tab toggling. If parentPath is non-empty, defaults to subgroup mode with Tab toggle available. If parentPath is empty, opens as root-level group with no toggle.

func (*GroupDialog) ShowCreateWithContextDefaultRoot added in v0.10.0

func (g *GroupDialog) ShowCreateWithContextDefaultRoot(parentPath, parentName string)

ShowCreateWithContextDefaultRoot opens the create dialog defaulting to root mode, but stores the cursor context so Tab toggle can switch to subgroup mode. Used when the cursor is on a session inside a group (not on the group header itself).

func (*GroupDialog) ShowMove

func (g *GroupDialog) ShowMove(groupPaths []string)

ShowMove shows the dialog for moving a session to a group path.

func (*GroupDialog) ShowRename

func (g *GroupDialog) ShowRename(currentPath, currentName string)

ShowRename shows the dialog in rename mode

func (*GroupDialog) ShowRenameSession

func (g *GroupDialog) ShowRenameSession(sessionID, currentName string)

ShowRenameSession shows the dialog for renaming a session

func (*GroupDialog) ToggleRootSubgroup added in v0.8.93

func (g *GroupDialog) ToggleRootSubgroup()

ToggleRootSubgroup swaps between root-level and subgroup creation modes.

func (*GroupDialog) Update

func (g *GroupDialog) Update(msg tea.KeyMsg) (*GroupDialog, tea.Cmd)

Update handles input

func (*GroupDialog) Validate

func (g *GroupDialog) Validate() string

Validate checks if the dialog values are valid and returns an error message if not

func (*GroupDialog) View

func (g *GroupDialog) View() string

View renders the dialog

type GroupDialogMode

type GroupDialogMode int

GroupDialogMode represents the dialog mode

const (
	GroupDialogCreate GroupDialogMode = iota
	GroupDialogRename
	GroupDialogMove
	GroupDialogRenameSession
)

type HelpOverlay added in v0.3.0

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

HelpOverlay shows keyboard shortcuts in a modal

func NewHelpOverlay added in v0.3.0

func NewHelpOverlay() *HelpOverlay

NewHelpOverlay creates a new help overlay

func (*HelpOverlay) Hide added in v0.3.0

func (h *HelpOverlay) Hide()

Hide hides the help overlay

func (*HelpOverlay) IsVisible added in v0.3.0

func (h *HelpOverlay) IsVisible() bool

IsVisible returns whether the help overlay is visible

func (*HelpOverlay) SetHotkeys added in v0.21.0

func (h *HelpOverlay) SetHotkeys(bindings map[string]string)

SetHotkeys updates displayed hotkeys for dynamic help rendering.

func (*HelpOverlay) SetSize added in v0.3.0

func (h *HelpOverlay) SetSize(width, height int)

SetSize sets the dimensions for centering

func (*HelpOverlay) Show added in v0.3.0

func (h *HelpOverlay) Show()

Show makes the help overlay visible

func (*HelpOverlay) Update added in v0.3.0

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

Update handles messages for the help overlay

func (*HelpOverlay) View added in v0.3.0

func (h *HelpOverlay) View() string

View renders the help overlay

type Home

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

Home is the main application model

func NewHome

func NewHome() *Home

NewHome creates a new home model with the default profile

func NewHomeWithProfile added in v0.3.0

func NewHomeWithProfile(profile string) *Home

NewHomeWithProfile creates a new home model with the specified profile.

func NewHomeWithProfileAndMode added in v0.8.74

func NewHomeWithProfileAndMode(profile string) *Home

NewHomeWithProfileAndMode creates a new Home with the specified profile. All instances manage the notification bar equally via shared SQLite state.

func (*Home) Init

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

Init initializes the model

func (*Home) SetCostBudget added in v0.26.4

func (h *Home) SetCostBudget(budget *costs.BudgetChecker)

SetCostBudget sets the budget checker for cost limits.

func (*Home) SetCostPricer added in v0.26.4

func (h *Home) SetCostPricer(pricer *costs.Pricer)

SetCostPricer sets the pricer for cost calculations.

func (*Home) SetCostStore added in v0.26.4

func (h *Home) SetCostStore(store *costs.Store)

SetCostStore sets the cost store for cost tracking display.

func (*Home) SetGroupScope added in v1.3.3

func (h *Home) SetGroupScope(path string)

SetGroupScope limits the TUI to sessions within the given group path. The path is normalized: lowercased and spaces replaced with hyphens.

func (*Home) SetInitialSelection added in v1.7.53

func (h *Home) SetInitialSelection(idOrTitle string)

SetInitialSelection queues a session to preselect on first render (#709). The value may be a session ID or a title. Preselection runs AFTER rebuildFlatItems so it respects any active group scope: if the session is outside the scope, applyInitialSelection returns false and the caller may warn. Crucially, SetInitialSelection does NOT hide any groups — every group configured by the user stays visible in the sidebar.

func (*Home) SetWebMenuData added in v0.19.0

func (h *Home) SetWebMenuData(menuData *web.MemoryMenuData)

SetWebMenuData configures an optional in-memory menu sink for web mode.

func (*Home) Update

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

Update implements tea.Model. It delegates to updateInner and, when fullRepaint is enabled, appends tea.ClearScreen on KeyMsg and mouse-wheel MouseMsg events to prevent incremental-redraw drift between the tick-based clears (issue #607). Under the default (full_repaint = false) this wrapper is a pass-through — no regression for users who never opt in.

func (*Home) View

func (h *Home) View() string

View renders the UI

type List

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

List manages session list display

func NewList

func NewList() *List

NewList creates a new list

func (*List) Cursor

func (l *List) Cursor() int

Cursor returns current cursor position

func (*List) Len

func (l *List) Len() int

Len returns number of items

func (*List) MoveDown

func (l *List) MoveDown()

MoveDown moves cursor down

func (*List) MoveUp

func (l *List) MoveUp()

MoveUp moves cursor up

func (*List) Selected

func (l *List) Selected() *session.Instance

Selected returns the currently selected item

func (*List) SetItems

func (l *List) SetItems(items []*session.Instance)

SetItems sets the list items

func (*List) SetSize

func (l *List) SetSize(width, height int)

SetSize sets the list dimensions

func (*List) ToggleFolder

func (l *List) ToggleFolder(name string)

ToggleFolder toggles the current folder

func (*List) View

func (l *List) View() string

View renders the list

type MCPColumn added in v0.5.3

type MCPColumn int

MCPColumn represents Attached or Available column

const (
	MCPColumnAttached MCPColumn = iota
	MCPColumnAvailable
)

type MCPDialog added in v0.5.3

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

MCPDialog handles MCP management for Claude and Gemini sessions

func NewMCPDialog added in v0.5.3

func NewMCPDialog() *MCPDialog

NewMCPDialog creates a new MCP management dialog

func (*MCPDialog) Apply added in v0.5.3

func (m *MCPDialog) Apply() error

Apply saves the changes to LOCAL (.mcp.json), GLOBAL (Claude/Gemini config), and USER (~/.claude.json)

func (*MCPDialog) GetError added in v0.5.3

func (m *MCPDialog) GetError() error

GetError returns any error that occurred

func (*MCPDialog) GetProjectPath added in v0.5.3

func (m *MCPDialog) GetProjectPath() string

GetProjectPath returns the project path being managed

func (*MCPDialog) GetSessionID added in v0.5.4

func (m *MCPDialog) GetSessionID() string

GetSessionID returns the session ID being managed

func (*MCPDialog) HasChanged added in v0.5.3

func (m *MCPDialog) HasChanged() bool

HasChanged returns true if any MCPs were changed (any scope)

func (*MCPDialog) HasItems added in v0.5.3

func (m *MCPDialog) HasItems() bool

HasItems returns true if there are MCPs to manage

func (*MCPDialog) Hide added in v0.5.3

func (m *MCPDialog) Hide()

Hide hides the dialog

func (*MCPDialog) IsVisible added in v0.5.3

func (m *MCPDialog) IsVisible() bool

IsVisible returns whether the dialog is visible

func (*MCPDialog) Move added in v0.5.3

func (m *MCPDialog) Move()

Move moves the selected item between Attached <-> Available

func (*MCPDialog) ScrollDown added in v0.26.0

func (m *MCPDialog) ScrollDown()

ScrollDown moves the active list cursor down by one (mouse wheel support).

func (*MCPDialog) ScrollUp added in v0.26.0

func (m *MCPDialog) ScrollUp()

ScrollUp moves the active list cursor up by one (mouse wheel support).

func (*MCPDialog) SetSize added in v0.5.3

func (m *MCPDialog) SetSize(width, height int)

SetSize sets the dialog size

func (*MCPDialog) Show added in v0.5.3

func (m *MCPDialog) Show(projectPath string, sessionID string, tool string) error

Show displays the MCP dialog for a project

func (*MCPDialog) Update added in v0.5.3

func (m *MCPDialog) Update(msg tea.KeyMsg) (*MCPDialog, tea.Cmd)

Update handles input

func (*MCPDialog) View added in v0.5.3

func (m *MCPDialog) View() string

View renders the dialog

type MCPItem added in v0.5.3

type MCPItem struct {
	Name         string
	Description  string
	IsOrphan     bool   // True if MCP is attached but not in config.toml pool
	IsPooled     bool   // True if this MCP uses socket pool
	Transport    string // "stdio", "http", or "sse"
	HTTPStatus   string // For HTTP MCPs: "running", "stopped", "external", etc.
	HasServerCfg bool   // True if HTTP MCP has [mcps.X.server] config
}

MCPItem represents an MCP in the dialog list

type MCPScope added in v0.5.3

type MCPScope int

MCPScope represents LOCAL, GLOBAL, or USER scope

const (
	MCPScopeLocal MCPScope = iota
	MCPScopeGlobal
	MCPScopeUser // NEW: Manages ~/.claude.json (ROOT)
)

type MaintenanceCompleteMsg added in v0.8.79

type MaintenanceCompleteMsg struct {
	Result session.MaintenanceResult
}

MaintenanceCompleteMsg is the exported type for sending from main.go via p.Send()

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

Menu shows bottom menu bar

func NewMenu

func NewMenu() *Menu

NewMenu creates a new menu

func (m *Menu) SetWidth(width int)

SetWidth sets menu width

func (m *Menu) View() string

View renders the menu

type NewDialog

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

NewDialog represents the new session creation dialog.

func NewNewDialog

func NewNewDialog() *NewDialog

NewNewDialog creates a new NewDialog instance

func (*NewDialog) ApplyHighlightedModelSuggestion added in v1.9.14

func (d *NewDialog) ApplyHighlightedModelSuggestion()

func (*NewDialog) ApplyHighlightedSuggestion added in v1.7.72

func (d *NewDialog) ApplyHighlightedSuggestion()

ApplyHighlightedSuggestion applies the currently highlighted real suggestion to the path input and exits the active dropdown mode (dropdown remains visible). Has no effect on the input when "Type custom" is highlighted — only the active mode is exited.

func (*NewDialog) ClearError added in v0.8.80

func (d *NewDialog) ClearError()

ClearError clears the inline validation error

func (*NewDialog) DismissModelSuggestions added in v1.9.14

func (d *NewDialog) DismissModelSuggestions()

func (*NewDialog) DismissSuggestions added in v1.7.72

func (d *NewDialog) DismissSuggestions()

DismissSuggestions hides the dropdown until the user types in the input or focus changes. Used after Enter so the dropdown disappears even when the form fails to submit due to validation errors.

func (*NewDialog) GetClaudeExtraArgs added in v1.7.21

func (d *NewDialog) GetClaudeExtraArgs() []string

GetClaudeExtraArgs returns the user-supplied claude CLI tokens from the options panel. Returns nil for non-claude tools. Tokens are whitespace-split; for values with embedded spaces, use `ad-fork add --extra-arg`.

func (*NewDialog) GetClaudeOptions added in v0.8.39

func (d *NewDialog) GetClaudeOptions() *session.ClaudeOptions

GetClaudeOptions returns the Claude-specific options (only relevant if command is "claude")

func (*NewDialog) GetClaudeStartQuery added in v1.7.67

func (d *NewDialog) GetClaudeStartQuery() string

GetClaudeStartQuery returns the user-supplied claude startup query from the options panel (v1.7.67, #725). Returns "" for non-claude tools. The value is a single string — NEVER split on spaces — and is assigned by the caller to Instance.StartupQuery for single-shot emission on the new-session command line.

func (*NewDialog) GetCodexYoloMode added in v0.10.18

func (d *NewDialog) GetCodexYoloMode() bool

GetCodexYoloMode returns the Codex YOLO mode state

func (*NewDialog) GetLaunchModelID added in v1.9.14

func (d *NewDialog) GetLaunchModelID() string

GetLaunchModelID returns the optional model/version override for supported tools.

func (*NewDialog) GetMultiRepoPaths added in v0.26.2

func (d *NewDialog) GetMultiRepoPaths() ([]string, bool)

GetMultiRepoPaths returns the multi-repo paths and enabled state.

func (*NewDialog) GetParentProjectPath added in v1.3.1

func (d *NewDialog) GetParentProjectPath() string

GetParentProjectPath returns the selected conductor's project path, or "".

func (*NewDialog) GetParentSessionID added in v1.3.1

func (d *NewDialog) GetParentSessionID() string

GetParentSessionID returns the selected conducting parent session ID, or "" for None.

func (*NewDialog) GetSelectedCommand added in v0.8.35

func (d *NewDialog) GetSelectedCommand() string

GetSelectedCommand returns the currently selected command/tool

func (*NewDialog) GetSelectedGroup

func (d *NewDialog) GetSelectedGroup() string

GetSelectedGroup returns the parent group path

func (*NewDialog) GetValues

func (d *NewDialog) GetValues() (name, path, command string)

GetValues returns the current dialog values with expanded paths

func (*NewDialog) GetValuesWithWorktree added in v0.8.22

func (d *NewDialog) GetValuesWithWorktree() (name, path, command, branch string, worktreeEnabled bool)

GetValuesWithWorktree returns all values including worktree settings

func (*NewDialog) Hide

func (d *NewDialog) Hide()

Hide hides the dialog

func (*NewDialog) IsBranchPickerOpen added in v1.3.1

func (d *NewDialog) IsBranchPickerOpen() bool

IsBranchPickerOpen returns whether the inline branch result list is visible.

func (*NewDialog) IsGeminiYoloMode added in v0.8.35

func (d *NewDialog) IsGeminiYoloMode() bool

IsGeminiYoloMode returns whether YOLO mode is enabled for Gemini

func (*NewDialog) IsModelSuggestionsActive added in v1.9.14

func (d *NewDialog) IsModelSuggestionsActive() bool

func (*NewDialog) IsModelTypeCustomHighlighted added in v1.9.14

func (d *NewDialog) IsModelTypeCustomHighlighted() bool

func (*NewDialog) IsMultiRepoEditing added in v0.26.2

func (d *NewDialog) IsMultiRepoEditing() bool

IsMultiRepoEditing returns true when the user is editing a path in the multi-repo list. Used by the parent to prevent enter from submitting the form.

func (*NewDialog) IsRecentPickerOpen added in v0.20.0

func (d *NewDialog) IsRecentPickerOpen() bool

IsRecentPickerOpen returns whether the recent sessions picker is visible.

func (*NewDialog) IsSandboxEnabled added in v0.19.17

func (d *NewDialog) IsSandboxEnabled() bool

IsSandboxEnabled returns whether Docker sandbox mode is enabled.

func (*NewDialog) IsSuggestionsActive added in v1.7.72

func (d *NewDialog) IsSuggestionsActive() bool

IsSuggestionsActive returns whether arrow-key focus is inside the path suggestions dropdown. Used by the parent so it can forward keys to the dialog before its own Enter/Esc handlers consume them.

func (*NewDialog) IsTypeCustomHighlighted added in v1.7.72

func (d *NewDialog) IsTypeCustomHighlighted() bool

IsTypeCustomHighlighted returns true when the synthetic "Type custom" entry is the highlighted item in the active dropdown.

func (*NewDialog) IsVisible

func (d *NewDialog) IsVisible() bool

IsVisible returns whether the dialog is visible

func (*NewDialog) IsWorktreeEnabled added in v0.8.22

func (d *NewDialog) IsWorktreeEnabled() bool

IsWorktreeEnabled returns whether worktree mode is enabled

func (*NewDialog) SetDefaultTool added in v0.4.3

func (d *NewDialog) SetDefaultTool(tool string)

SetDefaultTool sets the pre-selected command based on tool name Call this before Show/ShowInGroup to apply user's preferred default

func (*NewDialog) SetError added in v0.8.80

func (d *NewDialog) SetError(msg string)

SetError sets an inline validation error displayed inside the dialog

func (*NewDialog) SetPathSuggestions

func (d *NewDialog) SetPathSuggestions(paths []string)

SetPathSuggestions sets the available path suggestions for autocomplete

func (*NewDialog) SetRecentSessions added in v0.20.0

func (d *NewDialog) SetRecentSessions(sessions []*statedb.RecentSessionRow)

SetRecentSessions sets the list of recently deleted session configs.

func (*NewDialog) SetSize

func (d *NewDialog) SetSize(width, height int)

SetSize sets the dialog dimensions

func (*NewDialog) Show

func (d *NewDialog) Show()

Show makes the dialog visible (uses default group)

func (*NewDialog) ShowInGroup

func (d *NewDialog) ShowInGroup(groupPath, groupName, defaultPath string, conductors []*session.Instance, suggestedParentID string)

ShowInGroup shows the dialog with a pre-selected parent group and optional default path. conductors is the list of active conductor sessions available as parent options.

func (*NewDialog) ToggleMultiRepo added in v0.26.2

func (d *NewDialog) ToggleMultiRepo()

ToggleMultiRepo toggles multi-repo mode. When enabling, initializes multiRepoPaths with the current pathInput value. When disabling, collapses back to the first path.

func (*NewDialog) ToggleSandbox added in v0.19.17

func (d *NewDialog) ToggleSandbox()

ToggleSandbox toggles Docker sandbox mode.

func (*NewDialog) ToggleWorktree added in v0.8.22

func (d *NewDialog) ToggleWorktree()

ToggleWorktree toggles the worktree checkbox. When enabling, auto-populates the branch name from the session name.

func (*NewDialog) Update

func (d *NewDialog) Update(msg tea.Msg) (*NewDialog, tea.Cmd)

func (*NewDialog) Validate

func (d *NewDialog) Validate() string

Validate checks if the dialog values are valid and returns an error message if not

func (*NewDialog) View

func (d *NewDialog) View() string

View renders the dialog.

type OptionsPanel added in v0.10.18

type OptionsPanel interface {
	Focus()
	Blur()
	IsFocused() bool
	AtTop() bool
	Update(tea.Msg) tea.Cmd
	View() string
}

OptionsPanel is the interface for tool-specific option panels in session dialogs. Implemented by ClaudeOptionsPanel and YoloOptionsPanel.

type PluginDialog added in v1.9.2

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

func NewPluginDialog added in v1.9.2

func NewPluginDialog() *PluginDialog

func (*PluginDialog) GetSessionID added in v1.9.2

func (d *PluginDialog) GetSessionID() string

func (*PluginDialog) HasChanged added in v1.9.2

func (d *PluginDialog) HasChanged() bool

func (*PluginDialog) Hide added in v1.9.2

func (d *PluginDialog) Hide()

func (*PluginDialog) IsVisible added in v1.9.2

func (d *PluginDialog) IsVisible() bool

func (*PluginDialog) SelectedPluginNames added in v1.9.2

func (d *PluginDialog) SelectedPluginNames() []string

func (*PluginDialog) SetSize added in v1.9.2

func (d *PluginDialog) SetSize(w, h int)

func (*PluginDialog) Show added in v1.9.2

func (d *PluginDialog) Show(inst *session.Instance) error

func (*PluginDialog) Update added in v1.9.2

func (d *PluginDialog) Update(msg tea.KeyMsg) (*PluginDialog, tea.Cmd)

func (*PluginDialog) View added in v1.9.2

func (d *PluginDialog) View() string

type Preview

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

Preview shows session terminal content

func NewPreview

func NewPreview() *Preview

NewPreview creates a new preview pane

func (*Preview) SetContent

func (p *Preview) SetContent(content, title string)

SetContent sets the preview content

func (*Preview) SetSize

func (p *Preview) SetSize(width, height int)

SetSize sets preview dimensions

func (*Preview) View

func (p *Preview) View() string

View renders the preview

type PreviewMode added in v0.8.61

type PreviewMode int

PreviewMode defines what to show in the preview pane

const (
	PreviewModeBoth      PreviewMode = iota // Show both analytics and output (default)
	PreviewModeOutput                       // Show output only (content preview)
	PreviewModeAnalytics                    // Show analytics only
)
type Search struct {
	// contains filtered or unexported fields
}

Search represents the search overlay component

func NewSearch

func NewSearch() *Search

NewSearch creates a new search overlay

func (*Search) Hide

func (s *Search) Hide()

Hide hides the search overlay and clears any group scope.

func (*Search) IsVisible

func (s *Search) IsVisible() bool

IsVisible returns whether the search overlay is visible

func (*Search) Selected

func (s *Search) Selected() *session.Instance

Selected returns the currently selected item

func (*Search) SetItems

func (s *Search) SetItems(items []*session.Instance)

SetItems sets the full list of items to search through. When a group scope has been set via SetScopedGroup, items are filtered to that group before storage so background reloads do not leak out-of-group sessions into a scoped in-group search session.

func (*Search) SetScopedGroup added in v1.7.60

func (s *Search) SetScopedGroup(groupPath string)

SetScopedGroup restricts SetItems to a single group path. Pass "" to clear.

func (*Search) SetSize

func (s *Search) SetSize(width, height int)

SetSize sets the dimensions of the search overlay

func (*Search) Show

func (s *Search) Show()

Show makes the search overlay visible

func (*Search) Update

func (s *Search) Update(msg tea.Msg) (*Search, tea.Cmd)

Update handles messages for the search overlay Returns the updated Search and any command to execute

func (*Search) View

func (s *Search) View() string

View renders the search overlay

func (*Search) WantsSwitchToGlobal added in v0.5.3

func (s *Search) WantsSwitchToGlobal() bool

WantsSwitchToGlobal returns true if user pressed Tab to switch to global search

type SessionPickerDialog added in v0.8.80

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

SessionPickerDialog presents a list of sessions for the user to select from. Used by the "x" (send output) feature to pick a target session.

func NewSessionPickerDialog added in v0.8.80

func NewSessionPickerDialog() *SessionPickerDialog

NewSessionPickerDialog creates a new session picker dialog.

func (*SessionPickerDialog) GetSelected added in v0.8.80

func (d *SessionPickerDialog) GetSelected() *session.Instance

GetSelected returns the session at the current cursor position, or nil.

func (*SessionPickerDialog) GetSource added in v0.8.80

func (d *SessionPickerDialog) GetSource() *session.Instance

GetSource returns the source session.

func (*SessionPickerDialog) Hide added in v0.8.80

func (d *SessionPickerDialog) Hide()

Hide closes the dialog and resets state.

func (*SessionPickerDialog) IsVisible added in v0.8.80

func (d *SessionPickerDialog) IsVisible() bool

IsVisible returns whether the dialog is currently shown.

func (*SessionPickerDialog) SetSize added in v0.8.80

func (d *SessionPickerDialog) SetSize(w, h int)

SetSize updates the dialog dimensions for centering.

func (*SessionPickerDialog) Show added in v0.8.80

func (d *SessionPickerDialog) Show(source *session.Instance, allInstances []*session.Instance)

Show opens the picker with the source session and all available instances. Filters out the source session and sessions in error status.

func (*SessionPickerDialog) Update added in v0.8.80

Update handles key events for the picker.

func (*SessionPickerDialog) View added in v0.8.80

func (d *SessionPickerDialog) View() string

View renders the session picker dialog.

type SettingType added in v0.8.16

type SettingType int

SettingType identifies which setting is being edited

const (
	SettingTheme SettingType = iota // Theme must be first (index 0)
	SettingDefaultTool
	SettingDangerousMode
	SettingClaudeConfigDir
	SettingGeminiYoloMode
	SettingCodexYoloMode
	SettingCheckForUpdates
	SettingAutoUpdate
	SettingLogMaxSize
	SettingLogMaxLines
	SettingRemoveOrphans
	SettingGlobalSearchEnabled
	SettingSearchTier
	SettingRecentDays
	SettingShowOutput
	SettingShowAnalytics
	SettingShowNotes
	SettingNotesOutputSplit
	SettingMaintenanceEnabled
	SettingStatsEnabled
	SettingStatsRefresh
	SettingStatsFormat
	SettingStatsShowCPU
	SettingStatsShowRAM
	SettingStatsShowDisk
	SettingStatsShowNetwork
	SettingStatsShowGPU
	SettingStatsShowLoad
)

type SettingsPanel added in v0.8.16

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

SettingsPanel displays and edits user configuration

func NewSettingsPanel added in v0.8.16

func NewSettingsPanel() *SettingsPanel

NewSettingsPanel creates a new settings panel

func (*SettingsPanel) GetConfig added in v0.8.16

func (s *SettingsPanel) GetConfig() *session.UserConfig

GetConfig returns a UserConfig with current panel values

func (*SettingsPanel) Hide added in v0.8.16

func (s *SettingsPanel) Hide()

Hide hides the settings panel

func (*SettingsPanel) IsVisible added in v0.8.16

func (s *SettingsPanel) IsVisible() bool

IsVisible returns whether the panel is visible

func (*SettingsPanel) LoadConfig added in v0.8.16

func (s *SettingsPanel) LoadConfig(config *session.UserConfig)

LoadConfig populates panel values from a UserConfig

func (*SettingsPanel) NeedsRestart added in v0.8.16

func (s *SettingsPanel) NeedsRestart() bool

NeedsRestart returns true if changes require a restart

func (*SettingsPanel) ScrollDown added in v0.26.0

func (s *SettingsPanel) ScrollDown()

ScrollDown moves the settings cursor down by one (mouse wheel support).

func (*SettingsPanel) ScrollUp added in v0.26.0

func (s *SettingsPanel) ScrollUp()

ScrollUp moves the settings cursor up by one (mouse wheel support).

func (*SettingsPanel) SetProfile added in v0.19.1

func (s *SettingsPanel) SetProfile(profile string)

SetProfile sets the active profile for profile-aware settings.

func (*SettingsPanel) SetSize added in v0.8.16

func (s *SettingsPanel) SetSize(width, height int)

SetSize sets the panel dimensions

func (*SettingsPanel) Show added in v0.8.16

func (s *SettingsPanel) Show()

Show displays the settings panel and loads current config

func (*SettingsPanel) Update added in v0.8.16

func (s *SettingsPanel) Update(msg tea.KeyMsg) (*SettingsPanel, tea.Cmd, bool)

Update handles input and returns (panel, cmd, valueChanged)

func (*SettingsPanel) View added in v0.8.16

func (s *SettingsPanel) View() string

View renders the settings panel

type SetupWizard added in v0.8.16

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

SetupWizard represents the first-time setup wizard dialog It guides users through initial configuration when config.toml doesn't exist

func NewSetupWizard added in v0.8.16

func NewSetupWizard() *SetupWizard

NewSetupWizard creates a new setup wizard

func (*SetupWizard) GetConfig added in v0.8.16

func (w *SetupWizard) GetConfig() *session.UserConfig

GetConfig returns the user configuration based on wizard selections

func (*SetupWizard) Hide added in v0.8.16

func (w *SetupWizard) Hide()

Hide hides the wizard

func (*SetupWizard) IsComplete added in v0.8.16

func (w *SetupWizard) IsComplete() bool

IsComplete returns whether the wizard has been completed

func (*SetupWizard) IsVisible added in v0.8.16

func (w *SetupWizard) IsVisible() bool

IsVisible returns whether the wizard is visible

func (*SetupWizard) SetSize added in v0.8.16

func (w *SetupWizard) SetSize(width, height int)

SetSize updates the wizard dimensions

func (*SetupWizard) Show added in v0.8.16

func (w *SetupWizard) Show()

Show makes the wizard visible

func (*SetupWizard) Update added in v0.8.16

func (w *SetupWizard) Update(msg tea.Msg) (*SetupWizard, tea.Cmd)

Update handles key events for the wizard

func (*SetupWizard) View added in v0.8.16

func (w *SetupWizard) View() string

View renders the wizard dialog

type SkillColumn added in v0.19.1

type SkillColumn int

SkillColumn identifies the focused column.

const (
	SkillColumnAttached SkillColumn = iota
	SkillColumnAvailable
)

type SkillDialog added in v0.19.1

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

SkillDialog manages project-scoped skills.

func NewSkillDialog added in v0.19.1

func NewSkillDialog() *SkillDialog

NewSkillDialog creates a skill manager dialog instance.

func (*SkillDialog) Apply added in v0.19.1

func (d *SkillDialog) Apply() error

Apply saves project skills according to attached column state.

func (*SkillDialog) GetError added in v0.19.1

func (d *SkillDialog) GetError() error

GetError returns the latest apply error.

func (*SkillDialog) GetSessionID added in v0.19.1

func (d *SkillDialog) GetSessionID() string

GetSessionID returns the managed session ID.

func (*SkillDialog) HasChanged added in v0.19.1

func (d *SkillDialog) HasChanged() bool

HasChanged indicates whether user moved any item.

func (*SkillDialog) Hide added in v0.19.1

func (d *SkillDialog) Hide()

Hide closes the dialog.

func (*SkillDialog) IsVisible added in v0.19.1

func (d *SkillDialog) IsVisible() bool

IsVisible returns whether dialog is shown.

func (*SkillDialog) Move added in v0.19.1

func (d *SkillDialog) Move()

Move toggles one item between attached and available lists.

func (*SkillDialog) NeedsApply added in v1.7.32

func (d *SkillDialog) NeedsApply() bool

NeedsApply reports whether Apply should run due to user changes or runtime reconciliation.

func (*SkillDialog) SetSize added in v0.19.1

func (d *SkillDialog) SetSize(width, height int)

SetSize updates dialog dimensions.

func (*SkillDialog) Show added in v0.19.1

func (d *SkillDialog) Show(projectPath, sessionID, tool string) error

Show opens the dialog for a specific project/session.

func (*SkillDialog) Update added in v0.19.1

func (d *SkillDialog) Update(msg tea.KeyMsg) (*SkillDialog, tea.Cmd)

Update handles keyboard input while dialog is visible.

func (*SkillDialog) View added in v0.19.1

func (d *SkillDialog) View() string

View renders the dialog body.

type SkillDialogItem added in v0.19.1

type SkillDialogItem struct {
	Candidate session.SkillCandidate
}

SkillDialogItem wraps one discovered skill.

type StorageWatcher added in v0.6.1

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

StorageWatcher monitors the SQLite database for external changes by polling the metadata.last_modified timestamp. Replaces the previous fsnotify-based watcher which had reliability issues on certain filesystems (9p, NFS, WSL).

func NewStorageWatcher added in v0.6.1

func NewStorageWatcher(db *statedb.StateDB) (*StorageWatcher, error)

NewStorageWatcher creates a watcher that polls the SQLite metadata for changes.

func (*StorageWatcher) Close added in v0.6.1

func (sw *StorageWatcher) Close() error

Close stops the watcher and releases resources. Safe to call multiple times.

func (*StorageWatcher) NotifySave added in v0.7.0

func (sw *StorageWatcher) NotifySave()

NotifySave should be called by the TUI right before it saves to storage. This marks the current time so the watcher can ignore the resulting change.

func (*StorageWatcher) ReloadChannel added in v0.6.1

func (sw *StorageWatcher) ReloadChannel() <-chan struct{}

ReloadChannel returns the channel that signals when reload is needed.

func (*StorageWatcher) Start added in v0.6.1

func (sw *StorageWatcher) Start()

Start begins polling for changes (non-blocking).

func (*StorageWatcher) TriggerReload added in v0.10.15

func (sw *StorageWatcher) TriggerReload()

TriggerReload sends a reload signal. Used as a manual trigger for reload (e.g., after CLI command changes).

func (*StorageWatcher) Warning added in v0.10.15

func (sw *StorageWatcher) Warning() string

Warning returns empty string. SQLite polling works on all filesystems.

type Theme added in v0.8.16

type Theme string

Theme represents the current color scheme

const (
	ThemeDark  Theme = "dark"
	ThemeLight Theme = "light"
)

func GetCurrentTheme added in v0.8.16

func GetCurrentTheme() Theme

GetCurrentTheme returns the active theme

type ThemeWatcher added in v0.15.0

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

ThemeWatcher monitors OS dark mode changes and signals the UI to update. Follows the same pattern as StorageWatcher: goroutine + buffered channel + Close().

func NewThemeWatcher added in v0.15.0

func NewThemeWatcher(parentCtx context.Context) *ThemeWatcher

NewThemeWatcher creates and starts a theme watcher. Returns nil if WatchDarkMode fails (caller should fall back gracefully).

func (*ThemeWatcher) ChangeChannel added in v0.15.0

func (tw *ThemeWatcher) ChangeChannel() <-chan bool

ChangeChannel returns the channel that receives dark mode changes.

func (*ThemeWatcher) Close added in v0.15.0

func (tw *ThemeWatcher) Close()

Close stops the watcher goroutine. Safe to call multiple times.

type Tree

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

Tree manages folder structure

func NewTree

func NewTree() *Tree

NewTree creates a new tree

func (*Tree) AddFolder

func (t *Tree) AddFolder(name string)

AddFolder adds a folder to the tree

func (*Tree) Clear

func (t *Tree) Clear()

Clear removes all folders

func (*Tree) GetFolder

func (t *Tree) GetFolder(name string) *TreeFolder

GetFolder returns a folder by name

func (*Tree) GetFolders

func (t *Tree) GetFolders() []string

GetFolders returns all folder names in order

func (*Tree) IsFolderExpanded

func (t *Tree) IsFolderExpanded(name string) bool

IsFolderExpanded returns whether a folder is expanded

func (*Tree) SetFolderCount

func (t *Tree) SetFolderCount(name string, count int)

SetFolderCount sets the session count for a folder

func (*Tree) ToggleFolder

func (t *Tree) ToggleFolder(name string)

ToggleFolder toggles folder expansion

func (*Tree) View

func (t *Tree) View(selectedFolder string) string

View renders the tree (just folders, not sessions)

type TreeFolder

type TreeFolder struct {
	Name     string
	Expanded bool
	Count    int
}

TreeFolder represents a folder in the tree

type WatcherActionMsg added in v1.5.1

type WatcherActionMsg struct {
	Action      string // "start", "stop", "test"
	WatcherID   string
	WatcherName string
}

WatcherActionMsg is the tea.Msg returned when the user triggers a quick action.

type WatcherDisplayItem added in v1.5.1

type WatcherDisplayItem struct {
	ID            string
	Name          string
	Type          string
	Status        string // "running", "stopped"
	HealthStatus  string // "healthy", "warning", "error", "stopped"
	EventsPerHour float64
	Conductor     string
}

WatcherDisplayItem is a watcher entry suitable for TUI list rendering.

type WatcherEventDisplay added in v1.5.1

type WatcherEventDisplay struct {
	Timestamp time.Time
	Sender    string
	Subject   string
	RoutedTo  string
	SessionID string
}

WatcherEventDisplay is an event row suitable for TUI detail rendering.

type WatcherPanel added in v1.5.1

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

WatcherPanel is an overlay panel that shows watcher list and detail views. It follows the same pattern as SettingsPanel: Show/Hide/IsVisible/SetSize/Update/View.

func NewWatcherPanel added in v1.5.1

func NewWatcherPanel() *WatcherPanel

NewWatcherPanel creates a new WatcherPanel.

func (*WatcherPanel) Hide added in v1.5.1

func (wp *WatcherPanel) Hide()

Hide hides the panel.

func (*WatcherPanel) IsVisible added in v1.5.1

func (wp *WatcherPanel) IsVisible() bool

IsVisible returns whether the panel is currently shown.

func (*WatcherPanel) SelectedWatcher added in v1.5.1

func (wp *WatcherPanel) SelectedWatcher() *WatcherDisplayItem

SelectedWatcher returns the currently highlighted watcher or nil when the list is empty.

func (*WatcherPanel) SetEvents added in v1.5.1

func (wp *WatcherPanel) SetEvents(events []WatcherEventDisplay)

SetEvents replaces the event list shown in detail view.

func (*WatcherPanel) SetSize added in v1.5.1

func (wp *WatcherPanel) SetSize(w, h int)

SetSize sets the terminal dimensions used for rendering.

func (*WatcherPanel) SetWatchers added in v1.5.1

func (wp *WatcherPanel) SetWatchers(items []WatcherDisplayItem)

SetWatchers replaces the displayed watcher list.

func (*WatcherPanel) Show added in v1.5.1

func (wp *WatcherPanel) Show()

Show makes the panel visible and resets navigation state.

func (*WatcherPanel) Update added in v1.5.1

func (wp *WatcherPanel) Update(msg tea.Msg) (*WatcherPanel, tea.Cmd)

Update processes keyboard input for the watcher panel. Returns the updated panel, an optional tea.Cmd, and (for forward compatibility) true.

func (*WatcherPanel) View added in v1.5.1

func (wp *WatcherPanel) View() string

View renders the panel as an overlay string. Returns empty string when not visible.

type WebMutator added in v1.3.4

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

WebMutator bridges the web HTTP handlers to the TUI session/group management methods. It wraps the Home model and implements web.SessionMutator.

The undoStack/undoWindow fields support the web's Chrome-style undo of deletes (POST /api/sessions/undelete). The TUI maintains its own in-memory stack in Home; the web stack is kept here so that web deletes/undos don't race with the Tea Update goroutine.

func NewWebMutator added in v1.3.4

func NewWebMutator(h *Home) *WebMutator

NewWebMutator returns a WebMutator backed by the given Home. The undo window defaults to web.DefaultUndoWindow (30s).

func (*WebMutator) CloseSession added in v1.9.26

func (m *WebMutator) CloseSession(id string) error

CloseSession stops the session process but keeps its metadata in storage. Mirrors the TUI's Shift+D handler (internal/ui/home.go closeSession). Identical to StopSession at the session.Instance level — both call Kill() — but is kept distinct so the parity matrix and the front-end can express the user-visible intent ("close, but don't delete").

func (*WebMutator) CreateGroup added in v1.3.4

func (m *WebMutator) CreateGroup(name, parentPath string) (string, error)

CreateGroup creates a new group (or subgroup if parentPath is non-empty) and persists the group tree to storage.

func (*WebMutator) CreateSession added in v1.3.4

func (m *WebMutator) CreateSession(title, tool, projectPath, groupPath, modelID string) (string, error)

CreateSession creates and starts a new session, persisting it to storage.

func (*WebMutator) DeleteGroup added in v1.3.4

func (m *WebMutator) DeleteGroup(groupPath string) error

DeleteGroup deletes a group (and its subgroups), moving sessions to the default group. Returns an error if groupPath is the default group.

func (*WebMutator) DeleteSession added in v1.3.4

func (m *WebMutator) DeleteSession(id string) error

DeleteSession kills a session and removes it from persistent storage. Before removal, the instance is pushed onto the web undo stack so a subsequent UndoDelete (POST /api/sessions/undelete) can restore it.

func (*WebMutator) FinishWorktree added in v1.9.30

func (m *WebMutator) FinishWorktree(id string, opts web.WorktreeFinishOptions) (web.WorktreeFinishResult, error)

FinishWorktree merges (or skips), removes the worktree, optionally deletes the source branch, kills the tmux session, and removes the session from storage. Mirrors `agent-deck worktree finish` (see cmd/agent-deck/worktree_cmd.go handleWorktreeFinish) — the orchestration is duplicated rather than refactored to keep the fix minimally invasive (issue #1126).

func (*WebMutator) ForkSession added in v1.3.4

func (m *WebMutator) ForkSession(id string) (string, error)

ForkSession forks an existing session using the proper Claude resume command. It uses CreateForkedInstanceWithOptions which builds "claude --resume <session-id>" via buildClaudeForkCommandForTarget, ensuring the fork resumes the parent conversation.

func (*WebMutator) RenameGroup added in v1.3.4

func (m *WebMutator) RenameGroup(groupPath, newName string) error

RenameGroup renames a group identified by groupPath to newName and persists.

func (*WebMutator) RestartSession added in v1.3.4

func (m *WebMutator) RestartSession(id string) error

RestartSession restarts a session by ID.

func (*WebMutator) StartSession added in v1.3.4

func (m *WebMutator) StartSession(id string) error

StartSession starts a stopped/idle session by ID.

func (*WebMutator) StopSession added in v1.3.4

func (m *WebMutator) StopSession(id string) error

StopSession kills (stops) a running session by ID.

func (*WebMutator) UndoDelete added in v1.9.26

func (m *WebMutator) UndoDelete() (string, error)

UndoDelete restores the most-recently deleted session if its delete timestamp is within the configured undo window. Returns the restored session id. Returns web.ErrUndoNothing if the stack is empty, or web.ErrUndoExpired if the most recent entry is older than the window.

func (*WebMutator) WithUndoWindow added in v1.9.26

func (m *WebMutator) WithUndoWindow(d time.Duration) *WebMutator

WithUndoWindow overrides the undo grace period (useful for tests that need to force expiry without sleeping).

type WorktreeFinishDialog added in v0.14.0

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

WorktreeFinishDialog handles the two-step worktree finish flow: Step 0: Configure options (merge toggle, target branch, keep branch) Step 1: Confirm the destructive actions

func NewWorktreeFinishDialog added in v0.14.0

func NewWorktreeFinishDialog() *WorktreeFinishDialog

NewWorktreeFinishDialog creates a new worktree finish dialog

func (*WorktreeFinishDialog) GetOptions added in v0.14.0

func (d *WorktreeFinishDialog) GetOptions() (mergeEnabled bool, targetBranch string, keepBranch bool)

GetOptions returns the current dialog options

func (*WorktreeFinishDialog) GetSessionID added in v0.14.0

func (d *WorktreeFinishDialog) GetSessionID() string

GetSessionID returns the session ID this dialog is for

func (*WorktreeFinishDialog) HandleKey added in v0.14.0

func (d *WorktreeFinishDialog) HandleKey(key string) (action string)

HandleKey processes a key event and returns the action to take. Returns: action string ("close", "confirm", ""), and whether the dialog handled the key.

func (*WorktreeFinishDialog) Hide added in v0.14.0

func (d *WorktreeFinishDialog) Hide()

Hide hides the dialog and resets state

func (*WorktreeFinishDialog) IsVisible added in v0.14.0

func (d *WorktreeFinishDialog) IsVisible() bool

IsVisible returns whether the dialog is visible

func (*WorktreeFinishDialog) SetDirtyStatus added in v0.14.0

func (d *WorktreeFinishDialog) SetDirtyStatus(isDirty bool)

SetDirtyStatus updates the dirty check result

func (*WorktreeFinishDialog) SetError added in v0.14.0

func (d *WorktreeFinishDialog) SetError(msg string)

SetError sets an error message on the dialog

func (*WorktreeFinishDialog) SetExecuting added in v0.14.0

func (d *WorktreeFinishDialog) SetExecuting(executing bool)

SetExecuting sets the executing state

func (*WorktreeFinishDialog) SetSize added in v0.14.0

func (d *WorktreeFinishDialog) SetSize(width, height int)

SetSize sets the dialog dimensions for centering

func (*WorktreeFinishDialog) Show added in v0.14.0

func (d *WorktreeFinishDialog) Show(sessionID, sessionTitle, branchName, repoRoot, worktreePath, defaultBranch string)

Show displays the dialog for the given worktree session

func (*WorktreeFinishDialog) UpdateTargetInput added in v0.14.0

func (d *WorktreeFinishDialog) UpdateTargetInput(msg interface{})

UpdateTargetInput updates the target branch text input with a message

func (*WorktreeFinishDialog) View added in v0.14.0

func (d *WorktreeFinishDialog) View() string

View renders the dialog

type YoloOptionsPanel added in v0.10.18

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

YoloOptionsPanel is a UI panel for YOLO/dangerous mode options. Used for Gemini and Codex in NewDialog, matching ClaudeOptionsPanel's visual style.

func NewYoloOptionsPanel added in v0.10.18

func NewYoloOptionsPanel(toolName, label string) *YoloOptionsPanel

NewYoloOptionsPanel creates a new options panel for a tool with a single YOLO checkbox.

func (*YoloOptionsPanel) AtTop added in v0.10.18

func (p *YoloOptionsPanel) AtTop() bool

AtTop returns true (single element, always at top).

func (*YoloOptionsPanel) Blur added in v0.10.18

func (p *YoloOptionsPanel) Blur()

Blur removes focus from this panel.

func (*YoloOptionsPanel) Focus added in v0.10.18

func (p *YoloOptionsPanel) Focus()

Focus sets focus to this panel.

func (*YoloOptionsPanel) GetYoloMode added in v0.10.18

func (p *YoloOptionsPanel) GetYoloMode() bool

GetYoloMode returns the current YOLO mode state.

func (*YoloOptionsPanel) IsFocused added in v0.10.18

func (p *YoloOptionsPanel) IsFocused() bool

IsFocused returns true if the panel has focus.

func (*YoloOptionsPanel) SetDefaults added in v0.10.18

func (p *YoloOptionsPanel) SetDefaults(yoloMode bool)

SetDefaults applies default value from config.

func (*YoloOptionsPanel) Update added in v0.10.18

func (p *YoloOptionsPanel) Update(msg tea.Msg) tea.Cmd

Update handles key events.

func (*YoloOptionsPanel) View added in v0.10.18

func (p *YoloOptionsPanel) View() string

View renders the options panel matching ClaudeOptionsPanel's visual style.

type ZoxidePicker added in v1.7.52

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

ZoxidePicker is a minimal overlay that fuzzy-matches directories via zoxide and returns the selected path for quick session creation.

func NewZoxidePicker added in v1.7.52

func NewZoxidePicker() *ZoxidePicker

NewZoxidePicker constructs a picker wired to the real zoxide binary.

func (*ZoxidePicker) Hide added in v1.7.52

func (z *ZoxidePicker) Hide()

Hide closes the picker.

func (*ZoxidePicker) IsVisible added in v1.7.52

func (z *ZoxidePicker) IsVisible() bool

IsVisible reports whether the picker is currently shown.

func (*ZoxidePicker) Selected added in v1.7.52

func (z *ZoxidePicker) Selected() string

Selected returns the highlighted path, or empty if nothing is selectable.

func (*ZoxidePicker) SetSize added in v1.7.52

func (z *ZoxidePicker) SetSize(width, height int)

SetSize updates the dialog viewport for centering.

func (*ZoxidePicker) Show added in v1.7.52

func (z *ZoxidePicker) Show()

Show opens the picker. If zoxide is missing the picker still renders but displays an install hint and disables selection.

func (*ZoxidePicker) Update added in v1.7.52

func (z *ZoxidePicker) Update(msg tea.KeyMsg) (*ZoxidePicker, tea.Cmd)

Update processes a key event and refreshes results when the query changes.

func (*ZoxidePicker) View added in v1.7.52

func (z *ZoxidePicker) View() string

View renders the overlay, centered in the viewport.

Jump to

Keyboard shortcuts

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