ui

package
v0.10.19 Latest Latest
Warning

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

Go to latest
Published: Feb 5, 2026 License: MIT Imports: 26 Imported by: 0

Documentation

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    = "💻"
	IconShell    = "🐚"
)

Tool Icons

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
	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 GetToolStyle added in v0.8.9

func GetToolStyle(tool string) lipgloss.Style

GetToolStyle returns cached style for tool or default

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 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 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 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, 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 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) GetOptions added in v0.8.39

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

GetOptions returns current options as ClaudeOptions

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) SetDefaults added in v0.8.39

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

SetDefaults applies default values from config

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) GetPendingSession added in v0.8.99

func (c *ConfirmDialog) GetPendingSession() (name, path, command, groupPath string, toolOptionsJSON json.RawMessage)

GetPendingSession returns the pending session creation data

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) ShowCreateDirectory added in v0.8.99

func (c *ConfirmDialog) ShowCreateDirectory(path, sessionName, command, groupPath string, toolOptionsJSON json.RawMessage)

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) ShowDeleteSession

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

ShowDeleteSession shows confirmation for session deletion

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) Update

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

Update handles key events

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
	ConfirmDeleteGroup
	ConfirmQuitWithPool
	ConfirmCreateDirectory
)

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 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) 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) 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)

Show displays the dialog with pre-filled values

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) 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(groups []string)

ShowMove shows the dialog for moving a session to a group

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) 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 as the primary instance. This is the default constructor for backward compatibility.

func NewHomeWithProfileAndMode added in v0.8.74

func NewHomeWithProfileAndMode(profile string, isPrimary bool) *Home

NewHomeWithProfileAndMode creates a new Home with the specified profile and instance mode. isPrimary controls whether this instance manages the notification bar:

  • true: Primary instance - manages notification bar, key bindings, signal file
  • false: Secondary instance - read-only for notifications, full functionality otherwise

func (*Home) Init

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

Init initializes the model

func (*Home) Update

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

Update handles messages

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) 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) ClearError added in v0.8.80

func (d *NewDialog) ClearError()

ClearError clears the inline validation error

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) GetCodexYoloMode added in v0.10.18

func (d *NewDialog) GetCodexYoloMode() bool

GetCodexYoloMode returns the Codex YOLO mode state

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) IsGeminiYoloMode added in v0.8.35

func (d *NewDialog) IsGeminiYoloMode() bool

IsGeminiYoloMode returns whether YOLO mode is enabled for Gemini

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) 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)

ShowInGroup shows the dialog with a pre-selected parent group and optional default path

func (*NewDialog) ToggleWorktree added in v0.8.22

func (d *NewDialog) ToggleWorktree()

ToggleWorktree toggles the worktree checkbox

func (*NewDialog) Update

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

Update handles key messages

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 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

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

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
	SettingMaintenanceEnabled
)

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) 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 StorageWatcher added in v0.6.1

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

StorageWatcher monitors sessions.json for external changes

func NewStorageWatcher added in v0.6.1

func NewStorageWatcher(storagePath string) (*StorageWatcher, error)

NewStorageWatcher creates a watcher for the given storage file

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 file 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 watching for file changes (non-blocking)

func (*StorageWatcher) TriggerReload added in v0.10.15

func (sw *StorageWatcher) TriggerReload()

TriggerReload sends a reload signal when external changes are detected via mtime check. This is used as a fallback when fsnotify fails (e.g., on 9p/NFS filesystems). Updates lastModified to prevent immediate re-trigger.

func (*StorageWatcher) Warning added in v0.10.15

func (sw *StorageWatcher) Warning() string

Warning returns a warning message if the filesystem doesn't support fsnotify reliably. Returns empty string if fsnotify should work normally.

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 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 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.

Jump to

Keyboard shortcuts

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