@norman-else/dsh-claude 0.1.28 → 0.1.32

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":["taskMeta","reviewCommentChipLabel","styles.taskActivityItem","styles.taskActivityGlyph","styles.taskActivityBody","styles.taskActivityTitle","styles.taskActivitySummary","styles.taskActivityDetail","styles.taskActivityDetailSummary","styles.detailCode","styles.taskCard","styles.taskCardRunning","styles.taskCardTop","styles.taskCardGlyph","styles.iconChipRunning","styles.iconChipError","styles.taskCardBody","styles.taskTitle","styles.taskStatusLine","styles.taskMeta","styles.taskSummary","styles.taskActivitySection","styles.taskTextButton","styles.taskActivityList","styles.tasksGroupCount","styles.tasksGroupHeading","styles.tasksGroupTitle","styles.tasksGroupToggle","styles.chevron","styles.chevronOpen","styles.detailsCardClass","styles.tasksPanel","styles.detailsCardCss","styles.panelIconButtonCss","styles.tasksHeader","styles.tasksHeading","styles.tasksTurnMeta","styles.panelIconButtonClass","styles.tasksBody","styles.tasksGroupEmpty","styles.taskCardList","styles.tasksFinishedSection","styles.tasksHoverGlyphError","styles.tasksHoverGlyphDone","styles.tasksHoverGlyphRunning","styles.tasksBadgeDone","styles.tasksBadgeDotError","styles.tasksBadgeDotDone","styles.tasksBadgeWrap","styles.tasksBadgeSeat","styles.tasksHoverCard","styles.tasksHoverHeader","styles.tasksHoverRow","styles.tasksHoverGlyph","styles.tasksHoverDesc","styles.tasksHoverType","styles.tasksHoverMore","styles.tasksHoverHint","styles.tasksTurnBadge","styles.tasksBadgeHovered","styles.tasksBadgeDot","styles.tasksBadgeLabel","EMPTY_TASKS","record","#sources","record","record","styles.settingTextInput","styles.settingSelect","styles.settingSelectTrigger","styles.settingSelectTriggerOpen","styles.settingSelectValue","styles.settingSelectChevron","styles.settingSelectChevronOpen","styles.settingSelectMenu","styles.settingSelectOption","styles.settingSelectOptionActive","styles.settingSelectCheck","styles.settingHint","styles.planUsageTone","styles.planUsageMeter","styles.planUsageTrack","styles.planUsageFill","styles.planUsageMeta","styles.settingsCard","styles.settingsCardHeader","styles.settingsSectionHeading","styles.settingsBody","styles.button","styles.notice","styles.diagnosticGrid","styles.diagnosticLabel","styles.diagnosticValue","styles.settingsPage","styles.settingsHero","styles.settingsMark","styles.settingsHeading","styles.settingsActions","styles.settingsLink","styles.primaryButton","record","response","record","record","styles.repositoryItemSuccess","styles.repositoryItemWarning","styles.repositoryItemError","styles.repositoryGlyph","repositoryName","styles.repositoryPrHoverCard","styles.repositoryPrHoverTop","styles.repositoryPrStateBadge","styles.repositoryPrStateBadgeMerged","styles.repositoryPrHoverRepo","styles.repositoryPrHoverAge","styles.repositoryPrHoverTitle","styles.repositoryPrHoverBottom","styles.repositoryPrAuthor","styles.repositoryPrAvatar","styles.repositoryPrHoverStats","styles.diffAdd","styles.diffDelete","styles.repositoryPrFiles","styles.repositoryPrLinkFrame","styles.repositoryPrLink","styles.repositoryPrLinkMerged","styles.repositoryAutoFix","styles.repositoryAutoFixActive","styles.heroWorktreeToggleFocused","styles.repositoryChecksFrame","styles.repositoryChecksTrigger","styles.repositoryChecksCard","styles.repositoryChecksTitle","styles.repositoryChecksHint","styles.repositoryChecksError","styles.repositoryChecksItem","styles.repositoryChecksName","styles.repositoryChecksDesc","styles.repositoryChecksFix","styles.repositoryUpdateTrigger","styles.diffModalCss","styles.diffModalFooter","styles.button","styles.diffModalButton","styles.primaryButton","styles.diffModalBody","styles.diffModalMeta","styles.diffModalMetaText","styles.diffModalFileState","styles.diffModalCheckbox","styles.diffModalSuccess","styles.diffModalStatus","styles.diffModalConflicts","styles.diffModalConflictResolve","styles.diffModalError","styles.repositoryMergeTrigger","styles.repositoryBarFrame","styles.repositoryBar","styles.repositoryPrIcon","styles.repositoryPrimary","styles.repositoryBarMerged","styles.repositoryPrIconMerged","styles.repositoryPrIconButton","styles.repositoryRemote","styles.repositoryBranch","styles.repositoryWorktree","styles.repositoryStatusItems","styles.diffTrigger","styles.diffTriggerMuted","styles.diffAddMuted","styles.diffDeleteMuted","styles.diffAheadMuted","styles.diffAhead","styles.repositoryMergedStatus","styles.repositoryMergedDot","styles.repositoryMergedAge","record","styles.reviewCommentChip","styles.reviewCommentChipLabel","styles.reviewCommentChipRemove","styles.reviewCommentHoverCard","styles.reviewCommentHoverPath","styles.reviewCommentHoverText","styles.reviewCommentBarFrame","styles.panelIconButtonCss","styles.reviewCommentBar","styles.reviewCommentIcon","styles.reviewCommentClearSeat","styles.panelIconButtonClass","styles.diffLineAdd","styles.diffLineDelete","styles.diffLineHunk","styles.diffLineContext","styles.diffLineRowClass","styles.diffLine","styles.diffLineSelected","styles.diffCommentButtonClass","styles.diffLineNumber","styles.diffLineMarker","styles.diffLineText","styles.diffGapButton","styles.diffGapControls","styles.diffFile","styles.diffFileHeader","styles.chevron","styles.chevronOpen","styles.diffFilePath","styles.diffFileDir","styles.diffFileName","styles.diffFileStats","styles.diffAdd","styles.diffDelete","styles.diffCode","styles.diffCommentBlock","styles.diffCommentCardMeta","styles.reviewCommentChipRemove","styles.diffCommentCardText","styles.diffGhCommentAuthor","styles.diffGhCommentLink","styles.diffCommentRange","styles.diffCommentTextareaClass","styles.diffCommentTextarea","styles.diffCommentError","styles.diffCommentActions","styles.diffCommentActionButton","styles.diffCommentSubmitButton","styles.detailsCardCss","styles.diffModalCss","styles.panelIconButtonCss","styles.diffCommentCss","styles.detailsCardClass","styles.diffPanel","styles.diffPanelMaximized","styles.diffHeader","styles.diffHeaderTitle","styles.diffHeaderBranch","styles.diffHeaderLabel","styles.diffHeaderActions","styles.diffSplitButton","styles.diffCommitButton","styles.diffActionDisabled","styles.diffCommitMenuButton","styles.diffPrCommentsButton","styles.panelIconButtonClass","styles.diffSummary","styles.diffBody","styles.diffNotice","styles.diffEmpty","styles.diffModalFooter","styles.button","styles.diffModalButton","styles.primaryButton","styles.diffModalStatus","styles.diffModalBody","styles.diffModalMeta","styles.diffModalMetaText","styles.diffModalFileState","styles.diffModalFiles","styles.diffModalFile","styles.diffModalFilePath","styles.diffModalCheckbox","styles.diffModalField","styles.diffModalTextarea","styles.diffModalTextInput","styles.diffModalSuccess","styles.diffModalError","styles.panelIconButtonClass","styles.repositoryBarFrame","styles.panelIconButtonCss","styles.queueBar","styles.queueHeader","styles.queueLead","styles.queueCount","styles.queueList","styles.queueRow","styles.queueRowDivider","styles.queueEditor","styles.queuePreview","styles.queueActions","styles.repositoryItemSuccess","styles.repositoryItemWarning","styles.repositoryItemError","styles.repositoryItem","styles.repositoryItemDot","styles.repositoryItemLabel","styles.detailsCardClass","styles.tasksPanel","styles.detailsCardCss","styles.panelIconButtonCss","styles.tasksHeader","styles.tasksHeading","styles.tasksTurnMeta","styles.panelIconButtonClass","styles.overviewBody","styles.overviewEmpty","styles.overviewRow","styles.overviewRowTop","styles.overviewRunningDot","styles.overviewTitle","styles.overviewMeta","styles.overviewBranch","styles.askToolbar","styles.panelIconButtonCss","styles.panelIconButtonClass","styles.askPopup","styles.askHighlightCss","styles.askQuote","styles.askTextarea","styles.askActions","styles.askButton","styles.askPrimaryButton","styles.askQuestion","styles.askAnswer","styles.askThinkingRow","styles.askThinkingLabel","styles.askThinkingFull","styles.askThinkingPreview","styles.askStatus","styles.askToolRow","styles.askToolGlyph","styles.askToolGlyphError","styles.askToolGlyphDone","styles.askToolName","styles.askToolSummary","styles.askError","styles.heroWorktreeProgressCard","styles.heroWorktreeProgressHeader","styles.heroWorktreeProgressSpinner","styles.heroWorktreeProgressError","styles.heroWorktreeProgressCopy","styles.heroWorktreeProgressTitle","styles.heroWorktreeProgressContext","styles.heroWorktreeProgressCurrent","styles.heroWorktreeProgressDismiss","styles.heroWorktreeProgressSteps","styles.heroWorktreeProgressStep","styles.heroWorktreeProgressDot","styles.heroWorktreeProgressDotDone","styles.heroWorktreeProgressDotActive","styles.heroRepositoryCapsule","styles.heroBranchPicker","styles.heroBranchTrigger","styles.heroBranchName","styles.heroBranchMenu","styles.heroBranchSearch","styles.heroBranchSearchInput","styles.heroBranchList","styles.heroBranchEmpty","styles.heroBranchItem","styles.heroBranchItemActive","styles.heroBranchItemName","styles.heroRepositoryDivider","styles.heroWorktreeToggle","styles.heroWorktreeToggleActive","styles.heroWorktreeToggleFocused","styles.heroWorktreeCheckbox","styles.heroWorktreeCheckboxChecked","styles.heroWorktreeCheckboxIcon","styles.heroRepositoryControls","styles.heroRepositoryStatus","styles.heroTicketMenu","styles.heroTicketChips","styles.heroTicketChip","styles.heroTicketChipRemove","styles.heroTicketChipsClear","styles.heroTicketCheckbox","styles.heroTicketKey","styles.heroTicketStatus","styles.heroRepositoryError"],"sources":["../src/constants.ts","../src/client/task-projection.ts","../src/client/conversation-sidecar.ts","../src/client/styles.ts","../src/client/token-format.ts","../src/client/ClaudeTasksPanel.tsx","../src/client/ClaudeActivityTail.tsx","../src/client/ClaudeActiveTasksNode.tsx","../src/client/projection.ts","../src/client/ClaudeActivityNode.tsx","../src/client/jira-api.ts","../src/client/ClaudeCodeSettings.tsx","../src/client/repository-action-api.ts","../src/client/repository-setup-api.ts","../src/client/pr-feedback-api.ts","../src/client/auto-fix.ts","../src/client/ClaudeRepositoryStatus.tsx","../src/client/review-comment-api.ts","../src/client/ClaudeReviewComments.tsx","../src/client/ClaudeDiffPanel.tsx","../src/client/ClaudeDiffOverlay.tsx","../src/client/ClaudeQueueDock.tsx","../src/client/ClaudePullRequestsPanel.tsx","../src/client/ask-api.ts","../src/client/ClaudeSelectionAsk.tsx","../src/client/hero-dom-bridge.ts","../src/client/ClaudeHeroRepositoryControls.tsx","../src/client/claude-command-source.ts","../src/client/details-resize.ts","../src/client/locales.ts","../src/client/index.tsx"],"sourcesContent":["export const CLAUDE_CODE_PROVIDER = 'claude'\nexport const CLAUDE_CODE_PRESET_ID = 'claude'\nexport const CLAUDE_CODE_PROVIDER_IDS = [CLAUDE_CODE_PROVIDER] as const\nexport const CLAUDE_SESSION_BOUND_EVENT = 'claude-code/session-bound'\nexport const CLAUDE_ACTIVITY_EVENT = 'claude-code/activity'\nexport const CLAUDE_CONTEXT_USAGE_EVENT = 'claude-code/context-usage'\nexport const CLAUDE_TASKS_EVENT = 'claude-code/tasks'\n/** Claude's subagent dispatch tools; rendered as plugin-owned group cards\n * gathering subagent activity instead of native tool cards. */\nexport const TASK_TOOL_NAMES: ReadonlySet<string> = new Set(['Task', 'Agent'])\nexport const SDK_VERSION = '0.3.247'\nexport const CLAUDE_DOCTOR_PATH = '/plugins/dsh-claude/doctor'\nexport const CLAUDE_UPDATE_CHECK_PATH = '/plugins/dsh-claude/update/check'\nexport const CLAUDE_USAGE_PATH = '/plugins/dsh-claude/usage'\nexport const CLAUDE_UPDATE_PATH = '/plugins/dsh-claude/update'\nexport const CLAUDE_PROJECTION_PATH = '/plugins/dsh-claude/projection'\nexport const CLAUDE_GLOBAL_SETTINGS_PATH = '/plugins/dsh-claude/settings/global'\nexport const CLAUDE_REPOSITORY_SETUP_PATH = '/plugins/dsh-claude/repository/setup'\nexport const CLAUDE_REPOSITORY_ACTION_PATH = '/plugins/dsh-claude/repository/action'\nexport const CLAUDE_REVIEW_COMMENT_PATH = '/plugins/dsh-claude/review-comments'\nexport const CLAUDE_REPOSITORY_FEEDBACK_PATH = '/plugins/dsh-claude/repository/feedback'\nexport const CLAUDE_REPOSITORY_STATUS_PATH = '/plugins/dsh-claude/repository/status'\nexport const CLAUDE_REPOSITORY_FILE_PATH = '/plugins/dsh-claude/repository/file'\nexport const CLAUDE_JIRA_PATH = '/plugins/dsh-claude/jira'\nexport const CLAUDE_ASK_PATH = '/plugins/dsh-claude/ask'\n","import type { ClaudeActivityEvent, ClaudeTaskInfo } from '../events.ts'\n\n/** Tasks UI is reserved for detached work and genuine Claude subagents. */\nexport function isProjectedTask(task: ClaudeTaskInfo): boolean {\n if (task.backgrounded === true) return true\n return task.subagentType !== undefined && task.subagentType.trim().length > 0\n}\n\nexport function isProjectedTaskActivity(\n activity: ClaudeActivityEvent,\n tasks: readonly ClaudeTaskInfo[],\n): boolean {\n if (activity.kind !== 'subagent' || activity.parentToolUseId !== undefined) return true\n if (activity.taskId === undefined) return false\n const task = tasks.find(candidate => candidate.taskId === activity.taskId)\n return task !== undefined && isProjectedTask(task)\n}\n","import type {\n ChatConversationViewNode,\n ConversationNodeDefinition,\n} from '@deepseek-ai/dsh-client-runtime/client'\nimport type { TurnTailOwnerProps } from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type { ClaudeActivityEvent, ClaudeActivityPhase, ClaudeTaskInfo } from '../events.ts'\nimport { CLAUDE_CODE_PROVIDER, TASK_TOOL_NAMES } from '../constants.ts'\nimport { isProjectedTaskActivity } from './task-projection.ts'\n\nexport interface ClaudeSubcall {\n toolUseId: string\n toolName?: string\n phase?: ClaudeActivityPhase\n summary?: string\n isError?: boolean\n}\n\nexport interface ClaudeActivityChatData {\n activity: ClaudeActivityEvent\n running: boolean\n subcalls: readonly ClaudeSubcall[]\n}\n\nexport interface ClaudeTranscriptDiff {\n path: string\n oldText: string | null\n newText: string\n}\n\nexport interface ClaudeTranscriptTool {\n toolUseId: string\n toolName: string\n description: string\n summary?: string\n input?: string\n output?: string\n phase?: ClaudeActivityPhase\n isError?: boolean\n additions?: number\n deletions?: number\n diffs?: readonly ClaudeTranscriptDiff[]\n subcalls: readonly ClaudeSubcall[]\n}\n\nexport type ClaudeTranscriptItem =\n | { kind: 'text'; ordinal: number; text: string }\n | { kind: 'tools'; ordinal: number; tools: readonly ClaudeTranscriptTool[]; additions?: number; deletions?: number; files?: number }\n | { kind: 'activity'; ordinal: number; row: ClaudeActivityChatData }\n\nexport interface ClaudeTurnMarker {\n readonly turn: number\n}\n\nexport interface ClaudeActivityStepMarker {\n readonly turn: number\n readonly step: number\n}\n\nexport interface ClaudeActiveTasksMarker {\n readonly turn: number\n}\n\ninterface ClaudeActiveTasksState extends ClaudeActiveTasksMarker {\n readonly active: boolean\n readonly anchored: boolean\n readonly anchorSeq: number\n}\n\ninterface ClaudeTurnProjectionState extends ClaudeTurnMarker {\n readonly claude: boolean\n}\n\ndeclare module '@deepseek-ai/dsh-client-runtime/client' {\n interface ConversationTurnDataMap {\n claudeCode: ClaudeTurnMarker\n }\n}\n\ndeclare module '@deepseek-ai/dsh-client-ui-conversation/client' {\n interface ChatNodeDataMap {\n 'claude-activity-step': ClaudeActivityStepMarker\n 'claude-active-tasks': ClaudeActiveTasksMarker\n }\n}\n\nfunction isTaskActivity(value: ClaudeActivityEvent): boolean {\n return (value.kind === 'tool-call' || value.kind === 'tool-result')\n && value.toolName !== undefined\n && TASK_TOOL_NAMES.has(value.toolName)\n}\n\nexport function presentable(activity: ClaudeActivityEvent): boolean {\n if (isTaskActivity(activity)) return true\n if (activity.kind === 'tool-call' || activity.kind === 'tool-result') return false\n if (activity.isError === true) return true\n if (activity.title?.startsWith('Unknown Claude SDK message') === true) return false\n switch (activity.kind) {\n case 'subagent':\n case 'permission':\n case 'warning':\n case 'error':\n return true\n case 'thinking':\n return activity.summary !== undefined && activity.summary.length > 0\n default:\n return false\n }\n}\n\nfunction running(activity: ClaudeActivityEvent): boolean {\n return activity.phase === 'started' || activity.phase === 'updated'\n}\n\nfunction subcallOf(value: ClaudeActivityEvent): ClaudeSubcall | undefined {\n if (value.kind !== 'subagent' || value.toolUseId === undefined) return undefined\n return {\n toolUseId: value.toolUseId,\n ...(value.toolName === undefined ? {} : { toolName: value.toolName }),\n ...(value.phase === undefined ? {} : { phase: value.phase }),\n ...(value.summary === undefined ? {} : { summary: value.summary }),\n ...(value.isError === undefined ? {} : { isError: value.isError }),\n }\n}\n\n/** Fold raw sidecar activity into the same lifecycle cards the old event projection rendered. */\nfunction activityRows(\n activities: readonly ClaudeActivityEvent[],\n accepts: (activity: ClaudeActivityEvent) => boolean,\n tasks: readonly ClaudeTaskInfo[] = [],\n): readonly ClaudeActivityChatData[] {\n const rows: ClaudeActivityChatData[] = []\n const byId = new Map<string, number>()\n for (const value of activities) {\n if (!accepts(value) || !isProjectedTaskActivity(value, tasks)) continue\n const existingTaskId = value.toolUseId === undefined ? undefined : `task-${value.toolUseId}`\n const updatesExistingTask = value.kind === 'tool-result'\n && existingTaskId !== undefined\n && byId.has(existingTaskId)\n if (!presentable(value) && !updatesExistingTask) continue\n let id: string\n if ((isTaskActivity(value) || updatesExistingTask) && existingTaskId !== undefined) id = existingTaskId\n else if (value.kind === 'subagent' && value.parentToolUseId !== undefined) id = `task-${value.parentToolUseId}`\n else if (value.kind === 'subagent' && value.taskId !== undefined) id = `subagent-task-${value.taskId}`\n else if (value.kind === 'subagent' && value.toolUseId !== undefined) id = `call-${value.toolUseId}`\n else id = `act-${value.turn}-${value.step}-${value.ordinal}`\n const index = byId.get(id)\n if (index === undefined) {\n byId.set(id, rows.length)\n rows.push({ activity: value, running: running(value), subcalls: [] })\n continue\n }\n const previous = rows[index]\n if (previous === undefined) continue\n if (value.kind === 'subagent' && value.parentToolUseId !== undefined) {\n const nested = subcallOf(value)\n if (nested === undefined) continue\n const nestedIndex = previous.subcalls.findIndex(item => item.toolUseId === nested.toolUseId)\n const subcalls = nestedIndex === -1\n ? [...previous.subcalls, nested]\n : previous.subcalls.map((item, position) => position === nestedIndex ? { ...item, ...nested } : item)\n rows[index] = { ...previous, subcalls }\n continue\n }\n rows[index] = {\n activity: {\n ...value,\n ...(value.toolName === undefined && previous.activity.toolName !== undefined\n ? { toolName: previous.activity.toolName }\n : {}),\n },\n running: running(value),\n subcalls: previous.subcalls,\n }\n }\n const taskStatus = new Map(tasks.map(task => [task.taskId, task.status]))\n return rows.map(row => {\n const taskId = row.activity.taskId\n const status = taskId === undefined ? undefined : taskStatus.get(taskId)\n if (status === undefined || status === 'running') return row\n const failed = status === 'failed' || status === 'stopped' || status === 'killed'\n const settledTitle = row.activity.title?.replace(/^Running\\s+/u, '')\n return {\n ...row,\n running: false,\n activity: {\n ...row.activity,\n phase: failed ? 'failed' : 'completed',\n ...(settledTitle === undefined ? {} : { title: settledTitle }),\n ...(failed ? { isError: true } : {}),\n },\n }\n })\n}\n\nexport function activityRowsForTurn(\n activities: readonly ClaudeActivityEvent[],\n turn: number,\n tasks: readonly ClaudeTaskInfo[] = [],\n): readonly ClaudeActivityChatData[] {\n return activityRows(activities, activity => activity.turn === turn, tasks)\n}\n\nexport function activityRowsForStep(\n activities: readonly ClaudeActivityEvent[],\n turn: number,\n step: number,\n tasks: readonly ClaudeTaskInfo[] = [],\n): readonly ClaudeActivityChatData[] {\n return activityRows(activities, activity => activity.turn === turn && activity.step === step, tasks)\n}\n\nfunction inputRecord(detail: string | undefined): Record<string, unknown> | undefined {\n if (detail === undefined) return undefined\n try {\n const value: unknown = JSON.parse(detail)\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined\n } catch {\n return undefined\n }\n}\n\nfunction inputString(input: Record<string, unknown> | undefined, key: string): string | undefined {\n const value = input?.[key]\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction lineCount(text: string): number {\n return text.length === 0 ? 0 : text.split(/\\r?\\n/u).length\n}\n\nfunction editDiffs(toolName: string, input: Record<string, unknown> | undefined): readonly ClaudeTranscriptDiff[] | undefined {\n const path = inputString(input, 'file_path')\n if (path === undefined) return undefined\n if (toolName === 'MultiEdit' && Array.isArray(input?.edits)) {\n const diffs = input.edits.flatMap(edit => {\n if (edit === null || typeof edit !== 'object' || Array.isArray(edit)) return []\n const item = edit as Record<string, unknown>\n const newText = inputString(item, 'new_string')\n if (newText === undefined) return []\n return [{ path, oldText: inputString(item, 'old_string') ?? null, newText }]\n })\n return diffs.length === 0 ? undefined : diffs\n }\n if (toolName === 'Edit') {\n const newText = inputString(input, 'new_string')\n return newText === undefined ? undefined : [{ path, oldText: inputString(input, 'old_string') ?? null, newText }]\n }\n if (toolName === 'Write') {\n const content = inputString(input, 'content')\n return content === undefined ? undefined : [{ path, oldText: null, newText: content }]\n }\n return undefined\n}\n\nfunction toolDescription(toolName: string, input: Record<string, unknown> | undefined, failed = false): string {\n const path = inputString(input, 'file_path') ?? inputString(input, 'path')\n const pattern = inputString(input, 'pattern') ?? inputString(input, 'query')\n const description = inputString(input, 'description')\n const target = path ?? pattern\n let completed: string\n let failedAction: string\n switch (toolName) {\n case 'Grep':\n completed = path === undefined ? `Searched for ${pattern ?? 'matches'}` : `Searched ${path} for ${pattern ?? 'matches'}`\n failedAction = path === undefined ? `search for ${pattern ?? 'matches'}` : `search ${path} for ${pattern ?? 'matches'}`\n break\n case 'Glob':\n completed = `Searched for ${pattern ?? 'files'}`\n failedAction = `search for ${pattern ?? 'files'}`\n break\n case 'Read':\n completed = `Read ${path ?? 'a file'}`\n failedAction = `read ${path ?? 'a file'}`\n break\n case 'WebFetch': {\n const url = inputString(input, 'url') ?? 'a web page'\n completed = `Fetched ${url}`\n failedAction = `fetch ${url}`\n break\n }\n case 'WebSearch':\n completed = `Searched the web for ${pattern ?? 'results'}`\n failedAction = `search the web for ${pattern ?? 'results'}`\n break\n case 'Edit': case 'MultiEdit':\n completed = `Edited ${path ?? 'a file'}`\n failedAction = `edit ${path ?? 'a file'}`\n break\n case 'Write':\n completed = `Wrote ${path ?? 'a file'}`\n failedAction = `write ${path ?? 'a file'}`\n break\n case 'Bash': {\n const command = inputString(input, 'command') ?? 'a command'\n completed = description ?? `Ran ${command}`\n failedAction = description === undefined ? `run ${command}` : description\n break\n }\n default:\n completed = description ?? `${toolName}${target === undefined ? '' : ` ${target}`}`\n failedAction = completed.charAt(0).toLowerCase() + completed.slice(1)\n }\n return failed ? `Failed to ${failedAction}` : completed\n}\n\n/** Fold one step's shared ordinal stream into Claude Code-style prose and tool groups. */\nexport function transcriptItemsForStep(\n activities: readonly ClaudeActivityEvent[],\n turn: number,\n step: number,\n tasks: readonly ClaudeTaskInfo[] = [],\n): readonly ClaudeTranscriptItem[] {\n const ordered = activities\n .filter(activity => activity.turn === turn && activity.step === step)\n .slice()\n .sort((left, right) => left.ordinal - right.ordinal)\n const items: ClaudeTranscriptItem[] = []\n let group: {\n ordinal: number\n tools: ClaudeTranscriptTool[]\n byId: Map<string, number>\n trailingActivities: ClaudeActivityEvent[]\n } | undefined\n const flushGroup = (): void => {\n if (group === undefined || group.tools.length === 0) return\n const current = group\n const diffs = current.tools.flatMap(tool => tool.diffs ?? [])\n const additions = diffs.reduce((total, diff) => total + lineCount(diff.newText), 0)\n const deletions = diffs.reduce((total, diff) => total + (diff.oldText === null ? 0 : lineCount(diff.oldText)), 0)\n const files = new Set(diffs.map(diff => diff.path)).size\n items.push({\n kind: 'tools',\n ordinal: current.ordinal,\n tools: current.tools,\n ...(diffs.length === 0 ? {} : { additions, deletions, files }),\n })\n group = undefined\n for (const activity of current.trailingActivities) {\n const row = activityRows([activity], () => true, tasks)[0]\n if (row !== undefined) items.push({ kind: 'activity', ordinal: activity.ordinal, row })\n }\n }\n for (const activity of ordered) {\n if (!isProjectedTaskActivity(activity, tasks)) continue\n if (activity.kind === 'text') {\n flushGroup()\n if (activity.text !== undefined && activity.text.length > 0) {\n items.push({ kind: 'text', ordinal: activity.ordinal, text: activity.text })\n }\n continue\n }\n if (activity.kind === 'tool-call' && activity.toolUseId !== undefined && activity.toolName !== undefined) {\n group ??= { ordinal: activity.ordinal, tools: [], byId: new Map(), trailingActivities: [] }\n group.byId.set(activity.toolUseId, group.tools.length)\n const input = inputRecord(activity.detail)\n group.tools.push({\n toolUseId: activity.toolUseId,\n toolName: activity.toolName,\n description: toolDescription(activity.toolName, input),\n ...(activity.summary === undefined ? {} : { summary: activity.summary }),\n ...(activity.detail === undefined ? {} : { input: activity.detail }),\n ...(activity.phase === undefined ? {} : { phase: activity.phase }),\n ...(activity.isError === undefined ? {} : { isError: activity.isError }),\n subcalls: [],\n })\n continue\n }\n if ((activity.kind === 'tool-result' || activity.kind === 'permission') && activity.toolUseId !== undefined && group !== undefined) {\n const index = group.byId.get(activity.toolUseId)\n const previous = index === undefined ? undefined : group.tools[index]\n if (index !== undefined && previous !== undefined) {\n const failed = activity.isError === true || activity.phase === 'failed' || activity.kind === 'permission'\n const diffs = failed ? undefined : editDiffs(previous.toolName, inputRecord(previous.input))\n const additions = diffs?.reduce((total, diff) => total + lineCount(diff.newText), 0)\n const deletions = diffs?.reduce((total, diff) => total + (diff.oldText === null ? 0 : lineCount(diff.oldText)), 0)\n group.tools[index] = {\n ...previous,\n description: toolDescription(previous.toolName, inputRecord(previous.input), failed),\n ...(activity.detail === undefined ? {} : { output: activity.detail }),\n ...(activity.phase === undefined ? {} : { phase: activity.phase }),\n ...(activity.isError === undefined ? {} : { isError: activity.isError }),\n ...(diffs === undefined ? {} : { diffs, additions: additions ?? 0, deletions: deletions ?? 0 }),\n ...(activity.kind === 'permission' ? { output: activity.summary, isError: true } : {}),\n }\n }\n continue\n }\n if (activity.kind === 'subagent' && activity.parentToolUseId !== undefined && group !== undefined) {\n const index = group.byId.get(activity.parentToolUseId)\n const previous = index === undefined ? undefined : group.tools[index]\n const nested = subcallOf(activity)\n if (index !== undefined && previous !== undefined && nested !== undefined) {\n const nestedIndex = previous.subcalls.findIndex(item => item.toolUseId === nested.toolUseId)\n const subcalls = nestedIndex === -1\n ? [...previous.subcalls, nested]\n : previous.subcalls.map((item, position) => position === nestedIndex ? { ...item, ...nested } : item)\n group.tools[index] = { ...previous, subcalls }\n }\n continue\n }\n if (!presentable(activity)) continue\n if (group !== undefined) {\n // Only the next top-level assistant prose closes a tool group. Keep any\n // presentable task/warning metadata after that group without splitting\n // consecutive root tools that occurred between the same two prose spans.\n group.trailingActivities.push(activity)\n continue\n }\n const row = activityRows([activity], () => true, tasks)[0]\n if (row !== undefined) items.push({ kind: 'activity', ordinal: activity.ordinal, row })\n }\n flushGroup()\n return items\n}\n\ninterface ClaudeActivityStepState extends ClaudeActivityStepMarker {\n readonly anchorSeq: number\n readonly assistantSeq?: number\n}\n\n/** Keep one sidecar-backed activity group at the live chat tail, then anchor it\n * before the native assistant message or at step settlement when none appears. */\nexport const claudeActivityStepDefinition: ConversationNodeDefinition<ClaudeActivityStepState> = {\n kind: 'claude-activity-step',\n target: 'chat',\n match(event) {\n if (event.type === 'step/start') return { id: `${event.data.turn}:${event.data.step}`, role: 'start' }\n if (event.type === 'step/end') return { id: `${event.data.turn}:${event.data.step}`, role: 'update' }\n if (event.type !== 'assistant/message' || event.data.message.source.provider !== CLAUDE_CODE_PROVIDER) return null\n return { id: `${event.data.turn}:${event.data.step}`, role: 'update' }\n },\n start(_context, match) {\n if (match.event.type !== 'step/start') throw new Error('Claude activity step requires step/start')\n return {\n turn: match.event.data.turn,\n step: match.event.data.step,\n anchorSeq: Number.MAX_SAFE_INTEGER - 1,\n }\n },\n update(context, match) {\n if (match.event.type === 'assistant/message') {\n return { ...context.state, assistantSeq: match.event.seq, anchorSeq: match.event.seq - 0.1 }\n }\n if (match.event.type === 'step/end') {\n return context.state.assistantSeq === undefined\n ? { ...context.state, anchorSeq: match.event.seq - 0.1 }\n : context.state\n }\n throw new Error('Claude activity step update requires assistant/message or step/end')\n },\n buildViewNode(context): ChatConversationViewNode | null {\n const state = context.state\n if (state === undefined) return null\n return {\n key: context.key,\n kind: 'claude-activity-step',\n id: context.id,\n target: 'chat',\n anchorSeq: state.anchorSeq,\n location: context.start?.location ?? { kind: 'unresolved' },\n visibility: 'visible',\n data: { turn: state.turn, step: state.step },\n }\n },\n}\n\n/** Keep one sidecar-backed task launcher mounted only while its DSH turn is open. */\nexport const claudeActiveTasksDefinition: ConversationNodeDefinition<ClaudeActiveTasksState> = {\n kind: 'claude-active-tasks',\n target: 'chat',\n match(event) {\n if (event.type === 'turn/start') return { id: String(event.data.turn), role: 'start' }\n if (event.type === 'turn/end' || event.type === 'step/start' || event.type === 'assistant/message') {\n return { id: String(event.data.turn), role: 'update' }\n }\n return null\n },\n start(_context, match) {\n if (match.event.type !== 'turn/start') throw new Error('Claude active tasks require turn/start')\n // A user/message has no turn coordinate in the public event payload, so it\n // cannot update this turn-keyed Context directly. Keep the launcher at the\n // live chat tail until assistant output provides a concrete later anchor.\n return {\n turn: match.event.data.turn,\n active: true,\n anchored: false,\n anchorSeq: Number.MAX_SAFE_INTEGER,\n }\n },\n update(context, match) {\n if (match.event.type === 'turn/end') return { ...context.state, active: false }\n if (match.event.type === 'step/start' && !context.state.anchored) return context.state\n return { ...context.state, anchored: true, anchorSeq: match.event.seq + 0.1 }\n },\n buildViewNode(context): ChatConversationViewNode | null {\n const state = context.state\n if (state === undefined) return null\n return {\n key: context.key,\n kind: 'claude-active-tasks',\n id: context.id,\n target: 'chat',\n anchorSeq: state.anchorSeq,\n location: context.start?.location ?? { kind: 'unresolved' },\n // Incremental assemblers forbid withdrawing a materialized node. Keep\n // its key stable after turn/end and hide it while the turn tail takes over.\n visibility: state.active ? 'visible' : 'hidden',\n data: { turn: state.turn },\n }\n },\n}\n\n/** Publish a marker for turns containing standard assistant output from the Claude adapter. */\nexport const claudeTurnDefinition: ConversationNodeDefinition<ClaudeTurnProjectionState> = {\n kind: 'claudeCode',\n match(event) {\n if (event.type === 'turn/start') return { id: String(event.data.turn), role: 'start' }\n if (event.type !== 'assistant/message' || event.data.message.source.provider !== CLAUDE_CODE_PROVIDER) return null\n return { id: String(event.data.turn), role: 'update' }\n },\n start(_context, match) {\n if (match.event.type !== 'turn/start') throw new Error('Claude turn marker requires turn/start')\n return { turn: match.event.data.turn, claude: false }\n },\n update(context, match) {\n if (match.event.type !== 'assistant/message') throw new Error('Claude turn marker update requires assistant/message')\n return context.state.claude ? context.state : { turn: context.state.turn, claude: true }\n },\n buildLocationData(context, scope) {\n if (scope !== 'turn' || context.state?.claude !== true) return null\n const value: ClaudeTurnMarker = { turn: context.state.turn }\n return { kind: 'turn', turn: context.state.turn, key: 'claudeCode', value }\n },\n}\n\n/** Pure chain selector: only Claude-produced turns mount the sidecar-backed tail. */\nexport function selectClaudeTurn(owner: TurnTailOwnerProps): ClaudeTurnMarker | null {\n return owner.turn.data.get('claudeCode') ?? null\n}\n","import type { CSSProperties } from 'react'\n\nexport const iconChipRunning: CSSProperties = {\n color: 'var(--dsw-static-blue-450)',\n}\n\nexport const iconChipError: CSSProperties = {\n color: 'var(--dsw-alias-state-error-primary)',\n}\n\nexport const chevron: CSSProperties = {\n flex: 'none',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n lineHeight: '20px',\n transition: 'transform 120ms ease',\n userSelect: 'none',\n}\n\nexport const chevronOpen: CSSProperties = {\n transform: 'rotate(90deg)',\n}\n\nexport const detailCode: CSSProperties = {\n maxHeight: 220,\n overflow: 'auto',\n margin: '5px 0 0',\n padding: '8px 10px',\n borderRadius: 6,\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 11,\n lineHeight: '17px',\n whiteSpace: 'pre-wrap',\n overflowWrap: 'anywhere',\n}\n\nexport const settingsPage: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n width: '100%',\n maxWidth: 820,\n paddingBottom: 28,\n}\n\nexport const settingsHero: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 14,\n padding: '2px 2px 8px',\n}\n\nexport const settingsMark: CSSProperties = {\n width: 42,\n height: 42,\n display: 'grid',\n placeItems: 'center',\n flex: 'none',\n borderRadius: 13,\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-static-blue-450)',\n fontSize: 18,\n fontWeight: 700,\n}\n\nexport const settingsHeading: CSSProperties = {\n margin: 0,\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 20,\n lineHeight: '28px',\n fontWeight: 650,\n}\n\nexport const settingsSectionHeading: CSSProperties = {\n margin: 0,\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 15,\n lineHeight: '22px',\n fontWeight: 650,\n}\n\nexport const settingsBody: CSSProperties = {\n margin: 0,\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 14,\n lineHeight: '22px',\n}\n\nexport const settingsCard: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 14,\n padding: 18,\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 14,\n background: 'var(--dsw-alias-bg-layer-1)',\n}\n\nexport const settingsCardHeader: CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 16,\n}\n\nexport const diagnosticGrid: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'minmax(130px, 0.36fr) minmax(0, 1fr)',\n gap: '10px 18px',\n padding: '14px 0',\n borderTop: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n fontSize: 13,\n}\n\nexport const diagnosticLabel: CSSProperties = {\n color: 'var(--dsw-alias-label-tertiary)',\n}\n\nexport const diagnosticValue: CSSProperties = {\n color: 'var(--dsw-alias-label-primary)',\n fontWeight: 500,\n overflowWrap: 'anywhere',\n}\n\nexport const settingSelect: CSSProperties = {\n position: 'relative',\n minWidth: 0,\n}\n\nexport const settingTextInput: CSSProperties = {\n width: '100%',\n minWidth: 0,\n boxSizing: 'border-box',\n minHeight: 38,\n padding: '7px 13px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 10,\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-primary)',\n font: 'inherit',\n fontSize: 14,\n lineHeight: '22px',\n}\n\nexport const settingSelectTrigger: CSSProperties = {\n width: '100%',\n minHeight: 38,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n padding: '7px 11px 7px 13px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 10,\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-primary)',\n boxShadow: '0 1px 2px color-mix(in srgb, var(--dsw-alias-label-primary) 5%, transparent)',\n font: 'inherit',\n fontSize: 14,\n lineHeight: '22px',\n textAlign: 'left',\n cursor: 'pointer',\n transition: 'border-color 120ms ease, box-shadow 120ms ease, background 120ms ease',\n}\n\nexport const settingSelectTriggerOpen: CSSProperties = {\n borderColor: 'var(--dsw-static-blue-450)',\n boxShadow: '0 0 0 3px color-mix(in srgb, var(--dsw-static-blue-450) 15%, transparent)',\n}\n\nexport const settingSelectValue: CSSProperties = {\n minWidth: 0,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const settingSelectChevron: CSSProperties = {\n flex: 'none',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 16,\n lineHeight: 1,\n transform: 'translateY(-1px)',\n transition: 'transform 120ms ease',\n}\n\nexport const settingSelectChevronOpen: CSSProperties = {\n transform: 'translateY(1px) rotate(180deg)',\n}\n\nexport const settingSelectMenu: CSSProperties = {\n position: 'absolute',\n zIndex: 20,\n top: 'calc(100% + 6px)',\n left: 0,\n right: 0,\n maxHeight: 240,\n overflowY: 'auto',\n padding: 5,\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 11,\n background: 'var(--dsw-alias-bg-layer-1)',\n boxShadow: '0 12px 32px color-mix(in srgb, var(--dsw-alias-label-primary) 16%, transparent), 0 2px 8px color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent)',\n}\n\nexport const settingSelectOption: CSSProperties = {\n width: '100%',\n minHeight: 34,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '6px 9px',\n border: 'none',\n borderRadius: 7,\n background: 'transparent',\n color: 'var(--dsw-alias-label-primary)',\n font: 'inherit',\n fontSize: 14,\n lineHeight: '22px',\n textAlign: 'left',\n cursor: 'pointer',\n}\n\nexport const settingSelectOptionActive: CSSProperties = {\n background: 'var(--dsw-alias-bg-layer-2)',\n}\n\nexport const settingSelectCheck: CSSProperties = {\n width: 14,\n flex: 'none',\n color: 'var(--dsw-static-blue-450)',\n fontSize: 12,\n fontWeight: 700,\n textAlign: 'center',\n}\n\nexport const settingHint: CSSProperties = {\n display: 'inline-grid',\n placeItems: 'center',\n width: 14,\n height: 14,\n marginLeft: 6,\n verticalAlign: 'text-top',\n borderRadius: '50%',\n border: '1px solid currentColor',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 9,\n fontWeight: 600,\n lineHeight: 1,\n cursor: 'help',\n userSelect: 'none',\n}\nexport const planUsageMeter: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n minWidth: 0,\n}\nexport const planUsageTrack: CSSProperties = {\n flex: '1 1 auto',\n height: 6,\n minWidth: 60,\n borderRadius: 3,\n background: 'var(--dsw-alias-bg-layer-2)',\n overflow: 'hidden',\n}\nexport const planUsageFill: CSSProperties = {\n // A span defaults to inline, where width and height are ignored — the bar\n // silently renders as an empty track without this.\n display: 'block',\n height: '100%',\n borderRadius: 3,\n transition: 'width 200ms ease',\n}\nexport const planUsageMeta: CSSProperties = {\n flex: '0 0 auto',\n fontSize: 12,\n whiteSpace: 'nowrap',\n}\n\nexport const PLAN_USAGE_WARNING_AT = 75\nexport const PLAN_USAGE_ERROR_AT = 90\n\n/** Bar colour, plus a matching text colour once a window is worth noticing.\n * Below the warning threshold the reading stays quiet: accent bar, muted text. */\nexport function planUsageTone(utilization: number | undefined): { fill: string; text: string } {\n if (utilization !== undefined && utilization >= PLAN_USAGE_ERROR_AT) {\n return { fill: 'var(--dsw-alias-state-error-primary)', text: 'var(--dsw-alias-state-error-primary)' }\n }\n if (utilization !== undefined && utilization >= PLAN_USAGE_WARNING_AT) {\n return { fill: 'var(--dsw-alias-state-warning-primary, #d69e2e)', text: 'var(--dsw-alias-state-warning-primary, #d69e2e)' }\n }\n return {\n fill: utilization === undefined ? 'transparent' : 'var(--dsw-static-blue-450)',\n text: 'var(--dsw-alias-label-tertiary)',\n }\n}\nexport const settingsActions: CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 8,\n}\n\nexport const notice: CSSProperties = {\n margin: 0,\n padding: '10px 12px',\n borderRadius: 9,\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 12,\n lineHeight: '18px',\n}\n\nexport const button: CSSProperties = {\n alignSelf: 'flex-start',\n flex: 'none',\n minHeight: 34,\n padding: '6px 14px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 9,\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-primary)',\n font: 'inherit',\n fontSize: 13,\n fontWeight: 550,\n whiteSpace: 'nowrap',\n cursor: 'pointer',\n}\n\nexport const primaryButton: CSSProperties = {\n ...button,\n borderColor: 'transparent',\n background: 'var(--dsw-static-blue-450)',\n color: 'var(--dsw-static-white)',\n}\n\n/* Claude tasks details panel (right sidebar). */\n\nexport const tasksPanel: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n overflow: 'hidden',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 12,\n background: 'var(--dsw-alias-bg-layer-1)',\n boxShadow: '0 4px 16px color-mix(in srgb, #000 12%, transparent)',\n}\n\nexport const detailsCardClass = 'dshClaudeDetailsCard'\n\n/**\n * Geometry shared by every details-column card. Lives in a stylesheet rather\n * than inline so the DSH Desktop macOS shell can be special-cased: its\n * \"advanced\" frame floats a 32px opaque caption/drag row over the top of the\n * conversation and details columns, 12px of which lands inside the column and\n * used to cover the card's top border and corners.\n */\nexport const detailsCardCss = `\n.${detailsCardClass} {\n box-sizing: border-box;\n width: calc(100% - 16px);\n height: calc(100% - 16px);\n margin: 8px;\n}\n.dshDesktopFrame[data-desktop-mode=\"advanced\"][data-desktop-platform=\"darwin\"] .dshDesktopDetailsSurface .${detailsCardClass} {\n height: calc(100% - 28px);\n margin-top: 20px;\n}\n`\n\nexport const tasksHeader: CSSProperties = {\n boxSizing: 'border-box',\n height: 58,\n flex: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 10,\n padding: '9px 12px',\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n}\n\nexport const tasksHeading: CSSProperties = {\n display: 'block',\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 15,\n lineHeight: '20px',\n fontWeight: 600,\n}\n\nexport const tasksTurnMeta: CSSProperties = {\n display: 'block',\n marginTop: 1,\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n lineHeight: '17px',\n}\n\nexport const panelIconButtonClass = 'dshClaudePanelIconButton'\n\nexport const panelIconButtonCss = `\n.${panelIconButtonClass} {\n width: 26px;\n height: 26px;\n display: grid;\n place-items: center;\n padding: 0;\n border: none;\n border-radius: 7px;\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n font: inherit;\n line-height: 1;\n cursor: pointer;\n transition: background-color 120ms ease, color 120ms ease;\n}\n.${panelIconButtonClass}:hover {\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n color: var(--dsw-alias-label-primary);\n}\n.${panelIconButtonClass}:active {\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent);\n}\n.${panelIconButtonClass}:focus-visible {\n outline: 2px solid var(--dsw-static-blue-450);\n outline-offset: 1px;\n}\n`\n\nexport const tasksBody: CSSProperties = {\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n padding: '12px 14px 20px',\n background: 'var(--dsw-alias-bg-base)',\n}\n\nexport const tasksGroupHeading: CSSProperties = {\n minHeight: 30,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 8,\n}\n\nexport const tasksGroupTitle: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 14,\n lineHeight: '22px',\n fontWeight: 600,\n}\n\nexport const tasksGroupToggle: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n padding: 0,\n border: 'none',\n background: 'transparent',\n color: 'var(--dsw-alias-label-secondary)',\n font: 'inherit',\n fontSize: 14,\n lineHeight: '22px',\n fontWeight: 600,\n cursor: 'pointer',\n}\n\nexport const tasksGroupCount: CSSProperties = {\n minWidth: 18,\n padding: '0 5px',\n borderRadius: 999,\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n lineHeight: '18px',\n textAlign: 'center',\n fontVariantNumeric: 'tabular-nums',\n}\n\nexport const tasksGroupEmpty: CSSProperties = {\n margin: '5px 4px 2px',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n lineHeight: '18px',\n}\n\nexport const tasksFinishedSection: CSSProperties = {\n marginTop: 12,\n paddingTop: 8,\n borderTop: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n}\n\nexport const taskCardList: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n marginTop: 4,\n}\n\nexport const taskCard: CSSProperties = {\n padding: '11px 12px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 10,\n background: 'var(--dsw-alias-bg-layer-1)',\n boxShadow: '0 1px 3px color-mix(in srgb, #000 7%, transparent)',\n}\n\nexport const taskCardRunning: CSSProperties = {\n borderColor: 'var(--dsw-alias-border-l3, color-mix(in srgb, currentColor 24%, transparent))',\n}\n\nexport const taskCardTop: CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 9,\n}\n\nexport const taskCardGlyph: CSSProperties = {\n width: 18,\n height: 18,\n flex: 'none',\n display: 'grid',\n placeItems: 'center',\n marginTop: 1,\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n lineHeight: 1,\n}\n\nexport const taskCardBody: CSSProperties = {\n flex: 1,\n minWidth: 0,\n}\n\nexport const taskTitle: CSSProperties = {\n margin: 0,\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 14,\n lineHeight: '20px',\n fontWeight: 550,\n overflowWrap: 'anywhere',\n}\n\nexport const taskStatusLine: CSSProperties = {\n margin: '1px 0 0',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n lineHeight: '17px',\n}\n\nexport const taskMeta: CSSProperties = {\n margin: '7px 0 0 27px',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n lineHeight: '17px',\n overflowWrap: 'anywhere',\n}\n\nexport const taskSummary: CSSProperties = {\n margin: '6px 0 0 27px',\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 12,\n lineHeight: '18px',\n whiteSpace: 'pre-wrap',\n overflowWrap: 'anywhere',\n}\n\nexport const taskTextButton: CSSProperties = {\n padding: 0,\n border: 'none',\n background: 'transparent',\n color: 'var(--dsw-static-blue-450)',\n font: 'inherit',\n fontSize: 11,\n lineHeight: '18px',\n cursor: 'pointer',\n}\n\nexport const taskActivitySection: CSSProperties = {\n margin: '7px 0 0 27px',\n}\n\nexport const taskActivityList: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 7,\n margin: '7px 0 0',\n padding: '8px 9px',\n borderRadius: 8,\n background: 'var(--dsw-alias-bg-layer-2)',\n listStyle: 'none',\n}\n\nexport const taskActivityItem: CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 6,\n}\n\nexport const taskActivityGlyph: CSSProperties = {\n flex: 'none',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n lineHeight: '17px',\n}\n\nexport const taskActivityBody: CSSProperties = {\n flex: 1,\n minWidth: 0,\n}\n\nexport const taskActivityTitle: CSSProperties = {\n margin: 0,\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 11,\n lineHeight: '17px',\n fontWeight: 500,\n overflowWrap: 'anywhere',\n}\n\nexport const taskActivitySummary: CSSProperties = {\n margin: '1px 0 0',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n lineHeight: '17px',\n whiteSpace: 'pre-wrap',\n overflowWrap: 'anywhere',\n}\n\nexport const taskActivityDetail: CSSProperties = {\n marginTop: 3,\n}\n\nexport const taskActivityDetailSummary: CSSProperties = {\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 10,\n lineHeight: '16px',\n cursor: 'pointer',\n}\n\nexport const tasksBadge: CSSProperties = {\n position: 'absolute',\n top: -3,\n right: -5,\n minWidth: 14,\n height: 14,\n display: 'grid',\n placeItems: 'center',\n padding: '0 3px',\n borderRadius: 999,\n background: 'var(--dsw-static-blue-450)',\n color: 'var(--dsw-alias-label-on-accent, #fff)',\n fontSize: 9,\n lineHeight: '1',\n fontWeight: 600,\n}\n\n/* Claude task launcher attached to the owning conversation turn (minimal\n * entry: a link-style label at the turn tail, hover reveals the task list). */\n\nexport const tasksBadgeWrap: CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-start',\n margin: '8px 0 4px',\n}\n\nexport const tasksBadgeSeat: CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n}\n\nexport const tasksTurnBadge: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n padding: '2px 4px',\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n color: 'var(--dsw-static-blue-450)',\n font: 'inherit',\n fontSize: 14,\n lineHeight: '22px',\n fontVariantNumeric: 'tabular-nums',\n cursor: 'pointer',\n transition: 'color 120ms ease, opacity 120ms ease',\n}\n\nexport const tasksBadgeHovered: CSSProperties = {\n textDecoration: 'underline',\n}\n\nexport const tasksBadgeDone: CSSProperties = {\n opacity: 0.7,\n}\n\nexport const tasksBadgeDot: CSSProperties = {\n width: 8,\n height: 8,\n flex: 'none',\n borderRadius: 999,\n background: 'var(--dsw-static-blue-450)',\n}\n\nexport const tasksBadgeDotError: CSSProperties = {\n background: 'var(--dsw-alias-state-error-primary)',\n}\n\nexport const tasksBadgeDotDone: CSSProperties = {\n background: 'var(--dsw-alias-state-success-primary, var(--dsw-static-green-500))',\n}\n\nexport const tasksBadgeLabel: CSSProperties = {\n fontWeight: 500,\n}\n\nexport const tasksHoverCard: CSSProperties = {\n position: 'absolute',\n left: 0,\n bottom: 'calc(100% + 8px)',\n zIndex: 40,\n minWidth: 240,\n maxWidth: 340,\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n padding: '10px 12px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 12,\n background: 'var(--dsw-alias-bg-layer-2)',\n boxShadow: '0 8px 24px color-mix(in srgb, #000 24%, transparent)',\n fontSize: 12,\n lineHeight: '18px',\n pointerEvents: 'auto',\n}\n\nexport const tasksHoverHeader: CSSProperties = {\n color: 'var(--dsw-alias-label-primary)',\n fontWeight: 600,\n}\n\nexport const tasksHoverRow: CSSProperties = {\n minWidth: 0,\n display: 'flex',\n alignItems: 'center',\n gap: 7,\n}\n\nexport const tasksHoverGlyph: CSSProperties = {\n width: 12,\n flex: 'none',\n textAlign: 'center',\n fontSize: 10,\n lineHeight: 1,\n fontWeight: 700,\n}\n\nexport const tasksHoverGlyphRunning: CSSProperties = {\n color: 'var(--dsw-static-blue-450)',\n}\n\nexport const tasksHoverGlyphError: CSSProperties = {\n color: 'var(--dsw-alias-state-error-primary)',\n}\n\nexport const tasksHoverGlyphDone: CSSProperties = {\n color: 'var(--dsw-alias-state-success-primary, var(--dsw-static-green-500))',\n}\n\nexport const tasksHoverDesc: CSSProperties = {\n minWidth: 0,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: 'var(--dsw-alias-label-secondary)',\n}\n\nexport const tasksHoverType: CSSProperties = {\n flex: 'none',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 10,\n}\n\nexport const tasksHoverMore: CSSProperties = {\n color: 'var(--dsw-alias-label-tertiary)',\n}\n\nexport const tasksHoverHint: CSSProperties = {\n marginTop: 2,\n paddingTop: 6,\n borderTop: '1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent))',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n}\n\n/* Claude repository setup controls on the blank-session hero. */\n\nexport const heroRepositoryControls: CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 8,\n minWidth: 0,\n}\n\nexport const heroRepositoryCapsule: CSSProperties = {\n height: 30,\n display: 'inline-flex',\n alignItems: 'center',\n minWidth: 0,\n padding: 2,\n border: '1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent))',\n borderRadius: 10,\n background: 'var(--dsw-alias-interactive-bg-base, var(--dsw-alias-bg-layer-1))',\n color: 'var(--dsw-alias-label-secondary)',\n}\n\nexport const heroBranchPicker: CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n minWidth: 0,\n}\n\nexport const heroBranchTrigger: CSSProperties = {\n height: 26,\n maxWidth: 230,\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n minWidth: 0,\n padding: '0 7px',\n border: 'none',\n borderRadius: 7,\n background: 'transparent',\n color: 'inherit',\n font: 'inherit',\n fontSize: 13,\n lineHeight: '18px',\n cursor: 'pointer',\n}\n\nexport const heroBranchName: CSSProperties = {\n minWidth: 0,\n overflow: 'hidden',\n color: 'var(--dsw-alias-label-primary)',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const heroBranchMenu: CSSProperties = {\n position: 'absolute',\n zIndex: 1100,\n top: 'calc(100% + 6px)',\n left: 0,\n width: 280,\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n padding: 4,\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 10,\n background: 'var(--dsw-specific-menu)',\n boxShadow: 'var(--dsw-shadow-lv3)',\n}\n\nexport const heroBranchSearch: CSSProperties = {\n height: 32,\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '0 8px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 7,\n background: 'var(--dsw-alias-bg-layer-1)',\n color: 'var(--dsw-alias-label-tertiary)',\n}\n\nexport const heroBranchSearchInput: CSSProperties = {\n minWidth: 0,\n flex: 1,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n color: 'var(--dsw-alias-label-primary)',\n font: 'inherit',\n fontSize: 13,\n lineHeight: '18px',\n}\n\nexport const heroBranchList: CSSProperties = {\n maxHeight: 170,\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'auto',\n overscrollBehavior: 'contain',\n}\n\nexport const heroBranchItem: CSSProperties = {\n width: '100%',\n height: 36,\n minHeight: 36,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '0 9px',\n border: 'none',\n borderRadius: 7,\n background: 'transparent',\n color: 'var(--dsw-alias-label-primary)',\n font: 'inherit',\n fontSize: 13,\n lineHeight: '18px',\n textAlign: 'left',\n cursor: 'pointer',\n}\n\nexport const heroBranchItemActive: CSSProperties = {\n background: 'var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2))',\n}\n\nexport const heroBranchItemName: CSSProperties = {\n minWidth: 0,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const heroBranchEmpty: CSSProperties = {\n height: 36,\n display: 'grid',\n placeItems: 'center',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 13,\n}\n\nexport const heroRepositoryDivider: CSSProperties = {\n width: 1,\n height: 16,\n flex: 'none',\n background: 'var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n}\n\nexport const heroWorktreeToggle: CSSProperties = {\n height: 26,\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n padding: '0 7px',\n border: 'none',\n borderRadius: 7,\n outline: 'none',\n background: 'transparent',\n color: 'var(--dsw-alias-label-secondary)',\n font: 'inherit',\n fontSize: 13,\n lineHeight: '18px',\n whiteSpace: 'nowrap',\n cursor: 'pointer',\n transition: 'background 120ms ease, color 120ms ease, box-shadow 120ms ease',\n}\n\nexport const heroWorktreeToggleActive: CSSProperties = {\n background: 'color-mix(in srgb, var(--dsw-static-blue-450) 10%, transparent)',\n color: 'var(--dsw-alias-label-primary)',\n}\n\nexport const heroWorktreeToggleFocused: CSSProperties = {\n boxShadow: '0 0 0 2px color-mix(in srgb, var(--dsw-static-blue-450) 28%, transparent)',\n}\n\nexport const heroWorktreeCheckbox: CSSProperties = {\n width: 15,\n height: 15,\n boxSizing: 'border-box',\n display: 'grid',\n placeItems: 'center',\n flex: 'none',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 4,\n background: 'var(--dsw-alias-bg-layer-2)',\n boxShadow: 'inset 0 1px 1px rgba(0, 0, 0, 0.08)',\n color: 'var(--dsw-alias-label-on-accent, #fff)',\n transition: 'border-color 120ms ease, background 120ms ease, box-shadow 120ms ease',\n}\n\nexport const heroWorktreeCheckboxChecked: CSSProperties = {\n borderColor: 'var(--dsw-static-blue-450)',\n background: 'var(--dsw-static-blue-450)',\n boxShadow: '0 1px 3px color-mix(in srgb, var(--dsw-static-blue-450) 35%, transparent)',\n}\n\nexport const heroWorktreeCheckboxIcon: CSSProperties = {\n width: 12,\n height: 12,\n display: 'block',\n}\n\nexport const heroWorktreeProgressCard: CSSProperties = {\n position: 'absolute',\n zIndex: 1050,\n top: 'calc(100% + 10px)',\n left: 0,\n width: 320,\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n gap: 12,\n padding: 14,\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 12,\n background: 'var(--dsw-alias-bg-layer-1)',\n boxShadow: 'var(--dsw-shadow-lv3)',\n}\n\nexport const heroWorktreeProgressHeader: CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 10,\n}\n\nexport const heroWorktreeProgressSpinner: CSSProperties = {\n width: 18,\n height: 18,\n flex: 'none',\n color: 'var(--dsw-static-blue-450)',\n}\n\nexport const heroWorktreeProgressError: CSSProperties = {\n width: 18,\n height: 18,\n display: 'grid',\n placeItems: 'center',\n flex: 'none',\n borderRadius: '50%',\n background: 'var(--dsw-alias-state-error-primary)',\n color: 'var(--dsw-alias-label-on-accent, #fff)',\n fontSize: 13,\n lineHeight: 1,\n}\n\nexport const heroWorktreeProgressCopy: CSSProperties = {\n minWidth: 0,\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n gap: 2,\n}\n\nexport const heroWorktreeProgressTitle: CSSProperties = {\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 13,\n lineHeight: '18px',\n fontWeight: 600,\n}\n\nexport const heroWorktreeProgressCurrent: CSSProperties = {\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 12,\n lineHeight: '18px',\n overflowWrap: 'anywhere',\n}\n\nexport const heroWorktreeProgressContext: CSSProperties = {\n color: 'var(--dsw-alias-label-secondary)',\n fontWeight: 500,\n}\n\nexport const heroWorktreeProgressDismiss: CSSProperties = {\n width: 24,\n height: 24,\n display: 'grid',\n placeItems: 'center',\n flex: 'none',\n padding: 0,\n border: 'none',\n borderRadius: 6,\n background: 'transparent',\n color: 'var(--dsw-alias-label-tertiary)',\n font: 'inherit',\n cursor: 'pointer',\n}\n\nexport const heroWorktreeProgressSteps: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 7,\n paddingLeft: 2,\n}\n\nexport const heroWorktreeProgressStep: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 11,\n lineHeight: '16px',\n}\n\nexport const heroWorktreeProgressDot: CSSProperties = {\n width: 14,\n height: 14,\n display: 'grid',\n placeItems: 'center',\n flex: 'none',\n boxSizing: 'border-box',\n borderRadius: '50%',\n fontSize: 9,\n lineHeight: 1,\n}\n\nexport const heroWorktreeProgressDotDone: CSSProperties = {\n background: 'var(--dsw-static-blue-450)',\n color: 'var(--dsw-alias-label-on-accent, #fff)',\n}\n\nexport const heroWorktreeProgressDotActive: CSSProperties = {\n border: '2px solid var(--dsw-static-blue-450)',\n}\n\nexport const heroRepositoryStatus: CSSProperties = {\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n whiteSpace: 'nowrap',\n}\n\nexport const heroRepositoryError: CSSProperties = {\n maxWidth: 240,\n overflow: 'hidden',\n color: 'var(--dsw-alias-state-error-primary)',\n fontSize: 11,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\n/* Claude repository readout and details panel. */\n\nexport const repositoryBarFrame: CSSProperties = {\n width: 'calc(100% - 64px)',\n maxWidth: 'var(--dsh-conversation-composer-max-width, 782px)',\n minWidth: 0,\n margin: '0 auto',\n boxSizing: 'border-box',\n}\n\nexport const repositoryBar: CSSProperties = {\n width: '100%',\n minWidth: 0,\n minHeight: 42,\n boxSizing: 'border-box',\n display: 'flex',\n alignItems: 'center',\n gap: 9,\n padding: '7px 11px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 11,\n background: 'var(--dsw-alias-bg-layer-1)',\n color: 'var(--dsw-alias-label-primary)',\n boxShadow: '0 1px 2px color-mix(in srgb, var(--dsw-alias-label-primary) 4%, transparent)',\n font: 'inherit',\n fontSize: 14,\n lineHeight: '22px',\n textAlign: 'left',\n}\n\n/* Queue strip replacing the Host dock entry; mirrors the repository bar. */\n\nexport const queueBar: CSSProperties = {\n width: '100%',\n minWidth: 0,\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n padding: '3px 6px 3px 11px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 11,\n background: 'var(--dsw-alias-bg-layer-1)',\n color: 'var(--dsw-alias-label-primary)',\n boxShadow: '0 1px 2px color-mix(in srgb, var(--dsw-alias-label-primary) 4%, transparent)',\n font: 'inherit',\n fontSize: 13,\n lineHeight: '20px',\n}\n\nexport const queueHeader: CSSProperties = {\n width: '100%',\n minHeight: 30,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '2px 0',\n border: 'none',\n outline: 'none',\n background: 'transparent',\n color: 'inherit',\n font: 'inherit',\n fontSize: 13,\n textAlign: 'left',\n cursor: 'pointer',\n}\n\nexport const queueLead: CSSProperties = {\n flex: 'none',\n display: 'grid',\n placeItems: 'center',\n color: 'var(--dsw-alias-label-tertiary)',\n}\n\nexport const queueCount: CSSProperties = {\n minWidth: 0,\n flex: 1,\n fontWeight: 550,\n}\n\nexport const queueList: CSSProperties = {\n maxHeight: 180,\n margin: 0,\n padding: 0,\n listStyle: 'none',\n overflowY: 'auto',\n}\n\nexport const queueRow: CSSProperties = {\n minHeight: 30,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n}\n\nexport const queueRowDivider: CSSProperties = {\n borderTop: '1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent))',\n}\n\nexport const queuePreview: CSSProperties = {\n minWidth: 0,\n flex: 1,\n overflow: 'hidden',\n color: 'var(--dsw-alias-label-secondary)',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const queueEditor: CSSProperties = {\n minWidth: 0,\n flex: 1,\n height: 26,\n boxSizing: 'border-box',\n padding: '0 8px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 6,\n outline: 'none',\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-primary)',\n font: 'inherit',\n fontSize: 13,\n}\n\nexport const queueActions: CSSProperties = {\n flex: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n}\n\nexport const repositoryBarMerged: CSSProperties = {\n // Pure purple tint: mixing with the theme border token (white-alpha in dark\n // themes) produced a bright, near-white line.\n borderColor: 'color-mix(in srgb, #a78bfa 35%, transparent)',\n background: 'color-mix(in srgb, #a78bfa 5%, var(--dsw-alias-bg-layer-1))',\n}\n\nexport const repositoryPrIcon: CSSProperties = {\n width: 20,\n height: 20,\n display: 'grid',\n placeItems: 'center',\n flex: 'none',\n borderRadius: 6,\n color: 'var(--dsw-alias-state-success-primary, var(--dsw-static-blue-450))',\n}\n\nexport const repositoryPrIconMerged: CSSProperties = {\n color: '#a78bfa',\n}\n\nexport const repositoryPrimary: CSSProperties = {\n minWidth: 0,\n flex: 1,\n overflow: 'hidden',\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 13,\n fontWeight: 600,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const repositoryPrLinkFrame: CSSProperties = {\n position: 'relative',\n flex: 'none',\n}\n\nexport const repositoryPrLink: CSSProperties = {\n color: 'var(--dsw-alias-state-success-primary)',\n fontSize: 13,\n fontWeight: 650,\n textDecoration: 'none',\n cursor: 'pointer',\n}\n\nexport const repositoryPrLinkMerged: CSSProperties = {\n color: '#a78bfa',\n}\n\nexport const repositoryPrHoverCard: CSSProperties = {\n position: 'absolute',\n zIndex: 30,\n left: -34,\n bottom: 'calc(100% + 14px)',\n width: 340,\n display: 'flex',\n flexDirection: 'column',\n gap: 10,\n padding: '13px 14px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 12,\n background: 'var(--dsw-alias-bg-layer-1)',\n boxShadow: '0 14px 38px color-mix(in srgb, #000 34%, transparent)',\n color: 'var(--dsw-alias-label-primary)',\n pointerEvents: 'auto',\n}\n\nexport const repositoryPrHoverTop: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 7,\n minWidth: 0,\n}\n\nexport const repositoryPrStateBadge: CSSProperties = {\n flex: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n padding: '2px 8px',\n borderRadius: 999,\n background: 'color-mix(in srgb, var(--dsw-alias-state-success-primary) 22%, transparent)',\n color: 'var(--dsw-alias-state-success-primary)',\n fontSize: 11,\n fontWeight: 650,\n}\n\nexport const repositoryPrStateBadgeMerged: CSSProperties = {\n background: 'color-mix(in srgb, #a78bfa 18%, transparent)',\n color: '#a78bfa',\n}\n\nexport const repositoryPrHoverRepo: CSSProperties = {\n minWidth: 0,\n flex: 1,\n overflow: 'hidden',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const repositoryPrHoverAge: CSSProperties = {\n flex: 'none',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n}\n\nexport const repositoryPrHoverTitle: CSSProperties = {\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 14,\n lineHeight: '20px',\n fontWeight: 650,\n textDecoration: 'underline',\n textUnderlineOffset: 2,\n cursor: 'pointer',\n}\n\nexport const repositoryPrHoverBottom: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n}\n\nexport const repositoryPrAuthor: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n}\n\nexport const repositoryPrAvatar: CSSProperties = {\n width: 18,\n height: 18,\n display: 'grid',\n placeItems: 'center',\n borderRadius: 999,\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 9,\n fontWeight: 700,\n}\n\nexport const repositoryPrHoverStats: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 11,\n fontWeight: 650,\n}\n\nexport const repositoryPrFiles: CSSProperties = {\n padding: '2px 7px',\n borderRadius: 6,\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-tertiary)',\n fontWeight: 500,\n}\nexport const repositoryRemote: CSSProperties = {\n minWidth: 0,\n maxWidth: 116,\n overflow: 'hidden',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const repositoryBranch: CSSProperties = {\n minWidth: 0,\n maxWidth: 125,\n overflow: 'hidden',\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 12,\n fontWeight: 550,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const repositoryWorktree: CSSProperties = {\n flex: 'none',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n}\n\nexport const repositoryStatusItems: CSSProperties = {\n minWidth: 0,\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 8,\n overflow: 'hidden',\n}\n\nexport const repositoryItem: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n minWidth: 0,\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n fontWeight: 550,\n whiteSpace: 'nowrap',\n}\n\nexport const repositoryItemLabel: CSSProperties = {\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n}\n\nexport const repositoryItemDot: CSSProperties = {\n width: 6,\n height: 6,\n flex: 'none',\n borderRadius: 999,\n background: 'currentColor',\n}\n\nexport const repositoryGlyph: CSSProperties = {\n width: 16,\n height: 16,\n flex: 'none',\n display: 'grid',\n placeItems: 'center',\n color: 'var(--dsw-alias-label-tertiary)',\n}\n\nexport const repositoryItemSuccess: CSSProperties = {\n color: 'var(--dsw-alias-state-success-primary)',\n}\n\nexport const repositoryItemWarning: CSSProperties = {\n color: 'var(--dsw-alias-state-warning-primary, #d69e2e)',\n}\n\nexport const repositoryItemError: CSSProperties = {\n color: 'var(--dsw-alias-state-error-primary)',\n}\n\nexport const repositoryMergedStatus: CSSProperties = {\n minWidth: 0,\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n overflow: 'hidden',\n color: '#a78bfa',\n fontSize: 12,\n fontWeight: 600,\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n}\n\nexport const repositoryMergedDot: CSSProperties = {\n width: 6,\n height: 6,\n flex: 'none',\n borderRadius: 999,\n background: 'currentColor',\n}\n\nexport const repositoryMergedAge: CSSProperties = {\n overflow: 'hidden',\n color: 'var(--dsw-alias-label-tertiary)',\n fontWeight: 500,\n textOverflow: 'ellipsis',\n}\n\nexport const diffTrigger: CSSProperties = {\n flex: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n minHeight: 26,\n padding: '3px 8px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 7,\n background: 'var(--dsw-alias-bg-layer-2)',\n font: 'inherit',\n fontSize: 12,\n lineHeight: '18px',\n fontWeight: 650,\n cursor: 'pointer',\n}\n\nexport const diffTriggerMuted: CSSProperties = {\n background: 'transparent',\n color: 'var(--dsw-alias-label-tertiary)',\n}\n\nexport const repositoryAutoFix: CSSProperties = {\n width: 26,\n minHeight: 26,\n flex: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 7,\n outline: 'none',\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-tertiary)',\n font: 'inherit',\n lineHeight: '18px',\n cursor: 'pointer',\n}\n\nexport const repositoryAutoFixActive: CSSProperties = {\n borderColor: 'color-mix(in srgb, var(--dsw-static-blue-450) 45%, transparent)',\n background: 'color-mix(in srgb, var(--dsw-static-blue-450) 12%, transparent)',\n color: 'var(--dsw-static-blue-450)',\n}\n\nexport const repositoryUpdateTrigger: CSSProperties = {\n flex: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n minHeight: 26,\n padding: '3px 8px',\n border: '1px solid color-mix(in srgb, var(--dsw-static-blue-450) 45%, transparent)',\n borderRadius: 7,\n background: 'color-mix(in srgb, var(--dsw-static-blue-450) 12%, transparent)',\n color: 'var(--dsw-static-blue-450)',\n font: 'inherit',\n fontSize: 12,\n lineHeight: '18px',\n fontWeight: 650,\n whiteSpace: 'nowrap',\n cursor: 'pointer',\n}\n\nexport const repositoryChecksFrame: CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n minWidth: 0,\n}\n\nexport const repositoryChecksTrigger: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n minWidth: 0,\n padding: 0,\n border: 'none',\n background: 'transparent',\n font: 'inherit',\n color: 'inherit',\n cursor: 'pointer',\n}\n\nexport const repositoryChecksCard: CSSProperties = {\n position: 'absolute',\n zIndex: 1100,\n bottom: 'calc(100% + 8px)',\n right: 0,\n width: 320,\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n gap: 8,\n padding: 12,\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 10,\n background: 'var(--dsw-specific-menu, var(--dsw-alias-bg-layer-1))',\n boxShadow: 'var(--dsw-shadow-lv3)',\n textAlign: 'left',\n cursor: 'default',\n}\n\nexport const repositoryChecksTitle: CSSProperties = {\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 12,\n fontWeight: 650,\n}\n\nexport const repositoryChecksHint: CSSProperties = {\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n}\n\nexport const repositoryChecksError: CSSProperties = {\n color: 'var(--dsw-alias-state-error-primary)',\n fontSize: 12,\n}\n\nexport const repositoryChecksItem: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n}\n\nexport const repositoryChecksName: CSSProperties = {\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 12,\n fontWeight: 600,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const repositoryChecksDesc: CSSProperties = {\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const repositoryChecksFix: CSSProperties = {\n alignSelf: 'flex-end',\n minHeight: 26,\n padding: '3px 10px',\n border: 'none',\n borderRadius: 7,\n background: 'var(--dsw-static-blue-450)',\n color: 'var(--dsw-alias-label-on-accent, #fff)',\n font: 'inherit',\n fontSize: 12,\n fontWeight: 650,\n cursor: 'pointer',\n}\n\nexport const diffPrCommentsButton: CSSProperties = {\n minHeight: 28,\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: '4px 8px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 7,\n background: 'var(--dsw-alias-bg-layer-2)',\n font: 'inherit',\n fontSize: 12,\n fontWeight: 650,\n whiteSpace: 'nowrap',\n cursor: 'pointer',\n}\n\nexport const diffGhCommentAuthor: CSSProperties = {\n color: 'var(--dsw-alias-label-tertiary)',\n fontWeight: 600,\n}\n\nexport const diffGhCommentLink: CSSProperties = {\n color: 'var(--dsw-static-blue-450)',\n textDecoration: 'none',\n fontWeight: 650,\n}\n\nexport const diffModalConflicts: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n margin: 0,\n padding: '8px 10px',\n borderRadius: 8,\n background: 'var(--dsw-alias-bg-layer-2)',\n fontSize: 12,\n listStyle: 'none',\n}\n\nexport const diffModalConflictResolve: CSSProperties = {\n alignSelf: 'flex-start',\n minHeight: 28,\n padding: '4px 12px',\n border: 'none',\n borderRadius: 7,\n background: 'var(--dsw-static-blue-450)',\n color: 'var(--dsw-alias-label-on-accent, #fff)',\n font: 'inherit',\n fontSize: 12,\n fontWeight: 650,\n cursor: 'pointer',\n}\n\n/** Ticket summaries need room; the branch menu's 280px truncates them badly. */\nexport const heroTicketMenu: CSSProperties = {\n width: 420,\n}\n\nexport const heroTicketKey: CSSProperties = {\n flex: 'none',\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 12,\n fontWeight: 650,\n letterSpacing: 0.2,\n}\n\nexport const heroTicketChips: CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 6,\n padding: '2px 2px 6px',\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 12%, transparent))',\n}\n\nexport const heroTicketChip: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: '2px 4px 2px 8px',\n border: '1px solid color-mix(in srgb, var(--dsw-static-blue-450) 40%, transparent)',\n borderRadius: 999,\n background: 'color-mix(in srgb, var(--dsw-static-blue-450) 12%, transparent)',\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 12,\n fontWeight: 600,\n letterSpacing: 0.2,\n}\n\nexport const heroTicketChipRemove: CSSProperties = {\n width: 16,\n height: 16,\n display: 'grid',\n placeItems: 'center',\n padding: 0,\n border: 'none',\n borderRadius: 999,\n background: 'transparent',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n lineHeight: 1,\n cursor: 'pointer',\n}\n\nexport const heroTicketChipsClear: CSSProperties = {\n padding: '2px 4px',\n border: 'none',\n background: 'transparent',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n cursor: 'pointer',\n}\n\nexport const heroTicketCheckbox: CSSProperties = {\n width: 15,\n height: 15,\n boxSizing: 'border-box',\n display: 'grid',\n placeItems: 'center',\n flex: 'none',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 4,\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-on-accent, #fff)',\n transition: 'border-color 120ms ease, background 120ms ease',\n}\n\nexport const heroTicketStatus: CSSProperties = {\n flex: 'none',\n maxWidth: 110,\n overflow: 'hidden',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const settingsLink: CSSProperties = {\n color: 'var(--dsw-static-blue-450)',\n fontSize: 12,\n textDecoration: 'none',\n marginRight: 'auto',\n}\n\nexport const repositoryPrIconButton: CSSProperties = {\n padding: 0,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n font: 'inherit',\n cursor: 'pointer',\n}\n\nexport const overviewBody: CSSProperties = {\n flex: 1,\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n padding: 10,\n overflowY: 'auto',\n}\n\nexport const overviewRow: CSSProperties = {\n width: '100%',\n minWidth: 0,\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n padding: '8px 10px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 10,\n outline: 'none',\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-primary)',\n font: 'inherit',\n textAlign: 'left',\n cursor: 'pointer',\n}\n\nexport const overviewRowTop: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n minWidth: 0,\n}\n\nexport const overviewTitle: CSSProperties = {\n minWidth: 0,\n flex: 1,\n overflow: 'hidden',\n fontSize: 13,\n fontWeight: 600,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const overviewMeta: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n minWidth: 0,\n overflow: 'hidden',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n whiteSpace: 'nowrap',\n}\n\nexport const overviewBranch: CSSProperties = {\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n}\n\nexport const overviewRunningDot: CSSProperties = {\n width: 7,\n height: 7,\n flex: 'none',\n borderRadius: 999,\n background: 'var(--dsw-static-blue-450)',\n}\n\nexport const overviewEmpty: CSSProperties = {\n padding: 16,\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 13,\n textAlign: 'center',\n}\n\n/* Selection toolbar and follow-up popup over assistant replies. Every border\n uses the theme token with a currentColor fallback so nothing renders white. */\n\nconst askSurfaceBorder = '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))'\nconst askSurfaceShadow = 'var(--dsw-shadow-lv3, 0 8px 24px color-mix(in srgb, #000 24%, transparent))'\n\n/** Painted through CSS.highlights while the follow-up popup is open. */\nexport const askHighlightCss = `\n::highlight(dsh-claude-ask) {\n background-color: color-mix(in srgb, var(--dsw-static-blue-450) 30%, transparent);\n color: inherit;\n}\n`\n\nexport const askToolbar: CSSProperties = {\n position: 'fixed',\n zIndex: 2000,\n // The Host overlay layer is pointer-events: none; opt this surface back in.\n pointerEvents: 'auto',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n padding: 3,\n border: askSurfaceBorder,\n borderRadius: 9,\n background: 'var(--dsw-alias-bg-layer-1)',\n color: 'var(--dsw-alias-label-primary)',\n boxShadow: askSurfaceShadow,\n}\n\nexport const askPopup: CSSProperties = {\n position: 'fixed',\n zIndex: 2000,\n // The Host overlay layer is pointer-events: none; opt this surface back in.\n pointerEvents: 'auto',\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n gap: 10,\n padding: 12,\n border: askSurfaceBorder,\n borderRadius: 12,\n background: 'var(--dsw-alias-bg-layer-1)',\n color: 'var(--dsw-alias-label-primary)',\n boxShadow: askSurfaceShadow,\n fontSize: 13,\n lineHeight: '20px',\n}\n\nexport const askQuote: CSSProperties = {\n flex: 'none',\n display: '-webkit-box',\n WebkitLineClamp: 3,\n WebkitBoxOrient: 'vertical',\n margin: 0,\n padding: '6px 10px',\n overflow: 'hidden',\n borderLeft: '3px solid color-mix(in srgb, var(--dsw-static-blue-450) 60%, transparent)',\n borderRadius: 6,\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 12,\n lineHeight: '18px',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n}\n\nexport const askQuestion: CSSProperties = {\n flex: 'none',\n margin: 0,\n color: 'var(--dsw-alias-label-primary)',\n fontWeight: 600,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n}\n\nexport const askTextarea: CSSProperties = {\n width: '100%',\n minHeight: 64,\n boxSizing: 'border-box',\n padding: '8px 10px',\n border: askSurfaceBorder,\n borderRadius: 8,\n outline: 'none',\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-primary)',\n font: 'inherit',\n fontSize: 13,\n lineHeight: '20px',\n resize: 'vertical',\n}\n\nexport const askActions: CSSProperties = {\n flex: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 6,\n}\n\nexport const askAnswer: CSSProperties = {\n flex: '1 1 auto',\n minHeight: 0,\n overflowY: 'auto',\n padding: '2px 2px 0',\n wordBreak: 'break-word',\n}\n\nexport const askButton: CSSProperties = {\n minHeight: 26,\n padding: '3px 10px',\n border: askSurfaceBorder,\n borderRadius: 7,\n outline: 'none',\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-primary)',\n font: 'inherit',\n fontSize: 12,\n lineHeight: '18px',\n fontWeight: 600,\n cursor: 'pointer',\n}\n\nexport const askPrimaryButton: CSSProperties = {\n border: '1px solid transparent',\n background: 'var(--dsw-static-blue-450)',\n color: 'var(--dsw-alias-label-on-accent, #fff)',\n}\n\nexport const askThinkingRow: CSSProperties = {\n width: '100%',\n display: 'flex',\n alignItems: 'baseline',\n gap: 6,\n margin: '0 0 8px',\n padding: 0,\n border: 'none',\n outline: 'none',\n background: 'transparent',\n color: 'var(--dsw-alias-label-tertiary)',\n font: 'inherit',\n fontSize: 12,\n lineHeight: '18px',\n textAlign: 'left',\n cursor: 'pointer',\n}\n\nexport const askThinkingLabel: CSSProperties = {\n flex: 'none',\n fontWeight: 600,\n}\n\nexport const askThinkingPreview: CSSProperties = {\n minWidth: 0,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const askThinkingFull: CSSProperties = {\n minWidth: 0,\n flex: 1,\n maxHeight: 200,\n overflowY: 'auto',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n}\n\nexport const askToolRow: CSSProperties = {\n display: 'flex',\n alignItems: 'baseline',\n gap: 6,\n margin: '2px 0 6px',\n minWidth: 0,\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n lineHeight: '18px',\n}\n\nexport const askToolGlyph: CSSProperties = {\n flex: 'none',\n width: 14,\n textAlign: 'center',\n color: 'var(--dsw-static-blue-450)',\n}\n\nexport const askToolGlyphDone: CSSProperties = {\n color: 'var(--dsw-alias-state-success-primary)',\n}\n\nexport const askToolGlyphError: CSSProperties = {\n color: 'var(--dsw-alias-state-error-primary)',\n}\n\nexport const askToolName: CSSProperties = {\n flex: 'none',\n color: 'var(--dsw-alias-label-secondary)',\n fontWeight: 600,\n}\n\nexport const askToolSummary: CSSProperties = {\n minWidth: 0,\n flex: 1,\n overflow: 'hidden',\n fontFamily: 'var(--dsw-font-family-code, ui-monospace, monospace)',\n fontSize: 11,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const askStatus: CSSProperties = {\n marginRight: 'auto',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n}\n\nexport const askError: CSSProperties = {\n margin: 0,\n color: 'var(--dsw-alias-state-error-primary)',\n fontSize: 12,\n}\n\nexport const repositoryMergeTrigger: CSSProperties = {\n flex: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n minHeight: 26,\n padding: '3px 8px',\n border: '1px solid color-mix(in srgb, var(--dsw-alias-state-success-primary) 45%, transparent)',\n borderRadius: 7,\n background: 'color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent)',\n color: 'var(--dsw-alias-state-success-primary)',\n font: 'inherit',\n fontSize: 12,\n lineHeight: '18px',\n fontWeight: 650,\n cursor: 'pointer',\n}\n\nexport const diffAdd: CSSProperties = {\n color: 'var(--dsw-alias-state-success-primary)',\n}\n\nexport const diffDelete: CSSProperties = {\n color: 'var(--dsw-alias-state-error-primary)',\n}\n\nexport const diffCommentButtonClass = 'dshClaudeDiffCommentButton'\nexport const diffLineRowClass = 'dshClaudeDiffLineRow'\nexport const diffCommentTextareaClass = 'dshClaudeDiffCommentTextarea'\n\nexport const diffCommentCss = `\n.${diffCommentButtonClass} {\n width: 18px;\n height: 18px;\n flex: none;\n display: grid;\n place-items: center;\n /* Stay on the line-number row: a wrapped line makes the flex row taller, and\n centering would float the button into the middle of the wrapped block.\n The margin centers the 18px button inside the first 22px line box. */\n align-self: flex-start;\n margin: 2px 2px 0;\n padding: 0;\n border: none;\n border-radius: 4px;\n background: var(--dsw-static-blue-450);\n color: var(--dsw-alias-label-on-accent, #fff);\n font: inherit;\n font-size: 13px;\n line-height: 1;\n cursor: pointer;\n opacity: 0;\n transition: opacity 100ms ease;\n}\n.${diffLineRowClass}:hover .${diffCommentButtonClass},\n.${diffCommentButtonClass}:focus-visible {\n opacity: 1;\n}\n.${diffCommentButtonClass}[disabled] {\n visibility: hidden;\n}\n.${diffCommentTextareaClass}:focus {\n outline: none;\n box-shadow: inset 0 0 0 1px var(--dsw-static-blue-450);\n}\n`\n\nexport const diffCommentBlock: CSSProperties = {\n boxSizing: 'border-box',\n width: 'min(640px, calc(var(--dsh-claude-diff-viewport, 520px) - 72px))',\n position: 'sticky',\n left: 62,\n margin: '4px 8px 8px 62px',\n padding: '8px 10px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 8,\n background: 'var(--dsw-alias-bg-layer-1)',\n fontFamily: 'var(--dsw-font-family, system-ui)',\n fontSize: 12,\n lineHeight: '18px',\n whiteSpace: 'normal',\n}\n\nexport const diffCommentCardText: CSSProperties = {\n margin: 0,\n color: 'var(--dsw-alias-label-primary)',\n overflowWrap: 'anywhere',\n}\n\nexport const diffCommentCardMeta: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 8,\n marginBottom: 4,\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n}\n\nexport const diffCommentTextarea: CSSProperties = {\n width: '100%',\n minHeight: 56,\n boxSizing: 'border-box',\n padding: '6px 8px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 6,\n background: 'var(--dsw-alias-bg-base)',\n color: 'var(--dsw-alias-label-primary)',\n font: 'inherit',\n resize: 'vertical',\n}\n\nexport const diffCommentActions: CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 8,\n marginTop: 6,\n}\n\nexport const diffCommentActionButton: CSSProperties = {\n minHeight: 24,\n padding: '2px 10px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 6,\n background: 'transparent',\n color: 'var(--dsw-alias-label-secondary)',\n font: 'inherit',\n fontSize: 12,\n cursor: 'pointer',\n}\n\nexport const diffCommentSubmitButton: CSSProperties = {\n border: 'none',\n background: 'var(--dsw-static-blue-450)',\n color: 'var(--dsw-alias-label-on-accent, #fff)',\n fontWeight: 600,\n}\n\nexport const diffCommentError: CSSProperties = {\n margin: '4px 0 0',\n color: 'var(--dsw-alias-state-error-primary)',\n fontSize: 11,\n}\n\nexport const reviewCommentBarFrame: CSSProperties = {\n width: 'calc(100% - 64px)',\n maxWidth: 'var(--dsh-conversation-composer-max-width, 782px)',\n margin: '0 auto',\n boxSizing: 'border-box',\n}\n\nexport const reviewCommentBar: CSSProperties = {\n width: '100%',\n minWidth: 0,\n minHeight: 42,\n boxSizing: 'border-box',\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 8,\n padding: '7px 11px',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 11,\n background: 'var(--dsw-alias-bg-layer-1)',\n boxShadow: '0 1px 2px color-mix(in srgb, var(--dsw-alias-label-primary) 4%, transparent)',\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 12,\n lineHeight: '20px',\n}\n\nexport const reviewCommentIcon: CSSProperties = {\n width: 20,\n height: 20,\n display: 'grid',\n placeItems: 'center',\n flex: 'none',\n color: 'var(--dsw-static-blue-450)',\n}\n\nexport const reviewCommentClearSeat: CSSProperties = {\n marginLeft: 'auto',\n alignSelf: 'flex-start',\n flex: 'none',\n display: 'inline-flex',\n}\n\nexport const reviewCommentChip: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 3,\n maxWidth: 240,\n padding: '1px 4px 1px 9px',\n border: '1px solid color-mix(in srgb, var(--dsw-static-blue-450) 32%, transparent)',\n borderRadius: 999,\n background: 'color-mix(in srgb, var(--dsw-static-blue-450) 10%, transparent)',\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 12,\n lineHeight: '20px',\n}\n\nexport const reviewCommentChipLabel: CSSProperties = {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const reviewCommentChipRemove: CSSProperties = {\n width: 16,\n height: 16,\n flex: 'none',\n display: 'grid',\n placeItems: 'center',\n padding: 0,\n border: 'none',\n borderRadius: 999,\n background: 'transparent',\n color: 'var(--dsw-alias-label-tertiary)',\n font: 'inherit',\n fontSize: 12,\n lineHeight: 1,\n cursor: 'pointer',\n}\n\nexport const reviewCommentHoverCard: CSSProperties = {\n display: 'block',\n maxWidth: 360,\n padding: '8px 10px',\n fontSize: 12,\n lineHeight: '18px',\n}\n\nexport const reviewCommentHoverPath: CSSProperties = {\n display: 'block',\n marginBottom: 4,\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n overflowWrap: 'anywhere',\n}\n\nexport const reviewCommentHoverText: CSSProperties = {\n margin: 0,\n color: 'var(--dsw-alias-label-primary)',\n whiteSpace: 'pre-wrap',\n overflowWrap: 'anywhere',\n}\n\nexport const diffAhead: CSSProperties = {\n color: 'var(--dsw-static-blue-450)',\n}\n\nexport const diffAheadMuted: CSSProperties = {\n color: 'color-mix(in srgb, var(--dsw-static-blue-450) 62%, var(--dsw-alias-label-tertiary))',\n}\n\nexport const diffAddMuted: CSSProperties = {\n color: 'color-mix(in srgb, var(--dsw-alias-state-success-primary) 62%, var(--dsw-alias-label-tertiary))',\n}\n\nexport const diffDeleteMuted: CSSProperties = {\n color: 'color-mix(in srgb, var(--dsw-alias-state-error-primary) 62%, var(--dsw-alias-label-tertiary))',\n}\n\nexport const diffPanel: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n overflow: 'hidden',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 12,\n background: 'var(--dsw-alias-bg-layer-1)',\n boxShadow: '0 4px 16px color-mix(in srgb, #000 12%, transparent)',\n}\n\nexport const diffPanelMaximized: CSSProperties = {\n width: '100%',\n height: '100%',\n margin: 0,\n}\n\nexport const diffHeader: CSSProperties = {\n boxSizing: 'border-box',\n height: 49,\n flex: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 10,\n padding: '9px 12px',\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n}\n\nexport const diffHeaderTitle: CSSProperties = {\n minWidth: 0,\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n overflow: 'hidden',\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 15,\n fontWeight: 650,\n whiteSpace: 'nowrap',\n}\n\nexport const diffHeaderLabel: CSSProperties = {\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n}\n\nexport const diffHeaderActions: CSSProperties = {\n flex: 'none',\n display: 'flex',\n alignItems: 'center',\n gap: 5,\n}\n\nexport const diffSplitButton: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'stretch',\n}\n\nexport const diffCommitButton: CSSProperties = {\n minHeight: 28,\n padding: '4px 10px',\n border: 'none',\n borderRadius: '7px 0 0 7px',\n background: 'var(--dsw-static-blue-450)',\n color: 'var(--dsw-alias-label-on-accent, #fff)',\n font: 'inherit',\n fontSize: 12,\n fontWeight: 650,\n cursor: 'pointer',\n}\n\nexport const diffActionDisabled: CSSProperties = {\n opacity: 0.45,\n cursor: 'default',\n}\n\nexport const diffCommitMenuButton: CSSProperties = {\n width: 28,\n minHeight: 28,\n display: 'grid',\n placeItems: 'center',\n padding: 0,\n border: 'none',\n borderLeft: '1px solid color-mix(in srgb, #fff 32%, transparent)',\n borderRadius: '0 7px 7px 0',\n background: 'var(--dsw-static-blue-450)',\n color: 'var(--dsw-alias-label-on-accent, #fff)',\n font: 'inherit',\n cursor: 'pointer',\n}\n\nexport const diffHeaderBranch: CSSProperties = {\n overflow: 'hidden',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n fontWeight: 500,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const diffSummary: CSSProperties = {\n minHeight: 34,\n display: 'flex',\n alignItems: 'center',\n gap: 7,\n padding: '6px 12px',\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\n}\n\nexport const diffBody: CSSProperties = {\n flex: 1,\n minHeight: 0,\n overflow: 'auto',\n background: 'var(--dsw-alias-bg-base)',\n}\n\nexport const diffFile: CSSProperties = {\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n}\n\nexport const diffFileHeader: CSSProperties = {\n width: '100%',\n minHeight: 38,\n display: 'flex',\n alignItems: 'center',\n gap: 7,\n padding: '7px 10px',\n border: 'none',\n background: 'var(--dsw-alias-bg-layer-1)',\n color: 'var(--dsw-alias-label-primary)',\n font: 'inherit',\n fontSize: 13,\n lineHeight: '20px',\n textAlign: 'left',\n cursor: 'pointer',\n}\n\nexport const diffFilePath: CSSProperties = {\n minWidth: 0,\n flex: 1,\n display: 'flex',\n alignItems: 'baseline',\n overflow: 'hidden',\n}\n\n/** Directory part: truncated from the left so the nearest folders stay visible. */\nexport const diffFileDir: CSSProperties = {\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n direction: 'rtl',\n textAlign: 'left',\n color: 'var(--dsw-alias-label-tertiary)',\n}\n\nexport const diffFileName: CSSProperties = {\n flex: 'none',\n fontWeight: 650,\n whiteSpace: 'nowrap',\n}\n\nexport const diffFileStats: CSSProperties = {\n flex: 'none',\n display: 'inline-flex',\n gap: 4,\n fontSize: 13,\n fontWeight: 650,\n}\n\nexport const diffCode: CSSProperties = {\n padding: '4px 0 8px',\n background: 'var(--dsw-alias-bg-base)',\n fontFamily: 'var(--dsw-font-family-mono, ui-monospace, SFMono-Regular, Consolas, monospace)',\n fontSize: 14,\n lineHeight: '22px',\n}\n\nexport const diffLine: CSSProperties = {\n minHeight: 17,\n display: 'flex',\n // Wrap to the panel width (reflows as the details column is dragged) instead of scrolling sideways.\n whiteSpace: 'pre-wrap',\n overflowWrap: 'anywhere',\n}\n\nexport const diffLineText: CSSProperties = {\n flex: 1,\n minWidth: 0,\n}\n\nexport const diffLineNumber: CSSProperties = {\n width: 38,\n flex: 'none',\n paddingRight: 8,\n color: 'var(--dsw-alias-label-tertiary)',\n textAlign: 'right',\n userSelect: 'none',\n}\n\nexport const diffLineMarker: CSSProperties = {\n width: 16,\n flex: 'none',\n color: 'inherit',\n textAlign: 'center',\n userSelect: 'none',\n}\n\nexport const diffLineAdd: CSSProperties = {\n background: 'color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent)',\n color: 'var(--dsw-alias-state-success-primary)',\n}\n\nexport const diffLineDelete: CSSProperties = {\n background: 'color-mix(in srgb, var(--dsw-alias-state-error-primary) 13%, transparent)',\n color: 'var(--dsw-alias-state-error-primary)',\n}\n\nexport const diffLineHunk: CSSProperties = {\n background: 'var(--dsw-alias-bg-layer-1)',\n color: 'var(--dsw-alias-label-tertiary)',\n fontStyle: 'italic',\n}\n\nexport const diffLineSelected: CSSProperties = {\n background: 'color-mix(in srgb, var(--dsw-static-blue-450) 14%, transparent)',\n boxShadow: 'inset 2px 0 0 var(--dsw-static-blue-450)',\n}\n\n/** Sits where the comment button, line number and marker would be so the label aligns with code. */\nexport const diffGapControls: CSSProperties = {\n width: 84,\n flex: 'none',\n boxSizing: 'border-box',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 2,\n paddingRight: 6,\n}\n\nexport const diffGapButton: CSSProperties = {\n width: 20,\n height: 18,\n display: 'grid',\n placeItems: 'center',\n padding: 0,\n border: 'none',\n borderRadius: 4,\n background: 'transparent',\n color: 'var(--dsw-alias-label-secondary)',\n font: 'inherit',\n cursor: 'pointer',\n}\n\nexport const diffCommentRange: CSSProperties = {\n marginBottom: 6,\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 12,\n fontWeight: 600,\n}\n\nexport const diffLineContext: CSSProperties = {\n color: 'var(--dsw-alias-label-secondary)',\n}\n\nexport const diffNotice: CSSProperties = {\n margin: 10,\n padding: '9px 10px',\n borderRadius: 8,\n background: 'var(--dsw-alias-bg-layer-2)',\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 11,\n lineHeight: '17px',\n}\n\nexport const diffEmpty: CSSProperties = {\n margin: 16,\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 11,\n}\n\nexport const diffModalCss = `\n.dshClaudeRepositoryActionModal {\n box-sizing: border-box;\n width: min(760px, calc(100vw - 48px));\n max-width: calc(100vw - 48px);\n max-height: min(680px, calc(100vh - 48px));\n}\n.dshClaudeRepositoryActionModalContent {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n}\n.dshClaudeRepositoryActionModalContent > div:first-child {\n position: sticky;\n top: 0;\n z-index: 2;\n background: var(--dsw-alias-bg-layer-2);\n}\n.dshClaudeRepositoryActionModalContent h2 {\n font-size: 18px;\n line-height: 26px;\n}\n.dshClaudeRepositoryActionModalContent > p {\n font-size: 14px;\n line-height: 22px;\n}\n.dshClaudeRepositoryActionModal input:is([type='checkbox'], [type='radio']) {\n width: 16px;\n height: 16px;\n margin: 0;\n accent-color: var(--dsw-static-blue-450);\n}\n.dshClaudeRepositoryActionModal textarea:focus,\n.dshClaudeRepositoryActionModal input:not([type='checkbox'], [type='radio']):focus {\n outline: none;\n box-shadow: inset 0 0 0 1px var(--dsw-static-blue-450);\n}\n`\n\nexport const diffModalBody: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n width: '100%',\n minWidth: 0,\n boxSizing: 'border-box',\n}\n\nexport const diffModalMeta: CSSProperties = {\n display: 'flex',\n justifyContent: 'space-between',\n gap: 16,\n minWidth: 0,\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 14,\n lineHeight: '22px',\n}\n\nexport const diffModalMetaText: CSSProperties = {\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const diffModalFiles: CSSProperties = {\n minWidth: 0,\n maxHeight: 300,\n overflowX: 'hidden',\n overflowY: 'auto',\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n borderRadius: 8,\n}\n\nexport const diffModalFile: CSSProperties = {\n display: 'flex',\n justifyContent: 'space-between',\n gap: 12,\n minWidth: 0,\n padding: '10px 14px',\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 13,\n lineHeight: '20px',\n}\n\nexport const diffModalFilePath: CSSProperties = {\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const diffModalFileState: CSSProperties = {\n flex: 'none',\n}\n\nexport const diffModalField: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 14,\n lineHeight: '22px',\n fontWeight: 550,\n}\n\nexport const diffModalTextarea: CSSProperties = {\n ...settingTextInput,\n minHeight: 140,\n padding: '10px 14px',\n fontSize: 14,\n lineHeight: '22px',\n resize: 'vertical',\n}\n\nexport const diffModalTextInput: CSSProperties = {\n ...settingTextInput,\n minHeight: 44,\n padding: '9px 14px',\n fontSize: 14,\n lineHeight: '22px',\n}\n\nexport const diffModalCheckbox: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 14,\n lineHeight: '22px',\n}\n\nexport const diffModalFooter: CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 12,\n}\n\nexport const diffModalButton: CSSProperties = {\n minHeight: 36,\n padding: '8px 18px',\n fontSize: 14,\n lineHeight: '22px',\n}\n\nexport const diffModalStatus: CSSProperties = {\n margin: 0,\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 14,\n lineHeight: '22px',\n}\n\nexport const diffModalError: CSSProperties = {\n margin: '10px 0 0',\n color: 'var(--dsw-alias-state-error-primary)',\n fontSize: 14,\n lineHeight: '22px',\n}\n\nexport const diffModalSuccess: CSSProperties = {\n margin: 0,\n color: 'var(--dsw-alias-state-success-primary)',\n fontSize: 14,\n lineHeight: '22px',\n}\n","export function formatTokenCount(tokens: number): string {\n if (tokens >= 1_000_000) return `${Number((tokens / 1_000_000).toFixed(tokens >= 10_000_000 ? 0 : 1))}M`\n if (tokens >= 1_000) return `${Number((tokens / 1_000).toFixed(tokens >= 100_000 ? 0 : 1))}K`\n return String(tokens)\n}\n","import { useEffect, useMemo, useState } from 'react'\nimport { IconCloseOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { ClaudeActivityEvent, ClaudeTaskInfo } from '../events.ts'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\nimport type { ClaudeClientProjection } from './projection.ts'\nimport * as styles from './styles.ts'\nimport { isProjectedTask } from './task-projection.ts'\nimport { formatTokenCount } from './token-format.ts'\n\nexport interface ClaudeTasksPanelInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n closeDetails: () => void\n turn: number\n}\n\nexport interface ClaudeTasksPanelProps extends ClaudeTasksPanelInjected {\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\n}\n\ntype StatusKey = 'tasksRunning' | 'tasksCompleted' | 'tasksFailed' | 'tasksStopped' | 'tasksKilled'\n\nconst STATUS_LABEL: Record<string, StatusKey> = {\n running: 'tasksRunning',\n completed: 'tasksCompleted',\n failed: 'tasksFailed',\n stopped: 'tasksStopped',\n killed: 'tasksKilled',\n}\n\nexport function visibleTaskGroups(tasks: readonly ClaudeTaskInfo[], dismissedSettledIds: ReadonlySet<string>) {\n const projected = tasks.filter(isProjectedTask)\n return {\n running: projected.filter(task => task.status === 'running'),\n finished: projected.filter(task => task.status !== 'running' && !dismissedSettledIds.has(task.taskId)),\n }\n}\n\nexport function activitiesForTask(activities: readonly ClaudeActivityEvent[], taskId: string) {\n return activities.filter(activity => activity.taskId === taskId)\n}\n\nexport function tasksForTurn(tasks: readonly ClaudeTaskInfo[], turn: number) {\n return tasks.filter(task => task.originTurn === turn && isProjectedTask(task))\n}\n\nexport interface TurnTaskSummary {\n state: 'running' | 'failed' | 'completed'\n count: number\n running: number\n failed: number\n completed: number\n}\n\nexport function summarizeTurnTasks(tasks: readonly ClaudeTaskInfo[]): TurnTaskSummary | undefined {\n if (tasks.length === 0) return undefined\n const running = tasks.filter(task => task.status === 'running').length\n const failed = tasks.filter(task => task.status === 'failed' || task.status === 'stopped' || task.status === 'killed').length\n const completed = tasks.filter(task => task.status === 'completed').length\n return {\n state: running > 0 ? 'running' : failed > 0 ? 'failed' : 'completed',\n count: tasks.length,\n running,\n failed,\n completed,\n }\n}\n\nfunction statusGlyph(status: ClaudeTaskInfo['status']): string {\n if (status === 'running') return '●'\n if (status === 'completed') return '✓'\n if (status === 'stopped') return '–'\n return '×'\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return String(Math.max(1, Math.round(ms))) + 'ms'\n const seconds = Math.round(ms / 1000)\n if (seconds < 60) return String(seconds) + 's'\n const minutes = Math.floor(seconds / 60)\n return String(minutes) + 'm ' + String(seconds % 60) + 's'\n}\n\nfunction taskMeta(task: ClaudeTaskInfo, t: ClaudeTasksPanelInjected['t']): string[] {\n const parts: string[] = []\n if (task.subagentType !== undefined) parts.push(task.subagentType)\n else if (task.taskType !== undefined) parts.push(task.taskType)\n if (task.usage?.durationMs !== undefined) parts.push(formatDuration(task.usage.durationMs))\n if (task.usage?.totalTokens !== undefined) parts.push(t('tokens', { count: formatTokenCount(task.usage.totalTokens) }))\n if (task.usage?.toolUses !== undefined) parts.push(t('tasksToolUses', { count: task.usage.toolUses }))\n if (task.lastToolName !== undefined) parts.push(t('tasksLastTool', { tool: task.lastToolName }))\n return parts\n}\n\nfunction TaskActivity({ activity, t }: { activity: ClaudeActivityEvent; t: ClaudeTasksPanelInjected['t'] }) {\n return (\n <li style={styles.taskActivityItem}>\n <span style={styles.taskActivityGlyph} aria-hidden=\"true\">{activity.isError === true ? '×' : '›'}</span>\n <div style={styles.taskActivityBody}>\n <p style={styles.taskActivityTitle}>{activity.title ?? activity.kind}</p>\n {activity.summary === undefined ? null : <p style={styles.taskActivitySummary}>{activity.summary}</p>}\n {activity.detail === undefined ? null : (\n <details style={styles.taskActivityDetail}>\n <summary style={styles.taskActivityDetailSummary}>{t('detail')}</summary>\n <pre style={styles.detailCode}>{activity.detail}</pre>\n </details>\n )}\n </div>\n </li>\n )\n}\n\nfunction TaskCard(props: { task: ClaudeTaskInfo; activities: readonly ClaudeActivityEvent[]; t: ClaudeTasksPanelInjected['t'] }) {\n const { task, activities, t } = props\n const [activityOpen, setActivityOpen] = useState(false)\n const running = task.status === 'running'\n const failed = task.status === 'failed' || task.status === 'killed'\n const meta = taskMeta(task, t)\n return (\n <article style={{ ...styles.taskCard, ...(running ? styles.taskCardRunning : {}) }}>\n <div style={styles.taskCardTop}>\n <span className={running ? 'dsh-claude-act-running' : undefined} style={{ ...styles.taskCardGlyph, ...(running ? styles.iconChipRunning : {}), ...(failed ? styles.iconChipError : {}) }} aria-hidden=\"true\">\n {statusGlyph(task.status)}\n </span>\n <div style={styles.taskCardBody}>\n <p style={{ ...styles.taskTitle, ...(failed ? { color: 'var(--dsw-alias-state-error-primary)' } : {}) }}>{task.description}</p>\n <p style={styles.taskStatusLine}>\n <span>{t(STATUS_LABEL[task.status] ?? 'tasksRunning')}</span>\n {task.backgrounded === true ? <><span aria-hidden=\"true\"> · </span><span>{t('tasksBackground')}</span></> : null}\n </p>\n </div>\n </div>\n {meta.length === 0 ? null : <p style={styles.taskMeta}>{meta.join(' · ')}</p>}\n {task.summary === undefined || running ? null : <p style={styles.taskSummary}>{task.summary}</p>}\n {activities.length === 0 ? null : (\n <div style={styles.taskActivitySection}>\n <button type=\"button\" style={styles.taskTextButton} aria-expanded={activityOpen} onClick={() => setActivityOpen(value => !value)}>\n {activityOpen ? t('tasksHideActivity') : t('tasksViewActivity')}\n </button>\n {activityOpen ? <ul style={styles.taskActivityList}>{activities.map(activity => (\n <TaskActivity key={`${activity.turn}:${activity.step}:${activity.ordinal}`} activity={activity} t={t} />\n ))}</ul> : null}\n </div>\n )}\n </article>\n )\n}\n\nfunction GroupHeading(props: { label: string; count: number; collapsed?: boolean; onToggle?: () => void; action?: { label: string; onClick: () => void } }) {\n const { label, count, collapsed, onToggle, action } = props\n const content = <><span>{label}</span><span style={styles.tasksGroupCount}>{count}</span></>\n return (\n <div style={styles.tasksGroupHeading}>\n {onToggle === undefined ? <div style={styles.tasksGroupTitle}>{content}</div> : (\n <button type=\"button\" style={styles.tasksGroupToggle} aria-expanded={!collapsed} onClick={onToggle}>\n <span style={{ ...styles.chevron, ...(collapsed === true ? {} : styles.chevronOpen) }}>›</span>{content}\n </button>\n )}\n {action === undefined ? null : <button type=\"button\" style={styles.taskTextButton} onClick={action.onClick}>{action.label}</button>}\n </div>\n )\n}\n\nexport function ClaudeTasksPanel({ useClaudeProjection, t, closeDetails, turn }: ClaudeTasksPanelProps) {\n const projection = useClaudeProjection(value => value)\n const tasks = useMemo(\n () => tasksForTurn(projection.tasks?.tasks ?? [], turn),\n [projection.tasks, turn],\n )\n useEffect(() => {\n if (!projection.owned || tasks.length === 0) closeDetails()\n }, [closeDetails, projection.owned, tasks.length])\n const [finishedCollapsed, setFinishedCollapsed] = useState(false)\n const [dismissedSettledIds, setDismissedSettledIds] = useState<ReadonlySet<string>>(() => new Set())\n const groups = useMemo(() => visibleTaskGroups(tasks, dismissedSettledIds), [tasks, dismissedSettledIds])\n const taskActivities = useMemo(() => new Map(tasks.map(task => [task.taskId, activitiesForTask(projection.activities, task.taskId)])), [projection.activities, tasks])\n const clearFinished = (): void => setDismissedSettledIds(previous => new Set([\n ...previous,\n ...tasks.filter(task => task.status !== 'running').map(task => task.taskId),\n ]))\n if (!projection.owned) return null\n return (\n <div className={styles.detailsCardClass} style={styles.tasksPanel}>\n <style data-dsh-claude-panel-icon-styles>{styles.detailsCardCss}{styles.panelIconButtonCss}</style>\n <div style={styles.tasksHeader}>\n <div>\n <span style={styles.tasksHeading}>{t('tasksPanelTurn')}</span>\n <span style={styles.tasksTurnMeta}>{t('tasksTurnNumber', { turn })}</span>\n </div>\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('tasksClose')} onClick={closeDetails}><IconCloseOutline16 /></button>\n </div>\n <div style={styles.tasksBody}>\n <section aria-label={t('tasksRunning')}>\n <GroupHeading label={t('tasksRunning')} count={groups.running.length} />\n {groups.running.length === 0 ? <p style={styles.tasksGroupEmpty}>{t('tasksNoneRunning')}</p> : (\n <div style={styles.taskCardList}>{groups.running.map(task => <TaskCard key={task.taskId} task={task} activities={taskActivities.get(task.taskId) ?? []} t={t} />)}</div>\n )}\n </section>\n <section aria-label={t('tasksSettled')} style={styles.tasksFinishedSection}>\n <GroupHeading\n label={t('tasksSettled')}\n count={groups.finished.length}\n collapsed={finishedCollapsed}\n onToggle={() => setFinishedCollapsed(value => !value)}\n {...(groups.finished.length === 0 ? {} : { action: { label: t('tasksClear'), onClick: clearFinished } })}\n />\n {finishedCollapsed || groups.finished.length === 0 ? null : (\n <div style={styles.taskCardList}>{groups.finished.map(task => <TaskCard key={task.taskId} task={task} activities={taskActivities.get(task.taskId) ?? []} t={t} />)}</div>\n )}\n </section>\n </div>\n </div>\n )\n}\n","import { useEffect, useMemo, useRef, useState, type CSSProperties } from 'react'\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { ClaudeTaskInfo } from '../events.ts'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\nimport type { ClaudeClientProjection } from './projection.ts'\nimport type { ClaudeTurnMarker } from './conversation-sidecar.ts'\nimport { summarizeTurnTasks, tasksForTurn } from './ClaudeTasksPanel.tsx'\nimport * as styles from './styles.ts'\n\nconst MAX_HOVER_TASKS = 6\n\nexport interface ClaudeActivityTailInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n openTasks: (turn: number) => void\n}\n\nexport interface ClaudeActivityTailProps extends ClaudeActivityTailInjected {\n matched: ClaudeTurnMarker\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\n}\n\nexport interface ClaudeTaskLauncherProps extends ClaudeActivityTailInjected {\n turn: number\n tasks: readonly ClaudeTaskInfo[]\n}\n\nfunction taskGlyph(status: ClaudeTaskInfo['status']): { glyph: string; style: CSSProperties } {\n if (status === 'failed') return { glyph: '×', style: styles.tasksHoverGlyphError }\n if (status === 'completed') return { glyph: '✓', style: styles.tasksHoverGlyphDone }\n return { glyph: '●', style: styles.tasksHoverGlyphRunning }\n}\n\nexport function ClaudeTaskLauncher({ turn, tasks, t, openTasks }: ClaudeTaskLauncherProps) {\n const [hovered, setHovered] = useState(false)\n const closeTimer = useRef<ReturnType<typeof setTimeout>>()\n const turnTasks = useMemo(() => tasksForTurn(tasks, turn), [tasks, turn])\n const summary = useMemo(() => summarizeTurnTasks(turnTasks), [turnTasks])\n const open = (): void => {\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\n closeTimer.current = undefined\n setHovered(true)\n }\n const scheduleClose = (): void => {\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\n closeTimer.current = setTimeout(() => {\n closeTimer.current = undefined\n setHovered(false)\n }, 350)\n }\n useEffect(() => () => {\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\n }, [])\n if (summary === undefined) return null\n const label = summary.state === 'running'\n ? t('tasksTurnRunning', { count: summary.running })\n : summary.state === 'failed'\n ? t('tasksTurnFailed', { failed: summary.failed, completed: summary.completed })\n : t('tasksTurnCompleted', { count: summary.completed })\n const stateStyle = summary.state === 'completed' ? styles.tasksBadgeDone : {}\n const dotStyle = summary.state === 'failed'\n ? styles.tasksBadgeDotError\n : summary.state === 'completed' ? styles.tasksBadgeDotDone : {}\n return (\n <div data-claude-task-launcher={turn} style={styles.tasksBadgeWrap}>\n <span\n style={styles.tasksBadgeSeat}\n onMouseEnter={open}\n onMouseLeave={scheduleClose}\n onFocus={open}\n onBlur={event => {\n if (!event.currentTarget.contains(event.relatedTarget)) scheduleClose()\n }}\n >\n {hovered ? (\n <span role=\"tooltip\" style={styles.tasksHoverCard} onMouseEnter={open} onMouseLeave={scheduleClose}>\n <span style={styles.tasksHoverHeader}>{label}</span>\n {turnTasks.slice(0, MAX_HOVER_TASKS).map(task => {\n const { glyph, style } = taskGlyph(task.status)\n return (\n <span key={task.taskId} style={styles.tasksHoverRow}>\n <span className={task.status === 'running' ? 'dsh-claude-act-running' : undefined} style={{ ...styles.tasksHoverGlyph, ...style }} aria-hidden=\"true\">{glyph}</span>\n <span style={styles.tasksHoverDesc} title={task.description}>{task.description}</span>\n {task.subagentType === undefined ? null : <span style={styles.tasksHoverType}>{task.subagentType}</span>}\n </span>\n )\n })}\n {turnTasks.length > MAX_HOVER_TASKS ? <span style={styles.tasksHoverMore}>+{turnTasks.length - MAX_HOVER_TASKS}</span> : null}\n <span style={styles.tasksHoverHint}>{t('tasksOpen')}</span>\n </span>\n ) : null}\n <button\n type=\"button\"\n className=\"dsh-claude-task-launcher\"\n style={{ ...styles.tasksTurnBadge, ...stateStyle, ...(hovered ? styles.tasksBadgeHovered : {}) }}\n aria-label={`${label} — ${t('tasksOpen')}`}\n onClick={() => openTasks(turn)}\n >\n <span\n className={summary.state === 'running' ? 'dsh-claude-act-running' : undefined}\n style={{ ...styles.tasksBadgeDot, ...dotStyle }}\n aria-hidden=\"true\"\n />\n <span style={styles.tasksBadgeLabel}>{label}</span>\n </button>\n </span>\n </div>\n )\n}\n\nexport function ClaudeActivityTail({ matched, useClaudeProjection, t, openTasks }: ClaudeActivityTailProps) {\n const tasks = useClaudeProjection(value => value.tasks?.tasks ?? [])\n return <ClaudeTaskLauncher turn={matched.turn} tasks={tasks} t={t} openTasks={openTasks} />\n}\n","import type { ChatNodeViewProps } from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport { ClaudeTaskLauncher } from './ClaudeActivityTail.tsx'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\n\nexport interface ClaudeActiveTasksNodeProps extends Omit<ChatNodeViewProps<'claude-active-tasks'>, 't'> {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n openTasks: (turn: number) => void\n}\n\nconst EMPTY_TASKS = [] as const\n\n/** Render the task launcher while the owning DSH turn is still open. */\nexport function ClaudeActiveTasksNode({ node, useClaudeProjection, t, openTasks }: ClaudeActiveTasksNodeProps) {\n const tasks = useClaudeProjection(value => value.tasks?.tasks ?? EMPTY_TASKS)\n return <ClaudeTaskLauncher turn={node.data.turn} tasks={tasks} t={t} openTasks={openTasks} />\n}\n","import type { HostObservable, SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { ClaudeActivityEvent, ClaudeContextUsageEvent, ClaudeTasksEvent } from '../events.ts'\nimport type { ClaudeCommandView } from '../command-bridge.ts'\nimport type { RepositoryStatus } from '../repository-status.ts'\nimport type { ReviewComment } from '../review-comments.ts'\nimport { CLAUDE_PROJECTION_PATH } from '../constants.ts'\n\nexport interface ClaudeClientProjection {\n readonly schemaVersion: 1\n readonly revision: number\n readonly owned: boolean\n readonly commands: readonly ClaudeCommandView[]\n readonly activities: readonly ClaudeActivityEvent[]\n readonly contextUsage?: ClaudeContextUsageEvent\n readonly tasks?: ClaudeTasksEvent\n readonly repository?: RepositoryStatus\n readonly reviewComments?: readonly ReviewComment[]\n /** Client-derived per-step activity slices with stable identities for\n * untouched steps, so streaming re-renders only the active step. */\n readonly byStep?: ReadonlyMap<string, readonly ClaudeActivityEvent[]>\n}\n\nexport const EMPTY_CLAUDE_PROJECTION: ClaudeClientProjection = {\n schemaVersion: 1,\n revision: 0,\n owned: false,\n commands: [],\n activities: [],\n}\n\nconst RETRY_DELAY_MS = 2_000\n/** Coalesce stream deltas into at most one React notification per frame. */\nconst FRAME_MS = 16\n/** Typewriter smoothing: drain newly arrived prose over roughly this window,\n * so the CLI's paragraph-sized deltas read as a continuous character flow. */\nconst REVEAL_WINDOW_MS = 1_200\n/** A burst larger than this (redaction rewrite, reconnect catch-up) shows\n * instantly instead of animating for a long stretch. */\nconst MAX_INSTANT_REVEAL = 4_000\nconst MAX_ACTIVITIES = 10_000\nconst MAX_COMMANDS = 2_000\nconst MAX_REPOSITORY_TEXT_CHARS = 1_024\nconst MAX_DIFF_CHARS = 256 * 1024\nconst MAX_REVIEW_COMMENTS = 50\nconst MAX_REVIEW_COMMENT_CHARS = 2_000\nconst MAX_TRANSCRIPT_CHARS = 64_000\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined\n}\n\nfunction nonNegativeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0\n}\n\nfunction optionalBoundedString(value: unknown): boolean {\n return value === undefined || (typeof value === 'string' && value.length <= MAX_REPOSITORY_TEXT_CHARS)\n}\n\nfunction validateRepository(value: unknown): value is RepositoryStatus {\n const repository = record(value)\n if (repository === undefined\n || !['ready', 'not-repository', 'unavailable'].includes(String(repository.status))\n || typeof repository.cwd !== 'string'\n || repository.cwd.length > MAX_REPOSITORY_TEXT_CHARS\n || !optionalBoundedString(repository.root)\n || !optionalBoundedString(repository.branch)\n || !optionalBoundedString(repository.remote)\n || (repository.detached !== undefined && typeof repository.detached !== 'boolean')\n || (repository.worktree !== undefined && typeof repository.worktree !== 'boolean')\n || (repository.dirty !== undefined && typeof repository.dirty !== 'boolean')\n || (repository.upstream !== undefined && typeof repository.upstream !== 'boolean')\n || (repository.ahead !== undefined && !nonNegativeInteger(repository.ahead))\n || (repository.behind !== undefined && !nonNegativeInteger(repository.behind))) return false\n if (repository.diff !== undefined) {\n const diff = record(repository.diff)\n if (diff === undefined\n || !nonNegativeInteger(diff.additions)\n || !nonNegativeInteger(diff.deletions)\n || !nonNegativeInteger(diff.files)\n || typeof diff.truncated !== 'boolean'\n || (diff.patch !== undefined && (typeof diff.patch !== 'string' || diff.patch.length > MAX_DIFF_CHARS))) return false\n }\n if (repository.pullRequest === undefined) return true\n const pullRequest = record(repository.pullRequest)\n if (pullRequest === undefined\n || !Number.isSafeInteger(pullRequest.number)\n || Number(pullRequest.number) <= 0\n || typeof pullRequest.title !== 'string'\n || pullRequest.title.length > MAX_REPOSITORY_TEXT_CHARS\n || typeof pullRequest.url !== 'string'\n || pullRequest.url.length > MAX_REPOSITORY_TEXT_CHARS\n || !['open', 'closed', 'merged'].includes(String(pullRequest.state))\n || typeof pullRequest.draft !== 'boolean'\n || !['approved', 'changes-requested', 'review-required', 'none'].includes(String(pullRequest.review))\n || !['passing', 'pending', 'failing', 'none'].includes(String(pullRequest.checks))\n || !optionalBoundedString(pullRequest.mergeState)\n || !optionalBoundedString(pullRequest.author)\n || !optionalBoundedString(pullRequest.baseBranch)\n || (pullRequest.createdAt !== undefined && (typeof pullRequest.createdAt !== 'string' || !Number.isFinite(Date.parse(pullRequest.createdAt))))\n || (pullRequest.mergedAt !== undefined && (typeof pullRequest.mergedAt !== 'string' || !Number.isFinite(Date.parse(pullRequest.mergedAt))))) return false\n try {\n const url = new URL(pullRequest.url)\n return url.protocol === 'https:' && url.hostname === 'github.com'\n } catch {\n return false\n }\n}\n\n/** Validate the public route envelope before publishing it to UI components. */\nexport function parseClaudeClientProjection(value: unknown): ClaudeClientProjection {\n const input = record(value)\n if (input === undefined\n || input.schemaVersion !== 1\n || !nonNegativeInteger(input.revision)\n || typeof input.owned !== 'boolean'\n || !Array.isArray(input.commands)\n || input.commands.length > MAX_COMMANDS\n || !Array.isArray(input.activities)\n || input.activities.length > MAX_ACTIVITIES) {\n throw new Error('invalid Claude sidecar projection')\n }\n for (const item of input.commands) {\n const command = record(item)\n if (command === undefined\n || typeof command.publicName !== 'string'\n || typeof command.claudeName !== 'string'\n || typeof command.description !== 'string'\n || (command.hint !== undefined && typeof command.hint !== 'string')\n || typeof command.prefixed !== 'boolean') throw new Error('invalid Claude command projection')\n }\n for (const item of input.activities) {\n const activity = record(item)\n if (activity === undefined\n || !nonNegativeInteger(activity.turn)\n || !nonNegativeInteger(activity.step)\n || !nonNegativeInteger(activity.ordinal)\n || typeof activity.kind !== 'string') throw new Error('invalid Claude sidecar activity')\n }\n if (input.contextUsage !== undefined && record(input.contextUsage) === undefined) {\n throw new Error('invalid Claude context projection')\n }\n const tasks = input.tasks === undefined ? undefined : record(input.tasks)\n if (tasks !== undefined && !Array.isArray(tasks.tasks)) throw new Error('invalid Claude tasks projection')\n if (input.repository !== undefined && !validateRepository(input.repository)) {\n throw new Error('invalid Claude repository projection')\n }\n if (input.reviewComments !== undefined) {\n if (!Array.isArray(input.reviewComments) || input.reviewComments.length > MAX_REVIEW_COMMENTS) {\n throw new Error('invalid Claude review comment projection')\n }\n for (const item of input.reviewComments) {\n const comment = record(item)\n if (comment === undefined\n || typeof comment.id !== 'string' || comment.id.length === 0 || comment.id.length > 128\n || typeof comment.path !== 'string' || comment.path.length === 0 || comment.path.length > MAX_REPOSITORY_TEXT_CHARS\n || !nonNegativeInteger(comment.line)\n || (comment.side !== 'old' && comment.side !== 'new')\n || typeof comment.text !== 'string' || comment.text.length > MAX_REVIEW_COMMENT_CHARS) {\n throw new Error('invalid Claude review comment projection')\n }\n }\n }\n return input as unknown as ClaudeClientProjection\n}\n\n/** Validate one incremental delta payload with the same rules as a snapshot. */\nfunction validateEnvelopeFragment(fragment: Record<string, unknown>): void {\n parseClaudeClientProjection({ schemaVersion: 1, revision: 0, owned: false, commands: [], activities: [], ...fragment })\n}\n\nexport function stepKeyOf(turn: number, step: number): string {\n return `${turn}:${step}`\n}\n\nconst EMPTY_ACTIVITIES: readonly ClaudeActivityEvent[] = []\n\n/** Identity-stable per-step slice; untouched steps never re-render while\n * another step streams. Falls back to filtering for snapshot-only hooks. */\nexport function selectStepActivities(\n value: ClaudeClientProjection,\n turn: number,\n step: number,\n): readonly ClaudeActivityEvent[] {\n const sliced = value.byStep?.get(stepKeyOf(turn, step))\n if (sliced !== undefined) return sliced\n const filtered = value.activities.filter(activity => activity.turn === turn && activity.step === step)\n return filtered.length === 0 ? EMPTY_ACTIVITIES : filtered\n}\n\nexport interface ClaudeProjectionSource extends HostObservable<ClaudeClientProjection> {\n dispose(): void\n}\n\nfunction isAbort(error: unknown): boolean {\n return (error as { name?: unknown } | null | undefined)?.name === 'AbortError'\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, ms)\n ;(timer as { unref?: () => void }).unref?.()\n })\n}\n\n/** Create one lazy source: active subscribers open the Host NDJSON stream, and\n * a dropped stream reconnects with a fresh snapshot after a bounded delay. */\nexport function createClaudeProjectionSource(\n sessionId: string,\n fetchProjection: typeof fetch = fetch,\n retryDelayMs = RETRY_DELAY_MS,\n): ClaudeProjectionSource {\n let snapshot = EMPTY_CLAUDE_PROJECTION\n let revision = 0\n let owned = false\n let commands: readonly ClaudeCommandView[] = []\n let contextUsage: ClaudeContextUsageEvent | undefined\n let tasks: ClaudeTasksEvent | undefined\n let repository: RepositoryStatus | undefined\n let reviewComments: readonly ReviewComment[] | undefined\n const byStep = new Map<string, ClaudeActivityEvent[]>()\n const stepOrder: { turn: number; step: number; key: string }[] = []\n /** Streaming prose still being revealed: full arrived text plus shown chars. */\n const reveal = new Map<string, { full: ClaudeActivityEvent; shown: number }>()\n let disposed = false\n let running = false\n let controller: AbortController | undefined\n let frame: ReturnType<typeof setTimeout> | number | undefined\n let usedAnimationFrame = false\n const listeners = new Set<() => void>()\n\n const ensureStep = (turn: number, step: number): ClaudeActivityEvent[] => {\n const key = stepKeyOf(turn, step)\n const existing = byStep.get(key)\n if (existing !== undefined) return existing\n const created: ClaudeActivityEvent[] = []\n byStep.set(key, created)\n const at = stepOrder.findIndex(entry => entry.turn > turn || (entry.turn === turn && entry.step > step))\n stepOrder.splice(at === -1 ? stepOrder.length : at, 0, { turn, step, key })\n return created\n }\n\n const upsertActivity = (activity: ClaudeActivityEvent): void => {\n const key = stepKeyOf(activity.turn, activity.step)\n // Copy-on-write: only the touched step's slice changes identity.\n const next = ensureStep(activity.turn, activity.step).slice()\n const index = next.findIndex(item => item.ordinal === activity.ordinal)\n if (index === -1) {\n const at = next.findIndex(item => item.ordinal > activity.ordinal)\n next.splice(at === -1 ? next.length : at, 0, activity)\n } else {\n next[index] = activity\n }\n byStep.set(key, next)\n }\n\n const reset = (activities: readonly ClaudeActivityEvent[]): void => {\n byStep.clear()\n stepOrder.length = 0\n reveal.clear()\n // Snapshot activities arrive globally sorted, so plain pushes stay ordered.\n for (const activity of activities) ensureStep(activity.turn, activity.step).push(activity)\n }\n\n /** Advance every pending typewriter reveal by one frame's worth of characters.\n * The per-frame step scales with the backlog so any burst drains in roughly\n * REVEAL_WINDOW_MS. Returns whether another frame is still needed. */\n const advanceReveals = (): boolean => {\n let remaining = false\n for (const [key, entry] of reveal) {\n const total = entry.full.text?.length ?? 0\n if (entry.shown >= total) {\n reveal.delete(key)\n continue\n }\n const step = Math.max(1, Math.ceil((total - entry.shown) * FRAME_MS / REVEAL_WINDOW_MS))\n entry.shown = Math.min(total, entry.shown + step)\n upsertActivity({ ...entry.full, text: (entry.full.text ?? '').slice(0, entry.shown) })\n if (entry.shown >= total) reveal.delete(key)\n else remaining = true\n }\n return remaining\n }\n\n const publish = (): void => {\n frame = undefined\n if (disposed) return\n const revealing = advanceReveals()\n const activities: ClaudeActivityEvent[] = []\n for (const entry of stepOrder) {\n const slice = byStep.get(entry.key)\n if (slice !== undefined) for (const item of slice) activities.push(item)\n }\n snapshot = {\n schemaVersion: 1,\n revision,\n owned,\n commands,\n activities,\n ...(contextUsage === undefined ? {} : { contextUsage }),\n ...(tasks === undefined ? {} : { tasks }),\n ...(repository === undefined ? {} : { repository }),\n ...(reviewComments === undefined ? {} : { reviewComments }),\n byStep: new Map(byStep),\n }\n for (const listener of [...listeners]) listener()\n if (revealing) schedulePublish()\n }\n\n const cancelFrame = (): void => {\n if (frame === undefined) return\n if (usedAnimationFrame) {\n (globalThis as { cancelAnimationFrame?: (handle: number) => void }).cancelAnimationFrame?.(frame as number)\n } else {\n clearTimeout(frame as ReturnType<typeof setTimeout>)\n }\n frame = undefined\n }\n\n const schedulePublish = (): void => {\n if (disposed || frame !== undefined || listeners.size === 0) return\n const raf = (globalThis as { requestAnimationFrame?: (callback: () => void) => number }).requestAnimationFrame\n if (typeof raf === 'function') {\n usedAnimationFrame = true\n frame = raf(publish)\n } else {\n usedAnimationFrame = false\n frame = setTimeout(publish, FRAME_MS)\n }\n }\n\n const applyText = (event: Record<string, unknown>): boolean => {\n const { turn, step, ordinal, append, text } = event\n if (!nonNegativeInteger(turn) || !nonNegativeInteger(step) || !nonNegativeInteger(ordinal)) return false\n if (append !== undefined && (typeof append !== 'string' || append.length > MAX_TRANSCRIPT_CHARS)) return false\n if (text !== undefined && (typeof text !== 'string' || text.length > MAX_TRANSCRIPT_CHARS)) return false\n if (append === undefined && text === undefined) return false\n const revealKey = `${turn}:${step}:${ordinal}`\n const slice = byStep.get(stepKeyOf(turn, step))\n const existing = slice?.find(item => item.ordinal === ordinal)\n const pending = reveal.get(revealKey)\n if (existing === undefined && pending === undefined && typeof text !== 'string') {\n // ponytail: an append without its base waits for the next snapshot line\n return false\n }\n // Appends extend the full arrived text, which may be ahead of the\n // currently revealed prefix stored in byStep.\n const baseText = pending?.full.text ?? existing?.text ?? ''\n const fullText = (typeof text === 'string' ? text : `${baseText}${append as string}`).slice(0, MAX_TRANSCRIPT_CHARS)\n const template = pending?.full ?? existing ?? { turn, step, ordinal, kind: 'text' as const, phase: 'updated' as const }\n const full = { ...template, text: fullText }\n const shown = Math.min(pending?.shown ?? existing?.text?.length ?? 0, fullText.length)\n if (fullText.length - shown > MAX_INSTANT_REVEAL) {\n reveal.delete(revealKey)\n upsertActivity(full)\n return true\n }\n reveal.set(revealKey, { full, shown })\n upsertActivity({ ...full, text: fullText.slice(0, shown) })\n return true\n }\n\n const applyLine = (line: string): void => {\n const trimmed = line.trim()\n if (trimmed.length === 0) return\n let value: unknown\n try {\n value = JSON.parse(trimmed)\n } catch {\n return\n }\n const event = record(value)\n if (event === undefined || typeof event.type !== 'string') return\n try {\n switch (event.type) {\n case 'snapshot': {\n const next = parseClaudeClientProjection(event)\n revision = next.revision\n owned = next.owned\n commands = next.commands\n contextUsage = next.contextUsage\n tasks = next.tasks\n repository = next.repository\n reviewComments = next.reviewComments\n reset(next.activities)\n break\n }\n case 'text':\n if (!applyText(event)) return\n revision += 1\n break\n case 'activity':\n validateEnvelopeFragment({ activities: [event.activity] })\n upsertActivity(event.activity as ClaudeActivityEvent)\n revision += 1\n break\n case 'contextUsage':\n validateEnvelopeFragment({ contextUsage: event.value })\n contextUsage = event.value as ClaudeContextUsageEvent\n revision += 1\n break\n case 'tasks':\n validateEnvelopeFragment({ tasks: event.value })\n tasks = event.value as ClaudeTasksEvent\n revision += 1\n break\n case 'meta':\n validateEnvelopeFragment({\n owned: event.owned,\n commands: event.commands,\n ...(event.repository === undefined ? {} : { repository: event.repository }),\n ...(event.reviewComments === undefined ? {} : { reviewComments: event.reviewComments }),\n })\n owned = event.owned as boolean\n commands = event.commands as readonly ClaudeCommandView[]\n repository = event.repository as RepositoryStatus | undefined\n reviewComments = event.reviewComments as readonly ReviewComment[] | undefined\n revision += 1\n break\n default:\n // ping and unknown line types are ignored\n return\n }\n } catch {\n // A malformed or oversized delta is transient; keep the last verified\n // state visible instead of making mounted UI disappear.\n return\n }\n schedulePublish()\n }\n\n const run = async (): Promise<void> => {\n if (running) return\n running = true\n try {\n while (!disposed && listeners.size > 0) {\n controller = new AbortController()\n try {\n const response = await fetchProjection(`${CLAUDE_PROJECTION_PATH}/${encodeURIComponent(sessionId)}/stream`, {\n headers: { accept: 'application/x-ndjson' },\n signal: controller.signal,\n })\n if (!response.ok) throw new Error(`Claude projection stream failed (${response.status})`)\n if (response.body === null) throw new Error('Claude projection stream is unavailable')\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n while (true) {\n if (disposed || listeners.size === 0) {\n await reader.cancel().catch(() => undefined)\n break\n }\n const chunk = await reader.read()\n buffer += decoder.decode(chunk.value, { stream: !chunk.done })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) applyLine(line)\n if (chunk.done) break\n }\n } catch (error) {\n // Abort is the ordinary unmount path; other failures retry below.\n if (isAbort(error)) return\n } finally {\n controller = undefined\n }\n if (disposed || listeners.size === 0) return\n await delay(retryDelayMs)\n }\n } finally {\n running = false\n }\n }\n\n return {\n getSnapshot: () => snapshot,\n subscribe(listener) {\n if (disposed) return () => {}\n const wasIdle = listeners.size === 0\n listeners.add(listener)\n if (wasIdle) void run()\n return () => {\n listeners.delete(listener)\n if (listeners.size !== 0) return\n controller?.abort()\n controller = undefined\n cancelFrame()\n }\n },\n dispose() {\n disposed = true\n listeners.clear()\n controller?.abort()\n controller = undefined\n cancelFrame()\n },\n }\n}\n\nexport class ClaudeProjectionStore {\n readonly #sources = new Map<string, ClaudeProjectionSource>()\n\n source(sessionId: string): ClaudeProjectionSource {\n let source = this.#sources.get(sessionId)\n if (source === undefined) {\n source = createClaudeProjectionSource(sessionId)\n this.#sources.set(sessionId, source)\n }\n return source\n }\n\n dispose(): void {\n for (const source of this.#sources.values()) source.dispose()\n this.#sources.clear()\n }\n}\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface SessionStandardProps {\n /** Plugin-owned sidecar projection for the rendered session. */\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\n }\n\n interface SessionMaybeStandardProps {\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection> | undefined\n }\n}\n","import { useMemo, useState } from 'react'\nimport {\n DiffBlock,\n DisclosureRow,\n IconApiOutline14,\n IconThinkOutline14,\n MarkdownText,\n StateDot,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { ChatNodeViewProps } from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type { ClaudeActivityEvent } from '../events.ts'\nimport type { ClaudeActivityChatData, ClaudeSubcall, ClaudeTranscriptTool } from './conversation-sidecar.ts'\nimport { transcriptItemsForStep } from './conversation-sidecar.ts'\nimport { selectStepActivities } from './projection.ts'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\n\ntype Translate = (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n\nexport type ClaudeActivityNodeProps = Omit<ChatNodeViewProps<'claude-activity-step'>, 't'> & { t: Translate }\n\nconst EMPTY_TASKS = [] as const\n\nconst ACTIVITY_CSS = [\n '.dsh-claude-flow{display:flex;flex-direction:column;gap:10px}',\n '.dsh-claude-transcript-text{color:var(--dsw-alias-label-primary);font-size:15px;line-height:24px;overflow-wrap:anywhere}',\n '.dsh-claude-tool-group-native{overflow:visible}',\n '.dsh-claude-tool-group-native>.dsh-claude-flow-row{padding:0}',\n '.dsh-claude-tool-list{max-height:min(420px,calc(100vh - 320px));overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;margin-top:4px;border:1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent));border-radius:10px;scrollbar-gutter:stable}',\n '.dsh-claude-tool-item{border-top:1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent))}',\n '.dsh-claude-tool-item:first-child{border-top:0}',\n '.dsh-claude-tool-summary-row{display:flex;align-items:center;min-height:34px;gap:8px;padding:0 10px;cursor:pointer;list-style:none}',\n '.dsh-claude-tool-summary-row::-webkit-details-marker{display:none}',\n '.dsh-claude-tool-summary-row::after{content:\"›\";margin-left:2px;flex:none;align-self:center;color:var(--dsw-alias-label-secondary);font-size:22px;line-height:1;transform-origin:center;transition:transform .15s ease}',\n '.dsh-claude-tool-item[open]>.dsh-claude-tool-summary-row::after{transform:rotate(90deg)}',\n '.dsh-claude-tool-content{min-width:0;padding:0 10px 8px}',\n '.dsh-claude-tool-content>*{max-width:100%;box-sizing:border-box}',\n '.dsh-claude-tool-section{margin-top:8px}',\n '.dsh-claude-tool-section-title{margin-bottom:4px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px;text-transform:uppercase;letter-spacing:.04em}',\n '.dsh-claude-tool-fields{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:3px 12px;font-size:13px;line-height:20px}',\n '.dsh-claude-tool-field-key{color:var(--dsw-alias-label-tertiary)}',\n '.dsh-claude-tool-field-value{min-width:0;color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere}',\n '.dsh-claude-tool-paths{display:flex;flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;font:var(--dsw-font-markdown-code-block-small)}',\n '.dsh-claude-tool-path{overflow-wrap:anywhere;color:var(--dsw-alias-label-primary)}',\n '.dsh-claude-tool-code{max-height:260px;overflow:auto;margin:0;padding:8px 0;border-radius:8px;background:var(--dsw-alias-markdown-code-block);font:var(--dsw-font-markdown-code-block-small)}',\n '.dsh-claude-tool-code-line{display:grid;grid-template-columns:44px minmax(max-content,1fr);min-height:18px}',\n '.dsh-claude-tool-line-number{padding-right:10px;text-align:right;user-select:none;color:var(--dsw-alias-label-caption);border-right:1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent))}',\n '.dsh-claude-tool-line-text{padding:0 10px;white-space:pre}',\n '.dsh-claude-tool-label{width:72px;flex:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary)}',\n '.dsh-claude-tool-description{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;line-height:20px;color:var(--dsw-alias-label-primary)}',\n '.dsh-claude-tool-stats{display:inline-flex;gap:4px;flex:none;font-size:13px;line-height:20px}',\n '.dsh-claude-diff-add{color:var(--dsw-alias-state-success-primary,#21c55d)}',\n '.dsh-claude-diff-delete{color:var(--dsw-alias-state-error-primary)}',\n '.dsh-claude-tool-name{font-size:14px;line-height:22px;color:var(--dsw-alias-label-primary)}',\n '.dsh-claude-tool-summary{margin-left:8px;color:var(--dsw-alias-label-tertiary)}',\n '.dsh-claude-tool-detail{margin:6px 0 0;padding:8px 10px;max-height:220px;overflow:auto;border-radius:8px;background:var(--dsw-alias-markdown-code-block);font:var(--dsw-font-markdown-code-block-small);white-space:pre-wrap;overflow-wrap:anywhere}',\n '.dsh-claude-flow-row{position:relative;overflow:hidden}',\n '.dsh-claude-flow-leading{flex-shrink:0}',\n '.dsh-claude-flow-title{font-weight:400}',\n '.dsh-claude-flow-chevron{color:var(--dsw-alias-label-secondary)}',\n '.dsh-claude-flow-separator{width:2px;height:2px;margin:0 8px;border-radius:1px;background:var(--dsw-alias-label-caption);flex:none}',\n '.dsh-claude-flow-summary{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-tertiary);font-size:14px;line-height:24px;flex:auto}',\n '.dsh-claude-flow-summary[data-error]{color:var(--dsw-alias-state-error-primary)}',\n '.dsh-claude-flow-body{margin:4px 0 4px 22px;color:var(--dsw-alias-label-tertiary);font-size:14px;line-height:24px;white-space:pre-wrap;overflow-wrap:anywhere}',\n '.dsh-claude-flow-detail{max-height:260px;overflow:auto;margin:4px 0 4px 4px;padding:12px 16px;border:1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent));border-radius:12px;background:var(--dsw-alias-markdown-code-block);color:var(--dsw-alias-label-primary);font:var(--dsw-font-markdown-code-block-small);white-space:pre-wrap}',\n '.dsh-claude-flow-subcalls{display:flex;flex-direction:column;gap:2px;margin:4px 0 4px 22px;color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:22px}',\n '.dsh-claude-act-running{animation:dsh-claude-act-pulse 1.2s ease-in-out infinite}',\n '@keyframes dsh-claude-act-pulse{0%,100%{opacity:1}50%{opacity:.3}}',\n].join('')\n\nlet cssInjected = false\nfunction ensureCss(): void {\n if (cssInjected || typeof document === 'undefined') return\n cssInjected = true\n const element = document.createElement('style')\n element.dataset.dshClaudeActivity = ''\n element.textContent = ACTIVITY_CSS\n document.head.appendChild(element)\n}\n\nfunction subcallGlyph(subcall: ClaudeSubcall): string {\n if (subcall.isError === true || subcall.phase === 'failed') return '×'\n if (subcall.phase === 'started' || subcall.phase === 'updated') return '●'\n return '✓'\n}\n\nfunction title(activity: ClaudeActivityEvent): string {\n return activity.toolName ?? activity.title ?? activity.kind.replaceAll('-', ' ')\n}\n\nfunction activityState(activity: ClaudeActivityEvent, running: boolean): 'done' | 'ongoing' | 'warning' | 'error' {\n if (activity.isError === true || activity.kind === 'error' || activity.phase === 'denied' || activity.phase === 'failed') return 'error'\n if (running) return 'ongoing'\n if (activity.kind === 'warning') return 'warning'\n return 'done'\n}\n\nfunction ActivityRow({ row, t }: { row: ClaudeActivityChatData; t: Translate }) {\n const { activity, running, subcalls } = row\n const [open, setOpen] = useState(false)\n const state = activityState(activity, running)\n const detail = activity.detail\n const expandable = detail !== undefined || subcalls.length > 0 || activity.kind === 'thinking'\n const summary = activity.summary ?? (running ? t('running') : state === 'error' ? t('failed') : t('done'))\n const body = activity.kind === 'thinking' ? activity.summary : detail\n const icon = activity.kind === 'thinking'\n ? <IconThinkOutline14 size={14} />\n : state === 'done'\n ? <IconApiOutline14 size={14} />\n : <StateDot state={state} />\n return (\n <DisclosureRow\n rowClassName=\"dsh-claude-flow-row\"\n leadingClassName=\"dsh-claude-flow-leading\"\n titleClassName=\"dsh-claude-flow-title\"\n chevronClassName=\"dsh-claude-flow-chevron\"\n icon={icon}\n title={activity.kind === 'thinking' ? t('thinking') : title(activity)}\n open={open}\n expandable={expandable}\n expandOnRowClick\n keepContentWhenOpen\n onToggle={() => setOpen(value => !value)}\n collapsedContent={(\n <>\n <span className=\"dsh-claude-flow-separator\" aria-hidden=\"true\" />\n <span className=\"dsh-claude-flow-summary\" data-error={state === 'error' || undefined}>{summary}</span>\n </>\n )}\n >\n {subcalls.length === 0 ? null : (\n <div className=\"dsh-claude-flow-subcalls\">\n {subcalls.map(subcall => (\n <div key={subcall.toolUseId}>{subcallGlyph(subcall)} {subcall.toolName ?? t('subagent')}{subcall.summary === undefined ? '' : ` · ${subcall.summary}`}</div>\n ))}\n </div>\n )}\n {body === undefined ? null : activity.kind === 'thinking'\n ? <div className=\"dsh-claude-flow-body\">{body}</div>\n : <pre className=\"dsh-claude-flow-detail\">{body}</pre>}\n </DisclosureRow>\n )\n}\n\ntype ToolRecord = Record<string, unknown>\n\nfunction parsedValue(value: string | undefined): unknown {\n if (value === undefined || value.length === 0) return undefined\n try {\n return JSON.parse(value) as unknown\n } catch {\n return value\n }\n}\n\nfunction record(value: unknown): ToolRecord | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as ToolRecord : undefined\n}\n\nfunction text(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null) return 'null'\n if (typeof value === 'string') return value\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n if (Array.isArray(value)) return value.map(displayValue).join(', ')\n return record(value) === undefined ? String(value) : Object.entries(value as ToolRecord)\n .map(([key, item]) => `${key}: ${displayValue(item)}`)\n .join('\\n')\n}\n\nfunction Section({ title, children }: { title: string; children: React.ReactNode }) {\n return <section className=\"dsh-claude-tool-section\"><div className=\"dsh-claude-tool-section-title\">{title}</div>{children}</section>\n}\n\nfunction Fields({ value, omit = [] }: { value: ToolRecord; omit?: readonly string[] }) {\n const entries = Object.entries(value).filter(([key, item]) => !omit.includes(key) && item !== undefined && item !== '')\n if (entries.length === 0) return null\n return <div className=\"dsh-claude-tool-fields\">{entries.map(([key, item]) => (\n <div key={key} style={{ display: 'contents' }}>\n <span className=\"dsh-claude-tool-field-key\">{key.replaceAll('_', ' ')}</span>\n <span className=\"dsh-claude-tool-field-value\">{displayValue(item)}</span>\n </div>\n ))}</div>\n}\n\nfunction Paths({ paths }: { paths: readonly string[] }) {\n if (paths.length === 0) return null\n return <ul className=\"dsh-claude-tool-paths\">{paths.map((path, index) => <li className=\"dsh-claude-tool-path\" key={`${path}:${index}`}>{path}</li>)}</ul>\n}\n\nfunction Source({ content, start = 1 }: { content: string; start?: number }) {\n return <div className=\"dsh-claude-tool-code\">{content.split(/\\r?\\n/u).map((line, index) => (\n <div className=\"dsh-claude-tool-code-line\" key={index}>\n <span className=\"dsh-claude-tool-line-number\">{start + index}</span>\n <span className=\"dsh-claude-tool-line-text\">{line || ' '}</span>\n </div>\n ))}</div>\n}\n\nfunction TextDetail({ title, value }: { title: string; value: string | undefined }) {\n if (value === undefined || value.length === 0) return null\n return <Section title={title}><pre className=\"dsh-claude-tool-detail\">{value}</pre></Section>\n}\n\nfunction filenameList(value: unknown): readonly string[] {\n if (!Array.isArray(value)) return []\n return value.filter((item): item is string => typeof item === 'string')\n}\n\nfunction ToolPresentation({ tool, t }: { tool: ClaudeTranscriptTool; t: Translate }) {\n const inputValue = parsedValue(tool.input)\n const outputValue = parsedValue(tool.output)\n const input = record(inputValue)\n const output = record(outputValue)\n const outputTitle = tool.isError === true ? t('toolError') : t('toolOutput')\n\n if (tool.diffs !== undefined) {\n return <><DiffBlock diffs={[...tool.diffs]} /><TextDetail title={outputTitle} value={typeof outputValue === 'string' ? outputValue : undefined} /></>\n }\n\n if (tool.toolName === 'Read') {\n const file = record(output?.file)\n const path = text(file?.filePath) ?? text(input?.file_path)\n const content = text(file?.content) ?? (typeof outputValue === 'string' ? outputValue : undefined)\n const offset = numberValue(input?.offset) ?? 1\n return <>\n {path === undefined ? null : <Section title=\"File\"><div className=\"dsh-claude-tool-path\">{path}</div></Section>}\n {input === undefined ? null : <Section title={t('toolInput')}><Fields value={input} omit={['file_path']} /></Section>}\n {content === undefined ? null : <Section title={outputTitle}><Source content={content} start={offset} /></Section>}\n </>\n }\n\n if (tool.toolName === 'Grep' || tool.toolName === 'Glob') {\n const filenames = filenameList(output?.filenames)\n return <>\n {input === undefined ? <TextDetail title={t('toolInput')} value={typeof inputValue === 'string' ? inputValue : undefined} /> : <Section title={t('toolInput')}><Fields value={input} /></Section>}\n {filenames.length === 0\n ? <TextDetail title={outputTitle} value={typeof outputValue === 'string' ? outputValue : output === undefined ? undefined : displayValue(output)} />\n : <Section title={outputTitle}><Paths paths={filenames} /></Section>}\n </>\n }\n\n if (tool.toolName === 'Bash' || tool.toolName === 'PowerShell') {\n const command = text(input?.command)\n const stdout = text(output?.stdout)\n const stderr = text(output?.stderr)\n const terminal = [stdout, stderr].filter((value): value is string => value !== undefined).join('\\n')\n return <>\n <TextDetail title=\"Command\" value={command ?? (typeof inputValue === 'string' ? inputValue : undefined)} />\n {input === undefined ? null : <Section title={t('toolInput')}><Fields value={input} omit={['command']} /></Section>}\n <TextDetail title={outputTitle} value={terminal || (typeof outputValue === 'string' ? outputValue : undefined)} />\n </>\n }\n\n return <>\n {input === undefined ? <TextDetail title={t('toolInput')} value={typeof inputValue === 'string' ? inputValue : undefined} /> : <Section title={t('toolInput')}><Fields value={input} /></Section>}\n {output === undefined ? <TextDetail title={outputTitle} value={typeof outputValue === 'string' ? outputValue : undefined} /> : <Section title={outputTitle}><Fields value={output} /></Section>}\n </>\n}\n\nexport function ClaudeTranscriptToolItem({ tool, t }: { tool: ClaudeTranscriptTool; t: Translate }) {\n return (\n <details className=\"dsh-claude-tool-item\">\n <summary className=\"dsh-claude-tool-summary-row\">\n <span className=\"dsh-claude-tool-label\">{tool.toolName}</span>\n <span className=\"dsh-claude-tool-description\">{tool.description}</span>\n {tool.additions === undefined && tool.deletions === undefined ? null : (\n <span className=\"dsh-claude-tool-stats\">\n <span className=\"dsh-claude-diff-add\">+{tool.additions ?? 0}</span>\n <span className=\"dsh-claude-diff-delete\">−{tool.deletions ?? 0}</span>\n </span>\n )}\n </summary>\n <div className=\"dsh-claude-tool-content\">\n {tool.subcalls.length === 0 ? null : (\n <div className=\"dsh-claude-flow-subcalls\">\n {tool.subcalls.map(subcall => (\n <div key={subcall.toolUseId}>{subcallGlyph(subcall)} {subcall.toolName ?? t('subagent')}{subcall.summary === undefined ? '' : ` · ${subcall.summary}`}</div>\n ))}\n </div>\n )}\n <ToolPresentation tool={tool} t={t} />\n </div>\n </details>\n )\n}\n\nexport function ClaudeTranscriptToolGroup({\n tools,\n additions,\n deletions,\n files: _files,\n t,\n}: {\n tools: readonly ClaudeTranscriptTool[]\n additions?: number\n deletions?: number\n files?: number\n t: Translate\n}) {\n const [open, setOpen] = useState(false)\n const failed = tools.some(tool => tool.isError === true || tool.phase === 'failed')\n const running = tools.some(tool => tool.phase === 'started' || tool.phase === 'updated')\n const summary = tools.length === 1 ? t('usedTool') : t('usedTools', { count: tools.length })\n const hasDiff = additions !== undefined || deletions !== undefined\n return (\n <div className=\"dsh-claude-tool-group-native\">\n <DisclosureRow\n rowClassName=\"dsh-claude-flow-row\"\n leadingClassName=\"dsh-claude-flow-leading\"\n titleClassName=\"dsh-claude-flow-title\"\n chevronClassName=\"dsh-claude-flow-chevron\"\n icon={failed ? <StateDot state=\"error\" /> : running ? <StateDot state=\"ongoing\" /> : <IconApiOutline14 size={14} />}\n title={summary}\n open={open}\n expandable\n expandOnRowClick\n keepContentWhenOpen\n onToggle={() => setOpen(value => !value)}\n collapsedContent={hasDiff ? (\n <span className=\"dsh-claude-tool-stats\">\n <span className=\"dsh-claude-diff-add\">+{additions ?? 0}</span>\n <span className=\"dsh-claude-diff-delete\">−{deletions ?? 0}</span>\n </span>\n ) : undefined}\n />\n {open ? (\n <div className=\"dsh-claude-tool-list\">\n {tools.map(tool => <ClaudeTranscriptToolItem key={tool.toolUseId} tool={tool} t={t} />)}\n </div>\n ) : null}\n </div>\n )\n}\n\nexport function ClaudeActivityNode({ node, useClaudeProjection, t }: ClaudeActivityNodeProps) {\n ensureCss()\n const marker = node.data\n const activities = useClaudeProjection(value => selectStepActivities(value, marker.turn, marker.step))\n const tasks = useClaudeProjection(value => value.tasks?.tasks ?? EMPTY_TASKS)\n const items = useMemo(\n () => transcriptItemsForStep(activities, marker.turn, marker.step, tasks),\n [activities, marker.step, marker.turn, tasks],\n )\n if (items.length === 0) return null\n return (\n <div className=\"dsh-claude-flow\">\n {items.map(item => item.kind === 'text'\n ? <div className=\"dsh-claude-transcript-text\" key={`text:${item.ordinal}`}><MarkdownText text={item.text} /></div>\n : item.kind === 'tools'\n ? <ClaudeTranscriptToolGroup\n key={`tools:${item.ordinal}`}\n tools={item.tools}\n {...(item.additions === undefined ? {} : { additions: item.additions })}\n {...(item.deletions === undefined ? {} : { deletions: item.deletions })}\n {...(item.files === undefined ? {} : { files: item.files })}\n t={t}\n />\n : <ActivityRow key={`activity:${item.ordinal}`} row={item.row} t={t} />)}\n </div>\n )\n}\n","import { CLAUDE_JIRA_PATH } from '../constants.ts'\nimport type { JiraStatus, JiraTicket } from '../jira.ts'\n\nexport type { JiraStatus, JiraTicket } from '../jira.ts'\n\nexport class JiraClientError extends Error {\n readonly code?: string\n\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'JiraClientError'\n if (code !== undefined) this.code = code\n }\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\n}\n\nasync function call(path: string, init: RequestInit): Promise<Record<string, unknown>> {\n const response = await fetch(`${CLAUDE_JIRA_PATH}${path}`, { credentials: 'same-origin', ...init })\n const body = record(await response.json() as unknown)\n if (!response.ok) {\n throw new JiraClientError(\n typeof body?.message === 'string' ? body.message : 'Jira is unavailable.',\n typeof body?.error === 'string' ? body.error : undefined,\n )\n }\n if (body === undefined) throw new JiraClientError('Invalid Jira response.')\n return body\n}\n\nfunction status(body: Record<string, unknown>): JiraStatus {\n if (typeof body.connected !== 'boolean') throw new JiraClientError('Invalid Jira status response.')\n return body as unknown as JiraStatus\n}\n\nexport async function loadJiraStatus(signal?: AbortSignal): Promise<JiraStatus> {\n return status(await call('/status', { method: 'GET', headers: { accept: 'application/json' }, ...(signal === undefined ? {} : { signal }) }))\n}\n\nexport async function connectJira(input: { siteUrl: string; email: string; apiToken: string }): Promise<JiraStatus> {\n return status(await call('/connect', {\n method: 'POST',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify(input),\n }))\n}\n\nexport async function disconnectJira(): Promise<void> {\n await call('/disconnect', { method: 'POST', headers: { accept: 'application/json' } })\n}\n\nexport async function searchJiraTickets(query: string, signal?: AbortSignal): Promise<readonly JiraTicket[]> {\n const body = await call(`/search?query=${encodeURIComponent(query)}`, { method: 'GET', headers: { accept: 'application/json' }, ...(signal === undefined ? {} : { signal }) })\n if (!Array.isArray(body.tickets)) throw new JiraClientError('Invalid Jira search response.')\n const tickets: JiraTicket[] = []\n for (const item of body.tickets) {\n const ticket = record(item)\n if (ticket === undefined || typeof ticket.key !== 'string' || typeof ticket.summary !== 'string' || typeof ticket.url !== 'string') continue\n tickets.push(ticket as unknown as JiraTicket)\n }\n return tickets\n}\n\nexport async function assignJiraTicket(key: string): Promise<void> {\n await call('/assign', {\n method: 'POST',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ key }),\n })\n}\n\n/** Draft seeded into the composer when a session starts from a ticket. */\nexport function ticketPrompt(ticket: JiraTicket): string {\n return `Work on Jira ticket ${ticket.key}: ${ticket.summary}\\n${ticket.url}\\n\\nRead the ticket, implement what it asks for, and reference ${ticket.key} in the commit and pull request.`\n}\n\n/** Appended to a user-written draft so the session still knows its ticket. */\nexport function ticketContext(ticket: JiraTicket): string {\n return `This task is for Jira ticket ${ticket.key}: ${ticket.summary}\\n${ticket.url}\\n\\nRead the ticket for full context and reference ${ticket.key} in the commit and pull request.`\n}\n","import { useCallback, useEffect, useId, useRef, useState } from 'react'\nimport { Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CLAUDE_DOCTOR_PATH, CLAUDE_GLOBAL_SETTINGS_PATH, CLAUDE_UPDATE_CHECK_PATH, CLAUDE_UPDATE_PATH, CLAUDE_USAGE_PATH } from '../constants.ts'\nimport type { PlanUsageReport, PlanUsageWindow } from '../plan-usage.ts'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\nimport * as styles from './styles.ts'\nimport { connectJira, disconnectJira, loadJiraStatus, type JiraStatus } from './jira-api.ts'\n\ninterface DoctorReport {\n executable: { status: 'found' | 'missing'; path?: string; searched: readonly string[] }\n version: { status: 'ok' | 'error' | 'not-run'; value?: string; message?: string }\n authentication: { status: 'signed-in' | 'signed-out' | 'unknown' | 'not-run'; method?: string; provider?: string; subscription?: string; message?: string }\n handshake: 'not-run' | 'ok' | 'error'\n limits: { idleTimeoutMs: number; maxProcesses: number }\n processes: { count: number; active: number }\n}\n\nexport interface PluginUpdateStatus {\n currentVersion: string\n latestVersion?: string\n source: 'registry' | 'link' | 'unsupported' | 'unknown'\n state: 'current' | 'available' | 'linked' | 'unsupported' | 'unavailable' | 'error'\n canUpdate: boolean\n restartRequired: boolean\n message?: string\n}\n\nexport function isPluginUpdateStatus(value: unknown): value is PluginUpdateStatus {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\n const status = value as Record<string, unknown>\n return typeof status.currentVersion === 'string'\n && (status.latestVersion === undefined || typeof status.latestVersion === 'string')\n && ['registry', 'link', 'unsupported', 'unknown'].includes(String(status.source))\n && ['current', 'available', 'linked', 'unsupported', 'unavailable', 'error'].includes(String(status.state))\n && typeof status.canUpdate === 'boolean'\n && typeof status.restartRequired === 'boolean'\n && (status.message === undefined || typeof status.message === 'string')\n}\n\nexport interface GlobalSettingOption {\n value: string\n label: string\n source: 'built-in' | 'user' | 'configured'\n}\n\nexport type GlobalSettingView = {\n key: string\n kind: 'select'\n value: string\n options: readonly GlobalSettingOption[]\n effect: 'new-session' | 'next-worktree' | 'restart'\n} | {\n key: string\n kind: 'text'\n value: string\n maxLength: number\n effect: 'new-session' | 'next-worktree' | 'restart'\n}\n\ninterface GlobalSettingsView {\n settings: readonly GlobalSettingView[]\n}\n\nexport function isGlobalSettingsView(value: unknown): value is GlobalSettingsView {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\n const settings = (value as { settings?: unknown }).settings\n return Array.isArray(settings) && settings.every(setting => {\n if (typeof setting !== 'object' || setting === null || Array.isArray(setting)) return false\n const item = setting as Record<string, unknown>\n if (typeof item.key !== 'string'\n || typeof item.value !== 'string'\n || !['new-session', 'next-worktree', 'restart'].includes(String(item.effect))) return false\n if (item.kind === 'text') return typeof item.maxLength === 'number' && item.maxLength > 0\n return item.kind === 'select'\n && Array.isArray(item.options)\n && item.options.every(option => typeof option === 'object' && option !== null\n && typeof (option as Record<string, unknown>).value === 'string'\n && typeof (option as Record<string, unknown>).label === 'string'\n && ['built-in', 'user', 'configured'].includes(String((option as Record<string, unknown>).source)))\n })\n}\n\nexport interface ClaudeCodeSettingsInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n}\n\nfunction value(status: string, detail?: string): string {\n return detail === undefined ? status : `${status} · ${detail}`\n}\n\ninterface GlobalSettingSelectProps {\n setting: Extract<GlobalSettingView, { kind: 'select' }>\n disabled: boolean\n onChange: (value: string) => void\n}\n\nexport function GlobalSettingText({ setting, disabled, onChange }: {\n setting: Extract<GlobalSettingView, { kind: 'text' }>\n disabled: boolean\n onChange: (value: string) => void\n}) {\n const [draft, setDraft] = useState(setting.value)\n useEffect(() => { setDraft(setting.value) }, [setting.value])\n const save = (): void => {\n if (draft !== setting.value) onChange(draft)\n }\n return (\n <input\n type=\"text\"\n value={draft}\n maxLength={setting.maxLength}\n disabled={disabled}\n style={styles.settingTextInput}\n onChange={event => { setDraft(event.currentTarget.value) }}\n onBlur={save}\n onKeyDown={event => {\n if (event.key === 'Enter') {\n event.preventDefault()\n save()\n event.currentTarget.blur()\n } else if (event.key === 'Escape') {\n setDraft(setting.value)\n event.currentTarget.blur()\n }\n }}\n />\n )\n}\n\nexport function GlobalSettingSelect({ setting, disabled, onChange }: GlobalSettingSelectProps) {\n const [open, setOpen] = useState(false)\n const [activeIndex, setActiveIndex] = useState(0)\n const rootRef = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const listboxId = useId()\n const selectedIndex = Math.max(0, setting.options.findIndex(option => option.value === setting.value))\n const selectedOption = setting.options[selectedIndex]\n\n useEffect(() => {\n if (!open) return\n const closeOnOutsidePointer = (event: MouseEvent): void => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', closeOnOutsidePointer)\n return () => document.removeEventListener('mousedown', closeOnOutsidePointer)\n }, [open])\n\n const openMenu = (index = selectedIndex): void => {\n setActiveIndex(index)\n setOpen(true)\n }\n\n const choose = (index: number): void => {\n const option = setting.options[index]\n if (option === undefined) return\n setOpen(false)\n triggerRef.current?.focus()\n if (option.value !== setting.value) onChange(option.value)\n }\n\n const move = (offset: number): void => {\n const count = setting.options.length\n if (count === 0) return\n setActiveIndex(current => (current + offset + count) % count)\n }\n\n return (\n <div\n ref={rootRef}\n style={styles.settingSelect}\n onBlur={event => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setOpen(false)\n }}\n >\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={open ? `${listboxId}-${activeIndex}` : undefined}\n disabled={disabled || setting.options.length === 0}\n style={{ ...styles.settingSelectTrigger, ...(open ? styles.settingSelectTriggerOpen : {}) }}\n onClick={() => { if (open) setOpen(false); else openMenu() }}\n onKeyDown={event => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault()\n if (!open) openMenu(event.key === 'ArrowDown' ? selectedIndex : Math.max(0, setting.options.length - 1))\n else move(event.key === 'ArrowDown' ? 1 : -1)\n } else if (event.key === 'Home' && open) {\n event.preventDefault()\n setActiveIndex(0)\n } else if (event.key === 'End' && open) {\n event.preventDefault()\n setActiveIndex(Math.max(0, setting.options.length - 1))\n } else if ((event.key === 'Enter' || event.key === ' ') && open) {\n event.preventDefault()\n choose(activeIndex)\n } else if (event.key === 'Escape' && open) {\n event.preventDefault()\n setOpen(false)\n }\n }}\n >\n <span style={styles.settingSelectValue}>{selectedOption?.label ?? setting.value}</span>\n <span aria-hidden=\"true\" style={{ ...styles.settingSelectChevron, ...(open ? styles.settingSelectChevronOpen : {}) }}>⌄</span>\n </button>\n {open ? (\n <div id={listboxId} role=\"listbox\" aria-activedescendant={`${listboxId}-${activeIndex}`} style={styles.settingSelectMenu}>\n {setting.options.map((option, index) => {\n const selected = option.value === setting.value\n const active = index === activeIndex\n return (\n <button\n id={`${listboxId}-${index}`}\n key={`${option.source}:${option.value}`}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n style={{ ...styles.settingSelectOption, ...(active ? styles.settingSelectOptionActive : {}) }}\n onMouseEnter={() => setActiveIndex(index)}\n onMouseDown={event => event.preventDefault()}\n onClick={() => choose(index)}\n >\n <span style={styles.settingSelectCheck} aria-hidden=\"true\">{selected ? '✓' : ''}</span>\n <span>{option.label}</span>\n </button>\n )\n })}\n </div>\n ) : null}\n </div>\n )\n}\n\n/** Fixed windows carry a translated label; server-named model buckets (e.g.\n * 'Fable') arrive with their own `label` and are shown verbatim. */\nconst TRANSLATED_WINDOWS = new Set(['five_hour', 'seven_day', 'seven_day_opus', 'seven_day_sonnet'])\n\n/** Per-setting label and the effect note that used to sit as a standalone\n * paragraph under the card; it now hangs off the label as a hover hint. */\nexport const SETTING_COPY: Readonly<Record<string, { label: ClaudeCodeSettingsKey; hint: ClaudeCodeSettingsKey }>> = {\n outputStyle: { label: 'outputStyle', hint: 'globalSettingsNewSession' },\n worktreeBranchPrefix: { label: 'worktreeBranchPrefix', hint: 'worktreeBranchPrefixEffect' },\n maxProcesses: { label: 'maxProcessesSetting', hint: 'maxProcessesEffect' },\n idleTimeoutMinutes: { label: 'idleTimeoutSetting', hint: 'idleTimeoutEffect' },\n}\n\n/** '?' badge that reveals a setting's effect note on hover or keyboard focus. */\nexport function SettingHint({ text, label }: { text: string; label: string }) {\n return (\n <Tooltip label={text} side=\"top\" delayMs={150} maxWidth={320}>\n <span role=\"note\" tabIndex={0} aria-label={`${label}: ${text}`} style={styles.settingHint}>?</span>\n </Tooltip>\n )\n}\n\nexport function isPlanUsageReport(value: unknown): value is PlanUsageReport {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\n const report = value as Record<string, unknown>\n return typeof report.available === 'boolean'\n && typeof report.fetchedAt === 'number'\n && Array.isArray(report.windows)\n && report.windows.every(entry => typeof entry === 'object' && entry !== null\n && typeof (entry as Record<string, unknown>).id === 'string')\n}\n\n/** Coarse duration for a reset countdown or a fetch age: minutes below an\n * hour, then hours, then days. Never negative — a passed reset reads '0m'. */\nexport function durationLabel(milliseconds: number): string {\n const minutes = Math.max(0, Math.round(milliseconds / 60_000))\n if (minutes < 60) return `${minutes}m`\n const hours = Math.floor(minutes / 60)\n if (hours < 24) return minutes % 60 === 0 ? `${hours}h` : `${hours}h ${minutes % 60}m`\n return `${Math.floor(hours / 24)}d`\n}\n\nexport function PlanUsageMeter({ window: usageWindow, t, now }: {\n window: PlanUsageWindow\n t: ClaudeCodeSettingsInjected['t']\n now: number\n}) {\n const used = usageWindow.utilization\n const tone = styles.planUsageTone(used)\n const resetsIn = usageWindow.resetsAt === undefined ? undefined : Date.parse(usageWindow.resetsAt)\n return (\n <span style={styles.planUsageMeter}>\n <span style={styles.planUsageTrack}>\n <span style={{ ...styles.planUsageFill, width: `${used ?? 0}%`, background: tone.fill }} />\n </span>\n <span style={{ ...styles.planUsageMeta, color: tone.text }}>\n {used === undefined ? '—' : t('planUsageUsed', { percent: Math.round(used) })}\n {resetsIn === undefined || !Number.isFinite(resetsIn) ? null : ` · ${t('planUsageResets', { age: durationLabel(resetsIn - now) })}`}\n </span>\n </span>\n )\n}\n\n/** Fetch the plan usage report; POST forces the backend to re-read it. */\nexport async function loadPlanUsage(refresh: boolean): Promise<PlanUsageReport> {\n const response = await fetch(CLAUDE_USAGE_PATH, {\n method: refresh ? 'POST' : 'GET',\n credentials: 'same-origin',\n headers: { accept: 'application/json' },\n })\n const payload = await response.json() as unknown\n if (!response.ok) {\n const message = typeof payload === 'object' && payload !== null && 'error' in payload && typeof payload.error === 'string'\n ? payload.error\n : `HTTP ${response.status}`\n throw new Error(message)\n }\n if (!isPlanUsageReport(payload)) throw new Error('Invalid plan usage response')\n return payload\n}\n\nexport function PlanUsageCard({ t, load }: {\n t: ClaudeCodeSettingsInjected['t']\n load: (refresh: boolean) => Promise<PlanUsageReport>\n}) {\n const [report, setReport] = useState<PlanUsageReport>()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string>()\n\n const request = useCallback(async (refresh: boolean) => {\n setBusy(true)\n setError(undefined)\n try {\n setReport(await load(refresh))\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setBusy(false)\n }\n }, [load])\n\n useEffect(() => { void request(false) }, [request])\n\n // Countdowns are read at render time; the fetch timestamp is enough of a\n // clock because a stale reading is labelled with its own age.\n const now = Date.now()\n return (\n <section style={styles.settingsCard}>\n <div style={styles.settingsCardHeader}>\n <div>\n <h3 style={styles.settingsSectionHeading}>{t('planUsage')}</h3>\n <p style={styles.settingsBody}>{t('planUsageBody')}</p>\n </div>\n <button type=\"button\" style={styles.button} disabled={busy} onClick={() => { void request(true) }}>\n {busy ? t('planUsageRefreshing') : t('planUsageRefresh')}\n </button>\n </div>\n {report === undefined\n ? <p style={styles.notice}>{busy ? t('planUsageLoading') : t('planUsageNever')}</p>\n : report.windows.length === 0\n ? <p style={styles.notice}>{report.fetchedAt === 0 ? t('planUsageNever') : t('planUsageUnavailable')}</p>\n : (\n <div style={styles.diagnosticGrid}>\n {report.subscription === undefined ? null : <>\n <span style={styles.diagnosticLabel}>{t('planUsageSubscription')}</span>\n <span style={styles.diagnosticValue}>{report.subscription}</span>\n </>}\n {report.windows.flatMap(usageWindow => [\n <span key={`${usageWindow.id}-label`} style={styles.diagnosticLabel}>\n {usageWindow.label ?? (TRANSLATED_WINDOWS.has(usageWindow.id)\n ? t(`planWindow_${usageWindow.id}` as ClaudeCodeSettingsKey)\n : usageWindow.id)}\n </span>,\n <PlanUsageMeter key={`${usageWindow.id}-meter`} window={usageWindow} t={t} now={now} />,\n ])}\n </div>\n )}\n {report !== undefined && report.fetchedAt > 0\n ? <p style={styles.notice}>{t('planUsageUpdated', { age: durationLabel(now - report.fetchedAt) })}</p>\n : null}\n {error === undefined ? null : <p role=\"alert\" style={{ ...styles.notice, color: 'var(--dsw-alias-state-error-primary)' }}>{t('planUsageError')}: {error}</p>}\n </section>\n )\n}\n\nexport function ClaudeCodeSettings({ t }: ClaudeCodeSettingsInjected) {\n const [report, setReport] = useState<DoctorReport>()\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const [updateStatus, setUpdateStatus] = useState<PluginUpdateStatus>()\n const [updateError, setUpdateError] = useState<string>()\n const [updateBusy, setUpdateBusy] = useState<'check' | 'update'>()\n const [globalSettings, setGlobalSettings] = useState<GlobalSettingsView>()\n const [globalSettingsError, setGlobalSettingsError] = useState<string>()\n const [globalSettingsBusy, setGlobalSettingsBusy] = useState(false)\n const [jiraStatus, setJiraStatus] = useState<JiraStatus>()\n const [jiraError, setJiraError] = useState<string>()\n const [jiraBusy, setJiraBusy] = useState(false)\n const [jiraSite, setJiraSite] = useState('')\n const [jiraEmail, setJiraEmail] = useState('')\n const [jiraToken, setJiraToken] = useState('')\n useEffect(() => {\n const controller = new AbortController()\n void loadJiraStatus(controller.signal).then(setJiraStatus, (reason: unknown) => {\n if (!controller.signal.aborted) setJiraError(reason instanceof Error ? reason.message : String(reason))\n })\n return () => { controller.abort() }\n }, [])\n const connectJiraNow = async (): Promise<void> => {\n setJiraBusy(true)\n setJiraError(undefined)\n try {\n setJiraStatus(await connectJira({ siteUrl: jiraSite, email: jiraEmail, apiToken: jiraToken }))\n setJiraToken('')\n } catch (cause) {\n setJiraError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setJiraBusy(false)\n }\n }\n const disconnectJiraNow = async (): Promise<void> => {\n setJiraBusy(true)\n setJiraError(undefined)\n try {\n await disconnectJira()\n setJiraStatus({ connected: false })\n } catch (cause) {\n setJiraError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setJiraBusy(false)\n }\n }\n\n const refresh = useCallback(async () => {\n setBusy(true)\n setError(undefined)\n setReport(undefined)\n try {\n const response = await fetch(CLAUDE_DOCTOR_PATH, { credentials: 'same-origin', headers: { accept: 'application/json' } })\n const payload = await response.json() as DoctorReport | { error?: string }\n if (!response.ok) throw new Error('error' in payload ? payload.error : `HTTP ${response.status}`)\n setReport(payload as DoctorReport)\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setBusy(false)\n }\n }, [])\n\n useEffect(() => { void refresh() }, [refresh])\n\n const requestGlobalSettings = useCallback(async (changes?: Record<string, string>) => {\n setGlobalSettingsBusy(true)\n setGlobalSettingsError(undefined)\n try {\n const response = await fetch(CLAUDE_GLOBAL_SETTINGS_PATH, {\n method: changes === undefined ? 'GET' : 'PATCH',\n credentials: 'same-origin',\n headers: { accept: 'application/json', ...(changes === undefined ? {} : { 'content-type': 'application/json' }) },\n ...(changes === undefined ? {} : { body: JSON.stringify({ changes }) }),\n })\n const payload = await response.json() as unknown\n if (!response.ok) {\n const message = typeof payload === 'object' && payload !== null && 'error' in payload && typeof payload.error === 'string'\n ? payload.error\n : `HTTP ${response.status}`\n throw new Error(message)\n }\n if (!isGlobalSettingsView(payload)) throw new Error('Invalid global settings response')\n setGlobalSettings(payload)\n } catch (cause) {\n setGlobalSettingsError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setGlobalSettingsBusy(false)\n }\n }, [])\n\n useEffect(() => { void requestGlobalSettings() }, [requestGlobalSettings])\n\n const requestUpdate = useCallback(async (action: 'check' | 'update') => {\n setUpdateBusy(action)\n setUpdateError(undefined)\n try {\n const response = await fetch(action === 'check' ? CLAUDE_UPDATE_CHECK_PATH : CLAUDE_UPDATE_PATH, {\n method: action === 'check' ? 'GET' : 'POST',\n credentials: 'same-origin',\n headers: { accept: 'application/json' },\n })\n const payload = await response.json() as unknown\n if (!response.ok) {\n const message = typeof payload === 'object' && payload !== null && 'error' in payload && typeof payload.error === 'string'\n ? payload.error\n : `HTTP ${response.status}`\n throw new Error(message)\n }\n if (!isPluginUpdateStatus(payload)) throw new Error('Invalid update response')\n setUpdateStatus(payload)\n } catch (cause) {\n setUpdateError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setUpdateBusy(undefined)\n }\n }, [])\n\n const rows = report === undefined ? [] : [\n [t('executable'), report.executable.status === 'found' ? report.executable.path ?? t('unknown') : `${t('missing')} · ${report.executable.searched.join(', ')}`],\n [t('version'), value(report.version.status, report.version.value ?? report.version.message)],\n [t('authentication'), value(report.authentication.status, [report.authentication.method, report.authentication.subscription].filter(Boolean).join(' · ') || report.authentication.message)],\n [t('handshake'), report.handshake],\n [t('processes'), t('processSummary', { total: report.processes.count, active: report.processes.active })],\n [t('limits'), t('limitSummary', { max: report.limits.maxProcesses, minutes: Math.round(report.limits.idleTimeoutMs / 60_000) })],\n ]\n\n return (\n <div style={styles.settingsPage}>\n <header style={styles.settingsHero}>\n <div style={styles.settingsMark} aria-hidden=\"true\">C</div>\n <div>\n <h2 style={styles.settingsHeading}>{t('title')}</h2>\n <p style={styles.settingsBody}>{t('description')}</p>\n </div>\n </header>\n\n <section style={styles.settingsCard}>\n <div style={styles.settingsCardHeader}>\n <div>\n <h3 style={styles.settingsSectionHeading}>{t('diagnostics')}</h3>\n <p style={styles.settingsBody}>{t('diagnosticsBody')}</p>\n </div>\n <button type=\"button\" style={styles.button} onClick={() => { void refresh() }} disabled={busy}>\n {busy ? t('refreshing') : t('doctor')}\n </button>\n </div>\n {rows.length === 0 ? <p style={styles.notice}>{t('diagnosticsLoading')}</p> : (\n <div style={styles.diagnosticGrid}>\n {rows.flatMap(([label, rowValue]) => [\n <span key={`${label}-label`} style={styles.diagnosticLabel}>{label}</span>,\n <span key={`${label}-value`} style={styles.diagnosticValue}>{rowValue}</span>,\n ])}\n </div>\n )}\n {error === undefined ? null : <p role=\"alert\" style={{ ...styles.notice, color: 'var(--dsw-alias-state-error-primary)' }}>{t('error')}: {error}</p>}\n </section>\n\n <PlanUsageCard t={t} load={loadPlanUsage} />\n\n <section style={styles.settingsCard}>\n <div>\n <h3 style={styles.settingsSectionHeading}>{t('globalSettings')}</h3>\n <p style={styles.settingsBody}>{t('globalSettingsBody')}</p>\n </div>\n {globalSettings === undefined ? <p style={styles.notice}>{t('globalSettingsLoading')}</p> : globalSettings.settings.map(setting => {\n const copy = SETTING_COPY[setting.key]\n return (\n <div key={setting.key} style={styles.diagnosticGrid}>\n <span style={styles.diagnosticLabel}>\n {copy === undefined ? setting.key : t(copy.label)}\n {copy === undefined ? null : <SettingHint text={t(copy.hint)} label={t('settingHint')} />}\n </span>\n {setting.kind === 'select' ? (\n <GlobalSettingSelect\n setting={setting}\n disabled={globalSettingsBusy}\n onChange={nextValue => { void requestGlobalSettings({ [setting.key]: nextValue }) }}\n />\n ) : (\n <GlobalSettingText\n setting={setting}\n disabled={globalSettingsBusy}\n onChange={nextValue => { void requestGlobalSettings({ [setting.key]: nextValue }) }}\n />\n )}\n </div>\n )\n })}\n {globalSettingsError === undefined ? null : <p role=\"alert\" style={{ ...styles.notice, color: 'var(--dsw-alias-state-error-primary)' }}>{t('globalSettingsError')}: {globalSettingsError}</p>}\n </section>\n\n <section style={styles.settingsCard}>\n <div style={styles.settingsCardHeader}>\n <div>\n <h3 style={styles.settingsSectionHeading}>{t('jiraTitle')}</h3>\n <p style={styles.settingsBody}>{t('jiraBody')}</p>\n </div>\n {jiraStatus?.connected === true\n ? <button type=\"button\" style={styles.button} disabled={jiraBusy} onClick={() => { void disconnectJiraNow() }}>{t('jiraDisconnect')}</button>\n : null}\n </div>\n {jiraStatus === undefined && jiraError === undefined ? <p style={styles.notice}>{t('jiraLoading')}</p> : null}\n {jiraStatus?.connected === true ? (\n <div style={styles.diagnosticGrid}>\n <span style={styles.diagnosticLabel}>{t('jiraConnected')}</span>\n <span>{jiraStatus.siteUrl} · {jiraStatus.displayName ?? jiraStatus.email}</span>\n </div>\n ) : jiraStatus === undefined ? null : <>\n <div style={styles.diagnosticGrid}>\n <span style={styles.diagnosticLabel}>{t('jiraSite')}</span>\n <input type=\"url\" value={jiraSite} placeholder={t('jiraSitePlaceholder')} disabled={jiraBusy} style={styles.settingTextInput} onChange={event => { setJiraSite(event.currentTarget.value) }} />\n </div>\n <div style={styles.diagnosticGrid}>\n <span style={styles.diagnosticLabel}>{t('jiraEmail')}</span>\n <input type=\"email\" value={jiraEmail} disabled={jiraBusy} style={styles.settingTextInput} onChange={event => { setJiraEmail(event.currentTarget.value) }} />\n </div>\n <div style={styles.diagnosticGrid}>\n <span style={styles.diagnosticLabel}>{t('jiraToken')}</span>\n <input type=\"password\" value={jiraToken} disabled={jiraBusy} autoComplete=\"off\" style={styles.settingTextInput} onChange={event => { setJiraToken(event.currentTarget.value) }} />\n </div>\n <div style={styles.settingsActions}>\n <a href=\"https://id.atlassian.com/manage-profile/security/api-tokens\" target=\"_blank\" rel=\"noopener noreferrer\" style={styles.settingsLink}>{t('jiraTokenHelp')}</a>\n <button\n type=\"button\"\n style={styles.primaryButton}\n disabled={jiraBusy || jiraSite.trim() === '' || jiraEmail.trim() === '' || jiraToken.trim() === ''}\n onClick={() => { void connectJiraNow() }}\n >{jiraBusy ? t('jiraConnecting') : t('jiraConnect')}</button>\n </div>\n </>}\n {jiraError === undefined ? null : <p role=\"alert\" style={{ ...styles.notice, color: 'var(--dsw-alias-state-error-primary)' }}>{t('jiraError')}: {jiraError}</p>}\n </section>\n\n <section style={styles.settingsCard}>\n <div>\n <h3 style={styles.settingsSectionHeading}>{t('pluginUpdate')}</h3>\n <p style={styles.settingsBody}>{t('pluginUpdateBody')}</p>\n </div>\n {updateStatus === undefined ? <p style={styles.notice}>{t('updateNotChecked')}</p> : (\n <div style={styles.diagnosticGrid}>\n <span style={styles.diagnosticLabel}>{t('installedVersion')}</span>\n <span style={styles.diagnosticValue}>{updateStatus.currentVersion}</span>\n <span style={styles.diagnosticLabel}>{t('installSource')}</span>\n <span style={styles.diagnosticValue}>{t(`updateSource_${updateStatus.source}`)}</span>\n <span style={styles.diagnosticLabel}>{t('updateStatus')}</span>\n <span style={styles.diagnosticValue}>{t(`updateState_${updateStatus.state}`)}</span>\n {updateStatus.latestVersion === undefined ? null : <>\n <span style={styles.diagnosticLabel}>{t('latestVersion')}</span>\n <span style={styles.diagnosticValue}>{updateStatus.latestVersion}</span>\n </>}\n </div>\n )}\n {updateStatus?.message === undefined ? null : <p style={styles.notice}>{updateStatus.message}</p>}\n {updateStatus?.restartRequired !== true ? null : <p style={styles.notice}>{t('restartRequired')}</p>}\n {updateError === undefined ? null : <p role=\"alert\" style={{ ...styles.notice, color: 'var(--dsw-alias-state-error-primary)' }}>{t('updateError')}: {updateError}</p>}\n <div style={styles.settingsActions}>\n <button type=\"button\" style={styles.button} onClick={() => { void requestUpdate('check') }} disabled={updateBusy !== undefined}>\n {updateBusy === 'check' ? t('checkingUpdates') : t('checkUpdates')}\n </button>\n <button type=\"button\" style={styles.primaryButton} onClick={() => { void requestUpdate('update') }} disabled={updateBusy !== undefined || updateStatus?.canUpdate !== true}>\n {updateBusy === 'update' ? t('updatingPlugin') : t('updatePlugin')}\n </button>\n </div>\n </section>\n\n <section style={styles.settingsCard}>\n <h3 style={styles.settingsSectionHeading}>{t('security')}</h3>\n <p style={styles.settingsBody}>{t('securityBody')}</p>\n </section>\n </div>\n )\n}\n","import { CLAUDE_REPOSITORY_ACTION_PATH } from '../constants.ts'\nimport type {\n RepositoryActionKind,\n RepositoryActionPreview,\n RepositoryActionRequest,\n RepositoryActionResult,\n} from '../repository-actions.ts'\n\ninterface ErrorBody {\n readonly error?: string\n readonly message?: string\n readonly commit?: string\n}\n\nexport class RepositoryActionClientError extends Error {\n readonly code?: string\n readonly commit?: string\n\n constructor(message: string, code?: string, commit?: string) {\n super(message)\n this.name = 'RepositoryActionClientError'\n if (code !== undefined) this.code = code\n if (commit !== undefined) this.commit = commit\n }\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\n}\n\nasync function response(pending: Promise<Response>): Promise<unknown> {\n const result = await pending\n const body = await result.json() as unknown\n if (!result.ok) {\n const error = record(body) as ErrorBody | undefined\n throw new RepositoryActionClientError(\n typeof error?.message === 'string' ? error.message : 'Repository action failed.',\n typeof error?.error === 'string' ? error.error : undefined,\n typeof error?.commit === 'string' ? error.commit : undefined,\n )\n }\n return body\n}\n\nfunction preview(value: unknown): RepositoryActionPreview {\n const input = record(value)\n if (input === undefined || typeof input.root !== 'string' || typeof input.branch !== 'string'\n || typeof input.head !== 'string' || typeof input.fingerprint !== 'string' || !Array.isArray(input.files)\n || typeof input.patch !== 'string' || typeof input.truncated !== 'boolean'\n || typeof input.hasStaged !== 'boolean' || typeof input.hasUnstaged !== 'boolean' || typeof input.hasUntracked !== 'boolean'\n || (input.upstream !== undefined && typeof input.upstream !== 'string')\n || !Array.isArray(input.unpushedCommits) || typeof input.unpushedTruncated !== 'boolean') {\n throw new Error('Invalid repository action preview.')\n }\n for (const file of input.files) {\n const item = record(file)\n if (item === undefined || typeof item.path !== 'string' || typeof item.staged !== 'boolean'\n || typeof item.unstaged !== 'boolean' || typeof item.untracked !== 'boolean') throw new Error('Invalid repository action file.')\n }\n for (const commit of input.unpushedCommits) {\n const item = record(commit)\n if (item === undefined || typeof item.hash !== 'string' || typeof item.subject !== 'string') throw new Error('Invalid repository action commit.')\n }\n return input as unknown as RepositoryActionPreview\n}\n\nfunction result(value: unknown): RepositoryActionResult {\n const input = record(value)\n if (input === undefined || typeof input.commit !== 'string' || typeof input.pushed !== 'boolean'\n || (input.pullRequestUrl !== undefined && typeof input.pullRequestUrl !== 'string')\n || (input.conflicts !== undefined && (!Array.isArray(input.conflicts) || input.conflicts.some(item => typeof item !== 'string')))) throw new Error('Invalid repository action result.')\n return input as unknown as RepositoryActionResult\n}\n\nfunction endpoint(path: string, sessionId: string): string {\n return `${CLAUDE_REPOSITORY_ACTION_PATH}${path}?sessionId=${encodeURIComponent(sessionId)}`\n}\n\nexport async function loadRepositoryActionPreview(sessionId: string, signal?: AbortSignal): Promise<RepositoryActionPreview> {\n return preview(await response(fetch(endpoint('/preview', sessionId), {\n method: 'GET',\n credentials: 'same-origin',\n headers: { accept: 'application/json' },\n ...(signal === undefined ? {} : { signal }),\n })))\n}\n\nexport async function generateCommitMessage(sessionId: string, fingerprint: string, signal?: AbortSignal): Promise<string> {\n const value = record(await response(fetch(endpoint('/message', sessionId), {\n method: 'POST',\n credentials: 'same-origin',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ fingerprint }),\n ...(signal === undefined ? {} : { signal }),\n })))\n if (typeof value?.message !== 'string') throw new Error('Invalid generated commit message.')\n return value.message\n}\n\nexport function executeRepositoryAction(\n sessionId: string,\n request: RepositoryActionRequest & { readonly action: RepositoryActionKind },\n): Promise<RepositoryActionResult> {\n return response(fetch(endpoint('', sessionId), {\n method: 'POST',\n credentials: 'same-origin',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify(request),\n })).then(result)\n}\n","import { CLAUDE_REPOSITORY_FILE_PATH, CLAUDE_REPOSITORY_SETUP_PATH, CLAUDE_REPOSITORY_STATUS_PATH } from '../constants.ts'\nimport type { RepositoryBranchList, RepositoryCleanupResult, RepositorySetupResult, RepositorySetupStage } from '../repository-setup.ts'\nimport type { RepositoryStatus } from '../repository-status.ts'\n\n\ninterface ErrorBody {\n readonly message?: string\n readonly error?: string\n}\n\nexport type RepositoryPreparationStage = RepositorySetupStage\n | 'creating-workspace'\n | 'starting-session'\n | 'transferring-draft'\n | 'submitting'\n\nconst HOST_STAGES = new Set<RepositorySetupStage>([\n 'inspecting', 'fetching', 'creating-worktree', 'saving-worktree', 'switching-branch',\n])\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : undefined\n}\n\nfunction setupResult(value: unknown): RepositorySetupResult | undefined {\n const item = record(value)\n if (item === undefined || (item.mode !== 'checkout' && item.mode !== 'worktree')\n || typeof item.root !== 'string' || typeof item.path !== 'string' || typeof item.branch !== 'string'\n || (item.leaseId !== undefined && typeof item.leaseId !== 'string')) return undefined\n return item as unknown as RepositorySetupResult\n}\n\nexport function parseRepositorySetupEvent(\n line: string,\n onProgress: (stage: RepositoryPreparationStage) => void,\n): RepositorySetupResult | undefined {\n const event = record(JSON.parse(line) as unknown)\n if (event?.type === 'progress' && typeof event.stage === 'string' && HOST_STAGES.has(event.stage as RepositorySetupStage)) {\n onProgress(event.stage as RepositorySetupStage)\n return undefined\n }\n if (event?.type === 'complete') {\n const result = setupResult(event.result)\n if (result !== undefined) return result\n }\n if (event?.type === 'error' && typeof event.message === 'string') throw new Error(event.message)\n throw new Error('Invalid repository setup progress response.')\n}\n\nasync function response<T>(pending: Promise<Response>): Promise<T> {\n const result = await pending\n const body = await result.json() as T | ErrorBody\n if (!result.ok) {\n const error = body as ErrorBody\n throw new Error(error.message ?? error.error ?? 'Repository setup failed.')\n }\n return body as T\n}\n\n/** A wedged host must surface as an error; the hero has no other way out of its loading state. */\nexport const BRANCH_LOAD_TIMEOUT_MS = 15_000\n\nexport function loadRepositoryBranches(cwd: string, signal?: AbortSignal): Promise<RepositoryBranchList> {\n const timeout = AbortSignal.timeout(BRANCH_LOAD_TIMEOUT_MS)\n return response(fetch(`${CLAUDE_REPOSITORY_SETUP_PATH}/branches?cwd=${encodeURIComponent(cwd)}`, {\n method: 'GET',\n credentials: 'same-origin',\n headers: { accept: 'application/json' },\n signal: signal === undefined ? timeout : AbortSignal.any([signal, timeout]),\n }))\n}\n\nexport async function prepareRepository(\n cwd: string,\n branch: string,\n worktree: boolean,\n branchName?: string,\n onProgress: (stage: RepositoryPreparationStage) => void = () => {},\n): Promise<RepositorySetupResult> {\n const result = await fetch(CLAUDE_REPOSITORY_SETUP_PATH, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { accept: 'application/x-ndjson', 'content-type': 'application/json' },\n body: JSON.stringify({ cwd, branch, worktree, ...(branchName === undefined ? {} : { branchName }) }),\n })\n if (!result.ok) {\n const body = await result.json() as ErrorBody\n throw new Error(body.message ?? body.error ?? 'Repository setup failed.')\n }\n if (result.body === null) throw new Error('Repository setup progress stream is unavailable.')\n const reader = result.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n let completed: RepositorySetupResult | undefined\n while (true) {\n const chunk = await reader.read()\n buffer += decoder.decode(chunk.value, { stream: !chunk.done })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (line.trim().length === 0) continue\n const value = parseRepositorySetupEvent(line, onProgress)\n if (value !== undefined) completed = value\n }\n if (chunk.done) break\n }\n if (buffer.trim().length > 0) {\n const value = parseRepositorySetupEvent(buffer, onProgress)\n if (value !== undefined) completed = value\n }\n if (completed === undefined) throw new Error('Repository setup progress ended before completion.')\n return completed\n}\n\nexport async function bindRepositoryLease(leaseId: string, sessionId: string): Promise<void> {\n await response(fetch(`${CLAUDE_REPOSITORY_SETUP_PATH}/bind`, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ leaseId, sessionId }),\n }))\n}\n\nexport async function cleanupMergedRepository(path: string, baseBranch: string): Promise<RepositoryCleanupResult> {\n const body = await response<Record<string, unknown>>(fetch(`${CLAUDE_REPOSITORY_SETUP_PATH}/cleanup`, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ path, baseBranch }),\n }))\n if ((body.mode !== 'worktree' && body.mode !== 'checkout') || typeof body.root !== 'string' || typeof body.branch !== 'string') {\n throw new Error('Invalid repository cleanup response.')\n }\n return body as unknown as RepositoryCleanupResult\n}\n\n/** Lines [from, to] of a working-tree file plus its total line count, for expanding unmodified diff context. */\nexport async function loadRepositoryFileLines(cwd: string, path: string, from: number, to: number, signal?: AbortSignal): Promise<{ lines: readonly string[]; total: number }> {\n const query = `cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(path)}&from=${from}&to=${to}`\n const body = await response<Record<string, unknown>>(fetch(`${CLAUDE_REPOSITORY_FILE_PATH}?${query}`, {\n method: 'GET',\n credentials: 'same-origin',\n headers: { accept: 'application/json' },\n ...(signal === undefined ? {} : { signal }),\n }))\n if (!Array.isArray(body.lines) || typeof body.total !== 'number') throw new Error('Invalid repository file response.')\n return { lines: body.lines.map(String), total: body.total }\n}\n\nexport async function loadRepositoryStatusFor(cwd: string, signal?: AbortSignal): Promise<RepositoryStatus> {\n const body = await response<Record<string, unknown>>(fetch(`${CLAUDE_REPOSITORY_STATUS_PATH}?cwd=${encodeURIComponent(cwd)}`, {\n method: 'GET',\n credentials: 'same-origin',\n headers: { accept: 'application/json' },\n ...(signal === undefined ? {} : { signal }),\n }))\n if (typeof body.status !== 'string' || typeof body.cwd !== 'string') throw new Error('Invalid repository status response.')\n return body as unknown as RepositoryStatus\n}\n","import { CLAUDE_REPOSITORY_FEEDBACK_PATH } from '../constants.ts'\nimport type { FailingCheck, PullRequestReviewComment } from '../pr-feedback.ts'\n\nexport type { FailingCheck, PullRequestReviewComment } from '../pr-feedback.ts'\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\n}\n\nasync function loadJson(path: string, sessionId: string, pullNumber: number, signal?: AbortSignal): Promise<Record<string, unknown>> {\n const response = await fetch(`${CLAUDE_REPOSITORY_FEEDBACK_PATH}${path}?sessionId=${encodeURIComponent(sessionId)}&number=${pullNumber}`, {\n method: 'GET',\n credentials: 'same-origin',\n headers: { accept: 'application/json' },\n ...(signal === undefined ? {} : { signal }),\n })\n const body = record(await response.json() as unknown)\n if (!response.ok) {\n throw new Error(typeof body?.message === 'string' ? body.message : 'Pull request feedback is unavailable.')\n }\n if (body === undefined) throw new Error('Invalid pull request feedback response.')\n return body\n}\n\nexport async function loadPullRequestComments(sessionId: string, pullNumber: number, signal?: AbortSignal): Promise<readonly PullRequestReviewComment[]> {\n const body = await loadJson('/comments', sessionId, pullNumber, signal)\n if (!Array.isArray(body.comments)) throw new Error('Invalid pull request comments response.')\n const comments: PullRequestReviewComment[] = []\n for (const item of body.comments) {\n const input = record(item)\n if (input === undefined || typeof input.id !== 'number' || typeof input.path !== 'string'\n || typeof input.author !== 'string' || typeof input.body !== 'string' || typeof input.url !== 'string'\n || (input.side !== 'new' && input.side !== 'old')\n || (input.line !== undefined && typeof input.line !== 'number')) continue\n comments.push(input as unknown as PullRequestReviewComment)\n }\n return comments\n}\n\nexport async function loadFailingChecks(sessionId: string, pullNumber: number, signal?: AbortSignal): Promise<readonly FailingCheck[]> {\n const body = await loadJson('/checks', sessionId, pullNumber, signal)\n if (!Array.isArray(body.checks)) throw new Error('Invalid pull request checks response.')\n const checks: FailingCheck[] = []\n for (const item of body.checks) {\n const input = record(item)\n if (input === undefined || typeof input.name !== 'string'\n || (input.link !== undefined && typeof input.link !== 'string')\n || (input.description !== undefined && typeof input.description !== 'string')\n || (input.log !== undefined && typeof input.log !== 'string')) continue\n checks.push(input as unknown as FailingCheck)\n }\n return checks\n}\n\n/** Draft handed to Claude when the user forwards GitHub review comments. */\nexport function composeCommentsPrompt(comments: readonly PullRequestReviewComment[]): string {\n const lines = comments.map(comment => `- ${comment.path}${comment.line === undefined ? '' : `:${comment.line}`} (@${comment.author}): ${comment.body.replaceAll('\\n', '\\n ')}`)\n return `Please address the following GitHub pull request review comments. Make the requested changes, or explain briefly when a comment should not be applied.\\n\\n${lines.join('\\n')}`\n}\n\n/** Draft handed to Claude when the user forwards failing CI checks. */\nexport function composeChecksPrompt(checks: readonly FailingCheck[]): string {\n const sections = checks.map(check => {\n const heading = `## ${check.name}${check.link === undefined ? '' : ` (${check.link})`}`\n const description = check.description === undefined ? '' : `\\n${check.description}`\n const log = check.log === undefined ? '' : `\\n\\n\\`\\`\\`\\n${check.log}\\n\\`\\`\\``\n return `${heading}${description}${log}`\n })\n return `The following CI checks are failing on the current pull request. Investigate the failure logs, fix the underlying problems, and re-run the relevant commands locally when possible.\\n\\n${sections.join('\\n\\n')}`\n}\n\n/** Draft handed to Claude after an update-branch merge left conflicts behind. */\nexport function composeConflictsPrompt(baseBranch: string, conflicts: readonly string[], method: 'merge' | 'rebase' = 'merge'): string {\n const list = conflicts.map(file => `- ${file}`).join('\\n')\n if (method === 'rebase') {\n return `Rebasing the current branch onto origin/${baseBranch} stopped on conflicts in the files below. Resolve each conflict preserving the intent of both sides, stage the files, run \\`git rebase --continue\\` until the rebase finishes, then push with \\`git push --force-with-lease\\`.\\n\\n${list}`\n }\n return `Merging origin/${baseBranch} into the current branch left merge conflicts in the files below. Resolve each conflict preserving the intent of both sides, then commit the merge.\\n\\n${list}`\n}\n","import { composeChecksPrompt, composeCommentsPrompt, type FailingCheck, type PullRequestReviewComment } from './pr-feedback-api.ts'\n\nexport const AUTO_FIX_INTERVAL_MS = 30_000\nexport const AUTO_FIX_FOOTER = 'This request was generated automatically by the pull request watcher. After making the changes, commit and push to the pull request branch so the checks re-run.'\n\n/** What the watcher has already handed to Claude for one session. */\nexport interface AutoFixMemory {\n readonly handledCommentIds: ReadonlySet<number>\n readonly handledChecksSignature?: string\n}\n\ninterface AutoFixSession {\n enabled: boolean\n memory: AutoFixMemory\n}\n\nconst EMPTY_MEMORY: AutoFixMemory = { handledCommentIds: new Set() }\n// ponytail: module-level map so the toggle survives session switches within\n// one page; the watcher itself only ticks while the status bar is mounted.\nconst sessions = new Map<string, AutoFixSession>()\n\nfunction session(sessionId: string): AutoFixSession {\n let entry = sessions.get(sessionId)\n if (entry === undefined) {\n entry = { enabled: false, memory: EMPTY_MEMORY }\n sessions.set(sessionId, entry)\n }\n return entry\n}\n\nexport function autoFixEnabled(sessionId: string): boolean {\n return session(sessionId).enabled\n}\n\nexport function setAutoFixEnabled(sessionId: string, enabled: boolean): void {\n session(sessionId).enabled = enabled\n}\n\nexport function autoFixMemory(sessionId: string): AutoFixMemory {\n return session(sessionId).memory\n}\n\nexport function rememberAutoFix(sessionId: string, memory: AutoFixMemory): void {\n session(sessionId).memory = memory\n}\n\n/** One failing CI run yields one fix attempt: run links change when CI re-runs. */\nexport function checksSignature(checks: readonly FailingCheck[]): string | undefined {\n if (checks.length === 0) return undefined\n return checks.map(check => `${check.name}|${check.link ?? ''}`).sort().join('\\n')\n}\n\nexport function planAutoFix(\n memory: AutoFixMemory,\n comments: readonly PullRequestReviewComment[],\n checks: readonly FailingCheck[],\n): { prompt?: string; memory: AutoFixMemory } {\n const fresh = comments.filter(comment => !memory.handledCommentIds.has(comment.id))\n const signature = checksSignature(checks)\n const checksChanged = signature !== undefined && signature !== memory.handledChecksSignature\n const sections: string[] = []\n if (fresh.length > 0) sections.push(composeCommentsPrompt(fresh))\n if (checksChanged) sections.push(composeChecksPrompt(checks))\n if (sections.length === 0) return { memory }\n const nextSignature = checksChanged ? signature : memory.handledChecksSignature\n return {\n prompt: `${sections.join('\\n\\n')}\\n\\n${AUTO_FIX_FOOTER}`,\n memory: {\n handledCommentIds: new Set([...memory.handledCommentIds, ...fresh.map(comment => comment.id)]),\n ...(nextSignature === undefined ? {} : { handledChecksSignature: nextSignature }),\n },\n }\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\nimport { IconChevronDownOutline14, Menu, Modal, Tooltip, type MenuEntry } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { RepositoryMergeMethod } from '../repository-actions.ts'\nimport type { RepositoryStatus } from '../repository-status.ts'\nimport { executeRepositoryAction, loadRepositoryActionPreview } from './repository-action-api.ts'\nimport { cleanupMergedRepository } from './repository-setup-api.ts'\nimport { composeChecksPrompt, composeConflictsPrompt, loadFailingChecks, loadPullRequestComments, type FailingCheck, type PullRequestReviewComment } from './pr-feedback-api.ts'\nimport { AUTO_FIX_INTERVAL_MS, autoFixEnabled, autoFixMemory, planAutoFix, rememberAutoFix, setAutoFixEnabled } from './auto-fix.ts'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\nimport type { ClaudeClientProjection } from './projection.ts'\nimport * as styles from './styles.ts'\n\nexport interface ClaudeRepositoryStatusInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n openDiff: () => void\n /** Submit the composer, seeding the given draft text when it is empty. */\n submitPrompt?: (draft: string, mode?: 'append' | 'idle') => boolean\n /** Open the cross-session pull request overview panel. */\n openOverview?: () => void\n /** Delete the DSH workspace owning this session (after its worktree is gone). */\n deleteWorkspace?: () => Promise<void>\n}\n\nexport interface ClaudeRepositoryStatusProps extends ClaudeRepositoryStatusInjected {\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\n useSessions: SnapshotSelectorHook<{ readonly byId: Readonly<Record<string, { readonly blank: boolean; readonly running?: boolean } | undefined>> }>\n sessionId: string\n}\n\nexport function repositorySummary(repository: RepositoryStatus, t: ClaudeRepositoryStatusInjected['t']): readonly string[] {\n if (repository.status === 'not-repository') return [t('repositoryNotGit')]\n if (repository.status === 'unavailable') return [t('repositoryUnavailable')]\n const pullRequest = repository.pullRequest\n return [\n repository.detached === true ? t('repositoryDetached') : repository.branch ?? t('repositoryUnknownBranch'),\n ...(repository.worktree === true ? [t('repositoryWorktree')] : []),\n repository.dirty === true ? t('repositoryModified') : t('repositoryClean'),\n ...(pullRequest === undefined\n ? [t('repositoryNoPr')]\n : pullRequest.state === 'merged'\n ? [\n t('repositoryPr', { number: pullRequest.number }),\n t('repositoryState_merged'),\n ]\n : [\n pullRequest.draft ? t('repositoryPrDraft', { number: pullRequest.number }) : t('repositoryPr', { number: pullRequest.number }),\n t(`repositoryChecks_${pullRequest.checks}` as ClaudeCodeSettingsKey),\n t(`repositoryReview_${pullRequest.review}` as ClaudeCodeSettingsKey),\n ]),\n ]\n}\n\n/** Icon-only status: the tone carries the state, the full label lives in the tooltip and accessible name. */\nfunction StatusGlyph({ label, tone, children }: { label: string; tone: 'neutral' | 'success' | 'warning' | 'error'; children: ReactNode }) {\n const toneStyle = tone === 'success'\n ? styles.repositoryItemSuccess\n : tone === 'warning' ? styles.repositoryItemWarning : tone === 'error' ? styles.repositoryItemError : {}\n return (\n <Tooltip label={label} side=\"top\" delayMs={250}>\n <span role=\"img\" aria-label={label} style={{ ...styles.repositoryGlyph, ...toneStyle }}>{children}</span>\n </Tooltip>\n )\n}\n\nfunction ChecksGlyph({ state }: { state: 'passing' | 'pending' | 'failing' }) {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5.5\" />\n {state === 'passing' ? <path d=\"M4.5 7.2l1.8 1.8 3.2-3.6\" />\n : state === 'failing' ? <path d=\"M5 5l4 4M9 5l-4 4\" />\n : <path d=\"M4.6 7h.01M7 7h.01M9.4 7h.01\" strokeWidth=\"2\" />}\n </svg>\n )\n}\n\nfunction ReviewGlyph() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M1.5 7s2-3.5 5.5-3.5S12.5 7 12.5 7s-2 3.5-5.5 3.5S1.5 7 1.5 7Z\" />\n <circle cx=\"7\" cy=\"7\" r=\"1.8\" />\n </svg>\n )\n}\n\nfunction PullRequestIcon({ size = 16, merged = false }: { size?: number; merged?: boolean }) {\n if (merged) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"4\" cy=\"3\" r=\"1.6\" />\n <circle cx=\"4\" cy=\"13\" r=\"1.6\" />\n <circle cx=\"12\" cy=\"8\" r=\"1.6\" />\n <path d=\"M4 4.6v6.8\" />\n <path d=\"M5.6 3H7a5 5 0 0 1 5 3.4\" />\n </svg>\n )\n }\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"4\" cy=\"3\" r=\"1.6\" />\n <circle cx=\"4\" cy=\"13\" r=\"1.6\" />\n <circle cx=\"12\" cy=\"13\" r=\"1.6\" />\n <path d=\"M4 4.6v6.8\" />\n <path d=\"M7.5 3H9a3 3 0 0 1 3 3v5.4\" />\n </svg>\n )\n}\n\nfunction repositoryName(remote: string | undefined): string | undefined {\n return remote?.split('/').at(-1)\n}\n\nfunction relativeAge(value: string | undefined): string | undefined {\n if (value === undefined) return undefined\n const elapsedHours = Math.max(0, Math.floor((Date.now() - Date.parse(value)) / 3_600_000))\n if (!Number.isFinite(elapsedHours)) return undefined\n if (elapsedHours < 1) return '<1h'\n if (elapsedHours < 24) return `${elapsedHours}h`\n const days = Math.floor(elapsedHours / 24)\n return days < 30 ? `${days}d` : `${Math.floor(days / 30)}mo`\n}\n\nexport function PullRequestHoverCard({ repository, t }: { repository: RepositoryStatus; t: ClaudeRepositoryStatusInjected['t'] }) {\n const pullRequest = repository.pullRequest\n if (pullRequest === undefined) return null\n const merged = pullRequest.state === 'merged'\n const age = relativeAge(merged ? pullRequest.mergedAt : pullRequest.createdAt)\n return (\n <span role=\"tooltip\" style={styles.repositoryPrHoverCard}>\n <span style={styles.repositoryPrHoverTop}>\n <span style={{ ...styles.repositoryPrStateBadge, ...(merged ? styles.repositoryPrStateBadgeMerged : {}) }}><PullRequestIcon size={13} merged={merged} />{t(`repositoryState_${pullRequest.state}` as ClaudeCodeSettingsKey)}</span>\n <span style={styles.repositoryPrHoverRepo}>{repositoryName(repository.remote)} #{pullRequest.number}{pullRequest.baseBranch === undefined ? '' : ` → ${pullRequest.baseBranch}`}</span>\n {age === undefined ? null : <span style={styles.repositoryPrHoverAge}>{age}</span>}\n </span>\n <a href={pullRequest.url} target=\"_blank\" rel=\"noopener noreferrer\" style={styles.repositoryPrHoverTitle}>{pullRequest.title}</a>\n <span style={styles.repositoryPrHoverBottom}>\n {pullRequest.author === undefined ? <span /> : <span style={styles.repositoryPrAuthor}><span style={styles.repositoryPrAvatar}>{pullRequest.author.slice(0, 1).toUpperCase()}</span>{pullRequest.author}</span>}\n <span style={styles.repositoryPrHoverStats}>\n <span><span style={styles.diffAdd}>+{repository.diff?.additions ?? 0}</span> <span style={styles.diffDelete}>−{repository.diff?.deletions ?? 0}</span></span>\n <span style={styles.repositoryPrFiles}>{t('diffFilesShort', { count: repository.diff?.files ?? 0 })}</span>\n </span>\n </span>\n </span>\n )\n}\n\nfunction PullRequestLink({ repository, t }: { repository: RepositoryStatus; t: ClaudeRepositoryStatusInjected['t'] }) {\n const [hovered, setHovered] = useState(false)\n const closeTimer = useRef<ReturnType<typeof setTimeout>>()\n const pullRequest = repository.pullRequest\n const open = (): void => {\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\n closeTimer.current = undefined\n setHovered(true)\n }\n const scheduleClose = (): void => {\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\n closeTimer.current = setTimeout(() => {\n closeTimer.current = undefined\n setHovered(false)\n }, 350)\n }\n useEffect(() => () => {\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\n }, [])\n if (pullRequest === undefined) return null\n return (\n <span\n style={styles.repositoryPrLinkFrame}\n onMouseEnter={open}\n onMouseLeave={scheduleClose}\n onFocus={open}\n onBlur={event => {\n if (!event.currentTarget.contains(event.relatedTarget)) scheduleClose()\n }}\n >\n {hovered ? <span onMouseEnter={open} onMouseLeave={scheduleClose}><PullRequestHoverCard repository={repository} t={t} /></span> : null}\n <a\n href={pullRequest.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ ...styles.repositoryPrLink, ...(pullRequest.state === 'merged' ? styles.repositoryPrLinkMerged : {}) }}\n aria-label={t('repositoryOpenPr', { number: pullRequest.number })}\n >#{pullRequest.number}</a>\n </span>\n )\n}\n\n/** Watches an open pull request and hands new review comments and failing\n * CI runs to Claude automatically until the user switches it off. */\nexport function AutoFixControl({ sessionId, repository, running, t, submitPrompt }: {\n sessionId: string\n repository: RepositoryStatus\n /** Whether a turn is in flight; the watcher only submits into an idle session. */\n running: boolean\n t: ClaudeRepositoryStatusInjected['t']\n submitPrompt?: (draft: string, mode?: 'append' | 'idle') => boolean\n}) {\n const pullRequest = repository.pullRequest\n const open = pullRequest?.state === 'open'\n const number = pullRequest?.number\n const checks = pullRequest?.checks\n const [enabled, setEnabled] = useState(() => autoFixEnabled(sessionId))\n const [focused, setFocused] = useState(false)\n useEffect(() => { setEnabled(autoFixEnabled(sessionId)) }, [sessionId])\n // Submitting while a turn runs would queue or steer (interrupt) it depending\n // on the user's Enter-while-busy setting, so wait for idle instead; the\n // running flip re-arms the effect and polls immediately when the turn ends.\n useEffect(() => {\n if (!enabled || !open || running || number === undefined || submitPrompt === undefined) return\n let cancelled = false\n const tick = async (): Promise<void> => {\n const [comments, failing] = await Promise.all([\n loadPullRequestComments(sessionId, number).catch((): readonly PullRequestReviewComment[] => []),\n checks === 'failing' ? loadFailingChecks(sessionId, number).catch((): readonly FailingCheck[] => []) : Promise.resolve<readonly FailingCheck[]>([]),\n ])\n if (cancelled) return\n const plan = planAutoFix(autoFixMemory(sessionId), comments, failing)\n // A non-empty user draft defers this round instead of clobbering it.\n if (plan.prompt !== undefined && submitPrompt(plan.prompt, 'idle')) rememberAutoFix(sessionId, plan.memory)\n }\n void tick()\n const timer = setInterval(() => { void tick() }, AUTO_FIX_INTERVAL_MS)\n return () => {\n cancelled = true\n clearInterval(timer)\n }\n }, [checks, enabled, number, open, running, sessionId, submitPrompt])\n if (!open || submitPrompt === undefined) return null\n const toggle = (): void => {\n const next = !enabled\n setEnabled(next)\n setAutoFixEnabled(sessionId, next)\n }\n return (\n <Tooltip label={`${t('autoFixLabel')} · ${t('autoFixTitle')}`} side=\"top\" delayMs={250} maxWidth={320}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={t('autoFixLabel')}\n style={{\n ...styles.repositoryAutoFix,\n ...(enabled ? styles.repositoryAutoFixActive : {}),\n ...(focused ? styles.heroWorktreeToggleFocused : {}),\n }}\n onFocus={() => { setFocused(true) }}\n onBlur={() => { setFocused(false) }}\n onClick={event => {\n toggle()\n // Mouse toggles should not leave a focus ring behind.\n event.currentTarget.blur()\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M13.3 6.5A5.5 5.5 0 0 0 3.6 4.6M2.7 9.5a5.5 5.5 0 0 0 9.7 1.9\" />\n <path d=\"M13.5 2.8v3.7H9.8M2.5 13.2V9.5h3.7\" />\n </svg>\n </button>\n </Tooltip>\n )\n}\n\nexport function FailingChecksControl({ sessionId, pullNumber, t, submitPrompt }: {\n sessionId: string\n pullNumber: number\n t: ClaudeRepositoryStatusInjected['t']\n submitPrompt?: (draft: string, mode?: 'append' | 'idle') => boolean\n}) {\n const [open, setOpen] = useState(false)\n const [loading, setLoading] = useState(false)\n const [checks, setChecks] = useState<readonly FailingCheck[]>([])\n const [error, setError] = useState<string>()\n const frameRef = useRef<HTMLSpanElement>(null)\n const controller = useRef<AbortController>()\n useEffect(() => () => controller.current?.abort(), [])\n useEffect(() => {\n if (!open) return\n const closeOnOutsidePointer = (event: PointerEvent): void => {\n if (event.target instanceof Node && frameRef.current?.contains(event.target) !== true) setOpen(false)\n }\n document.addEventListener('pointerdown', closeOnOutsidePointer)\n return () => { document.removeEventListener('pointerdown', closeOnOutsidePointer) }\n }, [open])\n const toggle = (): void => {\n const next = !open\n setOpen(next)\n if (!next) return\n controller.current?.abort()\n const aborter = new AbortController()\n controller.current = aborter\n setLoading(true)\n setError(undefined)\n void loadFailingChecks(sessionId, pullNumber, aborter.signal).then(value => {\n setChecks(value)\n setLoading(false)\n }, (reason: unknown) => {\n if (aborter.signal.aborted) return\n setError(reason instanceof Error ? reason.message : t('diffActionFailed'))\n setLoading(false)\n })\n }\n return (\n <span ref={frameRef} style={styles.repositoryChecksFrame}>\n <button type=\"button\" style={styles.repositoryChecksTrigger} aria-haspopup=\"dialog\" aria-expanded={open} aria-label={t('repositoryChecksOpen')} onClick={toggle}>\n <StatusGlyph label={t('repositoryChecks_failing')} tone=\"error\"><ChecksGlyph state=\"failing\" /></StatusGlyph>\n </button>\n {open ? (\n <span role=\"dialog\" aria-label={t('checksCardTitle')} style={styles.repositoryChecksCard}>\n <strong style={styles.repositoryChecksTitle}>{t('checksCardTitle')}</strong>\n {loading ? <span style={styles.repositoryChecksHint}>{t('checksCardLoading')}</span> : null}\n {error === undefined ? null : <span role=\"alert\" style={styles.repositoryChecksError}>{error}</span>}\n {checks.map(check => (\n <span key={check.name} style={styles.repositoryChecksItem}>\n {check.link === undefined\n ? <span style={styles.repositoryChecksName}>{check.name}</span>\n : <a href={check.link} target=\"_blank\" rel=\"noopener noreferrer\" style={styles.repositoryChecksName}>{check.name}</a>}\n {check.description === undefined ? null : <span style={styles.repositoryChecksDesc}>{check.description}</span>}\n </span>\n ))}\n {!loading && error === undefined && checks.length === 0 ? <span style={styles.repositoryChecksHint}>{t('checksCardEmpty')}</span> : null}\n {submitPrompt !== undefined && checks.length > 0 ? (\n <button type=\"button\" style={styles.repositoryChecksFix} onClick={() => { submitPrompt(composeChecksPrompt(checks)); setOpen(false) }}>{t('checksCardFix')}</button>\n ) : null}\n </span>\n ) : null}\n </span>\n )\n}\n\ninterface UpdateDialogState {\n readonly loading: boolean\n readonly submitting: boolean\n readonly fingerprint?: string\n readonly error?: string\n readonly pushed?: string\n readonly conflicts?: readonly string[]\n}\n\nexport function UpdateBranchControl({ sessionId, repository, t, submitPrompt }: {\n sessionId: string\n repository: RepositoryStatus\n t: ClaudeRepositoryStatusInjected['t']\n submitPrompt?: (draft: string, mode?: 'append' | 'idle') => boolean\n}) {\n const [dialog, setDialog] = useState<UpdateDialogState>()\n const [method, setMethod] = useState<'merge' | 'rebase'>('rebase')\n const controller = useRef<AbortController>()\n const pullRequest = repository.pullRequest\n const base = pullRequest?.baseBranch\n const behind = repository.baseBehind ?? 0\n useEffect(() => () => controller.current?.abort(), [])\n useEffect(() => {\n if (dialog?.pushed === undefined || dialog.error !== undefined) return\n const timer = setTimeout(() => setDialog(undefined), 1_200)\n return () => clearTimeout(timer)\n }, [dialog?.error, dialog?.pushed])\n if (pullRequest === undefined || pullRequest.state !== 'open' || base === undefined\n || repository.detached === true || repository.dirty === true || behind <= 0) return null\n const openDialog = (): void => {\n controller.current?.abort()\n setDialog({ loading: true, submitting: false })\n const aborter = new AbortController()\n controller.current = aborter\n void loadRepositoryActionPreview(sessionId, aborter.signal).then(preview => {\n setDialog({ loading: false, submitting: false, fingerprint: preview.fingerprint })\n }, (reason: unknown) => {\n if (!aborter.signal.aborted) setDialog({ loading: false, submitting: false, error: reason instanceof Error ? reason.message : t('diffActionFailed') })\n })\n }\n const closeDialog = (): void => {\n if (dialog?.submitting === true) return\n controller.current?.abort()\n controller.current = undefined\n setDialog(undefined)\n }\n const confirmUpdate = (): void => {\n if (dialog?.fingerprint === undefined || dialog.submitting) return\n const { error: _error, ...pending } = dialog\n setDialog({ ...pending, submitting: true })\n void executeRepositoryAction(sessionId, {\n action: 'update-branch',\n fingerprint: dialog.fingerprint,\n message: '',\n includeUnstaged: false,\n baseBranch: base,\n mergeMethod: method,\n }).then(result => {\n setDialog({\n ...pending,\n submitting: false,\n ...(result.conflicts !== undefined && result.conflicts.length > 0 ? { conflicts: result.conflicts } : { pushed: result.commit }),\n })\n }, (reason: unknown) => {\n setDialog({ ...pending, submitting: false, error: reason instanceof Error ? reason.message : t('diffActionFailed') })\n })\n }\n const settled = dialog?.pushed !== undefined || dialog?.conflicts !== undefined\n return (\n <>\n <button type=\"button\" style={styles.repositoryUpdateTrigger} aria-label={t('repositoryUpdateBranch')} title={`${t('diffUpdateBranchBehind', { base, count: behind })} · ${t('repositoryUpdateBranch')}`} onClick={openDialog}>↓{behind}</button>\n {dialog === undefined ? null : <style data-dsh-claude-repository-modal-styles>{styles.diffModalCss}</style>}\n <Modal className=\"dshClaudeRepositoryActionModal\" contentClassName=\"dshClaudeRepositoryActionModalContent\" open={dialog !== undefined} onClose={closeDialog} title={t('repositoryUpdateBranch')} closeLabel={t('diffCancel')} description={t('diffUpdateBranchDescription', { base })} footer={\n <div style={styles.diffModalFooter}>\n <button type=\"button\" style={{ ...styles.button, ...styles.diffModalButton }} disabled={dialog?.submitting === true} onClick={closeDialog}>{settled ? t('diffDone') : t('diffCancel')}</button>\n {!settled ? <button type=\"button\" style={{ ...styles.primaryButton, ...styles.diffModalButton }} disabled={dialog?.loading === true || dialog?.submitting === true || dialog?.fingerprint === undefined} onClick={confirmUpdate}>{dialog?.submitting === true ? t('diffSubmitting') : t('diffConfirm')}</button> : null}\n </div>\n }>\n {dialog === undefined ? null : <div style={styles.diffModalBody}>\n <div style={styles.diffModalMeta}>\n <strong style={styles.diffModalMetaText} title={pullRequest.title}>{repository.branch ?? t('repositoryUnknownBranch')} ← origin/{base}</strong>\n <span style={styles.diffModalFileState}>{t('diffUpdateBranchBehind', { base, count: behind })}</span>\n </div>\n {(['rebase', 'merge'] as const).map(option => (\n <label key={option} style={styles.diffModalCheckbox}>\n <input type=\"radio\" name=\"dsh-claude-update-branch-method\" value={option} checked={method === option} disabled={settled || dialog.submitting} onChange={() => setMethod(option)} />\n {t(`diffUpdateBranch_${option}`, { base })}\n </label>\n ))}\n {dialog.pushed === undefined ? null : <p style={styles.diffModalSuccess}>{t('diffUpdateBranchCompleted', { commit: dialog.pushed.slice(0, 8) })}</p>}\n {dialog.conflicts === undefined ? null : <>\n <p style={styles.diffModalStatus}>{t('diffUpdateBranchConflicts')}</p>\n <ul style={styles.diffModalConflicts}>{dialog.conflicts.map(file => <li key={file}>{file}</li>)}</ul>\n {submitPrompt === undefined ? null : (\n <button type=\"button\" style={styles.diffModalConflictResolve} onClick={() => { submitPrompt(composeConflictsPrompt(base, dialog.conflicts ?? [], method)); closeDialog() }}>{t('diffUpdateBranchResolve')}</button>\n )}\n </>}\n {dialog.error === undefined ? null : <p role=\"alert\" style={styles.diffModalError}>{dialog.error}</p>}\n </div>}\n </Modal>\n </>\n )\n}\n\ninterface CleanupDialogState {\n readonly submitting: boolean\n readonly done?: string\n readonly error?: string\n}\n\n/** After a merge: remove the worktree (or switch a plain checkout back to\n * base), delete the merged branch, and drop the DSH workspace. */\nexport function CleanupControl({ repository, t, deleteWorkspace }: {\n repository: RepositoryStatus\n t: ClaudeRepositoryStatusInjected['t']\n deleteWorkspace?: () => Promise<void>\n}) {\n const [dialog, setDialog] = useState<CleanupDialogState>()\n const pullRequest = repository.pullRequest\n const base = pullRequest?.baseBranch\n useEffect(() => {\n if (dialog?.done === undefined) return\n const timer = setTimeout(() => setDialog(undefined), 1_500)\n return () => clearTimeout(timer)\n }, [dialog?.done])\n if (pullRequest?.state !== 'merged' || base === undefined || repository.root === undefined || repository.detached === true) return null\n const root = repository.root\n const closeDialog = (): void => { if (dialog?.submitting !== true) setDialog(undefined) }\n const confirm = (): void => {\n setDialog({ submitting: true })\n void cleanupMergedRepository(root, base).then(async result => {\n if (result.mode === 'worktree' && deleteWorkspace !== undefined) await deleteWorkspace()\n setDialog({ submitting: false, done: result.branch })\n }, (reason: unknown) => {\n setDialog({ submitting: false, error: reason instanceof Error ? reason.message : t('diffActionFailed') })\n })\n }\n return (\n <>\n <button type=\"button\" style={styles.repositoryUpdateTrigger} title={t('cleanupTitle')} onClick={() => { setDialog({ submitting: false }) }}>{t('cleanupButton')}</button>\n {dialog === undefined ? null : <style data-dsh-claude-repository-modal-styles>{styles.diffModalCss}</style>}\n <Modal className=\"dshClaudeRepositoryActionModal\" contentClassName=\"dshClaudeRepositoryActionModalContent\" open={dialog !== undefined} onClose={closeDialog} title={t('cleanupTitle')} closeLabel={t('diffCancel')} description={t('cleanupDescription')} footer={\n <div style={styles.diffModalFooter}>\n <button type=\"button\" style={{ ...styles.button, ...styles.diffModalButton }} disabled={dialog?.submitting === true} onClick={closeDialog}>{dialog?.done === undefined ? t('diffCancel') : t('diffDone')}</button>\n {dialog?.done === undefined ? <button type=\"button\" style={{ ...styles.primaryButton, ...styles.diffModalButton }} disabled={dialog?.submitting === true} onClick={confirm}>{dialog?.submitting === true ? t('diffSubmitting') : t('diffConfirm')}</button> : null}\n </div>\n }>\n {dialog === undefined ? null : <div style={styles.diffModalBody}>\n <div style={styles.diffModalMeta}>\n <strong style={styles.diffModalMetaText}>{repository.branch ?? t('repositoryUnknownBranch')} → {base}</strong>\n <span style={styles.diffModalFileState}>{repository.worktree === true ? t('repositoryWorktree') : t('repositoryLocal')}</span>\n </div>\n {dialog.done === undefined ? null : <p style={styles.diffModalSuccess}>{t('cleanupCompleted', { branch: dialog.done })}</p>}\n {dialog.error === undefined ? null : <p role=\"alert\" style={styles.diffModalError}>{dialog.error}</p>}\n </div>}\n </Modal>\n </>\n )\n}\n\nexport const MERGE_METHODS: readonly RepositoryMergeMethod[] = ['merge', 'squash', 'rebase']\n\ninterface MergeDialogState {\n readonly method: RepositoryMergeMethod\n readonly loading: boolean\n readonly submitting: boolean\n readonly fingerprint?: string\n readonly error?: string\n readonly merged?: boolean\n}\n\nexport function MergePullRequestControl({ sessionId, repository, t }: {\n sessionId: string\n repository: RepositoryStatus\n t: ClaudeRepositoryStatusInjected['t']\n}) {\n const [menuOpen, setMenuOpen] = useState(false)\n const [dialog, setDialog] = useState<MergeDialogState>()\n const controller = useRef<AbortController>()\n const pullRequest = repository.pullRequest\n useEffect(() => () => controller.current?.abort(), [])\n // Successful merges dismiss themselves once the confirmation has been seen;\n // the status bar flips to its merged state on the next projection refresh.\n useEffect(() => {\n if (dialog?.merged !== true || dialog.error !== undefined) return\n const timer = setTimeout(() => setDialog(undefined), 1_200)\n return () => clearTimeout(timer)\n }, [dialog?.error, dialog?.merged])\n if (pullRequest === undefined || pullRequest.state !== 'open' || pullRequest.draft || repository.detached === true) return null\n const openMerge = (method: RepositoryMergeMethod): void => {\n controller.current?.abort()\n setMenuOpen(false)\n setDialog({ method, loading: true, submitting: false })\n const aborter = new AbortController()\n controller.current = aborter\n void loadRepositoryActionPreview(sessionId, aborter.signal).then(preview => {\n setDialog({ method, loading: false, submitting: false, fingerprint: preview.fingerprint })\n }, (error: unknown) => {\n if (!aborter.signal.aborted) setDialog({ method, loading: false, submitting: false, error: error instanceof Error ? error.message : t('diffActionFailed') })\n })\n }\n const closeDialog = (): void => {\n if (dialog?.submitting === true) return\n controller.current?.abort()\n controller.current = undefined\n setDialog(undefined)\n }\n const confirmMerge = (): void => {\n if (dialog?.fingerprint === undefined || dialog.submitting) return\n const { error: _error, ...pending } = dialog\n setDialog({ ...pending, submitting: true })\n void executeRepositoryAction(sessionId, {\n action: 'merge-pr',\n fingerprint: dialog.fingerprint,\n message: '',\n includeUnstaged: false,\n mergeMethod: dialog.method,\n }).then(() => {\n setDialog({ ...pending, submitting: false, merged: true })\n }, (error: unknown) => {\n setDialog({ ...pending, submitting: false, error: error instanceof Error ? error.message : t('diffActionFailed') })\n })\n }\n const items: readonly MenuEntry[] = MERGE_METHODS.map(method => ({ id: method, label: t(`diffMerge_${method}` as ClaudeCodeSettingsKey) }))\n const merged = dialog?.merged === true\n return (\n <>\n <Menu open={menuOpen} items={items} onSelect={(id: string) => openMerge(id as RepositoryMergeMethod)} onClose={() => setMenuOpen(false)} align=\"end\" portal anchor={\n <button type=\"button\" style={styles.repositoryMergeTrigger} aria-label={t('repositoryMergeMenu')} aria-haspopup=\"menu\" aria-expanded={menuOpen} onClick={() => setMenuOpen(value => !value)}>{t('diffMergePr')}<IconChevronDownOutline14 /></button>\n } />\n {dialog === undefined ? null : <style data-dsh-claude-repository-modal-styles>{styles.diffModalCss}</style>}\n <Modal className=\"dshClaudeRepositoryActionModal\" contentClassName=\"dshClaudeRepositoryActionModalContent\" open={dialog !== undefined} onClose={closeDialog} title={t('diffMergePr')} closeLabel={t('diffCancel')} description={t('diffMergeDescription')} footer={\n <div style={styles.diffModalFooter}>\n <button type=\"button\" style={{ ...styles.button, ...styles.diffModalButton }} disabled={dialog?.submitting === true} onClick={closeDialog}>{merged ? t('diffDone') : t('diffCancel')}</button>\n {!merged ? <button type=\"button\" style={{ ...styles.primaryButton, ...styles.diffModalButton }} disabled={dialog?.loading === true || dialog?.submitting === true || dialog?.fingerprint === undefined} onClick={confirmMerge}>{dialog?.submitting === true ? t('diffSubmitting') : t('diffConfirm')}</button> : null}\n </div>\n }>\n {dialog === undefined ? null : <div style={styles.diffModalBody}>\n <div style={styles.diffModalMeta}>\n <strong style={styles.diffModalMetaText} title={pullRequest.title}>{t('repositoryPr', { number: pullRequest.number })} → {pullRequest.baseBranch ?? t('diffPrBaseDefault')}</strong>\n <span style={styles.diffModalFileState}>{t(`diffMerge_${dialog.method}` as ClaudeCodeSettingsKey)}</span>\n </div>\n <p style={styles.diffModalStatus}>{pullRequest.title}</p>\n {merged ? <p style={styles.diffModalSuccess}>{t('diffMergeCompleted', { number: pullRequest.number })}</p> : null}\n {dialog.error === undefined ? null : <p role=\"alert\" style={styles.diffModalError}>{dialog.error}</p>}\n </div>}\n </Modal>\n </>\n )\n}\n\nexport function ClaudeRepositoryStatus({ sessionId, useSessions, useClaudeProjection, t, openDiff, submitPrompt, openOverview, deleteWorkspace }: ClaudeRepositoryStatusProps) {\n const blank = useSessions(value => value.byId[sessionId]?.blank === true)\n const running = useSessions(value => value.byId[sessionId]?.running === true)\n const projection = useClaudeProjection(value => value)\n const repository = projection.repository\n if (blank || !projection.owned || repository === undefined) return null\n const branch = repository.detached === true ? t('repositoryDetached') : repository.branch ?? t('repositoryUnknownBranch')\n const pullRequest = repository.pullRequest\n const merged = pullRequest?.state === 'merged'\n const mergedAge = merged ? relativeAge(pullRequest.mergedAt) : undefined\n const aheadCount = repository.ahead ?? 0\n const pushable = repository.remote !== undefined && repository.detached !== true && (aheadCount > 0 || repository.upstream === false)\n const hasDiff = repository.diff !== undefined && (repository.diff.additions > 0 || repository.diff.deletions > 0)\n if (repository.status !== 'ready') {\n return (\n <div style={styles.repositoryBarFrame}>\n <div style={styles.repositoryBar}>\n <span style={styles.repositoryPrIcon}><PullRequestIcon /></span>\n <span style={styles.repositoryPrimary}>{repository.status === 'not-repository' ? t('repositoryNotGit') : t('repositoryUnavailable')}</span>\n </div>\n </div>\n )\n }\n return (\n <div style={styles.repositoryBarFrame}>\n <div style={{ ...styles.repositoryBar, ...(merged ? styles.repositoryBarMerged : {}) }}>\n {openOverview === undefined\n ? <span style={{ ...styles.repositoryPrIcon, ...(merged ? styles.repositoryPrIconMerged : {}) }}><PullRequestIcon merged={merged} /></span>\n : <button type=\"button\" style={{ ...styles.repositoryPrIcon, ...(merged ? styles.repositoryPrIconMerged : {}), ...styles.repositoryPrIconButton }} aria-label={t('overviewOpen')} title={t('overviewOpen')} onClick={openOverview}><PullRequestIcon merged={merged} /></button>}\n <PullRequestLink repository={repository} t={t} />\n {repository.remote === undefined ? null : <span style={styles.repositoryRemote}>{repositoryName(repository.remote)}</span>}\n <span style={styles.repositoryBranch}>{branch}</span>\n {repository.worktree === true ? <span style={styles.repositoryWorktree}>{t('repositoryWorktree')}</span> : null}\n <span style={styles.repositoryStatusItems}>\n {hasDiff || pushable ? (\n <button type=\"button\" style={{ ...styles.diffTrigger, ...(merged ? styles.diffTriggerMuted : {}) }} onClick={openDiff} aria-label={t('diffOpen')}>\n {hasDiff && repository.diff !== undefined ? <>\n <span style={merged ? styles.diffAddMuted : styles.diffAdd}>+{repository.diff.additions}</span>\n <span style={merged ? styles.diffDeleteMuted : styles.diffDelete}>−{repository.diff.deletions}</span>\n </> : null}\n {pushable ? <span style={merged ? styles.diffAheadMuted : styles.diffAhead}>↑{aheadCount > 0 ? aheadCount : ''}</span> : null}\n </button>\n ) : null}\n {pullRequest === undefined ? null : merged ? (<>\n <span style={styles.repositoryMergedStatus}>\n <span style={styles.repositoryMergedDot} aria-hidden=\"true\" />\n {t('repositoryState_merged')}\n {mergedAge === undefined ? null : <span style={styles.repositoryMergedAge}>· {t('repositoryMergedAgo', { age: mergedAge })}</span>}\n </span>\n <CleanupControl repository={repository} t={t} {...(deleteWorkspace === undefined ? {} : { deleteWorkspace })} />\n </>) : <>\n {pullRequest.checks === 'failing'\n ? <FailingChecksControl sessionId={sessionId} pullNumber={pullRequest.number} t={t} {...(submitPrompt === undefined ? {} : { submitPrompt })} />\n : pullRequest.checks === 'none' ? null : <StatusGlyph\n label={t(`repositoryChecks_${pullRequest.checks}` as ClaudeCodeSettingsKey)}\n tone={pullRequest.checks === 'passing' ? 'success' : 'warning'}\n ><ChecksGlyph state={pullRequest.checks} /></StatusGlyph>}\n {pullRequest.review === 'none' ? null : <StatusGlyph\n label={t(`repositoryReview_${pullRequest.review}` as ClaudeCodeSettingsKey)}\n tone={pullRequest.review === 'approved' ? 'success' : pullRequest.review === 'changes-requested' ? 'error' : 'neutral'}\n ><ReviewGlyph /></StatusGlyph>}\n <AutoFixControl sessionId={sessionId} repository={repository} running={running} t={t} {...(submitPrompt === undefined ? {} : { submitPrompt })} />\n <UpdateBranchControl sessionId={sessionId} repository={repository} t={t} {...(submitPrompt === undefined ? {} : { submitPrompt })} />\n <MergePullRequestControl sessionId={sessionId} repository={repository} t={t} />\n </>}\n </span>\n </div>\n </div>\n )\n}\n","import { CLAUDE_REVIEW_COMMENT_PATH } from '../constants.ts'\nimport type { ReviewComment, ReviewCommentSide } from '../review-comments.ts'\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\n}\n\nasync function post(path: string, sessionId: string, body: Record<string, unknown>): Promise<unknown> {\n const response = await fetch(`${CLAUDE_REVIEW_COMMENT_PATH}${path}?sessionId=${encodeURIComponent(sessionId)}`, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify(body),\n })\n const value = await response.json() as unknown\n if (!response.ok) {\n const error = record(value)\n throw new Error(typeof error?.message === 'string' ? error.message : 'Review comment request failed.')\n }\n return value\n}\n\nexport async function addReviewComment(\n sessionId: string,\n comment: { path: string; line: number; startLine?: number; side: ReviewCommentSide; text: string },\n): Promise<ReviewComment> {\n const value = record(await post('', sessionId, comment))\n const created = record(value?.comment)\n if (created === undefined || typeof created.id !== 'string') throw new Error('Invalid review comment response.')\n return created as unknown as ReviewComment\n}\n\nexport async function removeReviewComment(sessionId: string, id: string): Promise<void> {\n await post('/remove', sessionId, { id })\n}\n\nexport async function clearReviewComments(sessionId: string): Promise<void> {\n await post('/clear', sessionId, {})\n}\n","import { useState } from 'react'\nimport { HoverCard } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { ReviewComment } from '../review-comments.ts'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\nimport type { ClaudeClientProjection } from './projection.ts'\nimport { clearReviewComments, removeReviewComment } from './review-comment-api.ts'\nimport * as styles from './styles.ts'\n\nexport interface ClaudeReviewCommentsInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n sessionId: string\n /** Submit the composer, seeding the given draft text when it is empty. */\n submitWith?: (fallbackDraft: string) => void\n}\n\nexport interface ClaudeReviewCommentsProps extends ClaudeReviewCommentsInjected {\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\n}\n\nexport function reviewCommentChipLabel(comment: Pick<ReviewComment, 'path' | 'line' | 'startLine'>): string {\n const name = comment.path.split('/').at(-1) ?? comment.path\n return `${name}:${comment.startLine === undefined ? comment.line : `${comment.startLine}-${comment.line}`}`\n}\n\n/** \"Line 12\" / \"Lines 10–12\", with the old-side variant when the comment sits on removed code. */\nexport function commentLineLabel(\n comment: Pick<ReviewComment, 'line' | 'side' | 'startLine'>,\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string,\n): string {\n if (comment.startLine !== undefined) {\n return t(comment.side === 'old' ? 'reviewCommentOldRange' : 'reviewCommentNewRange', { start: comment.startLine, end: comment.line })\n }\n return t(comment.side === 'old' ? 'reviewCommentOldSide' : 'reviewCommentNewSide', { line: comment.line })\n}\n\nfunction CommentIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M2.75 2.75h10.5a1 1 0 0 1 1 1v6.5a1 1 0 0 1-1 1H8.2l-3.2 2.9v-2.9H2.75a1 1 0 0 1-1-1v-6.5a1 1 0 0 1 1-1Z\" />\n </svg>\n )\n}\n\nfunction SendIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M14 2 7.3 8.7M14 2 9.7 14l-2.4-5.3L2 6.3 14 2Z\" />\n </svg>\n )\n}\n\nfunction TrashIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M2.5 4h11M6.3 2.5h3.4M4.2 4l.65 9.3a1 1 0 0 0 1 .93h4.3a1 1 0 0 0 1-.93L11.8 4M6.7 6.8v4.6M9.3 6.8v4.6\" />\n </svg>\n )\n}\n\nfunction CommentChip({ comment, t, onRemove }: {\n comment: ReviewComment\n t: ClaudeReviewCommentsInjected['t']\n onRemove: (id: string) => void\n}) {\n return (\n <HoverCard\n anchor={\n <span style={styles.reviewCommentChip}>\n <span style={styles.reviewCommentChipLabel}>{reviewCommentChipLabel(comment)}</span>\n <button type=\"button\" style={styles.reviewCommentChipRemove} aria-label={t('reviewCommentRemove')} onClick={() => onRemove(comment.id)}>×</button>\n </span>\n }\n content={\n <span style={styles.reviewCommentHoverCard}>\n <span style={styles.reviewCommentHoverPath}>{comment.path} · {commentLineLabel(comment, t)}</span>\n <p style={styles.reviewCommentHoverText}>{comment.text}</p>\n </span>\n }\n openDelayMs={250}\n />\n )\n}\n\n/** Pending review comments docked above the composer; drained by the next user turn. */\nexport function ClaudeReviewComments({ useClaudeProjection, t, sessionId, submitWith }: ClaudeReviewCommentsProps) {\n const projection = useClaudeProjection(value => value)\n const [removedIds, setRemovedIds] = useState<ReadonlySet<string>>(() => new Set())\n const comments = (projection.reviewComments ?? []).filter(comment => !removedIds.has(comment.id))\n if (!projection.owned || comments.length === 0) return null\n const remove = (id: string): void => {\n setRemovedIds(previous => new Set([...previous, id]))\n void removeReviewComment(sessionId, id).catch(() => {\n setRemovedIds(previous => {\n const next = new Set(previous)\n next.delete(id)\n return next\n })\n })\n }\n const clearAll = (): void => {\n const ids = comments.map(comment => comment.id)\n setRemovedIds(previous => new Set([...previous, ...ids]))\n void clearReviewComments(sessionId).catch(() => {\n setRemovedIds(previous => {\n const next = new Set(previous)\n for (const id of ids) next.delete(id)\n return next\n })\n })\n }\n return (\n <div style={styles.reviewCommentBarFrame}>\n <style data-dsh-claude-review-comment-styles>{styles.panelIconButtonCss}</style>\n <div style={styles.reviewCommentBar}>\n <span style={styles.reviewCommentIcon}><CommentIcon /></span>\n {comments.map(comment => <CommentChip key={comment.id} comment={comment} t={t} onRemove={remove} />)}\n <span style={styles.reviewCommentClearSeat}>\n {submitWith === undefined ? null : (\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('reviewCommentsSend')} onClick={() => submitWith(t('reviewCommentsSendDraft'))}><SendIcon /></button>\n )}\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('reviewCommentsClear')} onClick={clearAll}><TrashIcon /></button>\n </span>\n </div>\n </div>\n )\n}\n","import { Fragment, useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport {\n IconChevronDownOutline14,\n IconCloseOutline16,\n IconFullscreenOutline16,\n Menu,\n Modal,\n type MenuEntry,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { RepositoryActionKind, RepositoryActionPreview } from '../repository-actions.ts'\nimport type { RepositoryStatus } from '../repository-status.ts'\nimport type { ReviewComment, ReviewCommentSide } from '../review-comments.ts'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\nimport type { ClaudeClientProjection } from './projection.ts'\nimport { executeRepositoryAction, generateCommitMessage, loadRepositoryActionPreview } from './repository-action-api.ts'\nimport { composeCommentsPrompt, loadPullRequestComments, type PullRequestReviewComment } from './pr-feedback-api.ts'\nimport { addReviewComment, removeReviewComment } from './review-comment-api.ts'\nimport { loadRepositoryFileLines } from './repository-setup-api.ts'\nimport { commentLineLabel } from './ClaudeReviewComments.tsx'\nimport * as styles from './styles.ts'\n\nexport interface ClaudeDiffPanelInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n sessionId: string\n maximized: boolean\n closeDetails: () => void\n toggleMaximized: () => void\n /** Submit the composer, seeding the given draft text when it is empty. */\n submitPrompt?: (draft: string, mode?: 'append' | 'idle') => boolean\n}\n\nexport interface ClaudeDiffPanelProps extends ClaudeDiffPanelInjected {\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\n}\n\nexport interface DiffFile {\n readonly path: string\n readonly additions: number\n readonly deletions: number\n readonly lines: readonly string[]\n}\n\nfunction pathFromHeader(line: string): string | undefined {\n const match = /^diff --git a\\/(.+) b\\/(.+)$/u.exec(line)\n return match?.[2]\n}\n\nexport function parseUnifiedDiff(patch: string): readonly DiffFile[] {\n const files: DiffFile[] = []\n let path: string | undefined\n let lines: string[] = []\n const flush = (): void => {\n if (path === undefined) return\n const content = lines.filter(line => !line.startsWith('diff --git ') && !line.startsWith('index ') && !line.startsWith('--- ') && !line.startsWith('+++ '))\n files.push({\n path,\n additions: content.filter(line => line.startsWith('+')).length,\n deletions: content.filter(line => line.startsWith('-')).length,\n lines: content,\n })\n }\n for (const line of patch.split(/\\r?\\n/u)) {\n const nextPath = pathFromHeader(line)\n if (nextPath !== undefined) {\n flush()\n path = nextPath\n lines = [line]\n } else if (path !== undefined) lines.push(line)\n }\n flush()\n return files\n}\n\n/** A run of unmodified lines the unified diff left out; `count` is unknown for the tail of the file. */\nexport interface DiffGap {\n readonly oldStart: number\n readonly newStart: number\n readonly count?: number\n readonly position: 'top' | 'middle' | 'bottom'\n}\n\nexport interface NumberedDiffLine {\n readonly line: string\n readonly kind: 'add' | 'delete' | 'hunk' | 'context' | 'collapsed'\n readonly oldLine?: number\n readonly newLine?: number\n readonly gap?: DiffGap\n}\n\n/** How many unmodified lines one click on an expander reveals. */\nexport const DIFF_EXPAND_STEP = 20\n\nexport function numberDiffLines(lines: readonly string[]): readonly NumberedDiffLine[] {\n const numbered: NumberedDiffLine[] = []\n let oldLine = 0\n let newLine = 0\n let previousOldEnd: number | undefined\n let previousNewEnd = 0\n // New and deleted files have no unmodified lines around their single hunk.\n let expandable = false\n for (const line of lines) {\n const hunk = /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/u.exec(line)\n if (hunk !== null) {\n const nextOld = Number(hunk[1])\n const nextNew = Number(hunk[3])\n const oldCount = Number(hunk[2] ?? 1)\n const newCount = Number(hunk[4] ?? 1)\n if (previousOldEnd === undefined) {\n expandable = oldCount > 0 && newCount > 0\n if (expandable && nextOld > 1) numbered.push({ line: '', kind: 'collapsed', gap: { oldStart: 1, newStart: 1, count: nextOld - 1, position: 'top' } })\n } else if (nextOld > previousOldEnd) {\n numbered.push({ line: '', kind: 'collapsed', gap: { oldStart: previousOldEnd, newStart: previousNewEnd, count: nextOld - previousOldEnd, position: 'middle' } })\n }\n oldLine = nextOld\n newLine = nextNew\n previousOldEnd = nextOld + oldCount\n previousNewEnd = nextNew + newCount\n numbered.push({ line, kind: 'hunk' })\n continue\n }\n if (line.startsWith('+')) {\n numbered.push({ line, kind: 'add', newLine })\n newLine += 1\n } else if (line.startsWith('-')) {\n numbered.push({ line, kind: 'delete', oldLine })\n oldLine += 1\n } else {\n numbered.push({ line, kind: 'context', oldLine, newLine })\n oldLine += 1\n newLine += 1\n }\n }\n if (expandable && previousOldEnd !== undefined) {\n numbered.push({ line: '', kind: 'collapsed', gap: { oldStart: previousOldEnd, newStart: previousNewEnd, position: 'bottom' } })\n }\n return numbered\n}\n\n/**\n * Splice revealed working-tree lines (keyed by new-side line number) into the\n * collapsed gaps. Expansion only ever grows a gap's edges, so each gap is a\n * top run + remaining gap + bottom run; `total` (file line count) turns the\n * open-ended tail gap into a bounded one.\n */\nexport function expandDiffRows(rows: readonly NumberedDiffLine[], revealed: ReadonlyMap<number, string>, total?: number): readonly NumberedDiffLine[] {\n const out: NumberedDiffLine[] = []\n for (const row of rows) {\n const gap = row.gap\n if (row.kind !== 'collapsed' || gap === undefined) {\n out.push(row)\n continue\n }\n const count = gap.count ?? (total === undefined ? undefined : Math.max(0, total - gap.newStart + 1))\n const context = (offset: number): NumberedDiffLine => ({\n line: ` ${revealed.get(gap.newStart + offset) ?? ''}`,\n kind: 'context',\n oldLine: gap.oldStart + offset,\n newLine: gap.newStart + offset,\n })\n let top = 0\n while ((count === undefined || top < count) && revealed.has(gap.newStart + top)) top += 1\n let bottom = 0\n if (count !== undefined) while (bottom < count - top && revealed.has(gap.newStart + count - 1 - bottom)) bottom += 1\n for (let offset = 0; offset < top; offset += 1) out.push(context(offset))\n const remaining = count === undefined ? undefined : count - top - bottom\n if (remaining === undefined || remaining > 0) {\n out.push({ ...row, gap: { ...gap, oldStart: gap.oldStart + top, newStart: gap.newStart + top, ...(remaining === undefined ? {} : { count: remaining }) } })\n }\n if (count !== undefined) for (let offset = count - bottom; offset < count; offset += 1) out.push(context(offset))\n }\n return out\n}\n\nexport interface ReviewCommentAnchor {\n /** Last (anchor) line; the editor and saved comment attach here. */\n readonly line: number\n readonly side: ReviewCommentSide\n /** First line of a multi-line selection. */\n readonly startLine?: number\n}\n\n/**\n * Anchor for a drag from row `from` to row `to`: every commentable row in\n * between on the same side as the first row, collapsed to its first/last line.\n */\nexport function rangeCommentAnchor(anchors: readonly (ReviewCommentAnchor | undefined)[], from: number, to: number): ReviewCommentAnchor | undefined {\n const side = anchors[from]?.side\n if (side === undefined) return undefined\n const lines = anchors\n .slice(Math.min(from, to), Math.max(from, to) + 1)\n .flatMap(anchor => (anchor?.side === side ? [anchor.line] : []))\n const line = Math.max(...lines)\n const startLine = Math.min(...lines)\n return startLine < line ? { line, side, startLine } : { line, side }\n}\n\n/** Which working-tree line a comment on this rendered diff row refers to. */\nexport function commentAnchorForLine(entry: NumberedDiffLine): ReviewCommentAnchor | undefined {\n if (entry.kind === 'add' || entry.kind === 'context') {\n return entry.newLine === undefined ? undefined : { line: entry.newLine, side: 'new' }\n }\n if (entry.kind === 'delete') {\n return entry.oldLine === undefined ? undefined : { line: entry.oldLine, side: 'old' }\n }\n return undefined\n}\n\nfunction DiffLine({ entry, addLabel, selected, onComment, onDragStart, onDragEnter }: {\n entry: NumberedDiffLine\n addLabel: string\n selected: boolean\n onComment?: (() => void) | undefined\n onDragStart?: (() => void) | undefined\n onDragEnter?: (() => void) | undefined\n}) {\n const style = entry.kind === 'add'\n ? styles.diffLineAdd\n : entry.kind === 'delete' ? styles.diffLineDelete : entry.kind === 'hunk' ? styles.diffLineHunk : styles.diffLineContext\n const lineNumber = entry.oldLine === undefined && entry.newLine === undefined\n ? ''\n : entry.oldLine === undefined ? String(entry.newLine) : entry.newLine === undefined ? String(entry.oldLine) : String(entry.newLine)\n return (\n <div className={styles.diffLineRowClass} style={{ ...styles.diffLine, ...style, ...(selected ? styles.diffLineSelected : {}) }} onPointerEnter={onDragEnter}>\n <button\n type=\"button\"\n className={styles.diffCommentButtonClass}\n disabled={onComment === undefined}\n aria-label={addLabel}\n onPointerDown={event => {\n if (event.button !== 0 || onDragStart === undefined) return\n // Keep the pointer free to enter the rows below/above while dragging, and stop text selection.\n event.preventDefault()\n if (event.currentTarget.hasPointerCapture?.(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId)\n onDragStart()\n }}\n onClick={event => { if (event.detail === 0) onComment?.() }}\n >+</button>\n <span style={styles.diffLineNumber}>{lineNumber}</span>\n <span style={styles.diffLineMarker}>{entry.kind === 'add' ? '+' : entry.kind === 'delete' ? '−' : ' '}</span>\n <span style={styles.diffLineText}>{entry.line.slice(entry.kind === 'hunk' ? 0 : 1)}</span>\n </div>\n )\n}\n\nfunction ChevronGlyph({ direction }: { direction: 'up' | 'down' }) {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d={direction === 'up' ? 'M3 8.5l4-4 4 4' : 'M3 5.5l4 4 4-4'} />\n </svg>\n )\n}\n\n/** \"N unmodified lines\" separator with GitHub-style expanders: ↑ above the first hunk, ↑↓ between hunks, ↓ after the last. */\nfunction DiffGapRow({ gap, t, busy, onExpand }: { gap: DiffGap; t: ClaudeDiffPanelInjected['t']; busy: boolean; onExpand?: ((gap: DiffGap, direction: 'up' | 'down') => void) | undefined }) {\n const button = (direction: 'up' | 'down'): ReactNode => (\n <button type=\"button\" style={styles.diffGapButton} disabled={busy || onExpand === undefined} aria-label={t(direction === 'up' ? 'diffExpandUp' : 'diffExpandDown')} title={t(direction === 'up' ? 'diffExpandUp' : 'diffExpandDown')} onClick={() => onExpand?.(gap, direction)}><ChevronGlyph direction={direction} /></button>\n )\n return (\n <div style={{ ...styles.diffLine, ...styles.diffLineHunk }}>\n <span style={styles.diffGapControls}>\n {gap.position === 'bottom' ? null : button('up')}\n {gap.position === 'top' ? null : button('down')}\n </span>\n <span style={styles.diffLineText}>{gap.count === undefined ? t('diffUnmodifiedTail') : t('diffUnmodifiedLines', { count: gap.count })}</span>\n </div>\n )\n}\n\ninterface DiffFileSectionProps {\n readonly file: DiffFile\n /** Repository root the working tree lives in; without it unmodified lines cannot be expanded. */\n readonly root: string | undefined\n readonly initiallyOpen: boolean\n readonly t: ClaudeDiffPanelInjected['t']\n readonly comments: readonly ReviewComment[]\n readonly ghComments: readonly PullRequestReviewComment[]\n readonly editorAnchor: ReviewCommentAnchor | undefined\n readonly editorNode: ReactNode\n readonly onOpenEditor: (anchor: ReviewCommentAnchor) => void\n readonly onRemoveComment: (id: string) => void\n}\n\nfunction DiffFileSection({ file, root, initiallyOpen, t, comments, ghComments, editorAnchor, editorNode, onOpenEditor, onRemoveComment }: DiffFileSectionProps) {\n const [open, setOpen] = useState(initiallyOpen)\n const [revealed, setRevealed] = useState<ReadonlyMap<number, string>>(() => new Map())\n const [total, setTotal] = useState<number>()\n const [expanding, setExpanding] = useState(false)\n const [drag, setDrag] = useState<{ start: number; end: number }>()\n const rows = useMemo(() => expandDiffRows(numberDiffLines(file.lines), revealed, total), [file.lines, revealed, total])\n const anchors = useMemo(() => rows.map(commentAnchorForLine), [rows])\n const slash = file.path.lastIndexOf('/')\n const directory = slash < 0 ? '' : file.path.slice(0, slash + 1)\n const name = file.path.slice(slash + 1)\n const expand = (gap: DiffGap, direction: 'up' | 'down'): void => {\n if (root === undefined || expanding) return\n const span = gap.count ?? DIFF_EXPAND_STEP\n const size = Math.min(DIFF_EXPAND_STEP, span)\n const from = direction === 'down' ? gap.newStart : gap.newStart + span - size\n setExpanding(true)\n void loadRepositoryFileLines(root, file.path, from, from + size - 1).then(result => {\n setRevealed(previous => {\n const next = new Map(previous)\n result.lines.forEach((text, offset) => next.set(from + offset, text))\n return next\n })\n setTotal(result.total)\n }, () => undefined).finally(() => setExpanding(false))\n }\n useEffect(() => {\n if (drag === undefined) return\n const finish = (): void => {\n setDrag(undefined)\n const anchor = rangeCommentAnchor(anchors, drag.start, drag.end)\n if (anchor !== undefined) onOpenEditor(anchor)\n }\n window.addEventListener('pointerup', finish)\n window.addEventListener('pointercancel', finish)\n return () => {\n window.removeEventListener('pointerup', finish)\n window.removeEventListener('pointercancel', finish)\n }\n }, [anchors, drag, onOpenEditor])\n const dragLow = drag === undefined ? undefined : Math.min(drag.start, drag.end)\n const dragHigh = drag === undefined ? undefined : Math.max(drag.start, drag.end)\n const dragSide = drag === undefined ? undefined : anchors[drag.start]?.side\n return (\n <section style={styles.diffFile}>\n <button type=\"button\" style={styles.diffFileHeader} aria-expanded={open} onClick={() => setOpen(value => !value)}>\n <span style={{ ...styles.chevron, ...(open ? styles.chevronOpen : {}) }}>›</span>\n <span style={styles.diffFilePath} title={file.path}>\n {directory === '' ? null : <span style={styles.diffFileDir}>{`\\u202A${directory}\\u202C`}</span>}\n <span style={styles.diffFileName}>{name}</span>\n </span>\n <span style={styles.diffFileStats}><span style={styles.diffAdd}>+{file.additions}</span><span style={styles.diffDelete}>−{file.deletions}</span></span>\n </button>\n {open ? <div style={styles.diffCode}>{rows.map((entry, index) => {\n if (entry.kind === 'collapsed' && entry.gap !== undefined) {\n return <DiffGapRow key={`gap:${entry.gap.newStart}`} gap={entry.gap} t={t} busy={expanding} onExpand={root === undefined ? undefined : expand} />\n }\n const anchor = anchors[index]\n const lineComments = anchor === undefined ? [] : comments.filter(comment => comment.line === anchor.line && comment.side === anchor.side)\n const ghLineComments = anchor === undefined ? [] : ghComments.filter(comment => comment.line === anchor.line && comment.side === anchor.side)\n const editorOpen = anchor !== undefined && editorAnchor !== undefined && editorAnchor.line === anchor.line && editorAnchor.side === anchor.side\n const inDrag = dragLow !== undefined && dragHigh !== undefined && index >= dragLow && index <= dragHigh && anchor?.side === dragSide\n const inEditorRange = anchor !== undefined && editorAnchor !== undefined && editorAnchor.side === anchor.side\n && anchor.line <= editorAnchor.line && anchor.line >= (editorAnchor.startLine ?? editorAnchor.line)\n return (\n <Fragment key={`${index}:${entry.line}`}>\n <DiffLine\n entry={entry}\n addLabel={t('reviewCommentAdd')}\n selected={inDrag || inEditorRange}\n onComment={anchor === undefined ? undefined : () => onOpenEditor(anchor)}\n onDragStart={anchor === undefined ? undefined : () => setDrag({ start: index, end: index })}\n onDragEnter={drag === undefined ? undefined : () => setDrag(current => (current === undefined ? current : { ...current, end: index }))}\n />\n {lineComments.map(comment => (\n <div key={comment.id} style={styles.diffCommentBlock}>\n <div style={styles.diffCommentCardMeta}>\n <span>{commentLineLabel(comment, t)}</span>\n <button type=\"button\" style={styles.reviewCommentChipRemove} aria-label={t('reviewCommentRemove')} onClick={() => onRemoveComment(comment.id)}>×</button>\n </div>\n <p style={styles.diffCommentCardText}>{comment.text}</p>\n </div>\n ))}\n {ghLineComments.map(comment => (\n <div key={`gh-${comment.id}`} style={styles.diffCommentBlock}>\n <div style={styles.diffCommentCardMeta}>\n <span style={styles.diffGhCommentAuthor}>GitHub · @{comment.author}</span>\n <a href={comment.url} target=\"_blank\" rel=\"noopener noreferrer\" style={styles.diffGhCommentLink} aria-label={comment.url}>↗</a>\n </div>\n <p style={styles.diffCommentCardText}>{comment.body}</p>\n </div>\n ))}\n {editorOpen ? editorNode : null}\n </Fragment>\n )\n })}</div> : null}\n </section>\n )\n}\n\ninterface ActionDialogState {\n readonly action: RepositoryActionKind\n readonly preview?: RepositoryActionPreview\n readonly loading: boolean\n readonly submitting: boolean\n readonly error?: string\n readonly commit?: string\n readonly pullRequestUrl?: string\n}\n\nexport function actionLabel(action: RepositoryActionKind, t: ClaudeDiffPanelInjected['t']): string {\n const label = action === 'commit'\n ? t('diffCommit')\n : action === 'commit-push' ? t('diffCommitPush') : action === 'push' ? t('diffPush') : action === 'merge-pr' ? t('diffMergePr') : action === 'update-branch' ? t('diffUpdateBranch') : t('diffCreatePr')\n return label.replace(/[….]+$/u, '')\n}\n\nexport type RepositoryActionAvailability = Readonly<Record<RepositoryActionKind, boolean>>\n\nexport function repositoryActionAvailability(\n repository: Pick<RepositoryStatus, 'status' | 'dirty' | 'detached' | 'remote' | 'pullRequest' | 'upstream' | 'ahead' | 'baseBehind'> | undefined,\n): RepositoryActionAvailability {\n const ready = repository?.status === 'ready' && repository.detached !== true\n const committable = ready && repository.dirty === true\n const hasRemote = repository?.remote !== undefined\n const hasOpenPullRequest = repository?.pullRequest?.state === 'open'\n const pushable = ready && hasRemote && (repository.upstream === false || (repository.ahead ?? 0) > 0)\n return {\n 'commit': committable,\n 'commit-push': committable && hasRemote,\n 'push': pushable,\n 'create-pr': (committable || pushable) && hasRemote && !hasOpenPullRequest,\n 'merge-pr': ready && hasOpenPullRequest && repository?.pullRequest?.draft !== true,\n 'update-branch': ready && hasOpenPullRequest && repository?.dirty !== true && (repository?.baseBehind ?? 0) > 0,\n }\n}\n\nfunction RestorePanelIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M1.5 5h3V2h1.4v4.4H1.5V5Zm9.9-3h1.4v3h3v1.4h-4.4V2ZM1.5 9.6h4.4V14H4.5v-3h-3V9.6Zm9.9 0h4.4V11h-3v3h-1.4V9.6Z\" />\n </svg>\n )\n}\n\nexport function ClaudeDiffPanel({ useClaudeProjection, t, sessionId, maximized, closeDetails, toggleMaximized, submitPrompt }: ClaudeDiffPanelProps) {\n const projection = useClaudeProjection(value => value)\n const repository = projection.repository\n const diff = repository?.diff\n const files = useMemo(() => parseUnifiedDiff(diff?.patch ?? ''), [diff?.patch])\n const [menuOpen, setMenuOpen] = useState(false)\n const [dialog, setDialog] = useState<ActionDialogState>()\n const [message, setMessage] = useState('')\n const [includeUnstaged, setIncludeUnstaged] = useState(true)\n const [prTitle, setPrTitle] = useState('')\n const [prBody, setPrBody] = useState('')\n const [baseBranch, setBaseBranch] = useState('')\n const [draft, setDraft] = useState(true)\n const [commentEditor, setCommentEditor] = useState<{ path: string } & ReviewCommentAnchor>()\n const [commentDraft, setCommentDraft] = useState('')\n const [commentBusy, setCommentBusy] = useState(false)\n const [commentError, setCommentError] = useState<string>()\n const [localComments, setLocalComments] = useState<readonly ReviewComment[]>([])\n const [removedCommentIds, setRemovedCommentIds] = useState<ReadonlySet<string>>(() => new Set())\n const actionController = useRef<AbortController>()\n const [ghComments, setGhComments] = useState<readonly PullRequestReviewComment[]>([])\n const pullNumber = repository?.pullRequest?.state === 'open' ? repository.pullRequest.number : undefined\n useEffect(() => {\n setGhComments([])\n if (pullNumber === undefined) return\n const controller = new AbortController()\n void loadPullRequestComments(sessionId, pullNumber, controller.signal).then(setGhComments, () => undefined)\n return () => { controller.abort() }\n }, [pullNumber, sessionId])\n // The code container is max-content wide for horizontal scrolling; comment\n // editors size against the visible width published through this variable.\n const diffViewportObserver = useRef<ResizeObserver>()\n const diffBodyRef = useCallback((element: HTMLDivElement | null) => {\n diffViewportObserver.current?.disconnect()\n diffViewportObserver.current = undefined\n if (element === null || typeof ResizeObserver === 'undefined') return\n const update = (): void => element.style.setProperty('--dsh-claude-diff-viewport', `${element.clientWidth}px`)\n update()\n const observer = new ResizeObserver(update)\n observer.observe(element)\n diffViewportObserver.current = observer\n }, [])\n useEffect(() => () => diffViewportObserver.current?.disconnect(), [])\n const closeDialog = useCallback(() => {\n if (dialog?.submitting === true) return\n actionController.current?.abort()\n actionController.current = undefined\n setDialog(undefined)\n }, [dialog?.submitting])\n // Successful commit/push confirmations dismiss themselves after a short\n // beat; a fresh PR stays open because its link is the point of the dialog.\n useEffect(() => {\n if (dialog?.commit === undefined || dialog.error !== undefined || dialog.pullRequestUrl !== undefined) return\n const timer = setTimeout(closeDialog, 1_200)\n return () => clearTimeout(timer)\n }, [closeDialog, dialog?.commit, dialog?.error, dialog?.pullRequestUrl])\n const openAction = useCallback((action: RepositoryActionKind) => {\n actionController.current?.abort()\n setMenuOpen(false)\n setDialog({ action, loading: true, submitting: false })\n setMessage('')\n setPrTitle('')\n setPrBody('')\n setBaseBranch('')\n setDraft(true)\n const controller = new AbortController()\n actionController.current = controller\n void loadRepositoryActionPreview(sessionId, controller.signal).then(async preview => {\n setIncludeUnstaged(preview.hasUnstaged || preview.hasUntracked)\n if (action === 'push') {\n setDialog({ action, preview, loading: false, submitting: false })\n return\n }\n setDialog({ action, preview, loading: true, submitting: false })\n const generated = await generateCommitMessage(sessionId, preview.fingerprint, controller.signal)\n setMessage(generated)\n setPrTitle(generated)\n setPrBody(`Summary: ${generated}\\n\\nChanges:\\n- ${generated}`)\n setDialog({ action, preview, loading: false, submitting: false })\n }).catch(error => {\n if (!controller.signal.aborted) setDialog({ action, loading: false, submitting: false, error: error instanceof Error ? error.message : t('diffActionFailed') })\n })\n }, [sessionId, t])\n const confirm = useCallback(async () => {\n if (dialog?.preview === undefined || (dialog.action !== 'push' && message.trim().length === 0)) return\n const { error: _error, ...pending } = dialog\n setDialog({ ...pending, submitting: true })\n try {\n const result = await executeRepositoryAction(sessionId, {\n action: dialog.action,\n fingerprint: dialog.preview.fingerprint,\n message,\n includeUnstaged,\n ...(dialog.action === 'create-pr' ? { prTitle, prBody, ...(baseBranch.trim() === '' ? {} : { baseBranch }), draft } : {}),\n })\n setDialog({ ...dialog, submitting: false, commit: result.commit, ...(result.pullRequestUrl === undefined ? {} : { pullRequestUrl: result.pullRequestUrl }) })\n } catch (error) {\n const completedCommit = typeof error === 'object' && error !== null && 'commit' in error && typeof error.commit === 'string' ? error.commit : undefined\n setDialog({ ...dialog, submitting: false, error: error instanceof Error ? error.message : t('diffActionFailed'), ...(completedCommit === undefined ? {} : { commit: completedCommit }) })\n }\n }, [baseBranch, dialog, draft, includeUnstaged, message, prBody, prTitle, sessionId, t])\n const openCommentEditor = useCallback((path: string, anchor: ReviewCommentAnchor) => {\n setCommentEditor({ path, ...anchor })\n setCommentDraft('')\n setCommentError(undefined)\n }, [])\n const closeCommentEditor = useCallback(() => {\n setCommentEditor(undefined)\n setCommentDraft('')\n setCommentError(undefined)\n }, [])\n const submitComment = useCallback(async () => {\n if (commentEditor === undefined || commentDraft.trim().length === 0 || commentBusy) return\n setCommentBusy(true)\n setCommentError(undefined)\n try {\n const created = await addReviewComment(sessionId, {\n path: commentEditor.path,\n line: commentEditor.line,\n ...(commentEditor.startLine === undefined ? {} : { startLine: commentEditor.startLine }),\n side: commentEditor.side,\n text: commentDraft.trim(),\n })\n setLocalComments(list => [...list, created])\n closeCommentEditor()\n } catch (error) {\n setCommentError(error instanceof Error ? error.message : t('reviewCommentFailed'))\n } finally {\n setCommentBusy(false)\n }\n }, [closeCommentEditor, commentBusy, commentDraft, commentEditor, sessionId, t])\n const removeComment = useCallback((id: string) => {\n setRemovedCommentIds(previous => new Set([...previous, id]))\n void removeReviewComment(sessionId, id).catch(() => {\n setRemovedCommentIds(previous => {\n const next = new Set(previous)\n next.delete(id)\n return next\n })\n })\n }, [sessionId])\n // Locally added comments only bridge the polling gap: once the projection\n // reports an id, the server copy is authoritative — dropping the local copy\n // lets removals made elsewhere (e.g. the composer chips) disappear here too.\n useEffect(() => {\n const projected = new Set((projection.reviewComments ?? []).map(comment => comment.id))\n setLocalComments(list => (list.some(comment => projected.has(comment.id))\n ? list.filter(comment => !projected.has(comment.id))\n : list))\n setRemovedCommentIds(previous => {\n const kept = [...previous].filter(id => projected.has(id))\n return kept.length === previous.size ? previous : new Set(kept)\n })\n }, [projection.reviewComments])\n const reviewComments = useMemo(() => {\n const merged = new Map<string, ReviewComment>()\n for (const comment of projection.reviewComments ?? []) merged.set(comment.id, comment)\n for (const comment of localComments) merged.set(comment.id, comment)\n for (const id of removedCommentIds) merged.delete(id)\n return [...merged.values()]\n }, [localComments, projection.reviewComments, removedCommentIds])\n useEffect(() => () => actionController.current?.abort(), [])\n useEffect(() => {\n if (!projection.owned || repository?.status !== 'ready' || diff === undefined) closeDetails()\n }, [closeDetails, diff, projection.owned, repository?.status])\n if (!projection.owned || repository?.status !== 'ready' || diff === undefined) return null\n const branch = repository.detached === true ? t('repositoryDetached') : repository.branch ?? t('repositoryUnknownBranch')\n const availability = repositoryActionAvailability(repository)\n const anyActionAvailable = availability['commit'] || availability['commit-push'] || availability['push'] || availability['create-pr']\n const menuItems: readonly MenuEntry[] = [\n { id: 'commit', label: t('diffCommit'), disabled: !availability['commit'] },\n { id: 'commit-push', label: t('diffCommitPush'), disabled: !availability['commit-push'] },\n { id: 'push', label: t('diffPush'), disabled: !availability['push'] },\n { id: 'create-pr', label: t('diffCreatePr'), disabled: !availability['create-pr'] },\n ]\n const completed = dialog?.commit !== undefined && dialog.error === undefined\n const commentEditorNode: ReactNode = commentEditor === undefined ? null : (\n <div style={styles.diffCommentBlock}>\n <div style={styles.diffCommentRange}>{commentLineLabel(commentEditor, t)}</div>\n <textarea\n className={styles.diffCommentTextareaClass}\n style={styles.diffCommentTextarea}\n value={commentDraft}\n maxLength={2000}\n placeholder={t('reviewCommentPlaceholder')}\n autoFocus\n onChange={event => setCommentDraft(event.currentTarget.value)}\n />\n {commentError !== undefined ? <p style={styles.diffCommentError}>{commentError}</p> : null}\n <div style={styles.diffCommentActions}>\n <button type=\"button\" style={styles.diffCommentActionButton} onClick={closeCommentEditor}>{t('reviewCommentCancel')}</button>\n <button type=\"button\" style={{ ...styles.diffCommentActionButton, ...styles.diffCommentSubmitButton }} disabled={commentBusy || commentDraft.trim().length === 0} onClick={() => void submitComment()}>{t('reviewCommentSubmit')}</button>\n </div>\n </div>\n )\n return (\n <>\n <style data-dsh-claude-repository-modal-styles>{styles.detailsCardCss}{styles.diffModalCss}{styles.panelIconButtonCss}{styles.diffCommentCss}</style>\n <div className={styles.detailsCardClass} style={{ ...styles.diffPanel, ...(maximized ? styles.diffPanelMaximized : {}) }}>\n <header style={styles.diffHeader}>\n <div style={styles.diffHeaderTitle}><span style={styles.diffHeaderBranch}>{branch}</span><span aria-hidden=\"true\">›</span><span style={styles.diffHeaderLabel}>{t('diffWorkingTree')}</span></div>\n <div style={styles.diffHeaderActions}>\n <div style={styles.diffSplitButton}>\n <button type=\"button\" style={{ ...styles.diffCommitButton, ...(availability['commit'] ? {} : styles.diffActionDisabled) }} disabled={!availability['commit']} onClick={() => openAction('commit')}>{t('diffCommit')}</button>\n <Menu open={menuOpen} items={menuItems} onSelect={(id: string) => { if (availability[id as RepositoryActionKind]) openAction(id as RepositoryActionKind) }} onClose={() => setMenuOpen(false)} align=\"end\" portal anchor={\n <button type=\"button\" style={{ ...styles.diffCommitMenuButton, ...(anyActionAvailable ? {} : styles.diffActionDisabled) }} disabled={!anyActionAvailable} aria-label={t('diffCommitMenu')} aria-expanded={menuOpen} onClick={() => setMenuOpen(value => !value)}><IconChevronDownOutline14 /></button>\n } />\n </div>\n {ghComments.length > 0 && submitPrompt !== undefined ? (\n <button type=\"button\" style={styles.diffPrCommentsButton} title={t('prCommentsSend')} aria-label={t('prCommentsButton', { count: ghComments.length })} onClick={() => submitPrompt(composeCommentsPrompt(ghComments))}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M2.75 2.75h10.5a1 1 0 0 1 1 1v6.5a1 1 0 0 1-1 1H8.2l-3.2 2.9v-2.9H2.75a1 1 0 0 1-1-1v-6.5a1 1 0 0 1 1-1Z\" />\n </svg>\n {ghComments.length}\n </button>\n ) : null}\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={maximized ? t('diffRestore') : t('diffMaximize')} onClick={toggleMaximized}>{maximized ? <RestorePanelIcon /> : <IconFullscreenOutline16 />}</button>\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('diffClose')} onClick={closeDetails}><IconCloseOutline16 /></button>\n </div>\n </header>\n <div style={styles.diffSummary}>\n <span>{t('diffFiles', { count: diff.files })}</span>\n <span style={styles.diffAdd}>+{diff.additions}</span>\n <span style={styles.diffDelete}>−{diff.deletions}</span>\n </div>\n <div ref={diffBodyRef} style={styles.diffBody}>\n {diff.truncated ? <p style={styles.diffNotice}>{t('diffTruncated')}</p> : null}\n {files.length === 0 ? <p style={styles.diffEmpty}>{t('diffEmpty')}</p> : files.map((file, index) => (\n <DiffFileSection\n key={file.path}\n file={file}\n root={repository.root}\n initiallyOpen={index === 0}\n t={t}\n comments={reviewComments.filter(comment => comment.path === file.path)}\n ghComments={ghComments.filter(comment => comment.path === file.path)}\n editorAnchor={commentEditor !== undefined && commentEditor.path === file.path ? commentEditor : undefined}\n editorNode={commentEditorNode}\n onOpenEditor={anchor => openCommentEditor(file.path, anchor)}\n onRemoveComment={removeComment}\n />\n ))}\n </div>\n </div>\n <Modal className=\"dshClaudeRepositoryActionModal\" contentClassName=\"dshClaudeRepositoryActionModalContent\" open={dialog !== undefined} onClose={closeDialog} title={dialog === undefined ? t('diffCommit') : actionLabel(dialog.action, t)} closeLabel={t('diffCancel')} description={t('diffConfirmDescription')} footer={\n <div style={styles.diffModalFooter}>\n <button type=\"button\" style={{ ...styles.button, ...styles.diffModalButton }} disabled={dialog?.submitting === true} onClick={closeDialog}>{completed ? t('diffDone') : t('diffCancel')}</button>\n {!completed ? <button type=\"button\" style={{ ...styles.primaryButton, ...styles.diffModalButton }} disabled={dialog?.loading === true || dialog?.submitting === true || dialog?.preview === undefined || (dialog.action !== 'push' && message.trim() === '')} onClick={() => void confirm()}>{dialog?.submitting === true ? t('diffSubmitting') : t('diffConfirm')}</button> : null}\n </div>\n }>\n {dialog?.loading === true ? <p style={styles.diffModalStatus}>{t('diffGeneratingMessage')}</p> : null}\n {dialog?.preview !== undefined ? <div style={styles.diffModalBody}>\n <div style={styles.diffModalMeta}><strong style={styles.diffModalMetaText} title={dialog.preview.branch}>{dialog.action === 'push'\n ? `${dialog.preview.branch} → ${dialog.preview.upstream ?? `origin/${dialog.preview.branch}`}`\n : dialog.preview.branch}</strong><span style={styles.diffModalFileState}>{dialog.action === 'push'\n ? t('diffPushAhead', { count: dialog.preview.unpushedTruncated ? `${dialog.preview.unpushedCommits.length}+` : dialog.preview.unpushedCommits.length })\n : t('diffFiles', { count: dialog.preview.files.length })}</span></div>\n {dialog.action === 'push' ? <>\n <div style={styles.diffModalFiles}>{dialog.preview.unpushedCommits.map(commit => <div key={commit.hash} style={styles.diffModalFile}><span style={styles.diffModalFilePath} title={commit.subject}>{commit.subject}</span><span style={styles.diffModalFileState}>{commit.hash.slice(0, 8)}</span></div>)}</div>\n <p style={styles.diffModalStatus}>{t('diffPushDescription')}</p>\n </> : <>\n <div style={styles.diffModalFiles}>{dialog.preview.files.map(file => <div key={file.path} style={styles.diffModalFile}><span style={styles.diffModalFilePath} title={file.path}>{file.path}</span><span style={styles.diffModalFileState}>{file.untracked ? t('diffUntracked') : file.staged && file.unstaged ? t('diffStagedUnstaged') : file.staged ? t('diffStaged') : t('diffUnstaged')}</span></div>)}</div>\n <label style={styles.diffModalCheckbox}><input type=\"checkbox\" checked={includeUnstaged} disabled={!dialog.preview.hasUnstaged && !dialog.preview.hasUntracked} onChange={event => setIncludeUnstaged(event.currentTarget.checked)} />{t('diffIncludeUnstaged')}</label>\n <label style={styles.diffModalField}>{t('diffCommitMessage')}<textarea style={styles.diffModalTextarea} value={message} maxLength={512} onChange={event => setMessage(event.currentTarget.value)} /></label>\n </>}\n {dialog.action === 'create-pr' ? <>\n <label style={styles.diffModalField}>{t('diffPrTitle')}<input style={styles.diffModalTextInput} value={prTitle} maxLength={256} onChange={event => setPrTitle(event.currentTarget.value)} /></label>\n <label style={styles.diffModalField}>{t('diffPrBase')}<input style={styles.diffModalTextInput} value={baseBranch} maxLength={512} placeholder={t('diffPrBaseDefault')} onChange={event => setBaseBranch(event.currentTarget.value)} /></label>\n <label style={styles.diffModalField}>{t('diffPrDescription')}<textarea style={{ ...styles.diffModalTextarea, minHeight: 240 }} value={prBody} maxLength={8192} onChange={event => setPrBody(event.currentTarget.value)} /></label>\n <label style={styles.diffModalCheckbox}><input type=\"checkbox\" checked={draft} onChange={event => setDraft(event.currentTarget.checked)} />{t('diffPrDraft')}</label>\n </> : null}\n {dialog.commit !== undefined ? <p style={styles.diffModalSuccess}>{dialog.action === 'push'\n ? t('diffPushCompleted', { commit: dialog.commit.slice(0, 8) })\n : t('diffCommitCompleted', { commit: dialog.commit.slice(0, 8) })}</p> : null}\n {dialog.pullRequestUrl !== undefined ? <a href={dialog.pullRequestUrl} target=\"_blank\" rel=\"noopener noreferrer\">{t('diffOpenPr')}</a> : null}\n </div> : null}\n {dialog?.error !== undefined ? <p role=\"alert\" style={styles.diffModalError}>{dialog.error}{dialog.commit === undefined ? '' : ` ${t('diffCommitPreserved', { commit: dialog.commit.slice(0, 8) })}`}</p> : null}\n </Modal>\n </>\n )\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type ReactNode } from 'react'\n\ninterface OverlayBounds {\n readonly left: number\n readonly top: number\n readonly width: number\n readonly height: number\n}\n\nconst useClientLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect\n\nexport function shouldRestoreFromEscape(\n event: Pick<KeyboardEvent, 'key'>,\n root: Pick<Document, 'querySelector'> = document,\n): boolean {\n return event.key === 'Escape' && root.querySelector('[role=\"dialog\"][aria-modal=\"true\"]') === null\n}\n\nexport function workspaceBounds(overlay: HTMLElement): OverlayBounds | undefined {\n const frame = overlay.parentElement\n if (frame === null) return undefined\n const overlayRect = overlay.getBoundingClientRect()\n const candidates = Array.from(frame.children)\n .filter(element => element !== overlay)\n .map(element => element.getBoundingClientRect())\n .filter(rect => rect.width > 0 && rect.height > 0)\n const insetCandidates = candidates.filter(rect => rect.left > overlayRect.left)\n const pool = insetCandidates.length > 0 ? insetCandidates : candidates\n const workspace = pool.reduce<DOMRect | undefined>((largest, rect) => {\n if (largest === undefined || rect.width * rect.height > largest.width * largest.height) return rect\n return largest\n }, undefined)\n if (workspace === undefined) return undefined\n const left = Math.max(0, workspace.left - overlayRect.left)\n const top = Math.max(0, workspace.top - overlayRect.top)\n return {\n left,\n top,\n width: Math.max(0, Math.min(workspace.width, overlayRect.width - left)),\n height: Math.max(0, Math.min(workspace.height, overlayRect.height - top)),\n }\n}\n\nexport function observeWorkspaceBounds(overlay: HTMLElement, listener: (bounds: OverlayBounds) => void): () => void {\n const frame = overlay.parentElement\n if (frame === null) return () => {}\n const update = (): void => {\n const next = workspaceBounds(overlay)\n if (next !== undefined) listener(next)\n }\n update()\n const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(update)\n observer?.observe(frame)\n for (const element of Array.from(frame.children)) observer?.observe(element)\n const mutation = typeof MutationObserver === 'undefined' ? undefined : new MutationObserver(update)\n mutation?.observe(frame, { attributes: true, childList: true })\n window.addEventListener('resize', update)\n return () => {\n observer?.disconnect()\n mutation?.disconnect()\n window.removeEventListener('resize', update)\n }\n}\n\nexport function ClaudeDiffOverlay({ children, onRestore }: { children: ReactNode; onRestore: () => void }) {\n const ref = useRef<HTMLDivElement>(null)\n const [bounds, setBounds] = useState<OverlayBounds>()\n useClientLayoutEffect(() => {\n const overlay = ref.current?.closest<HTMLElement>('[data-shell-overlay]')\n if (overlay === undefined || overlay === null) return\n return observeWorkspaceBounds(overlay, next => {\n setBounds(current => (\n current?.left === next.left && current.top === next.top && current.width === next.width && current.height === next.height\n ? current\n : next\n ))\n })\n }, [])\n useEffect(() => {\n const escape = (event: KeyboardEvent): void => { if (shouldRestoreFromEscape(event)) onRestore() }\n window.addEventListener('keydown', escape)\n return () => window.removeEventListener('keydown', escape)\n }, [onRestore])\n return (\n <div ref={ref} data-dsh-claude-diff-overlay style={{\n position: 'absolute',\n left: bounds?.left ?? 0,\n top: bounds?.top ?? 0,\n width: bounds?.width ?? 0,\n height: bounds?.height ?? 0,\n visibility: bounds === undefined ? 'hidden' : 'visible',\n padding: 8,\n boxSizing: 'border-box',\n background: 'var(--dsw-alias-bg-base)',\n pointerEvents: bounds === undefined ? 'none' : 'auto',\n }}>\n {children}\n </div>\n )\n}\n","import { useEffect, useId, useMemo, useState, type ReactNode } from 'react'\nimport {\n IconCheckOutline16,\n IconChevronDownOutline14,\n IconChevronUpOutline14,\n IconCloseOutline16,\n IconEditOutline16,\n IconQueueOutline14,\n IconSendOutline14,\n IconTrashOutline16,\n Tooltip,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\nimport * as styles from './styles.ts'\n\nexport interface QueueRowView {\n readonly id: string\n /** Only queued rows accept mutations; steering/context rows are in flight. */\n readonly placement: 'queued' | 'steering' | 'context'\n readonly preview: string\n /** Editable text; null when the message carries non-text blocks. */\n readonly text: string | null\n}\n\nexport type QueueActionView =\n | { readonly kind: 'remove' }\n | { readonly kind: 'steer' }\n | { readonly kind: 'edit'; readonly content: readonly { readonly type: 'text'; readonly text: string }[] }\n\nexport interface QueueSessionSnapshot {\n readonly queue: readonly QueueRowView[]\n readonly running: boolean\n readonly subagent: unknown\n}\n\nexport interface ClaudeQueueDockInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n updateQueue: (itemId: string, action: QueueActionView) => Promise<void>\n notify: (level: 'info' | 'error', text: string) => void\n}\n\nexport interface ClaudeQueueDockProps extends ClaudeQueueDockInjected {\n useSession: SnapshotSelectorHook<QueueSessionSnapshot>\n}\n\n/** Replaces the Host queue strip (same slot cell, lower priority) with one\n * styled like the repository status bar. Behaviour mirrors the Host strip:\n * one row inline, several rows behind a collapsible count, edit/remove/steer. */\nexport function ClaudeQueueDock({ useSession, t, updateQueue, notify }: ClaudeQueueDockProps) {\n const inbox = useSession(session => session.queue)\n const queue = useMemo(() => inbox.filter(row => row.placement === 'queued'), [inbox])\n const running = useSession(session => session.running)\n const mutable = useSession(session => session.subagent === null)\n const [editing, setEditing] = useState<{ id: string; text: string }>()\n const [busy, setBusy] = useState<string>()\n const [collapsed, setCollapsed] = useState(true)\n const listId = useId()\n useEffect(() => {\n if (queue.length === 0 && !collapsed) setCollapsed(true)\n if (editing !== undefined && (!mutable || !queue.some(row => row.id === editing.id))) setEditing(undefined)\n }, [collapsed, editing, mutable, queue])\n if (queue.length === 0) return null\n const interacting = mutable && (editing !== undefined || busy !== undefined)\n const expanded = !collapsed || interacting\n const listVisible = queue.length === 1 || expanded\n const apply = async (id: string, action: QueueActionView, failure: string): Promise<boolean> => {\n setBusy(id)\n try {\n await updateQueue(id, action)\n return true\n } catch {\n notify('error', failure)\n return false\n } finally {\n setBusy(current => (current === id ? undefined : current))\n }\n }\n const saveEdit = async (): Promise<void> => {\n if (editing === undefined || editing.text.trim() === '') return\n if (await apply(editing.id, { kind: 'edit', content: [{ type: 'text', text: editing.text }] }, t('queueEditFailed'))) setEditing(undefined)\n }\n const action = (label: string, icon: ReactNode, onClick: () => void, disabled: boolean, hint?: string): ReactNode => (\n <Tooltip label={hint ?? label} side=\"bottom\" delayMs={400}>\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={label} disabled={disabled} onClick={onClick}>{icon}</button>\n </Tooltip>\n )\n return (\n <div style={styles.repositoryBarFrame} data-claude-queue-dock=\"\">\n <style data-dsh-claude-queue-styles>{styles.panelIconButtonCss}</style>\n <div style={styles.queueBar}>\n {queue.length > 1 ? (\n <button type=\"button\" style={styles.queueHeader} aria-controls={listId} aria-expanded={expanded} disabled={interacting} onClick={() => { setCollapsed(value => !value) }}>\n <span style={styles.queueLead} aria-hidden=\"true\"><IconQueueOutline14 /></span>\n <span style={styles.queueCount}>{t('queueCount', { n: queue.length })}</span>\n <span style={styles.queueLead} aria-hidden=\"true\">{expanded ? <IconChevronDownOutline14 /> : <IconChevronUpOutline14 />}</span>\n </button>\n ) : null}\n <ul id={listId} style={styles.queueList} hidden={!listVisible}>\n {listVisible ? queue.map((row, index) => (\n <li key={row.id} style={{ ...styles.queueRow, ...(index > 0 ? styles.queueRowDivider : {}) }}>\n {queue.length === 1 ? <span style={styles.queueLead} aria-hidden=\"true\"><IconQueueOutline14 /></span> : null}\n {editing?.id === row.id ? (\n <input\n autoFocus\n style={styles.queueEditor}\n aria-label={t('queueEdit')}\n value={editing.text}\n onChange={event => { setEditing({ id: row.id, text: event.currentTarget.value }) }}\n onKeyDown={event => {\n if (event.key === 'Escape') setEditing(undefined)\n else if (event.key === 'Enter' && !event.nativeEvent.isComposing) {\n event.preventDefault()\n void saveEdit()\n }\n }}\n />\n ) : <span style={styles.queuePreview}>{row.preview}</span>}\n {mutable ? (\n <span style={styles.queueActions}>\n {editing?.id === row.id ? <>\n {action(t('queueSave'), <IconCheckOutline16 size={14} />, () => { void saveEdit() }, busy !== undefined || editing.text.trim() === '')}\n {action(t('queueCancelEdit'), <IconCloseOutline16 size={14} />, () => { setEditing(undefined) }, busy !== undefined)}\n </> : <>\n {action(t('queueEdit'), <IconEditOutline16 size={14} />, () => { if (row.text !== null) setEditing({ id: row.id, text: row.text }) }, busy !== undefined || row.text === null, row.text === null ? t('queueEditUnsupported') : undefined)}\n {action(t('queueRemove'), <IconTrashOutline16 size={14} />, () => { void apply(row.id, { kind: 'remove' }, t('queueRemoveFailed')) }, busy !== undefined)}\n {action(t('queueSteer'), <IconSendOutline14 />, () => { void apply(row.id, { kind: 'steer' }, t('queueSteerFailed')) }, busy !== undefined || !running, running ? undefined : t('queueSteerUnavailable'))}\n </>}\n </span>\n ) : null}\n </li>\n )) : null}\n </ul>\n </div>\n </div>\n )\n}\n","import { useEffect, useMemo, useState, useSyncExternalStore } from 'react'\nimport { IconCloseOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { RepositoryStatus } from '../repository-status.ts'\nimport type { ClaudeActivityEvent } from '../events.ts'\nimport { autoFixEnabled } from './auto-fix.ts'\nimport type { ClaudeClientProjection } from './projection.ts'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\nimport * as styles from './styles.ts'\n\nexport interface OverviewSessionRow {\n readonly id: string\n readonly displayTitle?: string\n readonly cwd?: string\n readonly agentPreset?: string\n readonly running?: boolean\n readonly blank?: boolean\n readonly origin?: string\n}\n\nexport interface OverviewSessionListState {\n /** Host-list order; deleted sessions leave ids but can linger in byId. */\n readonly ids?: readonly string[]\n readonly byId: Readonly<Record<string, OverviewSessionRow | undefined>>\n}\n\nexport interface OverviewSessionsStore {\n subscribe(listener: () => void): () => void\n getSnapshot(): OverviewSessionListState\n}\n\nexport interface OverviewWorkspaceListState {\n /** Registry-global archive set: \"deleting\" a session archives it here while\n * it stays in the host session list. */\n readonly archivedSessionIds?: readonly string[]\n}\n\nexport interface OverviewWorkspacesStore {\n subscribe(listener: () => void): () => void\n getSnapshot(): OverviewWorkspaceListState\n}\n\nconst NO_WORKSPACE_STATE: OverviewWorkspaceListState = {}\n\nconst NO_WORKSPACES: OverviewWorkspacesStore = {\n subscribe: () => () => {},\n getSnapshot: () => NO_WORKSPACE_STATE,\n}\n\nexport interface OverviewProjectionSource {\n subscribe(listener: () => void): () => void\n getSnapshot(): ClaudeClientProjection\n}\n\nexport interface ClaudePullRequestsPanelInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n closeDetails: () => void\n openSession: (sessionId: string) => void\n loadStatus: (cwd: string, signal?: AbortSignal) => Promise<RepositoryStatus>\n sessions: OverviewSessionsStore\n /** Workspace registry feed used to hide archived (\"deleted\") sessions. */\n workspaces?: OverviewWorkspacesStore\n /** Live sidecar projection per session, for attention badges and context usage. */\n projectionFor?: (sessionId: string) => OverviewProjectionSource\n}\n\nexport const OVERVIEW_REFRESH_MS = 30_000\n\n/** What a running session is blocked on: the latest permission or question\n * activity that is still in its started phase. */\nexport function overviewAttention(activities: readonly ClaudeActivityEvent[]): 'permission' | 'question' | undefined {\n for (let index = activities.length - 1; index >= 0; index -= 1) {\n const activity = activities[index]\n if (activity === undefined || (activity.kind !== 'permission' && activity.kind !== 'question')) continue\n return activity.phase === 'started' ? activity.kind : undefined\n }\n return undefined\n}\n\n/** Claude sessions worth listing: rows still in the host list (byId keeps\n * deleted and breadcrumb rows), non-blank, non-subagent, with a checkout;\n * running first. */\nexport function claudeSessionRows(state: OverviewSessionListState, archivedSessionIds: readonly string[] = []): readonly OverviewSessionRow[] {\n const rows = state.ids === undefined ? Object.values(state.byId) : state.ids.map(id => state.byId[id])\n const archived = new Set(archivedSessionIds)\n return rows\n .filter((row): row is OverviewSessionRow => row !== undefined\n && row.agentPreset === 'claude'\n && row.blank !== true\n && row.origin !== 'subagent'\n && !archived.has(row.id)\n && typeof row.cwd === 'string')\n .sort((left, right) => Number(right.running === true) - Number(left.running === true) || (left.displayTitle ?? left.id).localeCompare(right.displayTitle ?? right.id))\n}\n\nfunction Badge({ label, tone = 'neutral' }: { label: string; tone?: 'neutral' | 'success' | 'warning' | 'error' | 'merged' }) {\n const toneStyle = tone === 'success'\n ? styles.repositoryItemSuccess\n : tone === 'warning' ? styles.repositoryItemWarning : tone === 'error' ? styles.repositoryItemError : tone === 'merged' ? { color: '#a78bfa' } : {}\n return <span style={{ ...styles.repositoryItem, ...toneStyle }}><span style={styles.repositoryItemDot} aria-hidden=\"true\" /><span style={styles.repositoryItemLabel}>{label}</span></span>\n}\n\nfunction repositoryName(remote: string | undefined): string | undefined {\n return remote?.split('/').at(-1)\n}\n\nfunction OverviewAttention({ source, running, t }: {\n source: OverviewProjectionSource\n running: boolean\n t: ClaudePullRequestsPanelInjected['t']\n}) {\n const snapshot = useSyncExternalStore(source.subscribe, source.getSnapshot, source.getSnapshot)\n // A pending prompt only blocks a live turn; stale ones from interrupted\n // turns would otherwise flag idle sessions forever.\n const attention = running ? overviewAttention(snapshot.activities) : undefined\n const usage = snapshot.contextUsage\n return <>\n {attention === 'permission' ? <Badge label={t('overviewNeedsPermission')} tone=\"warning\" /> : null}\n {attention === 'question' ? <Badge label={t('overviewNeedsAnswer')} tone=\"warning\" /> : null}\n {usage === undefined ? null : <span>{t('overviewContextUsage', { percentage: usage.percentage })}</span>}\n </>\n}\n\nexport function ClaudePullRequestsPanel({ t, closeDetails, openSession, loadStatus, sessions, workspaces, projectionFor }: ClaudePullRequestsPanelInjected) {\n const snapshot = useSyncExternalStore(sessions.subscribe, sessions.getSnapshot, sessions.getSnapshot)\n const workspaceStore = workspaces ?? NO_WORKSPACES\n const workspaceState = useSyncExternalStore(workspaceStore.subscribe, workspaceStore.getSnapshot, workspaceStore.getSnapshot)\n const rows = useMemo(() => claudeSessionRows(snapshot, workspaceState.archivedSessionIds ?? []), [snapshot, workspaceState])\n const cwdKey = useMemo(() => [...new Set(rows.map(row => row.cwd ?? ''))].sort().join('\\0'), [rows])\n const [statuses, setStatuses] = useState<Readonly<Record<string, RepositoryStatus>>>({})\n useEffect(() => {\n const cwds = cwdKey.length === 0 ? [] : cwdKey.split('\\0')\n if (cwds.length === 0) return\n const controller = new AbortController()\n const refresh = (): void => {\n for (const cwd of cwds) {\n void loadStatus(cwd, controller.signal).then(status => {\n if (!controller.signal.aborted) setStatuses(previous => ({ ...previous, [cwd]: status }))\n }, () => undefined)\n }\n }\n refresh()\n const timer = setInterval(refresh, OVERVIEW_REFRESH_MS)\n return () => {\n controller.abort()\n clearInterval(timer)\n }\n }, [cwdKey, loadStatus])\n return (\n <div className={styles.detailsCardClass} style={styles.tasksPanel}>\n <style data-dsh-claude-overview-styles>{styles.detailsCardCss}{styles.panelIconButtonCss}</style>\n <header style={styles.tasksHeader}>\n <div>\n <span style={styles.tasksHeading}>{t('overviewTitle')}</span>\n <span style={styles.tasksTurnMeta}>{t('overviewBody')}</span>\n </div>\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('diffClose')} onClick={closeDetails}><IconCloseOutline16 /></button>\n </header>\n <div style={styles.overviewBody}>\n {rows.length === 0 ? <p style={styles.overviewEmpty}>{t('overviewEmpty')}</p> : rows.map(row => {\n const repository = row.cwd === undefined ? undefined : statuses[row.cwd]\n const pullRequest = repository?.pullRequest\n const branch = repository?.status === 'ready'\n ? (repository.detached === true ? t('repositoryDetached') : repository.branch ?? t('repositoryUnknownBranch'))\n : repository === undefined ? t('overviewLoading') : t('repositoryUnavailable')\n return (\n <button key={row.id} type=\"button\" style={styles.overviewRow} onClick={() => { openSession(row.id) }}>\n <span style={styles.overviewRowTop}>\n {row.running === true ? <span style={styles.overviewRunningDot} aria-label={t('overviewRunning')} /> : null}\n <span style={styles.overviewTitle}>{row.displayTitle ?? row.id}</span>\n {pullRequest === undefined\n ? <Badge label={t('overviewNoPr')} />\n : <Badge label={`#${pullRequest.number} · ${t(`repositoryState_${pullRequest.state}` as ClaudeCodeSettingsKey)}`} tone={pullRequest.state === 'merged' ? 'merged' : pullRequest.state === 'open' ? 'success' : 'neutral'} />}\n </span>\n <span style={styles.overviewMeta}>\n {repositoryName(repository?.remote) === undefined ? null : <span>{repositoryName(repository?.remote)}</span>}\n <span style={styles.overviewBranch}>{branch}</span>\n {pullRequest?.state === 'open' && pullRequest.checks !== 'none'\n ? <Badge label={t(`repositoryChecks_${pullRequest.checks}` as ClaudeCodeSettingsKey)} tone={pullRequest.checks === 'passing' ? 'success' : pullRequest.checks === 'failing' ? 'error' : 'warning'} />\n : null}\n {pullRequest?.state === 'open' && pullRequest.review !== 'none'\n ? <Badge label={t(`repositoryReview_${pullRequest.review}` as ClaudeCodeSettingsKey)} tone={pullRequest.review === 'approved' ? 'success' : pullRequest.review === 'changes-requested' ? 'error' : 'neutral'} />\n : null}\n {autoFixEnabled(row.id) ? <Badge label={t('overviewAutoFix')} tone=\"success\" /> : null}\n {projectionFor === undefined ? null : <OverviewAttention source={projectionFor(row.id)} running={row.running === true} t={t} />}\n </span>\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","import { CLAUDE_ASK_PATH } from '../constants.ts'\n\nexport interface AskSelectionRequest {\n readonly selection: string\n readonly context?: string\n readonly question: string\n}\n\nexport interface AskToolEvent {\n readonly type: 'tool'\n readonly id: string\n readonly phase: 'start' | 'input' | 'done'\n readonly name?: string\n readonly summary?: string\n readonly error?: boolean\n}\n\nexport type AskEvent =\n | { readonly type: 'delta'; readonly text: string }\n | { readonly type: 'thinking'; readonly text: string }\n | { readonly type: 'status'; readonly text: string }\n | AskToolEvent\n | { readonly type: 'done' }\n | { readonly type: 'error'; readonly message: string }\n\nexport type AskProgress = { readonly type: 'text' | 'thinking' | 'status'; readonly text: string } | AskToolEvent\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\n}\n\nexport function parseAskEvent(line: string): AskEvent {\n const event = record(JSON.parse(line) as unknown)\n if (event?.type === 'delta' && typeof event.text === 'string') return { type: 'delta', text: event.text }\n if (event?.type === 'thinking' && typeof event.text === 'string') return { type: 'thinking', text: event.text }\n if (event?.type === 'status' && typeof event.text === 'string') return { type: 'status', text: event.text }\n if (event?.type === 'tool' && typeof event.id === 'string' && (event.phase === 'start' || event.phase === 'input' || event.phase === 'done')) {\n return {\n type: 'tool',\n id: event.id,\n phase: event.phase,\n ...(typeof event.name === 'string' ? { name: event.name } : {}),\n ...(typeof event.summary === 'string' ? { summary: event.summary } : {}),\n ...(event.error === true ? { error: true } : {}),\n }\n }\n if (event?.type === 'done') return { type: 'done' }\n if (event?.type === 'error') return { type: 'error', message: typeof event.message === 'string' ? event.message : 'The question could not be answered.' }\n throw new Error('Invalid ask stream event.')\n}\n\n/** Stream an answer about selected reply text; resolves when the answer completes. */\nexport async function askAboutSelection(\n sessionId: string,\n request: AskSelectionRequest,\n onProgress: (progress: AskProgress) => void,\n signal?: AbortSignal,\n): Promise<void> {\n const response = await fetch(`${CLAUDE_ASK_PATH}?sessionId=${encodeURIComponent(sessionId)}`, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { accept: 'application/x-ndjson', 'content-type': 'application/json' },\n body: JSON.stringify(request),\n ...(signal === undefined ? {} : { signal }),\n })\n if (!response.ok) {\n const body = record(await response.json().catch(() => undefined))\n throw new Error(typeof body?.message === 'string' ? body.message : 'The question could not be sent.')\n }\n if (response.body === null) throw new Error('The answer stream is unavailable.')\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n let finished = false\n const handle = (line: string): void => {\n if (line.trim().length === 0) return\n const event = parseAskEvent(line)\n if (event.type === 'delta') onProgress({ type: 'text', text: event.text })\n else if (event.type === 'thinking') onProgress({ type: 'thinking', text: event.text })\n else if (event.type === 'status') onProgress({ type: 'status', text: event.text })\n else if (event.type === 'tool') onProgress(event)\n else if (event.type === 'done') finished = true\n else throw new Error(event.message)\n }\n while (true) {\n const chunk = await reader.read()\n buffer += decoder.decode(chunk.value, { stream: !chunk.done })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) handle(line)\n if (chunk.done) break\n }\n handle(buffer)\n if (!finished) throw new Error('The answer ended unexpectedly.')\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport { MarkdownText, Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { askAboutSelection, type AskProgress } from './ask-api.ts'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\nimport * as styles from './styles.ts'\n\nexport interface ClaudeSelectionAskInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n /** The session whose conversation is on screen. */\n currentSessionId: () => string | undefined\n /** Whether the plugin owns that session (the ask query needs a Claude cwd). */\n ownsSession: (sessionId: string) => boolean\n /** Append text to the session composer without submitting. */\n insertIntoChat?: (sessionId: string, text: string) => void\n}\n\ninterface SelectionRect {\n readonly top: number\n readonly left: number\n readonly width: number\n readonly bottom: number\n}\n\ninterface SelectionInfo {\n readonly sessionId: string\n readonly text: string\n readonly context: string\n readonly rect: SelectionRect\n /** Live range: re-measured on scroll and painted via the Highlight API. */\n readonly range: Range\n}\n\n// Chat rows carry data-chat-flow-kind; Claude output renders under plugin\n// node kinds (claude-activity-step, …) as well as the Host 'assistant' kind,\n// so match any chat node that is not the user's own message.\nconst CHAT_NODE = '[data-chat-flow-kind]'\nconst USER_KIND = 'user'\nconst MAX_SELECTION_CHARS = 8_000\nconst MAX_CONTEXT_CHARS = 16_000\nconst POPUP_WIDTH = 560\nconst POPUP_ESTIMATED_HEIGHT = 320\nconst TOOLBAR_WIDTH = 64\nconst HIGHLIGHT_NAME = 'dsh-claude-ask'\n\n/** Answer content in arrival order, like the main window: tool steps and\n * text segments interleave; text deltas extend the trailing text block. */\nexport type AnswerBlock =\n | { readonly kind: 'text'; readonly text: string }\n | { readonly kind: 'tool'; readonly id: string; readonly name: string; readonly summary?: string; readonly state: 'running' | 'done' | 'error' }\n\nexport function appendAnswerBlock(blocks: readonly AnswerBlock[], progress: AskProgress): readonly AnswerBlock[] {\n if (progress.type === 'text') {\n const last = blocks.at(-1)\n if (last?.kind === 'text') return [...blocks.slice(0, -1), { kind: 'text', text: last.text + progress.text }]\n return [...blocks, { kind: 'text', text: progress.text }]\n }\n if (progress.type !== 'tool') return blocks\n const index = blocks.findIndex(block => block.kind === 'tool' && block.id === progress.id)\n if (index < 0) {\n if (progress.phase === 'done') return blocks\n return [...blocks, { kind: 'tool', id: progress.id, name: progress.name ?? 'tool', state: 'running', ...(progress.summary === undefined ? {} : { summary: progress.summary }) }]\n }\n const current = blocks[index] as Extract<AnswerBlock, { kind: 'tool' }>\n const next: AnswerBlock = {\n ...current,\n ...(progress.name === undefined ? {} : { name: progress.name }),\n ...(progress.summary === undefined ? {} : { summary: progress.summary }),\n state: progress.phase === 'done' ? (progress.error === true ? 'error' : 'done') : current.state,\n }\n return [...blocks.slice(0, index), next, ...blocks.slice(index + 1)]\n}\n\nexport function answerText(blocks: readonly AnswerBlock[]): string {\n return blocks.filter((block): block is Extract<AnswerBlock, { kind: 'text' }> => block.kind === 'text').map(block => block.text.trim()).filter(text => text.length > 0).join('\\n\\n')\n}\n\nfunction rectOf(range: Range): SelectionRect {\n const rect = range.getBoundingClientRect()\n return { top: rect.top, left: rect.left, width: rect.width, bottom: rect.bottom }\n}\n\n/** Read the current selection when it sits inside an assistant reply. */\nexport function selectionInfoOf(selection: Selection | null, sessionId: string | undefined): Omit<SelectionInfo, 'sessionId'> | undefined {\n if (sessionId === undefined || selection === null || selection.isCollapsed || selection.rangeCount === 0) return undefined\n const range = selection.getRangeAt(0)\n // A whole-line (triple-click) selection ends at the start of the NEXT chat\n // row, so the common ancestor climbs above any row; anchor on the start\n // node instead and fall back to the end node.\n const hostOf = (node: Node | null): HTMLElement | null => {\n const element = node instanceof Element ? node : node?.parentElement ?? null\n return element?.closest<HTMLElement>(CHAT_NODE) ?? null\n }\n const host = hostOf(range.startContainer) ?? hostOf(range.endContainer)\n if (host === null || host.dataset.chatFlowKind === USER_KIND) return undefined\n const text = selection.toString().trim()\n if (text.length === 0) return undefined\n return {\n text: text.slice(0, MAX_SELECTION_CHARS),\n context: (host.textContent ?? '').trim().slice(0, MAX_CONTEXT_CHARS),\n rect: rectOf(range),\n range: range.cloneRange(),\n }\n}\n\nexport function toolbarPosition(rect: SelectionRect, viewportWidth: number): { top: number; left: number } {\n return {\n top: Math.max(8, rect.top - 40),\n left: Math.min(Math.max(8, rect.left + rect.width / 2 - TOOLBAR_WIDTH / 2), Math.max(8, viewportWidth - TOOLBAR_WIDTH - 8)),\n }\n}\n\nexport type PopupSide = 'below' | 'above'\n\n/** Pick the side with room once, when the popup opens: below the selection\n * unless the space there is short and above is roomier. */\nexport function popupSide(rect: SelectionRect, viewportHeight: number): PopupSide {\n const roomBelow = viewportHeight - rect.bottom - 16\n const roomAbove = rect.top - 16\n return roomBelow >= POPUP_ESTIMATED_HEIGHT || roomBelow >= roomAbove ? 'below' : 'above'\n}\n\n/** Anchor on the chosen side so streamed content grows away from the text and\n * scrolls inside the popup instead of running off screen. */\nexport function popupPlacement(rect: SelectionRect, side: PopupSide, viewportWidth: number, viewportHeight: number): { top?: number; bottom?: number; left: number; width: number; maxHeight: number } {\n const width = Math.min(POPUP_WIDTH, viewportWidth - 16)\n const left = Math.min(Math.max(8, rect.left), Math.max(8, viewportWidth - width - 8))\n const cap = Math.round(viewportHeight * 0.7)\n if (side === 'below') {\n const top = Math.max(8, rect.bottom + 8)\n return { top, left, width, maxHeight: Math.max(120, Math.min(cap, viewportHeight - top - 8)) }\n }\n const bottom = Math.max(8, viewportHeight - rect.top + 8)\n return { bottom, left, width, maxHeight: Math.max(120, Math.min(cap, viewportHeight - bottom - 8)) }\n}\n\nfunction CopyIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8\" rx=\"1.5\" />\n <path d=\"M10.5 5.5V3.5a1 1 0 0 0-1-1h-6a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2\" />\n </svg>\n )\n}\n\nfunction AskIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M2.75 2.75h10.5a1 1 0 0 1 1 1v6.5a1 1 0 0 1-1 1H8.2l-3.2 2.9v-2.9H2.75a1 1 0 0 1-1-1v-6.5a1 1 0 0 1 1-1Z\" />\n <path d=\"M6.4 6.3a1.6 1.6 0 1 1 2.3 1.5c-.5.3-.7.6-.7 1.1M8 10.6h.01\" />\n </svg>\n )\n}\n\nfunction CheckIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m3.5 8.5 3 3 6-7\" />\n </svg>\n )\n}\n\n/** Selection toolbar over assistant replies: copy, or ask a follow-up whose\n * answer streams into a popup rendered with the Host Markdown renderer. */\nexport function ClaudeSelectionAsk({ t, currentSessionId, ownsSession, insertIntoChat }: ClaudeSelectionAskInjected) {\n const [selection, setSelection] = useState<SelectionInfo>()\n const [open, setOpen] = useState(false)\n const [question, setQuestion] = useState('')\n const [blocks, setBlocks] = useState<readonly AnswerBlock[]>([])\n const answer = answerText(blocks)\n const [thinking, setThinking] = useState('')\n const [thinkingOpen, setThinkingOpen] = useState(false)\n const [started, setStarted] = useState(false)\n const [phase, setPhase] = useState<'idle' | 'answering' | 'done'>('idle')\n const [error, setError] = useState<string>()\n const [copied, setCopied] = useState<'selection' | 'answer'>()\n const [rect, setRect] = useState<SelectionRect>()\n const [side, setSide] = useState<PopupSide>('below')\n const popupRef = useRef<HTMLDivElement>(null)\n const toolbarRef = useRef<HTMLDivElement>(null)\n const controller = useRef<AbortController>()\n const openRef = useRef(false)\n openRef.current = open\n\n const close = useCallback((): void => {\n controller.current?.abort()\n controller.current = undefined\n setOpen(false)\n setSelection(undefined)\n setQuestion('')\n setBlocks([])\n setThinking('')\n setThinkingOpen(false)\n setStarted(false)\n setPhase('idle')\n setError(undefined)\n setCopied(undefined)\n }, [])\n\n useEffect(() => {\n if (typeof document === 'undefined') return\n let timer: ReturnType<typeof setTimeout> | undefined\n const update = (): void => {\n if (openRef.current) return\n const sessionId = currentSessionId()\n if (sessionId === undefined || !ownsSession(sessionId)) {\n setSelection(undefined)\n return\n }\n const info = selectionInfoOf(document.getSelection(), sessionId)\n setSelection(info === undefined ? undefined : { sessionId, ...info })\n }\n const schedule = (): void => {\n if (timer !== undefined) clearTimeout(timer)\n timer = setTimeout(update, 120)\n }\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') close()\n }\n const onPointerDown = (event: PointerEvent): void => {\n if (!(event.target instanceof Node)) return\n if (popupRef.current?.contains(event.target) === true || toolbarRef.current?.contains(event.target) === true) return\n if (openRef.current) close()\n }\n document.addEventListener('selectionchange', schedule)\n document.addEventListener('mouseup', schedule)\n document.addEventListener('keydown', onKey)\n document.addEventListener('pointerdown', onPointerDown)\n return () => {\n if (timer !== undefined) clearTimeout(timer)\n document.removeEventListener('selectionchange', schedule)\n document.removeEventListener('mouseup', schedule)\n document.removeEventListener('keydown', onKey)\n document.removeEventListener('pointerdown', onPointerDown)\n }\n }, [close, currentSessionId, ownsSession])\n useEffect(() => () => controller.current?.abort(), [])\n // Follow the text: re-measure the live range on scroll and resize.\n useEffect(() => {\n setRect(selection?.rect)\n if (selection === undefined) return\n let frame: number | undefined\n const reposition = (): void => {\n if (frame !== undefined) return\n frame = requestAnimationFrame(() => {\n frame = undefined\n const next = rectOf(selection.range)\n if (next.width === 0 && next.bottom === next.top) return\n setRect(next)\n })\n }\n document.addEventListener('scroll', reposition, true)\n window.addEventListener('resize', reposition)\n return () => {\n if (frame !== undefined) cancelAnimationFrame(frame)\n document.removeEventListener('scroll', reposition, true)\n window.removeEventListener('resize', reposition)\n }\n }, [selection])\n // Keep the asked-about text visibly marked while the popup owns focus. The\n // Highlight API paints without touching the Host's DOM.\n useEffect(() => {\n if (!open || selection === undefined) return\n const runtime = globalThis as { CSS?: { highlights?: Map<string, unknown> }; Highlight?: new (range: Range) => unknown }\n const registry = runtime.CSS?.highlights\n if (registry === undefined || runtime.Highlight === undefined) return\n registry.set(HIGHLIGHT_NAME, new runtime.Highlight(selection.range))\n return () => { registry.delete(HIGHLIGHT_NAME) }\n }, [open, selection])\n useEffect(() => {\n if (copied === undefined) return\n const timer = setTimeout(() => setCopied(undefined), 1_200)\n return () => clearTimeout(timer)\n }, [copied])\n\n if (selection === undefined || rect === undefined) return <span data-dsh-claude-selection-ask=\"armed\" hidden />\n\n const copy = (text: string, what: 'selection' | 'answer'): void => {\n void navigator.clipboard.writeText(text).then(() => { setCopied(what) }, () => undefined)\n }\n const submit = (): void => {\n if (question.trim().length === 0 || phase === 'answering') return\n controller.current?.abort()\n const aborter = new AbortController()\n controller.current = aborter\n setBlocks([])\n setThinking('')\n setThinkingOpen(false)\n setStarted(false)\n setError(undefined)\n setPhase('answering')\n void askAboutSelection(selection.sessionId, { selection: selection.text, context: selection.context, question }, progress => {\n if (progress.type === 'status') setStarted(true)\n else if (progress.type === 'thinking') setThinking(current => current + progress.text)\n else setBlocks(current => appendAnswerBlock(current, progress))\n }, aborter.signal).then(() => {\n if (!aborter.signal.aborted) setPhase('done')\n }, (reason: unknown) => {\n if (aborter.signal.aborted) return\n setError(reason instanceof Error ? reason.message : t('askFailed'))\n setPhase('done')\n })\n }\n const viewportWidth = typeof window === 'undefined' ? 1_280 : window.innerWidth\n const viewportHeight = typeof window === 'undefined' ? 800 : window.innerHeight\n\n if (!open) {\n const position = toolbarPosition(rect, viewportWidth)\n return (\n <div ref={toolbarRef} role=\"toolbar\" aria-label={t('askToolbar')} style={{ ...styles.askToolbar, top: position.top, left: position.left }}>\n <style data-dsh-claude-ask-styles>{styles.panelIconButtonCss}</style>\n <Tooltip label={copied === 'selection' ? t('askCopied') : t('copyTooltip')} side=\"top\" delayMs={300}>\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('copyTooltip')} onMouseDown={event => { event.preventDefault() }} onClick={() => { copy(selection.text, 'selection') }}>\n {copied === 'selection' ? <CheckIcon /> : <CopyIcon />}\n </button>\n </Tooltip>\n <Tooltip label={t('askTooltip')} side=\"top\" delayMs={300}>\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('askTooltip')} onMouseDown={event => { event.preventDefault() }} onClick={() => {\n setSide(popupSide(rect, viewportHeight))\n setOpen(true)\n }}>\n <AskIcon />\n </button>\n </Tooltip>\n </div>\n )\n }\n\n const placement = popupPlacement(rect, side, viewportWidth, viewportHeight)\n return (\n <div ref={popupRef} role=\"dialog\" aria-label={t('askTooltip')} style={{ ...styles.askPopup, ...placement }}>\n <style data-dsh-claude-ask-styles>{styles.panelIconButtonCss}{styles.askHighlightCss}</style>\n <p style={styles.askQuote}>{selection.text}</p>\n {phase === 'idle' ? (\n <>\n <textarea\n autoFocus\n value={question}\n placeholder={t('askPlaceholder')}\n style={styles.askTextarea}\n onChange={event => { setQuestion(event.currentTarget.value) }}\n onKeyDown={event => {\n if (event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault()\n submit()\n }\n }}\n />\n <div style={styles.askActions}>\n <button type=\"button\" style={styles.askButton} onClick={close}>{t('askClose')}</button>\n <button type=\"button\" style={{ ...styles.askButton, ...styles.askPrimaryButton }} disabled={question.trim().length === 0} onClick={submit}>{t('askSubmit')}</button>\n </div>\n </>\n ) : (\n <>\n <p style={styles.askQuestion}>{question}</p>\n <div style={styles.askAnswer}>\n {thinking.length === 0 ? null : (\n <button type=\"button\" style={styles.askThinkingRow} aria-expanded={thinkingOpen} onClick={() => { setThinkingOpen(value => !value) }}>\n <span style={styles.askThinkingLabel}>{phase === 'answering' && answer.length === 0 ? t('askThinkingLive') : t('askThinkingLabel')}</span>\n <span style={thinkingOpen ? styles.askThinkingFull : styles.askThinkingPreview}>{thinkingOpen ? thinking : thinking.trimEnd().split('\\n').filter(line => line.trim().length > 0).at(-1)}</span>\n </button>\n )}\n {blocks.length === 0 && thinking.length === 0 && error === undefined ? <span style={styles.askStatus}>{started ? t('askThinking') : t('askStarting')}</span> : null}\n {blocks.map((block, index) => block.kind === 'text'\n ? <MarkdownText key={`text-${index}`} text={block.text} streaming={phase === 'answering' && index === blocks.length - 1} />\n : (\n <div key={block.id} style={styles.askToolRow}>\n <span style={{ ...styles.askToolGlyph, ...(block.state === 'error' ? styles.askToolGlyphError : block.state === 'done' ? styles.askToolGlyphDone : {}) }} aria-hidden=\"true\">\n {block.state === 'running' ? '…' : block.state === 'done' ? '✓' : '×'}\n </span>\n <span style={styles.askToolName}>{block.name}</span>\n {block.summary === undefined ? null : <span style={styles.askToolSummary}>{block.summary}</span>}\n </div>\n ))}\n {error === undefined ? null : <p role=\"alert\" style={styles.askError}>{error}</p>}\n </div>\n <div style={styles.askActions}>\n {answer.length === 0 ? null : (\n <button type=\"button\" style={styles.askButton} onClick={() => { copy(answer, 'answer') }}>{copied === 'answer' ? t('askCopied') : t('askCopyAnswer')}</button>\n )}\n {answer.length === 0 || insertIntoChat === undefined ? null : (\n <button type=\"button\" style={styles.askButton} onClick={() => {\n insertIntoChat(selection.sessionId, `> ${selection.text.replaceAll('\\n', '\\n> ')}\\n\\n**${question}**\\n\\n${answer}`)\n close()\n }}>{t('askSendToChat')}</button>\n )}\n <button type=\"button\" style={{ ...styles.askButton, ...styles.askPrimaryButton }} onClick={close}>{t('askClose')}</button>\n </div>\n </>\n )}\n </div>\n )\n}\n","const PORTAL_ATTRIBUTE = 'data-dsh-claude-hero-controls'\n\nfunction normalizedText(element: Element): string {\n return (element.textContent ?? '').replace(/\\s+/gu, ' ').trim()\n}\n\nexport function isClaudePresetText(value: string): boolean {\n return /^claude(?: code)?$/iu.test(value.replace(/\\s+/gu, ' ').trim())\n}\n\nfunction directChildContaining(parent: Element, descendant: Element): Element | undefined {\n return Array.from(parent.children).find(child => child === descendant || child.contains(descendant))\n}\n\n/** Locate rc.8's hero preset seat without relying on hashed CSS module names. */\nexport function locateClaudePresetSeat(root: ParentNode = document): { hero: HTMLElement; seat: Element } | undefined {\n const heroes = Array.from(root.querySelectorAll<HTMLElement>('[data-phase=\"hero\"]'))\n if (heroes.length !== 1) return undefined\n const hero = heroes[0]\n if (hero === undefined) return undefined\n const menuButtons = Array.from(hero.querySelectorAll<HTMLButtonElement>('button[aria-haspopup=\"menu\"]'))\n const presetButtons = menuButtons.filter(button => button.getAttribute('aria-label') === null && isClaudePresetText(normalizedText(button)))\n if (presetButtons.length !== 1) return undefined\n const preset = presetButtons[0]\n if (preset === undefined) return undefined\n let row: Element | null = preset.parentElement\n while (row !== null && row !== hero) {\n const workspace = Array.from(row.querySelectorAll<HTMLButtonElement>('button[aria-haspopup=\"menu\"][aria-label]'))\n if (workspace.length === 1) {\n const seat = directChildContaining(row, preset)\n if (seat !== undefined) return { hero, seat }\n }\n row = row.parentElement\n }\n return undefined\n}\n\n/** Reuse the row's existing portal even when the host moved a node between it\n * and the seat: a fresh element would change React's portal identity and\n * restart (and abort) every effect keyed on it. */\nexport function ensureClaudeHeroPortal(seat: Element): HTMLElement {\n const existing = seat.parentElement?.querySelector<HTMLElement>(`:scope > [${PORTAL_ATTRIBUTE}]`) ?? null\n if (existing !== null) {\n if (existing.previousElementSibling !== seat) seat.insertAdjacentElement('afterend', existing)\n return existing\n }\n const portal = document.createElement('span')\n portal.setAttribute(PORTAL_ATTRIBUTE, '')\n seat.insertAdjacentElement('afterend', portal)\n return portal\n}\n\nexport function removeClaudeHeroPortals(root: ParentNode = document): void {\n for (const portal of root.querySelectorAll<HTMLElement>(`[${PORTAL_ATTRIBUTE}]`)) portal.remove()\n}\n","import { useEffect, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { IconBranchOutline16, IconCheckOutline14, IconChevronDownOutline14, IconSearchOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { RepositoryBranchList } from '../repository-setup.ts'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\nimport { ensureClaudeHeroPortal, locateClaudePresetSeat, removeClaudeHeroPortals } from './hero-dom-bridge.ts'\nimport { loadRepositoryBranches, type RepositoryPreparationStage } from './repository-setup-api.ts'\nimport { JiraClientError, loadJiraStatus, searchJiraTickets, type JiraTicket } from './jira-api.ts'\nimport * as styles from './styles.ts'\n\nexport interface BatchTicketProgress {\n ticketKey: string\n index: number\n total: number\n stage: RepositoryPreparationStage\n}\n\nexport interface ClaudeHeroRepositoryControlsInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n prepare: (\n cwd: string,\n branch: string,\n worktree: boolean,\n onProgress: (stage: RepositoryPreparationStage) => void,\n ticket?: JiraTicket,\n ) => Promise<void>\n /** Kick off one worktree + session per ticket; the hero session stays put. */\n prepareMany: (\n cwd: string,\n branch: string,\n tickets: readonly JiraTicket[],\n onProgress: (progress: BatchTicketProgress) => void,\n ) => Promise<void>\n}\n\ntype StandardProps = PropsRuntime<'conversation.input.dock'>\n\nexport interface ClaudeHeroRepositoryControlsProps extends StandardProps, ClaudeHeroRepositoryControlsInjected {}\n\nfunction shouldInterceptKey(event: KeyboardEvent): boolean {\n if (event.key !== 'Enter' || event.shiftKey || event.repeat || event.isComposing) return false\n const target = event.target\n return target instanceof HTMLTextAreaElement && target.closest('[data-phase=\"hero\"]') !== null\n}\n\nfunction shouldInterceptClick(event: MouseEvent): boolean {\n const target = event.target\n if (!(target instanceof Element)) return false\n const button = target.closest<HTMLButtonElement>('[data-phase=\"hero\"] [data-composer-card] button')\n if (button === null || button.disabled) return false\n const card = button.closest('[data-composer-card]')\n const buttons = card === null ? [] : Array.from(card.querySelectorAll<HTMLButtonElement>('button:not(:disabled)'))\n return buttons.at(-1) === button\n}\n\nexport function repositoryBranchOptions(branches: RepositoryBranchList): readonly string[] {\n const local = new Set(branches.branches)\n return [...branches.branches, ...branches.remoteBranches.filter(branch => !local.has(branch))]\n}\n\nexport function selectedBranchFirst(branches: readonly string[], selected: string): readonly string[] {\n return branches.includes(selected) ? [selected, ...branches.filter(branch => branch !== selected)] : branches\n}\n\nexport function filterRepositoryBranches(branches: readonly string[], query: string): readonly string[] {\n const normalized = query.trim().toLocaleLowerCase()\n return normalized.length === 0\n ? branches\n : branches.filter(branch => branch.toLocaleLowerCase().includes(normalized))\n}\n\n/** Toggle a ticket's membership in the multi-select, keyed by ticket key. */\nexport function toggleTicketSelection(tickets: readonly JiraTicket[], ticket: JiraTicket): readonly JiraTicket[] {\n return tickets.some(item => item.key === ticket.key)\n ? tickets.filter(item => item.key !== ticket.key)\n : [...tickets, ticket]\n}\n\nexport function branchMenuNavigationIndex(current: number, count: number, key: 'ArrowDown' | 'ArrowUp' | 'Home' | 'End'): number {\n if (count <= 0) return 0\n if (key === 'Home') return 0\n if (key === 'End') return count - 1\n return (current + (key === 'ArrowDown' ? 1 : -1) + count) % count\n}\n\nconst BRANCH_LOAD_RETRIES = 2\nconst BRANCH_LOAD_RETRY_MS = 1_000\n\nexport const WORKTREE_PROGRESS_STAGES: readonly RepositoryPreparationStage[] = [\n 'inspecting',\n 'fetching',\n 'creating-worktree',\n 'saving-worktree',\n 'creating-workspace',\n 'starting-session',\n 'transferring-draft',\n 'submitting',\n]\n\nconst PROGRESS_LABEL_KEYS: Record<RepositoryPreparationStage, ClaudeCodeSettingsKey> = {\n inspecting: 'repositoryProgress_inspecting',\n fetching: 'repositoryProgress_fetching',\n 'creating-worktree': 'repositoryProgress_creating-worktree',\n 'saving-worktree': 'repositoryProgress_saving-worktree',\n 'switching-branch': 'repositoryProgress_switching-branch',\n 'creating-workspace': 'repositoryProgress_creating-workspace',\n 'starting-session': 'repositoryProgress_starting-session',\n 'transferring-draft': 'repositoryProgress_transferring-draft',\n submitting: 'repositoryProgress_submitting',\n}\n\nfunction progressLabelKey(stage: RepositoryPreparationStage): ClaudeCodeSettingsKey {\n return PROGRESS_LABEL_KEYS[stage]\n}\n\nexport function WorktreeProgressCard({\n stage, error, context, t, onDismiss,\n}: {\n stage: RepositoryPreparationStage\n error?: string\n /** Batch annotation shown beside the title, e.g. \"PSOS-1 · 1/3\". */\n context?: string\n t: ClaudeHeroRepositoryControlsInjected['t']\n onDismiss: () => void\n}) {\n const current = WORKTREE_PROGRESS_STAGES.indexOf(stage)\n const visible = WORKTREE_PROGRESS_STAGES.slice(0, Math.max(0, current) + 1)\n return (\n <div role={error === undefined ? 'status' : 'alert'} aria-live=\"polite\" style={styles.heroWorktreeProgressCard}>\n <div style={styles.heroWorktreeProgressHeader}>\n {error === undefined ? (\n <svg aria-hidden=\"true\" viewBox=\"0 0 20 20\" style={styles.heroWorktreeProgressSpinner}>\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"none\" stroke=\"currentColor\" strokeOpacity=\"0.2\" strokeWidth=\"2\" />\n <path d=\"M10 2a8 8 0 0 1 8 8\" fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeWidth=\"2\">\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 10 10\" to=\"360 10 10\" dur=\"0.8s\" repeatCount=\"indefinite\" />\n </path>\n </svg>\n ) : <span aria-hidden=\"true\" style={styles.heroWorktreeProgressError}>×</span>}\n <div style={styles.heroWorktreeProgressCopy}>\n <strong style={styles.heroWorktreeProgressTitle}>\n {error === undefined ? t('repositoryProgressTitle') : t('repositoryProgressFailed')}\n {context === undefined ? null : <span style={styles.heroWorktreeProgressContext}> {context}</span>}\n </strong>\n <span style={styles.heroWorktreeProgressCurrent}>{error ?? t(progressLabelKey(stage))}</span>\n </div>\n {error === undefined ? null : (\n <button type=\"button\" style={styles.heroWorktreeProgressDismiss} onClick={onDismiss} aria-label={t('repositoryProgressDismiss')}>×</button>\n )}\n </div>\n <div style={styles.heroWorktreeProgressSteps}>\n {visible.map((item, index) => (\n <span key={item} style={styles.heroWorktreeProgressStep}>\n <span aria-hidden=\"true\" style={{\n ...styles.heroWorktreeProgressDot,\n ...(index < visible.length - 1 ? styles.heroWorktreeProgressDotDone : styles.heroWorktreeProgressDotActive),\n }}>{index < visible.length - 1 ? '✓' : ''}</span>\n {t(progressLabelKey(item))}\n </span>\n ))}\n </div>\n </div>\n )\n}\n\nfunction TicketIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M2.5 5.5a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v1.2a1.3 1.3 0 0 0 0 2.6v1.2a1 1 0 0 1-1 1h-9a1 1 0 0 1-1-1V9.3a1.3 1.3 0 0 0 0-2.6V5.5Z\" />\n <path d=\"M6.5 4.5v7\" strokeDasharray=\"1.5 1.5\" />\n </svg>\n )\n}\n\nexport function ClaudeHeroRepositoryCapsule({\n branches, selected, worktree, busy, menuOpen, worktreeLabel, searchPlaceholder, emptySearchLabel,\n worktreeLocked = false, onMenuOpenChange, onSelect, onWorktreeChange,\n}: {\n branches: readonly string[]\n selected: string\n worktree: boolean\n busy: boolean\n menuOpen: boolean\n worktreeLabel: string\n searchPlaceholder: string\n emptySearchLabel: string\n /** Multi-ticket kickoff always builds worktrees; the toggle locks checked. */\n worktreeLocked?: boolean\n onMenuOpenChange: (open: boolean) => void\n onSelect: (branch: string) => void\n onWorktreeChange: (checked: boolean) => void\n}) {\n const pickerRef = useRef<HTMLSpanElement>(null)\n const searchRef = useRef<HTMLInputElement>(null)\n const optionRefs = useRef<Array<HTMLButtonElement | null>>([])\n const [query, setQuery] = useState('')\n const [activeIndex, setActiveIndex] = useState(0)\n const [worktreeHovered, setWorktreeHovered] = useState(false)\n const [worktreeFocused, setWorktreeFocused] = useState(false)\n const ordered = useMemo(() => selectedBranchFirst(branches, selected), [branches, selected])\n const filtered = useMemo(() => filterRepositoryBranches(ordered, query), [ordered, query])\n\n useEffect(() => {\n if (!menuOpen) {\n setQuery('')\n setActiveIndex(0)\n return\n }\n setActiveIndex(0)\n searchRef.current?.focus()\n const closeOnOutsidePointer = (event: PointerEvent): void => {\n if (event.target instanceof Node && pickerRef.current?.contains(event.target) !== true) onMenuOpenChange(false)\n }\n document.addEventListener('pointerdown', closeOnOutsidePointer)\n return () => {\n document.removeEventListener('pointerdown', closeOnOutsidePointer)\n }\n }, [menuOpen, onMenuOpenChange])\n\n useEffect(() => {\n setActiveIndex(0)\n }, [query])\n\n useEffect(() => {\n if (menuOpen) optionRefs.current[activeIndex]?.scrollIntoView({ block: 'nearest' })\n }, [activeIndex, menuOpen])\n\n const chooseActive = (): void => {\n const branch = filtered[activeIndex]\n if (branch !== undefined) onSelect(branch)\n }\n\n const handleMenuKeyDown = (event: ReactKeyboardEvent): void => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Home' || event.key === 'End') {\n event.preventDefault()\n const key = event.key as 'ArrowDown' | 'ArrowUp' | 'Home' | 'End'\n setActiveIndex(current => branchMenuNavigationIndex(current, filtered.length, key))\n } else if (event.key === 'Enter') {\n event.preventDefault()\n chooseActive()\n } else if (event.key === 'Escape') {\n event.preventDefault()\n onMenuOpenChange(false)\n }\n }\n\n return (\n <span style={styles.heroRepositoryCapsule}>\n <span ref={pickerRef} style={styles.heroBranchPicker}>\n <button\n type=\"button\"\n style={styles.heroBranchTrigger}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n disabled={busy}\n onClick={() => { onMenuOpenChange(!menuOpen) }}\n >\n <IconBranchOutline16 />\n <span style={styles.heroBranchName}>{selected}</span>\n <IconChevronDownOutline14 />\n </button>\n {menuOpen ? (\n <span role=\"menu\" aria-activedescendant={filtered[activeIndex] === undefined ? undefined : `claude-branch-option-${activeIndex}`} style={styles.heroBranchMenu} onKeyDown={handleMenuKeyDown}>\n <label style={styles.heroBranchSearch}>\n <IconSearchOutline16 />\n <input\n ref={searchRef}\n type=\"search\"\n value={query}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n style={styles.heroBranchSearchInput}\n onChange={event => { setQuery(event.currentTarget.value) }}\n />\n </label>\n <span style={styles.heroBranchList}>\n {filtered.length === 0 ? <span style={styles.heroBranchEmpty}>{emptySearchLabel}</span> : filtered.map((branch, index) => (\n <button\n ref={element => { optionRefs.current[index] = element }}\n id={`claude-branch-option-${index}`}\n key={branch}\n type=\"button\"\n role=\"menuitem\"\n aria-current={branch === selected ? 'true' : undefined}\n data-active={index === activeIndex ? 'true' : undefined}\n style={{ ...styles.heroBranchItem, ...(index === activeIndex ? styles.heroBranchItemActive : {}) }}\n onMouseEnter={() => { setActiveIndex(index) }}\n onClick={() => { onSelect(branch) }}\n >\n <span style={styles.heroBranchItemName}>{branch}</span>\n {branch === selected ? <IconCheckOutline14 /> : null}\n </button>\n ))}\n </span>\n </span>\n ) : null}\n </span>\n <span aria-hidden=\"true\" style={styles.heroRepositoryDivider} />\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={worktreeLocked || worktree}\n disabled={busy || worktreeLocked}\n style={{\n ...styles.heroWorktreeToggle,\n ...(worktreeLocked || worktree || worktreeHovered ? styles.heroWorktreeToggleActive : {}),\n ...(worktreeFocused ? styles.heroWorktreeToggleFocused : {}),\n }}\n onMouseEnter={() => { setWorktreeHovered(true) }}\n onMouseLeave={() => { setWorktreeHovered(false) }}\n // The focus ring is for keyboard users; click focus lingering after a\n // toggle would otherwise leave a permanent halo around the checkbox.\n onFocus={event => { setWorktreeFocused(event.currentTarget.matches(':focus-visible')) }}\n onBlur={() => { setWorktreeFocused(false) }}\n onClick={() => { onWorktreeChange(!worktree) }}\n >\n <span aria-hidden=\"true\" style={{ ...styles.heroWorktreeCheckbox, ...(worktreeLocked || worktree ? styles.heroWorktreeCheckboxChecked : {}) }}>\n {worktreeLocked || worktree ? (\n <svg viewBox=\"0 0 12 12\" style={styles.heroWorktreeCheckboxIcon}>\n <path d=\"m2.5 6.2 2.1 2.1 4.9-5\" fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"1.8\" />\n </svg>\n ) : null}\n </span>\n {worktreeLabel}\n </button>\n </span>\n )\n}\n\nexport function ClaudeHeroRepositoryControls({\n sessionId, useSessions, useWorkspaces, input, t, prepare, prepareMany,\n}: ClaudeHeroRepositoryControlsProps) {\n const cwd = useSessions(state => state.byId[sessionId]?.cwd)\n const workspacePath = useWorkspaces(state => state.items.find(item => item.sessionIds.includes(sessionId))?.path)\n const [portal, setPortal] = useState<HTMLElement>()\n const [branches, setBranches] = useState<RepositoryBranchList>()\n const [selected, setSelected] = useState('')\n const [worktree, setWorktree] = useState(false)\n const [menuOpen, setMenuOpen] = useState(false)\n const [busy, setBusy] = useState(false)\n const [progressStage, setProgressStage] = useState<RepositoryPreparationStage>()\n const [progressError, setProgressError] = useState<string>()\n const [error, setError] = useState<string>()\n const [jiraConnected, setJiraConnected] = useState(false)\n const [tickets, setTickets] = useState<readonly JiraTicket[]>([])\n const [batchProgress, setBatchProgress] = useState<BatchTicketProgress>()\n const [batchDone, setBatchDone] = useState<number>()\n const [ticketMenuOpen, setTicketMenuOpen] = useState(false)\n const [ticketQuery, setTicketQuery] = useState('')\n const [ticketResults, setTicketResults] = useState<readonly JiraTicket[]>()\n const [ticketError, setTicketError] = useState<string>()\n const ticketPickerRef = useRef<HTMLSpanElement>(null)\n const ticketSearchRef = useRef<HTMLInputElement>(null)\n const pendingRef = useRef(false)\n const path = workspacePath ?? cwd\n\n useEffect(() => {\n if (typeof document === 'undefined' || typeof MutationObserver === 'undefined') return\n let scheduled = false\n const reconcile = (): void => {\n scheduled = false\n const target = locateClaudePresetSeat()\n if (target === undefined) {\n removeClaudeHeroPortals()\n setPortal(undefined)\n return\n }\n setPortal(ensureClaudeHeroPortal(target.seat))\n }\n const schedule = (): void => {\n if (scheduled) return\n scheduled = true\n queueMicrotask(reconcile)\n }\n reconcile()\n const observer = new MutationObserver(schedule)\n observer.observe(document.body, { childList: true, subtree: true, characterData: true, attributes: true, attributeFilter: ['data-phase'] })\n return () => {\n observer.disconnect()\n removeClaudeHeroPortals()\n }\n }, [sessionId])\n\n useEffect(() => {\n setBranches(undefined)\n setSelected('')\n setWorktree(false)\n setMenuOpen(false)\n setProgressStage(undefined)\n setProgressError(undefined)\n setError(undefined)\n setTickets([])\n setBatchProgress(undefined)\n setBatchDone(undefined)\n setTicketMenuOpen(false)\n setTicketQuery('')\n setTicketResults(undefined)\n setTicketError(undefined)\n if (portal === undefined || path === undefined) return\n const controller = new AbortController()\n let timer: ReturnType<typeof setTimeout> | undefined\n const load = (remaining: number): void => {\n void loadRepositoryBranches(path, controller.signal).then((value) => {\n setBranches(value)\n setSelected(value.current ?? value.branches[0] ?? '')\n }, (reason: unknown) => {\n if (controller.signal.aborted) return\n // Keep showing the loading copy while retries remain; a transient host\n // hiccup must not strand the capsule with no way back.\n if (remaining > 0) {\n timer = setTimeout(() => { load(remaining - 1) }, BRANCH_LOAD_RETRY_MS)\n return\n }\n setError(reason instanceof Error ? reason.message : String(reason))\n })\n }\n load(BRANCH_LOAD_RETRIES)\n return () => {\n controller.abort()\n if (timer !== undefined) clearTimeout(timer)\n }\n }, [portal, path, sessionId])\n\n const availableBranches = branches === undefined ? [] : repositoryBranchOptions(branches)\n // A ticket alone routes the submission through prepare: without a worktree it\n // stays on the selected branch, with one it opens a worktree named after the key.\n const changed = branches !== undefined && selected.length > 0 && (worktree || tickets.length > 0 || selected !== branches.current)\n useEffect(() => {\n if (!changed || portal === undefined || busy) return\n const submit = (event: KeyboardEvent | MouseEvent): void => {\n // A ticket seeds the draft itself, so an empty composer may still submit.\n if (pendingRef.current || (input.draft.trim().length === 0 && tickets.length === 0)) return\n const intercept = event instanceof KeyboardEvent ? shouldInterceptKey(event) : shouldInterceptClick(event)\n if (!intercept) return\n event.preventDefault()\n event.stopPropagation()\n pendingRef.current = true\n setBusy(true)\n setProgressError(undefined)\n setError(undefined)\n setBatchDone(undefined)\n if (tickets.length > 1) {\n const total = tickets.length\n setBatchProgress({ ticketKey: tickets[0]?.key ?? '', index: 0, total, stage: 'inspecting' })\n setProgressStage('inspecting')\n void prepareMany(branches.root, selected, tickets, progress => {\n setBatchProgress(progress)\n setProgressStage(progress.stage)\n }).then(() => {\n setBatchDone(total)\n setBatchProgress(undefined)\n setProgressStage(undefined)\n setTickets([])\n }, (reason: unknown) => {\n setProgressError(reason instanceof Error ? reason.message : String(reason))\n }).finally(() => {\n pendingRef.current = false\n setBusy(false)\n })\n return\n }\n const ticket = tickets[0]\n setProgressStage(worktree ? 'inspecting' : undefined)\n void prepare(branches.root, selected, worktree, stage => { if (worktree) setProgressStage(stage) }, ticket).catch((reason: unknown) => {\n const message = reason instanceof Error ? reason.message : String(reason)\n if (worktree) setProgressError(message)\n else setError(message)\n }).finally(() => {\n pendingRef.current = false\n setBusy(false)\n })\n }\n document.addEventListener('keydown', submit, true)\n document.addEventListener('click', submit, true)\n return () => {\n document.removeEventListener('keydown', submit, true)\n document.removeEventListener('click', submit, true)\n }\n }, [branches, busy, changed, input.draft, portal, prepare, prepareMany, selected, tickets, worktree])\n\n // The ticket menu only exists once a Jira connection is configured.\n useEffect(() => {\n const controller = new AbortController()\n void loadJiraStatus(controller.signal).then(status => { setJiraConnected(status.connected) }, () => {\n if (!controller.signal.aborted) setJiraConnected(false)\n })\n return () => { controller.abort() }\n }, [sessionId])\n\n // Ticket search: debounced against the Jira route while the menu is open.\n useEffect(() => {\n if (!ticketMenuOpen) return\n const controller = new AbortController()\n const timer = setTimeout(() => {\n setTicketError(undefined)\n void searchJiraTickets(ticketQuery, controller.signal).then(setTicketResults, (reason: unknown) => {\n if (controller.signal.aborted) return\n setTicketResults([])\n setTicketError(reason instanceof JiraClientError && reason.code === 'not-connected'\n ? t('heroTicketNotConnected')\n : reason instanceof Error ? reason.message : t('heroTicketFailed'))\n })\n }, ticketQuery.length === 0 ? 0 : 300)\n return () => {\n clearTimeout(timer)\n controller.abort()\n }\n }, [t, ticketMenuOpen, ticketQuery])\n useEffect(() => {\n if (!ticketMenuOpen) {\n setTicketQuery('')\n setTicketResults(undefined)\n return\n }\n ticketSearchRef.current?.focus()\n const closeOnOutsidePointer = (event: PointerEvent): void => {\n if (event.target instanceof Node && ticketPickerRef.current?.contains(event.target) !== true) setTicketMenuOpen(false)\n }\n document.addEventListener('pointerdown', closeOnOutsidePointer)\n return () => { document.removeEventListener('pointerdown', closeOnOutsidePointer) }\n }, [ticketMenuOpen])\n // Toggling keeps the menu open so several tickets can be picked in one go.\n const toggleTicket = (next: JiraTicket): void => {\n setTickets(current => toggleTicketSelection(current, next))\n setError(undefined)\n setBatchDone(undefined)\n }\n const clearTickets = (): void => {\n setTickets([])\n setError(undefined)\n setTicketMenuOpen(false)\n }\n if (portal === undefined || path === undefined) return null\n return createPortal((\n <span style={styles.heroRepositoryControls}>\n {branches === undefined ? (\n <span style={styles.heroRepositoryStatus}>{error ?? t('repositoryBranchesLoading')}</span>\n ) : <>\n <ClaudeHeroRepositoryCapsule\n branches={availableBranches}\n selected={selected}\n worktree={worktree}\n busy={busy}\n menuOpen={menuOpen}\n worktreeLabel={t('repositoryWorktree')}\n searchPlaceholder={t('repositoryBranchSearch')}\n emptySearchLabel={t('repositoryBranchSearchEmpty')}\n worktreeLocked={tickets.length > 1}\n onMenuOpenChange={setMenuOpen}\n onSelect={(branch) => {\n setSelected(branch)\n setMenuOpen(false)\n setError(undefined)\n }}\n onWorktreeChange={(checked) => { setWorktree(checked); setError(undefined) }}\n />\n {!jiraConnected ? null : <span style={styles.heroRepositoryCapsule}>\n <span ref={ticketPickerRef} style={styles.heroBranchPicker}>\n <button\n type=\"button\"\n style={styles.heroBranchTrigger}\n aria-expanded={ticketMenuOpen}\n aria-label={t('heroTicketMenu')}\n title={t('heroTicketMenu')}\n disabled={busy}\n onClick={() => { setTicketMenuOpen(!ticketMenuOpen) }}\n >\n <TicketIcon />\n <span style={styles.heroBranchName}>\n {tickets.length === 0 ? t('heroTicket') : tickets.length === 1 ? tickets[0]?.key : t('heroTicketCount', { count: tickets.length })}\n </span>\n <IconChevronDownOutline14 />\n </button>\n {ticketMenuOpen ? (\n <span role=\"menu\" style={{ ...styles.heroBranchMenu, ...styles.heroTicketMenu }} onKeyDown={event => { if (event.key === 'Escape') { event.preventDefault(); setTicketMenuOpen(false) } }}>\n <label style={styles.heroBranchSearch}>\n <IconSearchOutline16 />\n <input\n ref={ticketSearchRef}\n type=\"search\"\n value={ticketQuery}\n placeholder={t('heroTicketSearch')}\n aria-label={t('heroTicketSearch')}\n style={styles.heroBranchSearchInput}\n onChange={event => { setTicketQuery(event.currentTarget.value) }}\n />\n </label>\n {tickets.length === 0 ? null : (\n <span style={styles.heroTicketChips}>\n {tickets.map(item => (\n <span key={item.key} style={styles.heroTicketChip}>\n {item.key}\n <button\n type=\"button\"\n style={styles.heroTicketChipRemove}\n aria-label={t('heroTicketRemove', { key: item.key })}\n onClick={() => { toggleTicket(item) }}\n >×</button>\n </span>\n ))}\n {tickets.length > 1\n ? <button type=\"button\" style={styles.heroTicketChipsClear} onClick={clearTickets}>{t('heroTicketNone')}</button>\n : null}\n </span>\n )}\n <span style={styles.heroBranchList}>\n {ticketError !== undefined\n ? <span style={styles.heroBranchEmpty}>{ticketError}</span>\n : ticketResults === undefined\n ? <span style={styles.heroBranchEmpty}>{t('heroTicketLoading')}</span>\n : ticketResults.length === 0 ? <span style={styles.heroBranchEmpty}>{t('heroTicketEmpty')}</span> : ticketResults.map(item => {\n const picked = tickets.some(entry => entry.key === item.key)\n return (\n <button key={item.key} type=\"button\" role=\"menuitemcheckbox\" aria-checked={picked} style={styles.heroBranchItem} onClick={() => { toggleTicket(item) }}>\n <span aria-hidden=\"true\" style={{ ...styles.heroTicketCheckbox, ...(picked ? styles.heroWorktreeCheckboxChecked : {}) }}>\n {picked ? (\n <svg viewBox=\"0 0 12 12\" style={styles.heroWorktreeCheckboxIcon}>\n <path d=\"m2.5 6.2 2.1 2.1 4.9-5\" fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"1.8\" />\n </svg>\n ) : null}\n </span>\n <span style={styles.heroTicketKey}>{item.key}</span>\n <span style={styles.heroBranchItemName}>{item.summary}</span>\n {item.status === undefined ? null : <span style={styles.heroTicketStatus}>{item.status}</span>}\n </button>\n )\n })}\n </span>\n </span>\n ) : null}\n </span>\n </span>}\n {error === undefined ? null : <span role=\"alert\" style={styles.heroRepositoryError}>{error}</span>}\n {batchDone === undefined ? null : <span role=\"status\" style={styles.heroRepositoryStatus}>{t('heroBatchStarted', { count: batchDone })}</span>}\n </>}\n {progressStage === undefined || (!busy && progressError === undefined) ? null : (\n <WorktreeProgressCard\n stage={progressStage}\n {...(progressError === undefined ? {} : { error: progressError })}\n {...(batchProgress === undefined ? {} : { context: `${batchProgress.ticketKey} · ${batchProgress.index + 1}/${batchProgress.total}` })}\n t={t}\n onDismiss={() => { setProgressStage(undefined); setProgressError(undefined); setBatchProgress(undefined) }}\n />\n )}\n </span>\n ), portal)\n}\n","import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type {\n ClientSessionContext,\n CommandClaim,\n InputTriggerCandidate,\n InputTriggerPick,\n InputTriggerSource,\n PickOutcome,\n} from '@deepseek-ai/dsh-client-ui-input-trigger/client'\nimport type { ClaudeCommandView } from '../command-bridge.ts'\nimport type { ClaudeProjectionStore } from './projection.ts'\n\nconst SOURCE_NAME = 'Claude Code'\n\nfunction commandsFor(store: ClaudeProjectionStore, session: ClientSessionContext): readonly ClaudeCommandView[] {\n const projection = store.source(session.sessionId).getSnapshot()\n return projection.owned ? projection.commands : []\n}\n\nfunction findCommand(\n store: ClaudeProjectionStore,\n session: ClientSessionContext,\n publicName: string,\n): ClaudeCommandView | undefined {\n return commandsFor(store, session).find(command => command.publicName === publicName)\n}\n\nfunction claimFor(ctx: ClientContext, session: ClientSessionContext, command: ClaudeCommandView): CommandClaim {\n return {\n token: `/${command.publicName} `,\n ...(command.hint === undefined ? {} : { hint: command.hint }),\n async submit(args) {\n return await submitClaudeCommand(ctx, session, command, args)\n },\n }\n}\n\nfunction pickCommand(ctx: ClientContext, store: ClaudeProjectionStore, pick: InputTriggerPick): PickOutcome {\n const command = findCommand(store, pick.session, pick.candidate.name)\n if (command === undefined) return undefined\n return { claim: claimFor(ctx, pick.session, command) }\n}\n\n/** Build a client-owned slash source. It never calls command.execute, so\n * Claude Skill submission creates only the ordinary user-message turn. */\nexport function createClaudeCommandSource(ctx: ClientContext, store: ClaudeProjectionStore): InputTriggerSource {\n return {\n trigger: '/',\n name: SOURCE_NAME,\n order: 10,\n async candidates(session, request): Promise<readonly InputTriggerCandidate[]> {\n if (request.position !== 'leading') return []\n const query = request.query.toLocaleLowerCase()\n return commandsFor(store, session)\n .filter(command => command.publicName.toLocaleLowerCase().includes(query))\n .map(command => ({\n name: command.publicName,\n description: command.description,\n ...(command.hint === undefined ? {} : { hint: command.hint }),\n }))\n },\n onPick(pick) {\n return pickCommand(ctx, store, pick)\n },\n matchSpace(session, token) {\n if (!token.startsWith('/')) return undefined\n const command = findCommand(store, session, token.slice(1))\n return command === undefined ? undefined : { claim: claimFor(ctx, session, command) }\n },\n async matchEnter(session, line) {\n if (!line.startsWith('/')) return undefined\n const separator = line.indexOf(' ')\n const publicName = line.slice(1, separator === -1 ? undefined : separator)\n const command = findCommand(store, session, publicName)\n return command === undefined ? undefined : { claim: claimFor(ctx, session, command) }\n },\n lexicon(session) {\n return commandsFor(store, session).map(command => command.publicName)\n },\n subscribeLexicon(session, listener) {\n return store.source(session.sessionId).subscribe(listener)\n },\n }\n}\n\n/** Execute through this plugin's injected services rebound to the target\n * session scope; the input-trigger action context does not inject them. */\nexport async function submitClaudeCommand(\n ctx: ClientContext,\n session: ClientSessionContext,\n command: ClaudeCommandView,\n args: string,\n): Promise<{ kind: 'success' | 'error'; text?: string }> {\n const sessionCtx = ctx.sessions.scope(session.sessionId)\n if (sessionCtx === undefined) return { kind: 'error', text: 'Claude session is unavailable' }\n const scoped = ctx.extend(sessionCtx)\n const line = `/${command.claudeName}${args.length === 0 ? '' : ` ${args}`}`\n try {\n await scoped.conversation.send(line)\n return { kind: 'success' }\n } catch (error) {\n return {\n kind: 'error',\n text: error instanceof Error ? error.message : String(error),\n }\n }\n}\n","const DETAILS_MIN_WIDTH = 300\n// Wide enough for an ~80-column diff line once the gutter (line number,\n// marker, comment button) is subtracted; still clamped to half the frame.\nconst DETAILS_DEFAULT_WIDTH = 720\nconst DETAILS_MAX_RATIO = 0.5\nconst DRAG_THRESHOLD = 4\n\nexport function clampDetailsWidth(width: number, frameWidth: number): number {\n const maximum = Math.max(DETAILS_MIN_WIDTH, Math.floor(frameWidth * DETAILS_MAX_RATIO))\n return Math.min(maximum, Math.max(DETAILS_MIN_WIDTH, Math.round(width)))\n}\n\nexport function defaultDetailsWidth(frameWidth: number): number {\n return clampDetailsWidth(DETAILS_DEFAULT_WIDTH, frameWidth)\n}\n\nfunction pixelValue(value: string): number | undefined {\n const parsed = Number.parseFloat(value)\n return Number.isFinite(parsed) ? parsed : undefined\n}\n\n/**\n * Extends the native Details drag handle for the plugin Diff panel without\n * depending on DSH's private layout store. The returned cleanup restores every\n * inline value owned by the native frame.\n */\nexport function enableExpandedDetailsResize(): () => void {\n if (typeof document === 'undefined' || typeof window === 'undefined') return () => undefined\n\n let frame: HTMLElement | undefined\n let handle: HTMLElement | undefined\n let width: number | undefined\n let dragStartX = 0\n let dragStartWidth = 0\n let pointerId: number | undefined\n let dragged = false\n let originalGrid = ''\n let originalHandleLeft = ''\n let frameWasDragging = false\n let handleWasDragging = false\n let resizeObserver: ResizeObserver | undefined\n let mutationObserver: MutationObserver | undefined\n let animationFrame: number | undefined\n\n const applyWidth = (): void => {\n if (frame === undefined || handle === undefined || width === undefined) return\n const frameWidth = frame.getBoundingClientRect().width\n if (frameWidth <= 0) return\n width = clampDetailsWidth(width, frameWidth)\n const tracks = getComputedStyle(frame).gridTemplateColumns.split(/\\s+/u)\n const sidebar = pixelValue(tracks[0] ?? '') ?? 0\n const grid = `${sidebar}px minmax(0, 1fr) ${width}px`\n const left = `${frameWidth - width}px`\n if (frame.style.gridTemplateColumns !== grid) frame.style.gridTemplateColumns = grid\n if (handle.style.left !== left) handle.style.left = left\n }\n\n const scheduleApply = (): void => {\n if (animationFrame !== undefined) return\n animationFrame = window.requestAnimationFrame(() => {\n animationFrame = undefined\n applyWidth()\n })\n }\n\n const finishDrag = (): void => {\n if (pointerId === undefined) return\n pointerId = undefined\n if (frame !== undefined && !frameWasDragging) frame.removeAttribute('data-dragging')\n if (handle !== undefined && !handleWasDragging) handle.removeAttribute('data-dragging')\n }\n\n const onPointerMove = (event: PointerEvent): void => {\n if (event.pointerId !== pointerId || frame === undefined) return\n const delta = event.clientX - dragStartX\n if (!dragged && Math.abs(delta) < DRAG_THRESHOLD) return\n dragged = true\n width = clampDetailsWidth(dragStartWidth - delta, frame.getBoundingClientRect().width)\n applyWidth()\n event.preventDefault()\n }\n\n const onPointerEnd = (event: PointerEvent): void => {\n if (event.pointerId !== pointerId) return\n finishDrag()\n }\n\n const onPointerDown = (event: PointerEvent): void => {\n const target = event.target\n if (!(target instanceof Element)) return\n const candidate = target.closest<HTMLElement>('[data-side=\"details\"]')\n const candidateFrame = candidate?.parentElement\n if (candidate === null || candidate === undefined || candidateFrame === null || candidateFrame === undefined) return\n const currentFrame = candidateFrame\n const currentHandle = candidate\n const detailsColumn = currentFrame.children.item(2)\n const measuredWidth = detailsColumn instanceof HTMLElement ? detailsColumn.getBoundingClientRect().width : 0\n const frameWidth = currentFrame.getBoundingClientRect().width\n if (measuredWidth <= 0 || frameWidth <= 0) return\n\n const firstDrag = frame === undefined\n frame = currentFrame\n handle = currentHandle\n width = clampDetailsWidth(width ?? measuredWidth, frameWidth)\n dragStartWidth = width\n dragStartX = event.clientX\n pointerId = event.pointerId\n dragged = false\n if (firstDrag) {\n originalGrid = currentFrame.style.gridTemplateColumns\n originalHandleLeft = currentHandle.style.left\n frameWasDragging = currentFrame.hasAttribute('data-dragging')\n handleWasDragging = currentHandle.hasAttribute('data-dragging')\n }\n currentFrame.setAttribute('data-dragging', '')\n currentHandle.setAttribute('data-dragging', 'true')\n\n if (firstDrag) {\n resizeObserver = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(scheduleApply)\n resizeObserver?.observe(currentFrame)\n mutationObserver = typeof MutationObserver === 'undefined' ? undefined : new MutationObserver(scheduleApply)\n mutationObserver?.observe(currentFrame, { attributes: true, attributeFilter: ['style'] })\n mutationObserver?.observe(currentHandle, { attributes: true, attributeFilter: ['style'] })\n }\n\n event.preventDefault()\n event.stopPropagation()\n event.stopImmediatePropagation()\n }\n\n const applyDefaultWidth = (): void => {\n const initialHandle = document.querySelector<HTMLElement>('[data-side=\"details\"]')\n const initialFrame = initialHandle?.parentElement\n if (initialHandle === null || initialHandle === undefined || initialFrame === null || initialFrame === undefined) return\n frame = initialFrame\n handle = initialHandle\n originalGrid = frame.style.gridTemplateColumns\n originalHandleLeft = handle.style.left\n frameWasDragging = frame.hasAttribute('data-dragging')\n handleWasDragging = handle.hasAttribute('data-dragging')\n width = defaultDetailsWidth(frame.getBoundingClientRect().width)\n resizeObserver = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(scheduleApply)\n resizeObserver?.observe(frame)\n mutationObserver = typeof MutationObserver === 'undefined' ? undefined : new MutationObserver(scheduleApply)\n mutationObserver?.observe(frame, { attributes: true, attributeFilter: ['style'] })\n mutationObserver?.observe(handle, { attributes: true, attributeFilter: ['style'] })\n applyWidth()\n }\n\n animationFrame = window.requestAnimationFrame(() => {\n animationFrame = undefined\n applyDefaultWidth()\n })\n document.addEventListener('pointerdown', onPointerDown, true)\n window.addEventListener('pointermove', onPointerMove, true)\n window.addEventListener('pointerup', onPointerEnd, true)\n window.addEventListener('pointercancel', onPointerEnd, true)\n\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true)\n window.removeEventListener('pointermove', onPointerMove, true)\n window.removeEventListener('pointerup', onPointerEnd, true)\n window.removeEventListener('pointercancel', onPointerEnd, true)\n resizeObserver?.disconnect()\n mutationObserver?.disconnect()\n if (animationFrame !== undefined) window.cancelAnimationFrame(animationFrame)\n finishDrag()\n if (frame !== undefined) frame.style.gridTemplateColumns = originalGrid\n if (handle !== undefined) handle.style.left = originalHandleLeft\n }\n}\n","export const zh = {\n nav: 'Claude Code',\n title: 'Claude Code',\n description: 'DSH 使用本机 Claude Code,并保留其 Agent Loop、工具、CLAUDE.md、Skills、Hooks 与 MCP 配置。',\n activity: 'Claude Code 活动',\n detail: '查看已脱敏详情',\n thinking: '思考',\n running: '运行中',\n failed: '失败',\n done: '完成',\n subagent: '子代理',\n usedTool: '使用了 1 个工具',\n usedTools: '使用了 {count} 个工具',\n toolInput: '输入',\n toolOutput: '输出',\n toolError: '错误',\n tokens: '{count} 个 token',\n doctor: '运行诊断',\n refreshing: '诊断中…',\n diagnostics: '运行状态',\n diagnosticsBody: '检查 Claude Code 可执行文件、登录状态、协议握手与当前进程配置。',\n diagnosticsLoading: '正在加载诊断信息…',\n executable: '可执行文件',\n version: '版本',\n authentication: '登录状态',\n handshake: '协议握手',\n processes: '活动进程',\n limits: '进程限制',\n processSummary: '共 {total} 个 · {active} 个活动中',\n limitSummary: '最多 {max} 个 · 空闲 {minutes} 分钟后回收',\n missing: '未找到',\n unknown: '未知',\n error: '诊断失败',\n security: '权限边界',\n securityBody: 'Claude 工具权限通过 DSH 审批界面决定;当前版本不宣称对 ~/.claude 与工作区之外路径提供内核级写入隔离。',\n globalSettings: 'Claude Code 设置',\n globalSettingsBody: '修改受支持的 Claude Code 与插件设置;其他字段会被保留。',\n globalSettingsLoading: '正在加载全局设置…',\n globalSettingsNewSession: '修改仅对新建 Claude 会话生效。',\n globalSettingsError: '全局设置保存失败',\n outputStyle: 'Output Style',\n worktreeBranchPrefix: 'Worktree 分支前缀',\n worktreeBranchPrefixEffect: '分支前缀修改会应用于之后自动创建的 Worktree 分支;显式指定的完整分支名不会被修改。',\n maxProcessesSetting: 'Claude 进程上限',\n idleTimeoutSetting: '闲置回收时长(分钟)',\n maxProcessesEffect: '进程上限在下次启动 Claude 进程时生效。留空或非法值会被拒绝。',\n idleTimeoutEffect: '闲置回收时长在下一次回合结束后生效。留空或非法值会被拒绝。',\n settingHint: '查看说明',\n pluginUpdate: '插件更新',\n pluginUpdateBody: '检查 npm 上的新版本。只有可唯一识别的 npm 安装才能直接更新;本地开发链接不会被替换。',\n updateNotChecked: '尚未检查更新。',\n installedVersion: '已安装版本',\n latestVersion: '最新版本',\n installSource: '安装来源',\n updateStatus: '更新状态',\n checkUpdates: '检查更新',\n checkingUpdates: '检查中…',\n updatePlugin: '更新',\n updatingPlugin: '更新中…',\n updateError: '更新失败',\n restartRequired: '需要重启 DSH Desktop 才能加载更新后的插件。',\n updateSource_registry: 'npm',\n updateSource_link: '本地开发链接',\n updateSource_unsupported: '不支持的来源',\n updateSource_unknown: '未知',\n updateState_current: '已是最新版本',\n updateState_available: '有可用更新',\n updateState_linked: '由链接的源码目录提供更新',\n updateState_unsupported: '此安装来源不支持自动更新',\n updateState_unavailable: '无法安全识别当前 DSH profile',\n updateState_error: '检查失败',\n tasks: '任务',\n tasksPanel: '后台任务',\n tasksPanelTurn: '本次执行的任务',\n tasksTurnNumber: '第 {turn} 轮',\n tasksEmpty: '当前没有子代理或后台任务',\n tasksOpen: '查看后台任务',\n tasksClose: '关闭任务面板',\n tasksRunning: '运行中',\n tasksNoneRunning: '当前没有运行中的任务',\n tasksSettled: '已结束',\n tasksClear: '清除',\n tasksViewActivity: '查看活动',\n tasksHideActivity: '收起活动',\n tasksRunningCount: '{count} 个运行中任务',\n planUsage: '账号额度',\n planUsageBody: '当前 Claude 订阅的用量窗口,来自 Claude Code 的 /usage 数据。会话空闲时自动刷新,也可随时手动刷新。',\n planUsageLoading: '读取中…',\n planUsageRefresh: '刷新额度',\n planUsageRefreshing: '刷新中…',\n planUsageUnavailable: '此账号没有订阅额度(API key、Bedrock、Vertex 等不受套餐限流)。',\n planUsageNever: '尚未获取额度数据,运行一次对话或点击刷新。',\n planUsageError: '额度读取失败',\n planUsageSubscription: '订阅',\n planUsageUpdated: '更新于 {age}前',\n planUsageResets: '{age}后重置',\n planUsageUsed: '已用 {percent}%',\n planWindow_five_hour: '5 小时',\n planWindow_seven_day: '全部模型 · 每周',\n planWindow_seven_day_opus: 'Opus · 每周',\n planWindow_seven_day_sonnet: 'Sonnet · 每周',\n tasksTurnRunning: '{count} 个任务执行中',\n tasksTurnCompleted: '{count} 个任务已完成',\n tasksTurnFailed: '{failed} 个任务失败,{completed} 个已完成',\n tasksToolUses: '{count} 次工具调用',\n tasksCompleted: '已完成',\n tasksFailed: '失败',\n tasksStopped: '已停止',\n tasksKilled: '已终止',\n tasksBackground: '后台',\n tasksLastTool: '最近工具 {tool}',\n repositoryOpen: '查看仓库与 PR 详情',\n repositoryPanel: '仓库状态',\n repositoryClose: '关闭仓库面板',\n repositorySection: '仓库',\n repositoryStatus: '状态',\n repositoryAvailable: '可用',\n repositoryUnavailable: '仓库状态不可用',\n repositoryNotGit: '非 Git 仓库',\n repositoryCwd: '会话目录',\n repositoryRoot: '仓库根目录',\n repositoryBranch: '分支',\n repositoryBranchSearch: '检索分支',\n repositoryBranchSearchEmpty: '没有匹配的分支',\n repositoryBranchesLoading: '正在加载分支…',\n repositoryProgressTitle: '正在创建 Worktree',\n repositoryProgressFailed: 'Worktree 创建失败',\n repositoryProgressDismiss: '关闭 Worktree 进度',\n repositoryProgress_inspecting: '检查仓库和分支',\n repositoryProgress_fetching: '刷新远程引用',\n 'repositoryProgress_creating-worktree': '创建分支和 Worktree',\n 'repositoryProgress_saving-worktree': '保存 Worktree 状态',\n 'repositoryProgress_switching-branch': '切换本地分支',\n 'repositoryProgress_creating-workspace': '创建 DSH Workspace',\n 'repositoryProgress_starting-session': '启动 Claude 会话',\n 'repositoryProgress_transferring-draft': '转移消息和附件',\n repositoryProgress_submitting: '提交消息',\n repositorySessionUnavailable: '无法准备目标会话。',\n repositoryDraftTransferFailed: '无法将草稿附件转移到 worktree 会话。',\n repositoryDetached: 'Detached HEAD',\n repositoryUnknownBranch: '未知分支',\n repositoryWorktree: 'Worktree',\n repositoryWorktreeLabel: 'Git worktree',\n repositoryChanges: '改动',\n repositoryModified: '有修改',\n repositoryClean: '干净',\n repositoryLocal: '本地仓库',\n repositoryPullRequest: 'Pull Request',\n repositoryNoPr: '当前分支没有关联 PR',\n repositoryPr: 'PR #{number}',\n repositoryPrDraft: '草稿 PR #{number}',\n repositoryPrState: 'PR 状态',\n repositoryDraft: '草稿',\n repositoryState_open: '开放',\n repositoryState_closed: '已关闭',\n repositoryState_merged: '已合并',\n repositoryMergedAgo: '{age}前',\n repositoryChecks: '检查',\n repositoryChecks_passing: '检查通过',\n repositoryChecks_pending: '检查进行中',\n repositoryChecks_failing: '检查失败',\n repositoryChecks_none: '无检查',\n repositoryReview: '评审',\n repositoryReview_approved: '已批准',\n 'repositoryReview_changes-requested': '要求修改',\n 'repositoryReview_review-required': '等待评审',\n repositoryReview_none: '无评审状态',\n repositoryMergeState: '合并状态',\n repositoryOpenPr: '在浏览器中打开 PR #{number}',\n yes: '是',\n no: '否',\n diffOpen: '查看分支改动',\n diffClose: '关闭 Diff 面板',\n diffWorkingTree: '分支改动',\n diffFiles: '{count} 个已修改文件',\n diffFilesShort: '{count} 个文件',\n diffTruncated: 'Diff 超出安全显示上限。请在终端中查看完整内容。',\n diffEmpty: '没有可显示的 tracked 文件改动',\n diffMaximize: '最大化 Diff 面板',\n diffRestore: '还原 Diff 面板',\n diffCommit: 'Commit',\n diffCommitMenu: '打开提交操作菜单',\n diffCommitPush: 'Commit & Push…',\n diffPush: 'Push',\n diffCreatePr: 'Create PR…',\n diffConfirmDescription: '确认仓库快照和将要执行的 Git 操作。',\n diffPushDescription: '将本地未推送的 commit 推送到远端分支。',\n diffPushAhead: '{count} 个未推送的 commit',\n diffPushCompleted: '已推送 commit {commit}',\n diffGeneratingMessage: '正在读取仓库并生成 commit message…',\n diffActionFailed: '仓库操作失败。',\n diffIncludeUnstaged: '包含 unstaged 和 untracked 改动',\n diffCommitMessage: 'Commit message',\n diffStaged: 'Staged',\n diffUnstaged: 'Unstaged',\n diffStagedUnstaged: 'Staged + unstaged',\n diffUntracked: 'Untracked',\n diffPrTitle: 'PR title',\n diffPrBase: 'Base branch',\n diffPrBaseDefault: '使用远端默认分支',\n diffPrDescription: 'PR description(仅 Summary 与 Changes)',\n diffPrDraft: '创建为 Draft PR',\n diffCancel: '取消',\n diffConfirm: '确认',\n diffSubmitting: '执行中…',\n diffDone: '完成',\n diffCommitCompleted: '已创建 commit {commit}',\n diffCommitPreserved: '本地 commit {commit} 已保留。',\n diffOpenPr: '打开 Pull Request',\n diffMergePr: 'Merge',\n repositoryMergeMenu: '打开 PR 合并选项',\n diffMerge_merge: '合并提交 (merge)',\n diffMerge_squash: 'Squash 合并',\n diffMerge_rebase: 'Rebase 合并',\n diffMergeDescription: '使用所选方式合并当前分支的 Pull Request。',\n diffMergeCompleted: '已合并 PR #{number}',\n diffUpdateBranch: 'Update branch…',\n repositoryUpdateBranch: 'Update branch',\n diffUpdateBranchDescription: '用 origin/{base} 更新当前分支并推送;出现冲突时可交给 Claude 解决。',\n diffUpdateBranch_rebase: 'Rebase 到 origin/{base}(改写历史,以 --force-with-lease 推送)',\n diffUpdateBranch_merge: '将 origin/{base} 合并进当前分支',\n diffUpdateBranchBehind: '落后 origin/{base} {count} 个 commit',\n diffUpdateBranchCompleted: '已更新并推送 commit {commit}',\n diffUpdateBranchConflicts: '更新产生冲突,以下文件需要解决:',\n diffUpdateBranchResolve: '让 Claude 解决冲突',\n repositoryChecksOpen: '查看失败的检查',\n checksCardTitle: '失败的检查',\n checksCardLoading: '正在读取检查详情…',\n checksCardEmpty: '未能读取失败详情',\n checksCardFix: '让 Claude 修复',\n prCommentsButton: 'GitHub 评论 ({count})',\n prCommentsSend: '让 Claude 处理 GitHub 上的 PR 评论',\n autoFixLabel: 'Auto fix',\n autoFixTitle: '自动监听这个 PR 的 review 评论与 CI 失败,交给 Claude 修复并推送,直到全部通过;取消勾选即停止。',\n queueCount: '{n} 条排队消息',\n queueEdit: '编辑',\n queueEditUnsupported: '包含非文本内容,无法编辑',\n queueSave: '保存',\n queueCancelEdit: '取消编辑',\n queueRemove: '删除',\n queueSteer: '插入当前回合',\n queueSteerUnavailable: '没有正在运行的回合',\n queueEditFailed: '排队消息编辑失败。',\n queueRemoveFailed: '排队消息删除失败。',\n queueSteerFailed: '排队消息插入失败。',\n heroTicket: 'Ticket',\n heroTicketMenu: '选择 Jira ticket',\n heroTicketSearch: '搜索 ticket 或输入 key…',\n heroTicketLoading: '搜索中…',\n heroTicketEmpty: '没有匹配的 ticket',\n heroTicketNone: '清除已选 ticket',\n heroTicketRemove: '移除 {key}',\n heroTicketCount: '{count} 个 ticket',\n heroBatchStarted: '已为 {count} 个 ticket 各自创建 Worktree 会话并开工',\n heroTicketNotConnected: '请先在 Settings 中连接 Jira',\n heroTicketFailed: 'Ticket 搜索失败',\n jiraTitle: 'Jira',\n jiraBody: '连接 Jira Cloud 后,新会话可以直接从 ticket 开工:分支按 ticket key 命名,输入框预填 ticket 简报,worktree 创建后自动把 ticket 分配给你。',\n jiraSite: '站点地址',\n jiraSitePlaceholder: 'https://your-team.atlassian.net',\n jiraEmail: '账号邮箱',\n jiraToken: 'API Token',\n jiraTokenHelp: '在 Atlassian 创建 API Token',\n jiraConnect: '连接',\n jiraConnecting: '正在验证…',\n jiraDisconnect: '断开连接',\n jiraConnected: '已连接',\n jiraLoading: '正在读取 Jira 状态…',\n jiraError: 'Jira 操作失败',\n cleanupButton: 'Clean up',\n cleanupTitle: '清理已合并分支',\n cleanupDescription: '删除 worktree 与本地分支并移除对应 workspace;普通 checkout 则切回 base 分支并删除已合并分支。',\n cleanupCompleted: '已清理 {branch}',\n overviewOpen: '打开 Claude 会话看板',\n overviewTitle: '会话看板',\n overviewBody: '所有 Claude 会话的运行状态、分支与 PR',\n overviewEmpty: '没有正在进行的 Claude 会话',\n overviewNoPr: '无 PR',\n overviewRunning: '运行中',\n overviewNeedsPermission: '等待权限确认',\n overviewNeedsAnswer: '等待回答',\n overviewContextUsage: '上下文 {percentage}%',\n overviewAutoFix: 'Auto fix 已开启',\n overviewLoading: '读取中…',\n askToolbar: '选中文本操作',\n askTooltip: '针对选中内容追问',\n copyTooltip: '复制',\n askCopied: '已复制',\n askPlaceholder: '针对选中内容提问…',\n askSubmit: '发送',\n askStarting: '正在启动 Claude…',\n askThinking: '思考中…',\n askThinkingLive: '思考中 ·',\n askThinkingLabel: 'Think ·',\n askCopyAnswer: '复制回答',\n askSendToChat: '转发到对话',\n askClose: '关闭',\n askFailed: '提问失败',\n reviewCommentAdd: '添加行评论',\n reviewCommentPlaceholder: '请求更改',\n reviewCommentSubmit: '注释',\n reviewCommentCancel: '取消',\n reviewCommentRemove: '删除评论',\n reviewCommentFailed: '评论操作失败。',\n reviewCommentsClear: '清除全部评论',\n reviewCommentsSend: '发送评论',\n reviewCommentsSendDraft: '请处理以上代码评论。',\n reviewCommentOldSide: '旧代码第 {line} 行',\n reviewCommentNewSide: '第 {line} 行',\n reviewCommentOldRange: '旧代码第 {start}–{end} 行',\n reviewCommentNewRange: '第 {start}–{end} 行',\n diffUnmodifiedLines: '{count} 行未修改',\n diffUnmodifiedTail: '文件末尾之前还有未修改的行',\n diffExpandUp: '向上展开',\n diffExpandDown: '向下展开',\n} as const\n\nexport const en = {\n nav: 'Claude Code',\n title: 'Claude Code',\n description: 'DSH uses the local Claude Code and preserves its agent loop, tools, CLAUDE.md, Skills, Hooks, and MCP configuration.',\n activity: 'Claude Code activity',\n detail: 'Show redacted detail',\n thinking: 'Think',\n running: 'Running',\n failed: 'Failed',\n done: 'Done',\n subagent: 'Subagent',\n usedTool: 'Used 1 tool',\n usedTools: 'Used {count} tools',\n toolInput: 'Input',\n toolOutput: 'Output',\n toolError: 'Error',\n tokens: '{count} tokens',\n doctor: 'Run Doctor',\n refreshing: 'Running Doctor…',\n diagnostics: 'Runtime status',\n diagnosticsBody: 'Check the Claude Code executable, authentication, protocol handshake, and current process configuration.',\n diagnosticsLoading: 'Loading diagnostics…',\n executable: 'Executable',\n version: 'Version',\n authentication: 'Authentication',\n handshake: 'Protocol handshake',\n processes: 'Live processes',\n limits: 'Process limits',\n processSummary: '{total} total · {active} active',\n limitSummary: '{max} max · {minutes} min idle',\n missing: 'Not found',\n unknown: 'Unknown',\n error: 'Doctor failed',\n security: 'Permission boundary',\n securityBody: 'Claude tool permissions are decided through the DSH approval UI. This version does not claim kernel-level write isolation for ~/.claude or paths outside the workspace.',\n globalSettings: 'Claude Code settings',\n globalSettingsBody: 'Modify supported Claude Code and plugin settings while preserving every other field.',\n globalSettingsLoading: 'Loading global settings…',\n globalSettingsNewSession: 'Changes apply only to new Claude sessions.',\n globalSettingsError: 'Global settings save failed',\n outputStyle: 'Output Style',\n worktreeBranchPrefix: 'Worktree branch prefix',\n worktreeBranchPrefixEffect: 'Prefix changes apply to subsequently generated Worktree branches. Explicit full branch names remain unchanged.',\n maxProcessesSetting: 'Claude process limit',\n idleTimeoutSetting: 'Idle timeout (minutes)',\n maxProcessesEffect: 'The process limit applies when the next Claude process is admitted. Blank or invalid values are rejected.',\n idleTimeoutEffect: 'The idle timeout applies after the next completed turn. Blank or invalid values are rejected.',\n settingHint: 'Show details',\n pluginUpdate: 'Plugin updates',\n pluginUpdateBody: 'Check npm for new releases. Only a uniquely identified npm installation can update in place; local development links are never replaced.',\n updateNotChecked: 'Updates have not been checked yet.',\n installedVersion: 'Installed version',\n latestVersion: 'Latest version',\n installSource: 'Installation source',\n updateStatus: 'Update status',\n checkUpdates: 'Check for updates',\n checkingUpdates: 'Checking…',\n updatePlugin: 'Update',\n updatingPlugin: 'Updating…',\n updateError: 'Update failed',\n restartRequired: 'Restart DSH Desktop to load the updated plugin.',\n updateSource_registry: 'npm',\n updateSource_link: 'Local development link',\n updateSource_unsupported: 'Unsupported source',\n updateSource_unknown: 'Unknown',\n updateState_current: 'Up to date',\n updateState_available: 'Update available',\n updateState_linked: 'Updated from the linked source checkout',\n updateState_unsupported: 'This installation source cannot update automatically',\n updateState_unavailable: 'The active DSH profile cannot be identified safely',\n updateState_error: 'Check failed',\n tasks: 'Tasks',\n tasksPanel: 'Background tasks',\n tasksPanelTurn: 'Tasks for this run',\n tasksTurnNumber: 'Turn {turn}',\n tasksEmpty: 'No subagents or background tasks',\n tasksOpen: 'Show background tasks',\n tasksClose: 'Close tasks panel',\n tasksRunning: 'Running',\n tasksNoneRunning: 'No tasks are running',\n tasksSettled: 'Finished',\n tasksClear: 'Clear',\n tasksViewActivity: 'View activity',\n tasksHideActivity: 'Hide activity',\n tasksRunningCount: '{count} running task(s)',\n planUsage: 'Plan usage',\n planUsageBody: \"Utilization windows for the signed-in Claude subscription, from Claude Code's /usage data. Refreshes whenever a session goes idle, and on demand.\",\n planUsageLoading: 'Loading…',\n planUsageRefresh: 'Refresh usage',\n planUsageRefreshing: 'Refreshing…',\n planUsageUnavailable: 'This account has no plan limits (API key, Bedrock, and Vertex sessions are not rate limited by a subscription).',\n planUsageNever: 'No usage data yet — run a turn or refresh.',\n planUsageError: 'Usage lookup failed',\n planUsageSubscription: 'Subscription',\n planUsageUpdated: 'Updated {age} ago',\n planUsageResets: 'Resets in {age}',\n planUsageUsed: '{percent}% used',\n planWindow_five_hour: '5-hour',\n planWindow_seven_day: 'All models · weekly',\n planWindow_seven_day_opus: 'Opus · weekly',\n planWindow_seven_day_sonnet: 'Sonnet · weekly',\n tasksTurnRunning: '{count} task(s) running',\n tasksTurnCompleted: '{count} task(s) completed',\n tasksTurnFailed: '{failed} failed, {completed} completed',\n tasksToolUses: '{count} tool use(s)',\n tasksCompleted: 'Completed',\n tasksFailed: 'Failed',\n tasksStopped: 'Stopped',\n tasksKilled: 'Killed',\n tasksBackground: 'Background',\n tasksLastTool: 'Last tool {tool}',\n repositoryOpen: 'Show repository and pull request details',\n repositoryPanel: 'Repository status',\n repositoryClose: 'Close repository panel',\n repositorySection: 'Repository',\n repositoryStatus: 'Status',\n repositoryAvailable: 'Available',\n repositoryUnavailable: 'Repository status unavailable',\n repositoryNotGit: 'Not a Git repository',\n repositoryCwd: 'Session directory',\n repositoryRoot: 'Repository root',\n repositoryBranch: 'Branch',\n repositoryBranchSearch: 'Search branches',\n repositoryBranchSearchEmpty: 'No matching branches',\n repositoryBranchesLoading: 'Loading branches…',\n repositoryProgressTitle: 'Creating Worktree',\n repositoryProgressFailed: 'Worktree creation failed',\n repositoryProgressDismiss: 'Dismiss Worktree progress',\n repositoryProgress_inspecting: 'Checking repository and branch',\n repositoryProgress_fetching: 'Refreshing remote references',\n 'repositoryProgress_creating-worktree': 'Creating branch and Worktree',\n 'repositoryProgress_saving-worktree': 'Saving Worktree state',\n 'repositoryProgress_switching-branch': 'Switching local branch',\n 'repositoryProgress_creating-workspace': 'Creating DSH Workspace',\n 'repositoryProgress_starting-session': 'Starting Claude session',\n 'repositoryProgress_transferring-draft': 'Transferring message and attachments',\n repositoryProgress_submitting: 'Submitting message',\n repositorySessionUnavailable: 'The target session could not be prepared.',\n repositoryDraftTransferFailed: 'Draft attachments could not be moved to the worktree session.',\n repositoryDetached: 'Detached HEAD',\n repositoryUnknownBranch: 'Unknown branch',\n repositoryWorktree: 'Worktree',\n repositoryWorktreeLabel: 'Git worktree',\n repositoryChanges: 'Changes',\n repositoryModified: 'Modified',\n repositoryClean: 'Clean',\n repositoryLocal: 'Local repository',\n repositoryPullRequest: 'Pull request',\n repositoryNoPr: 'No pull request for this branch',\n repositoryPr: 'PR #{number}',\n repositoryPrDraft: 'Draft PR #{number}',\n repositoryPrState: 'PR state',\n repositoryDraft: 'Draft',\n repositoryState_open: 'Open',\n repositoryState_closed: 'Closed',\n repositoryState_merged: 'Merged',\n repositoryMergedAgo: '{age} ago',\n repositoryChecks: 'Checks',\n repositoryChecks_passing: 'Checks passing',\n repositoryChecks_pending: 'Checks pending',\n repositoryChecks_failing: 'Checks failing',\n repositoryChecks_none: 'No checks',\n repositoryReview: 'Review',\n repositoryReview_approved: 'Approved',\n 'repositoryReview_changes-requested': 'Changes requested',\n 'repositoryReview_review-required': 'Review required',\n repositoryReview_none: 'No review status',\n repositoryMergeState: 'Merge state',\n repositoryOpenPr: 'Open PR #{number} in browser',\n yes: 'Yes',\n no: 'No',\n diffOpen: 'View branch changes',\n diffClose: 'Close diff panel',\n diffWorkingTree: 'Branch changes',\n diffFiles: '{count} modified file(s)',\n diffFilesShort: '{count} files',\n diffTruncated: 'The diff exceeds the safe display limit. Use the terminal to inspect the complete content.',\n diffEmpty: 'No tracked file changes to display',\n diffMaximize: 'Maximize diff panel',\n diffRestore: 'Restore diff panel',\n diffCommit: 'Commit',\n diffCommitMenu: 'Open commit actions',\n diffCommitPush: 'Commit & Push…',\n diffPush: 'Push',\n diffCreatePr: 'Create PR…',\n diffConfirmDescription: 'Confirm the repository snapshot and Git operation.',\n diffPushDescription: 'Push local commits to the remote branch.',\n diffPushAhead: '{count} unpushed commit(s)',\n diffPushCompleted: 'Pushed commit {commit}',\n diffGeneratingMessage: 'Reading the repository and generating a commit message…',\n diffActionFailed: 'Repository action failed.',\n diffIncludeUnstaged: 'Include unstaged and untracked changes',\n diffCommitMessage: 'Commit message',\n diffStaged: 'Staged',\n diffUnstaged: 'Unstaged',\n diffStagedUnstaged: 'Staged + unstaged',\n diffUntracked: 'Untracked',\n diffPrTitle: 'PR title',\n diffPrBase: 'Base branch',\n diffPrBaseDefault: 'Use the remote default branch',\n diffPrDescription: 'PR description (Summary and Changes only)',\n diffPrDraft: 'Create as a Draft PR',\n diffCancel: 'Cancel',\n diffConfirm: 'Confirm',\n diffSubmitting: 'Working…',\n diffDone: 'Done',\n diffCommitCompleted: 'Created commit {commit}',\n diffCommitPreserved: 'Local commit {commit} was preserved.',\n diffOpenPr: 'Open pull request',\n diffMergePr: 'Merge',\n repositoryMergeMenu: 'Open merge options',\n diffMerge_merge: 'Create a merge commit',\n diffMerge_squash: 'Squash and merge',\n diffMerge_rebase: 'Rebase and merge',\n diffMergeDescription: 'Merge the pull request for this branch with the selected method.',\n diffMergeCompleted: 'Merged PR #{number}',\n diffUpdateBranch: 'Update branch…',\n repositoryUpdateBranch: 'Update branch',\n diffUpdateBranchDescription: 'Update the current branch from origin/{base} and push; hand any conflicts to Claude.',\n diffUpdateBranch_rebase: 'Rebase onto origin/{base} (rewrites history, pushes with --force-with-lease)',\n diffUpdateBranch_merge: 'Merge origin/{base} into the current branch',\n diffUpdateBranchBehind: '{count} commit(s) behind origin/{base}',\n diffUpdateBranchCompleted: 'Updated and pushed commit {commit}',\n diffUpdateBranchConflicts: 'The update left conflicts in these files:',\n diffUpdateBranchResolve: 'Have Claude resolve the conflicts',\n repositoryChecksOpen: 'Show failing checks',\n checksCardTitle: 'Failing checks',\n checksCardLoading: 'Loading check details…',\n checksCardEmpty: 'No failure details available',\n checksCardFix: 'Have Claude fix these',\n prCommentsButton: 'GitHub comments ({count})',\n prCommentsSend: 'Have Claude address the GitHub pull request comments',\n autoFixLabel: 'Auto fix',\n autoFixTitle: 'Watch this pull request for review comments and failing checks, hand them to Claude to fix and push until everything passes; uncheck to stop.',\n queueCount: '{n} queued messages',\n queueEdit: 'Edit',\n queueEditUnsupported: 'Contains non-text content and cannot be edited',\n queueSave: 'Save',\n queueCancelEdit: 'Cancel edit',\n queueRemove: 'Remove',\n queueSteer: 'Steer into the running turn',\n queueSteerUnavailable: 'No running turn to steer into',\n queueEditFailed: 'The queued message could not be edited.',\n queueRemoveFailed: 'The queued message could not be removed.',\n queueSteerFailed: 'The queued message could not be steered.',\n heroTicket: 'Ticket',\n heroTicketMenu: 'Pick a Jira ticket',\n heroTicketSearch: 'Search tickets or enter a key…',\n heroTicketLoading: 'Searching…',\n heroTicketEmpty: 'No matching tickets',\n heroTicketNone: 'Clear selected tickets',\n heroTicketRemove: 'Remove {key}',\n heroTicketCount: '{count} tickets',\n heroBatchStarted: 'Kicked off {count} tickets, each in its own worktree session',\n heroTicketNotConnected: 'Connect Jira in Settings first',\n heroTicketFailed: 'Ticket search failed',\n jiraTitle: 'Jira',\n jiraBody: 'Connect Jira Cloud to start new sessions from a ticket: the branch is named after the ticket key, the composer is seeded with the ticket brief, and the ticket is assigned to you once the worktree exists.',\n jiraSite: 'Site URL',\n jiraSitePlaceholder: 'https://your-team.atlassian.net',\n jiraEmail: 'Account email',\n jiraToken: 'API token',\n jiraTokenHelp: 'Create an API token at Atlassian',\n jiraConnect: 'Connect',\n jiraConnecting: 'Verifying…',\n jiraDisconnect: 'Disconnect',\n jiraConnected: 'Connected',\n jiraLoading: 'Loading Jira status…',\n jiraError: 'Jira request failed',\n cleanupButton: 'Clean up',\n cleanupTitle: 'Clean up merged branch',\n cleanupDescription: 'Remove the worktree and local branch and delete the workspace; a plain checkout switches back to the base branch and deletes the merged branch.',\n cleanupCompleted: 'Cleaned up {branch}',\n overviewOpen: 'Open the Claude session board',\n overviewTitle: 'Session board',\n overviewBody: 'Run state, branch, and pull request across Claude sessions',\n overviewEmpty: 'No active Claude sessions',\n overviewNoPr: 'No PR',\n overviewRunning: 'Running',\n overviewNeedsPermission: 'Awaiting approval',\n overviewNeedsAnswer: 'Awaiting answer',\n overviewContextUsage: 'Context {percentage}%',\n overviewAutoFix: 'Auto fix on',\n overviewLoading: 'Loading…',\n askToolbar: 'Selection actions',\n askTooltip: 'Ask about this',\n copyTooltip: 'Copy',\n askCopied: 'Copied',\n askPlaceholder: 'Ask about the selected text…',\n askSubmit: 'Ask',\n askStarting: 'Starting Claude…',\n askThinking: 'Thinking…',\n askThinkingLive: 'Thinking ·',\n askThinkingLabel: 'Think ·',\n askCopyAnswer: 'Copy answer',\n askSendToChat: 'Send to chat',\n askClose: 'Close',\n askFailed: 'The question could not be answered',\n reviewCommentAdd: 'Add line comment',\n reviewCommentPlaceholder: 'Request changes',\n reviewCommentSubmit: 'Comment',\n reviewCommentCancel: 'Cancel',\n reviewCommentRemove: 'Remove comment',\n reviewCommentFailed: 'The comment could not be saved.',\n reviewCommentsClear: 'Clear all comments',\n reviewCommentsSend: 'Send comments',\n reviewCommentsSendDraft: 'Please address the attached review comments.',\n reviewCommentOldSide: 'Old line {line}',\n reviewCommentNewSide: 'Line {line}',\n reviewCommentOldRange: 'Old lines {start}–{end}',\n reviewCommentNewRange: 'Lines {start}–{end}',\n diffUnmodifiedLines: '{count} unmodified lines',\n diffUnmodifiedTail: 'More unmodified lines below',\n diffExpandUp: 'Expand up',\n diffExpandDown: 'Expand down',\n} as const\n\nexport type ClaudeCodeSettingsKey = keyof typeof en\n","import { useSyncExternalStore } from 'react'\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-client-connection/client'\nimport type { ClientContext, ISessions, IWorkspaces, SessionId } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { IConversation } from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-input-trigger/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport { claudeActiveTasksDefinition, claudeActivityStepDefinition, claudeTurnDefinition, selectClaudeTurn } from './conversation-sidecar.ts'\nimport { ClaudeActivityTail, type ClaudeActivityTailInjected } from './ClaudeActivityTail.tsx'\nimport { ClaudeActiveTasksNode } from './ClaudeActiveTasksNode.tsx'\nimport { ClaudeActivityNode } from './ClaudeActivityNode.tsx'\nimport { ClaudeCodeSettings, type ClaudeCodeSettingsInjected } from './ClaudeCodeSettings.tsx'\nimport { ClaudeTasksPanel, type ClaudeTasksPanelInjected } from './ClaudeTasksPanel.tsx'\nimport { ClaudeRepositoryStatus, type ClaudeRepositoryStatusInjected } from './ClaudeRepositoryStatus.tsx'\nimport { ClaudeReviewComments, type ClaudeReviewCommentsInjected } from './ClaudeReviewComments.tsx'\nimport { ClaudeDiffPanel, type ClaudeDiffPanelInjected } from './ClaudeDiffPanel.tsx'\nimport { ClaudeDiffOverlay } from './ClaudeDiffOverlay.tsx'\nimport { ClaudeQueueDock, type ClaudeQueueDockInjected } from './ClaudeQueueDock.tsx'\nimport { ClaudePullRequestsPanel, type ClaudePullRequestsPanelInjected } from './ClaudePullRequestsPanel.tsx'\nimport { ClaudeSelectionAsk } from './ClaudeSelectionAsk.tsx'\nimport { ClaudeHeroRepositoryControls, type ClaudeHeroRepositoryControlsInjected } from './ClaudeHeroRepositoryControls.tsx'\nimport { ClaudeProjectionStore, type ClaudeProjectionSource } from './projection.ts'\nimport { createClaudeCommandSource } from './claude-command-source.ts'\nimport { enableExpandedDetailsResize } from './details-resize.ts'\nimport { bindRepositoryLease, loadRepositoryStatusFor, prepareRepository, type RepositoryPreparationStage } from './repository-setup-api.ts'\nimport { assignJiraTicket, ticketContext, ticketPrompt } from './jira-api.ts'\nimport { en, zh, type ClaudeCodeSettingsKey } from './locales.ts'\n\n/** The right-side details column slot declared by dsh-client-ui-layout\n * (kind 'single', scope 'session'). Merged locally because this package does\n * not depend on the layout package's client types. */\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface SlotMap {\n details: { kind: 'single'; scope: 'session' }\n 'shell.overlay': { kind: 'list'; scope: 'root' }\n }\n}\n\ninterface LayoutFace {\n openDetails(): void\n closeDetails(): void\n}\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n 'settings.claude-code': ClaudeCodeSettingsKey\n }\n}\n\nfunction MaximizedDiff({\n source, t, sessionId, closeDetails, restore, submitPrompt,\n}: {\n source: ClaudeProjectionSource\n t: ClaudeDiffPanelInjected['t']\n sessionId: string\n closeDetails: () => void\n restore: () => void\n submitPrompt?: (draft: string, mode?: 'append' | 'idle') => boolean\n}) {\n const snapshot = useSyncExternalStore(source.subscribe, source.getSnapshot, source.getSnapshot)\n const useClaudeProjection = <S,>(selector: (value: typeof snapshot) => S): S => selector(snapshot)\n return <ClaudeDiffOverlay onRestore={restore}><ClaudeDiffPanel\n useClaudeProjection={useClaudeProjection}\n t={t}\n sessionId={sessionId}\n maximized\n closeDetails={closeDetails}\n toggleMaximized={restore}\n {...(submitPrompt === undefined ? {} : { submitPrompt })}\n /></ClaudeDiffOverlay>\n}\n\nexport const name = 'dsh-claude-client'\nexport const inject = ['slots', 'locale', 'conversationEvents', 'sessions', 'workspaces', 'inputTriggers', 'conversation', 'connection']\n\nexport function apply(ctx: ClientContext): void {\n const namespace = 'settings.claude-code'\n ctx.effect(() => ctx.locale.register(namespace, { zh, en }), 'dsh-claude: client copy')\n const t = ctx.locale.bind(namespace) as ClaudeCodeSettingsInjected['t']\n const projections = new ClaudeProjectionStore()\n ctx.effect(() => ctx.inputTriggers.registerSource(createClaudeCommandSource(ctx, projections)), 'dsh-claude: Claude slash source')\n const sessions = ctx.get('sessions') as ISessions | undefined\n const workspaces = ctx.get('workspaces') as IWorkspaces | undefined\n const conversation = ctx.get('conversation') as IConversation | undefined\n const connection = ctx.get('connection') as ConnectionHandle | undefined\n /** Composer submit hook shared by the repository feedback affordances.\n * 'append' keeps any user draft and adds the prompt below it; 'idle'\n * submits only when the composer is empty and reports false otherwise. */\n const submitPromptFor = (sessionId: string): ((draft: string, mode?: 'append' | 'idle') => boolean) | undefined => {\n if (sessions === undefined || conversation === undefined) return undefined\n return (draft, mode = 'append') => {\n const scope = sessions.scope(sessionId as SessionId)\n if (scope === undefined) return false\n const input = conversation.input.for(scope)\n const current = input.state.getSnapshot().draft\n if (current.trim() === '') input.setDraft(draft)\n else if (mode === 'append') input.setDraft(`${current}\\n\\n${draft}`)\n else return false\n input.submit()\n return true\n }\n }\n if (sessions !== undefined) {\n ctx.effect(() => sessions.provide({\n hooks: ['claudeProjection'],\n resolve: binding => ({ hooks: { claudeProjection: projections.source(binding.sessionId) } }),\n }), 'dsh-claude: sidecar projection provider')\n }\n ctx.effect(() => () => projections.dispose(), 'dsh-claude: sidecar projection lifecycle')\n ctx.effect(() => ctx.conversationEvents.register(claudeTurnDefinition), 'dsh-claude: Claude turn marker')\n ctx.effect(() => ctx.conversationEvents.register(claudeActivityStepDefinition), 'dsh-claude: Claude activity flow node')\n ctx.effect(() => ctx.conversationEvents.register(claudeActiveTasksDefinition), 'dsh-claude: active Claude tasks node')\n ctx.slots.inject('conversation.chat.node', () => ctx.slots.register({\n name: 'conversation.chat.node',\n key: 'claude-activity-step',\n locale: namespace,\n }, ClaudeActivityNode))\n const layout = ctx.get('layout') as LayoutFace | undefined\n // Keep the plugin details registration mounted while its maximized overlay is\n // visible so its session-bound state survives the round trip.\n let disposePluginDetails: (() => void) | undefined\n let disposeDiffOverlay: (() => void) | undefined\n let disposeExpandedDetailsResize: (() => void) | undefined\n let detailsSessionId: string | undefined\n const restoreDiff = (): void => {\n if (disposeDiffOverlay === undefined) return\n disposeDiffOverlay()\n disposeDiffOverlay = undefined\n layout?.openDetails()\n disposeExpandedDetailsResize = enableExpandedDetailsResize()\n }\n const closePluginDetails = (): void => {\n if (disposePluginDetails === undefined && disposeDiffOverlay === undefined && disposeExpandedDetailsResize === undefined && detailsSessionId === undefined) return\n disposeDiffOverlay?.()\n disposeDiffOverlay = undefined\n disposeExpandedDetailsResize?.()\n disposeExpandedDetailsResize = undefined\n disposePluginDetails?.()\n disposePluginDetails = undefined\n detailsSessionId = undefined\n layout?.closeDetails()\n }\n ctx.effect(() => ctx.slots.onEntryError((key, entry) => {\n if (key === 'shell.overlay' && entry.options.id === 'claude-diff-overlay') restoreDiff()\n }), 'dsh-claude: diff overlay recovery')\n const openTasksPanel = (sessionId: string, turn: number): void => {\n closePluginDetails()\n try {\n disposePluginDetails = ctx.slots.register({\n name: 'details',\n priority: -10,\n locale: namespace,\n inject: (): ClaudeTasksPanelInjected => ({ t, turn, closeDetails: closePluginDetails }),\n }, ClaudeTasksPanel)\n } catch {\n return\n }\n detailsSessionId = sessionId\n layout?.openDetails()\n disposeExpandedDetailsResize = enableExpandedDetailsResize()\n }\n const openOverviewPanel = (sessionId: string): void => {\n if (sessions === undefined) return\n closePluginDetails()\n try {\n disposePluginDetails = ctx.slots.register({\n name: 'details',\n priority: -10,\n locale: namespace,\n inject: (): ClaudePullRequestsPanelInjected => ({\n t,\n closeDetails: closePluginDetails,\n openSession: id => { sessions.open(id as SessionId) },\n loadStatus: loadRepositoryStatusFor,\n sessions: sessions.list as unknown as ClaudePullRequestsPanelInjected['sessions'],\n ...(workspaces === undefined ? {} : { workspaces: workspaces.list as unknown as NonNullable<ClaudePullRequestsPanelInjected['workspaces']> }),\n projectionFor: id => projections.source(id),\n }),\n }, ClaudePullRequestsPanel)\n } catch {\n return\n }\n detailsSessionId = sessionId\n layout?.openDetails()\n disposeExpandedDetailsResize = enableExpandedDetailsResize()\n }\n const openDiffPanel = (sessionId: string): void => {\n closePluginDetails()\n detailsSessionId = sessionId\n const submitPrompt = submitPromptFor(sessionId)\n const registerDetails = (): boolean => {\n try {\n disposePluginDetails = ctx.slots.register({\n name: 'details',\n priority: -10,\n locale: namespace,\n inject: (): ClaudeDiffPanelInjected => ({\n t,\n sessionId,\n maximized: false,\n closeDetails: closePluginDetails,\n toggleMaximized: maximizeDiff,\n ...(submitPrompt === undefined ? {} : { submitPrompt }),\n }),\n }, ClaudeDiffPanel)\n } catch {\n disposePluginDetails = undefined\n return false\n }\n layout?.openDetails()\n return true\n }\n const maximizeDiff = (): void => {\n if (disposeDiffOverlay !== undefined) {\n restoreDiff()\n return\n }\n disposeExpandedDetailsResize?.()\n disposeExpandedDetailsResize = undefined\n layout?.closeDetails()\n try {\n disposeDiffOverlay = ctx.slots.register({\n name: 'shell.overlay',\n id: 'claude-diff-overlay',\n locale: namespace,\n }, () => <MaximizedDiff\n source={projections.source(sessionId)}\n t={t}\n sessionId={sessionId}\n closeDetails={closePluginDetails}\n restore={restoreDiff}\n {...(submitPrompt === undefined ? {} : { submitPrompt })}\n />)\n } catch {\n disposeDiffOverlay = undefined\n layout?.openDetails()\n disposeExpandedDetailsResize = enableExpandedDetailsResize()\n }\n }\n if (!registerDetails()) {\n detailsSessionId = undefined\n return\n }\n disposeExpandedDetailsResize = enableExpandedDetailsResize()\n }\n ctx.effect(() => {\n if (typeof document === 'undefined' || typeof MutationObserver === 'undefined') return () => closePluginDetails()\n const observer = new MutationObserver(() => {\n if (detailsSessionId !== undefined && disposeDiffOverlay === undefined && document.querySelector('[data-details-collapsed]') !== null) {\n closePluginDetails()\n }\n })\n observer.observe(document.body, { attributes: true, attributeFilter: ['data-details-collapsed'], subtree: true })\n return () => {\n observer.disconnect()\n closePluginDetails()\n }\n }, 'dsh-claude: details panel lifecycle')\n ctx.slots.inject('conversation.chat.node', () => ctx.slots.register({\n name: 'conversation.chat.node',\n key: 'claude-active-tasks',\n locale: namespace,\n inject: (sessionId: string) => ({\n openTasks: (turn: number) => openTasksPanel(sessionId, turn),\n }),\n }, ClaudeActiveTasksNode))\n ctx.slots.inject('conversation.chat.turnTail', () => ctx.slots.register({\n name: 'conversation.chat.turnTail',\n select: selectClaudeTurn,\n inject: (sessionId: string): ClaudeActivityTailInjected => ({\n t,\n openTasks: turn => openTasksPanel(sessionId, turn),\n }),\n }, ClaudeActivityTail))\n ctx.slots.inject('conversation.input.dock', () => ctx.slots.register({\n name: 'conversation.input.dock',\n id: 'claude-review-comments',\n // Topmost dock row: pending comments render above DSH's QueueDock (20)\n // and the repository status readout (20.5).\n order: 18,\n locale: namespace,\n inject: (sessionId: string): ClaudeReviewCommentsInjected => ({\n t,\n sessionId,\n ...(sessions === undefined || conversation === undefined ? {} : {\n submitWith: (fallbackDraft: string) => {\n const scope = sessions.scope(sessionId as SessionId)\n if (scope === undefined) return\n const input = conversation.input.for(scope)\n if (input.state.getSnapshot().draft.trim() === '') input.setDraft(fallbackDraft)\n input.submit()\n },\n }),\n }),\n }, ClaudeReviewComments))\n ctx.slots.inject('conversation.input.dock', () => ctx.slots.register({\n name: 'conversation.input.dock',\n id: 'claude-repository-status',\n // Below DSH's QueueDock (20) and above the hero controls (21), so the\n // dock stacks comments (18) → queue (20) → repository readout.\n order: 20.5,\n locale: namespace,\n inject: (sessionId: string): ClaudeRepositoryStatusInjected => {\n const submitPrompt = submitPromptFor(sessionId)\n return {\n t,\n openDiff: () => openDiffPanel(sessionId),\n ...(submitPrompt === undefined ? {} : { submitPrompt }),\n ...(sessions === undefined ? {} : { openOverview: () => openOverviewPanel(sessionId) }),\n ...(workspaces === undefined ? {} : {\n deleteWorkspace: async () => {\n const workspace = workspaces.list.getSnapshot().items.find(item => item.sessionIds.includes(sessionId as SessionId))\n if (workspace !== undefined) await workspaces.delete(workspace.workspaceId)\n },\n }),\n }\n },\n }, ClaudeRepositoryStatus))\n // Selection toolbar over assistant replies (copy / ask a follow-up). Root\n // scoped: it resolves the on-screen session itself and only arms inside\n // sessions this plugin owns.\n ctx.slots.inject('shell.overlay', () => ctx.slots.register({\n name: 'shell.overlay',\n id: 'claude-selection-ask',\n locale: namespace,\n }, () => <ClaudeSelectionAsk\n t={t}\n currentSessionId={() => sessions?.list.getSnapshot().current as string | undefined}\n ownsSession={sessionId => projections.source(sessionId).getSnapshot().owned}\n {...(sessions === undefined || conversation === undefined ? {} : {\n insertIntoChat: (sessionId: string, text: string) => {\n const scope = sessions.scope(sessionId as SessionId)\n if (scope === undefined) return\n const input = conversation.input.for(scope)\n const current = input.state.getSnapshot().draft\n input.setDraft(current.trim() === '' ? text : `${current}\\n\\n${text}`)\n },\n })}\n />))\n if (sessions !== undefined && conversation !== undefined) {\n // Shadow the Host queue strip: list-slot entries sharing an id form one\n // cell and the lowest priority renders, so this replaces it app-wide with\n // a strip that matches the repository status bar.\n ctx.slots.inject('conversation.input.dock', () => ctx.slots.register({\n name: 'conversation.input.dock',\n id: 'queue',\n order: 20,\n priority: -10,\n locale: namespace,\n inject: (sessionId: string): ClaudeQueueDockInjected => {\n const scope = sessions.scope(sessionId as SessionId)\n const scoped = scope === undefined ? undefined : (scope as unknown as { get(name: string): unknown }).get('conversation') as IConversation | undefined\n const target = scoped ?? conversation\n return {\n t,\n updateQueue: (itemId, action) => target.updateQueue(itemId as never, action as never),\n notify: (level, text) => { if (scope !== undefined) conversation.input.for(scope).notify(level, text) },\n }\n },\n }, ClaudeQueueDock))\n }\n if (sessions !== undefined && workspaces !== undefined && conversation !== undefined && connection !== undefined) {\n ctx.slots.inject('conversation.input.dock', () => ctx.slots.register({\n name: 'conversation.input.dock',\n id: 'claude-hero-repository-controls',\n order: 21,\n locale: namespace,\n inject: (sourceSessionId: SessionId): ClaudeHeroRepositoryControlsInjected => ({\n t,\n prepare: async (cwd, branch, useWorktree, onProgress, ticket) => {\n const sourceScope = sessions.scope(sourceSessionId)\n if (sourceScope === undefined) throw new Error(t('repositorySessionUnavailable'))\n const sourceInput = conversation.input.for(sourceScope)\n const rawDraft = sourceInput.state.getSnapshot().draft\n // Starting from a ticket seeds an empty composer with the ticket\n // brief; a written draft keeps the user's words and gets the ticket\n // appended as context so the session always knows its ticket.\n const draft = ticket === undefined\n ? rawDraft\n : rawDraft.trim() === '' ? ticketPrompt(ticket) : `${rawDraft.trimEnd()}\\n\\n${ticketContext(ticket)}`\n const imageIds = sourceInput.state.getSnapshot().imageIds\n const prepared = await prepareRepository(cwd, branch, useWorktree, ticket?.key, onProgress)\n // The workspace is ready: take the ticket. Best-effort so a Jira\n // hiccup never blocks the session from starting.\n if (ticket !== undefined) {\n void assignJiraTicket(ticket.key).catch((reason: unknown) => {\n console.warn(`dsh-claude: could not assign ${ticket.key}: ${reason instanceof Error ? reason.message : String(reason)}`)\n })\n }\n if (prepared.mode === 'checkout') {\n if (draft !== rawDraft) sourceInput.setDraft(draft)\n sourceInput.submit()\n return\n }\n onProgress('creating-workspace')\n const workspace = await workspaces.create({ path: prepared.path })\n onProgress('starting-session')\n const targetSessionId = await workspaces.connectWorkspace(workspace.workspaceId)\n const targetScope = sessions.scope(targetSessionId)\n if (targetScope === undefined) throw new Error(t('repositorySessionUnavailable'))\n const presetResponse = await connection.api.agentPresets.select({ sessionId: targetSessionId, agentPreset: 'claude' })\n if (!presetResponse.result.ok) throw new Error(presetResponse.result.error.message)\n sessions.noteAgentPreset(targetSessionId, presetResponse.result.value.agentPreset)\n const targetInput = conversation.input.for(targetScope)\n onProgress('transferring-draft')\n if (imageIds.length > 0 && !targetInput.addImages(imageIds)) throw new Error(t('repositoryDraftTransferFailed'))\n if (draft !== '') targetInput.setDraft(draft)\n if (prepared.leaseId !== undefined) await bindRepositoryLease(prepared.leaseId, targetSessionId)\n sessions.open(targetSessionId)\n onProgress('submitting')\n targetInput.submit()\n sourceInput.setDraft('')\n for (const imageId of imageIds) sourceInput.removeImage(imageId)\n },\n prepareMany: async (cwd, branch, tickets, onProgress) => {\n const sourceScope = sessions.scope(sourceSessionId)\n if (sourceScope === undefined) throw new Error(t('repositorySessionUnavailable'))\n const sourceInput = conversation.input.for(sourceScope)\n // One shared draft applies to every ticket; images stay behind\n // because a single attachment cannot be split across sessions.\n const rawDraft = sourceInput.state.getSnapshot().draft\n const failures: string[] = []\n for (const [index, ticket] of tickets.entries()) {\n const report = (stage: RepositoryPreparationStage): void => {\n onProgress({ ticketKey: ticket.key, index, total: tickets.length, stage })\n }\n try {\n report('inspecting')\n const prepared = await prepareRepository(cwd, branch, true, ticket.key, report)\n void assignJiraTicket(ticket.key).catch((reason: unknown) => {\n console.warn(`dsh-claude: could not assign ${ticket.key}: ${reason instanceof Error ? reason.message : String(reason)}`)\n })\n report('creating-workspace')\n const workspace = await workspaces.create({ path: prepared.path })\n report('starting-session')\n const targetSessionId = await workspaces.connectWorkspace(workspace.workspaceId)\n const targetScope = sessions.scope(targetSessionId)\n if (targetScope === undefined) throw new Error(t('repositorySessionUnavailable'))\n const presetResponse = await connection.api.agentPresets.select({ sessionId: targetSessionId, agentPreset: 'claude' })\n if (!presetResponse.result.ok) throw new Error(presetResponse.result.error.message)\n sessions.noteAgentPreset(targetSessionId, presetResponse.result.value.agentPreset)\n const targetInput = conversation.input.for(targetScope)\n report('transferring-draft')\n targetInput.setDraft(rawDraft.trim() === '' ? ticketPrompt(ticket) : `${rawDraft.trimEnd()}\\n\\n${ticketContext(ticket)}`)\n if (prepared.leaseId !== undefined) await bindRepositoryLease(prepared.leaseId, targetSessionId)\n report('submitting')\n targetInput.submit()\n } catch (cause) {\n failures.push(`${ticket.key}: ${cause instanceof Error ? cause.message : String(cause)}`)\n }\n }\n if (failures.length < tickets.length) sourceInput.setDraft('')\n if (failures.length > 0) throw new Error(failures.join(' · '))\n },\n }),\n }, ClaudeHeroRepositoryControls))\n }\n if (sessions !== undefined) {\n // The layout closes the column on session switch; mirror that here so the\n // next session's native details view is not shadowed.\n ctx.effect(() => sessions.list.subscribe(() => {\n if (detailsSessionId !== undefined && sessions.list.getSnapshot().current !== detailsSessionId) closePluginDetails()\n }), 'dsh-claude: details panel session tracking')\n }\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'claude-code',\n order: 16,\n label: () => t('nav'),\n inject: (): ClaudeCodeSettingsInjected => ({ t }),\n }, ClaudeCodeSettings))\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["taskMeta","reviewCommentChipLabel","styles.taskActivityItem","styles.taskActivityGlyph","styles.taskActivityBody","styles.taskActivityTitle","styles.taskActivitySummary","styles.taskActivityDetail","styles.taskActivityDetailSummary","styles.detailCode","styles.taskCard","styles.taskCardRunning","styles.taskCardTop","styles.taskCardGlyph","styles.iconChipRunning","styles.iconChipError","styles.taskCardBody","styles.taskTitle","styles.taskStatusLine","styles.taskMeta","styles.taskSummary","styles.taskActivitySection","styles.taskTextButton","styles.taskActivityList","styles.tasksGroupCount","styles.tasksGroupHeading","styles.tasksGroupTitle","styles.tasksGroupToggle","styles.chevron","styles.chevronOpen","styles.detailsCardClass","styles.tasksPanel","styles.detailsCardCss","styles.panelIconButtonCss","styles.tasksHeader","styles.tasksHeading","styles.tasksTurnMeta","styles.panelIconButtonClass","styles.tasksBody","styles.tasksGroupEmpty","styles.taskCardList","styles.tasksFinishedSection","styles.tasksHoverGlyphError","styles.tasksHoverGlyphDone","styles.tasksHoverGlyphRunning","styles.tasksBadgeDone","styles.tasksBadgeDotError","styles.tasksBadgeDotDone","styles.tasksBadgeWrap","styles.tasksBadgeSeat","styles.tasksHoverCard","styles.tasksHoverHeader","styles.tasksHoverRow","styles.tasksHoverGlyph","styles.tasksHoverDesc","styles.tasksHoverType","styles.tasksHoverMore","styles.tasksHoverHint","styles.tasksTurnBadge","styles.tasksBadgeHovered","styles.tasksBadgeDot","styles.tasksBadgeLabel","EMPTY_TASKS","record","#sources","cssInjected","ensureCss","record","text","record","styles.settingTextInput","styles.settingSelect","styles.settingSelectTrigger","styles.settingSelectTriggerOpen","styles.settingSelectValue","styles.settingSelectChevron","styles.settingSelectChevronOpen","styles.settingSelectMenu","styles.settingSelectOption","styles.settingSelectOptionActive","styles.settingSelectCheck","styles.settingHint","styles.planUsageTone","styles.planUsageMeter","styles.planUsageTrack","styles.planUsageFill","styles.planUsageMeta","styles.settingsCard","styles.settingsCardHeader","styles.settingsSectionHeading","styles.settingsBody","styles.button","styles.notice","styles.diagnosticGrid","styles.diagnosticLabel","styles.diagnosticValue","styles.settingsPage","styles.settingsHero","styles.settingsMark","styles.settingsHeading","styles.settingsActions","styles.settingsLink","styles.primaryButton","record","response","record","record","styles.repositoryItemSuccess","styles.repositoryItemWarning","styles.repositoryItemError","styles.repositoryGlyph","repositoryName","styles.repositoryPrHoverCard","styles.repositoryPrHoverTop","styles.repositoryPrStateBadge","styles.repositoryPrStateBadgeMerged","styles.repositoryPrHoverRepo","styles.repositoryPrHoverAge","styles.repositoryPrHoverTitle","styles.repositoryPrHoverBottom","styles.repositoryPrAuthor","styles.repositoryPrAvatar","styles.repositoryPrHoverStats","styles.diffAdd","styles.diffDelete","styles.repositoryPrFiles","styles.repositoryPrLinkFrame","styles.repositoryPrLink","styles.repositoryPrLinkMerged","styles.repositoryAutoFix","styles.repositoryAutoFixActive","styles.heroWorktreeToggleFocused","styles.repositoryChecksFrame","styles.repositoryChecksTrigger","styles.repositoryChecksCard","styles.repositoryChecksTitle","styles.repositoryChecksHint","styles.repositoryChecksError","styles.repositoryChecksItem","styles.repositoryChecksName","styles.repositoryChecksDesc","styles.repositoryChecksFix","styles.repositoryUpdateTrigger","styles.diffModalCss","styles.diffModalFooter","styles.button","styles.diffModalButton","styles.primaryButton","styles.diffModalBody","styles.diffModalMeta","styles.diffModalMetaText","styles.diffModalFileState","styles.diffModalCheckbox","styles.diffModalSuccess","styles.diffModalStatus","styles.diffModalConflicts","styles.diffModalConflictResolve","styles.diffModalError","styles.repositoryMergeTrigger","styles.repositoryBarFrame","styles.repositoryBar","styles.repositoryPrIcon","styles.repositoryPrimary","styles.repositoryBarMerged","styles.repositoryPrIconMerged","styles.repositoryPrIconButton","styles.repositoryRemote","styles.repositoryBranch","styles.repositoryWorktree","styles.repositoryStatusItems","styles.diffTrigger","styles.diffTriggerMuted","styles.diffAddMuted","styles.diffDeleteMuted","styles.diffAheadMuted","styles.diffAhead","styles.repositoryMergedStatus","styles.repositoryMergedDot","styles.repositoryMergedAge","record","styles.reviewCommentChip","styles.reviewCommentChipLabel","styles.reviewCommentChipRemove","styles.reviewCommentHoverCard","styles.reviewCommentHoverPath","styles.reviewCommentHoverText","styles.reviewCommentBarFrame","styles.panelIconButtonCss","styles.reviewCommentBar","styles.reviewCommentIcon","styles.reviewCommentClearSeat","styles.panelIconButtonClass","apply","Marked","DOMPurify","purify","styles.diffLineAdd","styles.diffLineDelete","styles.diffLineHunk","styles.diffLineContext","styles.diffLineRowClass","styles.diffLine","styles.diffLineSelected","styles.diffCommentButtonClass","styles.diffLineNumber","styles.diffLineMarker","styles.diffLineText","styles.diffGapButton","styles.diffGapControls","styles.diffFile","styles.diffFileHeader","styles.chevron","styles.chevronOpen","styles.diffFilePath","styles.diffFileName","styles.diffFileComments","styles.diffFileStats","styles.diffAdd","styles.diffDelete","styles.diffCode","styles.diffCommentBlock","styles.diffCommentCardMeta","styles.reviewCommentChipRemove","styles.diffCommentCardText","styles.diffGhCommentIdentity","styles.diffGhCommentAvatar","styles.diffGhCommentAuthor","styles.diffGhCommentLink","styles.diffCommentRange","styles.diffCommentTextareaClass","styles.diffCommentTextarea","styles.diffCommentError","styles.diffCommentActions","styles.diffCommentActionButton","styles.diffCommentSubmitButton","styles.detailsCardCss","styles.diffModalCss","styles.panelIconButtonCss","styles.diffCommentCss","styles.diffCommentMarkdownCss","styles.detailsCardClass","styles.diffPanel","styles.diffPanelMaximized","styles.diffHeader","styles.diffHeaderTitle","styles.diffHeaderBranch","styles.diffHeaderLabel","styles.diffHeaderActions","styles.diffSplitButton","styles.diffCommitButton","styles.diffActionDisabled","styles.diffCommitMenuButton","styles.diffPrCommentsButton","styles.panelIconButtonClass","styles.diffSummary","styles.diffBody","styles.diffNotice","styles.diffEmpty","styles.diffModalFooter","styles.button","styles.diffModalButton","styles.primaryButton","styles.diffModalStatus","styles.diffModalBody","styles.diffModalMeta","styles.diffModalMetaText","styles.diffModalFileState","styles.diffModalFiles","styles.diffModalFile","styles.diffModalFilePath","styles.diffModalCheckbox","styles.diffModalField","styles.diffModalTextarea","styles.diffModalTextInput","styles.diffModalSuccess","styles.diffModalError","styles.panelIconButtonClass","styles.repositoryBarFrame","styles.panelIconButtonCss","styles.queueBar","styles.queueHeader","styles.queueLead","styles.queueCount","styles.queueList","styles.queueRow","styles.queueRowDivider","styles.queueEditor","styles.queuePreview","styles.queueActions","styles.repositoryItemSuccess","styles.repositoryItemWarning","styles.repositoryItemError","styles.repositoryItem","styles.repositoryItemDot","styles.repositoryItemLabel","styles.detailsCardClass","styles.tasksPanel","styles.detailsCardCss","styles.panelIconButtonCss","styles.tasksHeader","styles.tasksHeading","styles.tasksTurnMeta","styles.panelIconButtonClass","styles.overviewBody","styles.overviewEmpty","styles.overviewRow","styles.overviewRowTop","styles.overviewRunningDot","styles.overviewTitle","styles.overviewMeta","styles.overviewBranch","styles.askToolbar","styles.panelIconButtonCss","styles.panelIconButtonClass","styles.askPopup","styles.askHighlightCss","styles.askQuote","styles.askTextarea","styles.askActions","styles.askButton","styles.askPrimaryButton","styles.askQuestion","styles.askAnswer","styles.askThinkingRow","styles.askThinkingLabel","styles.askThinkingFull","styles.askThinkingPreview","styles.askStatus","styles.askToolRow","styles.askToolGlyph","styles.askToolGlyphError","styles.askToolGlyphDone","styles.askToolName","styles.askToolSummary","styles.askError","PORTAL_ATTRIBUTE","styles.rewindActionCss","styles.diffModalCss","styles.diffModalFooter","styles.button","styles.diffModalButton","styles.rewindDangerButton","styles.diffModalBody","styles.rewindModalMessage","styles.diffModalStatus","styles.diffModalError","styles.heroWorktreeProgressCard","styles.heroWorktreeProgressHeader","styles.heroWorktreeProgressSpinner","styles.heroWorktreeProgressError","styles.heroWorktreeProgressCopy","styles.heroWorktreeProgressTitle","styles.heroWorktreeProgressContext","styles.heroWorktreeProgressCurrent","styles.heroWorktreeProgressDismiss","styles.heroWorktreeProgressSteps","styles.heroWorktreeProgressStep","styles.heroWorktreeProgressDot","styles.heroWorktreeProgressDotDone","styles.heroWorktreeProgressDotActive","styles.heroRepositoryCapsule","styles.heroBranchPicker","styles.heroBranchTrigger","styles.heroBranchName","styles.heroBranchMenu","styles.heroBranchSearchRow","styles.heroBranchSearch","styles.heroBranchSearchGrow","styles.heroBranchSearchInput","styles.heroBranchRefresh","styles.heroBranchRefreshHover","styles.heroBranchRefreshBusy","styles.heroBranchNotice","styles.heroBranchNoticeError","styles.heroBranchList","styles.heroBranchEmpty","styles.heroBranchItem","styles.heroBranchItemActive","styles.heroBranchItemName","styles.heroRepositoryDivider","styles.heroWorktreeToggle","styles.heroWorktreeToggleActive","styles.heroWorktreeToggleFocused","styles.heroWorktreeCheckbox","styles.heroWorktreeCheckboxChecked","styles.heroWorktreeCheckboxIcon","styles.heroRepositoryControls","styles.heroRepositoryStatus","styles.heroTicketMenu","styles.heroTicketChips","styles.heroTicketChip","styles.heroTicketChipRemove","styles.heroTicketChipsClear","styles.heroTicketCheckbox","styles.heroTicketKey","styles.heroTicketStatus","styles.heroRepositoryError","cssInjected","ensureCss","cssInjected","ensureCss","#api","#listeners","#inflight","#rows","#listeners","#set","#sessionId"],"sources":["../src/constants.ts","../src/client/task-projection.ts","../src/client/conversation-sidecar.ts","../src/client/styles.ts","../src/client/token-format.ts","../src/client/ClaudeTasksPanel.tsx","../src/client/ClaudeActivityTail.tsx","../src/client/ClaudeActiveTasksNode.tsx","../src/rewind.ts","../src/client/projection.ts","../src/client/ClaudeActivityNode.tsx","../src/client/plugin-request.ts","../src/client/jira-api.ts","../src/client/ClaudeCodeSettings.tsx","../src/client/repository-action-api.ts","../src/client/repository-setup-api.ts","../src/github-url.ts","../src/client/pr-feedback-api.ts","../src/client/auto-fix.ts","../src/client/ClaudeRepositoryStatus.tsx","../src/client/review-comment-api.ts","../src/client/ClaudeReviewComments.tsx","../node_modules/.pnpm/dompurify@3.4.14/node_modules/dompurify/dist/purify.es.mjs","../node_modules/.pnpm/marked@18.0.11/node_modules/marked/lib/marked.esm.js","../src/client/comment-markdown.ts","../src/client/ClaudeDiffPanel.tsx","../src/client/ClaudeDiffOverlay.tsx","../src/client/ClaudeQueueDock.tsx","../src/client/ClaudePullRequestsPanel.tsx","../src/client/ask-api.ts","../src/client/ClaudeSelectionAsk.tsx","../src/client/rewind-dom.ts","../src/client/rewind-api.ts","../src/client/ClaudeRewind.tsx","../src/client/hero-dom-bridge.ts","../src/client/ClaudeHeroRepositoryControls.tsx","../src/client/ClaudeDiffHeaderAction.tsx","../src/client/editor-open-api.ts","../src/client/ClaudeSessionMenu.tsx","../src/client/claude-mark.ts","../src/client/agent-preset-roster.ts","../src/client/ClaudeAgentPresetLabel.tsx","../src/client/diff-open-store.ts","../src/client/claude-command-source.ts","../src/client/preset-seat-mark.ts","../src/client/host-chrome.ts","../src/client/details-resize.ts","../src/client/locales.ts","../src/client/index.tsx"],"sourcesContent":["export const CLAUDE_CODE_PROVIDER = 'claude'\r\nexport const CLAUDE_CODE_PRESET_ID = 'claude'\r\nexport const CLAUDE_CODE_PROVIDER_IDS = [CLAUDE_CODE_PROVIDER] as const\r\nexport const CLAUDE_SESSION_BOUND_EVENT = 'claude-code/session-bound'\r\nexport const CLAUDE_ACTIVITY_EVENT = 'claude-code/activity'\r\nexport const CLAUDE_CONTEXT_USAGE_EVENT = 'claude-code/context-usage'\r\nexport const CLAUDE_TASKS_EVENT = 'claude-code/tasks'\r\n/** Claude's subagent dispatch tools; rendered as plugin-owned group cards\r\n * gathering subagent activity instead of native tool cards. */\r\nexport const TASK_TOOL_NAMES: ReadonlySet<string> = new Set(['Task', 'Agent'])\r\nexport const SDK_VERSION = '0.3.247'\r\nexport const CLAUDE_DOCTOR_PATH = '/plugins/dsh-claude/doctor'\r\nexport const CLAUDE_UPDATE_CHECK_PATH = '/plugins/dsh-claude/update/check'\r\nexport const CLAUDE_USAGE_PATH = '/plugins/dsh-claude/usage'\r\nexport const CLAUDE_UPDATE_PATH = '/plugins/dsh-claude/update'\r\nexport const CLAUDE_PROJECTION_PATH = '/plugins/dsh-claude/projection'\r\nexport const CLAUDE_GLOBAL_SETTINGS_PATH = '/plugins/dsh-claude/settings/global'\r\nexport const CLAUDE_REPOSITORY_SETUP_PATH = '/plugins/dsh-claude/repository/setup'\r\nexport const CLAUDE_REPOSITORY_ACTION_PATH = '/plugins/dsh-claude/repository/action'\r\nexport const CLAUDE_REVIEW_COMMENT_PATH = '/plugins/dsh-claude/review-comments'\r\nexport const CLAUDE_REPOSITORY_FEEDBACK_PATH = '/plugins/dsh-claude/repository/feedback'\r\nexport const CLAUDE_REPOSITORY_STATUS_PATH = '/plugins/dsh-claude/repository/status'\r\nexport const CLAUDE_REPOSITORY_FILE_PATH = '/plugins/dsh-claude/repository/file'\r\nexport const CLAUDE_JIRA_PATH = '/plugins/dsh-claude/jira'\r\nexport const CLAUDE_ASK_PATH = '/plugins/dsh-claude/ask'\r\nexport const CLAUDE_EDITOR_OPEN_PATH = '/plugins/dsh-claude/editor/open'\r\nexport const CLAUDE_REWIND_PATH = '/plugins/dsh-claude/rewind'\r\n","import type { ClaudeActivityEvent, ClaudeTaskInfo } from '../events.ts'\r\n\r\n/** Tasks UI is reserved for detached work and genuine Claude subagents. */\r\nexport function isProjectedTask(task: ClaudeTaskInfo): boolean {\r\n if (task.backgrounded === true) return true\r\n return task.subagentType !== undefined && task.subagentType.trim().length > 0\r\n}\r\n\r\nexport function isProjectedTaskActivity(\r\n activity: ClaudeActivityEvent,\r\n tasks: readonly ClaudeTaskInfo[],\r\n): boolean {\r\n if (activity.kind !== 'subagent' || activity.parentToolUseId !== undefined) return true\r\n if (activity.taskId === undefined) return false\r\n const task = tasks.find(candidate => candidate.taskId === activity.taskId)\r\n return task !== undefined && isProjectedTask(task)\r\n}\r\n","import type {\r\n ChatConversationViewNode,\r\n ConversationNodeDefinition,\r\n} from '@deepseek-ai/dsh-client-runtime/client'\r\nimport type { TurnTailOwnerProps } from '@deepseek-ai/dsh-client-ui-conversation/client'\r\nimport type { ClaudeActivityEvent, ClaudeActivityPhase, ClaudeTaskInfo, ClaudeTaskStatus } from '../events.ts'\r\nimport { CLAUDE_CODE_PROVIDER, TASK_TOOL_NAMES } from '../constants.ts'\r\nimport { isProjectedTaskActivity } from './task-projection.ts'\r\n\r\nexport interface ClaudeSubcall {\r\n toolUseId: string\r\n toolName?: string\r\n phase?: ClaudeActivityPhase\r\n summary?: string\r\n isError?: boolean\r\n}\r\n\r\nexport interface ClaudeActivityChatData {\r\n activity: ClaudeActivityEvent\r\n running: boolean\r\n subcalls: readonly ClaudeSubcall[]\r\n}\r\n\r\nexport interface ClaudeTranscriptDiff {\r\n path: string\r\n oldText: string | null\r\n newText: string\r\n}\r\n\r\nexport interface ClaudeTranscriptTool {\r\n toolUseId: string\r\n toolName: string\r\n description: string\r\n summary?: string\r\n input?: string\r\n output?: string\r\n phase?: ClaudeActivityPhase\r\n isError?: boolean\r\n additions?: number\r\n deletions?: number\r\n diffs?: readonly ClaudeTranscriptDiff[]\r\n subcalls: readonly ClaudeSubcall[]\r\n}\r\n\r\nexport interface ClaudeCompaction {\r\n trigger?: 'manual' | 'auto'\r\n preTokens?: number\r\n postTokens?: number\r\n}\r\n\r\nexport type ClaudeTranscriptItem =\r\n | { kind: 'text'; ordinal: number; text: string }\r\n | { kind: 'tools'; ordinal: number; tools: readonly ClaudeTranscriptTool[]; additions?: number; deletions?: number; files?: number }\r\n | { kind: 'activity'; ordinal: number; row: ClaudeActivityChatData }\r\n | { kind: 'compaction'; ordinal: number; compaction: ClaudeCompaction }\r\n\r\nexport interface ClaudeTurnMarker {\r\n readonly turn: number\r\n}\r\n\r\nexport interface ClaudeActivityStepMarker {\r\n readonly turn: number\r\n readonly step: number\r\n}\r\n\r\nexport interface ClaudeActiveTasksMarker {\r\n readonly turn: number\r\n}\r\n\r\ninterface ClaudeActiveTasksState extends ClaudeActiveTasksMarker {\r\n readonly active: boolean\r\n readonly anchored: boolean\r\n readonly anchorSeq: number\r\n}\r\n\r\ninterface ClaudeTurnProjectionState extends ClaudeTurnMarker {\r\n readonly claude: boolean\r\n}\r\n\r\ndeclare module '@deepseek-ai/dsh-client-runtime/client' {\r\n interface ConversationTurnDataMap {\r\n claudeCode: ClaudeTurnMarker\r\n }\r\n}\r\n\r\ndeclare module '@deepseek-ai/dsh-client-ui-conversation/client' {\r\n interface ChatNodeDataMap {\r\n 'claude-activity-step': ClaudeActivityStepMarker\r\n 'claude-active-tasks': ClaudeActiveTasksMarker\r\n }\r\n}\r\n\r\nfunction isTaskActivity(value: ClaudeActivityEvent): boolean {\r\n return (value.kind === 'tool-call' || value.kind === 'tool-result')\r\n && value.toolName !== undefined\r\n && TASK_TOOL_NAMES.has(value.toolName)\r\n}\r\n\r\nexport function presentable(activity: ClaudeActivityEvent): boolean {\r\n if (isTaskActivity(activity)) return true\r\n if (activity.kind === 'tool-call' || activity.kind === 'tool-result') return false\r\n if (activity.isError === true) return true\r\n if (activity.title?.startsWith('Unknown Claude SDK message') === true) return false\r\n switch (activity.kind) {\r\n case 'subagent':\r\n case 'permission':\r\n case 'warning':\r\n case 'error':\r\n return true\r\n case 'thinking':\r\n return activity.summary !== undefined && activity.summary.length > 0\r\n default:\r\n // 'compaction' stays out of the disclosure rows on purpose: the\r\n // transcript draws it as a divider instead, in `transcriptItemsForStep`.\r\n return false\r\n }\r\n}\r\n\r\nfunction running(activity: ClaudeActivityEvent): boolean {\r\n return activity.phase === 'started' || activity.phase === 'updated'\r\n}\r\n\r\nfunction subcallOf(value: ClaudeActivityEvent): ClaudeSubcall | undefined {\r\n if (value.kind !== 'subagent' || value.toolUseId === undefined) return undefined\r\n return {\r\n toolUseId: value.toolUseId,\r\n ...(value.toolName === undefined ? {} : { toolName: value.toolName }),\r\n ...(value.phase === undefined ? {} : { phase: value.phase }),\r\n ...(value.summary === undefined ? {} : { summary: value.summary }),\r\n ...(value.isError === undefined ? {} : { isError: value.isError }),\r\n }\r\n}\r\n\r\n/** Row identity for lifecycle folding. A subagent reports progress once per\r\n * tool it runs, so its dispatch, every one of those pings, and its terminal\r\n * notification all address the SAME row — they are one piece of work being\r\n * re-described, not a queue of separate steps.\r\n *\r\n * `known` reports whether a row already exists under a candidate id, which is\r\n * what lets a Task tool-result land on the row its tool-call opened. */\r\nfunction foldKey(\r\n value: ClaudeActivityEvent,\r\n known: (id: string) => boolean,\r\n): string | undefined {\r\n const taskCallId = value.toolUseId === undefined ? undefined : `task-${value.toolUseId}`\r\n const updatesExistingTask = value.kind === 'tool-result'\r\n && taskCallId !== undefined\r\n && known(taskCallId)\r\n if (!presentable(value) && !updatesExistingTask) return undefined\r\n if ((isTaskActivity(value) || updatesExistingTask) && taskCallId !== undefined) return taskCallId\r\n if (value.kind === 'subagent' && value.parentToolUseId !== undefined) return `task-${value.parentToolUseId}`\r\n if (value.kind === 'subagent' && value.taskId !== undefined) return `subagent-task-${value.taskId}`\r\n if (value.kind === 'subagent' && value.toolUseId !== undefined) return `call-${value.toolUseId}`\r\n return `act-${value.turn}-${value.step}-${value.ordinal}`\r\n}\r\n\r\n/** The task snapshot is authoritative over the lifecycle stream: a row whose\r\n * task already settled must not keep pulsing just because the last ping it\r\n * received said 'updated'. */\r\nfunction settled(\r\n row: ClaudeActivityChatData,\r\n taskStatus: ReadonlyMap<string, ClaudeTaskStatus>,\r\n): ClaudeActivityChatData {\r\n const taskId = row.activity.taskId\r\n const status = taskId === undefined ? undefined : taskStatus.get(taskId)\r\n if (status === undefined || status === 'running') return row\r\n const failed = status === 'failed' || status === 'stopped' || status === 'killed'\r\n const settledTitle = row.activity.title?.replace(/^Running\\s+/u, '')\r\n return {\r\n ...row,\r\n running: false,\r\n activity: {\r\n ...row.activity,\r\n phase: failed ? 'failed' : 'completed',\r\n ...(settledTitle === undefined ? {} : { title: settledTitle }),\r\n ...(failed ? { isError: true } : {}),\r\n },\r\n }\r\n}\r\n\r\n/** Fold raw sidecar activity into the same lifecycle cards the old event\r\n * projection rendered, keyed so a caller that interleaves these rows with\r\n * other transcript items can look one up instead of re-folding per activity. */\r\nfunction foldedRows(\r\n activities: readonly ClaudeActivityEvent[],\r\n tasks: readonly ClaudeTaskInfo[],\r\n): ReadonlyMap<string, ClaudeActivityChatData> {\r\n const rows = new Map<string, ClaudeActivityChatData>()\r\n for (const value of activities) {\r\n const id = foldKey(value, candidate => rows.has(candidate))\r\n if (id === undefined) continue\r\n const previous = rows.get(id)\r\n if (previous === undefined) {\r\n rows.set(id, { activity: value, running: running(value), subcalls: [] })\r\n continue\r\n }\r\n if (value.kind === 'subagent' && value.parentToolUseId !== undefined) {\r\n const nested = subcallOf(value)\r\n if (nested === undefined) continue\r\n const nestedIndex = previous.subcalls.findIndex(item => item.toolUseId === nested.toolUseId)\r\n const subcalls = nestedIndex === -1\r\n ? [...previous.subcalls, nested]\r\n : previous.subcalls.map((item, position) => position === nestedIndex ? { ...item, ...nested } : item)\r\n rows.set(id, { ...previous, subcalls })\r\n continue\r\n }\r\n rows.set(id, {\r\n activity: {\r\n ...value,\r\n ...(value.toolName === undefined && previous.activity.toolName !== undefined\r\n ? { toolName: previous.activity.toolName }\r\n : {}),\r\n },\r\n running: running(value),\r\n subcalls: previous.subcalls,\r\n })\r\n }\r\n const taskStatus = new Map(tasks.map(task => [task.taskId, task.status]))\r\n return new Map([...rows].map(([id, row]) => [id, settled(row, taskStatus)]))\r\n}\r\n\r\nfunction inputRecord(detail: string | undefined): Record<string, unknown> | undefined {\r\n if (detail === undefined) return undefined\r\n try {\r\n const value: unknown = JSON.parse(detail)\r\n return value !== null && typeof value === 'object' && !Array.isArray(value)\r\n ? value as Record<string, unknown>\r\n : undefined\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n\r\nfunction inputString(input: Record<string, unknown> | undefined, key: string): string | undefined {\r\n const value = input?.[key]\r\n return typeof value === 'string' && value.length > 0 ? value : undefined\r\n}\r\n\r\n/** Read the compaction figures the supervisor stored as redacted JSON detail.\r\n * Every field is optional: an older CLI reports the boundary without metadata,\r\n * and the divider still renders — just without the token counts. */\r\nfunction compactionOf(activity: ClaudeActivityEvent): ClaudeCompaction {\r\n const detail = inputRecord(activity.detail)\r\n const trigger = detail?.trigger\r\n const preTokens = detail?.preTokens\r\n const postTokens = detail?.postTokens\r\n return {\r\n ...(trigger === 'manual' || trigger === 'auto' ? { trigger } : {}),\r\n ...(typeof preTokens === 'number' ? { preTokens } : {}),\r\n ...(typeof postTokens === 'number' ? { postTokens } : {}),\r\n }\r\n}\r\n\r\nfunction lineCount(text: string): number {\r\n return text.length === 0 ? 0 : text.split(/\\r?\\n/u).length\r\n}\r\n\r\nfunction editDiffs(toolName: string, input: Record<string, unknown> | undefined): readonly ClaudeTranscriptDiff[] | undefined {\r\n const path = inputString(input, 'file_path')\r\n if (path === undefined) return undefined\r\n if (toolName === 'MultiEdit' && Array.isArray(input?.edits)) {\r\n const diffs = input.edits.flatMap(edit => {\r\n if (edit === null || typeof edit !== 'object' || Array.isArray(edit)) return []\r\n const item = edit as Record<string, unknown>\r\n const newText = inputString(item, 'new_string')\r\n if (newText === undefined) return []\r\n return [{ path, oldText: inputString(item, 'old_string') ?? null, newText }]\r\n })\r\n return diffs.length === 0 ? undefined : diffs\r\n }\r\n if (toolName === 'Edit') {\r\n const newText = inputString(input, 'new_string')\r\n return newText === undefined ? undefined : [{ path, oldText: inputString(input, 'old_string') ?? null, newText }]\r\n }\r\n if (toolName === 'Write') {\r\n const content = inputString(input, 'content')\r\n return content === undefined ? undefined : [{ path, oldText: null, newText: content }]\r\n }\r\n return undefined\r\n}\r\n\r\nfunction toolDescription(toolName: string, input: Record<string, unknown> | undefined, failed = false): string {\r\n const path = inputString(input, 'file_path') ?? inputString(input, 'path')\r\n const pattern = inputString(input, 'pattern') ?? inputString(input, 'query')\r\n const description = inputString(input, 'description')\r\n const target = path ?? pattern\r\n let completed: string\r\n let failedAction: string\r\n switch (toolName) {\r\n case 'Grep':\r\n completed = path === undefined ? `Searched for ${pattern ?? 'matches'}` : `Searched ${path} for ${pattern ?? 'matches'}`\r\n failedAction = path === undefined ? `search for ${pattern ?? 'matches'}` : `search ${path} for ${pattern ?? 'matches'}`\r\n break\r\n case 'Glob':\r\n completed = `Searched for ${pattern ?? 'files'}`\r\n failedAction = `search for ${pattern ?? 'files'}`\r\n break\r\n case 'Read':\r\n completed = `Read ${path ?? 'a file'}`\r\n failedAction = `read ${path ?? 'a file'}`\r\n break\r\n case 'WebFetch': {\r\n const url = inputString(input, 'url') ?? 'a web page'\r\n completed = `Fetched ${url}`\r\n failedAction = `fetch ${url}`\r\n break\r\n }\r\n case 'WebSearch':\r\n completed = `Searched the web for ${pattern ?? 'results'}`\r\n failedAction = `search the web for ${pattern ?? 'results'}`\r\n break\r\n case 'Edit': case 'MultiEdit':\r\n completed = `Edited ${path ?? 'a file'}`\r\n failedAction = `edit ${path ?? 'a file'}`\r\n break\r\n case 'Write':\r\n completed = `Wrote ${path ?? 'a file'}`\r\n failedAction = `write ${path ?? 'a file'}`\r\n break\r\n case 'Bash': {\r\n const command = inputString(input, 'command') ?? 'a command'\r\n completed = description ?? `Ran ${command}`\r\n failedAction = description === undefined ? `run ${command}` : description\r\n break\r\n }\r\n default:\r\n completed = description ?? `${toolName}${target === undefined ? '' : ` ${target}`}`\r\n failedAction = completed.charAt(0).toLowerCase() + completed.slice(1)\r\n }\r\n return failed ? `Failed to ${failedAction}` : completed\r\n}\r\n\r\n/** Fold one step's shared ordinal stream into Claude Code-style prose and tool groups. */\r\nexport function transcriptItemsForStep(\r\n activities: readonly ClaudeActivityEvent[],\r\n turn: number,\r\n step: number,\r\n tasks: readonly ClaudeTaskInfo[] = [],\r\n): readonly ClaudeTranscriptItem[] {\r\n const ordered = activities\r\n .filter(activity => activity.turn === turn\r\n && activity.step === step\r\n && isProjectedTaskActivity(activity, tasks))\r\n .slice()\r\n .sort((left, right) => left.ordinal - right.ordinal)\r\n // Fold the whole step at once. Folding per activity would give every task\r\n // progress ping its own private row, so a single subagent would paint one\r\n // permanently-running line per tool it happened to use.\r\n const rows = foldedRows(ordered, tasks)\r\n const placed = new Set<string>()\r\n const items: ClaudeTranscriptItem[] = []\r\n let group: {\r\n ordinal: number\r\n tools: ClaudeTranscriptTool[]\r\n byId: Map<string, number>\r\n trailingActivities: ClaudeActivityEvent[]\r\n } | undefined\r\n /** Emit an activity's folded row where it first appears; later pings that\r\n * fold onto the same row update it in place rather than stacking up. */\r\n const emitRow = (activity: ClaudeActivityEvent): void => {\r\n const id = foldKey(activity, candidate => rows.has(candidate))\r\n if (id === undefined || placed.has(id)) return\r\n const row = rows.get(id)\r\n if (row === undefined) return\r\n placed.add(id)\r\n items.push({ kind: 'activity', ordinal: activity.ordinal, row })\r\n }\r\n const flushGroup = (): void => {\r\n if (group === undefined || group.tools.length === 0) return\r\n const current = group\r\n const diffs = current.tools.flatMap(tool => tool.diffs ?? [])\r\n const additions = diffs.reduce((total, diff) => total + lineCount(diff.newText), 0)\r\n const deletions = diffs.reduce((total, diff) => total + (diff.oldText === null ? 0 : lineCount(diff.oldText)), 0)\r\n const files = new Set(diffs.map(diff => diff.path)).size\r\n items.push({\r\n kind: 'tools',\r\n ordinal: current.ordinal,\r\n tools: current.tools,\r\n ...(diffs.length === 0 ? {} : { additions, deletions, files }),\r\n })\r\n group = undefined\r\n for (const activity of current.trailingActivities) emitRow(activity)\r\n }\r\n for (const activity of ordered) {\r\n if (activity.kind === 'text') {\r\n flushGroup()\r\n if (activity.text !== undefined && activity.text.length > 0) {\r\n items.push({ kind: 'text', ordinal: activity.ordinal, text: activity.text })\r\n }\r\n continue\r\n }\r\n if (activity.kind === 'compaction') {\r\n flushGroup()\r\n items.push({ kind: 'compaction', ordinal: activity.ordinal, compaction: compactionOf(activity) })\r\n continue\r\n }\r\n if (activity.kind === 'tool-call' && activity.toolUseId !== undefined && activity.toolName !== undefined) {\r\n group ??= { ordinal: activity.ordinal, tools: [], byId: new Map(), trailingActivities: [] }\r\n group.byId.set(activity.toolUseId, group.tools.length)\r\n const input = inputRecord(activity.detail)\r\n group.tools.push({\r\n toolUseId: activity.toolUseId,\r\n toolName: activity.toolName,\r\n description: toolDescription(activity.toolName, input),\r\n ...(activity.summary === undefined ? {} : { summary: activity.summary }),\r\n ...(activity.detail === undefined ? {} : { input: activity.detail }),\r\n ...(activity.phase === undefined ? {} : { phase: activity.phase }),\r\n ...(activity.isError === undefined ? {} : { isError: activity.isError }),\r\n subcalls: [],\r\n })\r\n continue\r\n }\r\n if ((activity.kind === 'tool-result' || activity.kind === 'permission') && activity.toolUseId !== undefined && group !== undefined) {\r\n const index = group.byId.get(activity.toolUseId)\r\n const previous = index === undefined ? undefined : group.tools[index]\r\n if (index !== undefined && previous !== undefined) {\r\n const failed = activity.isError === true || activity.phase === 'failed' || activity.kind === 'permission'\r\n const diffs = failed ? undefined : editDiffs(previous.toolName, inputRecord(previous.input))\r\n const additions = diffs?.reduce((total, diff) => total + lineCount(diff.newText), 0)\r\n const deletions = diffs?.reduce((total, diff) => total + (diff.oldText === null ? 0 : lineCount(diff.oldText)), 0)\r\n group.tools[index] = {\r\n ...previous,\r\n description: toolDescription(previous.toolName, inputRecord(previous.input), failed),\r\n ...(activity.detail === undefined ? {} : { output: activity.detail }),\r\n ...(activity.phase === undefined ? {} : { phase: activity.phase }),\r\n ...(activity.isError === undefined ? {} : { isError: activity.isError }),\r\n ...(diffs === undefined ? {} : { diffs, additions: additions ?? 0, deletions: deletions ?? 0 }),\r\n ...(activity.kind === 'permission' ? { output: activity.summary, isError: true } : {}),\r\n }\r\n }\r\n continue\r\n }\r\n if (activity.kind === 'subagent' && activity.parentToolUseId !== undefined && group !== undefined) {\r\n const index = group.byId.get(activity.parentToolUseId)\r\n const previous = index === undefined ? undefined : group.tools[index]\r\n const nested = subcallOf(activity)\r\n if (index !== undefined && previous !== undefined && nested !== undefined) {\r\n const nestedIndex = previous.subcalls.findIndex(item => item.toolUseId === nested.toolUseId)\r\n const subcalls = nestedIndex === -1\r\n ? [...previous.subcalls, nested]\r\n : previous.subcalls.map((item, position) => position === nestedIndex ? { ...item, ...nested } : item)\r\n group.tools[index] = { ...previous, subcalls }\r\n }\r\n continue\r\n }\r\n if (!presentable(activity)) continue\r\n if (group !== undefined) {\r\n // Only the next top-level assistant prose closes a tool group. Keep any\r\n // presentable task/warning metadata after that group without splitting\r\n // consecutive root tools that occurred between the same two prose spans.\r\n group.trailingActivities.push(activity)\r\n continue\r\n }\r\n emitRow(activity)\r\n }\r\n flushGroup()\r\n return items\r\n}\r\n\r\ninterface ClaudeActivityStepState extends ClaudeActivityStepMarker {\r\n readonly anchorSeq: number\r\n readonly assistantSeq?: number\r\n}\r\n\r\n/** Keep one sidecar-backed activity group at the live chat tail, then anchor it\r\n * before the native assistant message or at step settlement when none appears. */\r\nexport const claudeActivityStepDefinition: ConversationNodeDefinition<ClaudeActivityStepState> = {\r\n kind: 'claude-activity-step',\r\n target: 'chat',\r\n match(event) {\r\n if (event.type === 'step/start') return { id: `${event.data.turn}:${event.data.step}`, role: 'start' }\r\n if (event.type === 'step/end') return { id: `${event.data.turn}:${event.data.step}`, role: 'update' }\r\n if (event.type !== 'assistant/message' || event.data.message.source.provider !== CLAUDE_CODE_PROVIDER) return null\r\n return { id: `${event.data.turn}:${event.data.step}`, role: 'update' }\r\n },\r\n start(_context, match) {\r\n if (match.event.type !== 'step/start') throw new Error('Claude activity step requires step/start')\r\n return {\r\n turn: match.event.data.turn,\r\n step: match.event.data.step,\r\n anchorSeq: Number.MAX_SAFE_INTEGER - 1,\r\n }\r\n },\r\n update(context, match) {\r\n if (match.event.type === 'assistant/message') {\r\n return { ...context.state, assistantSeq: match.event.seq, anchorSeq: match.event.seq - 0.1 }\r\n }\r\n if (match.event.type === 'step/end') {\r\n return context.state.assistantSeq === undefined\r\n ? { ...context.state, anchorSeq: match.event.seq - 0.1 }\r\n : context.state\r\n }\r\n throw new Error('Claude activity step update requires assistant/message or step/end')\r\n },\r\n buildViewNode(context): ChatConversationViewNode | null {\r\n const state = context.state\r\n if (state === undefined) return null\r\n return {\r\n key: context.key,\r\n kind: 'claude-activity-step',\r\n id: context.id,\r\n target: 'chat',\r\n anchorSeq: state.anchorSeq,\r\n location: context.start?.location ?? { kind: 'unresolved' },\r\n visibility: 'visible',\r\n data: { turn: state.turn, step: state.step },\r\n }\r\n },\r\n}\r\n\r\n/** Keep one sidecar-backed task launcher mounted only while its DSH turn is open. */\r\nexport const claudeActiveTasksDefinition: ConversationNodeDefinition<ClaudeActiveTasksState> = {\r\n kind: 'claude-active-tasks',\r\n target: 'chat',\r\n match(event) {\r\n if (event.type === 'turn/start') return { id: String(event.data.turn), role: 'start' }\r\n if (event.type === 'turn/end' || event.type === 'step/start' || event.type === 'assistant/message') {\r\n return { id: String(event.data.turn), role: 'update' }\r\n }\r\n return null\r\n },\r\n start(_context, match) {\r\n if (match.event.type !== 'turn/start') throw new Error('Claude active tasks require turn/start')\r\n // A user/message has no turn coordinate in the public event payload, so it\r\n // cannot update this turn-keyed Context directly. Keep the launcher at the\r\n // live chat tail until assistant output provides a concrete later anchor.\r\n return {\r\n turn: match.event.data.turn,\r\n active: true,\r\n anchored: false,\r\n anchorSeq: Number.MAX_SAFE_INTEGER,\r\n }\r\n },\r\n update(context, match) {\r\n if (match.event.type === 'turn/end') return { ...context.state, active: false }\r\n if (match.event.type === 'step/start' && !context.state.anchored) return context.state\r\n return { ...context.state, anchored: true, anchorSeq: match.event.seq + 0.1 }\r\n },\r\n buildViewNode(context): ChatConversationViewNode | null {\r\n const state = context.state\r\n if (state === undefined) return null\r\n return {\r\n key: context.key,\r\n kind: 'claude-active-tasks',\r\n id: context.id,\r\n target: 'chat',\r\n anchorSeq: state.anchorSeq,\r\n location: context.start?.location ?? { kind: 'unresolved' },\r\n // Incremental assemblers forbid withdrawing a materialized node. Keep\r\n // its key stable after turn/end and hide it while the turn tail takes over.\r\n visibility: state.active ? 'visible' : 'hidden',\r\n data: { turn: state.turn },\r\n }\r\n },\r\n}\r\n\r\n/** Publish a marker for turns containing standard assistant output from the Claude adapter. */\r\nexport const claudeTurnDefinition: ConversationNodeDefinition<ClaudeTurnProjectionState> = {\r\n kind: 'claudeCode',\r\n match(event) {\r\n if (event.type === 'turn/start') return { id: String(event.data.turn), role: 'start' }\r\n if (event.type !== 'assistant/message' || event.data.message.source.provider !== CLAUDE_CODE_PROVIDER) return null\r\n return { id: String(event.data.turn), role: 'update' }\r\n },\r\n start(_context, match) {\r\n if (match.event.type !== 'turn/start') throw new Error('Claude turn marker requires turn/start')\r\n return { turn: match.event.data.turn, claude: false }\r\n },\r\n update(context, match) {\r\n if (match.event.type !== 'assistant/message') throw new Error('Claude turn marker update requires assistant/message')\r\n return context.state.claude ? context.state : { turn: context.state.turn, claude: true }\r\n },\r\n buildLocationData(context, scope) {\r\n if (scope !== 'turn' || context.state?.claude !== true) return null\r\n const value: ClaudeTurnMarker = { turn: context.state.turn }\r\n return { kind: 'turn', turn: context.state.turn, key: 'claudeCode', value }\r\n },\r\n}\r\n\r\n/** Pure chain selector: only Claude-produced turns mount the sidecar-backed tail. */\r\nexport function selectClaudeTurn(owner: TurnTailOwnerProps): ClaudeTurnMarker | null {\r\n return owner.turn.data.get('claudeCode') ?? null\r\n}\r\n","import type { CSSProperties } from 'react'\r\n\r\nexport const iconChipRunning: CSSProperties = {\r\n color: 'var(--dsw-static-blue-450)',\r\n}\r\n\r\nexport const iconChipError: CSSProperties = {\r\n color: 'var(--dsw-alias-state-error-primary)',\r\n}\r\n\r\nexport const chevron: CSSProperties = {\r\n flex: 'none',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n lineHeight: '20px',\r\n transition: 'transform 120ms ease',\r\n userSelect: 'none',\r\n}\r\n\r\nexport const chevronOpen: CSSProperties = {\r\n transform: 'rotate(90deg)',\r\n}\r\n\r\nexport const detailCode: CSSProperties = {\r\n maxHeight: 220,\r\n overflow: 'auto',\r\n margin: '5px 0 0',\r\n padding: '8px 10px',\r\n borderRadius: 6,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 11,\r\n lineHeight: '17px',\r\n whiteSpace: 'pre-wrap',\r\n overflowWrap: 'anywhere',\r\n}\r\n\r\nexport const settingsPage: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 16,\r\n width: '100%',\r\n maxWidth: 820,\r\n paddingBottom: 28,\r\n}\r\n\r\nexport const settingsHero: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 14,\r\n padding: '2px 2px 8px',\r\n}\r\n\r\nexport const settingsMark: CSSProperties = {\r\n width: 42,\r\n height: 42,\r\n display: 'grid',\r\n placeItems: 'center',\r\n flex: 'none',\r\n borderRadius: 13,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-static-blue-450)',\r\n fontSize: 18,\r\n fontWeight: 700,\r\n}\r\n\r\nexport const settingsHeading: CSSProperties = {\r\n margin: 0,\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontSize: 20,\r\n lineHeight: '28px',\r\n fontWeight: 650,\r\n}\r\n\r\nexport const settingsSectionHeading: CSSProperties = {\r\n margin: 0,\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontSize: 15,\r\n lineHeight: '22px',\r\n fontWeight: 650,\r\n}\r\n\r\nexport const settingsBody: CSSProperties = {\r\n margin: 0,\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n}\r\n\r\nexport const settingsCard: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 14,\r\n padding: 18,\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 14,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n}\r\n\r\nexport const settingsCardHeader: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n justifyContent: 'space-between',\r\n gap: 16,\r\n}\r\n\r\nexport const diagnosticGrid: CSSProperties = {\r\n display: 'grid',\r\n gridTemplateColumns: 'minmax(130px, 0.36fr) minmax(0, 1fr)',\r\n gap: '10px 18px',\r\n padding: '14px 0',\r\n borderTop: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n fontSize: 13,\r\n}\r\n\r\nexport const diagnosticLabel: CSSProperties = {\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n}\r\n\r\nexport const diagnosticValue: CSSProperties = {\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontWeight: 500,\r\n overflowWrap: 'anywhere',\r\n}\r\n\r\nexport const settingSelect: CSSProperties = {\r\n position: 'relative',\r\n minWidth: 0,\r\n}\r\n\r\nexport const settingTextInput: CSSProperties = {\r\n width: '100%',\r\n minWidth: 0,\r\n boxSizing: 'border-box',\r\n minHeight: 38,\r\n padding: '7px 13px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 10,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n font: 'inherit',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n}\r\n\r\nexport const settingSelectTrigger: CSSProperties = {\r\n width: '100%',\r\n minHeight: 38,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 12,\r\n padding: '7px 11px 7px 13px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 10,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n boxShadow: '0 1px 2px color-mix(in srgb, var(--dsw-alias-label-primary) 5%, transparent)',\r\n font: 'inherit',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n textAlign: 'left',\r\n cursor: 'pointer',\r\n transition: 'border-color 120ms ease, box-shadow 120ms ease, background 120ms ease',\r\n}\r\n\r\nexport const settingSelectTriggerOpen: CSSProperties = {\r\n borderColor: 'var(--dsw-static-blue-450)',\r\n boxShadow: '0 0 0 3px color-mix(in srgb, var(--dsw-static-blue-450) 15%, transparent)',\r\n}\r\n\r\nexport const settingSelectValue: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const settingSelectChevron: CSSProperties = {\r\n flex: 'none',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 16,\r\n lineHeight: 1,\r\n transform: 'translateY(-1px)',\r\n transition: 'transform 120ms ease',\r\n}\r\n\r\nexport const settingSelectChevronOpen: CSSProperties = {\r\n transform: 'translateY(1px) rotate(180deg)',\r\n}\r\n\r\nexport const settingSelectMenu: CSSProperties = {\r\n position: 'absolute',\r\n zIndex: 20,\r\n top: 'calc(100% + 6px)',\r\n left: 0,\r\n right: 0,\r\n maxHeight: 240,\r\n overflowY: 'auto',\r\n padding: 5,\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 11,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n boxShadow: '0 12px 32px color-mix(in srgb, var(--dsw-alias-label-primary) 16%, transparent), 0 2px 8px color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent)',\r\n}\r\n\r\nexport const settingSelectOption: CSSProperties = {\r\n width: '100%',\r\n minHeight: 34,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n padding: '6px 9px',\r\n border: 'none',\r\n borderRadius: 7,\r\n background: 'transparent',\r\n color: 'var(--dsw-alias-label-primary)',\r\n font: 'inherit',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n textAlign: 'left',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const settingSelectOptionActive: CSSProperties = {\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n}\r\n\r\nexport const settingSelectCheck: CSSProperties = {\r\n width: 14,\r\n flex: 'none',\r\n color: 'var(--dsw-static-blue-450)',\r\n fontSize: 12,\r\n fontWeight: 700,\r\n textAlign: 'center',\r\n}\r\n\r\nexport const settingHint: CSSProperties = {\r\n display: 'inline-grid',\r\n placeItems: 'center',\r\n width: 14,\r\n height: 14,\r\n marginLeft: 6,\r\n verticalAlign: 'text-top',\r\n borderRadius: '50%',\r\n border: '1px solid currentColor',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 9,\r\n fontWeight: 600,\r\n lineHeight: 1,\r\n cursor: 'help',\r\n userSelect: 'none',\r\n}\r\nexport const planUsageMeter: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 10,\r\n minWidth: 0,\r\n}\r\nexport const planUsageTrack: CSSProperties = {\r\n flex: '1 1 auto',\r\n height: 6,\r\n minWidth: 60,\r\n borderRadius: 3,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n overflow: 'hidden',\r\n}\r\nexport const planUsageFill: CSSProperties = {\r\n // A span defaults to inline, where width and height are ignored — the bar\r\n // silently renders as an empty track without this.\r\n display: 'block',\r\n height: '100%',\r\n borderRadius: 3,\r\n transition: 'width 200ms ease',\r\n}\r\nexport const planUsageMeta: CSSProperties = {\r\n flex: '0 0 auto',\r\n fontSize: 12,\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const PLAN_USAGE_WARNING_AT = 75\r\nexport const PLAN_USAGE_ERROR_AT = 90\r\n\r\n/** Bar colour, plus a matching text colour once a window is worth noticing.\r\n * Below the warning threshold the reading stays quiet: accent bar, muted text. */\r\nexport function planUsageTone(utilization: number | undefined): { fill: string; text: string } {\r\n if (utilization !== undefined && utilization >= PLAN_USAGE_ERROR_AT) {\r\n return { fill: 'var(--dsw-alias-state-error-primary)', text: 'var(--dsw-alias-state-error-primary)' }\r\n }\r\n if (utilization !== undefined && utilization >= PLAN_USAGE_WARNING_AT) {\r\n return { fill: 'var(--dsw-alias-state-warning-primary, #d69e2e)', text: 'var(--dsw-alias-state-warning-primary, #d69e2e)' }\r\n }\r\n return {\r\n fill: utilization === undefined ? 'transparent' : 'var(--dsw-static-blue-450)',\r\n text: 'var(--dsw-alias-label-tertiary)',\r\n }\r\n}\r\nexport const settingsActions: CSSProperties = {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n gap: 8,\r\n}\r\n\r\nexport const notice: CSSProperties = {\r\n margin: 0,\r\n padding: '10px 12px',\r\n borderRadius: 9,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n}\r\n\r\nexport const button: CSSProperties = {\r\n alignSelf: 'flex-start',\r\n flex: 'none',\r\n minHeight: 34,\r\n padding: '6px 14px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 9,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n font: 'inherit',\r\n fontSize: 13,\r\n fontWeight: 550,\r\n whiteSpace: 'nowrap',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const primaryButton: CSSProperties = {\r\n ...button,\r\n borderColor: 'transparent',\r\n background: 'var(--dsw-static-blue-450)',\r\n color: 'var(--dsw-static-white)',\r\n}\r\n\r\n/* Claude tasks details panel (right sidebar). */\r\n\r\nexport const tasksPanel: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n minWidth: 0,\r\n overflow: 'hidden',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 12,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n boxShadow: '0 4px 16px color-mix(in srgb, #000 12%, transparent)',\r\n}\r\n\r\nexport const detailsCardClass = 'dshClaudeDetailsCard'\r\n\r\n/**\r\n * Geometry shared by every details-column card. Lives in a stylesheet rather\r\n * than inline so the DSH Desktop macOS shell can be special-cased: its\r\n * \"advanced\" frame floats a 32px opaque caption/drag row over the top of the\r\n * conversation and details columns, 12px of which lands inside the column and\r\n * used to cover the card's top border and corners.\r\n */\r\nexport const detailsCardCss = `\r\n.${detailsCardClass} {\r\n box-sizing: border-box;\r\n width: calc(100% - 16px);\r\n height: calc(100% - 16px);\r\n margin: 8px;\r\n}\r\n.dshDesktopFrame[data-desktop-mode=\"advanced\"][data-desktop-platform=\"darwin\"] .dshDesktopDetailsSurface .${detailsCardClass} {\r\n height: calc(100% - 28px);\r\n margin-top: 20px;\r\n}\r\n`\r\n\r\nexport const tasksHeader: CSSProperties = {\r\n boxSizing: 'border-box',\r\n height: 58,\r\n flex: 'none',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 10,\r\n padding: '9px 12px',\r\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n}\r\n\r\nexport const tasksHeading: CSSProperties = {\r\n display: 'block',\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontSize: 15,\r\n lineHeight: '20px',\r\n fontWeight: 600,\r\n}\r\n\r\nexport const tasksTurnMeta: CSSProperties = {\r\n display: 'block',\r\n marginTop: 1,\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n lineHeight: '17px',\r\n}\r\n\r\nexport const panelIconButtonClass = 'dshClaudePanelIconButton'\r\n\r\nexport const panelIconButtonCss = `\r\n.${panelIconButtonClass} {\r\n width: 26px;\r\n height: 26px;\r\n display: grid;\r\n place-items: center;\r\n padding: 0;\r\n border: none;\r\n border-radius: 7px;\r\n background: transparent;\r\n color: var(--dsw-alias-label-tertiary);\r\n font: inherit;\r\n line-height: 1;\r\n cursor: pointer;\r\n transition: background-color 120ms ease, color 120ms ease;\r\n}\r\n.${panelIconButtonClass}:hover {\r\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\r\n color: var(--dsw-alias-label-primary);\r\n}\r\n.${panelIconButtonClass}:active {\r\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent);\r\n}\r\n.${panelIconButtonClass}:focus-visible {\r\n outline: 2px solid var(--dsw-static-blue-450);\r\n outline-offset: 1px;\r\n}\r\n`\r\n\r\nexport const tasksBody: CSSProperties = {\r\n flex: 1,\r\n minHeight: 0,\r\n overflowY: 'auto',\r\n padding: '12px 14px 20px',\r\n background: 'var(--dsw-alias-bg-base)',\r\n}\r\n\r\nexport const tasksGroupHeading: CSSProperties = {\r\n minHeight: 30,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 8,\r\n}\r\n\r\nexport const tasksGroupTitle: CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n fontWeight: 600,\r\n}\r\n\r\nexport const tasksGroupToggle: CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n padding: 0,\r\n border: 'none',\r\n background: 'transparent',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n font: 'inherit',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const tasksGroupCount: CSSProperties = {\r\n minWidth: 18,\r\n padding: '0 5px',\r\n borderRadius: 999,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n lineHeight: '18px',\r\n textAlign: 'center',\r\n fontVariantNumeric: 'tabular-nums',\r\n}\r\n\r\nexport const tasksGroupEmpty: CSSProperties = {\r\n margin: '5px 4px 2px',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n}\r\n\r\nexport const tasksFinishedSection: CSSProperties = {\r\n marginTop: 12,\r\n paddingTop: 8,\r\n borderTop: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n}\r\n\r\nexport const taskCardList: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 8,\r\n marginTop: 4,\r\n}\r\n\r\nexport const taskCard: CSSProperties = {\r\n padding: '11px 12px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 10,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n boxShadow: '0 1px 3px color-mix(in srgb, #000 7%, transparent)',\r\n}\r\n\r\nexport const taskCardRunning: CSSProperties = {\r\n borderColor: 'var(--dsw-alias-border-l3, color-mix(in srgb, currentColor 24%, transparent))',\r\n}\r\n\r\nexport const taskCardTop: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: 9,\r\n}\r\n\r\nexport const taskCardGlyph: CSSProperties = {\r\n width: 18,\r\n height: 18,\r\n flex: 'none',\r\n display: 'grid',\r\n placeItems: 'center',\r\n marginTop: 1,\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n lineHeight: 1,\r\n}\r\n\r\nexport const taskCardBody: CSSProperties = {\r\n flex: 1,\r\n minWidth: 0,\r\n}\r\n\r\nexport const taskTitle: CSSProperties = {\r\n margin: 0,\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontSize: 14,\r\n lineHeight: '20px',\r\n fontWeight: 550,\r\n overflowWrap: 'anywhere',\r\n}\r\n\r\nexport const taskStatusLine: CSSProperties = {\r\n margin: '1px 0 0',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n lineHeight: '17px',\r\n}\r\n\r\nexport const taskMeta: CSSProperties = {\r\n margin: '7px 0 0 27px',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n lineHeight: '17px',\r\n overflowWrap: 'anywhere',\r\n}\r\n\r\nexport const taskSummary: CSSProperties = {\r\n margin: '6px 0 0 27px',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n whiteSpace: 'pre-wrap',\r\n overflowWrap: 'anywhere',\r\n}\r\n\r\nexport const taskTextButton: CSSProperties = {\r\n padding: 0,\r\n border: 'none',\r\n background: 'transparent',\r\n color: 'var(--dsw-static-blue-450)',\r\n font: 'inherit',\r\n fontSize: 11,\r\n lineHeight: '18px',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const taskActivitySection: CSSProperties = {\r\n margin: '7px 0 0 27px',\r\n}\r\n\r\nexport const taskActivityList: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 7,\r\n margin: '7px 0 0',\r\n padding: '8px 9px',\r\n borderRadius: 8,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n listStyle: 'none',\r\n}\r\n\r\nexport const taskActivityItem: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: 6,\r\n}\r\n\r\nexport const taskActivityGlyph: CSSProperties = {\r\n flex: 'none',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n lineHeight: '17px',\r\n}\r\n\r\nexport const taskActivityBody: CSSProperties = {\r\n flex: 1,\r\n minWidth: 0,\r\n}\r\n\r\nexport const taskActivityTitle: CSSProperties = {\r\n margin: 0,\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 11,\r\n lineHeight: '17px',\r\n fontWeight: 500,\r\n overflowWrap: 'anywhere',\r\n}\r\n\r\nexport const taskActivitySummary: CSSProperties = {\r\n margin: '1px 0 0',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n lineHeight: '17px',\r\n whiteSpace: 'pre-wrap',\r\n overflowWrap: 'anywhere',\r\n}\r\n\r\nexport const taskActivityDetail: CSSProperties = {\r\n marginTop: 3,\r\n}\r\n\r\nexport const taskActivityDetailSummary: CSSProperties = {\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 10,\r\n lineHeight: '16px',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const tasksBadge: CSSProperties = {\r\n position: 'absolute',\r\n top: -3,\r\n right: -5,\r\n minWidth: 14,\r\n height: 14,\r\n display: 'grid',\r\n placeItems: 'center',\r\n padding: '0 3px',\r\n borderRadius: 999,\r\n background: 'var(--dsw-static-blue-450)',\r\n color: 'var(--dsw-alias-label-on-accent, #fff)',\r\n fontSize: 9,\r\n lineHeight: '1',\r\n fontWeight: 600,\r\n}\r\n\r\n/* Claude task launcher attached to the owning conversation turn (minimal\r\n * entry: a link-style label at the turn tail, hover reveals the task list). */\r\n\r\nexport const tasksBadgeWrap: CSSProperties = {\r\n display: 'flex',\r\n justifyContent: 'flex-start',\r\n margin: '8px 0 4px',\r\n}\r\n\r\nexport const tasksBadgeSeat: CSSProperties = {\r\n position: 'relative',\r\n display: 'inline-flex',\r\n}\r\n\r\nexport const tasksTurnBadge: CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n padding: '2px 4px',\r\n border: 'none',\r\n borderRadius: 6,\r\n background: 'transparent',\r\n color: 'var(--dsw-static-blue-450)',\r\n font: 'inherit',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n fontVariantNumeric: 'tabular-nums',\r\n cursor: 'pointer',\r\n transition: 'color 120ms ease, opacity 120ms ease',\r\n}\r\n\r\nexport const tasksBadgeHovered: CSSProperties = {\r\n textDecoration: 'underline',\r\n}\r\n\r\nexport const tasksBadgeDone: CSSProperties = {\r\n opacity: 0.7,\r\n}\r\n\r\nexport const tasksBadgeDot: CSSProperties = {\r\n width: 8,\r\n height: 8,\r\n flex: 'none',\r\n borderRadius: 999,\r\n background: 'var(--dsw-static-blue-450)',\r\n}\r\n\r\nexport const tasksBadgeDotError: CSSProperties = {\r\n background: 'var(--dsw-alias-state-error-primary)',\r\n}\r\n\r\nexport const tasksBadgeDotDone: CSSProperties = {\r\n background: 'var(--dsw-alias-state-success-primary, var(--dsw-static-green-500))',\r\n}\r\n\r\nexport const tasksBadgeLabel: CSSProperties = {\r\n fontWeight: 500,\r\n}\r\n\r\nexport const tasksHoverCard: CSSProperties = {\r\n position: 'absolute',\r\n left: 0,\r\n bottom: 'calc(100% + 8px)',\r\n zIndex: 40,\r\n minWidth: 240,\r\n maxWidth: 340,\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 6,\r\n padding: '10px 12px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 12,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n boxShadow: '0 8px 24px color-mix(in srgb, #000 24%, transparent)',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n pointerEvents: 'auto',\r\n}\r\n\r\nexport const tasksHoverHeader: CSSProperties = {\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontWeight: 600,\r\n}\r\n\r\nexport const tasksHoverRow: CSSProperties = {\r\n minWidth: 0,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 7,\r\n}\r\n\r\nexport const tasksHoverGlyph: CSSProperties = {\r\n width: 12,\r\n flex: 'none',\r\n textAlign: 'center',\r\n fontSize: 10,\r\n lineHeight: 1,\r\n fontWeight: 700,\r\n}\r\n\r\nexport const tasksHoverGlyphRunning: CSSProperties = {\r\n color: 'var(--dsw-static-blue-450)',\r\n}\r\n\r\nexport const tasksHoverGlyphError: CSSProperties = {\r\n color: 'var(--dsw-alias-state-error-primary)',\r\n}\r\n\r\nexport const tasksHoverGlyphDone: CSSProperties = {\r\n color: 'var(--dsw-alias-state-success-primary, var(--dsw-static-green-500))',\r\n}\r\n\r\nexport const tasksHoverDesc: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n}\r\n\r\nexport const tasksHoverType: CSSProperties = {\r\n flex: 'none',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 10,\r\n}\r\n\r\nexport const tasksHoverMore: CSSProperties = {\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n}\r\n\r\nexport const tasksHoverHint: CSSProperties = {\r\n marginTop: 2,\r\n paddingTop: 6,\r\n borderTop: '1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent))',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n}\r\n\r\n/* Claude repository setup controls on the blank-session hero. */\r\n\r\nexport const heroRepositoryControls: CSSProperties = {\r\n position: 'relative',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n minWidth: 0,\r\n}\r\n\r\nexport const heroRepositoryCapsule: CSSProperties = {\r\n height: 30,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n minWidth: 0,\r\n padding: 2,\r\n border: '1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent))',\r\n borderRadius: 10,\r\n background: 'var(--dsw-alias-interactive-bg-base, var(--dsw-alias-bg-layer-1))',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n}\r\n\r\nexport const heroBranchPicker: CSSProperties = {\r\n position: 'relative',\r\n display: 'inline-flex',\r\n minWidth: 0,\r\n}\r\n\r\nexport const heroBranchTrigger: CSSProperties = {\r\n height: 26,\r\n maxWidth: 230,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n minWidth: 0,\r\n padding: '0 7px',\r\n border: 'none',\r\n borderRadius: 7,\r\n background: 'transparent',\r\n color: 'inherit',\r\n font: 'inherit',\r\n fontSize: 13,\r\n lineHeight: '18px',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const heroBranchName: CSSProperties = {\r\n minWidth: 0,\r\n overflow: 'hidden',\r\n color: 'var(--dsw-alias-label-primary)',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const heroBranchMenu: CSSProperties = {\r\n position: 'absolute',\r\n zIndex: 1100,\r\n top: 'calc(100% + 6px)',\r\n left: 0,\r\n width: 280,\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 4,\r\n padding: 4,\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 10,\r\n background: 'var(--dsw-specific-menu)',\r\n boxShadow: 'var(--dsw-shadow-lv3)',\r\n}\r\n\r\nexport const heroBranchSearchRow: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n}\r\n\r\n/** The branch search shares its row with the refresh button; the ticket search\r\n * owns its row and keeps the plain style. */\r\nexport const heroBranchSearchGrow: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n}\r\n\r\nexport const heroBranchSearch: CSSProperties = {\r\n height: 32,\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n padding: '0 8px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 7,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n}\r\n\r\nexport const heroBranchSearchInput: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n border: 'none',\r\n outline: 'none',\r\n background: 'transparent',\r\n color: 'var(--dsw-alias-label-primary)',\r\n font: 'inherit',\r\n fontSize: 13,\r\n lineHeight: '18px',\r\n}\r\n\r\nexport const heroBranchRefresh: CSSProperties = {\r\n width: 32,\r\n height: 32,\r\n boxSizing: 'border-box',\r\n display: 'grid',\r\n placeItems: 'center',\r\n flex: 'none',\r\n padding: 0,\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 7,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const heroBranchRefreshHover: CSSProperties = {\r\n background: 'var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2))',\r\n color: 'var(--dsw-alias-label-primary)',\r\n}\r\n\r\nexport const heroBranchRefreshBusy: CSSProperties = {\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n cursor: 'default',\r\n}\r\n\r\nexport const heroBranchNotice: CSSProperties = {\r\n padding: '0 8px',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n lineHeight: '16px',\r\n}\r\n\r\nexport const heroBranchNoticeError: CSSProperties = {\r\n color: 'var(--dsw-alias-state-error-primary)',\r\n}\r\n\r\nexport const heroBranchList: CSSProperties = {\r\n maxHeight: 170,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n overflowY: 'auto',\r\n overscrollBehavior: 'contain',\r\n}\r\n\r\nexport const heroBranchItem: CSSProperties = {\r\n width: '100%',\r\n height: 36,\r\n minHeight: 36,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n padding: '0 9px',\r\n border: 'none',\r\n borderRadius: 7,\r\n background: 'transparent',\r\n color: 'var(--dsw-alias-label-primary)',\r\n font: 'inherit',\r\n fontSize: 13,\r\n lineHeight: '18px',\r\n textAlign: 'left',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const heroBranchItemActive: CSSProperties = {\r\n background: 'var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2))',\r\n}\r\n\r\nexport const heroBranchItemName: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const heroBranchEmpty: CSSProperties = {\r\n height: 36,\r\n display: 'grid',\r\n placeItems: 'center',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 13,\r\n}\r\n\r\nexport const heroRepositoryDivider: CSSProperties = {\r\n width: 1,\r\n height: 16,\r\n flex: 'none',\r\n background: 'var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n}\r\n\r\nexport const heroWorktreeToggle: CSSProperties = {\r\n height: 26,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n padding: '0 7px',\r\n border: 'none',\r\n borderRadius: 7,\r\n outline: 'none',\r\n background: 'transparent',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n font: 'inherit',\r\n fontSize: 13,\r\n lineHeight: '18px',\r\n whiteSpace: 'nowrap',\r\n cursor: 'pointer',\r\n transition: 'background 120ms ease, color 120ms ease, box-shadow 120ms ease',\r\n}\r\n\r\nexport const heroWorktreeToggleActive: CSSProperties = {\r\n background: 'color-mix(in srgb, var(--dsw-static-blue-450) 10%, transparent)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n}\r\n\r\nexport const heroWorktreeToggleFocused: CSSProperties = {\r\n boxShadow: '0 0 0 2px color-mix(in srgb, var(--dsw-static-blue-450) 28%, transparent)',\r\n}\r\n\r\nexport const heroWorktreeCheckbox: CSSProperties = {\r\n width: 15,\r\n height: 15,\r\n boxSizing: 'border-box',\r\n display: 'grid',\r\n placeItems: 'center',\r\n flex: 'none',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 4,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n boxShadow: 'inset 0 1px 1px rgba(0, 0, 0, 0.08)',\r\n color: 'var(--dsw-alias-label-on-accent, #fff)',\r\n transition: 'border-color 120ms ease, background 120ms ease, box-shadow 120ms ease',\r\n}\r\n\r\nexport const heroWorktreeCheckboxChecked: CSSProperties = {\r\n borderColor: 'var(--dsw-static-blue-450)',\r\n background: 'var(--dsw-static-blue-450)',\r\n boxShadow: '0 1px 3px color-mix(in srgb, var(--dsw-static-blue-450) 35%, transparent)',\r\n}\r\n\r\nexport const heroWorktreeCheckboxIcon: CSSProperties = {\r\n width: 12,\r\n height: 12,\r\n display: 'block',\r\n}\r\n\r\nexport const heroWorktreeProgressCard: CSSProperties = {\r\n position: 'absolute',\r\n zIndex: 1050,\r\n top: 'calc(100% + 10px)',\r\n left: 0,\r\n width: 320,\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 12,\r\n padding: 14,\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 12,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n boxShadow: 'var(--dsw-shadow-lv3)',\r\n}\r\n\r\nexport const heroWorktreeProgressHeader: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: 10,\r\n}\r\n\r\nexport const heroWorktreeProgressSpinner: CSSProperties = {\r\n width: 18,\r\n height: 18,\r\n flex: 'none',\r\n color: 'var(--dsw-static-blue-450)',\r\n}\r\n\r\nexport const heroWorktreeProgressError: CSSProperties = {\r\n width: 18,\r\n height: 18,\r\n display: 'grid',\r\n placeItems: 'center',\r\n flex: 'none',\r\n borderRadius: '50%',\r\n background: 'var(--dsw-alias-state-error-primary)',\r\n color: 'var(--dsw-alias-label-on-accent, #fff)',\r\n fontSize: 13,\r\n lineHeight: 1,\r\n}\r\n\r\nexport const heroWorktreeProgressCopy: CSSProperties = {\r\n minWidth: 0,\r\n display: 'flex',\r\n flex: 1,\r\n flexDirection: 'column',\r\n gap: 2,\r\n}\r\n\r\nexport const heroWorktreeProgressTitle: CSSProperties = {\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontSize: 13,\r\n lineHeight: '18px',\r\n fontWeight: 600,\r\n}\r\n\r\nexport const heroWorktreeProgressCurrent: CSSProperties = {\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n overflowWrap: 'anywhere',\r\n}\r\n\r\nexport const heroWorktreeProgressContext: CSSProperties = {\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontWeight: 500,\r\n}\r\n\r\nexport const heroWorktreeProgressDismiss: CSSProperties = {\r\n width: 24,\r\n height: 24,\r\n display: 'grid',\r\n placeItems: 'center',\r\n flex: 'none',\r\n padding: 0,\r\n border: 'none',\r\n borderRadius: 6,\r\n background: 'transparent',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n font: 'inherit',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const heroWorktreeProgressSteps: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 7,\r\n paddingLeft: 2,\r\n}\r\n\r\nexport const heroWorktreeProgressStep: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 11,\r\n lineHeight: '16px',\r\n}\r\n\r\nexport const heroWorktreeProgressDot: CSSProperties = {\r\n width: 14,\r\n height: 14,\r\n display: 'grid',\r\n placeItems: 'center',\r\n flex: 'none',\r\n boxSizing: 'border-box',\r\n borderRadius: '50%',\r\n fontSize: 9,\r\n lineHeight: 1,\r\n}\r\n\r\nexport const heroWorktreeProgressDotDone: CSSProperties = {\r\n background: 'var(--dsw-static-blue-450)',\r\n color: 'var(--dsw-alias-label-on-accent, #fff)',\r\n}\r\n\r\nexport const heroWorktreeProgressDotActive: CSSProperties = {\r\n border: '2px solid var(--dsw-static-blue-450)',\r\n}\r\n\r\nexport const heroRepositoryStatus: CSSProperties = {\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const heroRepositoryError: CSSProperties = {\r\n maxWidth: 240,\r\n overflow: 'hidden',\r\n color: 'var(--dsw-alias-state-error-primary)',\r\n fontSize: 11,\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\n/* Claude repository readout and details panel. */\r\n\r\nexport const repositoryBarFrame: CSSProperties = {\r\n width: 'calc(100% - 64px)',\r\n maxWidth: 'var(--dsh-conversation-composer-max-width, 782px)',\r\n minWidth: 0,\r\n margin: '0 auto',\r\n boxSizing: 'border-box',\r\n}\r\n\r\nexport const repositoryBar: CSSProperties = {\r\n width: '100%',\r\n minWidth: 0,\r\n minHeight: 42,\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 9,\r\n padding: '7px 11px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 11,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n boxShadow: '0 1px 2px color-mix(in srgb, var(--dsw-alias-label-primary) 4%, transparent)',\r\n font: 'inherit',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n textAlign: 'left',\r\n}\r\n\r\n/* Queue strip replacing the Host dock entry; mirrors the repository bar. */\r\n\r\nexport const queueBar: CSSProperties = {\r\n width: '100%',\r\n minWidth: 0,\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n padding: '3px 6px 3px 11px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 11,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n boxShadow: '0 1px 2px color-mix(in srgb, var(--dsw-alias-label-primary) 4%, transparent)',\r\n font: 'inherit',\r\n fontSize: 13,\r\n lineHeight: '20px',\r\n}\r\n\r\nexport const queueHeader: CSSProperties = {\r\n width: '100%',\r\n minHeight: 30,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n padding: '2px 0',\r\n border: 'none',\r\n outline: 'none',\r\n background: 'transparent',\r\n color: 'inherit',\r\n font: 'inherit',\r\n fontSize: 13,\r\n textAlign: 'left',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const queueLead: CSSProperties = {\r\n flex: 'none',\r\n display: 'grid',\r\n placeItems: 'center',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n}\r\n\r\nexport const queueCount: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n fontWeight: 550,\r\n}\r\n\r\nexport const queueList: CSSProperties = {\r\n maxHeight: 180,\r\n margin: 0,\r\n padding: 0,\r\n listStyle: 'none',\r\n overflowY: 'auto',\r\n}\r\n\r\nexport const queueRow: CSSProperties = {\r\n minHeight: 30,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n}\r\n\r\nexport const queueRowDivider: CSSProperties = {\r\n borderTop: '1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent))',\r\n}\r\n\r\nexport const queuePreview: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n overflow: 'hidden',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const queueEditor: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n height: 26,\r\n boxSizing: 'border-box',\r\n padding: '0 8px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 6,\r\n outline: 'none',\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n font: 'inherit',\r\n fontSize: 13,\r\n}\r\n\r\nexport const queueActions: CSSProperties = {\r\n flex: 'none',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 2,\r\n}\r\n\r\nexport const repositoryBarMerged: CSSProperties = {\r\n // Pure purple tint: mixing with the theme border token (white-alpha in dark\r\n // themes) produced a bright, near-white line.\r\n borderColor: 'color-mix(in srgb, #a78bfa 35%, transparent)',\r\n background: 'color-mix(in srgb, #a78bfa 5%, var(--dsw-alias-bg-layer-1))',\r\n}\r\n\r\nexport const repositoryPrIcon: CSSProperties = {\r\n width: 20,\r\n height: 20,\r\n display: 'grid',\r\n placeItems: 'center',\r\n flex: 'none',\r\n borderRadius: 6,\r\n color: 'var(--dsw-alias-state-success-primary, var(--dsw-static-blue-450))',\r\n}\r\n\r\nexport const repositoryPrIconMerged: CSSProperties = {\r\n color: '#a78bfa',\r\n}\r\n\r\nexport const repositoryPrimary: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n overflow: 'hidden',\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontSize: 13,\r\n fontWeight: 600,\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const repositoryPrLinkFrame: CSSProperties = {\r\n position: 'relative',\r\n flex: 'none',\r\n}\r\n\r\nexport const repositoryPrLink: CSSProperties = {\r\n color: 'var(--dsw-alias-state-success-primary)',\r\n fontSize: 13,\r\n fontWeight: 650,\r\n textDecoration: 'none',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const repositoryPrLinkMerged: CSSProperties = {\r\n color: '#a78bfa',\r\n}\r\n\r\nexport const repositoryPrHoverCard: CSSProperties = {\r\n position: 'absolute',\r\n zIndex: 30,\r\n left: -34,\r\n bottom: 'calc(100% + 14px)',\r\n width: 340,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 10,\r\n padding: '13px 14px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 12,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n boxShadow: '0 14px 38px color-mix(in srgb, #000 34%, transparent)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n pointerEvents: 'auto',\r\n}\r\n\r\nexport const repositoryPrHoverTop: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 7,\r\n minWidth: 0,\r\n}\r\n\r\nexport const repositoryPrStateBadge: CSSProperties = {\r\n flex: 'none',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n padding: '2px 8px',\r\n borderRadius: 999,\r\n background: 'color-mix(in srgb, var(--dsw-alias-state-success-primary) 22%, transparent)',\r\n color: 'var(--dsw-alias-state-success-primary)',\r\n fontSize: 11,\r\n fontWeight: 650,\r\n}\r\n\r\nexport const repositoryPrStateBadgeMerged: CSSProperties = {\r\n background: 'color-mix(in srgb, #a78bfa 18%, transparent)',\r\n color: '#a78bfa',\r\n}\r\n\r\nexport const repositoryPrHoverRepo: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n overflow: 'hidden',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const repositoryPrHoverAge: CSSProperties = {\r\n flex: 'none',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n}\r\n\r\nexport const repositoryPrHoverTitle: CSSProperties = {\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontSize: 14,\r\n lineHeight: '20px',\r\n fontWeight: 650,\r\n textDecoration: 'underline',\r\n textUnderlineOffset: 2,\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const repositoryPrHoverBottom: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 12,\r\n}\r\n\r\nexport const repositoryPrAuthor: CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n}\r\n\r\nexport const repositoryPrAvatar: CSSProperties = {\r\n width: 18,\r\n height: 18,\r\n display: 'grid',\r\n placeItems: 'center',\r\n borderRadius: 999,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 9,\r\n fontWeight: 700,\r\n}\r\n\r\nexport const repositoryPrHoverStats: CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n fontSize: 11,\r\n fontWeight: 650,\r\n}\r\n\r\nexport const repositoryPrFiles: CSSProperties = {\r\n padding: '2px 7px',\r\n borderRadius: 6,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontWeight: 500,\r\n}\r\nexport const repositoryRemote: CSSProperties = {\r\n minWidth: 0,\r\n maxWidth: 116,\r\n overflow: 'hidden',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const repositoryBranch: CSSProperties = {\r\n minWidth: 0,\r\n maxWidth: 125,\r\n overflow: 'hidden',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 12,\r\n fontWeight: 550,\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const repositoryWorktree: CSSProperties = {\r\n flex: 'none',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n}\r\n\r\nexport const repositoryStatusItems: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n gap: 8,\r\n overflow: 'hidden',\r\n}\r\n\r\nexport const repositoryItem: CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n minWidth: 0,\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n fontWeight: 550,\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const repositoryItemLabel: CSSProperties = {\r\n minWidth: 0,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n}\r\n\r\nexport const repositoryItemDot: CSSProperties = {\r\n width: 6,\r\n height: 6,\r\n flex: 'none',\r\n borderRadius: 999,\r\n background: 'currentColor',\r\n}\r\n\r\nexport const repositoryGlyph: CSSProperties = {\r\n width: 16,\r\n height: 16,\r\n flex: 'none',\r\n display: 'grid',\r\n placeItems: 'center',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n}\r\n\r\nexport const repositoryItemSuccess: CSSProperties = {\r\n color: 'var(--dsw-alias-state-success-primary)',\r\n}\r\n\r\nexport const repositoryItemWarning: CSSProperties = {\r\n color: 'var(--dsw-alias-state-warning-primary, #d69e2e)',\r\n}\r\n\r\nexport const repositoryItemError: CSSProperties = {\r\n color: 'var(--dsw-alias-state-error-primary)',\r\n}\r\n\r\nexport const repositoryMergedStatus: CSSProperties = {\r\n minWidth: 0,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n overflow: 'hidden',\r\n color: '#a78bfa',\r\n fontSize: 12,\r\n fontWeight: 600,\r\n whiteSpace: 'nowrap',\r\n textOverflow: 'ellipsis',\r\n}\r\n\r\nexport const repositoryMergedDot: CSSProperties = {\r\n width: 6,\r\n height: 6,\r\n flex: 'none',\r\n borderRadius: 999,\r\n background: 'currentColor',\r\n}\r\n\r\nexport const repositoryMergedAge: CSSProperties = {\r\n overflow: 'hidden',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontWeight: 500,\r\n textOverflow: 'ellipsis',\r\n}\r\n\r\nexport const diffTrigger: CSSProperties = {\r\n flex: 'none',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n minHeight: 26,\r\n padding: '3px 8px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 7,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n font: 'inherit',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n fontWeight: 650,\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const diffTriggerMuted: CSSProperties = {\r\n background: 'transparent',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n}\r\n\r\nexport const repositoryAutoFix: CSSProperties = {\r\n width: 26,\r\n minHeight: 26,\r\n flex: 'none',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n padding: 0,\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 7,\r\n outline: 'none',\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n font: 'inherit',\r\n lineHeight: '18px',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const repositoryAutoFixActive: CSSProperties = {\r\n borderColor: 'color-mix(in srgb, var(--dsw-static-blue-450) 45%, transparent)',\r\n background: 'color-mix(in srgb, var(--dsw-static-blue-450) 12%, transparent)',\r\n color: 'var(--dsw-static-blue-450)',\r\n}\r\n\r\nexport const repositoryUpdateTrigger: CSSProperties = {\r\n flex: 'none',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n minHeight: 26,\r\n padding: '3px 8px',\r\n border: '1px solid color-mix(in srgb, var(--dsw-static-blue-450) 45%, transparent)',\r\n borderRadius: 7,\r\n background: 'color-mix(in srgb, var(--dsw-static-blue-450) 12%, transparent)',\r\n color: 'var(--dsw-static-blue-450)',\r\n font: 'inherit',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n fontWeight: 650,\r\n whiteSpace: 'nowrap',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const repositoryChecksFrame: CSSProperties = {\r\n position: 'relative',\r\n display: 'inline-flex',\r\n minWidth: 0,\r\n}\r\n\r\nexport const repositoryChecksTrigger: CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n minWidth: 0,\r\n padding: 0,\r\n border: 'none',\r\n background: 'transparent',\r\n font: 'inherit',\r\n color: 'inherit',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const repositoryChecksCard: CSSProperties = {\r\n position: 'absolute',\r\n zIndex: 1100,\r\n bottom: 'calc(100% + 8px)',\r\n right: 0,\r\n width: 320,\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'stretch',\r\n gap: 8,\r\n padding: 12,\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 10,\r\n background: 'var(--dsw-specific-menu, var(--dsw-alias-bg-layer-1))',\r\n boxShadow: 'var(--dsw-shadow-lv3)',\r\n textAlign: 'left',\r\n cursor: 'default',\r\n}\r\n\r\nexport const repositoryChecksTitle: CSSProperties = {\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontSize: 12,\r\n fontWeight: 650,\r\n}\r\n\r\nexport const repositoryChecksHint: CSSProperties = {\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n}\r\n\r\nexport const repositoryChecksError: CSSProperties = {\r\n color: 'var(--dsw-alias-state-error-primary)',\r\n fontSize: 12,\r\n}\r\n\r\nexport const repositoryChecksItem: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 2,\r\n minWidth: 0,\r\n}\r\n\r\nexport const repositoryChecksName: CSSProperties = {\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontSize: 12,\r\n fontWeight: 600,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const repositoryChecksDesc: CSSProperties = {\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const repositoryChecksFix: CSSProperties = {\r\n alignSelf: 'flex-end',\r\n minHeight: 26,\r\n padding: '3px 10px',\r\n border: 'none',\r\n borderRadius: 7,\r\n background: 'var(--dsw-static-blue-450)',\r\n color: 'var(--dsw-alias-label-on-accent, #fff)',\r\n font: 'inherit',\r\n fontSize: 12,\r\n fontWeight: 650,\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const diffPrCommentsButton: CSSProperties = {\r\n minHeight: 28,\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: '4px 8px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 7,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n font: 'inherit',\r\n fontSize: 12,\r\n fontWeight: 650,\r\n whiteSpace: 'nowrap',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const diffGhCommentAvatar: CSSProperties = {\r\n flex: 'none',\r\n width: 16,\r\n height: 16,\r\n borderRadius: '50%',\r\n background: 'var(--dsw-alias-interactive-bg-hover, color-mix(in srgb, currentColor 10%, transparent))',\r\n objectFit: 'cover',\r\n}\r\n\r\nexport const diffGhCommentIdentity: CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n minWidth: 0,\r\n}\r\n\r\nexport const diffGhCommentAuthor: CSSProperties = {\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontWeight: 600,\r\n}\r\n\r\nexport const diffGhCommentLink: CSSProperties = {\r\n color: 'var(--dsw-static-blue-450)',\r\n textDecoration: 'none',\r\n fontWeight: 650,\r\n}\r\n\r\nexport const diffModalConflicts: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 4,\r\n margin: 0,\r\n padding: '8px 10px',\r\n borderRadius: 8,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n fontSize: 12,\r\n listStyle: 'none',\r\n}\r\n\r\nexport const diffModalConflictResolve: CSSProperties = {\r\n alignSelf: 'flex-start',\r\n minHeight: 28,\r\n padding: '4px 12px',\r\n border: 'none',\r\n borderRadius: 7,\r\n background: 'var(--dsw-static-blue-450)',\r\n color: 'var(--dsw-alias-label-on-accent, #fff)',\r\n font: 'inherit',\r\n fontSize: 12,\r\n fontWeight: 650,\r\n cursor: 'pointer',\r\n}\r\n\r\n/** Ticket summaries need room; the branch menu's 280px truncates them badly. */\r\nexport const heroTicketMenu: CSSProperties = {\r\n width: 420,\r\n}\r\n\r\nexport const heroTicketKey: CSSProperties = {\r\n flex: 'none',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 12,\r\n fontWeight: 650,\r\n letterSpacing: 0.2,\r\n}\r\n\r\nexport const heroTicketChips: CSSProperties = {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n alignItems: 'center',\r\n gap: 6,\r\n padding: '2px 2px 6px',\r\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 12%, transparent))',\r\n}\r\n\r\nexport const heroTicketChip: CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n padding: '2px 4px 2px 8px',\r\n border: '1px solid color-mix(in srgb, var(--dsw-static-blue-450) 40%, transparent)',\r\n borderRadius: 999,\r\n background: 'color-mix(in srgb, var(--dsw-static-blue-450) 12%, transparent)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontSize: 12,\r\n fontWeight: 600,\r\n letterSpacing: 0.2,\r\n}\r\n\r\nexport const heroTicketChipRemove: CSSProperties = {\r\n width: 16,\r\n height: 16,\r\n display: 'grid',\r\n placeItems: 'center',\r\n padding: 0,\r\n border: 'none',\r\n borderRadius: 999,\r\n background: 'transparent',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n lineHeight: 1,\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const heroTicketChipsClear: CSSProperties = {\r\n padding: '2px 4px',\r\n border: 'none',\r\n background: 'transparent',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const heroTicketCheckbox: CSSProperties = {\r\n width: 15,\r\n height: 15,\r\n boxSizing: 'border-box',\r\n display: 'grid',\r\n placeItems: 'center',\r\n flex: 'none',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 4,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-on-accent, #fff)',\r\n transition: 'border-color 120ms ease, background 120ms ease',\r\n}\r\n\r\nexport const heroTicketStatus: CSSProperties = {\r\n flex: 'none',\r\n maxWidth: 110,\r\n overflow: 'hidden',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const settingsLink: CSSProperties = {\r\n color: 'var(--dsw-static-blue-450)',\r\n fontSize: 12,\r\n textDecoration: 'none',\r\n marginRight: 'auto',\r\n}\r\n\r\nexport const repositoryPrIconButton: CSSProperties = {\r\n padding: 0,\r\n border: 'none',\r\n outline: 'none',\r\n background: 'transparent',\r\n font: 'inherit',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const overviewBody: CSSProperties = {\r\n flex: 1,\r\n minHeight: 0,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 6,\r\n padding: 10,\r\n overflowY: 'auto',\r\n}\r\n\r\nexport const overviewRow: CSSProperties = {\r\n width: '100%',\r\n minWidth: 0,\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 4,\r\n padding: '8px 10px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 10,\r\n outline: 'none',\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n font: 'inherit',\r\n textAlign: 'left',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const overviewRowTop: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n minWidth: 0,\r\n}\r\n\r\nexport const overviewTitle: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n overflow: 'hidden',\r\n fontSize: 13,\r\n fontWeight: 600,\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const overviewMeta: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n minWidth: 0,\r\n overflow: 'hidden',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const overviewBranch: CSSProperties = {\r\n minWidth: 0,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n}\r\n\r\nexport const overviewRunningDot: CSSProperties = {\r\n width: 7,\r\n height: 7,\r\n flex: 'none',\r\n borderRadius: 999,\r\n background: 'var(--dsw-static-blue-450)',\r\n}\r\n\r\nexport const overviewEmpty: CSSProperties = {\r\n padding: 16,\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 13,\r\n textAlign: 'center',\r\n}\r\n\r\n/* Selection toolbar and follow-up popup over assistant replies. Every border\r\n uses the theme token with a currentColor fallback so nothing renders white. */\r\n\r\nconst askSurfaceBorder = '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))'\r\nconst askSurfaceShadow = 'var(--dsw-shadow-lv3, 0 8px 24px color-mix(in srgb, #000 24%, transparent))'\r\n\r\n/** Painted through CSS.highlights while the follow-up popup is open. */\r\nexport const askHighlightCss = `\r\n::highlight(dsh-claude-ask) {\r\n background-color: color-mix(in srgb, var(--dsw-static-blue-450) 30%, transparent);\r\n color: inherit;\r\n}\r\n`\r\n\r\nexport const askToolbar: CSSProperties = {\r\n position: 'fixed',\r\n zIndex: 2000,\r\n // The Host overlay layer is pointer-events: none; opt this surface back in.\r\n pointerEvents: 'auto',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 2,\r\n padding: 3,\r\n border: askSurfaceBorder,\r\n borderRadius: 9,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n boxShadow: askSurfaceShadow,\r\n}\r\n\r\nexport const askPopup: CSSProperties = {\r\n position: 'fixed',\r\n zIndex: 2000,\r\n // The Host overlay layer is pointer-events: none; opt this surface back in.\r\n pointerEvents: 'auto',\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 10,\r\n padding: 12,\r\n border: askSurfaceBorder,\r\n borderRadius: 12,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n boxShadow: askSurfaceShadow,\r\n fontSize: 13,\r\n lineHeight: '20px',\r\n}\r\n\r\nexport const askQuote: CSSProperties = {\r\n flex: 'none',\r\n display: '-webkit-box',\r\n WebkitLineClamp: 3,\r\n WebkitBoxOrient: 'vertical',\r\n margin: 0,\r\n padding: '6px 10px',\r\n overflow: 'hidden',\r\n borderLeft: '3px solid color-mix(in srgb, var(--dsw-static-blue-450) 60%, transparent)',\r\n borderRadius: 6,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-word',\r\n}\r\n\r\nexport const askQuestion: CSSProperties = {\r\n flex: 'none',\r\n margin: 0,\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontWeight: 600,\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-word',\r\n}\r\n\r\nexport const askTextarea: CSSProperties = {\r\n width: '100%',\r\n minHeight: 64,\r\n boxSizing: 'border-box',\r\n padding: '8px 10px',\r\n border: askSurfaceBorder,\r\n borderRadius: 8,\r\n outline: 'none',\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n font: 'inherit',\r\n fontSize: 13,\r\n lineHeight: '20px',\r\n resize: 'vertical',\r\n}\r\n\r\nexport const askActions: CSSProperties = {\r\n flex: 'none',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n gap: 6,\r\n}\r\n\r\nexport const askAnswer: CSSProperties = {\r\n flex: '1 1 auto',\r\n minHeight: 0,\r\n overflowY: 'auto',\r\n padding: '2px 2px 0',\r\n wordBreak: 'break-word',\r\n}\r\n\r\nexport const askButton: CSSProperties = {\r\n minHeight: 26,\r\n padding: '3px 10px',\r\n border: askSurfaceBorder,\r\n borderRadius: 7,\r\n outline: 'none',\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n font: 'inherit',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n fontWeight: 600,\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const askPrimaryButton: CSSProperties = {\r\n border: '1px solid transparent',\r\n background: 'var(--dsw-static-blue-450)',\r\n color: 'var(--dsw-alias-label-on-accent, #fff)',\r\n}\r\n\r\nexport const askThinkingRow: CSSProperties = {\r\n width: '100%',\r\n display: 'flex',\r\n alignItems: 'baseline',\r\n gap: 6,\r\n margin: '0 0 8px',\r\n padding: 0,\r\n border: 'none',\r\n outline: 'none',\r\n background: 'transparent',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n font: 'inherit',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n textAlign: 'left',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const askThinkingLabel: CSSProperties = {\r\n flex: 'none',\r\n fontWeight: 600,\r\n}\r\n\r\nexport const askThinkingPreview: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const askThinkingFull: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n maxHeight: 200,\r\n overflowY: 'auto',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-word',\r\n}\r\n\r\nexport const askToolRow: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'baseline',\r\n gap: 6,\r\n margin: '2px 0 6px',\r\n minWidth: 0,\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n}\r\n\r\nexport const askToolGlyph: CSSProperties = {\r\n flex: 'none',\r\n width: 14,\r\n textAlign: 'center',\r\n color: 'var(--dsw-static-blue-450)',\r\n}\r\n\r\nexport const askToolGlyphDone: CSSProperties = {\r\n color: 'var(--dsw-alias-state-success-primary)',\r\n}\r\n\r\nexport const askToolGlyphError: CSSProperties = {\r\n color: 'var(--dsw-alias-state-error-primary)',\r\n}\r\n\r\nexport const askToolName: CSSProperties = {\r\n flex: 'none',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontWeight: 600,\r\n}\r\n\r\nexport const askToolSummary: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n overflow: 'hidden',\r\n fontFamily: 'var(--dsw-font-family-code, ui-monospace, monospace)',\r\n fontSize: 11,\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const askStatus: CSSProperties = {\r\n marginRight: 'auto',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n}\r\n\r\nexport const askError: CSSProperties = {\r\n margin: 0,\r\n color: 'var(--dsw-alias-state-error-primary)',\r\n fontSize: 12,\r\n}\r\n\r\nexport const repositoryMergeTrigger: CSSProperties = {\r\n flex: 'none',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n minHeight: 26,\r\n padding: '3px 8px',\r\n border: '1px solid color-mix(in srgb, var(--dsw-alias-state-success-primary) 45%, transparent)',\r\n borderRadius: 7,\r\n background: 'color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent)',\r\n color: 'var(--dsw-alias-state-success-primary)',\r\n font: 'inherit',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n fontWeight: 650,\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const diffAdd: CSSProperties = {\r\n color: 'var(--dsw-alias-state-success-primary)',\r\n}\r\n\r\nexport const diffDelete: CSSProperties = {\r\n color: 'var(--dsw-alias-state-error-primary)',\r\n}\r\n\r\nexport const diffCommentButtonClass = 'dshClaudeDiffCommentButton'\r\nexport const diffLineRowClass = 'dshClaudeDiffLineRow'\r\nexport const diffCommentTextareaClass = 'dshClaudeDiffCommentTextarea'\r\n\r\nexport const diffCommentCss = `\r\n.${diffCommentButtonClass} {\r\n width: 18px;\r\n height: 18px;\r\n flex: none;\r\n display: grid;\r\n place-items: center;\r\n /* Stay on the line-number row: a wrapped line makes the flex row taller, and\r\n centering would float the button into the middle of the wrapped block.\r\n The margin centers the 18px button inside the first 22px line box. */\r\n align-self: flex-start;\r\n margin: 2px 2px 0;\r\n padding: 0;\r\n border: none;\r\n border-radius: 4px;\r\n background: var(--dsw-static-blue-450);\r\n color: var(--dsw-alias-label-on-accent, #fff);\r\n font: inherit;\r\n font-size: 13px;\r\n line-height: 1;\r\n cursor: pointer;\r\n opacity: 0;\r\n transition: opacity 100ms ease;\r\n}\r\n.${diffLineRowClass}:hover .${diffCommentButtonClass},\r\n.${diffCommentButtonClass}:focus-visible {\r\n opacity: 1;\r\n}\r\n.${diffCommentButtonClass}[disabled] {\r\n visibility: hidden;\r\n}\r\n.${diffCommentTextareaClass}:focus {\r\n outline: none;\r\n box-shadow: inset 0 0 0 1px var(--dsw-static-blue-450);\r\n}\r\n`\r\n\r\nexport const diffCommentBlock: CSSProperties = {\r\n boxSizing: 'border-box',\r\n width: 'min(640px, calc(var(--dsh-claude-diff-viewport, 520px) - 72px))',\r\n position: 'sticky',\r\n left: 62,\r\n margin: '4px 8px 8px 62px',\r\n padding: '8px 10px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 8,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n fontFamily: 'var(--dsw-font-family, system-ui)',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n whiteSpace: 'normal',\r\n}\r\n\r\nexport const diffCommentCardText: CSSProperties = {\r\n margin: 0,\r\n color: 'var(--dsw-alias-label-primary)',\r\n overflowWrap: 'anywhere',\r\n}\r\n\r\nexport const diffCommentCardMeta: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 8,\r\n marginBottom: 4,\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n}\r\n\r\nexport const diffCommentTextarea: CSSProperties = {\r\n width: '100%',\r\n minHeight: 56,\r\n boxSizing: 'border-box',\r\n padding: '6px 8px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 6,\r\n background: 'var(--dsw-alias-bg-base)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n font: 'inherit',\r\n resize: 'vertical',\r\n}\r\n\r\nexport const diffCommentActions: CSSProperties = {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n gap: 8,\r\n marginTop: 6,\r\n}\r\n\r\nexport const diffCommentActionButton: CSSProperties = {\r\n minHeight: 24,\r\n padding: '2px 10px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 6,\r\n background: 'transparent',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n font: 'inherit',\r\n fontSize: 12,\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const diffCommentSubmitButton: CSSProperties = {\r\n border: 'none',\r\n background: 'var(--dsw-static-blue-450)',\r\n color: 'var(--dsw-alias-label-on-accent, #fff)',\r\n fontWeight: 600,\r\n}\r\n\r\nexport const diffCommentError: CSSProperties = {\r\n margin: '4px 0 0',\r\n color: 'var(--dsw-alias-state-error-primary)',\r\n fontSize: 11,\r\n}\r\n\r\nexport const reviewCommentBarFrame: CSSProperties = {\r\n width: 'calc(100% - 64px)',\r\n maxWidth: 'var(--dsh-conversation-composer-max-width, 782px)',\r\n margin: '0 auto',\r\n boxSizing: 'border-box',\r\n}\r\n\r\nexport const reviewCommentBar: CSSProperties = {\r\n width: '100%',\r\n minWidth: 0,\r\n minHeight: 42,\r\n boxSizing: 'border-box',\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n alignItems: 'center',\r\n gap: 8,\r\n padding: '7px 11px',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 11,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n boxShadow: '0 1px 2px color-mix(in srgb, var(--dsw-alias-label-primary) 4%, transparent)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontSize: 12,\r\n lineHeight: '20px',\r\n}\r\n\r\nexport const reviewCommentIcon: CSSProperties = {\r\n width: 20,\r\n height: 20,\r\n display: 'grid',\r\n placeItems: 'center',\r\n flex: 'none',\r\n color: 'var(--dsw-static-blue-450)',\r\n}\r\n\r\nexport const reviewCommentClearSeat: CSSProperties = {\r\n marginLeft: 'auto',\r\n alignSelf: 'flex-start',\r\n flex: 'none',\r\n display: 'inline-flex',\r\n}\r\n\r\nexport const reviewCommentChip: CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 3,\r\n maxWidth: 240,\r\n padding: '1px 4px 1px 9px',\r\n border: '1px solid color-mix(in srgb, var(--dsw-static-blue-450) 32%, transparent)',\r\n borderRadius: 999,\r\n background: 'color-mix(in srgb, var(--dsw-static-blue-450) 10%, transparent)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontSize: 12,\r\n lineHeight: '20px',\r\n}\r\n\r\nexport const reviewCommentChipLabel: CSSProperties = {\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const reviewCommentChipRemove: CSSProperties = {\r\n width: 16,\r\n height: 16,\r\n flex: 'none',\r\n display: 'grid',\r\n placeItems: 'center',\r\n padding: 0,\r\n border: 'none',\r\n borderRadius: 999,\r\n background: 'transparent',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n font: 'inherit',\r\n fontSize: 12,\r\n lineHeight: 1,\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const reviewCommentHoverCard: CSSProperties = {\r\n display: 'block',\r\n maxWidth: 360,\r\n padding: '8px 10px',\r\n fontSize: 12,\r\n lineHeight: '18px',\r\n}\r\n\r\nexport const reviewCommentHoverPath: CSSProperties = {\r\n display: 'block',\r\n marginBottom: 4,\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n overflowWrap: 'anywhere',\r\n}\r\n\r\nexport const reviewCommentHoverText: CSSProperties = {\r\n margin: 0,\r\n color: 'var(--dsw-alias-label-primary)',\r\n whiteSpace: 'pre-wrap',\r\n overflowWrap: 'anywhere',\r\n}\r\n\r\nexport const diffAhead: CSSProperties = {\r\n color: 'var(--dsw-static-blue-450)',\r\n}\r\n\r\nexport const diffAheadMuted: CSSProperties = {\r\n color: 'color-mix(in srgb, var(--dsw-static-blue-450) 62%, var(--dsw-alias-label-tertiary))',\r\n}\r\n\r\nexport const diffAddMuted: CSSProperties = {\r\n color: 'color-mix(in srgb, var(--dsw-alias-state-success-primary) 62%, var(--dsw-alias-label-tertiary))',\r\n}\r\n\r\nexport const diffDeleteMuted: CSSProperties = {\r\n color: 'color-mix(in srgb, var(--dsw-alias-state-error-primary) 62%, var(--dsw-alias-label-tertiary))',\r\n}\r\n\r\nexport const diffPanel: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n minWidth: 0,\r\n overflow: 'hidden',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 12,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n boxShadow: '0 4px 16px color-mix(in srgb, #000 12%, transparent)',\r\n}\r\n\r\nexport const diffPanelMaximized: CSSProperties = {\r\n width: '100%',\r\n height: '100%',\r\n margin: 0,\r\n}\r\n\r\nexport const diffHeader: CSSProperties = {\r\n boxSizing: 'border-box',\r\n height: 49,\r\n flex: 'none',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 10,\r\n padding: '9px 12px',\r\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n}\r\n\r\nexport const diffHeaderTitle: CSSProperties = {\r\n minWidth: 0,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 8,\r\n overflow: 'hidden',\r\n color: 'var(--dsw-alias-label-primary)',\r\n fontSize: 15,\r\n fontWeight: 650,\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const diffHeaderLabel: CSSProperties = {\r\n minWidth: 0,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n}\r\n\r\nexport const diffHeaderActions: CSSProperties = {\r\n flex: 'none',\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 5,\r\n}\r\n\r\nexport const diffSplitButton: CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'stretch',\r\n}\r\n\r\nexport const diffCommitButton: CSSProperties = {\r\n minHeight: 28,\r\n padding: '4px 10px',\r\n border: 'none',\r\n borderRadius: '7px 0 0 7px',\r\n background: 'var(--dsw-static-blue-450)',\r\n color: 'var(--dsw-alias-label-on-accent, #fff)',\r\n font: 'inherit',\r\n fontSize: 12,\r\n fontWeight: 650,\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const diffActionDisabled: CSSProperties = {\r\n opacity: 0.45,\r\n cursor: 'default',\r\n}\r\n\r\nexport const diffCommitMenuButton: CSSProperties = {\r\n width: 28,\r\n minHeight: 28,\r\n display: 'grid',\r\n placeItems: 'center',\r\n padding: 0,\r\n border: 'none',\r\n borderLeft: '1px solid color-mix(in srgb, #fff 32%, transparent)',\r\n borderRadius: '0 7px 7px 0',\r\n background: 'var(--dsw-static-blue-450)',\r\n color: 'var(--dsw-alias-label-on-accent, #fff)',\r\n font: 'inherit',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const diffHeaderBranch: CSSProperties = {\r\n overflow: 'hidden',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n fontWeight: 500,\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const diffSummary: CSSProperties = {\r\n minHeight: 34,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 7,\r\n padding: '6px 12px',\r\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\r\n}\r\n\r\nexport const diffBody: CSSProperties = {\r\n flex: 1,\r\n minHeight: 0,\r\n overflow: 'auto',\r\n background: 'var(--dsw-alias-bg-base)',\r\n}\r\n\r\nexport const diffFile: CSSProperties = {\r\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n}\r\n\r\nexport const diffFileHeader: CSSProperties = {\r\n width: '100%',\r\n minHeight: 38,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 7,\r\n padding: '7px 10px',\r\n border: 'none',\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n color: 'var(--dsw-alias-label-primary)',\r\n font: 'inherit',\r\n fontSize: 13,\r\n lineHeight: '20px',\r\n textAlign: 'left',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const diffFilePath: CSSProperties = {\r\n minWidth: 0,\r\n flex: 1,\r\n display: 'flex',\r\n alignItems: 'baseline',\r\n overflow: 'hidden',\r\n}\r\n\r\n/** Directory part: truncated from the left so the nearest folders stay visible. */\r\nexport const diffFileDir: CSSProperties = {\r\n minWidth: 0,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n direction: 'rtl',\r\n textAlign: 'left',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n}\r\n\r\nexport const diffFileName: CSSProperties = {\r\n flex: 'none',\r\n fontWeight: 650,\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\n/** Comment count on a file header: the one hint that survives collapsing. */\r\nexport const diffFileComments: CSSProperties = {\r\n flex: 'none',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n gap: 3,\r\n padding: '0 6px',\r\n height: 18,\r\n borderRadius: 9,\r\n background: 'color-mix(in srgb, var(--dsw-static-blue-450) 18%, transparent)',\r\n color: 'var(--dsw-static-blue-450)',\r\n fontSize: 11,\r\n fontWeight: 650,\r\n lineHeight: '18px',\r\n}\r\n\r\n/** GitHub review comments render through this plugin's own Markdown pipeline\r\n * (see comment-markdown.ts), so the card owns their typography too. */\r\nexport const diffCommentMarkdownCss = `\r\n.dshClaudeDiffCommentBody > :first-child { margin-top: 0 }\r\n.dshClaudeDiffCommentBody > :last-child { margin-bottom: 0 }\r\n.dshClaudeDiffCommentBody :is(h1, h2, h3, h4, h5, h6) {\r\n margin: 8px 0 4px;\r\n font-size: 12px;\r\n line-height: 18px;\r\n font-weight: 650;\r\n}\r\n.dshClaudeDiffCommentBody :is(p, ul, ol, pre, blockquote, table, details) { margin: 4px 0 }\r\n.dshClaudeDiffCommentBody :is(ul, ol) { padding-left: 18px }\r\n.dshClaudeDiffCommentBody li { margin: 2px 0 }\r\n.dshClaudeDiffCommentBody li input[type='checkbox'] {\r\n margin: 0 6px 0 -14px;\r\n vertical-align: middle;\r\n accent-color: var(--dsw-static-blue-450);\r\n}\r\n.dshClaudeDiffCommentBody li:has(> input[type='checkbox']) { list-style: none }\r\n.dshClaudeDiffCommentBody code {\r\n padding: 1px 4px;\r\n border-radius: 4px;\r\n background: var(--dsw-alias-interactive-bg-hover, color-mix(in srgb, currentColor 10%, transparent));\r\n font-family: var(--dsw-font-family-mono, ui-monospace, SFMono-Regular, monospace);\r\n font-size: 11px;\r\n}\r\n.dshClaudeDiffCommentBody pre {\r\n max-width: 100%;\r\n padding: 8px 10px;\r\n border-radius: 6px;\r\n background: var(--dsw-alias-bg-layer-2, color-mix(in srgb, currentColor 8%, transparent));\r\n overflow-x: auto;\r\n}\r\n.dshClaudeDiffCommentBody pre code { padding: 0; background: none }\r\n.dshClaudeDiffCommentBody blockquote {\r\n padding-left: 8px;\r\n border-left: 2px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent));\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\n.dshClaudeDiffCommentBody a { color: var(--dsw-static-blue-450) }\r\n.dshClaudeDiffCommentBody img { max-width: 100%; vertical-align: middle }\r\n.dshClaudeDiffCommentBody table { border-collapse: collapse }\r\n.dshClaudeDiffCommentBody :is(th, td) {\r\n padding: 3px 8px;\r\n border: 1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent));\r\n}\r\n.dshClaudeDiffCommentBody summary { cursor: pointer; font-weight: 650 }\r\n.dshClaudeDiffCommentBody :is(sup, sub) { font-size: 9px; line-height: 0 }\r\n.dshClaudeDiffCommentBody hr {\r\n margin: 8px 0;\r\n border: none;\r\n border-top: 1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent));\r\n}\r\n`\r\n\r\nexport const diffFileStats: CSSProperties = {\r\n flex: 'none',\r\n display: 'inline-flex',\r\n gap: 4,\r\n fontSize: 13,\r\n fontWeight: 650,\r\n}\r\n\r\nexport const diffCode: CSSProperties = {\r\n padding: '4px 0 8px',\r\n background: 'var(--dsw-alias-bg-base)',\r\n fontFamily: 'var(--dsw-font-family-mono, ui-monospace, SFMono-Regular, Consolas, monospace)',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n}\r\n\r\nexport const diffLine: CSSProperties = {\r\n minHeight: 17,\r\n display: 'flex',\r\n // Wrap to the panel width (reflows as the details column is dragged) instead of scrolling sideways.\r\n whiteSpace: 'pre-wrap',\r\n overflowWrap: 'anywhere',\r\n}\r\n\r\nexport const diffLineText: CSSProperties = {\r\n flex: 1,\r\n minWidth: 0,\r\n}\r\n\r\nexport const diffLineNumber: CSSProperties = {\r\n width: 38,\r\n flex: 'none',\r\n paddingRight: 8,\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n textAlign: 'right',\r\n userSelect: 'none',\r\n}\r\n\r\nexport const diffLineMarker: CSSProperties = {\r\n width: 16,\r\n flex: 'none',\r\n color: 'inherit',\r\n textAlign: 'center',\r\n userSelect: 'none',\r\n}\r\n\r\nexport const diffLineAdd: CSSProperties = {\r\n background: 'color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent)',\r\n color: 'var(--dsw-alias-state-success-primary)',\r\n}\r\n\r\nexport const diffLineDelete: CSSProperties = {\r\n background: 'color-mix(in srgb, var(--dsw-alias-state-error-primary) 13%, transparent)',\r\n color: 'var(--dsw-alias-state-error-primary)',\r\n}\r\n\r\nexport const diffLineHunk: CSSProperties = {\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontStyle: 'italic',\r\n}\r\n\r\nexport const diffLineSelected: CSSProperties = {\r\n background: 'color-mix(in srgb, var(--dsw-static-blue-450) 14%, transparent)',\r\n boxShadow: 'inset 2px 0 0 var(--dsw-static-blue-450)',\r\n}\r\n\r\n/** Sits where the comment button, line number and marker would be so the label aligns with code. */\r\nexport const diffGapControls: CSSProperties = {\r\n width: 84,\r\n flex: 'none',\r\n boxSizing: 'border-box',\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n gap: 2,\r\n paddingRight: 6,\r\n}\r\n\r\nexport const diffGapButton: CSSProperties = {\r\n width: 20,\r\n height: 18,\r\n display: 'grid',\r\n placeItems: 'center',\r\n padding: 0,\r\n border: 'none',\r\n borderRadius: 4,\r\n background: 'transparent',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n font: 'inherit',\r\n cursor: 'pointer',\r\n}\r\n\r\nexport const diffCommentRange: CSSProperties = {\r\n marginBottom: 6,\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 12,\r\n fontWeight: 600,\r\n}\r\n\r\nexport const diffLineContext: CSSProperties = {\r\n color: 'var(--dsw-alias-label-secondary)',\r\n}\r\n\r\nexport const diffNotice: CSSProperties = {\r\n margin: 10,\r\n padding: '9px 10px',\r\n borderRadius: 8,\r\n background: 'var(--dsw-alias-bg-layer-2)',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 11,\r\n lineHeight: '17px',\r\n}\r\n\r\nexport const diffEmpty: CSSProperties = {\r\n margin: 16,\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n}\r\n\r\nexport const diffModalCss = `\r\n.dshClaudeRepositoryActionModal {\r\n box-sizing: border-box;\r\n width: min(760px, calc(100vw - 48px));\r\n max-width: calc(100vw - 48px);\r\n max-height: min(680px, calc(100vh - 48px));\r\n}\r\n.dshClaudeRepositoryActionModalContent {\r\n flex: 1;\r\n min-height: 0;\r\n overflow-y: auto;\r\n}\r\n.dshClaudeRepositoryActionModalContent > div:first-child {\r\n position: sticky;\r\n top: 0;\r\n z-index: 2;\r\n background: var(--dsw-alias-bg-layer-2);\r\n}\r\n.dshClaudeRepositoryActionModalContent h2 {\r\n font-size: 18px;\r\n line-height: 26px;\r\n}\r\n.dshClaudeRepositoryActionModalContent > p {\r\n font-size: 14px;\r\n line-height: 22px;\r\n}\r\n.dshClaudeRepositoryActionModal input:is([type='checkbox'], [type='radio']) {\r\n width: 16px;\r\n height: 16px;\r\n margin: 0;\r\n accent-color: var(--dsw-static-blue-450);\r\n}\r\n.dshClaudeRepositoryActionModal textarea:focus,\r\n.dshClaudeRepositoryActionModal input:not([type='checkbox'], [type='radio']):focus {\r\n outline: none;\r\n box-shadow: inset 0 0 0 1px var(--dsw-static-blue-450);\r\n}\r\n`\r\n\r\nexport const diffModalBody: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 16,\r\n width: '100%',\r\n minWidth: 0,\r\n boxSizing: 'border-box',\r\n}\r\n\r\nexport const diffModalMeta: CSSProperties = {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n gap: 16,\r\n minWidth: 0,\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n}\r\n\r\nexport const diffModalMetaText: CSSProperties = {\r\n minWidth: 0,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const diffModalFiles: CSSProperties = {\r\n minWidth: 0,\r\n maxHeight: 300,\r\n overflowX: 'hidden',\r\n overflowY: 'auto',\r\n border: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n borderRadius: 8,\r\n}\r\n\r\nexport const diffModalFile: CSSProperties = {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n gap: 12,\r\n minWidth: 0,\r\n padding: '10px 14px',\r\n borderBottom: '1px solid var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, transparent))',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 13,\r\n lineHeight: '20px',\r\n}\r\n\r\nexport const diffModalFilePath: CSSProperties = {\r\n minWidth: 0,\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n}\r\n\r\nexport const diffModalFileState: CSSProperties = {\r\n flex: 'none',\r\n}\r\n\r\nexport const diffModalField: CSSProperties = {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 8,\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n fontWeight: 550,\r\n}\r\n\r\nexport const diffModalTextarea: CSSProperties = {\r\n ...settingTextInput,\r\n minHeight: 140,\r\n padding: '10px 14px',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n resize: 'vertical',\r\n}\r\n\r\nexport const diffModalTextInput: CSSProperties = {\r\n ...settingTextInput,\r\n minHeight: 44,\r\n padding: '9px 14px',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n}\r\n\r\nexport const diffModalCheckbox: CSSProperties = {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 10,\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n}\r\n\r\nexport const diffModalFooter: CSSProperties = {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n gap: 12,\r\n}\r\n\r\nexport const diffModalButton: CSSProperties = {\r\n minHeight: 36,\r\n padding: '8px 18px',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n}\r\n\r\nexport const diffModalStatus: CSSProperties = {\r\n margin: 0,\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n}\r\n\r\nexport const diffModalError: CSSProperties = {\r\n margin: '10px 0 0',\r\n color: 'var(--dsw-alias-state-error-primary)',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n}\r\n\r\nexport const diffModalSuccess: CSSProperties = {\r\n margin: 0,\r\n color: 'var(--dsw-alias-state-success-primary)',\r\n fontSize: 14,\r\n lineHeight: '22px',\r\n}\r\n\r\n/* Rewind control, portalled into the Host's user-message action row. The\r\n metrics mirror MessageIconActions' own action button so the added control\r\n is indistinguishable from the copy and branch icons beside it. */\r\n\r\nexport const rewindActionCss = `\r\n[data-dsh-claude-rewind]:empty {\r\n display: none;\r\n}\r\n[data-dsh-claude-rewind] > button {\r\n width: 28px;\r\n height: 28px;\r\n padding: 6px;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: none;\r\n border-radius: 28px;\r\n background: transparent;\r\n color: var(--dsw-alias-label-tertiary);\r\n cursor: pointer;\r\n}\r\n[data-dsh-claude-rewind] > button:hover {\r\n background: var(--dsw-alias-interactive-bg-hover);\r\n color: var(--dsw-alias-label-secondary);\r\n}\r\n[data-dsh-claude-rewind] > button:is(:disabled, [data-unavailable]) {\r\n opacity: 0.4;\r\n cursor: default;\r\n}\r\n[data-dsh-claude-rewind] > button[data-unavailable]:hover {\r\n background: transparent;\r\n color: var(--dsw-alias-label-tertiary);\r\n}\r\n`\r\n\r\nexport const rewindDangerButton: CSSProperties = {\r\n ...primaryButton,\r\n background: 'var(--dsw-alias-state-error-primary)',\r\n}\r\n\r\nexport const rewindModalMessage: CSSProperties = {\r\n margin: 0,\r\n padding: 12,\r\n maxHeight: 160,\r\n overflowY: 'auto',\r\n whiteSpace: 'pre-wrap',\r\n wordBreak: 'break-word',\r\n borderRadius: 9,\r\n background: 'var(--dsw-alias-bg-layer-1)',\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 13,\r\n lineHeight: '20px',\r\n}\r\n","export function formatTokenCount(tokens: number): string {\r\n if (tokens >= 1_000_000) return `${Number((tokens / 1_000_000).toFixed(tokens >= 10_000_000 ? 0 : 1))}M`\r\n if (tokens >= 1_000) return `${Number((tokens / 1_000).toFixed(tokens >= 100_000 ? 0 : 1))}K`\r\n return String(tokens)\r\n}\r\n","import { useEffect, useMemo, useState } from 'react'\r\nimport { IconCloseOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type { ClaudeActivityEvent, ClaudeTaskInfo } from '../events.ts'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\nimport type { ClaudeClientProjection } from './projection.ts'\r\nimport * as styles from './styles.ts'\r\nimport { isProjectedTask } from './task-projection.ts'\r\nimport { formatTokenCount } from './token-format.ts'\r\n\r\nexport interface ClaudeTasksPanelInjected {\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n closeDetails: () => void\r\n turn: number\r\n}\r\n\r\nexport interface ClaudeTasksPanelProps extends ClaudeTasksPanelInjected {\r\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\r\n}\r\n\r\ntype StatusKey = 'tasksRunning' | 'tasksCompleted' | 'tasksFailed' | 'tasksStopped' | 'tasksKilled'\r\n\r\nconst STATUS_LABEL: Record<string, StatusKey> = {\r\n running: 'tasksRunning',\r\n completed: 'tasksCompleted',\r\n failed: 'tasksFailed',\r\n stopped: 'tasksStopped',\r\n killed: 'tasksKilled',\r\n}\r\n\r\nexport function visibleTaskGroups(tasks: readonly ClaudeTaskInfo[], dismissedSettledIds: ReadonlySet<string>) {\r\n const projected = tasks.filter(isProjectedTask)\r\n return {\r\n running: projected.filter(task => task.status === 'running'),\r\n finished: projected.filter(task => task.status !== 'running' && !dismissedSettledIds.has(task.taskId)),\r\n }\r\n}\r\n\r\nexport function activitiesForTask(activities: readonly ClaudeActivityEvent[], taskId: string) {\r\n return activities.filter(activity => activity.taskId === taskId)\r\n}\r\n\r\nexport function tasksForTurn(tasks: readonly ClaudeTaskInfo[], turn: number) {\r\n return tasks.filter(task => task.originTurn === turn && isProjectedTask(task))\r\n}\r\n\r\nexport interface TurnTaskSummary {\r\n state: 'running' | 'failed' | 'completed'\r\n count: number\r\n running: number\r\n failed: number\r\n completed: number\r\n}\r\n\r\nexport function summarizeTurnTasks(tasks: readonly ClaudeTaskInfo[]): TurnTaskSummary | undefined {\r\n if (tasks.length === 0) return undefined\r\n const running = tasks.filter(task => task.status === 'running').length\r\n const failed = tasks.filter(task => task.status === 'failed' || task.status === 'stopped' || task.status === 'killed').length\r\n const completed = tasks.filter(task => task.status === 'completed').length\r\n return {\r\n state: running > 0 ? 'running' : failed > 0 ? 'failed' : 'completed',\r\n count: tasks.length,\r\n running,\r\n failed,\r\n completed,\r\n }\r\n}\r\n\r\nfunction statusGlyph(status: ClaudeTaskInfo['status']): string {\r\n if (status === 'running') return '●'\r\n if (status === 'completed') return '✓'\r\n if (status === 'stopped') return '–'\r\n return '×'\r\n}\r\n\r\nfunction formatDuration(ms: number): string {\r\n if (ms < 1000) return String(Math.max(1, Math.round(ms))) + 'ms'\r\n const seconds = Math.round(ms / 1000)\r\n if (seconds < 60) return String(seconds) + 's'\r\n const minutes = Math.floor(seconds / 60)\r\n return String(minutes) + 'm ' + String(seconds % 60) + 's'\r\n}\r\n\r\nfunction taskMeta(task: ClaudeTaskInfo, t: ClaudeTasksPanelInjected['t']): string[] {\r\n const parts: string[] = []\r\n if (task.subagentType !== undefined) parts.push(task.subagentType)\r\n else if (task.taskType !== undefined) parts.push(task.taskType)\r\n if (task.usage?.durationMs !== undefined) parts.push(formatDuration(task.usage.durationMs))\r\n if (task.usage?.totalTokens !== undefined) parts.push(t('tokens', { count: formatTokenCount(task.usage.totalTokens) }))\r\n if (task.usage?.toolUses !== undefined) parts.push(t('tasksToolUses', { count: task.usage.toolUses }))\r\n if (task.lastToolName !== undefined) parts.push(t('tasksLastTool', { tool: task.lastToolName }))\r\n return parts\r\n}\r\n\r\nfunction TaskActivity({ activity, t }: { activity: ClaudeActivityEvent; t: ClaudeTasksPanelInjected['t'] }) {\r\n return (\r\n <li style={styles.taskActivityItem}>\r\n <span style={styles.taskActivityGlyph} aria-hidden=\"true\">{activity.isError === true ? '×' : '›'}</span>\r\n <div style={styles.taskActivityBody}>\r\n <p style={styles.taskActivityTitle}>{activity.title ?? activity.kind}</p>\r\n {activity.summary === undefined ? null : <p style={styles.taskActivitySummary}>{activity.summary}</p>}\r\n {activity.detail === undefined ? null : (\r\n <details style={styles.taskActivityDetail}>\r\n <summary style={styles.taskActivityDetailSummary}>{t('detail')}</summary>\r\n <pre style={styles.detailCode}>{activity.detail}</pre>\r\n </details>\r\n )}\r\n </div>\r\n </li>\r\n )\r\n}\r\n\r\nfunction TaskCard(props: { task: ClaudeTaskInfo; activities: readonly ClaudeActivityEvent[]; t: ClaudeTasksPanelInjected['t'] }) {\r\n const { task, activities, t } = props\r\n const [activityOpen, setActivityOpen] = useState(false)\r\n const running = task.status === 'running'\r\n const failed = task.status === 'failed' || task.status === 'killed'\r\n const meta = taskMeta(task, t)\r\n return (\r\n <article style={{ ...styles.taskCard, ...(running ? styles.taskCardRunning : {}) }}>\r\n <div style={styles.taskCardTop}>\r\n <span className={running ? 'dsh-claude-act-running' : undefined} style={{ ...styles.taskCardGlyph, ...(running ? styles.iconChipRunning : {}), ...(failed ? styles.iconChipError : {}) }} aria-hidden=\"true\">\r\n {statusGlyph(task.status)}\r\n </span>\r\n <div style={styles.taskCardBody}>\r\n <p style={{ ...styles.taskTitle, ...(failed ? { color: 'var(--dsw-alias-state-error-primary)' } : {}) }}>{task.description}</p>\r\n <p style={styles.taskStatusLine}>\r\n <span>{t(STATUS_LABEL[task.status] ?? 'tasksRunning')}</span>\r\n {task.backgrounded === true ? <><span aria-hidden=\"true\"> · </span><span>{t('tasksBackground')}</span></> : null}\r\n </p>\r\n </div>\r\n </div>\r\n {meta.length === 0 ? null : <p style={styles.taskMeta}>{meta.join(' · ')}</p>}\r\n {task.summary === undefined || running ? null : <p style={styles.taskSummary}>{task.summary}</p>}\r\n {activities.length === 0 ? null : (\r\n <div style={styles.taskActivitySection}>\r\n <button type=\"button\" style={styles.taskTextButton} aria-expanded={activityOpen} onClick={() => setActivityOpen(value => !value)}>\r\n {activityOpen ? t('tasksHideActivity') : t('tasksViewActivity')}\r\n </button>\r\n {activityOpen ? <ul style={styles.taskActivityList}>{activities.map(activity => (\r\n <TaskActivity key={`${activity.turn}:${activity.step}:${activity.ordinal}`} activity={activity} t={t} />\r\n ))}</ul> : null}\r\n </div>\r\n )}\r\n </article>\r\n )\r\n}\r\n\r\nfunction GroupHeading(props: { label: string; count: number; collapsed?: boolean; onToggle?: () => void; action?: { label: string; onClick: () => void } }) {\r\n const { label, count, collapsed, onToggle, action } = props\r\n const content = <><span>{label}</span><span style={styles.tasksGroupCount}>{count}</span></>\r\n return (\r\n <div style={styles.tasksGroupHeading}>\r\n {onToggle === undefined ? <div style={styles.tasksGroupTitle}>{content}</div> : (\r\n <button type=\"button\" style={styles.tasksGroupToggle} aria-expanded={!collapsed} onClick={onToggle}>\r\n <span style={{ ...styles.chevron, ...(collapsed === true ? {} : styles.chevronOpen) }}>›</span>{content}\r\n </button>\r\n )}\r\n {action === undefined ? null : <button type=\"button\" style={styles.taskTextButton} onClick={action.onClick}>{action.label}</button>}\r\n </div>\r\n )\r\n}\r\n\r\nexport function ClaudeTasksPanel({ useClaudeProjection, t, closeDetails, turn }: ClaudeTasksPanelProps) {\r\n const projection = useClaudeProjection(value => value)\r\n const tasks = useMemo(\r\n () => tasksForTurn(projection.tasks?.tasks ?? [], turn),\r\n [projection.tasks, turn],\r\n )\r\n useEffect(() => {\r\n if (!projection.owned || tasks.length === 0) closeDetails()\r\n }, [closeDetails, projection.owned, tasks.length])\r\n const [finishedCollapsed, setFinishedCollapsed] = useState(false)\r\n const [dismissedSettledIds, setDismissedSettledIds] = useState<ReadonlySet<string>>(() => new Set())\r\n const groups = useMemo(() => visibleTaskGroups(tasks, dismissedSettledIds), [tasks, dismissedSettledIds])\r\n const taskActivities = useMemo(() => new Map(tasks.map(task => [task.taskId, activitiesForTask(projection.activities, task.taskId)])), [projection.activities, tasks])\r\n const clearFinished = (): void => setDismissedSettledIds(previous => new Set([\r\n ...previous,\r\n ...tasks.filter(task => task.status !== 'running').map(task => task.taskId),\r\n ]))\r\n if (!projection.owned) return null\r\n return (\r\n <div className={styles.detailsCardClass} style={styles.tasksPanel}>\r\n <style data-dsh-claude-panel-icon-styles>{styles.detailsCardCss}{styles.panelIconButtonCss}</style>\r\n <div style={styles.tasksHeader}>\r\n <div>\r\n <span style={styles.tasksHeading}>{t('tasksPanelTurn')}</span>\r\n <span style={styles.tasksTurnMeta}>{t('tasksTurnNumber', { turn })}</span>\r\n </div>\r\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('tasksClose')} onClick={closeDetails}><IconCloseOutline16 /></button>\r\n </div>\r\n <div style={styles.tasksBody}>\r\n <section aria-label={t('tasksRunning')}>\r\n <GroupHeading label={t('tasksRunning')} count={groups.running.length} />\r\n {groups.running.length === 0 ? <p style={styles.tasksGroupEmpty}>{t('tasksNoneRunning')}</p> : (\r\n <div style={styles.taskCardList}>{groups.running.map(task => <TaskCard key={task.taskId} task={task} activities={taskActivities.get(task.taskId) ?? []} t={t} />)}</div>\r\n )}\r\n </section>\r\n <section aria-label={t('tasksSettled')} style={styles.tasksFinishedSection}>\r\n <GroupHeading\r\n label={t('tasksSettled')}\r\n count={groups.finished.length}\r\n collapsed={finishedCollapsed}\r\n onToggle={() => setFinishedCollapsed(value => !value)}\r\n {...(groups.finished.length === 0 ? {} : { action: { label: t('tasksClear'), onClick: clearFinished } })}\r\n />\r\n {finishedCollapsed || groups.finished.length === 0 ? null : (\r\n <div style={styles.taskCardList}>{groups.finished.map(task => <TaskCard key={task.taskId} task={task} activities={taskActivities.get(task.taskId) ?? []} t={t} />)}</div>\r\n )}\r\n </section>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import { useEffect, useMemo, useRef, useState, type CSSProperties } from 'react'\r\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type { ClaudeTaskInfo } from '../events.ts'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\nimport type { ClaudeClientProjection } from './projection.ts'\r\nimport type { ClaudeTurnMarker } from './conversation-sidecar.ts'\r\nimport { summarizeTurnTasks, tasksForTurn } from './ClaudeTasksPanel.tsx'\r\nimport * as styles from './styles.ts'\r\n\r\nconst MAX_HOVER_TASKS = 6\r\n\r\nexport interface ClaudeActivityTailInjected {\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n openTasks: (turn: number) => void\r\n}\r\n\r\nexport interface ClaudeActivityTailProps extends ClaudeActivityTailInjected {\r\n matched: ClaudeTurnMarker\r\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\r\n}\r\n\r\nexport interface ClaudeTaskLauncherProps extends ClaudeActivityTailInjected {\r\n turn: number\r\n tasks: readonly ClaudeTaskInfo[]\r\n}\r\n\r\nfunction taskGlyph(status: ClaudeTaskInfo['status']): { glyph: string; style: CSSProperties } {\r\n if (status === 'failed') return { glyph: '×', style: styles.tasksHoverGlyphError }\r\n if (status === 'completed') return { glyph: '✓', style: styles.tasksHoverGlyphDone }\r\n return { glyph: '●', style: styles.tasksHoverGlyphRunning }\r\n}\r\n\r\nexport function ClaudeTaskLauncher({ turn, tasks, t, openTasks }: ClaudeTaskLauncherProps) {\r\n const [hovered, setHovered] = useState(false)\r\n const closeTimer = useRef<ReturnType<typeof setTimeout>>()\r\n const turnTasks = useMemo(() => tasksForTurn(tasks, turn), [tasks, turn])\r\n const summary = useMemo(() => summarizeTurnTasks(turnTasks), [turnTasks])\r\n const open = (): void => {\r\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\r\n closeTimer.current = undefined\r\n setHovered(true)\r\n }\r\n const scheduleClose = (): void => {\r\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\r\n closeTimer.current = setTimeout(() => {\r\n closeTimer.current = undefined\r\n setHovered(false)\r\n }, 350)\r\n }\r\n useEffect(() => () => {\r\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\r\n }, [])\r\n if (summary === undefined) return null\r\n const label = summary.state === 'running'\r\n ? t('tasksTurnRunning', { count: summary.running })\r\n : summary.state === 'failed'\r\n ? t('tasksTurnFailed', { failed: summary.failed, completed: summary.completed })\r\n : t('tasksTurnCompleted', { count: summary.completed })\r\n const stateStyle = summary.state === 'completed' ? styles.tasksBadgeDone : {}\r\n const dotStyle = summary.state === 'failed'\r\n ? styles.tasksBadgeDotError\r\n : summary.state === 'completed' ? styles.tasksBadgeDotDone : {}\r\n return (\r\n <div data-claude-task-launcher={turn} style={styles.tasksBadgeWrap}>\r\n <span\r\n style={styles.tasksBadgeSeat}\r\n onMouseEnter={open}\r\n onMouseLeave={scheduleClose}\r\n onFocus={open}\r\n onBlur={event => {\r\n if (!event.currentTarget.contains(event.relatedTarget)) scheduleClose()\r\n }}\r\n >\r\n {hovered ? (\r\n <span role=\"tooltip\" style={styles.tasksHoverCard} onMouseEnter={open} onMouseLeave={scheduleClose}>\r\n <span style={styles.tasksHoverHeader}>{label}</span>\r\n {turnTasks.slice(0, MAX_HOVER_TASKS).map(task => {\r\n const { glyph, style } = taskGlyph(task.status)\r\n return (\r\n <span key={task.taskId} style={styles.tasksHoverRow}>\r\n <span className={task.status === 'running' ? 'dsh-claude-act-running' : undefined} style={{ ...styles.tasksHoverGlyph, ...style }} aria-hidden=\"true\">{glyph}</span>\r\n <span style={styles.tasksHoverDesc} title={task.description}>{task.description}</span>\r\n {task.subagentType === undefined ? null : <span style={styles.tasksHoverType}>{task.subagentType}</span>}\r\n </span>\r\n )\r\n })}\r\n {turnTasks.length > MAX_HOVER_TASKS ? <span style={styles.tasksHoverMore}>+{turnTasks.length - MAX_HOVER_TASKS}</span> : null}\r\n <span style={styles.tasksHoverHint}>{t('tasksOpen')}</span>\r\n </span>\r\n ) : null}\r\n <button\r\n type=\"button\"\r\n className=\"dsh-claude-task-launcher\"\r\n style={{ ...styles.tasksTurnBadge, ...stateStyle, ...(hovered ? styles.tasksBadgeHovered : {}) }}\r\n aria-label={`${label} — ${t('tasksOpen')}`}\r\n onClick={() => openTasks(turn)}\r\n >\r\n <span\r\n className={summary.state === 'running' ? 'dsh-claude-act-running' : undefined}\r\n style={{ ...styles.tasksBadgeDot, ...dotStyle }}\r\n aria-hidden=\"true\"\r\n />\r\n <span style={styles.tasksBadgeLabel}>{label}</span>\r\n </button>\r\n </span>\r\n </div>\r\n )\r\n}\r\n\r\nexport function ClaudeActivityTail({ matched, useClaudeProjection, t, openTasks }: ClaudeActivityTailProps) {\r\n const tasks = useClaudeProjection(value => value.tasks?.tasks ?? [])\r\n return <ClaudeTaskLauncher turn={matched.turn} tasks={tasks} t={t} openTasks={openTasks} />\r\n}\r\n","import type { ChatNodeViewProps } from '@deepseek-ai/dsh-client-ui-conversation/client'\r\nimport { ClaudeTaskLauncher } from './ClaudeActivityTail.tsx'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\n\r\nexport interface ClaudeActiveTasksNodeProps extends Omit<ChatNodeViewProps<'claude-active-tasks'>, 't'> {\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n openTasks: (turn: number) => void\r\n}\r\n\r\nconst EMPTY_TASKS = [] as const\r\n\r\n/** Render the task launcher while the owning DSH turn is still open. */\r\nexport function ClaudeActiveTasksNode({ node, useClaudeProjection, t, openTasks }: ClaudeActiveTasksNodeProps) {\r\n const tasks = useClaudeProjection(value => value.tasks?.tasks ?? EMPTY_TASKS)\r\n return <ClaudeTaskLauncher turn={node.data.turn} tasks={tasks} t={t} openTasks={openTasks} />\r\n}\r\n","/** Rewind: drop one user message and everything after it.\r\n *\r\n * Two halves, because the two sides of a Claude session are owned by\r\n * different processes:\r\n *\r\n * - Claude's own transcript is rewound for real. Every completed DSH turn\r\n * records the last chain-entry uuid Claude emitted for it, so the next\r\n * spawn resumes at the kept turn's anchor (`resumeSessionAt`) and the model\r\n * genuinely forgets the discarded turns.\r\n * - The DSH session log is append-only and the Host renders every event it\r\n * holds — even compaction keeps the shadowed conversation on screen — so the\r\n * discarded rows are recorded here as hidden seq ranges and suppressed by\r\n * the browser instead of deleted.\r\n */\r\nimport type { SessionEvent } from '@deepseek-ai/dsh-session'\r\n\r\n/** One inclusive span of hidden surface seqs. */\r\nexport interface ClaudeRewindRange {\r\n readonly start: number\r\n readonly end: number\r\n}\r\n\r\n/** The last Claude chain entry of one completed DSH turn. */\r\nexport interface ClaudeRewindAnchor {\r\n readonly turn: number\r\n readonly uuid: string\r\n}\r\n\r\n/** Fork target for the next Claude spawn; `fresh` starts an empty session. */\r\nexport type ClaudeRewindResume = { readonly resumeAt: string } | { readonly fresh: true }\r\n\r\nexport interface ClaudeRewindState {\r\n /** Hidden seq ranges, ascending and non-overlapping. */\r\n readonly ranges: readonly ClaudeRewindRange[]\r\n /** Chain anchors of the turns Claude still holds, ascending by turn. */\r\n readonly anchors: readonly ClaudeRewindAnchor[]\r\n /** Armed once by a rewind, consumed by the next Claude spawn. */\r\n readonly pending?: ClaudeRewindResume\r\n}\r\n\r\nexport const EMPTY_REWIND_STATE: ClaudeRewindState = { ranges: [], anchors: [] }\r\n\r\n/** Sessions outlive their rewinds; both lists stay bounded. */\r\nexport const MAX_REWIND_RANGES = 200\r\nexport const MAX_REWIND_ANCHORS = 2_000\r\n\r\n/** Absorb one span into an ascending, non-overlapping range list. Adjacent\r\n * spans merge so a rewind of a rewind reads as one hidden block. */\r\nexport function mergeRewindRanges(\r\n ranges: readonly ClaudeRewindRange[],\r\n addition: ClaudeRewindRange,\r\n): ClaudeRewindRange[] {\r\n const merged: ClaudeRewindRange[] = []\r\n let { start, end } = addition\r\n for (const range of [...ranges].sort((left, right) => left.start - right.start)) {\r\n if (range.end + 1 < start) merged.push(range)\r\n else if (range.start > end + 1) {\r\n merged.push({ start, end })\r\n start = range.start\r\n end = range.end\r\n } else {\r\n start = Math.min(start, range.start)\r\n end = Math.max(end, range.end)\r\n }\r\n }\r\n merged.push({ start, end })\r\n return merged.slice(-MAX_REWIND_RANGES)\r\n}\r\n\r\nexport function isRewound(ranges: readonly ClaudeRewindRange[], seq: number): boolean {\r\n return ranges.some(range => seq >= range.start && seq <= range.end)\r\n}\r\n\r\n/** Record one completed turn's last chain entry, replacing a re-run turn. */\r\nexport function recordRewindAnchor(\r\n state: ClaudeRewindState,\r\n anchor: ClaudeRewindAnchor,\r\n): ClaudeRewindState {\r\n const anchors = [...state.anchors.filter(item => item.turn !== anchor.turn), anchor]\r\n .sort((left, right) => left.turn - right.turn)\r\n .slice(-MAX_REWIND_ANCHORS)\r\n return { ...state, anchors }\r\n}\r\n\r\n/** The turn a surface seq belongs to: the first turn opened at or after it.\r\n * A message accepted but never run belongs to no logged turn, so nothing\r\n * Claude holds is discarded and every anchor stays valid. */\r\nexport function turnAtOrAfter(events: readonly SessionEvent[], seq: number): number | undefined {\r\n for (const event of events) {\r\n if (event.seq >= seq && event.type === 'turn/start') return event.data.turn\r\n }\r\n return undefined\r\n}\r\n\r\n/** Plan one rewind at `seq`, or undefined when the seq is not in the log.\r\n * Anchors of the discarded turns go with them: after this rewind Claude no\r\n * longer holds those entries, so a later rewind must never fork at one. */\r\nexport function planRewind(\r\n state: ClaudeRewindState,\r\n events: readonly SessionEvent[],\r\n seq: number,\r\n): ClaudeRewindState | undefined {\r\n const last = events.at(-1)?.seq\r\n if (last === undefined || seq > last) return undefined\r\n const turn = turnAtOrAfter(events, seq) ?? Number.MAX_SAFE_INTEGER\r\n const anchors = state.anchors.filter(anchor => anchor.turn < turn)\r\n const kept = anchors.at(-1)\r\n return {\r\n ranges: mergeRewindRanges(state.ranges, { start: seq, end: last }),\r\n anchors,\r\n pending: kept === undefined ? { fresh: true } : { resumeAt: kept.uuid },\r\n }\r\n}\r\n","import type { HostObservable, SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type { ClaudeActivityEvent, ClaudeContextUsageEvent, ClaudeTasksEvent } from '../events.ts'\r\nimport type { ClaudeCommandView } from '../command-bridge.ts'\r\nimport type { RepositoryStatus } from '../repository-status.ts'\r\nimport type { ReviewComment } from '../review-comments.ts'\r\nimport { CLAUDE_PROJECTION_PATH } from '../constants.ts'\r\nimport { MAX_REWIND_RANGES, type ClaudeRewindRange } from '../rewind.ts'\r\n\r\nexport interface ClaudeClientProjection {\r\n readonly schemaVersion: 1\r\n readonly revision: number\r\n readonly owned: boolean\r\n readonly commands: readonly ClaudeCommandView[]\r\n readonly activities: readonly ClaudeActivityEvent[]\r\n readonly contextUsage?: ClaudeContextUsageEvent\r\n readonly tasks?: ClaudeTasksEvent\r\n readonly repository?: RepositoryStatus\r\n readonly reviewComments?: readonly ReviewComment[]\r\n /** Surface seq spans a rewind dropped; the chat suppresses their rows. */\r\n readonly rewind?: { readonly ranges: readonly ClaudeRewindRange[] }\r\n /** Client-derived per-step activity slices with stable identities for\r\n * untouched steps, so streaming re-renders only the active step. */\r\n readonly byStep?: ReadonlyMap<string, readonly ClaudeActivityEvent[]>\r\n}\r\n\r\nexport const EMPTY_CLAUDE_PROJECTION: ClaudeClientProjection = {\r\n schemaVersion: 1,\r\n revision: 0,\r\n owned: false,\r\n commands: [],\r\n activities: [],\r\n}\r\n\r\nconst RETRY_DELAY_MS = 2_000\r\n/** Coalesce stream deltas into at most one React notification per frame. */\r\nconst FRAME_MS = 16\r\n/** Typewriter smoothing: drain newly arrived prose over roughly this window,\r\n * so the CLI's paragraph-sized deltas read as a continuous character flow. */\r\nconst REVEAL_WINDOW_MS = 1_200\r\n/** A burst larger than this (redaction rewrite, reconnect catch-up) shows\r\n * instantly instead of animating for a long stretch. */\r\nconst MAX_INSTANT_REVEAL = 4_000\r\nconst MAX_ACTIVITIES = 10_000\r\nconst MAX_COMMANDS = 2_000\r\nconst MAX_REPOSITORY_TEXT_CHARS = 1_024\r\nconst MAX_DIFF_CHARS = 256 * 1024\r\nconst MAX_REVIEW_COMMENTS = 50\r\nconst MAX_REVIEW_COMMENT_CHARS = 2_000\r\nconst MAX_TRANSCRIPT_CHARS = 64_000\r\n\r\nfunction record(value: unknown): Record<string, unknown> | undefined {\r\n return value !== null && typeof value === 'object' && !Array.isArray(value)\r\n ? value as Record<string, unknown>\r\n : undefined\r\n}\r\n\r\nfunction nonNegativeInteger(value: unknown): value is number {\r\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0\r\n}\r\n\r\nfunction optionalBoundedString(value: unknown): boolean {\r\n return value === undefined || (typeof value === 'string' && value.length <= MAX_REPOSITORY_TEXT_CHARS)\r\n}\r\n\r\nfunction validateRepository(value: unknown): value is RepositoryStatus {\r\n const repository = record(value)\r\n if (repository === undefined\r\n || !['ready', 'not-repository', 'unavailable'].includes(String(repository.status))\r\n || typeof repository.cwd !== 'string'\r\n || repository.cwd.length > MAX_REPOSITORY_TEXT_CHARS\r\n || !optionalBoundedString(repository.root)\r\n || !optionalBoundedString(repository.branch)\r\n || !optionalBoundedString(repository.remote)\r\n || (repository.detached !== undefined && typeof repository.detached !== 'boolean')\r\n || (repository.worktree !== undefined && typeof repository.worktree !== 'boolean')\r\n || (repository.dirty !== undefined && typeof repository.dirty !== 'boolean')\r\n || (repository.upstream !== undefined && typeof repository.upstream !== 'boolean')\r\n || (repository.ahead !== undefined && !nonNegativeInteger(repository.ahead))\r\n || (repository.behind !== undefined && !nonNegativeInteger(repository.behind))) return false\r\n if (repository.diff !== undefined) {\r\n const diff = record(repository.diff)\r\n if (diff === undefined\r\n || !nonNegativeInteger(diff.additions)\r\n || !nonNegativeInteger(diff.deletions)\r\n || !nonNegativeInteger(diff.files)\r\n || typeof diff.truncated !== 'boolean'\r\n || (diff.patch !== undefined && (typeof diff.patch !== 'string' || diff.patch.length > MAX_DIFF_CHARS))) return false\r\n }\r\n if (repository.pullRequest === undefined) return true\r\n const pullRequest = record(repository.pullRequest)\r\n if (pullRequest === undefined\r\n || !Number.isSafeInteger(pullRequest.number)\r\n || Number(pullRequest.number) <= 0\r\n || typeof pullRequest.title !== 'string'\r\n || pullRequest.title.length > MAX_REPOSITORY_TEXT_CHARS\r\n || typeof pullRequest.url !== 'string'\r\n || pullRequest.url.length > MAX_REPOSITORY_TEXT_CHARS\r\n || !['open', 'closed', 'merged'].includes(String(pullRequest.state))\r\n || typeof pullRequest.draft !== 'boolean'\r\n || !['approved', 'changes-requested', 'review-required', 'none'].includes(String(pullRequest.review))\r\n || !['passing', 'pending', 'failing', 'none'].includes(String(pullRequest.checks))\r\n || !optionalBoundedString(pullRequest.mergeState)\r\n || !optionalBoundedString(pullRequest.author)\r\n || !optionalBoundedString(pullRequest.baseBranch)\r\n || (pullRequest.createdAt !== undefined && (typeof pullRequest.createdAt !== 'string' || !Number.isFinite(Date.parse(pullRequest.createdAt))))\r\n || (pullRequest.mergedAt !== undefined && (typeof pullRequest.mergedAt !== 'string' || !Number.isFinite(Date.parse(pullRequest.mergedAt))))) return false\r\n try {\r\n const url = new URL(pullRequest.url)\r\n return url.protocol === 'https:' && url.hostname === 'github.com'\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/** Validate the public route envelope before publishing it to UI components. */\r\nexport function parseClaudeClientProjection(value: unknown): ClaudeClientProjection {\r\n const input = record(value)\r\n if (input === undefined\r\n || input.schemaVersion !== 1\r\n || !nonNegativeInteger(input.revision)\r\n || typeof input.owned !== 'boolean'\r\n || !Array.isArray(input.commands)\r\n || input.commands.length > MAX_COMMANDS\r\n || !Array.isArray(input.activities)\r\n || input.activities.length > MAX_ACTIVITIES) {\r\n throw new Error('invalid Claude sidecar projection')\r\n }\r\n for (const item of input.commands) {\r\n const command = record(item)\r\n if (command === undefined\r\n || typeof command.publicName !== 'string'\r\n || typeof command.claudeName !== 'string'\r\n || typeof command.description !== 'string'\r\n || (command.hint !== undefined && typeof command.hint !== 'string')\r\n || typeof command.prefixed !== 'boolean') throw new Error('invalid Claude command projection')\r\n }\r\n for (const item of input.activities) {\r\n const activity = record(item)\r\n if (activity === undefined\r\n || !nonNegativeInteger(activity.turn)\r\n || !nonNegativeInteger(activity.step)\r\n || !nonNegativeInteger(activity.ordinal)\r\n || typeof activity.kind !== 'string') throw new Error('invalid Claude sidecar activity')\r\n }\r\n if (input.contextUsage !== undefined && record(input.contextUsage) === undefined) {\r\n throw new Error('invalid Claude context projection')\r\n }\r\n const tasks = input.tasks === undefined ? undefined : record(input.tasks)\r\n if (tasks !== undefined && !Array.isArray(tasks.tasks)) throw new Error('invalid Claude tasks projection')\r\n if (input.repository !== undefined && !validateRepository(input.repository)) {\r\n throw new Error('invalid Claude repository projection')\r\n }\r\n if (input.reviewComments !== undefined) {\r\n if (!Array.isArray(input.reviewComments) || input.reviewComments.length > MAX_REVIEW_COMMENTS) {\r\n throw new Error('invalid Claude review comment projection')\r\n }\r\n for (const item of input.reviewComments) {\r\n const comment = record(item)\r\n if (comment === undefined\r\n || typeof comment.id !== 'string' || comment.id.length === 0 || comment.id.length > 128\r\n || typeof comment.path !== 'string' || comment.path.length === 0 || comment.path.length > MAX_REPOSITORY_TEXT_CHARS\r\n || !nonNegativeInteger(comment.line)\r\n || (comment.side !== 'old' && comment.side !== 'new')\r\n || typeof comment.text !== 'string' || comment.text.length > MAX_REVIEW_COMMENT_CHARS) {\r\n throw new Error('invalid Claude review comment projection')\r\n }\r\n }\r\n }\r\n if (input.rewind !== undefined) {\r\n const ranges = record(input.rewind)?.ranges\r\n if (!Array.isArray(ranges) || ranges.length > MAX_REWIND_RANGES) throw new Error('invalid Claude rewind projection')\r\n for (const item of ranges) {\r\n const range = record(item)\r\n if (range === undefined || !nonNegativeInteger(range.start) || !nonNegativeInteger(range.end)) {\r\n throw new Error('invalid Claude rewind projection')\r\n }\r\n }\r\n }\r\n return input as unknown as ClaudeClientProjection\r\n}\r\n\r\n/** Validate one incremental delta payload with the same rules as a snapshot. */\r\nfunction validateEnvelopeFragment(fragment: Record<string, unknown>): void {\r\n parseClaudeClientProjection({ schemaVersion: 1, revision: 0, owned: false, commands: [], activities: [], ...fragment })\r\n}\r\n\r\nexport function stepKeyOf(turn: number, step: number): string {\r\n return `${turn}:${step}`\r\n}\r\n\r\nconst EMPTY_ACTIVITIES: readonly ClaudeActivityEvent[] = []\r\n\r\n/** Identity-stable per-step slice; untouched steps never re-render while\r\n * another step streams. Falls back to filtering for snapshot-only hooks. */\r\nexport function selectStepActivities(\r\n value: ClaudeClientProjection,\r\n turn: number,\r\n step: number,\r\n): readonly ClaudeActivityEvent[] {\r\n const sliced = value.byStep?.get(stepKeyOf(turn, step))\r\n if (sliced !== undefined) return sliced\r\n const filtered = value.activities.filter(activity => activity.turn === turn && activity.step === step)\r\n return filtered.length === 0 ? EMPTY_ACTIVITIES : filtered\r\n}\r\n\r\nexport interface ClaudeProjectionSource extends HostObservable<ClaudeClientProjection> {\r\n dispose(): void\r\n}\r\n\r\nfunction isAbort(error: unknown): boolean {\r\n return (error as { name?: unknown } | null | undefined)?.name === 'AbortError'\r\n}\r\n\r\nfunction delay(ms: number): Promise<void> {\r\n return new Promise(resolve => {\r\n const timer = setTimeout(resolve, ms)\r\n ;(timer as { unref?: () => void }).unref?.()\r\n })\r\n}\r\n\r\n/** Create one lazy source: active subscribers open the Host NDJSON stream, and\r\n * a dropped stream reconnects with a fresh snapshot after a bounded delay. */\r\nexport function createClaudeProjectionSource(\r\n sessionId: string,\r\n fetchProjection: typeof fetch = fetch,\r\n retryDelayMs = RETRY_DELAY_MS,\r\n): ClaudeProjectionSource {\r\n let snapshot = EMPTY_CLAUDE_PROJECTION\r\n let revision = 0\r\n let owned = false\r\n let commands: readonly ClaudeCommandView[] = []\r\n let contextUsage: ClaudeContextUsageEvent | undefined\r\n let tasks: ClaudeTasksEvent | undefined\r\n let repository: RepositoryStatus | undefined\r\n let reviewComments: readonly ReviewComment[] | undefined\r\n let rewind: ClaudeClientProjection['rewind']\r\n const byStep = new Map<string, ClaudeActivityEvent[]>()\r\n const stepOrder: { turn: number; step: number; key: string }[] = []\r\n /** Streaming prose still being revealed: full arrived text plus shown chars. */\r\n const reveal = new Map<string, { full: ClaudeActivityEvent; shown: number }>()\r\n let disposed = false\r\n let running = false\r\n let controller: AbortController | undefined\r\n let frame: ReturnType<typeof setTimeout> | number | undefined\r\n let usedAnimationFrame = false\r\n const listeners = new Set<() => void>()\r\n\r\n const ensureStep = (turn: number, step: number): ClaudeActivityEvent[] => {\r\n const key = stepKeyOf(turn, step)\r\n const existing = byStep.get(key)\r\n if (existing !== undefined) return existing\r\n const created: ClaudeActivityEvent[] = []\r\n byStep.set(key, created)\r\n const at = stepOrder.findIndex(entry => entry.turn > turn || (entry.turn === turn && entry.step > step))\r\n stepOrder.splice(at === -1 ? stepOrder.length : at, 0, { turn, step, key })\r\n return created\r\n }\r\n\r\n const upsertActivity = (activity: ClaudeActivityEvent): void => {\r\n const key = stepKeyOf(activity.turn, activity.step)\r\n // Copy-on-write: only the touched step's slice changes identity.\r\n const next = ensureStep(activity.turn, activity.step).slice()\r\n const index = next.findIndex(item => item.ordinal === activity.ordinal)\r\n if (index === -1) {\r\n const at = next.findIndex(item => item.ordinal > activity.ordinal)\r\n next.splice(at === -1 ? next.length : at, 0, activity)\r\n } else {\r\n next[index] = activity\r\n }\r\n byStep.set(key, next)\r\n }\r\n\r\n const reset = (activities: readonly ClaudeActivityEvent[]): void => {\r\n byStep.clear()\r\n stepOrder.length = 0\r\n reveal.clear()\r\n // Snapshot activities arrive globally sorted, so plain pushes stay ordered.\r\n for (const activity of activities) ensureStep(activity.turn, activity.step).push(activity)\r\n }\r\n\r\n /** Advance every pending typewriter reveal by one frame's worth of characters.\r\n * The per-frame step scales with the backlog so any burst drains in roughly\r\n * REVEAL_WINDOW_MS. Returns whether another frame is still needed. */\r\n const advanceReveals = (): boolean => {\r\n let remaining = false\r\n for (const [key, entry] of reveal) {\r\n const total = entry.full.text?.length ?? 0\r\n if (entry.shown >= total) {\r\n reveal.delete(key)\r\n continue\r\n }\r\n const step = Math.max(1, Math.ceil((total - entry.shown) * FRAME_MS / REVEAL_WINDOW_MS))\r\n entry.shown = Math.min(total, entry.shown + step)\r\n upsertActivity({ ...entry.full, text: (entry.full.text ?? '').slice(0, entry.shown) })\r\n if (entry.shown >= total) reveal.delete(key)\r\n else remaining = true\r\n }\r\n return remaining\r\n }\r\n\r\n const publish = (): void => {\r\n frame = undefined\r\n if (disposed) return\r\n const revealing = advanceReveals()\r\n const activities: ClaudeActivityEvent[] = []\r\n for (const entry of stepOrder) {\r\n const slice = byStep.get(entry.key)\r\n if (slice !== undefined) for (const item of slice) activities.push(item)\r\n }\r\n snapshot = {\r\n schemaVersion: 1,\r\n revision,\r\n owned,\r\n commands,\r\n activities,\r\n ...(contextUsage === undefined ? {} : { contextUsage }),\r\n ...(tasks === undefined ? {} : { tasks }),\r\n ...(repository === undefined ? {} : { repository }),\r\n ...(reviewComments === undefined ? {} : { reviewComments }),\r\n ...(rewind === undefined ? {} : { rewind }),\r\n byStep: new Map(byStep),\r\n }\r\n for (const listener of [...listeners]) listener()\r\n if (revealing) schedulePublish()\r\n }\r\n\r\n const cancelFrame = (): void => {\r\n if (frame === undefined) return\r\n if (usedAnimationFrame) {\r\n (globalThis as { cancelAnimationFrame?: (handle: number) => void }).cancelAnimationFrame?.(frame as number)\r\n } else {\r\n clearTimeout(frame as ReturnType<typeof setTimeout>)\r\n }\r\n frame = undefined\r\n }\r\n\r\n const schedulePublish = (): void => {\r\n if (disposed || frame !== undefined || listeners.size === 0) return\r\n const raf = (globalThis as { requestAnimationFrame?: (callback: () => void) => number }).requestAnimationFrame\r\n if (typeof raf === 'function') {\r\n usedAnimationFrame = true\r\n frame = raf(publish)\r\n } else {\r\n usedAnimationFrame = false\r\n frame = setTimeout(publish, FRAME_MS)\r\n }\r\n }\r\n\r\n const applyText = (event: Record<string, unknown>): boolean => {\r\n const { turn, step, ordinal, append, text } = event\r\n if (!nonNegativeInteger(turn) || !nonNegativeInteger(step) || !nonNegativeInteger(ordinal)) return false\r\n if (append !== undefined && (typeof append !== 'string' || append.length > MAX_TRANSCRIPT_CHARS)) return false\r\n if (text !== undefined && (typeof text !== 'string' || text.length > MAX_TRANSCRIPT_CHARS)) return false\r\n if (append === undefined && text === undefined) return false\r\n const revealKey = `${turn}:${step}:${ordinal}`\r\n const slice = byStep.get(stepKeyOf(turn, step))\r\n const existing = slice?.find(item => item.ordinal === ordinal)\r\n const pending = reveal.get(revealKey)\r\n if (existing === undefined && pending === undefined && typeof text !== 'string') {\r\n // ponytail: an append without its base waits for the next snapshot line\r\n return false\r\n }\r\n // Appends extend the full arrived text, which may be ahead of the\r\n // currently revealed prefix stored in byStep.\r\n const baseText = pending?.full.text ?? existing?.text ?? ''\r\n const fullText = (typeof text === 'string' ? text : `${baseText}${append as string}`).slice(0, MAX_TRANSCRIPT_CHARS)\r\n const template = pending?.full ?? existing ?? { turn, step, ordinal, kind: 'text' as const, phase: 'updated' as const }\r\n const full = { ...template, text: fullText }\r\n const shown = Math.min(pending?.shown ?? existing?.text?.length ?? 0, fullText.length)\r\n if (fullText.length - shown > MAX_INSTANT_REVEAL) {\r\n reveal.delete(revealKey)\r\n upsertActivity(full)\r\n return true\r\n }\r\n reveal.set(revealKey, { full, shown })\r\n upsertActivity({ ...full, text: fullText.slice(0, shown) })\r\n return true\r\n }\r\n\r\n const applyLine = (line: string): void => {\r\n const trimmed = line.trim()\r\n if (trimmed.length === 0) return\r\n let value: unknown\r\n try {\r\n value = JSON.parse(trimmed)\r\n } catch {\r\n return\r\n }\r\n const event = record(value)\r\n if (event === undefined || typeof event.type !== 'string') return\r\n try {\r\n switch (event.type) {\r\n case 'snapshot': {\r\n const next = parseClaudeClientProjection(event)\r\n revision = next.revision\r\n owned = next.owned\r\n commands = next.commands\r\n contextUsage = next.contextUsage\r\n tasks = next.tasks\r\n repository = next.repository\r\n reviewComments = next.reviewComments\r\n rewind = next.rewind\r\n reset(next.activities)\r\n break\r\n }\r\n case 'text':\r\n if (!applyText(event)) return\r\n revision += 1\r\n break\r\n case 'activity':\r\n validateEnvelopeFragment({ activities: [event.activity] })\r\n upsertActivity(event.activity as ClaudeActivityEvent)\r\n revision += 1\r\n break\r\n case 'contextUsage':\r\n validateEnvelopeFragment({ contextUsage: event.value })\r\n contextUsage = event.value as ClaudeContextUsageEvent\r\n revision += 1\r\n break\r\n case 'tasks':\r\n validateEnvelopeFragment({ tasks: event.value })\r\n tasks = event.value as ClaudeTasksEvent\r\n revision += 1\r\n break\r\n case 'meta':\r\n validateEnvelopeFragment({\r\n owned: event.owned,\r\n commands: event.commands,\r\n ...(event.repository === undefined ? {} : { repository: event.repository }),\r\n ...(event.reviewComments === undefined ? {} : { reviewComments: event.reviewComments }),\r\n })\r\n owned = event.owned as boolean\r\n commands = event.commands as readonly ClaudeCommandView[]\r\n repository = event.repository as RepositoryStatus | undefined\r\n reviewComments = event.reviewComments as readonly ReviewComment[] | undefined\r\n revision += 1\r\n break\r\n default:\r\n // ping and unknown line types are ignored\r\n return\r\n }\r\n } catch {\r\n // A malformed or oversized delta is transient; keep the last verified\r\n // state visible instead of making mounted UI disappear.\r\n return\r\n }\r\n schedulePublish()\r\n }\r\n\r\n const run = async (): Promise<void> => {\r\n if (running) return\r\n running = true\r\n try {\r\n while (!disposed && listeners.size > 0) {\r\n controller = new AbortController()\r\n try {\r\n const response = await fetchProjection(`${CLAUDE_PROJECTION_PATH}/${encodeURIComponent(sessionId)}/stream`, {\r\n headers: { accept: 'application/x-ndjson' },\r\n signal: controller.signal,\r\n })\r\n if (!response.ok) throw new Error(`Claude projection stream failed (${response.status})`)\r\n if (response.body === null) throw new Error('Claude projection stream is unavailable')\r\n const reader = response.body.getReader()\r\n const decoder = new TextDecoder()\r\n let buffer = ''\r\n while (true) {\r\n if (disposed || listeners.size === 0) {\r\n await reader.cancel().catch(() => undefined)\r\n break\r\n }\r\n const chunk = await reader.read()\r\n buffer += decoder.decode(chunk.value, { stream: !chunk.done })\r\n const lines = buffer.split('\\n')\r\n buffer = lines.pop() ?? ''\r\n for (const line of lines) applyLine(line)\r\n if (chunk.done) break\r\n }\r\n } catch (error) {\r\n // Abort is the ordinary unmount path; other failures retry below.\r\n if (isAbort(error)) return\r\n } finally {\r\n controller = undefined\r\n }\r\n if (disposed || listeners.size === 0) return\r\n await delay(retryDelayMs)\r\n }\r\n } finally {\r\n running = false\r\n }\r\n }\r\n\r\n return {\r\n getSnapshot: () => snapshot,\r\n subscribe(listener) {\r\n if (disposed) return () => {}\r\n const wasIdle = listeners.size === 0\r\n listeners.add(listener)\r\n if (wasIdle) void run()\r\n return () => {\r\n listeners.delete(listener)\r\n if (listeners.size !== 0) return\r\n controller?.abort()\r\n controller = undefined\r\n cancelFrame()\r\n }\r\n },\r\n dispose() {\r\n disposed = true\r\n listeners.clear()\r\n controller?.abort()\r\n controller = undefined\r\n cancelFrame()\r\n },\r\n }\r\n}\r\n\r\nexport class ClaudeProjectionStore {\r\n readonly #sources = new Map<string, ClaudeProjectionSource>()\r\n\r\n source(sessionId: string): ClaudeProjectionSource {\r\n let source = this.#sources.get(sessionId)\r\n if (source === undefined) {\r\n source = createClaudeProjectionSource(sessionId)\r\n this.#sources.set(sessionId, source)\r\n }\r\n return source\r\n }\r\n\r\n dispose(): void {\r\n for (const source of this.#sources.values()) source.dispose()\r\n this.#sources.clear()\r\n }\r\n}\r\n\r\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\r\n interface SessionStandardProps {\r\n /** Plugin-owned sidecar projection for the rendered session. */\r\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\r\n }\r\n\r\n interface SessionMaybeStandardProps {\r\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection> | undefined\r\n }\r\n}\r\n","import { useMemo, useState } from 'react'\r\nimport {\r\n DiffBlock,\r\n DisclosureRow,\r\n IconApiOutline14,\r\n IconThinkOutline14,\r\n MarkdownText,\r\n StateDot,\r\n} from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport type { ChatNodeViewProps } from '@deepseek-ai/dsh-client-ui-conversation/client'\r\nimport type { ClaudeActivityEvent } from '../events.ts'\r\nimport type { ClaudeActivityChatData, ClaudeCompaction, ClaudeSubcall, ClaudeTranscriptTool } from './conversation-sidecar.ts'\r\nimport { transcriptItemsForStep } from './conversation-sidecar.ts'\r\nimport { selectStepActivities } from './projection.ts'\r\nimport { formatTokenCount } from './token-format.ts'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\n\r\ntype Translate = (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n\r\nexport type ClaudeActivityNodeProps = Omit<ChatNodeViewProps<'claude-activity-step'>, 't'> & { t: Translate }\r\n\r\nconst EMPTY_TASKS = [] as const\r\n\r\nconst ACTIVITY_CSS = [\r\n '.dsh-claude-flow{display:flex;flex-direction:column;gap:10px}',\r\n '.dsh-claude-transcript-text{color:var(--dsw-alias-label-primary);font-size:15px;line-height:24px;overflow-wrap:anywhere}',\r\n '.dsh-claude-tool-group-native{overflow:visible}',\r\n '.dsh-claude-tool-group-native>.dsh-claude-flow-row{padding:0}',\r\n '.dsh-claude-tool-list{max-height:min(420px,calc(100vh - 320px));overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;margin-top:4px;border:1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent));border-radius:10px;scrollbar-gutter:stable}',\r\n '.dsh-claude-tool-item{border-top:1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent))}',\r\n '.dsh-claude-tool-item:first-child{border-top:0}',\r\n '.dsh-claude-tool-summary-row{display:flex;align-items:center;min-height:34px;gap:8px;padding:0 10px;cursor:pointer;list-style:none}',\r\n '.dsh-claude-tool-summary-row::-webkit-details-marker{display:none}',\r\n '.dsh-claude-tool-summary-row::after{content:\"›\";margin-left:2px;flex:none;align-self:center;color:var(--dsw-alias-label-secondary);font-size:22px;line-height:1;transform-origin:center;transition:transform .15s ease}',\r\n '.dsh-claude-tool-item[open]>.dsh-claude-tool-summary-row::after{transform:rotate(90deg)}',\r\n '.dsh-claude-tool-content{min-width:0;padding:0 10px 8px}',\r\n '.dsh-claude-tool-content>*{max-width:100%;box-sizing:border-box}',\r\n '.dsh-claude-tool-section{margin-top:8px}',\r\n '.dsh-claude-tool-section-title{margin-bottom:4px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px;text-transform:uppercase;letter-spacing:.04em}',\r\n '.dsh-claude-tool-fields{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:3px 12px;font-size:13px;line-height:20px}',\r\n '.dsh-claude-tool-field-key{color:var(--dsw-alias-label-tertiary)}',\r\n '.dsh-claude-tool-field-value{min-width:0;color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere}',\r\n '.dsh-claude-tool-paths{display:flex;flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;font:var(--dsw-font-markdown-code-block-small)}',\r\n '.dsh-claude-tool-path{overflow-wrap:anywhere;color:var(--dsw-alias-label-primary)}',\r\n '.dsh-claude-tool-code{max-height:260px;overflow:auto;margin:0;padding:8px 0;border-radius:8px;background:var(--dsw-alias-markdown-code-block);font:var(--dsw-font-markdown-code-block-small)}',\r\n '.dsh-claude-tool-code-line{display:grid;grid-template-columns:44px minmax(max-content,1fr);min-height:18px}',\r\n '.dsh-claude-tool-line-number{padding-right:10px;text-align:right;user-select:none;color:var(--dsw-alias-label-caption);border-right:1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent))}',\r\n '.dsh-claude-tool-line-text{padding:0 10px;white-space:pre}',\r\n '.dsh-claude-tool-label{width:72px;flex:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary)}',\r\n '.dsh-claude-tool-description{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;line-height:20px;color:var(--dsw-alias-label-primary)}',\r\n '.dsh-claude-tool-stats{display:inline-flex;gap:4px;flex:none;font-size:13px;line-height:20px}',\r\n '.dsh-claude-diff-add{color:var(--dsw-alias-state-success-primary,#21c55d)}',\r\n '.dsh-claude-diff-delete{color:var(--dsw-alias-state-error-primary)}',\r\n '.dsh-claude-tool-name{font-size:14px;line-height:22px;color:var(--dsw-alias-label-primary)}',\r\n '.dsh-claude-tool-summary{margin-left:8px;color:var(--dsw-alias-label-tertiary)}',\r\n '.dsh-claude-tool-detail{margin:6px 0 0;padding:8px 10px;max-height:220px;overflow:auto;border-radius:8px;background:var(--dsw-alias-markdown-code-block);font:var(--dsw-font-markdown-code-block-small);white-space:pre-wrap;overflow-wrap:anywhere}',\r\n '.dsh-claude-flow-row{position:relative;overflow:hidden}',\r\n '.dsh-claude-flow-leading{flex-shrink:0}',\r\n '.dsh-claude-flow-title{font-weight:400}',\r\n '.dsh-claude-flow-chevron{color:var(--dsw-alias-label-secondary)}',\r\n '.dsh-claude-flow-separator{width:2px;height:2px;margin:0 8px;border-radius:1px;background:var(--dsw-alias-label-caption);flex:none}',\r\n '.dsh-claude-flow-summary{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-tertiary);font-size:14px;line-height:24px;flex:auto}',\r\n '.dsh-claude-flow-summary[data-error]{color:var(--dsw-alias-state-error-primary)}',\r\n '.dsh-claude-flow-body{margin:4px 0 4px 22px;color:var(--dsw-alias-label-tertiary);font-size:14px;line-height:24px;white-space:pre-wrap;overflow-wrap:anywhere}',\r\n '.dsh-claude-flow-detail{max-height:260px;overflow:auto;margin:4px 0 4px 4px;padding:12px 16px;border:1px solid var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent));border-radius:12px;background:var(--dsw-alias-markdown-code-block);color:var(--dsw-alias-label-primary);font:var(--dsw-font-markdown-code-block-small);white-space:pre-wrap}',\r\n '.dsh-claude-flow-subcalls{display:flex;flex-direction:column;gap:2px;margin:4px 0 4px 22px;color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:22px}',\r\n '.dsh-claude-compaction{display:flex;align-items:center;gap:10px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}',\r\n '.dsh-claude-compaction::before,.dsh-claude-compaction::after{content:\"\";flex:1;height:1px;background:var(--dsw-alias-border-l1, color-mix(in srgb, currentColor 12%, transparent))}',\r\n '.dsh-claude-compaction-label{flex:none;white-space:nowrap}',\r\n '.dsh-claude-act-running{animation:dsh-claude-act-pulse 1.2s ease-in-out infinite}',\r\n '@keyframes dsh-claude-act-pulse{0%,100%{opacity:1}50%{opacity:.3}}',\r\n].join('')\r\n\r\nlet cssInjected = false\r\nfunction ensureCss(): void {\r\n if (cssInjected || typeof document === 'undefined') return\r\n cssInjected = true\r\n const element = document.createElement('style')\r\n element.dataset.dshClaudeActivity = ''\r\n element.textContent = ACTIVITY_CSS\r\n document.head.appendChild(element)\r\n}\r\n\r\nfunction subcallGlyph(subcall: ClaudeSubcall): string {\r\n if (subcall.isError === true || subcall.phase === 'failed') return '×'\r\n if (subcall.phase === 'started' || subcall.phase === 'updated') return '●'\r\n return '✓'\r\n}\r\n\r\nfunction title(activity: ClaudeActivityEvent): string {\r\n return activity.toolName ?? activity.title ?? activity.kind.replaceAll('-', ' ')\r\n}\r\n\r\nfunction activityState(activity: ClaudeActivityEvent, running: boolean): 'done' | 'ongoing' | 'warning' | 'error' {\r\n if (activity.isError === true || activity.kind === 'error' || activity.phase === 'denied' || activity.phase === 'failed') return 'error'\r\n if (running) return 'ongoing'\r\n if (activity.kind === 'warning') return 'warning'\r\n return 'done'\r\n}\r\n\r\nfunction ActivityRow({ row, t }: { row: ClaudeActivityChatData; t: Translate }) {\r\n const { activity, running, subcalls } = row\r\n const [open, setOpen] = useState(false)\r\n const state = activityState(activity, running)\r\n const detail = activity.detail\r\n const expandable = detail !== undefined || subcalls.length > 0 || activity.kind === 'thinking'\r\n const summary = activity.summary ?? (running ? t('running') : state === 'error' ? t('failed') : t('done'))\r\n const body = activity.kind === 'thinking' ? activity.summary : detail\r\n const icon = activity.kind === 'thinking'\r\n ? <IconThinkOutline14 size={14} />\r\n : state === 'done'\r\n ? <IconApiOutline14 size={14} />\r\n : <StateDot state={state} />\r\n return (\r\n <DisclosureRow\r\n rowClassName=\"dsh-claude-flow-row\"\r\n leadingClassName=\"dsh-claude-flow-leading\"\r\n titleClassName=\"dsh-claude-flow-title\"\r\n chevronClassName=\"dsh-claude-flow-chevron\"\r\n icon={icon}\r\n title={activity.kind === 'thinking' ? t('thinking') : title(activity)}\r\n open={open}\r\n expandable={expandable}\r\n expandOnRowClick\r\n keepContentWhenOpen\r\n onToggle={() => setOpen(value => !value)}\r\n collapsedContent={(\r\n <>\r\n <span className=\"dsh-claude-flow-separator\" aria-hidden=\"true\" />\r\n <span className=\"dsh-claude-flow-summary\" data-error={state === 'error' || undefined}>{summary}</span>\r\n </>\r\n )}\r\n >\r\n {subcalls.length === 0 ? null : (\r\n <div className=\"dsh-claude-flow-subcalls\">\r\n {subcalls.map(subcall => (\r\n <div key={subcall.toolUseId}>{subcallGlyph(subcall)} {subcall.toolName ?? t('subagent')}{subcall.summary === undefined ? '' : ` · ${subcall.summary}`}</div>\r\n ))}\r\n </div>\r\n )}\r\n {body === undefined ? null : activity.kind === 'thinking'\r\n ? <div className=\"dsh-claude-flow-body\">{body}</div>\r\n : <pre className=\"dsh-claude-flow-detail\">{body}</pre>}\r\n </DisclosureRow>\r\n )\r\n}\r\n\r\n/** Compaction has no turn of its own to render, so the transcript marks it with\r\n * a rule instead of a row: it separates prose rather than reporting work. */\r\nexport function ClaudeCompactionDivider({ compaction, t }: { compaction: ClaudeCompaction; t: Translate }) {\r\n const { trigger, preTokens, postTokens } = compaction\r\n const label = trigger === 'auto' ? t('compactedAuto') : t('compacted')\r\n const shrink = preTokens === undefined || postTokens === undefined\r\n ? undefined\r\n : `${formatTokenCount(preTokens)} → ${formatTokenCount(postTokens)}`\r\n return (\r\n <div className=\"dsh-claude-compaction\" role=\"separator\">\r\n <span className=\"dsh-claude-compaction-label\">{shrink === undefined ? label : `${label} · ${shrink}`}</span>\r\n </div>\r\n )\r\n}\r\n\r\ntype ToolRecord = Record<string, unknown>\r\n\r\nfunction parsedValue(value: string | undefined): unknown {\r\n if (value === undefined || value.length === 0) return undefined\r\n try {\r\n return JSON.parse(value) as unknown\r\n } catch {\r\n return value\r\n }\r\n}\r\n\r\nfunction record(value: unknown): ToolRecord | undefined {\r\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as ToolRecord : undefined\r\n}\r\n\r\nfunction text(value: unknown): string | undefined {\r\n return typeof value === 'string' && value.length > 0 ? value : undefined\r\n}\r\n\r\nfunction numberValue(value: unknown): number | undefined {\r\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\r\n}\r\n\r\nfunction displayValue(value: unknown): string {\r\n if (value === null) return 'null'\r\n if (typeof value === 'string') return value\r\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\r\n if (Array.isArray(value)) return value.map(displayValue).join(', ')\r\n return record(value) === undefined ? String(value) : Object.entries(value as ToolRecord)\r\n .map(([key, item]) => `${key}: ${displayValue(item)}`)\r\n .join('\\n')\r\n}\r\n\r\nfunction Section({ title, children }: { title: string; children: React.ReactNode }) {\r\n return <section className=\"dsh-claude-tool-section\"><div className=\"dsh-claude-tool-section-title\">{title}</div>{children}</section>\r\n}\r\n\r\nfunction Fields({ value, omit = [] }: { value: ToolRecord; omit?: readonly string[] }) {\r\n const entries = Object.entries(value).filter(([key, item]) => !omit.includes(key) && item !== undefined && item !== '')\r\n if (entries.length === 0) return null\r\n return <div className=\"dsh-claude-tool-fields\">{entries.map(([key, item]) => (\r\n <div key={key} style={{ display: 'contents' }}>\r\n <span className=\"dsh-claude-tool-field-key\">{key.replaceAll('_', ' ')}</span>\r\n <span className=\"dsh-claude-tool-field-value\">{displayValue(item)}</span>\r\n </div>\r\n ))}</div>\r\n}\r\n\r\nfunction Paths({ paths }: { paths: readonly string[] }) {\r\n if (paths.length === 0) return null\r\n return <ul className=\"dsh-claude-tool-paths\">{paths.map((path, index) => <li className=\"dsh-claude-tool-path\" key={`${path}:${index}`}>{path}</li>)}</ul>\r\n}\r\n\r\nfunction Source({ content, start = 1 }: { content: string; start?: number }) {\r\n return <div className=\"dsh-claude-tool-code\">{content.split(/\\r?\\n/u).map((line, index) => (\r\n <div className=\"dsh-claude-tool-code-line\" key={index}>\r\n <span className=\"dsh-claude-tool-line-number\">{start + index}</span>\r\n <span className=\"dsh-claude-tool-line-text\">{line || ' '}</span>\r\n </div>\r\n ))}</div>\r\n}\r\n\r\nfunction TextDetail({ title, value }: { title: string; value: string | undefined }) {\r\n if (value === undefined || value.length === 0) return null\r\n return <Section title={title}><pre className=\"dsh-claude-tool-detail\">{value}</pre></Section>\r\n}\r\n\r\nfunction filenameList(value: unknown): readonly string[] {\r\n if (!Array.isArray(value)) return []\r\n return value.filter((item): item is string => typeof item === 'string')\r\n}\r\n\r\nfunction ToolPresentation({ tool, t }: { tool: ClaudeTranscriptTool; t: Translate }) {\r\n const inputValue = parsedValue(tool.input)\r\n const outputValue = parsedValue(tool.output)\r\n const input = record(inputValue)\r\n const output = record(outputValue)\r\n const outputTitle = tool.isError === true ? t('toolError') : t('toolOutput')\r\n\r\n if (tool.diffs !== undefined) {\r\n return <><DiffBlock diffs={[...tool.diffs]} /><TextDetail title={outputTitle} value={typeof outputValue === 'string' ? outputValue : undefined} /></>\r\n }\r\n\r\n if (tool.toolName === 'Read') {\r\n const file = record(output?.file)\r\n const path = text(file?.filePath) ?? text(input?.file_path)\r\n const content = text(file?.content) ?? (typeof outputValue === 'string' ? outputValue : undefined)\r\n const offset = numberValue(input?.offset) ?? 1\r\n return <>\r\n {path === undefined ? null : <Section title=\"File\"><div className=\"dsh-claude-tool-path\">{path}</div></Section>}\r\n {input === undefined ? null : <Section title={t('toolInput')}><Fields value={input} omit={['file_path']} /></Section>}\r\n {content === undefined ? null : <Section title={outputTitle}><Source content={content} start={offset} /></Section>}\r\n </>\r\n }\r\n\r\n if (tool.toolName === 'Grep' || tool.toolName === 'Glob') {\r\n const filenames = filenameList(output?.filenames)\r\n return <>\r\n {input === undefined ? <TextDetail title={t('toolInput')} value={typeof inputValue === 'string' ? inputValue : undefined} /> : <Section title={t('toolInput')}><Fields value={input} /></Section>}\r\n {filenames.length === 0\r\n ? <TextDetail title={outputTitle} value={typeof outputValue === 'string' ? outputValue : output === undefined ? undefined : displayValue(output)} />\r\n : <Section title={outputTitle}><Paths paths={filenames} /></Section>}\r\n </>\r\n }\r\n\r\n if (tool.toolName === 'Bash' || tool.toolName === 'PowerShell') {\r\n const command = text(input?.command)\r\n const stdout = text(output?.stdout)\r\n const stderr = text(output?.stderr)\r\n const terminal = [stdout, stderr].filter((value): value is string => value !== undefined).join('\\n')\r\n return <>\r\n <TextDetail title=\"Command\" value={command ?? (typeof inputValue === 'string' ? inputValue : undefined)} />\r\n {input === undefined ? null : <Section title={t('toolInput')}><Fields value={input} omit={['command']} /></Section>}\r\n <TextDetail title={outputTitle} value={terminal || (typeof outputValue === 'string' ? outputValue : undefined)} />\r\n </>\r\n }\r\n\r\n return <>\r\n {input === undefined ? <TextDetail title={t('toolInput')} value={typeof inputValue === 'string' ? inputValue : undefined} /> : <Section title={t('toolInput')}><Fields value={input} /></Section>}\r\n {output === undefined ? <TextDetail title={outputTitle} value={typeof outputValue === 'string' ? outputValue : undefined} /> : <Section title={outputTitle}><Fields value={output} /></Section>}\r\n </>\r\n}\r\n\r\nexport function ClaudeTranscriptToolItem({ tool, t }: { tool: ClaudeTranscriptTool; t: Translate }) {\r\n return (\r\n <details className=\"dsh-claude-tool-item\">\r\n <summary className=\"dsh-claude-tool-summary-row\">\r\n <span className=\"dsh-claude-tool-label\">{tool.toolName}</span>\r\n <span className=\"dsh-claude-tool-description\">{tool.description}</span>\r\n {tool.additions === undefined && tool.deletions === undefined ? null : (\r\n <span className=\"dsh-claude-tool-stats\">\r\n <span className=\"dsh-claude-diff-add\">+{tool.additions ?? 0}</span>\r\n <span className=\"dsh-claude-diff-delete\">−{tool.deletions ?? 0}</span>\r\n </span>\r\n )}\r\n </summary>\r\n <div className=\"dsh-claude-tool-content\">\r\n {tool.subcalls.length === 0 ? null : (\r\n <div className=\"dsh-claude-flow-subcalls\">\r\n {tool.subcalls.map(subcall => (\r\n <div key={subcall.toolUseId}>{subcallGlyph(subcall)} {subcall.toolName ?? t('subagent')}{subcall.summary === undefined ? '' : ` · ${subcall.summary}`}</div>\r\n ))}\r\n </div>\r\n )}\r\n <ToolPresentation tool={tool} t={t} />\r\n </div>\r\n </details>\r\n )\r\n}\r\n\r\nexport function ClaudeTranscriptToolGroup({\r\n tools,\r\n additions,\r\n deletions,\r\n files: _files,\r\n t,\r\n}: {\r\n tools: readonly ClaudeTranscriptTool[]\r\n additions?: number\r\n deletions?: number\r\n files?: number\r\n t: Translate\r\n}) {\r\n const [open, setOpen] = useState(false)\r\n const failed = tools.some(tool => tool.isError === true || tool.phase === 'failed')\r\n const running = tools.some(tool => tool.phase === 'started' || tool.phase === 'updated')\r\n const summary = tools.length === 1 ? t('usedTool') : t('usedTools', { count: tools.length })\r\n const hasDiff = additions !== undefined || deletions !== undefined\r\n return (\r\n <div className=\"dsh-claude-tool-group-native\">\r\n <DisclosureRow\r\n rowClassName=\"dsh-claude-flow-row\"\r\n leadingClassName=\"dsh-claude-flow-leading\"\r\n titleClassName=\"dsh-claude-flow-title\"\r\n chevronClassName=\"dsh-claude-flow-chevron\"\r\n icon={failed ? <StateDot state=\"error\" /> : running ? <StateDot state=\"ongoing\" /> : <IconApiOutline14 size={14} />}\r\n title={summary}\r\n open={open}\r\n expandable\r\n expandOnRowClick\r\n keepContentWhenOpen\r\n onToggle={() => setOpen(value => !value)}\r\n collapsedContent={hasDiff ? (\r\n <span className=\"dsh-claude-tool-stats\">\r\n <span className=\"dsh-claude-diff-add\">+{additions ?? 0}</span>\r\n <span className=\"dsh-claude-diff-delete\">−{deletions ?? 0}</span>\r\n </span>\r\n ) : undefined}\r\n />\r\n {open ? (\r\n <div className=\"dsh-claude-tool-list\">\r\n {tools.map(tool => <ClaudeTranscriptToolItem key={tool.toolUseId} tool={tool} t={t} />)}\r\n </div>\r\n ) : null}\r\n </div>\r\n )\r\n}\r\n\r\nexport function ClaudeActivityNode({ node, useClaudeProjection, t }: ClaudeActivityNodeProps) {\r\n ensureCss()\r\n const marker = node.data\r\n const activities = useClaudeProjection(value => selectStepActivities(value, marker.turn, marker.step))\r\n const tasks = useClaudeProjection(value => value.tasks?.tasks ?? EMPTY_TASKS)\r\n const items = useMemo(\r\n () => transcriptItemsForStep(activities, marker.turn, marker.step, tasks),\r\n [activities, marker.step, marker.turn, tasks],\r\n )\r\n if (items.length === 0) return null\r\n return (\r\n <div className=\"dsh-claude-flow\">\r\n {items.map(item => item.kind === 'text'\r\n ? <div className=\"dsh-claude-transcript-text\" key={`text:${item.ordinal}`}><MarkdownText text={item.text} /></div>\r\n : item.kind === 'compaction'\r\n ? <ClaudeCompactionDivider key={`compaction:${item.ordinal}`} compaction={item.compaction} t={t} />\r\n : item.kind === 'tools'\r\n ? <ClaudeTranscriptToolGroup\r\n key={`tools:${item.ordinal}`}\r\n tools={item.tools}\r\n {...(item.additions === undefined ? {} : { additions: item.additions })}\r\n {...(item.deletions === undefined ? {} : { deletions: item.deletions })}\r\n {...(item.files === undefined ? {} : { files: item.files })}\r\n t={t}\r\n />\r\n : <ActivityRow key={`activity:${item.ordinal}`} row={item.row} t={t} />)}\r\n </div>\r\n )\r\n}\r\n","/** Deadlines for the plugin's own HTTP routes.\r\n *\r\n * A browser opens at most six connections to one origin, and a request that\r\n * never settles holds one of them for the life of the page. A handful of\r\n * those and every plugin route — the projection stream included — stops\r\n * answering, which reads as the whole plugin freezing until the Host is\r\n * restarted. So no plain request is allowed to wait forever: the deadline is\r\n * generous enough that a slow answer still arrives, and short enough that a\r\n * wedged one gives its connection back.\r\n *\r\n * Streaming routes (projection, ask, repository setup) are legitimately\r\n * long-lived and carry their own cancellation instead. */\r\n\r\n/** Reads: the route answers from cache or a short-timeout Git call. */\r\nexport const PLUGIN_READ_TIMEOUT_MS = 30_000\r\n/** Writes: the route may chain several remote Git/gh calls of its own. */\r\nexport const PLUGIN_ACTION_TIMEOUT_MS = 180_000\r\n\r\n/** Combine a caller's cancellation with this deadline. */\r\nexport function pluginRequestSignal(timeoutMs: number, signal?: AbortSignal): AbortSignal {\r\n const timeout = AbortSignal.timeout(timeoutMs)\r\n return signal === undefined ? timeout : AbortSignal.any([signal, timeout])\r\n}\r\n","import { CLAUDE_JIRA_PATH } from '../constants.ts'\r\nimport type { JiraStatus, JiraTicket } from '../jira.ts'\r\nimport { PLUGIN_READ_TIMEOUT_MS, pluginRequestSignal } from './plugin-request.ts'\r\n\r\nexport type { JiraStatus, JiraTicket } from '../jira.ts'\r\n\r\nexport class JiraClientError extends Error {\r\n readonly code?: string\r\n\r\n constructor(message: string, code?: string) {\r\n super(message)\r\n this.name = 'JiraClientError'\r\n if (code !== undefined) this.code = code\r\n }\r\n}\r\n\r\nfunction record(value: unknown): Record<string, unknown> | undefined {\r\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\r\n}\r\n\r\nasync function call(path: string, init: RequestInit): Promise<Record<string, unknown>> {\r\n const response = await fetch(`${CLAUDE_JIRA_PATH}${path}`, {\r\n credentials: 'same-origin',\r\n signal: pluginRequestSignal(PLUGIN_READ_TIMEOUT_MS),\r\n ...init,\r\n })\r\n const body = record(await response.json() as unknown)\r\n if (!response.ok) {\r\n throw new JiraClientError(\r\n typeof body?.message === 'string' ? body.message : 'Jira is unavailable.',\r\n typeof body?.error === 'string' ? body.error : undefined,\r\n )\r\n }\r\n if (body === undefined) throw new JiraClientError('Invalid Jira response.')\r\n return body\r\n}\r\n\r\nfunction status(body: Record<string, unknown>): JiraStatus {\r\n if (typeof body.connected !== 'boolean') throw new JiraClientError('Invalid Jira status response.')\r\n return body as unknown as JiraStatus\r\n}\r\n\r\nexport async function loadJiraStatus(signal?: AbortSignal): Promise<JiraStatus> {\r\n return status(await call('/status', { method: 'GET', headers: { accept: 'application/json' }, ...(signal === undefined ? {} : { signal }) }))\r\n}\r\n\r\nexport async function connectJira(input: { siteUrl: string; email: string; apiToken: string }): Promise<JiraStatus> {\r\n return status(await call('/connect', {\r\n method: 'POST',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify(input),\r\n }))\r\n}\r\n\r\nexport async function disconnectJira(): Promise<void> {\r\n await call('/disconnect', { method: 'POST', headers: { accept: 'application/json' } })\r\n}\r\n\r\nexport async function searchJiraTickets(query: string, signal?: AbortSignal): Promise<readonly JiraTicket[]> {\r\n const body = await call(`/search?query=${encodeURIComponent(query)}`, { method: 'GET', headers: { accept: 'application/json' }, ...(signal === undefined ? {} : { signal }) })\r\n if (!Array.isArray(body.tickets)) throw new JiraClientError('Invalid Jira search response.')\r\n const tickets: JiraTicket[] = []\r\n for (const item of body.tickets) {\r\n const ticket = record(item)\r\n if (ticket === undefined || typeof ticket.key !== 'string' || typeof ticket.summary !== 'string' || typeof ticket.url !== 'string') continue\r\n tickets.push(ticket as unknown as JiraTicket)\r\n }\r\n return tickets\r\n}\r\n\r\nexport async function assignJiraTicket(key: string): Promise<void> {\r\n await call('/assign', {\r\n method: 'POST',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({ key }),\r\n })\r\n}\r\n\r\n/** Draft seeded into the composer when a session starts from a ticket. */\r\nexport function ticketPrompt(ticket: JiraTicket): string {\r\n return `Work on Jira ticket ${ticket.key}: ${ticket.summary}\\n${ticket.url}\\n\\nRead the ticket, implement what it asks for, and reference ${ticket.key} in the commit and pull request.`\r\n}\r\n\r\n/** Appended to a user-written draft so the session still knows its ticket. */\r\nexport function ticketContext(ticket: JiraTicket): string {\r\n return `This task is for Jira ticket ${ticket.key}: ${ticket.summary}\\n${ticket.url}\\n\\nRead the ticket for full context and reference ${ticket.key} in the commit and pull request.`\r\n}\r\n","import { useCallback, useEffect, useId, useRef, useState } from 'react'\r\nimport { Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport { CLAUDE_DOCTOR_PATH, CLAUDE_GLOBAL_SETTINGS_PATH, CLAUDE_UPDATE_CHECK_PATH, CLAUDE_UPDATE_PATH, CLAUDE_USAGE_PATH } from '../constants.ts'\r\nimport type { PlanUsageReport, PlanUsageWindow } from '../plan-usage.ts'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\nimport * as styles from './styles.ts'\r\nimport { connectJira, disconnectJira, loadJiraStatus, type JiraStatus } from './jira-api.ts'\r\n\r\ninterface DoctorReport {\r\n executable: { status: 'found' | 'missing'; path?: string; searched: readonly string[] }\r\n version: { status: 'ok' | 'error' | 'not-run'; value?: string; message?: string }\r\n authentication: { status: 'signed-in' | 'signed-out' | 'unknown' | 'not-run'; method?: string; provider?: string; subscription?: string; message?: string }\r\n handshake: 'not-run' | 'ok' | 'error'\r\n limits: { idleTimeoutMs: number; maxProcesses: number }\r\n processes: { count: number; active: number }\r\n}\r\n\r\nexport interface PluginUpdateStatus {\r\n currentVersion: string\r\n latestVersion?: string\r\n source: 'registry' | 'link' | 'unsupported' | 'unknown'\r\n state: 'current' | 'available' | 'linked' | 'unsupported' | 'unavailable' | 'error'\r\n canUpdate: boolean\r\n restartRequired: boolean\r\n message?: string\r\n}\r\n\r\nexport function isPluginUpdateStatus(value: unknown): value is PluginUpdateStatus {\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\r\n const status = value as Record<string, unknown>\r\n return typeof status.currentVersion === 'string'\r\n && (status.latestVersion === undefined || typeof status.latestVersion === 'string')\r\n && ['registry', 'link', 'unsupported', 'unknown'].includes(String(status.source))\r\n && ['current', 'available', 'linked', 'unsupported', 'unavailable', 'error'].includes(String(status.state))\r\n && typeof status.canUpdate === 'boolean'\r\n && typeof status.restartRequired === 'boolean'\r\n && (status.message === undefined || typeof status.message === 'string')\r\n}\r\n\r\nexport interface GlobalSettingOption {\r\n value: string\r\n label: string\r\n source: 'built-in' | 'user' | 'configured'\r\n}\r\n\r\nexport type GlobalSettingView = {\r\n key: string\r\n kind: 'select'\r\n value: string\r\n options: readonly GlobalSettingOption[]\r\n effect: 'new-session' | 'next-worktree' | 'restart'\r\n} | {\r\n key: string\r\n kind: 'text'\r\n value: string\r\n maxLength: number\r\n effect: 'new-session' | 'next-worktree' | 'restart'\r\n}\r\n\r\ninterface GlobalSettingsView {\r\n settings: readonly GlobalSettingView[]\r\n}\r\n\r\nexport function isGlobalSettingsView(value: unknown): value is GlobalSettingsView {\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\r\n const settings = (value as { settings?: unknown }).settings\r\n return Array.isArray(settings) && settings.every(setting => {\r\n if (typeof setting !== 'object' || setting === null || Array.isArray(setting)) return false\r\n const item = setting as Record<string, unknown>\r\n if (typeof item.key !== 'string'\r\n || typeof item.value !== 'string'\r\n || !['new-session', 'next-worktree', 'restart'].includes(String(item.effect))) return false\r\n if (item.kind === 'text') return typeof item.maxLength === 'number' && item.maxLength > 0\r\n return item.kind === 'select'\r\n && Array.isArray(item.options)\r\n && item.options.every(option => typeof option === 'object' && option !== null\r\n && typeof (option as Record<string, unknown>).value === 'string'\r\n && typeof (option as Record<string, unknown>).label === 'string'\r\n && ['built-in', 'user', 'configured'].includes(String((option as Record<string, unknown>).source)))\r\n })\r\n}\r\n\r\nexport interface ClaudeCodeSettingsInjected {\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n}\r\n\r\nfunction value(status: string, detail?: string): string {\r\n return detail === undefined ? status : `${status} · ${detail}`\r\n}\r\n\r\ninterface GlobalSettingSelectProps {\r\n setting: Extract<GlobalSettingView, { kind: 'select' }>\r\n disabled: boolean\r\n onChange: (value: string) => void\r\n}\r\n\r\nexport function GlobalSettingText({ setting, disabled, onChange }: {\r\n setting: Extract<GlobalSettingView, { kind: 'text' }>\r\n disabled: boolean\r\n onChange: (value: string) => void\r\n}) {\r\n const [draft, setDraft] = useState(setting.value)\r\n useEffect(() => { setDraft(setting.value) }, [setting.value])\r\n const save = (): void => {\r\n if (draft !== setting.value) onChange(draft)\r\n }\r\n return (\r\n <input\r\n type=\"text\"\r\n value={draft}\r\n maxLength={setting.maxLength}\r\n disabled={disabled}\r\n style={styles.settingTextInput}\r\n onChange={event => { setDraft(event.currentTarget.value) }}\r\n onBlur={save}\r\n onKeyDown={event => {\r\n if (event.key === 'Enter') {\r\n event.preventDefault()\r\n save()\r\n event.currentTarget.blur()\r\n } else if (event.key === 'Escape') {\r\n setDraft(setting.value)\r\n event.currentTarget.blur()\r\n }\r\n }}\r\n />\r\n )\r\n}\r\n\r\nexport function GlobalSettingSelect({ setting, disabled, onChange }: GlobalSettingSelectProps) {\r\n const [open, setOpen] = useState(false)\r\n const [activeIndex, setActiveIndex] = useState(0)\r\n const rootRef = useRef<HTMLDivElement>(null)\r\n const triggerRef = useRef<HTMLButtonElement>(null)\r\n const listboxId = useId()\r\n const selectedIndex = Math.max(0, setting.options.findIndex(option => option.value === setting.value))\r\n const selectedOption = setting.options[selectedIndex]\r\n\r\n useEffect(() => {\r\n if (!open) return\r\n const closeOnOutsidePointer = (event: MouseEvent): void => {\r\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false)\r\n }\r\n document.addEventListener('mousedown', closeOnOutsidePointer)\r\n return () => document.removeEventListener('mousedown', closeOnOutsidePointer)\r\n }, [open])\r\n\r\n const openMenu = (index = selectedIndex): void => {\r\n setActiveIndex(index)\r\n setOpen(true)\r\n }\r\n\r\n const choose = (index: number): void => {\r\n const option = setting.options[index]\r\n if (option === undefined) return\r\n setOpen(false)\r\n triggerRef.current?.focus()\r\n if (option.value !== setting.value) onChange(option.value)\r\n }\r\n\r\n const move = (offset: number): void => {\r\n const count = setting.options.length\r\n if (count === 0) return\r\n setActiveIndex(current => (current + offset + count) % count)\r\n }\r\n\r\n return (\r\n <div\r\n ref={rootRef}\r\n style={styles.settingSelect}\r\n onBlur={event => {\r\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setOpen(false)\r\n }}\r\n >\r\n <button\r\n ref={triggerRef}\r\n type=\"button\"\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n aria-controls={open ? listboxId : undefined}\r\n aria-activedescendant={open ? `${listboxId}-${activeIndex}` : undefined}\r\n disabled={disabled || setting.options.length === 0}\r\n style={{ ...styles.settingSelectTrigger, ...(open ? styles.settingSelectTriggerOpen : {}) }}\r\n onClick={() => { if (open) setOpen(false); else openMenu() }}\r\n onKeyDown={event => {\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n event.preventDefault()\r\n if (!open) openMenu(event.key === 'ArrowDown' ? selectedIndex : Math.max(0, setting.options.length - 1))\r\n else move(event.key === 'ArrowDown' ? 1 : -1)\r\n } else if (event.key === 'Home' && open) {\r\n event.preventDefault()\r\n setActiveIndex(0)\r\n } else if (event.key === 'End' && open) {\r\n event.preventDefault()\r\n setActiveIndex(Math.max(0, setting.options.length - 1))\r\n } else if ((event.key === 'Enter' || event.key === ' ') && open) {\r\n event.preventDefault()\r\n choose(activeIndex)\r\n } else if (event.key === 'Escape' && open) {\r\n event.preventDefault()\r\n setOpen(false)\r\n }\r\n }}\r\n >\r\n <span style={styles.settingSelectValue}>{selectedOption?.label ?? setting.value}</span>\r\n <span aria-hidden=\"true\" style={{ ...styles.settingSelectChevron, ...(open ? styles.settingSelectChevronOpen : {}) }}>⌄</span>\r\n </button>\r\n {open ? (\r\n <div id={listboxId} role=\"listbox\" aria-activedescendant={`${listboxId}-${activeIndex}`} style={styles.settingSelectMenu}>\r\n {setting.options.map((option, index) => {\r\n const selected = option.value === setting.value\r\n const active = index === activeIndex\r\n return (\r\n <button\r\n id={`${listboxId}-${index}`}\r\n key={`${option.source}:${option.value}`}\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={selected}\r\n style={{ ...styles.settingSelectOption, ...(active ? styles.settingSelectOptionActive : {}) }}\r\n onMouseEnter={() => setActiveIndex(index)}\r\n onMouseDown={event => event.preventDefault()}\r\n onClick={() => choose(index)}\r\n >\r\n <span style={styles.settingSelectCheck} aria-hidden=\"true\">{selected ? '✓' : ''}</span>\r\n <span>{option.label}</span>\r\n </button>\r\n )\r\n })}\r\n </div>\r\n ) : null}\r\n </div>\r\n )\r\n}\r\n\r\n/** Fixed windows carry a translated label; server-named model buckets (e.g.\r\n * 'Fable') arrive with their own `label` and are shown verbatim. */\r\nconst TRANSLATED_WINDOWS = new Set(['five_hour', 'seven_day', 'seven_day_opus', 'seven_day_sonnet'])\r\n\r\n/** Per-setting label and the effect note that used to sit as a standalone\r\n * paragraph under the card; it now hangs off the label as a hover hint. */\r\nexport const SETTING_COPY: Readonly<Record<string, { label: ClaudeCodeSettingsKey; hint: ClaudeCodeSettingsKey }>> = {\r\n outputStyle: { label: 'outputStyle', hint: 'globalSettingsNewSession' },\r\n worktreeBranchPrefix: { label: 'worktreeBranchPrefix', hint: 'worktreeBranchPrefixEffect' },\r\n maxProcesses: { label: 'maxProcessesSetting', hint: 'maxProcessesEffect' },\r\n idleTimeoutMinutes: { label: 'idleTimeoutSetting', hint: 'idleTimeoutEffect' },\r\n}\r\n\r\n/** '?' badge that reveals a setting's effect note on hover or keyboard focus. */\r\nexport function SettingHint({ text, label }: { text: string; label: string }) {\r\n return (\r\n <Tooltip label={text} side=\"top\" delayMs={150} maxWidth={320}>\r\n <span role=\"note\" tabIndex={0} aria-label={`${label}: ${text}`} style={styles.settingHint}>?</span>\r\n </Tooltip>\r\n )\r\n}\r\n\r\nexport function isPlanUsageReport(value: unknown): value is PlanUsageReport {\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\r\n const report = value as Record<string, unknown>\r\n return typeof report.available === 'boolean'\r\n && typeof report.fetchedAt === 'number'\r\n && Array.isArray(report.windows)\r\n && report.windows.every(entry => typeof entry === 'object' && entry !== null\r\n && typeof (entry as Record<string, unknown>).id === 'string')\r\n}\r\n\r\n/** Coarse duration for a reset countdown or a fetch age: minutes below an\r\n * hour, then hours, then days. Never negative — a passed reset reads '0m'. */\r\nexport function durationLabel(milliseconds: number): string {\r\n const minutes = Math.max(0, Math.round(milliseconds / 60_000))\r\n if (minutes < 60) return `${minutes}m`\r\n const hours = Math.floor(minutes / 60)\r\n if (hours < 24) return minutes % 60 === 0 ? `${hours}h` : `${hours}h ${minutes % 60}m`\r\n return `${Math.floor(hours / 24)}d`\r\n}\r\n\r\nexport function PlanUsageMeter({ window: usageWindow, t, now }: {\r\n window: PlanUsageWindow\r\n t: ClaudeCodeSettingsInjected['t']\r\n now: number\r\n}) {\r\n const used = usageWindow.utilization\r\n const tone = styles.planUsageTone(used)\r\n const resetsIn = usageWindow.resetsAt === undefined ? undefined : Date.parse(usageWindow.resetsAt)\r\n return (\r\n <span style={styles.planUsageMeter}>\r\n <span style={styles.planUsageTrack}>\r\n <span style={{ ...styles.planUsageFill, width: `${used ?? 0}%`, background: tone.fill }} />\r\n </span>\r\n <span style={{ ...styles.planUsageMeta, color: tone.text }}>\r\n {used === undefined ? '—' : t('planUsageUsed', { percent: Math.round(used) })}\r\n {resetsIn === undefined || !Number.isFinite(resetsIn) ? null : ` · ${t('planUsageResets', { age: durationLabel(resetsIn - now) })}`}\r\n </span>\r\n </span>\r\n )\r\n}\r\n\r\n/** Every panel read is a local plugin route, so a request still outstanding\r\n * after this long is a wedged host, not a slow one — and a settings card that\r\n * says so beats one that says \"Loading…\" forever. */\r\nconst SETTINGS_REQUEST_TIMEOUT_MS = 20_000\r\n\r\n/** Fetch the plan usage report; POST forces the backend to re-read it. */\r\nexport async function loadPlanUsage(refresh: boolean): Promise<PlanUsageReport> {\r\n const response = await fetch(CLAUDE_USAGE_PATH, {\r\n method: refresh ? 'POST' : 'GET',\r\n credentials: 'same-origin',\r\n signal: AbortSignal.timeout(SETTINGS_REQUEST_TIMEOUT_MS),\r\n headers: { accept: 'application/json' },\r\n })\r\n const payload = await response.json() as unknown\r\n if (!response.ok) {\r\n const message = typeof payload === 'object' && payload !== null && 'error' in payload && typeof payload.error === 'string'\r\n ? payload.error\r\n : `HTTP ${response.status}`\r\n throw new Error(message)\r\n }\r\n if (!isPlanUsageReport(payload)) throw new Error('Invalid plan usage response')\r\n return payload\r\n}\r\n\r\nexport function PlanUsageCard({ t, load }: {\r\n t: ClaudeCodeSettingsInjected['t']\r\n load: (refresh: boolean) => Promise<PlanUsageReport>\r\n}) {\r\n const [report, setReport] = useState<PlanUsageReport>()\r\n const [busy, setBusy] = useState(false)\r\n const [error, setError] = useState<string>()\r\n\r\n const request = useCallback(async (refresh: boolean) => {\r\n setBusy(true)\r\n setError(undefined)\r\n try {\r\n setReport(await load(refresh))\r\n } catch (cause) {\r\n setError(cause instanceof Error ? cause.message : String(cause))\r\n } finally {\r\n setBusy(false)\r\n }\r\n }, [load])\r\n\r\n useEffect(() => { void request(false) }, [request])\r\n\r\n // Countdowns are read at render time; the fetch timestamp is enough of a\r\n // clock because a stale reading is labelled with its own age.\r\n const now = Date.now()\r\n return (\r\n <section style={styles.settingsCard}>\r\n <div style={styles.settingsCardHeader}>\r\n <div>\r\n <h3 style={styles.settingsSectionHeading}>{t('planUsage')}</h3>\r\n <p style={styles.settingsBody}>{t('planUsageBody')}</p>\r\n </div>\r\n <button type=\"button\" style={styles.button} disabled={busy} onClick={() => { void request(true) }}>\r\n {busy ? t('planUsageRefreshing') : t('planUsageRefresh')}\r\n </button>\r\n </div>\r\n {report === undefined\r\n ? <p style={styles.notice}>{busy ? t('planUsageLoading') : t('planUsageNever')}</p>\r\n : report.windows.length === 0\r\n ? <p style={styles.notice}>{report.fetchedAt === 0 ? t('planUsageNever') : t('planUsageUnavailable')}</p>\r\n : (\r\n <div style={styles.diagnosticGrid}>\r\n {report.subscription === undefined ? null : <>\r\n <span style={styles.diagnosticLabel}>{t('planUsageSubscription')}</span>\r\n <span style={styles.diagnosticValue}>{report.subscription}</span>\r\n </>}\r\n {report.windows.flatMap(usageWindow => [\r\n <span key={`${usageWindow.id}-label`} style={styles.diagnosticLabel}>\r\n {usageWindow.label ?? (TRANSLATED_WINDOWS.has(usageWindow.id)\r\n ? t(`planWindow_${usageWindow.id}` as ClaudeCodeSettingsKey)\r\n : usageWindow.id)}\r\n </span>,\r\n <PlanUsageMeter key={`${usageWindow.id}-meter`} window={usageWindow} t={t} now={now} />,\r\n ])}\r\n </div>\r\n )}\r\n {report !== undefined && report.fetchedAt > 0\r\n ? <p style={styles.notice}>{t('planUsageUpdated', { age: durationLabel(now - report.fetchedAt) })}</p>\r\n : null}\r\n {error === undefined ? null : <p role=\"alert\" style={{ ...styles.notice, color: 'var(--dsw-alias-state-error-primary)' }}>{t('planUsageError')}: {error}</p>}\r\n </section>\r\n )\r\n}\r\n\r\nexport function ClaudeCodeSettings({ t }: ClaudeCodeSettingsInjected) {\r\n const [report, setReport] = useState<DoctorReport>()\r\n const [error, setError] = useState<string>()\r\n const [busy, setBusy] = useState(false)\r\n const [updateStatus, setUpdateStatus] = useState<PluginUpdateStatus>()\r\n const [updateError, setUpdateError] = useState<string>()\r\n const [updateBusy, setUpdateBusy] = useState<'check' | 'update'>()\r\n const [globalSettings, setGlobalSettings] = useState<GlobalSettingsView>()\r\n const [globalSettingsError, setGlobalSettingsError] = useState<string>()\r\n const [globalSettingsBusy, setGlobalSettingsBusy] = useState(false)\r\n const [jiraStatus, setJiraStatus] = useState<JiraStatus>()\r\n const [jiraError, setJiraError] = useState<string>()\r\n const [jiraBusy, setJiraBusy] = useState(false)\r\n const [jiraSite, setJiraSite] = useState('')\r\n const [jiraEmail, setJiraEmail] = useState('')\r\n const [jiraToken, setJiraToken] = useState('')\r\n useEffect(() => {\r\n const controller = new AbortController()\r\n void loadJiraStatus(controller.signal).then(setJiraStatus, (reason: unknown) => {\r\n if (!controller.signal.aborted) setJiraError(reason instanceof Error ? reason.message : String(reason))\r\n })\r\n return () => { controller.abort() }\r\n }, [])\r\n const connectJiraNow = async (): Promise<void> => {\r\n setJiraBusy(true)\r\n setJiraError(undefined)\r\n try {\r\n setJiraStatus(await connectJira({ siteUrl: jiraSite, email: jiraEmail, apiToken: jiraToken }))\r\n setJiraToken('')\r\n } catch (cause) {\r\n setJiraError(cause instanceof Error ? cause.message : String(cause))\r\n } finally {\r\n setJiraBusy(false)\r\n }\r\n }\r\n const disconnectJiraNow = async (): Promise<void> => {\r\n setJiraBusy(true)\r\n setJiraError(undefined)\r\n try {\r\n await disconnectJira()\r\n setJiraStatus({ connected: false })\r\n } catch (cause) {\r\n setJiraError(cause instanceof Error ? cause.message : String(cause))\r\n } finally {\r\n setJiraBusy(false)\r\n }\r\n }\r\n\r\n const refresh = useCallback(async () => {\r\n setBusy(true)\r\n setError(undefined)\r\n setReport(undefined)\r\n try {\r\n const response = await fetch(CLAUDE_DOCTOR_PATH, {\r\n credentials: 'same-origin',\r\n signal: AbortSignal.timeout(SETTINGS_REQUEST_TIMEOUT_MS),\r\n headers: { accept: 'application/json' },\r\n })\r\n const payload = await response.json() as DoctorReport | { error?: string }\r\n if (!response.ok) throw new Error('error' in payload ? payload.error : `HTTP ${response.status}`)\r\n setReport(payload as DoctorReport)\r\n } catch (cause) {\r\n setError(cause instanceof Error ? cause.message : String(cause))\r\n } finally {\r\n setBusy(false)\r\n }\r\n }, [])\r\n\r\n useEffect(() => { void refresh() }, [refresh])\r\n\r\n const requestGlobalSettings = useCallback(async (changes?: Record<string, string>) => {\r\n setGlobalSettingsBusy(true)\r\n setGlobalSettingsError(undefined)\r\n try {\r\n const response = await fetch(CLAUDE_GLOBAL_SETTINGS_PATH, {\r\n method: changes === undefined ? 'GET' : 'PATCH',\r\n credentials: 'same-origin',\r\n signal: AbortSignal.timeout(SETTINGS_REQUEST_TIMEOUT_MS),\r\n headers: { accept: 'application/json', ...(changes === undefined ? {} : { 'content-type': 'application/json' }) },\r\n ...(changes === undefined ? {} : { body: JSON.stringify({ changes }) }),\r\n })\r\n const payload = await response.json() as unknown\r\n if (!response.ok) {\r\n const message = typeof payload === 'object' && payload !== null && 'error' in payload && typeof payload.error === 'string'\r\n ? payload.error\r\n : `HTTP ${response.status}`\r\n throw new Error(message)\r\n }\r\n if (!isGlobalSettingsView(payload)) throw new Error('Invalid global settings response')\r\n setGlobalSettings(payload)\r\n } catch (cause) {\r\n setGlobalSettingsError(cause instanceof Error ? cause.message : String(cause))\r\n } finally {\r\n setGlobalSettingsBusy(false)\r\n }\r\n }, [])\r\n\r\n useEffect(() => { void requestGlobalSettings() }, [requestGlobalSettings])\r\n\r\n const requestUpdate = useCallback(async (action: 'check' | 'update') => {\r\n setUpdateBusy(action)\r\n setUpdateError(undefined)\r\n try {\r\n const response = await fetch(action === 'check' ? CLAUDE_UPDATE_CHECK_PATH : CLAUDE_UPDATE_PATH, {\r\n method: action === 'check' ? 'GET' : 'POST',\r\n credentials: 'same-origin',\r\n headers: { accept: 'application/json' },\r\n })\r\n const payload = await response.json() as unknown\r\n if (!response.ok) {\r\n const message = typeof payload === 'object' && payload !== null && 'error' in payload && typeof payload.error === 'string'\r\n ? payload.error\r\n : `HTTP ${response.status}`\r\n throw new Error(message)\r\n }\r\n if (!isPluginUpdateStatus(payload)) throw new Error('Invalid update response')\r\n setUpdateStatus(payload)\r\n } catch (cause) {\r\n setUpdateError(cause instanceof Error ? cause.message : String(cause))\r\n } finally {\r\n setUpdateBusy(undefined)\r\n }\r\n }, [])\r\n\r\n const rows = report === undefined ? [] : [\r\n [t('executable'), report.executable.status === 'found' ? report.executable.path ?? t('unknown') : `${t('missing')} · ${report.executable.searched.join(', ')}`],\r\n [t('version'), value(report.version.status, report.version.value ?? report.version.message)],\r\n [t('authentication'), value(report.authentication.status, [report.authentication.method, report.authentication.subscription].filter(Boolean).join(' · ') || report.authentication.message)],\r\n [t('handshake'), report.handshake],\r\n [t('processes'), t('processSummary', { total: report.processes.count, active: report.processes.active })],\r\n [t('limits'), t('limitSummary', { max: report.limits.maxProcesses, minutes: Math.round(report.limits.idleTimeoutMs / 60_000) })],\r\n ]\r\n\r\n return (\r\n <div style={styles.settingsPage}>\r\n <header style={styles.settingsHero}>\r\n <div style={styles.settingsMark} aria-hidden=\"true\">C</div>\r\n <div>\r\n <h2 style={styles.settingsHeading}>{t('title')}</h2>\r\n <p style={styles.settingsBody}>{t('description')}</p>\r\n </div>\r\n </header>\r\n\r\n <section style={styles.settingsCard}>\r\n <div style={styles.settingsCardHeader}>\r\n <div>\r\n <h3 style={styles.settingsSectionHeading}>{t('diagnostics')}</h3>\r\n <p style={styles.settingsBody}>{t('diagnosticsBody')}</p>\r\n </div>\r\n <button type=\"button\" style={styles.button} onClick={() => { void refresh() }} disabled={busy}>\r\n {busy ? t('refreshing') : t('doctor')}\r\n </button>\r\n </div>\r\n {rows.length === 0 ? <p style={styles.notice}>{t('diagnosticsLoading')}</p> : (\r\n <div style={styles.diagnosticGrid}>\r\n {rows.flatMap(([label, rowValue]) => [\r\n <span key={`${label}-label`} style={styles.diagnosticLabel}>{label}</span>,\r\n <span key={`${label}-value`} style={styles.diagnosticValue}>{rowValue}</span>,\r\n ])}\r\n </div>\r\n )}\r\n {error === undefined ? null : <p role=\"alert\" style={{ ...styles.notice, color: 'var(--dsw-alias-state-error-primary)' }}>{t('error')}: {error}</p>}\r\n </section>\r\n\r\n <PlanUsageCard t={t} load={loadPlanUsage} />\r\n\r\n <section style={styles.settingsCard}>\r\n <div>\r\n <h3 style={styles.settingsSectionHeading}>{t('globalSettings')}</h3>\r\n <p style={styles.settingsBody}>{t('globalSettingsBody')}</p>\r\n </div>\r\n {globalSettings === undefined ? <p style={styles.notice}>{t('globalSettingsLoading')}</p> : globalSettings.settings.map(setting => {\r\n const copy = SETTING_COPY[setting.key]\r\n return (\r\n <div key={setting.key} style={styles.diagnosticGrid}>\r\n <span style={styles.diagnosticLabel}>\r\n {copy === undefined ? setting.key : t(copy.label)}\r\n {copy === undefined ? null : <SettingHint text={t(copy.hint)} label={t('settingHint')} />}\r\n </span>\r\n {setting.kind === 'select' ? (\r\n <GlobalSettingSelect\r\n setting={setting}\r\n disabled={globalSettingsBusy}\r\n onChange={nextValue => { void requestGlobalSettings({ [setting.key]: nextValue }) }}\r\n />\r\n ) : (\r\n <GlobalSettingText\r\n setting={setting}\r\n disabled={globalSettingsBusy}\r\n onChange={nextValue => { void requestGlobalSettings({ [setting.key]: nextValue }) }}\r\n />\r\n )}\r\n </div>\r\n )\r\n })}\r\n {globalSettingsError === undefined ? null : <p role=\"alert\" style={{ ...styles.notice, color: 'var(--dsw-alias-state-error-primary)' }}>{t('globalSettingsError')}: {globalSettingsError}</p>}\r\n </section>\r\n\r\n <section style={styles.settingsCard}>\r\n <div style={styles.settingsCardHeader}>\r\n <div>\r\n <h3 style={styles.settingsSectionHeading}>{t('jiraTitle')}</h3>\r\n <p style={styles.settingsBody}>{t('jiraBody')}</p>\r\n </div>\r\n {jiraStatus?.connected === true\r\n ? <button type=\"button\" style={styles.button} disabled={jiraBusy} onClick={() => { void disconnectJiraNow() }}>{t('jiraDisconnect')}</button>\r\n : null}\r\n </div>\r\n {jiraStatus === undefined && jiraError === undefined ? <p style={styles.notice}>{t('jiraLoading')}</p> : null}\r\n {jiraStatus?.connected === true ? (\r\n <div style={styles.diagnosticGrid}>\r\n <span style={styles.diagnosticLabel}>{t('jiraConnected')}</span>\r\n <span>{jiraStatus.siteUrl} · {jiraStatus.displayName ?? jiraStatus.email}</span>\r\n </div>\r\n ) : jiraStatus === undefined ? null : <>\r\n <div style={styles.diagnosticGrid}>\r\n <span style={styles.diagnosticLabel}>{t('jiraSite')}</span>\r\n <input type=\"url\" value={jiraSite} placeholder={t('jiraSitePlaceholder')} disabled={jiraBusy} style={styles.settingTextInput} onChange={event => { setJiraSite(event.currentTarget.value) }} />\r\n </div>\r\n <div style={styles.diagnosticGrid}>\r\n <span style={styles.diagnosticLabel}>{t('jiraEmail')}</span>\r\n <input type=\"email\" value={jiraEmail} disabled={jiraBusy} style={styles.settingTextInput} onChange={event => { setJiraEmail(event.currentTarget.value) }} />\r\n </div>\r\n <div style={styles.diagnosticGrid}>\r\n <span style={styles.diagnosticLabel}>{t('jiraToken')}</span>\r\n <input type=\"password\" value={jiraToken} disabled={jiraBusy} autoComplete=\"off\" style={styles.settingTextInput} onChange={event => { setJiraToken(event.currentTarget.value) }} />\r\n </div>\r\n <div style={styles.settingsActions}>\r\n <a href=\"https://id.atlassian.com/manage-profile/security/api-tokens\" target=\"_blank\" rel=\"noopener noreferrer\" style={styles.settingsLink}>{t('jiraTokenHelp')}</a>\r\n <button\r\n type=\"button\"\r\n style={styles.primaryButton}\r\n disabled={jiraBusy || jiraSite.trim() === '' || jiraEmail.trim() === '' || jiraToken.trim() === ''}\r\n onClick={() => { void connectJiraNow() }}\r\n >{jiraBusy ? t('jiraConnecting') : t('jiraConnect')}</button>\r\n </div>\r\n </>}\r\n {jiraError === undefined ? null : <p role=\"alert\" style={{ ...styles.notice, color: 'var(--dsw-alias-state-error-primary)' }}>{t('jiraError')}: {jiraError}</p>}\r\n </section>\r\n\r\n <section style={styles.settingsCard}>\r\n <div>\r\n <h3 style={styles.settingsSectionHeading}>{t('pluginUpdate')}</h3>\r\n <p style={styles.settingsBody}>{t('pluginUpdateBody')}</p>\r\n </div>\r\n {updateStatus === undefined ? <p style={styles.notice}>{t('updateNotChecked')}</p> : (\r\n <div style={styles.diagnosticGrid}>\r\n <span style={styles.diagnosticLabel}>{t('installedVersion')}</span>\r\n <span style={styles.diagnosticValue}>{updateStatus.currentVersion}</span>\r\n <span style={styles.diagnosticLabel}>{t('installSource')}</span>\r\n <span style={styles.diagnosticValue}>{t(`updateSource_${updateStatus.source}`)}</span>\r\n <span style={styles.diagnosticLabel}>{t('updateStatus')}</span>\r\n <span style={styles.diagnosticValue}>{t(`updateState_${updateStatus.state}`)}</span>\r\n {updateStatus.latestVersion === undefined ? null : <>\r\n <span style={styles.diagnosticLabel}>{t('latestVersion')}</span>\r\n <span style={styles.diagnosticValue}>{updateStatus.latestVersion}</span>\r\n </>}\r\n </div>\r\n )}\r\n {updateStatus?.message === undefined ? null : <p style={styles.notice}>{updateStatus.message}</p>}\r\n {updateStatus?.restartRequired !== true ? null : <p style={styles.notice}>{t('restartRequired')}</p>}\r\n {updateError === undefined ? null : <p role=\"alert\" style={{ ...styles.notice, color: 'var(--dsw-alias-state-error-primary)' }}>{t('updateError')}: {updateError}</p>}\r\n <div style={styles.settingsActions}>\r\n <button type=\"button\" style={styles.button} onClick={() => { void requestUpdate('check') }} disabled={updateBusy !== undefined}>\r\n {updateBusy === 'check' ? t('checkingUpdates') : t('checkUpdates')}\r\n </button>\r\n <button type=\"button\" style={styles.primaryButton} onClick={() => { void requestUpdate('update') }} disabled={updateBusy !== undefined || updateStatus?.canUpdate !== true}>\r\n {updateBusy === 'update' ? t('updatingPlugin') : t('updatePlugin')}\r\n </button>\r\n </div>\r\n </section>\r\n\r\n <section style={styles.settingsCard}>\r\n <h3 style={styles.settingsSectionHeading}>{t('security')}</h3>\r\n <p style={styles.settingsBody}>{t('securityBody')}</p>\r\n </section>\r\n </div>\r\n )\r\n}\r\n","import { CLAUDE_REPOSITORY_ACTION_PATH } from '../constants.ts'\r\nimport type {\r\n RepositoryActionKind,\r\n RepositoryActionPreview,\r\n RepositoryActionRequest,\r\n RepositoryActionResult,\r\n} from '../repository-actions.ts'\r\nimport { PLUGIN_ACTION_TIMEOUT_MS, PLUGIN_READ_TIMEOUT_MS, pluginRequestSignal } from './plugin-request.ts'\r\n\r\ninterface ErrorBody {\r\n readonly error?: string\r\n readonly message?: string\r\n readonly commit?: string\r\n}\r\n\r\nexport class RepositoryActionClientError extends Error {\r\n readonly code?: string\r\n readonly commit?: string\r\n\r\n constructor(message: string, code?: string, commit?: string) {\r\n super(message)\r\n this.name = 'RepositoryActionClientError'\r\n if (code !== undefined) this.code = code\r\n if (commit !== undefined) this.commit = commit\r\n }\r\n}\r\n\r\nfunction record(value: unknown): Record<string, unknown> | undefined {\r\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\r\n}\r\n\r\nasync function response(pending: Promise<Response>): Promise<unknown> {\r\n const result = await pending\r\n const body = await result.json() as unknown\r\n if (!result.ok) {\r\n const error = record(body) as ErrorBody | undefined\r\n throw new RepositoryActionClientError(\r\n typeof error?.message === 'string' ? error.message : 'Repository action failed.',\r\n typeof error?.error === 'string' ? error.error : undefined,\r\n typeof error?.commit === 'string' ? error.commit : undefined,\r\n )\r\n }\r\n return body\r\n}\r\n\r\nfunction preview(value: unknown): RepositoryActionPreview {\r\n const input = record(value)\r\n if (input === undefined || typeof input.root !== 'string' || typeof input.branch !== 'string'\r\n || typeof input.head !== 'string' || typeof input.fingerprint !== 'string' || !Array.isArray(input.files)\r\n || typeof input.patch !== 'string' || typeof input.truncated !== 'boolean'\r\n || typeof input.hasStaged !== 'boolean' || typeof input.hasUnstaged !== 'boolean' || typeof input.hasUntracked !== 'boolean'\r\n || (input.upstream !== undefined && typeof input.upstream !== 'string')\r\n || !Array.isArray(input.unpushedCommits) || typeof input.unpushedTruncated !== 'boolean') {\r\n throw new Error('Invalid repository action preview.')\r\n }\r\n for (const file of input.files) {\r\n const item = record(file)\r\n if (item === undefined || typeof item.path !== 'string' || typeof item.staged !== 'boolean'\r\n || typeof item.unstaged !== 'boolean' || typeof item.untracked !== 'boolean') throw new Error('Invalid repository action file.')\r\n }\r\n for (const commit of input.unpushedCommits) {\r\n const item = record(commit)\r\n if (item === undefined || typeof item.hash !== 'string' || typeof item.subject !== 'string') throw new Error('Invalid repository action commit.')\r\n }\r\n return input as unknown as RepositoryActionPreview\r\n}\r\n\r\nfunction result(value: unknown): RepositoryActionResult {\r\n const input = record(value)\r\n if (input === undefined || typeof input.commit !== 'string' || typeof input.pushed !== 'boolean'\r\n || (input.pullRequestUrl !== undefined && typeof input.pullRequestUrl !== 'string')\r\n || (input.conflicts !== undefined && (!Array.isArray(input.conflicts) || input.conflicts.some(item => typeof item !== 'string')))) throw new Error('Invalid repository action result.')\r\n return input as unknown as RepositoryActionResult\r\n}\r\n\r\nfunction endpoint(path: string, sessionId: string): string {\r\n return `${CLAUDE_REPOSITORY_ACTION_PATH}${path}?sessionId=${encodeURIComponent(sessionId)}`\r\n}\r\n\r\nexport async function loadRepositoryActionPreview(sessionId: string, signal?: AbortSignal): Promise<RepositoryActionPreview> {\r\n return preview(await response(fetch(endpoint('/preview', sessionId), {\r\n method: 'GET',\r\n credentials: 'same-origin',\r\n headers: { accept: 'application/json' },\r\n signal: pluginRequestSignal(PLUGIN_READ_TIMEOUT_MS, signal),\r\n })))\r\n}\r\n\r\nexport async function generateCommitMessage(sessionId: string, fingerprint: string, signal?: AbortSignal): Promise<string> {\r\n const value = record(await response(fetch(endpoint('/message', sessionId), {\r\n method: 'POST',\r\n credentials: 'same-origin',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({ fingerprint }),\r\n signal: pluginRequestSignal(PLUGIN_ACTION_TIMEOUT_MS, signal),\r\n })))\r\n if (typeof value?.message !== 'string') throw new Error('Invalid generated commit message.')\r\n return value.message\r\n}\r\n\r\nexport function executeRepositoryAction(\r\n sessionId: string,\r\n request: RepositoryActionRequest & { readonly action: RepositoryActionKind },\r\n): Promise<RepositoryActionResult> {\r\n return response(fetch(endpoint('', sessionId), {\r\n method: 'POST',\r\n credentials: 'same-origin',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify(request),\r\n signal: pluginRequestSignal(PLUGIN_ACTION_TIMEOUT_MS),\r\n })).then(result)\r\n}\r\n","import { CLAUDE_REPOSITORY_FILE_PATH, CLAUDE_REPOSITORY_SETUP_PATH, CLAUDE_REPOSITORY_STATUS_PATH } from '../constants.ts'\r\nimport type { RepositoryBranchList, RepositoryCleanupResult, RepositorySetupResult, RepositorySetupStage } from '../repository-setup.ts'\r\nimport type { RepositoryStatus } from '../repository-status.ts'\r\nimport { PLUGIN_ACTION_TIMEOUT_MS, PLUGIN_READ_TIMEOUT_MS, pluginRequestSignal } from './plugin-request.ts'\r\n\r\ninterface ErrorBody {\r\n readonly message?: string\r\n readonly error?: string\r\n}\r\n\r\nexport type RepositoryPreparationStage = RepositorySetupStage\r\n | 'creating-workspace'\r\n | 'starting-session'\r\n | 'transferring-draft'\r\n | 'submitting'\r\n\r\nconst HOST_STAGES = new Set<RepositorySetupStage>([\r\n 'inspecting', 'fetching', 'creating-worktree', 'saving-worktree', 'switching-branch',\r\n])\r\n\r\nfunction record(value: unknown): Record<string, unknown> | undefined {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : undefined\r\n}\r\n\r\nfunction setupResult(value: unknown): RepositorySetupResult | undefined {\r\n const item = record(value)\r\n if (item === undefined || (item.mode !== 'checkout' && item.mode !== 'worktree')\r\n || typeof item.root !== 'string' || typeof item.path !== 'string' || typeof item.branch !== 'string'\r\n || (item.leaseId !== undefined && typeof item.leaseId !== 'string')) return undefined\r\n return item as unknown as RepositorySetupResult\r\n}\r\n\r\nexport function parseRepositorySetupEvent(\r\n line: string,\r\n onProgress: (stage: RepositoryPreparationStage) => void,\r\n): RepositorySetupResult | undefined {\r\n const event = record(JSON.parse(line) as unknown)\r\n if (event?.type === 'progress' && typeof event.stage === 'string' && HOST_STAGES.has(event.stage as RepositorySetupStage)) {\r\n onProgress(event.stage as RepositorySetupStage)\r\n return undefined\r\n }\r\n if (event?.type === 'complete') {\r\n const result = setupResult(event.result)\r\n if (result !== undefined) return result\r\n }\r\n if (event?.type === 'error' && typeof event.message === 'string') throw new Error(event.message)\r\n throw new Error('Invalid repository setup progress response.')\r\n}\r\n\r\nasync function response<T>(pending: Promise<Response>): Promise<T> {\r\n const result = await pending\r\n const body = await result.json() as T | ErrorBody\r\n if (!result.ok) {\r\n const error = body as ErrorBody\r\n throw new Error(error.message ?? error.error ?? 'Repository setup failed.')\r\n }\r\n return body as T\r\n}\r\n\r\n/** A wedged host must surface as an error; the hero has no other way out of its loading state. */\r\nexport const BRANCH_LOAD_TIMEOUT_MS = 15_000\r\n\r\nexport function loadRepositoryBranches(cwd: string, signal?: AbortSignal): Promise<RepositoryBranchList> {\r\n return response(fetch(`${CLAUDE_REPOSITORY_SETUP_PATH}/branches?cwd=${encodeURIComponent(cwd)}`, {\r\n method: 'GET',\r\n credentials: 'same-origin',\r\n headers: { accept: 'application/json' },\r\n signal: pluginRequestSignal(BRANCH_LOAD_TIMEOUT_MS, signal),\r\n }))\r\n}\r\n\r\n/** Pull remote refs down first, then list: a POST because `--prune` rewrites\r\n * this checkout's remote-tracking refs, and on the action deadline because the\r\n * host's own `git fetch` runs for up to a minute. */\r\nexport async function refreshRepositoryBranches(cwd: string, signal?: AbortSignal): Promise<RepositoryBranchList> {\r\n const result = await fetch(`${CLAUDE_REPOSITORY_SETUP_PATH}/branches/refresh`, {\r\n method: 'POST',\r\n credentials: 'same-origin',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n signal: pluginRequestSignal(PLUGIN_ACTION_TIMEOUT_MS, signal),\r\n body: JSON.stringify({ cwd }),\r\n })\r\n // A Host still running the previously loaded server bundle has no refresh\r\n // route at all; that is a stale process, not a repository that refused.\r\n if (result.status === 404) throw new Error('route-missing')\r\n return response<RepositoryBranchList>(Promise.resolve(result))\r\n}\r\n\r\nexport async function prepareRepository(\r\n cwd: string,\r\n branch: string,\r\n worktree: boolean,\r\n branchName?: string,\r\n onProgress: (stage: RepositoryPreparationStage) => void = () => {},\r\n): Promise<RepositorySetupResult> {\r\n const result = await fetch(CLAUDE_REPOSITORY_SETUP_PATH, {\r\n method: 'POST',\r\n credentials: 'same-origin',\r\n headers: { accept: 'application/x-ndjson', 'content-type': 'application/json' },\r\n body: JSON.stringify({ cwd, branch, worktree, ...(branchName === undefined ? {} : { branchName }) }),\r\n })\r\n if (!result.ok) {\r\n const body = await result.json() as ErrorBody\r\n throw new Error(body.message ?? body.error ?? 'Repository setup failed.')\r\n }\r\n if (result.body === null) throw new Error('Repository setup progress stream is unavailable.')\r\n const reader = result.body.getReader()\r\n const decoder = new TextDecoder()\r\n let buffer = ''\r\n let completed: RepositorySetupResult | undefined\r\n while (true) {\r\n const chunk = await reader.read()\r\n buffer += decoder.decode(chunk.value, { stream: !chunk.done })\r\n const lines = buffer.split('\\n')\r\n buffer = lines.pop() ?? ''\r\n for (const line of lines) {\r\n if (line.trim().length === 0) continue\r\n const value = parseRepositorySetupEvent(line, onProgress)\r\n if (value !== undefined) completed = value\r\n }\r\n if (chunk.done) break\r\n }\r\n if (buffer.trim().length > 0) {\r\n const value = parseRepositorySetupEvent(buffer, onProgress)\r\n if (value !== undefined) completed = value\r\n }\r\n if (completed === undefined) throw new Error('Repository setup progress ended before completion.')\r\n return completed\r\n}\r\n\r\n/** Bookkeeping, not a gate: a wedged host must fail this instead of hanging on\r\n * a connection the rest of the flow is waiting behind. */\r\nexport const LEASE_BIND_TIMEOUT_MS = 10_000\r\n\r\nexport async function bindRepositoryLease(leaseId: string, sessionId: string): Promise<void> {\r\n await response(fetch(`${CLAUDE_REPOSITORY_SETUP_PATH}/bind`, {\r\n method: 'POST',\r\n credentials: 'same-origin',\r\n signal: pluginRequestSignal(LEASE_BIND_TIMEOUT_MS),\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({ leaseId, sessionId }),\r\n }))\r\n}\r\n\r\nexport async function cleanupMergedRepository(path: string, baseBranch: string): Promise<RepositoryCleanupResult> {\r\n const body = await response<Record<string, unknown>>(fetch(`${CLAUDE_REPOSITORY_SETUP_PATH}/cleanup`, {\r\n signal: pluginRequestSignal(PLUGIN_ACTION_TIMEOUT_MS),\r\n method: 'POST',\r\n credentials: 'same-origin',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({ path, baseBranch }),\r\n }))\r\n if ((body.mode !== 'worktree' && body.mode !== 'checkout') || typeof body.root !== 'string' || typeof body.branch !== 'string') {\r\n throw new Error('Invalid repository cleanup response.')\r\n }\r\n return body as unknown as RepositoryCleanupResult\r\n}\r\n\r\n/** Lines [from, to] of a working-tree file plus its total line count, for expanding unmodified diff context. */\r\nexport async function loadRepositoryFileLines(cwd: string, path: string, from: number, to: number, signal?: AbortSignal): Promise<{ lines: readonly string[]; total: number }> {\r\n const query = `cwd=${encodeURIComponent(cwd)}&path=${encodeURIComponent(path)}&from=${from}&to=${to}`\r\n const body = await response<Record<string, unknown>>(fetch(`${CLAUDE_REPOSITORY_FILE_PATH}?${query}`, {\r\n signal: pluginRequestSignal(PLUGIN_READ_TIMEOUT_MS),\r\n method: 'GET',\r\n credentials: 'same-origin',\r\n headers: { accept: 'application/json' },\r\n ...(signal === undefined ? {} : { signal }),\r\n }))\r\n if (!Array.isArray(body.lines) || typeof body.total !== 'number') throw new Error('Invalid repository file response.')\r\n return { lines: body.lines.map(String), total: body.total }\r\n}\r\n\r\nexport async function loadRepositoryStatusFor(cwd: string, signal?: AbortSignal): Promise<RepositoryStatus> {\r\n const body = await response<Record<string, unknown>>(fetch(`${CLAUDE_REPOSITORY_STATUS_PATH}?cwd=${encodeURIComponent(cwd)}`, {\r\n signal: pluginRequestSignal(PLUGIN_READ_TIMEOUT_MS),\r\n method: 'GET',\r\n credentials: 'same-origin',\r\n headers: { accept: 'application/json' },\r\n ...(signal === undefined ? {} : { signal }),\r\n }))\r\n if (typeof body.status !== 'string' || typeof body.cwd !== 'string') throw new Error('Invalid repository status response.')\r\n return body as unknown as RepositoryStatus\r\n}\r\n","/** Only GitHub's own image hosts; the browser loads these directly, so a URL\r\n * the API did not vouch for must never become an outbound request. */\r\nexport function githubAvatarUrl(value: unknown): string | undefined {\r\n if (typeof value !== 'string' || value.length === 0 || value.length > 1_024) return undefined\r\n try {\r\n const url = new URL(value)\r\n const allowed = url.hostname === 'github.com' || url.hostname === 'githubusercontent.com' || url.hostname.endsWith('.githubusercontent.com')\r\n return url.protocol === 'https:' && allowed ? url.href : undefined\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n","import { CLAUDE_REPOSITORY_FEEDBACK_PATH } from '../constants.ts'\r\nimport { githubAvatarUrl } from '../github-url.ts'\r\nimport type { FailingCheck, PullRequestReviewComment } from '../pr-feedback.ts'\r\nimport { PLUGIN_READ_TIMEOUT_MS, pluginRequestSignal } from './plugin-request.ts'\r\n\r\nexport type { FailingCheck, PullRequestReviewComment } from '../pr-feedback.ts'\r\n\r\nfunction record(value: unknown): Record<string, unknown> | undefined {\r\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\r\n}\r\n\r\nasync function loadJson(path: string, sessionId: string, pullNumber: number, signal?: AbortSignal): Promise<Record<string, unknown>> {\r\n const response = await fetch(`${CLAUDE_REPOSITORY_FEEDBACK_PATH}${path}?sessionId=${encodeURIComponent(sessionId)}&number=${pullNumber}`, {\r\n method: 'GET',\r\n credentials: 'same-origin',\r\n headers: { accept: 'application/json' },\r\n signal: pluginRequestSignal(PLUGIN_READ_TIMEOUT_MS, signal),\r\n })\r\n const body = record(await response.json() as unknown)\r\n if (!response.ok) {\r\n throw new Error(typeof body?.message === 'string' ? body.message : 'Pull request feedback is unavailable.')\r\n }\r\n if (body === undefined) throw new Error('Invalid pull request feedback response.')\r\n return body\r\n}\r\n\r\nexport async function loadPullRequestComments(sessionId: string, pullNumber: number, signal?: AbortSignal): Promise<readonly PullRequestReviewComment[]> {\r\n const body = await loadJson('/comments', sessionId, pullNumber, signal)\r\n if (!Array.isArray(body.comments)) throw new Error('Invalid pull request comments response.')\r\n const comments: PullRequestReviewComment[] = []\r\n for (const item of body.comments) {\r\n const input = record(item)\r\n if (input === undefined || typeof input.id !== 'number' || typeof input.path !== 'string'\r\n || typeof input.author !== 'string' || typeof input.body !== 'string' || typeof input.url !== 'string'\r\n || (input.avatarUrl !== undefined && githubAvatarUrl(input.avatarUrl) === undefined)\r\n || (input.side !== 'new' && input.side !== 'old')\r\n || (input.line !== undefined && typeof input.line !== 'number')) continue\r\n comments.push(input as unknown as PullRequestReviewComment)\r\n }\r\n return comments\r\n}\r\n\r\nexport async function loadFailingChecks(sessionId: string, pullNumber: number, signal?: AbortSignal): Promise<readonly FailingCheck[]> {\r\n const body = await loadJson('/checks', sessionId, pullNumber, signal)\r\n if (!Array.isArray(body.checks)) throw new Error('Invalid pull request checks response.')\r\n const checks: FailingCheck[] = []\r\n for (const item of body.checks) {\r\n const input = record(item)\r\n if (input === undefined || typeof input.name !== 'string'\r\n || (input.link !== undefined && typeof input.link !== 'string')\r\n || (input.description !== undefined && typeof input.description !== 'string')\r\n || (input.log !== undefined && typeof input.log !== 'string')) continue\r\n checks.push(input as unknown as FailingCheck)\r\n }\r\n return checks\r\n}\r\n\r\n/** Draft handed to Claude when the user forwards GitHub review comments. */\r\nexport function composeCommentsPrompt(comments: readonly PullRequestReviewComment[]): string {\r\n const lines = comments.map(comment => `- ${comment.path}${comment.line === undefined ? '' : `:${comment.line}`} (@${comment.author}): ${comment.body.replaceAll('\\n', '\\n ')}`)\r\n return `Please address the following GitHub pull request review comments. Make the requested changes, or explain briefly when a comment should not be applied.\\n\\n${lines.join('\\n')}`\r\n}\r\n\r\n/** Draft handed to Claude when the user forwards failing CI checks. */\r\nexport function composeChecksPrompt(checks: readonly FailingCheck[]): string {\r\n const sections = checks.map(check => {\r\n const heading = `## ${check.name}${check.link === undefined ? '' : ` (${check.link})`}`\r\n const description = check.description === undefined ? '' : `\\n${check.description}`\r\n const log = check.log === undefined ? '' : `\\n\\n\\`\\`\\`\\n${check.log}\\n\\`\\`\\``\r\n return `${heading}${description}${log}`\r\n })\r\n return `The following CI checks are failing on the current pull request. Investigate the failure logs, fix the underlying problems, and re-run the relevant commands locally when possible.\\n\\n${sections.join('\\n\\n')}`\r\n}\r\n\r\n/** Draft handed to Claude after an update-branch merge left conflicts behind. */\r\nexport function composeConflictsPrompt(baseBranch: string, conflicts: readonly string[], method: 'merge' | 'rebase' = 'merge'): string {\r\n const list = conflicts.map(file => `- ${file}`).join('\\n')\r\n if (method === 'rebase') {\r\n return `Rebasing the current branch onto origin/${baseBranch} stopped on conflicts in the files below. Resolve each conflict preserving the intent of both sides, stage the files, run \\`git rebase --continue\\` until the rebase finishes, then push with \\`git push --force-with-lease\\`.\\n\\n${list}`\r\n }\r\n return `Merging origin/${baseBranch} into the current branch left merge conflicts in the files below. Resolve each conflict preserving the intent of both sides, then commit the merge.\\n\\n${list}`\r\n}\r\n","import { composeChecksPrompt, composeCommentsPrompt, type FailingCheck, type PullRequestReviewComment } from './pr-feedback-api.ts'\r\n\r\nexport const AUTO_FIX_INTERVAL_MS = 30_000\r\nexport const AUTO_FIX_FOOTER = 'This request was generated automatically by the pull request watcher. After making the changes, commit and push to the pull request branch so the checks re-run.'\r\n\r\n/** What the watcher has already handed to Claude for one session. */\r\nexport interface AutoFixMemory {\r\n readonly handledCommentIds: ReadonlySet<number>\r\n readonly handledChecksSignature?: string\r\n}\r\n\r\ninterface AutoFixSession {\r\n enabled: boolean\r\n memory: AutoFixMemory\r\n}\r\n\r\nconst EMPTY_MEMORY: AutoFixMemory = { handledCommentIds: new Set() }\r\n// ponytail: module-level map so the toggle survives session switches within\r\n// one page; the watcher itself only ticks while the status bar is mounted.\r\nconst sessions = new Map<string, AutoFixSession>()\r\n\r\nfunction session(sessionId: string): AutoFixSession {\r\n let entry = sessions.get(sessionId)\r\n if (entry === undefined) {\r\n entry = { enabled: false, memory: EMPTY_MEMORY }\r\n sessions.set(sessionId, entry)\r\n }\r\n return entry\r\n}\r\n\r\nexport function autoFixEnabled(sessionId: string): boolean {\r\n return session(sessionId).enabled\r\n}\r\n\r\nexport function setAutoFixEnabled(sessionId: string, enabled: boolean): void {\r\n session(sessionId).enabled = enabled\r\n}\r\n\r\nexport function autoFixMemory(sessionId: string): AutoFixMemory {\r\n return session(sessionId).memory\r\n}\r\n\r\nexport function rememberAutoFix(sessionId: string, memory: AutoFixMemory): void {\r\n session(sessionId).memory = memory\r\n}\r\n\r\n/** One failing CI run yields one fix attempt: run links change when CI re-runs. */\r\nexport function checksSignature(checks: readonly FailingCheck[]): string | undefined {\r\n if (checks.length === 0) return undefined\r\n return checks.map(check => `${check.name}|${check.link ?? ''}`).sort().join('\\n')\r\n}\r\n\r\nexport function planAutoFix(\r\n memory: AutoFixMemory,\r\n comments: readonly PullRequestReviewComment[],\r\n checks: readonly FailingCheck[],\r\n): { prompt?: string; memory: AutoFixMemory } {\r\n const fresh = comments.filter(comment => !memory.handledCommentIds.has(comment.id))\r\n const signature = checksSignature(checks)\r\n const checksChanged = signature !== undefined && signature !== memory.handledChecksSignature\r\n const sections: string[] = []\r\n if (fresh.length > 0) sections.push(composeCommentsPrompt(fresh))\r\n if (checksChanged) sections.push(composeChecksPrompt(checks))\r\n if (sections.length === 0) return { memory }\r\n const nextSignature = checksChanged ? signature : memory.handledChecksSignature\r\n return {\r\n prompt: `${sections.join('\\n\\n')}\\n\\n${AUTO_FIX_FOOTER}`,\r\n memory: {\r\n handledCommentIds: new Set([...memory.handledCommentIds, ...fresh.map(comment => comment.id)]),\r\n ...(nextSignature === undefined ? {} : { handledChecksSignature: nextSignature }),\r\n },\r\n }\r\n}\r\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\r\nimport { IconChevronDownOutline14, Menu, Modal, Tooltip, type MenuEntry } from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type { RepositoryMergeMethod } from '../repository-actions.ts'\r\nimport type { RepositoryStatus } from '../repository-status.ts'\r\nimport { executeRepositoryAction, loadRepositoryActionPreview } from './repository-action-api.ts'\r\nimport { cleanupMergedRepository } from './repository-setup-api.ts'\r\nimport { composeChecksPrompt, composeConflictsPrompt, loadFailingChecks, loadPullRequestComments, type FailingCheck, type PullRequestReviewComment } from './pr-feedback-api.ts'\r\nimport { AUTO_FIX_INTERVAL_MS, autoFixEnabled, autoFixMemory, planAutoFix, rememberAutoFix, setAutoFixEnabled } from './auto-fix.ts'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\nimport type { ClaudeClientProjection } from './projection.ts'\r\nimport * as styles from './styles.ts'\r\n\r\nexport interface ClaudeRepositoryStatusInjected {\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n openDiff: () => void\r\n /** Submit the composer, seeding the given draft text when it is empty. */\r\n submitPrompt?: (draft: string, mode?: 'append' | 'idle') => boolean\r\n /** Open the cross-session pull request overview panel. */\r\n openOverview?: () => void\r\n /** Delete the DSH workspace owning this session (after its worktree is gone). */\r\n deleteWorkspace?: () => Promise<void>\r\n}\r\n\r\nexport interface ClaudeRepositoryStatusProps extends ClaudeRepositoryStatusInjected {\r\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\r\n useSessions: SnapshotSelectorHook<{ readonly byId: Readonly<Record<string, { readonly blank: boolean; readonly running?: boolean } | undefined>> }>\r\n sessionId: string\r\n}\r\n\r\nexport function repositorySummary(repository: RepositoryStatus, t: ClaudeRepositoryStatusInjected['t']): readonly string[] {\r\n if (repository.status === 'not-repository') return [t('repositoryNotGit')]\r\n if (repository.status === 'unavailable') return [t('repositoryUnavailable')]\r\n const pullRequest = repository.pullRequest\r\n return [\r\n repository.detached === true ? t('repositoryDetached') : repository.branch ?? t('repositoryUnknownBranch'),\r\n ...(repository.worktree === true ? [t('repositoryWorktree')] : []),\r\n repository.dirty === true ? t('repositoryModified') : t('repositoryClean'),\r\n ...(pullRequest === undefined\r\n ? [t('repositoryNoPr')]\r\n : pullRequest.state === 'merged'\r\n ? [\r\n t('repositoryPr', { number: pullRequest.number }),\r\n t('repositoryState_merged'),\r\n ]\r\n : [\r\n pullRequest.draft ? t('repositoryPrDraft', { number: pullRequest.number }) : t('repositoryPr', { number: pullRequest.number }),\r\n t(`repositoryChecks_${pullRequest.checks}` as ClaudeCodeSettingsKey),\r\n t(`repositoryReview_${pullRequest.review}` as ClaudeCodeSettingsKey),\r\n ]),\r\n ]\r\n}\r\n\r\n/** Icon-only status: the tone carries the state, the full label lives in the tooltip and accessible name. */\r\nfunction StatusGlyph({ label, tone, children }: { label: string; tone: 'neutral' | 'success' | 'warning' | 'error'; children: ReactNode }) {\r\n const toneStyle = tone === 'success'\r\n ? styles.repositoryItemSuccess\r\n : tone === 'warning' ? styles.repositoryItemWarning : tone === 'error' ? styles.repositoryItemError : {}\r\n return (\r\n <Tooltip label={label} side=\"top\" delayMs={250}>\r\n <span role=\"img\" aria-label={label} style={{ ...styles.repositoryGlyph, ...toneStyle }}>{children}</span>\r\n </Tooltip>\r\n )\r\n}\r\n\r\nfunction ChecksGlyph({ state }: { state: 'passing' | 'pending' | 'failing' }) {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <circle cx=\"7\" cy=\"7\" r=\"5.5\" />\r\n {state === 'passing' ? <path d=\"M4.5 7.2l1.8 1.8 3.2-3.6\" />\r\n : state === 'failing' ? <path d=\"M5 5l4 4M9 5l-4 4\" />\r\n : <path d=\"M4.6 7h.01M7 7h.01M9.4 7h.01\" strokeWidth=\"2\" />}\r\n </svg>\r\n )\r\n}\r\n\r\nfunction ReviewGlyph() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M1.5 7s2-3.5 5.5-3.5S12.5 7 12.5 7s-2 3.5-5.5 3.5S1.5 7 1.5 7Z\" />\r\n <circle cx=\"7\" cy=\"7\" r=\"1.8\" />\r\n </svg>\r\n )\r\n}\r\n\r\nfunction PullRequestIcon({ size = 16, merged = false }: { size?: number; merged?: boolean }) {\r\n if (merged) {\r\n return (\r\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <circle cx=\"4\" cy=\"3\" r=\"1.6\" />\r\n <circle cx=\"4\" cy=\"13\" r=\"1.6\" />\r\n <circle cx=\"12\" cy=\"8\" r=\"1.6\" />\r\n <path d=\"M4 4.6v6.8\" />\r\n <path d=\"M5.6 3H7a5 5 0 0 1 5 3.4\" />\r\n </svg>\r\n )\r\n }\r\n return (\r\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <circle cx=\"4\" cy=\"3\" r=\"1.6\" />\r\n <circle cx=\"4\" cy=\"13\" r=\"1.6\" />\r\n <circle cx=\"12\" cy=\"13\" r=\"1.6\" />\r\n <path d=\"M4 4.6v6.8\" />\r\n <path d=\"M7.5 3H9a3 3 0 0 1 3 3v5.4\" />\r\n </svg>\r\n )\r\n}\r\n\r\nfunction repositoryName(remote: string | undefined): string | undefined {\r\n return remote?.split('/').at(-1)\r\n}\r\n\r\nfunction relativeAge(value: string | undefined): string | undefined {\r\n if (value === undefined) return undefined\r\n const elapsedHours = Math.max(0, Math.floor((Date.now() - Date.parse(value)) / 3_600_000))\r\n if (!Number.isFinite(elapsedHours)) return undefined\r\n if (elapsedHours < 1) return '<1h'\r\n if (elapsedHours < 24) return `${elapsedHours}h`\r\n const days = Math.floor(elapsedHours / 24)\r\n return days < 30 ? `${days}d` : `${Math.floor(days / 30)}mo`\r\n}\r\n\r\nexport function PullRequestHoverCard({ repository, t }: { repository: RepositoryStatus; t: ClaudeRepositoryStatusInjected['t'] }) {\r\n const pullRequest = repository.pullRequest\r\n if (pullRequest === undefined) return null\r\n const merged = pullRequest.state === 'merged'\r\n const age = relativeAge(merged ? pullRequest.mergedAt : pullRequest.createdAt)\r\n return (\r\n <span role=\"tooltip\" style={styles.repositoryPrHoverCard}>\r\n <span style={styles.repositoryPrHoverTop}>\r\n <span style={{ ...styles.repositoryPrStateBadge, ...(merged ? styles.repositoryPrStateBadgeMerged : {}) }}><PullRequestIcon size={13} merged={merged} />{t(`repositoryState_${pullRequest.state}` as ClaudeCodeSettingsKey)}</span>\r\n <span style={styles.repositoryPrHoverRepo}>{repositoryName(repository.remote)} #{pullRequest.number}{pullRequest.baseBranch === undefined ? '' : ` → ${pullRequest.baseBranch}`}</span>\r\n {age === undefined ? null : <span style={styles.repositoryPrHoverAge}>{age}</span>}\r\n </span>\r\n <a href={pullRequest.url} target=\"_blank\" rel=\"noopener noreferrer\" style={styles.repositoryPrHoverTitle}>{pullRequest.title}</a>\r\n <span style={styles.repositoryPrHoverBottom}>\r\n {pullRequest.author === undefined ? <span /> : <span style={styles.repositoryPrAuthor}><span style={styles.repositoryPrAvatar}>{pullRequest.author.slice(0, 1).toUpperCase()}</span>{pullRequest.author}</span>}\r\n <span style={styles.repositoryPrHoverStats}>\r\n <span><span style={styles.diffAdd}>+{repository.diff?.additions ?? 0}</span> <span style={styles.diffDelete}>−{repository.diff?.deletions ?? 0}</span></span>\r\n <span style={styles.repositoryPrFiles}>{t('diffFilesShort', { count: repository.diff?.files ?? 0 })}</span>\r\n </span>\r\n </span>\r\n </span>\r\n )\r\n}\r\n\r\nfunction PullRequestLink({ repository, t }: { repository: RepositoryStatus; t: ClaudeRepositoryStatusInjected['t'] }) {\r\n const [hovered, setHovered] = useState(false)\r\n const closeTimer = useRef<ReturnType<typeof setTimeout>>()\r\n const pullRequest = repository.pullRequest\r\n const open = (): void => {\r\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\r\n closeTimer.current = undefined\r\n setHovered(true)\r\n }\r\n const scheduleClose = (): void => {\r\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\r\n closeTimer.current = setTimeout(() => {\r\n closeTimer.current = undefined\r\n setHovered(false)\r\n }, 350)\r\n }\r\n useEffect(() => () => {\r\n if (closeTimer.current !== undefined) clearTimeout(closeTimer.current)\r\n }, [])\r\n if (pullRequest === undefined) return null\r\n return (\r\n <span\r\n style={styles.repositoryPrLinkFrame}\r\n onMouseEnter={open}\r\n onMouseLeave={scheduleClose}\r\n onFocus={open}\r\n onBlur={event => {\r\n if (!event.currentTarget.contains(event.relatedTarget)) scheduleClose()\r\n }}\r\n >\r\n {hovered ? <span onMouseEnter={open} onMouseLeave={scheduleClose}><PullRequestHoverCard repository={repository} t={t} /></span> : null}\r\n <a\r\n href={pullRequest.url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n style={{ ...styles.repositoryPrLink, ...(pullRequest.state === 'merged' ? styles.repositoryPrLinkMerged : {}) }}\r\n aria-label={t('repositoryOpenPr', { number: pullRequest.number })}\r\n >#{pullRequest.number}</a>\r\n </span>\r\n )\r\n}\r\n\r\n/** Watches an open pull request and hands new review comments and failing\r\n * CI runs to Claude automatically until the user switches it off. */\r\nexport function AutoFixControl({ sessionId, repository, running, t, submitPrompt }: {\r\n sessionId: string\r\n repository: RepositoryStatus\r\n /** Whether a turn is in flight; the watcher only submits into an idle session. */\r\n running: boolean\r\n t: ClaudeRepositoryStatusInjected['t']\r\n submitPrompt?: (draft: string, mode?: 'append' | 'idle') => boolean\r\n}) {\r\n const pullRequest = repository.pullRequest\r\n const open = pullRequest?.state === 'open'\r\n const number = pullRequest?.number\r\n const checks = pullRequest?.checks\r\n const [enabled, setEnabled] = useState(() => autoFixEnabled(sessionId))\r\n const [focused, setFocused] = useState(false)\r\n useEffect(() => { setEnabled(autoFixEnabled(sessionId)) }, [sessionId])\r\n // Submitting while a turn runs would queue or steer (interrupt) it depending\r\n // on the user's Enter-while-busy setting, so wait for idle instead; the\r\n // running flip re-arms the effect and polls immediately when the turn ends.\r\n useEffect(() => {\r\n if (!enabled || !open || running || number === undefined || submitPrompt === undefined) return\r\n let cancelled = false\r\n const tick = async (): Promise<void> => {\r\n const [comments, failing] = await Promise.all([\r\n loadPullRequestComments(sessionId, number).catch((): readonly PullRequestReviewComment[] => []),\r\n checks === 'failing' ? loadFailingChecks(sessionId, number).catch((): readonly FailingCheck[] => []) : Promise.resolve<readonly FailingCheck[]>([]),\r\n ])\r\n if (cancelled) return\r\n const plan = planAutoFix(autoFixMemory(sessionId), comments, failing)\r\n // A non-empty user draft defers this round instead of clobbering it.\r\n if (plan.prompt !== undefined && submitPrompt(plan.prompt, 'idle')) rememberAutoFix(sessionId, plan.memory)\r\n }\r\n void tick()\r\n const timer = setInterval(() => { void tick() }, AUTO_FIX_INTERVAL_MS)\r\n return () => {\r\n cancelled = true\r\n clearInterval(timer)\r\n }\r\n }, [checks, enabled, number, open, running, sessionId, submitPrompt])\r\n if (!open || submitPrompt === undefined) return null\r\n const toggle = (): void => {\r\n const next = !enabled\r\n setEnabled(next)\r\n setAutoFixEnabled(sessionId, next)\r\n }\r\n return (\r\n <Tooltip label={`${t('autoFixLabel')} · ${t('autoFixTitle')}`} side=\"top\" delayMs={250} maxWidth={320}>\r\n <button\r\n type=\"button\"\r\n role=\"switch\"\r\n aria-checked={enabled}\r\n aria-label={t('autoFixLabel')}\r\n style={{\r\n ...styles.repositoryAutoFix,\r\n ...(enabled ? styles.repositoryAutoFixActive : {}),\r\n ...(focused ? styles.heroWorktreeToggleFocused : {}),\r\n }}\r\n onFocus={() => { setFocused(true) }}\r\n onBlur={() => { setFocused(false) }}\r\n onClick={event => {\r\n toggle()\r\n // Mouse toggles should not leave a focus ring behind.\r\n event.currentTarget.blur()\r\n }}\r\n >\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M13.3 6.5A5.5 5.5 0 0 0 3.6 4.6M2.7 9.5a5.5 5.5 0 0 0 9.7 1.9\" />\r\n <path d=\"M13.5 2.8v3.7H9.8M2.5 13.2V9.5h3.7\" />\r\n </svg>\r\n </button>\r\n </Tooltip>\r\n )\r\n}\r\n\r\nexport function FailingChecksControl({ sessionId, pullNumber, t, submitPrompt }: {\r\n sessionId: string\r\n pullNumber: number\r\n t: ClaudeRepositoryStatusInjected['t']\r\n submitPrompt?: (draft: string, mode?: 'append' | 'idle') => boolean\r\n}) {\r\n const [open, setOpen] = useState(false)\r\n const [loading, setLoading] = useState(false)\r\n const [checks, setChecks] = useState<readonly FailingCheck[]>([])\r\n const [error, setError] = useState<string>()\r\n const frameRef = useRef<HTMLSpanElement>(null)\r\n const controller = useRef<AbortController>()\r\n useEffect(() => () => controller.current?.abort(), [])\r\n useEffect(() => {\r\n if (!open) return\r\n const closeOnOutsidePointer = (event: PointerEvent): void => {\r\n if (event.target instanceof Node && frameRef.current?.contains(event.target) !== true) setOpen(false)\r\n }\r\n document.addEventListener('pointerdown', closeOnOutsidePointer)\r\n return () => { document.removeEventListener('pointerdown', closeOnOutsidePointer) }\r\n }, [open])\r\n const toggle = (): void => {\r\n const next = !open\r\n setOpen(next)\r\n if (!next) return\r\n controller.current?.abort()\r\n const aborter = new AbortController()\r\n controller.current = aborter\r\n setLoading(true)\r\n setError(undefined)\r\n void loadFailingChecks(sessionId, pullNumber, aborter.signal).then(value => {\r\n setChecks(value)\r\n setLoading(false)\r\n }, (reason: unknown) => {\r\n if (aborter.signal.aborted) return\r\n setError(reason instanceof Error ? reason.message : t('diffActionFailed'))\r\n setLoading(false)\r\n })\r\n }\r\n return (\r\n <span ref={frameRef} style={styles.repositoryChecksFrame}>\r\n <button type=\"button\" style={styles.repositoryChecksTrigger} aria-haspopup=\"dialog\" aria-expanded={open} aria-label={t('repositoryChecksOpen')} onClick={toggle}>\r\n <StatusGlyph label={t('repositoryChecks_failing')} tone=\"error\"><ChecksGlyph state=\"failing\" /></StatusGlyph>\r\n </button>\r\n {open ? (\r\n <span role=\"dialog\" aria-label={t('checksCardTitle')} style={styles.repositoryChecksCard}>\r\n <strong style={styles.repositoryChecksTitle}>{t('checksCardTitle')}</strong>\r\n {loading ? <span style={styles.repositoryChecksHint}>{t('checksCardLoading')}</span> : null}\r\n {error === undefined ? null : <span role=\"alert\" style={styles.repositoryChecksError}>{error}</span>}\r\n {checks.map(check => (\r\n <span key={check.name} style={styles.repositoryChecksItem}>\r\n {check.link === undefined\r\n ? <span style={styles.repositoryChecksName}>{check.name}</span>\r\n : <a href={check.link} target=\"_blank\" rel=\"noopener noreferrer\" style={styles.repositoryChecksName}>{check.name}</a>}\r\n {check.description === undefined ? null : <span style={styles.repositoryChecksDesc}>{check.description}</span>}\r\n </span>\r\n ))}\r\n {!loading && error === undefined && checks.length === 0 ? <span style={styles.repositoryChecksHint}>{t('checksCardEmpty')}</span> : null}\r\n {submitPrompt !== undefined && checks.length > 0 ? (\r\n <button type=\"button\" style={styles.repositoryChecksFix} onClick={() => { submitPrompt(composeChecksPrompt(checks)); setOpen(false) }}>{t('checksCardFix')}</button>\r\n ) : null}\r\n </span>\r\n ) : null}\r\n </span>\r\n )\r\n}\r\n\r\ninterface UpdateDialogState {\r\n readonly loading: boolean\r\n readonly submitting: boolean\r\n readonly fingerprint?: string\r\n readonly error?: string\r\n readonly pushed?: string\r\n readonly conflicts?: readonly string[]\r\n}\r\n\r\nexport function UpdateBranchControl({ sessionId, repository, t, submitPrompt }: {\r\n sessionId: string\r\n repository: RepositoryStatus\r\n t: ClaudeRepositoryStatusInjected['t']\r\n submitPrompt?: (draft: string, mode?: 'append' | 'idle') => boolean\r\n}) {\r\n const [dialog, setDialog] = useState<UpdateDialogState>()\r\n const [method, setMethod] = useState<'merge' | 'rebase'>('rebase')\r\n const controller = useRef<AbortController>()\r\n const pullRequest = repository.pullRequest\r\n const base = pullRequest?.baseBranch\r\n const behind = repository.baseBehind ?? 0\r\n useEffect(() => () => controller.current?.abort(), [])\r\n useEffect(() => {\r\n if (dialog?.pushed === undefined || dialog.error !== undefined) return\r\n const timer = setTimeout(() => setDialog(undefined), 1_200)\r\n return () => clearTimeout(timer)\r\n }, [dialog?.error, dialog?.pushed])\r\n if (pullRequest === undefined || pullRequest.state !== 'open' || base === undefined\r\n || repository.detached === true || repository.dirty === true || behind <= 0) return null\r\n const openDialog = (): void => {\r\n controller.current?.abort()\r\n setDialog({ loading: true, submitting: false })\r\n const aborter = new AbortController()\r\n controller.current = aborter\r\n void loadRepositoryActionPreview(sessionId, aborter.signal).then(preview => {\r\n setDialog({ loading: false, submitting: false, fingerprint: preview.fingerprint })\r\n }, (reason: unknown) => {\r\n if (!aborter.signal.aborted) setDialog({ loading: false, submitting: false, error: reason instanceof Error ? reason.message : t('diffActionFailed') })\r\n })\r\n }\r\n const closeDialog = (): void => {\r\n if (dialog?.submitting === true) return\r\n controller.current?.abort()\r\n controller.current = undefined\r\n setDialog(undefined)\r\n }\r\n const confirmUpdate = (): void => {\r\n if (dialog?.fingerprint === undefined || dialog.submitting) return\r\n const { error: _error, ...pending } = dialog\r\n setDialog({ ...pending, submitting: true })\r\n void executeRepositoryAction(sessionId, {\r\n action: 'update-branch',\r\n fingerprint: dialog.fingerprint,\r\n message: '',\r\n includeUnstaged: false,\r\n baseBranch: base,\r\n mergeMethod: method,\r\n }).then(result => {\r\n setDialog({\r\n ...pending,\r\n submitting: false,\r\n ...(result.conflicts !== undefined && result.conflicts.length > 0 ? { conflicts: result.conflicts } : { pushed: result.commit }),\r\n })\r\n }, (reason: unknown) => {\r\n setDialog({ ...pending, submitting: false, error: reason instanceof Error ? reason.message : t('diffActionFailed') })\r\n })\r\n }\r\n const settled = dialog?.pushed !== undefined || dialog?.conflicts !== undefined\r\n return (\r\n <>\r\n <button type=\"button\" style={styles.repositoryUpdateTrigger} aria-label={t('repositoryUpdateBranch')} title={`${t('diffUpdateBranchBehind', { base, count: behind })} · ${t('repositoryUpdateBranch')}`} onClick={openDialog}>↓{behind}</button>\r\n {dialog === undefined ? null : <style data-dsh-claude-repository-modal-styles>{styles.diffModalCss}</style>}\r\n <Modal className=\"dshClaudeRepositoryActionModal\" contentClassName=\"dshClaudeRepositoryActionModalContent\" open={dialog !== undefined} onClose={closeDialog} title={t('repositoryUpdateBranch')} closeLabel={t('diffCancel')} description={t('diffUpdateBranchDescription', { base })} footer={\r\n <div style={styles.diffModalFooter}>\r\n <button type=\"button\" style={{ ...styles.button, ...styles.diffModalButton }} disabled={dialog?.submitting === true} onClick={closeDialog}>{settled ? t('diffDone') : t('diffCancel')}</button>\r\n {!settled ? <button type=\"button\" style={{ ...styles.primaryButton, ...styles.diffModalButton }} disabled={dialog?.loading === true || dialog?.submitting === true || dialog?.fingerprint === undefined} onClick={confirmUpdate}>{dialog?.submitting === true ? t('diffSubmitting') : t('diffConfirm')}</button> : null}\r\n </div>\r\n }>\r\n {dialog === undefined ? null : <div style={styles.diffModalBody}>\r\n <div style={styles.diffModalMeta}>\r\n <strong style={styles.diffModalMetaText} title={pullRequest.title}>{repository.branch ?? t('repositoryUnknownBranch')} ← origin/{base}</strong>\r\n <span style={styles.diffModalFileState}>{t('diffUpdateBranchBehind', { base, count: behind })}</span>\r\n </div>\r\n {(['rebase', 'merge'] as const).map(option => (\r\n <label key={option} style={styles.diffModalCheckbox}>\r\n <input type=\"radio\" name=\"dsh-claude-update-branch-method\" value={option} checked={method === option} disabled={settled || dialog.submitting} onChange={() => setMethod(option)} />\r\n {t(`diffUpdateBranch_${option}`, { base })}\r\n </label>\r\n ))}\r\n {dialog.pushed === undefined ? null : <p style={styles.diffModalSuccess}>{t('diffUpdateBranchCompleted', { commit: dialog.pushed.slice(0, 8) })}</p>}\r\n {dialog.conflicts === undefined ? null : <>\r\n <p style={styles.diffModalStatus}>{t('diffUpdateBranchConflicts')}</p>\r\n <ul style={styles.diffModalConflicts}>{dialog.conflicts.map(file => <li key={file}>{file}</li>)}</ul>\r\n {submitPrompt === undefined ? null : (\r\n <button type=\"button\" style={styles.diffModalConflictResolve} onClick={() => { submitPrompt(composeConflictsPrompt(base, dialog.conflicts ?? [], method)); closeDialog() }}>{t('diffUpdateBranchResolve')}</button>\r\n )}\r\n </>}\r\n {dialog.error === undefined ? null : <p role=\"alert\" style={styles.diffModalError}>{dialog.error}</p>}\r\n </div>}\r\n </Modal>\r\n </>\r\n )\r\n}\r\n\r\ninterface CleanupDialogState {\r\n readonly submitting: boolean\r\n readonly done?: string\r\n readonly error?: string\r\n}\r\n\r\n/** After a merge: remove the worktree (or switch a plain checkout back to\r\n * base), delete the merged branch, and drop the DSH workspace along with the\r\n * sessions it held. */\r\nexport function CleanupControl({ repository, t, deleteWorkspace }: {\r\n repository: RepositoryStatus\r\n t: ClaudeRepositoryStatusInjected['t']\r\n deleteWorkspace?: () => Promise<void>\r\n}) {\r\n const [dialog, setDialog] = useState<CleanupDialogState>()\r\n const pullRequest = repository.pullRequest\r\n const base = pullRequest?.baseBranch\r\n useEffect(() => {\r\n if (dialog?.done === undefined) return\r\n const timer = setTimeout(() => setDialog(undefined), 1_500)\r\n return () => clearTimeout(timer)\r\n }, [dialog?.done])\r\n if (pullRequest?.state !== 'merged' || base === undefined || repository.root === undefined || repository.detached === true) return null\r\n const root = repository.root\r\n const closeDialog = (): void => { if (dialog?.submitting !== true) setDialog(undefined) }\r\n const confirm = (): void => {\r\n setDialog({ submitting: true })\r\n void cleanupMergedRepository(root, base).then(async result => {\r\n if (result.mode === 'worktree' && deleteWorkspace !== undefined) await deleteWorkspace()\r\n setDialog({ submitting: false, done: result.branch })\r\n }, (reason: unknown) => {\r\n setDialog({ submitting: false, error: reason instanceof Error ? reason.message : t('diffActionFailed') })\r\n })\r\n }\r\n return (\r\n <>\r\n <button type=\"button\" style={styles.repositoryUpdateTrigger} title={t('cleanupTitle')} onClick={() => { setDialog({ submitting: false }) }}>{t('cleanupButton')}</button>\r\n {dialog === undefined ? null : <style data-dsh-claude-repository-modal-styles>{styles.diffModalCss}</style>}\r\n <Modal className=\"dshClaudeRepositoryActionModal\" contentClassName=\"dshClaudeRepositoryActionModalContent\" open={dialog !== undefined} onClose={closeDialog} title={t('cleanupTitle')} closeLabel={t('diffCancel')} description={t('cleanupDescription')} footer={\r\n <div style={styles.diffModalFooter}>\r\n <button type=\"button\" style={{ ...styles.button, ...styles.diffModalButton }} disabled={dialog?.submitting === true} onClick={closeDialog}>{dialog?.done === undefined ? t('diffCancel') : t('diffDone')}</button>\r\n {dialog?.done === undefined ? <button type=\"button\" style={{ ...styles.primaryButton, ...styles.diffModalButton }} disabled={dialog?.submitting === true} onClick={confirm}>{dialog?.submitting === true ? t('diffSubmitting') : t('diffConfirm')}</button> : null}\r\n </div>\r\n }>\r\n {dialog === undefined ? null : <div style={styles.diffModalBody}>\r\n <div style={styles.diffModalMeta}>\r\n <strong style={styles.diffModalMetaText}>{repository.branch ?? t('repositoryUnknownBranch')} → {base}</strong>\r\n <span style={styles.diffModalFileState}>{repository.worktree === true ? t('repositoryWorktree') : t('repositoryLocal')}</span>\r\n </div>\r\n {dialog.done === undefined ? null : <p style={styles.diffModalSuccess}>{t('cleanupCompleted', { branch: dialog.done })}</p>}\r\n {dialog.error === undefined ? null : <p role=\"alert\" style={styles.diffModalError}>{dialog.error}</p>}\r\n </div>}\r\n </Modal>\r\n </>\r\n )\r\n}\r\n\r\nexport const MERGE_METHODS: readonly RepositoryMergeMethod[] = ['merge', 'squash', 'rebase']\r\n\r\ninterface MergeDialogState {\r\n readonly method: RepositoryMergeMethod\r\n readonly loading: boolean\r\n readonly submitting: boolean\r\n readonly fingerprint?: string\r\n readonly error?: string\r\n readonly merged?: boolean\r\n}\r\n\r\nexport function MergePullRequestControl({ sessionId, repository, t }: {\r\n sessionId: string\r\n repository: RepositoryStatus\r\n t: ClaudeRepositoryStatusInjected['t']\r\n}) {\r\n const [menuOpen, setMenuOpen] = useState(false)\r\n const [dialog, setDialog] = useState<MergeDialogState>()\r\n const controller = useRef<AbortController>()\r\n const pullRequest = repository.pullRequest\r\n useEffect(() => () => controller.current?.abort(), [])\r\n // Successful merges dismiss themselves once the confirmation has been seen;\r\n // the status bar flips to its merged state on the next projection refresh.\r\n useEffect(() => {\r\n if (dialog?.merged !== true || dialog.error !== undefined) return\r\n const timer = setTimeout(() => setDialog(undefined), 1_200)\r\n return () => clearTimeout(timer)\r\n }, [dialog?.error, dialog?.merged])\r\n if (pullRequest === undefined || pullRequest.state !== 'open' || pullRequest.draft || repository.detached === true) return null\r\n const openMerge = (method: RepositoryMergeMethod): void => {\r\n controller.current?.abort()\r\n setMenuOpen(false)\r\n setDialog({ method, loading: true, submitting: false })\r\n const aborter = new AbortController()\r\n controller.current = aborter\r\n void loadRepositoryActionPreview(sessionId, aborter.signal).then(preview => {\r\n setDialog({ method, loading: false, submitting: false, fingerprint: preview.fingerprint })\r\n }, (error: unknown) => {\r\n if (!aborter.signal.aborted) setDialog({ method, loading: false, submitting: false, error: error instanceof Error ? error.message : t('diffActionFailed') })\r\n })\r\n }\r\n const closeDialog = (): void => {\r\n if (dialog?.submitting === true) return\r\n controller.current?.abort()\r\n controller.current = undefined\r\n setDialog(undefined)\r\n }\r\n const confirmMerge = (): void => {\r\n if (dialog?.fingerprint === undefined || dialog.submitting) return\r\n const { error: _error, ...pending } = dialog\r\n setDialog({ ...pending, submitting: true })\r\n void executeRepositoryAction(sessionId, {\r\n action: 'merge-pr',\r\n fingerprint: dialog.fingerprint,\r\n message: '',\r\n includeUnstaged: false,\r\n mergeMethod: dialog.method,\r\n }).then(() => {\r\n setDialog({ ...pending, submitting: false, merged: true })\r\n }, (error: unknown) => {\r\n setDialog({ ...pending, submitting: false, error: error instanceof Error ? error.message : t('diffActionFailed') })\r\n })\r\n }\r\n const items: readonly MenuEntry[] = MERGE_METHODS.map(method => ({ id: method, label: t(`diffMerge_${method}` as ClaudeCodeSettingsKey) }))\r\n const merged = dialog?.merged === true\r\n return (\r\n <>\r\n <Menu open={menuOpen} items={items} onSelect={(id: string) => openMerge(id as RepositoryMergeMethod)} onClose={() => setMenuOpen(false)} align=\"end\" portal anchor={\r\n <button type=\"button\" style={styles.repositoryMergeTrigger} aria-label={t('repositoryMergeMenu')} aria-haspopup=\"menu\" aria-expanded={menuOpen} onClick={() => setMenuOpen(value => !value)}>{t('diffMergePr')}<IconChevronDownOutline14 /></button>\r\n } />\r\n {dialog === undefined ? null : <style data-dsh-claude-repository-modal-styles>{styles.diffModalCss}</style>}\r\n <Modal className=\"dshClaudeRepositoryActionModal\" contentClassName=\"dshClaudeRepositoryActionModalContent\" open={dialog !== undefined} onClose={closeDialog} title={t('diffMergePr')} closeLabel={t('diffCancel')} description={t('diffMergeDescription')} footer={\r\n <div style={styles.diffModalFooter}>\r\n <button type=\"button\" style={{ ...styles.button, ...styles.diffModalButton }} disabled={dialog?.submitting === true} onClick={closeDialog}>{merged ? t('diffDone') : t('diffCancel')}</button>\r\n {!merged ? <button type=\"button\" style={{ ...styles.primaryButton, ...styles.diffModalButton }} disabled={dialog?.loading === true || dialog?.submitting === true || dialog?.fingerprint === undefined} onClick={confirmMerge}>{dialog?.submitting === true ? t('diffSubmitting') : t('diffConfirm')}</button> : null}\r\n </div>\r\n }>\r\n {dialog === undefined ? null : <div style={styles.diffModalBody}>\r\n <div style={styles.diffModalMeta}>\r\n <strong style={styles.diffModalMetaText} title={pullRequest.title}>{t('repositoryPr', { number: pullRequest.number })} → {pullRequest.baseBranch ?? t('diffPrBaseDefault')}</strong>\r\n <span style={styles.diffModalFileState}>{t(`diffMerge_${dialog.method}` as ClaudeCodeSettingsKey)}</span>\r\n </div>\r\n <p style={styles.diffModalStatus}>{pullRequest.title}</p>\r\n {merged ? <p style={styles.diffModalSuccess}>{t('diffMergeCompleted', { number: pullRequest.number })}</p> : null}\r\n {dialog.error === undefined ? null : <p role=\"alert\" style={styles.diffModalError}>{dialog.error}</p>}\r\n </div>}\r\n </Modal>\r\n </>\r\n )\r\n}\r\n\r\nexport function ClaudeRepositoryStatus({ sessionId, useSessions, useClaudeProjection, t, openDiff, submitPrompt, openOverview, deleteWorkspace }: ClaudeRepositoryStatusProps) {\r\n const blank = useSessions(value => value.byId[sessionId]?.blank === true)\r\n const running = useSessions(value => value.byId[sessionId]?.running === true)\r\n const projection = useClaudeProjection(value => value)\r\n const repository = projection.repository\r\n if (blank || !projection.owned || repository === undefined) return null\r\n const branch = repository.detached === true ? t('repositoryDetached') : repository.branch ?? t('repositoryUnknownBranch')\r\n const pullRequest = repository.pullRequest\r\n const merged = pullRequest?.state === 'merged'\r\n const mergedAge = merged ? relativeAge(pullRequest.mergedAt) : undefined\r\n const aheadCount = repository.ahead ?? 0\r\n const pushable = repository.remote !== undefined && repository.detached !== true && (aheadCount > 0 || repository.upstream === false)\r\n const hasDiff = repository.diff !== undefined && (repository.diff.additions > 0 || repository.diff.deletions > 0)\r\n if (repository.status !== 'ready') {\r\n return (\r\n <div style={styles.repositoryBarFrame}>\r\n <div style={styles.repositoryBar}>\r\n <span style={styles.repositoryPrIcon}><PullRequestIcon /></span>\r\n <span style={styles.repositoryPrimary}>{repository.status === 'not-repository' ? t('repositoryNotGit') : t('repositoryUnavailable')}</span>\r\n </div>\r\n </div>\r\n )\r\n }\r\n return (\r\n <div style={styles.repositoryBarFrame}>\r\n <div style={{ ...styles.repositoryBar, ...(merged ? styles.repositoryBarMerged : {}) }}>\r\n {openOverview === undefined\r\n ? <span style={{ ...styles.repositoryPrIcon, ...(merged ? styles.repositoryPrIconMerged : {}) }}><PullRequestIcon merged={merged} /></span>\r\n : <button type=\"button\" style={{ ...styles.repositoryPrIcon, ...(merged ? styles.repositoryPrIconMerged : {}), ...styles.repositoryPrIconButton }} aria-label={t('overviewOpen')} title={t('overviewOpen')} onClick={openOverview}><PullRequestIcon merged={merged} /></button>}\r\n <PullRequestLink repository={repository} t={t} />\r\n {repository.remote === undefined ? null : <span style={styles.repositoryRemote}>{repositoryName(repository.remote)}</span>}\r\n <span style={styles.repositoryBranch}>{branch}</span>\r\n {repository.worktree === true ? <span style={styles.repositoryWorktree}>{t('repositoryWorktree')}</span> : null}\r\n <span style={styles.repositoryStatusItems}>\r\n {hasDiff || pushable ? (\r\n <button type=\"button\" style={{ ...styles.diffTrigger, ...(merged ? styles.diffTriggerMuted : {}) }} onClick={openDiff} aria-label={t('diffOpen')}>\r\n {hasDiff && repository.diff !== undefined ? <>\r\n <span style={merged ? styles.diffAddMuted : styles.diffAdd}>+{repository.diff.additions}</span>\r\n <span style={merged ? styles.diffDeleteMuted : styles.diffDelete}>−{repository.diff.deletions}</span>\r\n </> : null}\r\n {pushable ? <span style={merged ? styles.diffAheadMuted : styles.diffAhead}>↑{aheadCount > 0 ? aheadCount : ''}</span> : null}\r\n </button>\r\n ) : null}\r\n {pullRequest === undefined ? null : merged ? (<>\r\n <span style={styles.repositoryMergedStatus}>\r\n <span style={styles.repositoryMergedDot} aria-hidden=\"true\" />\r\n {t('repositoryState_merged')}\r\n {mergedAge === undefined ? null : <span style={styles.repositoryMergedAge}>· {t('repositoryMergedAgo', { age: mergedAge })}</span>}\r\n </span>\r\n <CleanupControl repository={repository} t={t} {...(deleteWorkspace === undefined ? {} : { deleteWorkspace })} />\r\n </>) : <>\r\n {pullRequest.checks === 'failing'\r\n ? <FailingChecksControl sessionId={sessionId} pullNumber={pullRequest.number} t={t} {...(submitPrompt === undefined ? {} : { submitPrompt })} />\r\n : pullRequest.checks === 'none' ? null : <StatusGlyph\r\n label={t(`repositoryChecks_${pullRequest.checks}` as ClaudeCodeSettingsKey)}\r\n tone={pullRequest.checks === 'passing' ? 'success' : 'warning'}\r\n ><ChecksGlyph state={pullRequest.checks} /></StatusGlyph>}\r\n {pullRequest.review === 'none' ? null : <StatusGlyph\r\n label={t(`repositoryReview_${pullRequest.review}` as ClaudeCodeSettingsKey)}\r\n tone={pullRequest.review === 'approved' ? 'success' : pullRequest.review === 'changes-requested' ? 'error' : 'neutral'}\r\n ><ReviewGlyph /></StatusGlyph>}\r\n <AutoFixControl sessionId={sessionId} repository={repository} running={running} t={t} {...(submitPrompt === undefined ? {} : { submitPrompt })} />\r\n <UpdateBranchControl sessionId={sessionId} repository={repository} t={t} {...(submitPrompt === undefined ? {} : { submitPrompt })} />\r\n <MergePullRequestControl sessionId={sessionId} repository={repository} t={t} />\r\n </>}\r\n </span>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import { CLAUDE_REVIEW_COMMENT_PATH } from '../constants.ts'\r\nimport type { ReviewComment, ReviewCommentSide } from '../review-comments.ts'\r\nimport { PLUGIN_READ_TIMEOUT_MS, pluginRequestSignal } from './plugin-request.ts'\r\n\r\nfunction record(value: unknown): Record<string, unknown> | undefined {\r\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\r\n}\r\n\r\nasync function post(path: string, sessionId: string, body: Record<string, unknown>): Promise<unknown> {\r\n const response = await fetch(`${CLAUDE_REVIEW_COMMENT_PATH}${path}?sessionId=${encodeURIComponent(sessionId)}`, {\r\n method: 'POST',\r\n credentials: 'same-origin',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify(body),\r\n signal: pluginRequestSignal(PLUGIN_READ_TIMEOUT_MS),\r\n })\r\n const value = await response.json() as unknown\r\n if (!response.ok) {\r\n const error = record(value)\r\n throw new Error(typeof error?.message === 'string' ? error.message : 'Review comment request failed.')\r\n }\r\n return value\r\n}\r\n\r\nexport async function addReviewComment(\r\n sessionId: string,\r\n comment: { path: string; line: number; startLine?: number; side: ReviewCommentSide; text: string },\r\n): Promise<ReviewComment> {\r\n const value = record(await post('', sessionId, comment))\r\n const created = record(value?.comment)\r\n if (created === undefined || typeof created.id !== 'string') throw new Error('Invalid review comment response.')\r\n return created as unknown as ReviewComment\r\n}\r\n\r\nexport async function removeReviewComment(sessionId: string, id: string): Promise<void> {\r\n await post('/remove', sessionId, { id })\r\n}\r\n\r\nexport async function clearReviewComments(sessionId: string): Promise<void> {\r\n await post('/clear', sessionId, {})\r\n}\r\n","import { useState } from 'react'\r\nimport { HoverCard } from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type { ReviewComment } from '../review-comments.ts'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\nimport type { ClaudeClientProjection } from './projection.ts'\r\nimport { clearReviewComments, removeReviewComment } from './review-comment-api.ts'\r\nimport * as styles from './styles.ts'\r\n\r\nexport interface ClaudeReviewCommentsInjected {\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n sessionId: string\r\n /** Submit the composer, seeding the given draft text when it is empty. */\r\n submitWith?: (fallbackDraft: string) => void\r\n}\r\n\r\nexport interface ClaudeReviewCommentsProps extends ClaudeReviewCommentsInjected {\r\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\r\n}\r\n\r\nexport function reviewCommentChipLabel(comment: Pick<ReviewComment, 'path' | 'line' | 'startLine'>): string {\r\n const name = comment.path.split('/').at(-1) ?? comment.path\r\n return `${name}:${comment.startLine === undefined ? comment.line : `${comment.startLine}-${comment.line}`}`\r\n}\r\n\r\n/** \"Line 12\" / \"Lines 10–12\", with the old-side variant when the comment sits on removed code. */\r\nexport function commentLineLabel(\r\n comment: Pick<ReviewComment, 'line' | 'side' | 'startLine'>,\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string,\r\n): string {\r\n if (comment.startLine !== undefined) {\r\n return t(comment.side === 'old' ? 'reviewCommentOldRange' : 'reviewCommentNewRange', { start: comment.startLine, end: comment.line })\r\n }\r\n return t(comment.side === 'old' ? 'reviewCommentOldSide' : 'reviewCommentNewSide', { line: comment.line })\r\n}\r\n\r\nfunction CommentIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M2.75 2.75h10.5a1 1 0 0 1 1 1v6.5a1 1 0 0 1-1 1H8.2l-3.2 2.9v-2.9H2.75a1 1 0 0 1-1-1v-6.5a1 1 0 0 1 1-1Z\" />\r\n </svg>\r\n )\r\n}\r\n\r\nfunction SendIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M14 2 7.3 8.7M14 2 9.7 14l-2.4-5.3L2 6.3 14 2Z\" />\r\n </svg>\r\n )\r\n}\r\n\r\nfunction TrashIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M2.5 4h11M6.3 2.5h3.4M4.2 4l.65 9.3a1 1 0 0 0 1 .93h4.3a1 1 0 0 0 1-.93L11.8 4M6.7 6.8v4.6M9.3 6.8v4.6\" />\r\n </svg>\r\n )\r\n}\r\n\r\nfunction CommentChip({ comment, t, onRemove }: {\r\n comment: ReviewComment\r\n t: ClaudeReviewCommentsInjected['t']\r\n onRemove: (id: string) => void\r\n}) {\r\n return (\r\n <HoverCard\r\n anchor={\r\n <span style={styles.reviewCommentChip}>\r\n <span style={styles.reviewCommentChipLabel}>{reviewCommentChipLabel(comment)}</span>\r\n <button type=\"button\" style={styles.reviewCommentChipRemove} aria-label={t('reviewCommentRemove')} onClick={() => onRemove(comment.id)}>×</button>\r\n </span>\r\n }\r\n content={\r\n <span style={styles.reviewCommentHoverCard}>\r\n <span style={styles.reviewCommentHoverPath}>{comment.path} · {commentLineLabel(comment, t)}</span>\r\n <p style={styles.reviewCommentHoverText}>{comment.text}</p>\r\n </span>\r\n }\r\n openDelayMs={250}\r\n />\r\n )\r\n}\r\n\r\n/** Pending review comments docked above the composer; drained by the next user turn. */\r\nexport function ClaudeReviewComments({ useClaudeProjection, t, sessionId, submitWith }: ClaudeReviewCommentsProps) {\r\n const projection = useClaudeProjection(value => value)\r\n const [removedIds, setRemovedIds] = useState<ReadonlySet<string>>(() => new Set())\r\n const comments = (projection.reviewComments ?? []).filter(comment => !removedIds.has(comment.id))\r\n if (!projection.owned || comments.length === 0) return null\r\n const remove = (id: string): void => {\r\n setRemovedIds(previous => new Set([...previous, id]))\r\n void removeReviewComment(sessionId, id).catch(() => {\r\n setRemovedIds(previous => {\r\n const next = new Set(previous)\r\n next.delete(id)\r\n return next\r\n })\r\n })\r\n }\r\n const clearAll = (): void => {\r\n const ids = comments.map(comment => comment.id)\r\n setRemovedIds(previous => new Set([...previous, ...ids]))\r\n void clearReviewComments(sessionId).catch(() => {\r\n setRemovedIds(previous => {\r\n const next = new Set(previous)\r\n for (const id of ids) next.delete(id)\r\n return next\r\n })\r\n })\r\n }\r\n return (\r\n <div style={styles.reviewCommentBarFrame}>\r\n <style data-dsh-claude-review-comment-styles>{styles.panelIconButtonCss}</style>\r\n <div style={styles.reviewCommentBar}>\r\n <span style={styles.reviewCommentIcon}><CommentIcon /></span>\r\n {comments.map(comment => <CommentChip key={comment.id} comment={comment} t={t} onRemove={remove} />)}\r\n <span style={styles.reviewCommentClearSeat}>\r\n {submitWith === undefined ? null : (\r\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('reviewCommentsSend')} onClick={() => submitWith(t('reviewCommentsSendDraft'))}><SendIcon /></button>\r\n )}\r\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('reviewCommentsClear')} onClick={clearAll}><TrashIcon /></button>\r\n </span>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","/*! @license DOMPurify 3.4.14 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.14/LICENSE */\n\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nfunction _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = true,\n o = false;\n try {\n if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = true, n = r;\n } finally {\n try {\n if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _slicedToArray(r, e) {\n return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nconst entries = Object.entries,\n setPrototypeOf = Object.setPrototypeOf,\n isFrozen = Object.isFrozen,\n getPrototypeOf = Object.getPrototypeOf,\n getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nlet freeze = Object.freeze,\n seal = Object.seal,\n create = Object.create; // eslint-disable-line import/no-mutable-exports\nlet _ref = typeof Reflect !== 'undefined' && Reflect,\n apply = _ref.apply,\n construct = _ref.construct;\nif (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n}\nif (!seal) {\n seal = function seal(x) {\n return x;\n };\n}\nif (!apply) {\n apply = function apply(func, thisArg) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return func.apply(thisArg, args);\n };\n}\nif (!construct) {\n construct = function construct(Func) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n return new Func(...args);\n };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst arrayIsArray = Array.isArray;\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString = typeof BigInt === 'undefined' ? null : unapply(BigInt.prototype.toString);\nconst symbolToString = typeof Symbol === 'undefined' ? null : unapply(Symbol.prototype.toString);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n return function (thisArg) {\n if (thisArg instanceof RegExp) {\n thisArg.lastIndex = 0;\n }\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n return apply(func, thisArg, args);\n };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n return function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n return construct(Func, args);\n };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n if (!arrayIsArray(array)) {\n return set;\n }\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n element = lcElement;\n }\n }\n set[element] = true;\n }\n return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n for (let index = 0; index < array.length; index++) {\n const isPropertyExist = objectHasOwnProperty(array, index);\n if (!isPropertyExist) {\n array[index] = null;\n }\n }\n return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n const newObject = create(null);\n for (const _ref2 of entries(object)) {\n var _ref3 = _slicedToArray(_ref2, 2);\n const property = _ref3[0];\n const value = _ref3[1];\n const isPropertyExist = objectHasOwnProperty(object, property);\n if (isPropertyExist) {\n if (arrayIsArray(value)) {\n newObject[property] = cleanArray(value);\n } else if (value && typeof value === 'object' && value.constructor === Object) {\n newObject[property] = clone(value);\n } else {\n newObject[property] = value;\n }\n }\n }\n return newObject;\n}\n/**\n * Convert non-node values into strings without depending on direct property access.\n *\n * @param value - The value to stringify.\n * @returns A string representation of the provided value.\n */\nfunction stringifyValue(value) {\n switch (typeof value) {\n case 'string':\n {\n return value;\n }\n case 'number':\n {\n return numberToString(value);\n }\n case 'boolean':\n {\n return booleanToString(value);\n }\n case 'bigint':\n {\n return bigintToString ? bigintToString(value) : '0';\n }\n case 'symbol':\n {\n return symbolToString ? symbolToString(value) : 'Symbol()';\n }\n case 'undefined':\n {\n return objectToString(value);\n }\n case 'function':\n case 'object':\n {\n if (value === null) {\n return objectToString(value);\n }\n const valueAsRecord = value;\n const valueToString = lookupGetter(valueAsRecord, 'toString');\n if (typeof valueToString === 'function') {\n const stringified = valueToString(valueAsRecord);\n return typeof stringified === 'string' ? stringified : objectToString(stringified);\n }\n return objectToString(value);\n }\n default:\n {\n return objectToString(value);\n }\n }\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n object = getPrototypeOf(object);\n }\n function fallbackValue() {\n return null;\n }\n return fallbackValue;\n}\nfunction isRegex(value) {\n try {\n regExpTest(value, '');\n return true;\n } catch (_unused) {\n return false;\n }\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'command', 'commandfor', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dominant-baseline', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'pointer-events', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-orientation', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'vector-effect', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lquote', 'lspace', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\nconst MUSTACHE_EXPR = seal(/{{[\\w\\W]*|^[\\w\\W]*}}/g);\nconst ERB_EXPR = seal(/<%[\\w\\W]*|^[\\w\\W]*%>/g);\nconst TMPLIT_EXPR = seal(/\\${[\\w\\W]*/g);\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n// Markup-significant character probes used by _sanitizeElements.\n// Shared module-level instances are safe despite the sticky /g flags:\n// unapply() resets lastIndex for RegExp receivers before every call.\nconst ELEMENT_MARKUP_PROBE = seal(/<[/\\w!]/g);\nconst COMMENT_MARKUP_PROBE = seal(/<[/\\w]/g);\nconst FALLBACK_TAG_CLOSE = seal(/<\\/no(script|embed|frames)/i);\nconst SELF_CLOSING_TAG = seal(/\\/>/i);\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n element: 1,\n attribute: 2,\n text: 3,\n cdataSection: 4,\n entityReference: 5,\n // Deprecated\n entityNode: 6,\n // Deprecated\n processingInstruction: 7,\n comment: 8,\n document: 9,\n documentType: 10,\n documentFragment: 11,\n notation: 12 // Deprecated\n};\n/* HTML-namespace elements whose child text nodes are serialized *literally*\n (unescaped) by the HTML fragment-serialization algorithm. Two reparse-mXSS\n shapes ride on that literal serialization:\n (a) an element child - a tree the HTML parser can never build, but the DOM\n API and an XML/XHTML parse can - after which a `</tag>`-bearing text\n sibling breaks the element open on reparse; and\n (b) text-only content that already carries the element's OWN end tag, e.g.\n `<style>...</style><img onerror=x>` built as a node, which the literal\n serializer emits verbatim for the HTML parser to re-open.\n Shape (a) is handled by the firstElementChild branch in _isUnsafeNode; shape\n (b) by the LITERAL_TEXT_CLOSE probe. Both read textContent (the raw-serialized\n form for these elements) rather than innerHTML, because an XML/XHTML working\n document serializes innerHTML with `<` escaped, which silently blinds the\n innerHTML-based probes (rule 1's second probe and FALLBACK_TAG_CLOSE) there.\n `script` is never allow-listed, but is kept here so the guard matches the\n serializer's own literal-text list exactly. */\nconst LITERAL_TEXT_ELEMENT_NAMES = ['style', 'script', 'xmp', 'iframe', 'noembed', 'noframes', 'plaintext', 'noscript'];\nconst LITERAL_TEXT_ELEMENTS = freeze(addToSet({}, LITERAL_TEXT_ELEMENT_NAMES));\n/* Per-element end-tag matcher. On an HTML reparse the ONLY token that\n terminates a literal-text element's raw content is its own end tag; a foreign\n literal-text close (e.g. `</xmp>` sitting inside `<style>`) does not break\n out, so matching is per-element, not a shared alternation. The lookahead\n requires an HTML tag-name terminator (whitespace, `/` or `>`) so a longer\n name such as `</styles` is not mistaken for `</style`. */\nconst LITERAL_TEXT_CLOSE = function () {\n const map = {};\n arrayForEach(LITERAL_TEXT_ELEMENT_NAMES, name => {\n map[name] = seal(new RegExp('</' + name + '(?=[\\\\t\\\\n\\\\f\\\\r />])', 'i'));\n });\n return freeze(map);\n}();\nconst getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n }\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n suffix = purifyHostElement.getAttribute(ATTR_NAME);\n }\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n};\nconst _createHooksMap = function _createHooksMap() {\n return {\n afterSanitizeAttributes: [],\n afterSanitizeElements: [],\n afterSanitizeShadowDOM: [],\n beforeSanitizeAttributes: [],\n beforeSanitizeElements: [],\n beforeSanitizeShadowDOM: [],\n uponSanitizeAttribute: [],\n uponSanitizeElement: [],\n uponSanitizeShadowNode: []\n };\n};\n/**\n * Resolve a set-valued configuration option: a fresh set built from\n * cfg[key] when it is an own array property (seeded with a clone of\n * options.base when given, case-normalized via options.transform),\n * the fallback set otherwise.\n *\n * @param cfg the cloned, prototype-free configuration object\n * @param key the configuration property to read\n * @param fallback the set to use when the option is absent or not an array\n * @param options transform and optional base set to merge into\n * @returns the resolved set\n */\nconst _resolveSetOption = function _resolveSetOption(cfg, key, fallback, options) {\n return objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key]) ? addToSet(options.base ? clone(options.base) : {}, cfg[key], options.transform) : fallback;\n};\n/**\n * Resolve an object-valued configuration option: a prototype-free clone\n * of cfg[key] when it is an own, truthy object property, else a fresh\n * fallback built by makeFallback (fresh on every parse, so a previous\n * parse can never leak state into the next one).\n *\n * @param cfg the cloned, prototype-free configuration object\n * @param key the configuration property to read\n * @param makeFallback builds the fallback value when the option is absent\n * @returns the resolved object\n */\nconst _resolveObjectOption = function _resolveObjectOption(cfg, key, makeFallback) {\n const value = objectHasOwnProperty(cfg, key) ? cfg[key] : undefined;\n return value && typeof value === 'object' ? clone(value) : makeFallback();\n};\nfunction createDOMPurify() {\n let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n const DOMPurify = root => createDOMPurify(root);\n DOMPurify.version = '3.4.14';\n DOMPurify.removed = [];\n if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n let document = window.document;\n const originalDocument = document;\n const currentScript = originalDocument.currentScript;\n window.DocumentFragment;\n const HTMLTemplateElement = window.HTMLTemplateElement,\n Node = window.Node,\n Element = window.Element,\n NodeFilter = window.NodeFilter,\n _window$NamedNodeMap = window.NamedNodeMap;\n _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap;\n window.HTMLFormElement;\n const DOMParser = window.DOMParser,\n trustedTypes = window.trustedTypes;\n const ElementPrototype = Element.prototype;\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const remove = lookupGetter(ElementPrototype, 'remove');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n const getShadowRoot = lookupGetter(ElementPrototype, 'shadowRoot');\n const getAttributes = lookupGetter(ElementPrototype, 'attributes');\n const getNodeType = Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeType') : null;\n const getNodeName = Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeName') : null;\n const getOwnerDocument = Node && Node.prototype ? lookupGetter(Node.prototype, 'ownerDocument') : null;\n /* Clobber-safe nodeType / nodeName reads through the cached Node.prototype\n getters, with a direct-property fallback for environments that lack\n Node.prototype. Sites that need a different fallback (e.g. _isClobbered\n returns early on a null name) intentionally keep their own reads. */\n const _readNodeType = function _readNodeType(node) {\n return getNodeType ? getNodeType(node) : node.nodeType;\n };\n const _readNodeName = function _readNodeName(node) {\n return getNodeName ? getNodeName(node) : node.nodeName;\n };\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n let trustedTypesPolicy;\n let emptyHTML = '';\n // The instance's own internal Trusted Types policy. Unlike a caller-supplied\n // `TRUSTED_TYPES_POLICY`, this is created at most once — Trusted Types throws\n // on duplicate policy names — and is the only policy allowed to persist\n // across configurations and survive `clearConfig()`.\n let defaultTrustedTypesPolicy;\n let defaultTrustedTypesPolicyResolved = false;\n // Tracks whether we are already inside a call to the configured Trusted Types\n // policy (`createHTML` or `createScriptURL`). If a supplied policy callback\n // itself calls `DOMPurify.sanitize` (the cause of #1422), `sanitize` would\n // re-enter the policy and recurse until the stack overflows. We detect that\n // re-entry and throw a clear, actionable error instead. The guard is shared\n // across both callbacks, because either one re-entering `sanitize` triggers\n // the same unbounded recursion.\n let IN_TRUSTED_TYPES_POLICY = 0;\n const _assertNotInTrustedTypesPolicy = function _assertNotInTrustedTypesPolicy() {\n if (IN_TRUSTED_TYPES_POLICY > 0) {\n throw typeErrorCreate('A configured TRUSTED_TYPES_POLICY callback (createHTML or ' + 'createScriptURL) must not call DOMPurify.sanitize, as that causes ' + 'infinite recursion. Do not pass a policy whose callbacks wrap ' + 'DOMPurify as TRUSTED_TYPES_POLICY; see the \"DOMPurify and Trusted ' + 'Types\" section of the README.');\n }\n };\n const _createTrustedHTML = function _createTrustedHTML(html) {\n _assertNotInTrustedTypesPolicy();\n IN_TRUSTED_TYPES_POLICY++;\n try {\n return trustedTypesPolicy.createHTML(html);\n } finally {\n IN_TRUSTED_TYPES_POLICY--;\n }\n };\n const _createTrustedScriptURL = function _createTrustedScriptURL(scriptUrl) {\n _assertNotInTrustedTypesPolicy();\n IN_TRUSTED_TYPES_POLICY++;\n try {\n return trustedTypesPolicy.createScriptURL(scriptUrl);\n } finally {\n IN_TRUSTED_TYPES_POLICY--;\n }\n };\n // Lazily resolve (and cache) the instance's internal default policy.\n // Resolution is attempted at most once: a successful `createPolicy` cannot be\n // repeated (Trusted Types throws on duplicate names), and a failed or\n // unsupported attempt must not be retried on every parse.\n const _getDefaultTrustedTypesPolicy = function _getDefaultTrustedTypesPolicy() {\n if (!defaultTrustedTypesPolicyResolved) {\n defaultTrustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n defaultTrustedTypesPolicyResolved = true;\n }\n return defaultTrustedTypesPolicy;\n };\n const _document = document,\n implementation = _document.implementation,\n createNodeIterator = _document.createNodeIterator,\n createDocumentFragment = _document.createDocumentFragment,\n getElementsByTagName = _document.getElementsByTagName;\n const importNode = originalDocument.importNode;\n let hooks = _createHooksMap();\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n const MUSTACHE_EXPR$1 = MUSTACHE_EXPR,\n ERB_EXPR$1 = ERB_EXPR,\n TMPLIT_EXPR$1 = TMPLIT_EXPR,\n DATA_ATTR$1 = DATA_ATTR,\n ARIA_ATTR$1 = ARIA_ATTR,\n IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE$1 = ATTR_WHITESPACE,\n CUSTOM_ELEMENT$1 = CUSTOM_ELEMENT;\n let IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n /*\n * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false\n }\n }));\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n tagCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n }\n }));\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n /* Decide if document with <html>... should be returned */\n let WHOLE_DOCUMENT = false;\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n /* Pristine allowlist bindings captured at setConfig() time. On the\n * persistent-config path sanitize() restores the sets from these before\n * the per-walk hook clone-guard, so a hook's in-call widening cannot\n * carry across calls. Null until setConfig() is called; reset by\n * clearConfig(). */\n let SET_CONFIG_ALLOWED_TAGS = null;\n let SET_CONFIG_ALLOWED_ATTR = null;\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script',\n // <selectedcontent> mirrors the selected <option>'s subtree, cloned by\n // the UA (customizable <select>) — including any on* handlers — and the\n // engine re-mirrors synchronously whenever a removal changes which\n // option/selectedcontent is current, even inside DOMPurify's inert\n // DOMParser document. Hoisting its children on removal re-inserts a fresh\n // mirror target ahead of the walk, which the engine refills, looping\n // forever (DoS) and amplifying output. Dropping its content on removal\n // (rather than hoisting) breaks that cascade; the content is a duplicate\n // of the option, which is sanitized on its own. See campaign-3 F1/F6.\n 'selectedcontent', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n let NAMESPACE = HTML_NAMESPACE;\n let IS_EMPTY_INPUT = false;\n /* Allowed XHTML+XML namespaces */\n let ALLOWED_NAMESPACES = null;\n const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n const DEFAULT_MATHML_TEXT_INTEGRATION_POINTS = freeze(['mi', 'mo', 'mn', 'ms', 'mtext']);\n let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);\n const DEFAULT_HTML_INTEGRATION_POINTS = freeze(['annotation-xml']);\n let HTML_INTEGRATION_POINTS = addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n /* Parsing of strict XHTML documents */\n let PARSER_MEDIA_TYPE = null;\n const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n let transformCaseFunc = null;\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n const formElement = document.createElement('form');\n const isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n /**\n * _parseConfig\n *\n * @param cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function _parseConfig() {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n PARSER_MEDIA_TYPE =\n // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n /* Set configuration parameters */\n ALLOWED_TAGS = _resolveSetOption(cfg, 'ALLOWED_TAGS', DEFAULT_ALLOWED_TAGS, {\n transform: transformCaseFunc\n });\n ALLOWED_ATTR = _resolveSetOption(cfg, 'ALLOWED_ATTR', DEFAULT_ALLOWED_ATTR, {\n transform: transformCaseFunc\n });\n ALLOWED_NAMESPACES = _resolveSetOption(cfg, 'ALLOWED_NAMESPACES', DEFAULT_ALLOWED_NAMESPACES, {\n transform: stringToString\n });\n URI_SAFE_ATTRIBUTES = _resolveSetOption(cfg, 'ADD_URI_SAFE_ATTR', DEFAULT_URI_SAFE_ATTRIBUTES, {\n transform: transformCaseFunc,\n base: DEFAULT_URI_SAFE_ATTRIBUTES\n });\n DATA_URI_TAGS = _resolveSetOption(cfg, 'ADD_DATA_URI_TAGS', DEFAULT_DATA_URI_TAGS, {\n transform: transformCaseFunc,\n base: DEFAULT_DATA_URI_TAGS\n });\n FORBID_CONTENTS = _resolveSetOption(cfg, 'FORBID_CONTENTS', DEFAULT_FORBID_CONTENTS, {\n transform: transformCaseFunc\n });\n FORBID_TAGS = _resolveSetOption(cfg, 'FORBID_TAGS', clone({}), {\n transform: transformCaseFunc\n });\n FORBID_ATTR = _resolveSetOption(cfg, 'FORBID_ATTR', clone({}), {\n transform: transformCaseFunc\n });\n USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === 'object' ? clone(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI; // Default regexp\n NAMESPACE = typeof cfg.NAMESPACE === 'string' ? cfg.NAMESPACE : HTML_NAMESPACE; // Default HTML namespace\n MATHML_TEXT_INTEGRATION_POINTS = _resolveObjectOption(cfg, 'MATHML_TEXT_INTEGRATION_POINTS', () => addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS) // Default built-in map\n );\n HTML_INTEGRATION_POINTS = _resolveObjectOption(cfg, 'HTML_INTEGRATION_POINTS', () => addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS) // Default built-in map\n );\n const customElementHandling = _resolveObjectOption(cfg, 'CUSTOM_ELEMENT_HANDLING', () => create(null));\n CUSTOM_ELEMENT_HANDLING = create(null);\n if (objectHasOwnProperty(customElementHandling, 'tagNameCheck') && isRegexOrFunction(customElementHandling.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck; // Default undefined\n }\n if (objectHasOwnProperty(customElementHandling, 'attributeNameCheck') && isRegexOrFunction(customElementHandling.attributeNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck; // Default undefined\n }\n if (objectHasOwnProperty(customElementHandling, 'allowCustomizedBuiltInElements') && typeof customElementHandling.allowCustomizedBuiltInElements === 'boolean') {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements; // Default undefined\n }\n seal(CUSTOM_ELEMENT_HANDLING);\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, text);\n ALLOWED_ATTR = create(null);\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg$1);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl$1);\n addToSet(ALLOWED_ATTR, mathMl);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n /* Always reset function-based ADD_TAGS / ADD_ATTR checks to prevent\n * leaking across calls when switching from function to array config */\n EXTRA_ELEMENT_HANDLING.tagCheck = null;\n EXTRA_ELEMENT_HANDLING.attributeCheck = null;\n /* Merge configuration parameters */\n if (objectHasOwnProperty(cfg, 'ADD_TAGS')) {\n if (typeof cfg.ADD_TAGS === 'function') {\n EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n } else if (arrayIsArray(cfg.ADD_TAGS)) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n }\n if (objectHasOwnProperty(cfg, 'ADD_ATTR')) {\n if (typeof cfg.ADD_ATTR === 'function') {\n EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n } else if (arrayIsArray(cfg.ADD_ATTR)) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n }\n if (objectHasOwnProperty(cfg, 'ADD_FORBID_CONTENTS') && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n }\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n // Re-derive the active Trusted Types policy from this configuration on\n // every parse. The active policy must never be sticky closure state that\n // outlives the config that set it: a caller-supplied policy left in place\n // after `clearConfig()` — or after a later call that supplied none, or\n // `TRUSTED_TYPES_POLICY: null` — could sign a subsequent \"default\"\n // `RETURN_TRUSTED_TYPE` result with a foreign, possibly unsafe policy.\n // See GHSA-vxr8-fq34-vvx9.\n if (cfg.TRUSTED_TYPES_POLICY) {\n if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n }\n if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n }\n // A caller-supplied policy applies to this configuration only.\n const previousTrustedTypesPolicy = trustedTypesPolicy;\n trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n // Sign local variables required by `sanitize`. If the supplied policy's\n // `createHTML` is circular (i.e. it calls `DOMPurify.sanitize`), this\n // throws via the re-entrancy guard. Restore the previous policy first so\n // the instance is not left in a poisoned state. See #1422.\n try {\n emptyHTML = _createTrustedHTML('');\n } catch (error) {\n trustedTypesPolicy = previousTrustedTypesPolicy;\n throw error;\n }\n } else if (cfg.TRUSTED_TYPES_POLICY === null) {\n // Explicit opt-out for this call: perform no Trusted Types signing and\n // create nothing (so a strict `trusted-types` CSP that disallows a\n // `dompurify` policy can still call `sanitize` from inside its own\n // policy — see #1422). Resetting to `undefined` rather than a sticky\n // `null` also drops any previously retained caller policy, so it cannot\n // resurface on a later call, while still allowing the next config-less\n // call to restore the internal default policy. See GHSA-vxr8-fq34-vvx9.\n trustedTypesPolicy = undefined;\n emptyHTML = '';\n } else {\n // No policy supplied: keep the currently active policy if one is set — a\n // previously supplied policy is intentionally sticky across config-less\n // calls — otherwise fall back to the instance's own internal policy,\n // created at most once. (A policy supplied for a *single* call still\n // lingers by design; what must not linger is a policy whose configuration\n // has been torn down via `clearConfig()`, which restores the default.)\n if (trustedTypesPolicy === undefined) {\n trustedTypesPolicy = _getDefaultTrustedTypesPolicy();\n }\n // Sign internal variables only when a policy is active. A falsy policy\n // (Trusted Types unsupported, creation failed, or an explicit opt-out)\n // leaves `emptyHTML` as a plain string, so we never call `.createHTML` on\n // a non-policy and throw. See #1422.\n if (trustedTypesPolicy && typeof emptyHTML === 'string') {\n emptyHTML = _createTrustedHTML('');\n }\n }\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n CONFIG = cfg;\n };\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n /**\n * Namespace rules for an element in the SVG namespace.\n *\n * @param tagName the element's lowercase tag name\n * @param parent the (possibly simulated) parent node\n * @param parentTagName the parent's lowercase tag name\n * @returns true if a spec-compliant parser could produce this element\n */\n const _checkSvgNamespace = function _checkSvgNamespace(tagName, parent, parentTagName) {\n // The only way to switch from HTML namespace to SVG\n // is via <svg>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n // The only way to switch from MathML to SVG is via <svg>\n // if the parent is either <annotation-xml> or a MathML\n // text integration point.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n }\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n };\n /**\n * Namespace rules for an element in the MathML namespace.\n *\n * @param tagName the element's lowercase tag name\n * @param parent the (possibly simulated) parent node\n * @param parentTagName the parent's lowercase tag name\n * @returns true if a spec-compliant parser could produce this element\n */\n const _checkMathMlNamespace = function _checkMathMlNamespace(tagName, parent, parentTagName) {\n // The only way to switch from HTML namespace to MathML\n // is via <math>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n // The only way to switch from SVG to MathML is via\n // <math> and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n };\n /**\n * Namespace rules for an element in the HTML namespace.\n *\n * @param tagName the element's lowercase tag name\n * @param parent the (possibly simulated) parent node\n * @param parentTagName the parent's lowercase tag name\n * @returns true if a spec-compliant parser could produce this element\n */\n const _checkHtmlNamespace = function _checkHtmlNamespace(tagName, parent, parentTagName) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n };\n /**\n * @param element a DOM element whose namespace is being checked\n * @returns Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n const _checkValidNamespace = function _checkValidNamespace(element) {\n let parent = getParentNode(element);\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: NAMESPACE,\n tagName: 'template'\n };\n }\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\n if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n return false;\n }\n if (element.namespaceURI === SVG_NAMESPACE) {\n return _checkSvgNamespace(tagName, parent, parentTagName);\n }\n if (element.namespaceURI === MATHML_NAMESPACE) {\n return _checkMathMlNamespace(tagName, parent, parentTagName);\n }\n if (element.namespaceURI === HTML_NAMESPACE) {\n return _checkHtmlNamespace(tagName, parent, parentTagName);\n }\n // For XHTML and XML documents that support custom namespaces\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n return true;\n }\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n // Return false just in case.\n return false;\n };\n /**\n * _forceRemove\n *\n * @param node a DOM node\n */\n const _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, {\n element: node\n });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n getParentNode(node).removeChild(node);\n } catch (_) {\n /* The normal detach failed — this is reached for a parentless node\n (getParentNode() is null, so .removeChild throws). Element.prototype\n .remove() is itself a spec no-op on a parentless node, so a recorded\n \"removal\" would otherwise hand the caller back an intact,\n payload-bearing node (e.g. a detached IN_PLACE root the mXSS canary or\n the style-with-element-child rule decided to kill). Fail closed by\n throwing — exactly as a clobbered root does at the IN_PLACE entry —\n rather than trying to \"neutralize\" the node via its own methods.\n Neutralizing would mean calling getAttributeNames()/removeAttribute()\n on the node, both of which a <form> root can clobber via a named child\n (and _isClobbered does not even probe getAttributeNames), so the\n neutralize step could itself be silently defeated, leaving the payload\n intact. A throw touches only the cached, clobber-safe remove() and\n getParentNode(). Generalizes GHSA-r47g-fvhr-h676 (clobbered-form root)\n to every root-kill reason. REPORT-3.\n This lives inside the catch, so it never fires for a normally-removed\n in-tree node: those have a parent, removeChild() succeeds, and the\n catch is not entered. Only a kept (parentless) root reaches here. */\n remove(node);\n if (!getParentNode(node)) {\n throw typeErrorCreate('a node selected for removal could not be detached from its tree ' + 'and cannot be safely returned; refusing to sanitize in place');\n }\n }\n };\n /**\n * _stripAttributeNode\n *\n * Remove a single Attr node case/namespace-exactly on an attribute-teardown\n * path. Name-based removeAttribute() ASCII-lowercases its lookup key for an\n * HTML element in an HTML document and so silently misses a case-preserved\n * handler (e.g. `ONERROR` off an XML/XHTML import) - the same defect\n * _removeAttribute() was fixed for, which a name-based call would reintroduce\n * on these IN_PLACE teardown paths. Unlike _removeAttribute this does not\n * record into DOMPurify.removed: the neutralize passes intentionally do not\n * book-keep. A clobbered/detached node falls back to best-effort name-based\n * removal.\n *\n * @param element the element to strip the attribute from\n * @param attribute the Attr node to remove\n * @param name the attribute's name, for the fallback path\n */\n const _stripAttributeNode = function _stripAttributeNode(element, attribute, name) {\n try {\n element.removeAttributeNode(attribute);\n } catch (_) {\n try {\n element.removeAttribute(name);\n } catch (_) {}\n }\n };\n /**\n * _neutralizeRoot\n *\n * Fail-closed teardown of an in-place root after the sanitize walk aborts\n * (campaign-3 F2). An internal throw mid-walk — e.g. a page-registered\n * custom element's reaction detaches a node so `_forceRemove`'s deliberate\n * parentless guard throws, or any other re-entrant engine mutation — would\n * otherwise leave the caller's *live* tree half-sanitized, with everything\n * after the abort point still carrying its handlers. There is no safe way\n * to resume the walk (the tree mutated under us), so we strip the root bare:\n * remove every child and every attribute, then let the caller's catch see\n * the original error. Clobber-safe (cached `remove`/`childNodes`/`attributes`\n * getters; the root was already clobber-pre-flighted at the IN_PLACE entry).\n *\n * @param root the in-place root to empty\n */\n const _neutralizeRoot = function _neutralizeRoot(root) {\n /* Strip every disallowed attribute (on* handlers included) off the whole\n subtree BEFORE detaching anything. Detaching first would hand back\n handler-bearing originals (e.g. an already-loading `<img onerror>`)\n whose queued resource event still fires in page scope after we throw.\n Clobber-safe reads; a doomed clobbered node's own attributes are\n irrelevant while its non-clobbered descendants are reached and scrubbed. */\n _neutralizeSubtree(root);\n const childNodes = getChildNodes(root);\n if (childNodes) {\n const snapshot = [];\n arrayForEach(childNodes, child => {\n arrayPush(snapshot, child);\n });\n arrayForEach(snapshot, child => {\n try {\n remove(child);\n } catch (_) {\n /* Best-effort teardown; a still-attached child is handled below */\n }\n });\n }\n const attributes = getAttributes(root);\n if (attributes) {\n for (let i = attributes.length - 1; i >= 0; --i) {\n const attribute = attributes[i];\n const name = attribute && attribute.name;\n if (typeof name === 'string') {\n _stripAttributeNode(root, attribute, name);\n }\n }\n }\n };\n /**\n * _removeAttribute\n *\n * Name-based getAttributeNode()/removeAttribute() ASCII-lowercase their\n * lookup key for HTML elements in an HTML document, so they silently miss an\n * attribute whose stored qualified name still contains uppercase ASCII\n * letters. That happens when the node came from a case-preserving source\n * (an XML/XHTML document imported via importNode(), or createAttributeNS()),\n * where e.g. `ONERROR` survives the walk: the policy check lowercases to\n * `onerror` and rejects it, but `removeAttribute('ONERROR')` looks up\n * `onerror` and finds nothing. Remove the exact Attr node instead, which is\n * case- and namespace-exact, and fall back to name-based removal only when\n * the caller could not supply the node.\n *\n * @param name an Attribute name\n * @param element a DOM node\n * @param attr the exact Attr node to remove, when the caller has it\n */\n const _removeAttribute = function _removeAttribute(name, element, attr) {\n if (!attr) {\n try {\n attr = element.getAttributeNode(name);\n } catch (_) {\n attr = null;\n }\n }\n arrayPush(DOMPurify.removed, {\n attribute: attr || null,\n from: element\n });\n try {\n if (attr) {\n element.removeAttributeNode(attr);\n } else {\n element.removeAttribute(name);\n }\n } catch (_) {\n /* Clobbered or already-detached node - best-effort fall back to a\n name-based removal so the \"is\" handling below still runs. */\n try {\n element.removeAttribute(name);\n } catch (_) {}\n }\n // We void attribute values for unremovable \"is\" attributes\n if (name === 'is') {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(element);\n } catch (_) {}\n } else {\n try {\n element.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n /**\n * _stripDisallowedAttributes\n *\n * Removes every attribute the active configuration does not allow from a\n * single element, using the same allowlist as the main attribute pass (so\n * `on*` handlers go, but no `/^on/` blocklist is introduced). Used only to\n * neutralise nodes that are being discarded from an in-place tree.\n *\n * @param element the element to strip\n */\n const _stripDisallowedAttributes = function _stripDisallowedAttributes(element) {\n const attributes = getAttributes(element);\n if (!attributes) {\n return;\n }\n for (let i = attributes.length - 1; i >= 0; --i) {\n const attribute = attributes[i];\n const name = attribute && attribute.name;\n if (typeof name !== 'string' || ALLOWED_ATTR[transformCaseFunc(name)]) {\n continue;\n }\n _stripAttributeNode(element, attribute, name);\n }\n };\n /**\n * _neutralizeSubtree\n *\n * Completes the audit-5 F1 fix across every removal path. The KEEP_CONTENT\n * move-hoist neutralises only disallowed-tag removals; clobber, mXSS-canary,\n * namespace, comment, processing-instruction and KEEP_CONTENT:false removals\n * all drop their subtree wholesale via `_forceRemove`. On the IN_PLACE path\n * those dropped nodes are detached from the caller's LIVE tree but a\n * handler-bearing original among them (an `<img onerror>`/`<video>` that was\n * loading) keeps its queued resource event, which fires in page scope after\n * sanitize returns. This walks a removed subtree and strips every attribute\n * the active configuration does not allow — so `on*` handlers are cancelled\n * through the SAME allowlist that governs kept nodes, not a separate `/^on/`\n * blocklist. Run synchronously before sanitize returns, i.e. before any\n * queued event can fire. Hook-free by design: these nodes leave the output,\n * so firing attribute hooks for them would be surprising. Clobber-safe reads;\n * a doomed clobbered node may shadow `removeAttribute` (its own attributes are\n * irrelevant — it is discarded — while its non-clobbered descendants, e.g.\n * the `<img>`, are reached and scrubbed).\n *\n * @param root the root of a removed subtree to neutralise\n */\n const _neutralizeSubtree = function _neutralizeSubtree(root) {\n const stack = [root];\n while (stack.length > 0) {\n const node = stack.pop();\n const nodeType = _readNodeType(node);\n if (nodeType === NODE_TYPE.element) {\n _stripDisallowedAttributes(node);\n }\n const childNodes = getChildNodes(node);\n if (childNodes) {\n for (let i = childNodes.length - 1; i >= 0; --i) {\n stack.push(childNodes[i]);\n }\n }\n }\n };\n /**\n * _neutralizePatchLinkage\n *\n * IN_PLACE entry pre-pass (declarative-partial-updates / streaming\n * hardening, https://github.com/WICG/declarative-partial-updates).\n *\n * The main walk strips patch linkage (`for`/`patchsrc`) and removes range\n * markers (PIs / markup comments) node-by-node, in document order, AS it\n * reaches each node. On a live in-place root that leaves a window: from the\n * moment the root is connected until the walk arrives at a given node, that\n * node's linkage is live. A patch applied on connection/stream can fire as\n * a microtask during the walk and inject or teleport an unsanitized DOM\n * range into a region the iterator has already passed and will not revisit,\n * so the post-return \"tree is sanitized\" contract is violated. Sweep the\n * whole tree once up front and sever every linkage before the walk begins,\n * closing that window.\n *\n * This CANNOT undo a patch that already fired before sanitize ran — that is\n * the irreducible \"do not IN_PLACE a live-connected attacker tree\" caveat —\n * but it closes everything from sanitize-start onward. Gated on SAFE_FOR_XML\n * to group with the rest of the declarative-partial-updates handling and\n * stay overridable, consistent with the codebase.\n *\n * Clobber-safe traversal (cached childNodes getter); per-node try/catch so a\n * clobbered root cannot defeat the sweep of its non-clobbered descendants.\n *\n * NOTE (pending real-Chrome confirmation, see test/declarative-patch-probe\n * .html Q1): this mirrors the existing policy of keeping `for` on\n * <label>/<output>. If the shipping feature can drive a patch through a\n * surviving `for`-on-label/output + `id` pair, this pre-pass and the\n * attribute check at _isBasicCustomElement's caller must additionally drop\n * that pair on the IN_PLACE path. Left as-is until the taxonomy is verified.\n *\n * @param root the in-place root to sweep\n */\n /**\n * Central policy for declarative-partial-updates patch-linkage attributes,\n * shared by the _neutralizePatchLinkage pre-pass and _isValidAttribute so\n * the two sites cannot drift: `patchsrc` always links, `for` links\n * everywhere except on <label>/<output>, and the whole policy is gated on\n * SAFE_FOR_XML (see the rationale block in _isValidAttribute).\n *\n * @param lcName the transformCaseFunc'd attribute name\n * @param lcTag the transformCaseFunc'd tag name of the carrying element\n * @return true if the attribute is patch linkage and must be dropped\n */\n const _isPatchLinkageAttribute = function _isPatchLinkageAttribute(lcName, lcTag) {\n if (!SAFE_FOR_XML) {\n return false;\n }\n if (lcName === 'patchsrc') {\n return true;\n }\n return lcName === 'for' && lcTag !== 'label' && lcTag !== 'output';\n };\n const _neutralizePatchLinkage = function _neutralizePatchLinkage(root) {\n if (!SAFE_FOR_XML) {\n return;\n }\n const stack = [root];\n while (stack.length > 0) {\n const node = stack.pop();\n const nodeType = _readNodeType(node);\n /* Remove range markers (the target side of a patch linkage): every\n processing instruction, and any markup-bearing comment. */\n if (nodeType === NODE_TYPE.processingInstruction || nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, node.data)) {\n try {\n remove(node);\n } catch (_) {\n /* Best-effort */\n }\n continue;\n }\n /* Strip patch-source attributes (the source side) off elements. */\n if (nodeType === NODE_TYPE.element) {\n const element = node;\n const lcTag = transformCaseFunc(_readNodeName(node));\n try {\n if (element.hasAttribute && element.hasAttribute('patchsrc')) {\n element.removeAttribute('patchsrc');\n }\n if (element.hasAttribute && element.hasAttribute('for') && _isPatchLinkageAttribute('for', lcTag)) {\n element.removeAttribute('for');\n }\n } catch (_) {\n /* Clobbered removeAttribute/hasAttribute on a doomed node — ignore */\n }\n }\n const childNodes = getChildNodes(node);\n if (childNodes) {\n for (let i = childNodes.length - 1; i >= 0; --i) {\n stack.push(childNodes[i]);\n }\n }\n }\n };\n /**\n * _initDocument\n *\n * @param dirty - a string of dirty markup\n * @return a DOM, filled with the dirty markup\n */\n const _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n let doc = null;\n let leadingWhitespace = null;\n if (FORCE_BODY) {\n dirty = '<remove></remove>' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n }\n const dirtyPayload = trustedTypesPolicy ? _createTrustedHTML(dirty) : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n const body = doc.body || doc.documentElement;\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n /* Work on whole document or just its body */\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n /**\n * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n *\n * @param root The root element or node to start traversing on.\n * @return The created NodeIterator\n */\n const _createNodeIterator = function _createNodeIterator(root) {\n /* Read ownerDocument through the cached Node.prototype getter, never the\n direct property. HTMLFormElement has [LegacyOverrideBuiltIns], so a\n clobbering child (<input name=\"ownerDocument\"> or a form-associated\n external input) shadows the prototype getter and makes a direct read\n return that <input>. createNodeIterator.call(<input>, ...) then throws\n \"Illegal invocation\", and on the IN_PLACE path that throw lands before\n the walk's fail-closed barrier - leaving the caller's live tree, with\n any already-armed handler in it, un-neutralized. The cached getter\n returns the real Document regardless of the clobber. */\n const doc = getOwnerDocument ? getOwnerDocument(root) : root.ownerDocument;\n return createNodeIterator.call(doc || root, root,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n };\n /**\n * Replace template expression syntax (mustache, ERB, template\n * literal) with a space; shared by all SAFE_FOR_TEMPLATES scrub\n * sites. Order matters: mustache, then ERB, then template literal.\n *\n * @param value the string to scrub\n * @returns the scrubbed string\n */\n const _stripTemplateExpressions = function _stripTemplateExpressions(value) {\n value = stringReplace(value, MUSTACHE_EXPR$1, ' ');\n value = stringReplace(value, ERB_EXPR$1, ' ');\n value = stringReplace(value, TMPLIT_EXPR$1, ' ');\n return value;\n };\n /**\n * Strip template-engine expressions ({{...}}, ${...}, <%...%>) from the\n * character data of an element subtree. Used as the final safety net for\n * SAFE_FOR_TEMPLATES on every DOM-returning code path so that expressions\n * which only form after text-node normalization (e.g. fragments split across\n * stripped elements) cannot survive into a template-evaluating framework.\n *\n * Walks text/comment/CDATA/processing-instruction nodes and mutates `.data`\n * in place rather than round-tripping through innerHTML. This preserves\n * descendant node references (important for IN_PLACE callers), avoids a\n * serialize/reparse cycle, and reads literal character data — which means\n * `<%...%>` in text content matches the ERB regex against its real bytes\n * instead of the HTML-entity-escaped form innerHTML would produce.\n *\n * Attribute values are not visited here; SAFE_FOR_TEMPLATES handling for\n * attributes is performed during the per-node `_sanitizeAttributes` pass.\n *\n * @param node The root element whose character data should be scrubbed.\n */\n const _scrubTemplateExpressions2 = function _scrubTemplateExpressions(node) {\n var _node$querySelectorAl;\n node.normalize();\n /* Clobber-safe ownerDocument read, same reasoning as _createNodeIterator:\n under SAFE_FOR_TEMPLATES this runs on the live IN_PLACE root, which may\n carry a form-named-getter override of ownerDocument. */\n const doc = getOwnerDocument ? getOwnerDocument(node) : node.ownerDocument;\n const walker = createNodeIterator.call(doc || node, node,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_PROCESSING_INSTRUCTION, null);\n let currentNode = walker.nextNode();\n while (currentNode) {\n currentNode.data = _stripTemplateExpressions(currentNode.data);\n currentNode = walker.nextNode();\n }\n // NodeIterator does not descend into <template>.content per the DOM spec,\n // so we must explicitly recurse into each template's content fragment,\n // mirroring the approach used by _sanitizeShadowDOM.\n const templates = (_node$querySelectorAl = node.querySelectorAll) === null || _node$querySelectorAl === void 0 ? void 0 : _node$querySelectorAl.call(node, 'template');\n if (templates) {\n arrayForEach(templates, tmpl => {\n if (_isDocumentFragment(tmpl.content)) {\n _scrubTemplateExpressions2(tmpl.content);\n }\n });\n }\n };\n /**\n * _isClobbered\n *\n * Detect DOM-clobbering on HTMLFormElement nodes. Form is the only HTML\n * interface with [LegacyOverrideBuiltIns]; a descendant element with a\n * `name` attribute matching a prototype property shadows that property\n * on direct reads. We use this check at the IN_PLACE entry-point and\n * during attribute sanitization to refuse clobbered forms.\n *\n * @param element element to check for clobbering attacks\n * @return true if clobbered, false if safe\n */\n const _isClobbered = function _isClobbered(element) {\n // Realm-independent tag-name probe. If we can't determine the tag\n // name at all, we can't reason about clobbering — return false\n // (the caller's other defences still apply).\n const realTagName = getNodeName ? getNodeName(element) : null;\n if (typeof realTagName !== 'string') {\n return false;\n }\n if (transformCaseFunc(realTagName) !== 'form') {\n return false;\n }\n return typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' ||\n // Realm-safe NamedNodeMap detection: equality against the cached\n // prototype getter. Clobbered .attributes (e.g. <input name=\"attributes\">)\n // makes the direct read diverge from the cached read; a clean form\n // (same-realm OR foreign-realm) has both reads pointing at the same\n // canonical NamedNodeMap.\n element.attributes !== getAttributes(element) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function' ||\n // NodeType clobbering probe. Cached Node.prototype.nodeType getter\n // returns the integer 1 for any Element regardless of realm; direct\n // read on a clobbered form (e.g. <input name=\"nodeType\">) returns\n // the named child element. Cheap addition — nodeType is read from\n // an internal slot, no serialization cost — and removes a residual\n // clobbering surface used by several mXSS / PI / comment branches\n // in _sanitizeElements that compare currentNode.nodeType directly.\n element.nodeType !== getNodeType(element) ||\n // HTMLFormElement has [LegacyOverrideBuiltIns]: a descendant named\n // \"childNodes\" shadows the prototype getter. Direct reads of\n // form.childNodes from a clobbered form return the named child\n // instead of the real NodeList, so any walk that reads it directly\n // skips the form's real children. Compare the direct read to the\n // cached Node.prototype getter — when the form's named-property\n // getter intercepts the read, the two values differ and we flag\n // the form. This catches every clobbering child type (input,\n // select, etc.) regardless of whether the named child happens to\n // carry a numeric .length, which a typeof-based probe would miss\n // (e.g. HTMLSelectElement.length is a defined unsigned-long).\n element.childNodes !== getChildNodes(element);\n };\n /**\n * Checks whether the given value is a DocumentFragment from any realm.\n *\n * The realm-independent replacement reads `nodeType` through the cached\n * Node.prototype getter and compares to the DOCUMENT_FRAGMENT_NODE\n * constant (11). nodeType is a numeric value resolved from the node's\n * internal slot, identical across realms for the same kind of node.\n *\n * @param value object to check\n * @return true if value is a DocumentFragment-shaped node from any realm\n */\n const _isDocumentFragment = function _isDocumentFragment(value) {\n if (!getNodeType || typeof value !== 'object' || value === null) {\n return false;\n }\n try {\n return getNodeType(value) === NODE_TYPE.documentFragment;\n } catch (_) {\n return false;\n }\n };\n /**\n * Checks whether the given object is a DOM node, including nodes that\n * originate from a different window/realm (e.g. an iframe's\n * contentDocument). The previous `value instanceof Node` check was\n * realm-bound: nodes from a different window failed it, causing\n * sanitize() to silently stringify them and reset IN_PLACE to false,\n * returning the original node unsanitized. See GHSA-4w3q-35jp-p934.\n *\n * @param value object to check whether it's a DOM node\n * @return true if value is a DOM node from any realm\n */\n const _isNode = function _isNode(value) {\n if (!getNodeType || typeof value !== 'object' || value === null) {\n return false;\n }\n try {\n return typeof getNodeType(value) === 'number';\n } catch (_) {\n return false;\n }\n };\n function _executeHooks(hooks, currentNode, data) {\n if (hooks.length === 0) {\n return;\n }\n arrayForEach(hooks, hook => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n }\n /**\n * Structural-threat checks that condemn a node regardless of the\n * allowlists: mXSS via namespace confusion, risky CSS construction,\n * processing instructions, markup-bearing comments. Pure predicate;\n * the caller removes. Check order is load-bearing.\n *\n * @param currentNode the node to inspect\n * @param tagName the node's transformCaseFunc'd tag name\n * @return true if the node must be removed\n */\n const _isUnsafeNode = function _isUnsafeNode(currentNode, tagName) {\n /* Detect mXSS attempts abusing namespace confusion */\n if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.textContent) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.innerHTML)) {\n return true;\n }\n /* Remove rawtext/literal-text elements whose literal serialization\n re-opens markup on an HTML reparse - shapes (a) and (b) documented at\n LITERAL_TEXT_ELEMENTS. Both are invisible to rule 1 above (which\n self-disables once there is an element child, and whose second probe\n reads the innerHTML an XML/XHTML document serializes escaped), which\n is why both probes here read textContent instead. Previously only\n `style`-with-element-child was covered; every element in\n LITERAL_TEXT_ELEMENTS shares this literal serialization and is\n equally affected. */\n if (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && LITERAL_TEXT_ELEMENTS[tagName] && (_isNode(currentNode.firstElementChild) || typeof currentNode.textContent === 'string' && regExpTest(LITERAL_TEXT_CLOSE[tagName], currentNode.textContent))) {\n return true;\n }\n /* Remove any occurrence of processing instructions */\n if (currentNode.nodeType === NODE_TYPE.processingInstruction) {\n return true;\n }\n /* Remove any kind of possibly harmful comments */\n if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, currentNode.data)) {\n return true;\n }\n return false;\n };\n /**\n * Evaluate a CUSTOM_ELEMENT_HANDLING check (a RegExp or a predicate\n * function, per the validation in _parseConfig) against a name.\n * Additional arguments are forwarded to predicate functions - the\n * attributeNameCheck predicate receives the tag name as its second\n * argument. A null/absent check never matches.\n *\n * @param check the configured tagNameCheck / attributeNameCheck value\n * @param name the name to test\n * @param args extra arguments forwarded to a predicate function\n * @return true if the check matches the name\n */\n const _matchesNameCheck = function _matchesNameCheck(check, name) {\n if (check instanceof RegExp) {\n return regExpTest(check, name);\n }\n if (check instanceof Function) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return Boolean(check(name, ...args));\n }\n return false;\n };\n /**\n * Handle a node whose tag is forbidden or not allowlisted: keep\n * allowed custom elements (false return exits _sanitizeElements\n * early - the namespace and fallback-tag removal checks are\n * intentionally skipped for kept custom elements), else hoist\n * content per KEEP_CONTENT and remove.\n *\n * A kept custom element is the ONLY case in which this function\n * returns false, so the caller uses that return value to run the\n * afterSanitizeElements hook on the kept element and keep the\n * element-hook lifecycle consistent with normal allowlisted\n * elements (GHSA-c2j3-45gr-mqc4).\n *\n * @param currentNode the disallowed node\n * @param tagName the node's transformCaseFunc'd tag name\n * @return true if the node was removed, false if kept\n */\n const _sanitizeDisallowedNode = function _sanitizeDisallowedNode(currentNode, tagName, root) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName) && _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n return false;\n }\n /* Keep content except for bad-listed elements.\n Use the cached prototype getters exclusively — the previous code\n had `|| currentNode.parentNode` / `|| currentNode.childNodes`\n fallbacks, but the cached getters always return the canonical\n value (or null for a real parent-less node), so the fallback\n path was dead in safe cases and a clobbering surface in unsafe\n ones. Falsy cached results stay falsy; the `if (childNodes &&\n parentNode)` check already gates correctly. */\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n const parentNode = getParentNode(currentNode);\n const childNodes = getChildNodes(currentNode);\n if (childNodes && parentNode) {\n const childCount = childNodes.length;\n /* Hoist by moving each child up one level rather than deep-cloning\n it. Moving transfers every descendant exactly once, so a chain of\n nested disallowed elements costs O(n) instead of the O(n^2) that\n re-cloning the shrinking subtree at each level produced; it also\n empties the removed original, so `DOMPurify.removed` no longer\n pins whole subtrees. Moving preserves the in-place guarantee too:\n an original carrying already-queued resource events (`<img\n onerror>`, `<video>`/`<audio>` error, lazy/`onload`, …) is\n relocated and sanitised rather than left detached but still armed.\n The sole case that must clone is removing the walk root itself.\n The result is serialised from the root's subtree, so a restrictive\n ALLOWED_TAGS that strips the root (`body` on the string path) must\n leave the content inside it, which only cloning does. In IN_PLACE\n the root is pre-validated as an allowed tag and so is never removed\n here, so that path always takes the move branch.\n `childNodes` is live; a tail-to-head walk keeps `childNodes[i]`\n valid whether we move (drops the trailing entry) or clone (leaves\n the list intact). */\n for (let i = childCount - 1; i >= 0; --i) {\n const hoisted = currentNode === root ? cloneNode(childNodes[i], true) : childNodes[i];\n parentNode.insertBefore(hoisted, getNextSibling(currentNode));\n }\n }\n }\n _forceRemove(currentNode);\n return true;\n };\n /**\n * Fork a hook-mutable allowlist off its shared binding the first time a\n * (possibly lazily-installed) uponSanitize* hook is about to see it, so the\n * hook cannot widen the per-instance default or the setConfig binding by\n * reference and leak past the call. Returns the set unchanged once it is\n * already call-local, so repeated calls across elements are idempotent.\n *\n * @param hookList the uponSanitize* hook array for this event\n * @param set the current ALLOWED_TAGS / ALLOWED_ATTR binding\n * @param defaultSet the per-instance DEFAULT_ALLOWED_* constant\n * @param setConfigSet the captured setConfig() binding, or null\n * @return a call-local clone if a hook is present and set is still shared,\n * else set unchanged\n */\n const _forkSharedAllowlist = function _forkSharedAllowlist(hookList, set, defaultSet, setConfigSet) {\n if (hookList.length === 0) {\n return set;\n }\n return set === defaultSet || set === setConfigSet ? clone(set) : set;\n };\n /**\n * Shared guard for a node that a hook has detached from the walk tree,\n * used after each element-hook site in _sanitizeElements. Detaching is a\n * long-standing user pattern (issue #469; draw.io-style foreignObject\n * filtering). Per the cached, unclobberable parentNode getter the node is\n * genuinely out of the tree, so it can reach neither the serialized\n * output nor an IN_PLACE live tree; treat it as removed and stop\n * processing it. Without this guard, the unsafe-node / namespace checks\n * would call _forceRemove on a parentless node and hit the REPORT-3\n * fail-closed throw — which exists for nodes DOMPurify wants gone but\n * *cannot* detach (clobbered / parentless roots), the opposite of a node\n * that is already safely gone. The walk root is exempt: a detached\n * IN_PLACE root is legitimate input and must still be fully sanitized,\n * and a kill-decision on it must keep hitting the REPORT-3 throw.\n *\n * Nodes detached by hooks stay the hook's responsibility for placement:\n * they are not recorded in DOMPurify.removed, so the post-walk IN_PLACE\n * pass (which iterates DOMPurify.removed) does not reach them. But a\n * hook-detached subtree can still hold a queued resource-event handler -\n * e.g. an <img onload> that began loading when the caller built the live\n * tree - which fires in page scope after sanitize returns even though the\n * handler never reached the returned tree. That is the audit-5 F1 hazard,\n * and the documented node.remove() hook pattern walks straight into it.\n * So on the IN_PLACE path we neutralize the detached subtree inline,\n * stripping its non-allow-listed attributes before returning, exactly as\n * the post-walk pass does for _forceRemove'd subtrees.\n *\n * @param currentNode the node a hook may have detached\n * @param root the current walk root\n * @return true if the node is detached and now handled, false otherwise\n */\n const _handleHookDetachedNode = function _handleHookDetachedNode(currentNode, root) {\n if (currentNode === root || getParentNode(currentNode) !== null) {\n return false;\n }\n if (IN_PLACE) {\n _neutralizeSubtree(currentNode);\n }\n return true;\n };\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n * @param currentNode to check for permission to exist\n * @return true if node was killed, false if left alive\n */\n const _sanitizeElements = function _sanitizeElements(currentNode, root) {\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n /* A hook may have detached the node - treat it as removed (see\n _handleHookDetachedNode for the full rationale). */\n if (_handleHookDetachedNode(currentNode, root)) {\n return true;\n }\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Now let's check the element's type and name */\n const tagName = transformCaseFunc(_readNodeName(currentNode));\n /* Close the pre-walk clone-guard's timing gap: an uponSanitizeElement\n hook may have been installed after that guard sampled the hook arrays\n (e.g. lazily from beforeSanitizeElements), leaving ALLOWED_TAGS still\n aliasing a shared binding that a widening hook would mutate by\n reference. Fork it before exposing it to the hook. */\n ALLOWED_TAGS = _forkSharedAllowlist(hooks.uponSanitizeElement, ALLOWED_TAGS, DEFAULT_ALLOWED_TAGS, SET_CONFIG_ALLOWED_TAGS);\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeElement, currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS\n });\n /* The uponSanitizeElement hook may have detached the node, exactly as\n above (see _handleHookDetachedNode for the full rationale). */\n if (_handleHookDetachedNode(currentNode, root)) {\n return true;\n }\n /* Remove mXSS vectors, processing instructions and risky comments */\n if (_isUnsafeNode(currentNode, tagName)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove element if anything forbids its presence */\n if (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) {\n const removed = _sanitizeDisallowedNode(currentNode, tagName, root);\n /* A false return means the node is a custom element kept via\n CUSTOM_ELEMENT_HANDLING - the only keep path through\n _sanitizeDisallowedNode. Run afterSanitizeElements on it so the\n element-hook lifecycle matches normal allowlisted elements: a\n security policy applied in this hook (e.g. stripping an attribute\n from every surviving element) must not silently skip kept custom\n elements (GHSA-c2j3-45gr-mqc4). This mirrors the normal-element\n tail below - the hook runs, then the walker's subsequent\n _sanitizeAttributes pass sanitizes the element's attributes. The\n deliberately skipped namespace and fallback-tag removal checks stay\n skipped; they are removal decisions, not the hook contract. */\n if (removed === false) {\n _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n }\n return removed;\n }\n /* Check whether element has a valid namespace.\n Realm-safe check (GHSA-hpcv-96wg-7vj8): use the cached Node.prototype\n nodeType getter rather than `instanceof Element`, which is realm-\n bound and short-circuits to false for any node minted in a different\n realm — letting a foreign-realm element with a forbidden namespace\n slip past the namespace check entirely. */\n const nt = _readNodeType(currentNode);\n if (nt === NODE_TYPE.element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Make sure that older browsers don't get fallback-tag mXSS */\n if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(FALLBACK_TAG_CLOSE, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Sanitize element content to be template-safe */\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n /* Get the element's text content */\n const content = _stripTemplateExpressions(currentNode.textContent);\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, {\n element: currentNode.cloneNode()\n });\n currentNode.textContent = content;\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n return false;\n };\n /**\n * _isValidAttribute\n *\n * @param lcTag Lowercase tag name of containing element.\n * @param lcName Lowercase attribute name.\n * @param value Attribute value.\n * @return Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* FORBID_ATTR must always win, even if ADD_ATTR predicate would allow it */\n if (FORBID_ATTR[lcName]) {\n return false;\n }\n /* Reject declarative-partial-updates patch-linkage attributes\n (https://github.com/WICG/declarative-partial-updates).\n Empirical note (Chrome 150, verified — see\n test/declarative-patch-probe-v3.html): expansion is NOT applied after\n sanitization. For the string path it fires during sanitize()'s own\n parse, so the walk sees and sanitizes the fully materialized expanded\n tree — teleports into MathML/SVG integration points included; a\n weaponized `<template for>`->`<img onerror>` comes back with the handler\n stripped. For the IN_PLACE path it fires on connection, before the walk.\n Either way DOMPurify is NOT blind to the patch.\n This removal is therefore defense-in-depth rather than the sole barrier:\n it prevents live linkage from surviving into the OUTPUT and re-expanding\n in the caller's context, and keeps behaviour deterministic if a future\n engine defers expansion. `for` is legitimate only on <label>/<output>;\n anywhere else (notably <template for>) it links the element to a patch\n target and teleports or removes an arbitrary DOM range by id/marker name.\n `patchsrc` fetches remote markup and is treated as a script-loading\n mechanism (CSP). Gated on SAFE_FOR_XML so the removal groups with the\n other structural-threat checks and stays overridable, consistent with\n the rest of the codebase. PI range markers are already removed by\n _isUnsafeNode. */\n if (_isPatchLinkageAttribute(lcName, lcTag)) {\n return false;\n }\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n return false;\n }\n const nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n if (ALLOW_DATA_ATTR && regExpTest(DATA_ATTR$1, lcName)) {\n return true;\n }\n /* Allow valid aria-* attributes, the value is always URI safe */\n if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName)) {\n return true;\n }\n /* A name outside the allowlist is acceptable on custom-element terms\n only. The value checks below are intentionally skipped in that case:\n if the user supplied a tagNameCheck we also allow derived custom\n elements using the same test, and attributes passing the configured\n attributeNameCheck are allowed as custom elements define these at\n their own discretion. */\n if (!nameIsPermitted) {\n return (\n // Condition a) covers a basically valid custom element tag name whose\n // tag passes the configured tagNameCheck and whose attribute name\n // passes the configured attributeNameCheck ...\n _isBasicCustomElement(lcTag) && _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) && _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName, lcTag) ||\n // Condition b) covers an `is` attribute whose value passes the\n // configured tagNameCheck while customized built-in elements are\n // allowed.\n lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && _matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value)\n );\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n if (URI_SAFE_ATTRIBUTES[lcName]) {\n return true;\n }\n /* Check no script, data or unknown possibly unsafe URI\n unless we know URI values are safe for that attribute */\n if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) {\n return true;\n }\n /* Keep image data URIs alive if src/xlink:href is allowed */\n /* Further prevent gadget XSS for dynamically built script tags */\n if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) {\n return true;\n }\n /* Allow unknown protocols: This provides support for links that\n are handled by protocol handlers which may be unknown ahead of\n time, e.g. fb:, spotify: */\n if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) {\n return true;\n }\n /* Only an empty (binary) value remains safe at this point;\n anything else is presumed unsafe, do not add it back */\n return !value;\n };\n /* Names the HTML spec reserves from valid-custom-element-name; these must\n * never be treated as basic custom elements even when a permissive\n * CUSTOM_ELEMENT_HANDLING.tagNameCheck is configured. */\n const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, ['annotation-xml', 'color-profile', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'missing-glyph']);\n /**\n * _isBasicCustomElement\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n *\n * @param tagName name of the tag of the node to sanitize\n * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n */\n const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n return !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT$1, tagName);\n };\n /**\n * Wrap an attribute value in the matching Trusted Types object when\n * the active policy requires it. Namespaced attributes pass through\n * unchanged (no TT support yet, see\n * https://bugs.chromium.org/p/chromium/issues/detail?id=1305293).\n *\n * @param lcTag lowercase tag name of the containing element\n * @param lcName lowercase attribute name\n * @param namespaceURI the attribute's namespace, if any\n * @param value the attribute value to wrap\n * @return the value, wrapped when Trusted Types demand it\n */\n const _applyTrustedTypesToAttribute = function _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value) {\n if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function' && !namespaceURI) {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n {\n return _createTrustedHTML(value);\n }\n case 'TrustedScriptURL':\n {\n return _createTrustedScriptURL(value);\n }\n }\n }\n return value;\n };\n /**\n * Write a modified attribute value back onto the element. On\n * success, re-probe for clobbering introduced by the new value and\n * remove the element when found; otherwise pop the removal entry\n * recorded by the earlier _removeAttribute (long-standing pairing\n * with the SANITIZE_NAMED_PROPS path - do not \"fix\" casually). On\n * failure, remove the attribute instead.\n *\n * @param currentNode the element carrying the attribute\n * @param name the attribute name as present on the element\n * @param namespaceURI the attribute's namespace, if any\n * @param value the new attribute value\n */\n const _setAttributeValue = function _setAttributeValue(currentNode, name, namespaceURI, value) {\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n } else {\n arrayPop(DOMPurify.removed);\n }\n } catch (_) {\n _removeAttribute(name, currentNode);\n }\n };\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param currentNode to sanitize\n */\n const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n const attributes = currentNode.attributes;\n /* Check if we have attributes; if not we might have a text node */\n if (!attributes || _isClobbered(currentNode)) {\n return;\n }\n /* Same lazy-install guard as uponSanitizeElement (see there): fork the\n attribute allowlist off its shared binding before a hook can see it. */\n ALLOWED_ATTR = _forkSharedAllowlist(hooks.uponSanitizeAttribute, ALLOWED_ATTR, DEFAULT_ALLOWED_ATTR, SET_CONFIG_ALLOWED_ATTR);\n const hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR,\n forceKeepAttr: undefined\n };\n let l = attributes.length;\n const lcTag = transformCaseFunc(currentNode.nodeName);\n /* Go backwards over all attributes; safely remove bad ones */\n while (l--) {\n const attr = attributes[l];\n const name = attr.name,\n namespaceURI = attr.namespaceURI,\n attrValue = attr.value;\n const lcName = transformCaseFunc(name);\n const initValue = attrValue;\n let value = name === 'value' ? initValue : stringTrim(initValue);\n /* Execute a hook if present */\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n value = hookEvent.attrValue;\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name') && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode, attr);\n // Prefix the value and later re-create the attribute with the sanitized value\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n // Else: already prefixed, leave the attribute alone — the prefix is\n // itself the clobbering protection, and re-applying it is incorrect.\n /* Work around a security issue with comments inside attributes */\n if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {\n _removeAttribute(name, currentNode, attr);\n continue;\n }\n /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n if (lcName === 'attributename' && stringMatch(value, 'href')) {\n _removeAttribute(name, currentNode, attr);\n continue;\n }\n /* Did the hooks force-keep the attribute? */\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n /* Did the hooks approve of the attribute? */\n if (!hookEvent.keepAttr) {\n _removeAttribute(name, currentNode, attr);\n continue;\n }\n /* Work around a security issue in jQuery 3.0 */\n if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(SELF_CLOSING_TAG, value)) {\n _removeAttribute(name, currentNode, attr);\n continue;\n }\n /* Sanitize attribute content to be template-safe */\n if (SAFE_FOR_TEMPLATES) {\n value = _stripTemplateExpressions(value);\n }\n /* Is `value` valid for this attribute? */\n if (!_isValidAttribute(lcTag, lcName, value)) {\n _removeAttribute(name, currentNode, attr);\n continue;\n }\n /* Handle attributes that require Trusted Types */\n value = _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value);\n /* Handle invalid data-* attribute set by try-catching it */\n if (value !== initValue) {\n _setAttributeValue(currentNode, name, namespaceURI, value);\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n };\n /**\n * _sanitizeShadowDOM\n *\n * @param fragment to iterate over recursively\n */\n const _sanitizeShadowDOM2 = function _sanitizeShadowDOM(fragment) {\n let shadowNode = null;\n const shadowIterator = _createNodeIterator(fragment);\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n /* Sanitize tags and elements */\n _sanitizeElements(shadowNode, fragment);\n /* Check attributes next */\n _sanitizeAttributes(shadowNode);\n /* Deep shadow DOM detected.\n Realm-safe check (GHSA-hpcv-96wg-7vj8): use nodeType against the\n DOCUMENT_FRAGMENT_NODE constant rather than instanceof, so we\n recurse into <template>.content from foreign realms too. */\n if (_isDocumentFragment(shadowNode.content)) {\n _sanitizeShadowDOM2(shadowNode.content);\n }\n /* An element iterated here may itself host an attached\n shadow root. The default NodeIterator does not enter shadow\n trees, so a shadow root nested inside template.content was\n previously reached by no walk at all (the pre-pass at\n _sanitizeAttachedShadowRoots descends via childNodes, which\n doesn't enter template.content; the template-content recursion\n above iterates the content but never inspected shadowRoot).\n Walk it explicitly. The nodeType guard avoids reading\n shadowRoot off text / comment / CDATA / PI nodes that the\n iterator also surfaces. */\n if (_readNodeType(shadowNode) === NODE_TYPE.element) {\n const innerSr = getShadowRoot(shadowNode);\n if (_isDocumentFragment(innerSr)) {\n _sanitizeAttachedShadowRoots(innerSr);\n _sanitizeShadowDOM2(innerSr);\n }\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n };\n /**\n * _sanitizeAttachedShadowRoots\n *\n * Walks `root` and feeds every attached shadow root we encounter into\n * the existing _sanitizeShadowDOM pipeline. The default node iterator\n * does not descend into shadow trees, so nodes inside an attached\n * shadow root would otherwise be skipped entirely.\n *\n * Two real input paths put attached shadow roots in front of us:\n * 1. IN_PLACE on a DOM node that already has shadow roots attached.\n * 2. DOM-node input where importNode(dirty, true) deep-clones the\n * shadow root because it was created with `clonable: true`.\n *\n * This pass runs once, up front, so the main iteration loop (and the\n * existing _sanitizeShadowDOM template-content recursion) stay\n * untouched — string-input paths are not affected.\n *\n * @param root the subtree root to walk for attached shadow roots\n */\n const _sanitizeAttachedShadowRoots = function _sanitizeAttachedShadowRoots(root) {\n /* Iterative (explicit stack) rather than per-child recursion. DOM APIs\n impose no depth cap, so an attacker-shaped tree (JSON/CRDT/editor data\n built straight into the DOM — the IN_PLACE surface) deeper than the JS\n call-stack budget would otherwise overflow native recursion here and\n throw at the IN_PLACE entry pre-pass, before a single node is\n sanitized, leaving the caller's live tree untouched (fail-open). See\n campaign-3 F4. A heap stack keeps depth off the call stack.\n Each work item is either a node to descend into, or a deferred\n `_sanitizeShadowDOM` for an already-walked shadow root. The deferred\n form preserves the original post-order discipline: a shadow root's\n nested shadow roots are discovered before the outer shadow is\n sanitized (which may remove hosts). Pushes are in reverse of the\n desired processing order (LIFO): template content, then children, then\n the shadow-sanitize, then the shadow walk — so the order matches the\n previous recursion exactly. */\n const stack = [{\n node: root,\n shadow: null\n }];\n while (stack.length > 0) {\n const item = stack.pop();\n /* Deferred shadow-DOM sanitisation: runs after its subtree was walked. */\n if (item.shadow) {\n _sanitizeShadowDOM2(item.shadow);\n continue;\n }\n const node = item.node;\n const nodeType = _readNodeType(node);\n const isElement = nodeType === NODE_TYPE.element;\n /* (pushed last → processed first) Children, snapshotted in reverse so\n the first child is processed first. Snapshotting matters because a\n hook may detach siblings mid-walk. */\n const childNodes = getChildNodes(node);\n if (childNodes) {\n for (let i = childNodes.length - 1; i >= 0; --i) {\n stack.push({\n node: childNodes[i],\n shadow: null\n });\n }\n }\n /* (pushed before children → processed after them, matching the old\n \"template content last\" order) When the node is a <template>,\n descend into its content. */\n if (isElement) {\n const rootName = getNodeName ? getNodeName(node) : null;\n if (typeof rootName === 'string' && transformCaseFunc(rootName) === 'template') {\n const content = node.content;\n if (_isDocumentFragment(content)) {\n stack.push({\n node: content,\n shadow: null\n });\n }\n }\n }\n /* Shadow root (processed first): walk its subtree, then sanitise it.\n Realm-safe check (GHSA-hpcv-96wg-7vj8): nodeType-based detection\n rather than `instanceof DocumentFragment`, which is realm-bound and\n silently skipped foreign-realm shadow roots (e.g.\n iframe.contentDocument attachShadow). */\n if (isElement) {\n const sr = getShadowRoot(node);\n if (_isDocumentFragment(sr)) {\n /* Push the deferred sanitise first so it pops after the shadow\n walk we push next, i.e. nested shadow roots are discovered\n before this one is sanitised. */\n stack.push({\n node: null,\n shadow: sr\n }, {\n node: sr,\n shadow: null\n });\n }\n }\n }\n };\n // eslint-disable-next-line complexity\n DOMPurify.sanitize = function (dirty) {\n let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let body = null;\n let importedNode = null;\n let currentNode = null;\n let returnNode = null;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n IS_EMPTY_INPUT = !dirty;\n if (IS_EMPTY_INPUT) {\n dirty = '<!-->';\n }\n /* Stringify, in case dirty is an object */\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n dirty = stringifyValue(dirty);\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n }\n /* Return dirty HTML if DOMPurify cannot run */\n if (!DOMPurify.isSupported) {\n return dirty;\n }\n /* Assign config vars */\n if (SET_CONFIG) {\n /* Persistent setConfig() path: _parseConfig is skipped, so the sets are\n * not re-derived per call. Restore them from the pristine bindings\n * captured at setConfig() time so a previous call's hook clone (mutated\n * below) does not carry over. */\n ALLOWED_TAGS = SET_CONFIG_ALLOWED_TAGS;\n ALLOWED_ATTR = SET_CONFIG_ALLOWED_ATTR;\n } else {\n _parseConfig(cfg);\n }\n /* Clone the hook-mutable allowlists before the walk whenever an\n * uponSanitize* hook is registered. The hook event exposes ALLOWED_TAGS\n * and ALLOWED_ATTR by reference (as allowedTags / allowedAttributes), so\n * a hook that widens them would otherwise mutate the shared set\n * permanently: across later calls and across every element. Cloning per\n * walk keeps documented in-call widening working while scoping it to the\n * call. A single guard for both config paths - the per-call path rebinds\n * the sets in _parseConfig each call, the persistent path restores them\n * from the captured bindings just above - so the two cannot diverge. */\n if (hooks.uponSanitizeElement.length > 0 || hooks.uponSanitizeAttribute.length > 0) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n if (hooks.uponSanitizeAttribute.length > 0) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n /* Clean up removed elements */\n DOMPurify.removed = [];\n /* Resolve IN_PLACE for this call without mutating persistent config.\n Writing the IN_PLACE closure variable here leaks under setConfig(),\n where _parseConfig is skipped on later calls: a single string call would\n disable in-place mode for every subsequent node call, returning a\n sanitized copy while leaving the caller's node — which in-place callers\n keep using and whose return value they ignore — unsanitized. REPORT-2. */\n const inPlace = IN_PLACE && typeof dirty !== 'string' && _isNode(dirty);\n if (inPlace) {\n /* Declarative-partial-updates / streaming pre-pass: sever every patch\n linkage across the live tree BEFORE the walk, so no patch can fire\n mid-walk and inject into an already-processed region. Runs first, so\n it also covers the forbidden/clobbered roots that throw below. */\n _neutralizePatchLinkage(dirty);\n /* Do some early pre-sanitization to avoid unsafe root nodes.\n Read nodeName through the cached prototype getter — a clobbering\n child named \"nodeName\" on the form root would otherwise shadow\n the property and let this check skip the root-allowlist\n validation entirely. */\n const nn = _readNodeName(dirty);\n if (typeof nn === 'string') {\n const tagName = transformCaseFunc(nn);\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n /* Fail closed on a live root: neutralize handlers/children before\n throwing, exactly as the mid-walk abort path does. */\n _neutralizeRoot(dirty);\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n /* Pre-flight the root through _isClobbered. The iterator-driven\n removal path can not detach a parent-less root: _forceRemove\n falls through to Element.prototype.remove(), which per spec\n is a no-op on a node with no parent. A clobbered root would\n then survive the main loop with its attributes uninspected,\n because _sanitizeAttributes early-returns on _isClobbered. The\n result would be an attacker-controlled form, complete with any\n event-handler attributes the caller passed in, handed back to\n the application unsanitized. Refuse to sanitize such a root\n the same way we refuse a forbidden tag. GHSA-r47g-fvhr-h676. */\n if (_isClobbered(dirty)) {\n /* Fail closed on a live clobbered root before throwing.\n _neutralizeRoot's reads are clobber-safe (cached getters); the\n form's non-clobbered descendants, e.g. an armed <img>, are scrubbed. */\n _neutralizeRoot(dirty);\n throw typeErrorCreate('root node is clobbered and cannot be sanitized in-place');\n }\n /* Sanitize attached shadow roots before the main iterator runs.\n The iterator does not descend into shadow trees. Same fail-closed\n barrier as the main walk (campaign-3 F2): a custom-element reaction\n inside a shadow root could abort this pre-pass before the walk runs,\n which would otherwise leave the entire live tree unsanitized. */\n try {\n _sanitizeAttachedShadowRoots(dirty);\n } catch (error) {\n _neutralizeRoot(dirty);\n throw error;\n }\n } else if (_isNode(dirty)) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('<!---->');\n importedNode = body.ownerDocument.importNode(dirty, true);\n if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n /* Clonable shadow roots are deep-cloned by importNode(); sanitize\n them before the main iterator runs, since the iterator does not\n descend into shadow trees. The walk routes every read through a\n cached prototype getter so clobbering descendants on a form root\n cannot hide a shadow host from this pass. */\n _sanitizeAttachedShadowRoots(importedNode);\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(dirty) : dirty;\n }\n /* Initialize the document to work on */\n body = _initDocument(dirty);\n /* Check we have a DOM node from the data */\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n /* Remove first element node (ours) if FORCE_BODY is set */\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n /* Get node iterator */\n const walkRoot = inPlace ? dirty : body;\n /* Now start iterating over the created document.\n The walk runs inside an exception barrier (campaign-3 F2): a re-entrant\n engine/custom-element mutation can detach a node mid-walk so\n `_forceRemove`'s parentless guard throws, aborting the loop. Without the\n barrier the caller's in-place tree would be left half-sanitized with the\n unvisited tail still armed. _createNodeIterator itself is inside the\n barrier too: constructing the iterator dereferences the root's document,\n and any failure there (e.g. an exotic/clobbered root) must still fail\n closed rather than skip the neutralize. On any throw we fail closed -\n strip the in-place root bare - then rethrow so the existing throw\n contract is preserved. (String/DOM-copy paths never return the partial\n body, so the propagating throw is already fail-closed there.) */\n try {\n const nodeIterator = _createNodeIterator(walkRoot);\n while (currentNode = nodeIterator.nextNode()) {\n /* Sanitize tags and elements */\n _sanitizeElements(currentNode, walkRoot);\n /* Check attributes next */\n _sanitizeAttributes(currentNode);\n /* Shadow DOM detected, sanitize it.\n Realm-safe check (GHSA-hpcv-96wg-7vj8): nodeType-based detection\n instead of instanceof, so foreign-realm <template>.content is\n walked correctly. */\n if (_isDocumentFragment(currentNode.content)) {\n _sanitizeShadowDOM2(currentNode.content);\n }\n }\n } catch (error) {\n if (inPlace) {\n _neutralizeRoot(dirty);\n /* Nodes _forceRemove'd earlier in the aborted walk are already\n detached from the root, so _neutralizeRoot's subtree pass does not\n reach them. Defuse them too, mirroring the success-path loop below. */\n arrayForEach(DOMPurify.removed, entry => {\n if (entry.element) {\n _neutralizeSubtree(entry.element);\n }\n });\n }\n throw error;\n }\n /* If we sanitized `dirty` in-place, return it. */\n if (inPlace) {\n /* Fail-closed completion of the audit-5 F1 fix: every node removed from\n the caller's live tree is detached but may still hold a queued\n resource-event handler that fires in page scope after we return. The\n move-hoist covers only disallowed-tag KEEP_CONTENT removals; strip the\n non-allow-listed attributes off every other removed subtree (clobber,\n mXSS, namespace, comments, KEEP_CONTENT:false, …) so those handlers are\n cancelled before any event can fire. Runs synchronously, pre-return. */\n arrayForEach(DOMPurify.removed, entry => {\n if (entry.element) {\n _neutralizeSubtree(entry.element);\n }\n });\n if (SAFE_FOR_TEMPLATES) {\n _scrubTemplateExpressions2(dirty);\n }\n return dirty;\n }\n /* Return sanitized string or DOM */\n if (RETURN_DOM) {\n if (SAFE_FOR_TEMPLATES) {\n _scrubTemplateExpressions2(body);\n }\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n return returnNode;\n }\n let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n /* Serialize doctype if allowed */\n if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n }\n /* Sanitize final string template-safe */\n if (SAFE_FOR_TEMPLATES) {\n serializedHTML = _stripTemplateExpressions(serializedHTML);\n }\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(serializedHTML) : serializedHTML;\n };\n DOMPurify.setConfig = function () {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n _parseConfig(cfg);\n SET_CONFIG = true;\n SET_CONFIG_ALLOWED_TAGS = ALLOWED_TAGS;\n SET_CONFIG_ALLOWED_ATTR = ALLOWED_ATTR;\n };\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n SET_CONFIG_ALLOWED_TAGS = null;\n SET_CONFIG_ALLOWED_ATTR = null;\n // Drop any caller-supplied Trusted Types policy so it cannot poison later\n // `RETURN_TRUSTED_TYPE` output. The internal default policy (cached, and\n // never recreated — Trusted Types throws on duplicate names) is restored by\n // the next `_parseConfig`. See GHSA-vxr8-fq34-vvx9.\n trustedTypesPolicy = defaultTrustedTypesPolicy;\n emptyHTML = '';\n };\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n const lcTag = transformCaseFunc(tag);\n const lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n /* Reject unknown entry points. Without this, a non-hook key (e.g.\n * '__proto__') indexes off the prototype chain rather than a real\n * hook array, and arrayPush then writes to Object.prototype. Guard\n * with an own-property check against the known hook names. */\n if (!objectHasOwnProperty(hooks, entryPoint)) {\n return;\n }\n arrayPush(hooks[entryPoint], hookFunction);\n };\n DOMPurify.removeHook = function (entryPoint, hookFunction) {\n if (!objectHasOwnProperty(hooks, entryPoint)) {\n return undefined;\n }\n if (hookFunction !== undefined) {\n const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n }\n return arrayPop(hooks[entryPoint]);\n };\n DOMPurify.removeHooks = function (entryPoint) {\n if (!objectHasOwnProperty(hooks, entryPoint)) {\n return;\n }\n hooks[entryPoint] = [];\n };\n DOMPurify.removeAllHooks = function () {\n hooks = _createHooksMap();\n };\n return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","/**\n * marked v18.0.11 - a markdown parser\n * Copyright (c) 2018-2026, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction A(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var R=A();function j(l){R=l}var z={exec:()=>null};function I(l){let e=[];return t=>{let n=Math.max(0,Math.min(3,t-1)),s=e[n];return s||(s=l(n),e[n]=s),s}}function k(l,e=\"\"){let t=typeof l==\"string\"?l:l.source,n={replace:(s,r)=>{let i=typeof r==\"string\"?r:r.source;return i=i.replace(m.caret,\"$1\"),t=t.replace(s,i),n},getRegex:()=>new RegExp(t,e)};return n}var Oe=((l=\"\")=>{try{return!!new RegExp(\"(?<=1)(?<!1)\"+l)}catch{return!1}})(),m={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:l=>new RegExp(`^( {0,3}${l})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:I(l=>new RegExp(`^ {0,${l}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`)),hrRegex:I(l=>new RegExp(`^ {0,${l}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`)),fencesBeginRegex:I(l=>new RegExp(`^ {0,${l}}(?:\\`\\`\\`|~~~)`)),headingBeginRegex:I(l=>new RegExp(`^ {0,${l}}#`)),htmlBeginRegex:I(l=>new RegExp(`^ {0,${l}}<(?:[a-z].*>|!--)`,\"i\")),blockquoteBeginRegex:I(l=>new RegExp(`^ {0,${l}}>`))},Te=/^(?:[ \\t]*(?:\\n|$))+/,we=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,ye=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,q=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Pe=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,U=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,oe=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,ae=k(oe).replace(/bull/g,U).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,\"\").getRegex(),Se=k(oe).replace(/bull/g,U).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),K=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \\t]+\\n)[^\\n]+)*)/,_e=/^[^\\n]+/,W=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,$e=k(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",W).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),Le=k(/^(bull)([ \\t][^\\n]*?)?(?:\\n|$)/).replace(/bull/g,U).getRegex(),Q=\"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",X=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,Ee=k(\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n*|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>[^\\\\n]*\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>[^\\\\n]*\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>[^\\\\n]*\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",X).replace(\"tag\",Q).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),le=l=>k(K).replace(\"hr\",q).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",l).replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",Q).getRegex(),ze=le(/ {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]/),Me=le(/ {0,3}(?:[*+-]|\\d{1,9}[.)])(?:[ \\t]|\\n|$)/),Ae=k(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",Me).getRegex(),J={blockquote:Ae,code:we,def:$e,fences:ye,heading:Pe,hr:q,html:Ee,lheading:ae,list:Le,newline:Te,paragraph:ze,table:z,text:_e},se=k(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",q).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",Q).getRegex(),Ie={...J,lheading:Se,table:se,paragraph:k(K).replace(\"hr\",q).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",se).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]+[^ \\\\t\\\\n]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",Q).getRegex()},Ce={...J,html:k(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",X).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:z,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:k(K).replace(\"hr\",q).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",ae).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()},Be=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,De=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,ue=/^( {2,}|\\\\)\\n(?!\\s*$)/,qe=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,_=/[\\p{P}\\p{S}]/u,C=/[\\s\\p{P}\\p{S}]/u,v=/[^\\s\\p{P}\\p{S}]/u,ve=k(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,C).getRegex(),He=/[\\p{Pi}\\p{Ps}\"']/u,pe=/(?!~)[\\p{P}\\p{S}]/u,Ze=/(?!~)[\\s\\p{P}\\p{S}]/u,Ge=/(?:[^\\s\\p{P}\\p{S}]|~)/u,Qe=k(/link|precode-code|html/,\"g\").replace(\"link\",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(\"precode-\",Oe?\"(?<!`)()\":\"(^^|[^`])\").replace(\"code\",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(\"html\",/<(?! )[^<>]*?>/).getRegex(),ce=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,Ne=k(ce,\"u\").replace(/punct/g,_).getRegex(),je=k(ce,\"u\").replace(/punct/g,pe).getRegex(),Fe=/^(?:\\*+(?:((?!\\*)(?!openQuote)punct)|([^\\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\\s_]))?/,Ue=k(Fe,\"u\").replace(/openQuote/g,He).replace(/punct/g,_).getRegex(),he=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",Ke=k(he,\"gu\").replace(/notPunctSpace/g,v).replace(/punctSpace/g,C).replace(/punct/g,_).getRegex(),We=k(he,\"gu\").replace(/notPunctSpace/g,Ge).replace(/punctSpace/g,Ze).replace(/punct/g,pe).getRegex(),Xe=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)[\\\\s](\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|(?:(?!\\\\*)punct|notPunctSpace)(\\\\*+)(?!\\\\*)(?=notPunctSpace)\",Je=k(Xe,\"gu\").replace(/notPunctSpace/g,v).replace(/punctSpace/g,C).replace(/punct/g,_).getRegex(),Ve=k(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,v).replace(/punctSpace/g,C).replace(/punct/g,_).getRegex(),Ye=\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\\\s](_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)\",et=k(Ye,\"gu\").replace(/notPunctSpace/g,v).replace(/punctSpace/g,C).replace(/punct/g,_).getRegex(),tt=k(/^~~?(?:((?!~)punct)|[^\\s~])/,\"u\").replace(/punct/g,_).getRegex(),nt=\"^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)\",rt=k(nt,\"gu\").replace(/notPunctSpace/g,v).replace(/punctSpace/g,C).replace(/punct/g,_).getRegex(),st=k(/\\\\(punct)/,\"gu\").replace(/punct/g,_).getRegex(),it=k(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),ot=k(X).replace(\"(?:-->|$)\",\"-->\").getRegex(),at=k(\"^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\").replace(\"comment\",ot).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),G=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/,lt=k(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/).replace(\"label\",G).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]+|(?=\\))/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),ke=k(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",G).replace(\"ref\",W).getRegex(),de=k(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",W).getRegex(),ut=k(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",ke).replace(\"nolink\",de).getRegex(),ie=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,V={_backpedal:z,anyPunctuation:st,autolink:it,blockSkip:Qe,br:ue,code:De,del:z,delLDelim:z,delRDelim:z,emStrongLDelim:Ne,emStrongRDelimAst:Ke,emStrongRDelimUnd:Ve,escape:Be,link:lt,nolink:de,punctuation:ve,reflink:ke,reflinkSearch:ut,tag:at,text:qe,url:z},pt={...V,emStrongLDelim:Ue,emStrongRDelimAst:Je,emStrongRDelimUnd:et,link:k(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",G).getRegex(),reflink:k(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",G).getRegex()},F={...V,emStrongRDelimAst:We,emStrongLDelim:je,delLDelim:tt,delRDelim:rt,url:k(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"protocol\",ie).replace(\"email\",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:k(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/).replace(\"protocol\",ie).getRegex()},ct={...F,br:k(ue).replace(\"{2,}\",\"*\").getRegex(),text:k(F.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()},H={normal:J,gfm:Ie,pedantic:Ce},B={normal:V,gfm:F,breaks:ct,pedantic:pt};var ht={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"},ge=l=>ht[l];function T(l,e){if(e){if(m.escapeTest.test(l))return l.replace(m.escapeReplace,ge)}else if(m.escapeTestNoEncode.test(l))return l.replace(m.escapeReplaceNoEncode,ge);return l}function Y(l){try{l=encodeURI(l).replace(m.percentDecode,\"%\")}catch{return null}return l}function ee(l,e){let t=l.replace(m.findPipe,(r,i,o)=>{let u=!1,a=i;for(;--a>=0&&o[a]===\"\\\\\";)u=!u;return u?\"|\":\" |\"}),n=t.split(m.splitPipe),s=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(\"\");for(;s<n.length;s++)n[s]=n[s].trim().replace(m.slashPipe,\"|\");return n}function $(l,e,t){let n=l.length;if(n===0)return\"\";let s=0;for(;s<n;){let r=l.charAt(n-s-1);if(r===e&&!t)s++;else if(r!==e&&t)s++;else break}return l.slice(0,n-s)}function te(l){let e=l.split(`\n`),t=e.length-1;for(;t>=0&&m.blankLine.test(e[t]);)t--;return e.length-t<=2?l:e.slice(0,t+1).join(`\n`)}function fe(l,e){if(l.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<l.length;n++)if(l[n]===\"\\\\\")n++;else if(l[n]===e[0])t++;else if(l[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function me(l,e=0){let t=e,n=\"\";for(let s of l)if(s===\"\t\"){let r=4-t%4;n+=\" \".repeat(r),t+=r}else n+=s,t++;return n}function xe(l,e,t,n,s){let r=e.href,i=e.title||null,o=l[1].replace(s.other.outputLinkReplace,\"$1\"),u=l[0].charAt(0)===\"!\";n.state.inLink=!0;let a=n.state.linkEmitted,p=n.state.inRawBlock;n.state.linkEmitted=!1;let c=n.inlineTokens(o),h=n.state.linkEmitted;if(n.state.linkEmitted=a,n.state.inLink=!1,!u){if(h){n.state.inRawBlock=p;return}n.state.linkEmitted=!0}return{type:u?\"image\":\"link\",raw:t,href:r,title:i,text:o,tokens:c}}function kt(l,e,t){let n=l.match(t.other.indentCodeCompensation);if(n===null)return e;let s=n[1];return e.split(`\n`).map(r=>{let i=r.match(t.other.beginningSpace);if(i===null)return r;let[o]=i;return o.length>=s.length?r.slice(s.length):r}).join(`\n`)}var y=class{options;rules;lexer;constructor(e){this.options=e||R}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:\"space\",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=this.options.pedantic?t[0]:te(t[0]),s=n.replace(this.rules.other.codeRemoveIndent,\"\");return{type:\"code\",raw:n,codeBlockStyle:\"indented\",text:s}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],s=kt(n,t[3]||\"\",this.rules);return{type:\"code\",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,\"$1\"):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let s=$(n,\"#\");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(n=s.trim())}return{type:\"heading\",raw:$(t[0],`\n`),depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:\"hr\",raw:$(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=$(t[0],`\n`).split(`\n`),s=\"\",r=\"\",i=[];for(;n.length>0;){let o=!1,u=[],a;for(a=0;a<n.length;a++)if(this.rules.other.blockquoteStart.test(n[a]))u.push(n[a]),o=!0;else if(!o)u.push(n[a]);else break;n=n.slice(a);let p=u.join(`\n`),c=p.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");s=s?`${s}\n${p}`:p,r=r?`${r}\n${c}`:c;let h=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,i,!0),this.lexer.state.top=h,n.length===0)break;let d=i.at(-1);if(d?.type===\"code\")break;if(d?.type===\"blockquote\"){let O=d,g=n.join(`\n`),w=O.raw+`\n`+g.replace(this.rules.other.blockquoteSetextReplace2,\"\"),E=this.blockquote(w);i[i.length-1]=E,s=`${s}\n${g}`,r=r.substring(0,r.length-O.text.length)+E.text;break}else if(d?.type===\"list\"){let O=d,g=O.raw+`\n`+n.join(`\n`),w=this.list(g);i[i.length-1]=w,s=s.substring(0,s.length-d.raw.length)+w.raw,r=r.substring(0,r.length-O.raw.length)+w.raw,n=g.substring(i.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:s,tokens:i,text:r}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),s=n.length>1,r={type:\"list\",raw:\"\",ordered:s,start:s?+n.slice(0,-1):\"\",loose:!1,items:[]};n=s?`\\\\d{1,9}\\\\${n.slice(-1)}`:`\\\\${n}`,this.options.pedantic&&(n=s?n:\"[*+-]\");let i=this.rules.other.listItemRegex(n),o=!1;for(;e;){let a=!1,p=\"\",c=\"\";if(!(t=i.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let h=me(t[2].split(`\n`,1)[0],t[1].length),d=e.split(`\n`,1)[0],O=!h.trim(),g=0;if(this.options.pedantic?(g=2,c=h.trimStart()):O?g=t[1].length+1:(g=h.search(this.rules.other.nonSpaceChar),g=g>4?1:g,c=h.slice(g),g+=t[1].length),O&&this.rules.other.blankLine.test(d)&&(p+=d+`\n`,e=e.substring(d.length+1),a=!0),!a){let w=this.rules.other.nextBulletRegex(g),E=this.rules.other.hrRegex(g),ne=this.rules.other.fencesBeginRegex(g),re=this.rules.other.headingBeginRegex(g),be=this.rules.other.htmlBeginRegex(g),Re=this.rules.other.blockquoteBeginRegex(g);for(;e;){let N=e.split(`\n`,1)[0],D;if(d=N,this.options.pedantic?(d=d.replace(this.rules.other.listReplaceNesting,\" \"),D=d):D=d.replace(this.rules.other.tabCharGlobal,\" \"),ne.test(d)||re.test(d)||be.test(d)||Re.test(d)||w.test(d)||E.test(d))break;if(D.search(this.rules.other.nonSpaceChar)>=g||!d.trim())c+=`\n`+D.slice(g);else{if(O||h.replace(this.rules.other.tabCharGlobal,\" \").search(this.rules.other.nonSpaceChar)>=4||ne.test(h)||re.test(h)||E.test(h))break;c+=`\n`+d}O=!d.trim(),p+=N+`\n`,e=e.substring(N.length+1),h=D.slice(g)}}r.loose||(o?r.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(o=!0)),r.items.push({type:\"list_item\",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),r.raw+=p}let u=r.items.at(-1);if(u)u.raw=u.raw.trimEnd(),u.text=u.text.trimEnd();else return;r.raw=r.raw.trimEnd();for(let a of r.items)if(this.lexer.state.top=!1,a.tokens=this.lexer.blockTokens(a.text,[]),!r.loose){let p=a.tokens.filter(h=>h.type===\"space\"),c=p.length>0&&p.some(h=>this.rules.other.anyLine.test(h.raw));r.loose=c}for(let a of r.items){let p=a.tokens[0];if(a.task&&(p?.type===\"text\"||p?.type===\"paragraph\")){a.text=a.text.replace(this.rules.other.listReplaceTask,\"\"),p.raw=p.raw.replace(this.rules.other.listReplaceTask,\"\"),p.text=p.text.replace(this.rules.other.listReplaceTask,\"\");for(let h=this.lexer.inlineQueue.length-1;h>=0;h--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[h].src)){this.lexer.inlineQueue[h].src=this.lexer.inlineQueue[h].src.replace(this.rules.other.listReplaceTask,\"\");break}let c=this.rules.other.listTaskCheckbox.exec(a.raw);if(c){let h={type:\"checkbox\",raw:c[0]+\" \",checked:c[0]!==\"[ ]\"};a.checked=h.checked,r.loose?a.tokens[0]&&[\"paragraph\",\"text\"].includes(a.tokens[0].type)&&\"tokens\"in a.tokens[0]&&a.tokens[0].tokens?(a.tokens[0].raw=h.raw+a.tokens[0].raw,a.tokens[0].text=h.raw+a.tokens[0].text,a.tokens[0].tokens.unshift(h)):a.tokens.unshift({type:\"paragraph\",raw:h.raw,text:h.raw,tokens:[h]}):a.tokens.unshift(h)}}else a.task&&(a.task=!1)}if(r.loose)for(let a of r.items){a.loose=!0;for(let p of a.tokens)p.type===\"text\"&&(p.type=\"paragraph\")}return r}}html(e){let t=this.rules.block.html.exec(e);if(t){let n=te(t[0]);return{type:\"html\",block:!0,raw:n,pre:t[1]===\"pre\"||t[1]===\"script\"||t[1]===\"style\",text:n}}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal,\" \"),s=t[2]?t[2].replace(this.rules.other.hrefBrackets,\"$1\").replace(this.rules.inline.anyPunctuation,\"$1\"):\"\",r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,\"$1\"):t[3];return{type:\"def\",tag:n,raw:$(t[0],`\n`),href:s,title:r}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=ee(t[1]),s=t[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),r=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],i={type:\"table\",raw:$(t[0],`\n`),header:[],align:[],rows:[]};if(n.length===s.length){for(let o of s)this.rules.other.tableAlignRight.test(o)?i.align.push(\"right\"):this.rules.other.tableAlignCenter.test(o)?i.align.push(\"center\"):this.rules.other.tableAlignLeft.test(o)?i.align.push(\"left\"):i.align.push(null);for(let o=0;o<n.length;o++)i.header.push({text:n[o],tokens:this.lexer.inline(n[o]),header:!0,align:i.align[o]});for(let o of r)i.rows.push(ee(o,i.header.length).map((u,a)=>({text:u,tokens:this.lexer.inline(u),header:!1,align:i.align[a]})));return i}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let n=t[1].trim();return{type:\"heading\",raw:$(t[0],`\n`),depth:t[2].charAt(0)===\"=\"?1:2,text:n,tokens:this.lexer.inline(n)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`\n`?t[1].slice(0,-1):t[1];return{type:\"paragraph\",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:\"text\",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:\"escape\",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:\"html\",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let i=$(n.slice(0,-1),\"\\\\\");if((n.length-i.length)%2===0)return}else{let i=fe(t[2],\"()\");if(i===-2)return;if(i>-1){let u=(t[0].indexOf(\"!\")===0?5:4)+t[1].length+i;t[2]=t[2].substring(0,i),t[0]=t[0].substring(0,u).trim(),t[3]=\"\"}}let s=t[2],r=\"\";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(s);i&&(s=i[1],r=i[3])}else r=t[3]?t[3].slice(1,-1):\"\";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?s=s.slice(1):s=s.slice(1,-1)),xe(t,{href:s&&s.replace(this.rules.inline.anyPunctuation,\"$1\"),title:r&&r.replace(this.rules.inline.anyPunctuation,\"$1\")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let s=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),r=t[s.toLowerCase()];if(!r){let i=n[0].charAt(0);return{type:\"text\",raw:i,text:i}}return xe(n,r,n[0],this.lexer,this.rules)}}emStrong(e,t,n=\"\"){let s=this.rules.inline.emStrongLDelim.exec(e);if(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(s[1]||s[3]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let i=[...s[0]].length-1,o,u,a=i,p=0,c=s[0][0],h=n===c,d=c===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(d.lastIndex=0,t=t.slice(-1*e.length+i);(s=d.exec(t))!==null;){if(o=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!o)continue;if(u=[...o].length,s[3]||s[4]){a+=u;continue}else if(s[5]||s[6]){if(i%3&&!((i+u)%3)){p+=u;continue}if(h)break}if(a-=u,a>0)continue;u=Math.min(u,u+a+p);let O=[...s[0]][0].length,g=e.slice(0,i+s.index+O+u);if(Math.min(i,u)%2){let E=g.slice(1,-1);return{type:\"em\",raw:g,text:E,tokens:this.lexer.inlineTokens(E)}}let w=g.slice(2,-2);return{type:\"strong\",raw:g,text:w,tokens:this.lexer.inlineTokens(w)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,\" \"),s=this.rules.other.nonSpaceChar.test(n),r=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&r&&(n=n.substring(1,n.length-1)),{type:\"codespan\",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:\"br\",raw:t[0]}}del(e,t,n=\"\"){let s=this.rules.inline.delLDelim.exec(e);if(!s)return;if(!(s[1]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let i=[...s[0]].length-1,o,u,a=i,p=this.rules.inline.delRDelim;for(p.lastIndex=0,t=t.slice(-1*e.length+i);(s=p.exec(t))!==null;){if(o=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!o||(u=[...o].length,u!==i))continue;if(s[3]||s[4]){a+=u;continue}if(a-=u,a>0)continue;u=Math.min(u,u+a);let c=[...s[0]][0].length,h=e.slice(0,i+s.index+c+u),d=h.slice(i,-i);return{type:\"del\",raw:h,text:d,tokens:this.lexer.inlineTokens(d)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,s;return t[2]===\"@\"?(n=t[1],s=\"mailto:\"+n):(n=t[1],s=n),{type:\"link\",raw:t[0],text:n,href:s,tokens:[{type:\"text\",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,s;if(t[2]===\"@\")n=t[0],s=\"mailto:\"+n;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??\"\";while(r!==t[0]);n=t[0],t[1]===\"www.\"?s=\"http://\"+t[0]:s=t[0]}return{type:\"link\",raw:t[0],text:n,href:s,tokens:[{type:\"text\",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:\"text\",raw:t[0],text:t[0],escaped:n}}}};var x=class l{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||R,this.options.tokenizer=this.options.tokenizer||new y,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,top:!0};let t={other:m,block:H.normal,inline:B.normal};this.options.pedantic?(t.block=H.pedantic,t.inline=B.pedantic):this.options.gfm&&(t.block=H.gfm,this.options.breaks?t.inline=B.breaks:t.inline=B.gfm),this.tokenizer.rules=t}static get rules(){return{block:H,inline:B}}static lex(e,t){return new l(t).lex(e)}static lexInline(e,t){return new l(t).inlineTokens(e)}lex(e){e=e.replace(m.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(m.tabCharGlobal,\" \").replace(m.spaceLine,\"\"));let s=1/0;for(;e;){if(e.length<s)s=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let r;if(this.options.extensions?.block?.some(o=>(r=o.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let o=t.at(-1);r.raw.length===1&&o!==void 0?o.raw+=`\n`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let o=t.at(-1);o?.type===\"paragraph\"||o?.type===\"text\"?(o.raw+=(o.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,o.text+=`\n`+r.text,this.inlineQueue.at(-1).src=o.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let o=t.at(-1);o?.type===\"paragraph\"||o?.type===\"text\"?(o.raw+=(o.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,o.text+=`\n`+r.raw,this.inlineQueue.at(-1).src=o.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let i=e;if(this.options.extensions?.startBlock){let o=1/0,u=e.slice(1),a;this.options.extensions.startBlock.forEach(p=>{a=p.call({lexer:this},u),typeof a==\"number\"&&a>=0&&(o=Math.min(o,a))}),o<1/0&&o>=0&&(i=e.substring(0,o+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let o=t.at(-1);n&&o?.type===\"paragraph\"?(o.raw+=(o.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,o.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=o.text):t.push(r),n=i.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let o=t.at(-1);o?.type===\"text\"?(o.raw+=(o.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,o.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=o.text):t.push(r);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}linkInText(e){if(!e.includes(\"[\"))return!1;let t=this.tokenizer.rules.inline.link;for(let n of e.matchAll(this.tokenizer.rules.inline.blockSkip))if(t.test(n[0])&&e.charAt(n.index-1)!==\"!\")return!0;for(let n of e.matchAll(this.tokenizer.rules.inline.reflinkSearch)){let s=n[0],r=s.lastIndexOf(\"[\");if(!(s.charAt(0)===\"!\"||!Object.hasOwn(this.tokens.links,s.slice(r+1,-1)))&&!(r>1&&this.linkInText(s.slice(1,r-1))))return!0}return!1}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let n=e;if(this.tokens.links&&e.includes(\"[\")){let o=this.tokenizer.rules.inline.reflinkSearch,u=a=>{let p=a.lastIndexOf(\"[\");if(!Object.hasOwn(this.tokens.links,a.slice(p+1,-1)))return a;if(p>1&&a.charAt(0)!==\"!\"){let c=a.slice(1,p-1);if(this.linkInText(c))return\"[\"+c.replace(o,u)+\"][\"+\"a\".repeat(a.length-p-2)+\"]\"}return\"[\"+\"a\".repeat(a.length-2)+\"]\"};n=n.replace(o,u)}n=n.replace(this.tokenizer.rules.inline.anyPunctuation,o=>\"+\".repeat(o.length)),n=n.replace(this.tokenizer.rules.inline.blockSkip,(o,u,a)=>{let p=a?a.length:0;return o.slice(0,p)+\"[\"+\"a\".repeat(o.length-p-2)+\"]\"}),n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,r=\"\",i=1/0;for(;e;){if(e.length<i)i=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}s||(r=\"\"),s=!1;let o;if(this.options.extensions?.inline?.some(a=>(o=a.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let a=t.at(-1);o.type===\"text\"&&a?.type===\"text\"?(a.raw+=o.raw,a.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,r)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e,n,r)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let u=e;if(this.options.extensions?.startInline){let a=1/0,p=e.slice(1),c;this.options.extensions.startInline.forEach(h=>{c=h.call({lexer:this},p),typeof c==\"number\"&&c>=0&&(a=Math.min(a,c))}),a<1/0&&a>=0&&(u=e.substring(0,a+1))}if(o=this.tokenizer.inlineText(u)){e=e.substring(o.raw.length),o.raw.slice(-1)!==\"_\"&&(r=o.raw.slice(-1)),s=!0;let a=t.at(-1);a?.type===\"text\"?(a.raw+=o.raw,a.text+=o.text):t.push(o);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t=\"Infinite loop on byte: \"+e;if(this.options.silent)console.error(t);else throw new Error(t)}};var P=class{options;parser;constructor(e){this.options=e||R}space(e){return\"\"}code({text:e,lang:t,escaped:n}){let s=(t||\"\").match(m.notSpaceStart)?.[0],r=e.replace(m.endingNewline,\"\")+`\n`;return s?'<pre><code class=\"language-'+T(s)+'\">'+(n?r:T(r,!0))+`</code></pre>\n`:\"<pre><code>\"+(n?r:T(r,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return\"\"}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,s=\"\";for(let o=0;o<e.items.length;o++){let u=e.items[o];s+=this.listitem(u)}let r=t?\"ol\":\"ul\",i=t&&n!==1?' start=\"'+n+'\"':\"\";return\"<\"+r+i+`>\n`+s+\"</\"+r+`>\n`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return\"<input \"+(e?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t=\"\",n=\"\";for(let r=0;r<e.header.length;r++)n+=this.tablecell(e.header[r]);t+=this.tablerow({text:n});let s=\"\";for(let r=0;r<e.rows.length;r++){let i=e.rows[r];n=\"\";for(let o=0;o<i.length;o++)n+=this.tablecell(i[o]);s+=this.tablerow({text:n})}return s&&(s=`<tbody>${s}</tbody>`),`<table>\n<thead>\n`+t+`</thead>\n`+s+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?\"th\":\"td\";return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${T(e,!0)}</code>`}br(e){return\"<br>\"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let s=this.parser.parseInline(n),r=Y(e);if(r===null)return s;e=r;let i='<a href=\"'+e+'\"';return t&&(i+=' title=\"'+T(t)+'\"'),i+=\">\"+s+\"</a>\",i}image({href:e,title:t,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let r=Y(e);if(r===null)return T(n);e=r;let i=`<img src=\"${e}\" alt=\"${T(n)}\"`;return t&&(i+=` title=\"${T(t)}\"`),i+=\">\",i}text(e){return\"tokens\"in e&&e.tokens?this.parser.parseInline(e.tokens):\"escaped\"in e&&e.escaped?e.text:T(e.text)}};var L=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return\"\"+e}image({text:e}){return\"\"+e}br(){return\"\"}checkbox({raw:e}){return e}};var b=class l{options;renderer;textRenderer;constructor(e){this.options=e||R,this.options.renderer=this.options.renderer||new P,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new L}static parse(e,t){return new l(t).parse(e)}static parseInline(e,t){return new l(t).parseInline(e)}parse(e){this.renderer.parser=this;let t=\"\";for(let n=0;n<e.length;n++){let s=e[n];if(this.options.extensions?.renderers?.[s.type]){let i=s,o=this.options.extensions.renderers[i.type].call({parser:this},i);if(o!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"checkbox\",\"html\",\"def\",\"paragraph\",\"text\"].includes(i.type)){t+=o||\"\";continue}}let r=s;switch(r.type){case\"space\":{t+=this.renderer.space(r);break}case\"hr\":{t+=this.renderer.hr(r);break}case\"heading\":{t+=this.renderer.heading(r);break}case\"code\":{t+=this.renderer.code(r);break}case\"table\":{t+=this.renderer.table(r);break}case\"blockquote\":{t+=this.renderer.blockquote(r);break}case\"list\":{t+=this.renderer.list(r);break}case\"checkbox\":{t+=this.renderer.checkbox(r);break}case\"html\":{t+=this.renderer.html(r);break}case\"def\":{t+=this.renderer.def(r);break}case\"paragraph\":{t+=this.renderer.paragraph(r);break}case\"text\":{t+=this.renderer.text(r);break}default:{let i='Token with \"'+r.type+'\" type was not found.';if(this.options.silent)return console.error(i),\"\";throw new Error(i)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=\"\";for(let s=0;s<e.length;s++){let r=e[s];if(this.options.extensions?.renderers?.[r.type]){let o=this.options.extensions.renderers[r.type].call({parser:this},r);if(o!==!1||![\"escape\",\"html\",\"link\",\"image\",\"checkbox\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(r.type)){n+=o||\"\";continue}}let i=r;switch(i.type){case\"escape\":{n+=t.text(i);break}case\"html\":{n+=t.html(i);break}case\"link\":{n+=t.link(i);break}case\"image\":{n+=t.image(i);break}case\"checkbox\":{n+=t.checkbox(i);break}case\"strong\":{n+=t.strong(i);break}case\"em\":{n+=t.em(i);break}case\"codespan\":{n+=t.codespan(i);break}case\"br\":{n+=t.br(i);break}case\"del\":{n+=t.del(i);break}case\"text\":{n+=t.text(i);break}default:{let o='Token with \"'+i.type+'\" type was not found.';if(this.options.silent)return console.error(o),\"\";throw new Error(o)}}}return n}};var S=class{options;block;constructor(e){this.options=e||R}static passThroughHooks=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\",\"emStrongMask\"]);static passThroughHooksRespectAsync=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?x.lex:x.lexInline}provideParser(e=this.block){return e?b.parse:b.parseInline}};var Z=class{defaults=A();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=b;Renderer=P;TextRenderer=L;Lexer=x;Tokenizer=y;Hooks=S;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let s of e)switch(n=n.concat(t.call(this,s)),s.type){case\"table\":{let r=s;for(let i of r.header)n=n.concat(this.walkTokens(i.tokens,t));for(let i of r.rows)for(let o of i)n=n.concat(this.walkTokens(o.tokens,t));break}case\"list\":{let r=s;n=n.concat(this.walkTokens(r.items,t));break}default:{let r=s;this.defaults.extensions?.childTokens?.[r.type]?this.defaults.extensions.childTokens[r.type].forEach(i=>{let o=r[i].flat(1/0);n=n.concat(this.walkTokens(o,t))}):r.tokens&&(n=n.concat(this.walkTokens(r.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(r=>{if(!r.name)throw new Error(\"extension name required\");if(\"renderer\"in r){let i=t.renderers[r.name];i?t.renderers[r.name]=function(...o){let u=r.renderer.apply(this,o);return u===!1&&(u=i.apply(this,o)),u}:t.renderers[r.name]=r.renderer}if(\"tokenizer\"in r){if(!r.level||r.level!==\"block\"&&r.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");let i=t[r.level];i?i.unshift(r.tokenizer):t[r.level]=[r.tokenizer],r.start&&(r.level===\"block\"?t.startBlock?t.startBlock.push(r.start):t.startBlock=[r.start]:r.level===\"inline\"&&(t.startInline?t.startInline.push(r.start):t.startInline=[r.start]))}\"childTokens\"in r&&r.childTokens&&(t.childTokens[r.name]=r.childTokens)}),s.extensions=t),n.renderer){let r=this.defaults.renderer||new P(this.defaults);for(let i in n.renderer){if(!(i in r))throw new Error(`renderer '${i}' does not exist`);if([\"options\",\"parser\"].includes(i))continue;let o=i,u=n.renderer[o],a=r[o];r[o]=(...p)=>{let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c||\"\"}}s.renderer=r}if(n.tokenizer){let r=this.defaults.tokenizer||new y(this.defaults);for(let i in n.tokenizer){if(!(i in r))throw new Error(`tokenizer '${i}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(i))continue;let o=i,u=n.tokenizer[o],a=r[o];r[o]=(...p)=>{let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c}}s.tokenizer=r}if(n.hooks){let r=this.defaults.hooks||new S;for(let i in n.hooks){if(!(i in r))throw new Error(`hook '${i}' does not exist`);if([\"options\",\"block\"].includes(i))continue;let o=i,u=n.hooks[o],a=r[o];S.passThroughHooks.has(i)?r[o]=p=>{if(this.defaults.async&&S.passThroughHooksRespectAsync.has(i))return(async()=>{let h=await u.call(r,p);return a.call(r,h)})();let c=u.call(r,p);return a.call(r,c)}:r[o]=(...p)=>{if(this.defaults.async)return(async()=>{let h=await u.apply(r,p);return h===!1&&(h=await a.apply(r,p)),h})();let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c}}s.hooks=r}if(n.walkTokens){let r=this.defaults.walkTokens,i=n.walkTokens;s.walkTokens=function(o){let u=[];return u.push(i.call(this,o)),r&&(u=u.concat(r.call(this,o))),u}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return x.lex(e,t??this.defaults)}parser(e,t){return b.parse(e,t??this.defaults)}parseMarkdown(e){return(n,s)=>{let r={...s},i={...this.defaults,...r},o=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&r.async===!1)return o(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));if(typeof n>\"u\"||n===null)return o(new Error(\"marked(): input parameter is undefined or null\"));if(typeof n!=\"string\")return o(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(n)+\", string expected\"));if(i.hooks&&(i.hooks.options=i,i.hooks.block=e),i.async)return(async()=>{let u=i.hooks?await i.hooks.preprocess(n):n,p=await(i.hooks?await i.hooks.provideLexer(e):e?x.lex:x.lexInline)(u,i),c=i.hooks?await i.hooks.processAllTokens(p):p;i.walkTokens&&await Promise.all(this.walkTokens(c,i.walkTokens));let d=await(i.hooks?await i.hooks.provideParser(e):e?b.parse:b.parseInline)(c,i);return i.hooks?await i.hooks.postprocess(d):d})().catch(o);try{i.hooks&&(n=i.hooks.preprocess(n));let a=(i.hooks?i.hooks.provideLexer(e):e?x.lex:x.lexInline)(n,i);i.hooks&&(a=i.hooks.processAllTokens(a)),i.walkTokens&&this.walkTokens(a,i.walkTokens);let c=(i.hooks?i.hooks.provideParser(e):e?b.parse:b.parseInline)(a,i);return i.hooks&&(c=i.hooks.postprocess(c)),c}catch(u){return o(u)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let s=\"<p>An error occurred:</p><pre>\"+T(n.message+\"\",!0)+\"</pre>\";return t?Promise.resolve(s):s}if(t)return Promise.reject(n);throw n}}};var M=new Z;function f(l,e){return M.parse(l,e)}f.options=f.setOptions=function(l){return M.setOptions(l),f.defaults=M.defaults,j(f.defaults),f};f.getDefaults=A;f.defaults=R;function dt(...l){return M.use(...l),f.defaults=M.defaults,j(f.defaults),f}f.use=dt;f.walkTokens=function(l,e){return M.walkTokens(l,e)};f.parseInline=M.parseInline;f.Parser=b;f.parser=b.parse;f.Renderer=P;f.TextRenderer=L;f.Lexer=x;f.lexer=x.lex;f.Tokenizer=y;f.Hooks=S;f.parse=f;var nn=f.options,rn=f.setOptions,sn=f.walkTokens,on=f.parseInline,an=f,ln=b.parse,un=x.lex;export{S as Hooks,x as Lexer,Z as Marked,b as Parser,P as Renderer,L as TextRenderer,y as Tokenizer,R as defaults,A as getDefaults,un as lexer,f as marked,nn as options,an as parse,on as parseInline,ln as parser,rn as setOptions,dt as use,sn as walkTokens};\n//# sourceMappingURL=marked.esm.js.map\n","/** GitHub review comments get their own renderer.\r\n *\r\n * The Host's Markdown component renders untrusted model output, so it\r\n * disables raw HTML by contract — and review bots write HTML: `<sup>`\r\n * footers, `<details>` disclosures, `<img>` badges. Rendered through that\r\n * component those tags arrive as literal text. A pull request comment is a\r\n * different kind of document with a different threat model: it comes from\r\n * GitHub, and rendering it the way GitHub does means parsing GFM and keeping\r\n * a bounded set of HTML — which is what this module does, against an\r\n * allowlist, with everything else dropped by the sanitizer. */\r\nimport DOMPurify from 'dompurify'\r\nimport { Marked } from 'marked'\r\n\r\n/** Tags GitHub itself permits that carry meaning in a review comment.\r\n * Everything outside this list — scripts, styles, iframes, forms, event\r\n * handlers — is removed rather than escaped. */\r\nconst ALLOWED_TAGS = [\r\n 'p', 'br', 'hr', 'div', 'span',\r\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\r\n 'strong', 'em', 'b', 'i', 'del', 's', 'ins', 'mark', 'small', 'sup', 'sub', 'kbd',\r\n 'a', 'img',\r\n 'ul', 'ol', 'li', 'input',\r\n 'blockquote', 'pre', 'code',\r\n 'table', 'thead', 'tbody', 'tr', 'th', 'td',\r\n 'details', 'summary',\r\n]\r\n\r\nconst ALLOWED_ATTR = ['href', 'src', 'alt', 'title', 'align', 'colspan', 'rowspan', 'start', 'type', 'checked', 'disabled', 'open', 'class']\r\n\r\nconst marked = new Marked({ gfm: true, breaks: false, async: false })\r\n\r\n/** Parse one comment body into HTML. Bot machinery written as HTML comments\r\n * disappears here: the sanitizer strips comment nodes, and this drops the\r\n * blank runs they leave behind so the prose keeps its spacing. */\r\nexport function commentBodyHtml(body: string): string {\r\n const source = body\r\n .replace(/<!--[\\s\\S]*?-->/gu, '')\r\n .replace(/[^\\S\\n]+$/gmu, '')\r\n .replace(/\\n{3,}/gu, '\\n\\n')\r\n .trim()\r\n return marked.parse(source) as string\r\n}\r\n\r\n/** Sanitize parsed comment HTML against the allowlist and make every link\r\n * leave the app safely. Returns '' where no DOM exists (server rendering),\r\n * because unsanitized HTML must never reach the caller. */\r\nexport function sanitizeCommentHtml(html: string, purify: typeof DOMPurify = DOMPurify): string {\r\n if (typeof purify.sanitize !== 'function' || purify.isSupported !== true) return ''\r\n return purify.sanitize(html, {\r\n ALLOWED_TAGS,\r\n ALLOWED_ATTR,\r\n ALLOW_DATA_ATTR: false,\r\n // Task-list checkboxes render, but nothing in a comment may be operated.\r\n FORBID_ATTR: ['style', 'srcset', 'formaction', 'form'],\r\n ADD_ATTR: ['target', 'rel'],\r\n })\r\n}\r\n\r\n/** One review comment body, ready for `dangerouslySetInnerHTML`. */\r\nexport function renderCommentBody(body: string, purify: typeof DOMPurify = DOMPurify): string {\r\n return sanitizeCommentHtml(commentBodyHtml(body), purify)\r\n}\r\n\r\n/** Open sanitized links in the browser instead of inside the app shell, and\r\n * keep comment checkboxes inert. Installed once, on import, so no render\r\n * path can reach the sanitizer before its hooks. */\r\nexport function installCommentSanitizerHooks(purify: typeof DOMPurify = DOMPurify): void {\r\n if (typeof purify.addHook !== 'function' || purify.isSupported !== true) return\r\n purify.addHook('afterSanitizeAttributes', node => {\r\n if (node.nodeName === 'A') {\r\n node.setAttribute('target', '_blank')\r\n node.setAttribute('rel', 'noopener noreferrer')\r\n }\r\n if (node.nodeName === 'INPUT') node.setAttribute('disabled', '')\r\n })\r\n}\r\n\r\ninstallCommentSanitizerHooks()\r\n","import { Fragment, useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\r\nimport {\r\n IconChevronDownOutline14,\r\n IconCloseOutline16,\r\n IconFullscreenOutline16,\r\n Menu,\r\n Modal,\r\n Tooltip,\r\n type MenuEntry,\r\n} from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type { RepositoryActionKind, RepositoryActionPreview } from '../repository-actions.ts'\r\nimport type { RepositoryStatus } from '../repository-status.ts'\r\nimport type { ReviewComment, ReviewCommentSide } from '../review-comments.ts'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\nimport type { ClaudeClientProjection } from './projection.ts'\r\nimport { executeRepositoryAction, generateCommitMessage, loadRepositoryActionPreview } from './repository-action-api.ts'\r\nimport { composeCommentsPrompt, loadPullRequestComments, type PullRequestReviewComment } from './pr-feedback-api.ts'\r\nimport { addReviewComment, removeReviewComment } from './review-comment-api.ts'\r\nimport { loadRepositoryFileLines } from './repository-setup-api.ts'\r\nimport { renderCommentBody } from './comment-markdown.ts'\r\nimport { commentLineLabel } from './ClaudeReviewComments.tsx'\r\nimport * as styles from './styles.ts'\r\n\r\nexport interface ClaudeDiffPanelInjected {\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n sessionId: string\r\n maximized: boolean\r\n closeDetails: () => void\r\n toggleMaximized: () => void\r\n /** Submit the composer, seeding the given draft text when it is empty. */\r\n submitPrompt?: (draft: string, mode?: 'append' | 'idle') => boolean\r\n}\r\n\r\nexport interface ClaudeDiffPanelProps extends ClaudeDiffPanelInjected {\r\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\r\n}\r\n\r\nexport interface DiffFile {\r\n readonly path: string\r\n readonly additions: number\r\n readonly deletions: number\r\n readonly lines: readonly string[]\r\n}\r\n\r\nfunction pathFromHeader(line: string): string | undefined {\r\n const match = /^diff --git a\\/(.+) b\\/(.+)$/u.exec(line)\r\n return match?.[2]\r\n}\r\n\r\nexport function parseUnifiedDiff(patch: string): readonly DiffFile[] {\r\n const files: DiffFile[] = []\r\n let path: string | undefined\r\n let lines: string[] = []\r\n const flush = (): void => {\r\n if (path === undefined) return\r\n const content = lines.filter(line => !line.startsWith('diff --git ') && !line.startsWith('index ') && !line.startsWith('--- ') && !line.startsWith('+++ '))\r\n files.push({\r\n path,\r\n additions: content.filter(line => line.startsWith('+')).length,\r\n deletions: content.filter(line => line.startsWith('-')).length,\r\n lines: content,\r\n })\r\n }\r\n for (const line of patch.split(/\\r?\\n/u)) {\r\n const nextPath = pathFromHeader(line)\r\n if (nextPath !== undefined) {\r\n flush()\r\n path = nextPath\r\n lines = [line]\r\n } else if (path !== undefined) lines.push(line)\r\n }\r\n flush()\r\n return files\r\n}\r\n\r\n/** A run of unmodified lines the unified diff left out; `count` is unknown for the tail of the file. */\r\nexport interface DiffGap {\r\n readonly oldStart: number\r\n readonly newStart: number\r\n readonly count?: number\r\n readonly position: 'top' | 'middle' | 'bottom'\r\n}\r\n\r\nexport interface NumberedDiffLine {\r\n readonly line: string\r\n readonly kind: 'add' | 'delete' | 'hunk' | 'context' | 'collapsed'\r\n readonly oldLine?: number\r\n readonly newLine?: number\r\n readonly gap?: DiffGap\r\n}\r\n\r\n/** How many unmodified lines one click on an expander reveals. */\r\nexport const DIFF_EXPAND_STEP = 20\r\n\r\nexport function numberDiffLines(lines: readonly string[]): readonly NumberedDiffLine[] {\r\n const numbered: NumberedDiffLine[] = []\r\n let oldLine = 0\r\n let newLine = 0\r\n let previousOldEnd: number | undefined\r\n let previousNewEnd = 0\r\n // New and deleted files have no unmodified lines around their single hunk.\r\n let expandable = false\r\n for (const line of lines) {\r\n const hunk = /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/u.exec(line)\r\n if (hunk !== null) {\r\n const nextOld = Number(hunk[1])\r\n const nextNew = Number(hunk[3])\r\n const oldCount = Number(hunk[2] ?? 1)\r\n const newCount = Number(hunk[4] ?? 1)\r\n if (previousOldEnd === undefined) {\r\n expandable = oldCount > 0 && newCount > 0\r\n if (expandable && nextOld > 1) numbered.push({ line: '', kind: 'collapsed', gap: { oldStart: 1, newStart: 1, count: nextOld - 1, position: 'top' } })\r\n } else if (nextOld > previousOldEnd) {\r\n numbered.push({ line: '', kind: 'collapsed', gap: { oldStart: previousOldEnd, newStart: previousNewEnd, count: nextOld - previousOldEnd, position: 'middle' } })\r\n }\r\n oldLine = nextOld\r\n newLine = nextNew\r\n previousOldEnd = nextOld + oldCount\r\n previousNewEnd = nextNew + newCount\r\n numbered.push({ line, kind: 'hunk' })\r\n continue\r\n }\r\n if (line.startsWith('+')) {\r\n numbered.push({ line, kind: 'add', newLine })\r\n newLine += 1\r\n } else if (line.startsWith('-')) {\r\n numbered.push({ line, kind: 'delete', oldLine })\r\n oldLine += 1\r\n } else {\r\n numbered.push({ line, kind: 'context', oldLine, newLine })\r\n oldLine += 1\r\n newLine += 1\r\n }\r\n }\r\n if (expandable && previousOldEnd !== undefined) {\r\n numbered.push({ line: '', kind: 'collapsed', gap: { oldStart: previousOldEnd, newStart: previousNewEnd, position: 'bottom' } })\r\n }\r\n return numbered\r\n}\r\n\r\n/**\r\n * Splice revealed working-tree lines (keyed by new-side line number) into the\r\n * collapsed gaps. Expansion only ever grows a gap's edges, so each gap is a\r\n * top run + remaining gap + bottom run; `total` (file line count) turns the\r\n * open-ended tail gap into a bounded one.\r\n */\r\nexport function expandDiffRows(rows: readonly NumberedDiffLine[], revealed: ReadonlyMap<number, string>, total?: number): readonly NumberedDiffLine[] {\r\n const out: NumberedDiffLine[] = []\r\n for (const row of rows) {\r\n const gap = row.gap\r\n if (row.kind !== 'collapsed' || gap === undefined) {\r\n out.push(row)\r\n continue\r\n }\r\n const count = gap.count ?? (total === undefined ? undefined : Math.max(0, total - gap.newStart + 1))\r\n const context = (offset: number): NumberedDiffLine => ({\r\n line: ` ${revealed.get(gap.newStart + offset) ?? ''}`,\r\n kind: 'context',\r\n oldLine: gap.oldStart + offset,\r\n newLine: gap.newStart + offset,\r\n })\r\n let top = 0\r\n while ((count === undefined || top < count) && revealed.has(gap.newStart + top)) top += 1\r\n let bottom = 0\r\n if (count !== undefined) while (bottom < count - top && revealed.has(gap.newStart + count - 1 - bottom)) bottom += 1\r\n for (let offset = 0; offset < top; offset += 1) out.push(context(offset))\r\n const remaining = count === undefined ? undefined : count - top - bottom\r\n if (remaining === undefined || remaining > 0) {\r\n out.push({ ...row, gap: { ...gap, oldStart: gap.oldStart + top, newStart: gap.newStart + top, ...(remaining === undefined ? {} : { count: remaining }) } })\r\n }\r\n if (count !== undefined) for (let offset = count - bottom; offset < count; offset += 1) out.push(context(offset))\r\n }\r\n return out\r\n}\r\n\r\nexport interface ReviewCommentAnchor {\r\n /** Last (anchor) line; the editor and saved comment attach here. */\r\n readonly line: number\r\n readonly side: ReviewCommentSide\r\n /** First line of a multi-line selection. */\r\n readonly startLine?: number\r\n}\r\n\r\n/**\r\n * Anchor for a drag from row `from` to row `to`: every commentable row in\r\n * between on the same side as the first row, collapsed to its first/last line.\r\n */\r\nexport function rangeCommentAnchor(anchors: readonly (ReviewCommentAnchor | undefined)[], from: number, to: number): ReviewCommentAnchor | undefined {\r\n const side = anchors[from]?.side\r\n if (side === undefined) return undefined\r\n const lines = anchors\r\n .slice(Math.min(from, to), Math.max(from, to) + 1)\r\n .flatMap(anchor => (anchor?.side === side ? [anchor.line] : []))\r\n const line = Math.max(...lines)\r\n const startLine = Math.min(...lines)\r\n return startLine < line ? { line, side, startLine } : { line, side }\r\n}\r\n\r\n/** Which working-tree line a comment on this rendered diff row refers to. */\r\nexport function commentAnchorForLine(entry: NumberedDiffLine): ReviewCommentAnchor | undefined {\r\n if (entry.kind === 'add' || entry.kind === 'context') {\r\n return entry.newLine === undefined ? undefined : { line: entry.newLine, side: 'new' }\r\n }\r\n if (entry.kind === 'delete') {\r\n return entry.oldLine === undefined ? undefined : { line: entry.oldLine, side: 'old' }\r\n }\r\n return undefined\r\n}\r\n\r\nfunction DiffLine({ entry, addLabel, selected, onComment, onDragStart, onDragEnter }: {\r\n entry: NumberedDiffLine\r\n addLabel: string\r\n selected: boolean\r\n onComment?: (() => void) | undefined\r\n onDragStart?: (() => void) | undefined\r\n onDragEnter?: (() => void) | undefined\r\n}) {\r\n const style = entry.kind === 'add'\r\n ? styles.diffLineAdd\r\n : entry.kind === 'delete' ? styles.diffLineDelete : entry.kind === 'hunk' ? styles.diffLineHunk : styles.diffLineContext\r\n const lineNumber = entry.oldLine === undefined && entry.newLine === undefined\r\n ? ''\r\n : entry.oldLine === undefined ? String(entry.newLine) : entry.newLine === undefined ? String(entry.oldLine) : String(entry.newLine)\r\n return (\r\n <div className={styles.diffLineRowClass} style={{ ...styles.diffLine, ...style, ...(selected ? styles.diffLineSelected : {}) }} onPointerEnter={onDragEnter}>\r\n <button\r\n type=\"button\"\r\n className={styles.diffCommentButtonClass}\r\n disabled={onComment === undefined}\r\n aria-label={addLabel}\r\n onPointerDown={event => {\r\n if (event.button !== 0 || onDragStart === undefined) return\r\n // Keep the pointer free to enter the rows below/above while dragging, and stop text selection.\r\n event.preventDefault()\r\n if (event.currentTarget.hasPointerCapture?.(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId)\r\n onDragStart()\r\n }}\r\n onClick={event => { if (event.detail === 0) onComment?.() }}\r\n >+</button>\r\n <span style={styles.diffLineNumber}>{lineNumber}</span>\r\n <span style={styles.diffLineMarker}>{entry.kind === 'add' ? '+' : entry.kind === 'delete' ? '−' : ' '}</span>\r\n <span style={styles.diffLineText}>{entry.line.slice(entry.kind === 'hunk' ? 0 : 1)}</span>\r\n </div>\r\n )\r\n}\r\n\r\nfunction ChevronGlyph({ direction }: { direction: 'up' | 'down' }) {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d={direction === 'up' ? 'M3 8.5l4-4 4 4' : 'M3 5.5l4 4 4-4'} />\r\n </svg>\r\n )\r\n}\r\n\r\n/** \"N unmodified lines\" separator with GitHub-style expanders: ↑ above the first hunk, ↑↓ between hunks, ↓ after the last. */\r\nfunction DiffGapRow({ gap, t, busy, onExpand }: { gap: DiffGap; t: ClaudeDiffPanelInjected['t']; busy: boolean; onExpand?: ((gap: DiffGap, direction: 'up' | 'down') => void) | undefined }) {\r\n const button = (direction: 'up' | 'down'): ReactNode => (\r\n <button type=\"button\" style={styles.diffGapButton} disabled={busy || onExpand === undefined} aria-label={t(direction === 'up' ? 'diffExpandUp' : 'diffExpandDown')} title={t(direction === 'up' ? 'diffExpandUp' : 'diffExpandDown')} onClick={() => onExpand?.(gap, direction)}><ChevronGlyph direction={direction} /></button>\r\n )\r\n return (\r\n <div style={{ ...styles.diffLine, ...styles.diffLineHunk }}>\r\n <span style={styles.diffGapControls}>\r\n {gap.position === 'bottom' ? null : button('up')}\r\n {gap.position === 'top' ? null : button('down')}\r\n </span>\r\n <span style={styles.diffLineText}>{gap.count === undefined ? t('diffUnmodifiedTail') : t('diffUnmodifiedLines', { count: gap.count })}</span>\r\n </div>\r\n )\r\n}\r\n\r\nfunction CommentGlyph() {\r\n return (\r\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M14 9.5a2 2 0 0 1-2 2H6l-3.5 2.5V4a2 2 0 0 1 2-2h7.5a2 2 0 0 1 2 2z\" />\r\n </svg>\r\n )\r\n}\r\n\r\ninterface DiffFileSectionProps {\r\n readonly file: DiffFile\r\n /** Repository root the working tree lives in; without it unmodified lines cannot be expanded. */\r\n readonly root: string | undefined\r\n readonly initiallyOpen: boolean\r\n readonly t: ClaudeDiffPanelInjected['t']\r\n readonly comments: readonly ReviewComment[]\r\n readonly ghComments: readonly PullRequestReviewComment[]\r\n readonly editorAnchor: ReviewCommentAnchor | undefined\r\n readonly editorNode: ReactNode\r\n readonly onOpenEditor: (anchor: ReviewCommentAnchor) => void\r\n readonly onRemoveComment: (id: string) => void\r\n}\r\n\r\nfunction DiffFileSection({ file, root, initiallyOpen, t, comments, ghComments, editorAnchor, editorNode, onOpenEditor, onRemoveComment }: DiffFileSectionProps) {\r\n const [open, setOpen] = useState(initiallyOpen)\r\n const [revealed, setRevealed] = useState<ReadonlyMap<number, string>>(() => new Map())\r\n const [total, setTotal] = useState<number>()\r\n const [expanding, setExpanding] = useState(false)\r\n const [drag, setDrag] = useState<{ start: number; end: number }>()\r\n const rows = useMemo(() => expandDiffRows(numberDiffLines(file.lines), revealed, total), [file.lines, revealed, total])\r\n const anchors = useMemo(() => rows.map(commentAnchorForLine), [rows])\r\n const name = file.path.slice(file.path.lastIndexOf('/') + 1)\r\n // Collapsed sections hide their comments, so the header carries the count.\r\n const commentCount = comments.length + ghComments.length\r\n const expand = (gap: DiffGap, direction: 'up' | 'down'): void => {\r\n if (root === undefined || expanding) return\r\n const span = gap.count ?? DIFF_EXPAND_STEP\r\n const size = Math.min(DIFF_EXPAND_STEP, span)\r\n const from = direction === 'down' ? gap.newStart : gap.newStart + span - size\r\n setExpanding(true)\r\n void loadRepositoryFileLines(root, file.path, from, from + size - 1).then(result => {\r\n setRevealed(previous => {\r\n const next = new Map(previous)\r\n result.lines.forEach((text, offset) => next.set(from + offset, text))\r\n return next\r\n })\r\n setTotal(result.total)\r\n }, () => undefined).finally(() => setExpanding(false))\r\n }\r\n useEffect(() => {\r\n if (drag === undefined) return\r\n const finish = (): void => {\r\n setDrag(undefined)\r\n const anchor = rangeCommentAnchor(anchors, drag.start, drag.end)\r\n if (anchor !== undefined) onOpenEditor(anchor)\r\n }\r\n window.addEventListener('pointerup', finish)\r\n window.addEventListener('pointercancel', finish)\r\n return () => {\r\n window.removeEventListener('pointerup', finish)\r\n window.removeEventListener('pointercancel', finish)\r\n }\r\n }, [anchors, drag, onOpenEditor])\r\n const dragLow = drag === undefined ? undefined : Math.min(drag.start, drag.end)\r\n const dragHigh = drag === undefined ? undefined : Math.max(drag.start, drag.end)\r\n const dragSide = drag === undefined ? undefined : anchors[drag.start]?.side\r\n return (\r\n <section style={styles.diffFile}>\r\n <button type=\"button\" style={styles.diffFileHeader} aria-expanded={open} onClick={() => setOpen(value => !value)}>\r\n <span style={{ ...styles.chevron, ...(open ? styles.chevronOpen : {}) }}>›</span>\r\n <span style={styles.diffFilePath}>\r\n <Tooltip label={file.path} side=\"bottom\" delayMs={300} maxWidth={520}>\r\n <span style={styles.diffFileName} aria-label={file.path}>{name}</span>\r\n </Tooltip>\r\n </span>\r\n {commentCount === 0 ? null : (\r\n <span style={styles.diffFileComments} aria-label={t('diffFileComments', { count: commentCount })}>\r\n <CommentGlyph />{commentCount}\r\n </span>\r\n )}\r\n <span style={styles.diffFileStats}><span style={styles.diffAdd}>+{file.additions}</span><span style={styles.diffDelete}>−{file.deletions}</span></span>\r\n </button>\r\n {open ? <div style={styles.diffCode}>{rows.map((entry, index) => {\r\n if (entry.kind === 'collapsed' && entry.gap !== undefined) {\r\n return <DiffGapRow key={`gap:${entry.gap.newStart}`} gap={entry.gap} t={t} busy={expanding} onExpand={root === undefined ? undefined : expand} />\r\n }\r\n const anchor = anchors[index]\r\n const lineComments = anchor === undefined ? [] : comments.filter(comment => comment.line === anchor.line && comment.side === anchor.side)\r\n const ghLineComments = anchor === undefined ? [] : ghComments.filter(comment => comment.line === anchor.line && comment.side === anchor.side)\r\n const editorOpen = anchor !== undefined && editorAnchor !== undefined && editorAnchor.line === anchor.line && editorAnchor.side === anchor.side\r\n const inDrag = dragLow !== undefined && dragHigh !== undefined && index >= dragLow && index <= dragHigh && anchor?.side === dragSide\r\n const inEditorRange = anchor !== undefined && editorAnchor !== undefined && editorAnchor.side === anchor.side\r\n && anchor.line <= editorAnchor.line && anchor.line >= (editorAnchor.startLine ?? editorAnchor.line)\r\n return (\r\n <Fragment key={`${index}:${entry.line}`}>\r\n <DiffLine\r\n entry={entry}\r\n addLabel={t('reviewCommentAdd')}\r\n selected={inDrag || inEditorRange}\r\n onComment={anchor === undefined ? undefined : () => onOpenEditor(anchor)}\r\n onDragStart={anchor === undefined ? undefined : () => setDrag({ start: index, end: index })}\r\n onDragEnter={drag === undefined ? undefined : () => setDrag(current => (current === undefined ? current : { ...current, end: index }))}\r\n />\r\n {lineComments.map(comment => (\r\n <div key={comment.id} style={styles.diffCommentBlock}>\r\n <div style={styles.diffCommentCardMeta}>\r\n <span>{commentLineLabel(comment, t)}</span>\r\n <button type=\"button\" style={styles.reviewCommentChipRemove} aria-label={t('reviewCommentRemove')} onClick={() => onRemoveComment(comment.id)}>×</button>\r\n </div>\r\n <p style={styles.diffCommentCardText}>{comment.text}</p>\r\n </div>\r\n ))}\r\n {ghLineComments.map(comment => (\r\n <div key={`gh-${comment.id}`} style={styles.diffCommentBlock}>\r\n <div style={styles.diffCommentCardMeta}>\r\n <span style={styles.diffGhCommentIdentity}>\r\n {comment.avatarUrl === undefined ? null : (\r\n <img\r\n src={comment.avatarUrl}\r\n alt=\"\"\r\n width={16}\r\n height={16}\r\n loading=\"lazy\"\r\n referrerPolicy=\"no-referrer\"\r\n style={styles.diffGhCommentAvatar}\r\n // A blocked or missing avatar must not leave a broken glyph behind.\r\n onError={event => { event.currentTarget.style.display = 'none' }}\r\n />\r\n )}\r\n <span style={styles.diffGhCommentAuthor}>@{comment.author}</span>\r\n </span>\r\n <a href={comment.url} target=\"_blank\" rel=\"noopener noreferrer\" style={styles.diffGhCommentLink} aria-label={comment.url}>↗</a>\r\n </div>\r\n <div\r\n style={styles.diffCommentCardText}\r\n className=\"dshClaudeDiffCommentBody\"\r\n // Sanitized against this plugin's own allowlist; see comment-markdown.ts.\r\n dangerouslySetInnerHTML={{ __html: renderCommentBody(comment.body) }}\r\n />\r\n </div>\r\n ))}\r\n {editorOpen ? editorNode : null}\r\n </Fragment>\r\n )\r\n })}</div> : null}\r\n </section>\r\n )\r\n}\r\n\r\ninterface ActionDialogState {\r\n readonly action: RepositoryActionKind\r\n readonly preview?: RepositoryActionPreview\r\n readonly loading: boolean\r\n readonly submitting: boolean\r\n readonly error?: string\r\n readonly commit?: string\r\n readonly pullRequestUrl?: string\r\n}\r\n\r\nexport function actionLabel(action: RepositoryActionKind, t: ClaudeDiffPanelInjected['t']): string {\r\n const label = action === 'commit'\r\n ? t('diffCommit')\r\n : action === 'commit-push' ? t('diffCommitPush') : action === 'push' ? t('diffPush') : action === 'merge-pr' ? t('diffMergePr') : action === 'update-branch' ? t('diffUpdateBranch') : t('diffCreatePr')\r\n return label.replace(/[….]+$/u, '')\r\n}\r\n\r\nexport type RepositoryActionAvailability = Readonly<Record<RepositoryActionKind, boolean>>\r\n\r\nexport function repositoryActionAvailability(\r\n repository: Pick<RepositoryStatus, 'status' | 'dirty' | 'detached' | 'remote' | 'pullRequest' | 'upstream' | 'ahead' | 'baseBehind'> | undefined,\r\n): RepositoryActionAvailability {\r\n const ready = repository?.status === 'ready' && repository.detached !== true\r\n const committable = ready && repository.dirty === true\r\n const hasRemote = repository?.remote !== undefined\r\n const hasOpenPullRequest = repository?.pullRequest?.state === 'open'\r\n const pushable = ready && hasRemote && (repository.upstream === false || (repository.ahead ?? 0) > 0)\r\n return {\r\n 'commit': committable,\r\n 'commit-push': committable && hasRemote,\r\n 'push': pushable,\r\n 'create-pr': (committable || pushable) && hasRemote && !hasOpenPullRequest,\r\n 'merge-pr': ready && hasOpenPullRequest && repository?.pullRequest?.draft !== true,\r\n 'update-branch': ready && hasOpenPullRequest && repository?.dirty !== true && (repository?.baseBehind ?? 0) > 0,\r\n }\r\n}\r\n\r\nfunction RestorePanelIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\r\n <path d=\"M1.5 5h3V2h1.4v4.4H1.5V5Zm9.9-3h1.4v3h3v1.4h-4.4V2ZM1.5 9.6h4.4V14H4.5v-3h-3V9.6Zm9.9 0h4.4V11h-3v3h-1.4V9.6Z\" />\r\n </svg>\r\n )\r\n}\r\n\r\nexport function ClaudeDiffPanel({ useClaudeProjection, t, sessionId, maximized, closeDetails, toggleMaximized, submitPrompt }: ClaudeDiffPanelProps) {\r\n const projection = useClaudeProjection(value => value)\r\n const repository = projection.repository\r\n const diff = repository?.diff\r\n const files = useMemo(() => parseUnifiedDiff(diff?.patch ?? ''), [diff?.patch])\r\n const [menuOpen, setMenuOpen] = useState(false)\r\n const [dialog, setDialog] = useState<ActionDialogState>()\r\n const [message, setMessage] = useState('')\r\n const [includeUnstaged, setIncludeUnstaged] = useState(true)\r\n const [prTitle, setPrTitle] = useState('')\r\n const [prBody, setPrBody] = useState('')\r\n const [baseBranch, setBaseBranch] = useState('')\r\n const [draft, setDraft] = useState(true)\r\n const [commentEditor, setCommentEditor] = useState<{ path: string } & ReviewCommentAnchor>()\r\n const [commentDraft, setCommentDraft] = useState('')\r\n const [commentBusy, setCommentBusy] = useState(false)\r\n const [commentError, setCommentError] = useState<string>()\r\n const [localComments, setLocalComments] = useState<readonly ReviewComment[]>([])\r\n const [removedCommentIds, setRemovedCommentIds] = useState<ReadonlySet<string>>(() => new Set())\r\n const actionController = useRef<AbortController>()\r\n const [ghComments, setGhComments] = useState<readonly PullRequestReviewComment[]>([])\r\n const pullNumber = repository?.pullRequest?.state === 'open' ? repository.pullRequest.number : undefined\r\n useEffect(() => {\r\n setGhComments([])\r\n if (pullNumber === undefined) return\r\n const controller = new AbortController()\r\n void loadPullRequestComments(sessionId, pullNumber, controller.signal).then(setGhComments, () => undefined)\r\n return () => { controller.abort() }\r\n }, [pullNumber, sessionId])\r\n // The code container is max-content wide for horizontal scrolling; comment\r\n // editors size against the visible width published through this variable.\r\n const diffViewportObserver = useRef<ResizeObserver>()\r\n const diffBodyRef = useCallback((element: HTMLDivElement | null) => {\r\n diffViewportObserver.current?.disconnect()\r\n diffViewportObserver.current = undefined\r\n if (element === null || typeof ResizeObserver === 'undefined') return\r\n const update = (): void => element.style.setProperty('--dsh-claude-diff-viewport', `${element.clientWidth}px`)\r\n update()\r\n const observer = new ResizeObserver(update)\r\n observer.observe(element)\r\n diffViewportObserver.current = observer\r\n }, [])\r\n useEffect(() => () => diffViewportObserver.current?.disconnect(), [])\r\n const closeDialog = useCallback(() => {\r\n if (dialog?.submitting === true) return\r\n actionController.current?.abort()\r\n actionController.current = undefined\r\n setDialog(undefined)\r\n }, [dialog?.submitting])\r\n // Successful commit/push confirmations dismiss themselves after a short\r\n // beat; a fresh PR stays open because its link is the point of the dialog.\r\n useEffect(() => {\r\n if (dialog?.commit === undefined || dialog.error !== undefined || dialog.pullRequestUrl !== undefined) return\r\n const timer = setTimeout(closeDialog, 1_200)\r\n return () => clearTimeout(timer)\r\n }, [closeDialog, dialog?.commit, dialog?.error, dialog?.pullRequestUrl])\r\n const openAction = useCallback((action: RepositoryActionKind) => {\r\n actionController.current?.abort()\r\n setMenuOpen(false)\r\n setDialog({ action, loading: true, submitting: false })\r\n setMessage('')\r\n setPrTitle('')\r\n setPrBody('')\r\n setBaseBranch('')\r\n setDraft(true)\r\n const controller = new AbortController()\r\n actionController.current = controller\r\n void loadRepositoryActionPreview(sessionId, controller.signal).then(async preview => {\r\n setIncludeUnstaged(preview.hasUnstaged || preview.hasUntracked)\r\n if (action === 'push') {\r\n setDialog({ action, preview, loading: false, submitting: false })\r\n return\r\n }\r\n setDialog({ action, preview, loading: true, submitting: false })\r\n const generated = await generateCommitMessage(sessionId, preview.fingerprint, controller.signal)\r\n setMessage(generated)\r\n setPrTitle(generated)\r\n setPrBody(`Summary: ${generated}\\n\\nChanges:\\n- ${generated}`)\r\n setDialog({ action, preview, loading: false, submitting: false })\r\n }).catch(error => {\r\n if (!controller.signal.aborted) setDialog({ action, loading: false, submitting: false, error: error instanceof Error ? error.message : t('diffActionFailed') })\r\n })\r\n }, [sessionId, t])\r\n const confirm = useCallback(async () => {\r\n if (dialog?.preview === undefined || (dialog.action !== 'push' && message.trim().length === 0)) return\r\n const { error: _error, ...pending } = dialog\r\n setDialog({ ...pending, submitting: true })\r\n try {\r\n const result = await executeRepositoryAction(sessionId, {\r\n action: dialog.action,\r\n fingerprint: dialog.preview.fingerprint,\r\n message,\r\n includeUnstaged,\r\n ...(dialog.action === 'create-pr' ? { prTitle, prBody, ...(baseBranch.trim() === '' ? {} : { baseBranch }), draft } : {}),\r\n })\r\n setDialog({ ...dialog, submitting: false, commit: result.commit, ...(result.pullRequestUrl === undefined ? {} : { pullRequestUrl: result.pullRequestUrl }) })\r\n } catch (error) {\r\n const completedCommit = typeof error === 'object' && error !== null && 'commit' in error && typeof error.commit === 'string' ? error.commit : undefined\r\n setDialog({ ...dialog, submitting: false, error: error instanceof Error ? error.message : t('diffActionFailed'), ...(completedCommit === undefined ? {} : { commit: completedCommit }) })\r\n }\r\n }, [baseBranch, dialog, draft, includeUnstaged, message, prBody, prTitle, sessionId, t])\r\n const openCommentEditor = useCallback((path: string, anchor: ReviewCommentAnchor) => {\r\n setCommentEditor({ path, ...anchor })\r\n setCommentDraft('')\r\n setCommentError(undefined)\r\n }, [])\r\n const closeCommentEditor = useCallback(() => {\r\n setCommentEditor(undefined)\r\n setCommentDraft('')\r\n setCommentError(undefined)\r\n }, [])\r\n const submitComment = useCallback(async () => {\r\n if (commentEditor === undefined || commentDraft.trim().length === 0 || commentBusy) return\r\n setCommentBusy(true)\r\n setCommentError(undefined)\r\n try {\r\n const created = await addReviewComment(sessionId, {\r\n path: commentEditor.path,\r\n line: commentEditor.line,\r\n ...(commentEditor.startLine === undefined ? {} : { startLine: commentEditor.startLine }),\r\n side: commentEditor.side,\r\n text: commentDraft.trim(),\r\n })\r\n setLocalComments(list => [...list, created])\r\n closeCommentEditor()\r\n } catch (error) {\r\n setCommentError(error instanceof Error ? error.message : t('reviewCommentFailed'))\r\n } finally {\r\n setCommentBusy(false)\r\n }\r\n }, [closeCommentEditor, commentBusy, commentDraft, commentEditor, sessionId, t])\r\n const removeComment = useCallback((id: string) => {\r\n setRemovedCommentIds(previous => new Set([...previous, id]))\r\n void removeReviewComment(sessionId, id).catch(() => {\r\n setRemovedCommentIds(previous => {\r\n const next = new Set(previous)\r\n next.delete(id)\r\n return next\r\n })\r\n })\r\n }, [sessionId])\r\n // Locally added comments only bridge the polling gap: once the projection\r\n // reports an id, the server copy is authoritative — dropping the local copy\r\n // lets removals made elsewhere (e.g. the composer chips) disappear here too.\r\n useEffect(() => {\r\n const projected = new Set((projection.reviewComments ?? []).map(comment => comment.id))\r\n setLocalComments(list => (list.some(comment => projected.has(comment.id))\r\n ? list.filter(comment => !projected.has(comment.id))\r\n : list))\r\n setRemovedCommentIds(previous => {\r\n const kept = [...previous].filter(id => projected.has(id))\r\n return kept.length === previous.size ? previous : new Set(kept)\r\n })\r\n }, [projection.reviewComments])\r\n const reviewComments = useMemo(() => {\r\n const merged = new Map<string, ReviewComment>()\r\n for (const comment of projection.reviewComments ?? []) merged.set(comment.id, comment)\r\n for (const comment of localComments) merged.set(comment.id, comment)\r\n for (const id of removedCommentIds) merged.delete(id)\r\n return [...merged.values()]\r\n }, [localComments, projection.reviewComments, removedCommentIds])\r\n useEffect(() => () => actionController.current?.abort(), [])\r\n useEffect(() => {\r\n if (!projection.owned || repository?.status !== 'ready' || diff === undefined) closeDetails()\r\n }, [closeDetails, diff, projection.owned, repository?.status])\r\n if (!projection.owned || repository?.status !== 'ready' || diff === undefined) return null\r\n const branch = repository.detached === true ? t('repositoryDetached') : repository.branch ?? t('repositoryUnknownBranch')\r\n const availability = repositoryActionAvailability(repository)\r\n const anyActionAvailable = availability['commit'] || availability['commit-push'] || availability['push'] || availability['create-pr']\r\n const menuItems: readonly MenuEntry[] = [\r\n { id: 'commit', label: t('diffCommit'), disabled: !availability['commit'] },\r\n { id: 'commit-push', label: t('diffCommitPush'), disabled: !availability['commit-push'] },\r\n { id: 'push', label: t('diffPush'), disabled: !availability['push'] },\r\n { id: 'create-pr', label: t('diffCreatePr'), disabled: !availability['create-pr'] },\r\n ]\r\n const completed = dialog?.commit !== undefined && dialog.error === undefined\r\n const commentEditorNode: ReactNode = commentEditor === undefined ? null : (\r\n <div style={styles.diffCommentBlock}>\r\n <div style={styles.diffCommentRange}>{commentLineLabel(commentEditor, t)}</div>\r\n <textarea\r\n className={styles.diffCommentTextareaClass}\r\n style={styles.diffCommentTextarea}\r\n value={commentDraft}\r\n maxLength={2000}\r\n placeholder={t('reviewCommentPlaceholder')}\r\n autoFocus\r\n onChange={event => setCommentDraft(event.currentTarget.value)}\r\n />\r\n {commentError !== undefined ? <p style={styles.diffCommentError}>{commentError}</p> : null}\r\n <div style={styles.diffCommentActions}>\r\n <button type=\"button\" style={styles.diffCommentActionButton} onClick={closeCommentEditor}>{t('reviewCommentCancel')}</button>\r\n <button type=\"button\" style={{ ...styles.diffCommentActionButton, ...styles.diffCommentSubmitButton }} disabled={commentBusy || commentDraft.trim().length === 0} onClick={() => void submitComment()}>{t('reviewCommentSubmit')}</button>\r\n </div>\r\n </div>\r\n )\r\n return (\r\n <>\r\n <style data-dsh-claude-repository-modal-styles>{styles.detailsCardCss}{styles.diffModalCss}{styles.panelIconButtonCss}{styles.diffCommentCss}{styles.diffCommentMarkdownCss}</style>\r\n <div className={styles.detailsCardClass} style={{ ...styles.diffPanel, ...(maximized ? styles.diffPanelMaximized : {}) }}>\r\n <header style={styles.diffHeader}>\r\n <div style={styles.diffHeaderTitle}><span style={styles.diffHeaderBranch}>{branch}</span><span aria-hidden=\"true\">›</span><span style={styles.diffHeaderLabel}>{t('diffWorkingTree')}</span></div>\r\n <div style={styles.diffHeaderActions}>\r\n <div style={styles.diffSplitButton}>\r\n <button type=\"button\" style={{ ...styles.diffCommitButton, ...(availability['commit'] ? {} : styles.diffActionDisabled) }} disabled={!availability['commit']} onClick={() => openAction('commit')}>{t('diffCommit')}</button>\r\n <Menu open={menuOpen} items={menuItems} onSelect={(id: string) => { if (availability[id as RepositoryActionKind]) openAction(id as RepositoryActionKind) }} onClose={() => setMenuOpen(false)} align=\"end\" portal anchor={\r\n <button type=\"button\" style={{ ...styles.diffCommitMenuButton, ...(anyActionAvailable ? {} : styles.diffActionDisabled) }} disabled={!anyActionAvailable} aria-label={t('diffCommitMenu')} aria-expanded={menuOpen} onClick={() => setMenuOpen(value => !value)}><IconChevronDownOutline14 /></button>\r\n } />\r\n </div>\r\n {ghComments.length > 0 && submitPrompt !== undefined ? (\r\n <button type=\"button\" style={styles.diffPrCommentsButton} title={t('prCommentsSend')} aria-label={t('prCommentsButton', { count: ghComments.length })} onClick={() => submitPrompt(composeCommentsPrompt(ghComments))}>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M2.75 2.75h10.5a1 1 0 0 1 1 1v6.5a1 1 0 0 1-1 1H8.2l-3.2 2.9v-2.9H2.75a1 1 0 0 1-1-1v-6.5a1 1 0 0 1 1-1Z\" />\r\n </svg>\r\n {ghComments.length}\r\n </button>\r\n ) : null}\r\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={maximized ? t('diffRestore') : t('diffMaximize')} onClick={toggleMaximized}>{maximized ? <RestorePanelIcon /> : <IconFullscreenOutline16 />}</button>\r\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('diffClose')} onClick={closeDetails}><IconCloseOutline16 /></button>\r\n </div>\r\n </header>\r\n <div style={styles.diffSummary}>\r\n <span>{t('diffFiles', { count: diff.files })}</span>\r\n <span style={styles.diffAdd}>+{diff.additions}</span>\r\n <span style={styles.diffDelete}>−{diff.deletions}</span>\r\n </div>\r\n <div ref={diffBodyRef} style={styles.diffBody}>\r\n {diff.truncated ? <p style={styles.diffNotice}>{t('diffTruncated')}</p> : null}\r\n {files.length === 0 ? <p style={styles.diffEmpty}>{t('diffEmpty')}</p> : files.map((file, index) => (\r\n <DiffFileSection\r\n key={file.path}\r\n file={file}\r\n root={repository.root}\r\n initiallyOpen={index === 0}\r\n t={t}\r\n comments={reviewComments.filter(comment => comment.path === file.path)}\r\n ghComments={ghComments.filter(comment => comment.path === file.path)}\r\n editorAnchor={commentEditor !== undefined && commentEditor.path === file.path ? commentEditor : undefined}\r\n editorNode={commentEditorNode}\r\n onOpenEditor={anchor => openCommentEditor(file.path, anchor)}\r\n onRemoveComment={removeComment}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n <Modal className=\"dshClaudeRepositoryActionModal\" contentClassName=\"dshClaudeRepositoryActionModalContent\" open={dialog !== undefined} onClose={closeDialog} title={dialog === undefined ? t('diffCommit') : actionLabel(dialog.action, t)} closeLabel={t('diffCancel')} description={t('diffConfirmDescription')} footer={\r\n <div style={styles.diffModalFooter}>\r\n <button type=\"button\" style={{ ...styles.button, ...styles.diffModalButton }} disabled={dialog?.submitting === true} onClick={closeDialog}>{completed ? t('diffDone') : t('diffCancel')}</button>\r\n {!completed ? <button type=\"button\" style={{ ...styles.primaryButton, ...styles.diffModalButton }} disabled={dialog?.loading === true || dialog?.submitting === true || dialog?.preview === undefined || (dialog.action !== 'push' && message.trim() === '')} onClick={() => void confirm()}>{dialog?.submitting === true ? t('diffSubmitting') : t('diffConfirm')}</button> : null}\r\n </div>\r\n }>\r\n {dialog?.loading === true ? <p style={styles.diffModalStatus}>{t('diffGeneratingMessage')}</p> : null}\r\n {dialog?.preview !== undefined ? <div style={styles.diffModalBody}>\r\n <div style={styles.diffModalMeta}><strong style={styles.diffModalMetaText} title={dialog.preview.branch}>{dialog.action === 'push'\r\n ? `${dialog.preview.branch} → ${dialog.preview.upstream ?? `origin/${dialog.preview.branch}`}`\r\n : dialog.preview.branch}</strong><span style={styles.diffModalFileState}>{dialog.action === 'push'\r\n ? t('diffPushAhead', { count: dialog.preview.unpushedTruncated ? `${dialog.preview.unpushedCommits.length}+` : dialog.preview.unpushedCommits.length })\r\n : t('diffFiles', { count: dialog.preview.files.length })}</span></div>\r\n {dialog.action === 'push' ? <>\r\n <div style={styles.diffModalFiles}>{dialog.preview.unpushedCommits.map(commit => <div key={commit.hash} style={styles.diffModalFile}><span style={styles.diffModalFilePath} title={commit.subject}>{commit.subject}</span><span style={styles.diffModalFileState}>{commit.hash.slice(0, 8)}</span></div>)}</div>\r\n <p style={styles.diffModalStatus}>{t('diffPushDescription')}</p>\r\n </> : <>\r\n <div style={styles.diffModalFiles}>{dialog.preview.files.map(file => <div key={file.path} style={styles.diffModalFile}><span style={styles.diffModalFilePath} title={file.path}>{file.path}</span><span style={styles.diffModalFileState}>{file.untracked ? t('diffUntracked') : file.staged && file.unstaged ? t('diffStagedUnstaged') : file.staged ? t('diffStaged') : t('diffUnstaged')}</span></div>)}</div>\r\n <label style={styles.diffModalCheckbox}><input type=\"checkbox\" checked={includeUnstaged} disabled={!dialog.preview.hasUnstaged && !dialog.preview.hasUntracked} onChange={event => setIncludeUnstaged(event.currentTarget.checked)} />{t('diffIncludeUnstaged')}</label>\r\n <label style={styles.diffModalField}>{t('diffCommitMessage')}<textarea style={styles.diffModalTextarea} value={message} maxLength={512} onChange={event => setMessage(event.currentTarget.value)} /></label>\r\n </>}\r\n {dialog.action === 'create-pr' ? <>\r\n <label style={styles.diffModalField}>{t('diffPrTitle')}<input style={styles.diffModalTextInput} value={prTitle} maxLength={256} onChange={event => setPrTitle(event.currentTarget.value)} /></label>\r\n <label style={styles.diffModalField}>{t('diffPrBase')}<input style={styles.diffModalTextInput} value={baseBranch} maxLength={512} placeholder={t('diffPrBaseDefault')} onChange={event => setBaseBranch(event.currentTarget.value)} /></label>\r\n <label style={styles.diffModalField}>{t('diffPrDescription')}<textarea style={{ ...styles.diffModalTextarea, minHeight: 240 }} value={prBody} maxLength={8192} onChange={event => setPrBody(event.currentTarget.value)} /></label>\r\n <label style={styles.diffModalCheckbox}><input type=\"checkbox\" checked={draft} onChange={event => setDraft(event.currentTarget.checked)} />{t('diffPrDraft')}</label>\r\n </> : null}\r\n {dialog.commit !== undefined ? <p style={styles.diffModalSuccess}>{dialog.action === 'push'\r\n ? t('diffPushCompleted', { commit: dialog.commit.slice(0, 8) })\r\n : t('diffCommitCompleted', { commit: dialog.commit.slice(0, 8) })}</p> : null}\r\n {dialog.pullRequestUrl !== undefined ? <a href={dialog.pullRequestUrl} target=\"_blank\" rel=\"noopener noreferrer\">{t('diffOpenPr')}</a> : null}\r\n </div> : null}\r\n {dialog?.error !== undefined ? <p role=\"alert\" style={styles.diffModalError}>{dialog.error}{dialog.commit === undefined ? '' : ` ${t('diffCommitPreserved', { commit: dialog.commit.slice(0, 8) })}`}</p> : null}\r\n </Modal>\r\n </>\r\n )\r\n}\r\n","import { useEffect, useLayoutEffect, useRef, useState, type ReactNode } from 'react'\n\ninterface OverlayBounds {\n readonly left: number\n readonly top: number\n readonly width: number\n readonly height: number\n}\n\nconst useClientLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect\n\nexport function shouldRestoreFromEscape(\n event: Pick<KeyboardEvent, 'key'>,\n root: Pick<Document, 'querySelector'> = document,\n): boolean {\n return event.key === 'Escape' && root.querySelector('[role=\"dialog\"][aria-modal=\"true\"]') === null\n}\n\nexport function workspaceBounds(overlay: HTMLElement): OverlayBounds | undefined {\n const frame = overlay.parentElement\n if (frame === null) return undefined\n const overlayRect = overlay.getBoundingClientRect()\n const candidates = Array.from(frame.children)\n .filter(element => element !== overlay)\n .map(element => element.getBoundingClientRect())\n .filter(rect => rect.width > 0 && rect.height > 0)\n const insetCandidates = candidates.filter(rect => rect.left > overlayRect.left)\n const pool = insetCandidates.length > 0 ? insetCandidates : candidates\n const workspace = pool.reduce<DOMRect | undefined>((largest, rect) => {\n if (largest === undefined || rect.width * rect.height > largest.width * largest.height) return rect\n return largest\n }, undefined)\n if (workspace === undefined) return undefined\n const left = Math.max(0, workspace.left - overlayRect.left)\n const top = Math.max(0, workspace.top - overlayRect.top)\n return {\n left,\n top,\n width: Math.max(0, Math.min(workspace.width, overlayRect.width - left)),\n height: Math.max(0, Math.min(workspace.height, overlayRect.height - top)),\n }\n}\n\nexport function observeWorkspaceBounds(overlay: HTMLElement, listener: (bounds: OverlayBounds) => void): () => void {\n const frame = overlay.parentElement\n if (frame === null) return () => {}\n const update = (): void => {\n const next = workspaceBounds(overlay)\n if (next !== undefined) listener(next)\n }\n update()\n const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(update)\n observer?.observe(frame)\n for (const element of Array.from(frame.children)) observer?.observe(element)\n const mutation = typeof MutationObserver === 'undefined' ? undefined : new MutationObserver(update)\n mutation?.observe(frame, { attributes: true, childList: true })\n window.addEventListener('resize', update)\n return () => {\n observer?.disconnect()\n mutation?.disconnect()\n window.removeEventListener('resize', update)\n }\n}\n\nexport function ClaudeDiffOverlay({ children, onRestore }: { children: ReactNode; onRestore: () => void }) {\n const ref = useRef<HTMLDivElement>(null)\n const [bounds, setBounds] = useState<OverlayBounds>()\n useClientLayoutEffect(() => {\n const overlay = ref.current?.closest<HTMLElement>('[data-shell-overlay]')\n if (overlay === undefined || overlay === null) return\n return observeWorkspaceBounds(overlay, next => {\n setBounds(current => (\n current?.left === next.left && current.top === next.top && current.width === next.width && current.height === next.height\n ? current\n : next\n ))\n })\n }, [])\n useEffect(() => {\n const escape = (event: KeyboardEvent): void => { if (shouldRestoreFromEscape(event)) onRestore() }\n window.addEventListener('keydown', escape)\n return () => window.removeEventListener('keydown', escape)\n }, [onRestore])\n return (\n <div ref={ref} data-dsh-claude-diff-overlay style={{\n position: 'absolute',\n left: bounds?.left ?? 0,\n top: bounds?.top ?? 0,\n width: bounds?.width ?? 0,\n height: bounds?.height ?? 0,\n visibility: bounds === undefined ? 'hidden' : 'visible',\n padding: 8,\n boxSizing: 'border-box',\n background: 'var(--dsw-alias-bg-base)',\n pointerEvents: bounds === undefined ? 'none' : 'auto',\n }}>\n {children}\n </div>\n )\n}\n","import { useEffect, useId, useMemo, useState, type ReactNode } from 'react'\r\nimport {\r\n IconCheckOutline16,\r\n IconChevronDownOutline14,\r\n IconChevronUpOutline14,\r\n IconCloseOutline16,\r\n IconEditOutline16,\r\n IconQueueOutline14,\r\n IconSendOutline14,\r\n IconTrashOutline16,\r\n Tooltip,\r\n} from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\nimport * as styles from './styles.ts'\r\n\r\nexport interface QueueRowView {\r\n readonly id: string\r\n /** Only queued rows accept mutations; steering/context rows are in flight. */\r\n readonly placement: 'queued' | 'steering' | 'context'\r\n readonly preview: string\r\n /** Editable text; null when the message carries non-text blocks. */\r\n readonly text: string | null\r\n}\r\n\r\nexport type QueueActionView =\r\n | { readonly kind: 'remove' }\r\n | { readonly kind: 'steer' }\r\n | { readonly kind: 'edit'; readonly content: readonly { readonly type: 'text'; readonly text: string }[] }\r\n\r\nexport interface QueueSessionSnapshot {\r\n readonly queue: readonly QueueRowView[]\r\n readonly running: boolean\r\n readonly subagent: unknown\r\n}\r\n\r\nexport interface ClaudeQueueDockInjected {\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n updateQueue: (itemId: string, action: QueueActionView) => Promise<void>\r\n notify: (level: 'info' | 'error', text: string) => void\r\n}\r\n\r\nexport interface ClaudeQueueDockProps extends ClaudeQueueDockInjected {\r\n useSession: SnapshotSelectorHook<QueueSessionSnapshot>\r\n}\r\n\r\n/** Replaces the Host queue strip (same slot cell, lower priority) with one\r\n * styled like the repository status bar. Behaviour mirrors the Host strip:\r\n * one row inline, several rows behind a collapsible count, edit/remove/steer. */\r\nexport function ClaudeQueueDock({ useSession, t, updateQueue, notify }: ClaudeQueueDockProps) {\r\n const inbox = useSession(session => session.queue)\r\n const queue = useMemo(() => inbox.filter(row => row.placement === 'queued'), [inbox])\r\n const running = useSession(session => session.running)\r\n const mutable = useSession(session => session.subagent === null)\r\n const [editing, setEditing] = useState<{ id: string; text: string }>()\r\n const [busy, setBusy] = useState<string>()\r\n const [collapsed, setCollapsed] = useState(true)\r\n const listId = useId()\r\n useEffect(() => {\r\n if (queue.length === 0 && !collapsed) setCollapsed(true)\r\n if (editing !== undefined && (!mutable || !queue.some(row => row.id === editing.id))) setEditing(undefined)\r\n }, [collapsed, editing, mutable, queue])\r\n if (queue.length === 0) return null\r\n const interacting = mutable && (editing !== undefined || busy !== undefined)\r\n const expanded = !collapsed || interacting\r\n const listVisible = queue.length === 1 || expanded\r\n const apply = async (id: string, action: QueueActionView, failure: string): Promise<boolean> => {\r\n setBusy(id)\r\n try {\r\n await updateQueue(id, action)\r\n return true\r\n } catch {\r\n notify('error', failure)\r\n return false\r\n } finally {\r\n setBusy(current => (current === id ? undefined : current))\r\n }\r\n }\r\n const saveEdit = async (): Promise<void> => {\r\n if (editing === undefined || editing.text.trim() === '') return\r\n if (await apply(editing.id, { kind: 'edit', content: [{ type: 'text', text: editing.text }] }, t('queueEditFailed'))) setEditing(undefined)\r\n }\r\n const action = (label: string, icon: ReactNode, onClick: () => void, disabled: boolean, hint?: string): ReactNode => (\r\n <Tooltip label={hint ?? label} side=\"bottom\" delayMs={400}>\r\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={label} disabled={disabled} onClick={onClick}>{icon}</button>\r\n </Tooltip>\r\n )\r\n return (\r\n <div style={styles.repositoryBarFrame} data-claude-queue-dock=\"\">\r\n <style data-dsh-claude-queue-styles>{styles.panelIconButtonCss}</style>\r\n <div style={styles.queueBar}>\r\n {queue.length > 1 ? (\r\n <button type=\"button\" style={styles.queueHeader} aria-controls={listId} aria-expanded={expanded} disabled={interacting} onClick={() => { setCollapsed(value => !value) }}>\r\n <span style={styles.queueLead} aria-hidden=\"true\"><IconQueueOutline14 /></span>\r\n <span style={styles.queueCount}>{t('queueCount', { n: queue.length })}</span>\r\n <span style={styles.queueLead} aria-hidden=\"true\">{expanded ? <IconChevronDownOutline14 /> : <IconChevronUpOutline14 />}</span>\r\n </button>\r\n ) : null}\r\n <ul id={listId} style={styles.queueList} hidden={!listVisible}>\r\n {listVisible ? queue.map((row, index) => (\r\n <li key={row.id} style={{ ...styles.queueRow, ...(index > 0 ? styles.queueRowDivider : {}) }}>\r\n {queue.length === 1 ? <span style={styles.queueLead} aria-hidden=\"true\"><IconQueueOutline14 /></span> : null}\r\n {editing?.id === row.id ? (\r\n <input\r\n autoFocus\r\n style={styles.queueEditor}\r\n aria-label={t('queueEdit')}\r\n value={editing.text}\r\n onChange={event => { setEditing({ id: row.id, text: event.currentTarget.value }) }}\r\n onKeyDown={event => {\r\n if (event.key === 'Escape') setEditing(undefined)\r\n else if (event.key === 'Enter' && !event.nativeEvent.isComposing) {\r\n event.preventDefault()\r\n void saveEdit()\r\n }\r\n }}\r\n />\r\n ) : <span style={styles.queuePreview}>{row.preview}</span>}\r\n {mutable ? (\r\n <span style={styles.queueActions}>\r\n {editing?.id === row.id ? <>\r\n {action(t('queueSave'), <IconCheckOutline16 size={14} />, () => { void saveEdit() }, busy !== undefined || editing.text.trim() === '')}\r\n {action(t('queueCancelEdit'), <IconCloseOutline16 size={14} />, () => { setEditing(undefined) }, busy !== undefined)}\r\n </> : <>\r\n {action(t('queueEdit'), <IconEditOutline16 size={14} />, () => { if (row.text !== null) setEditing({ id: row.id, text: row.text }) }, busy !== undefined || row.text === null, row.text === null ? t('queueEditUnsupported') : undefined)}\r\n {action(t('queueRemove'), <IconTrashOutline16 size={14} />, () => { void apply(row.id, { kind: 'remove' }, t('queueRemoveFailed')) }, busy !== undefined)}\r\n {action(t('queueSteer'), <IconSendOutline14 />, () => { void apply(row.id, { kind: 'steer' }, t('queueSteerFailed')) }, busy !== undefined || !running, running ? undefined : t('queueSteerUnavailable'))}\r\n </>}\r\n </span>\r\n ) : null}\r\n </li>\r\n )) : null}\r\n </ul>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import { useEffect, useMemo, useState, useSyncExternalStore } from 'react'\r\nimport { IconCloseOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport type { RepositoryStatus } from '../repository-status.ts'\r\nimport type { ClaudeActivityEvent } from '../events.ts'\r\nimport { autoFixEnabled } from './auto-fix.ts'\r\nimport type { ClaudeClientProjection } from './projection.ts'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\nimport * as styles from './styles.ts'\r\n\r\nexport interface OverviewSessionRow {\r\n readonly id: string\r\n readonly displayTitle?: string\r\n readonly cwd?: string\r\n readonly agentPreset?: string\r\n readonly running?: boolean\r\n readonly blank?: boolean\r\n readonly origin?: string\r\n}\r\n\r\nexport interface OverviewSessionListState {\r\n /** Host-list order; deleted sessions leave ids but can linger in byId. */\r\n readonly ids?: readonly string[]\r\n readonly byId: Readonly<Record<string, OverviewSessionRow | undefined>>\r\n}\r\n\r\nexport interface OverviewSessionsStore {\r\n subscribe(listener: () => void): () => void\r\n getSnapshot(): OverviewSessionListState\r\n}\r\n\r\nexport interface OverviewWorkspaceListState {\r\n /** Registry-global archive set: \"deleting\" a session archives it here while\r\n * it stays in the host session list. */\r\n readonly archivedSessionIds?: readonly string[]\r\n}\r\n\r\nexport interface OverviewWorkspacesStore {\r\n subscribe(listener: () => void): () => void\r\n getSnapshot(): OverviewWorkspaceListState\r\n}\r\n\r\nconst NO_WORKSPACE_STATE: OverviewWorkspaceListState = {}\r\n\r\nconst NO_WORKSPACES: OverviewWorkspacesStore = {\r\n subscribe: () => () => {},\r\n getSnapshot: () => NO_WORKSPACE_STATE,\r\n}\r\n\r\nexport interface OverviewProjectionSource {\r\n subscribe(listener: () => void): () => void\r\n getSnapshot(): ClaudeClientProjection\r\n}\r\n\r\nexport interface ClaudePullRequestsPanelInjected {\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n closeDetails: () => void\r\n openSession: (sessionId: string) => void\r\n loadStatus: (cwd: string, signal?: AbortSignal) => Promise<RepositoryStatus>\r\n sessions: OverviewSessionsStore\r\n /** Workspace registry feed used to hide archived (\"deleted\") sessions. */\r\n workspaces?: OverviewWorkspacesStore\r\n /** Live sidecar projection per session, for attention badges and context usage. */\r\n projectionFor?: (sessionId: string) => OverviewProjectionSource\r\n}\r\n\r\nexport const OVERVIEW_REFRESH_MS = 30_000\r\n\r\n/** What a running session is blocked on: the latest permission or question\r\n * activity that is still in its started phase. */\r\nexport function overviewAttention(activities: readonly ClaudeActivityEvent[]): 'permission' | 'question' | undefined {\r\n for (let index = activities.length - 1; index >= 0; index -= 1) {\r\n const activity = activities[index]\r\n if (activity === undefined || (activity.kind !== 'permission' && activity.kind !== 'question')) continue\r\n return activity.phase === 'started' ? activity.kind : undefined\r\n }\r\n return undefined\r\n}\r\n\r\n/** Claude sessions worth listing: rows still in the host list (byId keeps\r\n * deleted and breadcrumb rows), non-blank, non-subagent, with a checkout;\r\n * running first. */\r\nexport function claudeSessionRows(state: OverviewSessionListState, archivedSessionIds: readonly string[] = []): readonly OverviewSessionRow[] {\r\n const rows = state.ids === undefined ? Object.values(state.byId) : state.ids.map(id => state.byId[id])\r\n const archived = new Set(archivedSessionIds)\r\n return rows\r\n .filter((row): row is OverviewSessionRow => row !== undefined\r\n && row.agentPreset === 'claude'\r\n && row.blank !== true\r\n && row.origin !== 'subagent'\r\n && !archived.has(row.id)\r\n && typeof row.cwd === 'string')\r\n .sort((left, right) => Number(right.running === true) - Number(left.running === true) || (left.displayTitle ?? left.id).localeCompare(right.displayTitle ?? right.id))\r\n}\r\n\r\nfunction Badge({ label, tone = 'neutral' }: { label: string; tone?: 'neutral' | 'success' | 'warning' | 'error' | 'merged' }) {\r\n const toneStyle = tone === 'success'\r\n ? styles.repositoryItemSuccess\r\n : tone === 'warning' ? styles.repositoryItemWarning : tone === 'error' ? styles.repositoryItemError : tone === 'merged' ? { color: '#a78bfa' } : {}\r\n return <span style={{ ...styles.repositoryItem, ...toneStyle }}><span style={styles.repositoryItemDot} aria-hidden=\"true\" /><span style={styles.repositoryItemLabel}>{label}</span></span>\r\n}\r\n\r\nfunction repositoryName(remote: string | undefined): string | undefined {\r\n return remote?.split('/').at(-1)\r\n}\r\n\r\nfunction OverviewAttention({ source, running, t }: {\r\n source: OverviewProjectionSource\r\n running: boolean\r\n t: ClaudePullRequestsPanelInjected['t']\r\n}) {\r\n const snapshot = useSyncExternalStore(source.subscribe, source.getSnapshot, source.getSnapshot)\r\n // A pending prompt only blocks a live turn; stale ones from interrupted\r\n // turns would otherwise flag idle sessions forever.\r\n const attention = running ? overviewAttention(snapshot.activities) : undefined\r\n const usage = snapshot.contextUsage\r\n return <>\r\n {attention === 'permission' ? <Badge label={t('overviewNeedsPermission')} tone=\"warning\" /> : null}\r\n {attention === 'question' ? <Badge label={t('overviewNeedsAnswer')} tone=\"warning\" /> : null}\r\n {usage === undefined ? null : <span>{t('overviewContextUsage', { percentage: usage.percentage })}</span>}\r\n </>\r\n}\r\n\r\nexport function ClaudePullRequestsPanel({ t, closeDetails, openSession, loadStatus, sessions, workspaces, projectionFor }: ClaudePullRequestsPanelInjected) {\r\n const snapshot = useSyncExternalStore(sessions.subscribe, sessions.getSnapshot, sessions.getSnapshot)\r\n const workspaceStore = workspaces ?? NO_WORKSPACES\r\n const workspaceState = useSyncExternalStore(workspaceStore.subscribe, workspaceStore.getSnapshot, workspaceStore.getSnapshot)\r\n const rows = useMemo(() => claudeSessionRows(snapshot, workspaceState.archivedSessionIds ?? []), [snapshot, workspaceState])\r\n const cwdKey = useMemo(() => [...new Set(rows.map(row => row.cwd ?? ''))].sort().join('\\0'), [rows])\r\n const [statuses, setStatuses] = useState<Readonly<Record<string, RepositoryStatus>>>({})\r\n useEffect(() => {\r\n const cwds = cwdKey.length === 0 ? [] : cwdKey.split('\\0')\r\n if (cwds.length === 0) return\r\n const controller = new AbortController()\r\n const refresh = (): void => {\r\n for (const cwd of cwds) {\r\n void loadStatus(cwd, controller.signal).then(status => {\r\n if (!controller.signal.aborted) setStatuses(previous => ({ ...previous, [cwd]: status }))\r\n }, () => undefined)\r\n }\r\n }\r\n refresh()\r\n const timer = setInterval(refresh, OVERVIEW_REFRESH_MS)\r\n return () => {\r\n controller.abort()\r\n clearInterval(timer)\r\n }\r\n }, [cwdKey, loadStatus])\r\n return (\r\n <div className={styles.detailsCardClass} style={styles.tasksPanel}>\r\n <style data-dsh-claude-overview-styles>{styles.detailsCardCss}{styles.panelIconButtonCss}</style>\r\n <header style={styles.tasksHeader}>\r\n <div>\r\n <span style={styles.tasksHeading}>{t('overviewTitle')}</span>\r\n <span style={styles.tasksTurnMeta}>{t('overviewBody')}</span>\r\n </div>\r\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('diffClose')} onClick={closeDetails}><IconCloseOutline16 /></button>\r\n </header>\r\n <div style={styles.overviewBody}>\r\n {rows.length === 0 ? <p style={styles.overviewEmpty}>{t('overviewEmpty')}</p> : rows.map(row => {\r\n const repository = row.cwd === undefined ? undefined : statuses[row.cwd]\r\n const pullRequest = repository?.pullRequest\r\n const branch = repository?.status === 'ready'\r\n ? (repository.detached === true ? t('repositoryDetached') : repository.branch ?? t('repositoryUnknownBranch'))\r\n : repository === undefined ? t('overviewLoading') : t('repositoryUnavailable')\r\n return (\r\n <button key={row.id} type=\"button\" style={styles.overviewRow} onClick={() => { openSession(row.id) }}>\r\n <span style={styles.overviewRowTop}>\r\n {row.running === true ? <span style={styles.overviewRunningDot} aria-label={t('overviewRunning')} /> : null}\r\n <span style={styles.overviewTitle}>{row.displayTitle ?? row.id}</span>\r\n {pullRequest === undefined\r\n ? <Badge label={t('overviewNoPr')} />\r\n : <Badge label={`#${pullRequest.number} · ${t(`repositoryState_${pullRequest.state}` as ClaudeCodeSettingsKey)}`} tone={pullRequest.state === 'merged' ? 'merged' : pullRequest.state === 'open' ? 'success' : 'neutral'} />}\r\n </span>\r\n <span style={styles.overviewMeta}>\r\n {repositoryName(repository?.remote) === undefined ? null : <span>{repositoryName(repository?.remote)}</span>}\r\n <span style={styles.overviewBranch}>{branch}</span>\r\n {pullRequest?.state === 'open' && pullRequest.checks !== 'none'\r\n ? <Badge label={t(`repositoryChecks_${pullRequest.checks}` as ClaudeCodeSettingsKey)} tone={pullRequest.checks === 'passing' ? 'success' : pullRequest.checks === 'failing' ? 'error' : 'warning'} />\r\n : null}\r\n {pullRequest?.state === 'open' && pullRequest.review !== 'none'\r\n ? <Badge label={t(`repositoryReview_${pullRequest.review}` as ClaudeCodeSettingsKey)} tone={pullRequest.review === 'approved' ? 'success' : pullRequest.review === 'changes-requested' ? 'error' : 'neutral'} />\r\n : null}\r\n {autoFixEnabled(row.id) ? <Badge label={t('overviewAutoFix')} tone=\"success\" /> : null}\r\n {projectionFor === undefined ? null : <OverviewAttention source={projectionFor(row.id)} running={row.running === true} t={t} />}\r\n </span>\r\n </button>\r\n )\r\n })}\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import { CLAUDE_ASK_PATH } from '../constants.ts'\r\n\r\nexport interface AskSelectionRequest {\r\n readonly selection: string\r\n readonly context?: string\r\n readonly question: string\r\n}\r\n\r\nexport interface AskToolEvent {\r\n readonly type: 'tool'\r\n readonly id: string\r\n readonly phase: 'start' | 'input' | 'done'\r\n readonly name?: string\r\n readonly summary?: string\r\n readonly error?: boolean\r\n}\r\n\r\nexport type AskEvent =\r\n | { readonly type: 'delta'; readonly text: string }\r\n | { readonly type: 'thinking'; readonly text: string }\r\n | { readonly type: 'status'; readonly text: string }\r\n | AskToolEvent\r\n | { readonly type: 'done' }\r\n | { readonly type: 'error'; readonly message: string }\r\n\r\nexport type AskProgress = { readonly type: 'text' | 'thinking' | 'status'; readonly text: string } | AskToolEvent\r\n\r\nfunction record(value: unknown): Record<string, unknown> | undefined {\r\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\r\n}\r\n\r\nexport function parseAskEvent(line: string): AskEvent {\r\n const event = record(JSON.parse(line) as unknown)\r\n if (event?.type === 'delta' && typeof event.text === 'string') return { type: 'delta', text: event.text }\r\n if (event?.type === 'thinking' && typeof event.text === 'string') return { type: 'thinking', text: event.text }\r\n if (event?.type === 'status' && typeof event.text === 'string') return { type: 'status', text: event.text }\r\n if (event?.type === 'tool' && typeof event.id === 'string' && (event.phase === 'start' || event.phase === 'input' || event.phase === 'done')) {\r\n return {\r\n type: 'tool',\r\n id: event.id,\r\n phase: event.phase,\r\n ...(typeof event.name === 'string' ? { name: event.name } : {}),\r\n ...(typeof event.summary === 'string' ? { summary: event.summary } : {}),\r\n ...(event.error === true ? { error: true } : {}),\r\n }\r\n }\r\n if (event?.type === 'done') return { type: 'done' }\r\n if (event?.type === 'error') return { type: 'error', message: typeof event.message === 'string' ? event.message : 'The question could not be answered.' }\r\n throw new Error('Invalid ask stream event.')\r\n}\r\n\r\n/** Stream an answer about selected reply text; resolves when the answer completes. */\r\nexport async function askAboutSelection(\r\n sessionId: string,\r\n request: AskSelectionRequest,\r\n onProgress: (progress: AskProgress) => void,\r\n signal?: AbortSignal,\r\n): Promise<void> {\r\n const response = await fetch(`${CLAUDE_ASK_PATH}?sessionId=${encodeURIComponent(sessionId)}`, {\r\n method: 'POST',\r\n credentials: 'same-origin',\r\n headers: { accept: 'application/x-ndjson', 'content-type': 'application/json' },\r\n body: JSON.stringify(request),\r\n ...(signal === undefined ? {} : { signal }),\r\n })\r\n if (!response.ok) {\r\n const body = record(await response.json().catch(() => undefined))\r\n throw new Error(typeof body?.message === 'string' ? body.message : 'The question could not be sent.')\r\n }\r\n if (response.body === null) throw new Error('The answer stream is unavailable.')\r\n const reader = response.body.getReader()\r\n const decoder = new TextDecoder()\r\n let buffer = ''\r\n let finished = false\r\n const handle = (line: string): void => {\r\n if (line.trim().length === 0) return\r\n const event = parseAskEvent(line)\r\n if (event.type === 'delta') onProgress({ type: 'text', text: event.text })\r\n else if (event.type === 'thinking') onProgress({ type: 'thinking', text: event.text })\r\n else if (event.type === 'status') onProgress({ type: 'status', text: event.text })\r\n else if (event.type === 'tool') onProgress(event)\r\n else if (event.type === 'done') finished = true\r\n else throw new Error(event.message)\r\n }\r\n while (true) {\r\n const chunk = await reader.read()\r\n buffer += decoder.decode(chunk.value, { stream: !chunk.done })\r\n const lines = buffer.split('\\n')\r\n buffer = lines.pop() ?? ''\r\n for (const line of lines) handle(line)\r\n if (chunk.done) break\r\n }\r\n handle(buffer)\r\n if (!finished) throw new Error('The answer ended unexpectedly.')\r\n}\r\n","import { useCallback, useEffect, useRef, useState } from 'react'\r\nimport { MarkdownText, Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport { askAboutSelection, type AskProgress } from './ask-api.ts'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\nimport * as styles from './styles.ts'\r\n\r\nexport interface ClaudeSelectionAskInjected {\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n /** The session whose conversation is on screen. */\r\n currentSessionId: () => string | undefined\r\n /** Whether the plugin owns that session (the ask query needs a Claude cwd). */\r\n ownsSession: (sessionId: string) => boolean\r\n /** Append text to the session composer without submitting. */\r\n insertIntoChat?: (sessionId: string, text: string) => void\r\n}\r\n\r\ninterface SelectionRect {\r\n readonly top: number\r\n readonly left: number\r\n readonly width: number\r\n readonly bottom: number\r\n}\r\n\r\ninterface SelectionInfo {\r\n readonly sessionId: string\r\n readonly text: string\r\n readonly context: string\r\n readonly rect: SelectionRect\r\n /** Live range: re-measured on scroll and painted via the Highlight API. */\r\n readonly range: Range\r\n}\r\n\r\n// Chat rows carry data-chat-flow-kind; Claude output renders under plugin\r\n// node kinds (claude-activity-step, …) as well as the Host 'assistant' kind,\r\n// so match any chat node that is not the user's own message.\r\nconst CHAT_NODE = '[data-chat-flow-kind]'\r\nconst USER_KIND = 'user'\r\nconst MAX_SELECTION_CHARS = 8_000\r\nconst MAX_CONTEXT_CHARS = 16_000\r\nconst POPUP_WIDTH = 560\r\nconst POPUP_ESTIMATED_HEIGHT = 320\r\nconst TOOLBAR_WIDTH = 64\r\nconst HIGHLIGHT_NAME = 'dsh-claude-ask'\r\n\r\n/** Answer content in arrival order, like the main window: tool steps and\r\n * text segments interleave; text deltas extend the trailing text block. */\r\nexport type AnswerBlock =\r\n | { readonly kind: 'text'; readonly text: string }\r\n | { readonly kind: 'tool'; readonly id: string; readonly name: string; readonly summary?: string; readonly state: 'running' | 'done' | 'error' }\r\n\r\nexport function appendAnswerBlock(blocks: readonly AnswerBlock[], progress: AskProgress): readonly AnswerBlock[] {\r\n if (progress.type === 'text') {\r\n const last = blocks.at(-1)\r\n if (last?.kind === 'text') return [...blocks.slice(0, -1), { kind: 'text', text: last.text + progress.text }]\r\n return [...blocks, { kind: 'text', text: progress.text }]\r\n }\r\n if (progress.type !== 'tool') return blocks\r\n const index = blocks.findIndex(block => block.kind === 'tool' && block.id === progress.id)\r\n if (index < 0) {\r\n if (progress.phase === 'done') return blocks\r\n return [...blocks, { kind: 'tool', id: progress.id, name: progress.name ?? 'tool', state: 'running', ...(progress.summary === undefined ? {} : { summary: progress.summary }) }]\r\n }\r\n const current = blocks[index] as Extract<AnswerBlock, { kind: 'tool' }>\r\n const next: AnswerBlock = {\r\n ...current,\r\n ...(progress.name === undefined ? {} : { name: progress.name }),\r\n ...(progress.summary === undefined ? {} : { summary: progress.summary }),\r\n state: progress.phase === 'done' ? (progress.error === true ? 'error' : 'done') : current.state,\r\n }\r\n return [...blocks.slice(0, index), next, ...blocks.slice(index + 1)]\r\n}\r\n\r\nexport function answerText(blocks: readonly AnswerBlock[]): string {\r\n return blocks.filter((block): block is Extract<AnswerBlock, { kind: 'text' }> => block.kind === 'text').map(block => block.text.trim()).filter(text => text.length > 0).join('\\n\\n')\r\n}\r\n\r\nfunction rectOf(range: Range): SelectionRect {\r\n const rect = range.getBoundingClientRect()\r\n return { top: rect.top, left: rect.left, width: rect.width, bottom: rect.bottom }\r\n}\r\n\r\n/** Read the current selection when it sits inside an assistant reply. */\r\nexport function selectionInfoOf(selection: Selection | null, sessionId: string | undefined): Omit<SelectionInfo, 'sessionId'> | undefined {\r\n if (sessionId === undefined || selection === null || selection.isCollapsed || selection.rangeCount === 0) return undefined\r\n const range = selection.getRangeAt(0)\r\n // A whole-line (triple-click) selection ends at the start of the NEXT chat\r\n // row, so the common ancestor climbs above any row; anchor on the start\r\n // node instead and fall back to the end node.\r\n const hostOf = (node: Node | null): HTMLElement | null => {\r\n const element = node instanceof Element ? node : node?.parentElement ?? null\r\n return element?.closest<HTMLElement>(CHAT_NODE) ?? null\r\n }\r\n const host = hostOf(range.startContainer) ?? hostOf(range.endContainer)\r\n if (host === null || host.dataset.chatFlowKind === USER_KIND) return undefined\r\n const text = selection.toString().trim()\r\n if (text.length === 0) return undefined\r\n return {\r\n text: text.slice(0, MAX_SELECTION_CHARS),\r\n context: (host.textContent ?? '').trim().slice(0, MAX_CONTEXT_CHARS),\r\n rect: rectOf(range),\r\n range: range.cloneRange(),\r\n }\r\n}\r\n\r\nexport function toolbarPosition(rect: SelectionRect, viewportWidth: number): { top: number; left: number } {\r\n return {\r\n top: Math.max(8, rect.top - 40),\r\n left: Math.min(Math.max(8, rect.left + rect.width / 2 - TOOLBAR_WIDTH / 2), Math.max(8, viewportWidth - TOOLBAR_WIDTH - 8)),\r\n }\r\n}\r\n\r\nexport type PopupSide = 'below' | 'above'\r\n\r\n/** Pick the side with room once, when the popup opens: below the selection\r\n * unless the space there is short and above is roomier. */\r\nexport function popupSide(rect: SelectionRect, viewportHeight: number): PopupSide {\r\n const roomBelow = viewportHeight - rect.bottom - 16\r\n const roomAbove = rect.top - 16\r\n return roomBelow >= POPUP_ESTIMATED_HEIGHT || roomBelow >= roomAbove ? 'below' : 'above'\r\n}\r\n\r\n/** Anchor on the chosen side so streamed content grows away from the text and\r\n * scrolls inside the popup instead of running off screen. */\r\nexport function popupPlacement(rect: SelectionRect, side: PopupSide, viewportWidth: number, viewportHeight: number): { top?: number; bottom?: number; left: number; width: number; maxHeight: number } {\r\n const width = Math.min(POPUP_WIDTH, viewportWidth - 16)\r\n const left = Math.min(Math.max(8, rect.left), Math.max(8, viewportWidth - width - 8))\r\n const cap = Math.round(viewportHeight * 0.7)\r\n if (side === 'below') {\r\n const top = Math.max(8, rect.bottom + 8)\r\n return { top, left, width, maxHeight: Math.max(120, Math.min(cap, viewportHeight - top - 8)) }\r\n }\r\n const bottom = Math.max(8, viewportHeight - rect.top + 8)\r\n return { bottom, left, width, maxHeight: Math.max(120, Math.min(cap, viewportHeight - bottom - 8)) }\r\n}\r\n\r\nfunction CopyIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8\" rx=\"1.5\" />\r\n <path d=\"M10.5 5.5V3.5a1 1 0 0 0-1-1h-6a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2\" />\r\n </svg>\r\n )\r\n}\r\n\r\nfunction AskIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M2.75 2.75h10.5a1 1 0 0 1 1 1v6.5a1 1 0 0 1-1 1H8.2l-3.2 2.9v-2.9H2.75a1 1 0 0 1-1-1v-6.5a1 1 0 0 1 1-1Z\" />\r\n <path d=\"M6.4 6.3a1.6 1.6 0 1 1 2.3 1.5c-.5.3-.7.6-.7 1.1M8 10.6h.01\" />\r\n </svg>\r\n )\r\n}\r\n\r\nfunction CheckIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"m3.5 8.5 3 3 6-7\" />\r\n </svg>\r\n )\r\n}\r\n\r\n/** Selection toolbar over assistant replies: copy, or ask a follow-up whose\r\n * answer streams into a popup rendered with the Host Markdown renderer. */\r\nexport function ClaudeSelectionAsk({ t, currentSessionId, ownsSession, insertIntoChat }: ClaudeSelectionAskInjected) {\r\n const [selection, setSelection] = useState<SelectionInfo>()\r\n const [open, setOpen] = useState(false)\r\n const [question, setQuestion] = useState('')\r\n const [blocks, setBlocks] = useState<readonly AnswerBlock[]>([])\r\n const answer = answerText(blocks)\r\n const [thinking, setThinking] = useState('')\r\n const [thinkingOpen, setThinkingOpen] = useState(false)\r\n const [started, setStarted] = useState(false)\r\n const [phase, setPhase] = useState<'idle' | 'answering' | 'done'>('idle')\r\n const [error, setError] = useState<string>()\r\n const [copied, setCopied] = useState<'selection' | 'answer'>()\r\n const [rect, setRect] = useState<SelectionRect>()\r\n const [side, setSide] = useState<PopupSide>('below')\r\n const popupRef = useRef<HTMLDivElement>(null)\r\n const toolbarRef = useRef<HTMLDivElement>(null)\r\n const controller = useRef<AbortController>()\r\n const openRef = useRef(false)\r\n openRef.current = open\r\n\r\n const close = useCallback((): void => {\r\n controller.current?.abort()\r\n controller.current = undefined\r\n setOpen(false)\r\n setSelection(undefined)\r\n setQuestion('')\r\n setBlocks([])\r\n setThinking('')\r\n setThinkingOpen(false)\r\n setStarted(false)\r\n setPhase('idle')\r\n setError(undefined)\r\n setCopied(undefined)\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (typeof document === 'undefined') return\r\n let timer: ReturnType<typeof setTimeout> | undefined\r\n const update = (): void => {\r\n if (openRef.current) return\r\n const sessionId = currentSessionId()\r\n if (sessionId === undefined || !ownsSession(sessionId)) {\r\n setSelection(undefined)\r\n return\r\n }\r\n const info = selectionInfoOf(document.getSelection(), sessionId)\r\n setSelection(info === undefined ? undefined : { sessionId, ...info })\r\n }\r\n const schedule = (): void => {\r\n if (timer !== undefined) clearTimeout(timer)\r\n timer = setTimeout(update, 120)\r\n }\r\n const onKey = (event: KeyboardEvent): void => {\r\n if (event.key === 'Escape') close()\r\n }\r\n const onPointerDown = (event: PointerEvent): void => {\r\n if (!(event.target instanceof Node)) return\r\n if (popupRef.current?.contains(event.target) === true || toolbarRef.current?.contains(event.target) === true) return\r\n if (openRef.current) close()\r\n }\r\n document.addEventListener('selectionchange', schedule)\r\n document.addEventListener('mouseup', schedule)\r\n document.addEventListener('keydown', onKey)\r\n document.addEventListener('pointerdown', onPointerDown)\r\n return () => {\r\n if (timer !== undefined) clearTimeout(timer)\r\n document.removeEventListener('selectionchange', schedule)\r\n document.removeEventListener('mouseup', schedule)\r\n document.removeEventListener('keydown', onKey)\r\n document.removeEventListener('pointerdown', onPointerDown)\r\n }\r\n }, [close, currentSessionId, ownsSession])\r\n useEffect(() => () => controller.current?.abort(), [])\r\n // Follow the text: re-measure the live range on scroll and resize.\r\n useEffect(() => {\r\n setRect(selection?.rect)\r\n if (selection === undefined) return\r\n let frame: number | undefined\r\n const reposition = (): void => {\r\n if (frame !== undefined) return\r\n frame = requestAnimationFrame(() => {\r\n frame = undefined\r\n const next = rectOf(selection.range)\r\n if (next.width === 0 && next.bottom === next.top) return\r\n setRect(next)\r\n })\r\n }\r\n document.addEventListener('scroll', reposition, true)\r\n window.addEventListener('resize', reposition)\r\n return () => {\r\n if (frame !== undefined) cancelAnimationFrame(frame)\r\n document.removeEventListener('scroll', reposition, true)\r\n window.removeEventListener('resize', reposition)\r\n }\r\n }, [selection])\r\n // Keep the asked-about text visibly marked while the popup owns focus. The\r\n // Highlight API paints without touching the Host's DOM.\r\n useEffect(() => {\r\n if (!open || selection === undefined) return\r\n const runtime = globalThis as { CSS?: { highlights?: Map<string, unknown> }; Highlight?: new (range: Range) => unknown }\r\n const registry = runtime.CSS?.highlights\r\n if (registry === undefined || runtime.Highlight === undefined) return\r\n registry.set(HIGHLIGHT_NAME, new runtime.Highlight(selection.range))\r\n return () => { registry.delete(HIGHLIGHT_NAME) }\r\n }, [open, selection])\r\n useEffect(() => {\r\n if (copied === undefined) return\r\n const timer = setTimeout(() => setCopied(undefined), 1_200)\r\n return () => clearTimeout(timer)\r\n }, [copied])\r\n\r\n if (selection === undefined || rect === undefined) return <span data-dsh-claude-selection-ask=\"armed\" hidden />\r\n\r\n const copy = (text: string, what: 'selection' | 'answer'): void => {\r\n void navigator.clipboard.writeText(text).then(() => { setCopied(what) }, () => undefined)\r\n }\r\n const submit = (): void => {\r\n if (question.trim().length === 0 || phase === 'answering') return\r\n controller.current?.abort()\r\n const aborter = new AbortController()\r\n controller.current = aborter\r\n setBlocks([])\r\n setThinking('')\r\n setThinkingOpen(false)\r\n setStarted(false)\r\n setError(undefined)\r\n setPhase('answering')\r\n void askAboutSelection(selection.sessionId, { selection: selection.text, context: selection.context, question }, progress => {\r\n if (progress.type === 'status') setStarted(true)\r\n else if (progress.type === 'thinking') setThinking(current => current + progress.text)\r\n else setBlocks(current => appendAnswerBlock(current, progress))\r\n }, aborter.signal).then(() => {\r\n if (!aborter.signal.aborted) setPhase('done')\r\n }, (reason: unknown) => {\r\n if (aborter.signal.aborted) return\r\n setError(reason instanceof Error ? reason.message : t('askFailed'))\r\n setPhase('done')\r\n })\r\n }\r\n const viewportWidth = typeof window === 'undefined' ? 1_280 : window.innerWidth\r\n const viewportHeight = typeof window === 'undefined' ? 800 : window.innerHeight\r\n\r\n if (!open) {\r\n const position = toolbarPosition(rect, viewportWidth)\r\n return (\r\n <div ref={toolbarRef} role=\"toolbar\" aria-label={t('askToolbar')} style={{ ...styles.askToolbar, top: position.top, left: position.left }}>\r\n <style data-dsh-claude-ask-styles>{styles.panelIconButtonCss}</style>\r\n <Tooltip label={copied === 'selection' ? t('askCopied') : t('copyTooltip')} side=\"top\" delayMs={300}>\r\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('copyTooltip')} onMouseDown={event => { event.preventDefault() }} onClick={() => { copy(selection.text, 'selection') }}>\r\n {copied === 'selection' ? <CheckIcon /> : <CopyIcon />}\r\n </button>\r\n </Tooltip>\r\n <Tooltip label={t('askTooltip')} side=\"top\" delayMs={300}>\r\n <button type=\"button\" className={styles.panelIconButtonClass} aria-label={t('askTooltip')} onMouseDown={event => { event.preventDefault() }} onClick={() => {\r\n setSide(popupSide(rect, viewportHeight))\r\n setOpen(true)\r\n }}>\r\n <AskIcon />\r\n </button>\r\n </Tooltip>\r\n </div>\r\n )\r\n }\r\n\r\n const placement = popupPlacement(rect, side, viewportWidth, viewportHeight)\r\n return (\r\n <div ref={popupRef} role=\"dialog\" aria-label={t('askTooltip')} style={{ ...styles.askPopup, ...placement }}>\r\n <style data-dsh-claude-ask-styles>{styles.panelIconButtonCss}{styles.askHighlightCss}</style>\r\n <p style={styles.askQuote}>{selection.text}</p>\r\n {phase === 'idle' ? (\r\n <>\r\n <textarea\r\n autoFocus\r\n value={question}\r\n placeholder={t('askPlaceholder')}\r\n style={styles.askTextarea}\r\n onChange={event => { setQuestion(event.currentTarget.value) }}\r\n onKeyDown={event => {\r\n if (event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing) {\r\n event.preventDefault()\r\n submit()\r\n }\r\n }}\r\n />\r\n <div style={styles.askActions}>\r\n <button type=\"button\" style={styles.askButton} onClick={close}>{t('askClose')}</button>\r\n <button type=\"button\" style={{ ...styles.askButton, ...styles.askPrimaryButton }} disabled={question.trim().length === 0} onClick={submit}>{t('askSubmit')}</button>\r\n </div>\r\n </>\r\n ) : (\r\n <>\r\n <p style={styles.askQuestion}>{question}</p>\r\n <div style={styles.askAnswer}>\r\n {thinking.length === 0 ? null : (\r\n <button type=\"button\" style={styles.askThinkingRow} aria-expanded={thinkingOpen} onClick={() => { setThinkingOpen(value => !value) }}>\r\n <span style={styles.askThinkingLabel}>{phase === 'answering' && answer.length === 0 ? t('askThinkingLive') : t('askThinkingLabel')}</span>\r\n <span style={thinkingOpen ? styles.askThinkingFull : styles.askThinkingPreview}>{thinkingOpen ? thinking : thinking.trimEnd().split('\\n').filter(line => line.trim().length > 0).at(-1)}</span>\r\n </button>\r\n )}\r\n {blocks.length === 0 && thinking.length === 0 && error === undefined ? <span style={styles.askStatus}>{started ? t('askThinking') : t('askStarting')}</span> : null}\r\n {blocks.map((block, index) => block.kind === 'text'\r\n ? <MarkdownText key={`text-${index}`} text={block.text} streaming={phase === 'answering' && index === blocks.length - 1} />\r\n : (\r\n <div key={block.id} style={styles.askToolRow}>\r\n <span style={{ ...styles.askToolGlyph, ...(block.state === 'error' ? styles.askToolGlyphError : block.state === 'done' ? styles.askToolGlyphDone : {}) }} aria-hidden=\"true\">\r\n {block.state === 'running' ? '…' : block.state === 'done' ? '✓' : '×'}\r\n </span>\r\n <span style={styles.askToolName}>{block.name}</span>\r\n {block.summary === undefined ? null : <span style={styles.askToolSummary}>{block.summary}</span>}\r\n </div>\r\n ))}\r\n {error === undefined ? null : <p role=\"alert\" style={styles.askError}>{error}</p>}\r\n </div>\r\n <div style={styles.askActions}>\r\n {answer.length === 0 ? null : (\r\n <button type=\"button\" style={styles.askButton} onClick={() => { copy(answer, 'answer') }}>{copied === 'answer' ? t('askCopied') : t('askCopyAnswer')}</button>\r\n )}\r\n {answer.length === 0 || insertIntoChat === undefined ? null : (\r\n <button type=\"button\" style={styles.askButton} onClick={() => {\r\n insertIntoChat(selection.sessionId, `> ${selection.text.replaceAll('\\n', '\\n> ')}\\n\\n**${question}**\\n\\n${answer}`)\r\n close()\r\n }}>{t('askSendToChat')}</button>\r\n )}\r\n <button type=\"button\" style={{ ...styles.askButton, ...styles.askPrimaryButton }} onClick={close}>{t('askClose')}</button>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )\r\n}\r\n","/** Seats for the rewind control inside the Host's own message action rows.\r\n *\r\n * The chat exposes an additive slot for assistant actions only, so a control\r\n * on a USER message has to reach into markup this package does not own. Every\r\n * lookup here fails open: a Host rename makes the selector miss and the row\r\n * keeps its stock copy/branch actions instead of breaking. */\r\n\r\nconst PORTAL_ATTRIBUTE = 'data-dsh-claude-rewind'\r\n/** The chat row wrapper carries the node kind and its stable node key. */\r\nconst USER_ROW = '[data-chat-flow-kind=\"user\"][data-chat-flow-key]'\r\n/** MessageIconActions composes its own CSS-module class onto the row; only the\r\n * build-hash prefix changes across Host releases. */\r\nconst ACTIONS_ROW = '[class*=\"actions\"]'\r\n\r\nexport interface ClaudeRewindSeat {\r\n /** Chat node key of the user message this seat belongs to. */\r\n readonly key: string\r\n /** Portal host, mounted immediately left of the copy action. */\r\n readonly host: HTMLElement\r\n}\r\n\r\n/** Reuse an existing seat rather than minting a fresh element: a new node would\r\n * change React's portal identity and restart every effect keyed on it. */\r\nfunction ensureSeat(row: HTMLElement): HTMLElement | undefined {\r\n const actions = row.querySelector<HTMLElement>(ACTIONS_ROW)\r\n if (actions === null) return undefined\r\n const existing = actions.querySelector<HTMLElement>(`:scope > [${PORTAL_ATTRIBUTE}]`)\r\n const copy = actions.querySelector<HTMLElement>(':scope > button')\r\n if (existing !== null) {\r\n if (copy !== null && existing.nextElementSibling !== copy) actions.insertBefore(existing, copy)\r\n return existing\r\n }\r\n const seat = document.createElement('span')\r\n seat.setAttribute(PORTAL_ATTRIBUTE, '')\r\n seat.style.display = 'inline-flex'\r\n if (copy === null) actions.appendChild(seat)\r\n else actions.insertBefore(seat, copy)\r\n return seat\r\n}\r\n\r\n/** Every visible user message row, paired with its portal host. */\r\nexport function locateClaudeRewindSeats(root: ParentNode = document): ClaudeRewindSeat[] {\r\n const seats: ClaudeRewindSeat[] = []\r\n for (const row of root.querySelectorAll<HTMLElement>(USER_ROW)) {\r\n const key = row.getAttribute('data-chat-flow-key')\r\n if (key === null || key.length === 0) continue\r\n const host = ensureSeat(row)\r\n if (host !== undefined) seats.push({ key, host })\r\n }\r\n return seats\r\n}\r\n\r\nexport function removeClaudeRewindSeats(root: ParentNode = document): void {\r\n for (const seat of root.querySelectorAll<HTMLElement>(`[${PORTAL_ATTRIBUTE}]`)) seat.remove()\r\n}\r\n\r\nexport function sameClaudeRewindSeats(left: readonly ClaudeRewindSeat[], right: readonly ClaudeRewindSeat[]): boolean {\r\n return left.length === right.length\r\n && left.every((seat, index) => seat.key === right[index]?.key && seat.host === right[index]?.host)\r\n}\r\n\r\n/** Hide every rewound row: the DSH session log is append-only, so the rows the\r\n * rewind dropped stay in the transcript and are suppressed here. */\r\nexport function rewindHiddenCss(keys: readonly string[]): string {\r\n const selectors = keys\r\n .filter(key => !key.includes('\"') && !key.includes('\\\\'))\r\n .map(key => `[data-chat-flow-key=\"${key}\"]`)\r\n return selectors.length === 0 ? '' : `${selectors.join(',')}{display:none}`\r\n}\r\n","import { CLAUDE_REWIND_PATH } from '../constants.ts'\r\nimport { PLUGIN_READ_TIMEOUT_MS, pluginRequestSignal } from './plugin-request.ts'\r\n\r\n/** Drop one user message and everything after it: the rows are hidden from\r\n * this session's transcript and Claude resumes before that turn. */\r\nexport async function rewindSession(sessionId: string, seq: number): Promise<void> {\r\n const result = await fetch(CLAUDE_REWIND_PATH, {\r\n method: 'POST',\r\n credentials: 'same-origin',\r\n signal: pluginRequestSignal(PLUGIN_READ_TIMEOUT_MS),\r\n headers: { 'content-type': 'application/json', accept: 'application/json' },\r\n body: JSON.stringify({ sessionId, seq }),\r\n })\r\n if (result.ok) return\r\n // A Host still running the previously loaded server bundle has no rewind\r\n // route at all; that is a stale process, not a failed rewind.\r\n if (result.status === 404) throw new Error('route-missing')\r\n const body = await result.json().catch(() => undefined) as { error?: string } | undefined\r\n throw new Error(typeof body?.error === 'string' ? body.error : `http-${result.status}`)\r\n}\r\n","import { useEffect, useMemo, useState, useSyncExternalStore } from 'react'\r\nimport { createPortal } from 'react-dom'\r\nimport { Modal, Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport { isRewound, type ClaudeRewindRange } from '../rewind.ts'\r\nimport { EMPTY_CLAUDE_PROJECTION, type ClaudeClientProjection } from './projection.ts'\r\nimport {\r\n locateClaudeRewindSeats,\r\n removeClaudeRewindSeats,\r\n rewindHiddenCss,\r\n sameClaudeRewindSeats,\r\n type ClaudeRewindSeat,\r\n} from './rewind-dom.ts'\r\nimport { rewindSession } from './rewind-api.ts'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\nimport * as styles from './styles.ts'\r\n\r\n/** The chat facts this control needs, read structurally so the package keeps\r\n * its distance from the Host's conversation types. */\r\nexport interface ClaudeChatNodeView {\r\n readonly key: string\r\n readonly anchorSeq: number\r\n readonly kind: string\r\n readonly data?: unknown\r\n}\r\n\r\nexport interface ClaudeChatView {\r\n readonly chat: {\r\n readonly order: readonly string[]\r\n readonly nodes: { get(key: string): ClaudeChatNodeView | undefined }\r\n }\r\n readonly running: boolean\r\n}\r\n\r\nexport interface ClaudeChatSource {\r\n subscribe(listener: () => void): () => void\r\n getSnapshot(): ClaudeChatView\r\n}\r\n\r\nexport interface ClaudeRewindInjected {\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n /** The session whose conversation is on screen. */\r\n currentSessionId: () => string | undefined\r\n /** Selection changes; the control follows the visible session. */\r\n subscribeSessions: (listener: () => void) => () => void\r\n /** Conversation snapshot source of one session (node keys, seqs, content). */\r\n chatOf: (sessionId: string) => ClaudeChatSource | undefined\r\n /** Plugin projection: session ownership plus the rewound seq ranges. */\r\n projectionOf: (sessionId: string) => {\r\n subscribe(listener: () => void): () => void\r\n getSnapshot(): ClaudeClientProjection\r\n }\r\n /** Put the removed message back in the composer, ready to be edited and resent. */\r\n setDraft?: (sessionId: string, text: string) => void\r\n}\r\n\r\ninterface RewindTarget {\r\n readonly seq: number\r\n readonly text: string\r\n /** Rows removed alongside it, for the confirmation copy. */\r\n readonly rows: number\r\n}\r\n\r\nconst EMPTY_RANGES: readonly ClaudeRewindRange[] = []\r\nconst EMPTY_CHAT: ClaudeChatView = { chat: { order: [], nodes: { get: () => undefined } }, running: false }\r\nconst NO_SUBSCRIBE = (): (() => void) => () => {}\r\nconst EMPTY_CHAT_SNAPSHOT = (): ClaudeChatView => EMPTY_CHAT\r\nconst EMPTY_PROJECTION_SNAPSHOT = (): ClaudeClientProjection => EMPTY_CLAUDE_PROJECTION\r\n\r\n/** Plain text of one user message node, matching what the copy action yields. */\r\nexport function rewindMessageText(data: unknown): string {\r\n const content = (data as { content?: unknown } | undefined)?.content\r\n if (typeof content === 'string') return content\r\n if (!Array.isArray(content)) return ''\r\n return content\r\n .map(block => {\r\n const item = block as { type?: unknown; text?: unknown }\r\n return item?.type === 'text' && typeof item.text === 'string' ? item.text : ''\r\n })\r\n .join('')\r\n}\r\n\r\nfunction RewindIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M3 12a9 9 0 1 0 3-6.7L3 8\" />\r\n <path d=\"M3 3v5h5\" />\r\n </svg>\r\n )\r\n}\r\n\r\n/** \"Rewind to here\" on every user message of a Claude session: drops that\r\n * message and everything below it, and rewinds Claude's own context with it. */\r\nexport function ClaudeRewind({ t, currentSessionId, subscribeSessions, chatOf, projectionOf, setDraft }: ClaudeRewindInjected) {\r\n const sessionId = useSyncExternalStore(subscribeSessions, currentSessionId, currentSessionId)\r\n const chat = sessionId === undefined ? undefined : chatOf(sessionId)\r\n // Bound through closures: the session face is a class instance, so its\r\n // reader methods must not be detached.\r\n const chatStore = useMemo(() => (chat === undefined\r\n ? { subscribe: NO_SUBSCRIBE, getSnapshot: EMPTY_CHAT_SNAPSHOT }\r\n : { subscribe: (listener: () => void) => chat.subscribe(listener), getSnapshot: () => chat.getSnapshot() }), [chat])\r\n const snapshot = useSyncExternalStore(chatStore.subscribe, chatStore.getSnapshot, EMPTY_CHAT_SNAPSHOT)\r\n const source = sessionId === undefined ? undefined : projectionOf(sessionId)\r\n const projectionStore = useMemo(() => (source === undefined\r\n ? { subscribe: NO_SUBSCRIBE, getSnapshot: EMPTY_PROJECTION_SNAPSHOT }\r\n : { subscribe: (listener: () => void) => source.subscribe(listener), getSnapshot: () => source.getSnapshot() }), [source])\r\n const projection = useSyncExternalStore(projectionStore.subscribe, projectionStore.getSnapshot, EMPTY_PROJECTION_SNAPSHOT)\r\n const [seats, setSeats] = useState<readonly ClaudeRewindSeat[]>([])\r\n const [target, setTarget] = useState<RewindTarget>()\r\n const [submitting, setSubmitting] = useState(false)\r\n const [error, setError] = useState<string>()\r\n\r\n const ranges = projection.rewind?.ranges ?? EMPTY_RANGES\r\n const owned = projection.owned\r\n // A rewind mid-turn would cut the running turn in half, so the Host refuses\r\n // one — but the control stays mounted and goes inert for that turn the way\r\n // the Host's own branch action does. Unmounting it instead made every\r\n // message's control vanish and return with each turn.\r\n const unavailable = snapshot.running\r\n const armed = sessionId !== undefined && owned\r\n\r\n const { hiddenKeys, targets } = useMemo(() => {\r\n const hidden: string[] = []\r\n const visible = new Map<string, RewindTarget>()\r\n const users: { key: string; seq: number; text: string; index: number }[] = []\r\n let position = 0\r\n for (const key of snapshot.chat.order) {\r\n const node = snapshot.chat.nodes.get(key)\r\n if (node === undefined) continue\r\n if (isRewound(ranges, node.anchorSeq)) {\r\n hidden.push(key)\r\n continue\r\n }\r\n position += 1\r\n if (node.kind === 'user') users.push({ key, seq: node.anchorSeq, text: rewindMessageText(node.data), index: position })\r\n }\r\n const total = position\r\n for (const user of users) visible.set(user.key, { seq: user.seq, text: user.text, rows: total - user.index })\r\n return { hiddenKeys: hidden, targets: visible }\r\n }, [snapshot, ranges])\r\n\r\n useEffect(() => {\r\n if (!armed || typeof document === 'undefined' || typeof MutationObserver === 'undefined') {\r\n removeClaudeRewindSeats()\r\n setSeats([])\r\n return\r\n }\r\n let scheduled = false\r\n const reconcile = (): void => {\r\n scheduled = false\r\n const found = locateClaudeRewindSeats()\r\n setSeats(current => (sameClaudeRewindSeats(current, found) ? current : found))\r\n }\r\n const schedule = (): void => {\r\n if (scheduled) return\r\n scheduled = true\r\n queueMicrotask(reconcile)\r\n }\r\n reconcile()\r\n const observer = new MutationObserver(schedule)\r\n observer.observe(document.body, { childList: true, subtree: true })\r\n return () => {\r\n observer.disconnect()\r\n removeClaudeRewindSeats()\r\n }\r\n }, [armed, sessionId])\r\n\r\n // A session switch invalidates any open confirmation.\r\n useEffect(() => {\r\n setTarget(undefined)\r\n setSubmitting(false)\r\n setError(undefined)\r\n }, [sessionId])\r\n\r\n if (sessionId === undefined || !owned) return <span data-dsh-claude-rewind-armed=\"armed\" hidden />\r\n\r\n const close = (): void => {\r\n if (submitting) return\r\n setTarget(undefined)\r\n setError(undefined)\r\n }\r\n const confirm = (): void => {\r\n if (target === undefined || submitting) return\r\n setSubmitting(true)\r\n setError(undefined)\r\n void rewindSession(sessionId, target.seq).then(() => {\r\n setSubmitting(false)\r\n setTarget(undefined)\r\n if (target.text !== '') setDraft?.(sessionId, target.text)\r\n }, (reason: unknown) => {\r\n setSubmitting(false)\r\n const code = reason instanceof Error && reason.message !== '' ? reason.message : 'unknown'\r\n setError(code === 'session-busy' ? t('rewindBusy')\r\n : code === 'route-missing' ? t('rewindStale')\r\n : t('rewindFailed', { code }))\r\n })\r\n }\r\n\r\n return (\r\n <>\r\n <style data-dsh-claude-rewind-styles>{`${styles.rewindActionCss}${rewindHiddenCss(hiddenKeys)}`}</style>\r\n {seats.map(seat => {\r\n const entry = targets.get(seat.key)\r\n if (entry === undefined) return null\r\n return createPortal((\r\n <Tooltip label={unavailable ? t('rewindBusy') : t('rewindTooltip')} side=\"bottom\" delayMs={300}>\r\n <button\r\n type=\"button\"\r\n aria-label={t('rewindTooltip')}\r\n aria-disabled={unavailable || undefined}\r\n data-unavailable={unavailable || undefined}\r\n {...(unavailable ? {} : { onClick: () => { setTarget(entry) } })}\r\n >\r\n <RewindIcon />\r\n </button>\r\n </Tooltip>\r\n ), seat.host, seat.key)\r\n })}\r\n {target === undefined ? null : <style data-dsh-claude-rewind-modal-styles>{styles.diffModalCss}</style>}\r\n <Modal\r\n className=\"dshClaudeRepositoryActionModal\"\r\n contentClassName=\"dshClaudeRepositoryActionModalContent\"\r\n open={target !== undefined}\r\n onClose={close}\r\n title={t('rewindTitle')}\r\n closeLabel={t('diffCancel')}\r\n description={t('rewindDescription', { count: target?.rows ?? 0 })}\r\n footer={\r\n <div style={styles.diffModalFooter}>\r\n <button type=\"button\" style={{ ...styles.button, ...styles.diffModalButton }} disabled={submitting} onClick={close}>{t('diffCancel')}</button>\r\n <button type=\"button\" style={{ ...styles.rewindDangerButton, ...styles.diffModalButton }} disabled={submitting} onClick={confirm}>{submitting ? t('rewindSubmitting') : t('rewindConfirm')}</button>\r\n </div>\r\n }\r\n >\r\n {target === undefined ? null : <div style={styles.diffModalBody}>\r\n {target.text === '' ? null : <p style={styles.rewindModalMessage}>{target.text.slice(0, 2_000)}</p>}\r\n <p style={styles.diffModalStatus}>{t('rewindHint')}</p>\r\n {error === undefined ? null : <p style={styles.diffModalError}>{error}</p>}\r\n </div>}\r\n </Modal>\r\n </>\r\n )\r\n}\r\n","const PORTAL_ATTRIBUTE = 'data-dsh-claude-hero-controls'\r\nconst HERO_SELECTOR = '[data-phase=\"hero\"]'\r\n\r\nfunction normalizedText(element: Element): string {\r\n return (element.textContent ?? '').replace(/\\s+/gu, ' ').trim()\r\n}\r\n\r\nexport function isClaudePresetText(value: string): boolean {\r\n return /^claude(?: code)?$/iu.test(value.replace(/\\s+/gu, ' ').trim())\r\n}\r\n\r\nfunction directChildContaining(parent: Element, descendant: Element): Element | undefined {\r\n return Array.from(parent.children).find(child => child === descendant || child.contains(descendant))\r\n}\r\n\r\n/** Locate rc.8's hero preset seat without relying on hashed CSS module names. */\r\nexport function locateClaudePresetSeat(root: ParentNode = document): { hero: HTMLElement; seat: Element } | undefined {\r\n const heroes = Array.from(root.querySelectorAll<HTMLElement>(HERO_SELECTOR))\r\n if (heroes.length !== 1) return undefined\r\n const hero = heroes[0]\r\n if (hero === undefined) return undefined\r\n const menuButtons = Array.from(hero.querySelectorAll<HTMLButtonElement>('button[aria-haspopup=\"menu\"]'))\r\n const presetButtons = menuButtons.filter(button => button.getAttribute('aria-label') === null && isClaudePresetText(normalizedText(button)))\r\n if (presetButtons.length !== 1) return undefined\r\n const preset = presetButtons[0]\r\n if (preset === undefined) return undefined\r\n let row: Element | null = preset.parentElement\r\n while (row !== null && row !== hero) {\r\n const workspace = Array.from(row.querySelectorAll<HTMLButtonElement>('button[aria-haspopup=\"menu\"][aria-label]'))\r\n if (workspace.length === 1) {\r\n const seat = directChildContaining(row, preset)\r\n if (seat !== undefined) return { hero, seat }\r\n }\r\n row = row.parentElement\r\n }\r\n return undefined\r\n}\r\n\r\n/** Keep a portal the host has not torn down. `locateClaudePresetSeat` also\r\n * misses while a hero re-renders -- a second hero mid session switch, a preset\r\n * label swap -- and dropping the portal there recreates it a beat later with a\r\n * fresh identity, which restarts every effect keyed on it and strands the\r\n * branch picker on \"Loading branches\". A portal whose hero flipped phase or\r\n * unmounted has left the DOM (or left the hero) and is not retained. */\r\nexport function retainsClaudeHeroPortal(portal: { closest: (selector: string) => unknown } | undefined): boolean {\r\n const hero = portal?.closest(HERO_SELECTOR)\r\n return hero !== null && hero !== undefined\r\n}\r\n\r\n/** Reuse the row's existing portal even when the host moved a node between it\r\n * and the seat: a fresh element would change React's portal identity and\r\n * restart (and abort) every effect keyed on it. */\r\nexport function ensureClaudeHeroPortal(seat: Element): HTMLElement {\r\n const existing = seat.parentElement?.querySelector<HTMLElement>(`:scope > [${PORTAL_ATTRIBUTE}]`) ?? null\r\n if (existing !== null) {\r\n if (existing.previousElementSibling !== seat) seat.insertAdjacentElement('afterend', existing)\r\n return existing\r\n }\r\n const portal = document.createElement('span')\r\n portal.setAttribute(PORTAL_ATTRIBUTE, '')\r\n seat.insertAdjacentElement('afterend', portal)\r\n return portal\r\n}\r\n\r\nexport function removeClaudeHeroPortals(root: ParentNode = document): void {\r\n for (const portal of root.querySelectorAll<HTMLElement>(`[${PORTAL_ATTRIBUTE}]`)) portal.remove()\r\n}\r\n","import { useEffect, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react'\r\nimport { createPortal } from 'react-dom'\r\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport { IconBranchOutline16, IconCheckOutline14, IconChevronDownOutline14, IconRefreshOutline14, IconSearchOutline16, Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport type { RepositoryBranchList } from '../repository-setup.ts'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\nimport { ensureClaudeHeroPortal, locateClaudePresetSeat, removeClaudeHeroPortals, retainsClaudeHeroPortal } from './hero-dom-bridge.ts'\r\nimport { loadRepositoryBranches, refreshRepositoryBranches, type RepositoryPreparationStage } from './repository-setup-api.ts'\r\nimport { JiraClientError, loadJiraStatus, searchJiraTickets, type JiraTicket } from './jira-api.ts'\r\nimport * as styles from './styles.ts'\r\n\r\nexport interface BatchTicketProgress {\r\n ticketKey: string\r\n index: number\r\n total: number\r\n stage: RepositoryPreparationStage\r\n}\r\n\r\nexport interface ClaudeHeroRepositoryControlsInjected {\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n prepare: (\r\n cwd: string,\r\n branch: string,\r\n worktree: boolean,\r\n onProgress: (stage: RepositoryPreparationStage) => void,\r\n ticket?: JiraTicket,\r\n ) => Promise<void>\r\n /** Kick off one worktree + session per ticket; the hero session stays put. */\r\n prepareMany: (\r\n cwd: string,\r\n branch: string,\r\n tickets: readonly JiraTicket[],\r\n onProgress: (progress: BatchTicketProgress) => void,\r\n ) => Promise<void>\r\n}\r\n\r\ntype StandardProps = PropsRuntime<'conversation.input.dock'>\r\n\r\nexport interface ClaudeHeroRepositoryControlsProps extends StandardProps, ClaudeHeroRepositoryControlsInjected {}\r\n\r\nfunction shouldInterceptKey(event: KeyboardEvent): boolean {\r\n if (event.key !== 'Enter' || event.shiftKey || event.repeat || event.isComposing) return false\r\n const target = event.target\r\n return target instanceof HTMLTextAreaElement && target.closest('[data-phase=\"hero\"]') !== null\r\n}\r\n\r\nfunction shouldInterceptClick(event: MouseEvent): boolean {\r\n const target = event.target\r\n if (!(target instanceof Element)) return false\r\n const button = target.closest<HTMLButtonElement>('[data-phase=\"hero\"] [data-composer-card] button')\r\n if (button === null || button.disabled) return false\r\n const card = button.closest('[data-composer-card]')\r\n const buttons = card === null ? [] : Array.from(card.querySelectorAll<HTMLButtonElement>('button:not(:disabled)'))\r\n return buttons.at(-1) === button\r\n}\r\n\r\nexport function repositoryBranchOptions(branches: RepositoryBranchList): readonly string[] {\r\n const local = new Set(branches.branches)\r\n return [...branches.branches, ...branches.remoteBranches.filter(branch => !local.has(branch))]\r\n}\r\n\r\n/** What the last refresh did. A fetch that changes nothing is the common case,\r\n * so the menu says so rather than leaving the click looking dead. */\r\nexport interface BranchRefreshNotice {\r\n tone: 'busy' | 'done' | 'error'\r\n text: string\r\n}\r\n\r\n/** A prune can retire the selected remote branch; fall back rather than leave\r\n * the capsule pointing at a ref the next submission would fail on. */\r\nexport function refreshedBranchSelection(branches: RepositoryBranchList, selected: string): string {\r\n const options = repositoryBranchOptions(branches)\r\n return options.includes(selected) ? selected : branches.current ?? options[0] ?? ''\r\n}\r\n\r\nexport function selectedBranchFirst(branches: readonly string[], selected: string): readonly string[] {\r\n return branches.includes(selected) ? [selected, ...branches.filter(branch => branch !== selected)] : branches\r\n}\r\n\r\nexport function filterRepositoryBranches(branches: readonly string[], query: string): readonly string[] {\r\n const normalized = query.trim().toLocaleLowerCase()\r\n return normalized.length === 0\r\n ? branches\r\n : branches.filter(branch => branch.toLocaleLowerCase().includes(normalized))\r\n}\r\n\r\n/** Toggle a ticket's membership in the multi-select, keyed by ticket key. */\r\nexport function toggleTicketSelection(tickets: readonly JiraTicket[], ticket: JiraTicket): readonly JiraTicket[] {\r\n return tickets.some(item => item.key === ticket.key)\r\n ? tickets.filter(item => item.key !== ticket.key)\r\n : [...tickets, ticket]\r\n}\r\n\r\nexport function branchMenuNavigationIndex(current: number, count: number, key: 'ArrowDown' | 'ArrowUp' | 'Home' | 'End'): number {\r\n if (count <= 0) return 0\r\n if (key === 'Home') return 0\r\n if (key === 'End') return count - 1\r\n return (current + (key === 'ArrowDown' ? 1 : -1) + count) % count\r\n}\r\n\r\nconst BRANCH_LOAD_RETRIES = 2\r\nconst BRANCH_LOAD_RETRY_MS = 1_000\r\n\r\nexport const WORKTREE_PROGRESS_STAGES: readonly RepositoryPreparationStage[] = [\r\n 'inspecting',\r\n 'fetching',\r\n 'creating-worktree',\r\n 'saving-worktree',\r\n 'creating-workspace',\r\n 'starting-session',\r\n 'transferring-draft',\r\n 'submitting',\r\n]\r\n\r\nconst PROGRESS_LABEL_KEYS: Record<RepositoryPreparationStage, ClaudeCodeSettingsKey> = {\r\n inspecting: 'repositoryProgress_inspecting',\r\n fetching: 'repositoryProgress_fetching',\r\n 'creating-worktree': 'repositoryProgress_creating-worktree',\r\n 'saving-worktree': 'repositoryProgress_saving-worktree',\r\n 'switching-branch': 'repositoryProgress_switching-branch',\r\n 'creating-workspace': 'repositoryProgress_creating-workspace',\r\n 'starting-session': 'repositoryProgress_starting-session',\r\n 'transferring-draft': 'repositoryProgress_transferring-draft',\r\n submitting: 'repositoryProgress_submitting',\r\n}\r\n\r\nfunction progressLabelKey(stage: RepositoryPreparationStage): ClaudeCodeSettingsKey {\r\n return PROGRESS_LABEL_KEYS[stage]\r\n}\r\n\r\nexport function WorktreeProgressCard({\r\n stage, error, context, t, onDismiss,\r\n}: {\r\n stage: RepositoryPreparationStage\r\n error?: string\r\n /** Batch annotation shown beside the title, e.g. \"PSOS-1 · 1/3\". */\r\n context?: string\r\n t: ClaudeHeroRepositoryControlsInjected['t']\r\n onDismiss: () => void\r\n}) {\r\n const current = WORKTREE_PROGRESS_STAGES.indexOf(stage)\r\n const visible = WORKTREE_PROGRESS_STAGES.slice(0, Math.max(0, current) + 1)\r\n return (\r\n <div role={error === undefined ? 'status' : 'alert'} aria-live=\"polite\" style={styles.heroWorktreeProgressCard}>\r\n <div style={styles.heroWorktreeProgressHeader}>\r\n {error === undefined ? (\r\n <svg aria-hidden=\"true\" viewBox=\"0 0 20 20\" style={styles.heroWorktreeProgressSpinner}>\r\n <circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"none\" stroke=\"currentColor\" strokeOpacity=\"0.2\" strokeWidth=\"2\" />\r\n <path d=\"M10 2a8 8 0 0 1 8 8\" fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeWidth=\"2\">\r\n <animateTransform attributeName=\"transform\" type=\"rotate\" from=\"0 10 10\" to=\"360 10 10\" dur=\"0.8s\" repeatCount=\"indefinite\" />\r\n </path>\r\n </svg>\r\n ) : <span aria-hidden=\"true\" style={styles.heroWorktreeProgressError}>×</span>}\r\n <div style={styles.heroWorktreeProgressCopy}>\r\n <strong style={styles.heroWorktreeProgressTitle}>\r\n {error === undefined ? t('repositoryProgressTitle') : t('repositoryProgressFailed')}\r\n {context === undefined ? null : <span style={styles.heroWorktreeProgressContext}> {context}</span>}\r\n </strong>\r\n <span style={styles.heroWorktreeProgressCurrent}>{error ?? t(progressLabelKey(stage))}</span>\r\n </div>\r\n {error === undefined ? null : (\r\n <button type=\"button\" style={styles.heroWorktreeProgressDismiss} onClick={onDismiss} aria-label={t('repositoryProgressDismiss')}>×</button>\r\n )}\r\n </div>\r\n <div style={styles.heroWorktreeProgressSteps}>\r\n {visible.map((item, index) => (\r\n <span key={item} style={styles.heroWorktreeProgressStep}>\r\n <span aria-hidden=\"true\" style={{\r\n ...styles.heroWorktreeProgressDot,\r\n ...(index < visible.length - 1 ? styles.heroWorktreeProgressDotDone : styles.heroWorktreeProgressDotActive),\r\n }}>{index < visible.length - 1 ? '✓' : ''}</span>\r\n {t(progressLabelKey(item))}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nfunction TicketIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M2.5 5.5a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v1.2a1.3 1.3 0 0 0 0 2.6v1.2a1 1 0 0 1-1 1h-9a1 1 0 0 1-1-1V9.3a1.3 1.3 0 0 0 0-2.6V5.5Z\" />\r\n <path d=\"M6.5 4.5v7\" strokeDasharray=\"1.5 1.5\" />\r\n </svg>\r\n )\r\n}\r\n\r\nexport function ClaudeHeroRepositoryCapsule({\r\n branches, selected, worktree, busy, menuOpen, worktreeLabel, searchPlaceholder, emptySearchLabel,\r\n refreshLabel, refreshing, refreshNotice, worktreeLocked = false,\r\n onMenuOpenChange, onRefresh, onSelect, onWorktreeChange,\r\n}: {\r\n branches: readonly string[]\r\n selected: string\r\n worktree: boolean\r\n busy: boolean\r\n menuOpen: boolean\r\n worktreeLabel: string\r\n searchPlaceholder: string\r\n emptySearchLabel: string\r\n refreshLabel: string\r\n refreshing: boolean\r\n refreshNotice?: BranchRefreshNotice\r\n /** Multi-ticket kickoff always builds worktrees; the toggle locks checked. */\r\n worktreeLocked?: boolean\r\n onMenuOpenChange: (open: boolean) => void\r\n onRefresh: () => void\r\n onSelect: (branch: string) => void\r\n onWorktreeChange: (checked: boolean) => void\r\n}) {\r\n const pickerRef = useRef<HTMLSpanElement>(null)\r\n const searchRef = useRef<HTMLInputElement>(null)\r\n const optionRefs = useRef<Array<HTMLButtonElement | null>>([])\r\n const [query, setQuery] = useState('')\r\n const [activeIndex, setActiveIndex] = useState(0)\r\n const [refreshHovered, setRefreshHovered] = useState(false)\r\n const [worktreeHovered, setWorktreeHovered] = useState(false)\r\n const [worktreeFocused, setWorktreeFocused] = useState(false)\r\n const ordered = useMemo(() => selectedBranchFirst(branches, selected), [branches, selected])\r\n const filtered = useMemo(() => filterRepositoryBranches(ordered, query), [ordered, query])\r\n\r\n useEffect(() => {\r\n if (!menuOpen) {\r\n setQuery('')\r\n setActiveIndex(0)\r\n return\r\n }\r\n setActiveIndex(0)\r\n searchRef.current?.focus()\r\n const closeOnOutsidePointer = (event: PointerEvent): void => {\r\n if (event.target instanceof Node && pickerRef.current?.contains(event.target) !== true) onMenuOpenChange(false)\r\n }\r\n document.addEventListener('pointerdown', closeOnOutsidePointer)\r\n return () => {\r\n document.removeEventListener('pointerdown', closeOnOutsidePointer)\r\n }\r\n }, [menuOpen, onMenuOpenChange])\r\n\r\n useEffect(() => {\r\n setActiveIndex(0)\r\n }, [query])\r\n\r\n useEffect(() => {\r\n if (menuOpen) optionRefs.current[activeIndex]?.scrollIntoView({ block: 'nearest' })\r\n }, [activeIndex, menuOpen])\r\n\r\n const chooseActive = (): void => {\r\n const branch = filtered[activeIndex]\r\n if (branch !== undefined) onSelect(branch)\r\n }\r\n\r\n const handleMenuKeyDown = (event: ReactKeyboardEvent): void => {\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Home' || event.key === 'End') {\r\n event.preventDefault()\r\n const key = event.key as 'ArrowDown' | 'ArrowUp' | 'Home' | 'End'\r\n setActiveIndex(current => branchMenuNavigationIndex(current, filtered.length, key))\r\n } else if (event.key === 'Enter') {\r\n event.preventDefault()\r\n chooseActive()\r\n } else if (event.key === 'Escape') {\r\n event.preventDefault()\r\n onMenuOpenChange(false)\r\n }\r\n }\r\n\r\n return (\r\n <span style={styles.heroRepositoryCapsule}>\r\n <span ref={pickerRef} style={styles.heroBranchPicker}>\r\n <button\r\n type=\"button\"\r\n style={styles.heroBranchTrigger}\r\n aria-haspopup=\"menu\"\r\n aria-expanded={menuOpen}\r\n disabled={busy}\r\n onClick={() => { onMenuOpenChange(!menuOpen) }}\r\n >\r\n <IconBranchOutline16 />\r\n <span style={styles.heroBranchName}>{selected}</span>\r\n <IconChevronDownOutline14 />\r\n </button>\r\n {menuOpen ? (\r\n <span role=\"menu\" aria-activedescendant={filtered[activeIndex] === undefined ? undefined : `claude-branch-option-${activeIndex}`} style={styles.heroBranchMenu} onKeyDown={handleMenuKeyDown}>\r\n <span style={styles.heroBranchSearchRow}>\r\n <label style={{ ...styles.heroBranchSearch, ...styles.heroBranchSearchGrow }}>\r\n <IconSearchOutline16 />\r\n <input\r\n ref={searchRef}\r\n type=\"search\"\r\n value={query}\r\n placeholder={searchPlaceholder}\r\n aria-label={searchPlaceholder}\r\n style={styles.heroBranchSearchInput}\r\n onChange={event => { setQuery(event.currentTarget.value) }}\r\n />\r\n </label>\r\n {/* Branches only ever come from local refs, so a branch pushed\r\n after the last fetch needs this to show up at all. */}\r\n <Tooltip label={refreshLabel} side=\"bottom\" delayMs={250}>\r\n <button\r\n type=\"button\"\r\n aria-label={refreshLabel}\r\n aria-busy={refreshing}\r\n disabled={refreshing}\r\n style={{\r\n ...styles.heroBranchRefresh,\r\n ...(refreshHovered && !refreshing ? styles.heroBranchRefreshHover : {}),\r\n ...(refreshing ? styles.heroBranchRefreshBusy : {}),\r\n }}\r\n onMouseEnter={() => { setRefreshHovered(true) }}\r\n onMouseLeave={() => { setRefreshHovered(false) }}\r\n onClick={onRefresh}\r\n >\r\n <IconRefreshOutline14 />\r\n </button>\r\n </Tooltip>\r\n </span>\r\n {refreshNotice === undefined ? null : (\r\n <span\r\n role={refreshNotice.tone === 'error' ? 'alert' : 'status'}\r\n style={{ ...styles.heroBranchNotice, ...(refreshNotice.tone === 'error' ? styles.heroBranchNoticeError : {}) }}\r\n >\r\n {refreshNotice.text}\r\n </span>\r\n )}\r\n <span style={styles.heroBranchList}>\r\n {filtered.length === 0 ? <span style={styles.heroBranchEmpty}>{emptySearchLabel}</span> : filtered.map((branch, index) => (\r\n <button\r\n ref={element => { optionRefs.current[index] = element }}\r\n id={`claude-branch-option-${index}`}\r\n key={branch}\r\n type=\"button\"\r\n role=\"menuitem\"\r\n aria-current={branch === selected ? 'true' : undefined}\r\n data-active={index === activeIndex ? 'true' : undefined}\r\n style={{ ...styles.heroBranchItem, ...(index === activeIndex ? styles.heroBranchItemActive : {}) }}\r\n onMouseEnter={() => { setActiveIndex(index) }}\r\n onClick={() => { onSelect(branch) }}\r\n >\r\n <span style={styles.heroBranchItemName}>{branch}</span>\r\n {branch === selected ? <IconCheckOutline14 /> : null}\r\n </button>\r\n ))}\r\n </span>\r\n </span>\r\n ) : null}\r\n </span>\r\n <span aria-hidden=\"true\" style={styles.heroRepositoryDivider} />\r\n <button\r\n type=\"button\"\r\n role=\"checkbox\"\r\n aria-checked={worktreeLocked || worktree}\r\n disabled={busy || worktreeLocked}\r\n style={{\r\n ...styles.heroWorktreeToggle,\r\n ...(worktreeLocked || worktree || worktreeHovered ? styles.heroWorktreeToggleActive : {}),\r\n ...(worktreeFocused ? styles.heroWorktreeToggleFocused : {}),\r\n }}\r\n onMouseEnter={() => { setWorktreeHovered(true) }}\r\n onMouseLeave={() => { setWorktreeHovered(false) }}\r\n // The focus ring is for keyboard users; click focus lingering after a\r\n // toggle would otherwise leave a permanent halo around the checkbox.\r\n onFocus={event => { setWorktreeFocused(event.currentTarget.matches(':focus-visible')) }}\r\n onBlur={() => { setWorktreeFocused(false) }}\r\n onClick={() => { onWorktreeChange(!worktree) }}\r\n >\r\n <span aria-hidden=\"true\" style={{ ...styles.heroWorktreeCheckbox, ...(worktreeLocked || worktree ? styles.heroWorktreeCheckboxChecked : {}) }}>\r\n {worktreeLocked || worktree ? (\r\n <svg viewBox=\"0 0 12 12\" style={styles.heroWorktreeCheckboxIcon}>\r\n <path d=\"m2.5 6.2 2.1 2.1 4.9-5\" fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"1.8\" />\r\n </svg>\r\n ) : null}\r\n </span>\r\n {worktreeLabel}\r\n </button>\r\n </span>\r\n )\r\n}\r\n\r\nexport function ClaudeHeroRepositoryControls({\r\n sessionId, useSessions, useWorkspaces, input, t, prepare, prepareMany,\r\n}: ClaudeHeroRepositoryControlsProps) {\r\n const cwd = useSessions(state => state.byId[sessionId]?.cwd)\r\n const workspacePath = useWorkspaces(state => state.items.find(item => item.sessionIds.includes(sessionId))?.path)\r\n const [portal, setPortal] = useState<HTMLElement>()\r\n const hasPortal = portal !== undefined\r\n const [branches, setBranches] = useState<RepositoryBranchList>()\r\n const [selected, setSelected] = useState('')\r\n const [worktree, setWorktree] = useState(false)\r\n const [menuOpen, setMenuOpen] = useState(false)\r\n const [refreshing, setRefreshing] = useState(false)\r\n const [refreshNotice, setRefreshNotice] = useState<BranchRefreshNotice>()\r\n const [busy, setBusy] = useState(false)\r\n const [progressStage, setProgressStage] = useState<RepositoryPreparationStage>()\r\n const [progressError, setProgressError] = useState<string>()\r\n const [error, setError] = useState<string>()\r\n const [jiraConnected, setJiraConnected] = useState(false)\r\n const [tickets, setTickets] = useState<readonly JiraTicket[]>([])\r\n const [batchProgress, setBatchProgress] = useState<BatchTicketProgress>()\r\n const [batchDone, setBatchDone] = useState<number>()\r\n const [ticketMenuOpen, setTicketMenuOpen] = useState(false)\r\n const [ticketQuery, setTicketQuery] = useState('')\r\n const [ticketResults, setTicketResults] = useState<readonly JiraTicket[]>()\r\n const [ticketError, setTicketError] = useState<string>()\r\n const ticketPickerRef = useRef<HTMLSpanElement>(null)\r\n const ticketSearchRef = useRef<HTMLInputElement>(null)\r\n const pendingRef = useRef(false)\r\n const refreshRef = useRef<AbortController>()\r\n const path = workspacePath ?? cwd\r\n\r\n useEffect(() => {\r\n if (typeof document === 'undefined' || typeof MutationObserver === 'undefined') return\r\n let scheduled = false\r\n let current: HTMLElement | undefined\r\n const reconcile = (): void => {\r\n scheduled = false\r\n const target = locateClaudePresetSeat()\r\n if (target === undefined) {\r\n if (retainsClaudeHeroPortal(current)) return\r\n current = undefined\r\n removeClaudeHeroPortals()\r\n setPortal(undefined)\r\n return\r\n }\r\n current = ensureClaudeHeroPortal(target.seat)\r\n setPortal(current)\r\n }\r\n const schedule = (): void => {\r\n if (scheduled) return\r\n scheduled = true\r\n queueMicrotask(reconcile)\r\n }\r\n reconcile()\r\n const observer = new MutationObserver(schedule)\r\n observer.observe(document.body, { childList: true, subtree: true, characterData: true, attributes: true, attributeFilter: ['data-phase'] })\r\n return () => {\r\n observer.disconnect()\r\n removeClaudeHeroPortals()\r\n }\r\n }, [sessionId])\r\n\r\n useEffect(() => {\r\n setBranches(undefined)\r\n setSelected('')\r\n setWorktree(false)\r\n setMenuOpen(false)\r\n // A refresh started against the previous checkout must not land here.\r\n refreshRef.current?.abort()\r\n setRefreshing(false)\r\n setRefreshNotice(undefined)\r\n setProgressStage(undefined)\r\n setProgressError(undefined)\r\n setError(undefined)\r\n setTickets([])\r\n setBatchProgress(undefined)\r\n setBatchDone(undefined)\r\n setTicketMenuOpen(false)\r\n setTicketQuery('')\r\n setTicketResults(undefined)\r\n setTicketError(undefined)\r\n // Presence, not identity: a portal the host rebuilt in place addresses the\r\n // same seat, so it must not abort the load and reset the capsule.\r\n if (!hasPortal || path === undefined) return\r\n const controller = new AbortController()\r\n let timer: ReturnType<typeof setTimeout> | undefined\r\n const load = (remaining: number): void => {\r\n void loadRepositoryBranches(path, controller.signal).then((value) => {\r\n setBranches(value)\r\n setSelected(value.current ?? value.branches[0] ?? '')\r\n }, (reason: unknown) => {\r\n if (controller.signal.aborted) return\r\n // Keep showing the loading copy while retries remain; a transient host\r\n // hiccup must not strand the capsule with no way back.\r\n if (remaining > 0) {\r\n timer = setTimeout(() => { load(remaining - 1) }, BRANCH_LOAD_RETRY_MS)\r\n return\r\n }\r\n setError(reason instanceof Error ? reason.message : String(reason))\r\n })\r\n }\r\n load(BRANCH_LOAD_RETRIES)\r\n return () => {\r\n controller.abort()\r\n if (timer !== undefined) clearTimeout(timer)\r\n }\r\n }, [hasPortal, path, sessionId])\r\n\r\n const availableBranches = branches === undefined ? [] : repositoryBranchOptions(branches)\r\n // A ticket alone routes the submission through prepare: without a worktree it\r\n // stays on the selected branch, with one it opens a worktree named after the key.\r\n const changed = branches !== undefined && selected.length > 0 && (worktree || tickets.length > 0 || selected !== branches.current)\r\n useEffect(() => {\r\n if (!changed || portal === undefined || busy) return\r\n const submit = (event: KeyboardEvent | MouseEvent): void => {\r\n // A ticket seeds the draft itself, so an empty composer may still submit.\r\n if (pendingRef.current || (input.draft.trim().length === 0 && tickets.length === 0)) return\r\n const intercept = event instanceof KeyboardEvent ? shouldInterceptKey(event) : shouldInterceptClick(event)\r\n if (!intercept) return\r\n event.preventDefault()\r\n event.stopPropagation()\r\n pendingRef.current = true\r\n setBusy(true)\r\n setProgressError(undefined)\r\n setError(undefined)\r\n setBatchDone(undefined)\r\n if (tickets.length > 1) {\r\n const total = tickets.length\r\n setBatchProgress({ ticketKey: tickets[0]?.key ?? '', index: 0, total, stage: 'inspecting' })\r\n setProgressStage('inspecting')\r\n void prepareMany(branches.root, selected, tickets, progress => {\r\n setBatchProgress(progress)\r\n setProgressStage(progress.stage)\r\n }).then(() => {\r\n setBatchDone(total)\r\n setBatchProgress(undefined)\r\n setProgressStage(undefined)\r\n setTickets([])\r\n }, (reason: unknown) => {\r\n setProgressError(reason instanceof Error ? reason.message : String(reason))\r\n }).finally(() => {\r\n pendingRef.current = false\r\n setBusy(false)\r\n })\r\n return\r\n }\r\n const ticket = tickets[0]\r\n setProgressStage(worktree ? 'inspecting' : undefined)\r\n void prepare(branches.root, selected, worktree, stage => { if (worktree) setProgressStage(stage) }, ticket).catch((reason: unknown) => {\r\n const message = reason instanceof Error ? reason.message : String(reason)\r\n if (worktree) setProgressError(message)\r\n else setError(message)\r\n }).finally(() => {\r\n pendingRef.current = false\r\n setBusy(false)\r\n })\r\n }\r\n document.addEventListener('keydown', submit, true)\r\n document.addEventListener('click', submit, true)\r\n return () => {\r\n document.removeEventListener('keydown', submit, true)\r\n document.removeEventListener('click', submit, true)\r\n }\r\n }, [branches, busy, changed, input.draft, portal, prepare, prepareMany, selected, tickets, worktree])\r\n\r\n // The ticket menu only exists once a Jira connection is configured.\r\n useEffect(() => {\r\n const controller = new AbortController()\r\n void loadJiraStatus(controller.signal).then(status => { setJiraConnected(status.connected) }, () => {\r\n if (!controller.signal.aborted) setJiraConnected(false)\r\n })\r\n return () => { controller.abort() }\r\n }, [sessionId])\r\n\r\n // Ticket search: debounced against the Jira route while the menu is open.\r\n useEffect(() => {\r\n if (!ticketMenuOpen) return\r\n const controller = new AbortController()\r\n const timer = setTimeout(() => {\r\n setTicketError(undefined)\r\n void searchJiraTickets(ticketQuery, controller.signal).then(setTicketResults, (reason: unknown) => {\r\n if (controller.signal.aborted) return\r\n setTicketResults([])\r\n setTicketError(reason instanceof JiraClientError && reason.code === 'not-connected'\r\n ? t('heroTicketNotConnected')\r\n : reason instanceof Error ? reason.message : t('heroTicketFailed'))\r\n })\r\n }, ticketQuery.length === 0 ? 0 : 300)\r\n return () => {\r\n clearTimeout(timer)\r\n controller.abort()\r\n }\r\n }, [t, ticketMenuOpen, ticketQuery])\r\n useEffect(() => {\r\n if (!ticketMenuOpen) {\r\n setTicketQuery('')\r\n setTicketResults(undefined)\r\n return\r\n }\r\n ticketSearchRef.current?.focus()\r\n const closeOnOutsidePointer = (event: PointerEvent): void => {\r\n if (event.target instanceof Node && ticketPickerRef.current?.contains(event.target) !== true) setTicketMenuOpen(false)\r\n }\r\n document.addEventListener('pointerdown', closeOnOutsidePointer)\r\n return () => { document.removeEventListener('pointerdown', closeOnOutsidePointer) }\r\n }, [ticketMenuOpen])\r\n // Toggling keeps the menu open so several tickets can be picked in one go.\r\n const toggleTicket = (next: JiraTicket): void => {\r\n setTickets(current => toggleTicketSelection(current, next))\r\n setError(undefined)\r\n setBatchDone(undefined)\r\n }\r\n const refreshBranches = (): void => {\r\n if (refreshing || path === undefined) return\r\n const controller = new AbortController()\r\n refreshRef.current = controller\r\n setRefreshing(true)\r\n setRefreshNotice({ tone: 'busy', text: t('repositoryBranchRefreshing') })\r\n void refreshRepositoryBranches(path, controller.signal).then((value) => {\r\n setBranches(value)\r\n setSelected(current => refreshedBranchSelection(value, current))\r\n // Say it landed: a fetch that finds nothing new leaves the menu identical.\r\n setRefreshNotice({ tone: 'done', text: t('repositoryBranchRefreshed', { count: repositoryBranchOptions(value).length }) })\r\n }, (reason: unknown) => {\r\n if (controller.signal.aborted) return\r\n const message = reason instanceof Error ? reason.message : undefined\r\n setRefreshNotice({\r\n tone: 'error',\r\n text: message === 'route-missing' ? t('repositoryBranchRefreshStale') : message ?? t('repositoryBranchRefreshFailed'),\r\n })\r\n }).finally(() => {\r\n if (!controller.signal.aborted) setRefreshing(false)\r\n })\r\n }\r\n const clearTickets = (): void => {\r\n setTickets([])\r\n setError(undefined)\r\n setTicketMenuOpen(false)\r\n }\r\n if (portal === undefined || path === undefined) return null\r\n return createPortal((\r\n <span style={styles.heroRepositoryControls}>\r\n {branches === undefined ? (\r\n <span style={styles.heroRepositoryStatus}>{error ?? t('repositoryBranchesLoading')}</span>\r\n ) : <>\r\n <ClaudeHeroRepositoryCapsule\r\n branches={availableBranches}\r\n selected={selected}\r\n worktree={worktree}\r\n busy={busy}\r\n menuOpen={menuOpen}\r\n worktreeLabel={t('repositoryWorktree')}\r\n searchPlaceholder={t('repositoryBranchSearch')}\r\n emptySearchLabel={t('repositoryBranchSearchEmpty')}\r\n refreshLabel={t('repositoryBranchRefresh')}\r\n refreshing={refreshing}\r\n {...(refreshNotice === undefined ? {} : { refreshNotice })}\r\n worktreeLocked={tickets.length > 1}\r\n onMenuOpenChange={(open) => {\r\n setMenuOpen(open)\r\n // The notice describes one visit to the menu, not the session.\r\n if (!open) setRefreshNotice(undefined)\r\n }}\r\n onRefresh={refreshBranches}\r\n onSelect={(branch) => {\r\n setSelected(branch)\r\n setMenuOpen(false)\r\n setError(undefined)\r\n }}\r\n onWorktreeChange={(checked) => { setWorktree(checked); setError(undefined) }}\r\n />\r\n {!jiraConnected ? null : <span style={styles.heroRepositoryCapsule}>\r\n <span ref={ticketPickerRef} style={styles.heroBranchPicker}>\r\n <Tooltip label={t('heroTicketMenu')} side=\"bottom\" delayMs={250}>\r\n <button\r\n type=\"button\"\r\n style={styles.heroBranchTrigger}\r\n aria-expanded={ticketMenuOpen}\r\n aria-label={t('heroTicketMenu')}\r\n disabled={busy}\r\n onClick={() => { setTicketMenuOpen(!ticketMenuOpen) }}\r\n >\r\n <TicketIcon />\r\n <span style={styles.heroBranchName}>\r\n {tickets.length === 0 ? t('heroTicket') : tickets.length === 1 ? tickets[0]?.key : t('heroTicketCount', { count: tickets.length })}\r\n </span>\r\n <IconChevronDownOutline14 />\r\n </button>\r\n </Tooltip>\r\n {ticketMenuOpen ? (\r\n <span role=\"menu\" style={{ ...styles.heroBranchMenu, ...styles.heroTicketMenu }} onKeyDown={event => { if (event.key === 'Escape') { event.preventDefault(); setTicketMenuOpen(false) } }}>\r\n <label style={styles.heroBranchSearch}>\r\n <IconSearchOutline16 />\r\n <input\r\n ref={ticketSearchRef}\r\n type=\"search\"\r\n value={ticketQuery}\r\n placeholder={t('heroTicketSearch')}\r\n aria-label={t('heroTicketSearch')}\r\n style={styles.heroBranchSearchInput}\r\n onChange={event => { setTicketQuery(event.currentTarget.value) }}\r\n />\r\n </label>\r\n {tickets.length === 0 ? null : (\r\n <span style={styles.heroTicketChips}>\r\n {tickets.map(item => (\r\n <span key={item.key} style={styles.heroTicketChip}>\r\n {item.key}\r\n <button\r\n type=\"button\"\r\n style={styles.heroTicketChipRemove}\r\n aria-label={t('heroTicketRemove', { key: item.key })}\r\n onClick={() => { toggleTicket(item) }}\r\n >×</button>\r\n </span>\r\n ))}\r\n {tickets.length > 1\r\n ? <button type=\"button\" style={styles.heroTicketChipsClear} onClick={clearTickets}>{t('heroTicketNone')}</button>\r\n : null}\r\n </span>\r\n )}\r\n <span style={styles.heroBranchList}>\r\n {ticketError !== undefined\r\n ? <span style={styles.heroBranchEmpty}>{ticketError}</span>\r\n : ticketResults === undefined\r\n ? <span style={styles.heroBranchEmpty}>{t('heroTicketLoading')}</span>\r\n : ticketResults.length === 0 ? <span style={styles.heroBranchEmpty}>{t('heroTicketEmpty')}</span> : ticketResults.map(item => {\r\n const picked = tickets.some(entry => entry.key === item.key)\r\n return (\r\n <button key={item.key} type=\"button\" role=\"menuitemcheckbox\" aria-checked={picked} style={styles.heroBranchItem} onClick={() => { toggleTicket(item) }}>\r\n <span aria-hidden=\"true\" style={{ ...styles.heroTicketCheckbox, ...(picked ? styles.heroWorktreeCheckboxChecked : {}) }}>\r\n {picked ? (\r\n <svg viewBox=\"0 0 12 12\" style={styles.heroWorktreeCheckboxIcon}>\r\n <path d=\"m2.5 6.2 2.1 2.1 4.9-5\" fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"1.8\" />\r\n </svg>\r\n ) : null}\r\n </span>\r\n <span style={styles.heroTicketKey}>{item.key}</span>\r\n <span style={styles.heroBranchItemName}>{item.summary}</span>\r\n {item.status === undefined ? null : <span style={styles.heroTicketStatus}>{item.status}</span>}\r\n </button>\r\n )\r\n })}\r\n </span>\r\n </span>\r\n ) : null}\r\n </span>\r\n </span>}\r\n {error === undefined ? null : <span role=\"alert\" style={styles.heroRepositoryError}>{error}</span>}\r\n {batchDone === undefined ? null : <span role=\"status\" style={styles.heroRepositoryStatus}>{t('heroBatchStarted', { count: batchDone })}</span>}\r\n </>}\r\n {progressStage === undefined || (!busy && progressError === undefined) ? null : (\r\n <WorktreeProgressCard\r\n stage={progressStage}\r\n {...(progressError === undefined ? {} : { error: progressError })}\r\n {...(batchProgress === undefined ? {} : { context: `${batchProgress.ticketKey} · ${batchProgress.index + 1}/${batchProgress.total}` })}\r\n t={t}\r\n onDismiss={() => { setProgressStage(undefined); setProgressError(undefined); setBatchProgress(undefined) }}\r\n />\r\n )}\r\n </span>\r\n ), portal)\r\n}\r\n","import { useSyncExternalStore } from 'react'\nimport { Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { ClaudeClientProjection } from './projection.ts'\nimport type { DiffOpenSource } from './diff-open-store.ts'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\n\nexport interface ClaudeDiffHeaderActionInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n /** Toggle this session's diff panel in the details column. */\n toggleDiff: () => void\n /** Whether that panel is currently on screen for this session. */\n diffOpen: DiffOpenSource\n}\n\nexport interface ClaudeDiffHeaderActionProps extends ClaudeDiffHeaderActionInjected {\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\n sessionId: string\n}\n\n/** Quiet by default, lit on hover, press, keyboard focus, and for as long as\n * the panel it opened is on screen. The header action row sits on the app\n * background, so a resting background would read as a filled control. */\nconst ACTION_CSS = [\n '.dsh-claude-header-diff{flex:none;display:inline-flex;align-items:center;justify-content:center;gap:5px;',\n 'min-width:32px;height:32px;padding:0;border:0;border-radius:9px;background:transparent;',\n 'color:var(--dsw-alias-label-secondary);cursor:pointer;',\n 'font-family:var(--dsw-font-family);font-size:12px;line-height:20px;font-weight:650;',\n 'transition:background .12s ease,color .12s ease}',\n // Counts turn the square into a capsule; the glyph keeps its optical inset.\n '.dsh-claude-header-diff[data-counts]{padding:0 10px 0 8px}',\n '.dsh-claude-header-diff:hover,.dsh-claude-header-diff:focus-visible,.dsh-claude-header-diff[aria-pressed=\"true\"]{',\n 'background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}',\n '.dsh-claude-header-diff:active{background:var(--dsw-alias-interactive-bg-active)}',\n '.dsh-claude-header-diff:focus-visible{outline:none}',\n // Nothing in the capsule may shrink, and the glyph's geometry lives here\n // rather than on the element: SVG presentation attributes lose to any CSS\n // rule an ancestor happens to carry, so `width`/`stroke` written only as\n // attributes are one stray App rule away from a blank button.\n '.dsh-claude-header-diff>*{flex:none}',\n '.dsh-claude-header-diff>svg.dsh-claude-header-diff-glyph{',\n 'width:18px;height:18px;display:block;overflow:visible;opacity:1;',\n 'fill:none;stroke:currentColor;stroke-width:2.1;stroke-linecap:round}',\n // The inherited 20px line box centres on the digits' descender space rather\n // than on the digits, which reads as the counts riding high next to the\n // glyph. A tight box tracks the ink instead.\n '.dsh-claude-header-diff-add,.dsh-claude-header-diff-del{line-height:1}',\n '.dsh-claude-header-diff-add{color:var(--dsw-alias-state-success-primary)}',\n '.dsh-claude-header-diff-del{color:var(--dsw-alias-state-error-primary)}',\n].join('')\n\nlet cssInjected = false\nfunction ensureCss(): void {\n if (cssInjected || typeof document === 'undefined') return\n cssInjected = true\n const element = document.createElement('style')\n element.dataset.dshClaudeHeaderDiff = ''\n element.textContent = ACTION_CSS\n document.head.appendChild(element)\n}\n\n/** Plus over minus: the diff glyph. Drawn inline because the primitives icon\n * set ships no diff icon.\n *\n * The ink spans y 3.5 to 14.5 — symmetric about the box's own centre line, so\n * `align-items:center` lands the drawn shape on the centre rather than the\n * bounding box that happens to contain it. */\nfunction DiffGlyph() {\n return (\n <svg\n className=\"dsh-claude-header-diff-glyph\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n ><path d=\"M9 3.5v5.5M6.25 6.25h5.5M6.25 14.5h5.5\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" /></svg>\n )\n}\n\nexport function ClaudeDiffHeaderAction({ t, sessionId, toggleDiff, diffOpen, useClaudeProjection }: ClaudeDiffHeaderActionProps) {\n const owned = useClaudeProjection(projection => projection.owned)\n // Selected one primitive at a time: a composite selector would allocate a\n // fresh object per snapshot and defeat the hook's equality check.\n const additions = useClaudeProjection(projection => projection.repository?.diff?.additions ?? 0)\n const deletions = useClaudeProjection(projection => projection.repository?.diff?.deletions ?? 0)\n const open = useSyncExternalStore(diffOpen.subscribe, diffOpen.getSnapshot, diffOpen.getSnapshot)\n // The action row renders in every Session header, including ones driven by\n // other agent presets; only Claude sessions have a diff to show.\n if (!owned) return null\n ensureCss()\n // An all-zero diff reads as noise next to the glyph, so the counts appear\n // only once the branch actually carries changes.\n const hasCounts = additions > 0 || deletions > 0\n // A toggle names its effect, not its target: the pressed state already says\n // the panel is open, so the label says what the next press does.\n const label = t(open ? 'diffClose' : 'diffOpen')\n // The DSH bubble, not the native `title` popup: the browser's own tooltip\n // ignores the app's theme and its delay is not ours to set.\n return (\n <Tooltip label={label} side=\"bottom\" delayMs={250}>\n <button\n type=\"button\"\n className=\"dsh-claude-header-diff\"\n aria-label={label}\n aria-pressed={open}\n data-counts={hasCounts || undefined}\n data-session={sessionId}\n onClick={toggleDiff}\n >\n <DiffGlyph />\n {hasCounts ? <>\n <span className=\"dsh-claude-header-diff-add\">+{additions}</span>\n <span className=\"dsh-claude-header-diff-del\">−{deletions}</span>\n </> : null}\n </button>\n </Tooltip>\n )\n}\n","import { CLAUDE_EDITOR_OPEN_PATH } from '../constants.ts'\r\nimport type { EditorId } from '../editor-open.ts'\r\nimport { PLUGIN_READ_TIMEOUT_MS, pluginRequestSignal } from './plugin-request.ts'\r\n\r\n/** Launch the session's project in a desktop editor on the host machine. */\r\nexport async function openProjectInEditor(sessionId: string, editor: EditorId): Promise<void> {\r\n const result = await fetch(\r\n `${CLAUDE_EDITOR_OPEN_PATH}?sessionId=${encodeURIComponent(sessionId)}&editor=${encodeURIComponent(editor)}`,\r\n {\r\n method: 'POST',\r\n credentials: 'same-origin',\r\n signal: pluginRequestSignal(PLUGIN_READ_TIMEOUT_MS),\r\n headers: { accept: 'application/json' },\r\n },\r\n )\r\n if (result.ok) return\r\n const body = await result.json().catch(() => undefined) as { message?: string } | undefined\r\n throw new Error(typeof body?.message === 'string' ? body.message : 'The editor could not be launched.')\r\n}\r\n","import { useEffect, useRef, useState } from 'react'\r\nimport {\r\n IconChevronRightOutline14,\r\n IconEllipsisOutline16,\r\n Tooltip,\r\n useDismissOnOutsidePointer,\r\n} from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type { ClaudeClientProjection } from './projection.ts'\r\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\r\nimport type { EditorId } from '../editor-open.ts'\r\nimport { openProjectInEditor } from './editor-open-api.ts'\r\n\r\nexport interface ClaudeSessionMenuInjected {\r\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\r\n}\r\n\r\nexport interface ClaudeSessionMenuProps extends ClaudeSessionMenuInjected {\r\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\r\n sessionId: string\r\n /** Seam for tests; defaults to the host route that launches the editor. */\r\n openInEditor?: (sessionId: string, editor: EditorId) => Promise<void>\r\n}\r\n\r\n/** Trigger matches the neighbouring diff action; the cards reproduce the\r\n * primitives' menu surface (r12, inverted hairline, shadow-lv3, 4px inset).\r\n *\r\n * Hand-rolled rather than the `Menu` primitive because this menu needs its\r\n * submenu on the LEFT: the trigger is the header's rightmost control, and the\r\n * primitive's nested card is pinned to `left: 100%`, which would open the\r\n * editor list off the right edge of the window. */\r\nconst MENU_CSS = [\r\n '.dsh-claude-header-menu-root{position:relative;display:inline-flex}',\r\n '.dsh-claude-header-menu{flex:none;display:inline-flex;align-items:center;justify-content:center;',\r\n 'width:32px;height:32px;padding:0;border:0;border-radius:9px;background:transparent;',\r\n 'color:var(--dsw-alias-label-secondary);cursor:pointer;transition:background .12s ease,color .12s ease}',\r\n '.dsh-claude-header-menu:hover,.dsh-claude-header-menu:focus-visible,.dsh-claude-header-menu[aria-expanded=\"true\"]{',\r\n 'background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}',\r\n '.dsh-claude-header-menu:active{background:var(--dsw-alias-interactive-bg-active)}',\r\n '.dsh-claude-header-menu:focus-visible{outline:none}',\r\n // The shared glyph is a horizontal ellipsis; the header wants the vertical\r\n // kebab, and a quarter turn is cheaper than a second icon.\r\n '.dsh-claude-header-menu>svg{display:block;transform:rotate(90deg)}',\r\n // The primitives' compact menu scale (Menu.module.css .compactList): a\r\n // header dropdown holding two rows reads as a slab at the standard 40px\r\n // cell height.\r\n '.dsh-claude-header-menu-card,.dsh-claude-header-menu-sub{box-sizing:border-box;position:absolute;',\r\n 'display:flex;flex-direction:column;padding:2px;border:1px solid var(--dsw-alias-border-inverted);',\r\n 'border-radius:7px;background:var(--dsw-specific-menu);box-shadow:var(--dsw-shadow-lv3)}',\r\n // Anchored under the trigger's right edge: the trigger is the header's last\r\n // control, so a left-aligned card would hang off the window.\r\n '.dsh-claude-header-menu-card{top:calc(100% + 4px);right:0;z-index:100;min-width:164px;max-width:360px}',\r\n // Top-aligned with the parent card and grown leftward and DOWNWARD; the\r\n // trigger sits against the top of the window, so a card that grew upward\r\n // from the parent row would run off the viewport.\r\n '.dsh-claude-header-menu-sub{top:-2px;right:calc(100% + 10px);z-index:101;min-width:164px}',\r\n // Bridges the 10px gap so the pointer can cross without leaving the row.\r\n '.dsh-claude-header-menu-sub::after{content:\"\";position:absolute;top:0;bottom:0;right:-10px;width:10px}',\r\n '.dsh-claude-header-menu-row{position:relative}',\r\n '.dsh-claude-header-menu-item{display:flex;align-items:center;gap:6px;width:100%;min-height:26px;',\r\n 'padding:3px 7px;border:none;border-radius:5px;background:transparent;cursor:pointer;text-align:left;',\r\n 'font-family:var(--dsw-font-family);font-size:12px;line-height:18px;color:var(--dsw-alias-label-primary)}',\r\n '.dsh-claude-header-menu-item:hover,.dsh-claude-header-menu-item:focus-visible,',\r\n '.dsh-claude-header-menu-item[aria-expanded=\"true\"]{background:var(--dsw-alias-interactive-bg-hover)}',\r\n '.dsh-claude-header-menu-item:focus-visible{outline:none}',\r\n '.dsh-claude-header-menu-item>span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',\r\n '.dsh-claude-header-menu-item>svg{flex:none;color:var(--dsw-alias-label-tertiary)}',\r\n '.dsh-claude-header-menu-heading{padding:4px 7px;font-family:var(--dsw-font-family);font-size:11px;',\r\n 'line-height:16px;color:var(--dsw-alias-label-tertiary)}',\r\n].join('')\r\n\r\nlet cssInjected = false\r\nfunction ensureCss(): void {\r\n if (cssInjected || typeof document === 'undefined') return\r\n cssInjected = true\r\n // Drop any sheet a previous module evaluation left behind. Appending\r\n // blindly stacks rule sets across hot reloads, and two generations of the\r\n // submenu rule resolve together — an absolutely positioned card that\r\n // inherits `top` from one and `bottom` from the other gets its height\r\n // pinned to the gap between them and spills its rows outside the card.\r\n for (const stale of document.querySelectorAll('style[data-dsh-claude-header-menu]')) stale.remove()\r\n const element = document.createElement('style')\r\n element.dataset.dshClaudeHeaderMenu = ''\r\n element.textContent = MENU_CSS\r\n document.head.appendChild(element)\r\n}\r\n\r\nconst EDITORS: readonly { readonly id: EditorId; readonly label: string }[] = [\r\n { id: 'cursor', label: 'Cursor' },\r\n { id: 'idea', label: 'IntelliJ IDEA' },\r\n]\r\n\r\n/** The open menu, split out so the SSR tests can render it without a DOM to\r\n * drive the hover that opens the submenu. */\r\nexport function ClaudeSessionMenuCard({ openIn, submenuOpen, failure, onSubmenuOpen, onSelect }: {\r\n openIn: string\r\n submenuOpen: boolean\r\n failure?: string | undefined\r\n onSubmenuOpen: (open: boolean) => void\r\n onSelect: (editor: EditorId) => void\r\n}) {\r\n return (\r\n <div className=\"dsh-claude-header-menu-card\" role=\"menu\">\r\n <div\r\n className=\"dsh-claude-header-menu-row\"\r\n onMouseEnter={() => onSubmenuOpen(true)}\r\n onMouseLeave={() => onSubmenuOpen(false)}\r\n >\r\n <button\r\n type=\"button\"\r\n role=\"menuitem\"\r\n className=\"dsh-claude-header-menu-item\"\r\n aria-haspopup=\"menu\"\r\n aria-expanded={submenuOpen}\r\n onFocus={() => onSubmenuOpen(true)}\r\n onClick={() => onSubmenuOpen(true)}\r\n ><span>{openIn}</span><IconChevronRightOutline14 /></button>\r\n {submenuOpen ? <div className=\"dsh-claude-header-menu-sub\" role=\"menu\">\r\n <div className=\"dsh-claude-header-menu-heading\">{openIn}</div>\r\n {EDITORS.map(editor => <button\r\n key={editor.id}\r\n type=\"button\"\r\n role=\"menuitem\"\r\n className=\"dsh-claude-header-menu-item\"\r\n onClick={() => onSelect(editor.id)}\r\n ><span>{editor.label}</span></button>)}\r\n </div> : null}\r\n </div>\r\n {/* A launch that never happened has to say so somewhere, and the menu\r\n is the only surface still on screen when it fails. */}\r\n {failure === undefined ? null : <div className=\"dsh-claude-header-menu-heading\">{failure}</div>}\r\n </div>\r\n )\r\n}\r\n\r\nexport function ClaudeSessionMenu({\r\n t, sessionId, useClaudeProjection, openInEditor = openProjectInEditor,\r\n}: ClaudeSessionMenuProps) {\r\n const owned = useClaudeProjection(projection => projection.owned)\r\n const root = useRef<HTMLSpanElement>(null)\r\n const [open, setOpen] = useState(false)\r\n const [submenuOpen, setSubmenuOpen] = useState(false)\r\n const [failure, setFailure] = useState<string | undefined>(undefined)\r\n const close = (): void => {\r\n setOpen(false)\r\n setSubmenuOpen(false)\r\n setFailure(undefined)\r\n }\r\n useDismissOnOutsidePointer(root, open, next => { if (!next) close() })\r\n useEffect(() => {\r\n if (!open) return undefined\r\n const onKeyDown = (event: KeyboardEvent): void => {\r\n if (event.key === 'Escape') close()\r\n }\r\n document.addEventListener('keydown', onKeyDown)\r\n return () => document.removeEventListener('keydown', onKeyDown)\r\n }, [open])\r\n // The header action row renders in every Session, including ones driven by\r\n // other agent presets; only Claude sessions carry a project to open.\r\n if (!owned) return null\r\n ensureCss()\r\n const label = t('sessionMenu')\r\n const openIn = t('sessionMenuOpenIn')\r\n const select = (editor: EditorId): void => {\r\n setFailure(undefined)\r\n openInEditor(sessionId, editor).then(\r\n () => close(),\r\n (error: unknown) => setFailure(t('sessionMenuOpenFailed', { message: error instanceof Error ? error.message : String(error) })),\r\n )\r\n }\r\n return (\r\n <span className=\"dsh-claude-header-menu-root\" ref={root}>\r\n {/* The open card already names the action; a bubble on top of it is\r\n noise. `disabled` keeps the anchor mounted, so toggling it never\r\n remounts the trigger mid-press. */}\r\n <Tooltip label={label} side=\"bottom\" delayMs={250} disabled={open}>\r\n <button\r\n type=\"button\"\r\n className=\"dsh-claude-header-menu\"\r\n aria-label={label}\r\n aria-haspopup=\"menu\"\r\n aria-expanded={open}\r\n data-session={sessionId}\r\n onClick={() => { if (open) close(); else setOpen(true) }}\r\n ><IconEllipsisOutline16 /></button>\r\n </Tooltip>\r\n {open ? <ClaudeSessionMenuCard\r\n openIn={openIn}\r\n submenuOpen={submenuOpen}\r\n failure={failure}\r\n onSubmenuOpen={setSubmenuOpen}\r\n onSelect={select}\r\n /> : null}\r\n </span>\r\n )\r\n}\r\n","/** The Claude wordmark glyph, lifted verbatim from the brand SVG.\n *\n * Kept as raw geometry rather than a component because its only consumer\n * paints it through a CSS `background-image`: the Host draws the agent-preset\n * icon itself, so the swap has to happen in CSS, not in JSX. */\nconst MARK_PATH = \"M 233.959793 800.214905 L 468.644287 668.536987 L 472.590637 657.100647 L 468.644287 650.738403 L 457.208069 650.738403 L 417.986633 648.322144 L 283.892639 644.69812 L 167.597321 639.865845 L 54.926208 633.825623 L 26.577238 627.785339 L 3.3e-05 592.751709 L 2.73832 575.27533 L 26.577238 559.248352 L 60.724873 562.228149 L 136.187973 567.382629 L 249.422867 575.194763 L 331.570496 580.026978 L 453.261841 592.671082 L 472.590637 592.671082 L 475.328857 584.859009 L 468.724915 580.026978 L 463.570557 575.194763 L 346.389313 495.785217 L 219.543671 411.865906 L 153.100723 363.543762 L 117.181267 339.060425 L 99.060455 316.107361 L 91.248367 266.01355 L 123.865784 230.093994 L 167.677887 233.073853 L 178.872513 236.053772 L 223.248367 270.201477 L 318.040283 343.570496 L 441.825592 434.738342 L 459.946411 449.798706 L 467.194672 444.64447 L 468.080597 441.020203 L 459.946411 427.409485 L 392.617493 305.718323 L 320.778564 181.932983 L 288.80542 130.630859 L 280.348999 99.865845 C 277.369171 87.221436 275.194641 76.590698 275.194641 63.624268 L 312.322174 13.20813 L 332.8591 6.604126 L 382.389313 13.20813 L 403.248352 31.328979 L 434.013519 101.71814 L 483.865753 212.537048 L 561.181274 363.221497 L 583.812134 407.919434 L 595.892639 449.315491 L 600.40271 461.959839 L 608.214783 461.959839 L 608.214783 454.711609 L 614.577271 369.825623 L 626.335632 265.61084 L 637.771851 131.516846 L 641.718201 93.745117 L 660.402832 48.483276 L 697.530334 24.000122 L 726.52356 37.852417 L 750.362549 72 L 747.060486 94.067139 L 732.886047 186.201416 L 705.100708 330.52356 L 686.979919 427.167847 L 697.530334 427.167847 L 709.61084 415.087341 L 758.496704 350.174561 L 840.644348 247.490051 L 876.885925 206.738342 L 919.167847 161.71814 L 946.308838 140.29541 L 997.61084 140.29541 L 1035.38269 196.429626 L 1018.469849 254.416199 L 965.637634 321.422852 L 921.825562 378.201538 L 859.006714 462.765259 L 819.785278 530.41626 L 823.409424 535.812073 L 832.75177 534.92627 L 974.657776 504.724915 L 1051.328979 490.872559 L 1142.818848 475.167786 L 1184.214844 494.496582 L 1188.724854 514.147644 L 1172.456421 554.335693 L 1074.604126 578.496765 L 959.838989 601.449829 L 788.939636 641.879272 L 786.845764 643.409485 L 789.261841 646.389343 L 866.255127 653.637634 L 899.194702 655.409424 L 979.812134 655.409424 L 1129.932861 666.604187 L 1169.154419 692.537109 L 1192.671265 724.268677 L 1188.724854 748.429688 L 1128.322144 779.194641 L 1046.818848 759.865845 L 856.590759 714.604126 L 791.355774 698.335754 L 782.335693 698.335754 L 782.335693 703.731567 L 836.69812 756.885986 L 936.322205 846.845581 L 1061.073975 962.81897 L 1067.436279 991.490112 L 1051.409424 1014.120911 L 1034.496704 1011.704712 L 924.885986 929.234924 L 882.604126 892.107544 L 786.845764 811.48999 L 780.483276 811.48999 L 780.483276 819.946289 L 802.550415 852.241699 L 919.087341 1027.409424 L 925.127625 1081.127686 L 916.671204 1098.604126 L 886.469849 1109.154419 L 853.288696 1103.114136 L 785.073914 1007.355835 L 714.684631 899.516785 L 657.906067 802.872498 L 650.979858 806.81897 L 617.476624 1167.704834 L 601.771851 1186.147705 L 565.530212 1200 L 535.328857 1177.046997 L 519.302124 1139.919556 L 535.328857 1066.550537 L 554.657776 970.792053 L 570.362488 894.68457 L 584.536926 800.134277 L 592.993347 768.724976 L 592.429626 766.630859 L 585.503479 767.516968 L 514.22821 865.369263 L 405.825531 1011.865906 L 320.053711 1103.677979 L 299.516815 1111.812256 L 263.919525 1093.369263 L 267.221497 1060.429688 L 287.114136 1031.114136 L 405.825531 880.107361 L 477.422913 786.52356 L 523.651062 732.483276 L 523.328918 724.671265 L 520.590698 724.671265 L 205.288605 929.395935 L 149.154434 936.644409 L 124.993355 914.01355 L 127.973183 876.885986 L 139.409409 864.80542 L 234.201385 799.570435 L 233.879227 799.8927 Z\"\n\nconst MARK_COLOR = \"#d97757\"\n\n/** The mark as a CSS `url()` value.\n * @returns a percent-encoded `data:` URI, safe to inline in a stylesheet. */\nexport function claudeMarkUrl(): string {\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1200 1200\"><path fill=\"${MARK_COLOR}\" d=\"${MARK_PATH}\"/></svg>`\n return `url(\"data:image/svg+xml;utf8,${encodeURIComponent(svg)}\")`\n}\n","/** The agent-preset roster, read for the Session header label.\n *\n * This plugin shadows the Host's own header label (to swap the native `title`\n * popup for the DSH tooltip bubble and to brand the Claude preset), and a\n * shadow renders in every Session, not just plugin-owned ones. So the roster\n * read and the display-name resolution both have to match the Host's exactly,\n * or replacing the label would quietly downgrade every other preset's name.\n */\n\n/** The roster fields the label reads. Declared structurally rather than\n * imported from the apiproxy package's deep path: this is a wire shape, and\n * the label only ever reads these four. */\nexport interface AgentPresetRow {\n readonly id: string\n readonly trust: 'system' | 'user'\n readonly name?: string\n readonly description?: string\n}\n\n/** Display copy for one preset. */\nexport interface PresetDisplayText {\n readonly name: string\n readonly description?: string\n}\n\n/** Locale keys the Host uses for the presets it ships, mirrored so a shadowed\n * label still shows their translated copy instead of a bare id. Every entry is\n * a lookup into the Host's own `settings.agentPreset` namespace; an id absent\n * here (this plugin's preset included) falls through to file metadata, which\n * is what the Host does too. */\nconst BUILT_IN_KEYS: Readonly<Record<string, { readonly name: string; readonly description: string }>> = {\n standard: { name: 'presetStandardName', description: 'presetStandardDescription' },\n code: { name: 'presetCodeName', description: 'presetCodeDescription' },\n minimal: { name: 'presetMinimalName', description: 'presetMinimalDescription' },\n cordis: { name: 'presetCordisName', description: 'presetCordisDescription' },\n}\n\n/** A locale lookup that reports a miss by echoing the key back. */\nexport type HostTranslate = (key: string) => string\n\n/**\n * Resolve one preset's display copy the way the Host does: translated copy for\n * a preset it ships, file metadata otherwise.\n * @param row - the roster row, or undefined when the roster has not arrived.\n * @param presetId - the id recorded on the session.\n * @param hostT - lookup bound to the Host's preset namespace.\n * @returns the name to render and the description to put in the tooltip.\n */\nexport function presetDisplayText(row: AgentPresetRow | undefined, presetId: string, hostT: HostTranslate): PresetDisplayText {\n const keys = row?.trust === 'system' ? BUILT_IN_KEYS[row.id] : undefined\n if (keys !== undefined) {\n const name = hostT(keys.name)\n const description = hostT(keys.description)\n // A missing dictionary entry echoes its key; that is not display copy.\n if (name !== keys.name) return { name, ...(description === keys.description ? {} : { description }) }\n }\n return {\n name: row?.name ?? presetId,\n ...(row?.description === undefined ? {} : { description: row.description }),\n }\n}\n\n/** The roster read, published as a snapshot source. */\nexport interface AgentPresetRosterApi {\n list(payload: Record<string, never>): Promise<{ result: { ok: true; value: { presets: readonly AgentPresetRow[] } } | { ok: false } }>\n}\n\nexport class AgentPresetRoster {\n readonly #api: AgentPresetRosterApi\n readonly #listeners = new Set<() => void>()\n #rows: readonly AgentPresetRow[] = []\n #inflight: Promise<void> | undefined\n\n constructor(api: AgentPresetRosterApi) {\n this.#api = api\n }\n\n /** Read the roster once. Concurrent calls share the in-flight read, and a\n * failed read leaves the previous rows in place — the label falls back to\n * the session's preset id, never to an empty header. */\n load(): void {\n if (this.#inflight !== undefined) return\n this.#inflight = (async () => {\n try {\n const response = await this.#api.list({})\n if (!response.result.ok) return\n this.#rows = response.result.value.presets\n for (const listener of this.#listeners) listener()\n } catch {\n // A roster that never arrives is a naming downgrade, not an error the\n // header can act on.\n } finally {\n this.#inflight = undefined\n }\n })()\n }\n\n subscribe = (listener: () => void): (() => void) => {\n this.#listeners.add(listener)\n return () => {\n this.#listeners.delete(listener)\n }\n }\n\n getSnapshot = (): readonly AgentPresetRow[] => this.#rows\n}\n","import { useEffect, useSyncExternalStore } from 'react'\nimport { IconAgentPresetOutline16, Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\nimport { CLAUDE_CODE_PRESET_ID } from '../constants.ts'\nimport { claudeMarkUrl } from './claude-mark.ts'\nimport { presetDisplayText, type AgentPresetRow, type HostTranslate } from './agent-preset-roster.ts'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\n\nexport interface ClaudeAgentPresetRosterSource {\n subscribe(listener: () => void): () => void\n getSnapshot(): readonly AgentPresetRow[]\n load(): void\n}\n\nexport interface ClaudeAgentPresetLabelInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n /** Lookup bound to the Host's own preset namespace, so presets DSH ships\n * keep their translated names under this shadow. */\n hostT: HostTranslate\n roster: ClaudeAgentPresetRosterSource\n}\n\nexport interface ClaudeAgentPresetLabelProps extends ClaudeAgentPresetLabelInjected {\n useSessions: SnapshotSelectorHook<{ readonly byId: Readonly<Record<string, { readonly agentPreset?: string } | undefined>> }>\n sessionId: string\n}\n\n/** Reproduces the Host label's own metrics — it sits in the same action row\n * beside the title, so it has to read as the same piece of chrome. */\nconst LABEL_CSS = [\n '.dsh-claude-preset-label{display:inline-flex;align-items:center;gap:4px;max-width:220px;height:22px;',\n 'padding:0 2px 0 0;border-radius:6px;overflow:hidden;white-space:nowrap;',\n 'color:var(--dsw-alias-label-secondary);font-family:var(--dsw-font-family);font-size:12px;line-height:22px}',\n '.dsh-claude-preset-label>*{flex:none}',\n '.dsh-claude-preset-name{min-width:0;overflow:hidden;text-overflow:ellipsis}',\n // The Host dims its generic glyph; the brand mark carries its own colour and\n // is meant to read at full strength.\n '.dsh-claude-preset-icon{opacity:.7}',\n `.dsh-claude-preset-mark{width:14px;height:14px;background:${claudeMarkUrl()} center/contain no-repeat}`,\n].join('')\n\nlet cssInjected = false\nfunction ensureCss(): void {\n if (cssInjected || typeof document === 'undefined') return\n cssInjected = true\n const element = document.createElement('style')\n element.dataset.dshClaudePresetLabel = ''\n element.textContent = LABEL_CSS\n document.head.appendChild(element)\n}\n\nexport function ClaudeAgentPresetLabel({ t, hostT, roster, sessionId, useSessions }: ClaudeAgentPresetLabelProps) {\n const preset = useSessions(state => state.byId[sessionId]?.agentPreset)\n const rows = useSyncExternalStore(roster.subscribe, roster.getSnapshot, roster.getSnapshot)\n const { load } = roster\n useEffect(() => {\n if (preset !== undefined) load()\n }, [preset, load])\n // A session records its preset only once it is composed; before that the\n // Host renders nothing here, and so does this.\n if (preset === undefined) return null\n ensureCss()\n const text = presetDisplayText(rows.find(row => row.id === preset), preset, hostT)\n return (\n <Tooltip label={text.description ?? t('presetHeaderHint')} side=\"bottom\" delayMs={250} maxWidth={280}>\n <span className=\"dsh-claude-preset-label\">\n {preset === CLAUDE_CODE_PRESET_ID\n ? <span className=\"dsh-claude-preset-mark\" aria-hidden=\"true\" />\n : <IconAgentPresetOutline16 size={14} className=\"dsh-claude-preset-icon\" />}\n <span className=\"dsh-claude-preset-name\">{text.name}</span>\n </span>\n </Tooltip>\n )\n}\n","/** Live \"the plugin's diff panel is on screen, and for which session\" flag.\n *\n * The details registration itself is plain plugin state owned by the client\n * entry, but the Session-header action needs to render a pressed state from\n * it, so the flag is published through a snapshot source instead: one store,\n * one writer, `useSyncExternalStore` on the reading end.\n *\n * The maximized overlay keeps the registration mounted, so a diff that moves\n * between the details column and the overlay stays open throughout. */\nexport interface DiffOpenSource {\n subscribe(listener: () => void): () => void\n getSnapshot(): boolean\n}\n\nexport class DiffOpenStore {\n #sessionId: string | undefined\n readonly #listeners = new Set<() => void>()\n\n /** Mark the diff panel open for one session, replacing any previous holder. */\n open(sessionId: string): void {\n this.#set(sessionId)\n }\n\n /** Mark the diff panel closed. */\n close(): void {\n this.#set(undefined)\n }\n\n /** Whether the diff panel is currently open for this session. */\n isOpen(sessionId: string): boolean {\n return this.#sessionId === sessionId\n }\n\n /** A per-session snapshot source for `useSyncExternalStore`. */\n sourceFor(sessionId: string): DiffOpenSource {\n return {\n subscribe: listener => {\n this.#listeners.add(listener)\n return () => {\n this.#listeners.delete(listener)\n }\n },\n getSnapshot: () => this.isOpen(sessionId),\n }\n }\n\n #set(sessionId: string | undefined): void {\n if (this.#sessionId === sessionId) return\n this.#sessionId = sessionId\n for (const listener of this.#listeners) listener()\n }\n}\n","import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\r\nimport type {\r\n ClientSessionContext,\r\n CommandClaim,\r\n InputTriggerCandidate,\r\n InputTriggerPick,\r\n InputTriggerSource,\r\n PickOutcome,\r\n} from '@deepseek-ai/dsh-client-ui-input-trigger/client'\r\nimport type { ClaudeCommandView } from '../command-bridge.ts'\r\nimport type { ClaudeProjectionStore } from './projection.ts'\r\n\r\nconst SOURCE_NAME = 'Claude Code'\r\n\r\nfunction commandsFor(store: ClaudeProjectionStore, session: ClientSessionContext): readonly ClaudeCommandView[] {\r\n const projection = store.source(session.sessionId).getSnapshot()\r\n return projection.owned ? projection.commands : []\r\n}\r\n\r\nfunction findCommand(\r\n store: ClaudeProjectionStore,\r\n session: ClientSessionContext,\r\n publicName: string,\r\n): ClaudeCommandView | undefined {\r\n return commandsFor(store, session).find(command => command.publicName === publicName)\r\n}\r\n\r\nfunction claimFor(ctx: ClientContext, session: ClientSessionContext, command: ClaudeCommandView): CommandClaim {\r\n return {\r\n token: `/${command.publicName} `,\r\n ...(command.hint === undefined ? {} : { hint: command.hint }),\r\n async submit(args) {\r\n return await submitClaudeCommand(ctx, session, command, args)\r\n },\r\n }\r\n}\r\n\r\nfunction pickCommand(ctx: ClientContext, store: ClaudeProjectionStore, pick: InputTriggerPick): PickOutcome {\r\n const command = findCommand(store, pick.session, pick.candidate.name)\r\n if (command === undefined) return undefined\r\n return { claim: claimFor(ctx, pick.session, command) }\r\n}\r\n\r\n/** Build a client-owned slash source. It never calls command.execute, so\r\n * Claude Skill submission creates only the ordinary user-message turn. */\r\nexport function createClaudeCommandSource(ctx: ClientContext, store: ClaudeProjectionStore): InputTriggerSource {\r\n return {\r\n trigger: '/',\r\n name: SOURCE_NAME,\r\n order: 10,\r\n async candidates(session, request): Promise<readonly InputTriggerCandidate[]> {\r\n if (request.position !== 'leading') return []\r\n const query = request.query.toLocaleLowerCase()\r\n return commandsFor(store, session)\r\n .filter(command => command.publicName.toLocaleLowerCase().includes(query))\r\n .map(command => ({\r\n name: command.publicName,\r\n description: command.description,\r\n ...(command.hint === undefined ? {} : { hint: command.hint }),\r\n }))\r\n },\r\n onPick(pick) {\r\n return pickCommand(ctx, store, pick)\r\n },\r\n matchSpace(session, token) {\r\n if (!token.startsWith('/')) return undefined\r\n const command = findCommand(store, session, token.slice(1))\r\n return command === undefined ? undefined : { claim: claimFor(ctx, session, command) }\r\n },\r\n async matchEnter(session, line) {\r\n if (!line.startsWith('/')) return undefined\r\n const separator = line.indexOf(' ')\r\n const publicName = line.slice(1, separator === -1 ? undefined : separator)\r\n const command = findCommand(store, session, publicName)\r\n return command === undefined ? undefined : { claim: claimFor(ctx, session, command) }\r\n },\r\n lexicon(session) {\r\n return commandsFor(store, session).map(command => command.publicName)\r\n },\r\n subscribeLexicon(session, listener) {\r\n return store.source(session.sessionId).subscribe(listener)\r\n },\r\n }\r\n}\r\n\r\n/** Execute through this plugin's injected services rebound to the target\r\n * session scope; the input-trigger action context does not inject them. */\r\nexport async function submitClaudeCommand(\r\n ctx: ClientContext,\r\n session: ClientSessionContext,\r\n command: ClaudeCommandView,\r\n args: string,\r\n): Promise<{ kind: 'success' | 'error'; text?: string }> {\r\n const sessionCtx = ctx.sessions.scope(session.sessionId)\r\n if (sessionCtx === undefined) return { kind: 'error', text: 'Claude session is unavailable' }\r\n const scoped = ctx.extend(sessionCtx)\r\n const line = `/${command.claudeName}${args.length === 0 ? '' : ` ${args}`}`\r\n try {\r\n await scoped.conversation.send(line)\r\n return { kind: 'success' }\r\n } catch (error) {\r\n return {\r\n kind: 'error',\r\n text: error instanceof Error ? error.message : String(error),\r\n }\r\n }\r\n}\r\n","import { isClaudePresetText } from './hero-dom-bridge.ts'\n\n/** Flags the Host's agent-preset seat while it names the Claude preset.\n *\n * The seat is a `single` slot whose occupant owns the whole picker — menu,\n * staging, the intro animation. Shadowing it to change one glyph would mean\n * reimplementing all of that, so the glyph is swapped in CSS instead. CSS\n * cannot read the seat's text, though, and the seat names whichever preset is\n * currently staged, so the brand mark would otherwise land on `standard` or\n * `cordis` too. This bridge supplies the one bit CSS is missing.\n *\n * Keyed on the seat icon's CSS Module local name plus `aria-haspopup`, both of\n * which fail open: a Host rename leaves the attribute unset and the stock\n * glyph in place.\n */\n\n/** Attribute the stylesheet keys the mark swap off. */\nexport const CLAUDE_SEAT_ATTRIBUTE = 'data-dsh-claude-preset'\n\nconst SEAT_SELECTOR = 'button[aria-haspopup=\"menu\"]'\nconst SEAT_ICON_SELECTOR = '[class*=\"seatIcon\"]'\n\n/**\n * Set or clear the flag on every preset seat currently in the tree.\n * @param root - subtree to sweep; the document by default.\n */\nexport function markClaudePresetSeats(root: ParentNode): void {\n for (const icon of root.querySelectorAll(SEAT_ICON_SELECTOR)) {\n const seat = icon.closest(SEAT_SELECTOR)\n if (seat === null) continue\n // The intro animation splits the name into per-character spans, so read\n // the accumulated text rather than a single label node.\n if (isClaudePresetText(seat.textContent ?? '')) seat.setAttribute(CLAUDE_SEAT_ATTRIBUTE, '')\n else seat.removeAttribute(CLAUDE_SEAT_ATTRIBUTE)\n }\n}\n\n/** Keep the flag in step with the Host's own re-renders.\n * @returns a disposer that stops observing and clears every flag it set. */\nexport function trackClaudePresetSeats(): () => void {\n if (typeof document === 'undefined' || typeof window === 'undefined' || typeof MutationObserver === 'undefined') return () => {}\n let frame: number | undefined\n const schedule = (): void => {\n if (frame !== undefined) return\n frame = window.requestAnimationFrame(() => {\n frame = undefined\n markClaudePresetSeats(document)\n })\n }\n // Attributes are deliberately not observed: this bridge writes one, and\n // observing them would make it re-enter on its own mutations.\n const observer = new MutationObserver(schedule)\n observer.observe(document.body, { childList: true, subtree: true, characterData: true })\n markClaudePresetSeats(document)\n return () => {\n observer.disconnect()\n if (frame !== undefined) window.cancelAnimationFrame(frame)\n for (const seat of document.querySelectorAll(`[${CLAUDE_SEAT_ATTRIBUTE}]`)) seat.removeAttribute(CLAUDE_SEAT_ATTRIBUTE)\n }\n}\n","/** Host chrome this plugin restyles from the browser side.\n *\n * Every rule here reaches across into markup this package does not own, so\n * every one is written to fail open: a Host rename makes the selector miss and\n * the stock chrome comes back, rather than leaving the header broken.\n *\n * Chrome this plugin wants to *change* rather than remove goes through slot\n * shadowing where the slot's occupant is replaceable — see\n * `ClaudeAgentPresetLabel`.\n */\nimport { claudeMarkUrl } from './claude-mark.ts'\nimport { CLAUDE_SEAT_ATTRIBUTE, trackClaudePresetSeats } from './preset-seat-mark.ts'\n\n/** The `Session log` capsule is contributed by\n * `@deepseek-ai/dsh-session-log-export` into\n * `conversation.session.header.utilities`. Shadowing that slot entry would\n * also take its download-progress dialog down with it, so the capsule is\n * hidden with CSS instead: the download controller, its dialog, and the\n * `/export` slash command all keep working.\n *\n * The selector matches the CSS Module local name rather than the emitted\n * class, because only the build-hash prefix changes across Host releases. */\nconst SESSION_LOG_CSS = 'button[class*=\"sessionLogButton\"]{display:none}'\n\n/** A Claude Session has exactly one view, so its header tab strip is a row of\n * chrome with nothing to choose between. Hiding it shortens the header, and\n * the Host's divider — an absolutely positioned `header:after` pinned to\n * `bottom:1px` — rides up with it on its own; only the slack the tab row used\n * to provide has to be restored as padding.\n *\n * Scoped through `:has()` to headers carrying this plugin's diff action, so\n * Sessions driven by other agent presets keep their tabs. The action only\n * mounts once the projection reports the Session as plugin-owned, so a\n * freshly opened Session can show the strip for a frame before it collapses. */\nconst HEADER_TABS_CSS = [\n 'header:has(.dsh-claude-header-diff)>[role=\"tablist\"]{display:none}',\n 'header:has(.dsh-claude-header-diff){padding-bottom:10px}',\n].join('')\n\n/** The agent-preset seat draws `IconAgentPresetOutline16` at its default 16px.\n * Swapping it needs one fact CSS cannot read — whether the seat currently\n * names the Claude preset — which `preset-seat-mark` supplies as an\n * attribute. Without that flag set, nothing here matches and the Host's own\n * glyph renders. */\nconst PRESET_SEAT_CSS = [\n `button[${CLAUDE_SEAT_ATTRIBUTE}]>[class*=\"seatIcon\"]{display:none}`,\n `button[${CLAUDE_SEAT_ATTRIBUTE}]::before{content:\"\";flex:none;width:16px;height:16px;`,\n `background:${claudeMarkUrl()} center/contain no-repeat}`,\n].join('')\n\nexport const HOST_CHROME_CSS = `${SESSION_LOG_CSS}${HEADER_TABS_CSS}${PRESET_SEAT_CSS}`\n\n/** Install the stylesheet and the one DOM flag it depends on.\n * @returns a disposer that removes both again. */\nexport function restyleHostChrome(): () => void {\n if (typeof document === 'undefined') return () => {}\n const element = document.createElement('style')\n element.dataset.dshClaudeHostChrome = ''\n element.textContent = HOST_CHROME_CSS\n document.head.appendChild(element)\n const untrack = trackClaudePresetSeats()\n return () => {\n untrack()\n element.remove()\n }\n}\n","const DETAILS_MIN_WIDTH = 300\r\n// Wide enough for an ~80-column diff line once the gutter (line number,\r\n// marker, comment button) is subtracted; still clamped to half the frame.\r\nconst DETAILS_DEFAULT_WIDTH = 720\r\nconst DETAILS_MAX_RATIO = 0.5\r\nconst DRAG_THRESHOLD = 4\r\n\r\nexport function clampDetailsWidth(width: number, frameWidth: number): number {\r\n const maximum = Math.max(DETAILS_MIN_WIDTH, Math.floor(frameWidth * DETAILS_MAX_RATIO))\r\n return Math.min(maximum, Math.max(DETAILS_MIN_WIDTH, Math.round(width)))\r\n}\r\n\r\nexport function defaultDetailsWidth(frameWidth: number): number {\r\n return clampDetailsWidth(DETAILS_DEFAULT_WIDTH, frameWidth)\r\n}\r\n\r\nfunction pixelValue(value: string): number | undefined {\r\n const parsed = Number.parseFloat(value)\r\n return Number.isFinite(parsed) ? parsed : undefined\r\n}\r\n\r\n/**\r\n * Extends the native Details drag handle for the plugin Diff panel without\r\n * depending on DSH's private layout store. The returned cleanup restores every\r\n * inline value owned by the native frame.\r\n */\r\nexport function enableExpandedDetailsResize(): () => void {\r\n if (typeof document === 'undefined' || typeof window === 'undefined') return () => undefined\r\n\r\n let frame: HTMLElement | undefined\r\n let handle: HTMLElement | undefined\r\n let width: number | undefined\r\n let dragStartX = 0\r\n let dragStartWidth = 0\r\n let pointerId: number | undefined\r\n let dragged = false\r\n let originalGrid = ''\r\n let originalHandleLeft = ''\r\n let frameWasDragging = false\r\n let handleWasDragging = false\r\n let resizeObserver: ResizeObserver | undefined\r\n let mutationObserver: MutationObserver | undefined\r\n let animationFrame: number | undefined\r\n\r\n const applyWidth = (): void => {\r\n if (frame === undefined || handle === undefined || width === undefined) return\r\n const frameWidth = frame.getBoundingClientRect().width\r\n if (frameWidth <= 0) return\r\n width = clampDetailsWidth(width, frameWidth)\r\n const tracks = getComputedStyle(frame).gridTemplateColumns.split(/\\s+/u)\r\n const sidebar = pixelValue(tracks[0] ?? '') ?? 0\r\n const grid = `${sidebar}px minmax(0, 1fr) ${width}px`\r\n const left = `${frameWidth - width}px`\r\n if (frame.style.gridTemplateColumns !== grid) frame.style.gridTemplateColumns = grid\r\n if (handle.style.left !== left) handle.style.left = left\r\n }\r\n\r\n const scheduleApply = (): void => {\r\n if (animationFrame !== undefined) return\r\n animationFrame = window.requestAnimationFrame(() => {\r\n animationFrame = undefined\r\n applyWidth()\r\n })\r\n }\r\n\r\n const finishDrag = (): void => {\r\n if (pointerId === undefined) return\r\n pointerId = undefined\r\n if (frame !== undefined && !frameWasDragging) frame.removeAttribute('data-dragging')\r\n if (handle !== undefined && !handleWasDragging) handle.removeAttribute('data-dragging')\r\n }\r\n\r\n const onPointerMove = (event: PointerEvent): void => {\r\n if (event.pointerId !== pointerId || frame === undefined) return\r\n const delta = event.clientX - dragStartX\r\n if (!dragged && Math.abs(delta) < DRAG_THRESHOLD) return\r\n dragged = true\r\n width = clampDetailsWidth(dragStartWidth - delta, frame.getBoundingClientRect().width)\r\n applyWidth()\r\n event.preventDefault()\r\n }\r\n\r\n const onPointerEnd = (event: PointerEvent): void => {\r\n if (event.pointerId !== pointerId) return\r\n finishDrag()\r\n }\r\n\r\n const onPointerDown = (event: PointerEvent): void => {\r\n const target = event.target\r\n if (!(target instanceof Element)) return\r\n const candidate = target.closest<HTMLElement>('[data-side=\"details\"]')\r\n const candidateFrame = candidate?.parentElement\r\n if (candidate === null || candidate === undefined || candidateFrame === null || candidateFrame === undefined) return\r\n const currentFrame = candidateFrame\r\n const currentHandle = candidate\r\n const detailsColumn = currentFrame.children.item(2)\r\n const measuredWidth = detailsColumn instanceof HTMLElement ? detailsColumn.getBoundingClientRect().width : 0\r\n const frameWidth = currentFrame.getBoundingClientRect().width\r\n if (measuredWidth <= 0 || frameWidth <= 0) return\r\n\r\n const firstDrag = frame === undefined\r\n frame = currentFrame\r\n handle = currentHandle\r\n width = clampDetailsWidth(width ?? measuredWidth, frameWidth)\r\n dragStartWidth = width\r\n dragStartX = event.clientX\r\n pointerId = event.pointerId\r\n dragged = false\r\n if (firstDrag) {\r\n originalGrid = currentFrame.style.gridTemplateColumns\r\n originalHandleLeft = currentHandle.style.left\r\n frameWasDragging = currentFrame.hasAttribute('data-dragging')\r\n handleWasDragging = currentHandle.hasAttribute('data-dragging')\r\n }\r\n currentFrame.setAttribute('data-dragging', '')\r\n currentHandle.setAttribute('data-dragging', 'true')\r\n\r\n if (firstDrag) {\r\n resizeObserver = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(scheduleApply)\r\n resizeObserver?.observe(currentFrame)\r\n mutationObserver = typeof MutationObserver === 'undefined' ? undefined : new MutationObserver(scheduleApply)\r\n mutationObserver?.observe(currentFrame, { attributes: true, attributeFilter: ['style'] })\r\n mutationObserver?.observe(currentHandle, { attributes: true, attributeFilter: ['style'] })\r\n }\r\n\r\n event.preventDefault()\r\n event.stopPropagation()\r\n event.stopImmediatePropagation()\r\n }\r\n\r\n const applyDefaultWidth = (): void => {\r\n const initialHandle = document.querySelector<HTMLElement>('[data-side=\"details\"]')\r\n const initialFrame = initialHandle?.parentElement\r\n if (initialHandle === null || initialHandle === undefined || initialFrame === null || initialFrame === undefined) return\r\n frame = initialFrame\r\n handle = initialHandle\r\n originalGrid = frame.style.gridTemplateColumns\r\n originalHandleLeft = handle.style.left\r\n frameWasDragging = frame.hasAttribute('data-dragging')\r\n handleWasDragging = handle.hasAttribute('data-dragging')\r\n width = defaultDetailsWidth(frame.getBoundingClientRect().width)\r\n resizeObserver = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(scheduleApply)\r\n resizeObserver?.observe(frame)\r\n mutationObserver = typeof MutationObserver === 'undefined' ? undefined : new MutationObserver(scheduleApply)\r\n mutationObserver?.observe(frame, { attributes: true, attributeFilter: ['style'] })\r\n mutationObserver?.observe(handle, { attributes: true, attributeFilter: ['style'] })\r\n applyWidth()\r\n }\r\n\r\n animationFrame = window.requestAnimationFrame(() => {\r\n animationFrame = undefined\r\n applyDefaultWidth()\r\n })\r\n document.addEventListener('pointerdown', onPointerDown, true)\r\n window.addEventListener('pointermove', onPointerMove, true)\r\n window.addEventListener('pointerup', onPointerEnd, true)\r\n window.addEventListener('pointercancel', onPointerEnd, true)\r\n\r\n return () => {\r\n document.removeEventListener('pointerdown', onPointerDown, true)\r\n window.removeEventListener('pointermove', onPointerMove, true)\r\n window.removeEventListener('pointerup', onPointerEnd, true)\r\n window.removeEventListener('pointercancel', onPointerEnd, true)\r\n resizeObserver?.disconnect()\r\n mutationObserver?.disconnect()\r\n if (animationFrame !== undefined) window.cancelAnimationFrame(animationFrame)\r\n finishDrag()\r\n if (frame !== undefined) frame.style.gridTemplateColumns = originalGrid\r\n if (handle !== undefined) handle.style.left = originalHandleLeft\r\n }\r\n}\r\n","export const zh = {\r\n nav: 'Claude Code',\r\n title: 'Claude Code',\r\n description: 'DSH 使用本机 Claude Code,并保留其 Agent Loop、工具、CLAUDE.md、Skills、Hooks 与 MCP 配置。',\r\n activity: 'Claude Code 活动',\r\n detail: '查看已脱敏详情',\r\n thinking: '思考',\r\n running: '运行中',\r\n failed: '失败',\r\n done: '完成',\r\n subagent: '子代理',\r\n usedTool: '使用了 1 个工具',\r\n usedTools: '使用了 {count} 个工具',\r\n compacted: '已压缩上下文',\r\n compactedAuto: '已自动压缩上下文',\r\n toolInput: '输入',\r\n toolOutput: '输出',\r\n toolError: '错误',\r\n tokens: '{count} 个 token',\r\n doctor: '运行诊断',\r\n refreshing: '诊断中…',\r\n diagnostics: '运行状态',\r\n diagnosticsBody: '检查 Claude Code 可执行文件、登录状态、协议握手与当前进程配置。',\r\n diagnosticsLoading: '正在加载诊断信息…',\r\n executable: '可执行文件',\r\n version: '版本',\r\n authentication: '登录状态',\r\n handshake: '协议握手',\r\n processes: '活动进程',\r\n limits: '进程限制',\r\n processSummary: '共 {total} 个 · {active} 个活动中',\r\n limitSummary: '最多 {max} 个 · 空闲 {minutes} 分钟后回收',\r\n missing: '未找到',\r\n unknown: '未知',\r\n error: '诊断失败',\r\n security: '权限边界',\r\n securityBody: 'Claude 工具权限通过 DSH 审批界面决定;当前版本不宣称对 ~/.claude 与工作区之外路径提供内核级写入隔离。',\r\n globalSettings: 'Claude Code 设置',\r\n globalSettingsBody: '修改受支持的 Claude Code 与插件设置;其他字段会被保留。',\r\n globalSettingsLoading: '正在加载全局设置…',\r\n globalSettingsNewSession: '修改仅对新建 Claude 会话生效。',\r\n globalSettingsError: '全局设置保存失败',\r\n outputStyle: 'Output Style',\r\n worktreeBranchPrefix: 'Worktree 分支前缀',\r\n worktreeBranchPrefixEffect: '分支前缀修改会应用于之后自动创建的 Worktree 分支;显式指定的完整分支名不会被修改。',\r\n maxProcessesSetting: 'Claude 进程上限',\r\n idleTimeoutSetting: '闲置回收时长(分钟)',\r\n maxProcessesEffect: '进程上限在下次启动 Claude 进程时生效。留空或非法值会被拒绝。',\r\n idleTimeoutEffect: '闲置回收时长在下一次回合结束后生效。留空或非法值会被拒绝。',\r\n settingHint: '查看说明',\r\n pluginUpdate: '插件更新',\r\n pluginUpdateBody: '检查 npm 上的新版本。只有可唯一识别的 npm 安装才能直接更新;本地开发链接不会被替换。',\r\n updateNotChecked: '尚未检查更新。',\r\n installedVersion: '已安装版本',\r\n latestVersion: '最新版本',\r\n installSource: '安装来源',\r\n updateStatus: '更新状态',\r\n checkUpdates: '检查更新',\r\n checkingUpdates: '检查中…',\r\n updatePlugin: '更新',\r\n updatingPlugin: '更新中…',\r\n updateError: '更新失败',\r\n restartRequired: '需要重启 DSH Desktop 才能加载更新后的插件。',\r\n updateSource_registry: 'npm',\r\n updateSource_link: '本地开发链接',\r\n updateSource_unsupported: '不支持的来源',\r\n updateSource_unknown: '未知',\r\n updateState_current: '已是最新版本',\r\n updateState_available: '有可用更新',\r\n updateState_linked: '由链接的源码目录提供更新',\r\n updateState_unsupported: '此安装来源不支持自动更新',\r\n updateState_unavailable: '无法安全识别当前 DSH profile',\r\n updateState_error: '检查失败',\r\n tasks: '任务',\r\n tasksPanel: '后台任务',\r\n tasksPanelTurn: '本次执行的任务',\r\n tasksTurnNumber: '第 {turn} 轮',\r\n tasksEmpty: '当前没有子代理或后台任务',\r\n tasksOpen: '查看后台任务',\r\n tasksClose: '关闭任务面板',\r\n tasksRunning: '运行中',\r\n tasksNoneRunning: '当前没有运行中的任务',\r\n tasksSettled: '已结束',\r\n tasksClear: '清除',\r\n tasksViewActivity: '查看活动',\r\n tasksHideActivity: '收起活动',\r\n tasksRunningCount: '{count} 个运行中任务',\r\n planUsage: '账号额度',\r\n planUsageBody: '当前 Claude 订阅的用量窗口,来自 Claude Code 的 /usage 数据。会话空闲时自动刷新,也可随时手动刷新。',\r\n planUsageLoading: '读取中…',\r\n planUsageRefresh: '刷新额度',\r\n planUsageRefreshing: '刷新中…',\r\n planUsageUnavailable: '此账号没有订阅额度(API key、Bedrock、Vertex 等不受套餐限流)。',\r\n planUsageNever: '尚未获取额度数据,运行一次对话或点击刷新。',\r\n planUsageError: '额度读取失败',\r\n planUsageSubscription: '订阅',\r\n planUsageUpdated: '更新于 {age}前',\r\n planUsageResets: '{age}后重置',\r\n planUsageUsed: '已用 {percent}%',\r\n planWindow_five_hour: '5 小时',\r\n planWindow_seven_day: '全部模型 · 每周',\r\n planWindow_seven_day_opus: 'Opus · 每周',\r\n planWindow_seven_day_sonnet: 'Sonnet · 每周',\r\n tasksTurnRunning: '{count} 个任务执行中',\r\n tasksTurnCompleted: '{count} 个任务已完成',\r\n tasksTurnFailed: '{failed} 个任务失败,{completed} 个已完成',\r\n tasksToolUses: '{count} 次工具调用',\r\n tasksCompleted: '已完成',\r\n tasksFailed: '失败',\r\n tasksStopped: '已停止',\r\n tasksKilled: '已终止',\r\n tasksBackground: '后台',\r\n tasksLastTool: '最近工具 {tool}',\r\n repositoryOpen: '查看仓库与 PR 详情',\r\n repositoryPanel: '仓库状态',\r\n repositoryClose: '关闭仓库面板',\r\n repositorySection: '仓库',\r\n repositoryStatus: '状态',\r\n repositoryAvailable: '可用',\r\n repositoryUnavailable: '仓库状态不可用',\r\n repositoryNotGit: '非 Git 仓库',\r\n repositoryCwd: '会话目录',\r\n repositoryRoot: '仓库根目录',\r\n repositoryBranch: '分支',\r\n repositoryBranchSearch: '检索分支',\r\n repositoryBranchSearchEmpty: '没有匹配的分支',\r\n repositoryBranchRefresh: '刷新远程分支',\r\n repositoryBranchRefreshing: '正在刷新远程分支…',\r\n repositoryBranchRefreshed: '已刷新 · {count} 个分支',\r\n repositoryBranchRefreshFailed: '刷新远程分支失败',\r\n repositoryBranchRefreshStale: '宿主进程里的插件还是旧版本(没有刷新接口)。重启 DSH 后再试。',\r\n repositoryBranchesLoading: '正在加载分支…',\r\n repositoryProgressTitle: '正在创建 Worktree',\r\n repositoryProgressFailed: 'Worktree 创建失败',\r\n repositoryProgressDismiss: '关闭 Worktree 进度',\r\n repositoryProgress_inspecting: '检查仓库和分支',\r\n repositoryProgress_fetching: '刷新远程引用',\r\n 'repositoryProgress_creating-worktree': '创建分支和 Worktree',\r\n 'repositoryProgress_saving-worktree': '保存 Worktree 状态',\r\n 'repositoryProgress_switching-branch': '切换本地分支',\r\n 'repositoryProgress_creating-workspace': '创建 DSH Workspace',\r\n 'repositoryProgress_starting-session': '启动 Claude 会话',\r\n 'repositoryProgress_transferring-draft': '转移消息和附件',\r\n repositoryProgress_submitting: '提交消息',\r\n repositorySessionUnavailable: '无法准备目标会话。',\r\n repositoryDraftTransferFailed: '无法将草稿附件转移到 worktree 会话。',\r\n repositoryDetached: 'Detached HEAD',\r\n repositoryUnknownBranch: '未知分支',\r\n repositoryWorktree: 'Worktree',\r\n repositoryWorktreeLabel: 'Git worktree',\r\n repositoryChanges: '改动',\r\n repositoryModified: '有修改',\r\n repositoryClean: '干净',\r\n repositoryLocal: '本地仓库',\r\n repositoryPullRequest: 'Pull Request',\r\n repositoryNoPr: '当前分支没有关联 PR',\r\n repositoryPr: 'PR #{number}',\r\n repositoryPrDraft: '草稿 PR #{number}',\r\n repositoryPrState: 'PR 状态',\r\n repositoryDraft: '草稿',\r\n repositoryState_open: '开放',\r\n repositoryState_closed: '已关闭',\r\n repositoryState_merged: '已合并',\r\n repositoryMergedAgo: '{age}前',\r\n repositoryChecks: '检查',\r\n repositoryChecks_passing: '检查通过',\r\n repositoryChecks_pending: '检查进行中',\r\n repositoryChecks_failing: '检查失败',\r\n repositoryChecks_none: '无检查',\r\n repositoryReview: '评审',\r\n repositoryReview_approved: '已批准',\r\n 'repositoryReview_changes-requested': '要求修改',\r\n 'repositoryReview_review-required': '等待评审',\r\n repositoryReview_none: '无评审状态',\r\n repositoryMergeState: '合并状态',\r\n repositoryOpenPr: '在浏览器中打开 PR #{number}',\r\n yes: '是',\r\n no: '否',\r\n diffOpen: '查看分支改动',\r\n diffClose: '关闭 Diff 面板',\r\n sessionMenu: '会话菜单',\r\n sessionMenuOpenIn: '打开方式',\r\n sessionMenuOpenFailed: '无法打开:{message}',\r\n presetHeaderHint: '当前会话运行的 Agent 预设',\r\n diffWorkingTree: '分支改动',\r\n diffFiles: '{count} 个已修改文件',\r\n diffFilesShort: '{count} 个文件',\r\n diffTruncated: 'Diff 超出安全显示上限。请在终端中查看完整内容。',\r\n diffEmpty: '没有可显示的 tracked 文件改动',\r\n diffMaximize: '最大化 Diff 面板',\r\n diffRestore: '还原 Diff 面板',\r\n diffCommit: 'Commit',\r\n diffCommitMenu: '打开提交操作菜单',\r\n diffCommitPush: 'Commit & Push…',\r\n diffPush: 'Push',\r\n diffCreatePr: 'Create PR…',\r\n diffConfirmDescription: '确认仓库快照和将要执行的 Git 操作。',\r\n diffPushDescription: '将本地未推送的 commit 推送到远端分支。',\r\n diffPushAhead: '{count} 个未推送的 commit',\r\n diffPushCompleted: '已推送 commit {commit}',\r\n diffGeneratingMessage: '正在读取仓库并生成 commit message…',\r\n diffActionFailed: '仓库操作失败。',\r\n diffIncludeUnstaged: '包含 unstaged 和 untracked 改动',\r\n diffCommitMessage: 'Commit message',\r\n diffStaged: 'Staged',\r\n diffUnstaged: 'Unstaged',\r\n diffStagedUnstaged: 'Staged + unstaged',\r\n diffUntracked: 'Untracked',\r\n diffPrTitle: 'PR title',\r\n diffPrBase: 'Base branch',\r\n diffPrBaseDefault: '使用远端默认分支',\r\n diffPrDescription: 'PR description(仅 Summary 与 Changes)',\r\n diffPrDraft: '创建为 Draft PR',\r\n diffCancel: '取消',\r\n diffConfirm: '确认',\r\n diffSubmitting: '执行中…',\r\n diffDone: '完成',\r\n diffCommitCompleted: '已创建 commit {commit}',\r\n diffCommitPreserved: '本地 commit {commit} 已保留。',\r\n diffOpenPr: '打开 Pull Request',\r\n diffMergePr: 'Merge',\r\n repositoryMergeMenu: '打开 PR 合并选项',\r\n diffMerge_merge: '合并提交 (merge)',\r\n diffMerge_squash: 'Squash 合并',\r\n diffMerge_rebase: 'Rebase 合并',\r\n diffMergeDescription: '使用所选方式合并当前分支的 Pull Request。',\r\n diffMergeCompleted: '已合并 PR #{number}',\r\n diffUpdateBranch: 'Update branch…',\r\n repositoryUpdateBranch: 'Update branch',\r\n diffUpdateBranchDescription: '用 origin/{base} 更新当前分支并推送;出现冲突时可交给 Claude 解决。',\r\n diffUpdateBranch_rebase: 'Rebase 到 origin/{base}(改写历史,以 --force-with-lease 推送)',\r\n diffUpdateBranch_merge: '将 origin/{base} 合并进当前分支',\r\n diffUpdateBranchBehind: '落后 origin/{base} {count} 个 commit',\r\n diffUpdateBranchCompleted: '已更新并推送 commit {commit}',\r\n diffUpdateBranchConflicts: '更新产生冲突,以下文件需要解决:',\r\n diffUpdateBranchResolve: '让 Claude 解决冲突',\r\n repositoryChecksOpen: '查看失败的检查',\r\n checksCardTitle: '失败的检查',\r\n checksCardLoading: '正在读取检查详情…',\r\n checksCardEmpty: '未能读取失败详情',\r\n checksCardFix: '让 Claude 修复',\r\n prCommentsButton: 'GitHub 评论 ({count})',\r\n prCommentsSend: '让 Claude 处理 GitHub 上的 PR 评论',\r\n autoFixLabel: 'Auto fix',\r\n autoFixTitle: '自动监听这个 PR 的 review 评论与 CI 失败,交给 Claude 修复并推送,直到全部通过;取消勾选即停止。',\r\n queueCount: '{n} 条排队消息',\r\n queueEdit: '编辑',\r\n queueEditUnsupported: '包含非文本内容,无法编辑',\r\n queueSave: '保存',\r\n queueCancelEdit: '取消编辑',\r\n queueRemove: '删除',\r\n queueSteer: '插入当前回合',\r\n queueSteerUnavailable: '没有正在运行的回合',\r\n queueEditFailed: '排队消息编辑失败。',\r\n queueRemoveFailed: '排队消息删除失败。',\r\n queueSteerFailed: '排队消息插入失败。',\r\n heroTicket: 'Ticket',\r\n heroTicketMenu: '选择 Jira ticket',\r\n heroTicketSearch: '搜索 ticket 或输入 key…',\r\n heroTicketLoading: '搜索中…',\r\n heroTicketEmpty: '没有匹配的 ticket',\r\n heroTicketNone: '清除已选 ticket',\r\n heroTicketRemove: '移除 {key}',\r\n heroTicketCount: '{count} 个 ticket',\r\n heroBatchStarted: '已为 {count} 个 ticket 各自创建 Worktree 会话并开工',\r\n heroTicketNotConnected: '请先在 Settings 中连接 Jira',\r\n heroTicketFailed: 'Ticket 搜索失败',\r\n jiraTitle: 'Jira',\r\n jiraBody: '连接 Jira Cloud 后,新会话可以直接从 ticket 开工:分支按 ticket key 命名,输入框预填 ticket 简报,worktree 创建后自动把 ticket 分配给你。',\r\n jiraSite: '站点地址',\r\n jiraSitePlaceholder: 'https://your-team.atlassian.net',\r\n jiraEmail: '账号邮箱',\r\n jiraToken: 'API Token',\r\n jiraTokenHelp: '在 Atlassian 创建 API Token',\r\n jiraConnect: '连接',\r\n jiraConnecting: '正在验证…',\r\n jiraDisconnect: '断开连接',\r\n jiraConnected: '已连接',\r\n jiraLoading: '正在读取 Jira 状态…',\r\n jiraError: 'Jira 操作失败',\r\n cleanupButton: 'Clean up',\r\n cleanupTitle: '清理已合并分支',\r\n cleanupDescription: '删除 worktree 与本地分支,并归档对应 workspace 的会话后移除 workspace;普通 checkout 则切回 base 分支并删除已合并分支。',\r\n cleanupCompleted: '已清理 {branch}',\r\n overviewOpen: '打开 Claude 会话看板',\r\n overviewTitle: '会话看板',\r\n overviewBody: '所有 Claude 会话的运行状态、分支与 PR',\r\n overviewEmpty: '没有正在进行的 Claude 会话',\r\n overviewNoPr: '无 PR',\r\n overviewRunning: '运行中',\r\n overviewNeedsPermission: '等待权限确认',\r\n overviewNeedsAnswer: '等待回答',\r\n overviewContextUsage: '上下文 {percentage}%',\r\n overviewAutoFix: 'Auto fix 已开启',\r\n overviewLoading: '读取中…',\r\n askToolbar: '选中文本操作',\r\n askTooltip: '针对选中内容追问',\r\n copyTooltip: '复制',\r\n askCopied: '已复制',\r\n askPlaceholder: '针对选中内容提问…',\r\n askSubmit: '发送',\r\n askStarting: '正在启动 Claude…',\r\n askThinking: '思考中…',\r\n askThinkingLive: '思考中 ·',\r\n askThinkingLabel: 'Think ·',\r\n askCopyAnswer: '复制回答',\r\n askSendToChat: '转发到对话',\r\n askClose: '关闭',\r\n askFailed: '提问失败',\r\n reviewCommentAdd: '添加行评论',\r\n reviewCommentPlaceholder: '请求更改',\r\n reviewCommentSubmit: '注释',\r\n reviewCommentCancel: '取消',\r\n reviewCommentRemove: '删除评论',\r\n reviewCommentFailed: '评论操作失败。',\r\n reviewCommentsClear: '清除全部评论',\r\n reviewCommentsSend: '发送评论',\r\n reviewCommentsSendDraft: '请处理以上代码评论。',\r\n reviewCommentOldSide: '旧代码第 {line} 行',\r\n reviewCommentNewSide: '第 {line} 行',\r\n reviewCommentOldRange: '旧代码第 {start}–{end} 行',\r\n reviewCommentNewRange: '第 {start}–{end} 行',\r\n diffUnmodifiedLines: '{count} 行未修改',\r\n diffUnmodifiedTail: '文件末尾之前还有未修改的行',\r\n diffExpandUp: '向上展开',\r\n diffExpandDown: '向下展开',\r\n diffFileComments: '{count} 条评论',\r\n rewindTooltip: '回退到此处',\r\n rewindTitle: '回退到这条消息之前',\r\n rewindDescription: '将删除这条消息及其下方的 {count} 条内容,并让 Claude 回到发送它之前的上下文。此操作不可撤销。',\r\n rewindHint: '被删除的内容会从这个会话中隐藏,Claude 也会忘记它们;消息原文会放回输入框,方便修改后重新发送。',\r\n rewindConfirm: '删除并回退',\r\n rewindSubmitting: '回退中…',\r\n rewindFailed: '回退失败({code})。',\r\n rewindBusy: '这个会话正在运行,请等本轮结束后再回退。',\r\n rewindStale: '宿主进程里的插件还是旧版本(没有回退接口)。重启 DSH 后再试。',\r\n} as const\r\n\r\nexport const en = {\r\n nav: 'Claude Code',\r\n title: 'Claude Code',\r\n description: 'DSH uses the local Claude Code and preserves its agent loop, tools, CLAUDE.md, Skills, Hooks, and MCP configuration.',\r\n activity: 'Claude Code activity',\r\n detail: 'Show redacted detail',\r\n thinking: 'Think',\r\n running: 'Running',\r\n failed: 'Failed',\r\n done: 'Done',\r\n subagent: 'Subagent',\r\n usedTool: 'Used 1 tool',\r\n usedTools: 'Used {count} tools',\r\n compacted: 'Context compacted',\r\n compactedAuto: 'Context auto-compacted',\r\n toolInput: 'Input',\r\n toolOutput: 'Output',\r\n toolError: 'Error',\r\n tokens: '{count} tokens',\r\n doctor: 'Run Doctor',\r\n refreshing: 'Running Doctor…',\r\n diagnostics: 'Runtime status',\r\n diagnosticsBody: 'Check the Claude Code executable, authentication, protocol handshake, and current process configuration.',\r\n diagnosticsLoading: 'Loading diagnostics…',\r\n executable: 'Executable',\r\n version: 'Version',\r\n authentication: 'Authentication',\r\n handshake: 'Protocol handshake',\r\n processes: 'Live processes',\r\n limits: 'Process limits',\r\n processSummary: '{total} total · {active} active',\r\n limitSummary: '{max} max · {minutes} min idle',\r\n missing: 'Not found',\r\n unknown: 'Unknown',\r\n error: 'Doctor failed',\r\n security: 'Permission boundary',\r\n securityBody: 'Claude tool permissions are decided through the DSH approval UI. This version does not claim kernel-level write isolation for ~/.claude or paths outside the workspace.',\r\n globalSettings: 'Claude Code settings',\r\n globalSettingsBody: 'Modify supported Claude Code and plugin settings while preserving every other field.',\r\n globalSettingsLoading: 'Loading global settings…',\r\n globalSettingsNewSession: 'Changes apply only to new Claude sessions.',\r\n globalSettingsError: 'Global settings save failed',\r\n outputStyle: 'Output Style',\r\n worktreeBranchPrefix: 'Worktree branch prefix',\r\n worktreeBranchPrefixEffect: 'Prefix changes apply to subsequently generated Worktree branches. Explicit full branch names remain unchanged.',\r\n maxProcessesSetting: 'Claude process limit',\r\n idleTimeoutSetting: 'Idle timeout (minutes)',\r\n maxProcessesEffect: 'The process limit applies when the next Claude process is admitted. Blank or invalid values are rejected.',\r\n idleTimeoutEffect: 'The idle timeout applies after the next completed turn. Blank or invalid values are rejected.',\r\n settingHint: 'Show details',\r\n pluginUpdate: 'Plugin updates',\r\n pluginUpdateBody: 'Check npm for new releases. Only a uniquely identified npm installation can update in place; local development links are never replaced.',\r\n updateNotChecked: 'Updates have not been checked yet.',\r\n installedVersion: 'Installed version',\r\n latestVersion: 'Latest version',\r\n installSource: 'Installation source',\r\n updateStatus: 'Update status',\r\n checkUpdates: 'Check for updates',\r\n checkingUpdates: 'Checking…',\r\n updatePlugin: 'Update',\r\n updatingPlugin: 'Updating…',\r\n updateError: 'Update failed',\r\n restartRequired: 'Restart DSH Desktop to load the updated plugin.',\r\n updateSource_registry: 'npm',\r\n updateSource_link: 'Local development link',\r\n updateSource_unsupported: 'Unsupported source',\r\n updateSource_unknown: 'Unknown',\r\n updateState_current: 'Up to date',\r\n updateState_available: 'Update available',\r\n updateState_linked: 'Updated from the linked source checkout',\r\n updateState_unsupported: 'This installation source cannot update automatically',\r\n updateState_unavailable: 'The active DSH profile cannot be identified safely',\r\n updateState_error: 'Check failed',\r\n tasks: 'Tasks',\r\n tasksPanel: 'Background tasks',\r\n tasksPanelTurn: 'Tasks for this run',\r\n tasksTurnNumber: 'Turn {turn}',\r\n tasksEmpty: 'No subagents or background tasks',\r\n tasksOpen: 'Show background tasks',\r\n tasksClose: 'Close tasks panel',\r\n tasksRunning: 'Running',\r\n tasksNoneRunning: 'No tasks are running',\r\n tasksSettled: 'Finished',\r\n tasksClear: 'Clear',\r\n tasksViewActivity: 'View activity',\r\n tasksHideActivity: 'Hide activity',\r\n tasksRunningCount: '{count} running task(s)',\r\n planUsage: 'Plan usage',\r\n planUsageBody: \"Utilization windows for the signed-in Claude subscription, from Claude Code's /usage data. Refreshes whenever a session goes idle, and on demand.\",\r\n planUsageLoading: 'Loading…',\r\n planUsageRefresh: 'Refresh usage',\r\n planUsageRefreshing: 'Refreshing…',\r\n planUsageUnavailable: 'This account has no plan limits (API key, Bedrock, and Vertex sessions are not rate limited by a subscription).',\r\n planUsageNever: 'No usage data yet — run a turn or refresh.',\r\n planUsageError: 'Usage lookup failed',\r\n planUsageSubscription: 'Subscription',\r\n planUsageUpdated: 'Updated {age} ago',\r\n planUsageResets: 'Resets in {age}',\r\n planUsageUsed: '{percent}% used',\r\n planWindow_five_hour: '5-hour',\r\n planWindow_seven_day: 'All models · weekly',\r\n planWindow_seven_day_opus: 'Opus · weekly',\r\n planWindow_seven_day_sonnet: 'Sonnet · weekly',\r\n tasksTurnRunning: '{count} task(s) running',\r\n tasksTurnCompleted: '{count} task(s) completed',\r\n tasksTurnFailed: '{failed} failed, {completed} completed',\r\n tasksToolUses: '{count} tool use(s)',\r\n tasksCompleted: 'Completed',\r\n tasksFailed: 'Failed',\r\n tasksStopped: 'Stopped',\r\n tasksKilled: 'Killed',\r\n tasksBackground: 'Background',\r\n tasksLastTool: 'Last tool {tool}',\r\n repositoryOpen: 'Show repository and pull request details',\r\n repositoryPanel: 'Repository status',\r\n repositoryClose: 'Close repository panel',\r\n repositorySection: 'Repository',\r\n repositoryStatus: 'Status',\r\n repositoryAvailable: 'Available',\r\n repositoryUnavailable: 'Repository status unavailable',\r\n repositoryNotGit: 'Not a Git repository',\r\n repositoryCwd: 'Session directory',\r\n repositoryRoot: 'Repository root',\r\n repositoryBranch: 'Branch',\r\n repositoryBranchSearch: 'Search branches',\r\n repositoryBranchSearchEmpty: 'No matching branches',\r\n repositoryBranchRefresh: 'Refresh remote branches',\r\n repositoryBranchRefreshing: 'Refreshing remote branches…',\r\n repositoryBranchRefreshed: 'Refreshed · {count} branches',\r\n repositoryBranchRefreshFailed: 'Could not refresh remote branches',\r\n repositoryBranchRefreshStale: 'The Host process is still running the previous plugin build, which has no refresh route. Restart DSH and try again.',\r\n repositoryBranchesLoading: 'Loading branches…',\r\n repositoryProgressTitle: 'Creating Worktree',\r\n repositoryProgressFailed: 'Worktree creation failed',\r\n repositoryProgressDismiss: 'Dismiss Worktree progress',\r\n repositoryProgress_inspecting: 'Checking repository and branch',\r\n repositoryProgress_fetching: 'Refreshing remote references',\r\n 'repositoryProgress_creating-worktree': 'Creating branch and Worktree',\r\n 'repositoryProgress_saving-worktree': 'Saving Worktree state',\r\n 'repositoryProgress_switching-branch': 'Switching local branch',\r\n 'repositoryProgress_creating-workspace': 'Creating DSH Workspace',\r\n 'repositoryProgress_starting-session': 'Starting Claude session',\r\n 'repositoryProgress_transferring-draft': 'Transferring message and attachments',\r\n repositoryProgress_submitting: 'Submitting message',\r\n repositorySessionUnavailable: 'The target session could not be prepared.',\r\n repositoryDraftTransferFailed: 'Draft attachments could not be moved to the worktree session.',\r\n repositoryDetached: 'Detached HEAD',\r\n repositoryUnknownBranch: 'Unknown branch',\r\n repositoryWorktree: 'Worktree',\r\n repositoryWorktreeLabel: 'Git worktree',\r\n repositoryChanges: 'Changes',\r\n repositoryModified: 'Modified',\r\n repositoryClean: 'Clean',\r\n repositoryLocal: 'Local repository',\r\n repositoryPullRequest: 'Pull request',\r\n repositoryNoPr: 'No pull request for this branch',\r\n repositoryPr: 'PR #{number}',\r\n repositoryPrDraft: 'Draft PR #{number}',\r\n repositoryPrState: 'PR state',\r\n repositoryDraft: 'Draft',\r\n repositoryState_open: 'Open',\r\n repositoryState_closed: 'Closed',\r\n repositoryState_merged: 'Merged',\r\n repositoryMergedAgo: '{age} ago',\r\n repositoryChecks: 'Checks',\r\n repositoryChecks_passing: 'Checks passing',\r\n repositoryChecks_pending: 'Checks pending',\r\n repositoryChecks_failing: 'Checks failing',\r\n repositoryChecks_none: 'No checks',\r\n repositoryReview: 'Review',\r\n repositoryReview_approved: 'Approved',\r\n 'repositoryReview_changes-requested': 'Changes requested',\r\n 'repositoryReview_review-required': 'Review required',\r\n repositoryReview_none: 'No review status',\r\n repositoryMergeState: 'Merge state',\r\n repositoryOpenPr: 'Open PR #{number} in browser',\r\n yes: 'Yes',\r\n no: 'No',\r\n diffOpen: 'View branch changes',\r\n diffClose: 'Close diff panel',\r\n sessionMenu: 'Session menu',\r\n sessionMenuOpenIn: 'Open in',\r\n sessionMenuOpenFailed: 'Could not open: {message}',\r\n presetHeaderHint: 'The agent preset this session runs',\r\n diffWorkingTree: 'Branch changes',\r\n diffFiles: '{count} modified file(s)',\r\n diffFilesShort: '{count} files',\r\n diffTruncated: 'The diff exceeds the safe display limit. Use the terminal to inspect the complete content.',\r\n diffEmpty: 'No tracked file changes to display',\r\n diffMaximize: 'Maximize diff panel',\r\n diffRestore: 'Restore diff panel',\r\n diffCommit: 'Commit',\r\n diffCommitMenu: 'Open commit actions',\r\n diffCommitPush: 'Commit & Push…',\r\n diffPush: 'Push',\r\n diffCreatePr: 'Create PR…',\r\n diffConfirmDescription: 'Confirm the repository snapshot and Git operation.',\r\n diffPushDescription: 'Push local commits to the remote branch.',\r\n diffPushAhead: '{count} unpushed commit(s)',\r\n diffPushCompleted: 'Pushed commit {commit}',\r\n diffGeneratingMessage: 'Reading the repository and generating a commit message…',\r\n diffActionFailed: 'Repository action failed.',\r\n diffIncludeUnstaged: 'Include unstaged and untracked changes',\r\n diffCommitMessage: 'Commit message',\r\n diffStaged: 'Staged',\r\n diffUnstaged: 'Unstaged',\r\n diffStagedUnstaged: 'Staged + unstaged',\r\n diffUntracked: 'Untracked',\r\n diffPrTitle: 'PR title',\r\n diffPrBase: 'Base branch',\r\n diffPrBaseDefault: 'Use the remote default branch',\r\n diffPrDescription: 'PR description (Summary and Changes only)',\r\n diffPrDraft: 'Create as a Draft PR',\r\n diffCancel: 'Cancel',\r\n diffConfirm: 'Confirm',\r\n diffSubmitting: 'Working…',\r\n diffDone: 'Done',\r\n diffCommitCompleted: 'Created commit {commit}',\r\n diffCommitPreserved: 'Local commit {commit} was preserved.',\r\n diffOpenPr: 'Open pull request',\r\n diffMergePr: 'Merge',\r\n repositoryMergeMenu: 'Open merge options',\r\n diffMerge_merge: 'Create a merge commit',\r\n diffMerge_squash: 'Squash and merge',\r\n diffMerge_rebase: 'Rebase and merge',\r\n diffMergeDescription: 'Merge the pull request for this branch with the selected method.',\r\n diffMergeCompleted: 'Merged PR #{number}',\r\n diffUpdateBranch: 'Update branch…',\r\n repositoryUpdateBranch: 'Update branch',\r\n diffUpdateBranchDescription: 'Update the current branch from origin/{base} and push; hand any conflicts to Claude.',\r\n diffUpdateBranch_rebase: 'Rebase onto origin/{base} (rewrites history, pushes with --force-with-lease)',\r\n diffUpdateBranch_merge: 'Merge origin/{base} into the current branch',\r\n diffUpdateBranchBehind: '{count} commit(s) behind origin/{base}',\r\n diffUpdateBranchCompleted: 'Updated and pushed commit {commit}',\r\n diffUpdateBranchConflicts: 'The update left conflicts in these files:',\r\n diffUpdateBranchResolve: 'Have Claude resolve the conflicts',\r\n repositoryChecksOpen: 'Show failing checks',\r\n checksCardTitle: 'Failing checks',\r\n checksCardLoading: 'Loading check details…',\r\n checksCardEmpty: 'No failure details available',\r\n checksCardFix: 'Have Claude fix these',\r\n prCommentsButton: 'GitHub comments ({count})',\r\n prCommentsSend: 'Have Claude address the GitHub pull request comments',\r\n autoFixLabel: 'Auto fix',\r\n autoFixTitle: 'Watch this pull request for review comments and failing checks, hand them to Claude to fix and push until everything passes; uncheck to stop.',\r\n queueCount: '{n} queued messages',\r\n queueEdit: 'Edit',\r\n queueEditUnsupported: 'Contains non-text content and cannot be edited',\r\n queueSave: 'Save',\r\n queueCancelEdit: 'Cancel edit',\r\n queueRemove: 'Remove',\r\n queueSteer: 'Steer into the running turn',\r\n queueSteerUnavailable: 'No running turn to steer into',\r\n queueEditFailed: 'The queued message could not be edited.',\r\n queueRemoveFailed: 'The queued message could not be removed.',\r\n queueSteerFailed: 'The queued message could not be steered.',\r\n heroTicket: 'Ticket',\r\n heroTicketMenu: 'Pick a Jira ticket',\r\n heroTicketSearch: 'Search tickets or enter a key…',\r\n heroTicketLoading: 'Searching…',\r\n heroTicketEmpty: 'No matching tickets',\r\n heroTicketNone: 'Clear selected tickets',\r\n heroTicketRemove: 'Remove {key}',\r\n heroTicketCount: '{count} tickets',\r\n heroBatchStarted: 'Kicked off {count} tickets, each in its own worktree session',\r\n heroTicketNotConnected: 'Connect Jira in Settings first',\r\n heroTicketFailed: 'Ticket search failed',\r\n jiraTitle: 'Jira',\r\n jiraBody: 'Connect Jira Cloud to start new sessions from a ticket: the branch is named after the ticket key, the composer is seeded with the ticket brief, and the ticket is assigned to you once the worktree exists.',\r\n jiraSite: 'Site URL',\r\n jiraSitePlaceholder: 'https://your-team.atlassian.net',\r\n jiraEmail: 'Account email',\r\n jiraToken: 'API token',\r\n jiraTokenHelp: 'Create an API token at Atlassian',\r\n jiraConnect: 'Connect',\r\n jiraConnecting: 'Verifying…',\r\n jiraDisconnect: 'Disconnect',\r\n jiraConnected: 'Connected',\r\n jiraLoading: 'Loading Jira status…',\r\n jiraError: 'Jira request failed',\r\n cleanupButton: 'Clean up',\r\n cleanupTitle: 'Clean up merged branch',\r\n cleanupDescription: 'Remove the worktree and local branch, then archive the workspace sessions and delete the workspace; a plain checkout switches back to the base branch and deletes the merged branch.',\r\n cleanupCompleted: 'Cleaned up {branch}',\r\n overviewOpen: 'Open the Claude session board',\r\n overviewTitle: 'Session board',\r\n overviewBody: 'Run state, branch, and pull request across Claude sessions',\r\n overviewEmpty: 'No active Claude sessions',\r\n overviewNoPr: 'No PR',\r\n overviewRunning: 'Running',\r\n overviewNeedsPermission: 'Awaiting approval',\r\n overviewNeedsAnswer: 'Awaiting answer',\r\n overviewContextUsage: 'Context {percentage}%',\r\n overviewAutoFix: 'Auto fix on',\r\n overviewLoading: 'Loading…',\r\n askToolbar: 'Selection actions',\r\n askTooltip: 'Ask about this',\r\n copyTooltip: 'Copy',\r\n askCopied: 'Copied',\r\n askPlaceholder: 'Ask about the selected text…',\r\n askSubmit: 'Ask',\r\n askStarting: 'Starting Claude…',\r\n askThinking: 'Thinking…',\r\n askThinkingLive: 'Thinking ·',\r\n askThinkingLabel: 'Think ·',\r\n askCopyAnswer: 'Copy answer',\r\n askSendToChat: 'Send to chat',\r\n askClose: 'Close',\r\n askFailed: 'The question could not be answered',\r\n reviewCommentAdd: 'Add line comment',\r\n reviewCommentPlaceholder: 'Request changes',\r\n reviewCommentSubmit: 'Comment',\r\n reviewCommentCancel: 'Cancel',\r\n reviewCommentRemove: 'Remove comment',\r\n reviewCommentFailed: 'The comment could not be saved.',\r\n reviewCommentsClear: 'Clear all comments',\r\n reviewCommentsSend: 'Send comments',\r\n reviewCommentsSendDraft: 'Please address the attached review comments.',\r\n reviewCommentOldSide: 'Old line {line}',\r\n reviewCommentNewSide: 'Line {line}',\r\n reviewCommentOldRange: 'Old lines {start}–{end}',\r\n reviewCommentNewRange: 'Lines {start}–{end}',\r\n diffUnmodifiedLines: '{count} unmodified lines',\r\n diffUnmodifiedTail: 'More unmodified lines below',\r\n diffExpandUp: 'Expand up',\r\n diffExpandDown: 'Expand down',\r\n diffFileComments: '{count} comments',\r\n rewindTooltip: 'Rewind to here',\r\n rewindTitle: 'Rewind to before this message',\r\n rewindDescription: 'This removes the message and the {count} entries below it, and returns Claude to the context it had before you sent it. This cannot be undone.',\r\n rewindHint: 'The removed entries are hidden from this session and Claude forgets them; the message text goes back to the composer so you can edit and resend it.',\r\n rewindConfirm: 'Delete and rewind',\r\n rewindSubmitting: 'Rewinding…',\r\n rewindFailed: 'The rewind failed ({code}).',\r\n rewindBusy: 'This session is running; wait for the turn to finish before rewinding.',\r\n rewindStale: 'The Host process is still running the previous plugin build, which has no rewind route. Restart DSH and try again.',\r\n} as const\r\n\r\nexport type ClaudeCodeSettingsKey = keyof typeof en\r\n","import { useSyncExternalStore } from 'react'\r\nimport type { ConnectionHandle } from '@deepseek-ai/dsh-client-connection/client'\r\nimport type { ClientContext, ISessions, IWorkspaces, SessionId } from '@deepseek-ai/dsh-client-runtime/client'\r\nimport type { IConversation } from '@deepseek-ai/dsh-client-ui-conversation/client'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-input-trigger/client'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\r\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\r\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\r\nimport { claudeActiveTasksDefinition, claudeActivityStepDefinition, claudeTurnDefinition, selectClaudeTurn } from './conversation-sidecar.ts'\r\nimport { ClaudeActivityTail, type ClaudeActivityTailInjected } from './ClaudeActivityTail.tsx'\r\nimport { ClaudeActiveTasksNode } from './ClaudeActiveTasksNode.tsx'\r\nimport { ClaudeActivityNode } from './ClaudeActivityNode.tsx'\r\nimport { ClaudeCodeSettings, type ClaudeCodeSettingsInjected } from './ClaudeCodeSettings.tsx'\r\nimport { ClaudeTasksPanel, type ClaudeTasksPanelInjected } from './ClaudeTasksPanel.tsx'\r\nimport { ClaudeRepositoryStatus, type ClaudeRepositoryStatusInjected } from './ClaudeRepositoryStatus.tsx'\r\nimport { ClaudeReviewComments, type ClaudeReviewCommentsInjected } from './ClaudeReviewComments.tsx'\r\nimport { ClaudeDiffPanel, type ClaudeDiffPanelInjected } from './ClaudeDiffPanel.tsx'\r\nimport { ClaudeDiffOverlay } from './ClaudeDiffOverlay.tsx'\r\nimport { ClaudeQueueDock, type ClaudeQueueDockInjected } from './ClaudeQueueDock.tsx'\r\nimport { ClaudePullRequestsPanel, type ClaudePullRequestsPanelInjected } from './ClaudePullRequestsPanel.tsx'\r\nimport { ClaudeSelectionAsk } from './ClaudeSelectionAsk.tsx'\r\nimport { ClaudeRewind, type ClaudeChatSource, type ClaudeRewindInjected } from './ClaudeRewind.tsx'\r\nimport { ClaudeHeroRepositoryControls, type ClaudeHeroRepositoryControlsInjected } from './ClaudeHeroRepositoryControls.tsx'\r\nimport { ClaudeDiffHeaderAction, type ClaudeDiffHeaderActionInjected } from './ClaudeDiffHeaderAction.tsx'\r\nimport { ClaudeSessionMenu, type ClaudeSessionMenuInjected } from './ClaudeSessionMenu.tsx'\r\nimport { ClaudeAgentPresetLabel, type ClaudeAgentPresetLabelInjected } from './ClaudeAgentPresetLabel.tsx'\r\nimport { AgentPresetRoster, type AgentPresetRosterApi } from './agent-preset-roster.ts'\r\nimport { DiffOpenStore } from './diff-open-store.ts'\r\nimport { ClaudeProjectionStore, type ClaudeProjectionSource } from './projection.ts'\r\nimport { createClaudeCommandSource } from './claude-command-source.ts'\r\nimport { restyleHostChrome } from './host-chrome.ts'\r\nimport { enableExpandedDetailsResize } from './details-resize.ts'\r\nimport { bindRepositoryLease, loadRepositoryStatusFor, prepareRepository, type RepositoryPreparationStage } from './repository-setup-api.ts'\r\nimport { assignJiraTicket, ticketContext, ticketPrompt } from './jira-api.ts'\r\nimport { en, zh, type ClaudeCodeSettingsKey } from './locales.ts'\r\n\r\n/** The right-side details column slot declared by dsh-client-ui-layout\r\n * (kind 'single', scope 'session'). Merged locally because this package does\r\n * not depend on the layout package's client types. */\r\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\r\n interface SlotMap {\r\n details: { kind: 'single'; scope: 'session' }\r\n 'shell.overlay': { kind: 'list'; scope: 'root' }\r\n }\r\n}\r\n\r\ninterface LayoutFace {\r\n openDetails(): void\r\n closeDetails(): void\r\n}\r\n\r\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\r\n interface LocaleNamespaceMap {\r\n 'settings.claude-code': ClaudeCodeSettingsKey\r\n }\r\n}\r\n\r\nfunction MaximizedDiff({\r\n source, t, sessionId, closeDetails, restore, submitPrompt,\r\n}: {\r\n source: ClaudeProjectionSource\r\n t: ClaudeDiffPanelInjected['t']\r\n sessionId: string\r\n closeDetails: () => void\r\n restore: () => void\r\n submitPrompt?: (draft: string, mode?: 'append' | 'idle') => boolean\r\n}) {\r\n const snapshot = useSyncExternalStore(source.subscribe, source.getSnapshot, source.getSnapshot)\r\n const useClaudeProjection = <S,>(selector: (value: typeof snapshot) => S): S => selector(snapshot)\r\n return <ClaudeDiffOverlay onRestore={restore}><ClaudeDiffPanel\r\n useClaudeProjection={useClaudeProjection}\r\n t={t}\r\n sessionId={sessionId}\r\n maximized\r\n closeDetails={closeDetails}\r\n toggleMaximized={restore}\r\n {...(submitPrompt === undefined ? {} : { submitPrompt })}\r\n /></ClaudeDiffOverlay>\r\n}\r\n\r\nexport const name = 'dsh-claude-client'\r\nexport const inject = ['slots', 'locale', 'conversationEvents', 'sessions', 'workspaces', 'inputTriggers', 'conversation', 'connection']\r\n\r\nexport function apply(ctx: ClientContext): void {\r\n const namespace = 'settings.claude-code'\r\n ctx.effect(() => ctx.locale.register(namespace, { zh, en }), 'dsh-claude: client copy')\r\n const t = ctx.locale.bind(namespace) as ClaudeCodeSettingsInjected['t']\r\n ctx.effect(() => restyleHostChrome(), 'dsh-claude: Host chrome restyling')\r\n const projections = new ClaudeProjectionStore()\r\n ctx.effect(() => ctx.inputTriggers.registerSource(createClaudeCommandSource(ctx, projections)), 'dsh-claude: Claude slash source')\r\n const sessions = ctx.get('sessions') as ISessions | undefined\r\n const workspaces = ctx.get('workspaces') as IWorkspaces | undefined\r\n const conversation = ctx.get('conversation') as IConversation | undefined\r\n const connection = ctx.get('connection') as ConnectionHandle | undefined\r\n /** Composer submit hook shared by the repository feedback affordances.\r\n * 'append' keeps any user draft and adds the prompt below it; 'idle'\r\n * submits only when the composer is empty and reports false otherwise. */\r\n const submitPromptFor = (sessionId: string): ((draft: string, mode?: 'append' | 'idle') => boolean) | undefined => {\r\n if (sessions === undefined || conversation === undefined) return undefined\r\n return (draft, mode = 'append') => {\r\n const scope = sessions.scope(sessionId as SessionId)\r\n if (scope === undefined) return false\r\n const input = conversation.input.for(scope)\r\n const current = input.state.getSnapshot().draft\r\n if (current.trim() === '') input.setDraft(draft)\r\n else if (mode === 'append') input.setDraft(`${current}\\n\\n${draft}`)\r\n else return false\r\n input.submit()\r\n return true\r\n }\r\n }\r\n if (sessions !== undefined) {\r\n ctx.effect(() => sessions.provide({\r\n hooks: ['claudeProjection'],\r\n resolve: binding => ({ hooks: { claudeProjection: projections.source(binding.sessionId) } }),\r\n }), 'dsh-claude: sidecar projection provider')\r\n }\r\n ctx.effect(() => () => projections.dispose(), 'dsh-claude: sidecar projection lifecycle')\r\n ctx.effect(() => ctx.conversationEvents.register(claudeTurnDefinition), 'dsh-claude: Claude turn marker')\r\n ctx.effect(() => ctx.conversationEvents.register(claudeActivityStepDefinition), 'dsh-claude: Claude activity flow node')\r\n ctx.effect(() => ctx.conversationEvents.register(claudeActiveTasksDefinition), 'dsh-claude: active Claude tasks node')\r\n ctx.slots.inject('conversation.chat.node', () => ctx.slots.register({\r\n name: 'conversation.chat.node',\r\n key: 'claude-activity-step',\r\n locale: namespace,\r\n }, ClaudeActivityNode))\r\n const layout = ctx.get('layout') as LayoutFace | undefined\r\n // Keep the plugin details registration mounted while its maximized overlay is\r\n // visible so its session-bound state survives the round trip.\r\n let disposePluginDetails: (() => void) | undefined\r\n let disposeDiffOverlay: (() => void) | undefined\r\n let disposeExpandedDetailsResize: (() => void) | undefined\r\n let detailsSessionId: string | undefined\r\n const diffOpen = new DiffOpenStore()\r\n const restoreDiff = (): void => {\r\n if (disposeDiffOverlay === undefined) return\r\n disposeDiffOverlay()\r\n disposeDiffOverlay = undefined\r\n layout?.openDetails()\r\n disposeExpandedDetailsResize = enableExpandedDetailsResize()\r\n }\r\n const closePluginDetails = (): void => {\r\n if (disposePluginDetails === undefined && disposeDiffOverlay === undefined && disposeExpandedDetailsResize === undefined && detailsSessionId === undefined) return\r\n disposeDiffOverlay?.()\r\n disposeDiffOverlay = undefined\r\n disposeExpandedDetailsResize?.()\r\n disposeExpandedDetailsResize = undefined\r\n disposePluginDetails?.()\r\n disposePluginDetails = undefined\r\n detailsSessionId = undefined\r\n diffOpen.close()\r\n layout?.closeDetails()\r\n }\r\n ctx.effect(() => ctx.slots.onEntryError((key, entry) => {\r\n if (key === 'shell.overlay' && entry.options.id === 'claude-diff-overlay') restoreDiff()\r\n }), 'dsh-claude: diff overlay recovery')\r\n const openTasksPanel = (sessionId: string, turn: number): void => {\r\n closePluginDetails()\r\n try {\r\n disposePluginDetails = ctx.slots.register({\r\n name: 'details',\r\n priority: -10,\r\n locale: namespace,\r\n inject: (): ClaudeTasksPanelInjected => ({ t, turn, closeDetails: closePluginDetails }),\r\n }, ClaudeTasksPanel)\r\n } catch {\r\n return\r\n }\r\n detailsSessionId = sessionId\r\n layout?.openDetails()\r\n disposeExpandedDetailsResize = enableExpandedDetailsResize()\r\n }\r\n const openOverviewPanel = (sessionId: string): void => {\r\n if (sessions === undefined) return\r\n closePluginDetails()\r\n try {\r\n disposePluginDetails = ctx.slots.register({\r\n name: 'details',\r\n priority: -10,\r\n locale: namespace,\r\n inject: (): ClaudePullRequestsPanelInjected => ({\r\n t,\r\n closeDetails: closePluginDetails,\r\n openSession: id => { sessions.open(id as SessionId) },\r\n loadStatus: loadRepositoryStatusFor,\r\n sessions: sessions.list as unknown as ClaudePullRequestsPanelInjected['sessions'],\r\n ...(workspaces === undefined ? {} : { workspaces: workspaces.list as unknown as NonNullable<ClaudePullRequestsPanelInjected['workspaces']> }),\r\n projectionFor: id => projections.source(id),\r\n }),\r\n }, ClaudePullRequestsPanel)\r\n } catch {\r\n return\r\n }\r\n detailsSessionId = sessionId\r\n layout?.openDetails()\r\n disposeExpandedDetailsResize = enableExpandedDetailsResize()\r\n }\r\n const openDiffPanel = (sessionId: string): void => {\r\n closePluginDetails()\r\n detailsSessionId = sessionId\r\n const submitPrompt = submitPromptFor(sessionId)\r\n const registerDetails = (): boolean => {\r\n try {\r\n disposePluginDetails = ctx.slots.register({\r\n name: 'details',\r\n priority: -10,\r\n locale: namespace,\r\n inject: (): ClaudeDiffPanelInjected => ({\r\n t,\r\n sessionId,\r\n maximized: false,\r\n closeDetails: closePluginDetails,\r\n toggleMaximized: maximizeDiff,\r\n ...(submitPrompt === undefined ? {} : { submitPrompt }),\r\n }),\r\n }, ClaudeDiffPanel)\r\n } catch {\r\n disposePluginDetails = undefined\r\n return false\r\n }\r\n layout?.openDetails()\r\n return true\r\n }\r\n const maximizeDiff = (): void => {\r\n if (disposeDiffOverlay !== undefined) {\r\n restoreDiff()\r\n return\r\n }\r\n disposeExpandedDetailsResize?.()\r\n disposeExpandedDetailsResize = undefined\r\n layout?.closeDetails()\r\n try {\r\n disposeDiffOverlay = ctx.slots.register({\r\n name: 'shell.overlay',\r\n id: 'claude-diff-overlay',\r\n locale: namespace,\r\n }, () => <MaximizedDiff\r\n source={projections.source(sessionId)}\r\n t={t}\r\n sessionId={sessionId}\r\n closeDetails={closePluginDetails}\r\n restore={restoreDiff}\r\n {...(submitPrompt === undefined ? {} : { submitPrompt })}\r\n />)\r\n } catch {\r\n disposeDiffOverlay = undefined\r\n layout?.openDetails()\r\n disposeExpandedDetailsResize = enableExpandedDetailsResize()\r\n }\r\n }\r\n if (!registerDetails()) {\r\n detailsSessionId = undefined\r\n return\r\n }\r\n diffOpen.open(sessionId)\r\n disposeExpandedDetailsResize = enableExpandedDetailsResize()\r\n }\r\n ctx.effect(() => {\r\n if (typeof document === 'undefined' || typeof MutationObserver === 'undefined') return () => closePluginDetails()\r\n const observer = new MutationObserver(() => {\r\n if (detailsSessionId !== undefined && disposeDiffOverlay === undefined && document.querySelector('[data-details-collapsed]') !== null) {\r\n closePluginDetails()\r\n }\r\n })\r\n observer.observe(document.body, { attributes: true, attributeFilter: ['data-details-collapsed'], subtree: true })\r\n return () => {\r\n observer.disconnect()\r\n closePluginDetails()\r\n }\r\n }, 'dsh-claude: details panel lifecycle')\r\n ctx.slots.inject('conversation.chat.node', () => ctx.slots.register({\r\n name: 'conversation.chat.node',\r\n key: 'claude-active-tasks',\r\n locale: namespace,\r\n inject: (sessionId: string) => ({\r\n openTasks: (turn: number) => openTasksPanel(sessionId, turn),\r\n }),\r\n }, ClaudeActiveTasksNode))\r\n ctx.slots.inject('conversation.chat.turnTail', () => ctx.slots.register({\r\n name: 'conversation.chat.turnTail',\r\n select: selectClaudeTurn,\r\n inject: (sessionId: string): ClaudeActivityTailInjected => ({\r\n t,\r\n openTasks: turn => openTasksPanel(sessionId, turn),\r\n }),\r\n }, ClaudeActivityTail))\r\n // Icon-only diff trigger in the Session header's right-aligned utility\r\n // group. The action row next to the title is left-aligned (it rides inside\r\n // the flex:1 title cluster), so the utilities group is the actual top-right\r\n // corner — the seat the Host's hidden Session log capsule used to hold.\r\n // Shadow the Host's header preset label: same slot id, lower priority, so\r\n // one cell renders and it is this one. Only two things change — the native\r\n // `title` popup becomes the DSH tooltip bubble, and the Claude preset gets\r\n // its own mark instead of the generic preset glyph. Everything else is\r\n // reproduced, because this entry renders in every Session, not only\r\n // plugin-owned ones.\r\n if (connection !== undefined) {\r\n const roster = new AgentPresetRoster(connection.api.agentPresets as unknown as AgentPresetRosterApi)\r\n const hostT = ctx.locale.bind('settings.agentPreset')\r\n ctx.slots.inject('conversation.session.header.actions', () => ctx.slots.register({\r\n name: 'conversation.session.header.actions',\r\n id: 'agent-preset',\r\n order: -10,\r\n priority: -10,\r\n locale: namespace,\r\n inject: (): ClaudeAgentPresetLabelInjected => ({\r\n t,\r\n hostT: key => hostT(key as never),\r\n roster: { subscribe: roster.subscribe, getSnapshot: roster.getSnapshot, load: () => roster.load() },\r\n }),\r\n }, ClaudeAgentPresetLabel))\r\n }\r\n ctx.slots.inject('conversation.session.header.utilities', () => ctx.slots.register({\r\n name: 'conversation.session.header.utilities',\r\n id: 'claude-diff',\r\n order: 30,\r\n locale: namespace,\r\n inject: (sessionId: string): ClaudeDiffHeaderActionInjected => ({\r\n t,\r\n // Toggling closes the whole details registration, so a maximized diff\r\n // collapses from the same press that would have collapsed the column.\r\n toggleDiff: () => {\r\n if (diffOpen.isOpen(sessionId)) closePluginDetails()\r\n else openDiffPanel(sessionId)\r\n },\r\n diffOpen: diffOpen.sourceFor(sessionId),\r\n }),\r\n }, ClaudeDiffHeaderAction))\r\n // Kebab menu at the far right of the same utility group: session-level\r\n // actions that are not worth a header button of their own.\r\n ctx.slots.inject('conversation.session.header.utilities', () => ctx.slots.register({\r\n name: 'conversation.session.header.utilities',\r\n id: 'claude-session-menu',\r\n order: 31,\r\n locale: namespace,\r\n inject: (): ClaudeSessionMenuInjected => ({ t }),\r\n }, ClaudeSessionMenu))\r\n ctx.slots.inject('conversation.input.dock', () => ctx.slots.register({\r\n name: 'conversation.input.dock',\r\n id: 'claude-review-comments',\r\n // Topmost dock row: pending comments render above DSH's QueueDock (20)\r\n // and the repository status readout (20.5).\r\n order: 18,\r\n locale: namespace,\r\n inject: (sessionId: string): ClaudeReviewCommentsInjected => ({\r\n t,\r\n sessionId,\r\n ...(sessions === undefined || conversation === undefined ? {} : {\r\n submitWith: (fallbackDraft: string) => {\r\n const scope = sessions.scope(sessionId as SessionId)\r\n if (scope === undefined) return\r\n const input = conversation.input.for(scope)\r\n if (input.state.getSnapshot().draft.trim() === '') input.setDraft(fallbackDraft)\r\n input.submit()\r\n },\r\n }),\r\n }),\r\n }, ClaudeReviewComments))\r\n ctx.slots.inject('conversation.input.dock', () => ctx.slots.register({\r\n name: 'conversation.input.dock',\r\n id: 'claude-repository-status',\r\n // Below DSH's QueueDock (20) and above the hero controls (21), so the\r\n // dock stacks comments (18) → queue (20) → repository readout.\r\n order: 20.5,\r\n locale: namespace,\r\n inject: (sessionId: string): ClaudeRepositoryStatusInjected => {\r\n const submitPrompt = submitPromptFor(sessionId)\r\n return {\r\n t,\r\n openDiff: () => openDiffPanel(sessionId),\r\n ...(submitPrompt === undefined ? {} : { submitPrompt }),\r\n ...(sessions === undefined ? {} : { openOverview: () => openOverviewPanel(sessionId) }),\r\n ...(workspaces === undefined ? {} : {\r\n deleteWorkspace: async () => {\r\n const workspace = workspaces.list.getSnapshot().items.find(item => item.sessionIds.includes(sessionId as SessionId))\r\n if (workspace === undefined) return\r\n // Deleting a workspace drops its sessions into the unaccounted\r\n // group, so archive them first -- DSH's \"delete session\" is an\r\n // archive, and the worktree they point at is already gone.\r\n for (const id of workspace.sessionIds) await workspaces.archiveSession(id)\r\n await workspaces.delete(workspace.workspaceId)\r\n },\r\n }),\r\n }\r\n },\r\n }, ClaudeRepositoryStatus))\r\n // Selection toolbar over assistant replies (copy / ask a follow-up). Root\r\n // scoped: it resolves the on-screen session itself and only arms inside\r\n // sessions this plugin owns.\r\n ctx.slots.inject('shell.overlay', () => ctx.slots.register({\r\n name: 'shell.overlay',\r\n id: 'claude-selection-ask',\r\n locale: namespace,\r\n }, () => <ClaudeSelectionAsk\r\n t={t}\r\n currentSessionId={() => sessions?.list.getSnapshot().current as string | undefined}\r\n ownsSession={sessionId => projections.source(sessionId).getSnapshot().owned}\r\n {...(sessions === undefined || conversation === undefined ? {} : {\r\n insertIntoChat: (sessionId: string, text: string) => {\r\n const scope = sessions.scope(sessionId as SessionId)\r\n if (scope === undefined) return\r\n const input = conversation.input.for(scope)\r\n const current = input.state.getSnapshot().draft\r\n input.setDraft(current.trim() === '' ? text : `${current}\\n\\n${text}`)\r\n },\r\n })}\r\n />))\r\n // \"Rewind to here\" beside the copy action of every user message. Root\r\n // scoped like the selection toolbar: it resolves the on-screen session\r\n // itself and only arms inside sessions this plugin owns.\r\n if (sessions !== undefined) {\r\n // Stable prop identities: the control subscribes to them, so a re-render\r\n // of the seat must not tear down and rebuild every subscription.\r\n const rewind: ClaudeRewindInjected = {\r\n t,\r\n currentSessionId: () => sessions.list.getSnapshot().current as string | undefined,\r\n subscribeSessions: listener => sessions.list.subscribe(listener),\r\n chatOf: sessionId => sessions.binding(sessionId as SessionId)?.session as unknown as ClaudeChatSource | undefined,\r\n projectionOf: sessionId => projections.source(sessionId),\r\n ...(conversation === undefined ? {} : {\r\n setDraft: (sessionId: string, text: string) => {\r\n const scope = sessions.scope(sessionId as SessionId)\r\n if (scope === undefined) return\r\n conversation.input.for(scope).setDraft(text)\r\n },\r\n }),\r\n }\r\n ctx.slots.inject('shell.overlay', () => ctx.slots.register({\r\n name: 'shell.overlay',\r\n id: 'claude-rewind',\r\n locale: namespace,\r\n }, () => <ClaudeRewind {...rewind} />))\r\n }\r\n\r\n if (sessions !== undefined && conversation !== undefined) {\r\n // Shadow the Host queue strip: list-slot entries sharing an id form one\r\n // cell and the lowest priority renders, so this replaces it app-wide with\r\n // a strip that matches the repository status bar.\r\n ctx.slots.inject('conversation.input.dock', () => ctx.slots.register({\r\n name: 'conversation.input.dock',\r\n id: 'queue',\r\n order: 20,\r\n priority: -10,\r\n locale: namespace,\r\n inject: (sessionId: string): ClaudeQueueDockInjected => {\r\n const scope = sessions.scope(sessionId as SessionId)\r\n const scoped = scope === undefined ? undefined : (scope as unknown as { get(name: string): unknown }).get('conversation') as IConversation | undefined\r\n const target = scoped ?? conversation\r\n return {\r\n t,\r\n updateQueue: (itemId, action) => target.updateQueue(itemId as never, action as never),\r\n notify: (level, text) => { if (scope !== undefined) conversation.input.for(scope).notify(level, text) },\r\n }\r\n },\r\n }, ClaudeQueueDock))\r\n }\r\n if (sessions !== undefined && workspaces !== undefined && conversation !== undefined && connection !== undefined) {\r\n /** Attach a prepared worktree to its session without blocking the flow. */\r\n const bindLease = (leaseId: string | undefined, targetSessionId: SessionId): void => {\r\n if (leaseId === undefined) return\r\n void bindRepositoryLease(leaseId, targetSessionId).catch((reason: unknown) => {\r\n console.warn(`dsh-claude: could not bind the worktree lease: ${reason instanceof Error ? reason.message : String(reason)}`)\r\n })\r\n }\r\n ctx.slots.inject('conversation.input.dock', () => ctx.slots.register({\r\n name: 'conversation.input.dock',\r\n id: 'claude-hero-repository-controls',\r\n order: 21,\r\n locale: namespace,\r\n inject: (sourceSessionId: SessionId): ClaudeHeroRepositoryControlsInjected => ({\r\n t,\r\n prepare: async (cwd, branch, useWorktree, onProgress, ticket) => {\r\n const sourceScope = sessions.scope(sourceSessionId)\r\n if (sourceScope === undefined) throw new Error(t('repositorySessionUnavailable'))\r\n const sourceInput = conversation.input.for(sourceScope)\r\n const rawDraft = sourceInput.state.getSnapshot().draft\r\n // Starting from a ticket seeds an empty composer with the ticket\r\n // brief; a written draft keeps the user's words and gets the ticket\r\n // appended as context so the session always knows its ticket.\r\n const draft = ticket === undefined\r\n ? rawDraft\r\n : rawDraft.trim() === '' ? ticketPrompt(ticket) : `${rawDraft.trimEnd()}\\n\\n${ticketContext(ticket)}`\r\n const imageIds = sourceInput.state.getSnapshot().imageIds\r\n const prepared = await prepareRepository(cwd, branch, useWorktree, ticket?.key, onProgress)\r\n // The workspace is ready: take the ticket. Best-effort so a Jira\r\n // hiccup never blocks the session from starting.\r\n if (ticket !== undefined) {\r\n void assignJiraTicket(ticket.key).catch((reason: unknown) => {\r\n console.warn(`dsh-claude: could not assign ${ticket.key}: ${reason instanceof Error ? reason.message : String(reason)}`)\r\n })\r\n }\r\n if (prepared.mode === 'checkout') {\r\n if (draft !== rawDraft) sourceInput.setDraft(draft)\r\n sourceInput.submit()\r\n return\r\n }\r\n onProgress('creating-workspace')\r\n const workspace = await workspaces.create({ path: prepared.path })\r\n onProgress('starting-session')\r\n const targetSessionId = await workspaces.connectWorkspace(workspace.workspaceId)\r\n const targetScope = sessions.scope(targetSessionId)\r\n if (targetScope === undefined) throw new Error(t('repositorySessionUnavailable'))\r\n const presetResponse = await connection.api.agentPresets.select({ sessionId: targetSessionId, agentPreset: 'claude' })\r\n if (!presetResponse.result.ok) throw new Error(presetResponse.result.error.message)\r\n sessions.noteAgentPreset(targetSessionId, presetResponse.result.value.agentPreset)\r\n const targetInput = conversation.input.for(targetScope)\r\n onProgress('transferring-draft')\r\n if (imageIds.length > 0 && !targetInput.addImages(imageIds)) throw new Error(t('repositoryDraftTransferFailed'))\r\n if (draft !== '') targetInput.setDraft(draft)\r\n // Lease bookkeeping only matters at cleanup time, so it rides\r\n // alongside the submit the way the ticket assignment does. Awaiting\r\n // it here once left the prepared worktree holding the user's typed\r\n // message with no way to send it when the route was slow.\r\n bindLease(prepared.leaseId, targetSessionId)\r\n sessions.open(targetSessionId)\r\n onProgress('submitting')\r\n targetInput.submit()\r\n sourceInput.setDraft('')\r\n for (const imageId of imageIds) sourceInput.removeImage(imageId)\r\n },\r\n prepareMany: async (cwd, branch, tickets, onProgress) => {\r\n const sourceScope = sessions.scope(sourceSessionId)\r\n if (sourceScope === undefined) throw new Error(t('repositorySessionUnavailable'))\r\n const sourceInput = conversation.input.for(sourceScope)\r\n // One shared draft applies to every ticket; images stay behind\r\n // because a single attachment cannot be split across sessions.\r\n const rawDraft = sourceInput.state.getSnapshot().draft\r\n const failures: string[] = []\r\n for (const [index, ticket] of tickets.entries()) {\r\n const report = (stage: RepositoryPreparationStage): void => {\r\n onProgress({ ticketKey: ticket.key, index, total: tickets.length, stage })\r\n }\r\n try {\r\n report('inspecting')\r\n const prepared = await prepareRepository(cwd, branch, true, ticket.key, report)\r\n void assignJiraTicket(ticket.key).catch((reason: unknown) => {\r\n console.warn(`dsh-claude: could not assign ${ticket.key}: ${reason instanceof Error ? reason.message : String(reason)}`)\r\n })\r\n report('creating-workspace')\r\n const workspace = await workspaces.create({ path: prepared.path })\r\n report('starting-session')\r\n const targetSessionId = await workspaces.connectWorkspace(workspace.workspaceId)\r\n const targetScope = sessions.scope(targetSessionId)\r\n if (targetScope === undefined) throw new Error(t('repositorySessionUnavailable'))\r\n const presetResponse = await connection.api.agentPresets.select({ sessionId: targetSessionId, agentPreset: 'claude' })\r\n if (!presetResponse.result.ok) throw new Error(presetResponse.result.error.message)\r\n sessions.noteAgentPreset(targetSessionId, presetResponse.result.value.agentPreset)\r\n const targetInput = conversation.input.for(targetScope)\r\n report('transferring-draft')\r\n targetInput.setDraft(rawDraft.trim() === '' ? ticketPrompt(ticket) : `${rawDraft.trimEnd()}\\n\\n${ticketContext(ticket)}`)\r\n bindLease(prepared.leaseId, targetSessionId)\r\n report('submitting')\r\n targetInput.submit()\r\n } catch (cause) {\r\n failures.push(`${ticket.key}: ${cause instanceof Error ? cause.message : String(cause)}`)\r\n }\r\n }\r\n if (failures.length < tickets.length) sourceInput.setDraft('')\r\n if (failures.length > 0) throw new Error(failures.join(' · '))\r\n },\r\n }),\r\n }, ClaudeHeroRepositoryControls))\r\n }\r\n if (sessions !== undefined) {\r\n // The layout closes the column on session switch; mirror that here so the\r\n // next session's native details view is not shadowed.\r\n ctx.effect(() => sessions.list.subscribe(() => {\r\n if (detailsSessionId !== undefined && sessions.list.getSnapshot().current !== detailsSessionId) closePluginDetails()\r\n }), 'dsh-claude: details panel session tracking')\r\n }\r\n ctx.slots.inject('settings.section', () => ctx.slots.register({\r\n name: 'settings.section',\r\n id: 'claude-code',\r\n order: 16,\r\n label: () => t('nav'),\r\n inject: (): ClaudeCodeSettingsInjected => ({ t }),\r\n }, ClaudeCodeSettings))\r\n}\r\n"],"x_google_ignoreList":[22,23],"mappings":"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"}