git-juggler 0.2.6__tar.gz → 0.2.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {git_juggler-0.2.6 → git_juggler-0.2.9}/PKG-INFO +42 -8
- {git_juggler-0.2.6 → git_juggler-0.2.9}/README.md +41 -7
- {git_juggler-0.2.6 → git_juggler-0.2.9}/scripts/dev.sh +13 -3
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/api/ci.py +7 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/ci/jenkins.py +36 -0
- git_juggler-0.2.9/src/backend/git_juggler/frontend_dist/assets/index-AgPjmxnQ.css +1 -0
- git_juggler-0.2.6/src/backend/git_juggler/frontend_dist/assets/index-DC_wK6SO.js → git_juggler-0.2.9/src/backend/git_juggler/frontend_dist/assets/index-DW1CPHRt.js +15 -15
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/frontend_dist/index.html +2 -2
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/main.py +11 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/schemas.py +6 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_jenkins.py +24 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/App.css +62 -3
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/App.tsx +69 -18
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/api/client.ts +5 -1
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/api/types.ts +6 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Commits/CommitList.tsx +14 -16
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Commits/CommitRow.tsx +12 -12
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Commits/UncommittedRow.tsx +14 -18
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/ContextMenu/RepoContextMenu.tsx +14 -1
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Graph/GraphPanel.tsx +30 -34
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Menu/JenkinsSettings.tsx +65 -24
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Search/SearchBox.tsx +1 -1
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Tabs/TabsBar.tsx +25 -5
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/state/graph.ts +23 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/state/storeCore.ts +267 -11
- git_juggler-0.2.9/src/frontend/src/state/tabs.ts +21 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/styles/menu.css +52 -0
- git_juggler-0.2.6/src/backend/git_juggler/frontend_dist/assets/index-KUdo_LCw.css +0 -1
- git_juggler-0.2.6/src/frontend/src/state/tabs.ts +0 -13
- {git_juggler-0.2.6 → git_juggler-0.2.9}/.github/workflows/build-package.yml +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/.gitignore +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/CLAUDE.md +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/LICENSE +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/notes.txt +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/pyproject.toml +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/resources/git-juggler-demo-1.gif +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/resources/git-juggler-demo-2.png +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/resources/git-juggler-demo-3.png +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/resources/git-juggler-demo-4.png +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/scripts/build-package.sh +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/__init__.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/agents/__init__.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/agents/hook_events.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/agents/hooks.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/agents/tracking/__init__.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/agents/tracking/activity_models.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/agents/tracking/claude_sessions.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/agents/tracking/claude_transcripts.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/agents/tracking/git_resolver.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/agents/tracking/opencode_sessions.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/agents/tracking/paths.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/agents/tracking/text.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/api/__init__.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/api/agents.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/api/config.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/api/git.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/api/repos.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/api/terminal.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/app.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/ci/__init__.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/ci/github_actions.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/ci/http.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/config.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/dev_app.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/frontend_dist/agent-logos/claude.png +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/frontend_dist/agent-logos/opencode.webp +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/frontend_dist/ci-logos/jenkins.webp +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/frontend_dist/git-juggler.png +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/frontend_dist/logo.png +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/git/__init__.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/git/command.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/git/data.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/git/detail.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/git/diff.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/git/refs.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/git/status.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/git/utils.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/repo_discovery.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/terminal.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/themes.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/ui/__init__.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/git_juggler/ui/folder_picker.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_agent_hooks.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_agent_tracking.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_ci.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_ci_poll.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_ci_poll_route.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_claude_sessions_data.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_file_diff.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_git_data.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_github_actions.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_opencode_sessions.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_pick_folder.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_preferences.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_repos.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/backend/tests/test_themes.py +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/.gitignore +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/README.md +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/index.html +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/package-lock.json +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/package.json +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/public/agent-logos/claude.png +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/public/agent-logos/opencode.webp +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/public/ci-logos/jenkins.webp +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/public/git-juggler.png +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/public/logo.png +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Agents/AgentActivityPanel.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Agents/AgentHoverCard.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Agents/AgentStatusPopover.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Agents/agentFormat.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Badges/BranchBadge.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Badges/CiRunBadge.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Badges/StashBadge.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Badges/TagBadge.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Badges/ciStatus.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Branches/DeleteBranchModal.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/CIRunPopover.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/CommandPalette/CommandPalette.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Commits/CommitDetail.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Commits/LineCounts.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/ContextMenu/BranchContextMenu.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/ContextMenu/CommitContextMenu.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/ContextMenu/CreateBranchModal.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/ContextMenu/CreateTagModal.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/ContextMenu/TagContextMenu.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Diff/FileDiffModal.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Graph/branchColor.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Graph/computeColumns.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Graph/laneWidth.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Menu/AgentQuickPicks.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Menu/AgentsSettings.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Menu/CiPollField.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Menu/DirectoryBrowserModal.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Menu/GitHubSettings.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Menu/MainMenu.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Menu/RepoPathsSettings.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Menu/ThemePicker.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Menu/ThemeQuickPicks.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Pipelines/PipelinesPanel.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Pipelines/StageStrip.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Search/MultiSelect.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Search/TriSwitch.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Sidebar/NewGroupModal.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Sidebar/RepoList.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Sidebar/Sidebar.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Tags/DeleteTagModal.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Terminal/TerminalPanel.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/Welcome/WelcomeWizard.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/icons.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/inputs/NumberField.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/inputs/TextField.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/inputs/ToggleField.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/components/inputs/styles.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/index.css +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/index.tsx +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/agentStatusPopoverData.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/appTheme.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/branchVisibility.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/bundledThemes.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/ciPoll.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/ciRunPopoverData.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/color.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/dismissOnOutsideClick.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/flip.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/formatDate.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/preferenceSender.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/scrollToCommit.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/sideBySide.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/stageWindow.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/stripAnsi.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/swallowNextClick.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/lib/vscodeTheme.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/state/agents.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/state/ci.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/state/overlayStack.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/state/overlays.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/state/preferenceSync.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/state/preferences.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/state/repos.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/state/settings.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/state/store.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/state/terminal.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/state/themes.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/styles/ci.css +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/styles/commits.css +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/styles/graph.css +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/styles/sidebar.css +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/src/styles/terminal.css +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/tests/agentFormat.test.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/tests/agentStatusPopoverData.test.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/tests/ciPoll.test.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/tests/ciRunPopoverData.test.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/tests/computeColumns.test.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/tests/preferenceSender.test.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/tests/sideBySide.test.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/tests/stageWindow.test.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/tests/vscodeTheme.test.ts +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/tsconfig.app.json +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/tsconfig.json +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/tsconfig.node.json +0 -0
- {git_juggler-0.2.6 → git_juggler-0.2.9}/src/frontend/vite.config.ts +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: git-juggler
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.9
|
|
4
4
|
Summary: A local Git dashboard for people juggling agents and too many repos.
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -21,6 +21,14 @@ Watch agents work live, follow every repo’s git graph, and catch what changed
|
|
|
21
21
|
|
|
22
22
|
<img src="https://github.com/franz38/git-juggler/blob/main/resources/git-juggler-demo-4.png?raw=true" alt="git-juggler" width="100%">
|
|
23
23
|
|
|
24
|
+
## What it does
|
|
25
|
+
|
|
26
|
+
- Scans the immediate children of one or more configured folders for Git repos.
|
|
27
|
+
- Lets you inspect and manage each repo's graph, branches, tags, stashes, dirty files, and file diffs.
|
|
28
|
+
- Keeps a persistent terminal per open repo and runs Git actions there so you see the real commands and output.
|
|
29
|
+
- Tracks local Claude Code and OpenCode sessions.
|
|
30
|
+
- Connects GitHub Actions and Jenkins runs to commits and active pipelines.
|
|
31
|
+
- VS Code-compatible themes.
|
|
24
32
|
|
|
25
33
|
## How to install
|
|
26
34
|
|
|
@@ -30,9 +38,17 @@ PATH in its own isolated environment, without touching your system Python:
|
|
|
30
38
|
|
|
31
39
|
```
|
|
32
40
|
pipx install git-juggler
|
|
33
|
-
git-juggler
|
|
41
|
+
git-juggler [path-to-scan] [--host HOST] [--port PORT] [--no-open]
|
|
34
42
|
```
|
|
35
43
|
|
|
44
|
+
`<path-to-scan>` is optional and defaults to the current directory. It is used
|
|
45
|
+
to seed the initial search path; after that, search paths are managed in the app
|
|
46
|
+
from the welcome wizard or Settings.
|
|
47
|
+
|
|
48
|
+
- `--host HOST` changes the bind host from the default `127.0.0.1`.
|
|
49
|
+
- `--port PORT` changes the backend port from the default `8000`.
|
|
50
|
+
- `--no-open` disables opening the app in your browser automatically.
|
|
51
|
+
|
|
36
52
|
If you don't have pipx yet:
|
|
37
53
|
|
|
38
54
|
**macOS**
|
|
@@ -62,27 +78,44 @@ To upgrade later: `pipx upgrade git-juggler`.
|
|
|
62
78
|
|
|
63
79
|
## Dev mode
|
|
64
80
|
|
|
81
|
+
Use the dev script to start both the backend and frontend dev servers:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
./scripts/dev.sh [path-to-scan] [--port PORT] [--no-open]
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
- `path-to-scan` is optional. On first run, it seeds the folder whose immediate children are scanned for Git repos.
|
|
88
|
+
- `--port PORT` is optional. It changes the backend port from the default `8000`; if you use it, update `src/frontend/vite.config.ts` locally so Vite proxies `/api` and `/ws` to the same port.
|
|
89
|
+
- `--no-open` disables opening the app in your browser automatically.
|
|
90
|
+
|
|
91
|
+
Or run them manually in two terminals:
|
|
92
|
+
|
|
65
93
|
```
|
|
66
94
|
python3 -m venv .venv
|
|
67
95
|
.venv/bin/pip install -e .
|
|
68
|
-
.venv/bin/git-juggler <path-to-scan> --reload
|
|
96
|
+
.venv/bin/git-juggler <path-to-scan> --reload [--no-open]
|
|
69
97
|
```
|
|
70
98
|
|
|
71
99
|
```
|
|
72
100
|
cd src/frontend
|
|
73
101
|
npm install
|
|
74
|
-
npm run dev # http://localhost:5173 (proxies /api and /ws)
|
|
102
|
+
npm run dev # http://localhost:5173 (proxies /api and /ws to :8000)
|
|
75
103
|
```
|
|
76
104
|
|
|
77
105
|
Open http://localhost:5173.
|
|
78
106
|
|
|
107
|
+
By default, `./scripts/dev.sh` opens http://localhost:5173 in your browser.
|
|
108
|
+
|
|
79
109
|
## Production (single port)
|
|
80
110
|
|
|
81
111
|
```
|
|
82
112
|
cd src/frontend && npm install && npm run build
|
|
83
|
-
cd ../.. && .venv/bin/git-juggler <path-to-scan>
|
|
113
|
+
cd ../.. && .venv/bin/git-juggler <path-to-scan> [--no-open]
|
|
84
114
|
```
|
|
85
115
|
|
|
116
|
+
The backend serves the built frontend in this mode, so only port 8000 is needed.
|
|
117
|
+
By default, it opens the app in your browser.
|
|
118
|
+
|
|
86
119
|
## Build a Python package
|
|
87
120
|
|
|
88
121
|
The Python wheel includes the built frontend assets. The generated assets are
|
|
@@ -100,8 +133,9 @@ The wheel and source distribution are written to `dist/`.
|
|
|
100
133
|
Install the wheel locally with:
|
|
101
134
|
|
|
102
135
|
```
|
|
103
|
-
pipx install dist/git_juggler
|
|
104
|
-
git-juggler <path-to-scan>
|
|
136
|
+
pipx install dist/git_juggler-*.whl --force
|
|
137
|
+
git-juggler <path-to-scan> [--no-open]
|
|
105
138
|
```
|
|
106
139
|
|
|
107
|
-
GitHub Actions runs the same build
|
|
140
|
+
Versions are derived from Git tags. GitHub Actions runs the same build, uploads
|
|
141
|
+
the distributions as artifacts, and publishes tagged releases to PyPI.
|
|
@@ -8,6 +8,14 @@ Watch agents work live, follow every repo’s git graph, and catch what changed
|
|
|
8
8
|
|
|
9
9
|
<img src="https://github.com/franz38/git-juggler/blob/main/resources/git-juggler-demo-4.png?raw=true" alt="git-juggler" width="100%">
|
|
10
10
|
|
|
11
|
+
## What it does
|
|
12
|
+
|
|
13
|
+
- Scans the immediate children of one or more configured folders for Git repos.
|
|
14
|
+
- Lets you inspect and manage each repo's graph, branches, tags, stashes, dirty files, and file diffs.
|
|
15
|
+
- Keeps a persistent terminal per open repo and runs Git actions there so you see the real commands and output.
|
|
16
|
+
- Tracks local Claude Code and OpenCode sessions.
|
|
17
|
+
- Connects GitHub Actions and Jenkins runs to commits and active pipelines.
|
|
18
|
+
- VS Code-compatible themes.
|
|
11
19
|
|
|
12
20
|
## How to install
|
|
13
21
|
|
|
@@ -17,9 +25,17 @@ PATH in its own isolated environment, without touching your system Python:
|
|
|
17
25
|
|
|
18
26
|
```
|
|
19
27
|
pipx install git-juggler
|
|
20
|
-
git-juggler
|
|
28
|
+
git-juggler [path-to-scan] [--host HOST] [--port PORT] [--no-open]
|
|
21
29
|
```
|
|
22
30
|
|
|
31
|
+
`<path-to-scan>` is optional and defaults to the current directory. It is used
|
|
32
|
+
to seed the initial search path; after that, search paths are managed in the app
|
|
33
|
+
from the welcome wizard or Settings.
|
|
34
|
+
|
|
35
|
+
- `--host HOST` changes the bind host from the default `127.0.0.1`.
|
|
36
|
+
- `--port PORT` changes the backend port from the default `8000`.
|
|
37
|
+
- `--no-open` disables opening the app in your browser automatically.
|
|
38
|
+
|
|
23
39
|
If you don't have pipx yet:
|
|
24
40
|
|
|
25
41
|
**macOS**
|
|
@@ -49,27 +65,44 @@ To upgrade later: `pipx upgrade git-juggler`.
|
|
|
49
65
|
|
|
50
66
|
## Dev mode
|
|
51
67
|
|
|
68
|
+
Use the dev script to start both the backend and frontend dev servers:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
./scripts/dev.sh [path-to-scan] [--port PORT] [--no-open]
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
- `path-to-scan` is optional. On first run, it seeds the folder whose immediate children are scanned for Git repos.
|
|
75
|
+
- `--port PORT` is optional. It changes the backend port from the default `8000`; if you use it, update `src/frontend/vite.config.ts` locally so Vite proxies `/api` and `/ws` to the same port.
|
|
76
|
+
- `--no-open` disables opening the app in your browser automatically.
|
|
77
|
+
|
|
78
|
+
Or run them manually in two terminals:
|
|
79
|
+
|
|
52
80
|
```
|
|
53
81
|
python3 -m venv .venv
|
|
54
82
|
.venv/bin/pip install -e .
|
|
55
|
-
.venv/bin/git-juggler <path-to-scan> --reload
|
|
83
|
+
.venv/bin/git-juggler <path-to-scan> --reload [--no-open]
|
|
56
84
|
```
|
|
57
85
|
|
|
58
86
|
```
|
|
59
87
|
cd src/frontend
|
|
60
88
|
npm install
|
|
61
|
-
npm run dev # http://localhost:5173 (proxies /api and /ws)
|
|
89
|
+
npm run dev # http://localhost:5173 (proxies /api and /ws to :8000)
|
|
62
90
|
```
|
|
63
91
|
|
|
64
92
|
Open http://localhost:5173.
|
|
65
93
|
|
|
94
|
+
By default, `./scripts/dev.sh` opens http://localhost:5173 in your browser.
|
|
95
|
+
|
|
66
96
|
## Production (single port)
|
|
67
97
|
|
|
68
98
|
```
|
|
69
99
|
cd src/frontend && npm install && npm run build
|
|
70
|
-
cd ../.. && .venv/bin/git-juggler <path-to-scan>
|
|
100
|
+
cd ../.. && .venv/bin/git-juggler <path-to-scan> [--no-open]
|
|
71
101
|
```
|
|
72
102
|
|
|
103
|
+
The backend serves the built frontend in this mode, so only port 8000 is needed.
|
|
104
|
+
By default, it opens the app in your browser.
|
|
105
|
+
|
|
73
106
|
## Build a Python package
|
|
74
107
|
|
|
75
108
|
The Python wheel includes the built frontend assets. The generated assets are
|
|
@@ -87,8 +120,9 @@ The wheel and source distribution are written to `dist/`.
|
|
|
87
120
|
Install the wheel locally with:
|
|
88
121
|
|
|
89
122
|
```
|
|
90
|
-
pipx install dist/git_juggler
|
|
91
|
-
git-juggler <path-to-scan>
|
|
123
|
+
pipx install dist/git_juggler-*.whl --force
|
|
124
|
+
git-juggler <path-to-scan> [--no-open]
|
|
92
125
|
```
|
|
93
126
|
|
|
94
|
-
GitHub Actions runs the same build
|
|
127
|
+
Versions are derived from Git tags. GitHub Actions runs the same build, uploads
|
|
128
|
+
the distributions as artifacts, and publishes tagged releases to PyPI.
|
|
@@ -5,14 +5,16 @@ set -euo pipefail
|
|
|
5
5
|
|
|
6
6
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
7
7
|
BACKEND_PORT=8000
|
|
8
|
+
OPEN_BROWSER=1
|
|
8
9
|
|
|
9
10
|
usage() {
|
|
10
|
-
echo "Usage: $0 [path-to-scan] [--port PORT]" >&2
|
|
11
|
+
echo "Usage: $0 [path-to-scan] [--port PORT] [--no-open]" >&2
|
|
11
12
|
echo " path-to-scan optional: directory whose first-level children get scanned for git repos." >&2
|
|
12
13
|
echo " Only used to seed the config on first run; scan paths are otherwise" >&2
|
|
13
14
|
echo " managed in the app (welcome wizard / Settings)." >&2
|
|
14
15
|
echo " --port PORT backend port (default: 8000). If you change this, also update" >&2
|
|
15
16
|
echo " src/frontend/vite.config.ts's proxy target -- don't commit that change." >&2
|
|
17
|
+
echo " --no-open don't open the app in a browser automatically." >&2
|
|
16
18
|
}
|
|
17
19
|
|
|
18
20
|
SCAN_PATH=""
|
|
@@ -26,6 +28,10 @@ while [ $# -gt 0 ]; do
|
|
|
26
28
|
BACKEND_PORT="${2:?--port requires a value}"
|
|
27
29
|
shift 2
|
|
28
30
|
;;
|
|
31
|
+
--no-open)
|
|
32
|
+
OPEN_BROWSER=0
|
|
33
|
+
shift
|
|
34
|
+
;;
|
|
29
35
|
-*)
|
|
30
36
|
echo "Unknown argument: $1" >&2
|
|
31
37
|
usage
|
|
@@ -101,10 +107,10 @@ trap cleanup EXIT INT TERM
|
|
|
101
107
|
|
|
102
108
|
if [ -n "$SCAN_PATH" ]; then
|
|
103
109
|
echo "Starting backend (--reload) on port $BACKEND_PORT, scanning $SCAN_PATH ..."
|
|
104
|
-
"$GIT_JUGGLER" "$SCAN_PATH" --reload --port "$BACKEND_PORT" &
|
|
110
|
+
"$GIT_JUGGLER" "$SCAN_PATH" --reload --port "$BACKEND_PORT" --no-open &
|
|
105
111
|
else
|
|
106
112
|
echo "Starting backend (--reload) on port $BACKEND_PORT (scan paths from config) ..."
|
|
107
|
-
"$GIT_JUGGLER" --reload --port "$BACKEND_PORT" &
|
|
113
|
+
"$GIT_JUGGLER" --reload --port "$BACKEND_PORT" --no-open &
|
|
108
114
|
fi
|
|
109
115
|
BACKEND_PID=$!
|
|
110
116
|
|
|
@@ -112,6 +118,10 @@ echo "Starting frontend dev server..."
|
|
|
112
118
|
(cd "$ROOT_DIR/src/frontend" && npm run dev) &
|
|
113
119
|
FRONTEND_PID=$!
|
|
114
120
|
|
|
121
|
+
if [ "$OPEN_BROWSER" = "1" ]; then
|
|
122
|
+
(sleep 1 && "$VENV_BIN/python" -m webbrowser http://localhost:5173) >/dev/null 2>&1 &
|
|
123
|
+
fi
|
|
124
|
+
|
|
115
125
|
echo ""
|
|
116
126
|
echo "Backend: http://127.0.0.1:$BACKEND_PORT"
|
|
117
127
|
echo "Frontend: http://localhost:5173 <- open this"
|
|
@@ -17,6 +17,7 @@ from ..schemas import (
|
|
|
17
17
|
CiStage,
|
|
18
18
|
GitHubConfig,
|
|
19
19
|
JenkinsConfig,
|
|
20
|
+
JenkinsRuleTestRequest,
|
|
20
21
|
)
|
|
21
22
|
|
|
22
23
|
|
|
@@ -96,3 +97,9 @@ def api_test_github_connection(body: GitHubConfig) -> CiConnectionTestResponse:
|
|
|
96
97
|
def api_test_jenkins_connection(body: JenkinsConfig) -> CiConnectionTestResponse:
|
|
97
98
|
ok, message = jenkins.test_connection(body.model_dump())
|
|
98
99
|
return CiConnectionTestResponse(ok=ok, message=message)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@router.post("/api/ci/jenkins/rule-test", response_model=CiConnectionTestResponse)
|
|
103
|
+
def api_test_jenkins_rule(body: JenkinsRuleTestRequest) -> CiConnectionTestResponse:
|
|
104
|
+
ok, message = jenkins.test_rule_connection(body.config.model_dump(), body.rule.model_dump(), Path(body.repo_path))
|
|
105
|
+
return CiConnectionTestResponse(ok=ok, message=message)
|
|
@@ -8,6 +8,8 @@ from pathlib import Path
|
|
|
8
8
|
from urllib.parse import quote, unquote, urlencode, urlparse
|
|
9
9
|
from urllib.request import urlopen
|
|
10
10
|
|
|
11
|
+
from git import InvalidGitRepositoryError, NoSuchPathError, Repo
|
|
12
|
+
|
|
11
13
|
from .http import fetch_json
|
|
12
14
|
from ..schemas import CiRunInfo, CiStage
|
|
13
15
|
|
|
@@ -134,6 +136,18 @@ def _headers(jenkins_config: dict) -> dict[str, str]:
|
|
|
134
136
|
return headers
|
|
135
137
|
|
|
136
138
|
|
|
139
|
+
def _default_branch(repo_path: Path) -> str | None:
|
|
140
|
+
try:
|
|
141
|
+
names = {head.name for head in Repo(repo_path).heads}
|
|
142
|
+
except (InvalidGitRepositoryError, NoSuchPathError, OSError):
|
|
143
|
+
return None
|
|
144
|
+
if "main" in names:
|
|
145
|
+
return "main"
|
|
146
|
+
if "master" in names:
|
|
147
|
+
return "master"
|
|
148
|
+
return None
|
|
149
|
+
|
|
150
|
+
|
|
137
151
|
def _fetch_json(url: str, headers: dict[str, str]) -> dict | None:
|
|
138
152
|
return fetch_json(url, headers, opener=urlopen)
|
|
139
153
|
|
|
@@ -418,6 +432,28 @@ def test_connection(jenkins_config: dict | None) -> tuple[bool, str]:
|
|
|
418
432
|
return False, "Could not reach Jenkins with the current settings."
|
|
419
433
|
|
|
420
434
|
|
|
435
|
+
def test_rule_connection(jenkins_config: dict | None, rule: dict, repo_path: Path) -> tuple[bool, str]:
|
|
436
|
+
"""Render one rule for one repo's default branch and check the Jenkins job."""
|
|
437
|
+
if not jenkins_config:
|
|
438
|
+
return False, "Jenkins settings are empty."
|
|
439
|
+
branch = _default_branch(repo_path)
|
|
440
|
+
if not branch:
|
|
441
|
+
return False, f"{repo_path.name}: no local main or master branch found."
|
|
442
|
+
|
|
443
|
+
rendered = _render_job_config({"repo_path": str(repo_path), "job_url": rule.get("job_url")}, repo_path, _repo_template_values(repo_path), branch)
|
|
444
|
+
if rendered is None:
|
|
445
|
+
return False, f"{repo_path.name}: rule does not have a Jenkins job URL."
|
|
446
|
+
|
|
447
|
+
job_url = str(rendered["job_url"]).strip().rstrip("/")
|
|
448
|
+
if not job_url:
|
|
449
|
+
return False, f"{repo_path.name}: rule does not have a Jenkins job URL."
|
|
450
|
+
|
|
451
|
+
api_url = f"{job_url}/api/json"
|
|
452
|
+
if _fetch_json(api_url, _headers(jenkins_config)) is not None:
|
|
453
|
+
return True, f"{repo_path.name} ({branch}): connected to {job_url}."
|
|
454
|
+
return False, f"{repo_path.name} ({branch}): could not reach {job_url}."
|
|
455
|
+
|
|
456
|
+
|
|
421
457
|
def get_jenkins_builds(repo_path: Path, commit_hashes: set[str], jenkins_config: dict | None) -> dict[str, list[CiRunInfo]]:
|
|
422
458
|
if not commit_hashes or not jenkins_config:
|
|
423
459
|
return {}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root,:root[data-theme=dark]{--text:#c8ccd4;--text-dim:#7d8590;--text-h:#f0f2f5;--bg:#0d1117;--panel-bg:#12151b;--hover-bg:#1c2129;--active-bg:#202632;--border:#262b33;--accent:#4c9aff;--accent-fg:#0d1117;--danger:#ff5630;--danger-fg:#ffb4b4;--danger-bg:#4a1f24;--warning:#ffd666;--success:#36b37e;--menu-bg:#12151b;--input-bg:#0d1117;--shadow:#00000080;--shadow-soft:#00000073;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}:root[data-theme=light]{--text:#3a3f46;--text-dim:#6e7781;--text-h:#1f2328;--bg:#fff;--panel-bg:#f6f8fa;--hover-bg:#eef0f2;--active-bg:#e4e7eb;--border:#d0d7de;--accent:#0969da;--accent-fg:#fff;--danger:#cf222e;--danger-fg:#a40e26;--danger-bg:#ffebe9;--warning:#9a6700;--success:#1a7f37;--menu-bg:#fff;--input-bg:#fff;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root{color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased;font:13px/1.4 -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}*{box-sizing:border-box}.sidebar-content,.graph-and-list{scrollbar-width:thin;scrollbar-color:color-mix(in srgb, var(--text-dim) 40%, transparent) transparent;scrollbar-width:thin;scrollbar-color:transparent transparent}.sidebar-content:hover,.graph-and-list:hover{scrollbar-color:color-mix(in srgb, var(--text-dim) 40%, transparent) transparent}body{margin:0}#root{width:100vw;height:100vh}.menu-overlay{background:var(--shadow);z-index:100;justify-content:center;align-items:flex-start;padding-top:12vh;transition:background-color .12s;display:flex;position:fixed;inset:0}.menu-overlay.previewing-theme{background:0 0}.menu-dialog{background:var(--menu-bg);border:1px solid var(--border);width:760px;max-width:calc(100vw - 32px);height:640px;max-height:64vh;box-shadow:0 16px 48px var(--shadow);border-radius:8px;display:flex;overflow:hidden}.menu-sidebar{background:var(--bg);border-right:1px solid var(--border);flex:none;width:140px;padding:8px 0}.command-palette-overlay{background:var(--shadow);z-index:110;justify-content:center;align-items:flex-start;padding-top:12vh;display:flex;position:fixed;inset:0}.command-palette-dialog{background:var(--menu-bg);border:1px solid var(--border);width:560px;max-width:calc(100vw - 32px);max-height:60vh;box-shadow:0 16px 48px var(--shadow);border-radius:8px;flex-direction:column;display:flex;overflow:hidden}.command-palette-input{background:var(--input-bg);border:0;border-bottom:1px solid var(--border);color:var(--text);font:inherit;border-radius:0;flex:none;padding:14px 18px;font-size:15px}.command-palette-input:focus{outline:none}.command-palette-results{flex:1;min-height:0;padding:6px;overflow-y:auto}.command-palette-item{color:var(--text);cursor:pointer;border-radius:5px;justify-content:space-between;align-items:center;gap:12px;padding:8px 10px;font-size:13px;display:flex}.command-palette-item.active{background:var(--active-bg);color:var(--text-h)}.command-palette-item-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.command-palette-item-meta{text-overflow:ellipsis;white-space:nowrap;max-width:55%;color:var(--text-dim);flex:none;font-size:11px;overflow:hidden}.menu-section-item{color:var(--text-dim);cursor:pointer;padding:8px 16px;font-size:13px}.menu-section-item:hover{background:var(--hover-bg)}.menu-section-item.active{background:var(--active-bg);color:var(--text-h)}.menu-content{flex:1;min-width:0;padding:20px 24px;overflow-y:auto}.menu-section{flex-direction:column;gap:16px;display:flex}.menu-section>*{margin:0}.menu-hint{color:var(--text-dim);margin:0 0 16px;font-size:12px}.menu-path-list{flex-direction:column;gap:4px;margin-bottom:12px;display:flex}.menu-path-row{background:var(--bg);border:1px solid var(--border);border-radius:4px;justify-content:space-between;align-items:center;gap:8px;padding:6px 10px;display:flex}.menu-path-text{text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px;overflow:hidden}.menu-path-remove{cursor:pointer;color:var(--text-dim);text-align:center;border-radius:3px;flex:none;width:18px;height:18px;line-height:18px}.menu-path-remove:hover{background:var(--hover-bg);color:var(--text-h)}.menu-empty{color:var(--text-dim);padding:6px 0;font-size:13px}.keybinding-value{color:var(--text-dim);white-space:nowrap;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px}.keybinding-actions{flex:none;gap:6px;display:flex}.menu-add-path{gap:8px;display:flex}.menu-add-path input{background:var(--input-bg);border:1px solid var(--border);min-width:0;color:var(--text);font:inherit;border-radius:4px;flex:1;padding:6px 8px;font-size:12px}.menu-add-path input:focus{border-color:var(--accent);outline:none}.menu-add-path .menu-add-button{background:var(--accent);color:var(--accent-fg);cursor:pointer;border:none;border-radius:4px;padding:0 14px;font-size:12px;font-weight:600}.menu-add-path .menu-secondary-button{cursor:pointer;border-radius:4px;padding:0 14px;font-size:12px}.menu-error{color:var(--danger-fg);margin-top:10px;font-size:12px}.menu-notice{border:1px solid color-mix(in srgb, var(--accent) 45%, transparent);background:color-mix(in srgb, var(--accent) 12%, transparent);color:var(--text);border-radius:6px;margin:0 0 14px;padding:10px 12px;font-size:12px}.menu-test-result{border:1px solid color-mix(in srgb, var(--text-dim) 45%, transparent);background:color-mix(in srgb, var(--text-dim) 12%, transparent);color:var(--text);border-radius:6px;margin:10px 0 14px;padding:10px 12px;font-size:12px}.menu-test-result.success{border-color:color-mix(in srgb, var(--accent) 45%, transparent);background:color-mix(in srgb, var(--accent) 12%, transparent)}.menu-test-result.error{border-color:color-mix(in srgb, var(--danger-fg) 45%, transparent);background:color-mix(in srgb, var(--danger-fg) 12%, transparent)}.menu-field{color:var(--text-dim);flex-direction:column;gap:5px;margin-bottom:14px;font-size:12px;display:flex}.menu-field>span:first-child{color:var(--text-h);font-size:13px}.menu-field .menu-hint{margin:0 0 3px}.menu-field input,.menu-field textarea,.github-repo-row input,.jenkins-rule-card input{background:var(--input-bg);border:1px solid var(--border);color:var(--text);font:inherit;border-radius:4px;padding:6px 8px;font-size:12px}.menu-field textarea{resize:vertical;min-height:44px}.menu-field input:focus,.menu-field textarea:focus,.github-repo-row input:focus,.jenkins-rule-card input:focus{border-color:var(--accent);outline:none}.create-tag-dialog{background:var(--menu-bg);border:1px solid var(--border);width:420px;max-width:calc(100vw - 32px);max-height:80vh;box-shadow:0 16px 48px var(--shadow);border-radius:8px;flex-direction:column;padding:20px 24px;display:flex;overflow-y:auto}.create-tag-dialog h3{color:var(--text-h);margin:0 0 6px;font-size:15px}.directory-browser-path{color:var(--text-dim);word-break:break-all;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px}.directory-browser-list{border:1px solid var(--border);border-radius:4px;flex-direction:column;gap:2px;max-height:280px;margin:12px 0;padding:4px;display:flex;overflow-y:auto}.directory-browser-entry{cursor:pointer;color:var(--text);border-radius:4px;padding:6px 8px;font-size:13px}.directory-browser-entry:hover{background:var(--hover-bg);color:var(--text-h)}.branch-delete-modal{background:var(--menu-bg);border:1px solid var(--border);width:420px;max-width:calc(100vw - 32px);box-shadow:0 16px 48px var(--shadow);border-radius:8px;flex-direction:column;padding:20px 24px;display:flex}.branch-delete-modal h3{color:var(--text-h);margin:0 0 6px;font-size:15px}.modal-check-row{color:var(--text);align-items:center;gap:8px;margin-top:10px;font-size:12px;display:flex}.menu-primary-button.danger{border-color:var(--danger);color:var(--danger-fg)}.github-repo-mappings{flex-direction:column;gap:8px;display:flex}.github-repo-row{grid-template-columns:minmax(160px,1fr) minmax(80px,.45fr) minmax(80px,.45fr) auto;gap:8px;display:grid}.jenkins-rules{flex-direction:column;gap:10px;display:flex}.jenkins-rule-card{background:var(--panel-bg);border:1px solid var(--border);border-radius:6px;flex-direction:column;gap:10px;padding:10px;display:flex}.jenkins-rule-heading{grid-template-columns:minmax(220px,1fr) auto;align-items:center;gap:8px;display:grid}.jenkins-rule-repo-tests{flex-direction:column;gap:6px;display:flex}.jenkins-rule-repo-test{color:var(--text);grid-template-columns:auto minmax(120px,.35fr) minmax(0,1fr);align-items:center;gap:8px;font-size:12px;display:grid}.jenkins-rule-play{border:1px solid var(--border);background:var(--bg);width:24px;height:24px;color:var(--success);cursor:pointer;border-radius:999px;padding:0;font-size:11px;line-height:22px}.jenkins-rule-play:disabled{cursor:default;opacity:.45}.jenkins-rule-repo-name,.jenkins-rule-test-log{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.jenkins-rule-test-log{color:var(--text-dim)}.jenkins-rule-test-log.success{color:var(--success)}.jenkins-rule-test-log.error{color:var(--danger)}.menu-actions{justify-content:flex-end;gap:8px;margin-top:14px;display:flex}.menu-primary-button,.menu-secondary-button{font:inherit;cursor:pointer;border-radius:4px;padding:6px 10px;font-size:12px}.menu-primary-button{background:var(--accent);border:1px solid var(--accent);color:var(--accent-fg);font-weight:600}.menu-secondary-button{background:var(--bg);border:1px solid var(--border);color:var(--text)}.menu-secondary-button:hover{background:var(--hover-bg);color:var(--text-h)}.menu-secondary-button.danger,.menu-secondary-button.danger:hover{border-color:var(--danger);color:var(--danger-fg)}.menu-setting{justify-content:space-between;align-items:center;gap:16px;display:flex}.menu-setting-main{min-width:0}.menu-setting-label{color:var(--text-h);font-size:13px}.menu-setting .menu-hint{margin:2px 0 0}.agent-hooks-section{flex-direction:column;gap:10px;display:flex}.agent-hooks-section>.menu-actions{margin-top:0}.agent-hooks-section .menu-setting-main .menu-hint{margin:2px 0 0}.agent-hook-grid{gap:12px;margin-top:12px;display:grid}.agent-hook-card{border:1px solid var(--border);background:var(--panel-bg);border-radius:8px;padding:12px}.agent-hook-card-heading{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.agent-hook-status{border:1px solid var(--border);color:var(--text-muted);border-radius:999px;flex:none;padding:2px 8px;font-size:11px}.agent-hook-status.installed{border-color:color-mix(in srgb, var(--success) 45%, transparent);color:var(--success)}.agent-hook-meta{color:var(--text-muted);overflow-wrap:anywhere;margin-top:6px;font-size:12px}.agent-hook-snippet{border:1px solid var(--border);background:var(--bg);max-height:220px;color:var(--text);white-space:pre-wrap;border-radius:6px;margin:10px 0 0;padding:10px;font-size:11px;overflow:auto}.theme-options{gap:6px;display:flex}.theme-options button{background:var(--bg);border:1px solid var(--border);color:var(--text);font:inherit;cursor:pointer;border-radius:4px;padding:5px 12px;font-size:12px}.theme-options button.active{background:var(--accent);border-color:var(--accent);color:var(--accent-fg);font-weight:600}.menu-setting-stacked{flex-direction:column;align-items:stretch;gap:10px}.theme-picker{flex-direction:column;gap:8px;min-width:0;display:flex}.theme-picker-toolbar{gap:8px;display:flex}.theme-picker-toolbar input[type=search]{background:var(--input-bg);border:1px solid var(--border);min-width:0;color:var(--text);font:inherit;border-radius:4px;flex:1;padding:5px 8px;font-size:12px}.theme-picker-toolbar input[type=search]:focus{border-color:var(--accent);outline:none}.theme-list{border:1px solid var(--border);border-radius:6px;max-height:300px;padding:4px;overflow-y:auto}.theme-group-label{letter-spacing:.04em;text-transform:uppercase;color:var(--text-dim);padding:8px 8px 4px;font-size:11px}.theme-row-wrap{align-items:center;display:flex}.theme-row{min-width:0;color:var(--text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;flex:1;align-items:center;gap:10px;padding:5px 8px;font-size:12px;display:flex}.theme-row:hover,.theme-row:focus-visible{background:var(--hover-bg);color:var(--text-h);outline:none}.theme-row.active{background:var(--active-bg);border-color:var(--accent);color:var(--text-h)}.theme-row-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.theme-row-kind{color:var(--text-dim);font-size:11px}.theme-row-pin{color:var(--text-dim);cursor:pointer;background:0 0;border:none;padding:4px 6px;font-size:14px;line-height:1}.theme-row-pin:hover,.theme-row-pin.pinned{color:var(--warning)}.theme-row-remove{color:var(--text-dim);cursor:pointer;background:0 0;border:none;padding:4px 8px;font-size:16px;line-height:1}.theme-row-remove:hover{color:var(--danger)}.theme-swatch{border:1px solid;border-radius:4px;flex:none;align-items:center;gap:3px;height:20px;padding:0 5px 0 0;display:inline-flex;overflow:hidden}.theme-swatch-panel{align-self:stretch;width:8px}.theme-swatch-dot{border-radius:50%;width:7px;height:7px}.switch{cursor:pointer;flex:none;align-items:center;display:inline-flex}.switch input{display:none}.switch-track{background:var(--border);border-radius:999px;width:34px;height:18px;transition:background .15s;position:relative}.switch-thumb{background:#fff;border-radius:50%;width:14px;height:14px;transition:transform .15s;position:absolute;top:2px;left:2px}.switch input:checked+.switch-track{background:var(--accent)}.switch input:checked+.switch-track .switch-thumb{transform:translate(16px)}.context-menu{z-index:111;background:var(--menu-bg);border:1px solid var(--border);min-width:180px;box-shadow:0 8px 24px var(--shadow);border-radius:6px;padding:4px;position:fixed}.context-menu-item{color:var(--text);cursor:pointer;border-radius:4px;padding:6px 10px;font-size:13px}.context-menu-item-with-mark{grid-template-columns:18px 1fr;align-items:center;gap:6px;display:grid}.context-menu-item-with-trailing-mark,.context-menu-item-with-arrow{justify-content:space-between;align-items:center;gap:16px;display:flex}.context-menu-submenu{position:relative}.context-menu-submenu-panel{display:none;position:absolute;top:-4px;left:calc(100% + 4px)}.context-menu-submenu:hover>.context-menu-submenu-panel{display:block}.context-menu-separator{background:var(--border);height:1px;margin:4px}.context-menu-item:hover{background:var(--hover-bg);color:var(--text-h)}.welcome-dialog{flex-direction:column;width:560px;height:620px;max-height:85vh;position:relative}.welcome-close{text-align:center;width:22px;height:22px;color:var(--text-dim);cursor:pointer;border-radius:4px;line-height:22px;position:absolute;top:10px;right:12px}.welcome-close:hover{background:var(--hover-bg);color:var(--text-h)}.welcome-header{flex:none;padding:20px 24px 0}.welcome-header h2{color:var(--text-h);margin:0 0 4px;font-size:17px}.welcome-progress-bar{gap:6px;margin:14px 0 8px;display:flex}.welcome-progress-segment{background:var(--border);border-radius:999px;flex:1;height:3px}.welcome-progress-segment.filled{background:var(--accent)}.welcome-progress-caption{letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim);font-size:11px}.welcome-body{flex:1;min-height:0;padding:16px 24px;overflow-y:auto}.welcome-body h3{color:var(--text-h);margin:0 0 6px;font-size:15px}.welcome-footer{border-top:1px solid var(--border);flex:none;justify-content:space-between;align-items:center;gap:12px;padding:14px 24px;display:flex}.welcome-footer-nav{gap:8px;display:flex}.welcome-skip{color:var(--text-dim);cursor:pointer;font-size:13px}.welcome-skip:hover{color:var(--text-h);text-decoration:underline}.theme-quickpicks{flex-direction:column;gap:14px;display:flex}.theme-quickpick-grid{grid-template-columns:repeat(3,1fr);gap:10px;display:grid}.theme-quickpick-card{background:var(--bg);border:1px solid var(--border);cursor:pointer;border-radius:6px;flex-direction:column;gap:8px;padding:8px;display:flex}.theme-quickpick-card:hover{border-color:color-mix(in srgb, var(--accent) 45%, var(--border))}.theme-quickpick-card.active{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.theme-quickpick-preview{border:1px solid;border-radius:4px;align-items:flex-end;gap:4px;height:44px;padding:6px;display:flex}.theme-quickpick-bar{border-radius:999px;flex:1;height:4px}.theme-quickpick-chip{opacity:.7;border-radius:999px;width:16px;height:4px}.theme-quickpick-label{color:var(--text-h);text-align:left;font-size:12px;font-weight:600}.theme-quickpick-editor-section{flex-direction:column;gap:8px;display:flex}.theme-quickpick-mini-grid{border:1px solid var(--border);border-radius:6px;grid-template-columns:repeat(4,1fr);align-content:start;gap:6px;max-height:180px;padding:6px;display:grid;overflow-y:auto}.theme-quickpick-mini-card{background:var(--bg);border:1px solid var(--border);cursor:pointer;border-radius:5px;flex-direction:column;gap:4px;min-width:0;padding:5px;display:flex}.theme-quickpick-mini-card:hover{border-color:color-mix(in srgb, var(--accent) 45%, var(--border))}.theme-quickpick-mini-card.active{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.theme-quickpick-mini-preview{border:1px solid;border-radius:3px;align-items:flex-end;height:20px;padding:3px;display:flex}.theme-quickpick-mini-bar{border-radius:999px;flex:1;height:3px}.theme-quickpick-mini-label{color:var(--text-dim);text-align:left;white-space:nowrap;text-overflow:ellipsis;font-size:10px;overflow:hidden}.theme-quickpick-mini-card.active .theme-quickpick-mini-label{color:var(--text-h)}.agent-quickpicks{flex-direction:column;gap:10px;display:flex}.agent-quickpick-grid{grid-template-columns:repeat(2,1fr);gap:10px;display:grid}.agent-quickpick-card{background:var(--bg);border:1px solid var(--border);border-radius:6px;flex-direction:column;gap:10px;padding:12px;display:flex}.agent-quickpick-heading{align-items:center;gap:8px;display:flex}.agent-quickpick-logo{border:1px solid var(--border);background:#fff;border-radius:6px;flex:none;justify-content:center;align-items:center;width:24px;height:24px;display:flex}.agent-quickpick-logo img{object-fit:contain;width:16px;height:16px;display:block}.agent-quickpick-actions{align-items:center;gap:8px;display:flex}.agent-quickpick-tracking{color:var(--success);font-size:12px;font-weight:600}.agent-quickpick-manual{border-top:1px solid var(--border);padding-top:10px}.theme-loading{color:var(--muted,inherit);align-items:center;gap:8px;padding:8px 4px;font-size:12px;display:flex}.theme-spinner{border:2px solid;border-right-color:#0000;border-radius:50%;width:12px;height:12px;animation:.7s linear infinite theme-spin}@keyframes theme-spin{to{transform:rotate(360deg)}}.sidebar{background:var(--panel-bg);border-right:1px solid var(--border);-webkit-user-select:none;user-select:none;flex-direction:column;flex:none;width:250px;min-width:200px;display:flex;overflow:hidden}.sidebar-content{flex:auto;min-height:0;overflow-y:auto}.sidebar-tabs{border-top:1px solid var(--border);background:var(--panel-bg);flex:none;display:flex}.sidebar-tab{color:var(--text-dim);cursor:pointer;font:inherit;background:0 0;border:0;border-top:2px solid #0000;flex:1;justify-content:center;align-items:center;gap:6px;margin-top:-1px;padding:8px 10px;font-size:12px;display:inline-flex}.sidebar-tab:hover{color:var(--text-h);background:var(--hover-bg)}.sidebar-tab.active{color:var(--text-h);border-top-color:var(--accent)}.sidebar-tab-badge,.tab-agent-badge{background:var(--accent);min-width:15px;color:var(--accent-fg);text-align:center;border-radius:999px;flex:none;padding:0 5px;font-size:10px;line-height:15px}.sidebar-tab-badge.idle,.tab-agent-badge.idle{background:var(--border);color:var(--text-dim)}.sidebar-resize-handle{cursor:col-resize;z-index:4;flex:0 0 5px;margin-left:-3px}.sidebar-resize-handle:hover,.sidebar-resize-handle:active{background:var(--accent);opacity:.5}.repo-search{align-items:center;gap:6px;padding:10px 16px 4px 19px;display:flex}.agent-activity-panel{border:1px solid var(--border);background:color-mix(in srgb, var(--accent) 6%, transparent);border-radius:8px;margin:10px 10px 6px;padding:10px}.agent-activity-heading{color:var(--text-h);justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px;font-size:12px;font-weight:700;display:flex}.agent-scan-time{color:var(--text-dim);font-size:10px;font-weight:500}.agent-discovery-row{color:var(--text-dim);align-items:center;font-size:11px;display:flex}.agent-error{color:var(--danger-fg);margin-top:8px;font-size:11px}.agent-results{flex-direction:column;gap:6px;margin-top:8px;display:flex}.agent-summary,.agent-empty{color:var(--text-dim);font-size:11px}.agent-worktree-card{border:1px solid var(--border);background:var(--panel-bg);border-radius:6px;padding:7px}.agent-worktree-card.active{border-color:color-mix(in srgb, var(--accent) 55%, var(--border));background:color-mix(in srgb, var(--accent) 8%, var(--panel-bg));box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 25%, transparent)}.agent-scan-card{border-top:1px solid var(--border);border-left:2px solid #0000;flex-direction:column;gap:6px;padding-top:6px;padding-left:8px;display:flex}.agent-scan-card.active{border-left-color:var(--accent);background:color-mix(in srgb, var(--accent) 6%, transparent);border-radius:0 6px 6px 0}.agent-scan-title{color:var(--text-h);font-size:11px;font-weight:700}.agent-command{color:var(--text-dim);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:9px;overflow:hidden}.agent-session-directory{color:var(--text-dim);text-overflow:ellipsis;white-space:nowrap;font-size:10px;overflow:hidden}.agent-worktree-title{color:var(--text-h);text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:700;overflow:hidden}.agent-worktree-meta{color:var(--text-dim);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:1.45;overflow:hidden}.agent-hover-target{pointer-events:all}.agent-hover-card{z-index:60;pointer-events:none;flex-direction:column;gap:10px;display:flex;position:fixed}.agent-state-pill{background:color-mix(in srgb, var(--accent) 18%, transparent);border-radius:8px;margin-left:6px;padding:0 6px;font-size:10px}.agent-state-pill.idle{background:var(--border);color:var(--text-dim)}.agent-evidence-row{flex-wrap:wrap;gap:4px;margin-top:5px;display:flex}.agent-evidence-pill{border:1px solid color-mix(in srgb, var(--accent) 35%, transparent);color:var(--text-dim);border-radius:999px;padding:1px 5px;font-size:9px}.repo-search input{background:var(--input-bg);border:1px solid var(--border);min-width:0;color:var(--text);font:inherit;border-radius:4px;flex:1;padding:4px 8px;font-size:12px}.repo-search input:focus{border-color:var(--accent);outline:none}.repo-bulk-button{border:1px solid var(--border);background:var(--bg);width:26px;height:26px;color:var(--text-dim);cursor:pointer;border-radius:4px;flex:none;line-height:1}.repo-bulk-button:hover{border-color:var(--accent);color:var(--text-h)}.repo-list h2{text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);margin:0;padding:16px 16px 8px;font-size:13px}.repo-item{cursor:pointer;height:40px;color:var(--text);border-left:3px solid #0000;align-items:center;gap:8px;margin:1px 0;padding:0 16px;display:flex}.repo-item:hover{background:var(--hover-bg)}.repo-item.active{background:var(--active-bg);border-left-color:var(--accent);color:var(--text-h)}.repo-item[draggable=true]{cursor:grab}.repo-item[draggable=true]:active{cursor:grabbing}.repo-item.dragging{opacity:.45}.repo-names{flex-direction:column;flex:1;justify-content:center;min-width:0;line-height:1.15;display:flex}.repo-name{text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.repo-name-line{align-items:center;gap:5px;min-width:0;display:flex}.repo-agent-dot{background:var(--accent);width:7px;height:7px;box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent);border-radius:50%;flex:none}.repo-agent-dot.idle{background:var(--text-dim);box-shadow:none;opacity:.6}.repo-branch{color:var(--text-dim);text-overflow:ellipsis;white-space:nowrap;font-size:10px;overflow:hidden}.repo-list .repo-group-heading{box-sizing:border-box;align-items:center;gap:8px;padding:8px 16px;transition:height .12s,padding .12s,opacity .12s,background-color .12s;display:flex;overflow:hidden}.repo-group-heading:hover{background:var(--hover-bg)}.repo-group-name{text-overflow:ellipsis;white-space:nowrap;cursor:grab;text-transform:uppercase;letter-spacing:normal;flex:auto;align-items:center;min-width:0;margin:-8px 0;padding:8px 0;font-size:12px;font-weight:500;display:flex;overflow:hidden}.repo-group-display-name{text-transform:uppercase}.repo-group-name:active{cursor:grabbing}.repo-group-name-input{min-width:0;font:inherit;letter-spacing:normal;color:var(--text-h);background:var(--bg);border:1px solid var(--accent);border-radius:4px;outline:none;flex:auto;margin:-3px 0 -3px -5px;padding:2px 4px}.repo-group-collapse{color:var(--text-dim);cursor:pointer;background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:2px;display:flex}.repo-group-collapse:hover{color:var(--text-h)}.repo-group-collapse svg{transition:transform .12s}.repo-group-collapse.collapsed svg{transform:rotate(-90deg)}.repo-select,.repo-group-select{accent-color:var(--accent);cursor:pointer;flex:none;margin:0}.repo-select{margin-left:auto}.repo-group-heading.dragging{opacity:.45}.repo-group-section{padding-top:4px;padding-bottom:8px;transition:background-color .15s}.repo-group-section.collapsed{padding-bottom:0}.repo-bookmark-overlay{z-index:80;position:fixed;inset:0}.repo-bookmark-menu{background:var(--menu-bg);border:1px solid var(--border);min-width:180px;max-width:260px;box-shadow:0 12px 32px var(--shadow-soft);border-radius:6px;padding:6px;position:fixed}.repo-bookmark-menu-item{width:100%;min-height:28px;color:var(--text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:4px;grid-template-columns:18px 1fr;align-items:center;gap:6px;padding:4px 8px;font-size:12px;display:grid}.repo-bookmark-menu-item:hover{background:var(--hover-bg);color:var(--text-h)}.repo-bookmark-menu-item:disabled{cursor:default;opacity:.5}.repo-bookmark-menu-item:disabled:hover{color:var(--text);background:0 0}.repo-bookmark-menu-separator{background:var(--border);height:1px;margin:5px 4px}.repo-empty{color:var(--text-dim);padding:8px 16px;font-size:13px}.graph-and-list{flex:1;display:flex;overflow-y:auto}.graph-column{background:var(--panel-bg);flex:none}.list-column{flex:1;min-width:0}.graph-panel{transition:height .18s}.fetch-band-shift{transition:transform .18s}@keyframes push-edge-flash{0%,to{opacity:.45;stroke-width:2px}50%{opacity:1;stroke-width:4px}}.push-edge{animation:.9s ease-in-out infinite push-edge-flash}.push-spinner{filter:drop-shadow(0 0 3px color-mix(in srgb, var(--accent) 55%, transparent))}.error-banner{background:var(--danger-bg);color:var(--danger-fg);padding:8px 16px;font-size:13px}.loading-banner{color:var(--text-dim);padding:8px 16px;font-size:13px}.load-more-sentinel{color:var(--text-dim);align-items:center;min-height:1px;padding:0 16px;font-size:11px;font-style:italic;display:flex}.load-more-sentinel--visible{height:var(--load-more-height)}.ghost-row-spacer{color:var(--text-dim);opacity:0;align-items:center;height:0;padding:0 16px;font-size:11px;font-style:italic;transition:height .18s,opacity .18s;display:flex;overflow:hidden}.ghost-row-spacer--visible{height:var(--ghost-row-height);opacity:.7}.commit-row{border-bottom:1px solid var(--border);border-left:3px solid #0000}.commit-row.match{border-left-color:var(--warning)}.commit-row.match .commit-subject{color:var(--warning)}@keyframes commit-row-flash{0%{background-color:color-mix(in srgb, var(--accent) 35%, transparent)}to{background-color:#0000}}.commit-row.flash .commit-row-main{animation:.7s ease-out commit-row-flash}.commit-row-main{cursor:pointer;align-items:center;gap:10px;padding:0 16px;display:flex;overflow:visible}.commit-row-main:hover{background:var(--hover-bg)}.commit-row.expanded .commit-row-main{background:var(--active-bg)}.uncommitted-row .commit-row-main{color:var(--text-h)}.uncommitted-badge{background:color-mix(in srgb, var(--text-dim) 15%, transparent);border-color:var(--text-dim);color:var(--text-dim)}.commit-panel-container{container-type:inline-size}.commit-panel{grid-template-columns:minmax(0,1fr) minmax(240px,1.25fr);gap:24px;max-width:820px;display:grid}@container (width<=560px){.commit-panel{grid-template-columns:minmax(0,1fr);gap:16px}}.commit-panel-compose{flex-direction:column;gap:10px;min-width:0;display:flex}.commit-panel-heading{justify-content:space-between;align-items:center;gap:12px;display:flex}.commit-panel-label{letter-spacing:.08em;text-transform:uppercase;color:var(--text-dim);font-family:ui-monospace,Menlo,Consolas,monospace;font-size:10px}.commit-panel-subject-count{color:var(--text-dim);font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11px}.commit-panel-subject-count.over{color:var(--danger)}.commit-panel-message{resize:vertical;background:var(--input-bg);border:1px solid var(--border);min-height:116px;color:var(--text-h);font:inherit;border-radius:8px;padding:10px 12px;font-size:13px;line-height:1.5}.commit-panel-message:focus{border-color:var(--accent);outline:none}.commit-panel-actions{gap:8px;display:flex}.commit-panel-actions button:disabled{cursor:default;opacity:.45;pointer-events:none}.commit-panel-commit{flex:1;justify-content:center;align-items:center;gap:8px;display:flex}.commit-panel-commit-count{opacity:.8;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11px;font-weight:500}.commit-panel-hint{color:var(--text-dim);font-size:12px;line-height:1.5}.commit-panel-changes{flex-direction:column;min-width:0;display:flex}.commit-panel-changes-header{align-items:center;gap:8px;height:20px;margin-bottom:4px;padding:0 4px;display:flex}.commit-panel-toggle-all{cursor:pointer;display:flex}.commit-panel-changes-title{flex:1}.commit-panel-totals{gap:8px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11px;display:flex}.lines-added{color:var(--success)}.lines-deleted{color:var(--danger)}.line-counts{gap:6px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11px;display:flex}.commit-file .line-counts{flex:none}.commit-panel-checkbox{border:1px solid var(--text-dim);width:14px;height:14px;color:var(--accent-fg);text-align:center;border-radius:3px;flex:none;font-size:10px;line-height:12px;transition:background-color .12s}.commit-panel-checkbox.on{border-color:var(--accent);background:var(--accent)}.commit-panel-files{flex-direction:column;font-size:13px;display:flex}.commit-panel-file{cursor:pointer;border-radius:3px;align-items:center;gap:8px;height:20px;padding:0 4px;display:flex}.commit-panel-file:hover{background:var(--hover-bg)}.commit-panel-toggle-all:focus-visible,.commit-panel-file:focus-visible{outline:1px solid var(--accent);outline-offset:-1px}.commit-panel-file .file-status{flex:none}.commit-panel-file.status-untracked .file-status,.commit-panel-file.status-added .file-status{color:var(--success)}.commit-panel-file.status-deleted .file-status{color:var(--danger)}.commit-panel-file.status-modified .file-status{color:var(--warning)}.commit-panel-file.status-renamed .file-status{color:var(--accent)}.commit-panel-file-path{white-space:nowrap;flex:1;align-items:baseline;gap:6px;min-width:0;display:flex;overflow:hidden}.commit-panel-file-name{min-width:0;color:var(--text-h);text-overflow:ellipsis;flex:0 auto;font-size:13px;overflow:hidden}.commit-panel-file-name:hover{text-decoration:underline}.commit-panel-file-dir{min-width:0;color:var(--text-dim);text-overflow:ellipsis;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11px;overflow:hidden}.commit-panel-file-stats{flex:none;align-items:center;gap:8px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11px;display:flex}.commit-panel-file-stats .lines-added,.commit-panel-file-stats .lines-deleted{text-align:right;width:30px}.commit-panel-ratio{gap:2px;display:flex}.commit-panel-ratio>span{background:var(--active-bg);border-radius:1px;width:6px;height:6px}.commit-panel-ratio>.ratio-add{background:var(--success)}.commit-panel-ratio>.ratio-del{background:var(--danger)}.commit-hash{color:var(--text-dim);flex:none}.commit-subject{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-h);flex:auto;overflow:hidden}.commit-refs{flex:none;gap:4px;display:flex}.commit-author{text-overflow:ellipsis;min-width:0;color:var(--text-dim);white-space:nowrap;flex:0 0 120px;font-size:12px;overflow:hidden}.commit-date{color:var(--text-dim);white-space:nowrap;flex:none;font-size:12px}.badge{white-space:nowrap;border:1px solid;border-radius:999px;align-items:center;gap:3px;padding:1px 7px;font-size:11px;display:inline-flex}.branch-badge.remote{border-style:dashed}.badge-icon{flex:none}.commit-detail{background:var(--panel-bg);border-top:1px dashed var(--border);padding:12px 16px 16px 46px}.commit-detail-loading{color:var(--text-dim);height:20px;font-size:13px}.commit-meta{grid-template-columns:100px 1fr;gap:4px 12px;margin:0 0 12px;font-size:13px;display:grid}.commit-meta dt{color:var(--text-dim)}.commit-meta dd{color:var(--text);word-break:break-all;margin:0}.mono{font-family:ui-monospace,Menlo,Consolas,monospace}.commit-message{color:var(--text-h);white-space:pre-wrap;overflow-wrap:anywhere;margin:0 0 12px;font-size:13px;line-height:18px}.commit-files{font-size:13px}.commit-file{align-items:center;gap:8px;height:20px;display:flex}.file-status{text-align:center;width:14px;font-family:ui-monospace,Menlo,Consolas,monospace;font-weight:600}.commit-file.status-added .file-status{color:var(--success)}.commit-file.status-deleted .file-status{color:var(--danger)}.commit-file.status-modified .file-status{color:var(--warning)}.commit-file.status-renamed .file-status{color:var(--accent)}.commit-file.clickable,.file-path.clickable{cursor:pointer}.commit-file.clickable:hover .file-path,.file-path.clickable:hover{color:var(--text-h);text-decoration:underline}.file-diff-overlay{align-items:center;padding-top:0}.file-diff-dialog{background:var(--menu-bg);border:1px solid var(--border);width:min(1400px,100vw - 48px);height:calc(100vh - 64px);box-shadow:0 16px 48px var(--shadow);border-radius:8px;flex-direction:column;display:flex;overflow:hidden}.file-diff-header{border-bottom:1px solid var(--border);align-items:center;gap:10px;padding:10px 14px;display:flex}.file-diff-title{min-width:0;color:var(--text-h);overflow-wrap:anywhere;flex:1;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:13px}.file-diff-body{min-height:0;overflow:hidden}.file-diff-full-toggle{flex:none;gap:8px!important}.file-diff-full-toggle label{white-space:nowrap}.file-diff-message{color:var(--text-dim);text-align:center;padding:24px;font-size:13px}.file-diff-main{flex:1;min-height:0;display:flex}.file-diff-files{border-right:1px solid var(--border);flex:0 0 260px;padding:6px 0;font-size:12px;overflow:auto}.file-diff-file{cursor:pointer;color:var(--text);align-items:center;gap:8px;padding:3px 12px;display:flex}.file-diff-file:hover{background:var(--hover-bg)}.file-diff-file.active{background:var(--active-bg);color:var(--text-h)}.file-diff-file-name{white-space:nowrap;text-overflow:ellipsis;min-width:0;overflow:hidden}.file-diff-file.status-added .file-status{color:var(--success)}.file-diff-file.status-deleted .file-status{color:var(--danger)}.file-diff-file.status-modified .file-status{color:var(--warning)}.file-diff-file.status-renamed .file-status{color:var(--accent)}.file-diff-body{flex-direction:column;flex:1;min-width:0;display:flex}.file-diff-panes{flex:1;min-height:0;display:flex;position:relative}.file-diff-overview{z-index:0;border-left:1px solid var(--border);background:color-mix(in srgb, var(--text-dim) 6%, transparent);width:28px;position:absolute;top:0;bottom:0;right:0}.file-diff-pane{z-index:1;position:relative}.file-diff-pane::-webkit-scrollbar{width:10px;height:10px}.file-diff-pane-right::-webkit-scrollbar{width:28px}.file-diff-pane::-webkit-scrollbar-track{background:0 0}.file-diff-pane::-webkit-scrollbar-corner{background:0 0}.file-diff-pane::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--text-dim) 25%, transparent);border-radius:5px}.file-diff-pane::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb, var(--text-dim) 45%, transparent)}.overview-bar{width:45%;min-height:2px;position:absolute}.overview-delete{background:var(--danger);left:2px}.overview-insert{background:var(--success);right:2px}.file-diff-pane{flex:1 1 0;min-width:0;overflow:auto}.file-diff-pane-left{border-right:1px solid var(--border)}.file-diff-table{border-collapse:collapse;width:max-content;min-width:100%;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px;line-height:18px}.file-diff-table tr{height:18px}.file-diff-table td{vertical-align:top;padding:0 6px}.diff-num{text-align:right;color:var(--text-dim);-webkit-user-select:none;user-select:none}.diff-code{white-space:pre;color:var(--text)}.diff-delete{background:color-mix(in srgb, var(--danger) 18%, transparent)}.diff-insert{background:color-mix(in srgb, var(--success) 18%, transparent)}.diff-empty{background:color-mix(in srgb, var(--text-dim) 8%, transparent)}.file-diff-table tr.diff-hunk{height:26px}.diff-hunk td{vertical-align:middle;color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, transparent);border-top:1px solid var(--border);border-bottom:1px solid var(--border);padding:0 8px}.ci-active-dot{filter:drop-shadow(0 0 4px color-mix(in srgb, var(--accent) 80%, transparent))}.ci-run-badge{color:#24292f;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #fff;border-radius:999px;align-items:center;gap:4px;padding:1px 7px 1px 3px;font-size:11px;display:inline-flex;position:relative}.ci-run-icon{justify-content:center;align-items:center;width:14px;height:14px;display:inline-flex}.ci-provider-logo{object-fit:contain}.ci-run-status{font-weight:800;line-height:1}.ci-run-tooltip{z-index:95;white-space:normal;cursor:default;width:480px;position:fixed}.ci-run-tooltip-body{flex-direction:column;gap:8px;display:flex}.pipelines-panel{border:1px solid var(--border);background:color-mix(in srgb, var(--accent) 6%, transparent);border-radius:8px;margin:10px 10px 6px;padding:10px}.pipeline-card{border:1px solid var(--border);background:var(--panel-bg);border-radius:6px;flex-direction:column;gap:4px;padding:7px;display:flex}.pipeline-title{min-width:0;color:var(--text-h);align-items:center;gap:6px;font-size:12px;font-weight:700;text-decoration:none;display:flex}.pipeline-title:hover .pipeline-name{text-decoration:underline}.pipeline-icon{flex:none;justify-content:center;align-items:center;width:14px;height:14px;display:inline-flex}.pipeline-name{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.pipeline-status{flex:none;font-size:10px;font-weight:600}.pipeline-meta{color:var(--text-dim);font-size:10px;line-height:1.45}.stage-strip{flex-direction:column;gap:4px;display:flex}.stage-strip-row{flex-wrap:wrap;align-items:center;gap:3px 4px;font-size:10px;display:flex}.stage-arrow{color:var(--text-dim)}.stage-chip{border:1px solid var(--border);color:var(--text-h);border-radius:999px;align-items:center;gap:3px;padding:1px 6px;display:inline-flex}.stage-chip.pending{color:var(--text-dim)}.stage-mark{font-weight:800;line-height:1}.stage-duration{color:var(--text-dim)}.stage-steps{color:var(--text-dim);font-size:10px}.stage-steps summary{cursor:pointer}.stage-step{color:var(--text);align-items:center;gap:4px;padding-left:12px;display:flex}.terminal-container{border-top:1px solid var(--border);background:var(--panel-bg);flex-direction:column;flex:none;height:260px;display:flex;position:relative}.terminal-container.collapsed{height:auto}.terminal-container.collapsed .terminal-body{display:none}.terminal-resize-handle{cursor:row-resize;z-index:5;height:6px;position:absolute;top:-3px;left:0;right:0}.terminal-resize-handle:hover,.terminal-resize-handle:active{background:var(--accent);opacity:.5}.terminal-header{height:26px;color:var(--text-dim);cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;padding:0 16px;font-size:12px;display:flex}.terminal-body{flex:1;min-height:0;position:relative}.terminal-instance{height:100%}.terminal-instance.hidden{display:none}.terminal-panel{height:100%;padding:4px 8px}.app{width:100vw;height:100vh;display:flex;overflow:hidden}.main{flex-direction:column;flex:1;min-width:0;display:flex}.main-header{background:var(--panel-bg);border-bottom:1px solid var(--border);flex:none;align-items:stretch;display:flex}.workspace-panes{flex:auto;min-height:0;display:flex;position:relative;overflow:hidden}.workspace-panes:after{content:"Drop to open split";border:2px dashed var(--accent);background:color-mix(in srgb, var(--accent) 14%, transparent);width:28%;color:var(--text-h);letter-spacing:.02em;box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--accent) 24%, transparent), 0 16px 40px var(--shadow-soft);opacity:0;pointer-events:none;z-index:20;border-radius:0;justify-content:center;align-items:center;font-size:13px;font-weight:600;transition:opacity .12s,transform .12s;display:flex;position:absolute;top:0;bottom:0;right:0;transform:translate(12px)scale(.98)}body.tab-split-preview .workspace-panes:after{opacity:1;transform:translate(0)scale(1)}.workspace-pane{background:var(--bg);flex-direction:column;flex:1 1 0;min-width:0;display:flex}.workspace-panes.split .workspace-pane[data-tab-pane=right]{border-left:1px solid var(--border)}.split-resize-handle{cursor:col-resize;z-index:3;background:0 0;flex:0 0 5px;margin-left:-3px}.split-resize-handle:hover{background:color-mix(in srgb, var(--accent) 35%, transparent)}.tabs-bar{flex:auto;min-width:0;display:flex;overflow-x:auto}.tab{border-right:1px solid var(--border);color:var(--text-dim);cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;box-sizing:border-box;align-items:center;gap:8px;padding:5px 8px 5px 12px;transition:width .12s,padding .12s,opacity .12s,background-color .12s;display:flex;overflow:hidden}.tab:active{cursor:grabbing}body.tab-dragging,body.tab-dragging *{cursor:grabbing!important}.tab.dragging{opacity:.45}.tab-ghost{z-index:1000;pointer-events:none;opacity:.85;background:var(--active-bg);transition:none;position:fixed;top:0;left:0;box-shadow:0 4px 12px #00000059}.tab.preview{font-style:italic}.tab.unavailable{opacity:.65}.tab.active{background:var(--active-bg);color:var(--text-h);box-shadow:inset 0 -2px var(--accent)}.tab-names{flex-direction:column;line-height:1.2;display:flex}.tab-branch{color:var(--text-dim);font-size:10px}.tab-close{text-align:center;border-radius:3px;width:16px;height:16px;line-height:16px}.tab-close:hover{background:var(--hover-bg);color:var(--text-h)}.search-box{border-left:1px solid var(--border);flex:none;align-items:center;gap:6px;padding:0 10px;display:flex;position:relative}.search-input{background:var(--input-bg);border:1px solid var(--border);width:200px;color:var(--text);font:inherit;border-radius:4px;padding:4px 8px}.search-input:focus{border-color:var(--accent);outline:none}.search-count{color:var(--text-dim);text-align:center;min-width:14px;font-size:12px}.agent-active-marker{pointer-events:none}.agent-active-marker.idle{opacity:.45}.filter-button{border:1px solid var(--border);background:var(--bg);width:26px;height:26px;color:var(--text-dim);cursor:pointer;border-radius:4px;justify-content:center;align-items:center;display:inline-flex;position:relative}.filter-button:hover,.filter-button.active{color:var(--text-h);border-color:var(--accent)}.filter-count{background:var(--accent);color:#fff;text-align:center;border-radius:999px;min-width:15px;height:15px;padding:0 4px;font-size:10px;line-height:15px;position:absolute;top:-7px;right:-7px}.filter-popover{z-index:25;background:var(--menu-bg);border:1px solid var(--border);min-width:360px;max-width:440px;max-height:320px;box-shadow:0 8px 24px var(--shadow-soft);border-radius:6px;flex-direction:column;gap:4px;padding:8px;display:flex;position:absolute;top:calc(100% + 8px);right:10px;overflow-y:auto}.filter-field{grid-template-columns:130px 1fr;align-items:start;gap:8px;padding:2px 0;display:grid}.filter-field span{color:var(--text-dim);white-space:nowrap;padding-top:6px;font-size:12px}.filter-field input{box-sizing:border-box;background:var(--input-bg);border:1px solid var(--border);min-width:0;height:28px;color:var(--text);font:inherit;border-radius:4px;padding:5px 7px;font-size:12px}.filter-field input:focus{border-color:var(--accent);outline:none}.filter-hint{color:var(--text-dim);margin:2px 0;font-size:11px;line-height:1.4}.multiselect{min-width:0;position:relative}.multiselect-trigger{box-sizing:border-box;background:var(--bg);border:1px solid var(--border);width:100%;min-width:0;height:28px;color:var(--text);font:inherit;cursor:pointer;border-radius:4px;justify-content:space-between;align-items:center;gap:6px;padding:5px 7px;font-size:12px;display:flex}.multiselect-trigger:hover,.multiselect-trigger.active{border-color:var(--accent)}.multiselect-trigger-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.multiselect-caret{color:var(--text-dim);flex:none}.multiselect-overlay{z-index:130;position:fixed;inset:0}.multiselect-panel{z-index:131;background:var(--menu-bg);border:1px solid var(--border);max-height:180px;box-shadow:0 8px 24px var(--shadow-soft);border-radius:6px;padding:4px;position:fixed;overflow-y:auto}.multiselect-search{box-sizing:border-box;background:var(--input-bg);border:1px solid var(--border);width:100%;color:var(--text);font:inherit;border-radius:4px;outline:none;margin-bottom:4px;padding:5px 6px;font-size:12px}.multiselect-search:focus{border-color:var(--accent)}.multiselect-empty{color:var(--text-dim);padding:6px;font-size:12px}.multiselect-option{color:var(--text);cursor:pointer;border-radius:4px;align-items:center;gap:6px;padding:5px 6px;font-size:12px;display:flex;overflow:hidden}.multiselect-option:hover{background:var(--active-bg)}.multiselect-option span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.filter-clear-button{border:1px solid var(--border);background:var(--bg);color:var(--text-dim);cursor:pointer;font:inherit;border-radius:4px;align-self:flex-end;padding:4px 7px;font-size:12px}.filter-clear-button:hover{color:var(--text-h);border-color:var(--accent)}.filter-option{text-overflow:ellipsis;white-space:nowrap;width:100%;color:var(--text);cursor:pointer;font:inherit;text-align:left;background:0 0;border:0;border-radius:4px;padding:6px 8px;font-size:12px;overflow:hidden}.filter-option:hover,.filter-option.active{background:var(--active-bg);color:var(--text-h)}.content{flex:1;min-height:0;display:flex;overflow:hidden}.empty-state{color:var(--text-dim);margin:auto}.unavailable-state{text-align:center;max-width:360px;line-height:1.4}.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}
|