#![recursion_limit = "256"]
#![allow(clippy::doc_lazy_continuation, clippy::type_complexity)]
pub mod ai;
pub mod ai_usage;
pub mod app;
pub mod auth;
pub mod cookie_jar;
pub mod cookies;
pub mod jwt;
pub mod sse;
pub mod websocket;
pub(crate) mod browser_pane;
pub(crate) mod buffer;
pub(crate) mod cdp;
pub(crate) mod cheatsheet;
pub(crate) mod claude_agents;
pub(crate) mod clipboard;
pub mod command;
pub(crate) mod completion;
pub mod config;
pub(crate) mod context_menu;
pub mod coverage;
pub(crate) mod dap;
pub mod data_root;
pub mod e2e;
pub(crate) mod ecs_runner;
pub(crate) mod ecs_runner_trigger;
pub mod edit_op;
pub(crate) mod editor;
pub(crate) mod editorconfig;
pub(crate) mod flash;
pub(crate) mod focus;
pub(crate) mod formatter;
pub(crate) mod fuzzy;
pub(crate) mod git;
pub mod glyph_builder;
pub mod icon_catalog;
pub mod launcher_template;
pub mod marketplace;
pub(crate) mod peek_overlay;
pub(crate) mod grep_pane;
pub mod headless;
pub mod highlight;
pub(crate) mod hover;
pub mod http;
pub(crate) mod image;
pub(crate) mod input;
pub(crate) mod integration_detect;
pub mod integration_manifest;
pub mod ipc;
pub(crate) mod layout;
pub(crate) mod linter;
pub(crate) mod lsp;
pub(crate) mod markdown_outline;
pub(crate) mod now_playing;
pub(crate) mod pane;
pub(crate) mod picker;
pub(crate) mod anthropic_api;
pub(crate) mod cloud_agent_run;
pub mod dock;
pub mod menu_bar;
pub(crate) mod mount;
pub(crate) mod mount_manifest;
pub(crate) mod new_cloud_agent_wizard;
pub(crate) mod new_cloud_run_wizard;
pub(crate) mod playwright;
pub(crate) mod prompt;
pub(crate) mod pty_pane;
pub(crate) mod regex_outline;
pub(crate) mod request_pane;
pub(crate) mod scm;
pub(crate) mod shell_prompt;
pub(crate) mod signature;
pub(crate) mod snippets;
pub(crate) mod tools;
pub(crate) mod tree;
pub mod tui;
pub mod ui;
pub mod update_check;
pub(crate) mod whichkey;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GitToolbarAction {
Pull,
Push,
Fetch,
BranchPicker,
Commit,
Stash,
StashPop,
Reflog,
RefreshRepos,
SwitchRepo,
BlameToggle,
Undo,
Redo,
}
impl GitToolbarAction {
pub fn tooltip_label(self) -> &'static str {
match self {
Self::Pull => "pull (git pull --ff-only)",
Self::Push => "push (git push, --set-upstream on first)",
Self::Fetch => "fetch (git fetch --all --prune)",
Self::BranchPicker => "switch branch (git.checkout)",
Self::Commit => "commit… (git.commit)",
Self::Stash => "stash push (git.stash)",
Self::StashPop => "stash pop",
Self::Reflog => "reflog (recover a lost commit)",
Self::RefreshRepos => "refresh all repos",
Self::SwitchRepo => "switch active repo",
Self::BlameToggle => "toggle blame gutter",
Self::Undo => "undo last commit (soft-reset HEAD~1)",
Self::Redo => "redo last undone commit",
}
}
}
#[derive(Debug, Clone)]
pub enum WipAction {
StageAll,
UnstageAll,
StageFile(std::path::PathBuf),
UnstageFile(std::path::PathBuf),
OpenCommitPrompt,
RequestAiCommitMessage,
ClearCommitDraft,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DiffToolbarAction {
ViewInline,
ViewHunk,
ViewSplit,
ToggleWrap,
Close,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GitRailHeaderAction {
Fetch,
Pull,
Push,
StageAll,
Commit,
Graph,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HoverChip {
StatuslineMode,
StatuslineBranch,
StatuslineWorkspace,
StatuslineClock,
StatuslineStress,
StatuslineAiClaude,
StatuslineAiCodex,
PaletteStress,
ToastBox(usize),
RailHeaderChip(GitRailHeaderAction),
GitToolbarChip(GitToolbarAction),
BufferlineTab(crate::layout::PaneId),
DiffToolbar(DiffToolbarAction),
FoldChip,
CodeLensChip,
SplitDivider,
StatuslineLsp,
StatuslineWrap,
StatuslineAutosave,
StatuslineFilesize,
StatuslineLnCol,
TreeIcon(&'static str),
ClaudeAgentsTopbarChip(crate::ui::TopbarChipKind),
WorkspaceHeader,
ExtraWorkspaceHeader(usize),
IntegrationIcon(usize),
BufferlineNewTab,
BufferlineTabsLabel,
BufferlineThemeToggle,
BufferlineTabClose(crate::layout::PaneId),
BufferlineWindowClose,
SessionsTab(crate::layout::PaneId),
ActivityBarIcon(crate::app::ActivitySection),
StatuslineNowPlaying,
PaletteBackButton,
PaletteForwardButton,
PaletteDropdownButton,
SplitStripButton(crate::layout::SplitDir),
SplitStripTermButton,
SplitStripAiButton,
PaletteSidebarButton,
PaletteRightPanelButton,
RightPanelTab(crate::layout::PaneId),
RightPanelClose,
PaletteSearchChip,
PaletteAddIntegration,
SplitTabChip(crate::layout::PaneId),
SplitTabClose(crate::layout::PaneId),
SplitTabPlus(crate::layout::PaneId),
AgentsPanelChip(AgentsPanelChipKind),
CloudAgentsNewRunButton,
CloudRunAutoRefresh,
CloudRunRefresh,
ActivityBarGear,
DockKebab,
DockEmptyChip,
StatuslineMixrPlay,
StatuslineMixrFfwd,
StatuslineTestChip,
GitGraphLane {
pane_id: usize,
commit_idx: usize,
lane_idx: usize,
},
GitGraphCommitMsg {
pane_id: usize,
commit_idx: usize,
},
RequestTopBarChip(RequestTopBarChip),
RequestSplitToggle,
RequestEditSplitChip,
HttpSectionChip(usize),
TreeUpRow,
HttpToolbarChip(usize),
RequestEditSplitDivider,
HttpCollectionAddRequestChip(usize),
RequestVarToken(usize),
RequestResponseCopy,
RequestResponseWrap,
RequestResponseAiPrompt,
RequestResponseFormat,
PendingUndoChip,
BufferlineNewRequest,
ScrollbarThumb,
RightPanelGrip,
TreeRailGrip,
MenuBarWord(usize),
MenuBarItem {
menu_idx: usize,
item_idx: usize,
},
StatuslineFile,
StatuslineDiagnostics,
StatuslineLanguage,
StatuslineSymbol,
StatuslinePr,
StatuslineMacroRec,
StatuslineFind,
StatuslineSel,
StatuslineProgress,
StatuslineBgTasks,
StatuslineAi,
GutterMark {
pane_id: crate::layout::PaneId,
line_no: usize,
kind: GutterMarkKind,
},
BufferlineTabPage(usize),
BufferlineTabPageClose(usize),
IntegrationsTabInstalled,
IntegrationsTabMarketplace,
IntegrationsTabRefresh,
IntegrationsTabSort,
StatuslineCoverage,
StatuslineSegment(usize),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GutterMarkKind {
DapArrow,
ConditionalBreakpoint,
Breakpoint,
Diagnostic(crate::lsp::Severity),
GitChange(crate::git::diff::SignKind),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RequestTopBarChip {
Method,
Env,
Send,
Save,
Clear,
Code,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AgentsPanelChipKind {
NewSession,
FromPr,
ViewToggle,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DiscoveryCategory {
StatuslineMode,
StatuslineBranch,
StatuslineWorkspace,
StatuslineClock,
BufferlineTabs,
RailGitHeader,
EditorGutter,
DiffToolbar,
FoldChips,
CodeLensChips,
SplitDividers,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DiffHunkAction {
Stage,
Unstage,
Discard,
}
#[cfg(test)]
pub fn test_env_lock() -> &'static std::sync::Mutex<()> {
static LOCK: std::sync::OnceLock<std::sync::Mutex<()>> = std::sync::OnceLock::new();
LOCK.get_or_init(|| std::sync::Mutex::new(()))
}
#[cfg(test)]
pub struct EnvGuard {
key: &'static str,
prev: Option<std::ffi::OsString>,
}
#[cfg(test)]
impl EnvGuard {
pub fn set(key: &'static str, value: impl AsRef<std::ffi::OsStr>) -> Self {
let prev = std::env::var_os(key);
unsafe { std::env::set_var(key, value.as_ref()) };
Self { key, prev }
}
pub fn remove(key: &'static str) -> Self {
let prev = std::env::var_os(key);
unsafe { std::env::remove_var(key) };
Self { key, prev }
}
}
#[cfg(test)]
impl Drop for EnvGuard {
fn drop(&mut self) {
unsafe {
match self.prev.take() {
Some(v) => std::env::set_var(self.key, v),
None => std::env::remove_var(self.key),
}
}
}
}