@norman-else/dsh-claude 0.1.23 → 0.1.25

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.tasksPanel","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","styles.settingTextInput","styles.settingSelect","styles.settingSelectTrigger","styles.settingSelectTriggerOpen","styles.settingSelectValue","styles.settingSelectChevron","styles.settingSelectChevronOpen","styles.settingSelectMenu","styles.settingSelectOption","styles.settingSelectOptionActive","styles.settingSelectCheck","styles.settingsPage","styles.settingsHero","styles.settingsMark","styles.settingsHeading","styles.settingsBody","styles.settingsCard","styles.settingsCardHeader","styles.settingsSectionHeading","styles.button","styles.notice","styles.diagnosticGrid","styles.diagnosticLabel","styles.diagnosticValue","styles.settingsActions","styles.primaryButton","record","response","record","styles.repositoryItemSuccess","styles.repositoryItemWarning","styles.repositoryItemError","styles.repositoryItem","styles.repositoryItemDot","styles.repositoryItemLabel","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.diffModalSuccess","styles.diffModalStatus","styles.diffModalConflicts","styles.diffModalConflictResolve","styles.diffModalError","styles.repositoryMergeTrigger","styles.repositoryBarFrame","styles.repositoryBar","styles.repositoryPrIcon","styles.repositoryPrimary","styles.repositoryBarMerged","styles.repositoryPrIconMerged","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.diffCommentButtonClass","styles.diffLineNumber","styles.diffLineMarker","styles.diffFile","styles.diffFileHeader","styles.chevron","styles.chevronOpen","styles.diffFilePath","styles.diffFileStats","styles.diffAdd","styles.diffDelete","styles.diffCode","styles.diffCommentBlock","styles.diffCommentCardMeta","styles.reviewCommentChipRemove","styles.diffCommentCardText","styles.diffGhCommentAuthor","styles.diffGhCommentLink","styles.diffCommentTextareaClass","styles.diffCommentTextarea","styles.diffCommentError","styles.diffCommentActions","styles.diffCommentActionButton","styles.diffCommentSubmitButton","styles.diffModalCss","styles.panelIconButtonCss","styles.diffCommentCss","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.heroWorktreeProgressCard","styles.heroWorktreeProgressHeader","styles.heroWorktreeProgressSpinner","styles.heroWorktreeProgressError","styles.heroWorktreeProgressCopy","styles.heroWorktreeProgressTitle","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.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/ClaudeCodeSettings.tsx","../src/client/repository-action-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/hero-dom-bridge.ts","../src/client/repository-setup-api.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.233'\nexport const CLAUDE_DOCTOR_PATH = '/plugins/dsh-claude/doctor'\nexport const CLAUDE_UPDATE_CHECK_PATH = '/plugins/dsh-claude/update/check'\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'\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 settingsActions: CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\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 width: 'calc(100% - 16px)',\n height: 'calc(100% - 16px)',\n minWidth: 0,\n margin: 8,\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 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: 12,\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: 12,\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: 34,\n minHeight: 34,\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: 12,\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: 34,\n display: 'grid',\n placeItems: 'center',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 12,\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: 12,\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 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\nexport const repositoryBarMerged: CSSProperties = {\n borderColor: 'color-mix(in srgb, #a78bfa 30%, var(--dsw-alias-border-l2, color-mix(in srgb, currentColor 16%, 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 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\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 align-self: center;\n margin: 0 2px;\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 width: 'calc(100% - 16px)',\n height: 'calc(100% - 16px)',\n minWidth: 0,\n margin: 8,\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: 12,\n textAlign: 'left',\n cursor: 'pointer',\n}\n\nexport const diffFilePath: CSSProperties = {\n minWidth: 0,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const diffFileStats: CSSProperties = {\n flex: 'none',\n display: 'inline-flex',\n gap: 4,\n fontSize: 12,\n fontWeight: 650,\n}\n\nexport const diffCode: CSSProperties = {\n minWidth: 'max-content',\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 whiteSpace: 'pre',\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 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: 24px;\n line-height: 32px;\n}\n.dshClaudeRepositoryActionModalContent > p {\n font-size: 18px;\n line-height: 28px;\n}\n.dshClaudeRepositoryActionModal input[type='checkbox'] {\n width: 18px;\n height: 18px;\n}\n.dshClaudeRepositoryActionModal textarea:focus,\n.dshClaudeRepositoryActionModal input:not([type='checkbox']):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: 16,\n lineHeight: '24px',\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: 15,\n lineHeight: '22px',\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: 16,\n lineHeight: '24px',\n fontWeight: 550,\n}\n\nexport const diffModalTextarea: CSSProperties = {\n ...settingTextInput,\n minHeight: 140,\n padding: '10px 14px',\n fontSize: 16,\n lineHeight: '24px',\n resize: 'vertical',\n}\n\nexport const diffModalTextInput: CSSProperties = {\n ...settingTextInput,\n minHeight: 44,\n padding: '9px 14px',\n fontSize: 16,\n lineHeight: '24px',\n}\n\nexport const diffModalCheckbox: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 16,\n lineHeight: '24px',\n}\n\nexport const diffModalFooter: CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 12,\n}\n\nexport const diffModalButton: CSSProperties = {\n minHeight: 42,\n padding: '8px 18px',\n fontSize: 16,\n lineHeight: '24px',\n}\n\nexport const diffModalStatus: CSSProperties = {\n margin: 0,\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 16,\n lineHeight: '24px',\n}\n\nexport const diffModalError: CSSProperties = {\n margin: '10px 0 0',\n color: 'var(--dsw-alias-state-error-primary)',\n fontSize: 16,\n lineHeight: '24px',\n}\n\nexport const diffModalSuccess: CSSProperties = {\n margin: 0,\n color: 'var(--dsw-alias-state-success-primary)',\n fontSize: 16,\n lineHeight: '24px',\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 style={styles.tasksPanel}>\n <style data-dsh-claude-panel-icon-styles>{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 { useCallback, useEffect, useId, useRef, useState } from 'react'\nimport { CLAUDE_DOCTOR_PATH, CLAUDE_GLOBAL_SETTINGS_PATH, CLAUDE_UPDATE_CHECK_PATH, CLAUDE_UPDATE_PATH } from '../constants.ts'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\nimport * as styles from './styles.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\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\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 <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 <div key={setting.key} style={styles.diagnosticGrid}>\n <span style={styles.diagnosticLabel}>{setting.key === 'outputStyle'\n ? t('outputStyle')\n : setting.key === 'worktreeBranchPrefix'\n ? t('worktreeBranchPrefix')\n : setting.key === 'maxProcesses'\n ? t('maxProcessesSetting')\n : setting.key === 'idleTimeoutMinutes' ? t('idleTimeoutSetting') : setting.key}</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 {globalSettings?.settings.some(setting => setting.effect === 'new-session') === true\n ? <p style={styles.notice}>{t('globalSettingsNewSession')}</p>\n : null}\n {globalSettings?.settings.some(setting => setting.effect === 'next-worktree') === true\n ? <p style={styles.notice}>{t('worktreeBranchPrefixEffect')}</p>\n : null}\n {globalSettings?.settings.some(setting => setting.key === 'maxProcesses') === true\n ? <p style={styles.notice}>{t('limitsSettingEffect')}</p>\n : null}\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>\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_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[]): string {\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${conflicts.map(file => `- ${file}`).join('\\n')}`\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 } 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 { 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}\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\nconst RATE_LIMIT_TITLE_PREFIX = 'Claude rate limit'\nconst RATE_LIMIT_BLOCKING_TITLE = 'Claude rate limit is blocking requests'\n\n/** Whether the newest quota update in the activity feed reports a blocked state. */\nexport function rateLimitBlocked(activities: readonly { readonly title?: string }[]): boolean {\n for (let index = activities.length - 1; index >= 0; index -= 1) {\n const title = activities[index]?.title\n if (title?.startsWith(RATE_LIMIT_TITLE_PREFIX) === true) return title === RATE_LIMIT_BLOCKING_TITLE\n }\n return false\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\nfunction StatusItem({ label, tone = 'neutral' }: { label: string; tone?: 'neutral' | 'success' | 'warning' | 'error' }) {\n const toneStyle = tone === 'success'\n ? styles.repositoryItemSuccess\n : tone === 'warning' ? styles.repositoryItemWarning : tone === 'error' ? styles.repositoryItemError : {}\n return <span style={{ ...styles.repositoryItem, ...toneStyle }}><span style={styles.repositoryItemDot} aria-hidden=\"true\" /><span style={styles.repositoryItemLabel}>{label}</span></span>\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 <StatusItem label={t('repositoryChecks_failing')} tone=\"error\" />\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 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 }).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 {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 ?? [])); 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\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 }: 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 const rateLimited = rateLimitBlocked(projection.activities)\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 {rateLimited ? <StatusItem label={t('repositoryRateLimited')} tone=\"warning\" /> : null}\n </div>\n </div>\n )\n }\n return (\n <div style={styles.repositoryBarFrame}>\n <div style={{ ...styles.repositoryBar, ...(merged ? styles.repositoryBarMerged : {}) }}>\n <span style={{ ...styles.repositoryPrIcon, ...(merged ? styles.repositoryPrIconMerged : {}) }}><PullRequestIcon merged={merged} /></span>\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 {rateLimited ? <StatusItem label={t('repositoryRateLimited')} tone=\"warning\" /> : null}\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 ) : <>\n {pullRequest.checks === 'failing'\n ? <FailingChecksControl sessionId={sessionId} pullNumber={pullRequest.number} t={t} {...(submitPrompt === undefined ? {} : { submitPrompt })} />\n : pullRequest.checks === 'none' ? null : <StatusItem\n label={t(`repositoryChecks_${pullRequest.checks}` as ClaudeCodeSettingsKey)}\n tone={pullRequest.checks === 'passing' ? 'success' : 'warning'}\n />}\n {pullRequest.review === 'none' ? null : <StatusItem\n label={t(`repositoryReview_${pullRequest.review}` as ClaudeCodeSettingsKey)}\n tone={pullRequest.review === 'approved' ? 'success' : pullRequest.review === 'changes-requested' ? 'error' : 'neutral'}\n />}\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; 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'>): string {\n const name = comment.path.split('/').at(-1) ?? comment.path\n return `${name}:${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} · {comment.side === 'old' ? t('reviewCommentOldSide', { line: comment.line }) : t('reviewCommentNewSide', { line: comment.line })}</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 * 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\ninterface NumberedDiffLine {\n readonly line: string\n readonly kind: 'add' | 'delete' | 'hunk' | 'context' | 'collapsed'\n readonly oldLine?: number\n readonly newLine?: number\n}\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 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 if (previousOldEnd !== undefined && nextOld > previousOldEnd) {\n numbered.push({ line: `${nextOld - previousOldEnd} unmodified lines`, kind: 'collapsed' })\n }\n oldLine = nextOld\n newLine = Number(hunk[3])\n previousOldEnd = nextOld + Number(hunk[2] ?? 1)\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 return numbered\n}\n\nexport interface ReviewCommentAnchor {\n readonly line: number\n readonly side: ReviewCommentSide\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, onComment }: { entry: NumberedDiffLine; addLabel: string; onComment?: (() => void) | undefined }) {\n const style = entry.kind === 'add'\n ? styles.diffLineAdd\n : entry.kind === 'delete' ? styles.diffLineDelete : entry.kind === 'hunk' || entry.kind === 'collapsed' ? 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 <div className={styles.diffLineRowClass} style={{ ...styles.diffLine, ...style }}><button type=\"button\" className={styles.diffCommentButtonClass} disabled={onComment === undefined} aria-label={addLabel} onClick={onComment}>+</button><span style={styles.diffLineNumber}>{lineNumber}</span><span style={styles.diffLineMarker}>{entry.kind === 'add' ? '+' : entry.kind === 'delete' ? '−' : entry.kind === 'collapsed' ? '⌄' : ' '}</span><span>{entry.kind === 'collapsed' ? entry.line : entry.line.slice(entry.kind === 'hunk' ? 0 : 1)}</span></div>\n}\n\ninterface DiffFileSectionProps {\n readonly file: DiffFile\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, initiallyOpen, t, comments, ghComments, editorAnchor, editorNode, onOpenEditor, onRemoveComment }: DiffFileSectionProps) {\n const [open, setOpen] = useState(initiallyOpen)\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}>{file.path}</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}>{numberDiffLines(file.lines).map((entry, index) => {\n const anchor = commentAnchorForLine(entry)\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 return (\n <Fragment key={`${index}:${entry.line}`}>\n <DiffLine entry={entry} addLabel={t('reviewCommentAdd')} onComment={anchor === undefined ? undefined : () => onOpenEditor(anchor)} />\n {lineComments.map(comment => (\n <div key={comment.id} style={styles.diffCommentBlock}>\n <div style={styles.diffCommentCardMeta}>\n <span>{comment.side === 'old' ? t('reviewCommentOldSide', { line: comment.line }) : t('reviewCommentNewSide', { line: comment.line })}</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 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 <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.diffModalCss}{styles.panelIconButtonCss}{styles.diffCommentCss}</style>\n <div 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 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","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\nexport function ensureClaudeHeroPortal(seat: Element): HTMLElement {\n const sibling = seat.nextElementSibling\n if (sibling instanceof HTMLElement && sibling.hasAttribute(PORTAL_ATTRIBUTE)) return sibling\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 { CLAUDE_REPOSITORY_SETUP_PATH } from '../constants.ts'\nimport type { RepositoryBranchList, RepositorySetupResult, RepositorySetupStage } from '../repository-setup.ts'\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\nexport function loadRepositoryBranches(cwd: string, signal?: AbortSignal): Promise<RepositoryBranchList> {\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 === undefined ? {} : { signal }),\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","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 * as styles from './styles.ts'\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 ) => 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\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\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, t, onDismiss,\n}: {\n stage: RepositoryPreparationStage\n error?: 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}>{error === undefined ? t('repositoryProgressTitle') : t('repositoryProgressFailed')}</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\nexport function ClaudeHeroRepositoryCapsule({\n branches, selected, worktree, busy, menuOpen, worktreeLabel, searchPlaceholder, emptySearchLabel,\n 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 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={worktree}\n disabled={busy}\n style={{\n ...styles.heroWorktreeToggle,\n ...(worktree || worktreeHovered ? styles.heroWorktreeToggleActive : {}),\n ...(worktreeFocused ? styles.heroWorktreeToggleFocused : {}),\n }}\n onMouseEnter={() => { setWorktreeHovered(true) }}\n onMouseLeave={() => { setWorktreeHovered(false) }}\n onFocus={() => { setWorktreeFocused(true) }}\n onBlur={() => { setWorktreeFocused(false) }}\n onClick={() => { onWorktreeChange(!worktree) }}\n >\n <span aria-hidden=\"true\" style={{ ...styles.heroWorktreeCheckbox, ...(worktree ? styles.heroWorktreeCheckboxChecked : {}) }}>\n {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,\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 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 if (portal === undefined || path === undefined) return\n const controller = new AbortController()\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) setError(reason instanceof Error ? reason.message : String(reason))\n })\n return () => { controller.abort() }\n }, [portal, path, sessionId])\n\n const availableBranches = branches === undefined ? [] : repositoryBranchOptions(branches)\n const changed = branches !== undefined && selected.length > 0 && (worktree || selected !== branches.current)\n useEffect(() => {\n if (!changed || portal === undefined || busy) return\n const submit = (event: KeyboardEvent | MouseEvent): void => {\n if (pendingRef.current || input.draft.trim().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 setProgressStage(worktree ? 'inspecting' : undefined)\n setError(undefined)\n void prepare(branches.root, selected, worktree, stage => { if (worktree) setProgressStage(stage) }).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, selected, worktree])\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 onMenuOpenChange={setMenuOpen}\n onSelect={(branch) => {\n setSelected(branch)\n setMenuOpen(false)\n setError(undefined)\n }}\n onWorktreeChange={(checked) => { setWorktree(checked); setError(undefined) }}\n />\n {error === undefined ? null : <span role=\"alert\" style={styles.heroRepositoryError}>{error}</span>}\n </>}\n {progressStage === undefined || (!busy && progressError === undefined) ? null : (\n <WorktreeProgressCard\n stage={progressStage}\n {...(progressError === undefined ? {} : { error: progressError })}\n t={t}\n onDismiss={() => { setProgressStage(undefined); setProgressError(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\nconst DETAILS_DEFAULT_WIDTH = 480\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: 'Output Style 修改仅对新建 Claude 会话生效。',\n globalSettingsError: '全局设置保存失败',\n outputStyle: 'Output Style',\n worktreeBranchPrefix: 'Worktree 分支前缀',\n worktreeBranchPrefixEffect: '分支前缀修改会应用于之后自动创建的 Worktree 分支;显式指定的完整分支名不会被修改。',\n maxProcessesSetting: 'Claude 进程上限',\n idleTimeoutSetting: '闲置回收时长(分钟)',\n limitsSettingEffect: '进程上限在下次启动 Claude 进程时生效;闲置回收时长在下一次回合结束后生效。留空或非法值会被拒绝。',\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 repositoryRateLimited: 'Claude 额度限流中',\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 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 reviewCommentAdd: '添加行评论',\n reviewCommentPlaceholder: '请求更改',\n reviewCommentSubmit: '注释',\n reviewCommentCancel: '取消',\n reviewCommentRemove: '删除评论',\n reviewCommentFailed: '评论操作失败。',\n reviewCommentsClear: '清除全部评论',\n reviewCommentsSend: '发送评论',\n reviewCommentsSendDraft: '请处理以上代码评论。',\n reviewCommentOldSide: '旧代码第 {line} 行',\n reviewCommentNewSide: '第 {line} 行',\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: 'Output Style 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 limitsSettingEffect: 'The process limit applies when the next Claude process is admitted; the idle timeout applies after the next completed turn.',\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 repositoryRateLimited: 'Rate limited',\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: 'Merge origin/{base} into the current branch and push; hand any conflicts to Claude.',\n diffUpdateBranchBehind: '{count} commit(s) behind origin/{base}',\n diffUpdateBranchCompleted: 'Merged and pushed commit {commit}',\n diffUpdateBranchConflicts: 'The merge 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 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} 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 { 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, prepareRepository } from './repository-setup-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 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 }\n },\n }, ClaudeRepositoryStatus))\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) => {\n const sourceScope = sessions.scope(sourceSessionId)\n if (sourceScope === undefined) throw new Error(t('repositorySessionUnavailable'))\n const sourceInput = conversation.input.for(sourceScope)\n const draft = sourceInput.state.getSnapshot().draft\n const imageIds = sourceInput.state.getSnapshot().imageIds\n const prepared = await prepareRepository(cwd, branch, useWorktree, undefined, onProgress)\n if (prepared.mode === 'checkout') {\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 }),\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":";;;;;;EAAA,IAAa,EAAA,WAAA,eAAuB,WAAA,kBAAA,qBAAA,oBAAA,0BAAA,oBAAA,yBAAA,qBAAA,oBAAA,cAAA,MAAA,OAAA,UAAA,YAAA,QAAA,uCAAA;;;;;EAepC,MAAa,kCAA8B,IAAA,IAAA,CAAA,QAAA,OAAA,CAAA;EAC3C,MAAa,qBAAA;EACb,MAAa,2BAAA;EACb,MAAa,qBAAA;EACb,MAAa,yBAAA;;;;;EChBb,MAAA,kCAA+D;;;;EAS7D,SAAI,gBAAkB,MAAA;GACtB,IAAI,KAAA,iBAAoB,MAAW,OAAO;GAC1C,OAAM,KAAO,iBAAW,KAAA,KAAa,KAAA,aAAU,KAAW,CAAA,CAAA,SAAe;EACzE;EACF,SAAA,wBAAA,UAAA,OAAA;;;;GCqEA,OAAS,SAAA,KAAe,KAAA,gBAAqC,IAAA;EAC3D;;;EAOA,SAAI,eAAkB,OAAA;GACtB,QAAI,MAAS,SAAY,eAAa,MAAA,SAAA,kBAAA,MAAA,aAAA,KAAA,KAAA,gBAAA,IAAA,MAAA,QAAA;EACtC;EACA,SAAQ,YAAS,UAAjB;GACE,IAAK,eAAA,QAAA,GAAA,OAAA;GACL,IAAK,SAAA,SAAA,eAAA,SAAA,SAAA,eAAA,OAAA;GACL,IAAK,SAAA,YAAA,MAAA,OAAA;GACL,IAAK,SACH,OAAO,WAAA,4BAAA,MAAA,MAAA,OAAA;GACT,QAAK,SACH,MADF;IAEA,KAAA;IAEF,KAAA;IACF,KAAA;IAEA,KAAS,SAAQ,OAAA;IACf,KAAO,YAAS,OAAU,SAAA,YAAsB,KAAA,KAAU,SAAA,QAAA,SAAA;IAC5D,SAAA,OAAA;GAEA;EACE;EACA,SAAO,QAAA,UAAA;GACL,OAAA,SAAiB,UAAA,aAAA,SAAA,UAAA;EACjB;EACA,SAAU,UAAU,OAAA;GACpB,IAAI,MAAM,SAAA,cAAyB,MAAM,cAAe,KAAA,GAAQ,OAAA,KAAA;GAChE,OAAI;IACN,WAAA,MAAA;IACF,GAAA,MAAA,aAAA,KAAA,IAAA,CAAA,IAAA,EAAA,UAAA,MAAA,SAAA;;IAGA,GAAA,MAAS,YACP,KAAA,IACA,CAAA,IAAA,EAAA,SACA,MACmC,QAAA;IACnC,GAAM,MAAA,YAAkC,KAAA,IAAA,CAAA,IAAA,EAAA,SAAA,MAAA,QAAA;GACxC;EACA;;EAEE,SAAM,aAAA,YAAuB,SAAc,QAAA,CAAY,GAAA;GACvD,MAAM,OAAA,CAAA;GAGN,MAAK,uBAAuB,IAAA,IAAA;GAC5B,KAAI,MAAA,SAAA,YAAA;IACJ,IAAK,CAAA,QAAA,KAAe,KAAK,CAAA,wBAAK,OAAwB,KAAA,GAAA;IACjD,MAAA,iBAAmB,MAAA,cAAoB,KAAA,IAAA,KAAA,IAAA,QAAoB,MAAgB;IAC3E,MAAA,sBAAmB,MAAA,SAAoB,iBAAW,mBAAgB,KAAiB,KAAM,KAAA,IAAA,cAAA;IACzF,IAAA,CAAA,YAAU,KAAS,KAAA,CAAA,qBAAoB;IACvC,IAAA;IACL,KAAM,eAAa,KAAM,KAAA,wBAAA,mBAAA,KAAA,GAAA,KAAA;SACrB,IAAA,MAAU,SAAW,cAAA,MAAA,oBAAA,KAAA,GAAA,KAAA,QAAA,MAAA;SAClB,IAAI,MAAI,SAAW,cAAA,MAAA,WAAA,KAAA,GAAA,KAAA,iBAAA,MAAA;SACnB,IAAK,MAAA,SAAA,cAAA,MAAA,cAAA,KAAA,GAAA,KAAA,QAAA,MAAA;SAAE,KAAU,OAAA,MAAA,KAAA,GAAA,MAAA,KAAA,GAAA,MAAA;IAAO,MAAA,QAAS,KAAQ,IAAK,EAAA;IAAG,IAAA,UAAW,KAAA,GAAA;KAAG,KAAA,IAAA,IAAA,KAAA,MAAA;KACpE,KAAA,KAAA;MACF,UAAA;MACA,SAAM,QAAW,KAAK;MAClB,UAAA,CAAA;KACJ,CAAI;KACF;IACA;IACA,MAAM,WAAA,KAAc;IACpB,IAAA,aAAiB,KAAA,GAAA;IAE0D,IAAG,MAAA,SAAA,cAAA,MAAA,oBAAA,KAAA,GAAA;KAAM,MAAG,SAAA,UAAA,KAAA;KAAO,IAAI,WAAI,KAAA,GAAA;KACtG,MAAK,cAAS,SAAA,SAAA,WAAA,SAAA,KAAA,cAAA,OAAA,SAAA;KAAE,MAAG,WAAA,gBAAA,KAAA,CAAA,GAAA,SAAA,UAAA,MAAA,IAAA,SAAA,SAAA,KAAA,MAAA,aAAA,aAAA,cAAA;MAAU,GAAA;MAAS,GAAA;KACtC,IAAA,IAAA;KACF,KAAA,SAAA;MACA,GAAK;MACH;KACE;KACA;IAGF;IACA,KAAA,SAAS;KACT,UAAU;MACZ,GAAA;MACF,GAAA,MAAA,aAAA,KAAA,KAAA,SAAA,SAAA,aAAA,KAAA,IAAA,EAAA,UAAA,SAAA,SAAA,SAAA,IAAA,CAAA;KACA;KACA,SAAY,QAAI,KAAO;KACrB,UAAM,SAAa;IACnB;GACA;GACA,MAAM,aAAS,IAAA,IAAW,MAAA,KAAY,SAAA,CAAW,KAAA,QAAa,KAAA,MAAW,CAAA,CAAA;GACzE,OAAM,KAAA,KAAA,QAAmB;IACzB,MAAO,SAAA,IAAA,SAAA;IACL,MAAG,SAAA,WAAA,KAAA,IAAA,KAAA,IAAA,WAAA,IAAA,MAAA;IACH,IAAA,WAAS,KAAA,KAAA,WAAA,WAAA,OAAA;IACT,MAAA,SAAU,WAAA,YAAA,WAAA,aAAA,WAAA;IACR,MAAG,eAAI,IAAA,SAAA,OAAA,QAAA,gBAAA,EAAA;IACP,OAAO;KACP,GAAI;KACJ,SAAI;KACN,UAAA;MACF,GAAA,IAAA;MACD,OAAA,SAAA,WAAA;MACH,GAAA,iBAAA,KAAA,IAAA,CAAA,IAAA,EAAA,OAAA,aAAA;MAmBA,GAAS,SAAA,EAAA,SAA6E,KAAA,IAAA,CAAA;KAChF;IACJ;GACE,CAAA;EACA;EAGF,SAAQ,YAAA,QAAA;GACN,IAAA,WAAA,KAAA,GAAA,OAAA,KAAA;GACF,IAAA;IACF,MAAA,QAAA,KAAA,MAAA,MAAA;IAEA,OAAS,UAAY,QAA4C,OAAiC,UAAA,YAAA,CAAA,MAAA,QAAA,KAAA,IAAA,QAAA,KAAA;GAChG,QAAM;IACN;GACF;EAEA;EACE,SAAO,YAAK,OAAe,KAAI;GACjC,MAAA,QAAA,QAAA;GAEA,OAAS,OAAA,UAAU,YAA2G,MAAA,SAAA,IAAA,QAAA,KAAA;EAC5H;EACA,SAAI,UAAS,MAAW;GACxB,OAAI,KAAA,WAAa,IAAA,IAAe,KAAM,MAAA,QAAQ,CAAO,CAAA;EACnD;EACE,SAAI,UAAS,UAAe,OAAA;GAC5B,MAAM,OAAO,YAAA,OAAA,WAAA;GACb,IAAA,SAAM,KAAU,GAAA,OAAY,KAAA;GAC5B,IAAI,aAAY,eAAmB,MAAA,QAAA,OAAA,KAAA,GAAA;IACnC,MAAO,QAAC,MAAA,MAAA,SAAA,SAAA;KAAE,IAAA,SAAA,QAAA,OAAA,SAAA,YAAA,MAAA,QAAA,IAAA,GAAA,OAAA,CAAA;KAAM,MAAA,OAAS;KAAyC,MAAA,UAAA,YAAA,MAAA,YAAA;KAAS,IAAA,YAAA,KAAA,GAAA,OAAA,CAAA;KAC5E,OAAA,CAAA;MACD;MACF,SAAA,YAAA,MAAA,YAAA,KAAA;MACI;KACF,CAAA;IACA,CAAA;IAA8C,OAAA,MAAA,WAAA,IAAA,KAAA,IAAA;GAAM;GAAmD,IAAA,aAAA,QAAA;IAAS,MAAA,UAAA,YAAA,OAAA,YAAA;IAClH,OAAA,YAAA,KAAA,IAAA,KAAA,IAAA,CAAA;KACI;KACF,SAAM,YAAU,OAAY,YAAO,KAAS;KAC5C;IAA8C,CAAA;GAAM;GAAe,IAAA,aAAS,SAAA;IAAS,MAAA,UAAA,YAAA,OAAA,SAAA;IACvF,OAAA,YAAA,KAAA,IAAA,KAAA,IAAA,CAAA;KAEF;KAEA,SAAS;KACP,SAAa;IACb,CAAA;GACA;EACA;EACA,SAAI,gBAAA,UAAA,OAAA,SAAA,OAAA;GACJ,MAAI,OAAA,YAAA,OAAA,WAAA,KAAA,YAAA,OAAA,MAAA;GACJ,MAAQ,UAAR,YAAA,OAAA,SAAA,KAAA,YAAA,OAAA,OAAA;GACE,MAAK,cAAA,YAAA,OAAA,aAAA;GACH,MAAA,SAAY,QAAS;GACrB,IAAA;GACA,IAAA;GACF,QAAK,UAAL;IACE,KAAA;KACA,YAAA,SAAe,KAAA,IAAc,gBAAW,WAAA,cAAA,YAAA,KAAA,OAAA,WAAA;KACxC,eAAA,SAAA,KAAA,IAAA,cAAA,WAAA,cAAA,UAAA,KAAA,OAAA,WAAA;KACF;IACE,KAAA;KACA,YAAA,gBAAuB,WAAQ;KAC/B,eAAA,cAAA,WAAA;KACF;IACE,KAAM;KACN,YAAY,QAAA,QAAW;KACvB,eAAe,QAAS,QAAA;KACxB;IACF,KAAA,YAAA;KACA,MAAK,MAAA,YAAA,OAAA,KAAA,KAAA;KACH,YAAY,WAAA;KACZ,eAAe,SAAA;KACf;IACF;IAAa,KAAK;KAChB,YAAY,wBAAkB,WAAA;KAC9B,eAAe,sBAAgB,WAAA;KAC/B;IACF,KAAK;IACH,KAAA;KACA,YAAA,UAAwB,QAAQ;KAChC,eAAA,QAAA,QAAA;KACF;IACE,KAAM;KACN,YAAY,SAAA,QAAe;KAC3B,eAAe,SAAA,QAAgB;KAC/B;IACF,KAAA,QAAA;KACA,MAAA,UAAA,YAAA,OAAA,SAAA,KAAA;KACE,YAAY,eAAe,OAAG;KAC9B,eAAe,gBAAkB,KAAE,IAAA,OAAY,YAAc;KACjE;IACA;IACF;;KAGA,eAAgB,UAAA,OACd,CAAA,CAAA,CAAA,YAEA,IACA,UAAoC,MACH,CAAA;GACjC;GAIA,OAAM,SAAiC,aAAA,iBAAA;EACvC;;EAOE,SAAI,uBAA6B,YAAM,MAAc,MAAA,QAAA,CAAA,GAAA;GACrD,MAAM,UAAU,WAAA,QAAA,aAAA,SAAA,SAAA,QAAA,SAAA,SAAA,IAAA,CAAA,CAAA,MAAA,CAAA,CAAA,MAAA,MAAA,UAAA,KAAA,UAAA,MAAA,OAAA;GAChB,MAAM,QAAQ,CAAA;GACd,IAAA;GACA,MAAM,mBAAkB;IACxB,IAAM,UAAQ,KAAI,KAAI,MAAM,MAAI,WAAa,GAAK;IAClD,MAAM,UAAK;IACT,MAAM,QAAA,QAAA,MAAA,SAAA,SAAA,KAAA,SAAA,CAAA,CAAA;IACN,MAAA,YAAiB,MAAA,QAAA,OAAA,SAAA,QAAA,UAAA,KAAA,OAAA,GAAA,CAAA;IACjB,MAAO,YAAQ,MAAA,QAAA,OAAA,SAAA,SAAA,KAAA,YAAA,OAAA,IAAA,UAAA,KAAA,OAAA,IAAA,CAAA;IACf,MAAI,QAAM,IAAA,IAAW,MAAS,KAAA,SAAA,KAAA,IAAA,CAAA,CAAA,CAAA;IAAE,MAAA,KAAA;KAAW,MAAA;KAAW,SAAA,QAAA;KAAM,OAAA,QAAA;KAC7D,GAAA,MAAA,WAAA,IAAA,CAAA,IAAA;MACD;MACA;MACE;KACA;IAAoC,CAAA;IAAkB,QAAA,KAAS;IAAkB,KAAA,MAAA,YAAA,QAAA,oBAAA;KAAK,MAAA,MAAA,aAAA,CAAA,QAAA,SAAA,MAAA,KAAA,CAAA,CAAA;KACxF,IAAA,QAAA,KAAA,GAAA,MAAA,KAAA;MACF,MAAA;MACK,SAAM,SAAY;MACjB;KACJ,CAAI;IACF;GACA;GACe,KAAA,MAAM,YAAA,SAAA;IAAQ,IAAA,CAAA,wBAAkB,UAAA,KAAA,GAAA;IAAS,IAAA,SAAM,SAAS,QAAA;KAAM,WAAA;KAE7E,IAAA,SAAA,SAAA,KAAA,KAAA,SAAA,KAAA,SAAA,GAAA,MAAA,KAAA;MACF,MAAA;MACI,SAAS,SAAS;MACpB,MAAA,SAAU;KAAE,CAAA;KAA2B;IAAW;IAAiB,IAAA,SAAA,SAAqB,eAAA,SAAA,cAAA,KAAA,KAAA,SAAA,aAAA,KAAA,GAAA;KAAE,UAAA;MAC1F,SAAW,SAAI;MACf,OAAM,CAAA;MACN,sBAAiB,IAAA,IAAA;MACf,oBAAoB,CAAA;KACpB;KACA,MAAA,KAAA,IAAa,SAAA,WAAgB,MAAS,MAAU,MAAK;KACrD,MAAI,QAAS,YAAY,SAAa,MAAM;KAC5C,MAAI,MAAS,KAAA;MACb,WAAa,SAAU;MACvB,UAAa,SAAA;MACb,aAAW,gBAAA,SAAA,UAAA,KAAA;MACZ,GAAA,SAAA,YAAA,KAAA,IAAA,CAAA,IAAA,EAAA,SAAA,SAAA,QAAA;MACD,GAAA,SAAA,WAAA,KAAA,IAAA,CAAA,IAAA,EAAA,OAAA,SAAA,OAAA;MACF,GAAA,SAAA,UAAA,KAAA,IAAA,CAAA,IAAA,EAAA,OAAA,SAAA,MAAA;MACA,GAAK,SAAS,YAAS,KAAA,IAAA,CAAA,IAAiB,EAAA,SAAS,SAAS,QAAA;MACxD,UAAM,CAAQ;KACd,CAAA;KACA;IACE;IACA,KAAA,SAAc,SAAS,iBAAY,SAAU,SAAS,iBAAsB,SAAS,cAAM,KAAA,KAAA,UAAA,KAAA,GAAA;KAC3F,MAAM,QAAA,MAAY,KAAO,IAAA,SAAQ,SAAO;KACxC,MAAM,WAAY,UAAO,KAAQ,IAAA,KAAO,IAAA,MAAS,MAAS;KAC1D,IAAA,UAAY,KAAA,KAAS,aAAA,KAAA,GAAA;MACnB,MAAG,SAAA,SAAA,YAAA,QAAA,SAAA,UAAA,YAAA,SAAA,SAAA;MACH,MAAA,QAAa,SAAA,KAAgB,IAAA,UAAS,SAAU,UAAY,YAAc,SAAS,KAAA,CAAA;MACnF,MAAI,YAAS,OAAW,QAAa,OAAM,SAAQ,QAAS,UAAO,KAAA,OAAA,GAAA,CAAA;MACnE,MAAI,YAAS,OAAU,QAAa,OAAM,SAAO,SAAS,KAAM,YAAA,OAAA,IAAA,UAAA,KAAA,OAAA,IAAA,CAAA;MAChE,MAAI,MAAS,SAAA;OACb,GAAI;OAA6B,aAAA,gBAAA,SAAA,UAAA,YAAA,SAAA,KAAA,GAAA,MAAA;OAAO,GAAA,SAAW,WAAa,KAAA,IAAA,CAAA,IAAA,EAAA,QAAA,SAAA,OAAA;OAAG,GAAA,SAAW,UAAA,KAAa,IAAA,CAAA,IAAA,EAAA,OAAA,SAAA,MAAA;OAAE,GAAA,SAAA,YAAA,KAAA,IAAA,CAAA,IAAA,EAAA,SAAA,SAAA,QAAA;OAC7F,GAAI,UAAS,KAAA,IAAS,CAAA,IAAA;QAAiB;QAA0B,WAAS,aAAA;QAAK,WAAK,aAAA;OACtF;OACF,GAAA,SAAA,SAAA,eAAA;QACA,QAAA,SAAA;QACF,SAAA;OACI,IAAA,CAAA;MACF;KACA;KACA;IACA;IACE,IAAA,SAAM,SAAc,cAAS,SAAS,oBAAuB,KAAA,KAAA,UAAqB,KAAA,GAAS;KAC3F,MAAM,QAAA,MAAW,KAAA,IAAA,SACZ,eAAY;KAC0D,MAAG,WAAA,UAAA,KAAA,IAAA,KAAA,IAAA,MAAA,MAAA;KAAM,MAAG,SAAA,UAAA,QAAA;KAAO,IAAI,UAAI,KAAA,KAAA,aAAA,KAAA,KAAA,WAAA,KAAA,GAAA;MACtG,MAAM,cAAe,SAAA,SAAA,WAAA,SAAA,KAAA,cAAA,OAAA,SAAA;MAAE,MAAG,WAAA,gBAAA,KAAA,CAAA,GAAA,SAAA,UAAA,MAAA,IAAA,SAAA,SAAA,KAAA,MAAA,aAAA,aAAA,cAAA;OAAU,GAAA;OAAS,GAAA;MAC/C,IAAA,IAAA;MACA,MAAA,MAAA,SAAA;OACF,GAAA;OACK;MACD;KAIF;KACA;IACF;IACA,IAAM,CAAA,YAAM,QAAc,GAAA;IAC1B,IAAI,UAAQ,KAAW,GAAA;KAAa,MAAM,mBAAA,KAAA,QAAA;KAAY;IAA2B;IAAK,MAAA,MAAA,aAAA,CAAA,QAAA,SAAA,MAAA,KAAA,CAAA,CAAA;IACxF,IAAA,QAAA,KAAA,GAAA,MAAA,KAAA;KACA,MAAA;KACA,SAAO,SAAA;KACT;;;GASA,WAAa;GACX,OAAM;EACN;;;EAE4C,MAAI,+BAA4B;GAAa,MAAM;GAAQ,QAAA;GACrG,MAAI,OAAM;IAA8B,IAAI,MAAG,SAAW,cAAc,OAAK;KAAQ,IAAM,GAAA,MAAA,KAAA,KAAA,GAAA,MAAA,KAAA;KAAS,MAAA;IACpG;IACA,IAAA,MAAO,SAAA,YAAA,OAAA;KAAE,IAAI,GAAG,MAAM,KAAK,KAAK,GAAG,MAAM,KAAK;KAAQ,MAAM;IAAS;IACvE,IAAA,MAAA,SAAA,uBAAA,MAAA,KAAA,QAAA,OAAA,aAAA,UAAA,OAAA;IACA,OAAM;KACJ,IAAI,GAAM,MAAM,KAAA,KAAS,GAAA,MAAA,KAAc;KACvC,MAAO;IACL;GACA;GACA,MAAA,UAAW,OAAO;IACpB,IAAA,MAAA,MAAA,SAAA,cAAA,MAAA,IAAA,MAAA,0CAAA;IACF,OAAA;KACA,MAAO,MAAS,MAAA,KAAO;KACrB,MAAI,MAAM,MAAM,KAAS;KACd,WAAW,OAAA,mBAAA;IAAO;GAA+B;GAAiC,OAAA,SAAA,OAAA;IAE7F,IAAI,MAAM,MAAM,SAAS,qBAChB,OAAQ;KACT,GAAG,QAAQ;KAAO,cAAW,MAAM,MAAM;KAAU,WAC7C,MAAA,MAAA,MAAA;IAEd;IACF,IAAA,MAAA,MAAA,SAAA,YAAA,OAAA,QAAA,MAAA,iBAAA,KAAA,IAAA;KACA,GAAA,QAAc;KACZ,WAAc,MAAA,MAAQ,MAAA;IACtB,IAAI,QAAU;IACd,MAAO,IAAA,MAAA,oEAAA;GACL;GACA,cAAM,SAAA;IACN,MAAI,QAAQ,QAAA;IACZ,IAAA,UAAQ,KAAA,GAAA,OAAA;IACR,OAAA;KACA,KAAA,QAAU;KACV,MAAA;KACA,IAAM,QAAA;KAAE,QAAM;KAAY,WAAY,MAAA;KAAK,UAAA,QAAA,OAAA,YAAA,EAAA,MAAA,aAAA;KAC7C,YAAA;KACF,MAAA;MACF,MAAA,MAAA;;KAGA;IACE;GACA;EACA;;EAC4C,MAAI,8BAAsB;GAAG,MAAM;GAAQ,QAAA;GACrF,MAAI,OAAM;IACC,IAAI,MAAO,SAAM,cAAS,OAAA;KAAG,IAAM,OAAA,MAAA,KAAA,IAAA;KAAS,MAAA;IAEvD;IACF,IAAA,MAAA,SAAA,cAAA,MAAA,SAAA,gBAAA,MAAA,SAAA,qBAAA,OAAA;KACA,IAAM,OAAA,MAAU,KAAO,IAAA;KACrB,MAAI;IAIJ;IACE,OAAM;GACN;GACA,MAAA,UAAU,OAAA;IACV,IAAA,MAAW,MAAA,SAAO,cAAA,MAAA,IAAA,MAAA,wCAAA;IACpB,OAAA;KACF,MAAA,MAAA,MAAA,KAAA;KACA,QAAO;KACL,UAAU;KAAoC,WAAW,OAAA;IAAO;GAAc;GAC9E,OAAI,SAAY,OAAA;IAChB,IAAA,MAAO,MAAA,SAAA,YAAA,OAAA;KAAE,GAAG,QAAQ;KAAO,QAAU;IAAM;IAAiC,IAAA,MAAA,MAAA,SAAA,gBAAA,CAAA,QAAA,MAAA,UAAA,OAAA,QAAA;IAC9E,OAAA;KACA,GAAA,QAAc;KACZ,UAAM;KACN,WAAc,MAAA,MAAW,MAAO;IAChC;GACE;GACA,cAAM,SAAA;IACN,MAAI,QAAQ,QAAA;IACZ,IAAA,UAAQ,KAAA,GAAA,OAAA;IACR,OAAA;KACA,KAAA,QAAU;KAGV,MAAA;KACA,IAAM,QAAQ;KAChB,QAAA;KACF,WAAA,MAAA;KACF,UAAA,QAAA,OAAA,YAAA,EAAA,MAAA,aAAA;;KAGA,MAAa,EAAA,MAAA,MAAA,KAA8E;IACzF;GACA;EACE;;EAAuE,MAAA,uBAAM;GAAQ,MAAA;GACrF,MAAI,OAAM;IACV,IAAA,MAAO,SAAA,cAAA,OAAA;KAAE,IAAI,OAAO,MAAM,KAAK,IAAI;KAAG,MAAM;IAAS;IACvD,IAAA,MAAA,SAAA,uBAAA,MAAA,KAAA,QAAA,OAAA,aAAA,UAAA,OAAA;IACA,OAAM;KACJ,IAAI,OAAM,MAAM,KAAS,IAAA;KACzB,MAAO;IAAE;GAA6B;GAAc,MAAA,UAAA,OAAA;IACtD,IAAA,MAAA,MAAA,SAAA,cAAA,MAAA,IAAA,MAAA,wCAAA;IACA,OAAO;KACL,MAAI,MAAM,MAAM,KAAS;KACzB,QAAO;IAAyC;GAA0B;GAAa,OAAA,SAAA,OAAA;IACzF,IAAA,MAAA,MAAA,SAAA,qBAAA,MAAA,IAAA,MAAA,sDAAA;IACA,OAAA,QAAkB,MAAA,SAAS,QAAO,QAAA;KAChC,MAAI,QAAU,MAAA;KACd,QAAM;IACN;GAAS;GAAc,kBAAc,SAAM,OAAA;IAAM,IAAK,UAAA,UAAA,QAAA,OAAA,WAAA,MAAA,OAAA;IAAc,MAAA,QAAA,EAAA,MAAA,QAAA,MAAA,KAAA;IAAM,OAAA;KAC5E,MAAA;KACF,MAAA,QAAA,MAAA;;KAGA;IACE;GACF;;;;GC1hBA,OAAa,MAAA,KAAA,KACX,IAAA,YAAO,KAAA;EAGT;;;EAOE,MAAA,kBAAU,EAAA,OAAA,6BAAA;EACV,MAAA,gBAAY,EAAA,OAAA,uCAAA;EACZ,MAAA,UAAY;GACZ,MAAA;GACF,OAAA;GAEA,UAAa;GAIb,YAAa;GACX,YAAW;GACX,YAAU;EACV;EACA,MAAA,cAAS,EAAA,WAAA,gBAAA;EACT,MAAA,aAAc;GACd,WAAY;GACZ,UAAO;GACP,QAAU;GACV,SAAA;GACA,cAAY;GACZ,YAAc;GAChB,OAAA;GAEA,UAAa;GACX,YAAS;GACT,YAAA;GACA,cAAK;EACL;EACA,MAAA,eAAU;GACV,SAAA;GACF,eAAA;GAEA,KAAa;GACX,OAAS;GACT,UAAY;GACZ,eAAK;EACL;EACF,MAAA,eAAA;GAEA,SAAa;GACX,YAAO;GACP,KAAA;GACA,SAAS;EACT;EACA,MAAM,eAAA;GACN,OAAA;GACA,QAAA;GACA,SAAO;GACP,YAAU;GACV,MAAA;GACF,cAAA;GAEA,YAAa;GACX,OAAQ;GACR,UAAO;GACP,YAAU;EACV;EACA,MAAA,kBAAY;GACd,QAAA;GAEA,OAAa;GACX,UAAQ;GACR,YAAO;GACP,YAAU;EACV;EACA,MAAA,yBAAY;GACd,QAAA;GAEA,OAAa;GACX,UAAQ;GACR,YAAO;GACP,YAAU;EACV;EACF,MAAA,eAAA;GAEA,QAAa;GACX,OAAS;GACT,UAAA;GACA,YAAK;EACL;EACA,MAAA,eAAQ;GACR,SAAA;GACA,eAAY;GACd,KAAA;GAEA,SAAa;GACX,QAAS;GACT,cAAY;GACZ,YAAA;EACA;EACF,MAAA,qBAAA;GAEA,SAAa;GACX,YAAS;GACT,gBAAA;GACA,KAAK;EACL;EACA,MAAA,iBAAW;GACX,SAAA;GACA,qBAAU;GACZ,KAAA;GAEA,SAAa;GAIb,WAAa;GACX,cAAO;GACP,UAAY;EACZ;EACF,MAAA,kBAAA,EAAA,OAAA,kCAAA;EAEA,MAAa,kBAA+B;GAC1C,OAAA;GACA,YAAU;GACZ,cAAA;EAEA;EACE,MAAO,gBAAA;GACP,UAAU;GACV,UAAW;EACX;EACA,MAAA,mBAAS;GACT,OAAQ;GACR,UAAA;GACA,WAAY;GACZ,WAAO;GACP,SAAM;GACN,QAAU;GACV,cAAY;GACd,YAAA;GAEA,OAAa;GACX,MAAO;GACP,UAAW;GACX,YAAS;EACT;EACA,MAAA,uBAAgB;GAChB,OAAK;GACL,WAAS;GACT,SAAQ;GACR,YAAc;GACd,gBAAY;GACZ,KAAO;GACP,SAAW;GACX,QAAM;GACN,cAAU;GACV,YAAY;GACZ,OAAA;GACA,WAAQ;GACR,MAAA;GACF,UAAA;GAEA,YAAa;GACX,WAAa;GACb,QAAA;GACF,YAAA;EAEA;EACE,MAAA,2BAAU;GACV,aAAM;GACN,WAAU;EACV;EACA,MAAA,qBAAY;GACd,UAAA;GAEA,MAAa;GACX,UAAM;GACN,cAAO;GACP,YAAU;EACV;EACA,MAAA,uBAAW;GACX,MAAA;GACF,OAAA;GAEA,UAAa;GAIb,YAAa;GACX,WAAU;GACV,YAAQ;EACR;EACA,MAAM,2BAAA,EAAA,WAAA,iCAAA;EACN,MAAO,oBAAA;GACP,UAAW;GACX,QAAA;GACA,KAAA;GACA,MAAQ;GACR,OAAA;GACA,WAAY;GACZ,WAAW;GACb,SAAA;GAEA,QAAa;GACX,cAAO;GACP,YAAW;GACX,WAAS;EACT;EACA,MAAK,sBAAA;GACL,OAAS;GACT,WAAQ;GACR,SAAA;GACA,YAAY;GACZ,KAAO;GACP,SAAM;GACN,QAAU;GACV,cAAY;GACZ,YAAW;GACX,OAAQ;GACV,MAAA;GAEA,UAAa;GAIb,YAAa;GACX,WAAO;GACP,QAAM;EACN;EACA,MAAA,4BAAU,EAAA,YAAA,8BAAA;EACV,MAAA,qBAAY;GACZ,OAAA;GACF,MAAA;GAEA,OAAa;GACX,UAAS;GACT,YAAU;GACV,WAAK;EACP;EAEA,MAAa,kBAAwB;GACnC,SAAQ;GACR,UAAS;GACT,KAAA;EACA;EACA,MAAO,SAAA;GACP,QAAU;GACV,SAAA;GACF,cAAA;GAEA,YAAqC;GACnC,OAAA;GACA,UAAM;GACN,YAAW;EACX;EACA,MAAA,SAAQ;GACR,WAAA;GACA,MAAA;GACA,WAAO;GACP,SAAM;GACN,QAAU;GACV,cAAY;GACZ,YAAY;GACZ,OAAQ;GACV,MAAA;GAEA,UAAa;GACX,YAAG;GACH,YAAa;GACb,QAAA;EACA;EACF,MAAA,gBAAA;GAIA,GAAa;GACX,aAAS;GACT,YAAA;GACA,OAAO;EACP;EACA,MAAA,aAAU;GACV,SAAQ;GACR,eAAU;GACV,OAAQ;GACR,QAAA;GACA,UAAY;GACZ,QAAA;GACF,UAAA;GAEA,QAAa;GACX,cAAW;GACX,YAAQ;GACR,WAAM;EACN;EACA,MAAA,cAAY;GACZ,WAAA;GACA,QAAK;GACL,MAAA;GACA,SAAA;GACF,YAAA;GAEA,gBAAa;GACX,KAAA;GACA,SAAO;GACP,cAAU;EACV;EACA,MAAA,eAAY;GACd,SAAA;GAEA,OAAa;GACX,UAAS;GACT,YAAW;GACX,YAAO;EACP;EACA,MAAA,gBAAY;GACd,SAAA;GAEA,WAAa;GAEb,OAAa;GACV,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BH,qBAAwC;;;;;EAKtC,MAAA,YAAY;GACd,MAAA;GAEA,WAAa;GACX,WAAW;GACX,SAAS;GACT,YAAY;EACZ;EACA,MAAK,oBAAA;GACP,WAAA;GAEA,SAAa;GACX,YAAS;GACT,gBAAY;GACZ,KAAK;EACL;EACA,MAAA,kBAAU;GACV,SAAA;GACA,YAAY;GACd,KAAA;GAEA,OAAa;GACX,UAAS;GACT,YAAY;GACZ,YAAK;EACL;EACA,MAAA,mBAAQ;GACR,SAAA;GACA,YAAO;GACP,KAAM;GACN,SAAU;GACV,QAAA;GACA,YAAY;GACZ,OAAQ;GACV,MAAA;GAEA,UAAa;GACX,YAAU;GACV,YAAS;GACT,QAAA;EACA;EACA,MAAO,kBAAA;GACP,UAAU;GACV,SAAA;GACA,cAAW;GACX,YAAA;GACF,OAAA;GAEA,UAAa;GACX,YAAQ;GACR,WAAO;GACP,oBAAU;EACV;EACF,MAAA,kBAAA;GAEA,QAAa;GACX,OAAA;GACA,UAAY;GACZ,YAAW;EACb;EAEA,MAAa,uBAA8B;GACzC,WAAS;GACT,YAAA;GACA,WAAK;EACL;EACF,MAAA,eAAA;GAEA,SAAa;GACX,eAAS;GACT,KAAA;GACA,WAAA;EACA;EACA,MAAA,WAAW;GACb,SAAA;GAEA,QAAa;GAIb,cAAa;GACX,YAAS;GACT,WAAY;EACZ;EACF,MAAA,kBAAA,EAAA,aAAA,gFAAA;EAEA,MAAa,cAA+B;GAC1C,SAAO;GACP,YAAQ;GACR,KAAM;EACN;EACA,MAAA,gBAAY;GACZ,OAAA;GACA,QAAO;GACP,MAAA;GACA,SAAA;GACF,YAAA;GAEA,WAAa;GACX,OAAM;GACN,UAAU;GACZ,YAAA;EAEA;EACE,MAAA,eAAQ;GACR,MAAO;GACP,UAAU;EACV;EACA,MAAA,YAAY;GACZ,QAAA;GACF,OAAA;GAEA,UAAa;GACX,YAAQ;GACR,YAAO;GACP,cAAU;EACV;EACF,MAAA,iBAAA;GAEA,QAAaA;GACX,OAAQ;GACR,UAAO;GACP,YAAU;EACV;EACA,MAAA,aAAc;GAChB,QAAA;GAEA,OAAa;GACX,UAAQ;GACR,YAAO;GACP,cAAU;EACV;EACA,MAAA,cAAY;GACZ,QAAA;GACF,OAAA;GAEA,UAAa;GACX,YAAS;GACT,YAAQ;GACR,cAAY;EACZ;EACA,MAAM,iBAAA;GACN,SAAU;GACV,QAAA;GACA,YAAQ;GACV,OAAA;GAEA,MAAa;GAIb,UAAa;GACX,YAAS;GACT,QAAA;EACA;EACA,MAAA,sBAAQ,EAAA,QAAA,eAAA;EACR,MAAA,mBAAS;GACT,SAAA;GACA,eAAY;GACZ,KAAA;GACF,QAAA;GAEA,SAAa;GACX,cAAS;GACT,YAAY;GACZ,WAAK;EACP;EAEA,MAAa,mBAAmC;GAC9C,SAAM;GACN,YAAO;GACP,KAAA;EACA;EACF,MAAA,oBAAA;GAEA,MAAa;GACX,OAAM;GACN,UAAU;GACZ,YAAA;EAEA;EACE,MAAA,mBAAQ;GACR,MAAO;GACP,UAAU;EACV;EACA,MAAA,oBAAY;GACZ,QAAA;GACF,OAAA;GAEA,UAAa;GACX,YAAQ;GACR,YAAO;GACP,cAAU;EACV;EACA,MAAA,sBAAY;GACZ,QAAA;GACF,OAAA;GAEA,UAAa;GAIb,YAAa;GACX,YAAO;GACP,cAAU;EACV;EACA,MAAA,qBAAQ,EAAA,WAAA,EAAA;EACV,MAAA,4BAAA;GAsBA,OAAa;GACX,UAAS;GACT,YAAA;GACA,QAAQ;EACV;EAEA,MAAa,iBAAgC;GAC3C,SAAU;GACV,gBAAS;GACX,QAAA;EAEA;EACE,MAAA,iBAAS;GACT,UAAY;GACZ,SAAK;EACL;EACA,MAAA,iBAAQ;GACR,SAAA;GACA,YAAY;GACZ,KAAO;GACP,SAAM;GACN,QAAU;GACV,cAAY;GACZ,YAAA;GACA,OAAQ;GACR,MAAA;GACF,UAAA;GAEA,YAAa;GAIb,oBAA6C;GAI7C,QAAa;GACX,YAAO;EACP;EACA,MAAM,oBAAA,EAAA,gBAAA,YAAA;EACN,MAAA,iBAAc,EAAA,SAAA,GAAA;EACd,MAAA,gBAAY;GACd,OAAA;GAEA,QAAa;GAIb,MAAa;GAIb,cAAa;GAIb,YAAa;EACX;EACA,MAAM,qBAAA,EAAA,YAAA,uCAAA;EACN,MAAA,oBAAQ,EAAA,YAAA,sEAAA;EACR,MAAA,kBAAQ,EAAA,YAAA,IAAA;EACR,MAAA,iBAAU;GACV,UAAU;GACV,MAAA;GACA,QAAS;GACT,QAAA;GACA,UAAK;GACL,UAAS;GACT,WAAQ;GACR,SAAA;GACA,eAAY;GACZ,KAAA;GACA,SAAU;GACV,QAAA;GACA,cAAe;GACjB,YAAA;GAEA,WAAa;GACX,UAAO;GACP,YAAY;GACd,eAAA;EAEA;EACE,MAAA,mBAAU;GACV,OAAS;GACT,YAAY;EACZ;EACF,MAAA,gBAAA;GAEA,UAAa;GACX,SAAO;GACP,YAAM;GACN,KAAA;EACA;EACA,MAAA,kBAAY;GACZ,OAAA;GACF,MAAA;GAEA,WAAa;GAIb,UAAa;GAIb,YAAa;GAIb,YAAa;EACX;EACA,MAAM,yBAAA,EAAA,OAAA,6BAAA;EACN,MAAA,uBAAU,EAAA,OAAA,uCAAA;EACV,MAAA,sBAAc,EAAA,OAAA,sEAAA;EACd,MAAA,iBAAY;GACZ,UAAO;GACT,MAAA;GAEA,UAAa;GACX,cAAM;GACN,YAAO;GACP,OAAA;EACF;EAEA,MAAa,iBACX;GAGF,MAAa;GACX,OAAA;GACA,UAAY;EACZ;EACA,MAAO,iBAAA,EAAA,OAAA,kCAAA;EACP,MAAA,iBAAU;GACZ,WAAA;GAIA,YAAa;GACX,WAAU;GACV,OAAS;GACT,UAAY;EACZ;EACA,MAAA,yBAAU;GACZ,UAAA;GAEA,SAAa;GACX,YAAQ;GACR,KAAA;GACA,UAAY;EACZ;EACA,MAAA,wBAAS;GACT,QAAQ;GACR,SAAA;GACA,YAAY;GACZ,UAAO;GACT,SAAA;GAEA,QAAa;GACX,cAAU;GACV,YAAS;GACT,OAAA;EACF;EAEA,MAAa,mBAAmC;GAC9C,UAAQ;GACR,SAAU;GACV,UAAS;EACT;EACA,MAAK,oBAAA;GACL,QAAU;GACV,UAAS;GACT,SAAQ;GACR,YAAc;GACd,KAAA;GACA,UAAO;GACP,SAAM;GACN,QAAU;GACV,cAAY;GACZ,YAAQ;GACV,OAAA;GAEA,MAAa;GACX,UAAU;GACV,YAAU;GACV,QAAO;EACP;EACA,MAAA,iBAAY;GACd,UAAA;GAEA,UAAa;GACX,OAAA;GACA,cAAQ;GACR,YAAK;EACL;EACA,MAAO,iBAAA;GACP,UAAW;GACX,QAAS;GACT,KAAA;GACA,MAAK;GACL,OAAS;GACT,WAAQ;GACR,SAAA;GACA,eAAY;GACZ,KAAA;GACF,SAAA;GAEA,QAAa;GACX,cAAQ;GACR,YAAW;GACX,WAAS;EACT;EACA,MAAK,mBAAA;GACL,QAAS;GACT,WAAQ;GACR,SAAA;GACA,YAAY;GACZ,KAAO;GACT,SAAA;GAEA,QAAa;GACX,cAAU;GACV,YAAM;GACN,OAAQ;EACR;EACA,MAAA,wBAAY;GACZ,UAAO;GACP,MAAM;GACN,QAAU;GACV,SAAA;GACF,YAAA;GAEA,OAAa;GACX,MAAA;GACA,UAAS;GACT,YAAA;EACA;EACA,MAAA,iBAAoB;GACtB,WAAA;GAEA,SAAa;GACX,eAAO;GACP,WAAQ;GACR,oBAAW;EACX;EACA,MAAA,iBAAY;GACZ,OAAK;GACL,QAAS;GACT,WAAQ;GACR,SAAA;GACA,YAAY;GACZ,KAAO;GACP,SAAM;GACN,QAAU;GACV,cAAY;GACZ,YAAW;GACX,OAAQ;GACV,MAAA;GAEA,UAAa;GAIb,YAAa;GACX,WAAU;GACV,QAAM;EACN;EACA,MAAA,uBAAc,EAAA,YAAA,qEAAA;EACd,MAAA,qBAAY;GACd,UAAA;GAEA,MAAa;GACX,UAAQ;GACR,cAAS;GACT,YAAY;EACZ;EACA,MAAA,kBAAU;GACZ,QAAA;GAEA,SAAa;GACX,YAAO;GACP,OAAQ;GACR,UAAM;EACN;EACF,MAAA,wBAAA;GAEA,OAAa;GACX,QAAQ;GACR,MAAA;GACA,YAAY;EACZ;EACA,MAAA,qBAAS;GACT,QAAQ;GACR,SAAA;GACA,YAAS;GACT,KAAA;GACA,SAAO;GACP,QAAM;GACN,cAAU;GACV,SAAA;GACA,YAAY;GACZ,OAAQ;GACR,MAAA;GACF,UAAA;GAEA,YAAa;GACX,YAAY;GACZ,QAAO;GACT,YAAA;EAEA;EAIA,MAAa,2BAAsC;GACjD,YAAO;GACP,OAAQ;EACR;EACA,MAAA,4BAAS,EAAA,WAAA,4EAAA;EACT,MAAA,uBAAY;GACZ,OAAM;GACN,QAAQ;GACR,WAAA;GACA,SAAA;GACA,YAAW;GACX,MAAO;GACP,QAAA;GACF,cAAA;GAEA,YAAa;GACX,WAAa;GACb,OAAA;GACA,YAAW;EACb;EAEA,MAAa,8BAA0C;GACrD,aAAO;GACP,YAAQ;GACR,WAAS;EACX;EAEA,MAAa,2BAA0C;GACrD,OAAA;GACA,QAAQ;GACR,SAAK;EACL;EACA,MAAO,2BAAA;GACP,UAAW;GACX,QAAS;GACT,KAAA;GACA,MAAK;GACL,OAAS;GACT,WAAQ;GACR,SAAA;GACA,eAAY;GACZ,KAAA;GACF,SAAA;GAEA,QAAa;GACX,cAAS;GACT,YAAY;GACZ,WAAK;EACP;EAEA,MAAa,6BAA6C;GACxD,SAAO;GACP,YAAQ;GACR,KAAM;EACN;EACF,MAAA,8BAAA;GAEA,OAAa;GACX,QAAO;GACP,MAAQ;GACR,OAAS;EACT;EACA,MAAM,4BAAA;GACN,OAAA;GACA,QAAA;GACA,SAAO;GACP,YAAU;GACV,MAAA;GACF,cAAA;GAEA,YAAa;GACX,OAAA;GACA,UAAS;GACT,YAAM;EACN;EACA,MAAK,2BAAA;GACP,UAAA;GAEA,SAAa;GACX,MAAO;GACP,eAAU;GACV,KAAA;EACA;EACF,MAAA,4BAAA;GAEA,OAAa;GACX,UAAO;GACP,YAAU;GACV,YAAY;EACZ;EACF,MAAA,8BAAA;GAEA,OAAa;GACX,UAAO;GACP,YAAQ;GACR,cAAS;EACT;EACA,MAAM,8BAAA;GACN,OAAS;GACT,QAAQ;GACR,SAAA;GACA,YAAY;GACZ,MAAO;GACP,SAAM;GACN,QAAQ;GACV,cAAA;GAEA,YAAa;GACX,OAAS;GACT,MAAA;GACA,QAAK;EACL;EACF,MAAA,4BAAA;GAEA,SAAa;GACX,eAAS;GACT,KAAA;GACA,aAAK;EACL;EACA,MAAA,2BAAU;GACV,SAAA;GACF,YAAA;GAEA,KAAa;GACX,OAAO;GACP,UAAQ;GACR,YAAS;EACT;EACA,MAAM,0BAAA;GACN,OAAA;GACA,QAAA;GACA,SAAU;GACV,YAAY;GACd,MAAA;GAEA,WAAa;GACX,cAAY;GACZ,UAAO;GACT,YAAA;EAEA;EAIA,MAAa,8BAAsC;GACjD,YAAO;GACP,OAAA;EACA;EACF,MAAA,gCAAA,EAAA,QAAA,uCAAA;EAEA,MAAa,uBAAqC;GAChD,OAAA;GACA,UAAU;GACV,YAAO;EACP;EACA,MAAA,sBAAc;GACd,UAAY;GACd,UAAA;GAIA,OAAa;GACX,UAAO;GACP,cAAU;GACV,YAAU;EACV;EACA,MAAA,qBAAW;GACb,OAAA;GAEA,UAAa;GACX,UAAO;GACP,QAAU;GACV,WAAW;EACX;EACA,MAAA,gBAAS;GACT,OAAA;GACA,UAAK;GACL,WAAS;GACT,WAAQ;GACR,SAAA;GACA,YAAY;GACZ,KAAO;GACP,SAAW;GACX,QAAM;GACN,cAAU;GACV,YAAY;GACZ,OAAA;GACF,WAAA;GAEA,MAAa;GACX,UAAA;GACA,YAAY;GACd,WAAA;EAEA;EACE,MAAO,sBAAA;GACP,aAAQ;GACR,YAAS;EACT;EACA,MAAM,mBAAA;GACN,OAAA;GACA,QAAO;GACT,SAAA;GAEA,YAAa;GAIb,MAAa;GACX,cAAU;GACV,OAAM;EACN;EACA,MAAO,yBAAA,EAAA,OAAA,UAAA;EACP,MAAA,oBAAU;GACV,UAAY;GACZ,MAAA;GACA,UAAY;GACd,OAAA;GAEA,UAAa;GACX,YAAU;GACV,cAAM;GACR,YAAA;EAEA;EACE,MAAO,wBAAA;GACP,UAAU;GACV,MAAA;EACA;EACA,MAAA,mBAAQ;GACV,OAAA;GAEA,UAAa;GAIb,YAAa;GACX,gBAAU;GACV,QAAQ;EACR;EACA,MAAA,yBAAQ,EAAA,OAAA,UAAA;EACR,MAAO,wBAAA;GACP,UAAS;GACT,QAAA;GACA,MAAK;GACL,QAAS;GACT,OAAQ;GACR,SAAA;GACA,eAAY;GACZ,KAAA;GACA,SAAO;GACP,QAAA;GACF,cAAA;GAEA,YAAa;GACX,WAAS;GACT,OAAA;GACA,eAAK;EACL;EACF,MAAA,uBAAA;GAEA,SAAa;GACX,YAAM;GACN,KAAA;GACA,UAAY;EACZ;EACA,MAAA,yBAAS;GACT,MAAA;GACA,SAAA;GACA,YAAO;GACP,KAAA;GACA,SAAA;GACF,cAAA;GAEA,YAAa;GACX,OAAA;GACA,UAAO;GACT,YAAA;EAEA;EACE,MAAA,+BAAU;GACV,YAAM;GACN,OAAA;EACA;EACA,MAAA,wBAAU;GACV,UAAA;GACA,MAAA;GACF,UAAA;GAEA,OAAa;GACX,UAAM;GACN,cAAO;GACP,YAAU;EACZ;EAEA,MAAa,uBAAwC;GACnD,MAAO;GACP,OAAA;GACA,UAAY;EACZ;EACA,MAAA,yBAAgB;GAChB,OAAA;GACA,UAAQ;GACV,YAAA;GAEA,YAAa;GACX,gBAAS;GACT,qBAAY;GACZ,QAAA;EACA;EACF,MAAA,0BAAA;GAEA,SAAa;GACX,YAAS;GACT,gBAAY;GACZ,KAAK;EACL;EACA,MAAA,qBAAU;GACZ,SAAA;GAEA,YAAa;GACX,KAAO;GACP,OAAQ;GACR,UAAS;EACT;EACA,MAAA,qBAAc;GACd,OAAA;GACA,QAAO;GACP,SAAU;GACV,YAAY;GACd,cAAA;GAEA,YAAa;GACX,OAAS;GACT,UAAY;GACZ,YAAK;EACL;EACA,MAAA,yBAAY;GACd,SAAA;GAEA,YAAa;GACX,KAAA;GACA,UAAA;GACA,YAAY;EACZ;EACA,MAAA,oBAAY;GACd,SAAA;GACA,cAAa;GACX,YAAU;GACV,OAAA;GACA,YAAU;EACV;EACA,MAAA,mBAAU;GACV,UAAA;GACA,UAAY;GACd,UAAA;GAEA,OAAa;GACX,UAAU;GACV,cAAU;GACV,YAAU;EACV;EACA,MAAA,mBAAU;GACV,UAAY;GACZ,UAAA;GACA,UAAY;GACd,OAAA;GAEA,UAAa;GACX,YAAM;GACN,cAAO;GACP,YAAU;EACZ;EAEA,MAAa,qBAAA;GACX,MAAA;GACA,OAAM;GACN,UAAS;EACT;EACA,MAAA,wBAAgB;GAChB,UAAK;GACL,MAAA;GACF,SAAA;GAEA,YAAa;GACX,gBAAS;GACT,KAAA;GACA,UAAK;EACL;EACA,MAAO,iBAAA;GACP,SAAU;GACV,YAAY;GACZ,KAAA;GACF,UAAA;GAEA,OAAa;GACX,UAAU;GACV,YAAU;GACV,YAAc;EAChB;EAEA,MAAa,sBAAmC;GAC9C,UAAO;GACP,UAAQ;GACR,cAAM;EACN;EACA,MAAA,oBAAY;GACd,OAAA;GAEA,QAAa;GAIb,MAAa;GAIb,cAAa;GAIb,YAAa;EACX;EACA,MAAA,wBAAS,EAAA,OAAA,yCAAA;EACT,MAAA,wBAAY,EAAA,OAAA,kDAAA;EACZ,MAAK,sBAAA,EAAA,OAAA,uCAAA;EACL,MAAA,yBAAU;GACV,UAAO;GACP,SAAU;GACV,YAAY;GACZ,KAAA;GACA,UAAA;GACF,OAAA;GAEA,UAAa;GACX,YAAO;GACP,YAAQ;GACR,cAAM;EACN;EACA,MAAA,sBAAY;GACd,OAAA;GAEA,QAAa;GACX,MAAA;GACA,cAAO;GACP,YAAY;EACZ;EACF,MAAA,sBAAA;GAEA,UAAa;GACX,OAAM;GACN,YAAS;GACT,cAAY;EACZ;EACA,MAAA,cAAW;GACX,MAAA;GACA,SAAQ;GACR,YAAc;GACd,KAAA;GACA,WAAM;GACN,SAAU;GACV,QAAA;GACA,cAAY;GACZ,YAAQ;GACV,MAAA;GAEA,UAAa;GACX,YAAY;GACZ,YAAO;GACT,QAAA;EAEA;EACE,MAAO,mBAAA;GACP,YAAW;GACX,OAAM;EACN;EACA,MAAA,oBAAY;GACZ,OAAA;GACA,WAAS;GACT,MAAQ;GACR,SAAA;GACA,YAAS;GACT,gBAAY;GACZ,SAAO;GACP,QAAM;GACN,cAAY;GACZ,SAAQ;GACV,YAAA;GAEA,OAAa;GACX,MAAA;GACA,YAAY;GACZ,QAAO;EACT;EAEA,MAAa,0BAAyC;GACpD,aAAM;GACN,YAAS;GACT,OAAA;EACA;EACA,MAAA,0BAAW;GACX,MAAA;GACA,SAAQ;GACR,YAAc;GACd,KAAA;GACA,WAAO;GACP,SAAM;GACN,QAAU;GACV,cAAY;GACZ,YAAY;GACZ,OAAA;GACA,MAAQ;GACV,UAAA;GAEA,YAAa;GACX,YAAU;GACV,YAAS;GACT,QAAU;EACZ;EAEA,MAAa,wBAAyC;GACpD,UAAS;GACT,SAAA;GACA,UAAU;EACV;EACA,MAAA,0BAAQ;GACR,SAAA;GACA,YAAM;GACN,UAAO;GACP,SAAQ;GACV,QAAA;GAEA,YAAa;GACX,MAAA;GACA,OAAQ;GACR,QAAQ;EACR;EACA,MAAO,uBAAA;GACP,UAAW;GACX,QAAS;GACT,QAAA;GACA,OAAA;GACA,OAAK;GACL,WAAS;GACT,SAAQ;GACR,eAAc;GACd,YAAY;GACZ,KAAA;GACA,SAAW;GACX,QAAQ;GACV,cAAA;GAEA,YAAa;GACX,WAAO;GACP,WAAU;GACV,QAAA;EACF;EAEA,MAAa,wBAAsC;GACjD,OAAO;GACP,UAAU;GACZ,YAAA;EAEA;EACE,MAAO,uBAAA;GACP,OAAA;GACF,UAAA;EAEA;EACE,MAAA,wBAAS;GACT,OAAA;GACA,UAAK;EACL;EACF,MAAA,uBAAA;GAEA,SAAa;GACX,eAAO;GACP,KAAA;GACA,UAAY;EACZ;EACA,MAAA,uBAAc;GACd,OAAA;GACF,UAAA;GAEA,YAAa;GACX,UAAO;GACP,cAAU;GACV,YAAU;EACV;EACA,MAAA,uBAAY;GACd,OAAA;GAEA,UAAa;GACX,UAAW;GACX,cAAW;GACX,YAAS;EACT;EACA,MAAA,sBAAc;GACd,WAAY;GACZ,WAAO;GACP,SAAM;GACN,QAAU;GACV,cAAY;GACZ,YAAQ;GACV,OAAA;GAEA,MAAa;GACX,UAAW;GACX,YAAS;GACT,QAAA;EACA;EACA,MAAA,uBAAS;GACT,WAAQ;GACR,SAAA;GACA,YAAY;GACZ,KAAM;GACN,SAAU;GACV,QAAA;GACA,cAAY;GACZ,YAAQ;GACV,MAAA;GAEA,UAAa;GACX,YAAO;GACP,YAAY;GACd,QAAA;EAEA;EACE,MAAO,sBAAA;GACP,OAAA;GACA,YAAY;EACd;EAEA,MAAa,oBAAoC;GAC/C,OAAS;GACT,gBAAe;GACf,YAAK;EACL;EACA,MAAA,qBAAS;GACT,SAAA;GACA,eAAY;GACZ,KAAA;GACA,QAAA;GACF,SAAA;GAEA,cAAa;GACX,YAAW;GACX,UAAW;GACX,WAAS;EACT;EACA,MAAA,2BAAc;GACd,WAAY;GACZ,WAAO;GACP,SAAM;GACN,QAAU;GACV,cAAY;GACZ,YAAQ;GACV,OAAA;GAEA,MAAa;GACX,UAAM;GACN,YAAS;GACT,QAAA;EACA;EACA,MAAA,yBAAW;GACX,MAAA;GACA,SAAQ;GACR,YAAc;GACd,KAAA;GACA,WAAO;GACP,SAAM;GACN,QAAU;GACV,cAAY;GACZ,YAAY;GACZ,OAAQ;GACV,MAAA;GAEA,UAAa;GAIb,YAAa;GAIb,YAAa;GACb,QAAa;EACb;EAEA,MAAa,UAAA,EAAA,OAAiB,yCAAA;EAC3B,MAAA,aAAA,EAAA,OAAuB,uCAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiC1B,yBAA+C;;;;;EAK7C,MAAA,mBAAQ;GACR,WAAS;GACT,OAAQ;GACR,UAAA;GACA,MAAA;GACA,QAAA;GACA,SAAU;GACV,QAAA;GACA,cAAY;GACd,YAAA;GAEA,YAAa;GACX,UAAQ;GACR,YAAO;GACP,YAAc;EAChB;EAEA,MAAa,sBAAqC;GAChD,QAAS;GACT,OAAA;GACA,cAAgB;EAChB;EACA,MAAA,sBAAc;GACd,SAAO;GACP,YAAU;GACZ,gBAAA;GAEA,KAAa;GACX,cAAO;GACP,OAAA;GACA,UAAW;EACX;EACA,MAAA,sBAAQ;GACR,OAAA;GACA,WAAY;GACZ,WAAO;GACP,SAAM;GACN,QAAQ;GACV,cAAA;GAEA,YAAa;GACX,OAAS;GACT,MAAA;GACA,QAAK;EACL;EACF,MAAA,qBAAA;GAEA,SAAa;GACX,gBAAW;GACX,KAAA;GACA,WAAQ;EACR;EACA,MAAA,0BAAY;GACZ,WAAO;GACP,SAAM;GACN,QAAU;GACV,cAAQ;GACV,YAAA;GAEA,OAAa;GACX,MAAQ;GACR,UAAY;GACZ,QAAO;EACP;EACF,MAAA,0BAAA;GAEA,QAAa;GACX,YAAQ;GACR,OAAO;GACP,YAAU;EACZ;EAEA,MAAa,mBAAA;GACX,QAAO;GACP,OAAA;GACA,UAAQ;EACR;EACF,MAAA,wBAAA;GAEA,OAAa;GACX,UAAO;GACP,QAAU;GACV,WAAW;EACX;EACA,MAAA,mBAAS;GACT,OAAA;GACA,UAAY;GACZ,WAAK;GACL,WAAS;GACT,SAAQ;GACR,UAAA;GACA,YAAY;GACZ,KAAA;GACA,SAAO;GACP,QAAU;GACV,cAAY;GACd,YAAA;GAEA,WAAa;GACX,OAAO;GACP,UAAQ;GACR,YAAS;EACT;EACA,MAAM,oBAAA;GACN,OAAO;GACT,QAAA;GAEA,SAAa;GACX,YAAY;GACZ,MAAA;GACA,OAAM;EACN;EACF,MAAA,yBAAA;GAEA,YAAa;GACX,WAAS;GACT,MAAA;GACA,SAAK;EACL;EACA,MAAA,oBAAS;GACT,SAAQ;GACR,YAAc;GACd,KAAA;GACA,UAAO;GACP,SAAU;GACV,QAAA;GACF,cAAA;GAEA,YAAaC;GACX,OAAA;GACA,UAAA;GACA,YAAY;EACd;EAEA,MAAa,2BAAyC;GACpD,UAAO;GACP,cAAQ;GACR,YAAM;EACN;EACA,MAAA,0BAAY;GACZ,OAAS;GACT,QAAQ;GACR,MAAA;GACA,SAAA;GACA,YAAO;GACP,SAAM;GACN,QAAU;GACV,cAAY;GACZ,YAAQ;GACV,OAAA;GAEA,MAAa;GACX,UAAS;GACT,YAAU;GACV,QAAS;EACT;EACA,MAAA,yBAAY;GACd,SAAA;GAEA,UAAa;GACX,SAAS;GACT,UAAA;GACA,YAAO;EACP;EACA,MAAA,yBAAc;GAChB,SAAA;GAEA,cAAa;GACX,OAAQ;GACR,UAAO;GACP,cAAY;EACZ;EACF,MAAA,yBAAA;GAEA,QAAa;GAIb,OAAa;GAIb,YAAa;GAIb,cAAa;EAIb;EACE,MAAA,YAAS,EAAA,OAAA,6BAAA;EACT,MAAA,iBAAe,EAAA,OAAA,sFAAA;EACf,MAAO,eAAA,EAAA,OAAA,kGAAA;EACP,MAAA,kBAAQ,EAAA,OAAA,gGAAA;EACR,MAAA,YAAU;GACV,SAAQ;GACR,eAAU;GACV,OAAQ;GACR,QAAA;GACA,UAAY;GACZ,QAAA;GACF,UAAA;GAEA,QAAa;GACX,cAAO;GACP,YAAQ;GACR,WAAQ;EACV;EAEA,MAAa,qBAA4B;GACvC,OAAA;GACA,QAAQ;GACR,QAAM;EACN;EACA,MAAA,aAAY;GACZ,WAAA;GACA,QAAK;GACL,MAAA;GACA,SAAA;GACF,YAAA;GAEA,gBAAa;GACX,KAAA;GACA,SAAS;GACT,cAAY;EACZ;EACA,MAAA,kBAAU;GACV,UAAO;GACP,SAAU;GACV,YAAY;GACZ,KAAA;GACF,UAAA;GAEA,OAAa;GACX,UAAU;GACV,YAAU;GACV,YAAc;EAChB;EAEA,MAAa,kBAAmC;GAC9C,UAAM;GACN,UAAS;GACT,cAAY;EACZ;EACF,MAAA,oBAAA;GAEA,MAAa;GACX,SAAS;GACT,YAAY;GACd,KAAA;EAEA;EACE,MAAA,kBAAW;GACX,SAAS;GACT,YAAQ;EACR;EACA,MAAA,mBAAY;GACZ,WAAO;GACP,SAAM;GACN,QAAU;GACV,cAAY;GACZ,YAAQ;GACV,OAAA;GAEA,MAAa;GACX,UAAS;GACT,YAAQ;GACV,QAAA;EAEA;EACE,MAAO,qBAAA;GACP,SAAW;GACX,QAAS;EACT;EACA,MAAA,uBAAS;GACT,OAAQ;GACR,WAAY;GACZ,SAAA;GACA,YAAY;GACZ,SAAO;GACP,QAAM;GACN,YAAQ;GACV,cAAA;GAEA,YAAa;GACX,OAAA;GACA,MAAO;GACP,QAAU;EACV;EACA,MAAA,mBAAc;GACd,UAAY;GACd,OAAA;GAEA,UAAa;GACX,YAAW;GACX,cAAS;GACT,YAAY;EACZ;EACA,MAAA,cAAS;GACT,WAAA;GACA,SAAO;GACP,YAAU;GACZ,KAAA;GAEA,SAAa;GACX,cAAM;GACN,OAAA;GACA,UAAU;EACV;EACF,MAAA,WAAA;GAEA,MAAa;GAIb,WAAa;GACX,UAAO;GACP,YAAW;EACX;EACA,MAAA,WAAY,EAAA,cAAA,0FAAA;EACZ,MAAK,iBAAA;GACL,OAAS;GACT,WAAQ;GACR,SAAA;GACA,YAAO;GACP,KAAM;GACN,SAAU;GACV,QAAA;GACA,YAAQ;GACV,OAAA;GAEA,MAAa;GACX,UAAU;GACV,WAAM;GACN,QAAU;EACV;EACA,MAAA,eAAY;GACd,UAAA;GAEA,MAAa;GACX,UAAM;GACN,cAAS;GACT,YAAK;EACL;EACA,MAAA,gBAAY;GACd,MAAA;GAEA,SAAa;GACX,KAAA;GACA,UAAS;GACT,YAAY;EACZ;EACA,MAAA,WAAU;GACV,UAAY;GACd,SAAA;GAEA,YAAa;GACX,YAAW;GACX,UAAS;GACT,YAAY;EACd;EAEA,MAAa,WAAA;GACX,WAAO;GACP,SAAM;GACN,YAAc;EACd;EACA,MAAA,iBAAW;GACX,OAAA;GACF,MAAA;GAEA,cAAa;GACX,OAAO;GACP,WAAM;GACN,YAAO;EACP;EACA,MAAA,iBAAY;GACd,OAAA;GAEA,MAAa;GACX,OAAA;GACA,WAAO;GACT,YAAA;EAEA;EACE,MAAA,cAAY;GACZ,YAAO;GACT,OAAA;EAEA;EACE,MAAA,iBAAY;GACZ,YAAO;GACP,OAAA;EACF;EAEA,MAAa,eAAA;GAIb,YAAa;GACX,OAAQ;GACR,WAAS;EACT;EACA,MAAA,kBAAY,EAAA,OAAA,mCAAA;EACZ,MAAO,aAAA;GACP,QAAU;GACV,SAAA;GACF,cAAA;GAEA,YAAa;GACX,OAAQ;GACR,UAAO;GACP,YAAU;EACZ;EAEA,MAAa,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CX,MAAA,gBAAU;GACV,SAAW;GACb,eAAA;GAEA,KAAa;GACX,OAAS;GACT,UAAA;GACA,WAAK;EACL;EACA,MAAO,gBAAA;GACP,SAAU;GACV,gBAAY;GACd,KAAA;GAEA,UAAa;GACX,OAAA;GACA,UAAU;GACV,YAAc;EACd;EACF,MAAA,oBAAA;GAEA,UAAa;GACX,UAAU;GACV,cAAW;GACX,YAAW;EACX;EACA,MAAA,iBAAQ;GACR,UAAA;GACF,WAAA;GAEA,WAAa;GACX,WAAS;GACT,QAAA;GACA,cAAK;EACL;EACA,MAAA,gBAAS;GACT,SAAA;GACA,gBAAO;GACP,KAAA;GACA,UAAY;GACd,SAAA;GAEA,cAAa;GACX,OAAA;GACA,UAAU;GACV,YAAc;EACd;EACF,MAAA,oBAAA;GAEA,UAAa;GAIb,UAAa;GACX,cAAS;GACT,YAAA;EACA;EACA,MAAO,qBAAA,EAAA,MAAA,OAAA;EACP,MAAA,iBAAU;GACV,SAAA;GACA,eAAY;GACd,KAAA;GAEA,OAAa;GACX,UAAG;GACH,YAAW;GACX,YAAS;EACT;EACA,MAAA,oBAAY;GACZ,GAAA;GACF,WAAA;GAEA,SAAa;GACX,UAAG;GACH,YAAW;GACX,QAAS;EACT;EACA,MAAA,qBAAY;GACd,GAAA;GAEA,WAAa;GACX,SAAS;GACT,UAAY;GACZ,YAAK;EACL;EACA,MAAA,oBAAU;GACV,SAAA;GACF,YAAA;GAEA,KAAa;GACX,OAAS;GACT,UAAA;GACA,YAAK;EACP;EAEA,MAAa,kBAAiC;GAC5C,SAAW;GACX,gBAAS;GACT,KAAA;EACA;EACF,MAAA,kBAAA;GAEA,WAAa;GACX,SAAQ;GACR,UAAO;GACP,YAAU;EACV;EACF,MAAA,kBAAA;GAEA,QAAa;GACX,OAAQ;GACR,UAAO;GACP,YAAU;EACV;EACF,MAAA,iBAAA;GAEA,QAAa;GACX,OAAQ;GACR,UAAO;GACP,YAAU;EACV;EACF,MAAA,mBAAA;;;;GCjqEA,YAAgB;EACd;;;;;;GCqBF,OAAM,OAAA,MAA0C;EAC9C;;;EAIA,MAAA,eAAQ;GACV,SAAA;GAEA,WAAgB;GACd,QAAM;GACN,SAAO;GACL,QAAS;EACT;EACF,SAAA,kBAAA,OAAA,qBAAA;GACF,MAAA,YAAA,MAAA,OAAA,eAAA;GAEA,OAAgB;IACd,SAAO,UAAW,QAAO,SAAY,KAAA,WAAS,SAAW;IAC3D,UAAA,UAAA,QAAA,SAAA,KAAA,WAAA,aAAA,CAAA,oBAAA,IAAA,KAAA,MAAA,CAAA;GAEA;EACE;EACF,SAAA,kBAAA,YAAA,QAAA;GAUA,OAAgB,WAAA,QAAmB,aAA+D,SAAA,WAAA,MAAA;EAChG;EACA,SAAM,aAAgB,OAAO,MAAA;GAC7B,OAAM,MAAS,QAAM,SAAO,KAAA,eAAa,QAAW,gBAAiB,IAAA,CAAA;EACrE;EACA,SAAO,mBAAA,OAAA;GACL,IAAA,MAAO,WAAc,GAAA,OAAA,KAAY;GACjC,MAAO,UAAM,MAAA,QAAA,SAAA,KAAA,WAAA,SAAA,CAAA,CAAA;GACb,MAAA,SAAA,MAAA,QAAA,SAAA,KAAA,WAAA,YAAA,KAAA,WAAA,aAAA,KAAA,WAAA,QAAA,CAAA,CAAA;GACA,MAAA,YAAA,MAAA,QAAA,SAAA,KAAA,WAAA,WAAA,CAAA,CAAA;GACA,OAAA;IACF,OAAA,UAAA,IAAA,YAAA,SAAA,IAAA,WAAA;IACF,OAAA,MAAA;IAEA;IACE;IACA;GACA;EACA;EACF,SAAA,YAAA,QAAA;GAEA,IAAA,WAAS,WAAmC,OAAA;GAC1C,IAAI,WAAW,aAAc,OAAS;GACtC,IAAM,WAAU,WAAW,OAAS;GACpC,OAAI;EACJ;EACA,SAAO,eAAkB,IAAA;GAC3B,IAAA,KAAA,KAAA,OAAA,OAAA,KAAA,IAAA,GAAA,KAAA,MAAA,EAAA,CAAA,CAAA,IAAA;GAEA,MAAS,UAAS,KAAsB,MAA4C,KAAA,GAAA;GAClF,IAAM,UAAmB,IAAA,OAAA,OAAA,OAAA,IAAA;GACzB,MAAI,UAAK,KAAA,MAAiB,UAAW,EAAM;GACtC,OAAI,OAAK,OAAA,IAAa,OAAA,OAAiB,UAAU,EAAA,IAAA;EACtD;EACA,SAAS,SAAO,MAAA,GAAA;GAChB,MAAI,QAAY,CAAA;GAChB,IAAI,KAAK,iBAAiB,KAAA,GAAW,MAAM,KAAO,KAAA,YAAiB;QAC5D,IAAA,KAAA,aAAA,KAAA,GAAA,MAAA,KAAA,KAAA,QAAA;GACT,IAAA,KAAA,OAAA,eAAA,KAAA,GAAA,MAAA,KAAA,eAAA,KAAA,MAAA,UAAA,CAAA;GAEA,IAAA,KAAS,OAAA,gBAAyB,KAA0E,GAAA,MAAA,KAAA,EAAA,UAAA,EAAA,OAAA,iBAAA,KAAA,MAAA,WAAA,EAAA,CAAA,CAAA;GAC1G,IAAA,KACE,OAAA,aAAC,KAAD,GAAA,MAAA,KAAA,EAAA,iBAAA,EAAA,OAAA,KAAA,MAAA,SAAA,CAAA,CAAA;GAAI,IAAA,KAAOC,iBAAAA,KAAAA,GAAAA,MAAAA,KAAAA,EAAAA,iBAAAA,EAAAA,MAAAA,KAAAA,aAAAA,CAAAA,CAAAA;GAAX,OAAA;EACQ;EAAiC,SAAA,aAAY,EAAA,UAAA,KAAA;GAAQ,OAAS,qBAAA,MAAY;IAAuB,OACvG;IAAK,UAAOE,CAAAA,oBAAAA,QAAAA;KAAZ,OAAA;KACE,eAAA;KAAG,UAAOC,SAAAA,YAAAA,OAAAA,MAAAA;IAA2B,CAAA,GAAS,qBAAA,OAAS;KAAiB,OAAA;KACvE,UAAS;MAAyCC,oBAAAA,KAAAA;OAA6B,OAAA;OAAoB,UAAA,SAAA,SAAA,SAAA;MACnG,CAAA;MACU,SAAOC,YAAAA,KAAAA,IAAAA,OAAAA,oBAAAA,KAAAA;OAAhB,OAAA;OACW,UAAOC,SAAAA;MAAmC,CAAA;MAAqB,SACxE,WAAA,KAAC,IAAA,OAAD,qBAAA,WAAA;OAAK,OAAOC;OAAoB,UAAA,CAAS,oBAAA,WAAA;QAClC,OAAA;;OAER,CAAA,GAAA,oBAAA,OAAA;QACH,OAAA;;OAER,CAAA,CAAA;MAEA,CAAA;KACE;IACA,CAAA,CAAA;GACA,CAAA;EACA;EACA,SAAM,SAAO,OAAS;GACtB,MACE,EAAA,MAAA,YAAC,MAAA;GAAQ,MAAO,CAAA,cAAA,mBAAA,SAAA,KAAA;GAAE,MAAGC,UAAAA,KAAAA,WAAAA;GAAiB,MAAI,SAAUC,KAAAA,WAAyB,YAAC,KAAA,WAAA;GAAG,MAAA,OAAA,SAAA,MAAA,CAAA;GAAjF,OAAA,qBAAA,WAAA;IACE,OAAA;KAAK,GAAA;KAAL,GAAA,UACE,kBAAC,CAAA;IAAK;IAA2D,UAAO;KAAKE,qBAAAA,OAAAA;MAAsB,OAAI;MAAwC,UAAI,CAASE,oBAAwB,QAAA;OAAG,WAAA,UAAA,2BAAA,KAAA;OAAG,OAAA;QACvL,GAAA;QAEH,GAAA,UAAA,kBAAA,CAAA;QAAK,GAAA,SAAOC,gBAAAA,CAAAA;OAAZ;OACK,eAAO;OAAE,UAAGC,YAAAA,KAAAA,MAAAA;MAAkB,CAAA,GAAe,qBAAO,OAAA;OAA+C,OAAA;OAAI,UAAA,CAAK,oBAAA,KAAA;QAAe,OAC9H;SAAG,GAAA;SAAH,GAAA,SACE,EAAA,OAAA,uCAAS,IAAa,CAAA;QACgB;QAAmB,UAAA,KAAA;OAAS,CAAA,GAAC,qBAAC,KAAA;QAEnE,OAAA;QACF,UAAA,CAAA,oBAAA,QAAA,EAAA,UAAA,EAAA,aAAA,KAAA,WAAA,cAAA,EAAA,CAAA,GAAA,KAAA,iBAAA,OAAA,qBAAA,YAAA,EAAA,UAAA,CAAA,oBAAA,QAAA;;SACC,UAAW;QAAc,CAAA,GAAOE,oBAAAA,QAAAA,EAAAA,UAAAA,EAAAA,iBAAAA,EAAAA,CAAAA,CAAAA,EAAAA,CAAAA,IAAAA,IAAAA;OAAkB,CAAA,CAAA;MAAoB,CAAA,CAAA;KAC3E,CAAA;KAAkD,KAAA,WAAOC,IAAAA,OAAAA,oBAAAA,KAAAA;MAAqB,OAAA;MAAgB,UAAA,KAAA,KAAA,KAAA;KAC9F,CAAA;KACM,KAAA,YAAOC,KAAAA,KAAAA,UAAAA,OAAAA,oBAAAA,KAAAA;MAAZ,OAAA;MACU,UAAK,KAAA;KAAS,CAAA;KAA8B,WAAA,WAAe,IAAA,OAAA,qBAAA,OAAA;MAAc,OAAA;MAC9E,UAAA,CAAiB,oBAAA,UAAA;OACZ,MACP;OAAmB,OAAOE;OAA0B,iBAAA;OACmC,eAAA,iBAAA,UAAA,CAAA,KAAA;OAAa,UAAA,eAAA,EAAA,mBAAA,IAAA,EAAA,mBAAA;MAAI,CAAA,GAApF,eAA6B,oBAAQ,MAAA;OACnD,OACJ;;QAEA;;OAEb,GAAA,GAAA,SAAA,KAAA,GAAA,SAAA,KAAA,GAAA,SAAA,SAAA,CAAA;MAEA,CAAA,IAAS,IAAA;KACP,CAAA;IACA;GAA4C,CAAA;EAAgC;EAAY,SAAG,aAAA,OAAA;GAC3F,MACE,EAAA,OAAA,OAAA,WAAA,UAAA,WAAA;GAAK,MAAOE,UAAAA,qBAAAA,YAAAA,EAAAA,UAAAA,CAAAA,oBAAAA,QAAAA,EAAAA,UAAAA,MAAAA,CAAAA,GAAAA,oBAAAA,QAAAA;IAAZ,OAAA;IACiC,UAAOC;GAAyB,CAAA,CAAA,EAAA,CAAA;GAAa,OAC1E,qBAAC,OAAD;IAAQ,OAAK;IAAS,UAAOC,CAAAA,aAAAA,KAAAA,IAAAA,oBAAAA,OAAAA;KAAyB,OAAA;KAA2B,UAAS;IAA1F,CAAA,IACE,qBAAA,UAAC;KAAK,MAAO;KAAE,OAAGC;KAAgB,iBAAkB,CAAA;KAAgC,SAAA;KAAG,UAAA,CAAA,oBAAA,QAAA;MAAO,OAAE;OAGnG,GAAA;OAAsC,GAAK,cAAA,OAAA,CAAA,IAAA;MAAS;MAA8B,UAAS;KAAiB,CAAA,GAAA,OAAA;IAC1G,CAAA,GAAA,WAAA,KAAA,IAAA,OAAA,oBAAA,UAAA;;KAET,OAAA;KAEA,SAAgB,OAAA;KACd,UAAM,OAAa;IACnB,CAAA,CAAA;GAIA,CAAA;EACE;EACF,SAAG,iBAAA,EAAA,qBAAA,GAAA,cAAA,QAAA;GAAC,MAAA,aAAA,qBAAA,UAAA,KAAA;GAAc,MAAA,QAAW,cAAA,aAAA,WAAA,OAAA,SAAA,CAAA,GAAA,IAAA,GAAA,CAAA,WAAA,OAAA,IAAA,CAAA;GAAO,gBAAM;IAAO,IAAA,CAAA,WAAA,SAAA,MAAA,WAAA,GAAA,aAAA;GACjD,GAAA;IACA;IACA,WAAM;IACN,MAAM;GACN,CAAA;GAIA,MAAK,CAAA,mBAAkB,wBAAO,SAAA,KAAA;GAC9B,MACE,CAAA,qBAAC,0BAAD,+BAAA,IAAA,IAAA,CAAA;GAAK,MAAOE,SAAAA,cAAAA,kBAAAA,OAAAA,mBAAAA,GAAAA,CAAAA,OAAAA,mBAAAA,CAAAA;GAAZ,MAAA,iBAAA,cAAA,IAAA,IAAA,MAAA,KAAA,SAAA,CAAA,KAAA,QAAA,kBAAA,WAAA,YAAA,KAAA,MAAA,CAAA,CAAA,CAAA,GAAA,CAAA,WAAA,YAAA,KAAA,CAAA;GACE,MAAA,sBAAC,wBAAD,6BAAA,IAAA,IAAA,CAAA,GAAA,UAAA,GAAA,MAAA,QAAA,SAAA,KAAA,WAAA,SAAA,CAAA,CAAA,KAAA,SAAA,KAAA,MAAA,CAAA,CAAA,CAAA;GAAO,IAAA,CAAA,WAAA,OAAA,OAAA;GAAmCC,OAAAA,qBAAAA,OAAAA;IAAiC,OAAA;IAC3E,UAAA;KAAYC,oBAAAA,SAAAA;MAAZ,qCACE;MACQ,UAAOC;KAAsB,CAAA;KACnC,qBAAA,OAAC;MAAK,OAAOC;MAAuB,UAAA,CAAE,qBAAqB,OAAM,EAAA,UAAA,CAAA,oBAAA,QAAA;OAC9D,OACL;OAAQ,UAAK,EAAA,gBAAA;MAAS,CAAA,GAAWC,oBAAAA,QAAAA;OAA6B,OAAA;OAA6B,UAAS,EAAA,mBAAA,EAAA,KAAA,CAAA;MAAc,CAAA,CAAA,EAAA,CAAA,GAAA,oBAAA,UAAC;OAChH,MAAA;;OACL,cAAA,EAAA,YAAA;OAAK,SAAOC;OAAZ,UACE,oBAAC,oBAAD,CAAA,CAAA;MAAS,CAAA,CAAA;KAAT,CAAA;KACyB,qBAAA,OAAc;MAAG,OAAO;MAAwB,UAC/D,CAAQ,qBAAW,WAAI;OAAG,cAAOC,EAAAA,cAAAA;OAAyB,UAAA,CAAE,oBAAkB,cAAA;QAAK,OACzF,EAAA,cAAC;QAAI,OAAOC,OAAAA,QAAAA;OAAsB,CAAA,GAAA,OAAA,QAAO,WAAY,IAAQ,oBAAA,KAAC;QAAiC,OAAA;QAAM,UAAA,EAAY,kBAAmB;OAAuB,CAAA,IAAA,oBAAA,OAAA;QAAI,OAA9E;QAE5E,UAAA,OAAA,QAAA,KAAA,SAAA,oBAAA,UAAA;SACT;SAAS,YAAc,eAAc,IAAA,KAAA,MAAA,KAAA,CAAA;SAAG;QAAxC,GAAA,KACE,MAAA,CAAA;OACE,CAAA,CAAA;MACA,CAAA,GAAc,qBAAS,WAAA;OACvB,cAAW,EAAA,cAAA;OACX,OAAA;OACA,UAAY,CAAS,oBAAW,cAAW;QAAU,OAAO,EAAE,cAAY;QAAG,OAAA,OAAS,SAAA;QAAgB,WAAA;QACvG,gBACA,sBAAqC,UAAA,CAAW,KAAI;QAC9C,GAAA,OAAOA,SAAAA,WAAAA,IAAAA,CAAAA,IAAAA,EAAAA,QAAAA;SAAsB,OAAA,EAAA,YAAO;SAAuD,SAAA;QAAM,EAAA;OAAsD,CAAA,GAAA,qBAAA,OAAA,SAAA,WAAA,IAAA,OAAA,oBAAA,OAAA;QAAI,OAA9E;QAE7E,UAAA,OAAA,SAAA,KAAA,SAAA,oBAAA,UAAA;SACN;;SACF;;OAET,CAAA,CAAA;;;;GC5MA,CAAA;EAiBA;;;EACmF,MAAA,kBAAA;EACjF,SAAI,UAAW,QAAa;GAAS,IAAA,WAAO,UAAA,OAAA;IAAK,OAAOG;IAA2B,OAAA;GACnF;GAAS,IAAA,WAAO,aAAA,OAAA;IAAK,OAAOC;IAA8B,OAAA;GAC5D;GAEA,OAAgB;IACd,OAAO;IACP,OAAM;GACN;EACA;EACA,SAAM,mBAAmB,EAAA,MAAA,OAAA,GAAA,aAAA;GACvB,MAAI,CAAA,SAAW,cAAY,SAAW,KAAA;GACtC,MAAA,aAAW,OAAU;GACrB,MAAA,YAAe,cAAA,aAAA,OAAA,IAAA,GAAA,CAAA,OAAA,IAAA,CAAA;GACjB,MAAA,UAAA,cAAA,mBAAA,SAAA,GAAA,CAAA,SAAA,CAAA;GACA,MAAM,aAAA;IACJ,IAAI,WAAW,YAAY,KAAA,GAAW,aAAa,WAAW,OAAO;IACrE,WAAW,UAAU,KAAA;IACnB,WAAW,IAAA;GACX;GACF,MAAM,sBAAA;IACR,IAAA,WAAA,YAAA,KAAA,GAAA,aAAA,WAAA,OAAA;IACA,WAAA,UAAsB,iBAAA;KACpB,WAAI,UAAW,KAAY;KACzB,WAAC,KAAA;IACL,GAAI,GAAA;GACJ;GAG6B,sBAAgB;IAAQ,IAAA,WAAW,YAAQ,KAAA,GAAA,aAAA,WAAA,OAAA;GAAW,GAC7E,CAAA,CAAE;GACR,IAAM,YAAA,KAAa,GAAA,OAAQ;GAC3B,MAAM,QAAA,QAAW,UAAQ,YACrBE,EAAAA,oBACA,EAAA,OAAQ,QAAU,QAAA,CAAA,IAAA,QAAcC,UAAAA,WAA4B,EAAA,mBAAA;IAChE,QACE,QAAA;IAAK,WAAA,QAAA;GAAiC,CAAA,IAAA,EAAOC,sBAAAA,EAAAA,OAAAA,QAAAA,UAAAA,CAAAA;GAC3C,MAAA,aAAA,QAAA,UAAC,cAAD,iBAAA,CAAA;GACE,MAAA,WAAOC,QAAAA,UAAAA,WAAAA,qBAAAA,QAAAA,UAAAA,cAAAA,oBAAAA,CAAAA;GACP,OAAc,oBAAA,OAAA;IACd,6BAAc;IACd,OAAA;IACA,UAAiB,qBAAA,QAAA;KACf,OAAK;KACP,cAAA;KAPF,cASG;KACO,SAAK;KAAU,SAAOC,UAAAA;MAAuB,IAAA,CAAA,MAAA,cAAc,SAAA,MAAA,aAAA,GAAA,cAAA;KAAM;KAAvE,UAAA,CAAA,UAAA,qBAAA,QAAA;MACE,MAAA;MAAM,OAAOC;MAA0B,cAAA;MAAY,cAAA;MAClD,UAAU;OACM,oBAAA,QAAU;QACzB,OACE;QAAwB,UAAOC;OAA/B,CAAA;OACE,UAAA,MAAA,GAAA,eAAA,CAAA,CAAA,KAAA,SAAA;QAAM,MAAA,EAAA,OAAW,UAAK,UAAW,KAAY,MAAA;QAAsC,OAAO,qBAAA,QAAA;SAAE,OAAGC;SAAwB,UAAG;UAAM,oBAAA,QAAA;WAAG,WAAA,KAAY,WAAA,YAAA,2BAAA,KAAA;WAAQ,OAAA;YAAY,GAAA;YACnK,GAAA;WAAM;WAA8B,eAAY;WAAc,UAAA;UAAuB,CAAA;UAC/E,oBAAiB,QAAA;WAAyB,OAAOE;WAAwB,OAAA,KAAA;WAAwB,UAAA,KAAA;UACnG,CAAA;UAJK,KAAK,iBAIV,KAAA,IAAA,OAAA,oBAAA,QAAA;WAET,OAAA;WACA,UAAU,KAAS;UAAwB,CAAA;SAAN;QAAmF,GAAA,KAAA,MAAA;OACzH,CAAA;OAAM,UAAOE,SAAAA,kBAAAA,qBAAAA,QAAAA;QAAwB,OAAA;QAAqB,UAAA,CAAA,KAAA,UAAA,SAAA,eAAA;OACtD,CAAA,IAAA;OAER,oBAAA,QAAC;QACC,OAAK;QACL,UAAU,EAAA,WAAA;OACV,CAAA;MAAS;KAA0B,CAAA,IAAG,MAAA,qBAAA,UAAA;MAAY,MAAI;MAAyC,WAAA;MAC/F,OAAA;OACA,GAAA;OALF,GAAA;OAQI,GAAA,UAAW,oBAAkB,CAAA;MAC7B;MAAS,cAAGG,GAAAA,MAAAA,KAAAA,EAAAA,WAAAA;MAAsB,eAAG,UAAA,IAAA;MAAS,UAAA,CAAA,oBAAA,QAAA;OAC9C,WAAA,QAAY,UAAA,YAAA,2BAAA,KAAA;OACb,OACD;QAAM,GAAA;QAAgC,GAAA;OAChC;OACJ,eAAA;;OACH,OAAA;OAET,UAAA;MAEA,CAAA,CAAA;KACE,CAAA,CAAM;IACN,CAAA;GAA2B,CAAA;EAA2B;EAAU,SAAA,mBAAA,EAAA,SAAA,qBAAA,GAAA,aAAA;GAAc,MAAA,QAAA,qBAAA,UAAA,MAAA,OAAA,SAAA,CAAA,CAAA;GAAY,OAAA,oBAAA,oBAAA;IAC5F,MAAA,QAAA;;;;GCvGA,CAAA;;;;EAK6B,MAAM,gBAAU,CAAA;;EAAuB,SAAA,sBAAA,EAAA,MAAA,qBAAA,GAAA,aAAA;GAAc,MAAA,QAAA,qBAAA,UAAA,MAAA,OAAA,SAAA,aAAA;GAAY,OAAA,oBAAA,oBAAA;IAC9F,MAAA,KAAA,KAAA;;;;GCOA,CAAA;EACE;;;EAIA,MAAA,0BAAa;GACf,eAAA;GAEA,UAAM;;GAEN,UAAM,CAAA;;;EAGN,MAAM,iBAAmB;;;;;EAKzB,MAAM,mBAAe;;;EAGrB,MAAM,qBAAsB;EAC5B,MAAM,iBAAA;EACN,MAAM,eAAA;EAEN,MAAA,4BAAqE;EACnE,MAAO,iBAAU;EAGnB,MAAA,sBAAA;EAEA,MAAA,2BAA6D;EAC3D,MAAO,uBAAiB;EAC1B,SAAA,SAAA,OAAA;GAEA,OAAS,UAAA,QAAA,OAAsB,UAAyB,YAAA,CAAA,MAAA,QAAA,KAAA,IAAA,QAAA,KAAA;EACtD;EACF,SAAA,mBAAA,OAAA;GAEA,OAAS,OAAA,UAAA,YAA8D,OAAA,cAAA,KAAA,KAAA,SAAA;EACrE;EACA,SAAI,sBACE,OAAA;GAAC,OAAA,UAAA,KAAA,KAAA,OAAA,UAAA,YAAA,MAAA,UAAA;EAAS;EAAkB,SAAA,mBAAA,OAAA;GAAe,MAAA,aAAgB,SAAW,KAAM;GAYlF,IAAI,eAAW,KAAS,KAAA,CAAW;IACjC;IACA;IAMF;GACA,CAAA,CAAI,SAAA,OAAW,WAAgB,MAAA,CAAA,KAAW,OAAO,WAAA,QAAA,YAAA,WAAA,IAAA,SAAA,6BAAA,CAAA,sBAAA,WAAA,IAAA,KAAA,CAAA,sBAAA,WAAA,MAAA,KAAA,CAAA,sBAAA,WAAA,MAAA,KAAA,WAAA,aAAA,KAAA,KAAA,OAAA,WAAA,aAAA,aAAA,WAAA,aAAA,KAAA,KAAA,OAAA,WAAA,aAAA,aAAA,WAAA,UAAA,KAAA,KAAA,OAAA,WAAA,UAAA,aAAA,WAAA,aAAA,KAAA,KAAA,OAAA,WAAA,aAAA,aAAA,WAAA,UAAA,KAAA,KAAA,CAAA,mBAAA,WAAA,KAAA,KAAA,WAAA,WAAA,KAAA,KAAA,CAAA,mBAAA,WAAA,MAAA,GAAA,OAAA;GACjD,IAAM,WAAA,SAAcG,KAAO,GAAA;IAC3B,MAAI,OAAA,SAAgB,WACd,IAAO;IAMN,IAAA,SAAA,KAAA,KAAA,CAAA,mBAAA,KAAA,SAAA,KAAA,CAAA,mBAAA,KAAA,SAAA,KAAA,CAAA,mBAAA,KAAA,KAAA,KAAA,OAAA,KAAA,cAAA,aAAA,KAAA,UAAA,KAAA,MAAA,OAAA,KAAA,UAAA,YAAA,KAAA,MAAA,SAAA,iBAAA,OAAA;GAAQ;GAAU,IAAA,WAAA,gBAAA,KAAA,GAAA,OAAA;GAAU,MAAA,cAAgB,SAAY,WAC1D,WAAO;GACL,IAAA,gBAAA,KAAA,KAAA,CAAA,OAAA,cAAA,YAAA,MAAA,KAAA,OAAA,YAAA,MAAA,KAAA,KAAA,OAAA,YAAA,UAAA,YAAA,YAAA,MAAA,SAAA,6BAAA,OAAA,YAAA,QAAA,YAAA,YAAA,IAAA,SAAA,6BAAA,CAAA;IAAY;IAAqB;IAAmB;GAAQ,CAAA,CAAA,SAAS,OAAO,YAAY,KAAO,CAAA,KAChG,OAAA,YAAA,UAAA,aAAA,CAAA;IAAC;IAAW;IAAW;IAAW;GAAQ,CAAA,CAAA,SAAS,OAAO,YAAY,MAAO,CAAA,KAC7E,CAAA;IAKN;IACE;IACA;IACF;GACE,CAAA,CAAA,SAAO,OAAA,YAAA,MAAA,CAAA,KAAA,CAAA,sBAAA,YAAA,UAAA,KAAA,CAAA,sBAAA,YAAA,MAAA,KAAA,CAAA,sBAAA,YAAA,UAAA,KAAA,YAAA,cAAA,KAAA,MAAA,OAAA,YAAA,cAAA,YAAA,CAAA,OAAA,SAAA,KAAA,MAAA,YAAA,SAAA,CAAA,MAAA,YAAA,aAAA,KAAA,MAAA,OAAA,YAAA,aAAA,YAAA,CAAA,OAAA,SAAA,KAAA,MAAA,YAAA,QAAA,CAAA,IAAA,OAAA;GACT,IAAA;IACF,MAAA,MAAA,IAAA,IAAA,YAAA,GAAA;;GAGA,QAAgB;IACd,OAAM;GACN;EAUA;;EAEE,SAAI,4BACQ,OAAQ;GAKtB,MAAA,QAAA,SAAA,KAAA;GACA,IAAK,UAAM,KAAQ,KAAM,MAAA,kBAAY,KAAA,CAAA,mBAAA,MAAA,QAAA,KAAA,OAAA,MAAA,UAAA,aAAA,CAAA,MAAA,QAAA,MAAA,QAAA,KAAA,MAAA,SAAA,SAAA,gBAAA,CAAA,MAAA,QAAA,MAAA,UAAA,KAAA,MAAA,WAAA,SAAA,gBAAA,MAAA,IAAA,MAAA,mCAAA;GACnC,KAAM,MAAA,QAAWA,MAAO,UAAI;IAC5B,MAAI,UAAa,SACZ,IAAC;IAIR,IAAA,YAAA,KAAA,KAAA,OAAA,QAAA,eAAA,YAAA,OAAA,QAAA,eAAA,YAAA,OAAA,QAAA,gBAAA,YAAA,QAAA,SAAA,KAAA,KAAA,OAAA,QAAA,SAAA,YAAA,OAAA,QAAA,aAAA,WAAA,MAAA,IAAA,MAAA,mCAAA;GACA;GAGA,KAAM,MAAA,QAAc,MAAA,YAAsB;IAC1C,MAAI,WAAU,SAAc,IAAM;IAClC,IAAI,aAAM,KAAe,KAAA,CAAA,mBAAc,SAAmB,IAAM,KAAA,CAAA,mBACpD,SAAM,IAAA,KAAA,CAAA,mBAAA,SAAsC,OAAA,KAAA,OAAA,SAAA,SAAA,UAAA,MAAA,IAAA,MAAA,iCAAA;GAExD;GACE,IAAK,MAAM,iBAAc,KAAA,KAAA,SAAmB,MAAM,YAAe,MAAA,KAAS,GAAA,MAAA,IAAA,MACxE,mCAAgB;GAElB,MAAK,QAAM,MAAQ,UAAM,KAAA,IAAA,KAAgB,IAAA,SAAA,MAAA,KAAA;GACvC,IAAA,UAAM,KAAUA,KAAAA,CAAO,MAAI,QAAA,MAAA,KAAA,GAAA,MAAA,IAAA,MAAA,iCAAA;GAC3B,IAAI,MAAA,eAAY,KACX,KAAO,CAAA,mBAAe,MAAY,UAAW,GAAA,MAAA,IAAW,MAAK,sCACtD;GAMd,IAAA,MAAA,mBAAA,KAAA,GAAA;IACF,IAAA,CAAA,MAAA,QAAA,MAAA,cAAA,KAAA,MAAA,eAAA,SAAA,qBAAA,MAAA,IAAA,MAAA,0CAAA;IACA,KAAO,MAAA,QAAA,MAAA,gBAAA;KACT,MAAA,UAAA,SAAA,IAAA;;IAGA;GACE;GAA8B,OAAA;EAAkB;;EAA2B,SAAA,yBAAW,UAAA;GAAG,4BAAa;IAAG,eAAG;IAAU,UAAA;IACxH,OAAA;IAEA,UAAgB,CAAA;IACd,YAAe,CAAA;IACjB,GAAA;GAEA,CAAA;;;GAIA,OAAgB,GAAA,KAAA,GAAA;EAKd;EACA,MAAI,mBAAsB,CAAA;;;EAG5B,SAAA,qBAAA,OAAA,MAAA,MAAA;GAMA,MAAS,SAAQ,MAAyB,QAAA,IAAA,UAAA,MAAA,IAAA,CAAA;GACxC,IAAA,WAAyD,KAAA,GAAS,OAAA;GACpE,MAAA,WAAA,MAAA,WAAA,QAAA,aAAA,SAAA,SAAA,QAAA,SAAA,SAAA,IAAA;GAEA,OAAS,SAAiC,WAAA,IAAA,mBAAA;EACxC;EAEG,SADa,QAAW,OACU;GACpC,OAAA,OAAA,SAAA;EACH;;;IAIA,WAAgB,SAAA,EAAA,CAAA,CAAA,QAAA;GAKd,CAAA;EACA;;;EAGA,SAAI,6BAAA,WAAA,kBAAA,OAAA,eAAA,gBAAA;GACJ,IAAI,WAAA;GACJ,IAAI,WAAA;GACJ,IAAI,QAAA;GACJ,IAAM,WAAA,CAAA;GACN,IAAM;;GAEN,IAAM;GACN,IAAI;GACJ,MAAI,yBAAU,IAAA,IAAA;GACd,MAAI,YAAA,CAAA;;GAEJ,MAAI,yBAAqB,IAAA,IAAA;GACzB,IAAM,WAAA;GAEN,IAAM,UAAA;GACJ,IAAA;GACA,IAAA;GACA,IAAI,qBAAwB;GAC5B,MAAM,4BAAkC,IAAA,IAAA;GACxC,MAAO,cAAS,MAAO,SAAA;IACvB,MAAM,MAAK,UAAU,MAAA,IAAU;IAC/B,MAAA,WAAiB,OAAO,IAAK,GAAA;IAA4B,IAAA,aAAA,KAAA,GAAA,OAAA;IAAM,MAAA,UAAA,CAAA;IAAM,OAAA,IAAA,KAAA,OAAA;IAAK,MAAA,KAAA,UAAA,WAAA,UAAA,MAAA,OAAA,QAAA,MAAA,SAAA,QAAA,MAAA,OAAA,IAAA;IAC1E,UAAO,OAAA,OAAA,KAAA,UAAA,SAAA,IAAA,GAAA;KACT;KAEA;KACE;IAEA,CAAA;IACA,OAAM;GACN;GACE,MAAM,kBAAU,aAAkB;IAClC,MAAK,MAAO,UAAO,SAAU,MAAS,SAAO,IAAA;IAC/C,MACE,OAAK,WAAS,SAAA,MAAA,SAAA,IAAA,CAAA,CAAA,MAAA;IAEhB,MAAO,QAAS,KAAI,WAAA,SAAA,KAAA,YAAA,SAAA,OAAA;IACtB,IAAA,UAAA,IAAA;KAEA,MAAM,KAAS,KAAA,WAAqD,SAAA,KAAA,UAAA,SAAA,OAAA;KAClE,KAAO,OAAM,OAAA,KAAA,KAAA,SAAA,IAAA,GAAA,QAAA;IACb,OAAA,KAAU,SAAS;IACnB,OAAO,IAAM,KAAA,IAAA;GAEb;GACF,MAAA,SAAA,eAAA;;;;IAKA,KAAM,MAAA,YAAA,YAAgC,WAAA,SAAA,MAAA,SAAA,IAAA,CAAA,CAAA,KAAA,QAAA;GACpC;;;;GAII,MAAA,uBAAiB;IACjB,IAAA,YAAA;IACF,KAAA,MAAA,CAAA,KAAA,UAAA,QAAA;KACA,MAAM,QAAO,MAAS,KAAG,MAAK,UAAM;KACpC,IAAM,MAAA,SAAa,OAAI;MACvB,OAAA,OAAe,GAAA;MAAE;KAAe;KAAqD,MAAA,OAAA,KAAA,IAAA,GAAA,KAAA,MAAA,QAAA,MAAA,SAAA,WAAA,gBAAA,CAAA;KACrF,MAAI,QAAM,KAAS,IAAA,OAAO,MAAO,QAAU,IAAA;KACtC,eAAY;MACnB,GAAA,MAAA;MACA,OAAO,MAAA,KAAA,QAAA,GAAA,CAAA,MAAA,GAAA,MAAA,KAAA;KACT,CAAA;KAEA,IAAM,MAAA,SAAsB,OAAA,OAAA,OAAA,GAAA;UAClB,YAAA;IACR;IACA,OAAM;GACN;GACA,MAAK,gBAAe;IAClB,QAAM,KAAQ;IACd,IAAI,UAAU;IAChB,MAAA,YAAA,eAAA;IACA,MAAA,aAAW,CAAA;IACT,KAAA,MAAA,SAAe,WAAA;KACf,MAAA,QAAA,OAAA,IAAA,MAAA,GAAA;KACA,IAAA,UAAA,KAAA,GAAA,KAAA,MAAA,QAAA,OAAA,WAAA,KAAA,IAAA;IACA;IACA,WAAA;KACA,eAAI;KACJ;KACA;KACA;KACA;KACF,GAAA,iBAAA,KAAA,IAAA,CAAA,IAAA,EAAA,aAAA;KACA,GAAK,UAAM,KAAA,IAAa,CAAA,IAAG,EAAA,MAAS;KACpC,GAAI,eAAW,KAAA,IAAA,CAAgB,IAAA,EAAA,WAAA;KACjC,GAAA,mBAAA,KAAA,IAAA,CAAA,IAAA,EAAA,eAAA;KAEA,QAAM,IAAA,IAAA,MAA0B;IAC9B;IACA,KAAI,MAAA,YACD,CAAA,GAAA,SAAmE,GAAA,SAAA;IAEpE,IAAA,WAAA,gBAAmD;GAErD;GACF,MAAA,oBAAA;IAEA,IAAM,UAAA,KAAA,GAAA;IACJ,IAAI,oBAAsB,WAAa,uBAAsB,KAAA;SACvD,aAAO,KAA4E;IACzF,QAAI,KAAO;GACT;GACA,MAAA,wBAAmB;IACrB,IAAA,YAAO,UAAA,KAAA,KAAA,UAAA,SAAA,GAAA;IACL,MAAA,MAAA,WAAqB;IACrB,IAAA,OAAQ,QAAW,YAAS;KAC9B,qBAAA;KACF,QAAA,IAAA,OAAA;IAEA,OAAM;KACJ,qBAAoB;KACpB,QAAK,WAAA,SAAuB,QAAM;IAClC;GACA;GACA,MAAI,aAAW,UAAa;IAC5B,MAAM,EAAA,MAAA,MAAe,SAAQ,QAAQ,SAAA;IAErC,IAAM,CAAA,mBADe,IAAI,KAAA,CAAA,mBACD,IAAK,KAAA,CAAA,mBAAyB,OAAO,GAAA,OAAA;IAC7D,IAAM,WAAU,KAAA,MAAW,OAAA,WAAS,YAAA,OAAA,SAAA,uBAAA,OAAA;IACpC,IAAI,SAAA,KAAa,MAAA,OAAa,SAAY,YAAa,KAAO,SAAS,uBAE9D,OAAA;IAIT,IAAM,WAAW,KAAA,KAAS,SAAK,KAAQ,GAAA,OAAU;IACjD,MAAM,YAAY,GAAA,KAAO,GAAA,KAAS,GAAA;IAElC,MAAM,WAAO,OAAA,IAAA,UAAA,MAAA,IAAA,CAAA,CAAA,EAAA,MAAA,SAAA,KAAA,YAAA,OAAA;IAAE,MADE,UAAS,OAAQ,IAAA,SAAY;IAAE,IAAA,aAAA,KAAA,KAAA,YAAA,KAAA,KAAA,OAAA,SAAA,UAAA,OAAA;IAAM,MAAA,WAAA,SAAA,KAAA,QAAA,UAAA,QAAA;IAAM,MAAA,YAAA,OAAA,SAAA,WAAA,OAAA,GAAA,WAAA,SAAA,CAAA,MAAA,GAAA,oBAAA;IAAS,MAAM,OAAA;KAAiB,GAAA,SAAO,QAAA,YAAA;MAAmB;MAC1F;MAAe;MAC3C,MAAM;MACF,OAAA;KACF;KACA,MAAA;IACA;IACF,MAAA,QAAA,KAAA,IAAA,SAAA,SAAA,UAAA,MAAA,UAAA,GAAA,SAAA,MAAA;IACA,IAAA,SAAW,SAAW,QAAA,oBAAA;KAAE,OAAA,OAAA,SAAA;KAAM,eAAA,IAAA;KAAO,OAAA;IACrC;IAAiB,OAAG,IAAA,WAAA;KAAM;KAAgC;IAC1D,CAAA;IACF,eAAA;KAEA,GAAM;KACJ,MAAM,SAAU,MAAK,GAAK,KAAA;IAC1B,CAAA;IACA,OAAI;GACJ;GACE,MAAA,aAAmB,SAAO;IAC5B,MAAQ,UAAA,KAAA,KAAA;IACN,IAAA,QAAA,WAAA,GAAA;IACF,IAAA;IACA,IAAM;KACN,QAAI,KAAU,MAAA,OAAa;IAC3B,QAAI;KACF;IACE;IACE,MAAA,QAAa,SAAA,KAAA;IACb,IAAA,UAAW,KAAK,KAAA,OAAA,MAAA,SAAA,UAAA;IAChB,IAAA;KACA,QAAA,MAAW,MAAX;MACA,KAAA,YAAe;OACf,MAAQ,OAAK,4BAAA,KAAA;OACb,WAAa,KAAK;OAClB,QAAA,KAAA;OACA,WAAW,KAAA;OACX,eAAA,KAAA;OACF,QAAA,KAAA;OACA,aAAK,KAAA;OACH,iBAAe,KAAQ;OACvB,MAAA,KAAY,UAAA;OACZ;MACF;MACE,KAAA;OACA,IAAA,CAAA,UAAe,KAAM,GAAA;OACrB,YAAY;OACZ;MACF,KAAK;OACH,yBAA2B,EAAA,YAAc,CAAA,MAAM,QAAO,EAAA,CAAA;OACtD,eAAe,MAAM,QAAA;OACrB,YAAY;OACZ;MACF,KAAK;OACH,yBAA2B,EAAA,cAAa,MAAO,MAAA,CAAA;OAC/C,eAAc,MAAA;OACd,YAAY;OACZ;MACF,KAAK;OACH,yBAAyB,EAAA,OAAA,MAAA,MAAA,CAAA;OACvB,QAAO,MAAM;OACb,YAAU;OACV;MACA,KAAI;OACL,yBAAA;QACD,OAAQ,MAAM;QACd,UAAW,MAAM;QACjB,GAAA,MAAA,eAAmB,KAAA,IAAA,CAAA,IAAA,EAAA,YAAA,MAAA,WAAA;QACnB,GAAA,MAAA,mBAAuB,KAAA,IAAA,CAAA,IAAA,EAAA,gBAAA,MAAA,eAAA;OACvB,CAAA;OACA,QAAA,MAAA;OACF,WAEE,MAAA;OACJ,aAAA,MAAA;OACF,iBAAQ,MAAA;OAGN,YAAA;OACF;MACA,SAAA;KACF;IAEA,QAAM;KACJ;IACA;IACA,gBAAI;GACF;GACE,MAAA,MAAA,YAAiB;IACjB,IAAI,SAAA;IACF,UAAM;IACJ,IAAA;KACA,OAAA,CAAA,YAAmB,UAAA,OAAA,GAAA;MACpB,aAAA,IAAA,gBAAA;MACD,IAAK;OACL,MAAI,WAAS,MAAS,gBAAgB,GAAM,uBAAA,GAAA,mBAAyC,SAAA,EAAA,UAAA;QACrF,SAAM,EAAA,QAAS,uBAAwB;QACvC,QAAM,WAAc;OACpB,CAAA;OACA,IAAA,CAAO,SAAM,IAAA,MAAA,IAAA,MAAA,oCAAA,SAAA,OAAA,EAAA;OACX,IAAI,SAAA,SAAY,MAAU,MAAS,IAAG,MAAA,yCAAA;OACpC,MAAM,SAAO,SAAS,KAAA,UAAY;OAClC,MAAA,UAAA,IAAA,YAAA;OACF,IAAA,SAAA;OACA,OAAM,MAAQ;QACd,IAAA,YAAkB,UAAO,SAAM,GAAS;SACxC,MAAM,OAAQ,OAAO,CAAA,CAAA,YAAU,KAAA,CAAA;SAC/B;QACA;QACA,MAAI,QAAY,MAAA,OAAA,KAAA;QAClB,UAAA,QAAA,OAAA,MAAA,OAAA,EAAA,QAAA,CAAA,MAAA,KAAA,CAAA;QACF,MAAS,QAAO,OAAA,MAAA,IAAA;QAEd,SAAY,MAAK,IAAG,KAAA;QACtB,KAAA,MAAU,QAAA,OAAA,UAAA,IAAA;QACR,IAAA,MAAa,MAAA;OACf;MACA,SAAI,OAAY;OAChB,IAAM,QAAM,KAAA,GAAA;MACd,UAAA;OACF,aAAU,KAAA;MACR;MACF,IAAA,YAAA,UAAA,SAAA,GAAA;MACF,MAAA,MAAA,YAAA;KAEA;IACE,UAAA;KACA,UAAU;IACR;GACA;GACA,OAAA;IACA,mBAAsB;IACtB,UAAA,UAAa;KACX,IAAA,UAAU,aAAe,CAAA;KACzB,MAAI,UAAU,UAAY,SAAA;KAC1B,UAAA,IAAY,QAAM;KAClB,IAAA,SAAa,IAAA;KACb,aAAY;MACd,UAAA,OAAA,QAAA;MACF,IAAA,UAAA,SAAA,GAAA;MACA,YAAU,MAAA;MACR,aAAW,KAAA;MACX,YAAU;KACV;IACA;IACA,UAAA;KACF,WAAA;KACF,UAAA,MAAA;KACF,YAAA,MAAA;KAEa,aAAA,KAAA;KACFC,YAAAA;IAET;GACE;EACA;EACE,IAAA,wBAAS,MAAA;GACT,2BAAkB,IAAW,IAAM;GACrC,OAAA,WAAA;IACA,IAAA,SAAO,KAAA,SAAA,IAAA,SAAA;IACT,IAAA,WAAA,KAAA,GAAA;KAEA,SAAgB,6BAAA,SAAA;KACd,KAAK,SAAM,IAAU,WAAKA,MAAS;IACnC;IACF,OAAA;GACF;;;;GChfA;EAEA;;;EAIE,MAAA,cAAA,CAAA;EACA,MAAA,eAAA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GAEF;GACA;GACE;GACA;EACA,CAAA,CAAA,KAAM,EAAA;EACN,IAAA,cAAgB;EAChB,SAAQ,YAAc;GACtB,IAAA,eAAc,OAAY,aAAO,aAAA;GACnC,cAAA;GAEA,MAAS,UAAA,SAAa,cAAgC,OAAA;GACpD,QAAI,QAAQ,oBAAoB;GAChC,QAAI,cAAkB;GACtB,SAAO,KAAA,YAAA,OAAA;EACT;EAEA,SAAS,aAAM,SAAuC;GACpD,IAAA,QAAO,YAAS,QAAY,QAAS,UAAS,UAAc,OAAA;GAC9D,IAAA,QAAA,UAAA,aAAA,QAAA,UAAA,WAAA,OAAA;GAEA,OAAS;EACP;EACA,SAAI,MAAS,UAAO;GACpB,OAAI,SAAS,YAAS,SAAW,SAAO,SAAA,KAAA,WAAA,KAAA,GAAA;EACxC;EACF,SAAA,cAAA,UAAA,SAAA;GAEA,IAAA,SAAS,YAAmB,QAAoD,SAAA,SAAA,WAAA,SAAA,UAAA,YAAA,SAAA,UAAA,UAAA,OAAA;GAC9E,IAAM,SAAE,OAAU;GAClB,IAAM,SAAO,SAAW,WAAS,OAAK;GACtC,OAAM;EACN;EACA,SAAM,YAAa,EAAA,KAAA,KAAW;GAC9B,MAAM,EAAA,UAAU,SAAS,aAAY;GACrC,MAAM,CAAA,MAAO,WAAS,SAAS,KAAA;GAC/B,MAAM,QAAO,cAAS,UAAS,OAC3B;GAIJ,MACE,SAAA,SAAA;GACE,MAAA,aAAa,WAAA,KAAA,KAAA,SAAA,SAAA,KAAA,SAAA,SAAA;GACb,MAAA,UAAA,SAAiB,YAAA,UAAA,EAAA,SAAA,IAAA,UAAA,UAAA,EAAA,QAAA,IAAA,EAAA,MAAA;GACjB,MAAA,OAAA,SAAe,SAAA,aAAA,SAAA,UAAA;GAET,OAAA,qBAAA,eAAA;IACN,cAAgB;IACV,kBAAA;IACM,gBAAA;IACZ,kBAAA;IACA,MANA,SAAiB,SAAA,aAAA,oBAAA,oBAAA,EAAA,MAAA,GAAA,CAAA,IAAA,UAAA,SAAA,oBAAA,kBAAA,EAAA,MAAA,GAAA,CAAA,IAAA,oBAAA,UAAA,EAAA,MAAA,CAAA;IAOjB,OAAA,SAAgB,SAAQ,aAAU,EAAK,UAAA,IAAA,MAAA,QAAA;IACvC;IAEU;IAAsC,kBAAY;IAAQ,qBAChE;IAAM,gBAAU,SAAA,UAAA,CAAA,KAAA;IAA0B,kBAAiC,qBAAA,YAAA,EAAA,UAAA,CAAA,oBAAA,QAAA;KAAY,WAAA;KACvF,eAAA;IAhBN,CAAA,GAmBY,oBAAA,QAAW;KACd,WAAU;KACZ,cAAA,UAAa,WACZ,KAAA;KAA8B,UAAA;IAAsB,CAAA,CAAA,EAAA,CAAA;IAAE,UAAQ,CAAA,SAAY,WAAE,IAAU,OAAA,oBAAA,OAAA;KAAG,WAAQ;KAA0D,UAAjJ,SAAQ,KACnB,YAAA,qBAAA,OAAA,EAAA,UAAA;MAGJ,aAAS,OAAY;MACb;MAAkC,QAAA,YAAA,EAAA,UAAA;MAAU,QACjD,YAAA,KAAC,IAAD,KAAA,MAAA,QAAA;KAAK,EAAA,GAAA,QAAU,SAAA,CAAA;IAA0B,CAAA,GAAA,SAAA,KAAA,IAAA,OAAA,SAAA,SAAA,aAAA,oBAAA,OAAA;KAChC,WAAA;;IAEnB,CAAA,IAAA,oBAAA,OAAA;KAIA,WAAS;KACH,UAAU;IACd,CAAI,CAAA;GACF,CAAA;EACF;EACE,SAAO,YAAA,OAAA;GACT,IAAA,UAAA,KAAA,KAAA,MAAA,WAAA,GAAA,OAAA,KAAA;GACF,IAAA;IAEA,OAASC,KAAAA,MAAO,KAAwC;GACtD,QAAO;IACT,OAAA;GAEA;EACE;EACF,SAAA,SAAA,OAAA;GAEA,OAAS,UAAA,QAAgD,OAAA,UAAA,YAAA,CAAA,MAAA,QAAA,KAAA,IAAA,QAAA,KAAA;EACvD;EACF,SAAA,KAAA,OAAA;GAEA,OAAS,OAAA,UAAa,YAAwB,MAAA,SAAA,IAAA,QAAA,KAAA;EAC5C;EACA,SAAI,YAAiB,OAAA;GACrB,OAAI,OAAO,UAAU,YAAY,OAAO,SAAU,KAAA,IAAW,QAAO,KAAO;EAC3E;EACA,SAAOA,aAAY,OAAM;GAG3B,IAAA,UAAA,MAAA,OAAA;GAEA,IAAA,OAAS,UAAU,UAAO,OAA0D;GAClF,IAAA,OAAO,UAAA,YAAC,OAAD,UAAA,WAAA,OAAA,OAAA,KAAA;GAAS,IAAA,MAAU,QAAA,KAAA,GAAA,OAAA,MAAA,IAAA,YAAA,CAAA,CAAA,KAAA,IAAA;GAAnB,OAAA,SAA6C,KAAA,MAAA,KAAC,IAAA,OAAD,KAAA,IAAA,OAAA,QAAA,KAAA,CAAA,CAAA,KAAA,CAAA,KAAA,UAAA,GAAA,IAAA,IAAA,aAAA,IAAA,GAAA,CAAA,CAAA,KAAA,IAAA;EAAK;EAA2C,SAAA,QAAA,EAAA,OAAA,YAAA;GAAW,OAAoB,qBAAA,WAAA;;IACrI,UAAA,CAAA,oBAAA,OAAA;KAEA,WAAgB;KACd,UAAM;IACN,CAAI,GAAA,QAAQ;GACZ,CAAA;EAAY;EAAoC,SAAA,OAAA,EAAQ,OAAM,OAAK,CAAA,KAAA;GAClD,MAAA,UAAS,OAAS,QAAW,KAAA,CAAA,CAAA,QAAA,CAAA,KAAA,UAAA,CAAA,KAAA,SAAA,GAAA,KAAA,SAAA,KAAA,KAAA,SAAA,EAAA;GAA5C,IAAA,QACE,WAAA,GAAA,OAAC;GAAK,OAAU,oBAAA,OAAA;IAA6B,WAAA;IAA+B,UAC5E,QAAA,KAAC,CAAA,KAAA,UAAD,qBAAA,OAAA;KAAM,OAAA,EAAA,SAAU,WAAA;KAA+B,UAAA,CAAiB,oBAAA,QAAA;MAC7D,WAAA;MAHK,UAIX,IAAA,WAAA,KAAA,GAAA;KAAO,CAAA,GAAA,oBAAA,QAAA;MACV,WAAA;MAEA,UAAe,aAAyC,IAAA;KAClD,CAAA,CAAA;IACJ,GAAA,GAAO,CAAA;GAAI,CAAA;EAAmC;EAA+B,SAAA,MAAU,EAAA,SAAA;GAAiD,IAAA,MAAA,WAAA,GAAA,OAAA;GAAS,OAAC,oBAAA,MAAA;IAAM,WAAA;IAC1J,UAAA,MAAA,KAAA,MAAA,UAAA,oBAAA,MAAA;KAEA,WAAgB;KACd,UAAO;IAAK,GAAA,GAAA,KAAU,GAAA,OAAA,CAAA;GAAwB,CAAA;EACvC;EAAL,SAAA,OACE,EAAA,SAAA,QAAC,KAAD;GAAM,OAAU,oBAAA,OAAA;IAA+B,WAAA;IAAoB,UACnE,QAAA,MAAC,QAAD,CAAA,CAAA,KAAA,MAAA,UAAA,qBAAA,OAAA;KAAM,WAAU;KAA6B,UAAA,CAAQ,oBAAA,QAAA;MAClD,WAAA;MAH2C,UAIjD,QAAA;KAAO,CAAA,GAAA,oBAAA,QAAA;MACV,WAAA;MAEA,UAAS,QAAa;KAChB,CAAA,CAAA;IACJ,GAAA,KAAO,CAAA;GAAgB,CAAA;EAAO;EAAK,SAAA,WAAU,EAAA,OAAA,SAAA;GAA0B,IAAA,UAAA,KAAA,KAAA,MAAA,WAAA,GAAA,OAAA;GAAW,OAAA,oBAAA,SAAA;IAAU;IAC9F,UAAA,oBAAA,OAAA;KAEA,WAAS;KACH,UAAO;IACX,CAAA;GACF,CAAA;EAEA;EACE,SAAM,aAAa,OAAA;GACnB,IAAM,CAAA,MAAA,QAAc,KAAA,GAAA,OAAY,CAAK;GACrC,OAAM,MAAQA,QAAO,SAAA,OAAU,SAAA,QAAA;EAC/B;EACA,SAAM,iBAAmB,EAAA,MAAA,KAAY;GAErC,MAAI,aAAe,YACjB,KAAO,KAAA;GAAmD,MAAO,cAAA,YAAA,KAAA,MAAA;GAAa,MAAO,QAAO,SAAA,UAAgB;GAAwC,MAAA,SAAA,SAAA,WAAA;GAGtJ,MAAI,cAAkB,KAAA,YAAQ,OAAA,EAAA,WAAA,IAAA,EAAA,YAAA;GAC5B,IAAA,KAAM,UAAOA,KAAO,GAAA,OAAY,qBAAA,YAAA,EAAA,UAAA,CAAA,oBAAA,WAAA,EAAA,OAAA,CAAA,GAAA,KAAA,KAAA,EAAA,CAAA,GAAA,oBAAA,YAAA;IAChC,OAAM;IACN,OAAM,OAAU,gBAAW,WAAa,cAAO,KAAA;GAC/C,CAAA,CAAA,EAAA,CAAM;GACN,IAAA,KAAO,aAAA,QAAA;IACJ,MAAA,OAAS,SAAY,QAAO,IAAA;IAAS,MAAA,OAAM,KAAA,MAAA,QAAA,KAAA,KAAA,OAAA,SAAA;IAAO,MAAA,UAAA,KAAA,MAAA,OAAC,MAAD,OAAA,gBAAA,WAAA,cAAA,KAAA;IAAK,MAAA,SAAU,YAAA,OAAA,MAAA,KAAA;IAAwB,OAAA,qBAAA,YAAA,EAAA,UAAA;KAAU,SAAA,KAAA,IAAA,OAAA,oBAAA,SAAA;MAAU,OAAA;MAC7G,UAA6B,oBAAA,OAAA;OAAS,WAAS;OAAc,UAAA;MAAQ,CAAA;KAAc,CAAA;KAAsB,UAAA,KAAA,IAAA,OAAA,oBAAA,SAAA;MAAU,OAAA,EAAA,WAAA;MACnH,UAA+B,oBAAA,QAAA;OAAS,OAAO;OAAa,MAAA,CAAA,WAAA;MAAiB,CAAA;KAAS,CAAA;KAAgB,YAAA,KAAA,IAAA,OAAA,oBAAA,SAAA;MAAU,OAAA;MACjH,UAAA,oBAAA,QAAA;OACJ;OAEI,OAAK;MACP,CAAA;KACA,CAAA;IACqC,EAAA,CAAA;GAAuB;GAAiE,IAAI,KAAA,aAAA,UAAC,KAAD,aAAA,QAAA;IAAS,MAAO,YAAE,aAAW,QAAA,SAAA;IAAG,OAAA,qBAAA,YAAQ,EAAA,UAAe,CAAA,UAAA,KAAA,IAAA,oBAAA,YAAA;KAAU,OAC/L,EAAA,WAAU;KACK,OAAO,OAAA,eAAA,WAAA,aAAA,KAAA;IAAa,CAAA,IAAc,oBAAA,SAAgB;KAAmF,OACjJ,EAAA,WAAA;KAAS,UAAO,oBAAA,QAAA,EAAA,OAAA,MAAA,CAAA;IAAa,CAAA,GAAA,UAAA,WAAA,IAAc,oBAAA,YAAY;KAC3D,OAAA;KACJ,OAAA,OAAA,gBAAA,WAAA,cAAA,WAAA,KAAA,IAAA,KAAA,IAAA,aAAA,MAAA;IAEA,CAAI,IAAkB,oBAAA,SAAe;KACnC,OAAM;KAGN,UAFoB,oBAAQ,OACb,EAAA,OAAK,UACW,CAAC;IAChC,CAAA,CAAA,EAAA,CAAO;GACL;GAAY,IAAA,KAAM,aAAA,UAAA,KAAA,aAAA,cAAA;IAAU,MAAA,UAAO,KAAY,OAAO,OAAA;IAAoD,MAAA,WAAA,CAAA,KAAA,QAAA,MAAA,GAAA,KAAA,QAAA,MAAA,CAAA,CAAA,CAAA,QAAA,UAAA,UAAA,KAAA,CAAA,CAAA,CAAA,KAAA,IAAA;IACzG,OAAsB,qBAAO,YAAA,EAAA,UAAC;KAAiB,oBAAW,YAAA;MAAG,OAAA;MAAQ,OAAO,YAAA,OAAA,eAAA,WAAA,aAAA,KAAA;KAAO,CAAA;KAAoB,UAAA,KAAA,IAAA,OAAA,oBAAA,SAAA;MAAU,OAAA,EAAA,WAAA;MAClH,UAAC,oBAAD,QAAA;OAAY,OAAO;OAAa,MAAO,CAAA,SAAA;MAA0E,CAAA;KACjH,CAAA;KACJ,oBAAA,YAAA;MAEA,OAAO;MAC8B,OAAS,aAAW,OAAA,gBAAA,WAAA,cAAA,KAAA;KAAG,CAAA;IAAiE,EAAI,CAAA;GAAS;GAAuB,OAAA,qBAAA,YAAQ,EAAA,UAAe,CAAA,UAAA,KAAA,IAAA,oBAAA,YAAA;IAAU,OAC/L,EAAA,WAAW;IAAwB,OAAO,OAAA,eAAA,WAAA,aAAA,KAAA;GAAa,CAAA,IAAc,oBAAA,SAAgB;IAAqC,OAAI,EAAA,WAAA;IAAS,UAAO,oBAAA,QAAA,EAAA,OAAA,MAAA,CAAA;GAAa,CAAA,GAAA,WAAA,KAAA,IAAQ,oBAAA,YAAgB;IACpL,OAAA;IACJ,OAAA,OAAA,gBAAA,WAAA,cAAA,KAAA;GAEA,CAAA,IAAgB,oBAAA,SAA2B;IACzC,OACE;IAAS,UAAU,oBAAA,QAAA,EAAA,OAAA,OAAA,CAAA;GAAnB,CAAA,CAAA,EAAA,CAAA;EACW;EAAT,SAAA,yBAAA,EAAA,MAAA,KAAA;GACE,OAAC,qBAAA,WAAD;IAAM,WAAA;IAAmC,UAAA,CAAK,qBAAA,WAAA;KAAe,WAAA;KAC7D,UAAA;MAAgB,oBAAA,QAAA;OAA+B,WAAA;OAAuB,UAAA,KAAA;MACrE,CAAA;MACiB,oBAAA,QAAA;OAAhB,WACE;OAAM,UAAU,KAAA;MAAhB,CAAA;MACA,KAAA,cAAA,KAAC,KAAA,KAAD,cAAA,KAAA,IAAA,OAAA,qBAAA,QAAA;OAAM,WAAU;OAAhB,UAAyC,CAAO,qBAAA,QAAqB;QACjE,WAAA;;OAED,CAAA,GAAA,qBAAA,QAAA;QACT,WAAA;QAAK,UAAU,CAAA,KAAA,KAAA,aAAA,CAAA;OAAf,CAAA,CAAA;MAES,CAAA;KACF;IAC+B,CAAA,GAAa,qBAAO,OAAA;KAAE,WAAA;KAAE,UAAQ,CAAA,KAAA,SAAc,WAAU,IAAA,OAAA,oBAAA,OAAA;MAAG,WAAQ;MAA0D,UAAjJ,KAAQ,SACnB,KAAA,YAAA,qBAAA,OAAA,EAAA,UAAA;OAGL,aAAA,OAAC;OAAuB;OAAS,QAAA,YAAA,EAAA,UAAA;OAC9B,QAAA,YAAA,KAAA,IAAA,KAAA,MAAA,QAAA;MACE,EAAA,GAAA,QAAA,SAAA,CAAA;;MAEb;MAEA;KAaE,CAAA,CAAM;IACN,CAAA,CAAA;GACA,CAAA;EACA;EAEA,SACE,0BAAA,EAAA,OAAA,WAAA,WAAA,OAAA,QAAA,KAAA;GAAK,MAAA,CAAA,MAAU,WAAA,SAAA,KAAA;GAAf,MAAA,SACE,MAAA,MAAA,SAAC,KAAA,YAAD,QAAA,KAAA,UAAA,QAAA;GACE,MAAA,UAAa,MAAA,MAAA,SAAA,KAAA,UAAA,aAAA,KAAA,UAAA,SAAA;GACb,MAAA,UAAA,MAAiB,WAAA,IAAA,EAAA,UAAA,IAAA,EAAA,aAAA,EAAA,OAAA,MAAA,OAAA,CAAA;GACjB,OAAe,qBAAA,OAAA;IACf,WAAA;IACA,UAAM,CAAS,oBAAA,eAAU;KACzB,cAAO;KACD,kBAAA;KACN,gBAAA;KACA,kBAAA;KACA,MAAA,SAAA,oBAAA,UAAA,EAAA,OAAA,QAAA,CAAA,IAAA,UAAA,oBAAA,UAAA,EAAA,OAAA,UAAA,CAAA,IAAA,oBAAA,kBAAA,EAAA,MAAA,GAAA,CAAA;KACA,OAAA;KACA;KACQ,YAAU;KAAhB,kBACE;KAAM,qBAAU;KAAhB,gBAAwC,SAAA,UAAqB,CAAA,KAAA;KAC7D,kBAAA,cAAA,KAAA,KAAA,cAAA,KAAA,IAAA,qBAAA,QAAA;MAAM,WAAU;MAAhB,UAAyC,CAAE,qBAAqB,QAAA;OAC5D,WAAA;OACJ,UAAA,CAAA,KAAA,aAAA,CAAA;MAEL,CAAA,GACC,qBAAA,QAAC;OAAI,WAAU;OACZ,UAAA,CAAA,KAAM,aAAY,CAAA;MAAqD,CAAA,CAAA;KAAS,CAAA,IAAA,KAAA;IAAI,CAAA,GAAnC,OAAoC,oBAAA,OAAA;KACnF,WAEJ;;MAET;MAEA;KACE,GAAA,KAAU,SAAA,CAAA;IACV,CAAA,IAAM,IAAA;GACN,CAAA;EACA;EACA,SAAM,mBACE,EAAA,MAAA,qBAAuB,KAAY;GACxC,UAAA;GAAY,MAAO,SAAA,KAAA;GAAM,MAAO,aAAA,qBAAA,UAAA,qBAAA,OAAA,OAAA,MAAA,OAAA,IAAA,CAAA;GAAM,MAAA,QAAA,qBAAA,UAAA,MAAA,OAAA,SAAA,WAAA;GACzC,MAAA,QAAA,cAAA,uBAAA,YAAA,OAAA,MAAA,OAAA,MAAA,KAAA,GAAA;IACA;IACA,OACE;IAAK,OAAA;IACF;GACQ,CAAA;GAAoE,IAAA,MAAA,WAAA,GAAA,OAAC;GAAqC,OAAjD,oBAAiD,OAC1G;IAGD,WAAY;IACZ,UAAU,MAAA,KAAc,SAAY,KAAK,SAAE,SAA0B,oBAAA,OAAA;KACrE,WAAU;KACV,UAAiC,oBAAI,cAAc,EAAA,MAAM,KAAA,KAAA,CAAA;IACtD,GAAA,QAAA,KAAA,SAAA,IAAA,KAAA,SAAA,UAAA,oBAAA,2BAAA;KALE,OAAA,KAAS;KAO8B,GAAK,KAAK,cAAA,KAAA,IAAA,CAAA,IAAA,EAAA,WAAA,KAAA,UAAA;KAAQ,GAAA,KAAA,cAAA,KAAA,IAAA,CAAA,IAAA,EAAA,WAAA,KAAA,UAAA;KAA9C,GAAA,KAAA,UAAiB,KAAA,IAAkC,CAAA,IAAA,EAAA,OAAA,KAAA,MAAA;KACxE;IAET,GAAA,SAAA,KAAA,SAAA,IAAA,oBAAA,aAAA;;;;GCvVA,CAAA;EACE;;;EAIkB,SAAA,qBAAA,OAAA;GAAQ,IAAA,OAAA,UAAA,YAAA,UAAA,QAAA,MAAA,QAAA,KAAA,GAAA,OAAA;GAAe,MAAA,SAAA;GAAW,OAAA,OAAS,OAAO,mBAC/D,aAAA,OAAA,kBAAA,KAAA,KAAA,OAAA,OAAA,kBAAA,aAAA;IAAC;IAAW;IAAa;IAAU;GAAe,CAAA,CAAA,SAAA,OAAA,OAAA,MAAA,CAAA,KAAA;IAAe;IAAS;IAIjF;IA0BA;IACE;IACA;GACA,CAAA,CAAA,SAAa,OAAA,OAAQ,KAAQ,CAAA,KAAK,OAAS,OAAM,cAAW,aAAA,OAAA,OAAA,oBAAA,cAAA,OAAA,YAAA,KAAA,KAAA,OAAA,OAAA,YAAA;EAC1D;EACA,SAAM,qBAAO,OAAA;GACb,IAAI,OAAO,UAAK,YAAQ,UACZ,QAAK,MAAU,QAAA,KACrB,GAAA,OAAA;GAAC,MAAA,WAAA,MAAA;GAAe,OAAA,MAAA,QAAA,QAAA,KAAA,SAAA,OAAA,YAAA;IAAiB,IAAA,OAAA,YAAA,YAAA,YAAA,QAAA,MAAA,QAAA,OAAA,GAAA,OAAA;IAAW,MAAA,OAAS;IAC3D,IAAI,OAAK,KAAS,QAAQ,YAAO,OAAY,KAAA,UAAc,YAAY,CAAA;KACvE;KAKQ;KAAY;IAAQ,CAAA,CAAA,SAAA,OAAA,KAAA,MAAA,CAAA,GAAA,OAAA;IAAc,IAAA,KAAS,SAAQ,QAAmC,OAAQ,OAAA,KAAA,cAAA,YAAA,KAAA,YAAA;IACvG,OAAA,KAAA,SAAA,YAAA,MAAA,QAAA,KAAA,OAAA,KAAA,KAAA,QAAA,OAAA,WAAA,OAAA,WAAA,YAAA,WAAA,QAAA,OAAA,OAAA,UAAA,YAAA,OAAA,OAAA,UAAA,YAAA;KACH;KAMA;KACE;IACF,CAAA,CAAA,SAAA,OAAA,OAAA,MAAA,CAAA,CAAA;GAQA,CAAA;EAKE;EACA,SAAA,MAAgB,QAAA,QAAA;GAAE,OAAA,WAAiB,KAAK,IAAA,SAAA,GAAA,OAAA,KAAA;EAAE;EAC1C,SAAM,kBAAmB,EAAA,SAAA,UAAA,YAAA;GACvB,MAAI,CAAA,OAAU,YAAQ,SAAO,QAAc,KAAA;GAC7C,gBAAA;IACA,SACE,QAAA,KAAA;GACE,GAAA,CAAA,QAAK,KAAA,CAAA;GACL,MAAO,aAAA;IACP,IAAA,UAAW,QAAQ,OAAA,SAAA,KAAA;GACT;GACV,OAAOC,oBAAAA,SAAAA;IACP,MAAA;IAAqB,OAAA;IAAoC,WAAA,QAAA;IACzD;IACA,OAAA;IACE,WAAU,UAAQ;KAChB,SAAM,MAAA,cAAe,KAAA;IACrB;IACA,QAAM;IACR,YAAW,UAAM;KACf,IAAA,MAAS,QAAQ,SAAK;MACtB,MAAM,eAAc;MACtB,KAAA;MACF,MAAA,cAAA,KAAA;KACD,OAAA,IAAA,MAAA,QAAA,UAAA;MAEL,SAAA,QAAA,KAAA;MAEA,MAAgB,cAAA,KAAsB;KACpC;IACA;GACA,CAAA;EACA;EACA,SAAM,oBAAkB,EAAA,SAAA,UAAA,YAAA;GACxB,MAAM,CAAA,MAAA,WAAgB,SAAY,KAAA;GAClC,MAAM,CAAA,aAAA,kBAAiC,SAAA,CAAA;GAEvC,MAAA,UAAgB,OAAA,IAAA;GACd,MAAK,aAAM,OAAA,IAAA;GACX,MAAM,YAAA,MAAA;GACJ,MAAK,gBAAiB,KAAA,IAAS,GAAA,QAAM,QAAiB,WAAa,WAAA,OAAA,UAAA,QAAA,KAAA,CAAA;GACrE,MAAA,iBAAA,QAAA,QAAA;GACA,gBAAS;IACT,IAAA,CAAA,MAAa;IACZ,MAAM,yBAAA,UAAA;KAET,IAAM,CAAA,QAAA,SAAoB,SAAA,MAAA,MAAwB,GAAA,QAAA,KAAA;IAChD;IACA,SAAQ,iBAAI,aAAA,qBAAA;IACd,aAAA,SAAA,oBAAA,aAAA,qBAAA;GAEA,GAAA,CAAM,IAAA,CAAA;GACJ,MAAM,YAAS,QAAQ,kBAAQ;IAC/B,eAAe,KAAA;IACf,QAAQ,IAAK;GACb;GACA,MAAI,UAAO,UAAU;IACvB,MAAA,SAAA,QAAA,QAAA;IAEA,IAAM,WAAQ,KAAA,GAAyB;IACrC,QAAM,KAAQ;IACd,WAAI,SAAa,MAAA;IACjB,IAAA,OAAA,UAAe,QAAY,OAAA,SAAU,OAAS,KAAS;GACzD;GAEA,MACE,QAAA,WAAA;IACE,MAAK,QAAA,QAAA,QAAA;IACL,IAAA,UAAOC,GAAAA;IACP,gBAAQ,aAAS,UAAA,SAAA,SAAA,KAAA;GACf;GACF,OAAA,qBAAA,OAAA;IALF,KAAA;IAQI,OAAK;IACL,SAAK,UAAA;KACL,IAAA,CAAA,MAAA,cAAc,SAAA,MAAA,aAAA,GAAA,QAAA,KAAA;IACd;IACA,UAAA,CAAsB,qBAAA,UAAY;KAClC,KAAA;KACA,MAAA;KACA,iBAAO;KAAE,iBAAGC;KAA6B,iBAAWC,OAAAA,YAAkC,KAAC;KAAG,yBAAA,OAAA,GAAA,UAAA,GAAA,gBAAA,KAAA;KAC1F,UAAA,YAAe,QAAA,QAAA,WAAA;KAAE,OAAI;MAA2B,GAAA;MAAW,GAAA,OAAA,2BAAA,CAAA;KAC3D;KACE,eAAU;MACR,IAAA,MAAM,QAAA,KAAe;WAChB,SAAM;KACN;KACP,YAAW,UAAM;MACf,IAAA,MAAM,QAAA,eAAe,MAAA,QAAA,WAAA;OACrB,MAAA,eAAgB;OAClB,IAAO,CAAA,MAAI,SAAM,MAAQ,QAAS,cAAM,gBAAA,KAAA,IAAA,GAAA,QAAA,QAAA,SAAA,CAAA,CAAA;YAChC,KAAA,MAAA,QAAe,cAAA,IAAA,EAAA;MACrB,OAAA,IAAA,MAAe,QAAS,UAAW,MAAA;OACrC,MAAO,eAAW;OAChB,eAAM,CAAA;MACN,OAAO,IAAA,MAAW,QAAA,SAAA,MAAA;OACpB,MAAO,eAAU;OACf,eAAM,KAAe,IAAA,GAAA,QAAA,QAAA,SAAA,CAAA,CAAA;MACrB,OAAQ,KAAK,MAAA,QAAA,WAAA,MAAA,QAAA,QAAA,MAAA;OACf,MAAA,eAAA;OACF,OAAA,WAAA;MA5BF,OAAA,IA8BE,MAAA,QAAA,YAAA,MAAA;OAAM,MAAOC,eAAAA;OAA4B,QAAA,KAAA;MAA6C;KAChF;KAAmB,UAAO,CAAA,oBAAA,QAAA;MAAE,OAAGC;MAA6B,UAAWC,gBAAAA,SAAAA,QAAmC;KAAG,CAAA,GAAA,oBAAA,QAAA;MAAG,eAAA;MAChH,OAAA;OACP,GAAA;OACU,GAAA,OAAA,2BAAA,CAAA;MAAW;MAAe,UAAA;KAAsD,CAAA,CAAA;IACtF,CAAA,GAAA,OAAgB,oBAAK,OAAQ;KAC5B,IAAA;KACA,MAAM;KACN,yBACE,GAAC,UAAD,GAAA;KACE,OAAO;KAEP,UAAK,QAAA,QAAA,KAAA,QAAA,UAAA;MACL,MAAK,WAAA,OAAA,UAAA,QAAA;MACL,MAAA,SAAA,UAAe;MACf,OAAO,qBAAA,UAAA;OAAE,IAAGE,GAAAA,UAAAA,GAAAA;OAA4B,MAAI;OAAgD,MAAA;OAC5F,iBAAA;OACA,OAAA;QACA,GAAA;QATF,GAAA,SAWE,4BAAA,CAAA;OAAM;OAAkC,oBAAY,eAAA,KAAA;OAAQ,cAAA,UAAW,MAAM,eAAA;OAAS,eACtF,OAAC,KAAA;OAVI,UAAU,CAAiB,oBAAA,QAW1B;QAEX,OAAA;QAED,eACD;;OAET,CAAA,GAAA,oBAAA,QAAA,EAAA,UAAA,OAAA,MAAA,CAAA,CAAA;MAEA,GAAgB,GAAA,OAAA,OAAA,GAAmB,OAAmC,OAAA;KACpE,CAAA;IACA,CAAA,IAAO,IAAA;GACP,CAAA;EACA;EACA,SAAO,mBAAa,EAAA,KAAA;GACpB,MAAO,CAAA,QAAA,aAAY,SAAiB;GACpC,MAAO,CAAA,OAAA,YAAgB,SAAA;GACvB,MAAO,CAAA,MAAA,WAAA,SAAqB,KAAA;GAC5B,MAAO,CAAA,cAAA,mBAAoB,SAAA;GAE3B,MAAM,CAAA,aAAU,kBAAwB,SAAA;GACtC,MAAA,CAAQ,YAAI,iBAAA,SAAA;GACZ,MAAA,CAAA,gBAAkB,qBAAA,SAAA;GAClB,MAAA,CAAA,qBAAmB,0BAAA,SAAA;GACnB,MAAI,CAAA,oBAAA,yBAAA,SAAA,KAAA;GACF,MAAM,UAAA,YAAiB,YAAM;IAAsB,QAAA,IAAA;IAA4B,SAAS,KAAE,CAAA;IAA8B,UAAA,KAAA,CAAA;IACxH,IAAA;KACA,MAAK,WAAa,MAAM,MAAI,oBAAiB;MAC7C,aAAU;MACZ,SAAS,EAAA,QAAO,mBAAA;KACd,CAAA;KACF,MAAA,UAAU,MAAA,SAAA,KAAA;KACR,IAAA,CAAA,SAAa,IAAA,MAAA,IAAA,MAAA,WAAA,UAAA,QAAA,QAAA,QAAA,SAAA,QAAA;KACf,UAAA,OAAA;IACC,SAAE,OAAA;KAEL,SAAA,iBAAgB,QAAA,MAAA,UAAA,OAAA,KAAA,CAAA;IAAO,UAAQ;KAAM,QAAQ,KAAA;IAE7C;GACE,GAAA,CAAA,CAAA;GACA,gBAAA;IACA,QAAI;GACF,GAAA,CAAA,OAAM,CAAA;GACJ,MAAA,wBAAgC,YAAQ,OAAA,YAAA;IACxC,sBAAa,IAAA;IACb,uBAAS,KAAA,CAAA;IAAE,IAAA;KAA4B,MAAI,WAAY,MAAA,MAAiB,6BAAkB;MAAsB,QAAA,YAAA,KAAA,IAAA,QAAA;MAChH,aAAgB;MACjB,SAAA;OACD,QAAM;OACF,GAAC,YAAa,KAAA,IAAA,CAAA,IAAA,EAAA,gBAAA,mBAAA;MAChB;MAGA,GAAA,YAAgB,KAAA,IAAO,CAAA,IAAA,EAAA,MAAA,KAAA,UAAA,EAAA,QAAA,CAAA,EAAA;KACzB,CAAA;KACA,MAAK,UAAA,MAAA,SAA4B,KAAG;KACpC,IAAA,CAAA,SAAA,IAAkB;MACpB,MAAS,UAAO,OAAA,YAAA,YAAA,YAAA,QAAA,WAAA,WAAA,OAAA,QAAA,UAAA,WAAA,QAAA,QAAA,QAAA,SAAA;MACd,MAAA,IAAA,MAAA,OAAuB;KACzB;KACE,IAAA,CAAA,qBAA2B,OAAA,GAAA,MAAA,IAAA,MAAA,kCAAA;KAC7B,kBAAA,OAAA;IACC,SAAE,OAAA;KAEL,uBAAgB,iBAAA,QAAA,MAAA,UAAA,OAAA,KAAA,CAAA;IAAO,UAAA;KAA4B,sBAAsB,KAAA;IAEzE;GACE,GAAA,CAAA,CAAA;GACA,gBAAe;IACf,sBAAI;GACF,GAAA,CAAA,qBAAuB,CAAA;GACrB,MAAA,gBAAmB,YAAU,OAAQ,WAAA;IACrC,cAAa,MAAA;IACb,eAAW,KAAQ,CAAA;IACpB,IAAA;KACD,MAAM,WAAU,MAAM,MAAS,WAAK,UAAA,2BAAA,oBAAA;MACpC,QAAK,WAAa,UAAA,QAAA;MAChB,aAAM;MAGN,SAAU,EAAA,QAAM,mBAAO;KACzB,CAAA;KACA,MAAK,UAAA,MAAA,SAA4B,KAAG;KACpC,IAAA,CAAA,SAAgB,IAAA;MAClB,MAAS,UAAO,OAAA,YAAA,YAAA,YAAA,QAAA,WAAA,WAAA,OAAA,QAAA,UAAA,WAAA,QAAA,QAAA,QAAA,SAAA;MACd,MAAA,IAAA,MAAe,OAAA;KACjB;KACE,IAAA,CAAA,qBAAuB,OAAA,GAAA,MAAA,IAAA,MAAA,yBAAA;KACzB,gBAAA,OAAA;IACC,SAAE,OAAA;KAEL,eAAa,iBAAwB,QAAI,MAAA,UAAA,OAAA,KAAA,CAAA;IACtC,UAAE;KACA,cAAY,KAAM,CAAA;IACpB;GACA,GAAE,CAAA,CAAA;GACF,MAAE,OAAW,WAAK,KAAA,IAAA,CAAA,IAAkB;IAAE,CAAA,EAAA,YAAc,GAAA,OAAU,WAAA,WAAA,UAAA,OAAA,WAAA,QAAA,EAAA,SAAA,IAAA,GAAA,EAAA,SAAA,EAAA,KAAA,OAAA,WAAA,SAAA,KAAA,IAAA,GAAA;IAAO,CAAA,EAAA,SAAQ,GAAO,MAAA,OAAU,QAAA,QAAA,OAAA,QAAA,SAAA,OAAA,QAAA,OAAA,CAAA;IAAS,CAAA,EAAA,gBAAA,GAAA,MAAA,OAAA,eAAA,QAAA,CAAA,OAAA,eAAA,QAAA,OAAA,eAAA,YAAA,CAAA,CAAA,OAAA,OAAA,CAAA,CAAA,KAAA,KAAA,KAAA,OAAA,eAAA,OAAA,CAAA;IACvG,CAAE,EAAA,WAAa,GAAA,OAAA,SAAgB;IAAE,CAAA,EAAA,WAAY,GAAA,EAAO,kBAAA;KAAc,OAAS,OAAK,UAAM;KAAwC,QAAA,OAAA,UAAA;IACjI,CAAA,CAAA;IAEA,CAAA,EAAA,QACE,GAAA,EAAA,gBAAA;KAAK,KAAOG,OAAAA,OAAAA;KAAZ,SAAA,KAAA,MAAA,OAAA,OAAA,gBAAA,GAAA;IACE,CAAA,CAAA;GAAQ;GAAR,OACE,qBAAA,OAAC;IAAI,OAAA;IAA4B,UAAA;KAAmB,qBAAA,UAAA;MAAM,OAC1D;MACM,UAAOG,CAAAA,oBAAAA,OAAAA;OAAyB,OAAA;OAAe,eACnD;OAAG,UAAOC;MAAsB,CAAA,GAAE,qBAAa,OAAA,EAAA,UAAA,CAAA,oBAAA,MAAA;OAC5C,OACC;;MAER,CAAA,GAAC,oBAAA,KAAD;OAAS,OAAOC;OAAhB,UAAA,EAAA,aAAA;MACE,CAAA,CAAA,EAAA,CAAA,CAAA;KAAK,CAAA;KACH,qBAAA,WAAA;MACM,OAAA;MAAuC,UAAA;OAC3C,qBAAA,OAAA;QAAG,OAAOD;QAAsB,UAAA,CAAE,qBAAiB,OAAA,EAAA,UAAA,CAAA,oBAAA,MAAA;SAChD,OACL;SAAQ,UAAK,EAAA,aAAA;QAAS,CAAA,GAAOI,oBAAAA,KAAAA;SAAe,OAAA;SAAsB,UAAQ,EAAA,iBAAA;QAAE,CAAA,CAAA,EAAA,CAAA,GAAA,oBAAA,UAAA;SAAG,MAAA;SAC5E,OAAA;SAEA,eAAA;;SACJ;SAAuB,UAAOC;SAAgB,UAAE,OAAA,EAAA,YAAoB,IAAA,EAAA,QAAA;QAAK,CAAA,CACxE;OAAK,CAAA;OACF,KAAA,WAAK,IAAiB,oBAAA,KAAc;QACN,OAAOE;QAAyB,UAAA,EAAA,oBAAA;OAAY,CAAA,IACzE,oBAAA,OAAA;QAA6B,OAAOC;QAAyB,UAAA,KAAA,SAAA,CAAA,OAAA,cAAA,CAAA,oBAAA,QAAA;SAAlD,OAAG;SAEb,UAAA;QAEN,GAAA,GAAA,MAAU,OAAY,GAAO,oBAAA,QAAA;SAAG,OAAK;SAAQ,UAAO;QAAE,GAAGH,GAAAA,MAAAA,OAAAA,CAAAA,CAAAA;OAAe,CAAA;OAA8C,UAAA,KAAA,IAAA,OAAA,qBAAA,KAAA;QAAzF,MAAA;QAA6F,OAAE;SAAS,GAAA;SAAG,OAAA;QAAS;;SAC3I,EAAA,OAAA;;SAET;QAAS;OAAT,CAAA;MACE;KACM,CAAA;KAAyC,qBAAA,WAAgB;MAAM,OACnE;MAAG,UAAOL;OAAwB,qBAAA,OAAA,EAAA,UAAoB,CAAA,oBAAA,MAAA;QACnD,OAAA;QACJ,UAAA,EAAA,gBAA+B;OAAG,CAAA,GAAOK,oBAAAA,KAAAA;QAAgB,OAAA;QAA8B,UAAI,EAAA,oBAA4B;OAC/F,CAAA,CAAA,EAAA,CAAA;OAAvB,mBACE,KAAA,IAAA,oBAAA,KAAA;QAAM,OAAOE;QAAyB,UAAA,EAAA,uBAAgB;OAMqC,CAAA,IAC1F,eAAiB,SAAA,KAChB,YAAC,qBAAA,OAAD;QACW,OAAA;QACT,UAAU,CAAA,oBAAA,QAAA;SACV,OAAA;SAA8B,UAAA,QAAA,QAAyB,gBAAc,EAAA,aAAW,IAAA,QAAA,QAAA,yBAAA,EAAA,sBAAA,IAAA,QAAA,QAAA,iBAAA,EAAA,qBAAA,IAAA,QAAA,QAAA,uBAAA,EAAA,oBAAA,IAAA,QAAA;QAAE,CAAA,GAAA,QAAA,SAAA,WAAA,oBAAA,qBAAA;SACnF;SAGU,UAAA;SACT,WAAU,cAAA;UACV,sBAAuB,GAAA,QAAA,MAAA,UAAA,CAAA;SAAO;QAAoD,CAAA,IAAA,oBAAA,mBAAA;SAGnF;SArBK,UAqBL;SAEN,WAAA,cAAyB;UACnB,sBAAOF,GAAAA,QAAAA,MAAAA,UAAAA,CAAAA;SAAgB;QAAiC,CAAA,CAC3D;OACH,GAAA,QAAA,GAAgB,CAAA;OACV,gBAAOA,SAAAA,MAAAA,YAAAA,QAAAA,WAAAA,aAAAA,MAAAA,OAAAA,oBAAAA,KAAAA;QAAgB,OAAA;QAAmC,UAC7D,EAAA,0BAAA;OACH,CAAA,IAAA;OACM,gBAAOA,SAAAA,MAAAA,YAAAA,QAAAA,WAAAA,eAAAA,MAAAA,OAAAA,oBAAAA,KAAAA;QAAgB,OAAA;QAA4B,UACtD,EAAA,4BAAA;OACH,CAAA,IAAA;OAA8C,gBAAK,SAAA,MAAA,YAAA,QAAA,QAAA,cAAA,MAAA,OAAA,oBAAA,KAAA;QAAQ,OAAO;QAAE,UAAGA,EAAAA,qBAAAA;OAAe,CAAA,IAAA;OAA8C,wBAAA,KAAA,IAAA,OAAA,qBAAA,KAAA;QAAzF,MAAA;QAA6F,OAAE;SAAuB,GAAA;SAAG,OAAA;QAAuB;;SACrL,EAAA,qBAAA;;SAET;QAAS;OAAT,CAAA;MACE;KACM,CAAA;KAAyC,qBAAA,WAAc;MAAM,OACjE;MAAG,UAAOL;OAAwB,qBAAA,OAAA,EAAkB,UAAA,CAAA,oBAAA,MAAA;QACjD,OAAA;QACJ,UAAA,EAAA,cAA6B;OAAG,CAAA,GAAOK,oBAAAA,KAAAA;QAAgB,OAAA;QAAyB,UAC/E,EAAA,kBAAA;OAAK,CAAA,CAAA,EAAA,CAAA;OAAL,iBAAA,KAAA,IAAA,oBAAA,KAAA;QACE,OAAA;QAAM,UAAOE,EAAAA,kBAAAA;OAAyB,CAAA,IAAE,qBAAA,OAAkB;QAAQ,OAAA;QAClE,UAAA;SAAaC,oBAAAA,QAAAA;UAAyB,OAAA;UAAkC,UAAA,EAAA,kBAAA;SACxE,CAAA;SAAaD,oBAAAA,QAAAA;UAAyB,OAAA;UAAyB,UAAA,aAAA;SAC/D,CAAA;SAAaC,oBAAAA,QAAAA;UAAyB,OAAA;UAA+C,UAAA,EAAA,eAAA;SACrF,CAAA;SAAaD,oBAAAA,QAAAA;UAAyB,OAAA;UAAwB,UAAA,EAAA,gBAAA,aAAA,QAAA;SAC9D,CAAA;SAAaC,oBAAAA,QAAAA;UAAyB,OAAA;UAA6C,UAAA,EAAA,cAAA;SAClF,CAAA;SACcD,oBAAAA,QAAAA;UAAyB,OAAA;UAAyB,UAC/D,EAAA,eAAC,aAAD,OAAA;SAAM,CAAA;SAAgC,aAAA,kBAAa,KAAA,IAAA,OAAA,qBAAA,YAAA,EAAA,UAAA,CAAA,oBAAA,QAAA;UACnD,OAAA;UACC,UAAA,EAAA,eAAA;;UAEN,OAAA;UAAgD,UAAOF,aAAAA;SAAgB,CAAA,CAAA,EAAA,CAAA;QAAwB;OAC/F,CAAA;OAAmD,cAAOA,YAAAA,KAAAA,IAAAA,OAAAA,oBAAAA,KAAAA;QAAgB,OAAA;QAAwB,UAAA,aAAA;OAClG,CAAA;OAAsC,cAAK,oBAAA,OAAA,OAAA,oBAAA,KAAA;QAAQ,OAAO;QAAE,UAAGA,EAAAA,iBAAAA;OAAe,CAAA;OAA8C,gBAAA,KAAA,IAAA,OAAA,qBAAA,KAAA;QAAzF,MAAA;QAA6F,OAAE;SAAe,GAAA;SAAG,OAAA;QAAe;;SACpK,EAAA,aAAA;SAAK;SAAL;QACU;OAAc,CAAA;OAAqC,qBAAA,OAAA;QAAE,OAAK;QAAuB,UAAA,CAAA,oBAAA,UAAA;SAAG,MAAA;SACzF,OAAA;SACK,eACR;UAAQ,cAAK,OAAA;SAAS;SAA6B,UAAA,eAAe,KAAA;SAAO,UAAA,eAAsB,UAAA,EAAA,iBAAA,IAAA,EAAA,cAAA;QAAE,CAAA,GAAA,oBAAA,UAAA;SAAG,MAAA;SACjG,OAAA;SAEA,eAAA;;SACE;;SAET,UAAA,eAAC,WAAD,EAAA,gBAAA,IAAA,EAAA,cAAA;QAAS,CAAA,CAAA;OAAT,CAAA;MACM;KAAuC,CAAA;KAC3C,qBAAA,WAAA;MAAG,OAAOL;MAAsB,UAAA,CAAgB,oBAAA,MAAA;OACzC,OAAA;;MACN,CAAA,GAAA,oBAAA,KAAA;;OAET,UAAA,EAAA,cAAA;;;;GCnaA,CAAa;EACF;;;EAKP,IAAA,8BAAY,cAAA,MAAA;GACZ;GACA;GACF,YAAA,SAAA,MAAA,QAAA;IACF,MAAA,OAAA;IAEA,KAASW,OAAAA;IACP,IAAO,SAAA,KAAU,GAAA,KAAQ,OAAO;IAClC,IAAA,WAAA,KAAA,GAAA,KAAA,SAAA;GAEA;EACE;EACA,SAAM,SAAa,OAAO;GAC1B,OAAK,UAAW,QAAA,OAAA,UAAA,YAAA,CAAA,MAAA,QAAA,KAAA,IAAA,QAAA,KAAA;EACd;EACA,eAAU,WAAA,SAAA;GAKZ,MAAA,SAAA,MAAA;GACA,MAAO,OAAA,MAAA,OAAA,KAAA;GACT,IAAA,CAAA,OAAA,IAAA;IAEA,MAAS,QAAQ,SAAyC,IAAA;IACxD,MAAM,IAAA,4BAAoB,OAAA,OAAA,YAAA,WAAA,MAAA,UAAA,6BAAA,OAAA,OAAA,UAAA,WAAA,MAAA,QAAA,KAAA,GAAA,OAAA,OAAA,WAAA,WAAA,MAAA,SAAA,KAAA,CAAA;GAC1B;GAQA,OAAK;EACH;EACA,SAAI,QAAS,OAAa;GAE5B,MAAA,QAAA,SAAA,KAAA;GACA,IAAK,UAAM,KAAU,KAAA,OAAM,MAAA,SAAiB,YAAA,OAAA,MAAA,WAAA,YAAA,OAAA,MAAA,SAAA,YAAA,OAAA,MAAA,gBAAA,YAAA,CAAA,MAAA,QAAA,MAAA,KAAA,KAAA,OAAA,MAAA,UAAA,YAAA,OAAA,MAAA,cAAA,aAAA,OAAA,MAAA,cAAA,aAAA,OAAA,MAAA,gBAAA,aAAA,OAAA,MAAA,iBAAA,aAAA,MAAA,aAAA,KAAA,KAAA,OAAA,MAAA,aAAA,YAAA,CAAA,MAAA,QAAA,MAAA,eAAA,KAAA,OAAA,MAAA,sBAAA,WAAA,MAAA,IAAA,MAAA,oCAAA;GAC1C,KAAM,MAAA,QAAOA,MAAO,OAAM;IAC1B,MAAI,OAAS,SAAa,IAAA;IAC5B,IAAA,SAAA,KAAA,KAAA,OAAA,KAAA,SAAA,YAAA,OAAA,KAAA,WAAA,aAAA,OAAA,KAAA,aAAA,aAAA,OAAA,KAAA,cAAA,WAAA,MAAA,IAAA,MAAA,iCAAA;GACA;GACF,KAAA,MAAA,UAAA,MAAA,iBAAA;IAEA,MAAS,OAAO,SAAwC,MAAA;IACtD,IAAM,SAAQA,KAAAA,KAAO,OAAK,KAAA,SAAA,YAAA,OAAA,KAAA,YAAA,UAAA,MAAA,IAAA,MAAA,mCAAA;GAC1B;GAGA,OAAO;EACT;EAEA,SAAS,OAAS,OAAc;GAC9B,MAAO,QAAG,SAAA,KAAA;GACZ,IAAA,UAAA,KAAA,KAAA,OAAA,MAAA,WAAA,YAAA,OAAA,MAAA,WAAA,aAAA,MAAA,mBAAA,KAAA,KAAA,OAAA,MAAA,mBAAA,YAAA,MAAA,cAAA,KAAA,MAAA,CAAA,MAAA,QAAA,MAAA,SAAA,KAAA,MAAA,UAAA,MAAA,SAAA,OAAA,SAAA,QAAA,IAAA,MAAA,IAAA,MAAA,mCAAA;GAEA,OAAA;EACE;EACE,SAAQ,SAAA,MAAA,WAAA;GACR,OAAA,GAAA,gCAAa,KAAA,aAAA,mBAAA,SAAA;EACb;EACA,eAAe,4BAA0B,WAAA,QAAA;GACzC,OAAC,QAAA,MAAA,WAAA,MAAA,SAAA,YAAA,SAAA,GAAA;IACL,QAAA;IAEA,aAAsB;IACpB,SAAM,EAAQA,QAAAA,mBAAsB;IAClC,GAAA,WAAQ,KAAA,IAAA,CAAA,IAAA,EAAA,OAAA;GACR,CAAA,CAAA,CAAA;EACA;EAAW,eAAQ,sBAAA,WAAA,aAAA,QAAA;GAAoB,MAAA,QAAA,SAAgB,MAAA,WAAA,MAAA,SAAA,YAAA,SAAA,GAAA;IAAmB,QAAA;IAC1E,aAAW;IACX,SAAI;KACH,QAAA;KACC,gBAAc;IAClB;IACF,MAAA,KAAA,UAAA,EAAA,YAAA,CAAA;IAEA,GAAA,WAAgB,KAAA,IAAA,CAAA,IAAA,EACd,OAAA;GAGA,CAAA,CAAA,CAAA;GACE,IAAA,OAAQ,OAAA,YAAA,UAAA,MAAA,IAAA,MAAA,mCAAA;GACR,OAAA,MAAa;EACb;EAAW,SAAQ,wBAAA,WAAA,SAAA;GAAoB,OAAA,WAAgB,MAAA,SAAA,IAAA,SAAA,GAAA;IAAmB,QAAA;IAC1E,aAAW;IACV,SAAM;KACX,QAAA;;;;GCxGA,CAAA,CAAA,CAAA,CAAA,KAASE,MAAO;EACd;;;EAKE,SAAQ,SAAA,OAAA;GACR,OAAA,UAAa,QAAA,OAAA,UAAA,YAAA,CAAA,MAAA,QAAA,KAAA,IAAA,QAAA,KAAA;EACb;EACA,eAAe,SAAa,MAAM,WAAO,YAAA,QAAA;GAC1C,MAAA,WAAA,MAAA,MAAA,GAAA,kCAAA,KAAA,aAAA,mBAAA,SAAA,EAAA,UAAA,cAAA;IACD,QAAM;IACN,aAAc;IAGd,SAAI,EAAS,QAAW,mBAAgB;IACxC,GAAA,WAAO,KAAA,IAAA,CAAA,IAAA,EAAA,OAAA;GACT,CAAA;GAEA,MAAA,OAAsB,SAAA,MAAA,SAAwB,KAAA,CAAA;GAC5C,IAAM,CAAA,SAAO,IAAM,MAAA,IAAS,MAAA,OAAa,MAAA,YAAW,WAAkB,KAAA,UAAA,uCAAA;GACtE,IAAK,SAAM,KAAQ,GAAA,MAAK,IAAQ,MAAG,yCAAgB;GACnD,OAAM;EACN;EACE,eAAcA,wBAAW,WAAA,YAAA,QAAA;GACzB,MAAI,OAAU,MAAA,SAAa,aAAa,WAAO,YAAmB,MAAM;GAIxE,IAAA,CAAA,MAAS,QAAiD,KAAA,QAAA,GAAA,MAAA,IAAA,MAAA,yCAAA;GAC5D,MAAA,WAAA,CAAA;GACA,KAAO,MAAA,QAAA,KAAA,UAAA;IACT,MAAA,QAAA,SAAA,IAAA;IAEA,IAAA,UAAsB,KAAA,KAAA,OAAkB,MAAA,OAAmB,YAAoB,OAAwD,MAAA,SAAA,YAAA,OAAA,MAAA,WAAA,YAAA,OAAA,MAAA,SAAA,YAAA,OAAA,MAAA,QAAA,YAAA,MAAA,SAAA,SAAA,MAAA,SAAA,SAAA,MAAA,SAAA,KAAA,KAAA,OAAA,MAAA,SAAA,UAAA;IACrI,SAAM,KAAO,KAAM;GACnB;GACA,OAAM;EACN;EACE,eAAcA,kBAAW,WAAA,YAAA,QAAA;GACzB,MAAI,OAAU,MAAA,SAAa,WAAa,WAAS,YAC3C,MAAM;GAGZ,IAAA,CAAA,MAAY,QAAgC,KAAA,MAAA,GAAA,MAAA,IAAA,MAAA,uCAAA;GAC9C,MAAA,SAAA,CAAA;GACA,KAAO,MAAA,QAAA,KAAA,QAAA;IACT,MAAA,QAAA,SAAA,IAAA;;IAGA,OAAgB,KAAA,KAAA;GAEd;GACF,OAAA;;;EAUE,SAAO,sBAAA,UAAA;GAFL,OAAO,6JADmB,SAAiB,KAAA,YAAe,KAAM,QAAI,OAAA,QAAA,SAAA,KAAA,IAAA,KAAA,IAAA,QAAA,OAAA,KAAA,QAAA,OAAA,KAAA,QAAA,KAAA,WAAA,MAAA,MAAA,GAAA,CAAA,CAAA,KAAA,IAAA;EAGkI;;;GAI1M,OAAgB,0LAAiF,OAAA,KAAA,UAAA;IAC/F,OAAO,GAAA,MAAA,MAAkB,OAAA,MAAW,SAAA,KAAA,IAAA,KAAA,KAAA,MAAA,KAAA,OAAA,MAAA,gBAAA,KAAA,IAAA,KAAA,KAAA,MAAA,gBAAA,MAAA,QAAA,KAAA,IAAA,KAAA,eAAyJ,MAAA,IAAU;GACzM,CAAA,CAAA,CAAA,KAAA,MAAA;;;;GCxEA,OAAa,kBAAA,WAAuB,yJAAA,UAAA,KAAA,SAAA,KAAA,MAAA,CAAA,CAAA,KAAA,IAAA;EACpC;;;EAmBE,MAAI,uBAAqB;EACzB,MAAI,kBAAqB;EACvB,MAAA,eAAQ,EAAA,mCAAA,IAAA,IAAA,EAAA;EAAE,MAAA,2BAAS,IAAA,IAAA;EAAO,SAAQ,QAAA,WAAA;GAAa,IAAA,QAAA,SAAA,IAAA,SAAA;GAC/C,IAAA,UAAa,KAAA,GAAA;IACf,QAAA;KACA,SAAO;KACT,QAAA;IAEA;IACE,SAAO,IAAQ,WAAW,KAAA;GAC5B;GAEA,OAAgB;EACd;EACF,SAAA,eAAA,WAAA;GAEA,OAAgB,QAAA,SAAc,CAAA,CAAA;EAC5B;EACF,SAAA,kBAAA,WAAA,SAAA;GAEA,QAAgB,SAAA,CAAA,CAAA,UAAgB;EAC9B;EACF,SAAA,cAAA,WAAA;;EAGA;EACE,SAAI,gBAAqB,WAAO,QAAA;GAChC,QAAO,SAAW,CAAA,CAAA,SAAS;EAC7B;;EAOE,SAAM,gBAAiB,QAAO;GAC9B,IAAM,OAAA,WAAY,GAAA,OAAgB,KAAA;GAClC,OAAM,OAAA,KAAA,UAAgB,GAAA,MAAc,KAAA,GAAa,MAAA,QAAc,IAAA,CAAO,CAAA,KAAA,CAAA,CAAA,KAAA,IAAA;EACtE;EACA,SAAU,YAAY,QAAA,UAAc,QAAA;GACpC,MAAI,QAAA,SAAe,QAAc,YAAA,CAAA,OAAoB,kBAAO,IAAA,QAAA,EAAA,CAAA;GAC5D,MAAI,YAAS,gBAAuB,MAAA;GACpC,MAAM,gBAAgB,cAAgB,KAAA,KAAA,cAAmB,OAAA;GACzD,MAAO,WAAA,CAAA;GACL,IAAA,MAAW,SAAS,GAAA,SAAW,KAAE,sBAAM,KAAA,CAAA;GACvC,IAAA,eAAQ,SAAA,KAAA,oBAAA,MAAA,CAAA;GACN,IAAA,SAAA,WAAA,GAAA,OAAA,EAAmB,OAAQ;GAC3B,MAAI,gBAAkB,gBAAmB,YAAA,OAAA;GAC3C,OAAA;IACF,QAAA,GAAA,SAAA,KAAA,MAAA,EAAA,MAAA;IACF,QAAA;;;;GC/CA;EACA;;;EAKI,MAAM,0BAAyB;EAC/B,MAAI,4BAAkB;;EAExB,SAAO,iBAAA,YAAA;GACT,KAAA,IAAA,QAAA,WAAA,SAAA,GAAA,SAAA,GAAA,SAAA,GAAA;IAyBA,MAAS,QAAA,WAAoB,MAAA,EAAO;IAClC,IAAM,OAAA,WAAY,uBACdC,MAAAA,MAAAA,OACA,UAAS;GACb;GAAa,OAAO;EAAE;EAA0B,SAAG,WAAA,EAAA,OAAA,OAAA,aAAA;GAAU,MAAA,YAAA,SAAA,YAAA,wBAAA,SAAA,YAAA,wBAAA,SAAA,UAAA,sBAAA,CAAA;GAAtD,OAAyD,qBAAA,QAAC;IAAK,OAAOI;KAA0B,GAAA;KAAoB,GAAC;IAAM;IAAoC,UAAA,CAAA,oBAAA,QAAA;KAAmB,OAAA;;IAC3L,CAAA,GAAA,oBAAA,QAAA;KAEA,OAAS;KACH,UACF;IACO,CAAA,CAAA;GAAa,CAAA;EAAc;EAAoB,SAAK,gBAAA,EAAA,OAAA,IAAA,SAAA,SAAA;GAAO,IAAA,QAAO,OAAA,qBAAA,OAAA;IAAe,OAAA;IAAkB,QAAA;IAAsB,SAAA;IAAuB,MAAA;IAArJ,QAAA;IACE,aAAA;IAAQ,eAAG;IAAI,gBAAG;IAAI,eAAE;IAAO,UAAA;KAC/B,oBAAC,UAAD;MAAQ,IAAG;MAAI,IAAG;MAAK,GAAE;KAAO,CAAA;KAChC,oBAAC,UAAD;MAAQ,IAAG;MAAK,IAAG;MAAI,GAAE;KAAO,CAAA;KAChC,oBAAC,UAAK;MACN,IAAA;MACG,IAAA;;KAGT,CAAA;KACc,oBAAA,QAAA,EAAA,GAAA,aAAA,CAAA;KAAc,oBAAA,QAAA,EAAA,GAAA,2BAAA,CAAA;IAAM;GAAoB,CAAA;GAAY,OAAO,qBAAA,OAAA;IAAe,OAAA;IAAkB,QAAA;IAAsB,SAAA;IAAuB,MAAA;IAArJ,QAAA;IACE,aAAA;IAAQ,eAAG;IAAI,gBAAG;IAAI,eAAE;IAAO,UAAA;KAC/B,oBAAC,UAAD;MAAQ,IAAG;MAAI,IAAG;MAAK,GAAE;KAAO,CAAA;KAChC,oBAAC,UAAD;MAAQ,IAAG;MAAK,IAAG;MAAK,GAAE;KAAO,CAAA;KACjC,oBAAC,UAAK;MACN,IAAA;MACG,IAAA;;KAET,CAAA;KAES,oBAAe,QAAgD,EAAA,GAAA,aAAA,CAAA;KACvD,oBAAS,QAAO,EAAA,GAAA,6BAAA,CAAA;IACjC;GAEA,CAAA;EACE;EACA,SAAM,eAAe,QAAY;GACjC,OAAK,QAAO,MAAS,GAAA,CAAA,CAAA,GAAA,EAAY;EACjC;EACA,SAAI,YAAe,OAAI;GACvB,IAAM,UAAO,KAAK,GAAM,OAAA,KAAA;GACxB,MAAO,eAAe,KAAK,IAAK,GAAG,KAAK,OAAM,KAAA,IAAS,IAAE,KAAA,MAAA,KAAA,KAAA,IAAA,CAAA;GAC3D,IAAA,CAAA,OAAA,SAAA,YAAA,GAAA,OAAA,KAAA;GAEA,IAAA,eAAgB,GAAA,OAAuB;GACrC,IAAM,eAAc,IAAA,OAAW,GAAA,aAAA;GAC/B,MAAI,OAAA,KAAgB,MAAA,eAAkB,EAAA;GACtC,OAAM,OAAS,KAAA,GAAA,KAAY,KAAA,GAAU,KAAA,MAAA,OAAA,EAAA,EAAA;EACrC;EACA,SACE,qBAAC,EAAA,YAAD,KAAA;GAAM,MAAK,cAAA,WAAA;GAAU,IAAA,gBAAOE,KAAAA,GAAAA,OAAAA;GAA5B,MAAA,SAAA,YAAA,UAAA;GACE,MAAA,MAAA,YAAC,SAAD,YAAA,WAAA,YAAA,SAAA;GAAM,OAAOC,qBAAAA,QAAAA;IAAb,MAAA;IACE,OAAA;IAAM,UAAO;KAAKC,qBAAAA,QAAAA;MAA+B,OAAI;MAAmD,UAAA;OAAG,qBAAA,QAAA;QAAiB,OAAM;SAAY,GAAA;SAAS,GAAI,SAAA,+BAAuE,CAAA;;QAClO,UAAA,CAAA,oBAAA,iBAAA;SAAM,MAAOE;SAAb;QAA4C,CAAA,GAAA,EAAA,mBAA0B,YAAM,OAAA,CAAA;OAAE,CAAA;OAAe,qBAAA,QAAA;QAAQ,OAAA;QAAiF,UAAA;;SACrL;SAAiC,YAAOC;SAA8B,YAAA,eAAA,KAAA,IAAA,KAAA,MAAA,YAAA;QAAU;OAC7E,CAAA;;QACN,OAAA;QAAG,UAAM;OAAiB,CAAA;MAAgB;KAA0B,CAAA;KAAuC,oBAAA,KAAY;MAAS,MAAA,YAAA;MAChI,QAAA;MAAM,KAAOE;MAAb,OAAA;MACuD,UAAOC,YAAAA;KAAb,CAAA;KAAqDC,qBAAAA,QAAAA;MAA4B,OAAA;MAAmD,UAAE,CAAA,YAAyB,WAAA,KAAA,IAAA,oBAAA,QAAA,CAAA,CAAA,IAAA,qBAAA,QAAA;OAC9M,OAAA;OAAM,UAAOC,CAAAA,oBAAAA,QAAAA;QAAb,OAAA;QACQ,UAAA,YAAC,OAAD,MAAA,GAAA,CAAA,CAAA,CAAA,YAAA;OAAM,CAAA,GAAA,YAAOC,MAAAA;MAAb,CAAA,GAA+B,qBAAA,QAAW;;OAA4B,UAAA,CAAA,qBAAA,QAAA,EAAA,UAAA;QAAC,qBAAC,QAAD;SAAM,OAAOC;SAAb,UAAgC,CAAA,KAAE,WAAW,MAAM,aAAqB,CAAA;;QAAO;QAC/IC,qBAAAA,QAAAA;SAA2B,OAAA;SACpC,UAAA,CAAA,KAAA,WAAA,MAAA,aAAA,CAAA;QACF,CAAA;;QACF,OAAA;;OAEV,CAAA,CAAA;MAEA,CAAA,CAAA;KACE,CAAA;IACA;GACA,CAAA;EACA;EACE,SAAI,gBAAW,EAAY,YAAW,KAAA;GACtC,MAAA,CAAA,SAAW,cAAU,SAAA,KAAA;GACrB,MAAA,aAAe,OAAA;GACjB,MAAA,cAAA,WAAA;GACA,MAAM,aAAA;IACJ,IAAI,WAAW,YAAY,KAAA,GAAW,aAAa,WAAW,OAAO;IACrE,WAAW,UAAU,KAAA;IACnB,WAAW,IAAA;GACX;GACF,MAAM,sBAAA;IACR,IAAA,WAAA,YAAA,KAAA,GAAA,aAAA,WAAA,OAAA;IACA,WAAA,UAAsB,iBAAA;KACpB,WAAI,UAAW,KAAY;KACzB,WAAC,KAAA;IACL,GAAI,GAAA;GACJ;GAEI,sBAAOC;IACP,IAAA,WAAc,YAAA,KAAA,GAAA,aAAA,WAAA,OAAA;GACd,GAAA,CAAA,CAAA;GACA,IAAA,gBAAS,KAAA,GAAA,OAAA;GACT,OAAiB,qBAAA,QAAA;IACf,OAAK;IACP,cAAA;IAPF,cASG;IAAgB,SAAA;IAAoB,SAAA,UAAc;KAAe,IAAA,CAAA,MAAA,cAAA,SAAC,MAAA,aAAD,GAAA,cAAA;IAAkC;IAAe,UAAA,CAAA,UAAA,oBAAA,QAAA;KAAI,cAAA;KAAO,cAC9H;KACE,UAAkB,oBAAA,sBAAA;MAClB;MACA;KACA,CAAA;IAAS,CAAA,IAAGC,MAAAA,qBAAAA,KAAAA;KAAyB,MAAI,YAAY;KAAyD,QAAA;KAC9G,KAAA;KALF,OAAA;MAOI,GAAA;;KAEV;;;IAIA,CAAA,CAAA;GAQE,CAAA;EACA;;;EAGA,SAAO,eAAS,EAAA,WAAc,YAAe,SAAA,GAAe,gBAAU;GACtE,MAAO,cAAS,WAAc;GAC9B,MAAA,OAAA,aAAgB,UAAA;GAAE,MAAA,SAAW,aAAe;GAAY,MAAI,SAAU,aAAA;GAItE,MAAA,CAAA,SAAgB,cAAA,eAAA,eAAA,SAAA,CAAA;GACd,MAAK,CAAA,SAAY,cAAQ,SAAW,KAAA;GACpC,gBAAgB;IAChB,WAAa,eAA2B,SAAA,CAAA;GACtC,GAAA,CAAA,SAAO,CAAA;GAIP,gBAAe;IACf,IAAA,CAAM,WAAO,CAAA,QAAY,WAAA,WAAuB,KAAG,KAAA,iBAAiB,KAAA,GAAA;IAEpE,IAAI,YAAK;IACX,MAAA,OAAA,YAAA;KACK,MAAK,CAAA,UAAA,WAAA,MAAA,QAAA,IAAA,CAAA,wBAAA,WAAA,MAAA,CAAA,CAAA,YAAA,CAAA,CAAA,GAAA,WAAA,YAAA,kBAAA,WAAA,MAAA,CAAA,CAAA,YAAA,CAAA,CAAA,IAAA,QAAA,QAAA,CAAA,CAAA,CAAA,CAAA;KACV,IAAM,WAAQ;KAAyB,MAAK,OAAA,YAAA,cAAA,SAAA,GAAA,UAAA,OAAA;KAAK,IAAA,KAAA,WAAoB,KAAA,KAAA,aAAA,KAAA,QAAA,MAAA,GAAA,gBAAA,WAAA,KAAA,MAAA;IACrE;IACE,KAAA;IACA,MAAA,QAAc,kBAAK;KACrB,KAAA;IACC,GAAA,oBAAA;IAAC,aAAA;KAAQ,YAAA;KAAS,cAAA,KAAA;IAAQ;GAAM,GAAA;IAAS;IAAW;IAAa;IACpE;IACA;IACE;IACA;GACA,CAAA;GACF,IAAA,CAAA,QAAA,iBAAA,KAAA,GAAA,OAAA;GACA,MACE,eAAA;IAAS,MAAO,OAAK,CAAA;IAA0C,WAAK,IAAA;IAAM,kBAAS,WAAA,IAAA;GAAK;GACtF,OAAA,oBAAA,SAAC;IACC,OAAK,GAAA,EAAA,cAAA,EAAA,KAAA,EAAA,cAAA;IACL,MAAK;IACL,SAAA;IACA,UAAA;IACA,UAAO,oBAAA,UAAA;KACL,MAAGE;KACH,MAAI;KACJ,gBAAcE;KAChB,cAAA,EAAA,cAAA;KACA,OAAA;MAAiB,GAAA;MAAiB,GAAA,UAAA,0BAAA,CAAA;MAClC,GAAA,UAAc,4BAAA,CAAA;KAAE;KAAkB,eAAA;MAClC,WAAS,IAAA;KACP;KAEA,cAAM;MACR,WAAA,KAAA;KAEA;KAAK,UAAM,UAAA;MAAK,OAAO;MAAK,MAAA,cAAQ,KAAA;KAAY;KAAY,UAAO,qBAAA,OAAA;MAAe,OAAA;MAAkB,QAAA;MAAsB,SAAA;MAAuB,MAAA;MAAjJ,QAAA;;MAIM,eAAA;MACD,gBAAA;MAEb,eAAA;MAEA,UAAgB,CAAuB,oBAAA,QAAW,EAAA,GAAA,gEAK/C,CAAA,GAAA,oBAAA,QAAA,EAAA,GAAA,qCAAA,CAAA,CAAA;KACD,CAAA;IACA,CAAA;GACA,CAAA;EACA;EACA,SAAM,qBAAuC,EAAA,WAAA,YAAA,GAAA,gBAAA;GAC7C,MAAM,CAAA,MAAA,WAAqC,SAAA,KAAA;GAC3C,MAAA,CAAA,SAAA,cAAsB,SAAW,KAAS;GAC1C,MAAA,CAAA,QAAgB,aAAA,SAAA,CAAA,CAAA;GACd,MAAK,CAAA,OAAM,YAAA,SAAA;GACX,MAAM,WAAA,OAAA,IAAA;GACJ,MAAI,aAAM,OAAA;GACZ,sBAAA,WAAA,SAAA,MAAA,GAAA,CAAA,CAAA;GACA,gBAAS;IACT,IAAA,CAAA,MAAa;IAAE,MAAA,yBAA6B,UAAA;KAAsC,IAAA,MAAA,kBAAA,QAAA,SAAA,SAAA,SAAA,MAAA,MAAA,MAAA,MAAA,QAAA,KAAA;IACjF;IACH,SAAM,iBAAqB,eAAA,qBAAA;IACzB,aAAc;KACd,SAAY,oBAAA,eAAA,qBAAA;IACZ;GACA,GAAA,CAAA,IAAA,CAAA;GACA,MAAM,eAAc;IACpB,MAAA,OAAW,CAAA;IACX,QAAA,IAAW;IACX,IAAA,CAAA,MAAS;IACJ,WAAA,SAAkB,MAAA;IACrB,MAAA,UAAe,IAAA,gBAAA;IACf,WAAW,UAAK;IAClB,WAAI,IAAoB;IACtB,SAAI,KAAQ,CAAA;IACZ,kBAAS,WAAkB,YAAe,QAAA,MAAY,CAAA,CAAA,MAAA,UAAmB;KACzE,UAAW,KAAK;KACjB,WAAA,KAAA;IACH,IAAA,WAAA;KACA,IACE,QAAA,OAAA,SAAC;KAAK,SAAK,kBAAA,QAAA,OAAA,UAAA,EAAA,kBAAA,CAAA;KAAU,WAAOC,KAAAA;IAA5B,CAAA;GACU;GAAc,OAAOC,qBAAAA,QAAAA;IAAgC,KAAA;IAAuB,OAAA;IAAqB,UAAA,CAAc,oBAAA,UAAsB;KAAG,MAAA;KAC9I,OAAA;KAAY,iBAAS;KAA6B,iBAAK;KAAS,cAAA,EAAA,sBAAA;KAC1D,SAEN;KAAM,UAAK,oBAAA,YAAA;MAAS,OAAA,EAAA,0BAA+B;MAAG,MAAOC;KAA7D,CAAA;IACE,CAAA,GAAA,OAAC,qBAAD,QAAA;KAAQ,MAAA;KAAsC,cAAE,EAAA,iBAAiB;KAAU,OAAA;KAC1E,UAAU;MAAaE,oBAAAA,UAAAA;OAA8B,OAAA;OAA6B,UAAI,EAAA,iBAAA;MACtF,CAAA;MAAmC,UAAK,oBAAA,QAAA;OAAQ,OAAOC;OAA+B,UAAA,EAAA,mBAAA;MAAY,CAAA,IAAA;MAClG,UAAW,KAAA,IAAA,OACT,oBAAA,QAAD;OAAuB,MAAOC;OAA9B,OAAA;OAEY,UAAOC;MAA8B,CAAA;MAAiB,OAC5D,KAAA,UAAA,qBAAA,QAAA;OAAG,OAAM;OAAY,UAAO,CAAA,MAAA,SAAA,KAAA,IAAA,oBAAA,QAAA;QAAS,OAAI;QAAsB,UAAOA,MAAAA;OAA8B,CAAA,IAAM,oBAAA,KAAA;QAAQ,MACrH,MAAM;QAAyC,QAAOC;QAA8B,KAAA;QACjF,OAAA;QALK,UAMZ,MAAA;OACC,CAAA,GAAA,MAAW,gBAAU,KAAa,IAAA,OAAsB,oBAAA,QAAA;QAAM,OAAOJ;QAA8B,UAAE,MAAA;OAAyB,CAAA,CAAI;MACnI,GAAA,MAAA,IAAA,CAAA;MACS,CAAA,WAAK,UAAA,KAAA,KAAA,OAAA,WAAA,IAAA,oBAAA,QAAA;OAAS,OAAOK;OAA4B,UAAA,EAAA,iBAAe;MAAE,CAAA,IAAA;MAA2C,iBAAa,KAAA,KAAA,OAAA,SAAA,IAAA,oBAAA,UAAA;OAAE,MAAA;OAAI,OAAA;OAA2B,eACjK;QACA,aAAA,oBAAA,MAAA,CAAA;QACJ,QACA,KAAA;;OAEV,UAAA,EAAA,eAAA;MAWA,CAAA,IAAgB;KAMd;IACA,CAAA,IAAM,IAAA;GACN,CAAA;EACA;EACA,SAAM,oBAAoB,EAAA,WAAc,YAAA,GAAA,gBAAA;GACxC,MAAA,CAAA,QAAA,aAAsB,SAAW;GACjC,MAAA,aAAgB,OAAA;GACd,MAAI,cAAQ,WAAW;GACvB,MAAM,OAAQ,aAAA;GACd,MAAA,SAAa,WAAa,cAAK;GACjC,sBAAmB,WAAe,SAAA,MAAA,GAAA,CAAA,CAAA;GAClC,gBAAI;IAEJ,IAAM,QAAA,WAAyB,KAAA,KAAA,OAAA,UAAA,KAAA,GAAA;IAC7B,MAAA,QAAW,iBAAe,UAAA,KAAA,CAAA,GAAA,IAAA;IAC1B,aAAU,aAAA,KAAA;GAAE,GAAA,CAAA,QAAS,OAAA,QAAA,MAAA,CAAA;GAAM,IAAA,gBAAY,KAAA,KAAA,YAAA,UAAA,UAAA,SAAA,KAAA,KAAA,WAAA,aAAA,QAAA,WAAA,UAAA,QAAA,UAAA,GAAA,OAAA;GAAO,MAAA,mBAAA;IAC9C,WAAM,SAAc,MAAA;IACpB,UAAW;KACN,SAAA;KACH,YAAU;IAAE,CAAA;IAAgB,MAAA,UAAY,IAAA,gBAAA;IAAO,WAAA,UAAqB;IAAa,4BAAA,WAAA,QAAA,MAAA,CAAA,CAAA,MAAA,YAAA;KACnF,UAAI;MACF,SAAK;MAAoC,YAAS;MAAO,aAAY,QAAA;KAAO,CAAA;IAAyE,IAAA,WAAA;KACtJ,IAAA,CAAA,QAAA,OAAA,SAAA,UAAA;MACH,SAAA;MACA,YAAM;MACA,OAAA,kBAAuB,QAAM,OAAA,UAAA,EAAA,kBAAA;KACjC,CAAA;IACA,CAAA;GACA;GACF,MAAA,oBAAA;IACA,IAAM,QAAA,eAA4B,MAAA;IAChC,WAAY,SAAA,MAAgB;IAC5B,WAAQ,UAAe,KAAG;IAC1B,UAAU,KAAA,CAAA;GAAE;GAAY,MAAA,sBAAY;IAAM,IAAA,QAAA,gBAAA,KAAA,KAAA,OAAA,YAAA;IACrC,MAAA,EAAA,OAAA,QAAwB,GAAA,YAAW;IACtC,UAAQ;KACR,GAAA;KACA,YAAS;IACT,CAAA;IACA,wBAAY,WAAA;KACX,QAAK;KACN,aAAU,OAAA;KACR,SAAG;KACH,iBAAY;KACZ,YAAW;IACZ,CAAA,CAAA,CAAA,MAAA,WAAA;KACH,UAAI;MACF,GAAA;MAAY,YAAG;MAAS,GAAA,OAAY,cAAA,KAAA,KAAA,OAAA,UAAA,SAAA,IAAA,EAAA,WAAA,OAAA,UAAA,IAAA,EAAA,QAAA,OAAA,OAAA;KAAO,CAAA;IAAyE,IAAA,WAAA;KACrH,UAAA;MACH,GAAA;MACA,YAAgB;MAChB,OACE,kBAAA,QAAA,OAAA,UAAA,EAAA,kBAAA;KACE,CAAA;IAAQ,CAAA;GAAc;GAAuC,MAAA,UAAc,QAAA,WAAA,KAAwB,KAAA,QAAA,cAAA,KAAA;GAAG,OAAY,qBAAA,YAA0B,EAAA,UAAA;IAAE,qBAAA,UAAA;KAAM,MAAO;KAAQ,OAAO;KAA+B,cAAS,EAAA,wBAAA;KAAlN,OAAA,GAA8N,EAAA,0BAAiB;;MAC9O,OAAW;KAA0B,CAAA,EAAA,KAAA,EAAA,wBAAA;KAAyCE,SAAAA;KAA2B,UAAA,CAAA,KAAA,MAAA;IAC1G,CAAA;IAAO,WAAU,KAAA,IAAA,OAAA,oBAAA,SAAA;KAAiC,2CAAiB;KAAwC,UAAM;IAAsB,CAAA;IAA+B,oBAAA,OAAA;KAA2B,WAAY;KAAiB,kBAAe;KAA0C,MACrR,WAAA,KAAA;KAAK,SAAOC;KAAZ,OAAA,EAAA,wBACG;KAAO,YAAK,EAAA,YAAA;KAAS,aAAO,EAAA,+BAAA,EAAA,KAAA,CAAA;KAAE,QAAGC,qBAAAA,OAAAA;MAAe,OAAGC;MAAuB,UAAA,CAAA,oBAAA,UAAA;OAAG,MAAA;OAAuC,OAAS;QAAc,GAAA;QAC3I,GAAC;OAAkB;OAAc,UAAO,QAAA,eAAA;OAAE,SAAGC;OAAsB,UAAGD,UAAAA,EAAAA,UAAAA,IAAAA,EAAAA,YAAAA;MAAuB,CAAA,GAAA,CAAA,UAAA,oBAAA,UAAA;OAAG,MAAA;OAAwG,OAAS;QAAgB,GAAA;QAA6E,GAAI;;OAGpT,UAAA,QAAW,YAAY,QAAO,QAAA,eAAA,QAAA,QAAA,gBAAA,KAAA;OAAK,SAAOE;OAAZ,UAAA,QAAA,eAAA,OAAA,EAAA,gBAAA,IAAA,EAAA,aAAA;MAC7B,CAAA,IAAA,IAAA;KAAK,CAAA;KAAL,UAAA,WACE,KAAA,IAAA,OAAA,qBAAA,OAAA;MAAQ,OAAA;MAAiC,UAAO;OAAhD,qBAAA,OAAA;QAAoE,OAAA;QAAkD,UAAA,CAAA,qBAAA,UAAA;SAAW,OAAA;SAAa,OAAA,YAAA;SAC9I,UAAA;UAAM,WAAOG,UAAAA,EAAAA,yBAAAA;UAA4B;UAA8B;SAAM;QAAe,CAAA,GAAA,oBAAA,QAAA;SACzF,OAAA;;UACJ;UAAwC,OAAOC;SAA0B,CAAA;QAAyE,CAAA,CAAA;OAClJ,CAAA;OACC,OAAA,WAAA,KAAC,IAAD,OAAA,oBAAA,KAAA;QAAG,OAAOC;QAAyB,UAAA,EAAE,6BAA2B,EAAA,QAAA,OAAA,OAAA,MAAA,GAAA,CAAA,EAAA,CAAA;OAAK,CAAA;OACrE,OAAA,cAAC,KAAD,IAAA,OAAA,qBAAA,YAAA,EAAA,UAAA;QAAWC,oBAAAA,KAAAA;SAA4B,OAAA;SAA6D,UAAA,EAAA,2BAAA;QACnG,CAAA;QACc,oBAAA,MAAA;SAAS,OAAOC;SAAiC,UAAA,OAAe,UAAA,KAAA,SAAA,oBAAA,MAAA,EAAA,UAAA,KAAA,GAAA,IAAA,CAAA;QAAE,CAAA;QAAoE,iBAAY,KAAA,IAAA,OAAA,oBAAA,UAAA;SAAE,MAAA;SAAI,OAAA;SAAqC,eAAA;UAE5M,aAAA,uBAAA,MAAA,OAAA,aAAA,CAAA,CAAA,CAAA;UACD,YAAiB;SAAsB;SAAa,UAAOC,EAAAA,yBAAAA;QAAwB,CAAA;OAAgB,EAAA,CAAA;OACjG,OAAA,UAAA,KAAA,IAAA,OAAA,oBAAA,KAAA;;QACA,OAAA;QACP,UAAA,OAAA;OAEN,CAAA;MAEa;KAAmD,CAAA;IAAS,CAAA;GAAU,EAAA,CAAA;EAAQ;EAW3F,MAAA,gBAAgB;GAKd;GACA;GACA;EACA;EACA,SAAA,wBAAiC,EAAA,WAAS,YAAW,KAAA;GAGrD,MAAA,CAAA,UAAgB,eAAA,SAAA,KAAA;GACd,MAAI,CAAA,QAAQ,aAAW,SAAe;GACtC,MAAM,aAAQ,OAAA;GACd,MAAA,cAAa,WAAkB;GACjC,sBAAmB,WAAe,SAAA,MAAA,GAAA,CAAA,CAAA;GAClC,gBAAI;IACJ,IAAM,QAAA,WAAa,QAAwC,OAAA,UAAA,KAAA,GAAA;IACzD,MAAA,QAAW,iBAAe,UAAA,KAAA,CAAA,GAAA,IAAA;IAC1B,aAAY,aAAK,KAAA;GACjB,GAAA,CAAA,QAAU,OAAA,QAAA,MAAA,CAAA;GAAE,IAAA,gBAAA,KAAA,KAAA,YAAA,UAAA,UAAA,YAAA,SAAA,WAAA,aAAA,MAAA,OAAA;GAAQ,MAAA,aAAS,WAAA;IAAM,WAAY,SAAA,MAAA;IAAO,YAAA,KAAA;IACtD,UAAM;KACN;KACK,SAAA;KACH,YAAU;IAAE,CAAA;IAAQ,MAAA,UAAS,IAAA,gBAAA;IAAO,WAAA,UAAY;IAAO,4BAAqB,WAAA,QAAA,MAAA,CAAA,CAAA,MAAA,YAAA;KAAa,UAAA;MACvF;MACF,SAAK;MAAoC,YAAA;MAAQ,aAAS,QAAA;KAAO,CAAA;IAAmB,IAAA,UAAO;KAAgE,IAAA,CAAA,QAAA,OAAA,SAAA,UAAA;MAC5J;MACH,SAAA;MACA,YAAM;MACA,OAAA,iBAAuB,QAAM,MAAA,UAAA,EAAA,kBAAA;KACjC,CAAA;IACA,CAAA;GACA;GACF,MAAA,oBAAA;IACA,IAAM,QAAA,eAA2B,MAAA;IAC/B,WAAY,SAAA,MAAgB;IAC5B,WAAQ,UAAe,KAAG;IAC1B,UAAU,KAAA,CAAA;GAAE;GAAY,MAAA,qBAAY;IAAM,IAAA,QAAA,gBAAA,KAAA,KAAA,OAAA,YAAA;IACrC,MAAA,EAAA,OAAA,QAAwB,GAAA,YAAW;IACtC,UAAQ;KACR,GAAA;KACA,YAAS;IACT,CAAA;IACA,wBAAoB,WAAA;KACnB,QAAA;KACD,aAAU,OAAA;KAAE,SAAG;KAAS,iBAAY;KAAO,aAAQ,OAAA;IAAM,CAAA,CAAA,CAAA,WAAA;KAC3D,UAAI;MACF,GAAA;MAAY,YAAG;MAAS,QAAA;KAAmB,CAAA;IAAuE,IAAA,UAAA;KACnH,UAAA;MACH,GAAA;MACA,YAAoC;MAAmC,OAAA,iBAAA,QAAA,MAAA,UAAA,EAAA,kBAAA;KAAQ,CAAA;IAA2D,CAAA;GAC1I;GACA,MACE,QAAA,cAAA,KAAA,YAAA;IACE,IAAA;IAAM,OAAM,EAAA,aAAA,QAAA;GAAiB,EAAA;GAAO,MAAA,SAAW,QAAe,WAAqC;GAAG,OAAe,qBAAY,YAAK,EAAA,UAAA;IAAS,oBAAA,MAAA;KAAM,MAAA;KAAO;KAClJ,WAAK,OAAA,UAAA,EAAA;KAAS,eAAOC,YAAAA,KAAAA;KAA+B,OAAA;KAAsC,QAAA;KAAqB,QAAe,qBAAA,UAAA;MAAU,MAAA;MAAhJ,OAAA;;MACC,iBAAA;MACF,iBAAuB;MAAc,eAAA,aAAA,UAAA,CAAA,KAAA;MAAyCd,UAAAA,CAAAA,EAAAA,aAAAA,GAAAA,oBAAAA,0BAAAA,CAAAA,CAAAA,CAAAA;KAA2B,CAAA;IAC1G,CAAA;IAAO,WAAU,KAAA,IAAA,OAAA,oBAAA,SAAA;KAAiC,2CAAiB;KAAwC,UAAM;IAAsB,CAAA;IAA+B,oBAAA,OAAa;KAAG,WAAY;KAAiB,kBAAe;KAAyB,MACzP,WAAA,KAAA;KAAK,SAAOC;KAAZ,OAAA,EAAA,aACE;KAAQ,YAAK,EAAA,YAAA;KAAS,aAAO,EAAA,sBAAA;KAAE,QAAGC,qBAAAA,OAAAA;MAAe,OAAGC;MAAuB,UAAA,CAAA,oBAAA,UAAA;OAAG,MAAA;OAAuC,OAAS;QAAc,GAAA;QAC3I,GAAC;OAAiB;OAAc,UAAO,QAAA,eAAA;OAAE,SAAGC;OAAsB,UAAGD,SAAAA,EAAAA,UAAAA,IAAAA,EAAAA,YAAAA;MAAuB,CAAA,GAAA,CAAA,SAAA,oBAAA,UAAA;OAAG,MAAA;OAAwG,OAAS;QAAe,GAAA;QAA6E,GAAI;;OAGlT,UAAA,QAAW,YAAY,QAAO,QAAA,eAAA,QAAA,QAAA,gBAAA,KAAA;OAAK,SAAOE;OAAZ,UAAA,QAAA,eAAA,OAAA,EAAA,gBAAA,IAAA,EAAA,aAAA;MAC7B,CAAA,IAAA,IAAA;KAAK,CAAA;KAAL,UAAA,WACE,KAAA,IAAA,OAAA,qBAAA,OAAA;MAAQ,OAAA;MAAiC,UAAO;OAAhD,qBAAA,OAAA;QAAoE,OAAE;QAAgD,UAAA,CAAA,qBAAA,UAAA;SAAI,OAAA;SAAyD,OAAA,YAAA;SACnL,UAAA;UAAM,EAAA,gBAAOG,EAAAA,QAAAA,YAAAA,OAAAA,CAAAA;UAA4B;UACtC,YAAA,cAAA,EAAA,mBAAA;;QACL,CAAA,GAAC,oBAAD,QAAA;SAAG,OAAOE;SAAyB,UAAA,EAAA,aAAY,OAAA,QAAA;QAAS,CAAA,CAAA;OACvD,CAAA;OAAmBD,oBAAAA,KAAAA;QAA0B,OAAA;QAA2D,UAAI,YAAA;OAC5G,CAAA;OAAuC,SAAK,oBAAA,KAAA;QAAQ,OAAOI;QAAwB,UAAA,EAAA,sBAAO,EAAA,QAAA,YAAA,OAAA,CAAA;OAAS,CAAA,IAAA;OACjG,OAAA,UAAA,KAAA,IAAA,OAAA,oBAAA,KAAA;;QACA,OAAA;QACP,UAAA,OAAA;OAEN,CAAA;MAEA;KACE,CAAA;IACA,CAAA;GACA,EAAA,CAAA;EACA;EACA,SAAI,uBAAqB,EAAS,WAAA,aAA0B,qBAAO,GAAA,UAAA,gBAAA;GACnE,MAAM,QAAS,aAAW,UAAa,MAAA,KAAS,UAAA,EAAA,UAAwB,IAAA;GACxE,MAAM,UAAA,aAAyB,UAAA,MAAA,KAAA,UAAA,EAAA,YAAA,IAAA;GAC/B,MAAM,aAAS,qBAAuB,UAAA,KAAA;GACtC,MAAM,aAAY,WAAS;GAC3B,IAAM,SAAA,CAAA,WAAa,SAAW,eAAS,KAAA,GAAA,OAAA;GACvC,MAAM,SAAW,WAAW,aAAW,OAAA,EAAa,oBAAW,IAAa,WAAS,UAAa,EAAA,yBAAgB;GAClH,MAAM,cAAU,WAAW;GAC3B,MAAM,SAAA,aAAc,UAAiB;GACrC,MAAI,YAAW,SAAW,YACxB,YACE,QAAA,IAAC,KAAD;GAAK,MAAOE,aAAAA,WAAAA,SAAAA;GACV,MAAA,WAAA,WAAA,WAAA,KAAA,KAAA,WAAA,aAAA,SAAA,aAAA,KAAA,WAAA,aAAA;GAAK,MAAA,UAAOC,WAAAA,SAAAA,KAAAA,MAAAA,WAAAA,KAAAA,YAAAA,KAAAA,WAAAA,KAAAA,YAAAA;GAAZ,MAAA,cAAA,iBAAA,WAAA,UAAA;GACE,IAAA,WAAA,WAAC,SAAD,OAAA,oBAAA,OAAA;IAAM,OAAA;IAAgC,UAAA,qBAAC,OAAA;KAAwB,OAAA;KAC/D,UAAA;MAAaE,oBAAAA,QAAAA;OAA2B,OAAA;OAAkG,UAAA,oBAAA,iBAAA,CAAA,CAAA;MACzI,CAAA;MAAmC,oBAAA,QAAA;OAA0B,OAAK;OAAW,UAAI,WAAA,WAAA,mBAAA,EAAA,kBAAA,IAAA,EAAA,uBAAA;MAC/E,CAAA;;OACF,OAAA,EAAA,uBAAA;OAGT,MACE;MAAK,CAAA,IAAOH;KACV;IAAK,CAAA;GAAS,CAAA;GAAyB,OAAaI,oBAAAA,OAAAA;IAAiC,OAAA;IAArF,UAAA,qBAAA,OAAA;KACE,OAAA;MAAM,GAAA;MAAS,GAAGF,SAAAA,sBAAAA,CAAAA;KAAyB;KAAiD,UAAA;MAAG,oBAAA,QAAA;OAAyC,OAAA;QACxI,GAAA;QAA6B,GAAA,SAAA,yBAAA,CAAA;OAAe;OAAI,UAAA,oBAAA,iBAAA,EAAA,OAAA,CAAA;MAC/C,CAAA;MAAsDI,oBAAAA,iBAAAA;OAA0B;OAAwC;MACzH,CAAA;MAAM,WAAOC,WAAAA,KAAAA,IAAAA,OAAAA,oBAAAA,QAAAA;OAA0B,OAAA;OAAa,UAAA,eAAA,WAAA,MAAA;MACnD,CAAA;MAA4CC,oBAAAA,QAAAA;OAA4B,OAAA;OAA8B,UAAI;MAC3G,CAAA;MAAM,WAAOC,aAAAA,OAAAA,oBAAAA,QAAAA;OAAb,OAAA;OACG,UAAA,EAAA,oBAAc;MAAY,CAAA,IAAA;MAAwC,qBAAA,QAAA;OAAW,OAAI;OACjF,UAAW;QACF,cAAK,oBAAA,YAAA;SAAS,OAAO,EAAA,uBAAA;SAAE,MAAGC;QAAoB,CAAA,IAAI;QAAuC,WAAA,WAAA,qBAAA,UAAA;SAAG,MAAA;SAAmB,OAAA;UAAvH,GAAA;UAEU,GAAA,SAAO,mBAA+B7C,CAAAA;SAA5C;SACA,SAAA;SAAM,cAAO,EAASgD,UAAAA;SAAtB,UAAkE,CAAA,WAAE,WAAgB,SAAgB,KAAA,IAAA,qBAAA,YAAA,EAAA,UAAA,CAAA,qBAAA,QAAA;UACpG,OAAI,SACL,eAAW;UAAM,UAAO,CAAA,KAASC,WAAAA,KAAwBC,SAAAA;SAA9C,CAAA,GAAkE,qBAAA,QAAiB;UAA0B,OACnH,SAAA,kBAAA;UACN,UAAA,CAAA,KAAA,WAAA,KAAA,SAAA;SACH,CAAA,CAAA,EAAA,CAAA,IAAA,MAAgB,WACf,qBAAA,QAAA;UAAM,OAAOC,SAAAA,iBAAAA;UAAb,UAAA,CAAA,KAAA,aAAA,IAAA,aAAA,EAAA;SACE,CAAA,IAAA,IAAA;QAAM,CAAA,IAAA;QAAmC,gBAAY,KAAA,IAAA,OAAA,SAAA,qBAAA,QAAA;SAAQ,OAAA;SAC5D,UAAE;UACY,oBAAA,QAAmB;WAAM,OAAOE;WAAb,eAA4C;;UAC1E,EAAA,wBAAA;UACJ,cAAA,KAAA,IAAA,OAAA,qBAAA,QAAA;WACD,OAAA;WACoC,UAAA,CAAA,MAAA,EAAA,uBAAA,EAAA,KAAA,UAAA,CAAA,CAAA;UAAW,CAAA;SAAmC;QAAG,CAAA,IAAsB,qBAAA,YAAmB,EAAA,UAAa;SAAK,YAC7I,WAAY,YAA2B,oBAAA,sBAAA;UACrC;UACA,YAAM,YAAY;UACnB;UACJ,GAAA,iBAAuB,KAAA,IAAS,CAAA,IAAA,EAAO,aAAA;SACtC,CAAA,IAAA,YAAS,WAAoB,SAAA,OAA6C,oBAAA,YAAA;UAC1E,OAAM,EAAA,oBAAuB,YAAa,QAAA;UAC3C,MAAA,YAAA,WAAA,YAAA,YAAA;SACD,CAAA;SAA2B,YAAA,WAAA,SAAA,OAAA,oBAAA,YAAA;UAAuB,OAAA,EAAA,oBAAA,YAAA,QAAA;UAAqB,MAAA,YAAA,WAAA,aAAA,YAAA,YAAA,WAAA,sBAAA,UAAA;SAAY,CAAA;SAAQ,oBAAiB,gBAAmB;UAAkB;UACjJ;UAAgC;UAAuB;UAAe,GAAA,iBAAA,KAAA,IAAA,CAAA,IAAA,EAAA,aAAA;SAAG,CAAA;SAA2D,oBAAA,qBAAA;UACpI;UAAoC;UAAuB;UAAe,GAAA,iBAAA,KAAA,IAAA,CAAA,IAAA,EAAA,aAAA;SAAI,CAAA;SAC9E,oBAAA,yBAAA;UACE;;UACH;;QACF,EAAA,CAAA;OAET;;;;GCrjBA,CAAA;EACE;;;EAKE,SAAQ,SAAA,OAAA;GACR,OAAA,UAAa,QAAA,OAAA,UAAA,YAAA,CAAA,MAAA,QAAA,KAAA,IAAA,QAAA,KAAA;EACb;EAAW,eAAQ,KAAA,MAAA,WAAA,MAAA;GAAoB,MAAA,WAAgB,MAAA,MAAA,GAAA,6BAAA,KAAA,aAAA,mBAAA,SAAA,KAAA;IAAmB,QAAA;IAC1E,aAAW;IACZ,SAAA;KACD,QAAM;KACF,gBAAc;IAChB;IACA,MAAM,KAAI,UAAa,IAAA;GACzB,CAAA;GACA,MAAO,QAAA,MAAA,SAAA,KAAA;GACT,IAAA,CAAA,SAAA,IAAA;IAEA,MAAA,QAAsB,SAAA,KACpB;IAIA,MAAM,IAAA,MAAUC,OADFA,OAAAA,YAAkB,WAAI,MAAW,UACjB,gCAAO;GACrC;GACA,OAAO;EACT;EAEA,eAAsB,iBAAA,WAAoB,SAA8C;GACtF,MAAM,UAAK,SAAW,SAAa,MAAI,KAAA,IAAA,WAAA,OAAA,CAAA,CAAA,EAAA,OAAA;GACzC,IAAA,YAAA,KAAA,KAAA,OAAA,QAAA,OAAA,UAAA,MAAA,IAAA,MAAA,kCAAA;GAEA,OAAA;EACE;EACF,eAAA,oBAAA,WAAA,IAAA;;;;GClBA,MAAgB,KAAA,UAAA,WAAuB,CAAA,CAAA;EAErC;;;EAKO,SAAM,uBAAA,SAAA;GAAK,OAAO,GAAA,QAAA,KAAA,MAAA,GAAA,CAAA,CAAA,GAAA,EAAA,KAAA,QAAA,KAAA,GAAA,QAAA;EAAK;EAAoB,SAAK,cAAA;GAAO,OAAO,oBAAA,OAAA;IAAe,OAAA;IAAkB,QAAA;IAAsB,SAAA;IAAuB,MAAA;IAC/I,QAAA;IACG,aAAA;IAET,eAAA;IAEA,gBAAoB;IAClB,eACE;IAAK,UAAM,oBAAA,QAAA,EAAA,GAAA,2GAAA,CAAA;GAAK,CAAA;EAAY;EAAoB,SAAK,WAAA;GAAO,OAAO,oBAAA,OAAA;IAAe,OAAA;IAAkB,QAAA;IAAsB,SAAA;IAAuB,MAAA;IAC/I,QAAA;IACG,aAAA;IAET,eAAA;IAEA,gBAAS;IACP,eACE;IAAK,UAAM,oBAAA,QAAA,EAAA,GAAA,iDAAA,CAAA;GAAK,CAAA;EAAY;EAAoB,SAAK,YAAA;GAAO,OAAO,oBAAA,OAAA;IAAe,OAAA;IAAkB,QAAA;IAAsB,SAAA;IAAuB,MAAA;IAC/I,QAAA;IACG,aAAA;IAET,eAAA;IAEA,gBAAS;IAKP,eACE;IACE,UACE,oBAAC,QAAD,EAAA,GAAA,yGAAA,CAAA;GAAM,CAAA;EAAN;EACQ,SAAOE,YAAAA,EAAAA,SAAAA,GAAAA,YAAAA;GAAgC,OAAA,oBAAA,WAAuB;IAAe,QAClF,qBAAA,QAAD;KAAQ,OAAK;KAAS,UAAOC,CAAAA,oBAAAA,QAAAA;MAAgC,OAAA;MAAsC,UAAA,uBAAkC,OAAA;KAAG,CAAA,GAAA,oBAAA,UAAA;MACpI,MAAA;;MAER,cACE,EAAA,qBAAA;MAAM,eAAOC,SAAAA,QAAAA,EAAAA;MAAb,UACE;KAAM,CAAA,CAAA;IAAN,CAAA;IAA6C,SAAQ,qBAAA,QAAA;KAAK,OAAA;KAAI,UAAQ,CAAmB,qBAAA,QAAA;MAA0G,OAAA;MACnM,UAAA;OAAG,QAAOE;OAAgC;OACtC,QAAA,SAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,QAAA,KAAA,CAAA,IAAA,EAAA,wBAAA,EAAA,MAAA,QAAA,KAAA,CAAA;;KAER,CAAA,GAAa,oBAAA,KAAA;MACd,OAAA;MAEL,UAAA,QAAA;;IAGA,CAAA;IACE,aAAM;GACN,CAAA;EACA;;EAEA,SAAM,qBAA+B,EAAA,qBAAA,GAAA,WAAA,cAAA;GACnC,MAAA,aAAc,qBAAA,UAAgB,KAAQ;GACjC,MAAA,CAAA,YAAoB,iBAAe,+BAAY,IAAA,IAAA,CAAA;GAClD,MAAA,YAAc,WAAY,kBAAA,CAAA,EAAA,CAAA,QAAA,YAAA,CAAA,WAAA,IAAA,QAAA,EAAA,CAAA;GACxB,IAAA,CAAA,WAAa,SAAQ,SAAQ,WAAA,GAAA,OAAA;GAC7B,MAAK,UAAS,OAAA;IACd,eAAO,6BAAA,IAAA,IAAA,CAAA,GAAA,UAAA,EAAA,CAAA,CAAA;IACR,oBAAA,WAAA,EAAA,CAAA,CAAA,YAAA;KACF,eAAA,aAAA;MACH,MAAA,OAAA,IAAA,IAAA,QAAA;MACA,KAAM,OAAA,EAAA;MACJ,OAAM;KACN,CAAA;IACK,CAAA;GACH;GACE,MAAA,iBAAqB;IACrB,MAAK,MAAM,SAAM,KAAK,YAAc,QAAA,EAAA;IACpC,eAAO,6BAAA,IAAA,IAAA,CAAA,GAAA,UAAA,GAAA,GAAA,CAAA,CAAA;IACR,oBAAA,SAAA,CAAA,CAAA,YAAA;KACF,eAAA,aAAA;MACH,MAAA,OAAA,IAAA,IAAA,QAAA;MACA,KACE,MAAA,MAAA,KAAA,KAAC,OAAD,EAAA;MAAK,OAAOC;KAAZ,CAAA;IACS,CAAA;GAAuCC;GAAiC,OAC/E,qBAAC,OAAD;IAAK,OAAOC;IAAZ,UAAA,CAAA,oBAAA,SAAA;KACE,yCAAA;KAAM,UAAOC;IAA0B,CAAA,GAAA,qBAAA,OAAC;KAAoB,OAAA;KAC3D,UAAS;MAAsD,oBAAA,QAAA;OAAY,OAAA;OAAG,UAAU,oBAAA,aAAA,CAAA,CAAA;MAAS,CAAvD;MAC3C,SAAA,KAAA,YAAA,oBAAA,aAAA;OAAM;OAAN;OAEY,UAAK;MAAS,GAAA,QAAWE,EAAAA,CAAAA;MAA2C,qBAAA,QAAA;OAAuB,OAAA;OAAyD,UAAA,CAAA,eAAA,KAAC,IAAA,OAAU,oBAAA,UAAA;QAAS,MAElL;QAAQ,WAAK;QAAS,cAAWA,EAAAA,oBAAAA;QAA6B,eAAc,WAAA,EAAA,yBAAqB,CAAA;QAAG,UAAS,oBAAA,UAAA,CAAA,CAAA;OAAU,CAAA,GAAA,oBAAA,UAAC;QACpH,MAAA;;QACH,cAAA,EAAA,qBAAA;QACF,SAAA;;OAET,CAAA,CAAA;;;;GC1EA,CAAA;EAEE;;;EAKA,SAAI,eAAA,MAAA;GACJ,OAAI,gCAAmB,KAAA,IAAA,CAAA,GAAA;EACvB;EACE,SAAI,iBAAoB,OAAA;GACxB,MAAM,QAAA,CAAU;GAChB,IAAA;GACE,IAAA,QAAA,CAAA;GACA,MAAA,cAAmB;IACnB,IAAA,SAAW,KAAQ,GAAA;IACnB,MAAO,UAAA,MAAA,QAAA,SAAA,CAAA,KAAA,WAAA,aAAA,KAAA,CAAA,KAAA,WAAA,QAAA,KAAA,CAAA,KAAA,WAAA,MAAA,KAAA,CAAA,KAAA,WAAA,MAAA,CAAA;IACR,MAAA,KAAA;KACH;KACA,WAAW,QAAQ,QAAY,SAAQ,KAAG,WAAA,GAAA,CAAA,CAAA,CAAA;KACxC,WAAM,QAAW,QAAA,SAAmB,KAAA,WAAA,GAAA,CAAA,CAAA,CAAA;KACpC,OAAI;IACF,CAAA;GACA;GACA,KAAA,MAAS,QAAI,MAAA,MAAA,QAAA,GAAA;IACf,MAAO,WAAI,eAA0B,IAAA;IACvC,IAAA,aAAA,KAAA,GAAA;KACA,MAAM;KACN,OAAO;KACT,QAAA,CAAA,IAAA;IASA,OAAgB,IAAA,SAAA,KAAgB,GAAuD,MAAA,KAAA,IAAA;GACrF;GACA,MAAI;GACJ,OAAI;EACJ;EACA,SAAK,gBAAqB,OAAA;GACxB,MAAM,WAAO,CAAA;GACb,IAAI,UAAS;GACX,IAAA,UAAM;GACN,IAAI;GACc,KAAA,MAAS,QAAA,OAAU;IAAmC,MAAM,OAAA,+CAAA,KAAA,IAAA;IAAa,IAAA,SAAA,MAAA;KAE3F,MAAA,UAAU,OAAA,KAAA,EAAA;KACV,IAAA,mBAAwB,KAAA,KAAA,UAAA,gBAAA,SAAA,KAAA;MACxB,MAAA,GAAA,UAAiB,eAAiB;MAClC,MAAS;KAAO,CAAA;KAAM,UAAM;KAAQ,UAAA,OAAA,KAAA,EAAA;KACpC,iBAAA,UAAA,OAAA,KAAA,MAAA,CAAA;KACF,SAAA,KAAA;MACI;MACF,MAAS;KAAO,CAAA;KAAM;IAAa;IAAS,IAAA,KAAA,WAAA,GAAA,GAAA;KAC5C,SAAW,KAAA;MACb;MACE,MAAS;MAAO;KAAM,CAAA;KAAgB,WAAA;IAAS,OAAA,IAAA,KAAA,WAAA,GAAA,GAAA;KAC/C,SAAW,KAAA;MACb;MACE,MAAS;MAAO;KAAM,CAAA;KAAiB,WAAA;IAAS,OAAA;KAAS,SAAA,KAAA;MACzD;MACA,MAAA;MACF;MACF;KACA,CAAA;KACF,WAAA;;IAQA;GACE;GACqD,OAAM;EAAe;;EAE1E,SAAU,qBACR,OAAO;GAA4C,IAAA,MAAM,SAAM,SAAA,MAAA,SAAA,WAAA,OAAA,MAAA,YAAA,KAAA,IAAA,KAAA,IAAA;IAAS,MAAM,MAAA;IAAM,MAAA;GAGxF;GAEA,IAAA,MAAS,SAAW,UAAO,OAAU,MAAA,YAAkG,KAAA,IAAA,KAAA,IAAA;IACrI,MAAM,MAAQ;IAGd,MAAM;GAGN;EAAY;EAAoC,SAAO,SAAA,EAAA,OAAA,UAAA,aAAA;GAAE,MAAGM,QAAAA,MAAAA,SAAAA,QAAAA,cAAAA,MAAAA,SAAAA,WAAAA,iBAAAA,MAAAA,SAAAA,UAAAA,MAAAA,SAAAA,cAAAA,eAAAA;GAAiB,MAAG,aAAA,MAAA,YAAA,KAAA,KAAA,MAAA,YAAA,KAAA,IAAA,KAAA,MAAA,YAAA,KAAA,IAAA,OAAA,MAAA,OAAA,IAAA,MAAA,YAAA,KAAA,IAAA,OAAA,MAAA,OAAA,IAAA,OAAA,MAAA,OAAA;GAAM,OAAA,qBAAA,OAAA;IAA/E,WAAA;IAAkF,OAAA;KAAQ,GAAA;KAAc,GAAA;IAA0C;IAAmC,UAAA;KAA+B,oBAAA,UAAA;MAAW,MAAA;MAAS,WAAA;MAAC,UAAA,cAAC,KAAD;MAAM,cAAOE;MAAwB,SAAA;MAAiB,UAAA;KAAC,CAAA;KAAaC,oBAAAA,QAAAA;MAAwB,OAAA;MAA0G,UAAA;KAAC,CAAA;KAA6G,oBAAA,QAAA;;MACtiB,UAAA,MAAA,SAAA,QAAA,MAAA,MAAA,SAAA,WAAA,MAAA,MAAA,SAAA,cAAA,MAAA;KAcA,CAAA;KACe,oBAAW,QAAA,EAAS,UAAA,MAAa,SAAA,cAAA,MAAA,OAAA,MAAA,KAAA,MAAA,MAAA,SAAA,SAAA,IAAA,CAAA,EAAA,CAAA;IAC9C;GACW,CAAA;EAAT;EACU,SAAK,gBAAA,EAAA,MAAA,eAAA,GAAA,UAAA,YAAA,cAAA,YAAA,cAAA,mBAAA;GAAS,MAAA,CAAOE,MAAAA,WAAAA,SAAAA,aAAAA;GAAuB,OAAe,qBAAA,WAAA;IAAM,OAAA;IAAzE,UAAA,CAAA,qBAAA,UAAA;KACE,MAAA;KAAM,OAAO;KAAE,iBAAGC;KAAgB,eAAWC,SAAAA,UAAsB,CAAA,KAAA;KAAG,UAAA;MAAG,oBAAA,QAAA;OAAO,OAAA;QAChF,GAAA;QAAM,GAAA,OAAOC,cAAAA,CAAAA;OAAsB;OAAgB,UAAA;MACnD,CAAA;MAAaC,oBAAAA,QAAAA;OAAb,OAAA;OAAyC,UAAOC,KAAAA;MAAb,CAAA;MAAqD,qBAAA,QAAC;OAAK,OAAOC;OAAb,UAAgC,CAAO,qBAAgB,QAAA;QAAO,OAAA;;OAChJ,CAAA,GAAA,qBAAA,QAAA;QACP,OAAO;QAAK,UAAOC,CAAAA,KAAAA,KAAAA,SAAAA;OAAkB,CAAA,CAAA;MACpC,CAAA;KACA;IACA,CAAA,GAAA,OAAuB,oBAAA,OAAW;KAClC,OAAM;KACN,UACE,gBAAA,KAAC,KAAA,CAAD,CAAA,KAAA,OAAA,UAAA;MACE,MAAA,SAAA,qBAAA,KAAA;MAAiB,MAAA,eAAA,WAAA,KAAA,IAAA,CAAA,IAAA,SAAA,QAAA,YAAA,QAAA,SAAA,OAAA,QAAA,QAAA,SAAA,OAAA,IAAA;MAAO,MAAA,iBAAY,WAAkB,KAAA,IAAA,CAAA,IAAA,WAAA,QAAA,YAAA,QAAA,SAAA,OAAA,QAAA,QAAA,SAAA,OAAA,IAAA;MAAG,MAAA,aAAW,WAAW,KAAY,KAAA,iBAAkB,KAAa,KAAM,aAAA,SAAA,OAAA,QAAA,aAAA,SAAA,OAAA;MAAI,OAAA,qBAAA,UAAA,EAAA,UAAA;OAClH,oBAAA,UAChB;QAAsB;QAAtB,UACE,EAAA,kBAAC;QAAI,WAAOE,WAAAA,KAAAA,IAAAA,KAAAA,UAAAA,aAAAA,MAAAA;OAAZ,CAAA;OAEU,aAAK,KAAA,YAAA,qBAAA,OAAA;QAAS,OAAOC;QAAgC,UAAA,CAAc,qBAAA,OAAqB;SAAG,OAAA;SAA4C,UAAA,CAAA,oBAAA,QAAA,EAAA,UAAA,QAAA,SAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,QAAA,KAAA,CAAA,IAAA,EAAA,wBAAA,EAAA,MAAA,QAAA,KAAA,CAAA,EAAA,CAAA,GAAA,oBAAA,UAAA;UAC5I,MAAA;UACL,OAAA;UAAG,cAAOC,EAAAA,qBAAAA;UAA6B,eAAQ,gBAAA,QAAA,EAAA;UAC5C,UAAA;SANK,CAAA,CAAA;QAQX,CAAA,GAAmB,oBAAA,KAClB;SAA8B,OAAOH;SAArC,UACE,QAAA;QAAK,CAAA,CAAA;OAAL,GAAA,QACE,EAAA,CAAA;OAAM,eAAOI,KAAAA,YAAAA,qBAAAA,OAAAA;QAAb,OAAA;QACA,UAAA,CAAC,qBAAD,OAAA;SAAG,OAAM;SAAa,UAAO,CAAA,qBAAA,QAAA;UAAS,OAAI;UAAsB,UAAOC,CAAAA,cAAAA,QAAAA,MAAAA;SAA0B,CAAA,GAAY,oBAAQ,KAAA;UAAK,MAAA,QAAA;UACvH,QAAA;UACL,KAAA;UAAG,OAAOF;UAA6B,cAAA,QAAQ;UAC5C,UAAA;SANK,CAAA,CAAA;QAQX,CAAA,GAAa,oBAAa,KAAA;SApBd,OAAG;SAuBrB,UAAA,QAAA;QAAW,CAAA,CAAA;;OAGlB,aAAA,aAAA;MAYA,EAAA,GAAgB,GAAA,MAAA,GAAY,MAA8B,MAAyC;KAIjG,CAAA;IACF,CAAA,IAAA,IAAA;GAIA,CAAA;EAGE;EACA,SAAM,YAAc,QAAS,GAAA;GAC7B,QAAM,WAAY,WAAY,EAAA,YAAW,IAAA,WAAA,gBAAA,EAAA,gBAAA,IAAA,WAAA,SAAA,EAAA,UAAA,IAAA,WAAA,aAAA,EAAA,aAAA,IAAA,WAAA,kBAAA,EAAA,kBAAA,IAAA,EAAA,cAAA,EAAA,CAAA,QAAA,WAAA,EAAA;EACzC;EACA,SAAM,6BAAoB,YAAyB;GACnD,MAAO,QAAA,YAAA,WAAA,WAAA,WAAA,aAAA;GACL,MAAA,cAAU,SAAA,WAAA,UAAA;GACV,MAAA,YAAe,YAAe,WAAA,KAAA;GAC9B,MAAA,qBAAQ,YAAA,aAAA,UAAA;GACR,MAAA,WAAc,SAAA,cAAe,WAAa,aAAc,UAAA,WAAA,SAAA,KAAA;GACxD,OAAA;IACA,UAAA;IACF,eAAA,eAAA;IACF,QAAA;IAEA,cAAS,eAAmB,aAAA,aAAA,CAAA;IAC1B,YACE,SAAA,sBAAA,YAAA,aAAA,UAAA;IAAK,iBAAM,SAAA,sBAAA,YAAA,UAAA,SAAA,YAAA,cAAA,KAAA;GAAK;EAAY;EAAoB,SAAK,mBAAA;GAAe,OAAY,oBAAA,OAAA;IAC9E,OAAA;IACG,QAAA;IAET,SAAA;IAEA,MAAgB;IACd,eAAM;IACN,UAAmB,oBAAW,QAAA,EAAA,GAAA,gHAAA,CAAA;GAC9B,CAAA;EACA;EACA,SAAO,gBAAU,EAAA,qBAA6B,GAAA,WAAA,WAAA,cAAA,iBAAA,gBAAA;GAC9C,MAAO,aAAQ,qBAAyC,UAAA,KAAA;GACxD,MAAO,aAAS,WAAc;GAC9B,MAAO,OAAA,YAAiB;GACxB,MAAO,QAAS,cAAc,iBAAW,MAAA,SAAA,EAAA,GAAA,CAAA,MAAA,KAAA,CAAA;GACzC,MAAO,CAAA,UAAQ,eAAa,SAAW,KAAA;GACvC,MAAO,CAAA,QAAA,aAAY,SAAiB;GACpC,MAAO,CAAA,SAAO,cAAY,SAAa,EAAA;GACvC,MAAO,CAAA,iBAAe,sBAAoB,SAAiD,IAAA;GAC3F,MAAO,CAAA,SAAA,cAAc,SAAmB,EAAA;GACxC,MAAO,CAAA,QAAA,aAAa,SAAkB,EAAA;GACtC,MAAO,CAAA,YAAc,iBAAA,SAAmB,EAAiB;GACzD,MAAO,CAAA,OAAA,YAAe,SAAA,IAAA;GACtB,MAAO,CAAA,eAAA,oBAAmB,SAAwB;GAClD,MAAM,CAAA,cAAA,mBAA2C,SAAA,EAAA;GACjD,MAAO,CAAA,aAAY,kBAAiB,SAAgD,KAAA;GACpF,MAAM,CAAA,cAAa,mBAAY,SAAa;GAC5C,MAAA,CAAA,eAAgB,oBAAA,SAAA,CAAA,CAAA;GACd,MAAA,CAAA,mBAAgB,wBAAA,+BAAA,IAAA,IAAA,CAAA;GAChB,MAAI,mBAAe,OAAW;GAC9B,MAAM,CAAA,YAAa,iBAAI,SAAgB,CAAA,CAAA;GAClC,MAAA,aAAA,YAAwB,aAAW,UAAY,SAAiB,WAAO,YAAA,SAAqB,KAAS;GAC1G,gBAAa;IAAE,cAAW,CAAA,CAAM;IAAE,IAAA,eAAA,KAAA,GAAA;IACjC,MAAC,aAAY,IAAU,gBAAA;IAG1B,wBAAM,WAA8C,YAAA,WAAA,MAAA,CAAA,CAAA,KAAA,qBAAA,KAAA,CAAA;IACpD,aAAM;KACJ,WAAA,MAAA;IACA;GACA,GAAI,CAAA,YAAY,SAAQ,CAAA;GACxB,MAAM,uBAA6B,OAAM;GACzC,MAAO,cAAA,aAAA,YAAA;IACP,qBAAqB,SAAA,WAAqB;IAC1C,qBAAiB,UAAO,KAAA;IACxB,IAAA,YAAA,QAAqB,OAAU,mBAAA,aAAA;IAC9B,MAAE,eAAA,QAAA,MAAA,YAAA,8BAAA,GAAA,QAAA,YAAA,GAAA;IACL,OAAA;IACA,MAAM,WAAc,IAAA,eAAkB,MAAA;IACpC,SAAI,QAAQ,OAAA;IACZ,qBAAiB,UAAe;GAChC,GAAA,CAAA,CAAA;GACA,sBAAmB,qBAAA,SAAA,WAAA,GAAA,CAAA,CAAA;GACrB,MAAI,cAAkB,kBAAC;IAGvB,IAAA,QAAA,eAAgB,MAAA;IACd,iBAAY,SAAW,MAAa;IACpC,iBAAc,UAAW,KAAA;IACzB,UAAA,KAAa,CAAA;GACf,GAAG,CAAA,QAAA,UAAA,CAAA;GAAC,gBAAA;IAAa,IAAA,QAAQ,WAAA,KAAA,KAAA,OAAA,UAAA,KAAA,KAAA,OAAA,mBAAA,KAAA,GAAA;IAAQ,MAAQ,QAAA,WAAA,aAAA,IAAA;IAAO,aAAQ,aAAA,KAAA;GAAe,GAAA;IACvE;IACE,QAAA;IACA,QAAA;IACA,QAAU;GAAE,CAAA;GAAQ,MAAA,aAAS,aAAA,WAAA;IAAM,iBAAY,SAAA,MAAA;IAAO,YAAA,KAAA;IACtD,UAAW;KACX;KACA,SAAY;KACZ,YAAc;IACd,CAAA;IACA,WAAM,EAAA;IACN,WAAA,EAAA;IACK,UAAA,EAAA;IACH,cAAA,EAAA;IACA,SAAI,IAAA;IACF,MAAA,aAAU,IAAA,gBAAA;IAAE,iBAAA,UAAA;IAAQ,4BAAA,WAAA,WAAA,MAAA,CAAA,CAAA,KAAA,OAAA,YAAA;KAAS,mBAAS,QAAA,eAAA,QAAA,YAAA;KAAO,IAAA,WAAY,QAAA;MAAO,UAAA;OAChE;OACF;OACA,SAAU;OAAE,YAAA;MAAQ,CAAA;MAAS;KAAe;KAAmB,UAAA;MAC/D;MACA;MACA,SAAW;MACX,YAAU;KACV,CAAA;KAAY,MAAA,YAAA,MAAA,sBAAA,WAAA,QAAA,aAAA,WAAA,MAAA;KAAQ,WAAA,SAAA;KAAS,WAAS,SAAA;KAAO,UAAA,YAAY,UAAA,kBAAA,WAAA;KAAO,UAAA;MAC/D;MACD;MAA4C,SAAA;MAAQ,YAAS;KAAO,CAAA;IAAmB,CAAA,CAAA,CAAA,OAAO,UAAA;KAAgE,IAAA,CAAA,WAAA,OAAA,SAAA,UAAA;MAC/J;MACC,SAAA;MACJ,YAAgB;MACV,OAAA,iBAAoB,QAAc,MAAO,UAAW,EAAA,kBAAkB;KAC1E,CAAA;IACA,CAAA;GAAY,GAAG,CAAA,WAAA,CAAA,CAAA;GAAS,MAAA,UAAY,YAAA,YAAA;IAAM,IAAA,QAAA,YAAA,KAAA,KAAA,OAAA,WAAA,UAAA,QAAA,KAAA,CAAA,CAAA,WAAA,GAAA;IAC1C,MAAI,EAAA,OAAA,QAAA,GAAA,YAAA;IACF,UAAM;KACJ,GAAA;KACA,YAAa;IACb,CAAA;IACA,IAAA;KACA,MAAI,SAAO,MAAW,wBAAc,WAAA;MAAE,QAAA,OAAA;MAAS,aAAA,OAAA,QAAA;MAAQ;MAAqD;MAAM,GAAK,OAAA,WAAA,cAAA;OACxH;OACD;OAAe,GAAA,WAAA,KAAA,MAAA,KAAA,CAAA,IAAA,EAAA,WAAA;OAAQ;MAAmB,IAAA,CAAA;KAAuB,CAAA;KAA2F,UAAA;MAC9J,GAAA;MACE,YAAM;MACN,QAAU,OAAA;MAAE,GAAG,OAAA,mBAAA,KAAA,IAAA,CAAA,IAAA,EAAA,gBAAA,OAAA,eAAA;KAAQ,CAAA;IAAmB,SAAO,OAAA;KAAgE,MAAI,kBAAoB,OAAY,UAAO,YAAQ,UAAgB,QAAA,YAAA,SAAA,OAAA,MAAA,WAAA,WAAA,MAAA,SAAA,KAAA;KAAI,UAAA;MAC1L,GAAA;MACC,YAAA;MAAC,OAAA,iBAAA,QAAA,MAAA,UAAA,EAAA,kBAAA;MAAY,GAAA,oBAAA,KAAA,IAAA,CAAA,IAAA,EAAA,QAAA,gBAAA;KAAQ,CAAA;IAAO;GAAiB,GAAA;IAAS;IAAQ;IAAS;IAAW;IAAE;IACvF;IACE;IAAmB;IAAM;GAAW,CAAA;GACpC,MAAA,oBAAkB,aAAA,MAAA,WAAA;IAClB,iBAAgB;KACd;KACJ,GAAM;IACJ,CAAA;IACA,gBAAkB,EAAA;IAClB,gBAAgB,KAAS,CAAA;GAC3B,GAAK,CAAA,CAAA;GACL,MAAM,qBAAgB,kBAAwB;IAC5C,iBAAI,KAAkB,CAAA;IACtB,gBAAe,EAAI;IACnB,gBAAgB,KAAS,CAAA;GACzB,GAAI,CAAA,CAAA;GACF,MAAM,gBAAgB,YAAA,YAAiB;IACrC,IAAA,kBAAoB,KAAA,KAAA,aAAA,KAAA,CAAA,CAAA,WAAA,KAAA,aAAA;IACpB,eAAM,IAAA;IACN,gBAAM,KAAc,CAAA;IACpB,IAAA;KACD,MAAA,UAAA,MAAA,iBAAA,WAAA;MACD,MAAA,cAAiB;MACjB,MAAA,cAAmB;MACrB,MAAS,cAAO;MACd,MAAA,aAAgB,KAAA;KAClB,CAAA;KACE,kBAAoB,SAAA,CAAA,GAAA,MAAA,OAAA,CAAA;KACtB,mBAAA;IACC,SAAA,OAAA;KAAC,gBAAA,iBAAA,QAAA,MAAA,UAAA,EAAA,qBAAA,CAAA;IAAoB,UAAA;KAAa,eAAA,KAAA;IAAc;GAAe,GAAA;IAAW;IAAE;IAC/E;IACE;IACK;IACH;GACE,CAAA;GACA,MAAK,gBAAS,aAAA,OAAA;IACd,sBAAO,6BAAA,IAAA,IAAA,CAAA,GAAA,UAAA,EAAA,CAAA,CAAA;IACR,oBAAA,WAAA,EAAA,CAAA,CAAA,YAAA;KACF,sBAAA,aAAA;MACC,MAAA,OAAU,IAAA,IAAA,QAAA;MAId,KAAA,OAAgB,EAAA;MACd,OAAM;KACN,CAAA;IAGA,CAAA;GACE,GAAA,CAAA,SAAa,CAAC;GACd,gBAAY;IACb,MAAA,YAAA,IAAA,KAAA,WAAA,kBAAA,CAAA,EAAA,CAAA,KAAA,YAAA,QAAA,EAAA,CAAA;IACA,kBAAY,SAAe,KAAA,MAAA,YAAA,UAAA,IAAA,QAAA,EAAA,CAAA,IAAA,KAAA,QAAA,YAAA,CAAA,UAAA,IAAA,QAAA,EAAA,CAAA,IAAA,IAAA;IAC9B,sBAAuB,aAAc;KACnC,MAAM,OAAA,CAAA,GAAA,QAAA,CAAA,CAAA,QAAa,OAA2B,UAAA,IAAA,EAAA,CAAA;KAC9C,OAAK,KAAM,WAAW,SAAW,OAAA,WAAmB,IAAG,IAAA,IAAO;IAC9D,CAAA;GACA,GAAA,CAAK,WAAM,cAAM,CAAA;GACjB,MAAO,iBAAW,cAAQ;IACzB,MAAA,yBAAA,IAAA,IAAA;IAAC,KAAA,MAAA,WAAA,WAAA,kBAAA,CAAA,GAAA,OAAA,IAAA,QAAA,IAAA,OAAA;IAAe,KAAA,MAAW,WAAA,eAAA,OAAA,IAAA,QAAA,IAAA,OAAA;IAAgB,KAAA,MAAA,MAAA,mBAAA,OAAA,OAAA,EAAA;IAAkB,OAAA,CAAA,GAAA,OAAA,OAAA,CAAA;GAChE,GAAA;IACA;IACE,WAAK;IACJ;GAAC,CAAA;GAAc,sBAAA,iBAAA,SAAA,MAAA,GAAA,CAAA,CAAA;GAAM,gBAAW;IAAO,IAAA,CAAA,WAAY,SAAA,YAAA,WAAA,WAAA,SAAA,KAAA,GAAA,aAAA;GAAO,GAAA;IAC7D;IACA;IACA,WAAM;IACN,YAAM;GACN,CAAA;GACE,IAAA,CAAA,WAAA,SAAA,YAAA,WAAA,WAAA,SAAA,KAAA,GAAA,OAAA;GAAE,MAAI,SAAA,WAAA,aAAA,OAAA,EAAA,oBAAA,IAAA,WAAA,UAAA,EAAA,yBAAA;GAAU,MAAA,eAAqB,6BAAA,UAAA;GAAG,MAAA,qBAAwB,aAAA,aAAA,aAAA,kBAAA,aAAA,WAAA,aAAA;GAAU,MAAA,YAAA;IAC1E;KAAE,IAAI;KAAe,OAAS,EAAA,YAAA;KAAmB,UAAW,CAAA,aAAa;IAAe;IACxF;KAAE,IAAI;KAAQ,OAAS,EAAA,gBAAU;KAAG,UAAW,CAAA,aAAa;IAAQ;IACpE;KAAE,IAAI;KAAa,OAAS,EAAA,UAAA;KAAiB,UAAW,CAAA,aAAa;IAAa;IACpF;KACA,IAAM;KACN,OAAM,EAAA,cAA+B;KAC9B,UAAOH,CAAAA,aAAAA;IAAZ;GACE;GACE,MAAA,YAAWM,QAAAA,WAAAA,KAAAA,KAAAA,OAAAA,UAAAA,KAAAA;GACX,MAAA,oBAAOC,kBAAAA,KAAAA,IAAAA,OAAAA,qBAAAA,OAAAA;IACP,OAAO;IACP,UAAA;KACe,oBAAA,YAAA;MACf,WAAA;MACA,OAAA;MACD,OAAA;MACA,WAAA;MAAgC,aAAOC,EAAAA,0BAAAA;MAA0B,WAAA;MAAgB,WAAI,UAAA,gBAAA,MAAA,cAAA,KAAA;KACtF,CAAA;KAAK,iBAAOC,KAAAA,IAAAA,oBAAAA,KAAAA;MAAZ,OAAA;MACU,UAAK;KAAS,CAAA,IAAA;KAAgD,qBAAA,OAAA;MAAqB,OAAA;MAAiC,UAC5H,CAAC,oBAAA,UAAD;OAAQ,MAAK;OAAS,OAAO;OAAE,SAAGC;OAAgC,UAAGC,EAAAA,qBAAAA;MAA+B,CAAA,GAAA,oBAAA,UAAA;OAAG,MAAA;OAA2D,OAAA;QAAsC,GAAA;QACrM,GAAA;;OACF,UAAA,eAAA,aAAA,KAAA,CAAA,CAAA,WAAA;;OAEP,UACE,EAAA,qBAAA;MACE,CAAA,CAAA;KAAO,CAAA;IAAP;GAAgDC,CAAAA;GAAqBC,OAAAA,qBAAAA,YAAAA,EAAAA,UAAAA;IAA2BC,qBAAAA,SAAAA;KAA6B,2CAAA;;MAC7H;MAAK;MAAS;KAAqB;IAAgD,CAAA;IAAnF,qBAAA,OAAA;KACE,OAAA;MAAQ,GAAA;MAAR,GAAA,YACE,qBAAC,CAAA;KAAI;KAAL,UAAA;MAAoC,qBAAC,UAAD;OAAM,OAAA;OAAiC,UAAA,CAAA,qBAAA,OAAA;QAAa,OAAA;QAAC,UAAA;SAAkB,oBAAA,QAAA;UAAO,OAAA;UAAO,UAAA;SAAC,CAAA;SAAaM,oBAAAA,QAAAA;UAAyB,eAAE;UAAyB,UAAA;SAAM,CAAA;SACjM,oBAAA,QAAA;UAAK,OAAOC;UAAZ,UAAA,EAAA,iBAAA;SACE,CAAA;QAAK;OAAL,CAAA,GACE,qBAAA,OAAC;QAAO,OAAK;QAAS,UAAO;SAAKE,qBAAAA,OAAAA;UAAyB,OAAI;UAAyD,UAAA,CAAA,oBAAA,UAAA;WAAG,MAAA;WAAmC,OAAA;YAAsC,GAAA;YACpM,GAAA,aAAA,YAAA,CAAA,IAAA;WAAM;WAAgB,UAAO,CAAA,aAAA;WAAW,eAAW,WAAe,QAAA;WAAE,UAAI,EAAA,YAA0C;UAAuC,CAAA,GAAA,oBAAA,MAAA;WAAG,MAAA;WAAmC,OAAM;WAAM,WAAA,OAAA;YAAO,IAAA,aAChN,KAAA,WAAC,EAAD;WAAQ;WAAc,eAAO,YAAA,KAAA;WAAE,OAAGE;WAA6B,QAAI;WAAqD,QAAA,oBAAA,UAAA;YAAG,MAAA;YAA+B,OAAA;aAAiC,GAAA;aAAyB,GAAA,qBAAe,CAAY,IAAA;YAAkB;YAAoC,UAAA,CAAA;YAEpS,cAAA,EAAA,gBAAA;;YACJ,eAAoB,aAAK,UAAiB,CAAA,KAAA;YACjC,UAAK,oBAAA,0BAAA,CAAA,CAAA;WAAS,CAAA;UAAoC,CAAA,CAAA;SAA4B,CAAA;SAAiE,WAAA,SAAe,KAAA,iBAAa,KAAA,IAAiC,qBAAA,UAAA;UAApN,MAAA;UACO,OAAM;UAAK,OAAO,EAAA,gBAAA;UAAK,cAAQ,EAAA,oBAAA,EAAA,OAAA,WAAA,OAAA,CAAA;UAAY,eAAK,aAAA,sBAAA,UAAA,CAAA;UAAO,UAAO,CAAA,oBAAA,OAAA;WAAe,OAAA;WAAkB,QAAA;WAAsB,SAAA;WAAuB,MAAA;WAC/I,QAAA;WACG,aACO;WAEZ,eAAA;WACJ,gBAAC;WAAO,eAAK;WAAS,UAAWE,oBAAAA,QAAAA,EAAAA,GAAAA,2GAAAA,CAAAA;UAA6B,CAAA,GAAA,WAAY,MAAA;SAAkD,CAAA,IAAA;SAA2B,oBAAA,UAAY;UAA2D,MAAA;UAC9N,WAAA;UAAQ,cAAK,YAAA,EAAA,aAAA,IAAA,EAAA,cAAA;UAAS,SAAWA;UAA6B,UAAA,YAAyB,oBAAA,kBAAA,CAAA,CAAA,IAAA,oBAAA,yBAAA,CAAA,CAAA;SAAG,CAAA;SAAuB,oBAAA,UAAC;UAA6B,MAAA;UAC5I,WAAA;UACC,cAAA,EAAA,WAAA;;UACR,UAAA,oBAAA,oBAAA,CAAA,CAAA;SAAK,CAAA;QAAL;OACE,CAAA,CAAA;MACA,CAAA;MAAa9B,qBAAAA,OAAAA;OAAb,OAAA;;QACA,oBAAC,QAAD,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,KAAA,MAAA,CAAA,EAAA,CAAA;QAAaC,qBAAAA,QAAAA;SAAb,OAAA;;QACG,CAAA;;SACL,OAAA;SAAK,UAAK,CAAA,KAAA,KAAA,SAAA;QAAa,CAAA;OAAvB;MACuB,CAAA;MAA6B,qBAAA,OAAe;OAAK,KAAI;OACjD,OAAOiC;OAAmB,UAAA,CAAE,KAAA,YAAW,oBAAA,KAAA;QAAK,OAAI;QAG/D,UAAA,EAAA,eAAA;OACN,CAAA,IAAA,MAAA,MAAe,WAAU,IAAA,oBAAA,KAAA;QACtB,OAAA;QACH,UAAU,EAAA,WAAe;OACzB,CAAA,IAAA,MAAY,KAAA,MAAW,UAAkB,oBAAQ,iBAAkB;QACnE;QACA,eAAY,UAAA;QACZ;QACA,UAAA,eAAiB,QAAA,YAAA,QAAA,SAAA,KAAA,IAAA;QATZ,YAYN,WAAA,QAAA,YAAA,QAAA,SAAA,KAAA,IAAA;;QACF,YAAA;;QACL,iBAAC;OAAM,GAAA,KAAU,IAAA,CAAA,CAAA;MAAiC,CAAA;KAAyD;IAA4B,CAAA;IAA6B,qBAAW,OAAc;KAA+C,WAAY;KAAiB,kBAAe;KAA2B,MACjT,WAAA,KAAA;KAAK,SAAOC;KAAZ,OAAA,WACE,KAAA,IAAA,EAAA,YAAA,IAAA,YAAA,OAAA,QAAA,CAAA;KAAQ,YAAK,EAAA,YAAA;KAAS,aAAO,EAAA,wBAAA;KAAE,QAAGC,qBAAAA,OAAAA;MAAe,OAAGC;MAAuB,UAAA,CAAA,oBAAA,UAAA;OAAG,MAAA;OAAuC,OAAS;QAAc,GAAA;QAC3I,GAAC;OAAoB;OAAc,UAAO,QAAA,eAAA;OAAE,SAAGC;OAAsB,UAAGD,YAAAA,EAAAA,UAAAA,IAAAA,EAAAA,YAAAA;MAAuB,CAAA,GAAA,CAAA,YAAA,oBAAA,UAAA;OAAG,MAAA;OAA2J,OAAA;QAAgC,GAAA;QAA6E,GAAI;;OAHnX,UAAA,QAAA,YAAA,QAAA,QAAA,eAAA,QAAA,QAAA,YAAA,KAAA,KAAA,OAAA,WAAA,UAAA,QAAA,KAAA,MAAA;OAMG,eAAQ,KAAY,QAAO;OAAG,UAAOE,QAAAA,eAAAA,OAAAA,EAAAA,gBAAAA,IAAAA,EAAAA,aAAAA;MAAyB,CAAA,IAAA,IAAA;KAA8B,CAAA;KAC5F,UAAQ;MAA6B,QAAOC,YAAAA,OAAAA,oBAAAA,KAAAA;OAAZ,OAAA;OAC/B,UAAA,EAAA,uBAAA;MAAK,CAAA,IAAA;MAAL,QAAA,YAAkC,KAAA,IAAA,qBAAA,OAAA;OAAQ,OAAA;OAAiC,UAAO;QAAwB,qBAAO,OAAW;SAE1F,OAAC;SAAM,UAAOG,CAAAA,oBAAAA,UAAAA;UAA4B,OAAA;UAEL,OAAA,OAAA,QAAA;;SACtE,CAAA,GAAkB,oBAAS,QAAA;UACrB,OAAOC;UAAwB,UAAA,OAAO,WAAQ,SAAA,EAAgB,iBAAc,EAAA,OAAA,OAAA,QAAC,oBAAD,GAAA,OAAA,QAAA,gBAAA,OAAA,KAAA,OAAA,QAAA,gBAAA,OAAA,CAAA,IAAA,EAAA,aAAA,EAAA,OAAA,OAAA,QAAA,MAAA,OAAA,CAAA;SAAuB,CAAA,CAAA;QAAvB,CAAA;QAA0D,OAAA,WAAOE,SAAAA,qBAAAA,YAAAA,EAAAA,UAAAA,CAAAA,oBAAAA,OAAAA;SAA0B,OAAO;SAAiB,UAAA,OAAO,QAAA,gBAAA,KAAA,WAAA,qBAAA,OAAA;UAAc,OAAC;UAAM,UAAOH,CAAAA,oBAAAA,QAAAA;WAA4B,OAAA;WAAoC,OAAA,OAAA;WAA5M,UAA4M,OAAC;UACxS,CAAA,GAAC,oBAAA,QAAD;WAAG,OAAOJ;WAAyB,UAAE,OAAA,KAAA,MAAA,GAAqB,CAAA;UAC1D,CAAA,CAAA;SACA,GAAA,OAAA,IAAA,CAAA;QAAK,CAAA,GAAOK,oBAAAA,KAAAA;SAAwB,OAAA;SAAsD,UAAOC,EAAAA,qBAAAA;QAA5B,CAAA,CAAA,EAAA,CAAA,IAAkD,qBAAA,YAAA,EAAA,UAAA;SAAaC,oBAAAA,OAAAA;UAA0B,OAAO;UAAY,UAAA,OAAK,QAAA,MAAA,KAAA,SAAA,qBAAA,OAAA;WAAW,OAAC;WAAM,UAAOH,CAAAA,oBAAAA,QAAAA;YAA4B,OAAA;YAA6J,OAAA,KAAA;YAAzT,UAA0T,KAAA;WAAO,CAAA,GAAA,oBAAA,QAAA;YAChZ,OAAA;YAAO,UAAOI,KAAAA,YAAAA,EAAAA,eAAAA,IAAAA,KAAAA,UAAAA,KAAAA,WAAAA,EAAAA,oBAAAA,IAAAA,KAAAA,SAAAA,EAAAA,YAAAA,IAAAA,EAAAA,cAAAA;WAAd,CAAA,CAAA;UAA+C,GAAA,KAAK,IAAA,CAAA;SAAW,CAAA;SAAqC,qBAAO,SAAQ;UAA6C,OAAA;UAAqE,UAAI,CAA8B,oBAAA,SAAA;;WACvQ,SAAA;WAAO,UAAOC,CAAAA,OAAAA,QAAAA,eAAAA,CAAAA,OAAAA,QAAAA;WAAd,WAAwC,UAAA,mBAAqB,MAAA,cAAC,OAAD;UAAU,CAAA,GAAA,EAAOC,qBAAAA,CAAAA;SAA0B,CAAA;SAA2B,qBAAA,SAAA;UAAK,OAAA;UAAmE,UAAA,CAAA,EAAA,mBAAA,GAAA,oBAAA,YAAA;;WAC3M,OAAA;WACD,WAAO;WACN,WAAA,UAAC,WAAD,MAAA,cAAA,KAAA;UAAO,CAAA,CAAA;SAAP,CAAA;QAA8D,EAAA,CAAA;QAAkC,OAAA,WAAO,cAAA,qBAAA,YAAA,EAAA,UAAA;SAAoB,qBAAA,SAAA;UAAK,OAAA;UAAmE,UAAA,CAAA,EAAA,aAAA,GAAA,oBAAA,SAAA;;WACnM,OAAA;WAAO,WAAOD;WAAd,WAAwC,UAAA,WAAc,MAAA,cAAC,KAAD;UAAO,CAAA,CAAA;SAAkC,CAAA;SAA8B,qBAAA,SAAA;UAAK,OAAA;UAAqC,UAAU,CAAA,EAAA,YAAS,GAAoB,oBAAA,SAAc;WAAiB,OAAA;;WAC7O,WAAA;WAAO,aAAOA,EAAAA,mBAAAA;WAAd,WAAwC,UAAA,cAAqB,MAAA,cAAC,KAAA;UAAS,CAAA,CAAA;SAAS,CAAA;SAAwC,qBAAA,SAAA;UAAI,OAAA;UAAG,UAAO,CAAA,EAAA,mBAAA,GAAA,oBAAA,YAAA;WAAQ,OAAA;YAAiB,GAAA;YAAkE,WAAA;;WACjO,OAAA;WAAO,WAAOD;WAAd,WAAwC,UAAA,UAAC,MAAD,cAAA,KAAA;UAAO,CAAA,CAAA;SAAgB,CAAA;SAA0B,qBAAS,SAAS;UAA+B,OAAI;;WAC9I,MAAI;WACL,SAAO;WAA0B,WAAOI,UAAAA,SAAAA,MAAAA,cAAAA,OAAAA;UAA0B,CAAA,GAAA,EAAA,aAAO,CAAA;SAEH,CAAA;QACtE,EAAA,CAAA,IAAO;QAAkC,OAAM,WAAO,KAAA,IAAA,oBAAA,KAAA;SAAgB,OAAO;SAAS,UAAI,OAAA,WAAA,SAAA,EAAA,qBAAA,EAAA,QAAA,OAAA,OAAA,MAAA,GAAA,CAAA,EAAA,CAAA,IAAA,EAAA,uBAAA,EAAA,QAAA,OAAA,OAAA,MAAA,GAAA,CAAA,EAAA,CAAA;QAAuB,CAAA,IAAA;QAAmB,OAAI,mBAAA,KAAA,IAAA,oBAAA,KAAA;SACtI,MAAA,OAAA;SAAI,QAAA;SACR,KAAQ;SAAyB,UAAK,EAAA,YAAA;QAAQ,CAAA,IAAOC;OAAvB;MAA6K,CAAA,IAAA;MACvM,QAAA,UAAA,KAAA,IAAA,qBAAA,KAAA;;OACP,OAAA;OAEN,UAAA,CAAA,OAAA,OAAA,OAAA,WAAA,KAAA,IAAA,KAAA,IAAA,EAAA,uBAAA,EAAA,QAAA,OAAA,OAAA,MAAA,GAAA,CAAA,EAAA,CAAA,GAAA;;;;GC1fA,EAAA,CAAM;EAEN;;;EAQE,MAAM,wBAAgB,OAAA,WAAA,cAAA,YAAA;EACtB,SAAI,wBAAuB,OAAA,OAAA,UAAA;GAC3B,OAAM,MAAA,QAAc,YAAQ,KAAA,cAAsB,wCAAA,MAAA;EAClD;EAIA,SAAM,gBAAkB,SAAW;GAEnC,MAAM,QAAA,QADO;GAEX,IAAI,UAAA,MAAY,OAAa,KAAK;GAClC,MAAO,cAAA,QAAA,sBAAA;GACT,MAAG,aAAS,MAAA,KAAA,MAAA,QAAA,CAAA,CAAA,QAAA,YAAA,YAAA,OAAA,CAAA,CAAA,KAAA,YAAA,QAAA,sBAAA,CAAA,CAAA,CAAA,QAAA,SAAA,KAAA,QAAA,KAAA,KAAA,SAAA,CAAA;GACZ,MAAI,kBAAyB,WAAO,QAAA,SAAA,KAAA,OAAA,YAAA,IAAA;GACpC,MAAM,aAAY,gBAAiB,SAAO,IAAA,kBAAgB,WAAA,CAAA,QAAA,SAAA,SAAA;IAC1D,IAAM,YAAW,KAAO,KAAA,KAAU,QAAM,KAAA,SAAe,QAAA,QAAA,QAAA,QAAA,OAAA;IACvD,OAAO;GACL,GAAA,KAAA,CAAA;GACA,IAAA,cAAA,KAAA,GAAA,OAAA,KAAA;GACA,MAAO,OAAK,KAAO,IAAA,GAAK,UAAI,OAAU,YAAO,IAAY;GACzD,MAAA,MAAa,KAAI,IAAG,GAAK,UAAI,MAAU,YAAQ,GAAA;GACjD,OAAA;IACF;IAEA;IACE,OAAM,KAAQ,IAAA,GAAQ,KAAA,IAAA,UAAA,OAAA,YAAA,QAAA,IAAA,CAAA;IACtB,QAAI,KAAU,IAAM,GAAA,KAAA,IAAA,UAAc,QAAA,YAAA,SAAA,GAAA,CAAA;GAClC;EACE;EACA,SAAI,uBAA6B,SAAI,UAAA;GACvC,MAAA,QAAA,QAAA;GACA,IAAA,UAAO,MAAA,aAAA,CAAA;GACP,MAAM,eAAW;IACjB,MAAA,OAAU,gBAAa,OAAA;IACvB,IAAK,SAAM,KAAA,GAAW,SAAW,IAAA;GACjC;GACA,OAAA;GAA2B,MAAA,WAAY,OAAA,mBAAA,cAAA,KAAA,IAAA,IAAA,eAAA,MAAA;GAAM,UAAW,QAAA,KAAA;GAAM,KAAA,MAAA,WAAA,MAAA,KAAA,MAAA,QAAA,GAAA,UAAA,QAAA,OAAA;GAC9D,MAAO,WAAA,OAAiB,qBAAgB,cAAA,KAAA,IAAA,IAAA,iBAAA,MAAA;GACxC,UAAA,QAAa,OAAA;IACX,YAAU;IACV,WAAU;GACV,CAAA;GACF,OAAA,iBAAA,UAAA,MAAA;GACF,aAAA;IAEA,UAAgB,WAAA;IACd,UAAY,WAA2B;IACvC,OAAO,oBAAqB,UAAwB,MAAA;GACpD;EACE;EACA,SAAI,kBAAyB,EAAA,UAAY,aAAM;GAC/C,MAAO,MAAA,OAAA,IAAA;GACL,MAAA,CAAA,QAAU,aACR,SAAS;GAIZ,4BAAA;IACA,MAAE,UAAA,IAAA,SAAA,QAAA,sBAAA;IACL,IAAA,YAAgB,KAAA,KAAA,YAAA,MAAA;IACd,OAAM,uBAAyC,UAAA,SAAA;KAAE,WAAI,YAAA,SAA6B,SAAG,KAAU,QAAA,QAAA,QAAA,KAAA,OAAA,QAAA,UAAA,KAAA,SAAA,QAAA,WAAA,KAAA,SAAA,UAAA,IAAA;IAAE,CAAA;GACjG,GAAA,CAAA,CAAA;GACA,gBAAa;IACZ,MAAC,UAAU,UAAA;KACd,IACE,wBAAC,KAAD,GAAA,UAAA;IAAU;IAAK,OAAA,iBAAA,WAAA,MAAA;IAA6B,aAAO,OAAA,oBAAA,WAAA,MAAA;GACjD,GAAA,CAAA,SAAU,CAAA;GACV,OAAsB,oBAAA,OAAA;IACtB;IACA,gCAAwB;IACxB,OAAQ;KACR,UAAY;KACZ,MAAA,QAAS,QAAA;KACT,KAAA,QAAW,OAAA;KACX,OAAA,QAAY,SAAA;KACZ,QAAA,QAAe,UAAW;KAC5B,YAAA,WAAA,KAAA,IAAA,WAAA;KACG,SAAA;KACE,WAAA;KAET,YAAA;;;;GCnGA,CAAA;EAEA;;;EAKE,MAAO,mBAAA;EACT,SAAA,eAAA,SAAA;GAEA,QAAS,QAAA,eAAsB,GAAA,CAAA,QAAiB,SAA0C,GAAA,CAAA,CAAA,KAAA;EACxF;EACF,SAAA,mBAAA,OAAA;;EAGA;EACE,SAAM,sBAAyB,QAAA,YAA8B;GAC7D,OAAI,MAAO,KAAA,OAAc,QAAO,CAAA,CAAA,MAAA,UAAA,UAAA,cAAA,MAAA,SAAA,UAAA,CAAA;EAChC;;EAGA,SAAM,uBADyB,OAAK,UAAA;GAEpC,MAAI,SAAA,MAAc,KAAA,KAAc,iBAAO,uBAAA,CAAA;GACvC,IAAM,OAAA,WAAS,GAAA,OAAc,KAAA;GAC7B,MAAI,OAAW,OAAA;GACf,IAAI,SAAsB,KAAO,GAAA,OAAA,KAAA;GACjC,MAAO,gBAAgB,MAAA,KAAQ,KAAM,iBAAA,gCAAA,CAAA,CAAA,CAAA,QAAA,WAAA,OAAA,aAAA,YAAA,MAAA,QAAA,mBAAA,eAAA,MAAA,CAAA,CAAA;GAEnC,IADkB,cAAe,WAAA,GAAA,OAAoC,KAAA;GAEnE,MAAM,SAAO,cAAA;GACb,IAAI,WAAS,KAAA,GAAW,OAAO,KAAA;GAAE,IAAA,MAAA,OAAA;GAAM,OAAA,QAAA,QAAA,QAAA,MAAA;IAAK,IAAA,MAAA,KAAA,IAAA,iBAAA,4CAAA,CAAA,CAAA,CAAA,WAAA,GAAA;KAC9C,MAAA,OAAA,sBAAA,KAAA,MAAA;KACA,IAAM,SAAI,KAAA,GAAA,OAAA;MACZ;MAEF;KAEA;IACE;IACA,MAAI,IAAA;GACJ;EACA;EACA,SAAK,uBAAsB,MAAY;GACvC,MAAO,UAAA,KAAA;GACT,IAAA,mBAAA,eAAA,QAAA,aAAA,gBAAA,GAAA,OAAA;GAEA,MAAgB,SAAA,SAAA,cAA2C,MAAA;GACzD,OAAK,aAAgB,kBAAK,EAAA;GAC5B,KAAA,sBAAA,YAAA,MAAA;;;;GClCA,KAAM,MAAA,UAAA,KAAA,iBAA4C,IAAA,iBAAA,EAAA,GAAA,OAAA,OAAA;EAChD;;;EAAkE,MAAA,8BAAA,IAAA,IAAA;GACnE;GAED;GACE;GACF;GAEA;EACE,CAAA;EACA,SAAI,OAAS,OAAc;GAG3B,OAAO,OAAA,UAAA,YAAA,UAAA,QAAA,CAAA,MAAA,QAAA,KAAA,IAAA,QAAA,KAAA;EACT;EAEA,SAAgB,YAAA,OAAA;GAId,MAAM,OAAQ,OAAO,KAAK;GAC1B,IAAI,SAAO,KAAS,KAAA,KAAA,SAAc,cAAa,KAAU,SAAA,cAAwB,OAAI,KAAM,SAAgC,YAAA,OAAA,KAAA,SAAA,YAAA,OAAA,KAAA,WAAA,YAAA,KAAA,YAAA,KAAA,KAAA,OAAA,KAAA,YAAA,UAAA,OAAA,KAAA;GACzH,OAAA;EACA;EACF,SAAA,0BAAA,MAAA,YAAA;GACA,MAAI,QAAO,OAAS,KAAA,MAAY,IAAA,CAAA;GAC9B,IAAA,OAAM,SAAS,cAAkB,OAAM,MAAA,UAAA,YAAA,YAAA,IAAA,MAAA,KAAA,GAAA;IACvC,WAAI,MAAW,KAAW;IAC5B;GACA;GACA,IAAM,OAAI,SAAM,YAAA;IAClB,MAAA,SAAA,YAAA,MAAA,MAAA;IAEA,IAAA,WAAe,KAAY,GAAA,OAAwC;GACjE;GACA,IAAM,OAAO,SAAM,WAAY,OAAA,MAAA,YAAA,UAAA,MAAA,IAAA,MAAA,MAAA,OAAA;GAC/B,MAAK,IAAO,MAAI,6CAAA;EACd;EACA,eAAU,SAAY,SAAW;GACnC,MAAA,SAAA,MAAA;GACA,MAAO,OAAA,MAAA,OAAA,KAAA;GACT,IAAA,CAAA,OAAA,IAAA;IAEA,MAAgB,QAAA;IACd,MAAO,IAAA,MAAS,MAAS,WAAA,MAAA,SAAA,0BAA6C;GACpE;GACA,OAAA;EACA;EACA,SAAI,uBAA8B,KAAO,QAAA;GACzC,OAAA,SAAA,MAAA,GAAA,6BAAA,gBAAA,mBAAA,GAAA,KAAA;IACJ,QAAA;IAEA,aAAsB;IAOpB,SAAM,EAAA,QAAe,mBAAM;IACzB,GAAA,WAAQ,KAAA,IAAA,CAAA,IAAA,EAAA,OAAA;GACR,CAAA,CAAA;EACA;EAAW,eAAQ,kBAAA,KAAA,QAAA,UAAA,YAAA,mBAAA,CAAA,GAAA;GAAwB,MAAA,SAAA,MAAgB,MAAA,8BAAA;IAAmB,QAAA;IAC9E,aAAW;IAAY,SAAA;KAAK,QAAA;KAAQ,gBAAA;IAAU;IAAqD,MAAA,KAAA,UAAA;KACpG;KACG;KACF;KACA,GAAM,eAAe,KAAA,IAAA,CAAA,IAAW,EAAK,WAAS;IAChD,CAAA;GACA,CAAA;GACA,IAAM,CAAA,OAAA,IAAS;IACf,MAAM,OAAU,MAAI,OAAA,KAAY;IAChC,MAAI,IAAS,MAAA,KAAA,WAAA,KAAA,SAAA,0BAAA;GACb;GACA,IAAA,OAAa,SAAA,MAAA,MAAA,IAAA,MAAA,kDAAA;GACX,MAAM,SAAQ,OAAM,KAAO,UAAK;GAChC,MAAA,UAAU,IAAQ,YAAa;GAC/B,IAAA,SAAc;GACd,IAAA;GACA,OAAK,MAAM;IACT,MAAI,QAAW,MAAC,OAAW,KAAG;IAC9B,UAAM,QAAQ,OAAA,MAAA,OAAA,EAA0B,QAAM,CAAA,MAAU,KAAA,CAAA;IACxD,MAAI,QAAU,OAAW,MAAA,IAAA;IAC3B,SAAA,MAAA,IAAA,KAAA;IACA,KAAI,MAAM,QAAM,OAAA;KAClB,IAAA,KAAA,KAAA,CAAA,CAAA,WAAA,GAAA;KACI,MAAA,QAAc,0BAAY,MAAA,UAAA;KAC5B,IAAM,UAAQ,KAAA,GAAA,YAAA;IACd;IACF,IAAA,MAAA,MAAA;GACA;GACA,IAAA,OAAO,KAAA,CAAA,CAAA,SAAA,GAAA;IACT,MAAA,QAAA,0BAAA,QAAA,UAAA;IAEA,IAAA,UAAsB,KAAA,GAAA,YAAoB;GACxC;GACE,IAAA,cAAQ,KAAA,GAAA,MAAA,IAAA,MAAA,oDAAA;GACR,OAAA;EACA;EAAW,eAAQ,oBAAA,SAAA,WAAA;GAAoB,MAAA,SAAA,MAAgB,GAAA,6BAAA,QAAA;IAAmB,QAAA;IAC1E,aAAW;IAAY,SAAA;KAAS,QAAA;KAAW,gBAAA;IAC3C;IACJ,MAAA,KAAA,UAAA;;;;GC3FA,CAAA,CAAA;EACE;;;EAKF,SAAS,mBAAqB,OAA4B;GACxD,IAAM,MAAA,QAAS,WAAM,MAAA,YAAA,MAAA,UAAA,MAAA,aAAA,OAAA;GACrB,MAAM,SAAA,MAAA;GACN,OAAM,kBAAgB,uBAA2B,OAAA,QAAA,uBAAiD,MAAA;EAClG;EACA,SAAM,qBAAsB,OAAA;GAE5B,MADgB,SAAS,MAAA;GAE3B,IAAA,EAAA,kBAAA,UAAA,OAAA;GAEA,MAAgB,SAAA,OAAA,QAAwB,mDAAmD;GACzF,IAAM,WAAQ,QAAQ,OAAS,UAAQ,OAAA;GACvC,MAAQ,OAAG,OAAS,QAAU,sBAAY;GAC5C,QAAA,SAAA,OAAA,CAAA,IAAA,MAAA,KAAA,KAAA,iBAAA,uBAAA,CAAA,EAAA,CAAA,GAAA,EAAA,MAAA;EAEA;EACE,SAAO,wBAA0B,UAAK;GACxC,MAAA,QAAA,IAAA,IAAA,SAAA,QAAA;GAEA,OAAgB,CAAA,GAAA,SAAA,UAAA,GAAyB,SAA6B,eAAkC,QAAA,WAAA,CAAA,MAAA,IAAA,MAAA,CAAA,CAAA;EACtG;EACA,SAAO,oBAAsB,UACzB,UACA;GACN,OAAA,SAAA,SAAA,QAAA,IAAA,CAAA,UAAA,GAAA,SAAA,QAAA,WAAA,WAAA,QAAA,CAAA,IAAA;EAEA;EACE,SAAI,yBAAmB,UAAA,OAAA;GACvB,MAAI,aAAgB,MAAO,KAAA,CAAA,CAAA,kBAAA;GAC3B,OAAI,WAAe,WAAO,IAAQ,WAAA,SAAA,QAAA,WAAA,OAAA,kBAAA,CAAA,CAAA,SAAA,UAAA,CAAA;EAClC;EACF,SAAA,0BAAA,SAAA,OAAA,KAAA;GAEA,IAAa,SAAA,GAAA,OAAA;GACX,IAAA,QAAA,QAAA,OAAA;GACA,IAAA,QAAA,OAAA,OAAA,QAAA;GACA,QAAA,WAAA,QAAA,cAAA,IAAA,MAAA,SAAA;EACA;EACA,MAAA,2BAAA;GACA;GACA;GACA;GACF;GAEA;GACE;GACA;GACA;EACA;EACA,MAAA,sBAAoB;GACpB,YAAA;GACA,UAAA;GACA,qBAAsB;GACtB,mBAAY;GACd,oBAAA;GAEA,sBAAS;GACP,oBAAO;GACT,sBAAA;GAEA,YAAgB;EAQd;EACA,SAAM,iBAAU,OAAA;GAChB,OACE,oBAAC;EAAI;EAAgD,SAAA,qBAAU,EAAA,OAAA,OAAA,GAAA,aAAA;GAAS,MAAOC,UAAAA,yBAAAA,QAAAA,KAAAA;GAA/E,MAAA,UACE,yBAAA,MAAA,GAAA,KAAA,IAAA,GAAA,OAAA,IAAA,CAAA;GAAK,OAAOC,qBAAAA,OAAAA;IAAZ,MAAA,UAAA,KAAA,IAAA,WAAA;IACG,aAAU;IACJ,OAAA;IAAmB,UAAQ,CAAA,qBAAA,OAAA;KAAY,OAAOC;KAAnD,UAAA;MACU,UAAG,KAAA,IAAA,qBAAA,OAAA;OAAK,eAAG;OAAK,SAAE;OAAI,OAAK;OAAO,UAAO,CAAA,oBAAA,UAAA;QAAe,IAAA;QAAoB,IAAA;QAAiB,GACrG;QAAM,MAAE;QAAsB,QAAK;QAAO,eAAO;QAAe,aAAc;OAAQ,CAAA,GAAY,oBAAA,QAAA;QAChG,GAAA;QAAkB,MAAA;QAA0B,QAAK;QAAS,eAAK;QAAU,aAAG;QAAY,UAAI,oBAAA,oBAAA;SAAO,eAAY;SAAc,MAAA;SAE5H,MAAA;SACH,IAAA;SAAM,KAAA;SAAmB,aAAOC;QAAkC,CAAA;OAAO,CAAA,CAAA;MAC7E,CAAA,IAAC,oBAAA,QAAD;OAAK,eAAOC;OAAZ,OAAA;OACU,UAAOC;MAAmC,CAAA;MAClD,qBAAA,OAAC;OAAK,OAAOC;OAAqC,UAAA,CAAW,oBAAA,UAAiB;QAC3E,OAAA;;OACJ,CAAA,GAAsB,oBACrB,QAAA;QAAQ,OAAK;QAAS,UAAOC,SAAAA,EAAAA,iBAAAA,KAAAA,CAAAA;OAAoC,CAAA,CAAA;MAAoB,CAAA;MAA4C,UAAA,KAAA,IAAA,OAAA,oBAAA,UAAA;OAAS,MAAA;OAEzI,OAAA;OACL,SAAA;OAAK,cAAOC,EAAAA,2BAAAA;OACT,UAAA;MACkB,CAAA;KAAjB;IACQ,CAAA,GAAY,oBAAA,OAAA;KAAO,OAAO;KAC9B,UAAGE,QAAAA,KAAAA,MAAAA,UAAAA,qBAAAA,QAAAA;MACH,OAAI;MACN,UAAA,CAAA,oBAAA,QAAA;OAAI,eAAA;OAA4C,OAC7C;QALM,GAOZ;QAEA,GAAA,QAAA,QAAA,SAAA,IAAA,8BAAA;;OAET,UAAA,QAAA,QAAA,SAAA,IAAA,MAAA;MAEA,CAAA,GAAgB,EAAA,iBAAA,IAAA,CAAA,CAAA;KAgBd,GAAM,IAAA,CAAA;IACN,CAAA,CAAA;GACA,CAAA;EACA;EACA,SAAO,4BAA+B,EAAA,UAAU,UAAA,UAAA,MAAA,UAAA,eAAA,mBAAA,kBAAA,kBAAA,UAAA,oBAAA;GAChD,MAAO,YAAA,OAAiB,IAAA;GACxB,MAAO,YAAA,OAAiB,IAAA;GACxB,MAAM,aAAU,OAAA,CAAA,CAAc;GAC9B,MAAM,CAAA,OAAA,YAAW,SAAc,EAAA;GAE/B,MAAA,CAAA,aAAgB,kBAAA,SAAA,CAAA;GACd,MAAK,CAAA,iBAAU,sBAAA,SAAA,KAAA;GACb,MAAA,CAAA,iBAAW,sBAAA,SAAA,KAAA;GACX,MAAA,UAAgB,cAAA,oBAAA,UAAA,QAAA,GAAA,CAAA,UAAA,QAAA,CAAA;GAChB,MAAA,WAAA,cAAA,yBAAA,SAAA,KAAA,GAAA,CAAA,SAAA,KAAA,CAAA;GACF,gBAAA;IACA,IAAA,CAAA,UAAgB;KAChB,SAAU,EAAA;KACV,eAAM,CAAA;KACJ;IACF;IACA,eAAS,CAAA;IACT,UAAA,SAAa,MAAA;IACX,MAAA,yBAA6B,UAAA;KAC/B,IAAA,MAAA,kBAAA,QAAA,UAAA,SAAA,SAAA,MAAA,MAAA,MAAA,MAAA,iBAAA,KAAA;IACC;IAEH,SAAA,iBAAgB,eAAA,qBAAA;IACd,aAAe;KACb,SAAM,oBAAA,eAAA,qBAAA;IAEV;GACE,GAAI,CAAA,UAAU,gBAAW,CAAA;GAC3B,gBAAiB;IAEjB,eAAM,CAAA;GACJ,GAAA,CAAA,KAAM,CAAA;GACN,gBAAe;IACjB,IAAA,UAAA,WAAA,QAAA,YAAA,EAAA,eAAA,EAAA,OAAA,UAAA,CAAA;GAEA,GAAA,CAAM,aAAA,QAAqB,CAAA;GACzB,MAAI,qBAAc;IAChB,MAAM,SAAA,SAAe;IACrB,IAAA,WAAY,KAAM,GAAA,SAAA,MAAA;GAClB;GACF,MAAO,qBAAkB,UAAS;IAChC,IAAA,MAAM,QAAA,eAAe,MAAA,QAAA,aAAA,MAAA,QAAA,UAAA,MAAA,QAAA,OAAA;KACrB,MAAA,eAAa;KACf,MAAO,MAAI,MAAM;KACf,gBAAM,YAAe,0BAAA,SAAA,SAAA,QAAA,GAAA,CAAA;IACrB,OAAA,IAAA,MAAiB,QAAK,SAAA;KACxB,MAAA,eAAA;KACF,aAAA;IAEA,OACE,IAAA,MAAA,QAAC,UAAD;KAAM,MAAOG,eAAAA;KAAb,iBAAA,KAAA;IACE;GAAM;GAAgB,OAAOC,qBAAAA,QAAAA;IAA7B,OAAA;IAEI,UAAK;KACEC,qBAAAA,QAAAA;MACP,KAAA;MACA,OAAA;MACA,UAAU,CAAA,qBAAA,UAAA;OACV,MAAA;OAAiB,OAAA;OAA4B,iBAAA;OAN/C,iBAAA;OAQE,UAAA;OACA,eAAA;QAAM,iBAAOC,CAAAA,QAAAA;OAAwB;OAAe,UAAA;QACpD,oBAAC,qBAAA,CAAA,CAAA;QACK,oBAAA,QAAA;SACP,OAAA;SACO,UAAK;QAAO,CAAA;QAAuHC,oBAAAA,0BAAAA,CAAAA,CAAAA;OAAuB;MAAhK,CAAA,GAAA,WACG,qBAAA,QAAD;OAAO,MAAOC;OAAd,yBACE,SAAC,iBAAD,KACA,IAAA,KAAA,IAAA,wBAAA;OACE,OAAK;OACL,WAAK;OACL,UAAO,CAAA,qBAAA,SAAA;QACP,OAAA;QACA,UAAA,CAAY,oBAAA,qBAAA,CAAA,CAAA,GAAA,oBAAA,SAAA;SACZ,KAAOC;SACP,MAAA;SAAqB,OAAA;SAAoC,aAAA;SAEtD,cAAA;SACP,OAAA;SAAM,WAAOC,UAAAA;UACV,SAAA,MAAS,cAAW,KAAI;SAAM;QAAgC,CAAA,CAAA;OAAuB,CAAA,GAAkB,oBAAA,QAAQ;QAE5G,OAAK;QAAa,UAAA,SAAmB,WAAS,IAAA,oBAAA,QAAA;SAAQ,OAAA;SACtD,UAAI;QAEJ,CAAA,IAAK,SAAA,KAAA,QAAA,UAAA,qBAAA,UAAA;SACL,MAAK,YAAA;UACL,WAAA,QAAc,SAAW;SACzB;SACA,IAAA,wBAAO;SAAE,MAAGE;SAAuB,MAAI;SAA0D,gBAAA,WAAA,WAAA,SAAA,KAAA;SACjG,eAAA,UAAoB,cAAA,SAAA,KAAA;SAAE,OAAA;UAAsB,GAAA;UAC5C,GAAA,UAAe,cAAA,uBAAA,CAAA;SAAE;SAAiB,oBAAA;UAVpC,eAYE,KAAA;SAAM;SAAmC,eAAA;UAAa,SACrD,MAAW;SAVP;SAcP,UAAA,CAAA,oBAAA,QAAA;UACJ,OACA;;SACN,CAAA,GAAA,WAAC,WAAD,oBAAA,oBAAA,CAAA,CAAA,IAAA,IAAA;QAAM,GAAA,MAAA,CAAA;OAAmB,CAAA,CAAA;MAAsC,CAAA,IAAA,IAAA;KAC/D,CAAA;KACO,oBAAA,QAAA;MACL,eAAK;MACL,OAAA;KACA,CAAA;KACO,qBAAA,UAAA;MACL,MAAGI;MACH,MAAI;MACJ,gBAAI;MACN,UAAA;MACA,OAAA;OAAsB,GAAA;OAAyB,GAAA,YAAA,kBAAA,2BAAA,CAAA;OAC/C,GAAA,kBAAoB,4BAAA,CAAA;MAAE;MAA0B,oBAAA;OAChD,mBAAe,IAAA;MAAE;MAAyB,oBAAA;OAC1C,mBAAc,KAAA;MAAE;MAA0B,eAAA;OAC1C,mBAAe,IAAA;MAAE;MAA4B,cAAA;OAd/C,mBAgBE,KAAA;MAAM;MAAmB,eAAO;OAAE,iBAAGG,CAAAA,QAAAA;MAA6B;MAAwD,UAAA,CAAA,oBAAA,QAAA;OACvH,eAAA;OACM,OAAA;QAAoB,GAAA;QACvB,GAAA,WAAA,8BAAA,CAAA;OAAM;OAA2B,UAAK,WAAA,oBAAA,OAAA;QAAO,SAAO;QAAe,OAAA;QAAsB,UAAe,oBAAA,QAAA;SAAQ,GAAA;SAAmB,MAAA;SAChI,QACH;SAEL,eACK;;SACJ,aAAA;;OAEV,CAAA,IAAA;MAEA,CAAA,GAAgB,aAAA;KAGd,CAAA;IACA;GACA,CAAA;EACA;EACA,SAAO,6BAAyB,EAAS,WAAE,aAAA,eAAA,OAAA,GAAA,WAAA;GAC3C,MAAO,MAAA,aAAU,UAAe,MAAS,KAAK,UAAA,EAAA,GAAA;GAC9C,MAAO,gBAAU,eAAe,UAAc,MAAA,MAAA,MAAA,SAAA,KAAA,WAAA,SAAA,SAAA,CAAA,CAAA,EAAA,IAAA;GAC9C,MAAO,CAAA,QAAM,aAAW,SAAc;GACtC,MAAO,CAAA,UAAA,eAAe,SAAoB;GAC1C,MAAO,CAAA,UAAA,eAAe,SAAoB,EAAA;GAC1C,MAAO,CAAA,UAAO,eAAY,SAAiB,KAAA;GAC3C,MAAM,CAAA,UAAa,eAAY,SAAA,KAAA;GAC/B,MAAM,CAAA,MAAO,WAAA,SAAiB,KAAA;GAE9B,MAAA,CAAA,eAAgB,oBAAA,SAAA;GACd,MAAI,CAAA,eAAO,oBAA4B,SAAO;GAC9C,MAAI,CAAA,OAAA,YAAY,SAAA;GAChB,MAAM,aAAA,OAAwB,KAAA;GAC5B,MAAA,OAAY,iBAAA;GACZ,gBAAe;IACf,IAAI,OAAA,aAAsB,eAAA,OAAA,qBAAA,aAAA;IACxB,IAAA,YAAA;IACA,MAAA,kBAAmB;KACnB,YAAA;KACF,MAAA,SAAA,uBAAA;KACA,IAAA,WAAU,KAAA,GAAA;MACZ,wBAAA;MACA,UAAM,KAAA,CAAA;MACJ;KACA;KACA,UAAA,uBAAwB,OAAA,IAAA,CAAA;IAC1B;IACA,MAAA,iBAAU;KACV,IAAM,WAAW;KACjB,YAAS;KAAyB,eAAW,SAAA;IAAM;IAAe,UAAA;IAAqB,MAAA,WAAY,IAAA,iBAAA,QAAA;IAAM,SAAA,QAAkB,SAAA,MAAY;KAAG,WAAA;KAC1I,SAAA;KACE,eAAS;KACT,YAAA;KACF,iBAAA,CAAA,YAAA;IACC,CAAC;IAEJ,aAAgB;KACd,SAAY,WAAS;KACrB,wBAAc;IACd;GACA,GAAA,CAAA,SAAY,CAAA;GACZ,gBAAiB;IACjB,YAAA,KAAiB,CAAA;IACjB,YAAS,EAAS;IAClB,YAAI,KAAW;IACf,YAAM,KAAa;IACd,iBAAA,KAAuB,CAAA;IAC1B,iBAAiB,KAAA,CAAA;IACjB,SAAA,KAAY,CAAA;IACd,IAAI,WAAoB,KAAA,KAAA,SAAA,KAAA,GAAA;IACtB,MAAK,aAAW,IAAO,gBAAS;IACjC,uBAAA,MAAA,WAAA,MAAA,CAAA,CAAA,MAAA,UAAA;KACD,YAAa,KAAA;KAAE,YAAW,MAAM,WAAA,MAAA,SAAA,MAAA,EAAA;IAAE,IAAA,WAAA;KACjC,IAAA,CAAA,WAAA,OAAA,SAAA,SAAA,kBAAA,QAAA,OAAA,UAAA,OAAA,MAAA,CAAA;IAAC,CAAA;IAAQ,aAAA;KAAM,WAAA,MAAA;IAAU;GAE5B,GAAA;IACA;IACA;IACE;GACA,CAAA;GACE,MAAI,oBAAsB,aAAY,KAAM,IAAC,CAAA,IAAA,wBAAc,QAAA;GAE3D,MADkB,UAAA,aAAiB,KAAA,KAAgB,SAAA,SAAA,MAAwB,YAAI,aAAqB,SACpF;GAChB,gBAAM;IACN,IAAA,CAAM,WAAA,WAAgB,KAAA,KAAA,MAAA;IACtB,MAAA,UAAW,UAAU;KACrB,IAAA,WAAY,WAAA,MAAA,MAAA,KAAA,CAAA,CAAA,WAAA,GAAA;KACZ,IAAA,EAAA,iBAA0B,gBAAA,mBAAA,KAAA,IAAA,qBAAA,KAAA,IAAA;KAC1B,MAAA,eAAiB;KACjB,MAAA,gBAAkB;KACb,WAAQ,UAAe;KAA+B,QAAI,IAAA;KAAoC,iBAAQ,KAAoB,CAAA;KAC7H,iBAAgB,WAAA,eAA0B,KAAO,CAAA;KACjD,SAAI,KAAU,CAAA;KACT,QAAA,SAAS,MAAO,UAAA,WAAA,UAAA;MACpB,IAAA,UAAc,iBAAA,KAAA;KACf,CAAA,CAAA,CAAA,OAAW,WAAU;MACrB,MAAQ,UAAK,kBAAA,QAAA,OAAA,UAAA,OAAA,MAAA;MACd,IAAA,UAAA,iBAAA,OAAA;WACH,SAAA,OAAA;KACA,CAAA,CAAA,CAAA,cAAS;MACT,WAAS,UAAA;MACT,QAAA,KAAa;KACX,CAAA;IACA;IACF,SAAA,iBAAA,WAAA,QAAA,IAAA;IACC,SAAA,iBAAA,SAAA,QAAA,IAAA;IAAC,aAAA;KAAU,SAAA,oBAAA,WAAA,QAAA,IAAA;KAAM,SAAA,oBAAA,SAAA,QAAA,IAAA;IAAS;GAAa,GAAA;IAAQ;IAAS;IAAU;IAAS,MAAA;IAE9E;IACA;IACQ;IAAN;GAEU,CAAA;GAAqC,IAAA,WAAA,KAAS,KAAE,SAAA,KAAA,GAAA,OAA2B;GAAQ,OACvF,aAAA,qBAAA,QAAA;IAEA,OAAA;IACU,UAAA,CAAA,aAAA,KAAA,IAAA,oBAAA,QAAA;KACA,OAAA;KACJ,UAAA,SAAA,EAAA,2BAAA;IACI,CAAA,IAAA,qBAAA,YAAA,EAAA,UAAA,CAAA,oBAAA,6BAAA;KACV,UAAA;KACA;KACA;KACA;KACA;KACE,eAAY,EAAM,oBAAA;KAClB,mBAAiB,EAAA,wBAAA;KACjB,kBAAkB,EAAA,6BAAA;KACpB,kBAAA;KACA,WAAA,WAAmB;MAAc,YAAY,MAAO;MAAG,YAAS,KAAS;MAAE,SAAA,KAAA,CAAA;KAC5E;KACmC,mBAAK,YAAA;MAAQ,YAAOK,OAAAA;MAA6B,SAAA,KAAA,CAAA;KACrF;IAGE,CAAA,GAAA,UAAO,KAAA,IAAA,OAAA,oBAAA,QAAA;KACP,MAAK;KACF,OAAA;KACH,UAAA;IAAmB,CAAA,CAAA,EAAA,CAAA,GAAA,kBAA0B,KAAA,KAAA,CAAA,QAAA,kBAAA,KAAA,IAAA,OAAA,oBAAA,sBAAA;KAAG,OAAA;KAA4B,GAAA,kBAAA,KAAA,IAAA,CAAA,IAAA,EAAA,OAAA,cAAA;KAG5E;KACL,iBAAM;MACX,iBAAA,KAAA,CAAA;;;;GCnZA,CAAA,GAAM,MAAA;EAEN;;;EAKA,MAAA,cACE;EAIA,SAAO,YAAY,OAAO,SAAS;GACrC,MAAA,aAAA,MAAA,OAAA,QAAA,SAAA,CAAA,CAAA,YAAA;GAEA,OAAS,WAAS,QAAoB,WAA+B,WAA0C,CAAA;EAC7G;EACE,SAAO,YAAY,OAAA,SAAW,YAAA;GAC9B,OAAI,YAAiB,OAAA,OAAiB,CAAA,CAAE,MAAM,YAAQ,QAAK,eAAA,UAAA;EAC3D;EACE,SAAO,SAAM,KAAA,SAAA,SAAyB;GACxC,OAAA;IACF,OAAA,IAAA,QAAA,WAAA;IACF,GAAA,QAAA,SAAA,KAAA,IAAA,CAAA,IAAA,EAAA,MAAA,QAAA,KAAA;IAEA,MAAS,OAAA,MAAY;KACnB,OAAM,MAAU,oBAAmB,KAAK,SAAS,SAAK,IAAU;IAChE;GACA;EACF;;;GAIA,IAAA,YAAgB,KAAA,GAAA,OAAA,KAA0B;GACxC,OAAO,EAAA,OAAA,SAAA,KAAA,KAAA,SAAA,OAAA,EAAA;EACL;;;EAGA,SAAM,0BAAwE,KAAA,OAAA;GAC5E,OAAI;IACJ,SAAM;IACN,MAAO;IAGH,OAAM;IACN,MAAA,WAAa,SAAQ,SAAA;KACrB,IAAI,QAAQ,aAAS,WAAmB,OAAM,CAAA;KAC9C,MAAA,QAAA,QAAA,MAAA,kBAAA;KACN,OAAA,YAAA,OAAA,OAAA,CAAA,CAAA,QAAA,YAAA,QAAA,WAAA,kBAAA,CAAA,CAAA,SAAA,KAAA,CAAA,CAAA,CAAA,KAAA,aAAA;MACA,MAAO,QAAM;MACX,aAAO,QAAiB;MAC1B,GAAA,QAAA,SAAA,KAAA,IAAA,CAAA,IAAA,EAAA,MAAA,QAAA,KAAA;KACA,EAAA;IACE;IACA,OAAM,MAAA;KACN,OAAO,YAAY,KAAA,OAAY,IAAY;IAC7C;IACA,WAAM,SAAW,OAAS;KACxB,IAAK,CAAA,MAAK,WAAc,GAAG,GAAA,OAAO,KAAA;KAClC,MAAM,UAAY,YAAK,OAAW,SAAA,MAAA,MAAA,CAAA,CAAA;KAElC,OAAM,YAAU,KAAA,IAAY,KAAO,IAAA,EAAA,OADhB,SAAW,KAAG,SAAA,OAAmB,EAAA;IAEpD;IACF,MAAA,WAAA,SAAA,MAAA;KACA,IAAA,CAAQ,KAAA,WAAS,GAAA,GAAA,OAAA,KAAA;KACf,MAAO,YAAY,KAAA,QAAc,GAAE;KACrC,MAAA,UAAA,YAAA,OAAA,SAAA,KAAA,MAAA,GAAA,cAAA,KAAA,KAAA,IAAA,SAAA,CAAA;KACA,OAAA,YAAiB,KAAS,IAAA,KAAU,IAAA,EAAA,OAAA,SAAA,KAAA,SAAA,OAAA,EAAA;IAClC;IACF,QAAA,SAAA;KACF,OAAA,YAAA,OAAA,OAAA,CAAA,CAAA,KAAA,YAAA,QAAA,UAAA;IACF;;;IAIA;GAME;EACA;;;EAA4F,eAAA,oBAAA,KAAA,SAAA,SAAA,MAAA;GAC5F,MAAM,aAAa,IAAA,SAAO,MAAU,QAAA,SAAA;GACpC,IAAM,eAAW,KAAQ,GAAA,OAAA;IACzB,MAAI;IACF,MAAM;GACN;GACF,MAAA,SAAgB,IAAA,OAAA,UAAA;GACd,MAAO,OAAA,IAAA,QAAA,aAAA,KAAA,WAAA,IAAA,KAAA,IAAA;GACL,IAAA;IACA,MAAM,OAAA,aAAiB,KAAQ,IAAA;IACjC,OAAA,EAAA,MAAA,UAAA;GACF,SAAA,OAAA;IACF,OAAA;;;;GC1GA;EACA;;;EAKE,MAAM,oBAAmB;EACzB,MAAO,wBAAuB;EAChC,MAAA,oBAAA;EAEA,MAAA,iBAAgB;EACd,SAAO,kBAAkB,OAAA,YAAA;GAC3B,MAAA,UAAA,KAAA,IAAA,mBAAA,KAAA,MAAA,aAAA,iBAAA,CAAA;GAEA,OAAS,KAAA,IAAA,SAA8C,KAAA,IAAA,mBAAA,KAAA,MAAA,KAAA,CAAA,CAAA;EACrD;EACA,SAAO,oBAAsB,YAAa;GAC5C,OAAA,kBAAA,uBAAA,UAAA;;;;;;;;;;;EAaE,SAAI,8BAAa;GACjB,IAAI,OAAA,aAAiB,eAAA,OAAA,WAAA,aAAA,aAAA,KAAA;GACrB,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI,aAAA;GACJ,IAAI,iBAAmB;GACvB,IAAI;GACJ,IAAI,UAAA;GACJ,IAAI,eAAA;GACJ,IAAI,qBAAA;GAEJ,IAAM,mBAAyB;GAC7B,IAAI,oBAAuB;GAC3B,IAAA;GACA,IAAI;GACJ,IAAA;GAGA,MAAM,mBADU;IAEhB,IAAM,UAAU,KAAA,KAAA,WAAmB,KAAA,KAAA,UAAA,KAAA,GAAA;IACnC,MAAI,aAAY,MAAA,sBAA8B,CAAA,CAAA;IAC9C,IAAI,cAAa,GAAA;IACnB,QAAA,kBAAA,OAAA,UAAA;IAEA,MAAM,OAAA,GAAA,WAA4B,iBAAA,KAAA,CAAA,CAAA,oBAAA,MAAA,MAAA,CAAA,CAAA,MAAA,EAAA,KAAA,EAAA,oBAAA,MAAA;IAChC,MAAI,OAAA,GAAA,aAA8B,MAAA;IAClC,IAAA,MAAA,MAAiB,wBAAO,MAAA,MAA4B,MAAA,sBAAA;IAClD,IAAA,OAAA,MAAiB,SAAA,MAAA,OAAA,MAAA,OAAA;GACjB;GACD,MAAA,sBAAA;IACH,IAAA,mBAAA,KAAA,GAAA;IAEA,iBAAM,OAAyB,4BAAA;KAC7B,iBAAkB,KAAA;KAClB,WAAY;IACZ,CAAA;GACA;GACF,MAAA,mBAAA;IAEA,IAAM,cAAA,KAAiB,GAAA;IACrB,YAAU,KAAA;IACV,IAAM,UAAQ,KAAM,KAAA,CAAA,kBAAU,MAAA,gBAAA,eAAA;IAC9B,IAAK,WAAW,KAAK,KAAI,CAAA,mBAAS,OAAgB,gBAAA,eAAA;GAClD;GACA,MAAA,iBAAQ,UAAkB;IAC1B,IAAA,MAAW,cAAA,aAAA,UAAA,KAAA,GAAA;IACX,MAAM,QAAA,MAAe,UAAA;IACvB,IAAA,CAAA,WAAA,KAAA,IAAA,KAAA,IAAA,gBAAA;IAEA,UAAM;IACJ,QAAU,kBAAc,iBAAW,OAAA,MAAA,sBAAA,CAAA,CAAA,KAAA;IACnC,WAAW;IACb,MAAA,eAAA;GAEA;GACE,MAAM,gBAAe,UAAA;IACrB,IAAM,MAAA,cAAkB,WAAU;IAClC,WAAM;GACN;GACA,MAAI,iBAAc,UAAQ;IAC1B,MAAM,SAAA,MAAe;IACrB,IAAM,EAAA,kBAAgB,UAAA;IACtB,MAAM,YAAA,OAAgB,QAAa,yBAAe;IAClD,MAAM,iBAAgB,WAAA;IACtB,IAAM,cAAa,QAAA,cAAa,KAAA,KAAA,mBAAwB,QAAA,mBAAA,KAAA,GAAA;IACxD,MAAI,eAAiB;IAErB,MAAM,gBAAY;IAClB,MAAQ,gBAAA,aAAA,SAAA,KAAA,CAAA;IACR,MAAA,gBAAS,yBAAA,cAAA,cAAA,sBAAA,CAAA,CAAA,QAAA;IACT,MAAQ,aAAA,aAAkB,sBAAwB,CAAA,CAAA;IAClD,IAAA,iBAAiB,KAAA,cAAA,GAAA;IACjB,MAAA,YAAmB,UAAA,KAAA;IACnB,QAAA;IACA,SAAU;IACV,QAAI,kBAAW,SAAA,eAAA,UAAA;IACb,iBAAe;IACf,aAAA,MAAA;IACA,YAAA,MAAmB;IACnB,UAAA;IACF,IAAA,WAAA;KACA,eAAa,aAAa,MAAA;KAC1B,qBAAc,cAAa,MAAiB;KAE5C,mBAAe,aAAA,aAAA,eAAA;KACb,oBAAiB,cAAO,aAAmB,eAAc;IACzD;IACA,aAAA,aAA0B,iBAAA,EAAA;IAC1B,cAAA,aAA0B,iBAAc,MAAA;IAAE,IAAA,WAAY;KAAM,iBAAkB,OAAO,mBAAA,cAAA,KAAA,IAAA,IAAA,eAAA,aAAA;KAAG,gBAAA,QAAA,YAAA;KACxF,mBAAkB,OAAQ,qBAAe,cAAA,KAAA,IAAA,IAAA,iBAAA,aAAA;KAAE,kBAAY,QAAA,cAAA;MAAM,YAAA;MAA4B,iBAAA,CAAA,OAAA;KAC3F,CAAA;KAEA,kBAAqB,QAAA,eAAA;MACrB,YAAM;MACN,iBAAM,CAAA,OAAA;KACR,CAAA;IAEA;IACE,MAAM,eAAgB;IACtB,MAAM,gBAAe;IACrB,MAAI,yBAA0B;GAC9B;GACA,MAAA,0BAAS;IACT,MAAA,gBAAqB,SAAM,cAAA,yBAAA;IAC3B,MAAA,eAAqB,eAAa;IAClC,IAAA,kBAAmB,QAAM,kBAAa,KAAe,KAAA,iBAAA,QAAA,iBAAA,KAAA,GAAA;IACrD,QAAA;IACA,SAAQ;IACR,eAAiB,MAAA,MAAO;IACxB,qBAAgB,OAAa,MAAA;IAC7B,mBAAmB,MAAO,aAAA,eAAqB;IAC/C,oBAAkB,OAAQ,aAAO,eAAA;IAAE,QAAA,oBAAY,MAAA,sBAAA,CAAA,CAAA,KAAA;IAAM,iBAAkB,OAAO,mBAAA,cAAA,KAAA,IAAA,IAAA,eAAA,aAAA;IAAG,gBAAA,QAAA,KAAA;IACjF,mBAAkB,OAAQ,qBAAQ,cAAA,KAAA,IAAA,IAAA,iBAAA,aAAA;IAAE,kBAAY,QAAA,OAAA;KAAM,YAAA;KAA4B,iBAAA,CAAA,OAAA;IAClF,CAAA;IACF,kBAAA,QAAA,QAAA;KAEA,YAAA;KACE,iBAAiB,CAAA,OAAA;IACjB,CAAA;IACD,WAAA;GACD;GACA,iBAAO,OAAiB,4BAA8B;IACtD,iBAAO,KAAiB;IACxB,kBAAO;GAEP,CAAA;GACE,SAAS,iBAAA,eAAoB,eAAe,IAAe;GAC3D,OAAO,iBAAA,eAAoB,eAAe,IAAe;GACzD,OAAO,iBAAA,aAAoB,cAAa,IAAc;GACtD,OAAO,iBAAA,iBAAoB,cAAiB,IAAc;GAC1D,aAAA;IACA,SAAA,oBAA6B,eAAA,eAAA,IAAA;IAC7B,OAAI,oBAAmB,eAAkB,eAAqB,IAAA;IAC9D,OAAA,oBAAW,aAAA,cAAA,IAAA;IACX,OAAI,oBAA2B,iBAAM,cAAsB,IAAA;IAC3D,gBAAe,WAAW;IAC5B,kBAAA,WAAA;IACF,IAAA,mBAAA,KAAA,GAAA,OAAA,qBAAA,cAAA;;;;GCxKA;EACE;;;EAIA,MAAA,KAAQ;GACR,KAAA;GACA,OAAS;GACT,aAAQ;GACR,UAAM;GACN,QAAU;GACV,UAAU;GACV,SAAW;GACX,QAAA;GACA,MAAA;GACA,UAAW;GACX,UAAQ;GACR,WAAQ;GACR,WAAY;GACZ,YAAa;GACb,WAAA;GACA,QAAA;GACA,QAAA;GACA,YAAS;GACT,aAAA;GACA,iBAAW;GACX,oBAAW;GACX,YAAQ;GACR,SAAA;GACA,gBAAc;GACd,WAAS;GACT,WAAS;GACT,QAAO;GACP,gBAAU;GACV,cAAc;GACd,SAAA;GACA,SAAA;GACA,OAAA;GACA,UAAA;GACA,cAAA;GACA,gBAAa;GACb,oBAAsB;GACtB,uBAAA;GACA,0BAAqB;GACrB,qBAAoB;GACpB,aAAA;GACA,sBAAc;GACd,4BAAkB;GAClB,qBAAkB;GAClB,oBAAkB;GAClB,qBAAe;GACf,cAAe;GACf,kBAAc;GACd,kBAAc;GACd,kBAAiB;GACjB,eAAc;GACd,eAAgB;GAChB,cAAa;GACb,cAAA;GACA,iBAAA;GACA,cAAA;GACA,gBAAA;GACA,aAAA;GACA,iBAAA;GACA,uBAAuB;GACvB,mBAAoB;GACpB,0BAAyB;GACzB,sBAAA;GACA,qBAAmB;GACnB,uBAAO;GACP,oBAAY;GACZ,yBAAgB;GAChB,yBAAiB;GACjB,mBAAY;GACZ,OAAA;GACA,YAAY;GACZ,gBAAc;GACd,iBAAkB;GAClB,YAAc;GACd,WAAY;GACZ,YAAA;GACA,cAAA;GACA,kBAAmB;GACnB,cAAA;GACA,YAAA;GACA,mBAAoB;GACpB,mBAAiB;GACjB,mBAAe;GACf,uBAAgB;GAChB,kBAAa;GACb,oBAAc;GACd,iBAAa;GACb,eAAiB;GACjB,gBAAe;GACf,aAAA;GACA,cAAA;GACA,aAAA;GACA,iBAAmB;GACnB,eAAA;GACA,gBAAA;GACA,iBAAA;GACA,iBAAkB;GAClB,mBAAe;GACf,kBAAgB;GAChB,qBAAkB;GAClB,uBAAwB;GACxB,kBAAA;GACA,eAAA;GACA,gBAAA;GACA,kBAAA;GACA,wBAAA;GACA,6BAA+B;GAC/B,2BAA6B;GAC7B,yBAAA;GACA,0BAAA;GACA,2BAAA;GACA,+BAAA;GACA,6BAAA;GACA,wCAAyC;GACzC,sCAA+B;GAC/B,uCAA8B;GAC9B,yCAA+B;GAC/B,uCAAoB;GACpB,yCAAyB;GACzB,+BAAoB;GACpB,8BAAyB;GACzB,+BAAmB;GACnB,oBAAoB;GACpB,yBAAiB;GACjB,oBAAiB;GACjB,yBAAuB;GACvB,mBAAgB;GAChB,oBAAc;GACd,iBAAmB;GACnB,iBAAmB;GACnB,uBAAiB;GACjB,gBAAA;GACA,cAAA;GACA,mBAAA;GACA,mBAAqB;GACrB,iBAAkB;GAClB,sBAAA;GACA,wBAA0B;GAC1B,wBAA0B;GAC1B,qBAAuB;GACvB,kBAAkB;GAClB,0BAA2B;GAC3B,0BAAA;GACA,0BAAA;GACA,uBAAuB;GACvB,kBAAA;GACA,2BAAkB;GAClB,sCAAK;GACL,oCAAI;GACJ,uBAAU;GACV,sBAAW;GACX,kBAAiB;GACjB,KAAA;GACA,IAAA;GACA,UAAA;GACA,WAAW;GACX,iBAAc;GACd,WAAa;GACb,gBAAY;GACZ,eAAgB;GAChB,WAAA;GACA,cAAU;GACV,aAAc;GACd,YAAA;GACA,gBAAA;GACA,gBAAe;GACf,UAAA;GACA,cAAA;GACA,wBAAkB;GAClB,qBAAqB;GACrB,eAAA;GACA,mBAAY;GACZ,uBAAc;GACd,kBAAoB;GACpB,qBAAe;GACf,mBAAa;GACb,YAAY;GACZ,cAAA;GACA,oBAAmB;GACnB,eAAa;GACb,aAAY;GACZ,YAAa;GACb,mBAAgB;GAChB,mBAAU;GACV,aAAA;GACA,YAAA;GACA,aAAY;GACZ,gBAAa;GACb,UAAA;GACA,qBAAiB;GACjB,qBAAkB;GAClB,YAAA;GACA,aAAA;GACA,qBAAoB;GACpB,iBAAkB;GAClB,kBAAA;GACA,kBAAA;GACA,sBAAwB;GACxB,oBAAA;GACA,kBAAA;GACA,wBAAyB;GACzB,6BAAsB;GACtB,wBAAiB;GACjB,2BAAmB;GACnB,2BAAiB;GACjB,yBAAe;GACf,sBAAkB;GAClB,iBAAgB;GAChB,mBAAc;GACd,iBAAc;GACd,eAAA;GACA,kBAAA;GACA,gBAAA;GACA,cAAA;GACA,cAAA;GACA,kBAAA;GACA,0BAAqB;GACrB,qBAAoB;GACpB,qBAAA;GACA,qBAAsB;GACtB,qBAAsB;GACxB,qBAAA;GAEA,oBAAkB;GAChB,yBAAK;GACL,sBAAO;GACP,sBAAa;EACb;EACA,MAAA,KAAQ;GACR,KAAA;GACA,OAAS;GACT,aAAQ;GACR,UAAM;GACN,QAAU;GACV,UAAU;GACV,SAAW;GACX,QAAA;GACA,MAAA;GACA,UAAW;GACX,UAAQ;GACR,WAAQ;GACR,WAAY;GACZ,YAAa;GACb,WAAA;GACA,QAAA;GACA,QAAA;GACA,YAAS;GACT,aAAA;GACA,iBAAW;GACX,oBAAW;GACX,YAAQ;GACR,SAAA;GACA,gBAAc;GACd,WAAS;GACT,WAAS;GACT,QAAO;GACP,gBAAU;GACV,cAAc;GACd,SAAA;GACA,SAAA;GACA,OAAA;GACA,UAAA;GACA,cAAA;GACA,gBAAa;GACb,oBAAsB;GACtB,uBAAA;GACA,0BAAqB;GACrB,qBAAoB;GACpB,aAAA;GACA,sBAAc;GACd,4BAAkB;GAClB,qBAAkB;GAClB,oBAAkB;GAClB,qBAAe;GACf,cAAe;GACf,kBAAc;GACd,kBAAc;GACd,kBAAiB;GACjB,eAAc;GACd,eAAgB;GAChB,cAAa;GACb,cAAA;GACA,iBAAA;GACA,cAAA;GACA,gBAAA;GACA,aAAA;GACA,iBAAA;GACA,uBAAuB;GACvB,mBAAoB;GACpB,0BAAyB;GACzB,sBAAA;GACA,qBAAmB;GACnB,uBAAO;GACP,oBAAY;GACZ,yBAAgB;GAChB,yBAAiB;GACjB,mBAAY;GACZ,OAAA;GACA,YAAY;GACZ,gBAAc;GACd,iBAAkB;GAClB,YAAc;GACd,WAAY;GACZ,YAAA;GACA,cAAA;GACA,kBAAmB;GACnB,cAAA;GACA,YAAA;GACA,mBAAoB;GACpB,mBAAiB;GACjB,mBAAe;GACf,uBAAgB;GAChB,kBAAa;GACb,oBAAc;GACd,iBAAa;GACb,eAAiB;GACjB,gBAAe;GACf,aAAA;GACA,cAAA;GACA,aAAA;GACA,iBAAmB;GACnB,eAAA;GACA,gBAAA;GACA,iBAAA;GACA,iBAAkB;GAClB,mBAAe;GACf,kBAAgB;GAChB,qBAAkB;GAClB,uBAAwB;GACxB,kBAAA;GACA,eAAA;GACA,gBAAA;GACA,kBAAA;GACA,wBAAA;GACA,6BAA+B;GAC/B,2BAA6B;GAC7B,yBAAA;GACA,0BAAA;GACA,2BAAA;GACA,+BAAA;GACA,6BAAA;GACA,wCAAyC;GACzC,sCAA+B;GAC/B,uCAA8B;GAC9B,yCAA+B;GAC/B,uCAAoB;GACpB,yCAAyB;GACzB,+BAAoB;GACpB,8BAAyB;GACzB,+BAAmB;GACnB,oBAAoB;GACpB,yBAAiB;GACjB,oBAAiB;GACjB,yBAAuB;GACvB,mBAAgB;GAChB,oBAAc;GACd,iBAAmB;GACnB,iBAAmB;GACnB,uBAAiB;GACjB,gBAAA;GACA,cAAA;GACA,mBAAA;GACA,mBAAqB;GACrB,iBAAkB;GAClB,sBAAA;GACA,wBAA0B;GAC1B,wBAA0B;GAC1B,qBAAuB;GACvB,kBAAkB;GAClB,0BAA2B;GAC3B,0BAAA;GACA,0BAAA;GACA,uBAAuB;GACvB,kBAAA;GACA,2BAAkB;GAClB,sCAAK;GACL,oCAAI;GACJ,uBAAU;GACV,sBAAW;GACX,kBAAiB;GACjB,KAAA;GACA,IAAA;GACA,UAAA;GACA,WAAW;GACX,iBAAc;GACd,WAAa;GACb,gBAAY;GACZ,eAAgB;GAChB,WAAA;GACA,cAAU;GACV,aAAc;GACd,YAAA;GACA,gBAAA;GACA,gBAAe;GACf,UAAA;GACA,cAAA;GACA,wBAAkB;GAClB,qBAAqB;GACrB,eAAA;GACA,mBAAY;GACZ,uBAAc;GACd,kBAAoB;GACpB,qBAAe;GACf,mBAAa;GACb,YAAY;GACZ,cAAA;GACA,oBAAmB;GACnB,eAAa;GACb,aAAY;GACZ,YAAa;GACb,mBAAgB;GAChB,mBAAU;GACV,aAAA;GACA,YAAA;GACA,aAAY;GACZ,gBAAa;GACb,UAAA;GACA,qBAAiB;GACjB,qBAAkB;GAClB,YAAA;GACA,aAAA;GACA,qBAAoB;GACpB,iBAAkB;GAClB,kBAAA;GACA,kBAAA;GACA,sBAAwB;GACxB,oBAAA;GACA,kBAAA;GACA,wBAAyB;GACzB,6BAAsB;GACtB,wBAAiB;GACjB,2BAAmB;GACnB,2BAAiB;GACjB,yBAAe;GACf,sBAAkB;GAClB,iBAAgB;GAChB,mBAAc;GACd,iBAAc;GACd,eAAA;GACA,kBAAA;GACA,gBAAA;GACA,cAAA;GACA,cAAA;GACA,kBAAA;GACA,0BAAqB;GACrB,qBAAoB;GACpB,qBAAA;GACA,qBAAsB;GACtB,qBAAsB;GACxB,qBAAA;;;;GCxZA,sBACE;EASA;;;EAE8C,SAAA,cAAA,EAAA,QAAC,GAAA,WAAD,cAAA,SAAA,gBAAA;GACvB,MAAA,WAAA,qBAAA,OAAA,WAAA,OAAA,aAAA,OAAA,WAAA;GAClB,MAAA,uBAAA,aAAA,SAAA,QAAA;GACQ,OAAA,oBAAA,mBAAA;IACX,WAAA;IACc,UAAA,oBAAA,iBAAA;KACd;KACA;KACD;KAAoB,WAAA;KACvB;KAEA,iBAAoB;KACpB,GAAa,iBAAS,KAAA,IAAA,CAAA,IAAA,EAAA,aAAA;IAAC,CAAA;GAAS,CAAA;EAAU;EAAsB,MAAA,OAAA;EAAY,MAAA,SAAA;GAAc;GAAiB;GAAgB;GAAY;GAEvI;GACE;GACA;GAAkD;EAAI;EAAI,SAAG,MAAA,KAAA;GAC7D,MAAM,YAAQ;GACd,IAAM,aAAA,IAAc,OAAI,SAAA,WAAsB;IAC9C;IACA;GACA,CAAA,GAAM,yBAAqB;GAC3B,MAAM,IAAA,IAAA,OAAe,KAAI,SAAI;GAC7B,MAAM,cAAa,IAAI,sBAAgB;;;;GAIvC,MAAM,eAAA,IAAmB,IAAA,cAA0F;GACjH,MAAI,aAAa,IAAA,IAAa,YAAA;;;;GAI5B,MAAM,mBAAQ,cAAuB;IACrC,IAAA,aAAgB,KAAM,KAAM,iBAAc,KAAA,GAAA,OAAA,KAAA;IAC1C,QAAI,OAAQ,OAAW,aAAU;KAC5B,MAAA,QAAI,SAAS,MAAU,SAAM;KAC7B,IAAA,UAAO,KAAA,GAAA,OAAA;KACZ,MAAM,QAAO,aAAA,MAAA,IAAA,KAAA;KACb,MAAO,UAAA,MAAA,MAAA,YAAA,CAAA,CAAA;KACT,IAAA,QAAA,KAAA,MAAA,IAAA,MAAA,SAAA,KAAA;UACF,IAAA,SAAA,UAAA,MAAA,SAAA,GAAA,QAAA,MAAA,OAAA;UACI,OAAA;KAEA,MAAQ,OAAA;KACR,OAAS;IACV;GAEH;GACA,IAAI,aAAa,KAAI,GAAA,IAAA,aAAmB,SAAS,QAAA;IACjD,OAAI,CAAA,kBAAiB;IACrB,UAAI,aAAiB,EAAA,OAAA,EAAA,kBAA4B,YAAA,OAAA,QAA8B,SAAA,EAAA,EAAA;GAC/E,CAAA,GAAI,yCAAa;GACf,IAAA,mBAAM,YAAA,QAAA,GAAA,0CAAA;GACN,IAAK,aAAA,IAAA,mBAAA,SAAA,oBAAA,GAAA,gCAAA;GACL,IAAA,aAAQ,IAAA,mBAAA,SAAA,4BAAA,GAAA,uCAAA;GACV,IAAG,aAAA,IAAmB,mBAAA,SAAA,2BAAA,GAAA,sCAAA;GACtB,IAAM,MAAA,OAAa,gCAAY,IAAA,MAAA,SAAA;IAG/B,MAAI;IACJ,KAAI;IACJ,QAAI;GACJ,GAAI,kBAAA,CAAA;GACJ,MAAM,SAAA,IAAA,IAAA,QAA0B;GAC9B,IAAI;GACJ,IAAA;GACA,IAAA;GACA,IAAA;GACA,MAAA,oBAAA;IACF,IAAA,uBAAA,KAAA,GAAA;IACA,mBAAM;IACJ,qBAAI,KAAA;IACJ,QAAA,YAAqB;IACrB,+BAAqB,4BAAA;GACrB;GACA,MAAA,2BAA+B;IAC/B,IAAA,yBAAuB,KAAA,KAAA,uBAAA,KAAA,KAAA,iCAAA,KAAA,KAAA,qBAAA,KAAA,GAAA;IACvB,qBAAuB;IACvB,qBAAmB,KAAA;IACnB,+BAAqB;IACvB,+BAAA,KAAA;IACA,uBAAqB;IACnB,uBAAY,KAAA;IACb,mBAAG,KAAA;IACJ,QAAM,aAAkB;GACtB;GACA,IAAI,aAAA,IAAA,MAAA,cAAA,KAAA,UAAA;IACF,IAAA,QAAA,mBAA2B,MAAM,QAAS,OAAA,uBAAA,YAAA;GACxC,CAAA,GAAA,mCAAM;GACN,MAAA,kBAAU,WAAA,SAAA;IACV,mBAAQ;IACR,IAAA;KAA2C,uBAAA,IAAA,MAAA,SAAA;MAAG,MAAA;MAAM,UAAA;MAAiC,QAAA;MACpF,eAAA;OACL;OACE;OACF,cAAA;MACA;KACA,GAAA,gBAAoB;IACpB,QAAA;KACF;IACA;IACE,mBAAmB;IACnB,QAAA,YAAmB;IACnB,+BAAqB,4BAAyB;GAC9C;GACE,MAAI,iBAAA,cAAA;IACF,mBAAA;IACE,mBAAM;IACN,MAAA,eAAU,gBAAA,SAAA;IACV,MAAA,wBAAQ;KACR,IAAA;MACE,uBAAA,IAAA,MAAA,SAAA;OACA,MAAA;OACA,UAAW;OACX,QAAA;OACA,eAAA;QACA;QACF;QACC,WAAA;QACL,cAAQ;QACN,iBAAA;QACA,GAAO,iBAAA,KAAA,IAAA,CAAA,IAAA,EAAA,aAAA;OACT;MACA,GAAA,eAAoB;KACpB,QAAO;MACT,uBAAA,KAAA;MACA,OAAM;KACJ;KACE,QAAA,YAAY;KACZ,OAAA;IACF;IACA,MAAA,qBAAA;KACA,IAAA,uBAAA,KAA+B,GAAA;MAC/B,YAAQ;MACR;KACE;KACE,+BAAM;KACN,+BAAI,KAAA;KACJ,QAAQ,aAAA;KACV,IAAA;MACE,qBAAoB,IAAA,MAAO,SAAS;OACjC,MAAA;OACQ,IAAA;OACX,QAAA;MACA,SAAS,oBAAA,eAAA;OACT,QAAK,YAAiB,OAAY,SAAO;OACzC;OACJ;OACE,cAAA;OACA,SAAQ;OACR,GAAA,iBAAA,KAAA,IAA+B,CAAA,IAAA,EAAA,aAAA;MACjC,CAAA,CAAA;KACF,QAAA;MACI,qBAAoB,KAAA;MACtB,QAAA,YAAmB;MACnB,+BAAA,4BAAA;KACF;IACA;IACF,IAAA,CAAA,gBAAA,GAAA;KACI,mBAAa,KAAA;KACf;IACA;IACE,+BAAyB,4BAAoC;GAG9D;GACD,IAAA,aAAiB;IAAiB,IAAA,OAAY,aAAA,eAAA,OAAA,qBAAA,aAAA,aAAA,mBAAA;IAAM,MAAA,WAAkB,IAAA,uBAAwB;KAAG,IAAA,qBAAS,KAAA,KAAA,uBAAA,KAAA,KAAA,SAAA,cAAA,0BAAA,MAAA,MAAA,mBAAA;IAAM,CAAA;IAChH,SAAA,QAAa,SAAA,MAAA;KACX,YAAS;KACT,iBAAmB,CAAA,wBAAA;KACrB,SAAA;IACC,CAAA;IACH,aAAU;KACR,SAAM,WAAA;KACN,mBAAK;IACL;GACA,GAAA,qCACc;GAEhB,IAAG,MAAA,OAAA,gCAAsB,IAAA,MAAA,SAAA;IACzB,MAAI;IACF,KAAM;IACN,QAAQ;IACR,SAAS,eAAmD,EAAA,YAAA,SAAA,eAAA,WAAA,IAAA,EAAA;GAC1D,GAAA,qBAAA,CAAA;GACA,IAAA,MAAA,OAAW,oCAAsC,IAAA,MAAA,SAAA;IACnD,MAAA;IACC,QAAA;IACH,SAAU,eAAO;KACf;KACA,YAAI,SAAA,eAAA,WAAA,IAAA;IAGJ;GACA,GAAA,kBAAQ,CAAA;GACR,IAAA,MAAS,OAAA,iCAAqD,IAAA,MAAA,SAAA;IAC5D,MAAA;IACA,IAAA;IACA,OAAI;IAEA,QAAM;IACN,SAAI,eAAqB;KACzB;KACA;KACA,GAAA,aAAa,KAAA,KAAA,iBAAA,KAAA,IAAA,CAAA,IAAA,EAAA,aAAA,kBAAA;MAEjB,MAAA,QAAA,SAAA,MAAA,SAAA;MACF,IAAA,UAAA,KAAA,GAAA;MACC,MAAA,QAAA,aAAqB,MAAA,IAAA,KAAA;MACpB,IAAA,MAAM,MAAO,YAAA,CAAA,CAAA,MAAA,KAAA,MAAiC,IAAI,MAAM,SAAS,aAAA;MACnE,MAAM,OAAA;KACN,EAAI;IAGJ;GACA,GAAA,oBAAQ,CAAA;GACR,IAAA,MAAS,OAAA,iCAAsD,IAAA,MAAA,SAAA;IAC7D,MAAM;IACN,IAAA;IACE,OAAA;IACA,QAAA;IACA,SAAI,cAAiB;KACvB,MAAA,eAAA,gBAAA,SAAA;KACF,OAAA;MACC;MACC,gBAAa,cAAa,SAAe;MAEzC,GAAM,iBAAA,KAAA,IAAA,CAAA,IAAA,EAAA,aAAA;KACN;IACA;GACA,GAAA,sBAAQ,CAAA;GACR,IAAA,aAAS,KAAA,KAAA,eAAsE,KAAA,KAAA,iBAAA,KAAA,KAAA,eAAA,KAAA,GAAA,IAAA,MAAA,OAAA,iCAAA,IAAA,MAAA,SAAA;IAC7E,MAAA;IACA,IAAA;IACE,OAAM;IACN,QAAI;IACJ,SAAM,qBAAc;KACpB;KACA,SAAM,OAAW,KAAA,QAAY,aAAM,eAAc;MACjD,MAAM,cAAW,SAAM,MAAA,eAAuB;MAC9C,IAAI,gBAAkB,KAAA,GAAA,MAAY,IAAA,MAAA,EAAA,8BAAA,CAAA;MAChC,MAAA,cAAmB,aAAA,MAAA,IAAA,WAAA;MACnB,MAAA,QAAA,YAAA,MAAA,YAAA,CAAA,CAAA;MACF,MAAA,WAAA,YAAA,MAAA,YAAA,CAAA,CAAA;MACA,MAAA,WAAW,MAAA,kBAAoB,KAAA,QAAA,aAAA,KAAA,GAAA,UAAA;MAC/B,IAAM,SAAA,SAAkB,YAAW;OACnC,YAAW,OAAA;OACX;MACA;MACA,WAAI,oBAA2B;MAC/B,MAAM,YAAA,MAAiB,WAAM,OAAe,EAAA,MAAA,SAAa,KAAO,CAAA;MAAE,WAAW,kBAAA;MAAiB,MAAA,kBAAa,MAAA,WAAA,iBAAA,UAAA,WAAA;MAAU,MAAA,cAAA,SAAA,MAAA,eAAA;MACrH,IAAK,gBAAe,KAAO,GAAA,MAAI,IAAM,MAAI,EAAM,8BAA4B,CAAA;MAC3E,MAAA,iBAAyB,MAAA,WAAiB,IAAA,aAAe,OAAO;OAChE,WAAM;OACN,aAAW;MACX,CAAA;MACA,IAAI,CAAA,eAAc,OAAA,IAAY,MAAS,IAAA,MAAK,eAAA,OAAA,MAAA,OAAA;MAC5C,SAAI,gBAAqB,iBAAiB,eAAoB,OAAA,MAAS,WAAS;MAChF,MAAA,cAAc,aAAe,MAAA,IAAA,WAAA;MAC7B,WAAW,oBAAY;MACvB,IAAA,SAAY,SAAO,KAAA,CAAA,YAAA,UAAA,QAAA,GAAA,MAAA,IAAA,MAAA,EAAA,+BAAA,CAAA;MACnB,IAAA,UAAY,IAAA,YAAW,SAAA,KAAA;MACvB,IAAK,SAAM,YAAW,KAAU,GAAA,MAAA,oBAAwB,SAAO,SAAA,eAAA;MACjE,SAAA,KAAA,eAAA;MACF,WAAA,YAAA;MACC,YAAA,OAAA;MAED,YAAa,SAGf,EAAA;MACM,KAAA,MAAA,WAAqB,UAAa,YAAS,YAAK,OAAc;KAChE;IAEN;GACE,GAAA,4BAAM,CAAA;GACN,IAAI,aAAA,KAAA,GAAA,IAAA,aAAA,SAAA,KAAA,gBAAA;IACJ,IAAA,qBAAO,KAAA,KAAA,SAAA,KAAA,YAAA,CAAA,CAAA,YAAA,kBAAA,mBAAA;GACP,CAAA,GAAA,4CAAoB;GACpB,IAAA,MAAA,OAA6C,0BAAE,IAAA,MAAA,SAAA;IAC9C,MAAA;IACL,IAAA"}
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.tasksPanel","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.settingsPage","styles.settingsHero","styles.settingsMark","styles.settingsHeading","styles.settingsBody","styles.settingsCard","styles.settingsCardHeader","styles.settingsSectionHeading","styles.button","styles.notice","styles.diagnosticGrid","styles.diagnosticLabel","styles.diagnosticValue","styles.settingsActions","styles.settingsLink","styles.primaryButton","record","response","record","record","styles.repositoryItemSuccess","styles.repositoryItemWarning","styles.repositoryItemError","styles.repositoryItem","styles.repositoryItemDot","styles.repositoryItemLabel","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.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","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.diffCommentButtonClass","styles.diffLineNumber","styles.diffLineMarker","styles.diffFile","styles.diffFileHeader","styles.chevron","styles.chevronOpen","styles.diffFilePath","styles.diffFileStats","styles.diffAdd","styles.diffDelete","styles.diffCode","styles.diffCommentBlock","styles.diffCommentCardMeta","styles.reviewCommentChipRemove","styles.diffCommentCardText","styles.diffGhCommentAuthor","styles.diffGhCommentLink","styles.diffCommentTextareaClass","styles.diffCommentTextarea","styles.diffCommentError","styles.diffCommentActions","styles.diffCommentActionButton","styles.diffCommentSubmitButton","styles.diffModalCss","styles.panelIconButtonCss","styles.diffCommentCss","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.tasksPanel","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.heroWorktreeProgressCard","styles.heroWorktreeProgressHeader","styles.heroWorktreeProgressSpinner","styles.heroWorktreeProgressError","styles.heroWorktreeProgressCopy","styles.heroWorktreeProgressTitle","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.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/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'\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.233'\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_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_JIRA_PATH = '/plugins/dsh-claude/jira'\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 } 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 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\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 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/** Fold raw sidecar activity into the same lifecycle cards the old event projection rendered. */\r\nfunction activityRows(\r\n activities: readonly ClaudeActivityEvent[],\r\n accepts: (activity: ClaudeActivityEvent) => boolean,\r\n tasks: readonly ClaudeTaskInfo[] = [],\r\n): readonly ClaudeActivityChatData[] {\r\n const rows: ClaudeActivityChatData[] = []\r\n const byId = new Map<string, number>()\r\n for (const value of activities) {\r\n if (!accepts(value) || !isProjectedTaskActivity(value, tasks)) continue\r\n const existingTaskId = value.toolUseId === undefined ? undefined : `task-${value.toolUseId}`\r\n const updatesExistingTask = value.kind === 'tool-result'\r\n && existingTaskId !== undefined\r\n && byId.has(existingTaskId)\r\n if (!presentable(value) && !updatesExistingTask) continue\r\n let id: string\r\n if ((isTaskActivity(value) || updatesExistingTask) && existingTaskId !== undefined) id = existingTaskId\r\n else if (value.kind === 'subagent' && value.parentToolUseId !== undefined) id = `task-${value.parentToolUseId}`\r\n else if (value.kind === 'subagent' && value.taskId !== undefined) id = `subagent-task-${value.taskId}`\r\n else if (value.kind === 'subagent' && value.toolUseId !== undefined) id = `call-${value.toolUseId}`\r\n else id = `act-${value.turn}-${value.step}-${value.ordinal}`\r\n const index = byId.get(id)\r\n if (index === undefined) {\r\n byId.set(id, rows.length)\r\n rows.push({ activity: value, running: running(value), subcalls: [] })\r\n continue\r\n }\r\n const previous = rows[index]\r\n if (previous === undefined) continue\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[index] = { ...previous, subcalls }\r\n continue\r\n }\r\n rows[index] = {\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 rows.map(row => {\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\r\nexport function activityRowsForTurn(\r\n activities: readonly ClaudeActivityEvent[],\r\n turn: number,\r\n tasks: readonly ClaudeTaskInfo[] = [],\r\n): readonly ClaudeActivityChatData[] {\r\n return activityRows(activities, activity => activity.turn === turn, tasks)\r\n}\r\n\r\nexport function activityRowsForStep(\r\n activities: readonly ClaudeActivityEvent[],\r\n turn: number,\r\n step: number,\r\n tasks: readonly ClaudeTaskInfo[] = [],\r\n): readonly ClaudeActivityChatData[] {\r\n return activityRows(activities, activity => activity.turn === turn && activity.step === step, tasks)\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\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 && activity.step === step)\r\n .slice()\r\n .sort((left, right) => left.ordinal - right.ordinal)\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 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) {\r\n const row = activityRows([activity], () => true, tasks)[0]\r\n if (row !== undefined) items.push({ kind: 'activity', ordinal: activity.ordinal, row })\r\n }\r\n }\r\n for (const activity of ordered) {\r\n if (!isProjectedTaskActivity(activity, tasks)) continue\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 === '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 const row = activityRows([activity], () => true, tasks)[0]\r\n if (row !== undefined) items.push({ kind: 'activity', ordinal: activity.ordinal, row })\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\n * before the native assistant message or at step settlement when none appears. */\nexport const claudeActivityStepDefinition: ConversationNodeDefinition<ClaudeActivityStepState> = {\r\n kind: 'claude-activity-step',\r\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 },\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 },\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 {\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 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 width: 'calc(100% - 16px)',\r\n height: 'calc(100% - 16px)',\r\n minWidth: 0,\r\n margin: 8,\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 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: 12,\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 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: 12,\r\n lineHeight: '18px',\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: 34,\r\n minHeight: 34,\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: 12,\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: 34,\r\n display: 'grid',\r\n placeItems: 'center',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 12,\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: 12,\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 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 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 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\nexport const heroTicketKey: CSSProperties = {\r\n flex: 'none',\r\n color: 'var(--dsw-alias-label-tertiary)',\r\n fontSize: 11,\r\n fontWeight: 650,\r\n letterSpacing: 0.2,\r\n}\r\n\r\nexport const heroTicketStatus: CSSProperties = {\r\n flex: 'none',\r\n maxWidth: 90,\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 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\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 align-self: center;\r\n margin: 0 2px;\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 width: 'calc(100% - 16px)',\r\n height: 'calc(100% - 16px)',\r\n minWidth: 0,\r\n margin: 8,\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: 12,\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 overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\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: 12,\r\n fontWeight: 650,\r\n}\r\n\r\nexport const diffCode: CSSProperties = {\r\n minWidth: 'max-content',\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 whiteSpace: 'pre',\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 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: 24px;\r\n line-height: 32px;\r\n}\r\n.dshClaudeRepositoryActionModalContent > p {\r\n font-size: 18px;\r\n line-height: 28px;\r\n}\r\n.dshClaudeRepositoryActionModal input[type='checkbox'] {\r\n width: 18px;\r\n height: 18px;\r\n}\r\n.dshClaudeRepositoryActionModal textarea:focus,\r\n.dshClaudeRepositoryActionModal input:not([type='checkbox']):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: 16,\r\n lineHeight: '24px',\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: 15,\r\n lineHeight: '22px',\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: 16,\r\n lineHeight: '24px',\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: 16,\r\n lineHeight: '24px',\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: 16,\r\n lineHeight: '24px',\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: 16,\r\n lineHeight: '24px',\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: 42,\r\n padding: '8px 18px',\r\n fontSize: 16,\r\n lineHeight: '24px',\r\n}\r\n\r\nexport const diffModalStatus: CSSProperties = {\r\n margin: 0,\r\n color: 'var(--dsw-alias-label-secondary)',\r\n fontSize: 16,\r\n lineHeight: '24px',\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: 16,\r\n lineHeight: '24px',\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: 16,\r\n lineHeight: '24px',\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 style={styles.tasksPanel}>\r\n <style data-dsh-claude-panel-icon-styles>{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","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\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 /** 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 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 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 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 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, ClaudeSubcall, ClaudeTranscriptTool } from './conversation-sidecar.ts'\r\nimport { transcriptItemsForStep } from './conversation-sidecar.ts'\r\nimport { selectStepActivities } from './projection.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-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\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 === '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","import { CLAUDE_JIRA_PATH } from '../constants.ts'\r\nimport type { JiraStatus, JiraTicket } from '../jira.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}`, { credentials: 'same-origin', ...init })\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 { CLAUDE_DOCTOR_PATH, CLAUDE_GLOBAL_SETTINGS_PATH, CLAUDE_UPDATE_CHECK_PATH, CLAUDE_UPDATE_PATH } from '../constants.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\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, { credentials: 'same-origin', headers: { accept: 'application/json' } })\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 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 <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 <div key={setting.key} style={styles.diagnosticGrid}>\r\n <span style={styles.diagnosticLabel}>{setting.key === 'outputStyle'\r\n ? t('outputStyle')\r\n : setting.key === 'worktreeBranchPrefix'\r\n ? t('worktreeBranchPrefix')\r\n : setting.key === 'maxProcesses'\r\n ? t('maxProcessesSetting')\r\n : setting.key === 'idleTimeoutMinutes' ? t('idleTimeoutSetting') : setting.key}</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 {globalSettings?.settings.some(setting => setting.effect === 'new-session') === true\r\n ? <p style={styles.notice}>{t('globalSettingsNewSession')}</p>\r\n : null}\r\n {globalSettings?.settings.some(setting => setting.effect === 'next-worktree') === true\r\n ? <p style={styles.notice}>{t('worktreeBranchPrefixEffect')}</p>\r\n : null}\r\n {globalSettings?.settings.some(setting => setting.key === 'maxProcesses') === true\r\n ? <p style={styles.notice}>{t('limitsSettingEffect')}</p>\r\n : null}\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\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 === undefined ? {} : { 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 === undefined ? {} : { 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 })).then(result)\r\n}\r\n","import { 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\n\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\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 === undefined ? {} : { signal }),\r\n }))\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\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 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 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\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 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","import { CLAUDE_REPOSITORY_FEEDBACK_PATH } from '../constants.ts'\r\nimport type { FailingCheck, PullRequestReviewComment } from '../pr-feedback.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 === undefined ? {} : { 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.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[]): string {\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${conflicts.map(file => `- ${file}`).join('\\n')}`\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 } 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\nconst RATE_LIMIT_TITLE_PREFIX = 'Claude rate limit'\r\nconst RATE_LIMIT_BLOCKING_TITLE = 'Claude rate limit is blocking requests'\r\n\r\n/** Whether the newest quota update in the activity feed reports a blocked state. */\r\nexport function rateLimitBlocked(activities: readonly { readonly title?: string }[]): boolean {\r\n for (let index = activities.length - 1; index >= 0; index -= 1) {\r\n const title = activities[index]?.title\r\n if (title?.startsWith(RATE_LIMIT_TITLE_PREFIX) === true) return title === RATE_LIMIT_BLOCKING_TITLE\r\n }\r\n return false\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\nfunction StatusItem({ label, tone = 'neutral' }: { label: string; tone?: 'neutral' | 'success' | 'warning' | 'error' }) {\r\n const toneStyle = tone === 'success'\r\n ? styles.repositoryItemSuccess\r\n : tone === 'warning' ? styles.repositoryItemWarning : tone === 'error' ? styles.repositoryItemError : {}\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 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 <StatusItem label={t('repositoryChecks_failing')} tone=\"error\" />\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 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 }).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 {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 ?? [])); 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. */\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 const rateLimited = rateLimitBlocked(projection.activities)\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 {rateLimited ? <StatusItem label={t('repositoryRateLimited')} tone=\"warning\" /> : null}\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 {rateLimited ? <StatusItem label={t('repositoryRateLimited')} tone=\"warning\" /> : null}\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 : <StatusItem\r\n label={t(`repositoryChecks_${pullRequest.checks}` as ClaudeCodeSettingsKey)}\r\n tone={pullRequest.checks === 'passing' ? 'success' : 'warning'}\r\n />}\r\n {pullRequest.review === 'none' ? null : <StatusItem\r\n label={t(`repositoryReview_${pullRequest.review}` as ClaudeCodeSettingsKey)}\r\n tone={pullRequest.review === 'approved' ? 'success' : pullRequest.review === 'changes-requested' ? 'error' : 'neutral'}\r\n />}\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'\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; 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'>): string {\n const name = comment.path.split('/').at(-1) ?? comment.path\n return `${name}:${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} · {comment.side === 'old' ? t('reviewCommentOldSide', { line: comment.line }) : t('reviewCommentNewSide', { line: comment.line })}</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'\r\nimport {\r\n IconChevronDownOutline14,\r\n IconCloseOutline16,\r\n IconFullscreenOutline16,\r\n Menu,\r\n Modal,\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 * 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\ninterface 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}\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 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 if (previousOldEnd !== undefined && nextOld > previousOldEnd) {\r\n numbered.push({ line: `${nextOld - previousOldEnd} unmodified lines`, kind: 'collapsed' })\r\n }\r\n oldLine = nextOld\r\n newLine = Number(hunk[3])\r\n previousOldEnd = nextOld + Number(hunk[2] ?? 1)\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 return numbered\r\n}\r\n\r\nexport interface ReviewCommentAnchor {\r\n readonly line: number\r\n readonly side: ReviewCommentSide\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, onComment }: { entry: NumberedDiffLine; addLabel: string; onComment?: (() => void) | undefined }) {\r\n const style = entry.kind === 'add'\r\n ? styles.diffLineAdd\r\n : entry.kind === 'delete' ? styles.diffLineDelete : entry.kind === 'hunk' || entry.kind === 'collapsed' ? 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 <div className={styles.diffLineRowClass} style={{ ...styles.diffLine, ...style }}><button type=\"button\" className={styles.diffCommentButtonClass} disabled={onComment === undefined} aria-label={addLabel} onClick={onComment}>+</button><span style={styles.diffLineNumber}>{lineNumber}</span><span style={styles.diffLineMarker}>{entry.kind === 'add' ? '+' : entry.kind === 'delete' ? '−' : entry.kind === 'collapsed' ? '⌄' : ' '}</span><span>{entry.kind === 'collapsed' ? entry.line : entry.line.slice(entry.kind === 'hunk' ? 0 : 1)}</span></div>\r\n}\r\n\r\ninterface DiffFileSectionProps {\r\n readonly file: DiffFile\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, initiallyOpen, t, comments, ghComments, editorAnchor, editorNode, onOpenEditor, onRemoveComment }: DiffFileSectionProps) {\r\n const [open, setOpen] = useState(initiallyOpen)\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}>{file.path}</span>\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}>{numberDiffLines(file.lines).map((entry, index) => {\r\n const anchor = commentAnchorForLine(entry)\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 return (\r\n <Fragment key={`${index}:${entry.line}`}>\r\n <DiffLine entry={entry} addLabel={t('reviewCommentAdd')} onComment={anchor === undefined ? undefined : () => onOpenEditor(anchor)} />\r\n {lineComments.map(comment => (\r\n <div key={comment.id} style={styles.diffCommentBlock}>\r\n <div style={styles.diffCommentCardMeta}>\r\n <span>{comment.side === 'old' ? t('reviewCommentOldSide', { line: comment.line }) : t('reviewCommentNewSide', { line: comment.line })}</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.diffGhCommentAuthor}>GitHub · @{comment.author}</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 <p style={styles.diffCommentCardText}>{comment.body}</p>\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 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 <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.diffModalCss}{styles.panelIconButtonCss}{styles.diffCommentCss}</style>\r\n <div 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 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 { autoFixEnabled } from './auto-fix.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}\r\n\r\nexport interface OverviewSessionsStore {\r\n subscribe(listener: () => void): () => void\r\n getSnapshot(): { readonly byId: Readonly<Record<string, OverviewSessionRow | undefined>> }\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}\r\n\r\nexport const OVERVIEW_REFRESH_MS = 30_000\r\n\r\n/** Claude sessions worth listing: non-blank, with a checkout; running first. */\r\nexport function claudeSessionRows(byId: Readonly<Record<string, OverviewSessionRow | undefined>>): readonly OverviewSessionRow[] {\r\n return Object.values(byId)\r\n .filter((row): row is OverviewSessionRow => row !== undefined && row.agentPreset === 'claude' && row.blank !== true && 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\nexport function ClaudePullRequestsPanel({ t, closeDetails, openSession, loadStatus, sessions }: ClaudePullRequestsPanelInjected) {\r\n const snapshot = useSyncExternalStore(sessions.subscribe, sessions.getSnapshot, sessions.getSnapshot)\r\n const rows = useMemo(() => claudeSessionRows(snapshot.byId), [snapshot.byId])\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 style={styles.tasksPanel}>\r\n <style data-dsh-claude-overview-styles>{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 </span>\r\n </button>\r\n )\r\n })}\r\n </div>\r\n </div>\r\n )\r\n}\r\n","const PORTAL_ATTRIBUTE = 'data-dsh-claude-hero-controls'\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>('[data-phase=\"hero\"]'))\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\nexport function ensureClaudeHeroPortal(seat: Element): HTMLElement {\r\n const sibling = seat.nextElementSibling\r\n if (sibling instanceof HTMLElement && sibling.hasAttribute(PORTAL_ATTRIBUTE)) return sibling\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, IconSearchOutline16 } 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 } from './hero-dom-bridge.ts'\r\nimport { loadRepositoryBranches, 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 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}\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\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\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\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, t, onDismiss,\r\n}: {\r\n stage: RepositoryPreparationStage\r\n error?: 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}>{error === undefined ? t('repositoryProgressTitle') : t('repositoryProgressFailed')}</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 onMenuOpenChange, 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 onMenuOpenChange: (open: boolean) => 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 [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 <label style={styles.heroBranchSearch}>\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 <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={worktree}\r\n disabled={busy}\r\n style={{\r\n ...styles.heroWorktreeToggle,\r\n ...(worktree || worktreeHovered ? styles.heroWorktreeToggleActive : {}),\r\n ...(worktreeFocused ? styles.heroWorktreeToggleFocused : {}),\r\n }}\r\n onMouseEnter={() => { setWorktreeHovered(true) }}\r\n onMouseLeave={() => { setWorktreeHovered(false) }}\r\n onFocus={() => { setWorktreeFocused(true) }}\r\n onBlur={() => { setWorktreeFocused(false) }}\r\n onClick={() => { onWorktreeChange(!worktree) }}\r\n >\r\n <span aria-hidden=\"true\" style={{ ...styles.heroWorktreeCheckbox, ...(worktree ? styles.heroWorktreeCheckboxChecked : {}) }}>\r\n {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,\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 [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 [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 [ticket, setTicket] = useState<JiraTicket>()\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 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 const reconcile = (): void => {\r\n scheduled = false\r\n const target = locateClaudePresetSeat()\r\n if (target === undefined) {\r\n removeClaudeHeroPortals()\r\n setPortal(undefined)\r\n return\r\n }\r\n setPortal(ensureClaudeHeroPortal(target.seat))\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 setProgressStage(undefined)\r\n setProgressError(undefined)\r\n setError(undefined)\r\n setTicket(undefined)\r\n setTicketMenuOpen(false)\r\n setTicketQuery('')\r\n setTicketResults(undefined)\r\n setTicketError(undefined)\r\n if (portal === undefined || path === undefined) return\r\n const controller = new AbortController()\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) setError(reason instanceof Error ? reason.message : String(reason))\r\n })\r\n return () => { controller.abort() }\r\n }, [portal, 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 || ticket !== undefined || 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 && ticket === undefined)) 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 setProgressStage(worktree ? 'inspecting' : undefined)\r\n setError(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, selected, ticket, 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 const chooseTicket = (next: JiraTicket | undefined): void => {\r\n setTicket(next)\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 onMenuOpenChange={setMenuOpen}\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 <button\r\n type=\"button\"\r\n style={styles.heroBranchTrigger}\r\n aria-expanded={ticketMenuOpen}\r\n aria-label={t('heroTicketMenu')}\r\n title={t('heroTicketMenu')}\r\n disabled={busy}\r\n onClick={() => { setTicketMenuOpen(!ticketMenuOpen) }}\r\n >\r\n <TicketIcon />\r\n <span style={styles.heroBranchName}>{ticket === undefined ? t('heroTicket') : ticket.key}</span>\r\n <IconChevronDownOutline14 />\r\n </button>\r\n {ticketMenuOpen ? (\r\n <span role=\"menu\" style={styles.heroBranchMenu} 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 <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 : <>\r\n {ticket === undefined ? null : (\r\n <button type=\"button\" role=\"menuitem\" style={styles.heroBranchItem} onClick={() => { chooseTicket(undefined) }}>\r\n <span style={styles.heroBranchItemName}>{t('heroTicketNone')}</span>\r\n </button>\r\n )}\r\n {ticketResults.length === 0 ? <span style={styles.heroBranchEmpty}>{t('heroTicketEmpty')}</span> : ticketResults.map(item => (\r\n <button key={item.key} type=\"button\" role=\"menuitem\" aria-current={item.key === ticket?.key ? 'true' : undefined} style={styles.heroBranchItem} onClick={() => { chooseTicket(item) }}>\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 </>}\r\n {progressStage === undefined || (!busy && progressError === undefined) ? null : (\r\n <WorktreeProgressCard\r\n stage={progressStage}\r\n {...(progressError === undefined ? {} : { error: progressError })}\r\n t={t}\r\n onDismiss={() => { setProgressStage(undefined); setProgressError(undefined) }}\r\n />\r\n )}\r\n </span>\r\n ), portal)\r\n}\r\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","const DETAILS_MIN_WIDTH = 300\r\nconst DETAILS_DEFAULT_WIDTH = 480\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 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: 'Output Style 修改仅对新建 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 limitsSettingEffect: '进程上限在下次启动 Claude 进程时生效;闲置回收时长在下一次回合结束后生效。留空或非法值会被拒绝。',\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 repositoryRateLimited: 'Claude 额度限流中',\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 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 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 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 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;普通 checkout 则切回 base 分支并删除已合并分支。',\r\n cleanupCompleted: '已清理 {branch}',\r\n overviewOpen: '查看所有 Claude 会话的 Pull Request',\r\n overviewTitle: 'Pull requests',\r\n overviewBody: '所有 Claude 会话的分支与 PR 状态',\r\n overviewEmpty: '没有正在进行的 Claude 会话',\r\n overviewNoPr: '无 PR',\r\n overviewRunning: '运行中',\r\n overviewAutoFix: 'Auto fix 已开启',\r\n overviewLoading: '读取中…',\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} 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 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: 'Output Style 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 limitsSettingEffect: 'The process limit applies when the next Claude process is admitted; the idle timeout applies after the next completed turn.',\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 repositoryRateLimited: 'Rate limited',\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 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 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: 'Merge origin/{base} into the current branch and push; hand any conflicts to Claude.',\r\n diffUpdateBranchBehind: '{count} commit(s) behind origin/{base}',\r\n diffUpdateBranchCompleted: 'Merged and pushed commit {commit}',\r\n diffUpdateBranchConflicts: 'The merge 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: 'No ticket',\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 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: 'Show pull requests across Claude sessions',\r\n overviewTitle: 'Pull requests',\r\n overviewBody: 'Branch and pull request state across Claude sessions',\r\n overviewEmpty: 'No active Claude sessions',\r\n overviewNoPr: 'No PR',\r\n overviewRunning: 'Running',\r\n overviewAutoFix: 'Auto fix on',\r\n overviewLoading: 'Loading…',\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} 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 { ClaudeHeroRepositoryControls, type ClaudeHeroRepositoryControlsInjected } from './ClaudeHeroRepositoryControls.tsx'\r\nimport { ClaudeProjectionStore, type ClaudeProjectionSource } from './projection.ts'\r\nimport { createClaudeCommandSource } from './claude-command-source.ts'\r\nimport { enableExpandedDetailsResize } from './details-resize.ts'\r\nimport { bindRepositoryLease, loadRepositoryStatusFor, prepareRepository } 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 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 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 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 }),\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 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 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) await workspaces.delete(workspace.workspaceId)\r\n },\r\n }),\r\n }\r\n },\r\n }, ClaudeRepositoryStatus))\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 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 if (prepared.leaseId !== undefined) await bindRepositoryLease(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 }),\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"],"mappings":"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"}