@civilization/dsh-git-workbench 0.4.2 → 0.4.3

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.
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["css","memo","useState","useCallback","useMemo","React","memo","useState","useRef","useCallback","useMemo","css","createPortal","css"],"sources":["../src/client/definition.tsx","../src/client/git-helpers.ts","../src/client/GitBody.tsx","../src/client/GitBranchPill.tsx","../src/client/GitTitle.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/**\n * Definition of the `git` tab type for the right Sidebar.\n */\n\nimport React from 'react'\n\n/** The tab kind this package owns */\nexport const GIT_KIND = 'git'\n\n/** Implementation identity in the tab system */\nexport const GIT_ID = '@civilization/dsh-git-workbench'\n\nexport interface SidebarRightTabGuide {\n id?: string\n commandId?: string\n order?: number\n title: () => string\n description: () => string\n icon?: () => React.ReactElement\n}\n\nexport interface SidebarRightTabDefinition {\n id: string\n kind: string\n priority?: string\n title: () => string\n guide?: SidebarRightTabGuide[]\n}\n\n/** Git artwork for the Sidebar Guide */\nexport function GuideArtworkGit(): React.ReactElement {\n return (\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"27\" stroke=\"#F05133\" strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n <path d=\"M12 21C12 18 15 15 18 15H22C23.5 15 24 14.5 24 13V12\" stroke=\"#F05133\" strokeWidth=\"2.5\" strokeLinecap=\"round\" fill=\"none\" />\n <circle cx=\"12\" cy=\"26\" r=\"3.5\" fill=\"#FFFFFF\" stroke=\"#F05133\" strokeWidth=\"2.5\" />\n <circle cx=\"12\" cy=\"10\" r=\"3.5\" fill=\"#FFFFFF\" stroke=\"#F05133\" strokeWidth=\"2.5\" />\n <circle cx=\"24\" cy=\"11\" r=\"3.5\" fill=\"#FFFFFF\" stroke=\"#3680F6\" strokeWidth=\"2.5\" />\n </svg>\n )\n}\n\n/**\n * Tab definition for the Git right-sidebar viewer.\n * @param t - namespace-bound translation function.\n * @returns Complete sidebar tab definition.\n */\nexport function gitDefinition(t: (key: string) => string): SidebarRightTabDefinition {\n return {\n id: GIT_ID,\n kind: GIT_KIND,\n priority: 'builtin',\n title: () => t('type.label'),\n guide: [{\n id: 'git',\n commandId: 'workspace.git',\n order: 15,\n title: () => t('guide.title'),\n description: () => t('guide.description'),\n icon: GuideArtworkGit,\n }],\n }\n}\n","/**\n * Conventional Commits and presentation helpers for Git commits and avatars.\n */\n\nexport type ConventionalType =\n | 'feat'\n | 'fix'\n | 'style'\n | 'refactor'\n | 'docs'\n | 'test'\n | 'chore'\n | 'release'\n | 'merge'\n | 'revert'\n\nexport interface ParsedCommitSubject {\n readonly type?: ConventionalType\n readonly scope?: string\n readonly cleanSubject: string\n}\n\n/**\n * Parse conventional commit prefix from a commit subject.\n * @param subject - Raw first line of commit message.\n * @returns Parsed type, scope, and clean subject.\n */\nexport function parseConventionalCommit(subject: string): ParsedCommitSubject {\n const trimmed = subject.trim()\n\n // Match merge commits\n if (/^merge\\s+(pull\\s+request|branch|remote-tracking\\s+branch)/i.test(trimmed)) {\n return {\n type: 'merge',\n cleanSubject: trimmed,\n }\n }\n\n // Match standard conventional commit prefix: \"type(scope): message\" or \"type: message\"\n const match = /^(feat|fix|style|refactor|docs|test|chore|release|revert)(?:\\(([^)]+)\\))?!?:\\s*(.*)$/i.exec(trimmed)\n if (match && match[1]) {\n const rawType = match[1].toLowerCase() as ConventionalType\n const scope = match[2]?.trim()\n return {\n type: rawType,\n ...scope !== undefined ? { scope } : {},\n cleanSubject: trimmed,\n }\n }\n\n return {\n cleanSubject: trimmed,\n }\n}\n\nconst AVATAR_PALETTE = [\n '#388bfd', // Blue\n '#2ea043', // Green\n '#f0883e', // Orange\n '#a371f7', // Purple\n '#db61a2', // Rose\n '#39c5bb', // Cyan\n '#f9c513', // Amber\n '#6f42c1', // Violet\n]\n\n/**\n * Deterministically compute avatar initial and background color for an author name.\n * @param author - Author name or email.\n * @returns Initial letter and hex color code.\n */\nexport function getAuthorAvatar(author: string): { initial: string; color: string } {\n const clean = author.trim()\n const initial = clean.length > 0 ? (clean[0]?.toUpperCase() ?? '?') : '?'\n\n let hash = 0\n for (let i = 0; i < clean.length; i++) {\n hash = (hash << 5) - hash + clean.charCodeAt(i)\n hash |= 0\n }\n\n const index = Math.abs(hash) % AVATAR_PALETTE.length\n const color = AVATAR_PALETTE[index] ?? '#388bfd'\n\n return { initial, color }\n}\n\n/**\n * Format date string into YYYY-MM-DD HH:mm:ss.\n * @param dateStr - ISO or Git date string.\n * @returns Clean formatted local date and time string.\n */\nexport function formatFullDate(dateStr: string): string {\n const d = new Date(dateStr)\n if (Number.isNaN(d.getTime())) return dateStr\n\n const pad = (n: number) => String(n).padStart(2, '0')\n const year = d.getFullYear()\n const month = pad(d.getMonth() + 1)\n const day = pad(d.getDate())\n const hours = pad(d.getHours())\n const minutes = pad(d.getMinutes())\n const seconds = pad(d.getSeconds())\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`\n}\n\nexport const GRAPH_LANE_PALETTE = [\n '#388bfd', // 0: Mainline Blue\n '#3fb950', // 1: Emerald Green\n '#f0883e', // 2: Coral Orange\n '#a371f7', // 3: Violet Purple\n '#58a6ff', // 4: Sky Blue\n '#bc8cff', // 5: Lavender\n '#db61a2', // 6: Magenta\n '#2ea043', // 7: Forest Green\n] as const\n\nexport interface DagNode {\n readonly hash: string\n readonly lane: number\n readonly color: string\n readonly x: number\n readonly y: number\n readonly isHead: boolean\n readonly hasTag: boolean\n}\n\nexport interface DagEdge {\n readonly key: string\n readonly fromHash: string\n readonly toHash?: string\n readonly color: string\n readonly d: string\n}\n\nexport interface DagGraphModel {\n readonly nodes: readonly DagNode[]\n readonly edges: readonly DagEdge[]\n readonly maxLane: number\n readonly graphWidth: number\n}\n\nconst ROW_HEIGHT = 28\nconst LANE_WIDTH = 16\nconst LANE_X_OFFSET = 10\n\n/**\n * Compute global continuous SVG DAG topology graph for commit items (IntelliJ IDEA grade).\n * Eliminates per-row segmentation gaps, floating nodes, and misaligned curves.\n * @param commits - Ordered commit items.\n * @returns Fully computed nodes, edges, maxLane, and width.\n */\nexport function computeDagGraph(commits: readonly {\n hash: string\n parents?: readonly string[]\n refs?: readonly string[]\n}[]): DagGraphModel {\n if (commits.length === 0) {\n return { nodes: [], edges: [], maxLane: 0, graphWidth: 36 }\n }\n\n // 1. Map commit hash -> index\n const hashToIndex = new Map<string, number>()\n commits.forEach((c, idx) => hashToIndex.set(c.hash, idx))\n\n // 2. Identify mainline (first-parent chain starting from HEAD or newest commit)\n const mainlineSet = new Set<string>()\n let curr = commits.find(c => c.refs?.some(r => r.includes('HEAD') || r === 'master' || r === 'main'))?.hash\n ?? commits[0]?.hash\n while (curr && hashToIndex.has(curr)) {\n mainlineSet.add(curr)\n const commitIdx = hashToIndex.get(curr)\n if (commitIdx === undefined) break\n const c = commits[commitIdx]\n if (!c || !c.parents || c.parents.length === 0) break\n curr = c.parents[0]\n }\n\n // 3. Assign lanes to each commit\n const activeLanes: (string | null)[] = [null]\n const commitLanes: number[] = Array.from({ length: commits.length }, () => 0)\n\n commits.forEach((c, idx) => {\n let lane = 0\n if (mainlineSet.has(c.hash)) {\n lane = 0\n for (let l = 1; l < activeLanes.length; l++) {\n if (activeLanes[l] === c.hash) activeLanes[l] = null\n }\n } else {\n let foundLane = -1\n for (let l = 1; l < activeLanes.length; l++) {\n if (activeLanes[l] === c.hash) {\n foundLane = l\n break\n }\n }\n\n if (foundLane !== -1) {\n lane = foundLane\n activeLanes[lane] = null\n } else {\n let slot = -1\n for (let l = 1; l < activeLanes.length; l++) {\n if (activeLanes[l] === null) {\n slot = l\n break\n }\n }\n if (slot !== -1) {\n lane = slot\n } else {\n lane = Math.max(1, activeLanes.length)\n while (activeLanes.length <= lane) activeLanes.push(null)\n }\n }\n }\n\n commitLanes[idx] = lane\n\n // Reserve lanes for non-mainline parents\n if (c.parents && c.parents.length > 0) {\n c.parents.forEach((parentHash, pIdx) => {\n if (mainlineSet.has(parentHash)) return\n if (activeLanes.includes(parentHash)) return\n\n if (pIdx === 0 && lane >= 1 && activeLanes[lane] === null) {\n activeLanes[lane] = parentHash\n } else {\n let slot = -1\n for (let l = 1; l < activeLanes.length; l++) {\n if (activeLanes[l] === null) {\n slot = l\n break\n }\n }\n if (slot !== -1) {\n activeLanes[slot] = parentHash\n } else {\n activeLanes.push(parentHash)\n }\n }\n })\n }\n\n while (activeLanes.length > 1 && activeLanes.at(-1) === null) {\n activeLanes.pop()\n }\n })\n\n const maxLane = Math.max(0, ...commitLanes)\n\n // 4. Compute Edges (Connections from Child -> Parent)\n const edges: DagEdge[] = []\n const processedEdges = new Set<string>()\n\n commits.forEach((c, idx) => {\n const fromLane = commitLanes[idx] ?? 0\n const x1 = fromLane * LANE_WIDTH + LANE_X_OFFSET\n const y1 = idx * ROW_HEIGHT + ROW_HEIGHT / 2\n const nodeColor = GRAPH_LANE_PALETTE[fromLane % GRAPH_LANE_PALETTE.length] ?? '#388bfd'\n\n if (!c.parents || c.parents.length === 0) return\n\n c.parents.forEach((pHash) => {\n const edgeKey = `${c.hash}->${pHash}`\n if (processedEdges.has(edgeKey)) return\n processedEdges.add(edgeKey)\n\n const pIdxInList = hashToIndex.get(pHash)\n if (pIdxInList !== undefined) {\n const toLane = commitLanes[pIdxInList] ?? 0\n const x2 = toLane * LANE_WIDTH + LANE_X_OFFSET\n const y2 = pIdxInList * ROW_HEIGHT + ROW_HEIGHT / 2\n const edgeColor = fromLane > 0\n ? nodeColor\n : (toLane > 0 ? (GRAPH_LANE_PALETTE[toLane % GRAPH_LANE_PALETTE.length] ?? nodeColor) : nodeColor)\n\n if (x1 === x2) {\n edges.push({\n key: edgeKey,\n fromHash: c.hash,\n toHash: pHash,\n color: edgeColor,\n d: `M ${x1} ${y1} L ${x2} ${y2}`,\n })\n } else if (pIdxInList === idx + 1) {\n edges.push({\n key: edgeKey,\n fromHash: c.hash,\n toHash: pHash,\n color: edgeColor,\n d: `M ${x1} ${y1} C ${x1} ${y1 + 14}, ${x2} ${y2 - 14}, ${x2} ${y2}`,\n })\n } else if (toLane === 0) {\n edges.push({\n key: edgeKey,\n fromHash: c.hash,\n toHash: pHash,\n color: edgeColor,\n d: `M ${x1} ${y1} L ${x1} ${y2 - 28} C ${x1} ${y2 - 14}, ${x2} ${y2 - 14}, ${x2} ${y2}`,\n })\n } else {\n edges.push({\n key: edgeKey,\n fromHash: c.hash,\n toHash: pHash,\n color: edgeColor,\n d: `M ${x1} ${y1} C ${x1} ${y1 + 14}, ${x2} ${y1 + 14}, ${x2} ${y1 + 28} L ${x2} ${y2}`,\n })\n }\n } else {\n const bottomY = commits.length * ROW_HEIGHT\n edges.push({\n key: edgeKey,\n fromHash: c.hash,\n color: nodeColor,\n d: `M ${x1} ${y1} L ${x1} ${bottomY}`,\n })\n }\n })\n })\n\n // 5. Compute Nodes\n const nodes: DagNode[] = commits.map((c, idx) => {\n const lane = commitLanes[idx] ?? 0\n const x = lane * LANE_WIDTH + LANE_X_OFFSET\n const y = idx * ROW_HEIGHT + ROW_HEIGHT / 2\n const color = GRAPH_LANE_PALETTE[lane % GRAPH_LANE_PALETTE.length] ?? '#388bfd'\n const isHead = Boolean(c.refs?.some(r => r.includes('HEAD') || r === 'master' || r === 'main'))\n const hasTag = Boolean(c.refs?.some(r => r.startsWith('tag: ') || r.includes('tag:')))\n\n return {\n hash: c.hash,\n lane,\n color,\n x,\n y,\n isHead,\n hasTag,\n }\n })\n\n return {\n nodes,\n edges,\n maxLane,\n graphWidth: Math.max(36, (maxLane + 1) * LANE_WIDTH + 16),\n }\n}\n","/**\n * IntelliJ IDEA-Grade Git Tool Window Component.\n * Supports DAG commit topology graph visualization, working tree staging, commit console,\n * branch switcher, and unified diff inspector.\n */\n\nimport { memo, useCallback, useEffect, useMemo, useState } from 'react'\nimport type { KeyboardEvent, ReactElement } from 'react'\nimport type {\n GitBranchesSummary,\n GitCommitDetail,\n GitCommitItem,\n GitDiffSummary,\n GitStatusSummary,\n GitTagItem,\n} from '../types.ts'\nimport {\n computeDagGraph,\n formatFullDate,\n getAuthorAvatar,\n parseConventionalCommit,\n} from './git-helpers.ts'\nimport type {} from './locales.ts'\nimport css from './GitBody.module.css'\n\nfunction getTypeBadgeClass(type?: string): string {\n switch (type) {\n case 'feat': return css.typeFeat ?? ''\n case 'fix': return css.typeFix ?? ''\n case 'style': return css.typeStyle ?? ''\n case 'refactor': return css.typeRefactor ?? ''\n case 'release': return css.typeRelease ?? ''\n case 'merge': return css.typeMerge ?? ''\n case 'test': return css.typeTest ?? ''\n case 'docs': return css.typeDocs ?? ''\n case 'revert': return css.typeRevert ?? ''\n case 'chore':\n default:\n return css.typeChore ?? ''\n }\n}\n\n\n/** Injected Git RPC methods */\nexport interface GitInjected {\n readonly getStatus: (sessionId?: string) => Promise<GitStatusSummary>\n readonly getLog: (sessionId?: string, maxCount?: number) => Promise<readonly GitCommitItem[]>\n readonly getCommitDetails: (sessionId?: string, commit?: string) => Promise<GitCommitDetail | undefined>\n readonly getDiff: (sessionId?: string, options?: { filePath?: string; staged?: boolean; commit?: string }) => Promise<GitDiffSummary>\n readonly getBranches: (sessionId?: string) => Promise<GitBranchesSummary>\n readonly checkout: (sessionId?: string, branch?: string, create?: boolean) => Promise<{ success: boolean; message?: string }>\n readonly stage: (sessionId?: string, paths?: string[] | 'all') => Promise<{ success: boolean; message?: string }>\n readonly unstage: (sessionId?: string, paths?: string[] | 'all') => Promise<{ success: boolean; message?: string }>\n readonly discard: (sessionId?: string, paths?: string[]) => Promise<{ success: boolean; message?: string }>\n readonly commit: (sessionId?: string, message?: string) => Promise<{ success: boolean; message?: string }>\n readonly fetch: (sessionId?: string) => Promise<{ success: boolean; message?: string }>\n readonly pull: (sessionId?: string) => Promise<{ success: boolean; message?: string }>\n readonly push: (sessionId?: string) => Promise<{ success: boolean; message?: string }>\n readonly getTags: (sessionId?: string) => Promise<readonly GitTagItem[]>\n readonly createTag: (\n sessionId?: string,\n name?: string,\n commit?: string,\n message?: string,\n ) => Promise<{ success: boolean; message?: string }>\n readonly deleteTag: (sessionId?: string, name?: string) => Promise<{ success: boolean; message?: string }>\n}\n\nexport interface GitBodyProps extends GitInjected {\n readonly sessionId?: string\n readonly t: (key: string, ...args: any[]) => string\n}\n\ntype ActiveTab = 'changes' | 'tree' | 'branches' | 'tags'\n\n/**\n * Render color-coded unified diff lines.\n */\nfunction DiffViewer({ diffText }: { readonly diffText: string }): ReactElement {\n if (!diffText.trim()) {\n return <div className={css.diffViewer}>无代码内容变动</div>\n }\n\n const lines = diffText.split('\\n')\n return (\n <div className={css.diffViewer}>\n {lines.map((line, idx) => {\n let lineClass = css.diffLine\n if (line.startsWith('+') && !line.startsWith('+++')) lineClass = `${css.diffLine} ${css.diffAdd}`\n else if (line.startsWith('-') && !line.startsWith('---')) lineClass = `${css.diffLine} ${css.diffDel}`\n else if (line.startsWith('@@')) lineClass = `${css.diffLine} ${css.diffHunk}`\n\n return (\n <div key={idx} className={lineClass}>\n {line || ' '}\n </div>\n )\n })}\n </div>\n )\n}\n\n\n/**\n * Main Git Body Component.\n */\nexport const GitBody = memo(function GitBody(props: GitBodyProps) {\n const {\n t,\n sessionId,\n getStatus,\n getLog,\n getCommitDetails,\n getDiff,\n getBranches,\n getTags,\n createTag,\n deleteTag,\n checkout,\n stage,\n unstage,\n discard,\n commit,\n fetch: fetchGit,\n pull,\n push,\n } = props\n\n const [activeTab, setActiveTab] = useState<ActiveTab>('changes')\n const [loading, setLoading] = useState(false)\n\n const [status, setStatus] = useState<GitStatusSummary | null>(null)\n const [commits, setCommits] = useState<readonly GitCommitItem[]>([])\n const [branches, setBranches] = useState<GitBranchesSummary | null>(null)\n const [tags, setTags] = useState<readonly GitTagItem[]>([])\n\n // Commit Console State\n const [commitMessage, setCommitMessage] = useState('')\n const [committing, setCommitting] = useState(false)\n\n // Diff Preview State\n const [selectedFileDiff, setSelectedFileDiff] = useState<{ path: string; staged: boolean; diff: string } | null>(null)\n\n // Tree Selected Commit State\n const [selectedCommitHash, setSelectedCommitHash] = useState<string | null>(null)\n const [commitDetail, setCommitDetail] = useState<GitCommitDetail | null>(null)\n\n // Locate in DAG Tree State\n const [highlightedCommitHash, setHighlightedCommitHash] = useState<string | null>(null)\n const [locatedNotice, setLocatedNotice] = useState<string | null>(null)\n\n // Tree Filter & Search State\n const [treeSearch, setTreeSearch] = useState('')\n const [filterMode, setFilterMode] = useState<'all' | 'mainline'>('all')\n\n // Branch Filter State\n const [branchFilter, setBranchFilter] = useState('')\n const [newBranchName, setNewBranchName] = useState('')\n const [creatingBranch, setCreatingBranch] = useState(false)\n\n // Tag Management State\n const [tagFilter, setTagFilter] = useState('')\n const [creatingTag, setCreatingTag] = useState(false)\n const [newTagName, setNewTagName] = useState('')\n const [newTagCommit, setNewTagCommit] = useState('')\n const [newTagMessage, setNewTagMessage] = useState('')\n\n // Fetch full repository data\n const refresh = useCallback(async () => {\n setLoading(true)\n try {\n const [statusRes, logRes, branchRes, tagRes] = await Promise.all([\n getStatus(sessionId).catch(() => null),\n getLog(sessionId, 50).catch(() => []),\n getBranches(sessionId).catch(() => null),\n getTags(sessionId).catch(() => []),\n ])\n if (statusRes) setStatus(statusRes)\n setCommits(logRes)\n if (branchRes) setBranches(branchRes)\n setTags(tagRes)\n } finally {\n setLoading(false)\n }\n }, [getBranches, getLog, getStatus, getTags, sessionId])\n\n useEffect(() => {\n void refresh()\n }, [refresh])\n\n // Inspect commit details when a tree node is clicked\n const handleSelectCommit = useCallback(async (hash: string) => {\n if (selectedCommitHash === hash) {\n setSelectedCommitHash(null)\n setCommitDetail(null)\n return\n }\n setSelectedCommitHash(hash)\n try {\n const details = await getCommitDetails(sessionId, hash)\n setCommitDetail(details ?? null)\n } catch {\n setCommitDetail(null)\n }\n }, [getCommitDetails, selectedCommitHash, sessionId])\n\n // Inspect file diff\n const handleViewDiff = useCallback(async (path: string, staged: boolean, commitHash?: string) => {\n try {\n const res = await getDiff(sessionId, {\n filePath: path,\n staged,\n ...commitHash !== undefined ? { commit: commitHash } : {},\n })\n setSelectedFileDiff({\n path,\n staged,\n diff: res.rawDiff,\n })\n } catch {\n setSelectedFileDiff(null)\n }\n }, [getDiff, sessionId])\n\n // Stage / Unstage / Discard\n const handleStage = useCallback(async (paths: string[] | 'all') => {\n await stage(sessionId, paths)\n await refresh()\n }, [refresh, sessionId, stage])\n\n const handleUnstage = useCallback(async (paths: string[] | 'all') => {\n await unstage(sessionId, paths)\n await refresh()\n }, [refresh, sessionId, unstage])\n\n const handleDiscard = useCallback(async (paths: string[]) => {\n if (confirm(`确认放弃对 ${paths.length} 个文件的所有更改吗?此操作无法撤销。`)) {\n await discard(sessionId, paths)\n await refresh()\n }\n }, [discard, refresh, sessionId])\n\n // Commit\n const handleCommit = useCallback(async (andPush = false) => {\n const trimmed = commitMessage.trim()\n if (!trimmed) {\n alert(t('commit.emptyWarning'))\n return\n }\n\n setCommitting(true)\n try {\n const res = await commit(sessionId, trimmed)\n if (res.success) {\n setCommitMessage('')\n if (andPush) {\n await push(sessionId)\n }\n await refresh()\n } else {\n alert(res.message || '提交失败')\n }\n } finally {\n setCommitting(false)\n }\n }, [commit, commitMessage, push, refresh, sessionId, t])\n\n const handleCommitKeyDown = useCallback((e: KeyboardEvent<HTMLTextAreaElement>) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault()\n void handleCommit(false)\n }\n }, [handleCommit])\n\n // Branch Switch\n const handleCheckoutBranch = useCallback(async (bName: string, create = false) => {\n const res = await checkout(sessionId, bName, create)\n if (res.success) {\n setCreatingBranch(false)\n setNewBranchName('')\n await refresh()\n } else {\n alert(res.message || '检出失败')\n }\n }, [checkout, refresh, sessionId])\n\n\n // Locate commit in DAG tree and pulse glow\n const handleLocateCommit = useCallback(async (commitHash: string, tagName?: string) => {\n setActiveTab('tree')\n let found = commits.find(c => c.hash.startsWith(commitHash) || commitHash.startsWith(c.hash))\n if (!found) {\n try {\n const deepLogs = await getLog(sessionId, 200)\n setCommits(deepLogs)\n found = deepLogs.find(c => c.hash.startsWith(commitHash) || commitHash.startsWith(c.hash))\n } catch {\n // Continue with current list\n }\n }\n\n if (found) {\n setSelectedCommitHash(found.hash)\n setHighlightedCommitHash(found.hash)\n if (tagName) {\n setLocatedNotice(t('tag.locatedNotice', { name: tagName }))\n setTimeout(() => { setLocatedNotice(null) }, 3000)\n }\n void handleSelectCommit(found.hash)\n setTimeout(() => {\n const el = document.getElementById(`git-commit-${found.hash}`)\n el?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n }, 50)\n setTimeout(() => {\n setHighlightedCommitHash(null)\n }, 3500)\n }\n }, [commits, getLog, handleSelectCommit, sessionId, t])\n\n // Create Tag\n const handleCreateTag = useCallback(async () => {\n const name = newTagName.trim()\n if (!name) {\n alert('请输入标签名称')\n return\n }\n const targetCommit = newTagCommit.trim() || undefined\n const message = newTagMessage.trim() || undefined\n const res = await createTag(sessionId, name, targetCommit, message)\n if (res.success) {\n setCreatingTag(false)\n setNewTagName('')\n setNewTagCommit('')\n setNewTagMessage('')\n await refresh()\n } else {\n alert(res.message || '创建标签失败')\n }\n }, [createTag, newTagCommit, newTagMessage, newTagName, refresh, sessionId])\n\n // Delete Tag\n const handleDeleteTag = useCallback(async (tagName: string) => {\n if (confirm(t('tag.deleteConfirm', { name: tagName }))) {\n const res = await deleteTag(sessionId, tagName)\n if (res.success) {\n await refresh()\n } else {\n alert(res.message || '删除标签失败')\n }\n }\n }, [deleteTag, refresh, sessionId, t])\n\n // Filtered branches for branch tab\n const filteredLocalBranches = useMemo(() => {\n if (!branches?.local) return []\n const q = branchFilter.trim().toLowerCase()\n return q ? branches.local.filter(b => b.name.toLowerCase().includes(q)) : branches.local\n }, [branches?.local, branchFilter])\n\n const filteredRemoteBranches = useMemo(() => {\n if (!branches?.remote) return []\n const q = branchFilter.trim().toLowerCase()\n return q ? branches.remote.filter(b => b.name.toLowerCase().includes(q)) : branches.remote\n }, [branches?.remote, branchFilter])\n\n // Filtered tags for tags tab\n const filteredTags = useMemo(() => {\n const q = tagFilter.trim().toLowerCase()\n if (!q) return tags\n return tags.filter(item =>\n item.name.toLowerCase().includes(q)\n || item.shortHash.toLowerCase().includes(q)\n || item.commitHash.toLowerCase().includes(q)\n || item.message.toLowerCase().includes(q)\n || item.author.toLowerCase().includes(q),\n )\n }, [tags, tagFilter])\n\n // Filtered commits for tree tab\n const filteredCommits = useMemo(() => {\n let list = commits\n if (filterMode === 'mainline') {\n list = list.filter(c => (c.lane ?? 0) === 0)\n }\n const q = treeSearch.trim().toLowerCase()\n if (q) {\n list = list.filter(c =>\n c.subject.toLowerCase().includes(q)\n || c.hash.toLowerCase().includes(q)\n || c.shortHash.toLowerCase().includes(q)\n || c.author.toLowerCase().includes(q)\n || (c.refs && c.refs.some(r => r.toLowerCase().includes(q))),\n )\n }\n return list\n }, [commits, filterMode, treeSearch])\n\n // Load more commits\n const handleLoadMore = useCallback(async () => {\n setLoading(true)\n try {\n const nextCount = commits.length + 50\n const more = await getLog(sessionId, nextCount)\n setCommits(more)\n } finally {\n setLoading(false)\n }\n }, [commits.length, getLog, sessionId])\n\n // Dynamic graph column width and DAG topology model\n const dagGraph = useMemo(() => computeDagGraph(filteredCommits), [filteredCommits])\n const graphColWidth = dagGraph.graphWidth\n\n if (!status || !status.isRepo) {\n return (\n <div className={css.root}>\n <div className={css.emptyState}>\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5v-9zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8V1.5z\" />\n </svg>\n <div>{t('status.notRepo')}</div>\n </div>\n </div>\n )\n }\n\n const stagedCount = status.staged.length\n const unstagedCount = status.unstaged.length\n const untrackedCount = status.untracked.length\n const totalChanges = status.totalChanges\n\n return (\n <div className={css.root}>\n {/* 1. Header Banner */}\n <div className={css.header}>\n <div className={css.branchInfo}>\n <span className={css.branchBadge} title={`当前分支: ${status.branch}`}>\n <svg className={css.branchIcon} width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M11.75 2.5a1.75 1.75 0 1 0-2.45 1.606V6.5a1.5 1.5 0 0 1-1.5 1.5H5.8A2.75 2.75 0 0 0 3.5 6.25V4.106a1.75 1.75 0 1 0-1.5 0v7.788a1.75 1.75 0 1 0 1.5 0V8.25A1.25 1.25 0 0 1 4.75 7h3a3 3 0 0 0 3-3V4.106a1.75 1.75 0 0 0 1-1.606z\" />\n </svg>\n {status.branch || 'HEAD'}\n </span>\n {(status.ahead > 0 || status.behind > 0) && (\n <div className={css.statusAheadBehind}>\n {status.ahead > 0 && <span className={css.aheadText}>↑{status.ahead}</span>}\n {status.behind > 0 && <span className={css.behindText}>↓{status.behind}</span>}\n </div>\n )}\n </div>\n\n <div className={css.headerActions}>\n <button\n type=\"button\"\n className={css.iconButton}\n title={t('actions.fetch')}\n onClick={() => { void fetchGit(sessionId).then(() => refresh()) }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M1.75 3a.75.75 0 0 0 0 1.5h8.5a3.25 3.25 0 0 1 3.25 3.25v2.44l1.72-1.72a.75.75 0 1 1 1.06 1.06l-3 3a.75.75 0 0 1-1.06 0l-3-3a.75.75 0 1 1 1.06-1.06l1.72 1.72V7.75A1.75 1.75 0 0 0 10.25 6H1.75a.75.75 0 0 0 0-1.5z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className={css.iconButton}\n title=\"拉取 (Pull)\"\n onClick={() => { void pull(sessionId).then(() => refresh()) }}\n >\n\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M13.03 8.22a.75.75 0 0 1 0 1.06l-4.5 4.5a.75.75 0 0 1-1.06 0l-4.5-4.5a.75.75 0 0 1 1.06-1.06L7.5 11.69V2.75a.75.75 0 0 1 1.5 0v8.94l3.47-3.47a.75.75 0 0 1 1.06 0z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className={css.iconButton}\n title=\"推送 (Push)\"\n onClick={() => { void push(sessionId).then(() => refresh()) }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2.97 7.78a.75.75 0 0 1 0-1.06l4.5-4.5a.75.75 0 0 1 1.06 0l4.5 4.5a.75.75 0 1 1-1.06 1.06L8.5 4.31v8.94a.75.75 0 0 1-1.5 0V4.31L3.53 7.78a.75.75 0 0 1-1.06 0z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className={`${css.iconButton} ${loading ? css.spinning : ''}`}\n title=\"刷新\"\n onClick={() => { void refresh() }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M1.705 8.005a.75.75 0 0 1 .834.656 5.5 5.5 0 0 0 9.592 2.97l-1.204-1.204a.25.25 0 0 1 .177-.427h3.646a.25.25 0 0 1 .25.25v3.646a.25.25 0 0 1-.427.177l-1.38-1.38A7.002 7.002 0 0 1 1.05 8.84a.75.75 0 0 1 .655-.835zm12.59-1.01a.75.75 0 0 1-.834-.656 5.5 5.5 0 0 0-9.592-2.97l1.204 1.204a.25.25 0 0 1-.177.427H1.25a.25.25 0 0 1-.25-.25V1.104a.25.25 0 0 1 .427-.177l1.38 1.38A7.002 7.002 0 0 1 14.95 7.16a.75.75 0 0 1-.655.835z\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* 2. Tabs Bar */}\n <div className={css.tabs}>\n <button\n type=\"button\"\n className={`${css.tab} ${activeTab === 'changes' ? css.tabActive : ''}`}\n onClick={() => { setActiveTab('changes') }}\n >\n {t('tabs.changes')}\n {totalChanges > 0 && <span className={css.tabCount}>{totalChanges}</span>}\n </button>\n <button\n type=\"button\"\n className={`${css.tab} ${activeTab === 'tree' ? css.tabActive : ''}`}\n onClick={() => { setActiveTab('tree') }}\n >\n {t('tabs.tree')}\n <span className={css.tabCount}>{commits.length}</span>\n </button>\n <button\n type=\"button\"\n className={`${css.tab} ${activeTab === 'branches' ? css.tabActive : ''}`}\n onClick={() => { setActiveTab('branches') }}\n >\n {t('tabs.branches')}\n </button>\n <button\n type=\"button\"\n className={`${css.tab} ${activeTab === 'tags' ? css.tabActive : ''}`}\n onClick={() => { setActiveTab('tags') }}\n >\n {t('tabs.tags')}\n {tags.length > 0 && <span className={css.tabCount}>{tags.length}</span>}\n </button>\n </div>\n\n {locatedNotice && (\n <div style={{\n padding: '6px 12px',\n background: 'color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent)',\n color: 'var(--dsw-alias-state-business-primary)',\n fontSize: '11px',\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n borderBottom: '0.5px solid var(--dsw-alias-border-l2)',\n }}>\n <span>🎯</span>\n <span>{locatedNotice}</span>\n </div>\n )}\n\n {/* 3. Main Content Panes */}\n <div className={css.content}>\n {/* TAB 1: Local Changes */}\n {activeTab === 'changes' && (\n <>\n {totalChanges === 0 ? (\n <div className={css.emptyState}>\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0z\" />\n </svg>\n <div>{t('status.clean')}</div>\n </div>\n ) : (\n <>\n {/* 1.1 Staged Changes */}\n {stagedCount > 0 && (\n <div className={css.section}>\n <div className={css.sectionHeader}>\n <div className={css.sectionTitle}>\n <span className={`${css.statusBadge} ${css.statusA}`}>✓</span>\n <span>{t('status.staged')} ({stagedCount})</span>\n </div>\n <div className={css.sectionActions}>\n <button\n type=\"button\"\n className={css.actionTextBtn}\n title={t('actions.unstageAll')}\n onClick={() => { void handleUnstage('all') }}\n >\n 全部取消暂存\n </button>\n </div>\n </div>\n <div className={css.fileList}>\n {status.staged.map(f => (\n <div\n key={`staged-${f.path}`}\n className={css.fileItem}\n onClick={() => { void handleViewDiff(f.path, true) }}\n >\n <div className={css.fileLeft}>\n <span className={`${css.statusBadge} ${css.statusA}`}>\n {f.status[0]?.toUpperCase() ?? 'M'}\n </span>\n <span className={css.fileName}>{f.path}</span>\n </div>\n <div className={css.fileItemActions}>\n <button\n type=\"button\"\n className={css.fileMiniBtn}\n title={t('actions.unstage')}\n onClick={(e) => {\n e.stopPropagation()\n void handleUnstage([f.path])\n }}\n >\n -\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* 1.2 Unstaged Changes */}\n {unstagedCount > 0 && (\n <div className={css.section}>\n <div className={css.sectionHeader}>\n <div className={css.sectionTitle}>\n <span className={`${css.statusBadge} ${css.statusM}`}>M</span>\n <span>{t('status.unstaged')} ({unstagedCount})</span>\n </div>\n <div className={css.sectionActions}>\n <button\n type=\"button\"\n className={css.actionTextBtn}\n title={t('actions.stageAll')}\n onClick={() => { void handleStage('all') }}\n >\n 全部暂存\n </button>\n </div>\n </div>\n <div className={css.fileList}>\n {status.unstaged.map(f => (\n <div\n key={`unstaged-${f.path}`}\n className={css.fileItem}\n onClick={() => { void handleViewDiff(f.path, false) }}\n >\n <div className={css.fileLeft}>\n <span className={`${css.statusBadge} ${css.statusM}`}>\n {f.status[0]?.toUpperCase() ?? 'M'}\n </span>\n <span className={css.fileName}>{f.path}</span>\n </div>\n <div className={css.fileItemActions}>\n <button\n type=\"button\"\n className={css.fileMiniBtn}\n title={t('actions.stage')}\n onClick={(e) => {\n e.stopPropagation()\n void handleStage([f.path])\n }}\n >\n +\n </button>\n <button\n type=\"button\"\n className={css.fileMiniBtn}\n title={t('actions.discard')}\n onClick={(e) => {\n e.stopPropagation()\n void handleDiscard([f.path])\n }}\n >\n ↺\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* 1.3 Untracked Files */}\n {untrackedCount > 0 && (\n <div className={css.section}>\n <div className={css.sectionHeader}>\n <div className={css.sectionTitle}>\n <span className={`${css.statusBadge} ${css.statusU}`}>?</span>\n <span>{t('status.untracked')} ({untrackedCount})</span>\n </div>\n </div>\n <div className={css.fileList}>\n {status.untracked.map(f => (\n <div\n key={`untracked-${f.path}`}\n className={css.fileItem}\n onClick={() => { void handleViewDiff(f.path, false) }}\n >\n <div className={css.fileLeft}>\n <span className={`${css.statusBadge} ${css.statusU}`}>?</span>\n <span className={css.fileName}>{f.path}</span>\n </div>\n <div className={css.fileItemActions}>\n <button\n type=\"button\"\n className={css.fileMiniBtn}\n title={t('actions.stage')}\n onClick={(e) => {\n e.stopPropagation()\n void handleStage([f.path])\n }}\n >\n +\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* 1.4 Commit Console (IDEA Style) */}\n <div className={css.commitBox}>\n <textarea\n className={css.commitTextarea}\n placeholder={t('commit.placeholder')}\n value={commitMessage}\n onChange={(e) => { setCommitMessage(e.target.value) }}\n onKeyDown={handleCommitKeyDown}\n />\n <div className={css.commitButtonRow}>\n <button\n type=\"button\"\n className={css.commitPushBtn}\n disabled={committing || stagedCount === 0}\n onClick={() => { void handleCommit(true) }}\n >\n {t('actions.commitAndPush')}\n </button>\n <button\n type=\"button\"\n className={css.commitBtn}\n disabled={committing || stagedCount === 0}\n onClick={() => { void handleCommit(false) }}\n >\n {t('actions.commit')}\n </button>\n </div>\n </div>\n </>\n )}\n\n {/* Active File Diff Inspector */}\n {selectedFileDiff && (\n <div style={{ marginTop: '8px' }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '4px' }}>\n <span style={{ fontSize: '11px', fontWeight: 600 }}>差异对比: {selectedFileDiff.path}</span>\n <button\n type=\"button\"\n className={css.actionTextBtn}\n onClick={() => { setSelectedFileDiff(null) }}\n >\n 关闭\n </button>\n </div>\n <DiffViewer diffText={selectedFileDiff.diff} />\n </div>\n )}\n </>\n )}\n\n {/* TAB 2: DAG Topology Tree & Log (Workstation Grade) */}\n {activeTab === 'tree' && (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n flex: '1 1 auto',\n minHeight: 0,\n overflow: 'hidden',\n }}>\n {/* Top Filter and Mainline Toggle Bar */}\n <div className={css.treeFilterRow}>\n <input\n className={css.treeSearchInput}\n placeholder={t('tree.searchPlaceholder')}\n value={treeSearch}\n onChange={(e) => { setTreeSearch(e.target.value) }}\n />\n <div className={css.mainlineToggleGroup}>\n <button\n type=\"button\"\n className={`${css.mainlineToggleBtn} ${filterMode === 'all' ? css.mainlineToggleBtnActive : ''}`}\n onClick={() => { setFilterMode('all') }}\n >\n {t('tree.filterAll')}\n </button>\n <button\n type=\"button\"\n className={`${css.mainlineToggleBtn} ${filterMode === 'mainline' ? css.mainlineToggleBtnActive : ''}`}\n onClick={() => { setFilterMode('mainline') }}\n >\n {t('tree.filterMainline')}\n </button>\n </div>\n </div>\n\n {/* Main Workstation Layout: Table on left, Details on right */}\n <div\n className={css.workstationLayout}\n style={{ '--git-graph-col-width': `${graphColWidth}px` } as Record<string, string>}\n >\n <div className={css.tablePane}>\n {/* Columnar Grid Table Header */}\n <div className={css.treeTableHeader}>\n <span className={css.colHeaderTitle}>{t('tree.colGraph')}</span>\n <span className={css.colHeaderTitle}>{t('tree.colSubject')}</span>\n <span className={css.colHeaderTitle}>{t('tree.colAuthor')}</span>\n <span className={css.colHeaderTitle}>{t('tree.colTime')}</span>\n <span className={css.colHeaderTitle}>{t('tree.colSha')}</span>\n </div>\n\n {/* Rows List */}\n <div className={css.treeContainer} style={{ position: 'relative' }}>\n {/* Global Continuous SVG Graph Layer (IntelliJ IDEA Grade) */}\n <svg\n className={css.graphOverlaySvg}\n style={{\n width: `${graphColWidth}px`,\n height: `${filteredCommits.length * 28}px`,\n }}\n >\n {/* Continuous Edges (Trunk & Branch Bezier Rails) */}\n {dagGraph.edges.map(e => (\n <path\n key={e.key}\n d={e.d}\n stroke={e.color}\n strokeWidth={2}\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n ))}\n\n {/* Nodes (Centered on (x, y)) */}\n {dagGraph.nodes.map((n) => {\n const isHighlighted = highlightedCommitHash === n.hash\n return (\n <g key={n.hash}>\n {isHighlighted && (\n <circle\n cx={n.x}\n cy={n.y}\n r={8.5}\n className={css.locateGlowRing}\n />\n )}\n\n {n.hasTag && (\n <circle\n cx={n.x}\n cy={n.y}\n r={6.5}\n stroke=\"#f0883e\"\n strokeWidth={1.5}\n fill=\"none\"\n opacity={0.9}\n />\n )}\n\n {n.isHead && !n.hasTag && (\n <circle\n cx={n.x}\n cy={n.y}\n r={6.5}\n stroke={n.color}\n strokeWidth={1.5}\n fill=\"none\"\n opacity={0.8}\n />\n )}\n\n <circle\n cx={n.x}\n cy={n.y}\n r={4}\n fill={n.color}\n />\n </g>\n )\n })}\n </svg>\n\n {filteredCommits.map((c) => {\n const isSelected = selectedCommitHash === c.hash\n const isHighlighted = highlightedCommitHash === c.hash\n const parsed = parseConventionalCommit(c.subject)\n const avatar = getAuthorAvatar(c.author)\n\n return (\n <div\n key={c.hash}\n id={`git-commit-${c.hash}`}\n className={[\n css.treeRowGrid,\n isSelected ? css.treeRowGridSelected : '',\n isHighlighted ? css.treeRowHighlighted : '',\n ].filter(Boolean).join(' ')}\n onClick={() => { void handleSelectCommit(c.hash) }}\n >\n {/* Col 1: Empty Graph Column Spacer */}\n <div style={{ width: `${graphColWidth}px`, height: 28, flexShrink: 0 }} />\n\n {/* Col 2: Subject & Ref Badges & Conventional Commits */}\n <div className={css.subjectCol}>\n {c.refs?.map((ref, idx) => {\n let refClass = css.refBranch\n let refText = ref\n if (ref.startsWith('tag: ')) {\n refClass = css.refTag\n refText = `🏷️ ${ref.slice(5)}`\n } else if (ref.includes('HEAD')) {\n refClass = css.refHead\n } else if (ref.startsWith('origin/')) {\n refClass = css.refRemote\n }\n return (\n <span key={idx} className={`${css.refBadge} ${refClass}`} title={ref}>\n {refText}\n </span>\n )\n })}\n {parsed.type && (\n <span className={`${css.typeBadge} ${getTypeBadgeClass(parsed.type)}`}>\n {parsed.type}\n </span>\n )}\n <span className={css.treeSubject} title={c.subject}>\n {c.subject}\n </span>\n\n {/* Hover Actions */}\n <div className={css.treeRowActions} onClick={(e) => { e.stopPropagation() }}>\n <button\n type=\"button\"\n className={css.treeActionBtn}\n title=\"复制完整 SHA\"\n onClick={() => {\n void navigator.clipboard.writeText(c.hash)\n }}\n >\n SHA\n </button>\n <button\n type=\"button\"\n className={css.treeActionBtn}\n title=\"在此提交新建 Tag\"\n onClick={() => {\n setNewTagCommit(c.shortHash)\n setCreatingTag(true)\n setActiveTab('tags')\n }}\n >\n 🏷️\n </button>\n <button\n type=\"button\"\n className={css.treeActionBtn}\n title=\"在此提交新建分支\"\n onClick={() => {\n setCreatingBranch(true)\n setActiveTab('branches')\n }}\n >\n ⑂\n </button>\n </div>\n </div>\n\n {/* Col 3: Author with avatar initial */}\n <div className={css.authorCol} title={c.author}>\n <span className={css.authorAvatar} style={{ background: avatar.color }}>\n {avatar.initial}\n </span>\n <span className={css.authorNameText}>{c.author}</span>\n </div>\n\n {/* Col 4: Time */}\n <span className={css.timeCol} title={c.date}>\n {c.relativeDate}\n </span>\n\n {/* Col 5: Commit Short Hash */}\n <span className={css.shaCol} title={c.hash}>\n {c.shortHash}\n </span>\n </div>\n )\n })}\n </div>\n </div>\n\n {/* Right Details Panel: Commit Details & Changed Files (Matching Reference Image) */}\n {commitDetail && (\n <div className={css.detailsPane}>\n <div className={css.detailsHeader}>\n <span>{t('detail.title')}</span>\n <button\n type=\"button\"\n className={css.iconButton}\n title=\"关闭详情\"\n onClick={() => {\n setSelectedCommitHash(null)\n setCommitDetail(null)\n }}\n >\n ✕\n </button>\n </div>\n\n <div className={css.detailsContent}>\n {/* Commit Subject Title */}\n <div className={css.detailsSubject}>\n {commitDetail.commit.subject}\n </div>\n\n {/* Commit Body Description */}\n {commitDetail.body && (\n <div className={css.detailsBody}>\n {commitDetail.body}\n </div>\n )}\n\n {/* References */}\n {commitDetail.commit.refs && commitDetail.commit.refs.length > 0 && (\n <div>\n <div className={css.detailsSectionTitle}>{t('detail.references')}</div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '4px' }}>\n {commitDetail.commit.refs.map((ref, idx) => {\n let refClass = css.refBranch\n let refText = ref\n if (ref.startsWith('tag: ')) {\n refClass = css.refTag\n refText = `🏷️ ${ref.slice(5)}`\n } else if (ref.includes('HEAD')) {\n refClass = css.refHead\n } else if (ref.startsWith('origin/')) {\n refClass = css.refRemote\n }\n return (\n <span key={idx} className={`${css.refBadge} ${refClass}`}>\n {refText}\n </span>\n )\n })}\n </div>\n </div>\n )}\n\n {/* Meta Properties Grid */}\n <div className={css.detailsMetaGrid}>\n <div className={css.detailsMetaRow}>\n <span className={css.detailsMetaLabel}>{t('detail.author')}</span>\n <span className={css.authorCol} style={{ maxWidth: '180px' }}>\n {(() => {\n const av = getAuthorAvatar(commitDetail.commit.author)\n return (\n <>\n <span className={css.authorAvatar} style={{ background: av.color }}>\n {av.initial}\n </span>\n <span className={css.authorNameText}>\n {commitDetail.commit.author}\n </span>\n </>\n )\n })()}\n </span>\n </div>\n <div className={css.detailsMetaRow}>\n <span className={css.detailsMetaLabel}>{t('detail.date')}</span>\n <span className={css.detailsMetaVal}>\n {formatFullDate(commitDetail.commit.date)}\n </span>\n </div>\n <div className={css.detailsMetaRow}>\n <span className={css.detailsMetaLabel}>Commit SHA</span>\n <span\n className={css.tagShaPill}\n title=\"点击复制完整 SHA\"\n onClick={() => {\n void navigator.clipboard.writeText(commitDetail.commit.hash)\n }}\n >\n {commitDetail.commit.hash.slice(0, 13)}\n </span>\n </div>\n {commitDetail.parents && commitDetail.parents.length > 0 && (\n <div className={css.detailsMetaRow}>\n <span className={css.detailsMetaLabel}>{t('detail.parent')}</span>\n <div style={{ display: 'flex', gap: '4px' }}>\n {commitDetail.parents.map(p => (\n <span\n key={p}\n className={css.detailsParentLink}\n title={`定位到父提交: ${p}`}\n onClick={() => { void handleLocateCommit(p) }}\n >\n {p.slice(0, 10)}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Changed Files */}\n <div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '6px' }}>\n <span style={{ fontSize: '11px', fontWeight: 600 }}>\n 变更文件 ({commitDetail.files.length} 个文件)\n </span>\n <span className={css.numstat}>\n <span className={css.addStat}>+{commitDetail.totalAdditions}</span>\n <span className={css.delStat}>-{commitDetail.totalDeletions}</span>\n </span>\n </div>\n <div className={css.detailFilesList}>\n {commitDetail.files.map(f => (\n <div\n key={f.path}\n className={css.detailFileItem}\n onClick={() => { void handleViewDiff(f.path, false, commitDetail.commit.hash) }}\n >\n <div className={css.fileLeft}>\n <span\n className={`${css.statusBadge} ${\n f.status === 'added' ? css.statusA : f.status === 'deleted' ? css.statusD : css.statusM\n }`}\n >\n {f.status[0]?.toUpperCase() ?? 'M'}\n </span>\n <span className={css.fileName}>{f.path}</span>\n </div>\n <span className={css.numstat}>\n <span className={css.addStat}>+{f.additions}</span>\n <span className={css.delStat}>-{f.deletions}</span>\n </span>\n </div>\n ))}\n </div>\n </div>\n\n {/* Diff Preview if selected file */}\n {selectedFileDiff && (\n <div style={{ marginTop: '6px' }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '4px' }}>\n <span style={{ fontSize: '11px', fontWeight: 600 }}>差异: {selectedFileDiff.path}</span>\n <button\n type=\"button\"\n className={css.actionTextBtn}\n onClick={() => { setSelectedFileDiff(null) }}\n >\n 关闭\n </button>\n </div>\n <DiffViewer diffText={selectedFileDiff.diff} />\n </div>\n )}\n\n {/* Bottom Actions */}\n <div className={css.detailsBottomActions}>\n <button\n type=\"button\"\n className={css.actionTextBtn}\n style={{ flex: 1, padding: '5px' }}\n onClick={() => {\n void handleCheckoutBranch(commitDetail.commit.shortHash)\n }}\n >\n {t('detail.checkout')}\n </button>\n <button\n type=\"button\"\n className={css.commitBtn}\n style={{ flex: 1, padding: '5px' }}\n onClick={() => {\n setNewTagCommit(commitDetail.commit.shortHash)\n setCreatingTag(true)\n setActiveTab('tags')\n }}\n >\n {t('detail.createBranchOrTag')}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Bottom Status Footer (Sync Status & Commit Stats) */}\n <div className={css.treeStatusFooter}>\n <div className={css.footerSyncStatus}>\n <span className={css.syncDot} />\n <span>\n {status.ahead === 0 && status.behind === 0\n ? t('footer.syncNormal')\n : status.ahead > 0\n ? t('footer.ahead', { count: status.ahead })\n : t('footer.behind', { count: status.behind })}\n </span>\n </div>\n <div className={css.footerStats}>\n <span>\n {t('footer.showingCount', {\n count: filteredCommits.length,\n total: status.totalCommitsCount ?? commits.length,\n })}\n </span>\n {status.totalCommitsCount && commits.length < status.totalCommitsCount && (\n <span className={css.loadMoreLink} onClick={() => { void handleLoadMore() }}>\n {t('footer.loadMore')}\n </span>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* TAB 3: Branches */}\n {activeTab === 'branches' && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {/* Search and New Branch bar */}\n <div style={{ display: 'flex', gap: '6px' }}>\n <input\n className={css.commitTextarea}\n style={{ minHeight: '30px', height: '30px', padding: '4px 8px' }}\n placeholder={t('branch.filter')}\n value={branchFilter}\n onChange={(e) => { setBranchFilter(e.target.value) }}\n />\n <button\n type=\"button\"\n className={css.actionTextBtn}\n style={{ flexShrink: 0 }}\n onClick={() => { setCreatingBranch(prev => !prev) }}\n >\n + 新建分支\n </button>\n </div>\n\n {creatingBranch && (\n <div style={{ display: 'flex', gap: '6px' }}>\n <input\n autoFocus\n className={css.commitTextarea}\n style={{ minHeight: '30px', height: '30px', padding: '4px 8px' }}\n placeholder=\"新分支名称...\"\n value={newBranchName}\n onChange={(e) => { setNewBranchName(e.target.value) }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n const trimmed = newBranchName.trim()\n if (trimmed) void handleCheckoutBranch(trimmed, true)\n }\n }}\n />\n <button\n type=\"button\"\n className={css.commitBtn}\n onClick={() => {\n const trimmed = newBranchName.trim()\n if (trimmed) void handleCheckoutBranch(trimmed, true)\n }}\n >\n 创建并检出\n </button>\n </div>\n )}\n\n {/* Local Branches */}\n <div className={css.section}>\n <div className={css.sectionHeader}>\n <span>本地分支 ({filteredLocalBranches.length})</span>\n </div>\n <div className={css.fileList}>\n {filteredLocalBranches.map(b => (\n <div\n key={b.name}\n className={css.fileItem}\n style={{ background: b.isCurrent ? 'rgba(56, 139, 253, 0.15)' : undefined }}\n onClick={() => {\n if (!b.isCurrent) void handleCheckoutBranch(b.name)\n }}\n >\n <div className={css.fileLeft}>\n <span style={{ color: b.isCurrent ? '#388bfd' : 'inherit' }}>\n {b.isCurrent ? '●' : '○'}\n </span>\n <span style={{ fontWeight: b.isCurrent ? 600 : 400 }}>{b.name}</span>\n </div>\n {b.isCurrent && <span style={{ fontSize: '11px', color: '#58a6ff' }}>当前检出</span>}\n </div>\n ))}\n </div>\n </div>\n\n {/* Remote Branches */}\n {filteredRemoteBranches.length > 0 && (\n <div className={css.section}>\n <div className={css.sectionHeader}>\n <span>远程分支 ({filteredRemoteBranches.length})</span>\n </div>\n <div className={css.fileList}>\n {filteredRemoteBranches.map(b => (\n <div\n key={b.name}\n className={css.fileItem}\n onClick={() => { void handleCheckoutBranch(b.name) }}\n >\n <div className={css.fileLeft}>\n <span style={{ opacity: 0.6 }}>☁</span>\n <span>{b.name}</span>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* TAB 4: Tags (GitHub Releases/Tags Style) */}\n {activeTab === 'tags' && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {/* Search and New Tag bar */}\n <div style={{ display: 'flex', gap: '6px' }}>\n <input\n className={css.commitTextarea}\n style={{ minHeight: '30px', height: '30px', padding: '4px 8px' }}\n placeholder={t('tag.filter')}\n value={tagFilter}\n onChange={(e) => { setTagFilter(e.target.value) }}\n />\n <button\n type=\"button\"\n className={css.actionTextBtn}\n style={{ flexShrink: 0 }}\n onClick={() => { setCreatingTag(prev => !prev) }}\n >\n + {t('tag.newPrompt')}\n </button>\n </div>\n\n {/* Create Tag Form */}\n {creatingTag && (\n <div className={css.tagForm}>\n <div className={css.tagFormTitle}>{t('tag.newPrompt')}</div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <label style={{ fontSize: '11px', color: 'var(--dsw-alias-label-secondary)' }}>\n {t('tag.nameLabel')} *\n </label>\n <input\n autoFocus\n className={css.commitTextarea}\n style={{ minHeight: '28px', height: '28px', padding: '4px 8px' }}\n placeholder={t('tag.namePlaceholder')}\n value={newTagName}\n onChange={(e) => { setNewTagName(e.target.value) }}\n />\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <label style={{ fontSize: '11px', color: 'var(--dsw-alias-label-secondary)' }}>\n {t('tag.targetCommitLabel')}\n </label>\n <input\n className={css.commitTextarea}\n style={{ minHeight: '28px', height: '28px', padding: '4px 8px' }}\n placeholder=\"例如 687f282 或留空为 HEAD\"\n value={newTagCommit}\n onChange={(e) => { setNewTagCommit(e.target.value) }}\n />\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <label style={{ fontSize: '11px', color: 'var(--dsw-alias-label-secondary)' }}>\n {t('tag.messageLabel')}\n </label>\n <input\n className={css.commitTextarea}\n style={{ minHeight: '28px', height: '28px', padding: '4px 8px' }}\n placeholder={t('tag.messagePrompt')}\n value={newTagMessage}\n onChange={(e) => { setNewTagMessage(e.target.value) }}\n />\n </div>\n <div className={css.tagFormActions}>\n <button\n type=\"button\"\n className={css.actionTextBtn}\n onClick={() => { setCreatingTag(false) }}\n >\n {t('tag.cancelBtn')}\n </button>\n <button\n type=\"button\"\n className={css.commitBtn}\n onClick={() => { void handleCreateTag() }}\n >\n {t('tag.createBtn')}\n </button>\n </div>\n </div>\n )}\n\n {/* Tags Cards List */}\n {filteredTags.length === 0 ? (\n <div className={css.emptyState}>\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25v5.025zM6 4.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z\" />\n </svg>\n <div>{t('tag.empty')}</div>\n </div>\n ) : (\n <div className={css.tagList}>\n {filteredTags.map(tag => (\n <div key={tag.name} className={css.tagCard}>\n <div className={css.tagCardHeader}>\n <div className={css.tagTitleRow}>\n <span style={{ fontSize: '13px' }}>🏷️</span>\n <span\n className={css.tagName}\n title=\"点击在图谱中定位\"\n onClick={() => { void handleLocateCommit(tag.commitHash, tag.name) }}\n >\n {tag.name}\n </span>\n <span\n className={css.tagShaPill}\n title={`Commit: ${tag.commitHash} (点击在图谱中定位)`}\n onClick={() => { void handleLocateCommit(tag.commitHash, tag.name) }}\n >\n {tag.shortHash}\n </span>\n {tag.isAnnotated && (\n <span className={css.tagAnnotatedBadge}>{t('tag.annotated')}</span>\n )}\n </div>\n <div className={css.tagActions}>\n <button\n type=\"button\"\n className={css.tagLocateBtn}\n title=\"在图谱中定位该提交\"\n onClick={() => { void handleLocateCommit(tag.commitHash, tag.name) }}\n >\n <span>🎯</span>\n <span>{t('tag.locateBtn')}</span>\n </button>\n <button\n type=\"button\"\n className={css.fileMiniBtn}\n title={t('tag.copyName')}\n onClick={() => {\n void navigator.clipboard.writeText(tag.name)\n }}\n >\n 📋\n </button>\n <button\n type=\"button\"\n className={css.fileMiniBtn}\n title={t('tag.deleteBtn')}\n onClick={() => { void handleDeleteTag(tag.name) }}\n >\n 🗑️\n </button>\n </div>\n </div>\n\n {/* Commit Message or Tag Annotation */}\n {tag.message && (\n <div className={css.tagMessage} title={tag.message}>\n {tag.message}\n </div>\n )}\n\n {/* Footer with author and date */}\n <div className={css.tagMetaFooter}>\n <span className={css.tagAuthor}>\n <span>👤</span>\n <span>{tag.author}</span>\n </span>\n <span title={tag.date}>\n {tag.relativeDate}\n </span>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )\n})\n","/**\n * Status bar Git branch pill and popover branch switcher (IDEA / VS Code style).\n * Injected into the 'conversation.composer.dock' slot at order: -1.\n */\n\nimport React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { KeyboardEvent, MouseEvent } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { GitBranchesSummary, GitStatusSummary } from '../types.ts'\nimport css from './GitBranchPill.module.css'\n\nconst MenuSurface = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ children, className, style, ...rest }, ref) => (\n <div ref={ref} className={className} style={style} role=\"dialog\" {...rest}>\n {children}\n </div>\n ),\n)\nMenuSurface.displayName = 'MenuSurface'\n\nfunction IconBranchOutlineRegular({ className }: { className?: string }): React.ReactElement {\n return (\n <svg className={className} width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M11.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5zm-2.25.75a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.492 2.492 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25zM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5zM3.5 3.25a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0z\" />\n </svg>\n )\n}\n\nfunction IconCheckOutlineRegular({ className }: { className?: string }): React.ReactElement {\n return (\n <svg className={className} width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 8 7 12 13 4\" />\n </svg>\n )\n}\n\nfunction IconPlusOutlineRegular({ className }: { className?: string }): React.ReactElement {\n return (\n <svg className={className} width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"13\" />\n <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" />\n </svg>\n )\n}\n\nfunction IconRefreshOutlineRegular({ className }: { className?: string }): React.ReactElement {\n return (\n <svg className={className} width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M2.5 8a5.5 5.5 0 1 0 1.6-3.9L2 6\" />\n <path d=\"M2 2v4h4\" />\n </svg>\n )\n}\n\nfunction IconSearchOutlineRegular({ className }: { className?: string }): React.ReactElement {\n return (\n <svg className={className} width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\">\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" />\n <line x1=\"10.5\" y1=\"10.5\" x2=\"14\" y2=\"14\" />\n </svg>\n )\n}\n\n\nexport interface GitBranchPillProps {\n getStatus?: ((sessionId?: string) => Promise<GitStatusSummary>) | undefined\n getBranches?: ((sessionId?: string) => Promise<GitBranchesSummary>) | undefined\n checkout?: (\n (sessionId: string | undefined, branch: string, create?: boolean) => Promise<{ success: boolean; message?: string }>\n ) | undefined\n pull?: ((sessionId?: string) => Promise<{ success: boolean; message?: string }>) | undefined\n push?: ((sessionId?: string) => Promise<{ success: boolean; message?: string }>) | undefined\n sessionId?: string | undefined\n}\n\n/**\n * Git Branch Pill rendered in the Composer Dock.\n */\nexport const GitBranchPill = memo(function GitBranchPill({\n getStatus,\n getBranches,\n checkout,\n pull,\n push,\n sessionId,\n}: GitBranchPillProps) {\n const [status, setStatus] = useState<GitStatusSummary | null>(null)\n const [branches, setBranches] = useState<GitBranchesSummary | null>(null)\n const [open, setOpen] = useState(false)\n const [filter, setFilter] = useState('')\n const [creatingBranch, setCreatingBranch] = useState(false)\n const [newBranchName, setNewBranchName] = useState('')\n const [switching, setSwitching] = useState(false)\n\n const anchorRef = useRef<HTMLSpanElement>(null)\n const popoverRef = useRef<HTMLDivElement>(null)\n const [popoverPos, setPopoverPos] = useState<{ bottom: number; left: number } | null>(null)\n\n // Fetch status and branches from injected actions\n const refresh = useCallback(async () => {\n if (!getStatus || !getBranches) return\n\n try {\n const [statusRes, branchRes] = await Promise.all([\n getStatus(sessionId),\n getBranches(sessionId),\n ])\n setStatus(statusRes)\n setBranches(branchRes)\n } catch {\n // safe fallback on communication errors\n }\n }, [getStatus, getBranches, sessionId])\n\n useEffect(() => {\n void refresh()\n const timer = setInterval(() => { void refresh() }, 5000)\n return () => { clearInterval(timer) }\n }, [refresh])\n\n // Recalculate popover position relative to anchor button\n const updatePosition = useCallback(() => {\n if (!anchorRef.current) return\n const rect = anchorRef.current.getBoundingClientRect()\n setPopoverPos({\n bottom: window.innerHeight - rect.top + 6,\n left: Math.max(8, Math.min(rect.left, window.innerWidth - 330)),\n })\n }, [])\n\n const handleToggle = useCallback((e: MouseEvent) => {\n e.stopPropagation()\n if (!open) {\n updatePosition()\n void refresh()\n }\n setOpen(prev => !prev)\n setCreatingBranch(false)\n setFilter('')\n }, [open, refresh, updatePosition])\n\n // Dismiss popover on outside click or escape\n useEffect(() => {\n if (!open) return\n const onPointerDown = (e: PointerEvent) => {\n const target = e.target as Node | null\n if (popoverRef.current?.contains(target) || anchorRef.current?.contains(target)) return\n setOpen(false)\n }\n const onKeyDown = (e: globalThis.KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n\n document.addEventListener('pointerdown', onPointerDown)\n document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [open])\n\n // Checkout branch\n const handleCheckout = useCallback(async (branchName: string, create = false) => {\n if (!checkout || switching) return\n\n setSwitching(true)\n try {\n const res = await checkout(sessionId, branchName, create)\n if (res.success) {\n setOpen(false)\n setCreatingBranch(false)\n setNewBranchName('')\n await refresh()\n } else {\n alert(res.message ?? 'Checkout failed')\n }\n } finally {\n setSwitching(false)\n }\n }, [checkout, refresh, sessionId, switching])\n\n // Create new branch\n const handleCreateBranchKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n const trimmed = newBranchName.trim()\n if (trimmed) void handleCheckout(trimmed, true)\n } else if (e.key === 'Escape') {\n setCreatingBranch(false)\n }\n }, [handleCheckout, newBranchName])\n\n // Pull\n const handlePull = useCallback(async () => {\n if (!pull) return\n await pull(sessionId)\n await refresh()\n }, [pull, refresh, sessionId])\n\n // Push\n const handlePush = useCallback(async () => {\n if (!push) return\n await push(sessionId)\n await refresh()\n }, [push, refresh, sessionId])\n\n // Filtered branches\n const filteredLocal = useMemo(() => {\n if (!branches?.local) return []\n const q = filter.trim().toLowerCase()\n return q ? branches.local.filter(b => b.name.toLowerCase().includes(q)) : branches.local\n }, [branches?.local, filter])\n\n const filteredRemote = useMemo(() => {\n if (!branches?.remote) return []\n const q = filter.trim().toLowerCase()\n return q ? branches.remote.filter(b => b.name.toLowerCase().includes(q)) : branches.remote\n }, [branches?.remote, filter])\n\n if (status && !status.isRepo) {\n return null\n }\n\n const currentBranchName = status?.branch || 'master'\n\n return (\n <span ref={anchorRef} className={css.anchor} data-composer-stat=\"git-branch\">\n <button\n type=\"button\"\n className={css.pill}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n title={`Git Branch: ${currentBranchName}`}\n onClick={handleToggle}\n >\n <IconBranchOutlineRegular className={css.icon} />\n <span className={css.branchName}>{currentBranchName}</span>\n {status !== null && status.ahead > 0 && <span className={`${css.badge} ${css.badgeAhead}`}>↑{status.ahead}</span>}\n {status !== null && status.behind > 0 && <span className={`${css.badge} ${css.badgeBehind}`}>↓{status.behind}</span>}\n </button>\n\n {open && popoverPos && createPortal(\n <MenuSurface\n ref={popoverRef}\n className={css.popover}\n style={{ bottom: `${popoverPos.bottom}px`, left: `${popoverPos.left}px` }}\n >\n <div className={css.header}>\n <div className={css.searchRow}>\n <IconSearchOutlineRegular className={css.searchIcon} />\n <input\n autoFocus\n className={css.searchInput}\n placeholder=\"搜索或过滤分支...\"\n value={filter}\n onChange={(e) => { setFilter(e.target.value) }}\n />\n </div>\n\n <div className={css.actionBar}>\n <button\n type=\"button\"\n className={css.toolBtn}\n title=\"新建分支\"\n onClick={() => { setCreatingBranch(prev => !prev) }}\n >\n <IconPlusOutlineRegular className={css.btnIcon} />\n <span>新建分支</span>\n </button>\n <div className={css.toolBtnGroup}>\n <button\n type=\"button\"\n className={css.toolBtn}\n title=\"拉取 (Pull)\"\n onClick={() => { void handlePull() }}\n >\n Pull\n </button>\n <button\n type=\"button\"\n className={css.toolBtn}\n title=\"推送 (Push)\"\n onClick={() => { void handlePush() }}\n >\n Push\n </button>\n <button\n type=\"button\"\n className={css.toolBtn}\n title=\"刷新状态\"\n onClick={() => { void refresh() }}\n >\n <IconRefreshOutlineRegular className={css.btnIcon} />\n </button>\n </div>\n </div>\n\n {creatingBranch && (\n <div className={css.newBranchBox}>\n <input\n autoFocus\n className={css.newBranchInput}\n placeholder=\"新分支名称 (按 Enter 创建)...\"\n value={newBranchName}\n onChange={(e) => { setNewBranchName(e.target.value) }}\n onKeyDown={handleCreateBranchKeyDown}\n />\n </div>\n )}\n </div>\n\n <div className={css.branchList}>\n {/* Local Branches */}\n <div className={css.groupLabel}>本地分支 ({filteredLocal.length})</div>\n {filteredLocal.map(b => (\n <button\n key={b.name}\n type=\"button\"\n className={`${css.branchItem} ${b.isCurrent ? css.currentBranch : ''}`}\n disabled={switching}\n onClick={() => {\n if (!b.isCurrent) void handleCheckout(b.name)\n }}\n >\n <div className={css.branchItemLeft}>\n <IconBranchOutlineRegular className={css.itemIcon} />\n <span className={css.itemText}>{b.name}</span>\n </div>\n {b.isCurrent ? (\n <IconCheckOutlineRegular className={css.checkMark} />\n ) : (\n b.ahead !== undefined && b.ahead > 0 && <span className={css.badge}>↑{b.ahead}</span>\n )}\n </button>\n ))}\n\n {/* Remote Branches */}\n {filteredRemote.length > 0 && (\n <>\n <div className={css.groupLabel} style={{ marginTop: '6px' }}>\n 远程分支 ({filteredRemote.length})\n </div>\n {filteredRemote.map(b => (\n <button\n key={b.name}\n type=\"button\"\n className={css.branchItem}\n disabled={switching}\n onClick={() => { void handleCheckout(b.name) }}\n >\n <div className={css.branchItemLeft}>\n <IconBranchOutlineRegular className={css.itemIcon} />\n <span className={css.itemText}>{b.name}</span>\n </div>\n </button>\n ))}\n </>\n )}\n\n {filteredLocal.length === 0 && filteredRemote.length === 0 && (\n <div className={css.emptyTip}>未找到匹配的分支</div>\n )}\n </div>\n </MenuSurface>,\n document.body,\n )}\n </span>\n )\n})\n","/**\n * The Git tab's chip title in the right-sidebar header.\n */\n\nimport type { ReactNode } from 'react'\nimport css from './GitBody.module.css'\n\nexport interface GitTitleProps {\n useTabInfo: () => { tab: { title: string } }\n}\n\n/**\n * Git chip title component with branch glyph and title text.\n * @param props - Slot props including tab info hook.\n * @returns React node for tab chip.\n */\nexport function GitTitle({ useTabInfo }: GitTitleProps): ReactNode {\n const { tab } = useTabInfo()\n return (\n <span className={css.titleContainer}>\n <svg className={css.titleIcon} width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M11.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5zm-2.25.75a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.492 2.492 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25zM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5zM3.5 3.25a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0z\" />\n </svg>\n <span className={css.titleText}>{tab.title}</span>\n </span>\n )\n}\n","/**\n * Localized copy for the Git right-sidebar viewer and commands.\n */\n\nexport const NS = 'gitView'\n\nexport const zh = {\n 'type.label': 'Git',\n 'guide.title': 'Git 版本控制',\n 'guide.description': '查看项目代码变更、分支、提交历史与差异对比',\n 'shortcut.noSession': '没有激活的会话',\n 'tabs.changes': '更改',\n 'tabs.history': '提交历史',\n 'tabs.tree': '提交图谱树',\n 'tabs.branches': '分支管理',\n 'tabs.tags': '标签管理',\n 'actions.refresh': '刷新状态',\n 'actions.viewDiff': '查看差异',\n 'actions.closeDiff': '收起差异',\n 'actions.stage': '暂存',\n 'actions.unstage': '取消暂存',\n 'actions.stageAll': '全部暂存',\n 'actions.unstageAll': '全部取消暂存',\n 'actions.discard': '放弃更改',\n 'actions.commit': '提交',\n 'actions.commitAndPush': '提交并推送',\n 'actions.checkout': '检出分支',\n 'actions.newBranch': '新建分支',\n 'actions.fetch': '获取远程',\n 'actions.pull': '拉取',\n 'actions.push': '推送',\n 'commit.placeholder': '输入提交信息 (Ctrl+Enter 提交)...',\n 'commit.emptyWarning': '请输入提交说明',\n 'commit.success': '提交成功',\n 'branch.filter': '搜索过滤分支...',\n 'branch.local': '本地分支',\n 'branch.remote': '远程分支',\n 'branch.current': '当前分支',\n 'branch.newPrompt': '输入新分支名称...',\n 'branch.createAndCheckout': '创建并检出',\n 'tree.author': '作者',\n 'tree.date': '时间',\n 'tree.hash': '哈希',\n 'tree.changedFiles': '变更文件',\n 'tree.selectCommit': '点击任意提交查看详情与代码差异',\n 'status.clean': '工作树干净,无任何未提交更改',\n 'status.notRepo': '当前工作区不是 Git 仓库',\n 'status.staged': '已暂存更改',\n 'status.unstaged': '工作区修改',\n 'status.untracked': '未跟踪文件',\n 'status.ahead': '领先 {count} 个提交',\n 'status.behind': '落后 {count} 个提交',\n 'diff.additions': '+{count}',\n 'diff.deletions': '-{count}',\n 'diff.empty': '无内容变动',\n 'tag.filter': '搜索过滤标签 (名称、Hash、提交说明)...',\n 'tag.newPrompt': '新建标签 (Tag)',\n 'tag.nameLabel': '标签名称',\n 'tag.namePlaceholder': '输入标签名称 (例如 v1.0.0)...',\n 'tag.targetCommitLabel': '目标 Commit Hash (可选,留空为 HEAD)',\n 'tag.messageLabel': '说明信息 (可选附注内容)',\n 'tag.messagePrompt': '输入附注说明信息 (可选)...',\n 'tag.createBtn': '创建标签',\n 'tag.cancelBtn': '取消',\n 'tag.locateBtn': '在图谱中定位',\n 'tag.copyName': '复制标签名',\n 'tag.deleteBtn': '删除',\n 'tag.deleteConfirm': '确定要删除标签 \"{name}\" 吗?',\n 'tag.empty': '暂无任何 Git 标签',\n 'tag.annotated': '附注',\n 'tag.locatedNotice': '已定位到标签 \"{name}\" 所在的提交',\n 'actions.locate': '定位',\n 'tree.colGraph': '图谱',\n 'tree.colSubject': '提交说明与分支标记',\n 'tree.colAuthor': '作者',\n 'tree.colTime': '时间',\n 'tree.colSha': 'Commit SHA',\n 'tree.searchPlaceholder': '搜索提交说明、SHA 或作者...',\n 'tree.filterAll': '全部',\n 'tree.filterMainline': '仅主线',\n 'detail.title': '提交详情 (COMMIT DETAILS)',\n 'detail.references': '包含引用 (REFERENCES)',\n 'detail.author': '作者 (Author)',\n 'detail.date': '提交时间 (Date)',\n 'detail.parent': '父级提交 (Parent)',\n 'detail.checkout': '检出分支 (Checkout)',\n 'detail.createBranchOrTag': '创建分支 / 标签',\n 'footer.showingCount': '已显示 {count} 条提交 (共 {total} 条)',\n 'footer.loadMore': '加载更多',\n 'footer.syncNormal': '分支同步正常',\n 'footer.ahead': '本地领先 {count} 个提交',\n 'footer.behind': '落后远程 {count} 个提交',\n} satisfies Record<string, string>\n\nexport type GitViewKey = keyof typeof zh\n\nexport const en = {\n 'type.label': 'Git',\n 'guide.title': 'Git Source Control',\n 'guide.description': 'View project code changes, branches, commit log, and unified diffs',\n 'shortcut.noSession': 'No active session',\n 'tabs.changes': 'Changes',\n 'tabs.history': 'History',\n 'tabs.tree': 'Git Tree & Log',\n 'tabs.branches': 'Branches',\n 'tabs.tags': 'Tags',\n 'actions.refresh': 'Refresh status',\n 'actions.viewDiff': 'View Diff',\n 'actions.closeDiff': 'Collapse Diff',\n 'actions.stage': 'Stage',\n 'actions.unstage': 'Unstage',\n 'actions.stageAll': 'Stage All',\n 'actions.unstageAll': 'Unstage All',\n 'actions.discard': 'Discard',\n 'actions.commit': 'Commit',\n 'actions.commitAndPush': 'Commit and Push',\n 'actions.checkout': 'Checkout',\n 'actions.newBranch': 'New Branch',\n 'actions.fetch': 'Fetch',\n 'actions.pull': 'Pull',\n 'actions.push': 'Push',\n 'commit.placeholder': 'Commit message (Ctrl+Enter to commit)...',\n 'commit.emptyWarning': 'Please enter a commit message',\n 'commit.success': 'Committed successfully',\n 'branch.filter': 'Filter branches...',\n 'branch.local': 'Local Branches',\n 'branch.remote': 'Remote Branches',\n 'branch.current': 'Current Branch',\n 'branch.newPrompt': 'Enter new branch name...',\n 'branch.createAndCheckout': 'Create & Checkout',\n 'tree.author': 'Author',\n 'tree.date': 'Date',\n 'tree.hash': 'Hash',\n 'tree.changedFiles': 'Changed Files',\n 'tree.selectCommit': 'Select a commit to view details and code diff',\n 'status.clean': 'Working tree clean, no uncommitted changes',\n 'status.notRepo': 'Current workspace is not a Git repository',\n 'status.staged': 'Staged Changes',\n 'status.unstaged': 'Unstaged Changes',\n 'status.untracked': 'Untracked Files',\n 'status.ahead': '{count} ahead',\n 'status.behind': '{count} behind',\n 'diff.additions': '+{count}',\n 'diff.deletions': '-{count}',\n 'diff.empty': 'No content changes',\n 'tag.filter': 'Filter tags (name, hash, message)...',\n 'tag.newPrompt': 'New Tag',\n 'tag.nameLabel': 'Tag Name',\n 'tag.namePlaceholder': 'Enter tag name (e.g. v1.0.0)...',\n 'tag.targetCommitLabel': 'Target Commit Hash (optional, defaults to HEAD)',\n 'tag.messageLabel': 'Message (optional annotation)',\n 'tag.messagePrompt': 'Enter annotation message (optional)...',\n 'tag.createBtn': 'Create Tag',\n 'tag.cancelBtn': 'Cancel',\n 'tag.locateBtn': 'Locate in Graph',\n 'tag.copyName': 'Copy Tag Name',\n 'tag.deleteBtn': 'Delete',\n 'tag.deleteConfirm': 'Are you sure you want to delete tag \"{name}\"?',\n 'tag.empty': 'No Git tags found',\n 'tag.annotated': 'Annotated',\n 'tag.locatedNotice': 'Located commit for tag \"{name}\"',\n 'actions.locate': 'Locate',\n 'tree.colGraph': 'Graph',\n 'tree.colSubject': 'Commit Subject & References',\n 'tree.colAuthor': 'Author',\n 'tree.colTime': 'Time',\n 'tree.colSha': 'Commit SHA',\n 'tree.searchPlaceholder': 'Search subject, SHA or author...',\n 'tree.filterAll': 'All',\n 'tree.filterMainline': 'Mainline',\n 'detail.title': 'COMMIT DETAILS',\n 'detail.references': 'REFERENCES',\n 'detail.author': 'Author',\n 'detail.date': 'Date',\n 'detail.parent': 'Parent',\n 'detail.checkout': 'Checkout',\n 'detail.createBranchOrTag': 'Create Branch / Tag',\n 'footer.showingCount': 'Showing {count} commits (total {total})',\n 'footer.loadMore': 'Load more',\n 'footer.syncNormal': 'Branch in sync',\n 'footer.ahead': '{count} ahead of remote',\n 'footer.behind': '{count} behind remote',\n} satisfies Record<GitViewKey, string>\n","/**\n * Browser entry for the Git right-sidebar plugin.\n */\n\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {\n GitBranchesSummary,\n GitCommitDetail,\n GitCommitItem,\n GitDiffSummary,\n GitStatusSummary,\n GitTagItem,\n} from '../types.ts'\nimport { GIT_ID, gitDefinition } from './definition.tsx'\nimport { GitBody, type GitInjected } from './GitBody.tsx'\nimport { GitBranchPill } from './GitBranchPill.tsx'\nimport { GitTitle } from './GitTitle.tsx'\nimport { en, NS, zh } from './locales.ts'\n\nexport type { GitBodyProps, GitInjected } from './GitBody.tsx'\nexport type { GitViewKey } from './locales.ts'\n\nexport interface ConnectionHandle {\n rpc: {\n call: (\n channel: string,\n method: string,\n params?: unknown,\n ) => Promise<{ ok: true; value: unknown } | { ok: false; error: { message: string } }>\n }\n}\n\nexport interface ClientContext extends Context {\n locale?: any\n sidebarRightTabs?: any\n sidebarRight?: any\n slots?: any\n shortcuts?: any\n connection?: ConnectionHandle\n}\n\n/**\n * Required browser services.\n */\nexport const inject = ['connection', 'slots', 'locale', 'sidebarRightTabs', 'sidebarRight']\n\n/**\n * Client plugin body: registers Git tab definition, locales, shortcut, and components.\n * @param ctx - Client context carrying slots and connection services.\n */\nexport function apply(ctx: Context): void {\n const client = ctx as ClientContext\n const t = client.locale?.bind?.(NS) ?? ((key: string) => key)\n\n // Register localization dictionaries\n ctx.effect(() => client.locale?.register?.(NS, { zh, en }), 'git: locales')\n\n // Register tab definition\n ctx.effect(() => client.sidebarRightTabs?.register?.(gitDefinition(t)), 'git: tab definition')\n\n // Register shortcut command\n ctx.inject(['shortcuts'], (scope: any) => {\n scope.effect(() => scope.shortcuts?.register?.({\n id: 'workspace.git',\n label: () => t('guide.title'),\n aliases: ['workspace git', 'git', 'source control'],\n defaults: {\n 'desktop:macos': { code: 'KeyG', modifiers: ['primary', 'shift'] },\n 'desktop:windows': { code: 'KeyG', modifiers: ['primary', 'shift'] },\n 'desktop:linux': { code: 'KeyG', modifiers: ['primary', 'shift'] },\n 'web:macos': { code: 'KeyG', modifiers: ['primary', 'shift'] },\n 'web:windows': { code: 'KeyG', modifiers: ['primary', 'shift'] },\n },\n regions: ['page', 'editable', 'terminal'],\n modals: [],\n resolve: ({ target: element }: { target: any }) => {\n const target = scope.sidebarRight?.commandTarget?.(element)\n if (target === undefined) return { status: 'blocked', reason: t('shortcut.noSession') }\n return { status: 'handled', run: () => { scope.sidebarRight?.openTabFromTarget?.('git', target) } }\n },\n }), 'git: shortcut')\n })\n\n // Define RPC actions bound to Connection\n const getConnection = (): ConnectionHandle => {\n const handle = (client.get?.('connection') ?? client.connection) as ConnectionHandle | undefined\n if (!handle) throw new Error('Connection service not available')\n return handle\n }\n\n const actions: GitInjected = {\n getStatus: async (sessionId) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'status', { sessionId })\n if (!res.ok) throw new Error(res.error.message)\n return res.value as GitStatusSummary\n },\n getLog: async (sessionId, maxCount) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'log', { sessionId, maxCount })\n if (!res.ok) throw new Error(res.error.message)\n return res.value as readonly GitCommitItem[]\n },\n getCommitDetails: async (sessionId, commit) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'commitDetails', { sessionId, commit })\n if (!res.ok) throw new Error(res.error.message)\n return res.value as GitCommitDetail | undefined\n },\n getDiff: async (sessionId, options) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'diff', { sessionId, ...options })\n if (!res.ok) throw new Error(res.error.message)\n return res.value as GitDiffSummary\n },\n getBranches: async (sessionId) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'branches', { sessionId })\n if (!res.ok) throw new Error(res.error.message)\n return res.value as GitBranchesSummary\n },\n checkout: async (sessionId, branch, create) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'checkout', { sessionId, branch, create })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n stage: async (sessionId, paths) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'stage', { sessionId, paths })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n unstage: async (sessionId, paths) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'unstage', { sessionId, paths })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n discard: async (sessionId, paths) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'discard', { sessionId, paths })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n commit: async (sessionId, message) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'commit', { sessionId, message })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n fetch: async (sessionId) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'fetch', { sessionId })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n pull: async (sessionId) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'pull', { sessionId })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n push: async (sessionId) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'push', { sessionId })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n getTags: async (sessionId) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'tags', { sessionId })\n if (!res.ok) throw new Error(res.error.message)\n return res.value as readonly GitTagItem[]\n },\n createTag: async (sessionId, name, commit, message) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'createTag', { sessionId, name, commit, message })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n deleteTag: async (sessionId, name) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'deleteTag', { sessionId, name })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n }\n\n\n // Register slot implementations\n ctx.effect(() => client.slots?.inject?.('sidebar.right.pane.tab', () => client.slots.register(\n {\n name: 'sidebar.right.pane.tab',\n key: GIT_ID,\n locale: NS,\n inject: () => actions,\n },\n GitBody,\n )), 'git: tab body')\n\n ctx.effect(() => client.slots?.inject?.('sidebar.right.pane.tab.title', () => client.slots.register(\n {\n name: 'sidebar.right.pane.tab.title',\n key: GIT_ID,\n },\n GitTitle,\n )), 'git: tab title')\n\n // Register Git Branch Pill in conversation composer dock (status bar at bottom)\n ctx.effect(() => client.slots?.inject?.('conversation.composer.dock', () => client.slots.register(\n {\n name: 'conversation.composer.dock',\n id: 'git-branch',\n order: -1,\n locale: NS,\n inject: () => actions,\n },\n GitBranchPill,\n )), 'git: composer dock pill')\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["css","memo","useState","useCallback","useMemo","React","memo","useState","useRef","useCallback","useMemo","css","createPortal","css"],"sources":["../src/client/definition.tsx","../src/client/git-helpers.ts","../src/client/GitBody.tsx","../src/client/GitBranchPill.tsx","../src/client/GitTitle.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/**\n * Definition of the `git` tab type for the right Sidebar.\n */\n\nimport React from 'react'\n\n/** The tab kind this package owns */\nexport const GIT_KIND = 'git'\n\n/** Implementation identity in the tab system */\nexport const GIT_ID = '@civilization/dsh-git-workbench'\n\nexport interface SidebarRightTabGuide {\n id?: string\n commandId?: string\n order?: number\n title: () => string\n description: () => string\n icon?: () => React.ReactElement\n}\n\nexport interface SidebarRightTabDefinition {\n id: string\n kind: string\n priority?: string\n title: () => string\n guide?: SidebarRightTabGuide[]\n}\n\n/** Git artwork for the Sidebar Guide */\nexport function GuideArtworkGit(): React.ReactElement {\n return (\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"27\" stroke=\"#F05133\" strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n <path d=\"M12 21C12 18 15 15 18 15H22C23.5 15 24 14.5 24 13V12\" stroke=\"#F05133\" strokeWidth=\"2.5\" strokeLinecap=\"round\" fill=\"none\" />\n <circle cx=\"12\" cy=\"26\" r=\"3.5\" fill=\"#FFFFFF\" stroke=\"#F05133\" strokeWidth=\"2.5\" />\n <circle cx=\"12\" cy=\"10\" r=\"3.5\" fill=\"#FFFFFF\" stroke=\"#F05133\" strokeWidth=\"2.5\" />\n <circle cx=\"24\" cy=\"11\" r=\"3.5\" fill=\"#FFFFFF\" stroke=\"#3680F6\" strokeWidth=\"2.5\" />\n </svg>\n )\n}\n\n/**\n * Tab definition for the Git right-sidebar viewer.\n * @param t - namespace-bound translation function.\n * @returns Complete sidebar tab definition.\n */\nexport function gitDefinition(t: (key: string) => string): SidebarRightTabDefinition {\n return {\n id: GIT_ID,\n kind: GIT_KIND,\n priority: 'builtin',\n title: () => t('type.label'),\n guide: [{\n id: 'git',\n commandId: 'workspace.git',\n order: 15,\n title: () => t('guide.title'),\n description: () => t('guide.description'),\n icon: GuideArtworkGit,\n }],\n }\n}\n","/**\n * Conventional Commits and presentation helpers for Git commits and avatars.\n */\n\nexport type ConventionalType =\n | 'feat'\n | 'fix'\n | 'style'\n | 'refactor'\n | 'docs'\n | 'test'\n | 'chore'\n | 'release'\n | 'merge'\n | 'revert'\n\nexport interface ParsedCommitSubject {\n readonly type?: ConventionalType\n readonly scope?: string\n readonly cleanSubject: string\n}\n\n/**\n * Parse conventional commit prefix from a commit subject.\n * @param subject - Raw first line of commit message.\n * @returns Parsed type, scope, and clean subject.\n */\nexport function parseConventionalCommit(subject: string): ParsedCommitSubject {\n const trimmed = subject.trim()\n\n // Match merge commits\n if (/^merge\\s+(pull\\s+request|branch|remote-tracking\\s+branch)/i.test(trimmed)) {\n return {\n type: 'merge',\n cleanSubject: trimmed,\n }\n }\n\n // Match standard conventional commit prefix: \"type(scope): message\" or \"type: message\"\n const match = /^(feat|fix|style|refactor|docs|test|chore|release|revert)(?:\\(([^)]+)\\))?!?:\\s*(.*)$/i.exec(trimmed)\n if (match && match[1]) {\n const rawType = match[1].toLowerCase() as ConventionalType\n const scope = match[2]?.trim()\n return {\n type: rawType,\n ...scope !== undefined ? { scope } : {},\n cleanSubject: trimmed,\n }\n }\n\n return {\n cleanSubject: trimmed,\n }\n}\n\nconst AVATAR_PALETTE = [\n '#388bfd', // Blue\n '#2ea043', // Green\n '#f0883e', // Orange\n '#a371f7', // Purple\n '#db61a2', // Rose\n '#39c5bb', // Cyan\n '#f9c513', // Amber\n '#6f42c1', // Violet\n]\n\n/**\n * Deterministically compute avatar initial and background color for an author name.\n * @param author - Author name or email.\n * @returns Initial letter and hex color code.\n */\nexport function getAuthorAvatar(author: string): { initial: string; color: string } {\n const clean = author.trim()\n const initial = clean.length > 0 ? (clean[0]?.toUpperCase() ?? '?') : '?'\n\n let hash = 0\n for (let i = 0; i < clean.length; i++) {\n hash = (hash << 5) - hash + clean.charCodeAt(i)\n hash |= 0\n }\n\n const index = Math.abs(hash) % AVATAR_PALETTE.length\n const color = AVATAR_PALETTE[index] ?? '#388bfd'\n\n return { initial, color }\n}\n\n/**\n * Format date string into YYYY-MM-DD HH:mm:ss.\n * @param dateStr - ISO or Git date string.\n * @returns Clean formatted local date and time string.\n */\nexport function formatFullDate(dateStr: string): string {\n const d = new Date(dateStr)\n if (Number.isNaN(d.getTime())) return dateStr\n\n const pad = (n: number) => String(n).padStart(2, '0')\n const year = d.getFullYear()\n const month = pad(d.getMonth() + 1)\n const day = pad(d.getDate())\n const hours = pad(d.getHours())\n const minutes = pad(d.getMinutes())\n const seconds = pad(d.getSeconds())\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`\n}\n\nexport const GRAPH_LANE_PALETTE = [\n '#388bfd', // 0: Mainline Blue\n '#3fb950', // 1: Emerald Green\n '#f0883e', // 2: Coral Orange\n '#a371f7', // 3: Violet Purple\n '#58a6ff', // 4: Sky Blue\n '#bc8cff', // 5: Lavender\n '#db61a2', // 6: Magenta\n '#2ea043', // 7: Forest Green\n] as const\n\nexport interface DagNode {\n readonly hash: string\n readonly lane: number\n readonly color: string\n readonly x: number\n readonly y: number\n readonly isHead: boolean\n readonly hasTag: boolean\n}\n\nexport interface DagEdge {\n readonly key: string\n readonly fromHash: string\n readonly toHash?: string\n readonly color: string\n readonly d: string\n}\n\nexport interface DagGraphModel {\n readonly nodes: readonly DagNode[]\n readonly edges: readonly DagEdge[]\n readonly maxLane: number\n readonly graphWidth: number\n}\n\nconst ROW_HEIGHT = 28\nconst LANE_WIDTH = 16\nconst LANE_X_OFFSET = 10\n\n/**\n * Compute global continuous SVG DAG topology graph for commit items (IntelliJ IDEA grade).\n * Eliminates per-row segmentation gaps, floating nodes, and misaligned curves.\n * @param commits - Ordered commit items.\n * @returns Fully computed nodes, edges, maxLane, and width.\n */\nexport function computeDagGraph(commits: readonly {\n hash: string\n parents?: readonly string[]\n refs?: readonly string[]\n}[]): DagGraphModel {\n if (commits.length === 0) {\n return { nodes: [], edges: [], maxLane: 0, graphWidth: 36 }\n }\n\n // 1. Map commit hash -> index\n const hashToIndex = new Map<string, number>()\n commits.forEach((c, idx) => hashToIndex.set(c.hash, idx))\n\n // 2. Identify mainline (first-parent chain starting from HEAD or newest commit)\n const mainlineSet = new Set<string>()\n let curr = commits.find(c => c.refs?.some(r => r.includes('HEAD') || r === 'master' || r === 'main'))?.hash\n ?? commits[0]?.hash\n while (curr && hashToIndex.has(curr)) {\n mainlineSet.add(curr)\n const commitIdx = hashToIndex.get(curr)\n if (commitIdx === undefined) break\n const c = commits[commitIdx]\n if (!c || !c.parents || c.parents.length === 0) break\n curr = c.parents[0]\n }\n\n // 3. Assign lanes to each commit\n const activeLanes: (string | null)[] = [null]\n const commitLanes: number[] = Array.from({ length: commits.length }, () => 0)\n\n commits.forEach((c, idx) => {\n let lane = 0\n if (mainlineSet.has(c.hash)) {\n lane = 0\n for (let l = 1; l < activeLanes.length; l++) {\n if (activeLanes[l] === c.hash) activeLanes[l] = null\n }\n } else {\n let foundLane = -1\n for (let l = 1; l < activeLanes.length; l++) {\n if (activeLanes[l] === c.hash) {\n foundLane = l\n break\n }\n }\n\n if (foundLane !== -1) {\n lane = foundLane\n activeLanes[lane] = null\n } else {\n let slot = -1\n for (let l = 1; l < activeLanes.length; l++) {\n if (activeLanes[l] === null) {\n slot = l\n break\n }\n }\n if (slot !== -1) {\n lane = slot\n } else {\n lane = Math.max(1, activeLanes.length)\n while (activeLanes.length <= lane) activeLanes.push(null)\n }\n }\n }\n\n commitLanes[idx] = lane\n\n // Reserve lanes for non-mainline parents\n if (c.parents && c.parents.length > 0) {\n c.parents.forEach((parentHash, pIdx) => {\n if (mainlineSet.has(parentHash)) return\n if (activeLanes.includes(parentHash)) return\n\n if (pIdx === 0 && lane >= 1 && activeLanes[lane] === null) {\n activeLanes[lane] = parentHash\n } else {\n let slot = -1\n for (let l = 1; l < activeLanes.length; l++) {\n if (activeLanes[l] === null) {\n slot = l\n break\n }\n }\n if (slot !== -1) {\n activeLanes[slot] = parentHash\n } else {\n activeLanes.push(parentHash)\n }\n }\n })\n }\n\n while (activeLanes.length > 1 && activeLanes.at(-1) === null) {\n activeLanes.pop()\n }\n })\n\n const maxLane = Math.max(0, ...commitLanes)\n\n // 4. Compute Edges (Connections from Child -> Parent)\n const edges: DagEdge[] = []\n const processedEdges = new Set<string>()\n\n commits.forEach((c, idx) => {\n const fromLane = commitLanes[idx] ?? 0\n const x1 = fromLane * LANE_WIDTH + LANE_X_OFFSET\n const y1 = idx * ROW_HEIGHT + ROW_HEIGHT / 2\n const nodeColor = GRAPH_LANE_PALETTE[fromLane % GRAPH_LANE_PALETTE.length] ?? '#388bfd'\n\n if (!c.parents || c.parents.length === 0) return\n\n c.parents.forEach((pHash) => {\n const edgeKey = `${c.hash}->${pHash}`\n if (processedEdges.has(edgeKey)) return\n processedEdges.add(edgeKey)\n\n const pIdxInList = hashToIndex.get(pHash)\n if (pIdxInList !== undefined) {\n const toLane = commitLanes[pIdxInList] ?? 0\n const x2 = toLane * LANE_WIDTH + LANE_X_OFFSET\n const y2 = pIdxInList * ROW_HEIGHT + ROW_HEIGHT / 2\n const edgeColor = fromLane > 0\n ? nodeColor\n : (toLane > 0 ? (GRAPH_LANE_PALETTE[toLane % GRAPH_LANE_PALETTE.length] ?? nodeColor) : nodeColor)\n\n if (x1 === x2) {\n edges.push({\n key: edgeKey,\n fromHash: c.hash,\n toHash: pHash,\n color: edgeColor,\n d: `M ${x1} ${y1} L ${x2} ${y2}`,\n })\n } else if (pIdxInList === idx + 1) {\n edges.push({\n key: edgeKey,\n fromHash: c.hash,\n toHash: pHash,\n color: edgeColor,\n d: `M ${x1} ${y1} C ${x1} ${y1 + 14}, ${x2} ${y2 - 14}, ${x2} ${y2}`,\n })\n } else if (toLane === 0) {\n edges.push({\n key: edgeKey,\n fromHash: c.hash,\n toHash: pHash,\n color: edgeColor,\n d: `M ${x1} ${y1} L ${x1} ${y2 - 28} C ${x1} ${y2 - 14}, ${x2} ${y2 - 14}, ${x2} ${y2}`,\n })\n } else {\n edges.push({\n key: edgeKey,\n fromHash: c.hash,\n toHash: pHash,\n color: edgeColor,\n d: `M ${x1} ${y1} C ${x1} ${y1 + 14}, ${x2} ${y1 + 14}, ${x2} ${y1 + 28} L ${x2} ${y2}`,\n })\n }\n } else {\n const bottomY = commits.length * ROW_HEIGHT\n edges.push({\n key: edgeKey,\n fromHash: c.hash,\n color: nodeColor,\n d: `M ${x1} ${y1} L ${x1} ${bottomY}`,\n })\n }\n })\n })\n\n // 5. Compute Nodes\n const nodes: DagNode[] = commits.map((c, idx) => {\n const lane = commitLanes[idx] ?? 0\n const x = lane * LANE_WIDTH + LANE_X_OFFSET\n const y = idx * ROW_HEIGHT + ROW_HEIGHT / 2\n const color = GRAPH_LANE_PALETTE[lane % GRAPH_LANE_PALETTE.length] ?? '#388bfd'\n const isHead = Boolean(c.refs?.some(r => r.includes('HEAD') || r === 'master' || r === 'main'))\n const hasTag = Boolean(c.refs?.some(r => r.startsWith('tag: ') || r.includes('tag:')))\n\n return {\n hash: c.hash,\n lane,\n color,\n x,\n y,\n isHead,\n hasTag,\n }\n })\n\n return {\n nodes,\n edges,\n maxLane,\n graphWidth: Math.max(36, (maxLane + 1) * LANE_WIDTH + 16),\n }\n}\n","/**\n * IntelliJ IDEA-Grade Git Tool Window Component.\n * Supports DAG commit topology graph visualization, working tree staging, commit console,\n * branch switcher, and unified diff inspector.\n */\n\nimport { memo, useCallback, useEffect, useMemo, useState } from 'react'\nimport type { KeyboardEvent, ReactElement } from 'react'\nimport type {\n GitBranchesSummary,\n GitCommitDetail,\n GitCommitItem,\n GitDiffSummary,\n GitStatusSummary,\n GitTagItem,\n} from '../types.ts'\nimport {\n computeDagGraph,\n formatFullDate,\n getAuthorAvatar,\n parseConventionalCommit,\n} from './git-helpers.ts'\nimport type {} from './locales.ts'\nimport css from './GitBody.module.css'\n\nfunction getTypeBadgeClass(type?: string): string {\n switch (type) {\n case 'feat': return css.typeFeat ?? ''\n case 'fix': return css.typeFix ?? ''\n case 'style': return css.typeStyle ?? ''\n case 'refactor': return css.typeRefactor ?? ''\n case 'release': return css.typeRelease ?? ''\n case 'merge': return css.typeMerge ?? ''\n case 'test': return css.typeTest ?? ''\n case 'docs': return css.typeDocs ?? ''\n case 'revert': return css.typeRevert ?? ''\n case 'chore':\n default:\n return css.typeChore ?? ''\n }\n}\n\n\n/** Injected Git RPC methods */\nexport interface GitInjected {\n readonly getStatus: (sessionId?: string) => Promise<GitStatusSummary>\n readonly getLog: (sessionId?: string, maxCount?: number) => Promise<readonly GitCommitItem[]>\n readonly getCommitDetails: (sessionId?: string, commit?: string) => Promise<GitCommitDetail | undefined>\n readonly getDiff: (sessionId?: string, options?: { filePath?: string; staged?: boolean; commit?: string }) => Promise<GitDiffSummary>\n readonly getBranches: (sessionId?: string) => Promise<GitBranchesSummary>\n readonly checkout: (sessionId?: string, branch?: string, create?: boolean) => Promise<{ success: boolean; message?: string }>\n readonly stage: (sessionId?: string, paths?: string[] | 'all') => Promise<{ success: boolean; message?: string }>\n readonly unstage: (sessionId?: string, paths?: string[] | 'all') => Promise<{ success: boolean; message?: string }>\n readonly discard: (sessionId?: string, paths?: string[]) => Promise<{ success: boolean; message?: string }>\n readonly commit: (sessionId?: string, message?: string) => Promise<{ success: boolean; message?: string }>\n readonly fetch: (sessionId?: string) => Promise<{ success: boolean; message?: string }>\n readonly pull: (sessionId?: string) => Promise<{ success: boolean; message?: string }>\n readonly push: (sessionId?: string) => Promise<{ success: boolean; message?: string }>\n readonly getTags: (sessionId?: string) => Promise<readonly GitTagItem[]>\n readonly createTag: (\n sessionId?: string,\n name?: string,\n commit?: string,\n message?: string,\n ) => Promise<{ success: boolean; message?: string }>\n readonly deleteTag: (sessionId?: string, name?: string) => Promise<{ success: boolean; message?: string }>\n}\n\nexport interface GitBodyProps extends GitInjected {\n readonly sessionId?: string\n readonly t: (key: string, ...args: any[]) => string\n}\n\ntype ActiveTab = 'changes' | 'tree' | 'branches' | 'tags'\n\n/**\n * Render color-coded unified diff lines.\n */\nfunction DiffViewer({ diffText }: { readonly diffText: string }): ReactElement {\n if (!diffText.trim()) {\n return <div className={css.diffViewer}>无代码内容变动</div>\n }\n\n const lines = diffText.split('\\n')\n return (\n <div className={css.diffViewer}>\n {lines.map((line, idx) => {\n let lineClass = css.diffLine\n if (line.startsWith('+') && !line.startsWith('+++')) lineClass = `${css.diffLine} ${css.diffAdd}`\n else if (line.startsWith('-') && !line.startsWith('---')) lineClass = `${css.diffLine} ${css.diffDel}`\n else if (line.startsWith('@@')) lineClass = `${css.diffLine} ${css.diffHunk}`\n\n return (\n <div key={idx} className={lineClass}>\n {line || ' '}\n </div>\n )\n })}\n </div>\n )\n}\n\n\n/**\n * Main Git Body Component.\n */\nexport const GitBody = memo(function GitBody(props: GitBodyProps) {\n const {\n t,\n sessionId,\n getStatus,\n getLog,\n getCommitDetails,\n getDiff,\n getBranches,\n getTags,\n createTag,\n deleteTag,\n checkout,\n stage,\n unstage,\n discard,\n commit,\n fetch: fetchGit,\n pull,\n push,\n } = props\n\n const [activeTab, setActiveTab] = useState<ActiveTab>('changes')\n const [loading, setLoading] = useState(false)\n\n const [status, setStatus] = useState<GitStatusSummary | null>(null)\n const [commits, setCommits] = useState<readonly GitCommitItem[]>([])\n const [branches, setBranches] = useState<GitBranchesSummary | null>(null)\n const [tags, setTags] = useState<readonly GitTagItem[]>([])\n\n // Commit Console State\n const [commitMessage, setCommitMessage] = useState('')\n const [committing, setCommitting] = useState(false)\n\n // Diff Preview State\n const [selectedFileDiff, setSelectedFileDiff] = useState<{ path: string; staged: boolean; diff: string } | null>(null)\n\n // Tree Selected Commit State\n const [selectedCommitHash, setSelectedCommitHash] = useState<string | null>(null)\n const [commitDetail, setCommitDetail] = useState<GitCommitDetail | null>(null)\n\n // Locate in DAG Tree State\n const [highlightedCommitHash, setHighlightedCommitHash] = useState<string | null>(null)\n const [locatedNotice, setLocatedNotice] = useState<string | null>(null)\n\n // Tree Filter & Search State\n const [treeSearch, setTreeSearch] = useState('')\n const [filterMode, setFilterMode] = useState<'all' | 'mainline'>('all')\n\n // Branch Filter State\n const [branchFilter, setBranchFilter] = useState('')\n const [newBranchName, setNewBranchName] = useState('')\n const [creatingBranch, setCreatingBranch] = useState(false)\n\n // Tag Management State\n const [tagFilter, setTagFilter] = useState('')\n const [creatingTag, setCreatingTag] = useState(false)\n const [newTagName, setNewTagName] = useState('')\n const [newTagCommit, setNewTagCommit] = useState('')\n const [newTagMessage, setNewTagMessage] = useState('')\n\n // Fetch full repository data\n const refresh = useCallback(async () => {\n setLoading(true)\n try {\n const [statusRes, logRes, branchRes, tagRes] = await Promise.all([\n getStatus(sessionId).catch(() => null),\n getLog(sessionId, 50).catch(() => []),\n getBranches(sessionId).catch(() => null),\n getTags(sessionId).catch(() => []),\n ])\n if (statusRes) setStatus(statusRes)\n setCommits(logRes)\n if (branchRes) setBranches(branchRes)\n setTags(tagRes)\n } finally {\n setLoading(false)\n }\n }, [getBranches, getLog, getStatus, getTags, sessionId])\n\n useEffect(() => {\n void refresh()\n }, [refresh])\n\n // Inspect commit details when a tree node is clicked\n const handleSelectCommit = useCallback(async (hash: string) => {\n if (selectedCommitHash === hash) {\n setSelectedCommitHash(null)\n setCommitDetail(null)\n return\n }\n setSelectedCommitHash(hash)\n try {\n const details = await getCommitDetails(sessionId, hash)\n setCommitDetail(details ?? null)\n } catch {\n setCommitDetail(null)\n }\n }, [getCommitDetails, selectedCommitHash, sessionId])\n\n // Inspect file diff\n const handleViewDiff = useCallback(async (path: string, staged: boolean, commitHash?: string) => {\n try {\n const res = await getDiff(sessionId, {\n filePath: path,\n staged,\n ...commitHash !== undefined ? { commit: commitHash } : {},\n })\n setSelectedFileDiff({\n path,\n staged,\n diff: res.rawDiff,\n })\n } catch {\n setSelectedFileDiff(null)\n }\n }, [getDiff, sessionId])\n\n // Stage / Unstage / Discard\n const handleStage = useCallback(async (paths: string[] | 'all') => {\n await stage(sessionId, paths)\n await refresh()\n }, [refresh, sessionId, stage])\n\n const handleUnstage = useCallback(async (paths: string[] | 'all') => {\n await unstage(sessionId, paths)\n await refresh()\n }, [refresh, sessionId, unstage])\n\n const handleDiscard = useCallback(async (paths: string[]) => {\n if (confirm(`确认放弃对 ${paths.length} 个文件的所有更改吗?此操作无法撤销。`)) {\n await discard(sessionId, paths)\n await refresh()\n }\n }, [discard, refresh, sessionId])\n\n // Commit\n const handleCommit = useCallback(async (andPush = false) => {\n const trimmed = commitMessage.trim()\n if (!trimmed) {\n alert(t('commit.emptyWarning'))\n return\n }\n\n setCommitting(true)\n try {\n const res = await commit(sessionId, trimmed)\n if (res.success) {\n setCommitMessage('')\n if (andPush) {\n await push(sessionId)\n }\n await refresh()\n } else {\n alert(res.message || '提交失败')\n }\n } finally {\n setCommitting(false)\n }\n }, [commit, commitMessage, push, refresh, sessionId, t])\n\n const handleCommitKeyDown = useCallback((e: KeyboardEvent<HTMLTextAreaElement>) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault()\n void handleCommit(false)\n }\n }, [handleCommit])\n\n // Branch Switch\n const handleCheckoutBranch = useCallback(async (bName: string, create = false) => {\n const res = await checkout(sessionId, bName, create)\n if (res.success) {\n setCreatingBranch(false)\n setNewBranchName('')\n await refresh()\n } else {\n alert(res.message || '检出失败')\n }\n }, [checkout, refresh, sessionId])\n\n\n // Locate commit in DAG tree and pulse glow\n const handleLocateCommit = useCallback(async (commitHash: string, tagName?: string) => {\n setActiveTab('tree')\n let found = commits.find(c => c.hash.startsWith(commitHash) || commitHash.startsWith(c.hash))\n if (!found) {\n try {\n const deepLogs = await getLog(sessionId, 200)\n setCommits(deepLogs)\n found = deepLogs.find(c => c.hash.startsWith(commitHash) || commitHash.startsWith(c.hash))\n } catch {\n // Continue with current list\n }\n }\n\n if (found) {\n setSelectedCommitHash(found.hash)\n setHighlightedCommitHash(found.hash)\n if (tagName) {\n setLocatedNotice(t('tag.locatedNotice', { name: tagName }))\n setTimeout(() => { setLocatedNotice(null) }, 3000)\n }\n void handleSelectCommit(found.hash)\n setTimeout(() => {\n const el = document.getElementById(`git-commit-${found.hash}`)\n el?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n }, 50)\n setTimeout(() => {\n setHighlightedCommitHash(null)\n }, 3500)\n }\n }, [commits, getLog, handleSelectCommit, sessionId, t])\n\n // Create Tag\n const handleCreateTag = useCallback(async () => {\n const name = newTagName.trim()\n if (!name) {\n alert('请输入标签名称')\n return\n }\n const targetCommit = newTagCommit.trim() || undefined\n const message = newTagMessage.trim() || undefined\n const res = await createTag(sessionId, name, targetCommit, message)\n if (res.success) {\n setCreatingTag(false)\n setNewTagName('')\n setNewTagCommit('')\n setNewTagMessage('')\n await refresh()\n } else {\n alert(res.message || '创建标签失败')\n }\n }, [createTag, newTagCommit, newTagMessage, newTagName, refresh, sessionId])\n\n // Delete Tag\n const handleDeleteTag = useCallback(async (tagName: string) => {\n if (confirm(t('tag.deleteConfirm', { name: tagName }))) {\n const res = await deleteTag(sessionId, tagName)\n if (res.success) {\n await refresh()\n } else {\n alert(res.message || '删除标签失败')\n }\n }\n }, [deleteTag, refresh, sessionId, t])\n\n // Filtered branches for branch tab\n const filteredLocalBranches = useMemo(() => {\n if (!branches?.local) return []\n const q = branchFilter.trim().toLowerCase()\n return q ? branches.local.filter(b => b.name.toLowerCase().includes(q)) : branches.local\n }, [branches?.local, branchFilter])\n\n const filteredRemoteBranches = useMemo(() => {\n if (!branches?.remote) return []\n const q = branchFilter.trim().toLowerCase()\n return q ? branches.remote.filter(b => b.name.toLowerCase().includes(q)) : branches.remote\n }, [branches?.remote, branchFilter])\n\n // Filtered tags for tags tab\n const filteredTags = useMemo(() => {\n const q = tagFilter.trim().toLowerCase()\n if (!q) return tags\n return tags.filter(item =>\n item.name.toLowerCase().includes(q)\n || item.shortHash.toLowerCase().includes(q)\n || item.commitHash.toLowerCase().includes(q)\n || item.message.toLowerCase().includes(q)\n || item.author.toLowerCase().includes(q),\n )\n }, [tags, tagFilter])\n\n // Filtered commits for tree tab\n const filteredCommits = useMemo(() => {\n let list = commits\n if (filterMode === 'mainline') {\n list = list.filter(c => (c.lane ?? 0) === 0)\n }\n const q = treeSearch.trim().toLowerCase()\n if (q) {\n list = list.filter(c =>\n c.subject.toLowerCase().includes(q)\n || c.hash.toLowerCase().includes(q)\n || c.shortHash.toLowerCase().includes(q)\n || c.author.toLowerCase().includes(q)\n || (c.refs && c.refs.some(r => r.toLowerCase().includes(q))),\n )\n }\n return list\n }, [commits, filterMode, treeSearch])\n\n // Load more commits\n const handleLoadMore = useCallback(async () => {\n setLoading(true)\n try {\n const nextCount = commits.length + 50\n const more = await getLog(sessionId, nextCount)\n setCommits(more)\n } finally {\n setLoading(false)\n }\n }, [commits.length, getLog, sessionId])\n\n // Dynamic graph column width and DAG topology model\n const dagGraph = useMemo(() => computeDagGraph(filteredCommits), [filteredCommits])\n const graphColWidth = dagGraph.graphWidth\n\n if (!status || !status.isRepo) {\n return (\n <div className={css.root}>\n <div className={css.emptyState}>\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5v-9zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8V1.5z\" />\n </svg>\n <div>{t('status.notRepo')}</div>\n </div>\n </div>\n )\n }\n\n const stagedCount = status.staged.length\n const unstagedCount = status.unstaged.length\n const untrackedCount = status.untracked.length\n const totalChanges = status.totalChanges\n\n return (\n <div className={css.root}>\n {/* 1. Header Banner */}\n <div className={css.header}>\n <div className={css.branchInfo}>\n <span className={css.branchBadge} title={`当前分支: ${status.branch}`}>\n <svg className={css.branchIcon} width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M11.75 2.5a1.75 1.75 0 1 0-2.45 1.606V6.5a1.5 1.5 0 0 1-1.5 1.5H5.8A2.75 2.75 0 0 0 3.5 6.25V4.106a1.75 1.75 0 1 0-1.5 0v7.788a1.75 1.75 0 1 0 1.5 0V8.25A1.25 1.25 0 0 1 4.75 7h3a3 3 0 0 0 3-3V4.106a1.75 1.75 0 0 0 1-1.606z\" />\n </svg>\n {status.branch || 'HEAD'}\n </span>\n {(status.ahead > 0 || status.behind > 0) && (\n <div className={css.statusAheadBehind}>\n {status.ahead > 0 && <span className={css.aheadText}>↑{status.ahead}</span>}\n {status.behind > 0 && <span className={css.behindText}>↓{status.behind}</span>}\n </div>\n )}\n </div>\n\n <div className={css.headerActions}>\n <button\n type=\"button\"\n className={css.iconButton}\n title={t('actions.fetch')}\n onClick={() => { void fetchGit(sessionId).then(() => refresh()) }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M1.75 3a.75.75 0 0 0 0 1.5h8.5a3.25 3.25 0 0 1 3.25 3.25v2.44l1.72-1.72a.75.75 0 1 1 1.06 1.06l-3 3a.75.75 0 0 1-1.06 0l-3-3a.75.75 0 1 1 1.06-1.06l1.72 1.72V7.75A1.75 1.75 0 0 0 10.25 6H1.75a.75.75 0 0 0 0-1.5z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className={css.iconButton}\n title=\"拉取 (Pull)\"\n onClick={() => { void pull(sessionId).then(() => refresh()) }}\n >\n\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M13.03 8.22a.75.75 0 0 1 0 1.06l-4.5 4.5a.75.75 0 0 1-1.06 0l-4.5-4.5a.75.75 0 0 1 1.06-1.06L7.5 11.69V2.75a.75.75 0 0 1 1.5 0v8.94l3.47-3.47a.75.75 0 0 1 1.06 0z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className={css.iconButton}\n title=\"推送 (Push)\"\n onClick={() => { void push(sessionId).then(() => refresh()) }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2.97 7.78a.75.75 0 0 1 0-1.06l4.5-4.5a.75.75 0 0 1 1.06 0l4.5 4.5a.75.75 0 1 1-1.06 1.06L8.5 4.31v8.94a.75.75 0 0 1-1.5 0V4.31L3.53 7.78a.75.75 0 0 1-1.06 0z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className={`${css.iconButton} ${loading ? css.spinning : ''}`}\n title=\"刷新\"\n onClick={() => { void refresh() }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M1.705 8.005a.75.75 0 0 1 .834.656 5.5 5.5 0 0 0 9.592 2.97l-1.204-1.204a.25.25 0 0 1 .177-.427h3.646a.25.25 0 0 1 .25.25v3.646a.25.25 0 0 1-.427.177l-1.38-1.38A7.002 7.002 0 0 1 1.05 8.84a.75.75 0 0 1 .655-.835zm12.59-1.01a.75.75 0 0 1-.834-.656 5.5 5.5 0 0 0-9.592-2.97l1.204 1.204a.25.25 0 0 1-.177.427H1.25a.25.25 0 0 1-.25-.25V1.104a.25.25 0 0 1 .427-.177l1.38 1.38A7.002 7.002 0 0 1 14.95 7.16a.75.75 0 0 1-.655.835z\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* 2. Tabs Bar */}\n <div className={css.tabs}>\n <button\n type=\"button\"\n className={`${css.tab} ${activeTab === 'changes' ? css.tabActive : ''}`}\n onClick={() => { setActiveTab('changes') }}\n >\n {t('tabs.changes')}\n {totalChanges > 0 && <span className={css.tabCount}>{totalChanges}</span>}\n </button>\n <button\n type=\"button\"\n className={`${css.tab} ${activeTab === 'tree' ? css.tabActive : ''}`}\n onClick={() => { setActiveTab('tree') }}\n >\n {t('tabs.tree')}\n <span className={css.tabCount}>{commits.length}</span>\n </button>\n <button\n type=\"button\"\n className={`${css.tab} ${activeTab === 'branches' ? css.tabActive : ''}`}\n onClick={() => { setActiveTab('branches') }}\n >\n {t('tabs.branches')}\n </button>\n <button\n type=\"button\"\n className={`${css.tab} ${activeTab === 'tags' ? css.tabActive : ''}`}\n onClick={() => { setActiveTab('tags') }}\n >\n {t('tabs.tags')}\n {tags.length > 0 && <span className={css.tabCount}>{tags.length}</span>}\n </button>\n </div>\n\n {locatedNotice && (\n <div style={{\n padding: '6px 12px',\n background: 'color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent)',\n color: 'var(--dsw-alias-state-business-primary)',\n fontSize: '11px',\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n borderBottom: '0.5px solid var(--dsw-alias-border-l2)',\n }}>\n <span>🎯</span>\n <span>{locatedNotice}</span>\n </div>\n )}\n\n {/* 3. Main Content Panes */}\n <div className={css.content}>\n {/* TAB 1: Local Changes */}\n {activeTab === 'changes' && (\n <>\n {totalChanges === 0 ? (\n <div className={css.emptyState}>\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0z\" />\n </svg>\n <div>{t('status.clean')}</div>\n </div>\n ) : (\n <>\n {/* 1.1 Staged Changes */}\n {stagedCount > 0 && (\n <div className={css.section}>\n <div className={css.sectionHeader}>\n <div className={css.sectionTitle}>\n <span className={`${css.statusBadge} ${css.statusA}`}>✓</span>\n <span>{t('status.staged')} ({stagedCount})</span>\n </div>\n <div className={css.sectionActions}>\n <button\n type=\"button\"\n className={css.actionTextBtn}\n title={t('actions.unstageAll')}\n onClick={() => { void handleUnstage('all') }}\n >\n 全部取消暂存\n </button>\n </div>\n </div>\n <div className={css.fileList}>\n {status.staged.map(f => (\n <div\n key={`staged-${f.path}`}\n className={css.fileItem}\n onClick={() => { void handleViewDiff(f.path, true) }}\n >\n <div className={css.fileLeft}>\n <span className={`${css.statusBadge} ${css.statusA}`}>\n {f.status[0]?.toUpperCase() ?? 'M'}\n </span>\n <span className={css.fileName}>{f.path}</span>\n </div>\n <div className={css.fileItemActions}>\n <button\n type=\"button\"\n className={css.fileMiniBtn}\n title={t('actions.unstage')}\n onClick={(e) => {\n e.stopPropagation()\n void handleUnstage([f.path])\n }}\n >\n -\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* 1.2 Unstaged Changes */}\n {unstagedCount > 0 && (\n <div className={css.section}>\n <div className={css.sectionHeader}>\n <div className={css.sectionTitle}>\n <span className={`${css.statusBadge} ${css.statusM}`}>M</span>\n <span>{t('status.unstaged')} ({unstagedCount})</span>\n </div>\n <div className={css.sectionActions}>\n <button\n type=\"button\"\n className={css.actionTextBtn}\n title={t('actions.stageAll')}\n onClick={() => { void handleStage('all') }}\n >\n 全部暂存\n </button>\n </div>\n </div>\n <div className={css.fileList}>\n {status.unstaged.map(f => (\n <div\n key={`unstaged-${f.path}`}\n className={css.fileItem}\n onClick={() => { void handleViewDiff(f.path, false) }}\n >\n <div className={css.fileLeft}>\n <span className={`${css.statusBadge} ${css.statusM}`}>\n {f.status[0]?.toUpperCase() ?? 'M'}\n </span>\n <span className={css.fileName}>{f.path}</span>\n </div>\n <div className={css.fileItemActions}>\n <button\n type=\"button\"\n className={css.fileMiniBtn}\n title={t('actions.stage')}\n onClick={(e) => {\n e.stopPropagation()\n void handleStage([f.path])\n }}\n >\n +\n </button>\n <button\n type=\"button\"\n className={css.fileMiniBtn}\n title={t('actions.discard')}\n onClick={(e) => {\n e.stopPropagation()\n void handleDiscard([f.path])\n }}\n >\n ↺\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* 1.3 Untracked Files */}\n {untrackedCount > 0 && (\n <div className={css.section}>\n <div className={css.sectionHeader}>\n <div className={css.sectionTitle}>\n <span className={`${css.statusBadge} ${css.statusU}`}>?</span>\n <span>{t('status.untracked')} ({untrackedCount})</span>\n </div>\n </div>\n <div className={css.fileList}>\n {status.untracked.map(f => (\n <div\n key={`untracked-${f.path}`}\n className={css.fileItem}\n onClick={() => { void handleViewDiff(f.path, false) }}\n >\n <div className={css.fileLeft}>\n <span className={`${css.statusBadge} ${css.statusU}`}>?</span>\n <span className={css.fileName}>{f.path}</span>\n </div>\n <div className={css.fileItemActions}>\n <button\n type=\"button\"\n className={css.fileMiniBtn}\n title={t('actions.stage')}\n onClick={(e) => {\n e.stopPropagation()\n void handleStage([f.path])\n }}\n >\n +\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* 1.4 Commit Console (IDEA Style) */}\n <div className={css.commitBox}>\n <textarea\n className={css.commitTextarea}\n placeholder={t('commit.placeholder')}\n value={commitMessage}\n onChange={(e) => { setCommitMessage(e.target.value) }}\n onKeyDown={handleCommitKeyDown}\n />\n <div className={css.commitButtonRow}>\n <button\n type=\"button\"\n className={css.commitPushBtn}\n disabled={committing || stagedCount === 0}\n onClick={() => { void handleCommit(true) }}\n >\n {t('actions.commitAndPush')}\n </button>\n <button\n type=\"button\"\n className={css.commitBtn}\n disabled={committing || stagedCount === 0}\n onClick={() => { void handleCommit(false) }}\n >\n {t('actions.commit')}\n </button>\n </div>\n </div>\n </>\n )}\n\n {/* Active File Diff Inspector */}\n {selectedFileDiff && (\n <div style={{ marginTop: '8px' }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '4px' }}>\n <span style={{ fontSize: '11px', fontWeight: 600 }}>差异对比: {selectedFileDiff.path}</span>\n <button\n type=\"button\"\n className={css.actionTextBtn}\n onClick={() => { setSelectedFileDiff(null) }}\n >\n 关闭\n </button>\n </div>\n <DiffViewer diffText={selectedFileDiff.diff} />\n </div>\n )}\n </>\n )}\n\n {/* TAB 2: DAG Topology Tree & Log (Workstation Grade) */}\n {activeTab === 'tree' && (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n flex: '1 1 auto',\n minHeight: 0,\n overflow: 'hidden',\n }}>\n {/* Top Filter and Mainline Toggle Bar */}\n <div className={css.treeFilterRow}>\n <input\n className={css.treeSearchInput}\n placeholder={t('tree.searchPlaceholder')}\n value={treeSearch}\n onChange={(e) => { setTreeSearch(e.target.value) }}\n />\n <div className={css.mainlineToggleGroup}>\n <button\n type=\"button\"\n className={`${css.mainlineToggleBtn} ${filterMode === 'all' ? css.mainlineToggleBtnActive : ''}`}\n onClick={() => { setFilterMode('all') }}\n >\n {t('tree.filterAll')}\n </button>\n <button\n type=\"button\"\n className={`${css.mainlineToggleBtn} ${filterMode === 'mainline' ? css.mainlineToggleBtnActive : ''}`}\n onClick={() => { setFilterMode('mainline') }}\n >\n {t('tree.filterMainline')}\n </button>\n </div>\n </div>\n\n {/* Main Workstation Layout: Table on left, Details on right */}\n <div\n className={css.workstationLayout}\n style={{ '--git-graph-col-width': `${graphColWidth}px` } as Record<string, string>}\n >\n <div className={css.tablePane}>\n {/* Columnar Grid Table Header */}\n <div className={css.treeTableHeader}>\n <span className={css.colHeaderTitle}>{t('tree.colGraph')}</span>\n <span className={css.colHeaderTitle}>{t('tree.colSubject')}</span>\n <span className={css.colHeaderTitle}>{t('tree.colAuthor')}</span>\n <span className={css.colHeaderTitle}>{t('tree.colTime')}</span>\n <span className={css.colHeaderTitle}>{t('tree.colSha')}</span>\n </div>\n\n {/* Rows List */}\n <div className={css.treeContainer} style={{ position: 'relative' }}>\n {/* Global Continuous SVG Graph Layer (IntelliJ IDEA Grade) */}\n <svg\n className={css.graphOverlaySvg}\n style={{\n width: `${graphColWidth}px`,\n height: `${filteredCommits.length * 28}px`,\n }}\n >\n {/* Continuous Edges (Trunk & Branch Bezier Rails) */}\n {dagGraph.edges.map(e => (\n <path\n key={e.key}\n d={e.d}\n stroke={e.color}\n strokeWidth={2}\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n ))}\n\n {/* Nodes (Centered on (x, y)) */}\n {dagGraph.nodes.map((n) => {\n const isHighlighted = highlightedCommitHash === n.hash\n return (\n <g key={n.hash}>\n {isHighlighted && (\n <circle\n cx={n.x}\n cy={n.y}\n r={8.5}\n className={css.locateGlowRing}\n />\n )}\n\n {n.hasTag && (\n <circle\n cx={n.x}\n cy={n.y}\n r={6.5}\n stroke=\"#f0883e\"\n strokeWidth={1.5}\n fill=\"none\"\n opacity={0.9}\n />\n )}\n\n {n.isHead && !n.hasTag && (\n <circle\n cx={n.x}\n cy={n.y}\n r={6.5}\n stroke={n.color}\n strokeWidth={1.5}\n fill=\"none\"\n opacity={0.8}\n />\n )}\n\n <circle\n cx={n.x}\n cy={n.y}\n r={4}\n fill={n.color}\n />\n </g>\n )\n })}\n </svg>\n\n {filteredCommits.map((c) => {\n const isSelected = selectedCommitHash === c.hash\n const isHighlighted = highlightedCommitHash === c.hash\n const parsed = parseConventionalCommit(c.subject)\n const avatar = getAuthorAvatar(c.author)\n\n return (\n <div\n key={c.hash}\n id={`git-commit-${c.hash}`}\n className={[\n css.treeRowGrid,\n isSelected ? css.treeRowGridSelected : '',\n isHighlighted ? css.treeRowHighlighted : '',\n ].filter(Boolean).join(' ')}\n onClick={() => { void handleSelectCommit(c.hash) }}\n >\n {/* Col 1: Empty Graph Column Spacer */}\n <div style={{ width: `${graphColWidth}px`, height: 28, flexShrink: 0 }} />\n\n {/* Col 2: Subject & Ref Badges & Conventional Commits */}\n <div className={css.subjectCol}>\n {c.refs?.map((ref, idx) => {\n let refClass = css.refBranch\n let refText = ref\n if (ref.startsWith('tag: ')) {\n refClass = css.refTag\n refText = `🏷️ ${ref.slice(5)}`\n } else if (ref.includes('HEAD')) {\n refClass = css.refHead\n } else if (ref.startsWith('origin/')) {\n refClass = css.refRemote\n }\n return (\n <span key={idx} className={`${css.refBadge} ${refClass}`} title={ref}>\n {refText}\n </span>\n )\n })}\n {parsed.type && (\n <span className={`${css.typeBadge} ${getTypeBadgeClass(parsed.type)}`}>\n {parsed.type}\n </span>\n )}\n <span className={css.treeSubject} title={c.subject}>\n {c.subject}\n </span>\n\n {/* Hover Actions */}\n <div className={css.treeRowActions} onClick={(e) => { e.stopPropagation() }}>\n <button\n type=\"button\"\n className={css.treeActionBtn}\n title=\"复制完整 SHA\"\n onClick={() => {\n void navigator.clipboard.writeText(c.hash)\n }}\n >\n SHA\n </button>\n <button\n type=\"button\"\n className={css.treeActionBtn}\n title=\"在此提交新建 Tag\"\n onClick={() => {\n setNewTagCommit(c.shortHash)\n setCreatingTag(true)\n setActiveTab('tags')\n }}\n >\n 🏷️\n </button>\n <button\n type=\"button\"\n className={css.treeActionBtn}\n title=\"在此提交新建分支\"\n onClick={() => {\n setCreatingBranch(true)\n setActiveTab('branches')\n }}\n >\n ⑂\n </button>\n </div>\n </div>\n\n {/* Col 3: Author with avatar initial */}\n <div className={css.authorCol} title={c.author}>\n <span className={css.authorAvatar} style={{ background: avatar.color }}>\n {avatar.initial}\n </span>\n <span className={css.authorNameText}>{c.author}</span>\n </div>\n\n {/* Col 4: Time */}\n <span className={css.timeCol} title={c.date}>\n {c.relativeDate}\n </span>\n\n {/* Col 5: Commit Short Hash */}\n <span className={css.shaCol} title={c.hash}>\n {c.shortHash}\n </span>\n </div>\n )\n })}\n </div>\n </div>\n\n {/* Right Details Panel: Commit Details & Changed Files (Matching Reference Image) */}\n {commitDetail && (\n <div className={css.detailsPane}>\n <div className={css.detailsHeader}>\n <span>{t('detail.title')}</span>\n <button\n type=\"button\"\n className={css.iconButton}\n title=\"关闭详情\"\n onClick={() => {\n setSelectedCommitHash(null)\n setCommitDetail(null)\n }}\n >\n ✕\n </button>\n </div>\n\n <div className={css.detailsContent}>\n {/* Commit Subject Title */}\n <div className={css.detailsSubject}>\n {commitDetail.commit.subject}\n </div>\n\n {/* Commit Body Description */}\n {commitDetail.body && (\n <div className={css.detailsBody}>\n {commitDetail.body}\n </div>\n )}\n\n {/* References */}\n {commitDetail.commit.refs && commitDetail.commit.refs.length > 0 && (\n <div>\n <div className={css.detailsSectionTitle}>{t('detail.references')}</div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '4px' }}>\n {commitDetail.commit.refs.map((ref, idx) => {\n let refClass = css.refBranch\n let refText = ref\n if (ref.startsWith('tag: ')) {\n refClass = css.refTag\n refText = `🏷️ ${ref.slice(5)}`\n } else if (ref.includes('HEAD')) {\n refClass = css.refHead\n } else if (ref.startsWith('origin/')) {\n refClass = css.refRemote\n }\n return (\n <span key={idx} className={`${css.refBadge} ${refClass}`}>\n {refText}\n </span>\n )\n })}\n </div>\n </div>\n )}\n\n {/* Meta Properties Grid */}\n <div className={css.detailsMetaGrid}>\n <div className={css.detailsMetaRow}>\n <span className={css.detailsMetaLabel}>{t('detail.author')}</span>\n <span className={css.authorCol} style={{ maxWidth: '180px' }}>\n {(() => {\n const av = getAuthorAvatar(commitDetail.commit.author)\n return (\n <>\n <span className={css.authorAvatar} style={{ background: av.color }}>\n {av.initial}\n </span>\n <span className={css.authorNameText}>\n {commitDetail.commit.author}\n </span>\n </>\n )\n })()}\n </span>\n </div>\n <div className={css.detailsMetaRow}>\n <span className={css.detailsMetaLabel}>{t('detail.date')}</span>\n <span className={css.detailsMetaVal}>\n {formatFullDate(commitDetail.commit.date)}\n </span>\n </div>\n <div className={css.detailsMetaRow}>\n <span className={css.detailsMetaLabel}>Commit SHA</span>\n <span\n className={css.tagShaPill}\n title=\"点击复制完整 SHA\"\n onClick={() => {\n void navigator.clipboard.writeText(commitDetail.commit.hash)\n }}\n >\n {commitDetail.commit.hash.slice(0, 13)}\n </span>\n </div>\n {commitDetail.parents && commitDetail.parents.length > 0 && (\n <div className={css.detailsMetaRow}>\n <span className={css.detailsMetaLabel}>{t('detail.parent')}</span>\n <div style={{ display: 'flex', gap: '4px' }}>\n {commitDetail.parents.map(p => (\n <span\n key={p}\n className={css.detailsParentLink}\n title={`定位到父提交: ${p}`}\n onClick={() => { void handleLocateCommit(p) }}\n >\n {p.slice(0, 10)}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Changed Files */}\n <div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '6px' }}>\n <span style={{ fontSize: '11px', fontWeight: 600 }}>\n 变更文件 ({commitDetail.files.length} 个文件)\n </span>\n <span className={css.numstat}>\n <span className={css.addStat}>+{commitDetail.totalAdditions}</span>\n <span className={css.delStat}>-{commitDetail.totalDeletions}</span>\n </span>\n </div>\n <div className={css.detailFilesList}>\n {commitDetail.files.map(f => (\n <div\n key={f.path}\n className={css.detailFileItem}\n onClick={() => { void handleViewDiff(f.path, false, commitDetail.commit.hash) }}\n >\n <div className={css.fileLeft}>\n <span\n className={`${css.statusBadge} ${\n f.status === 'added' ? css.statusA : f.status === 'deleted' ? css.statusD : css.statusM\n }`}\n >\n {f.status[0]?.toUpperCase() ?? 'M'}\n </span>\n <span className={css.fileName}>{f.path}</span>\n </div>\n <span className={css.numstat}>\n <span className={css.addStat}>+{f.additions}</span>\n <span className={css.delStat}>-{f.deletions}</span>\n </span>\n </div>\n ))}\n </div>\n </div>\n\n {/* Diff Preview if selected file */}\n {selectedFileDiff && (\n <div style={{ marginTop: '6px' }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '4px' }}>\n <span style={{ fontSize: '11px', fontWeight: 600 }}>差异: {selectedFileDiff.path}</span>\n <button\n type=\"button\"\n className={css.actionTextBtn}\n onClick={() => { setSelectedFileDiff(null) }}\n >\n 关闭\n </button>\n </div>\n <DiffViewer diffText={selectedFileDiff.diff} />\n </div>\n )}\n\n {/* Bottom Actions */}\n <div className={css.detailsBottomActions}>\n <button\n type=\"button\"\n className={css.actionTextBtn}\n style={{ flex: 1, padding: '5px' }}\n onClick={() => {\n void handleCheckoutBranch(commitDetail.commit.shortHash)\n }}\n >\n {t('detail.checkout')}\n </button>\n <button\n type=\"button\"\n className={css.commitBtn}\n style={{ flex: 1, padding: '5px' }}\n onClick={() => {\n setNewTagCommit(commitDetail.commit.shortHash)\n setCreatingTag(true)\n setActiveTab('tags')\n }}\n >\n {t('detail.createBranchOrTag')}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Bottom Status Footer (Sync Status & Commit Stats) */}\n <div className={css.treeStatusFooter}>\n <div className={css.footerSyncStatus}>\n <span className={css.syncDot} />\n <span>\n {status.ahead === 0 && status.behind === 0\n ? t('footer.syncNormal')\n : status.ahead > 0\n ? t('footer.ahead', { count: status.ahead })\n : t('footer.behind', { count: status.behind })}\n </span>\n </div>\n <div className={css.footerStats}>\n <span>\n {t('footer.showingCount', {\n count: filteredCommits.length,\n total: status.totalCommitsCount ?? commits.length,\n })}\n </span>\n {status.totalCommitsCount && commits.length < status.totalCommitsCount && (\n <span className={css.loadMoreLink} onClick={() => { void handleLoadMore() }}>\n {t('footer.loadMore')}\n </span>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* TAB 3: Branches */}\n {activeTab === 'branches' && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {/* Search and New Branch bar */}\n <div style={{ display: 'flex', gap: '6px' }}>\n <input\n className={css.commitTextarea}\n style={{ minHeight: '30px', height: '30px', padding: '4px 8px' }}\n placeholder={t('branch.filter')}\n value={branchFilter}\n onChange={(e) => { setBranchFilter(e.target.value) }}\n />\n <button\n type=\"button\"\n className={css.actionTextBtn}\n style={{ flexShrink: 0 }}\n onClick={() => { setCreatingBranch(prev => !prev) }}\n >\n + 新建分支\n </button>\n </div>\n\n {creatingBranch && (\n <div style={{ display: 'flex', gap: '6px' }}>\n <input\n autoFocus\n className={css.commitTextarea}\n style={{ minHeight: '30px', height: '30px', padding: '4px 8px' }}\n placeholder=\"新分支名称...\"\n value={newBranchName}\n onChange={(e) => { setNewBranchName(e.target.value) }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n const trimmed = newBranchName.trim()\n if (trimmed) void handleCheckoutBranch(trimmed, true)\n }\n }}\n />\n <button\n type=\"button\"\n className={css.commitBtn}\n onClick={() => {\n const trimmed = newBranchName.trim()\n if (trimmed) void handleCheckoutBranch(trimmed, true)\n }}\n >\n 创建并检出\n </button>\n </div>\n )}\n\n {/* Local Branches */}\n <div className={css.section}>\n <div className={css.sectionHeader}>\n <span>本地分支 ({filteredLocalBranches.length})</span>\n </div>\n <div className={css.fileList}>\n {filteredLocalBranches.map(b => (\n <div\n key={b.name}\n className={css.fileItem}\n style={{ background: b.isCurrent ? 'rgba(56, 139, 253, 0.15)' : undefined }}\n onClick={() => {\n if (!b.isCurrent) void handleCheckoutBranch(b.name)\n }}\n >\n <div className={css.fileLeft}>\n <span style={{ color: b.isCurrent ? '#388bfd' : 'inherit' }}>\n {b.isCurrent ? '●' : '○'}\n </span>\n <span style={{ fontWeight: b.isCurrent ? 600 : 400 }}>{b.name}</span>\n </div>\n {b.isCurrent && <span style={{ fontSize: '11px', color: '#58a6ff' }}>当前检出</span>}\n </div>\n ))}\n </div>\n </div>\n\n {/* Remote Branches */}\n {filteredRemoteBranches.length > 0 && (\n <div className={css.section}>\n <div className={css.sectionHeader}>\n <span>远程分支 ({filteredRemoteBranches.length})</span>\n </div>\n <div className={css.fileList}>\n {filteredRemoteBranches.map(b => (\n <div\n key={b.name}\n className={css.fileItem}\n onClick={() => { void handleCheckoutBranch(b.name) }}\n >\n <div className={css.fileLeft}>\n <span style={{ opacity: 0.6 }}>☁</span>\n <span>{b.name}</span>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* TAB 4: Tags (GitHub Releases/Tags Style) */}\n {activeTab === 'tags' && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {/* Search and New Tag bar */}\n <div style={{ display: 'flex', gap: '6px' }}>\n <input\n className={css.commitTextarea}\n style={{ minHeight: '30px', height: '30px', padding: '4px 8px' }}\n placeholder={t('tag.filter')}\n value={tagFilter}\n onChange={(e) => { setTagFilter(e.target.value) }}\n />\n <button\n type=\"button\"\n className={css.actionTextBtn}\n style={{ flexShrink: 0 }}\n onClick={() => { setCreatingTag(prev => !prev) }}\n >\n + {t('tag.newPrompt')}\n </button>\n </div>\n\n {/* Create Tag Form */}\n {creatingTag && (\n <div className={css.tagForm}>\n <div className={css.tagFormTitle}>{t('tag.newPrompt')}</div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <label style={{ fontSize: '11px', color: 'var(--dsw-alias-label-secondary)' }}>\n {t('tag.nameLabel')} *\n </label>\n <input\n autoFocus\n className={css.commitTextarea}\n style={{ minHeight: '28px', height: '28px', padding: '4px 8px' }}\n placeholder={t('tag.namePlaceholder')}\n value={newTagName}\n onChange={(e) => { setNewTagName(e.target.value) }}\n />\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <label style={{ fontSize: '11px', color: 'var(--dsw-alias-label-secondary)' }}>\n {t('tag.targetCommitLabel')}\n </label>\n <input\n className={css.commitTextarea}\n style={{ minHeight: '28px', height: '28px', padding: '4px 8px' }}\n placeholder=\"例如 687f282 或留空为 HEAD\"\n value={newTagCommit}\n onChange={(e) => { setNewTagCommit(e.target.value) }}\n />\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <label style={{ fontSize: '11px', color: 'var(--dsw-alias-label-secondary)' }}>\n {t('tag.messageLabel')}\n </label>\n <input\n className={css.commitTextarea}\n style={{ minHeight: '28px', height: '28px', padding: '4px 8px' }}\n placeholder={t('tag.messagePrompt')}\n value={newTagMessage}\n onChange={(e) => { setNewTagMessage(e.target.value) }}\n />\n </div>\n <div className={css.tagFormActions}>\n <button\n type=\"button\"\n className={css.actionTextBtn}\n onClick={() => { setCreatingTag(false) }}\n >\n {t('tag.cancelBtn')}\n </button>\n <button\n type=\"button\"\n className={css.commitBtn}\n onClick={() => { void handleCreateTag() }}\n >\n {t('tag.createBtn')}\n </button>\n </div>\n </div>\n )}\n\n {/* Tags Cards List */}\n {filteredTags.length === 0 ? (\n <div className={css.emptyState}>\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25v5.025zM6 4.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z\" />\n </svg>\n <div>{t('tag.empty')}</div>\n </div>\n ) : (\n <div className={css.tagList}>\n {filteredTags.map(tag => (\n <div key={tag.name} className={css.tagCard}>\n <div className={css.tagCardHeader}>\n <div className={css.tagTitleRow}>\n <span style={{ fontSize: '13px' }}>🏷️</span>\n <span\n className={css.tagName}\n title=\"点击在图谱中定位\"\n onClick={() => { void handleLocateCommit(tag.commitHash, tag.name) }}\n >\n {tag.name}\n </span>\n <span\n className={css.tagShaPill}\n title={`Commit: ${tag.commitHash} (点击在图谱中定位)`}\n onClick={() => { void handleLocateCommit(tag.commitHash, tag.name) }}\n >\n {tag.shortHash}\n </span>\n {tag.isAnnotated && (\n <span className={css.tagAnnotatedBadge}>{t('tag.annotated')}</span>\n )}\n </div>\n <div className={css.tagActions}>\n <button\n type=\"button\"\n className={css.tagLocateBtn}\n title=\"在图谱中定位该提交\"\n onClick={() => { void handleLocateCommit(tag.commitHash, tag.name) }}\n >\n <span>🎯</span>\n <span>{t('tag.locateBtn')}</span>\n </button>\n <button\n type=\"button\"\n className={css.fileMiniBtn}\n title={t('tag.copyName')}\n onClick={() => {\n void navigator.clipboard.writeText(tag.name)\n }}\n >\n 📋\n </button>\n <button\n type=\"button\"\n className={css.fileMiniBtn}\n title={t('tag.deleteBtn')}\n onClick={() => { void handleDeleteTag(tag.name) }}\n >\n 🗑️\n </button>\n </div>\n </div>\n\n {/* Commit Message or Tag Annotation */}\n {tag.message && (\n <div className={css.tagMessage} title={tag.message}>\n {tag.message}\n </div>\n )}\n\n {/* Footer with author and date */}\n <div className={css.tagMetaFooter}>\n <span className={css.tagAuthor}>\n <span>👤</span>\n <span>{tag.author}</span>\n </span>\n <span title={tag.date}>\n {tag.relativeDate}\n </span>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )\n})\n","/**\n * Status bar Git branch pill and popover branch switcher (Clean & Elegant UI).\n * Injected into the 'conversation.composer.dock' slot at order: -1.\n */\n\nimport React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { KeyboardEvent, MouseEvent } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { GitBranchesSummary, GitStatusSummary } from '../types.ts'\nimport css from './GitBranchPill.module.css'\n\nconst MenuSurface = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ children, className, style, ...rest }, ref) => (\n <div ref={ref} className={className} style={style} role=\"dialog\" {...rest}>\n {children}\n </div>\n ),\n)\nMenuSurface.displayName = 'MenuSurface'\n\nfunction IconBranchOutlineRegular({ className }: { className?: string }): React.ReactElement {\n return (\n <svg className={className} width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M11.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5zm-2.25.75a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.492 2.492 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25zM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5zM3.5 3.25a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0z\" />\n </svg>\n )\n}\n\nfunction IconCheckOutlineRegular({ className }: { className?: string }): React.ReactElement {\n return (\n <svg className={className} width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 8 7 12 13 4\" />\n </svg>\n )\n}\n\nfunction IconRefreshOutlineRegular({ className }: { className?: string }): React.ReactElement {\n return (\n <svg className={className} width=\"13\" height=\"13\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M2.5 8a5.5 5.5 0 1 0 1.6-3.9L2 6\" />\n <path d=\"M2 2v4h4\" />\n </svg>\n )\n}\n\nexport interface GitBranchPillProps {\n getStatus?: ((sessionId?: string) => Promise<GitStatusSummary>) | undefined\n getBranches?: ((sessionId?: string) => Promise<GitBranchesSummary>) | undefined\n checkout?: (\n (sessionId: string | undefined, branch: string, create?: boolean) => Promise<{ success: boolean; message?: string }>\n ) | undefined\n pull?: ((sessionId?: string) => Promise<{ success: boolean; message?: string }>) | undefined\n push?: ((sessionId?: string) => Promise<{ success: boolean; message?: string }>) | undefined\n sessionId?: string | undefined\n}\n\n/**\n * Git Branch Pill rendered in the Composer Dock.\n */\nexport const GitBranchPill = memo(function GitBranchPill({\n getStatus,\n getBranches,\n checkout,\n pull,\n push,\n sessionId,\n}: GitBranchPillProps) {\n const [status, setStatus] = useState<GitStatusSummary | null>(null)\n const [branches, setBranches] = useState<GitBranchesSummary | null>(null)\n const [open, setOpen] = useState(false)\n const [filter, setFilter] = useState('')\n const [creatingBranch, setCreatingBranch] = useState(false)\n const [newBranchName, setNewBranchName] = useState('')\n const [switching, setSwitching] = useState(false)\n\n const anchorRef = useRef<HTMLSpanElement>(null)\n const popoverRef = useRef<HTMLDivElement>(null)\n const [popoverPos, setPopoverPos] = useState<{ bottom: number; left: number } | null>(null)\n\n // Fetch status and branches from injected actions\n const refresh = useCallback(async () => {\n if (!getStatus || !getBranches) return\n\n try {\n const [statusRes, branchRes] = await Promise.all([\n getStatus(sessionId),\n getBranches(sessionId),\n ])\n setStatus(statusRes)\n setBranches(branchRes)\n } catch {\n // safe fallback on communication errors\n }\n }, [getStatus, getBranches, sessionId])\n\n useEffect(() => {\n void refresh()\n const timer = setInterval(() => { void refresh() }, 5000)\n return () => { clearInterval(timer) }\n }, [refresh])\n\n // Recalculate popover position relative to anchor button\n const updatePosition = useCallback(() => {\n if (!anchorRef.current) return\n const rect = anchorRef.current.getBoundingClientRect()\n setPopoverPos({\n bottom: window.innerHeight - rect.top + 8,\n left: Math.max(12, Math.min(rect.left, window.innerWidth - 340)),\n })\n }, [])\n\n const handleToggle = useCallback((e: MouseEvent) => {\n e.stopPropagation()\n if (!open) {\n updatePosition()\n void refresh()\n }\n setOpen(prev => !prev)\n setCreatingBranch(false)\n setFilter('')\n }, [open, refresh, updatePosition])\n\n // Dismiss popover on outside click or escape\n useEffect(() => {\n if (!open) return\n const onPointerDown = (e: PointerEvent) => {\n const target = e.target as Node | null\n if (popoverRef.current?.contains(target) || anchorRef.current?.contains(target)) return\n setOpen(false)\n }\n const onKeyDown = (e: globalThis.KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n\n document.addEventListener('pointerdown', onPointerDown)\n document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [open])\n\n // Checkout branch\n const handleCheckout = useCallback(async (branchName: string, create = false) => {\n if (!checkout || switching) return\n\n setSwitching(true)\n try {\n const res = await checkout(sessionId, branchName, create)\n if (res.success) {\n setOpen(false)\n setCreatingBranch(false)\n setNewBranchName('')\n await refresh()\n } else {\n alert(res.message ?? 'Checkout failed')\n }\n } finally {\n setSwitching(false)\n }\n }, [checkout, refresh, sessionId, switching])\n\n // Create new branch\n const handleCreateBranchKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n const trimmed = newBranchName.trim()\n if (trimmed) void handleCheckout(trimmed, true)\n } else if (e.key === 'Escape') {\n setCreatingBranch(false)\n }\n }, [handleCheckout, newBranchName])\n\n // Pull\n const handlePull = useCallback(async () => {\n if (!pull) return\n await pull(sessionId)\n await refresh()\n }, [pull, refresh, sessionId])\n\n // Push\n const handlePush = useCallback(async () => {\n if (!push) return\n await push(sessionId)\n await refresh()\n }, [push, refresh, sessionId])\n\n // Filtered branches\n const filteredLocal = useMemo(() => {\n if (!branches?.local) return []\n const q = filter.trim().toLowerCase()\n return q ? branches.local.filter(b => b.name.toLowerCase().includes(q)) : branches.local\n }, [branches?.local, filter])\n\n const filteredRemote = useMemo(() => {\n if (!branches?.remote) return []\n const q = filter.trim().toLowerCase()\n return q ? branches.remote.filter(b => b.name.toLowerCase().includes(q)) : branches.remote\n }, [branches?.remote, filter])\n\n if (status && !status.isRepo) {\n return null\n }\n\n const currentBranchName = status?.branch || 'main'\n\n return (\n <span ref={anchorRef} className={css.anchor} data-composer-stat=\"git-branch\">\n <button\n type=\"button\"\n className={css.pill}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n title={`Git Branch: ${currentBranchName}`}\n onClick={handleToggle}\n >\n <IconBranchOutlineRegular className={css.icon} />\n <span className={css.branchName}>{currentBranchName}</span>\n {status !== null && status.ahead > 0 && <span className={`${css.badge} ${css.badgeAhead}`}>↑{status.ahead}</span>}\n {status !== null && status.behind > 0 && <span className={`${css.badge} ${css.badgeBehind}`}>↓{status.behind}</span>}\n </button>\n\n {open && popoverPos && createPortal(\n <MenuSurface\n ref={popoverRef}\n className={css.popover}\n style={{ bottom: `${popoverPos.bottom}px`, left: `${popoverPos.left}px` }}\n >\n <div className={css.header}>\n <div className={css.searchRow}>\n <input\n autoFocus\n className={css.searchInput}\n placeholder=\"搜索或过滤分支...\"\n value={filter}\n onChange={(e) => { setFilter(e.target.value) }}\n />\n </div>\n\n <div className={css.actionBar}>\n <button\n type=\"button\"\n className={css.toolBtnPrimary}\n onClick={() => { setCreatingBranch(prev => !prev) }}\n >\n <span>+ 新建分支</span>\n </button>\n <div className={css.toolBtnGroup}>\n <button\n type=\"button\"\n className={css.toolBtn}\n onClick={() => { void handlePull() }}\n >\n Pull\n </button>\n <button\n type=\"button\"\n className={css.toolBtn}\n onClick={() => { void handlePush() }}\n >\n Push\n </button>\n <button\n type=\"button\"\n className={css.toolBtn}\n title=\"刷新状态\"\n onClick={() => { void refresh() }}\n >\n <IconRefreshOutlineRegular className={css.btnIcon} />\n </button>\n </div>\n </div>\n\n {creatingBranch && (\n <div className={css.newBranchBox}>\n <input\n autoFocus\n className={css.newBranchInput}\n placeholder=\"新分支名称 (按 Enter 创建)...\"\n value={newBranchName}\n onChange={(e) => { setNewBranchName(e.target.value) }}\n onKeyDown={handleCreateBranchKeyDown}\n />\n </div>\n )}\n </div>\n\n <div className={css.branchList}>\n {/* Local Branches */}\n <div className={css.groupLabel}>本地分支 ({filteredLocal.length})</div>\n {filteredLocal.map(b => (\n <button\n key={b.name}\n type=\"button\"\n className={`${css.branchItem} ${b.isCurrent ? css.currentBranch : ''}`}\n disabled={switching}\n onClick={() => {\n if (!b.isCurrent) void handleCheckout(b.name)\n }}\n >\n <div className={css.branchItemLeft}>\n <IconBranchOutlineRegular className={css.itemIcon} />\n <span className={css.itemText}>{b.name}</span>\n </div>\n {b.isCurrent && <IconCheckOutlineRegular className={css.checkMark} />}\n </button>\n ))}\n\n {/* Remote Branches */}\n {filteredRemote.length > 0 && (\n <>\n <div className={css.groupLabel}>远程分支 ({filteredRemote.length})</div>\n {filteredRemote.map(b => (\n <button\n key={b.name}\n type=\"button\"\n className={`${css.branchItem} ${b.isCurrent ? css.currentBranch : ''}`}\n disabled={switching}\n onClick={() => {\n if (!b.isCurrent) void handleCheckout(b.name)\n }}\n >\n <div className={css.branchItemLeft}>\n <IconBranchOutlineRegular className={css.itemIcon} />\n <span className={css.itemText}>{b.name}</span>\n </div>\n {b.isCurrent && <IconCheckOutlineRegular className={css.checkMark} />}\n </button>\n ))}\n </>\n )}\n\n {filteredLocal.length === 0 && filteredRemote.length === 0 && (\n <div className={css.emptyTip}>未找到匹配的分支</div>\n )}\n </div>\n </MenuSurface>,\n document.body,\n )}\n </span>\n )\n})\n","/**\n * The Git tab's chip title in the right-sidebar header.\n */\n\nimport type { ReactNode } from 'react'\nimport css from './GitBody.module.css'\n\nexport interface GitTitleProps {\n useTabInfo: () => { tab: { title: string } }\n}\n\n/**\n * Git chip title component with branch glyph and title text.\n * @param props - Slot props including tab info hook.\n * @returns React node for tab chip.\n */\nexport function GitTitle({ useTabInfo }: GitTitleProps): ReactNode {\n const { tab } = useTabInfo()\n return (\n <span className={css.titleContainer}>\n <svg className={css.titleIcon} width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M11.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5zm-2.25.75a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.492 2.492 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25zM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5zM3.5 3.25a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0z\" />\n </svg>\n <span className={css.titleText}>{tab.title}</span>\n </span>\n )\n}\n","/**\n * Localized copy for the Git right-sidebar viewer and commands.\n */\n\nexport const NS = 'gitView'\n\nexport const zh = {\n 'type.label': 'Git',\n 'guide.title': 'Git 源代码管理',\n 'guide.description': '查看项目代码变更、分支、提交历史与代码对比',\n 'shortcut.noSession': '没有激活的会话',\n 'tabs.changes': '更改',\n 'tabs.history': '提交历史',\n 'tabs.tree': '提交图谱',\n 'tabs.branches': '分支',\n 'tabs.tags': '标签',\n 'actions.refresh': '刷新状态',\n 'actions.viewDiff': '查看差异',\n 'actions.closeDiff': '收起差异',\n 'actions.stage': '暂存',\n 'actions.unstage': '取消暂存',\n 'actions.stageAll': '全部暂存',\n 'actions.unstageAll': '全部取消暂存',\n 'actions.discard': '放弃更改',\n 'actions.commit': '提交',\n 'actions.commitAndPush': '提交并推送',\n 'actions.checkout': '检出分支',\n 'actions.newBranch': '新建分支',\n 'actions.fetch': '获取远程',\n 'actions.pull': '拉取 (Pull)',\n 'actions.push': '推送 (Push)',\n 'commit.placeholder': '提交说明信息 (Ctrl+Enter 提交)...',\n 'commit.emptyWarning': '请输入提交说明',\n 'commit.success': '提交成功',\n 'branch.filter': '搜索或过滤分支...',\n 'branch.local': '本地分支',\n 'branch.remote': '远程分支',\n 'branch.current': '当前分支',\n 'branch.newPrompt': '新分支名称 (按 Enter 创建)...',\n 'branch.createAndCheckout': '创建并检出',\n 'tree.author': '作者',\n 'tree.date': '时间',\n 'tree.hash': '哈希',\n 'tree.changedFiles': '变更文件',\n 'tree.selectCommit': '选择一次提交以查看详情与代码差异',\n 'status.clean': '工作区干净,无未提交的更改',\n 'status.notRepo': '当前工作区不是 Git 仓库',\n 'status.staged': '暂存的更改',\n 'status.unstaged': '更改',\n 'status.untracked': '未跟踪文件',\n 'status.ahead': '领先 {count} 个提交',\n 'status.behind': '落后 {count} 个提交',\n 'diff.additions': '+{count}',\n 'diff.deletions': '-{count}',\n 'diff.empty': '无内容变动',\n 'tag.filter': '过滤标签 (名称、Hash或提交说明)...',\n 'tag.newPrompt': '新建标签 (Tag)',\n 'tag.nameLabel': '标签名称',\n 'tag.namePlaceholder': '输入标签名称 (如 v1.0.0)...',\n 'tag.targetCommitLabel': '目标 Commit Hash (可选,默认 HEAD)',\n 'tag.messageLabel': '附注说明信息 (可选)',\n 'tag.messagePrompt': '请输入附注说明信息 (可选)...',\n 'tag.createBtn': '创建标签',\n 'tag.cancelBtn': '取消',\n 'tag.locateBtn': '在图谱中定位',\n 'tag.copyName': '复制标签名',\n 'tag.deleteBtn': '删除',\n 'tag.deleteConfirm': '确定要删除标签 \"{name}\" 吗?',\n 'tag.empty': '未找到任何 Git 标签',\n 'tag.annotated': '含附注',\n 'tag.locatedNotice': '已定位到标签 \"{name}\" 所在提交',\n 'actions.locate': '定位',\n 'tree.colGraph': '图谱',\n 'tree.colSubject': '提交说明与分支引用',\n 'tree.colAuthor': '作者',\n 'tree.colTime': '时间',\n 'tree.colSha': 'Commit SHA',\n 'tree.searchPlaceholder': '搜索提交说明、SHA 或作者...',\n 'tree.filterAll': '全部提交',\n 'tree.filterMainline': '主线分支',\n 'detail.title': '提交详情 (COMMIT DETAILS)',\n 'detail.references': '分支引用 (REFERENCES)',\n 'detail.author': '提交作者 (Author)',\n 'detail.date': '提交时间 (Date)',\n 'detail.parent': '父级提交 (Parent)',\n 'detail.checkout': '检出分支 (Checkout)',\n 'detail.createBranchOrTag': '从此检出分支 / 标签',\n 'footer.showingCount': '显示 {count} 条提交 (共 {total} 条)',\n 'footer.loadMore': '加载更多',\n 'footer.syncNormal': '分支已与远程同步',\n 'footer.ahead': '领先远程 {count} 个提交',\n 'footer.behind': '落后远程 {count} 个提交',\n} satisfies Record<string, string>\n\nexport type GitViewKey = keyof typeof zh\n\nexport const en = {\n 'type.label': 'Git',\n 'guide.title': 'Git Source Control',\n 'guide.description': 'View project code changes, branches, commit log, and unified diffs',\n 'shortcut.noSession': 'No active session',\n 'tabs.changes': 'Changes',\n 'tabs.history': 'History',\n 'tabs.tree': 'Git Tree & Log',\n 'tabs.branches': 'Branches',\n 'tabs.tags': 'Tags',\n 'actions.refresh': 'Refresh status',\n 'actions.viewDiff': 'View Diff',\n 'actions.closeDiff': 'Collapse Diff',\n 'actions.stage': 'Stage',\n 'actions.unstage': 'Unstage',\n 'actions.stageAll': 'Stage All',\n 'actions.unstageAll': 'Unstage All',\n 'actions.discard': 'Discard',\n 'actions.commit': 'Commit',\n 'actions.commitAndPush': 'Commit and Push',\n 'actions.checkout': 'Checkout',\n 'actions.newBranch': 'New Branch',\n 'actions.fetch': 'Fetch',\n 'actions.pull': 'Pull',\n 'actions.push': 'Push',\n 'commit.placeholder': 'Commit message (Ctrl+Enter to commit)...',\n 'commit.emptyWarning': 'Please enter a commit message',\n 'commit.success': 'Committed successfully',\n 'branch.filter': 'Filter branches...',\n 'branch.local': 'Local Branches',\n 'branch.remote': 'Remote Branches',\n 'branch.current': 'Current Branch',\n 'branch.newPrompt': 'Enter new branch name...',\n 'branch.createAndCheckout': 'Create & Checkout',\n 'tree.author': 'Author',\n 'tree.date': 'Date',\n 'tree.hash': 'Hash',\n 'tree.changedFiles': 'Changed Files',\n 'tree.selectCommit': 'Select a commit to view details and code diff',\n 'status.clean': 'Working tree clean, no uncommitted changes',\n 'status.notRepo': 'Current workspace is not a Git repository',\n 'status.staged': 'Staged Changes',\n 'status.unstaged': 'Unstaged Changes',\n 'status.untracked': 'Untracked Files',\n 'status.ahead': '{count} ahead',\n 'status.behind': '{count} behind',\n 'diff.additions': '+{count}',\n 'diff.deletions': '-{count}',\n 'diff.empty': 'No content changes',\n 'tag.filter': 'Filter tags (name, hash, message)...',\n 'tag.newPrompt': 'New Tag',\n 'tag.nameLabel': 'Tag Name',\n 'tag.namePlaceholder': 'Enter tag name (e.g. v1.0.0)...',\n 'tag.targetCommitLabel': 'Target Commit Hash (optional, defaults to HEAD)',\n 'tag.messageLabel': 'Message (optional annotation)',\n 'tag.messagePrompt': 'Enter annotation message (optional)...',\n 'tag.createBtn': 'Create Tag',\n 'tag.cancelBtn': 'Cancel',\n 'tag.locateBtn': 'Locate in Graph',\n 'tag.copyName': 'Copy Tag Name',\n 'tag.deleteBtn': 'Delete',\n 'tag.deleteConfirm': 'Are you sure you want to delete tag \"{name}\"?',\n 'tag.empty': 'No Git tags found',\n 'tag.annotated': 'Annotated',\n 'tag.locatedNotice': 'Located commit for tag \"{name}\"',\n 'actions.locate': 'Locate',\n 'tree.colGraph': 'Graph',\n 'tree.colSubject': 'Commit Subject & References',\n 'tree.colAuthor': 'Author',\n 'tree.colTime': 'Time',\n 'tree.colSha': 'Commit SHA',\n 'tree.searchPlaceholder': 'Search subject, SHA or author...',\n 'tree.filterAll': 'All',\n 'tree.filterMainline': 'Mainline',\n 'detail.title': 'COMMIT DETAILS',\n 'detail.references': 'REFERENCES',\n 'detail.author': 'Author',\n 'detail.date': 'Date',\n 'detail.parent': 'Parent',\n 'detail.checkout': 'Checkout',\n 'detail.createBranchOrTag': 'Create Branch / Tag',\n 'footer.showingCount': 'Showing {count} commits (total {total})',\n 'footer.loadMore': 'Load more',\n 'footer.syncNormal': 'Branch in sync',\n 'footer.ahead': '{count} ahead of remote',\n 'footer.behind': '{count} behind remote',\n} satisfies Record<GitViewKey, string>\n","/**\n * Browser entry for the Git right-sidebar plugin.\n */\n\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {\n GitBranchesSummary,\n GitCommitDetail,\n GitCommitItem,\n GitDiffSummary,\n GitStatusSummary,\n GitTagItem,\n} from '../types.ts'\nimport { GIT_ID, gitDefinition } from './definition.tsx'\nimport { GitBody, type GitInjected } from './GitBody.tsx'\nimport { GitBranchPill } from './GitBranchPill.tsx'\nimport { GitTitle } from './GitTitle.tsx'\nimport { en, NS, zh } from './locales.ts'\n\nexport type { GitBodyProps, GitInjected } from './GitBody.tsx'\nexport type { GitViewKey } from './locales.ts'\n\nexport interface ConnectionHandle {\n rpc: {\n call: (\n channel: string,\n method: string,\n params?: unknown,\n ) => Promise<{ ok: true; value: unknown } | { ok: false; error: { message: string } }>\n }\n}\n\nexport interface ClientContext extends Context {\n locale?: any\n sidebarRightTabs?: any\n sidebarRight?: any\n slots?: any\n shortcuts?: any\n connection?: ConnectionHandle\n}\n\n/**\n * Required browser services.\n */\nexport const inject = ['connection', 'slots', 'locale', 'sidebarRightTabs', 'sidebarRight']\n\n/**\n * Client plugin body: registers Git tab definition, locales, shortcut, and components.\n * @param ctx - Client context carrying slots and connection services.\n */\nexport function apply(ctx: Context): void {\n const client = ctx as ClientContext\n const t = client.locale?.bind?.(NS) ?? ((key: string) => key)\n\n // Register localization dictionaries\n ctx.effect(() => client.locale?.register?.(NS, { zh, en }), 'git: locales')\n\n // Register tab definition\n ctx.effect(() => client.sidebarRightTabs?.register?.(gitDefinition(t)), 'git: tab definition')\n\n // Register shortcut command\n ctx.inject(['shortcuts'], (scope: any) => {\n scope.effect(() => scope.shortcuts?.register?.({\n id: 'workspace.git',\n label: () => t('guide.title'),\n aliases: ['workspace git', 'git', 'source control'],\n defaults: {\n 'desktop:macos': { code: 'KeyG', modifiers: ['primary', 'shift'] },\n 'desktop:windows': { code: 'KeyG', modifiers: ['primary', 'shift'] },\n 'desktop:linux': { code: 'KeyG', modifiers: ['primary', 'shift'] },\n 'web:macos': { code: 'KeyG', modifiers: ['primary', 'shift'] },\n 'web:windows': { code: 'KeyG', modifiers: ['primary', 'shift'] },\n },\n regions: ['page', 'editable', 'terminal'],\n modals: [],\n resolve: ({ target: element }: { target: any }) => {\n const target = scope.sidebarRight?.commandTarget?.(element)\n if (target === undefined) return { status: 'blocked', reason: t('shortcut.noSession') }\n return { status: 'handled', run: () => { scope.sidebarRight?.openTabFromTarget?.('git', target) } }\n },\n }), 'git: shortcut')\n })\n\n // Define RPC actions bound to Connection\n const getConnection = (): ConnectionHandle => {\n const handle = (client.get?.('connection') ?? client.connection) as ConnectionHandle | undefined\n if (!handle) throw new Error('Connection service not available')\n return handle\n }\n\n const actions: GitInjected = {\n getStatus: async (sessionId) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'status', { sessionId })\n if (!res.ok) throw new Error(res.error.message)\n return res.value as GitStatusSummary\n },\n getLog: async (sessionId, maxCount) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'log', { sessionId, maxCount })\n if (!res.ok) throw new Error(res.error.message)\n return res.value as readonly GitCommitItem[]\n },\n getCommitDetails: async (sessionId, commit) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'commitDetails', { sessionId, commit })\n if (!res.ok) throw new Error(res.error.message)\n return res.value as GitCommitDetail | undefined\n },\n getDiff: async (sessionId, options) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'diff', { sessionId, ...options })\n if (!res.ok) throw new Error(res.error.message)\n return res.value as GitDiffSummary\n },\n getBranches: async (sessionId) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'branches', { sessionId })\n if (!res.ok) throw new Error(res.error.message)\n return res.value as GitBranchesSummary\n },\n checkout: async (sessionId, branch, create) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'checkout', { sessionId, branch, create })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n stage: async (sessionId, paths) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'stage', { sessionId, paths })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n unstage: async (sessionId, paths) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'unstage', { sessionId, paths })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n discard: async (sessionId, paths) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'discard', { sessionId, paths })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n commit: async (sessionId, message) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'commit', { sessionId, message })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n fetch: async (sessionId) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'fetch', { sessionId })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n pull: async (sessionId) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'pull', { sessionId })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n push: async (sessionId) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'push', { sessionId })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n getTags: async (sessionId) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'tags', { sessionId })\n if (!res.ok) throw new Error(res.error.message)\n return res.value as readonly GitTagItem[]\n },\n createTag: async (sessionId, name, commit, message) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'createTag', { sessionId, name, commit, message })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n deleteTag: async (sessionId, name) => {\n const conn = getConnection()\n const res = await conn.rpc.call('/git', 'deleteTag', { sessionId, name })\n if (!res.ok) return { success: false, message: res.error.message }\n return res.value as { success: boolean; message?: string }\n },\n }\n\n\n // Register slot implementations\n ctx.effect(() => client.slots?.inject?.('sidebar.right.pane.tab', () => client.slots.register(\n {\n name: 'sidebar.right.pane.tab',\n key: GIT_ID,\n locale: NS,\n inject: () => actions,\n },\n GitBody,\n )), 'git: tab body')\n\n ctx.effect(() => client.slots?.inject?.('sidebar.right.pane.tab.title', () => client.slots.register(\n {\n name: 'sidebar.right.pane.tab.title',\n key: GIT_ID,\n },\n GitTitle,\n )), 'git: tab title')\n\n // Register Git Branch Pill in conversation composer dock (status bar at bottom)\n ctx.effect(() => client.slots?.inject?.('conversation.composer.dock', () => client.slots.register(\n {\n name: 'conversation.composer.dock',\n id: 'git-branch',\n order: -1,\n locale: NS,\n inject: () => actions,\n },\n GitBranchPill,\n )), 'git: composer dock pill')\n}\n"],"mappings":"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"}