@norman-else/dsh-claude 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","names":["taskMeta","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.tasksHeader","styles.tasksHeading","styles.tasksClose","styles.tasksBody","styles.tasksGroupEmpty","styles.taskCardList","styles.tasksFinishedSection","styles.tasksHeaderButton","styles.tasksHeaderButtonActive","styles.tasksTriggerHoverCss","styles.tasksBadgeInline","styles.tasksTurnLauncher","styles.tasksTurnLauncherDot","styles.settingsPage","styles.settingsHeading","styles.settingsBody","styles.diagnosticGrid","styles.diagnosticLabel","styles.diagnosticValue","styles.button","#sources"],"sources":["../src/constants.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/ClaudeActivityNode.tsx","../src/client/ClaudeCodeSettings.tsx","../src/client/projection.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 LEGACY_CLAUDE_CODE_PROVIDER = 'claude-code-cli'\nexport const LEGACY_CLAUDE_CODE_PRESET_ID = 'claude-code-cli'\nexport const CLAUDE_CODE_PROVIDER_IDS = [CLAUDE_CODE_PROVIDER, LEGACY_CLAUDE_CODE_PROVIDER] as const\nexport function isClaudePresetId(value: string | undefined): boolean {\n return value === CLAUDE_CODE_PRESET_ID || value === LEGACY_CLAUDE_CODE_PRESET_ID\n}\nexport function isClaudeProvider(value: string | undefined): boolean {\n return value === CLAUDE_CODE_PROVIDER || value === LEGACY_CLAUDE_CODE_PROVIDER\n}\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_PROJECTION_PATH = '/plugins/dsh-claude/projection'\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 { isClaudeProvider, TASK_TOOL_NAMES } from '../constants.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 ClaudeTurnMarker {\n readonly turn: number\n}\n\nexport interface ClaudeActivityStepMarker {\n readonly turn: number\n readonly step: 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 }\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)) 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.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\ninterface ClaudeActivityStepState extends ClaudeActivityStepMarker {\n readonly assistantSeq?: number\n}\n\n/** Anchor one sidecar-backed activity group immediately before its Claude assistant step. */\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 !== 'assistant/message' || !isClaudeProvider(event.data.message.source.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 { turn: match.event.data.turn, step: match.event.data.step }\n },\n update(context, match) {\n if (match.event.type !== 'assistant/message') throw new Error('Claude activity step update requires assistant/message')\n return { ...context.state, assistantSeq: match.event.seq }\n },\n buildViewNode(context): ChatConversationViewNode | null {\n const state = context.state\n if (state?.assistantSeq === undefined) return null\n return {\n key: context.key,\n kind: 'claude-activity-step',\n id: context.id,\n target: 'chat',\n anchorSeq: state.assistantSeq - 0.1,\n location: context.start?.location ?? { kind: 'unresolved' },\n visibility: 'visible',\n data: { turn: state.turn, step: state.step },\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' || !isClaudeProvider(event.data.message.source.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: 18,\n maxWidth: 760,\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 settingsBody: CSSProperties = {\n margin: 0,\n color: 'var(--dsw-alias-label-secondary)',\n fontSize: 14,\n lineHeight: '22px',\n}\n\nexport const diagnosticGrid: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'minmax(130px, 0.4fr) minmax(0, 1fr)',\n gap: '9px 18px',\n padding: '16px 0',\n borderTop: '1px solid var(--dsw-alias-border-l2)',\n borderBottom: '1px solid var(--dsw-alias-border-l2)',\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 overflowWrap: 'anywhere',\n}\n\nexport const button: CSSProperties = {\n alignSelf: 'flex-start',\n minHeight: 34,\n padding: '6px 14px',\n border: '1px solid var(--dsw-alias-border-l2)',\n borderRadius: 18,\n background: 'var(--dsw-alias-bg-layer-1)',\n color: 'var(--dsw-alias-label-primary)',\n font: 'inherit',\n fontSize: 13,\n cursor: 'pointer',\n}\n\n/* Claude tasks details panel (right sidebar). */\n\nexport const tasksPanel: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n minWidth: 0,\n background: 'var(--dsw-alias-bg-base)',\n}\n\nexport const tasksHeader: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 8,\n padding: '12px 14px',\n borderBottom: '1px solid var(--dsw-alias-border-l2)',\n}\n\nexport const tasksHeading: CSSProperties = {\n color: 'var(--dsw-alias-label-primary)',\n fontSize: 14,\n lineHeight: '20px',\n fontWeight: 600,\n}\n\nexport const tasksClose: CSSProperties = {\n width: 26,\n height: 26,\n display: 'grid',\n placeItems: 'center',\n border: 'none',\n borderRadius: 7,\n background: 'transparent',\n color: 'var(--dsw-alias-label-tertiary)',\n fontSize: 15,\n lineHeight: '1',\n cursor: 'pointer',\n}\n\nexport const tasksBody: CSSProperties = {\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n padding: '10px 12px 20px',\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: 12,\n lineHeight: '20px',\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: 12,\n lineHeight: '20px',\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: 10,\n lineHeight: '17px',\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)',\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: '10px 11px',\n border: '1px solid var(--dsw-alias-border-l2)',\n borderRadius: 10,\n background: 'var(--dsw-alias-bg-layer-1)',\n}\n\nexport const taskCardRunning: CSSProperties = {\n borderColor: 'var(--dsw-alias-border-l3)',\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: 13,\n lineHeight: '19px',\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 tasks session-header button (next to Session log). */\n\nexport const tasksTurnLauncher: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 7,\n margin: '6px 0 2px',\n padding: '5px 8px',\n border: 'none',\n borderRadius: 8,\n background: 'transparent',\n color: 'var(--dsw-alias-label-secondary)',\n font: 'inherit',\n fontSize: 12,\n lineHeight: '18px',\n cursor: 'pointer',\n}\n\nexport const tasksTurnLauncherDot: CSSProperties = {\n color: 'var(--dsw-static-blue-450)',\n fontSize: 9,\n}\n\nexport const tasksTriggerHoverCss = [\n '.dsh-claude-tasks-trigger:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}',\n '.dsh-claude-tasks-trigger:focus:not(:focus-visible){outline:none;border-color:var(--dsw-alias-border-l2)}',\n '.dsh-claude-tasks-trigger[aria-pressed=\"true\"]:focus:not(:focus-visible){border-color:var(--dsw-alias-border-l3)}',\n '.dsh-claude-tasks-trigger>span,.dsh-claude-tasks-trigger>svg{flex:none}',\n].join('')\n\nexport const tasksHeaderButton: CSSProperties = {\n minWidth: 111,\n height: 32,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n padding: '6px 12px',\n border: '1px solid var(--dsw-alias-border-l2)',\n borderRadius: 18,\n color: 'var(--dsw-alias-label-primary)',\n fontFamily: 'var(--dsw-font-family)',\n fontSize: 13,\n fontWeight: 400,\n lineHeight: '20px',\n whiteSpace: 'nowrap',\n cursor: 'pointer',\n}\n\nexport const tasksHeaderButtonActive: CSSProperties = {\n borderColor: 'var(--dsw-alias-border-l3)',\n background: 'var(--dsw-alias-interactive-bg-hover)',\n}\n\nexport const tasksBadgeInline: CSSProperties = {\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","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, useSyncExternalStore } from 'react'\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 { formatTokenCount } from './token-format.ts'\n\nexport interface ClaudeTasksPanelInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n closeDetails: () => void\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 return {\n running: tasks.filter(task => task.status === 'running'),\n finished: tasks.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 runningTasksForTurn(tasks: readonly ClaudeTaskInfo[], turn: number) {\n return tasks.filter(task => task.status === 'running' && task.originTurn === turn)\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 }: ClaudeTasksPanelProps) {\n const projection = useClaudeProjection(value => value)\n useEffect(() => {\n if (!projection.owned) closeDetails()\n }, [closeDetails, projection.owned])\n const tasks = projection.tasks?.tasks ?? []\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 <div style={styles.tasksHeader}>\n <span style={styles.tasksHeading}>{t('tasksPanel')}</span>\n <button type=\"button\" style={styles.tasksClose} aria-label={t('tasksClose')} onClick={closeDetails}>×</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\nexport interface ClaudeTasksLauncherInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n isOpen: () => boolean\n toggle: () => void\n subscribe: (fn: () => void) => () => void\n}\n\nexport interface ClaudeTasksHeaderButtonProps extends ClaudeTasksLauncherInjected {\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\n}\n\nexport function ClaudeTasksHeaderButton({ useClaudeProjection, t, isOpen, toggle, subscribe }: ClaudeTasksHeaderButtonProps) {\n const open = useSyncExternalStore(subscribe, isOpen, isOpen)\n const projection = useClaudeProjection(value => value)\n if (!projection.owned) return null\n const runningCount = projection.tasks?.tasks.filter(task => task.status === 'running').length ?? 0\n return (\n <button\n type=\"button\"\n className=\"dsh-claude-tasks-trigger\"\n style={{ ...styles.tasksHeaderButton, ...(open ? styles.tasksHeaderButtonActive : {}) }}\n aria-label={t('tasksOpen')}\n aria-pressed={open}\n onClick={(event) => {\n toggle()\n event.currentTarget.blur()\n }}\n >\n <style>{styles.tasksTriggerHoverCss}</style>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m3 17 2 2 4-4\" /><path d=\"m3 7 2 2 4-4\" /><path d=\"M13 6h8\" /><path d=\"M13 12h8\" /><path d=\"M13 18h8\" />\n </svg>\n <span>{t('tasks')}</span>\n {runningCount === 0 ? null : <span className=\"dsh-claude-act-running\" style={styles.tasksBadgeInline} aria-hidden=\"true\">{runningCount}</span>}\n </button>\n )\n}\n","import { useMemo } from 'react'\nimport type { SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { ClaudeCodeSettingsKey } from './locales.ts'\nimport type { ClaudeClientProjection } from './projection.ts'\nimport type { ClaudeTurnMarker } from './conversation-sidecar.ts'\nimport { runningTasksForTurn } from './ClaudeTasksPanel.tsx'\nimport * as styles from './styles.ts'\n\nexport interface ClaudeActivityTailInjected {\n t: (key: ClaudeCodeSettingsKey, params?: Record<string, unknown>) => string\n openTasks: () => void\n}\n\nexport interface ClaudeActivityTailProps extends ClaudeActivityTailInjected {\n matched: ClaudeTurnMarker\n useClaudeProjection: SnapshotSelectorHook<ClaudeClientProjection>\n}\n\nexport function ClaudeActivityTail({ matched, useClaudeProjection, t, openTasks }: ClaudeActivityTailProps) {\n const projection = useClaudeProjection(value => value)\n const runningTasks = useMemo(\n () => runningTasksForTurn(projection.tasks?.tasks ?? [], matched.turn),\n [projection.tasks, matched.turn],\n )\n if (runningTasks.length === 0) return null\n return (\n <div data-claude-activity-tail={matched.turn}>\n {runningTasks.length === 0 ? null : (\n <button type=\"button\" style={styles.tasksTurnLauncher} onClick={openTasks}>\n <span className=\"dsh-claude-act-running\" style={styles.tasksTurnLauncherDot} aria-hidden=\"true\">●</span>\n <span>{t('tasksRunningCount', { count: runningTasks.length })}</span>\n <span aria-hidden=\"true\">›</span>\n </button>\n )}\n </div>\n )\n}\n","import { useMemo, useState } from 'react'\nimport {\n DisclosureRow,\n IconApiOutline14,\n IconThinkOutline14,\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 } from './conversation-sidecar.ts'\nimport { activityRowsForStep } from './conversation-sidecar.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:4px}',\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);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\nexport function ClaudeActivityNode({ node, useClaudeProjection, t }: ClaudeActivityNodeProps) {\n ensureCss()\n const marker = node.data\n const activities = useClaudeProjection(value => value.activities)\n const tasks = useClaudeProjection(value => value.tasks?.tasks ?? EMPTY_TASKS)\n const rows = useMemo(\n () => activityRowsForStep(activities, marker.turn, marker.step, tasks),\n [activities, marker.step, marker.turn, tasks],\n )\n if (rows.length === 0) return null\n return <div className=\"dsh-claude-flow\">{rows.map((row, index) => <ActivityRow key={`${row.activity.ordinal}:${index}`} row={row} t={t} />)}</div>\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { CLAUDE_DOCTOR_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 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\nexport function ClaudeCodeSettings({ t }: ClaudeCodeSettingsInjected) {\n const [report, setReport] = useState<DoctorReport>()\n const [error, setError] = useState<string>()\n const [busy, setBusy] = 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 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 <div>\n <h2 style={styles.settingsHeading}>{t('title')}</h2>\n <p style={styles.settingsBody}>{t('description')}</p>\n </div>\n {rows.length === 0 ? null : (\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 style={{ ...styles.settingsBody, color: 'var(--dsw-alias-state-error-primary)' }}>{t('error')}: {error}</p>}\n <button type=\"button\" style={styles.button} onClick={() => { void refresh() }} disabled={busy}>\n {busy ? t('refreshing') : t('doctor')}\n </button>\n <div>\n <h3 style={{ ...styles.settingsHeading, fontSize: 15, lineHeight: '22px' }}>{t('security')}</h3>\n <p style={styles.settingsBody}>{t('securityBody')}</p>\n </div>\n </div>\n )\n}\n","import type { HostObservable, SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { ClaudeActivityEvent, ClaudeContextUsageEvent, ClaudeTasksEvent } from '../events.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 activities: readonly ClaudeActivityEvent[]\n readonly contextUsage?: ClaudeContextUsageEvent\n readonly tasks?: ClaudeTasksEvent\n}\n\nexport const EMPTY_CLAUDE_PROJECTION: ClaudeClientProjection = {\n schemaVersion: 1,\n revision: 0,\n owned: false,\n activities: [],\n}\n\nconst POLL_INTERVAL_MS = 2_000\nconst MAX_ACTIVITIES = 10_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\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.activities)\n || input.activities.length > MAX_ACTIVITIES) {\n throw new Error('invalid Claude sidecar 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 return input as unknown as ClaudeClientProjection\n}\n\nexport interface ClaudeProjectionSource extends HostObservable<ClaudeClientProjection> {\n dispose(): void\n}\n\n/** Create one lazy source: active subscribers trigger an immediate load and bounded polling. */\nexport function createClaudeProjectionSource(\n sessionId: string,\n fetchProjection: typeof fetch = fetch,\n pollIntervalMs = POLL_INTERVAL_MS,\n): ClaudeProjectionSource {\n let snapshot = EMPTY_CLAUDE_PROJECTION\n let timer: ReturnType<typeof setTimeout> | undefined\n let controller: AbortController | undefined\n let disposed = false\n const listeners = new Set<() => void>()\n\n const schedule = (): void => {\n if (disposed || listeners.size === 0) return\n timer = setTimeout(() => { void refresh() }, pollIntervalMs)\n }\n const refresh = async (): Promise<void> => {\n if (disposed || listeners.size === 0) return\n controller?.abort()\n controller = new AbortController()\n try {\n const response = await fetchProjection(`${CLAUDE_PROJECTION_PATH}/${encodeURIComponent(sessionId)}`, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n })\n if (!response.ok) throw new Error(`Claude projection request failed (${response.status})`)\n const next = parseClaudeClientProjection(await response.json())\n if (next.revision !== snapshot.revision || next.owned !== snapshot.owned) {\n snapshot = next\n for (const listener of [...listeners]) listener()\n }\n } catch (error) {\n if (!(error instanceof DOMException && error.name === 'AbortError') && snapshot !== EMPTY_CLAUDE_PROJECTION) {\n snapshot = EMPTY_CLAUDE_PROJECTION\n for (const listener of [...listeners]) listener()\n }\n } finally {\n controller = undefined\n schedule()\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 refresh()\n return () => {\n listeners.delete(listener)\n if (listeners.size !== 0) return\n if (timer !== undefined) clearTimeout(timer)\n timer = undefined\n controller?.abort()\n controller = undefined\n }\n },\n dispose() {\n disposed = true\n listeners.clear()\n if (timer !== undefined) clearTimeout(timer)\n timer = undefined\n controller?.abort()\n controller = undefined\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","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 tokens: '{count} 个 token',\n doctor: '运行诊断',\n refreshing: '诊断中…',\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 tasks: '任务',\n tasksPanel: '后台任务',\n tasksEmpty: '当前没有子代理或后台任务',\n tasksOpen: '查看后台任务',\n tasksClose: '关闭任务面板',\n tasksRunning: '运行中',\n tasksNoneRunning: '当前没有运行中的任务',\n tasksSettled: '已结束',\n tasksClear: '清除',\n tasksViewActivity: '查看活动',\n tasksHideActivity: '收起活动',\n tasksRunningCount: '{count} 个运行中任务',\n tasksToolUses: '{count} 次工具调用',\n tasksCompleted: '已完成',\n tasksFailed: '失败',\n tasksStopped: '已停止',\n tasksKilled: '已终止',\n tasksBackground: '后台',\n tasksLastTool: '最近工具 {tool}',\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 tokens: '{count} tokens',\n doctor: 'Run Doctor',\n refreshing: 'Running Doctor…',\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 tasks: 'Tasks',\n tasksPanel: 'Background tasks',\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 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} as const\n\nexport type ClaudeCodeSettingsKey = keyof typeof en\n","import type { ClientContext, ISessions } from '@deepseek-ai/dsh-client-runtime/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/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 { claudeActivityStepDefinition, claudeTurnDefinition, selectClaudeTurn } from './conversation-sidecar.ts'\nimport { ClaudeActivityTail, type ClaudeActivityTailInjected } from './ClaudeActivityTail.tsx'\nimport { ClaudeActivityNode } from './ClaudeActivityNode.tsx'\nimport { ClaudeCodeSettings, type ClaudeCodeSettingsInjected } from './ClaudeCodeSettings.tsx'\nimport { ClaudeTasksHeaderButton, ClaudeTasksPanel, type ClaudeTasksLauncherInjected, type ClaudeTasksPanelInjected } from './ClaudeTasksPanel.tsx'\nimport { ClaudeProjectionStore } from './projection.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 }\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\nexport const name = 'dsh-claude-client'\nexport const inject = ['slots', 'locale', 'conversationEvents', 'sessions']\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 const sessions = ctx.get('sessions') as ISessions | undefined\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.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 // Conditional switching for the details column: the tasks panel registration\n // exists only while the panel is open. While closed, the built-in tool\n // details view (priority 0) owns the single slot again.\n const tasksPanelListeners = new Set<() => void>()\n let disposeTasksDetails: (() => void) | undefined\n let tasksPanelSession: string | undefined\n const notifyTasksPanel = (): void => {\n for (const fn of [...tasksPanelListeners]) fn()\n }\n const closeTasksPanel = (): void => {\n if (disposeTasksDetails === undefined) return\n disposeTasksDetails()\n disposeTasksDetails = undefined\n tasksPanelSession = undefined\n layout?.closeDetails()\n notifyTasksPanel()\n }\n const openTasksPanel = (sessionId: string): void => {\n closeTasksPanel()\n // The details column is a single slot and the built-in conversation UI\n // already occupies priority 0, so register below it (lowest renders) to\n // shadow it until the panel closes.\n try {\n disposeTasksDetails = ctx.slots.register({\n name: 'details',\n priority: -10,\n locale: namespace,\n inject: (): ClaudeTasksPanelInjected => ({\n t,\n closeDetails: closeTasksPanel,\n }),\n }, ClaudeTasksPanel)\n } catch {\n return\n }\n tasksPanelSession = sessionId\n layout?.openDetails()\n notifyTasksPanel()\n }\n const toggleTasksPanel = (sessionId: string): void => {\n if (tasksPanelSession === sessionId) closeTasksPanel()\n else openTasksPanel(sessionId)\n }\n ctx.effect(() => {\n if (typeof document === 'undefined' || typeof MutationObserver === 'undefined') return () => closeTasksPanel()\n const observer = new MutationObserver(() => {\n if (tasksPanelSession !== undefined && document.querySelector('[data-details-collapsed]') !== null) {\n closeTasksPanel()\n }\n })\n observer.observe(document.body, { attributes: true, attributeFilter: ['data-details-collapsed'], subtree: true })\n return () => {\n observer.disconnect()\n closeTasksPanel()\n }\n }, 'dsh-claude: tasks panel lifecycle')\n const tasksLauncher = (sessionId: string): Omit<ClaudeTasksLauncherInjected, 't'> => ({\n isOpen: () => tasksPanelSession === sessionId,\n toggle: () => toggleTasksPanel(sessionId),\n subscribe: (fn) => {\n tasksPanelListeners.add(fn)\n return () => {\n tasksPanelListeners.delete(fn)\n }\n },\n })\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: () => openTasksPanel(sessionId),\n }),\n }, ClaudeActivityTail))\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 (tasksPanelSession !== undefined && sessions.list.getSnapshot().current !== tasksPanelSession) closeTasksPanel()\n }), 'dsh-claude: tasks panel session tracking')\n }\n ctx.slots.inject('conversation.session.header.utilities', () => ctx.slots.register({\n name: 'conversation.session.header.utilities',\n id: 'claude-tasks',\n order: -10,\n label: () => t('tasksOpen'),\n inject: (sessionId: string): ClaudeTasksLauncherInjected => ({\n t,\n ...tasksLauncher(sessionId),\n }),\n }, ClaudeTasksHeaderButton))\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'claude-code',\n order: 16,\n label: () => t('nav'),\n inject: (): ClaudeCodeSettingsInjected => ({ t }),\n }, ClaudeCodeSettings))\n}\n"],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ //#region src/constants.ts
2
+ const CLAUDE_CODE_PROVIDER = "claude";
3
+ const CLAUDE_CODE_PRESET_ID = "claude";
4
+ const LEGACY_CLAUDE_CODE_PROVIDER = "claude-code-cli";
5
+ const LEGACY_CLAUDE_CODE_PRESET_ID = "claude-code-cli";
6
+ const CLAUDE_CODE_PROVIDER_IDS = [CLAUDE_CODE_PROVIDER, LEGACY_CLAUDE_CODE_PROVIDER];
7
+ function isClaudePresetId(value) {
8
+ return value === "claude" || value === "claude-code-cli";
9
+ }
10
+ const CLAUDE_ACTIVITY_EVENT = "claude-code/activity";
11
+ /** Claude's subagent dispatch tools; rendered as plugin-owned group cards
12
+ * gathering subagent activity instead of native tool cards. */
13
+ const TASK_TOOL_NAMES = /* @__PURE__ */ new Set(["Task", "Agent"]);
14
+ const SDK_VERSION = "0.3.233";
15
+ const CLAUDE_DOCTOR_PATH = "/plugins/dsh-claude/doctor";
16
+ const CLAUDE_PROJECTION_PATH = "/plugins/dsh-claude/projection";
17
+ //#endregion
18
+ //#region src/events.ts
19
+ const SECRET_KEY = /(?:^|[_-])(password|passwd|secret|token|api[_-]?key|authorization|credential|private[_-]?key|session[_-]?key|env|environ|environment)(?:$|[_-])/i;
20
+ const MAX_SUMMARY_CHARS = 1e3;
21
+ const MAX_DETAIL_CHARS = 4e3;
22
+ const MAX_DEPTH = 6;
23
+ const MAX_ARRAY_ITEMS = 40;
24
+ const MAX_OBJECT_KEYS = 60;
25
+ const REDACTED = "[REDACTED]";
26
+ const TRUNCATED = "…[truncated]";
27
+ const SECRET_ASSIGNMENT = /((?:password|passwd|secret|token|api[_-]?key|authorization|credential|private[_-]?key|session[_-]?key)\s*(?:=|:)\s*)(?:"[^"]*"|'[^']*'|[^\s,;&]+)/giu;
28
+ const BEARER_TOKEN = /(\bbearer\s+)[A-Za-z0-9._~+/=-]+/giu;
29
+ const PREFIXED_TOKEN = /\b(?:sk-(?:ant-|proj-)?|xox[baprs]-|ghp_|github_pat_)[A-Za-z0-9_-]{8,}/giu;
30
+ const JWT_TOKEN = /\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/gu;
31
+ const URL_USERINFO = /([a-z][a-z0-9+.-]*:\/\/[^:\s/@]+:)[^@\s/]+@/giu;
32
+ const URL_SECRET_PARAM = /([?&](?:password|secret|token|api[_-]?key|access[_-]?token|refresh[_-]?token)=)[^&#\s]+/giu;
33
+ function boundText(value, maxChars) {
34
+ if (value.length <= maxChars) return value;
35
+ return `${value.slice(0, Math.max(0, maxChars - 12))}${TRUNCATED}`;
36
+ }
37
+ function redactText(value, maxChars = MAX_DETAIL_CHARS) {
38
+ return boundText(value.replace(JWT_TOKEN, REDACTED).replace(PREFIXED_TOKEN, REDACTED).replace(BEARER_TOKEN, `$1${REDACTED}`).replace(URL_USERINFO, `$1${REDACTED}@`).replace(URL_SECRET_PARAM, `$1${REDACTED}`).replace(SECRET_ASSIGNMENT, `$1${REDACTED}`), maxChars);
39
+ }
40
+ function redactValue(value, depth = 0, seen = /* @__PURE__ */ new WeakSet()) {
41
+ if (depth > MAX_DEPTH) return "[max-depth]";
42
+ if (value === null || typeof value === "boolean" || typeof value === "number") return value;
43
+ if (typeof value === "string") return redactText(value);
44
+ if (typeof value === "bigint") return value.toString();
45
+ if (typeof value === "undefined") return null;
46
+ if (typeof value === "function" || typeof value === "symbol") return `[${typeof value}]`;
47
+ if (value instanceof Error) return {
48
+ name: value.name,
49
+ message: redactText(value.message, MAX_SUMMARY_CHARS)
50
+ };
51
+ if (typeof value !== "object") return String(value);
52
+ if (seen.has(value)) return "[circular]";
53
+ seen.add(value);
54
+ try {
55
+ if (Array.isArray(value)) {
56
+ const items = value.slice(0, MAX_ARRAY_ITEMS).map((item) => redactValue(item, depth + 1, seen));
57
+ if (value.length > MAX_ARRAY_ITEMS) items.push(`[${value.length - MAX_ARRAY_ITEMS} more items]`);
58
+ return items;
59
+ }
60
+ const result = {};
61
+ const entries = Object.entries(value);
62
+ for (const [key, item] of entries.slice(0, MAX_OBJECT_KEYS)) result[key] = SECRET_KEY.test(key) ? REDACTED : redactValue(item, depth + 1, seen);
63
+ if (entries.length > MAX_OBJECT_KEYS) result.__truncatedKeys = entries.length - MAX_OBJECT_KEYS;
64
+ return result;
65
+ } finally {
66
+ seen.delete(value);
67
+ }
68
+ }
69
+ function safeDetail(value) {
70
+ if (value === void 0) return void 0;
71
+ const redacted = redactValue(value);
72
+ return boundText(typeof redacted === "string" ? redacted : JSON.stringify(redacted), MAX_DETAIL_CHARS);
73
+ }
74
+ function normalizeActivity(activity) {
75
+ const normalized = {
76
+ turn: activity.turn,
77
+ step: activity.step,
78
+ ordinal: activity.ordinal,
79
+ kind: activity.kind
80
+ };
81
+ if (activity.phase !== void 0) normalized.phase = activity.phase;
82
+ if (activity.taskId !== void 0) normalized.taskId = redactText(activity.taskId, 128);
83
+ if (activity.toolUseId !== void 0) normalized.toolUseId = redactText(activity.toolUseId, 256);
84
+ if (activity.parentToolUseId !== void 0) normalized.parentToolUseId = redactText(activity.parentToolUseId, 256);
85
+ if (activity.toolName !== void 0) normalized.toolName = redactText(activity.toolName, 256);
86
+ if (activity.title !== void 0) normalized.title = redactText(activity.title, MAX_SUMMARY_CHARS);
87
+ if (activity.summary !== void 0) normalized.summary = redactText(typeof activity.summary === "string" ? activity.summary : safeDetail(activity.summary) ?? "", MAX_SUMMARY_CHARS);
88
+ const detail = safeDetail(activity.detail);
89
+ if (detail !== void 0) normalized.detail = detail;
90
+ if (activity.isError !== void 0) normalized.isError = activity.isError;
91
+ if (activity.usage !== void 0) normalized.usage = { ...activity.usage };
92
+ return normalized;
93
+ }
94
+ const MAX_CONTEXT_CATEGORIES = 24;
95
+ const FALLBACK_CONTEXT_COLOR = "#8b95a5";
96
+ const SAFE_CONTEXT_COLOR = /^#[0-9a-f]{3,8}$/iu;
97
+ function nonNegativeInteger(value) {
98
+ return typeof value === "number" && Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 0;
99
+ }
100
+ function normalizeContextUsage(input) {
101
+ return {
102
+ model: redactText(typeof input.model === "string" ? input.model : "unknown", 128),
103
+ totalTokens: nonNegativeInteger(input.totalTokens),
104
+ maxTokens: nonNegativeInteger(input.maxTokens),
105
+ percentage: Math.min(100, nonNegativeInteger(input.percentage)),
106
+ categories: input.categories.slice(0, MAX_CONTEXT_CATEGORIES).map((category) => ({
107
+ name: redactText(typeof category.name === "string" ? category.name : "Unknown", 128),
108
+ tokens: nonNegativeInteger(category.tokens),
109
+ color: typeof category.color === "string" && SAFE_CONTEXT_COLOR.test(category.color) ? category.color : FALLBACK_CONTEXT_COLOR,
110
+ ...category.isDeferred === true ? { isDeferred: true } : {}
111
+ }))
112
+ };
113
+ }
114
+ function latestClaudeContextUsage(events) {
115
+ for (let index = events.length - 1; index >= 0; index -= 1) {
116
+ const event = events[index];
117
+ if (event?.type === "claude-code/context-usage") return event.data;
118
+ }
119
+ }
120
+ const MAX_TASKS_PER_SNAPSHOT = 50;
121
+ const MAX_TASK_TEXT_CHARS = 300;
122
+ const TASK_STATUSES = /* @__PURE__ */ new Set([
123
+ "running",
124
+ "completed",
125
+ "failed",
126
+ "stopped",
127
+ "killed"
128
+ ]);
129
+ function normalizeTaskUsage(input) {
130
+ if (input === void 0) return void 0;
131
+ const usage = {};
132
+ if (input.totalTokens !== void 0) usage.totalTokens = nonNegativeInteger(input.totalTokens);
133
+ if (input.toolUses !== void 0) usage.toolUses = nonNegativeInteger(input.toolUses);
134
+ if (input.durationMs !== void 0) usage.durationMs = nonNegativeInteger(input.durationMs);
135
+ return Object.keys(usage).length === 0 ? void 0 : usage;
136
+ }
137
+ function normalizeTasksEvent(tasks) {
138
+ return { tasks: tasks.slice(0, MAX_TASKS_PER_SNAPSHOT).map((task) => {
139
+ const usage = normalizeTaskUsage(task.usage);
140
+ return {
141
+ taskId: redactText(String(task.taskId), 128),
142
+ description: redactText(String(task.description), MAX_TASK_TEXT_CHARS),
143
+ status: TASK_STATUSES.has(task.status) ? task.status : "running",
144
+ ...task.originTurn === void 0 ? {} : { originTurn: nonNegativeInteger(task.originTurn) },
145
+ ...task.subagentType === void 0 ? {} : { subagentType: redactText(task.subagentType, 64) },
146
+ ...task.taskType === void 0 ? {} : { taskType: redactText(task.taskType, 64) },
147
+ ...task.lastToolName === void 0 ? {} : { lastToolName: redactText(task.lastToolName, 64) },
148
+ ...task.summary === void 0 ? {} : { summary: redactText(task.summary, MAX_TASK_TEXT_CHARS) },
149
+ ...usage === void 0 ? {} : { usage },
150
+ ...task.backgrounded === true ? { backgrounded: true } : {}
151
+ };
152
+ }) };
153
+ }
154
+ function latestClaudeTasks(events) {
155
+ for (let index = events.length - 1; index >= 0; index -= 1) {
156
+ const event = events[index];
157
+ if (event?.type === "claude-code/tasks") return event.data;
158
+ }
159
+ }
160
+ /** Derive the current DSH turn/step; activity ordinals are completed from the sidecar. */
161
+ function currentClaudeActivityCursor(events) {
162
+ let turn = 0;
163
+ let step = 0;
164
+ for (const event of events) {
165
+ if (event.type !== "step/start") continue;
166
+ const data = event.data;
167
+ turn = data.turn;
168
+ step = data.step;
169
+ }
170
+ if (turn < 1 || step < 1) throw new Error("dsh-claude: Claude activity requires an open DSH step");
171
+ return {
172
+ turn,
173
+ step,
174
+ nextOrdinal: 0
175
+ };
176
+ }
177
+ function latestClaudeSessionBinding(events) {
178
+ for (let index = events.length - 1; index >= 0; index -= 1) {
179
+ const event = events[index];
180
+ if (event?.type === "claude-code/session-bound") return event.data;
181
+ }
182
+ }
183
+ //#endregion
184
+ export { LEGACY_CLAUDE_CODE_PRESET_ID as _, latestClaudeTasks as a, isClaudePresetId as b, normalizeTasksEvent as c, CLAUDE_ACTIVITY_EVENT as d, CLAUDE_CODE_PRESET_ID as f, CLAUDE_PROJECTION_PATH as g, CLAUDE_DOCTOR_PATH as h, latestClaudeSessionBinding as i, redactText as l, CLAUDE_CODE_PROVIDER_IDS as m, currentClaudeActivityCursor as n, normalizeActivity as o, CLAUDE_CODE_PROVIDER as p, latestClaudeContextUsage as r, normalizeContextUsage as s, boundText as t, safeDetail as u, SDK_VERSION as v, TASK_TOOL_NAMES as y };
185
+
186
+ //# sourceMappingURL=events-qlmU1KrH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-qlmU1KrH.mjs","names":[],"sources":["../src/constants.ts","../src/events.ts"],"sourcesContent":["export const CLAUDE_CODE_PROVIDER = 'claude'\nexport const CLAUDE_CODE_PRESET_ID = 'claude'\nexport const LEGACY_CLAUDE_CODE_PROVIDER = 'claude-code-cli'\nexport const LEGACY_CLAUDE_CODE_PRESET_ID = 'claude-code-cli'\nexport const CLAUDE_CODE_PROVIDER_IDS = [CLAUDE_CODE_PROVIDER, LEGACY_CLAUDE_CODE_PROVIDER] as const\nexport function isClaudePresetId(value: string | undefined): boolean {\n return value === CLAUDE_CODE_PRESET_ID || value === LEGACY_CLAUDE_CODE_PRESET_ID\n}\nexport function isClaudeProvider(value: string | undefined): boolean {\n return value === CLAUDE_CODE_PROVIDER || value === LEGACY_CLAUDE_CODE_PROVIDER\n}\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_PROJECTION_PATH = '/plugins/dsh-claude/projection'\n","import type { SessionEvent } from '@deepseek-ai/dsh-session'\nimport {\n CLAUDE_ACTIVITY_EVENT,\n CLAUDE_CONTEXT_USAGE_EVENT,\n CLAUDE_SESSION_BOUND_EVENT,\n CLAUDE_TASKS_EVENT,\n} from './constants.ts'\n\nexport type ClaudeActivityKind =\n | 'status'\n | 'thinking'\n | 'tool-call'\n | 'tool-result'\n | 'permission'\n | 'subagent'\n | 'usage'\n | 'warning'\n | 'error'\n\nexport type ClaudeActivityPhase =\n | 'started'\n | 'updated'\n | 'completed'\n | 'denied'\n | 'failed'\n\nexport interface ClaudeUsage {\n inputTokens?: number\n outputTokens?: number\n cacheReadTokens?: number\n cacheCreationTokens?: number\n cumulativeCostUsd?: number\n}\n\nexport interface ClaudeSessionBoundEvent {\n claudeSessionId: string\n cliVersion?: string\n sdkVersion: string\n cwd: string\n}\n\nexport interface ClaudeActivityEvent {\n turn: number\n step: number\n ordinal: number\n kind: ClaudeActivityKind\n phase?: ClaudeActivityPhase\n /** Claude task-board identity for lifecycle activity; never a transcript path. */\n taskId?: string\n toolUseId?: string\n /** Enclosing Claude tool call for subagent-nested activity. */\n parentToolUseId?: string\n toolName?: string\n title?: string\n summary?: string\n detail?: string\n isError?: boolean\n usage?: ClaudeUsage\n}\n\nexport interface ClaudeContextUsageCategory {\n name: string\n tokens: number\n color: string\n isDeferred?: boolean\n}\n\nexport interface ClaudeContextUsageEvent {\n model: string\n totalTokens: number\n maxTokens: number\n percentage: number\n categories: readonly ClaudeContextUsageCategory[]\n}\n\nexport interface ClaudeContextUsageInput {\n model: unknown\n totalTokens: unknown\n maxTokens: unknown\n percentage: unknown\n categories: readonly {\n name?: unknown\n tokens?: unknown\n color?: unknown\n isDeferred?: unknown\n }[]\n}\n\ndeclare module '@deepseek-ai/dsh-session/types' {\n interface SessionEventMap {\n 'claude-code/session-bound': ClaudeSessionBoundEvent\n 'claude-code/activity': ClaudeActivityEvent\n 'claude-code/context-usage': ClaudeContextUsageEvent\n 'claude-code/tasks': ClaudeTasksEvent\n }\n}\n\nconst SECRET_KEY = /(?:^|[_-])(password|passwd|secret|token|api[_-]?key|authorization|credential|private[_-]?key|session[_-]?key|env|environ|environment)(?:$|[_-])/i\nconst MAX_SUMMARY_CHARS = 1_000\nconst MAX_DETAIL_CHARS = 4_000\nconst MAX_DEPTH = 6\nconst MAX_ARRAY_ITEMS = 40\nconst MAX_OBJECT_KEYS = 60\nconst REDACTED = '[REDACTED]'\nconst TRUNCATED = '…[truncated]'\nconst SECRET_ASSIGNMENT = /((?:password|passwd|secret|token|api[_-]?key|authorization|credential|private[_-]?key|session[_-]?key)\\s*(?:=|:)\\s*)(?:\"[^\"]*\"|'[^']*'|[^\\s,;&]+)/giu\nconst BEARER_TOKEN = /(\\bbearer\\s+)[A-Za-z0-9._~+/=-]+/giu\nconst PREFIXED_TOKEN = /\\b(?:sk-(?:ant-|proj-)?|xox[baprs]-|ghp_|github_pat_)[A-Za-z0-9_-]{8,}/giu\nconst JWT_TOKEN = /\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\b/gu\nconst URL_USERINFO = /([a-z][a-z0-9+.-]*:\\/\\/[^:\\s/@]+:)[^@\\s/]+@/giu\nconst URL_SECRET_PARAM = /([?&](?:password|secret|token|api[_-]?key|access[_-]?token|refresh[_-]?token)=)[^&#\\s]+/giu\n\nexport function boundText(value: string, maxChars: number): string {\n if (value.length <= maxChars) return value\n return `${value.slice(0, Math.max(0, maxChars - TRUNCATED.length))}${TRUNCATED}`\n}\n\nexport function redactText(value: string, maxChars = MAX_DETAIL_CHARS): string {\n return boundText(\n value\n .replace(JWT_TOKEN, REDACTED)\n .replace(PREFIXED_TOKEN, REDACTED)\n .replace(BEARER_TOKEN, `$1${REDACTED}`)\n .replace(URL_USERINFO, `$1${REDACTED}@`)\n .replace(URL_SECRET_PARAM, `$1${REDACTED}`)\n .replace(SECRET_ASSIGNMENT, `$1${REDACTED}`),\n maxChars,\n )\n}\n\nexport function redactValue(value: unknown, depth = 0, seen = new WeakSet<object>()): unknown {\n if (depth > MAX_DEPTH) return '[max-depth]'\n if (value === null || typeof value === 'boolean' || typeof value === 'number') return value\n if (typeof value === 'string') return redactText(value)\n if (typeof value === 'bigint') return value.toString()\n if (typeof value === 'undefined') return null\n if (typeof value === 'function' || typeof value === 'symbol') return `[${typeof value}]`\n if (value instanceof Error) {\n return { name: value.name, message: redactText(value.message, MAX_SUMMARY_CHARS) }\n }\n if (typeof value !== 'object') return String(value)\n if (seen.has(value)) return '[circular]'\n seen.add(value)\n try {\n if (Array.isArray(value)) {\n const items = value.slice(0, MAX_ARRAY_ITEMS).map(item => redactValue(item, depth + 1, seen))\n if (value.length > MAX_ARRAY_ITEMS) items.push(`[${value.length - MAX_ARRAY_ITEMS} more items]`)\n return items\n }\n const result: Record<string, unknown> = {}\n const entries = Object.entries(value as Record<string, unknown>)\n for (const [key, item] of entries.slice(0, MAX_OBJECT_KEYS)) {\n result[key] = SECRET_KEY.test(key) ? REDACTED : redactValue(item, depth + 1, seen)\n }\n if (entries.length > MAX_OBJECT_KEYS) result.__truncatedKeys = entries.length - MAX_OBJECT_KEYS\n return result\n } finally {\n seen.delete(value)\n }\n}\n\nexport function safeDetail(value: unknown): string | undefined {\n if (value === undefined) return undefined\n const redacted = redactValue(value)\n const text = typeof redacted === 'string' ? redacted : JSON.stringify(redacted)\n return boundText(text, MAX_DETAIL_CHARS)\n}\n\nexport function normalizeActivity(\n activity: Omit<ClaudeActivityEvent, 'summary' | 'detail'> & {\n summary?: unknown\n detail?: unknown\n },\n): ClaudeActivityEvent {\n const normalized: ClaudeActivityEvent = {\n turn: activity.turn,\n step: activity.step,\n ordinal: activity.ordinal,\n kind: activity.kind,\n }\n if (activity.phase !== undefined) normalized.phase = activity.phase\n if (activity.taskId !== undefined) normalized.taskId = redactText(activity.taskId, 128)\n if (activity.toolUseId !== undefined) normalized.toolUseId = redactText(activity.toolUseId, 256)\n if (activity.parentToolUseId !== undefined) normalized.parentToolUseId = redactText(activity.parentToolUseId, 256)\n if (activity.toolName !== undefined) normalized.toolName = redactText(activity.toolName, 256)\n if (activity.title !== undefined) normalized.title = redactText(activity.title, MAX_SUMMARY_CHARS)\n if (activity.summary !== undefined) {\n normalized.summary = redactText(\n typeof activity.summary === 'string' ? activity.summary : safeDetail(activity.summary) ?? '',\n MAX_SUMMARY_CHARS,\n )\n }\n const detail = safeDetail(activity.detail)\n if (detail !== undefined) normalized.detail = detail\n if (activity.isError !== undefined) normalized.isError = activity.isError\n if (activity.usage !== undefined) normalized.usage = { ...activity.usage }\n return normalized\n}\n\nconst MAX_CONTEXT_CATEGORIES = 24\nconst FALLBACK_CONTEXT_COLOR = '#8b95a5'\nconst SAFE_CONTEXT_COLOR = /^#[0-9a-f]{3,8}$/iu\n\nfunction nonNegativeInteger(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.max(0, Math.floor(value))\n : 0\n}\n\nexport function normalizeContextUsage(input: ClaudeContextUsageInput): ClaudeContextUsageEvent {\n return {\n model: redactText(typeof input.model === 'string' ? input.model : 'unknown', 128),\n totalTokens: nonNegativeInteger(input.totalTokens),\n maxTokens: nonNegativeInteger(input.maxTokens),\n percentage: Math.min(100, nonNegativeInteger(input.percentage)),\n categories: input.categories.slice(0, MAX_CONTEXT_CATEGORIES).map(category => ({\n name: redactText(typeof category.name === 'string' ? category.name : 'Unknown', 128),\n tokens: nonNegativeInteger(category.tokens),\n color: typeof category.color === 'string' && SAFE_CONTEXT_COLOR.test(category.color)\n ? category.color\n : FALLBACK_CONTEXT_COLOR,\n ...(category.isDeferred === true ? { isDeferred: true } : {}),\n })),\n }\n}\n\nexport function latestClaudeContextUsage(\n events: readonly SessionEvent[],\n): ClaudeContextUsageEvent | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index]\n if (event?.type === CLAUDE_CONTEXT_USAGE_EVENT) return event.data as ClaudeContextUsageEvent\n }\n return undefined\n}\n\nexport type ClaudeTaskStatus = 'running' | 'completed' | 'failed' | 'stopped' | 'killed'\n\nexport interface ClaudeTaskUsage {\n totalTokens?: number\n toolUses?: number\n durationMs?: number\n}\n\nexport interface ClaudeTaskInfo {\n taskId: string\n description: string\n status: ClaudeTaskStatus\n /** DSH turn during which this task was first observed, when known. */\n originTurn?: number\n subagentType?: string\n taskType?: string\n lastToolName?: string\n summary?: string\n usage?: ClaudeTaskUsage\n /** True while the task runs detached (background command/subagent). */\n backgrounded?: boolean\n}\n\n/** Level snapshot of one session's Claude task board, REPLACE semantics. */\nexport interface ClaudeTasksEvent {\n tasks: readonly ClaudeTaskInfo[]\n}\n\nconst MAX_TASKS_PER_SNAPSHOT = 50\nconst MAX_TASK_TEXT_CHARS = 300\n\nconst TASK_STATUSES: ReadonlySet<string> = new Set(['running', 'completed', 'failed', 'stopped', 'killed'])\n\nfunction normalizeTaskUsage(input: ClaudeTaskUsage | undefined): ClaudeTaskUsage | undefined {\n if (input === undefined) return undefined\n const usage: ClaudeTaskUsage = {}\n if (input.totalTokens !== undefined) usage.totalTokens = nonNegativeInteger(input.totalTokens)\n if (input.toolUses !== undefined) usage.toolUses = nonNegativeInteger(input.toolUses)\n if (input.durationMs !== undefined) usage.durationMs = nonNegativeInteger(input.durationMs)\n return Object.keys(usage).length === 0 ? undefined : usage\n}\n\nexport function normalizeTasksEvent(tasks: readonly ClaudeTaskInfo[]): ClaudeTasksEvent {\n return {\n tasks: tasks.slice(0, MAX_TASKS_PER_SNAPSHOT).map(task => {\n const usage = normalizeTaskUsage(task.usage)\n return {\n taskId: redactText(String(task.taskId), 128),\n description: redactText(String(task.description), MAX_TASK_TEXT_CHARS),\n status: TASK_STATUSES.has(task.status) ? task.status : 'running',\n ...(task.originTurn === undefined ? {} : { originTurn: nonNegativeInteger(task.originTurn) }),\n ...(task.subagentType === undefined ? {} : { subagentType: redactText(task.subagentType, 64) }),\n ...(task.taskType === undefined ? {} : { taskType: redactText(task.taskType, 64) }),\n ...(task.lastToolName === undefined ? {} : { lastToolName: redactText(task.lastToolName, 64) }),\n ...(task.summary === undefined ? {} : { summary: redactText(task.summary, MAX_TASK_TEXT_CHARS) }),\n ...(usage === undefined ? {} : { usage }),\n ...(task.backgrounded === true ? { backgrounded: true } : {}),\n }\n }),\n }\n}\n\nexport function latestClaudeTasks(\n events: readonly SessionEvent[],\n): ClaudeTasksEvent | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index]\n if (event?.type === CLAUDE_TASKS_EVENT) return event.data as ClaudeTasksEvent\n }\n return undefined\n}\n\nexport type ClaudeActivityInput = Omit<\n ClaudeActivityEvent,\n 'turn' | 'step' | 'ordinal' | 'summary' | 'detail'\n> & {\n summary?: unknown\n detail?: unknown\n}\n\nexport interface ClaudeActivityCursor {\n turn: number\n step: number\n nextOrdinal: number\n}\n\n/** Derive the current DSH turn/step; activity ordinals are completed from the sidecar. */\nexport function currentClaudeActivityCursor(events: readonly SessionEvent[]): ClaudeActivityCursor {\n let turn = 0\n let step = 0\n for (const event of events) {\n if (event.type !== 'step/start') continue\n const data = event.data as { turn: number; step: number }\n turn = data.turn\n step = data.step\n }\n if (turn < 1 || step < 1) {\n throw new Error('dsh-claude: Claude activity requires an open DSH step')\n }\n return { turn, step, nextOrdinal: 0 }\n}\n\nexport function latestClaudeSessionBinding(\n events: readonly SessionEvent[],\n): ClaudeSessionBoundEvent | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index]\n if (event?.type === CLAUDE_SESSION_BOUND_EVENT) {\n return event.data as ClaudeSessionBoundEvent\n }\n }\n return undefined\n}\n"],"mappings":"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"}