dsh-watcher 0.4.0-insights.1

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":["isRecord","items","useState","useRef","css","useState","useRef","createPortal","css","useMemo","css","StateDot","useState","useRef","writeClipboard","IconCheckOutline16","IconCopyOutline16","TerminalBlock","ReadBlock","DiffBlock","JsonTree","MarkdownText","IconChevronRightOutline14","useMemo","useAnchoredPosition","createPortal","Pill","IconRefreshOutline14"],"sources":["../src/hub/history.ts","../src/hub/follow.ts","../src/hub/aggregation.ts","../src/observation/model-trace.ts","../src/observation/fold.ts","../src/insights/presentation.mjs","../src/client/TimingPanel.tsx","../src/client/Insights.tsx","../src/hub/overview.ts","../src/observation/performance.ts","../src/client/step-timeline.ts","../src/client/disclosure-depth.ts","../src/client/Watcher.tsx","../src/client/model-trace-definition.ts","../src/client/index.tsx"],"sourcesContent":["/** Minimal public facts needed to page one shared RC8 Session window. */\nexport interface HistoryWindowState {\n hasMore: boolean\n loadingOlder: boolean\n headKey: string\n}\n\nexport type CompleteHistoryResult =\n | { kind: 'complete'; pages: number }\n | { kind: 'cancelled'; pages: number }\n | { kind: 'blocked'; pages: number; reason: 'busy' | 'no-progress' | 'page-limit' }\n\nexport interface CompleteHistoryOptions {\n read: () => HistoryWindowState\n loadOlder: () => Promise<void>\n signal: AbortSignal\n maxPages?: number\n}\n\n/**\n * Pull every older RC8 page in order. The Session remains the sole owner of\n * history continuity; this helper only repeats its public, read-only paging\n * verb and fails closed if one request does not advance the visible head.\n */\nexport async function loadCompleteHistory({\n read,\n loadOlder,\n signal,\n maxPages = 1_000,\n}: CompleteHistoryOptions): Promise<CompleteHistoryResult> {\n let pages = 0\n while (pages < maxPages) {\n if (signal.aborted) return { kind: 'cancelled', pages }\n const before = read()\n if (!before.hasMore) return { kind: 'complete', pages }\n if (before.loadingOlder) return { kind: 'blocked', pages, reason: 'busy' }\n\n await loadOlder()\n if (signal.aborted) return { kind: 'cancelled', pages }\n\n const after = read()\n if (!after.hasMore) return { kind: 'complete', pages: pages + 1 }\n if (after.headKey === before.headKey) {\n return { kind: 'blocked', pages, reason: 'no-progress' }\n }\n pages += 1\n }\n return { kind: 'blocked', pages, reason: 'page-limit' }\n}\n","import type { WorkPicture } from '../observation/fold.ts'\n\nexport interface FollowSnapshot {\n follow: boolean\n unread: number\n selectedId: string | null\n}\n\nexport interface RailScrollState {\n atBottom: boolean\n}\n\n/**\n * Follow versus pin state for the work rail.\n *\n * The rail follows the newest recorded occurrence by default. Selecting\n * history or scrolling away pins the viewport; later occurrences and result\n * updates increment `unread` without yanking the reader away from evidence.\n */\nexport function createFollow() {\n let follow = true\n let unread = 0\n let selectedId: string | null = null\n let lastCursor: string | null = null\n let observedOccurrenceIds: readonly string[] = []\n\n function snapshot(): FollowSnapshot {\n return { follow, unread, selectedId }\n }\n\n function catchUp(): void {\n follow = true\n unread = 0\n selectedId = null\n }\n\n return {\n snapshot,\n\n /** Counts appended occurrences or a settled live result while pinned. */\n onPicture(picture: Pick<WorkPicture, 'nodes'>): FollowSnapshot {\n const groups = picture.nodes\n if (groups.length === 0) {\n lastCursor = null\n observedOccurrenceIds = []\n catchUp()\n return snapshot()\n }\n\n const occurrenceIds = groups.flatMap(group => group.items.map(item => `${group.id}:${item.id}`))\n const group = groups.at(-1)\n const item = group?.items.at(-1)\n const cursor = group === undefined\n ? null\n : item === undefined\n ? group.id\n : `${group.id}:${item.id}:${item.status}:${item.resultSeq ?? 'open'}:${item.resultTime ?? 'open'}`\n if (cursor !== null && cursor !== lastCursor) {\n if (!follow && lastCursor !== null) {\n const previousIds = new Set(observedOccurrenceIds)\n const appended = occurrenceIds.filter(id => !previousIds.has(id)).length\n unread += Math.max(1, appended)\n }\n lastCursor = cursor\n if (follow) selectedId = null\n }\n observedOccurrenceIds = occurrenceIds\n return snapshot()\n },\n\n onSelect(id: string): FollowSnapshot {\n follow = false\n selectedId = id\n return snapshot()\n },\n\n onScroll({ atBottom }: RailScrollState): FollowSnapshot {\n if (atBottom) {\n if (unread === 0 && selectedId === null) follow = true\n } else if (follow) {\n follow = false\n }\n return snapshot()\n },\n\n setFollow(next: boolean): FollowSnapshot {\n if (next) catchUp()\n else follow = false\n return snapshot()\n },\n\n backToLatest(): FollowSnapshot {\n catchUp()\n return snapshot()\n },\n\n reset(): FollowSnapshot {\n catchUp()\n lastCursor = null\n observedOccurrenceIds = []\n return snapshot()\n },\n }\n}\n","import type { WorkItem, WorkStatus } from '../observation/fold.ts'\n\nexport type WorkClusterBasis = 'mutable-target' | 'shared-target' | 'exact-call' | 'single'\n\nexport interface WorkStatusCounts {\n running: number\n waiting: number\n success: number\n failure: number\n returned: number\n interrupted: number\n unknown: number\n}\n\nexport type NonEmptyWorkItems = readonly [WorkItem, ...WorkItem[]]\n\n/** A reversible analysis projection. `items` always retains the source records. */\nexport interface WorkCluster {\n id: string\n basis: WorkClusterBasis\n title: string\n items: NonEmptyWorkItems\n executionCount: number\n stepCount: number\n retryCount: number\n iterationCount: number\n latestStatus: WorkStatus\n statusCounts: Readonly<WorkStatusCounts>\n}\n\ntype ClusterIdentity =\n | { kind: 'mutable-target'; key: string }\n | { kind: 'shared-target'; key: string }\n | { kind: 'exact-call'; key: string }\n | { kind: 'single'; key: string }\n\ninterface ClusterAccumulator {\n basis: WorkClusterBasis\n first: WorkItem\n rest: WorkItem[]\n}\n\nfunction identityOf(item: WorkItem): ClusterIdentity {\n if (item.intentKey !== null) return { kind: 'mutable-target', key: `target\\u0000${item.intentKey}` }\n if (item.toolName === 'read' && item.target !== null) {\n return { kind: 'shared-target', key: `target\\u0000read\\u0000${item.target}` }\n }\n if (item.signature !== null) return { kind: 'exact-call', key: `exact\\u0000${item.signature}` }\n return { kind: 'single', key: `single\\u0000${item.id}` }\n}\n\nfunction emptyStatusCounts(): WorkStatusCounts {\n return {\n running: 0,\n waiting: 0,\n success: 0,\n failure: 0,\n returned: 0,\n interrupted: 0,\n unknown: 0,\n }\n}\n\nfunction countStatuses(items: NonEmptyWorkItems): WorkStatusCounts {\n const counts = emptyStatusCounts()\n for (const item of items) counts[item.status] += 1\n return counts\n}\n\n/**\n * Group one phase for analysis without changing evidence identity or order.\n *\n * - Mutable calls may group by operation + target so changed inputs remain\n * comparable as iterations.\n * - Reads may group by one exact file target so different line windows stay\n * comparable.\n * - Search, Glob, Grep, Bash, and every other tool require exact normalized\n * arguments. Sharing a cwd, broad path, tool name, or translated title is\n * never enough.\n * - Messages and otherwise unsigned records remain singletons.\n */\nexport function clusterWorkItems(items: readonly WorkItem[]): readonly WorkCluster[] {\n const accumulators = new Map<string, ClusterAccumulator>()\n\n for (const item of items) {\n const identity = identityOf(item)\n const existing = accumulators.get(identity.key)\n if (existing === undefined) {\n accumulators.set(identity.key, { basis: identity.kind, first: item, rest: [] })\n } else {\n existing.rest.push(item)\n }\n }\n\n const clusters: WorkCluster[] = []\n for (const accumulator of accumulators.values()) {\n const clusterItems: NonEmptyWorkItems = [accumulator.first, ...accumulator.rest]\n const latest = clusterItems[clusterItems.length - 1]\n if (latest === undefined) continue\n clusters.push({\n id: `cluster:${accumulator.first.id}`,\n basis: accumulator.basis,\n title: accumulator.first.title,\n items: clusterItems,\n executionCount: clusterItems.length,\n stepCount: new Set(clusterItems.map(item => item.step)).size,\n retryCount: clusterItems.filter(item => item.retryOf !== null).length,\n iterationCount: clusterItems.filter(item => item.iterationIndex > 0).length,\n latestStatus: latest.status,\n statusCounts: countStatuses(clusterItems),\n })\n }\n return clusters\n}\n\nexport function clusterOutcomeSummary(cluster: WorkCluster): string {\n const counts = cluster.statusCounts\n return [\n counts.running > 0 ? `${counts.running} 进行中` : null,\n counts.waiting > 0 ? `${counts.waiting} 等待` : null,\n counts.success > 0 ? `${counts.success} 成功` : null,\n counts.failure > 0 ? `${counts.failure} 失败` : null,\n counts.returned > 0 ? `${counts.returned} 已返回` : null,\n counts.interrupted > 0 ? `${counts.interrupted} 已中断` : null,\n counts.unknown > 0 ? `${counts.unknown} 未知` : null,\n ].filter((part): part is string => part !== null).join(' · ')\n}\n","/** One timestamped provider-exposed reasoning fragment. */\nexport interface ReasoningFragment {\n readonly seq: number\n readonly time: number\n readonly text: string\n}\n\ninterface ModelAttemptEvidence {\n readonly attempt: number\n /** Only the first attempt has an authoritative request-entry boundary. */\n readonly startedAt: number | null\n readonly firstTokenTime: number | null\n readonly firstReasoningTime: number | null\n readonly lastReasoningTime: number | null\n readonly firstOutputTime: number | null\n readonly reasoningText: string\n readonly fragments: readonly ReasoningFragment[]\n}\n\nexport type ModelAttempt = ModelAttemptEvidence & (\n | { readonly kind: 'running' }\n | { readonly kind: 'complete'; readonly endedAt: number }\n | {\n readonly kind: 'retried'\n readonly endedAt: number\n readonly retry: number\n readonly retryDelayMs: number\n }\n | { readonly kind: 'interrupted'; readonly endedAt: number }\n)\n\ntype ModelAttempts = readonly [ModelAttempt, ...ModelAttempt[]]\n\n/** Provider/model evidence owned by one authoritative DSH Step. */\nexport interface ModelStepTrace {\n readonly turn: number\n readonly step: number\n /** Stable identity anchor: the first model event observed for this Step. */\n readonly startSeq: number\n /** Mutable activity cursor: the newest model event folded into this trace. */\n readonly lastSeq: number\n readonly startTime: number | null\n readonly attempts: ModelAttempts\n readonly reasoningTokens: number | null\n}\n\nexport type ModelStageMetrics = {\n readonly kind: 'measured' | 'partial'\n readonly live: boolean\n readonly totalMs: number | null\n readonly firstResponseMs: number | null\n readonly visibleReasoningMs: number | null\n readonly outputMs: number | null\n readonly unattributedMs: number | null\n}\n\ntype ModelTraceEventBase = {\n readonly turn: number\n readonly step: number\n readonly seq: number\n readonly time: number\n readonly lastSeq?: number\n}\n\nexport type ModelTraceEvent = ModelTraceEventBase & (\n | { readonly kind: 'step-start' }\n | { readonly kind: 'reasoning-delta'; readonly text: string; readonly fragments?: readonly ReasoningFragment[] }\n | { readonly kind: 'output-delta' }\n | { readonly kind: 'usage'; readonly reasoningTokens: number | null }\n | {\n readonly kind: 'message'\n readonly reasoningText: string | null\n readonly reasoningTokens: number | null\n }\n | { readonly kind: 'retry'; readonly retry: number; readonly delayMs: number }\n | { readonly kind: 'step-end' }\n)\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction finiteNumber(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null\n}\n\nfunction nonNegativeNumber(value: unknown): number | null {\n const number = finiteNumber(value)\n return number !== null && number >= 0 ? number : null\n}\n\nfunction locationOf(value: Record<string, unknown>): ModelTraceEventBase | null {\n const data = value.data\n if (!isRecord(data)) return null\n const turn = finiteNumber(data.turn)\n const step = finiteNumber(data.step)\n const seq = finiteNumber(value.seq)\n const time = finiteNumber(value.time)\n return turn === null || step === null || seq === null || time === null\n ? null\n : { turn, step, seq, time }\n}\n\nfunction reasoningTokensOf(value: unknown): number | null {\n return isRecord(value) ? nonNegativeNumber(value.reasoningTokens) : null\n}\n\nfunction reasoningTextOf(value: unknown): string | null {\n if (!isRecord(value) || !Array.isArray(value.content)) return null\n const parts = value.content.flatMap((block): string[] => (\n isRecord(block) && block.type === 'reasoning' && typeof block.text === 'string'\n ? [block.text]\n : []\n ))\n return parts.length === 0 ? null : parts.join('\\n\\n')\n}\n\nfunction chunkEventOf(location: ModelTraceEventBase, chunk: unknown): ModelTraceEvent | null {\n if (!isRecord(chunk) || typeof chunk.type !== 'string') return null\n if (chunk.type === 'reasoning-delta') {\n return typeof chunk.text === 'string' && chunk.text !== ''\n ? { ...location, kind: 'reasoning-delta', text: chunk.text }\n : null\n }\n if (chunk.type === 'text-delta') {\n return typeof chunk.text === 'string' && chunk.text !== ''\n ? { ...location, kind: 'output-delta' }\n : null\n }\n if (chunk.type === 'tool-call-delta') {\n const hasArguments = typeof chunk.argumentsDelta === 'string' && chunk.argumentsDelta !== ''\n return hasArguments || typeof chunk.name === 'string'\n ? { ...location, kind: 'output-delta' }\n : null\n }\n if (chunk.type === 'usage') {\n return { ...location, kind: 'usage', reasoningTokens: reasoningTokensOf(chunk.usage) }\n }\n return null\n}\n\nfunction packedRunEventOf(\n location: ModelTraceEventBase,\n type: 'reasoning-chunks' | 'text-chunks' | 'tool-call-chunks',\n parts: unknown,\n gaps: unknown,\n name?: unknown,\n): ModelTraceEvent | null {\n const tool = type === 'tool-call-chunks'\n if (!Array.isArray(parts) || !parts.length || !parts.every(p => typeof p === 'string')\n || !Array.isArray(gaps) || gaps.length !== parts.length - 1 || !gaps.every(Number.isSafeInteger)) return null\n let time = location.time\n const fragments: ReasoningFragment[] = []\n for (let i = 0; i < parts.length; i++) {\n if (i > 0) time += gaps[i - 1] as number\n if (!Number.isSafeInteger(time)) return null\n const text = parts[i] as string\n if (text !== '' || (tool && typeof name === 'string')) fragments.push({ seq: location.seq + i, time, text })\n }\n const first = fragments[0]\n if (!first) return null\n const base = { ...location, time: first.time, lastSeq: location.seq + parts.length - 1 }\n return type === 'reasoning-chunks'\n ? { ...base, kind: 'reasoning-delta', text: fragments.map(f => f.text).join(''), fragments }\n : { ...base, kind: 'output-delta' }\n}\n\nfunction streamEventsOf(base: ModelTraceEventBase, stream: unknown): ModelTraceEvent[] {\n if (!Array.isArray(stream)) return []\n const events: ModelTraceEvent[] = []\n let seq = base.seq\n for (const record of stream) {\n if (!isRecord(record) || typeof record.type !== 'string') continue\n if (record.type === 'chunk') {\n const time = finiteNumber(record.time)\n if (time === null) continue\n const event = chunkEventOf({ ...base, seq, time }, record.chunk)\n if (event !== null) {\n events.push(event)\n seq += 1\n }\n continue\n }\n if (record.type !== 'reasoning-chunks' && record.type !== 'text-chunks' && record.type !== 'tool-call-chunks') {\n continue\n }\n const time0 = finiteNumber(record.time0)\n if (time0 === null) continue\n const event = packedRunEventOf(\n { ...base, seq, time: time0 },\n record.type,\n record.type === 'tool-call-chunks' ? record.args : record.texts,\n record.dt,\n record.name,\n )\n if (event !== null) {\n events.push(event)\n seq = (event.lastSeq ?? event.seq) + 1\n }\n }\n return events\n}\n\nfunction messageEventOf(location: ModelTraceEventBase, data: Record<string, unknown>): ModelTraceEvent {\n return {\n ...location,\n kind: 'message',\n reasoningText: reasoningTextOf(data.message),\n reasoningTokens: reasoningTokensOf(data.usage),\n }\n}\n\n/** Expand one Session/Conversation value into the model-stage events it carries. */\nexport function modelTraceEventsOf(value: unknown): ModelTraceEvent[] {\n if (!isRecord(value) || typeof value.type !== 'string') return []\n const location = locationOf(value)\n if (location === null || !isRecord(value.data)) return []\n const data = value.data\n\n if (value.type === 'step/start') return [{ ...location, kind: 'step-start' }]\n if (value.type === 'step/end') return [{ ...location, kind: 'step-end' }]\n if (value.type === 'llm/retry') {\n const retry = nonNegativeNumber(data.retry)\n const delayMs = nonNegativeNumber(data.delayMs)\n return retry === null || delayMs === null ? [] : [{ ...location, kind: 'retry', retry, delayMs }]\n }\n if (value.type === 'assistant/attempt') return streamEventsOf(location, data.stream)\n if (value.type === 'assistant/message') {\n return [...streamEventsOf(location, data.stream), messageEventOf(location, data)]\n }\n // RC1 historical chunkrow envelopes preserve fragment times and sequence identities.\n if (value.type === 'chunkrow/reasoning-chunks' || value.type === 'chunkrow/text-chunks' || value.type === 'chunkrow/tool-call-chunks') {\n const event = packedRunEventOf(\n location,\n value.type === 'chunkrow/reasoning-chunks'\n ? 'reasoning-chunks'\n : value.type === 'chunkrow/text-chunks'\n ? 'text-chunks'\n : 'tool-call-chunks',\n value.type === 'chunkrow/tool-call-chunks' ? data.args : data.texts,\n data.dt,\n data.name,\n )\n return event === null ? [] : [event]\n }\n if (value.type === 'assistant/live-chunk') {\n const event = chunkEventOf(location, data.chunk)\n return event === null ? [] : [event]\n }\n return []\n}\n\n/** Parse only the first model-stage event carried by one value. */\nexport function modelTraceEventOf(value: unknown): ModelTraceEvent | null {\n return modelTraceEventsOf(value)[0] ?? null\n}\n\nfunction runningAttempt(attempt: number, startedAt: number | null): ModelAttempt {\n return {\n kind: 'running',\n attempt,\n startedAt,\n firstTokenTime: null,\n firstReasoningTime: null,\n lastReasoningTime: null,\n firstOutputTime: null,\n reasoningText: '',\n fragments: [],\n }\n}\n\nexport function startModelStepTrace(event: ModelTraceEventBase): ModelStepTrace {\n return {\n turn: event.turn,\n step: event.step,\n startSeq: event.seq,\n lastSeq: event.seq,\n startTime: event.time,\n attempts: [runningAttempt(1, event.time)],\n reasoningTokens: null,\n }\n}\n\nfunction partialModelStepTrace(event: ModelTraceEventBase): ModelStepTrace {\n return {\n turn: event.turn,\n step: event.step,\n startSeq: event.seq,\n lastSeq: event.seq,\n startTime: null,\n attempts: [runningAttempt(1, null)],\n reasoningTokens: null,\n }\n}\n\nfunction replaceLast(attempts: ModelAttempts, attempt: ModelAttempt): ModelAttempts {\n if (attempts.length === 1) return [attempt]\n return [attempts[0], ...attempts.slice(1, -1), attempt]\n}\n\nfunction appendAttempt(attempts: ModelAttempts, attempt: ModelAttempt): ModelAttempts {\n return [...attempts, attempt]\n}\n\nfunction sameStep(trace: ModelStepTrace, event: ModelTraceEventBase): boolean {\n return trace.turn === event.turn && trace.step === event.step\n}\n\n/** Fold one normalized event without discarding reasoning from a retried attempt. */\nexport function updateModelStepTrace(trace: ModelStepTrace, event: ModelTraceEvent): ModelStepTrace {\n if (!sameStep(trace, event) || event.kind === 'step-start') return trace\n const current = { ...trace, lastSeq: Math.max(trace.lastSeq, event.lastSeq ?? event.seq) }\n const attempt = trace.attempts.at(-1)\n if (attempt === undefined) return trace\n\n if (event.kind === 'usage') {\n return event.reasoningTokens === null ? current : { ...current, reasoningTokens: event.reasoningTokens }\n }\n if (event.kind === 'reasoning-delta') {\n if (attempt.kind !== 'running') return current\n const fragments = event.fragments ?? [{ seq: event.seq, time: event.time, text: event.text }]\n return {\n ...current,\n attempts: replaceLast(trace.attempts, {\n ...attempt,\n firstTokenTime: attempt.firstTokenTime ?? event.time,\n firstReasoningTime: attempt.firstReasoningTime ?? event.time,\n lastReasoningTime: fragments.at(-1)?.time ?? event.time,\n reasoningText: attempt.reasoningText + event.text,\n fragments: [...attempt.fragments, ...fragments],\n }),\n }\n }\n if (event.kind === 'output-delta') {\n if (attempt.kind !== 'running') return current\n return {\n ...current,\n attempts: replaceLast(trace.attempts, {\n ...attempt,\n firstTokenTime: attempt.firstTokenTime ?? event.time,\n firstOutputTime: attempt.firstOutputTime ?? event.time,\n }),\n }\n }\n if (event.kind === 'retry') {\n if (attempt.kind !== 'running') return current\n const retried: ModelAttempt = {\n ...attempt,\n kind: 'retried',\n endedAt: event.time,\n retry: event.retry,\n retryDelayMs: event.delayMs,\n }\n return {\n ...current,\n attempts: appendAttempt(\n replaceLast(trace.attempts, retried),\n runningAttempt(attempt.attempt + 1, null),\n ),\n }\n }\n if (event.kind === 'message') {\n const reasoningTokens = event.reasoningTokens ?? trace.reasoningTokens\n if (attempt.kind !== 'running') return { ...current, reasoningTokens }\n return {\n ...current,\n reasoningTokens,\n attempts: replaceLast(trace.attempts, {\n ...attempt,\n kind: 'complete',\n endedAt: event.time,\n reasoningText: event.reasoningText ?? attempt.reasoningText,\n }),\n }\n }\n if (attempt.kind !== 'running') return current\n return {\n ...current,\n attempts: replaceLast(trace.attempts, {\n ...attempt,\n kind: 'interrupted',\n endedAt: event.time,\n }),\n }\n}\n\n/** Fold raw Session-like values for golden replay and boundary tests. */\nexport function foldModelTraceEvents(values: readonly unknown[]): ReadonlyMap<string, ModelStepTrace> {\n const traces = new Map<string, ModelStepTrace>()\n for (const value of values) {\n for (const event of modelTraceEventsOf(value)) {\n const key = `${event.turn}:${event.step}`\n const current = traces.get(key)\n if (event.kind === 'step-start') {\n traces.set(key, startModelStepTrace(event))\n continue\n }\n const trace = current ?? partialModelStepTrace(event)\n traces.set(key, updateModelStepTrace(trace, event))\n }\n }\n return traces\n}\n\nfunction attemptEnd(attempt: ModelAttempt, now: number): number | null {\n return attempt.kind === 'running' ? now : attempt.endedAt\n}\n\nfunction firstTokenTime(trace: ModelStepTrace): number | null {\n for (const attempt of trace.attempts) {\n if (attempt.firstTokenTime !== null) return attempt.firstTokenTime\n }\n return null\n}\n\nfunction visibleReasoningDuration(trace: ModelStepTrace, _now: number): number | null {\n let sampled = false\n let total = 0\n for (const attempt of trace.attempts) {\n if (attempt.firstReasoningTime === null || attempt.lastReasoningTime === null) continue\n if (attempt.firstOutputTime !== null && attempt.lastReasoningTime > attempt.firstOutputTime) continue // interleaved timing remains unattributed\n sampled = true\n // An open request does not prove continuously emitted reasoning.\n const end = attempt.lastReasoningTime\n total += Math.max(0, end - attempt.firstReasoningTime)\n }\n return sampled ? total : null\n}\n\n/** Derive additive display segments without calling unobserved latency Thinking. */\nexport function modelStageMetrics(trace: ModelStepTrace, now: number): ModelStageMetrics {\n const last = trace.attempts.at(-1)\n const live = last?.kind === 'running'\n const end = last === undefined ? null : attemptEnd(last, now)\n const totalMs = trace.startTime === null || end === null ? null : Math.max(0, end - trace.startTime)\n const firstToken = firstTokenTime(trace)\n const firstResponseMs = trace.startTime === null || firstToken === null\n ? null\n : Math.max(0, firstToken - trace.startTime)\n const visibleReasoningMs = visibleReasoningDuration(trace, now)\n const finalReasoning = last?.lastReasoningTime ?? null\n const outputStart = last?.firstOutputTime ?? null\n const outputMs = outputStart === null || end === null || (live && finalReasoning !== null && last?.firstOutputTime === null)\n ? null\n : Math.max(0, end - outputStart)\n const attributed = (firstResponseMs ?? 0) + (visibleReasoningMs ?? 0) + (outputMs ?? 0)\n const unattributedMs = totalMs === null ? null : Math.max(0, totalMs - attributed)\n return {\n kind: trace.startTime === null ? 'partial' : 'measured',\n live,\n totalMs,\n firstResponseMs,\n visibleReasoningMs,\n outputMs,\n unattributedMs,\n }\n}\n\nexport function hasReasoningEvidence(trace: ModelStepTrace): boolean {\n return trace.attempts.some(attempt => attempt.reasoningText.trim() !== '' || attempt.fragments.length > 0)\n}\n","import type {\n AssistantMessageNode,\n ConversationNode,\n ConversationViewSnapshotStore,\n RunningToolCall,\n ToolResultNode,\n} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type { ChatSnapshot } from '@deepseek-ai/dsh-client-ui-chat/client'\nimport type { SessionPendingInteractionBase } from '@deepseek-ai/dsh-client-ui-session/client'\nimport { foldModelTraceEvents, hasReasoningEvidence, type ModelStepTrace } from './model-trace.ts'\n\n/** Watcher-owned projection assembled from the public RC1 Session and Conversation stores. */\nexport interface WatcherSnapshot {\n readonly views: ConversationViewSnapshotStore\n readonly chat: ChatSnapshot\n readonly nodes: readonly ConversationNode[]\n readonly turnTimings: ReadonlyMap<number, { readonly startTime: number; readonly endTime?: number }>\n readonly runningCalls: readonly RunningToolCall[]\n readonly pending: readonly SessionPendingInteractionBase[]\n readonly blank: boolean\n readonly running: boolean\n readonly hasMore: boolean\n}\n\n/** One truthful lifecycle state. Result presence alone never means success. */\nexport type WorkStatus =\n | 'running'\n | 'waiting'\n | 'success'\n | 'failure'\n | 'returned'\n | 'interrupted'\n | 'unknown'\n\n/** User-facing phases used by the compact work rail. */\nexport type WorkPhase =\n | 'request'\n | 'steering'\n | 'plan'\n | 'investigate'\n | 'build'\n | 'verify'\n | 'activate'\n | 'desktop'\n | 'answer'\n | 'model'\n | 'wait'\n | 'failure'\n | 'other'\n\nexport type WorkSource =\n | 'tool'\n | 'user'\n | 'steering'\n | 'assistant'\n | 'artifact'\n | 'interaction'\n | 'turn'\n | 'model'\n\nexport type WorkPresentation =\n | {\n kind: 'terminal'\n command: string\n cwd: string | null\n output: string\n exitCode: number | null\n signal: string | null\n running: boolean\n }\n | {\n kind: 'read'\n label: string\n lang: string | null\n lines: readonly { number: number; text: string }[]\n totalLines: number\n }\n | {\n kind: 'diff'\n diffs: { path: string; oldText: string | null; newText: string }[]\n }\n | { kind: 'json'; data: object | unknown[] }\n | { kind: 'text'; text: string }\n | { kind: 'image'; attachment: unknown }\n | { kind: 'empty' }\n\n/** Immutable evidence for one recorded occurrence. */\nexport interface WorkItem {\n id: string\n seq: number\n resultSeq: number | null\n time: number\n resultTime: number | null\n turn: number\n step: number\n source: WorkSource\n phase: WorkPhase\n status: WorkStatus\n title: string\n subtitle: string\n toolName: string | null\n callId: string | null\n args: Record<string, unknown>\n argsRaw: string | null\n rawText: string\n rawValue: unknown\n presentation: WorkPresentation\n durationMs: number | null\n exitCode: number | null\n signal: string | null\n signature: string | null\n intentKey: string | null\n target: string | null\n retryOf: string | null\n retryIndex: number\n iterationIndex: number\n recoveredBy: string | null\n}\n\nexport interface WorkStep {\n id: string\n turn: number\n step: number\n phase: WorkPhase\n status: WorkStatus\n title: string\n subtitle: string\n items: readonly WorkItem[]\n parallel: boolean\n executionCount: number\n retryCount: number\n iterationCount: number\n unconfirmedFailureCount: number\n firstSeq: number\n lastSeq: number\n startTime: number | null\n endTime: number | null\n model: ModelStepTrace | null\n}\n\n/** One consecutive phase inside one Turn. Every child Step remains addressable. */\nexport interface WorkGroup {\n id: string\n turn: number\n phase: WorkPhase\n status: WorkStatus\n title: string\n subtitle: string\n steps: readonly WorkStep[]\n items: readonly WorkItem[]\n executionCount: number\n parallelStepCount: number\n retryCount: number\n iterationCount: number\n unconfirmedFailureCount: number\n firstSeq: number\n lastSeq: number\n startTime: number | null\n endTime: number | null\n}\n\nexport interface WorkTurn {\n turn: number\n status: WorkStatus\n groups: readonly WorkGroup[]\n startTime: number | null\n endTime: number | null\n}\n\nexport interface WorkPicture {\n nodes: readonly WorkGroup[]\n turns: readonly WorkTurn[]\n now: { phase: WorkPhase; label: string; status: WorkStatus }\n actionCount: number\n stepCount: number\n turnCount: number\n parallelStepCount: number\n retryCount: number\n iterationCount: number\n pendingCount: number\n unconfirmedFailureCount: number\n running: boolean\n partialHistory: boolean\n}\n\ninterface ToolPair {\n callId: string\n seq: number\n resultSeq: number | null\n time: number\n resultTime: number | null\n turn: number\n step: number\n name: string\n args: Record<string, unknown>\n argsRaw: string\n result: unknown\n meta: unknown\n callView: unknown\n resultView: unknown\n orphan: boolean\n}\n\ninterface EventLike {\n type: string\n seq?: number\n time?: number\n data?: unknown\n}\n\ninterface Coordinates {\n turn: number\n step: number\n}\n\ninterface TimeBounds {\n startTime: number | null\n endTime: number | null\n}\n\nconst EMPTY_NOW = Object.freeze({ phase: 'other' as const, label: '', status: 'unknown' as const })\n\nexport const EMPTY_PICTURE: WorkPicture = Object.freeze({\n nodes: [],\n turns: [],\n now: EMPTY_NOW,\n actionCount: 0,\n stepCount: 0,\n turnCount: 0,\n parallelStepCount: 0,\n retryCount: 0,\n iterationCount: 0,\n pendingCount: 0,\n unconfirmedFailureCount: 0,\n running: false,\n partialHistory: false,\n})\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction recordAt(value: unknown, key: string): Record<string, unknown> | null {\n if (!isRecord(value)) return null\n const child = value[key]\n return isRecord(child) ? child : null\n}\n\nfunction stringAt(value: unknown, key: string): string | null {\n return isRecord(value) && typeof value[key] === 'string' ? value[key] : null\n}\n\nfunction numberAt(value: unknown, key: string): number | null {\n return isRecord(value) && typeof value[key] === 'number' && Number.isFinite(value[key])\n ? value[key]\n : null\n}\n\nfunction parseArgs(raw: unknown): Record<string, unknown> {\n if (isRecord(raw)) return raw\n if (typeof raw !== 'string' || raw.trim() === '') return {}\n try {\n const parsed: unknown = JSON.parse(raw)\n return isRecord(parsed) ? parsed : {}\n } catch {\n return {}\n }\n}\n\nfunction stableValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(stableValue)\n if (!isRecord(value)) return value\n return Object.fromEntries(Object.keys(value).sort().map(key => [key, stableValue(value[key])]))\n}\n\n/** Stable exact signature used only for evidence-backed retry detection. */\nexport function normalizedSignature(toolName: string, args: Record<string, unknown>): string {\n return `${toolName}\\u0000${JSON.stringify(stableValue(args))}`\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return String(value)\n }\n}\n\nfunction textFromContent(value: unknown, output: string[] = []): string[] {\n if (Array.isArray(value)) {\n for (const child of value) textFromContent(child, output)\n return output\n }\n if (!isRecord(value)) return output\n if (value.type === 'text' && typeof value.text === 'string') {\n output.push(value.text)\n return output\n }\n if (typeof value.output === 'string') output.push(value.output)\n if (Array.isArray(value.content)) textFromContent(value.content, output)\n if (isRecord(value.message)) textFromContent(value.message, output)\n return output\n}\n\nfunction resultText(value: unknown): string {\n return textFromContent(value).filter(Boolean).join('\\n')\n}\n\nfunction findNumberByKeys(value: unknown, keys: ReadonlySet<string>, depth = 0): number | null {\n if (depth > 8) return null\n if (Array.isArray(value)) {\n for (const child of value) {\n const found = findNumberByKeys(child, keys, depth + 1)\n if (found !== null) return found\n }\n return null\n }\n if (!isRecord(value)) return null\n for (const [key, child] of Object.entries(value)) {\n if (keys.has(key) && typeof child === 'number' && Number.isFinite(child)) return child\n }\n for (const child of Object.values(value)) {\n const found = findNumberByKeys(child, keys, depth + 1)\n if (found !== null) return found\n }\n return null\n}\n\nfunction findStringByKeys(value: unknown, keys: ReadonlySet<string>, depth = 0): string | null {\n if (depth > 8) return null\n if (Array.isArray(value)) {\n for (const child of value) {\n const found = findStringByKeys(child, keys, depth + 1)\n if (found !== null) return found\n }\n return null\n }\n if (!isRecord(value)) return null\n for (const [key, child] of Object.entries(value)) {\n if (keys.has(key) && typeof child === 'string') return child\n }\n for (const child of Object.values(value)) {\n const found = findStringByKeys(child, keys, depth + 1)\n if (found !== null) return found\n }\n return null\n}\n\nfunction findBooleanByKeys(value: unknown, keys: ReadonlySet<string>, depth = 0): boolean | null {\n if (depth > 6) return null\n if (Array.isArray(value)) {\n for (const child of value) {\n const found = findBooleanByKeys(child, keys, depth + 1)\n if (found !== null) return found\n }\n return null\n }\n if (!isRecord(value)) return null\n for (const [key, child] of Object.entries(value)) {\n if (keys.has(key) && typeof child === 'boolean') return child\n }\n for (const child of Object.values(value)) {\n const found = findBooleanByKeys(child, keys, depth + 1)\n if (found !== null) return found\n }\n return null\n}\n\nfunction exitCodeOf(...values: readonly unknown[]): number | null {\n const keys = new Set(['exitCode', 'exit_code'])\n for (const value of values) {\n const found = findNumberByKeys(value, keys)\n if (found !== null) return found\n const text = resultText(value)\n const marker = text.match(/\\[exit code:\\s*(-?\\d+)\\]/i)\n ?? text.match(/\"(?:exitCode|exit_code)\"\\s*:\\s*(-?\\d+)/)\n if (marker?.[1] !== undefined) return Number(marker[1])\n }\n return null\n}\n\nfunction signalOf(...values: readonly unknown[]): string | null {\n const keys = new Set(['signal'])\n for (const value of values) {\n const found = findStringByKeys(value, keys)\n if (found !== null) return found\n }\n return null\n}\n\nfunction errorFlagOf(value: unknown): boolean {\n return findBooleanByKeys(value, new Set(['isError'])) === true\n}\n\nfunction domainOutcomeOf(...values: readonly unknown[]): 'success' | 'failure' | null {\n for (const value of values) {\n const boolean = findBooleanByKeys(value, new Set(['ok', 'success']))\n if (boolean !== null) return boolean ? 'success' : 'failure'\n const status = findStringByKeys(value, new Set(['status', 'outcome']))?.toLowerCase()\n if (status !== undefined && status !== null) {\n if (/^(ok|success|succeeded|passed|done|completed)$/.test(status)) return 'success'\n if (/^(error|failed|failure|denied|cancelled|canceled)$/.test(status)) return 'failure'\n }\n }\n return null\n}\n\nfunction parseJsonCandidate(text: string): object | unknown[] | null {\n const trimmed = text.trim()\n if (!(trimmed.startsWith('{') || trimmed.startsWith('['))) return null\n try {\n const parsed: unknown = JSON.parse(trimmed)\n return typeof parsed === 'object' && parsed !== null ? parsed : null\n } catch {\n return null\n }\n}\n\nfunction baseName(path: string): string {\n return path.replace(/[\\\\/]+$/, '').split(/[\\\\/]/).pop() || path\n}\n\nfunction stringArg(args: Record<string, unknown>, ...keys: readonly string[]): string | null {\n for (const key of keys) {\n const value = args[key]\n if (typeof value === 'string' && value.trim() !== '') return value\n }\n return null\n}\n\nfunction commandOf(args: Record<string, unknown>): string {\n return stringArg(args, 'command', 'cmd') ?? ''\n}\n\nfunction commandPreview(command: string): string {\n const oneLine = command.replace(/\\s+/g, ' ').trim()\n if (oneLine.length <= 52) return oneLine\n return `${oneLine.slice(0, 49)}…`\n}\n\nfunction targetOf(name: string, args: Record<string, unknown>): string | null {\n const direct = stringArg(args, 'file_path', 'path', 'url', 'query', 'pattern', 'name', 'plugin')\n if (direct !== null) return direct\n if (name === 'bash') {\n const command = commandOf(args)\n const path = command.match(/(?:^|\\s)(\\.?\\.?\\/[\\w./-]+|\\/[\\w./-]+)/)?.[1]\n return path ?? null\n }\n return null\n}\n\nfunction isVerificationCommand(command: string): boolean {\n return /(?:^|\\s)(?:test|typecheck|check|verify|lint|vitest|jest|tsc|build)(?:\\s|$)|dshx\\s+check/i.test(command)\n}\n\nfunction isActivationCommand(command: string): boolean {\n return /dshx\\s+(?:activation-plan|sync-artifact|ship|install|start)|dsh\\s+plugin\\s+(?:add|remove)/i.test(command)\n}\n\nfunction phaseOfTool(name: string, args: Record<string, unknown>, callView: unknown): WorkPhase {\n const kind = stringAt(callView, 'kind')\n if (/^(skill|todo_write|create_goal|update_goal|get_goal|update_plan)$/.test(name)) return 'plan'\n if (/^(read|grep|glob|find|search|web_search|web_fetch|web_open)$/.test(name)) return 'investigate'\n if (/^(write|edit|apply_patch|imagegen|image_gen)/.test(name)) return 'build'\n if (/^(dshx_activation_plan|dshx_sync_artifact|dshx_ship|dshx_install|dshx_start)/.test(name)) return 'activate'\n if (/^(dshx_check|dshx_verify|dshx_which|dshx_status)/.test(name)) return 'verify'\n if (name.startsWith('cua_') || name.includes('computer')) return 'desktop'\n if (name === 'bash') {\n const command = commandOf(args)\n if (isActivationCommand(command)) return 'activate'\n if (isVerificationCommand(command)) return 'verify'\n if (/\\b(?:sed|head|tail|ls|find|rg|grep|git\\s+(?:status|diff|log|show))\\b/.test(command)) return 'investigate'\n return 'build'\n }\n if (kind === 'read' || kind === 'search' || kind === 'fetch') return 'investigate'\n if (kind === 'edit' || kind === 'delete' || kind === 'move') return 'build'\n if (kind === 'execute') return 'build'\n return 'other'\n}\n\nfunction titleOfTool(name: string, args: Record<string, unknown>, callView: unknown): string {\n const target = targetOf(name, args)\n if (name === 'read') return `读取 ${target === null ? '文件' : baseName(target)}`\n if (name === 'grep') return `搜索 ${stringArg(args, 'pattern') ?? '内容'}`\n if (name === 'glob') return `查找 ${stringArg(args, 'pattern') ?? '文件'}`\n if (name === 'write') return `写入 ${target === null ? '文件' : baseName(target)}`\n if (name === 'edit') return `修改 ${target === null ? '文件' : baseName(target)}`\n if (name === 'apply_patch') return '应用代码补丁'\n if (name === 'bash') {\n const description = stringArg(args, 'description')\n if (description !== null) return description\n const command = commandOf(args)\n return command === '' ? '运行命令' : `运行 ${commandPreview(command)}`\n }\n if (name === 'skill') return '读取工作说明'\n if (name === 'todo_write' || name === 'update_plan') return '更新工作计划'\n if (name === 'create_goal') return '建立任务目标'\n if (name === 'update_goal') return '更新任务目标'\n if (name === 'get_goal') return '核对任务目标'\n if (name === 'dshx_status' || name === 'dshx_which') return '核对 DSHX 环境'\n if (name === 'dshx_check') return '检查插件合同'\n if (name === 'dshx_activation_plan') return '规划插件激活'\n if (name === 'dshx_sync_artifact') return '同步插件产物'\n const presented = stringAt(callView, 'title')\n return presented ?? (name.replaceAll('_', ' ') || '未知执行')\n}\n\nfunction subtitleOfTool(name: string, args: Record<string, unknown>, target: string | null): string {\n if (target !== null) return target\n if (name === 'bash') return commandOf(args) || name\n const query = stringArg(args, 'query', 'pattern')\n return query ?? name\n}\n\nfunction validReadPresentation(value: unknown): WorkPresentation | null {\n if (!isRecord(value) || value.card !== 'read' || !Array.isArray(value.lines)) return null\n const lines: { number: number; text: string }[] = []\n for (const line of value.lines) {\n if (!isRecord(line) || typeof line.number !== 'number' || typeof line.text !== 'string') return null\n lines.push({ number: line.number, text: line.text })\n }\n const totalLines = typeof value.totalLines === 'number' ? value.totalLines : lines.length\n return {\n kind: 'read',\n label: typeof value.title === 'string' ? value.title : typeof value.path === 'string' ? value.path : '文件',\n lang: typeof value.lang === 'string' ? value.lang : null,\n lines,\n totalLines,\n }\n}\n\nfunction validReadMeta(value: unknown): WorkPresentation | null {\n if (!isRecord(value) || !Array.isArray(value.lines) || typeof value.path !== 'string') return null\n const lines: { number: number; text: string }[] = []\n for (const line of value.lines) {\n if (!isRecord(line) || typeof line.number !== 'number' || typeof line.text !== 'string') return null\n lines.push({ number: line.number, text: line.text })\n }\n return {\n kind: 'read',\n label: value.path,\n lang: typeof value.lang === 'string' ? value.lang : null,\n lines,\n totalLines: typeof value.totalLines === 'number' ? value.totalLines : lines.length,\n }\n}\n\nfunction validDiffs(value: unknown): { path: string; oldText: string | null; newText: string }[] | null {\n if (!Array.isArray(value)) return null\n const diffs: { path: string; oldText: string | null; newText: string }[] = []\n for (const diff of value) {\n if (!isRecord(diff) || typeof diff.path !== 'string' || typeof diff.newText !== 'string') return null\n if (diff.oldText !== null && typeof diff.oldText !== 'string') return null\n diffs.push({ path: diff.path, oldText: diff.oldText, newText: diff.newText })\n }\n return diffs\n}\n\nfunction diffFromArgs(name: string, args: Record<string, unknown>): WorkPresentation | null {\n const path = stringArg(args, 'file_path', 'path')\n if (path === null) return null\n if (name === 'write' && typeof args.content === 'string') {\n return { kind: 'diff', diffs: [{ path, oldText: null, newText: args.content }] }\n }\n if (name === 'edit' && typeof args.old_string === 'string' && typeof args.new_string === 'string') {\n return { kind: 'diff', diffs: [{ path, oldText: args.old_string, newText: args.new_string }] }\n }\n return null\n}\n\nfunction presentationOf(pair: ToolPair, rawText: string, exitCode: number | null, signal: string | null): WorkPresentation {\n const call = isRecord(pair.callView) ? pair.callView : null\n const result = isRecord(pair.resultView) ? pair.resultView : null\n if (result?.card === 'terminal' || (pair.result === null && call?.card === 'terminal') || pair.name === 'bash') {\n return {\n kind: 'terminal',\n command: typeof result?.title === 'string'\n ? result.title\n : typeof call?.title === 'string' ? call.title : commandOf(pair.args),\n cwd: typeof call?.cwd === 'string' ? call.cwd : stringArg(pair.args, 'workdir', 'cwd'),\n output: typeof result?.output === 'string' ? result.output : rawText,\n exitCode,\n signal,\n running: pair.result === null,\n }\n }\n const read = validReadPresentation(result) ?? validReadMeta(pair.meta)\n if (read !== null) return read\n const resultDiffs = result?.card === 'diff' ? validDiffs(result.diffs) : null\n const callDiffs = call?.card === 'diff' ? validDiffs(call.diffs) : null\n const diffs = resultDiffs ?? callDiffs\n if (diffs !== null) return { kind: 'diff', diffs }\n const argDiff = diffFromArgs(pair.name, pair.args)\n if (argDiff !== null) return argDiff\n if (result !== null && result.card !== 'generic') return { kind: 'json', data: result }\n if (isRecord(pair.meta) || Array.isArray(pair.meta)) return { kind: 'json', data: pair.meta }\n const parsed = parseJsonCandidate(rawText)\n if (parsed !== null) return { kind: 'json', data: parsed }\n if (rawText !== '') return { kind: 'text', text: rawText }\n return { kind: 'empty' }\n}\n\nfunction recognizedResultView(value: unknown): boolean {\n if (!isRecord(value) || typeof value.card !== 'string') return false\n return new Set(['generic', 'terminal', 'diff', 'search', 'read', 'web']).has(value.card)\n}\n\nfunction statusOfTool(pair: ToolPair, exitCode: number | null, signal: string | null): WorkStatus {\n if (pair.result === null) return 'running'\n if (errorFlagOf(pair.result) || signal !== null || (exitCode !== null && exitCode !== 0)) return 'failure'\n if (exitCode === 0) return 'success'\n const domain = domainOutcomeOf(pair.meta, pair.resultView, pair.result)\n if (domain !== null) return domain\n if (recognizedResultView(pair.resultView)) return 'success'\n if (pair.orphan && pair.name === '') return 'unknown'\n return 'returned'\n}\n\nfunction mutableIntent(name: string): boolean {\n return /^(write|edit|apply_patch|imagegen|image_gen)/.test(name)\n}\n\nfunction toolItem(pair: ToolPair): WorkItem {\n const rawText = pair.result === null ? '' : resultText(pair.result)\n const exitCode = exitCodeOf(pair.resultView, pair.meta, pair.result)\n const signal = signalOf(pair.resultView, pair.meta, pair.result)\n const target = targetOf(pair.name, pair.args)\n const signature = pair.name === '' ? null : normalizedSignature(pair.name, pair.args)\n const intentKey = mutableIntent(pair.name) && target !== null ? `${pair.name}\\u0000${target}` : null\n const status = statusOfTool(pair, exitCode, signal)\n return {\n id: `tool:${pair.callId}`,\n seq: pair.seq,\n resultSeq: pair.resultSeq,\n time: pair.time,\n resultTime: pair.resultTime,\n turn: pair.turn,\n step: pair.step,\n source: 'tool',\n phase: phaseOfTool(pair.name, pair.args, pair.callView),\n status,\n title: pair.orphan && pair.name === '' ? `未配对结果 ${pair.callId}` : titleOfTool(pair.name, pair.args, pair.callView),\n subtitle: subtitleOfTool(pair.name, pair.args, target),\n toolName: pair.name || null,\n callId: pair.callId,\n args: pair.args,\n argsRaw: pair.argsRaw || null,\n rawText,\n rawValue: pair.meta ?? pair.result,\n presentation: presentationOf(pair, rawText, exitCode, signal),\n durationMs: pair.resultTime === null ? null : Math.max(0, pair.resultTime - pair.time),\n exitCode,\n signal,\n signature,\n intentKey,\n target,\n retryOf: null,\n retryIndex: 0,\n iterationIndex: 0,\n recoveredBy: null,\n }\n}\n\nfunction contentText(value: unknown): string {\n if (!Array.isArray(value)) return ''\n return value.flatMap((block): string[] => (\n isRecord(block) && block.type === 'text' && typeof block.text === 'string' ? [block.text] : []\n )).join('\\n')\n}\n\nfunction messageItem(node: ConversationNode, coordinates: Coordinates, source: 'user' | 'steering' | 'assistant', text: string): WorkItem {\n const phase: WorkPhase = source === 'user' ? 'request' : source === 'steering' ? 'steering' : 'answer'\n const title = source === 'user' ? '用户提出任务' : source === 'steering' ? '用户补充要求' : '完成回复'\n const clean = text.replace(/\\s+/g, ' ').trim()\n return {\n id: `${source}:${node.seq}`,\n seq: node.seq,\n resultSeq: null,\n time: node.time,\n resultTime: null,\n turn: coordinates.turn,\n step: coordinates.step,\n source,\n phase,\n status: 'returned',\n title,\n subtitle: clean.length > 76 ? `${clean.slice(0, 73)}…` : clean,\n toolName: null,\n callId: null,\n args: {},\n argsRaw: null,\n rawText: text,\n rawValue: text,\n presentation: text === '' ? { kind: 'empty' } : { kind: 'text', text },\n durationMs: null,\n exitCode: null,\n signal: null,\n signature: null,\n intentKey: null,\n target: null,\n retryOf: null,\n retryIndex: 0,\n iterationIndex: 0,\n recoveredBy: null,\n }\n}\n\nfunction imageItems(node: AssistantMessageNode, coordinates: Coordinates): WorkItem[] {\n const items: WorkItem[] = []\n let imageIndex = 0\n for (const block of node.blocks) {\n if (block.kind !== 'image') continue\n imageIndex++\n items.push({\n id: `artifact:${node.seq}:${imageIndex}`,\n seq: node.seq + imageIndex / 1000,\n resultSeq: null,\n time: node.time,\n resultTime: null,\n turn: coordinates.turn,\n step: coordinates.step,\n source: 'artifact',\n phase: 'build',\n status: 'success',\n title: '生成图片',\n subtitle: `图片附件 ${imageIndex}`,\n toolName: null,\n callId: null,\n args: {},\n argsRaw: null,\n rawText: '',\n rawValue: block.attachment,\n presentation: { kind: 'image', attachment: block.attachment },\n durationMs: null,\n exitCode: null,\n signal: null,\n signature: null,\n intentKey: null,\n target: null,\n retryOf: null,\n retryIndex: 0,\n iterationIndex: 0,\n recoveredBy: null,\n })\n }\n return items\n}\n\nfunction turnStateItem(seq: number, time: number, coordinates: Coordinates, status: 'failure' | 'interrupted', message: string): WorkItem {\n return {\n id: `turn:${seq}`,\n seq,\n resultSeq: null,\n time,\n resultTime: null,\n turn: coordinates.turn,\n step: coordinates.step,\n source: 'turn',\n phase: 'failure',\n status,\n title: status === 'interrupted' ? '本轮已中断' : '本轮失败',\n subtitle: message,\n toolName: null,\n callId: null,\n args: {},\n argsRaw: null,\n rawText: message,\n rawValue: message,\n presentation: { kind: 'text', text: message },\n durationMs: null,\n exitCode: null,\n signal: null,\n signature: null,\n intentKey: null,\n target: null,\n retryOf: null,\n retryIndex: 0,\n iterationIndex: 0,\n recoveredBy: null,\n }\n}\n\nfunction interactionItem(\n id: string,\n seq: number,\n time: number,\n coordinates: Coordinates,\n status: WorkStatus,\n subtitle: string,\n durationMs: number | null,\n rawValue: unknown,\n): WorkItem {\n return {\n id: `interaction:${id}`,\n seq,\n resultSeq: null,\n time,\n resultTime: durationMs === null ? null : time + durationMs,\n turn: coordinates.turn,\n step: coordinates.step,\n source: 'interaction',\n phase: 'wait',\n status,\n title: status === 'waiting' ? '等待你决定' : '你已作决定',\n subtitle,\n toolName: null,\n callId: null,\n args: {},\n argsRaw: null,\n rawText: safeStringify(rawValue),\n rawValue,\n presentation: isRecord(rawValue) ? { kind: 'json', data: rawValue } : { kind: 'text', text: String(rawValue) },\n durationMs,\n exitCode: null,\n signal: null,\n signature: null,\n intentKey: null,\n target: null,\n retryOf: null,\n retryIndex: 0,\n iterationIndex: 0,\n recoveredBy: null,\n }\n}\n\nfunction modelItem(trace: ModelStepTrace): WorkItem {\n const attempt = trace.attempts.at(-1)\n const running = attempt?.kind === 'running'\n const interrupted = attempt?.kind === 'interrupted'\n const resultTime = attempt === undefined || running ? null : attempt.endedAt\n const time = trace.startTime\n ?? attempt?.firstTokenTime\n ?? attempt?.firstReasoningTime\n ?? resultTime\n ?? 0\n return {\n id: `model:${trace.turn}:${trace.step}`,\n // A streaming trace mutates lastSeq on every chunk. Ordering and React\n // disclosure identity must stay anchored to the first observed event;\n // lastSeq remains the activity/result cursor only.\n seq: trace.startSeq,\n resultSeq: running ? null : trace.lastSeq,\n time,\n resultTime,\n turn: trace.turn,\n step: trace.step,\n source: 'model',\n phase: 'model',\n status: running ? 'running' : interrupted ? 'interrupted' : 'returned',\n title: running ? '模型正在生成' : '模型响应',\n subtitle: hasReasoningEvidence(trace) ? '包含可见推理记录' : '模型活动记录',\n toolName: null,\n callId: null,\n args: {},\n argsRaw: null,\n rawText: '',\n rawValue: trace,\n presentation: { kind: 'empty' },\n durationMs: resultTime === null ? null : Math.max(0, resultTime - time),\n exitCode: null,\n signal: null,\n signature: null,\n intentKey: null,\n target: null,\n retryOf: null,\n retryIndex: 0,\n iterationIndex: 0,\n recoveredBy: null,\n }\n}\n\nfunction withModelPlaceholders(\n items: readonly WorkItem[],\n traces: Iterable<ModelStepTrace>,\n): WorkItem[] {\n const occupied = new Set(items.map(item => `${item.turn}:${item.step}`))\n const next = [...items]\n for (const trace of traces) {\n if (!occupied.has(`${trace.turn}:${trace.step}`)) next.push(modelItem(trace))\n }\n return next\n}\n\nfunction coordinatesOfLocation(value: unknown): Coordinates | null {\n if (!isRecord(value)) return null\n if (value.kind === 'step') {\n const turn = recordAt(value, 'turn')\n const step = recordAt(value, 'step')\n if (typeof turn?.turn === 'number' && typeof step?.step === 'number') return { turn: turn.turn, step: step.step }\n }\n if (value.kind === 'turn') {\n const turn = recordAt(value, 'turn')\n if (typeof turn?.turn === 'number') return { turn: turn.turn, step: 0 }\n }\n return null\n}\n\nfunction snapshotLocations(snapshot: WatcherSnapshot): Map<number, Coordinates> {\n const locations = new Map<number, Coordinates>()\n const views = snapshot.views as unknown as { get: (target: string) => unknown }\n const trajectory = views.get('trajectory')\n if (isRecord(trajectory) && trajectory.eventLocations instanceof Map) {\n for (const [seq, location] of trajectory.eventLocations) {\n if (typeof seq !== 'number') continue\n const coordinates = coordinatesOfLocation(location)\n if (coordinates !== null) locations.set(seq, coordinates)\n }\n }\n for (const turnNumber of snapshot.chat.timeline.turnOrder) {\n const turn = snapshot.chat.timeline.turns.get(turnNumber)\n if (turn === undefined) continue\n for (const step of turn.steps) {\n for (const key of snapshot.chat.locations.getStep(turnNumber, step.step)) {\n const node = snapshot.chat.nodes.get(key)\n if (node === undefined) continue\n const coordinates = { turn: turnNumber, step: step.step }\n if (!locations.has(node.anchorSeq)) locations.set(node.anchorSeq, coordinates)\n\n // Chat anchors a Tool row at its tool/call seq, while the durable\n // ToolResultNode is keyed by the later tool/result seq. Preserve both\n // identities so a settled Tool never falls into synthetic Turn 0 when\n // Trajectory intentionally omits contribution-only event locations.\n const data = recordAt(node, 'data')\n const root = recordAt(data, 'root')\n const resultSeq = root?.kind === 'tool-result' ? numberAt(root, 'seq') : null\n if (resultSeq !== null && !locations.has(resultSeq)) locations.set(resultSeq, coordinates)\n }\n }\n }\n return locations\n}\n\nfunction trajectoryNodes(snapshot: WatcherSnapshot): readonly ConversationNode[] {\n const views = snapshot.views as unknown as { get: (target: string) => unknown }\n const trajectory = views.get('trajectory')\n if (isRecord(trajectory) && Array.isArray(trajectory.eventNodes)) return trajectory.eventNodes as readonly ConversationNode[]\n return snapshot.nodes\n}\n\nfunction pairFromSettled(node: ToolResultNode): ToolPair {\n const argsRaw = node.call?.argsRaw ?? ''\n return {\n callId: node.callId,\n seq: node.callTime === null ? node.seq : node.seq - 0.5,\n resultSeq: node.seq,\n time: node.callTime ?? node.time,\n resultTime: node.time,\n turn: 0,\n step: 0,\n name: node.call?.name ?? '',\n args: parseArgs(argsRaw),\n argsRaw,\n result: { content: node.content, isError: node.isError, error: node.error },\n meta: node.meta,\n callView: null,\n resultView: null,\n orphan: node.call === null,\n }\n}\n\nfunction pairFromRunning(call: RunningToolCall, index: number): ToolPair {\n return {\n callId: call.callId,\n seq: Number.MAX_SAFE_INTEGER - 1000 + index,\n resultSeq: null,\n time: call.time,\n resultTime: null,\n turn: call.turn,\n step: call.step,\n name: call.name,\n args: parseArgs(call.argsRaw),\n argsRaw: call.argsRaw,\n result: null,\n meta: null,\n callView: null,\n resultView: null,\n orphan: false,\n }\n}\n\n/** Public RC1 Session/Conversation projection to occurrence-preserving tool pairs. */\nexport function pairsFromSnapshot(snapshot: WatcherSnapshot): ToolPair[] {\n const locations = snapshotLocations(snapshot)\n const pairs: ToolPair[] = []\n for (const node of trajectoryNodes(snapshot)) {\n if (node.kind !== 'tool-result') continue\n const pair = pairFromSettled(node)\n const coordinates = locations.get(node.seq)\n pair.turn = coordinates?.turn ?? 0\n pair.step = coordinates?.step ?? 0\n pairs.push(pair)\n }\n snapshot.runningCalls.forEach((call, index) => pairs.push(pairFromRunning(call, index)))\n pairs.sort((left, right) => left.seq - right.seq || left.time - right.time)\n return pairs\n}\n\nfunction snapshotItems(snapshot: WatcherSnapshot): WorkItem[] {\n const locations = snapshotLocations(snapshot)\n const items = pairsFromSnapshot(snapshot).map(toolItem)\n for (const node of trajectoryNodes(snapshot)) {\n const coordinates = locations.get(node.seq) ?? { turn: 'turn' in node ? node.turn : 0, step: 'step' in node ? node.step : 0 }\n if (node.kind === 'user') {\n if (stringAt(node.source, 'kind') !== 'user') continue\n const text = contentText(node.content)\n if (text !== '') items.push(messageItem(node, coordinates, 'user', text))\n } else if (node.kind === 'steering') {\n const text = contentText(node.content)\n if (text !== '') items.push(messageItem(node, coordinates, 'steering', text))\n } else if (node.kind === 'assistant') {\n const hasTool = node.blocks.some((block: any) => block.kind === 'tool-call')\n const text = node.blocks.flatMap((block: any) => block.kind === 'text' ? [block.text] : []).join('\\n')\n if (!hasTool && text.trim() !== '') items.push(messageItem(node, coordinates, 'assistant', text))\n items.push(...imageItems(node, coordinates))\n if (node.interrupted === true) items.push(turnStateItem(node.seq + 0.9, node.time, coordinates, 'interrupted', 'Agent 输出在完成前停止'))\n } else if (node.kind === 'turn-error') {\n items.push(turnStateItem(node.seq, node.time, coordinates, 'failure', node.message))\n } else if (node.kind === 'turn-max-tokens') {\n items.push(turnStateItem(node.seq, node.time, coordinates, 'interrupted', '达到本轮输出上限'))\n }\n }\n const latestTurn = snapshot.chat.timeline.turnOrder.at(-1) ?? 0\n const latestStep = snapshot.chat.timeline.turns.get(latestTurn)?.steps.at(-1)?.step ?? 0\n snapshot.pending.forEach((pending, index) => {\n const name = pending.kind === 'approval' ? '等待批准' : '等待回答问题'\n items.push(interactionItem(\n pending.key,\n Number.MAX_SAFE_INTEGER - 100 + index,\n Date.now(),\n { turn: latestTurn, step: latestStep },\n 'waiting',\n name,\n null,\n pending,\n ))\n })\n const models = snapshot.chat.timeline.turnOrder.flatMap(turn => (\n snapshot.chat.timeline.turns.get(turn)?.steps.flatMap(step => {\n const model = step.data.get('dsh-watcher-model-stage')\n return model === undefined ? [] : [model]\n }) ?? []\n ))\n return withModelPlaceholders(items, models)\n .sort((left, right) => left.seq - right.seq || left.time - right.time)\n}\n\nfunction resultCallId(value: unknown): string | null {\n const message = recordAt(value, 'message')\n const source = recordAt(message, 'source')\n return stringAt(source, 'callId') ?? stringAt(value, 'callId')\n}\n\n/** Pair every log call/result and preserve an orphan result instead of dropping it. */\nexport function pairTools(events: readonly EventLike[]): ToolPair[] {\n const calls = new Map<string, EventLike>()\n const results = new Map<string, EventLike>()\n for (const event of events) {\n const data = event.data\n if (event.type === 'tool/call') {\n const callId = stringAt(data, 'callId')\n if (callId !== null) calls.set(callId, event)\n } else if (event.type === 'tool/result') {\n const callId = resultCallId(data)\n if (callId !== null) results.set(callId, event)\n }\n }\n const pairs: ToolPair[] = []\n for (const [callId, callEvent] of calls) {\n const callData = isRecord(callEvent.data) ? callEvent.data : {}\n const resultEvent = results.get(callId)\n const resultData = resultEvent?.data ?? null\n const argumentsRaw = typeof callData.arguments === 'string' ? callData.arguments : safeStringify(callData.arguments ?? {})\n pairs.push({\n callId,\n seq: callEvent.seq ?? 0,\n resultSeq: resultEvent?.seq ?? null,\n time: callEvent.time ?? 0,\n resultTime: resultEvent?.time ?? null,\n turn: numberAt(callData, 'turn') ?? 0,\n step: numberAt(callData, 'step') ?? 0,\n name: stringAt(callData, 'name') ?? '',\n args: parseArgs(callData.arguments),\n argsRaw: argumentsRaw,\n result: resultData,\n meta: isRecord(resultData) ? resultData.meta ?? null : null,\n callView: callData.view ?? callData.callView ?? null,\n resultView: isRecord(resultData) ? resultData.view ?? resultData.resultView ?? null : null,\n orphan: false,\n })\n }\n for (const [callId, resultEvent] of results) {\n if (calls.has(callId)) continue\n const resultData = isRecord(resultEvent.data) ? resultEvent.data : {}\n pairs.push({\n callId,\n seq: resultEvent.seq ?? 0,\n resultSeq: resultEvent.seq ?? null,\n time: resultEvent.time ?? 0,\n resultTime: resultEvent.time ?? null,\n turn: numberAt(resultData, 'turn') ?? 0,\n step: numberAt(resultData, 'step') ?? 0,\n name: '',\n args: {},\n argsRaw: '',\n result: resultEvent.data ?? null,\n meta: resultData.meta ?? null,\n callView: null,\n resultView: resultData.view ?? resultData.resultView ?? null,\n orphan: true,\n })\n }\n return pairs.sort((left, right) => left.seq - right.seq || left.time - right.time)\n}\n\nfunction eventCoordinates(events: readonly EventLike[]): Map<number, Coordinates> {\n const map = new Map<number, Coordinates>()\n let turn = 0\n let step = 0\n for (const event of events) {\n const data = isRecord(event.data) ? event.data : {}\n if (event.type === 'turn/start') {\n turn = numberAt(data, 'turn') ?? turn\n step = 0\n } else if (event.type === 'step/start') {\n turn = numberAt(data, 'turn') ?? turn\n step = numberAt(data, 'step') ?? step\n }\n const directTurn = numberAt(data, 'turn')\n const directStep = numberAt(data, 'step')\n if (event.seq !== undefined) map.set(event.seq, { turn: directTurn ?? turn, step: directStep ?? step })\n }\n return map\n}\n\ninterface EventTimingIndex {\n turns: ReadonlyMap<number, TimeBounds>\n steps: ReadonlyMap<string, TimeBounds>\n}\n\nfunction eventTimingIndex(events: readonly EventLike[]): EventTimingIndex {\n const turns = new Map<number, TimeBounds>()\n const steps = new Map<string, TimeBounds>()\n for (const event of events) {\n const data = isRecord(event.data) ? event.data : {}\n const turn = numberAt(data, 'turn')\n if (turn === null) continue\n const time = event.time ?? null\n if (event.type === 'turn/start' || event.type === 'turn/end') {\n const current = turns.get(turn) ?? { startTime: null, endTime: null }\n turns.set(turn, event.type === 'turn/start'\n ? { ...current, startTime: time }\n : { ...current, endTime: time })\n }\n if (event.type !== 'step/start' && event.type !== 'step/end') continue\n const step = numberAt(data, 'step')\n if (step === null) continue\n const key = `${turn}:${step}`\n const current = steps.get(key) ?? { startTime: null, endTime: null }\n steps.set(key, event.type === 'step/start'\n ? { ...current, startTime: time }\n : { ...current, endTime: time })\n }\n return { turns, steps }\n}\n\nfunction eventMessageContent(event: EventLike): readonly unknown[] {\n const data = isRecord(event.data) ? event.data : null\n if (data === null) return []\n const message = recordAt(data, 'message')\n const content = message?.content ?? data.content\n return Array.isArray(content) ? content : []\n}\n\nfunction logMessageItems(events: readonly EventLike[], coordinates: ReadonlyMap<number, Coordinates>): WorkItem[] {\n const items: WorkItem[] = []\n for (const event of events) {\n const seq = event.seq ?? 0\n const location = coordinates.get(seq) ?? { turn: 0, step: 0 }\n const data = isRecord(event.data) ? event.data : {}\n if (event.type === 'user/message') {\n const source = recordAt(data, 'source')\n if (stringAt(source, 'kind') !== 'user') continue\n const text = contentText(data.content)\n if (text !== '') {\n const node = { kind: 'user', seq, time: event.time ?? 0, content: [], source: null } as ConversationNode\n items.push(messageItem(node, location, 'user', text))\n }\n } else if (event.type === 'agent/inbox/spliced' && data.target === 'next-step' && Array.isArray(data.inserted)) {\n for (const inserted of data.inserted) {\n if (!isRecord(inserted) || stringAt(inserted.source, 'kind') !== 'user') continue\n const text = contentText(inserted.content)\n if (text === '') continue\n const node = { kind: 'steering', seq, time: event.time ?? 0, content: [], source: null } as unknown as ConversationNode\n items.push(messageItem(node, location, 'steering', text))\n }\n } else if (event.type === 'assistant/message') {\n const content = eventMessageContent(event)\n const hasTool = content.some(block => isRecord(block) && block.type === 'tool-call')\n const text = contentText(content)\n if (!hasTool && text !== '') {\n const node = { kind: 'assistant', seq, time: event.time ?? 0, turn: location.turn, step: location.step, blocks: [] } as ConversationNode\n items.push(messageItem(node, location, 'assistant', text))\n }\n let imageIndex = 0\n for (const block of content) {\n if (!isRecord(block) || block.type !== 'image') continue\n imageIndex++\n const attachment = block.attachment ?? block\n const base = messageItem(\n { kind: 'assistant', seq, time: event.time ?? 0, turn: location.turn, step: location.step, blocks: [] } as ConversationNode,\n location,\n 'assistant',\n '',\n )\n items.push({\n ...base,\n id: `artifact:${seq}:${imageIndex}`,\n seq: seq + imageIndex / 1000,\n source: 'artifact',\n phase: 'build',\n status: 'success',\n title: '生成图片',\n subtitle: `图片附件 ${imageIndex}`,\n rawValue: attachment,\n presentation: { kind: 'image', attachment },\n })\n }\n } else if (event.type === 'turn/end') {\n const reason = recordAt(data, 'reason')\n const kind = stringAt(reason, 'kind')\n if (kind === 'aborted') items.push(turnStateItem(seq, event.time ?? 0, location, 'interrupted', '用户或运行时中断了本轮对话'))\n else if (kind !== null && kind !== 'completed') items.push(turnStateItem(seq, event.time ?? 0, location, 'failure', safeStringify(reason)))\n }\n }\n return items\n}\n\nfunction approvalItems(events: readonly EventLike[], coordinates: ReadonlyMap<number, Coordinates>): WorkItem[] {\n const decided = new Map<string, EventLike>()\n const callLocations = new Map<string, Coordinates>()\n for (const event of events) {\n const data = isRecord(event.data) ? event.data : {}\n if (event.type === 'approval/decided') {\n const id = stringAt(data, 'id')\n if (id !== null) decided.set(id, event)\n } else if (event.type === 'tool/call') {\n const callId = stringAt(data, 'callId')\n if (callId !== null) callLocations.set(callId, coordinates.get(event.seq ?? 0) ?? { turn: 0, step: 0 })\n }\n }\n const items: WorkItem[] = []\n for (const event of events) {\n if (event.type !== 'approval/asked') continue\n const data = isRecord(event.data) ? event.data : {}\n const id = stringAt(data, 'id')\n if (id === null) continue\n const decision = decided.get(id)\n const decisionData = isRecord(decision?.data) ? decision.data : {}\n const outcome = stringAt(decisionData, 'outcome')\n const status: WorkStatus = decision === undefined\n ? 'waiting'\n : outcome !== null && /denied|reject|cancel/i.test(outcome) ? 'failure' : 'returned'\n const toolName = stringAt(data, 'toolName') ?? '工具调用'\n const location = callLocations.get(stringAt(data, 'callId') ?? '') ?? coordinates.get(event.seq ?? 0) ?? { turn: 0, step: 0 }\n const duration = decision?.time === undefined || event.time === undefined ? null : Math.max(0, decision.time - event.time)\n items.push(interactionItem(id, event.seq ?? 0, event.time ?? 0, location, status, `${toolName}${outcome === null ? '' : ` · ${outcome}`}`, duration, { asked: data, decided: decisionData }))\n }\n return items\n}\n\nfunction withPatterns(items: readonly WorkItem[]): WorkItem[] {\n const next = items.map(item => ({ ...item }))\n const lastBySignature = new Map<string, number>()\n const lastByIntent = new Map<string, number>()\n for (let index = 0; index < next.length; index++) {\n const item = next[index]\n if (item === undefined) continue\n if (item.signature !== null) {\n const previousIndex = lastBySignature.get(item.signature)\n const previous = previousIndex === undefined ? undefined : next[previousIndex]\n if (previous !== undefined && (previous.status === 'failure' || previous.status === 'unknown')) {\n item.retryOf = previous.id\n item.retryIndex = previous.retryIndex + 1\n }\n if (item.status === 'success' && previous !== undefined && previous.status === 'failure') previous.recoveredBy = item.id\n lastBySignature.set(item.signature, index)\n }\n if (item.intentKey !== null) {\n const previousIndex = lastByIntent.get(item.intentKey)\n const previous = previousIndex === undefined ? undefined : next[previousIndex]\n if (previous !== undefined && previous.signature !== item.signature) item.iterationIndex = previous.iterationIndex + 1\n lastByIntent.set(item.intentKey, index)\n }\n }\n return next\n}\n\nfunction phasePriority(phase: WorkPhase): number {\n const priorities: Record<WorkPhase, number> = {\n wait: 100,\n steering: 95,\n request: 90,\n failure: 85,\n activate: 80,\n verify: 70,\n build: 60,\n desktop: 55,\n investigate: 50,\n plan: 40,\n answer: 30,\n model: 25,\n other: 0,\n }\n return priorities[phase]\n}\n\nfunction statusOfItems(items: readonly WorkItem[]): WorkStatus {\n if (items.some(item => item.status === 'waiting')) return 'waiting'\n if (items.some(item => item.status === 'running')) return 'running'\n if (items.some(item => item.status === 'interrupted')) return 'interrupted'\n if (items.some(item => item.status === 'failure' && item.recoveredBy === null)) return 'failure'\n if (items.some(item => item.status === 'success')) return 'success'\n if (items.some(item => item.status === 'returned')) return 'returned'\n return 'unknown'\n}\n\nexport function phaseTitle(phase: WorkPhase): string {\n const titles: Record<WorkPhase, string> = {\n request: '理解任务',\n steering: '接收用户补充',\n plan: '规划工作',\n investigate: '检查与理解',\n build: '修改实现',\n verify: '验证结果',\n activate: '激活插件',\n desktop: '操作界面',\n answer: '完成回复',\n model: '模型响应',\n wait: '等待你决定',\n failure: '处理异常',\n other: '执行其他工作',\n }\n return titles[phase]\n}\n\nfunction compactTargets(items: readonly WorkItem[]): string {\n const values = [...new Set(items.map(item => item.target).filter((value): value is string => value !== null))]\n if (values.length === 0) return ''\n const head = values.slice(0, 2).map(baseName).join(' · ')\n return values.length > 2 ? `${head} · +${values.length - 2}` : head\n}\n\nfunction stepOf(items: readonly WorkItem[], timing: TimeBounds, model: ModelStepTrace | null): WorkStep {\n const first = items[0]\n if (first === undefined) throw new Error('work step requires at least one item')\n const phase = items.reduce((winner, item) => phasePriority(item.phase) > phasePriority(winner) ? item.phase : winner, first.phase)\n const executionCount = items.filter(item => item.source === 'tool').length\n const parallel = executionCount > 1\n const retryCount = items.filter(item => item.retryOf !== null).length\n const iterationCount = items.filter(item => item.iterationIndex > 0).length\n const unconfirmedFailureCount = items.filter(item => item.status === 'failure' && item.recoveredBy === null).length\n const targets = compactTargets(items)\n const title = items.length === 1 ? first.title : `${phaseTitle(phase)}${parallel ? ` · ${executionCount} 项并行` : ''}`\n const detail = [targets, executionCount > 0 ? `${executionCount} 次执行` : `${items.length} 条记录`].filter(Boolean).join(' · ')\n return {\n id: `turn:${first.turn}:step:${first.step}:seq:${first.seq}`,\n turn: first.turn,\n step: first.step,\n phase,\n status: statusOfItems(items),\n title,\n subtitle: detail,\n items,\n parallel,\n executionCount,\n retryCount,\n iterationCount,\n unconfirmedFailureCount,\n firstSeq: first.seq,\n lastSeq: items.at(-1)?.seq ?? first.seq,\n ...timing,\n model,\n }\n}\n\nfunction stepsOf(\n items: readonly WorkItem[],\n timingOf: ((turn: number, step: number) => TimeBounds) | undefined,\n modelOf: ((turn: number, step: number) => ModelStepTrace | null) | undefined,\n): WorkStep[] {\n const steps: WorkStep[] = []\n let current: WorkItem[] = []\n let key = ''\n for (const item of items) {\n const itemKey = `${item.turn}:${item.step}`\n if (current.length > 0 && itemKey !== key) {\n const first = current[0]\n if (first !== undefined) {\n steps.push(stepOf(\n current,\n timingOf?.(first.turn, first.step) ?? { startTime: null, endTime: null },\n modelOf?.(first.turn, first.step) ?? null,\n ))\n }\n current = []\n }\n key = itemKey\n current.push(item)\n }\n if (current.length > 0) {\n const first = current[0]\n if (first !== undefined) {\n steps.push(stepOf(\n current,\n timingOf?.(first.turn, first.step) ?? { startTime: null, endTime: null },\n modelOf?.(first.turn, first.step) ?? null,\n ))\n }\n }\n return steps\n}\n\nfunction groupOf(steps: readonly WorkStep[]): WorkGroup {\n const first = steps[0]\n if (first === undefined) throw new Error('work group requires at least one step')\n const items = steps.flatMap(step => step.items)\n const executionCount = steps.reduce((sum, step) => sum + step.executionCount, 0)\n const parallelStepCount = steps.filter(step => step.parallel).length\n const retryCount = steps.reduce((sum, step) => sum + step.retryCount, 0)\n const iterationCount = steps.reduce((sum, step) => sum + step.iterationCount, 0)\n const unconfirmedFailureCount = steps.reduce((sum, step) => sum + step.unconfirmedFailureCount, 0)\n const summary = [\n `${steps.length} 个步骤`,\n executionCount > 0 ? `${executionCount} 次执行` : null,\n parallelStepCount > 0 ? `${parallelStepCount} 次并行` : null,\n ].filter((part): part is string => part !== null).join(' · ')\n return {\n id: `turn:${first.turn}:phase:${first.phase}:seq:${first.firstSeq}`,\n turn: first.turn,\n phase: first.phase,\n status: statusOfItems(items),\n title: phaseTitle(first.phase),\n subtitle: summary,\n steps,\n items,\n executionCount,\n parallelStepCount,\n retryCount,\n iterationCount,\n unconfirmedFailureCount,\n firstSeq: first.firstSeq,\n lastSeq: steps.at(-1)?.lastSeq ?? first.lastSeq,\n startTime: first.startTime,\n endTime: steps.at(-1)?.endTime ?? null,\n }\n}\n\nfunction groupsOf(steps: readonly WorkStep[]): WorkGroup[] {\n const groups: WorkGroup[] = []\n let current: WorkStep[] = []\n let phase: WorkPhase | null = null\n let turn: number | null = null\n for (const step of steps) {\n if (current.length > 0 && (step.phase !== phase || step.turn !== turn)) {\n groups.push(groupOf(current))\n current = []\n }\n phase = step.phase\n turn = step.turn\n current.push(step)\n }\n if (current.length > 0) groups.push(groupOf(current))\n return groups\n}\n\nfunction turnTimesFromSnapshot(snapshot: WatcherSnapshot, turn: number): TimeBounds {\n const location = snapshot.chat.timeline.turns.get(turn)\n const timing = snapshot.turnTimings.get(turn)\n return {\n startTime: location?.start?.time ?? timing?.startTime ?? null,\n endTime: location?.end?.time ?? timing?.endTime ?? null,\n }\n}\n\nfunction stepTimesFromSnapshot(snapshot: WatcherSnapshot, turn: number, step: number): TimeBounds {\n const location = snapshot.chat.timeline.turns.get(turn)?.steps.find(value => value.step === step)\n return {\n startTime: location?.start?.time ?? null,\n endTime: location?.end?.time ?? null,\n }\n}\n\nfunction stepModelFromSnapshot(snapshot: WatcherSnapshot, turn: number, step: number): ModelStepTrace | null {\n return snapshot.chat.timeline.turns.get(turn)?.steps\n .find(value => value.step === step)?.data.get('dsh-watcher-model-stage') ?? null\n}\n\nfunction pictureOf(\n sourceItems: readonly WorkItem[],\n options: {\n running: boolean\n partialHistory: boolean\n pendingCount: number\n turnTimes?: (turn: number) => TimeBounds\n stepTimes?: (turn: number, step: number) => TimeBounds\n modelOf?: (turn: number, step: number) => ModelStepTrace | null\n },\n): WorkPicture {\n if (sourceItems.length === 0) return { ...EMPTY_PICTURE, running: options.running, partialHistory: options.partialHistory, pendingCount: options.pendingCount }\n const occupiedSteps = new Set(sourceItems\n .filter(item => item.source !== 'model')\n .map(item => `${item.turn}:${item.step}`))\n const visibleSourceItems = sourceItems.filter(item => (\n item.source !== 'model' || !occupiedSteps.has(`${item.turn}:${item.step}`)\n ))\n // Turn and Step are the authoritative conversation coordinates. Some\n // interaction records (for example a delayed approval decision) arrive\n // after events from a later Step. Event sequence therefore orders only\n // occurrences *inside* one Step; it must never reorder the Step rail.\n const items = withPatterns([...visibleSourceItems].sort((left, right) =>\n left.turn - right.turn\n || left.step - right.step\n || left.seq - right.seq\n || left.time - right.time,\n ))\n const steps = stepsOf(items, options.stepTimes, options.modelOf)\n const groups = groupsOf(steps)\n const turns: WorkTurn[] = []\n for (const turnNumber of [...new Set(groups.map(group => group.turn))]) {\n const turnGroups = groups.filter(group => group.turn === turnNumber)\n const timing = options.turnTimes?.(turnNumber) ?? { startTime: null, endTime: null }\n turns.push({ turn: turnNumber, status: statusOfItems(turnGroups.flatMap(group => group.items)), groups: turnGroups, ...timing })\n }\n const latest = items.at(-1)\n const now = latest === undefined\n ? EMPTY_NOW\n : {\n phase: latest.phase,\n label: latest.status === 'running' ? latest.title : options.running ? '等待 Agent 继续' : latest.title,\n status: latest.status === 'running' ? 'running' as const : options.running ? 'running' as const : latest.status,\n }\n return {\n nodes: groups,\n turns,\n now,\n actionCount: items.filter(item => item.source === 'tool').length,\n stepCount: steps.length,\n turnCount: turns.length,\n parallelStepCount: steps.filter(step => step.parallel).length,\n retryCount: items.filter(item => item.retryOf !== null).length,\n iterationCount: items.filter(item => item.iterationIndex > 0).length,\n pendingCount: options.pendingCount,\n unconfirmedFailureCount: items.filter(item => item.status === 'failure' && item.recoveredBy === null).length,\n running: options.running,\n partialHistory: options.partialHistory,\n }\n}\n\n/** Fold the official RC8 snapshot without flattening Turn/Step identity. */\nexport function foldSnapshot(snapshot: WatcherSnapshot, options: { running?: boolean } = {}): WorkPicture {\n if (snapshot.blank) {\n return {\n ...EMPTY_PICTURE,\n running: options.running === true || snapshot.running,\n partialHistory: snapshot.hasMore,\n }\n }\n return pictureOf(snapshotItems(snapshot), {\n running: options.running === true || snapshot.running,\n partialHistory: snapshot.hasMore,\n pendingCount: snapshot.pending.length,\n turnTimes: turn => turnTimesFromSnapshot(snapshot, turn),\n stepTimes: (turn, step) => stepTimesFromSnapshot(snapshot, turn, step),\n modelOf: (turn, step) => stepModelFromSnapshot(snapshot, turn, step),\n })\n}\n\nfunction itemsOfPicture(picture: WorkPicture): readonly WorkItem[] {\n return picture.nodes.flatMap(group => group.items)\n}\n\nfunction turnTimesOfPicture(picture: WorkPicture): Map<number, TimeBounds> {\n return new Map(picture.turns.map(turn => [turn.turn, {\n startTime: turn.startTime,\n endTime: turn.endTime,\n }]))\n}\n\nfunction stepTimesOfPicture(picture: WorkPicture): Map<string, TimeBounds> {\n return new Map(picture.nodes.flatMap(group => group.steps.map(step => [\n `${step.turn}:${step.step}`,\n { startTime: step.startTime, endTime: step.endTime },\n ] as const)))\n}\n\nfunction stepModelsOfPicture(picture: WorkPicture): Map<string, ModelStepTrace> {\n return new Map(picture.nodes.flatMap(group => group.steps.flatMap(step => (\n step.model === null ? [] : [[`${step.turn}:${step.step}`, step.model] as const]\n ))))\n}\n\n/**\n * Retain every occurrence already observed in this mounted page while the\n * official RC8 window advances. Latest evidence wins by stable occurrence id,\n * so running → result updates one row instead of duplicating or removing it.\n */\nexport function mergeObservedPictures(previous: WorkPicture, current: WorkPicture): WorkPicture {\n if (previous.nodes.length === 0) return current\n if (current.nodes.length === 0) {\n return {\n ...previous,\n running: current.running,\n partialHistory: current.partialHistory,\n pendingCount: current.pendingCount,\n }\n }\n\n const items = new Map<string, WorkItem>()\n for (const item of itemsOfPicture(previous)) items.set(item.id, item)\n for (const item of itemsOfPicture(current)) items.set(item.id, item)\n\n const turns = turnTimesOfPicture(previous)\n for (const [turn, timing] of turnTimesOfPicture(current)) {\n const prior = turns.get(turn)\n turns.set(turn, {\n startTime: timing.startTime ?? prior?.startTime ?? null,\n endTime: timing.endTime ?? prior?.endTime ?? null,\n })\n }\n\n const steps = stepTimesOfPicture(previous)\n for (const [key, timing] of stepTimesOfPicture(current)) {\n const prior = steps.get(key)\n steps.set(key, {\n startTime: timing.startTime ?? prior?.startTime ?? null,\n endTime: timing.endTime ?? prior?.endTime ?? null,\n })\n }\n\n const models = stepModelsOfPicture(previous)\n for (const [key, model] of stepModelsOfPicture(current)) models.set(key, model)\n\n return pictureOf([...items.values()], {\n running: current.running,\n partialHistory: current.partialHistory,\n pendingCount: current.pendingCount,\n turnTimes: turn => turns.get(turn) ?? { startTime: null, endTime: null },\n stepTimes: (turn, step) => steps.get(`${turn}:${step}`) ?? { startTime: null, endTime: null },\n modelOf: (turn, step) => models.get(`${turn}:${step}`) ?? null,\n })\n}\n\n/** Fold a full session JSONL replay, including approvals, steering, images, and orphan results. */\nexport function foldEvents(events: readonly EventLike[], options: { running?: boolean } = {}): WorkPicture {\n const coordinates = eventCoordinates(events)\n const timings = eventTimingIndex(events)\n const models = foldModelTraceEvents(events)\n const items = withModelPlaceholders(\n [...pairTools(events).map(toolItem), ...logMessageItems(events, coordinates), ...approvalItems(events, coordinates)],\n models.values(),\n )\n const pendingCount = items.filter(item => item.status === 'waiting').length\n return pictureOf(items, {\n running: options.running === true,\n partialHistory: false,\n pendingCount,\n turnTimes: turn => timings.turns.get(turn) ?? { startTime: null, endTime: null },\n stepTimes: (turn, step) => timings.steps.get(`${turn}:${step}`) ?? { startTime: null, endTime: null },\n modelOf: (turn, step) => models.get(`${turn}:${step}`) ?? null,\n })\n}\n\n/** Parse valid JSONL lines and skip only a torn final line. */\nexport function parseJsonl(text: string): EventLike[] {\n const events: EventLike[] = []\n for (const line of text.split(/\\r?\\n/)) {\n if (line.trim() === '') continue\n try {\n const parsed: unknown = JSON.parse(line)\n if (isRecord(parsed) && typeof parsed.type === 'string') events.push(parsed as unknown as EventLike)\n } catch {\n // Session files may end with one torn append; prior complete events remain usable.\n }\n }\n return events\n}\n","/** Browser-safe analysis. No agent commands or model calls. */\n/** @type {{silenceSeconds:number, reasoningSeconds:number}} */\nexport const DEFAULT_LIMITS = Object.freeze({ silenceSeconds: 30, reasoningSeconds: 90 });\nexport function limitsOf(raw) {\n const safe = (v, fallback) => Number.isFinite(v) && v >= 5 && v <= 3600 ? Math.round(v) : fallback;\n return { silenceSeconds: safe(raw?.silenceSeconds, 30), reasoningSeconds: safe(raw?.reasoningSeconds, 90) };\n}\n/** @param {any} view @param {number} now @param {{running?:boolean,waiting?:boolean,limits?:{silenceSeconds:number,reasoningSeconds:number}}} options */\nexport function alertsOf(view, now, { running = false, waiting = false, limits = DEFAULT_LIMITS } = {}) {\n if (!view) return [];\n const alerts = (view.findings ?? []).filter(f => f.turn === view.turn?.number).slice(-3);\n const p = view.pending;\n if (!running || waiting || !p) return alerts;\n const last = p.lastContentAt ?? p.start;\n if (last !== null && now >= last && now - last >= limits.silenceSeconds * 1000) alerts.push({\n id: 'silence', kind: 'silence', turn: p.turn, steps: [p.step], seqs: [],\n title: `${Math.floor((now - last) / 1000)} 秒未收到模型内容`,\n detail: '可能是首响应等待、连接或服务端停顿;这不是内部思考时长,也不能据此确定空转。',\n });\n if (p.reasoningFirst !== null && p.reasoningLast !== null && p.reasoningLast - p.reasoningFirst >= limits.reasoningSeconds * 1000) alerts.push({\n id: 'reasoning-span', kind: 'reasoning-span', turn: p.turn, steps: [p.step], seqs: [],\n title: `本次可见推理采样跨度 ${Math.round((p.reasoningLast - p.reasoningFirst) / 1000)} 秒`,\n detail: '只按已收到片段的首末时间计算,可能包含片段间等待。时长偏长不是任务质量结论。',\n });\n return alerts;\n}\nexport function mergeModels(views) {\n const map = new Map();\n for (const view of views) for (const m of view.models ?? []) {\n const key = JSON.stringify([m.provider, m.model, m.effort ?? null]);\n let row = map.get(key);\n if (!row) { row = { provider: m.provider, model: m.model, ...(m.effort ? { effort: m.effort } : {}), sessions: 0 }; map.set(key, row); }\n row.sessions++;\n for (const [k, v] of Object.entries(m)) if (typeof v === 'number' && Number.isFinite(v)) row[k] = (row[k] ?? 0) + v;\n }\n return [...map.values()].sort((a, b) => (b.tokens ?? 0) - (a.tokens ?? 0));\n}\n/**\n * RC1 follow() can promote a cold Session after its first yielded snapshot.\n * Do NOT use follow() to scan sessions, even with early abort.\n * list() provides attached projections and cold hints without Agent activation.\n * @param {any} remote\n * @param {{signal?:AbortSignal,limit?:number,onProgress?:(value:any)=>void}} options\n */\nexport async function scanSessions(remote, { signal, limit = 30, onProgress = () => {} } = {}) {\n const res = await remote.session.list({}, signal);\n signal?.throwIfAborted();\n const rawItems = res?.value?.items ?? res?.items ?? res;\n if (!Array.isArray(rawItems)) throw new TypeError('Session list response has no items array');\n const items = rawItems;\n const unique = [...new Map(items.filter(x => typeof x.sessionId === 'string' && !x.blank).map(x => [x.sessionId, x])).values()];\n const picked = unique.slice(0, Math.min(500, Math.max(1, limit)));\n const rows = picked.map(row => {\n const rawCandidate = row.projections?.values?.watcherInsights;\n const candidate = rawCandidate?.val ?? rawCandidate;\n let value = null, error = null;\n if (row.origin === 'subagent') error = '直接子代理暂未纳入;避免重复计算继承前缀';\n else if (candidate?.version === 1 && candidate.sessionId === row.sessionId && candidate.totals && Array.isArray(candidate.models) && Array.isArray(candidate.findings)) value = candidate;\n else error = '尚无 Watcher 统计缓存;在加载插件后运行或打开此会话,再刷新统计';\n return { sessionId: row.sessionId, value, error, updatedAt: Number(row.updatedAt) || 0 };\n });\n const result = { rows, total: unique.length, selected: picked.length };\n onProgress(result);\n return result;\n}\n","import { useState, useRef } from 'react'\nimport type { InsightsView } from '../insights/projection.ts'\nimport css from './TimingPanel.module.css'\n\nconst duration = (ms: number) => {\n if (ms < 1000) return `${Math.round(ms)} ms`\n if (ms < 60000) return `${(ms / 1000).toFixed(1)} 秒`\n const seconds = Math.round(ms / 1000)\n return `${Math.floor(seconds / 60)} 分 ${seconds % 60} 秒`\n}\n\nconst fmtNum = (n: number) => new Intl.NumberFormat('zh-CN', { maximumFractionDigits: 0 }).format(n)\n\ntype SliceKind = 'ttft' | 'think' | 'output' | 'bash' | 'file'\n\nexport function TimingPanel({\n stats,\n scope,\n tokensPerSecond,\n}: {\n stats: InsightsView['totals']\n scope: 'turn' | 'session'\n tokensPerSecond?: number | null\n}) {\n const [hoverSlice, setHoverSlice] = useState<SliceKind | null>(null)\n const [popoverLeft, setPopoverLeft] = useState<number>(0)\n const [arrowLeft, setArrowLeft] = useState<number>(120)\n const chartBoxRef = useRef<HTMLDivElement>(null)\n\n // 1. 各项绝对耗时\n const ttftMs = stats.firstMs ?? 0\n const thinkMs = stats.reasoningMs ?? 0\n const modelTotalMs = stats.modelMs ?? 0\n // 输出耗时为模型总耗时减去首字等待与推理(如果模型总耗时充分),否则按剩余值\n const outputMs = Math.max(0, modelTotalMs - ttftMs - thinkMs)\n\n const toolTotalMs = stats.toolMs ?? 0\n const bashMs = stats.bashMs ?? 0\n const fileMs = Math.max(0, toolTotalMs - bashMs)\n\n // 2. 总耗时(以模型总耗时与工具耗时为两大互斥主体计算比例)\n const combinedMs = modelTotalMs + toolTotalMs\n\n // 如果总耗时为0,给个占位\n const modelPct = combinedMs > 0 ? (modelTotalMs / combinedMs) * 100 : 50\n const toolPct = combinedMs > 0 ? (toolTotalMs / combinedMs) * 100 : 50\n\n // 3. 内部切片相对各自父级的耗时占比(严格 <= 100%)\n const ttftSubPct = modelTotalMs > 0 ? Math.min(100, Math.round((ttftMs / modelTotalMs) * 100)) : 0\n const thinkSubPct = modelTotalMs > 0 ? Math.min(100 - ttftSubPct, Math.round((thinkMs / modelTotalMs) * 100)) : 0\n const outputSubPct = modelTotalMs > 0 ? Math.max(0, 100 - ttftSubPct - thinkSubPct) : 0\n\n const bashSubPct = toolTotalMs > 0 ? Math.min(100, Math.round((bashMs / toolTotalMs) * 100)) : (toolTotalMs > 0 ? 100 : 0)\n const fileSubPct = toolTotalMs > 0 ? Math.max(0, 100 - bashSubPct) : 0\n\n // 4. Token 生成算力分配计算(思考 vs 正文,分子为单项,分母为总生成,绝对 <= 100%)\n const totalGenTokens = (stats.output ?? 0) + (stats.reasoning ?? 0)\n const thinkTokenRatio = totalGenTokens > 0 ? Math.round(((stats.reasoning ?? 0) / totalGenTokens) * 100) : 0\n const outputTokenRatio = totalGenTokens > 0 ? Math.max(0, 100 - thinkTokenRatio) : 0\n\n // 5. 首响应标注:单次还是平均\n const samples = stats.firstSamples ?? 0\n const ttftAvg = samples > 0 ? ttftMs / samples : ttftMs\n const ttftLabel = samples > 1\n ? `平均首响应 ${duration(ttftAvg)} (共 ${samples} 次)`\n : `首响应 ${duration(ttftMs)}`\n\n // 6. 判断主要耗时瓶颈\n let bottleneck = '运行正常'\n if (combinedMs > 0) {\n if (bashMs > combinedMs * 0.4 && bashMs > 10000) {\n bottleneck = `终端命令占 ${Math.round((bashMs / combinedMs) * 100)}%`\n } else if (thinkMs > combinedMs * 0.4 && thinkMs > 10000) {\n bottleneck = `深度思考占 ${Math.round((thinkMs / combinedMs) * 100)}%`\n } else if (ttftMs > combinedMs * 0.4 && ttftMs > 8000) {\n bottleneck = `云端排队占 ${Math.round((ttftMs / combinedMs) * 100)}%`\n } else if (modelTotalMs > toolTotalMs) {\n bottleneck = `模型处理占 ${Math.round(modelPct)}%`\n } else {\n bottleneck = `工具执行占 ${Math.round(toolPct)}%`\n }\n }\n\n // 7. 状态胶囊计算(是否有暗中重试或报错)\n const hasError = (stats.toolErrors ?? 0) > 0\n const hasRetry = (stats.retries ?? 0) > 0\n let statusText = '✓ 0 报错 · 0 重试 (稳定)'\n let statusClass = css.statusOk\n if (hasError && hasRetry) {\n statusText = `${stats.toolErrors} 报错 · ${stats.retries} 次重试`\n statusClass = css.statusDanger\n } else if (hasError) {\n statusText = `${stats.toolErrors} 次工具报错`\n statusClass = css.statusDanger\n } else if (hasRetry) {\n statusText = `${stats.retries} 次网络重试排队`\n statusClass = css.statusWarn\n }\n\n const handleSliceHover = (slice: SliceKind, e: React.MouseEvent<HTMLElement>) => {\n setHoverSlice(slice)\n if (chartBoxRef.current) {\n const rect = e.currentTarget.getBoundingClientRect()\n const parentRect = chartBoxRef.current.getBoundingClientRect()\n const sliceCenter = rect.left - parentRect.left + (rect.width / 2)\n // 适度舒展浮层宽度至 360px,充分利用父容器宽度,杜绝文字拥挤换行\n const popoverWidth = Math.min(360, Math.max(300, parentRect.width - 16))\n const left = Math.max(8, Math.min(parentRect.width - popoverWidth - 8, sliceCenter - (popoverWidth / 2)))\n setPopoverLeft(left)\n // 计算箭头在浮层内部的相对横坐标,确保无论浮层被边缘怎么限制,箭头都 100% 精确垂直对准切片中心\n const arrowPos = Math.max(16, Math.min(popoverWidth - 16, sliceCenter - left))\n setArrowLeft(arrowPos)\n }\n }\n\n return (\n <div className={css.panelBox}>\n {/* 顶行:标题 + 实时推流速度 + 轮次总耗时 */}\n <div className={css.topRow}>\n <div className={css.titleArea}>\n <span className={css.mainTitle}>耗时分布与瓶颈</span>\n {tokensPerSecond && tokensPerSecond > 0 ? (\n <span className={css.liveSpeed} title=\"当前模型实际流式生成吞吐\">\n <i className={css.speedDot} />\n <span>{tokensPerSecond >= 10 ? Math.round(tokensPerSecond) : tokensPerSecond.toFixed(1)} t/s</span>\n </span>\n ) : null}\n <span className={css.totalDuration}>\n {scope === 'turn' ? '本轮' : '全会话'} 耗时 {duration(combinedMs)}\n </span>\n </div>\n\n <div className={css.bottleneckText}>\n {combinedMs > 0 ? `主要耗时:${bottleneck}` : '暂无耗时记录'}\n </div>\n </div>\n\n {/* 核心复合柱图:颜色严格认知映射,微切片一目了然 */}\n <div className={css.chartBox} ref={chartBoxRef}>\n <div className={css.barTrack} role=\"img\" aria-label=\"耗时复合柱图\">\n {/* 1. 模型大类 */}\n <div className={css.modelCluster} style={{ width: `${modelPct}%` }}>\n {/* 首字等待 (冷雾灰蓝) */}\n {ttftSubPct > 0 ? (\n <div\n className={`${css.slice} ${css.sliceTtft}`}\n style={{ width: `${ttftSubPct}%` }}\n onMouseEnter={e => handleSliceHover('ttft', e)}\n onMouseLeave={() => setHoverSlice(null)}\n />\n ) : null}\n {/* 深度思考 (DeepSeek深蓝) */}\n {thinkSubPct > 0 ? (\n <div\n className={`${css.slice} ${css.sliceThink}`}\n style={{ width: `${thinkSubPct}%` }}\n onMouseEnter={e => handleSliceHover('think', e)}\n onMouseLeave={() => setHoverSlice(null)}\n />\n ) : null}\n {/* 正文输出 (明亮天蓝) */}\n {outputSubPct > 0 ? (\n <div\n className={`${css.slice} ${css.sliceOutput}`}\n style={{ width: `${outputSubPct}%` }}\n onMouseEnter={e => handleSliceHover('output', e)}\n onMouseLeave={() => setHoverSlice(null)}\n />\n ) : null}\n </div>\n\n {/* 2. 工具大类 */}\n <div className={css.toolCluster} style={{ width: `${toolPct}%` }}>\n {/* 终端执行 (深翠绿) */}\n {bashSubPct > 0 ? (\n <div\n className={`${css.slice} ${css.sliceBash}`}\n style={{ width: `${bashSubPct}%` }}\n onMouseEnter={e => handleSliceHover('bash', e)}\n onMouseLeave={() => setHoverSlice(null)}\n />\n ) : null}\n {/* 文件及其他读写 (薄荷浅绿) */}\n {fileSubPct > 0 ? (\n <div\n className={`${css.slice} ${css.sliceFile}`}\n style={{ width: `${fileSubPct}%` }}\n onMouseEnter={e => handleSliceHover('file', e)}\n onMouseLeave={() => setHoverSlice(null)}\n />\n ) : null}\n </div>\n </div>\n\n {/* 悬停专业分析浮层:位置精准对齐具体切片,所有信息均为实测诊断干货,杜绝废话凑数 */}\n {hoverSlice ? (\n <div\n className={css.popover}\n style={{\n left: `${popoverLeft}px`,\n ['--arrow-left' as any]: `${arrowLeft}px`,\n }}\n >\n <div className={css.popTitle}>\n <span>\n {hoverSlice === 'think' && '深度推导阶段 (思考过程)'}\n {hoverSlice === 'ttft' && '首字排队响应 (TTFT)'}\n {hoverSlice === 'output' && '正文流式输出阶段'}\n {hoverSlice === 'bash' && '本地终端命令 (Bash)'}\n {hoverSlice === 'file' && '文件读写与其它工具'}\n </span>\n <span>\n {hoverSlice === 'think' && `${duration(thinkMs)} (${thinkSubPct}%)`}\n {hoverSlice === 'ttft' && `${duration(ttftMs)} (${ttftSubPct}%)`}\n {hoverSlice === 'output' && `${duration(outputMs)} (${outputSubPct}%)`}\n {hoverSlice === 'bash' && `${duration(bashMs)} (${bashSubPct}%)`}\n {hoverSlice === 'file' && `${duration(fileMs)} (${fileSubPct}%)`}\n </span>\n </div>\n <div className={css.popList}>\n {hoverSlice === 'think' && (\n <>\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <i className={css.dot} style={{ background: 'var(--c-think)' }} />\n <span>推导思考总耗时</span>\n </div>\n <span className={css.popRight}>{duration(thinkMs)} (占模型 {thinkSubPct}%)</span>\n </div>\n {stats.reasoning ? (\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <span>思考 Token 用量</span>\n </div>\n <span className={css.popRight}>{fmtNum(stats.reasoning)} Token</span>\n </div>\n ) : null}\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <span>生成算力分配</span>\n </div>\n <span className={css.popRight}>\n {totalGenTokens > 0\n ? `思考占 ${thinkTokenRatio}% · 正文占 ${outputTokenRatio}%`\n : '—'}\n </span>\n </div>\n {thinkMs > 0 && stats.reasoning ? (\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <span>推导生成速率</span>\n </div>\n <span className={css.popRight}>{Math.round(stats.reasoning / (thinkMs / 1000))} Token/秒</span>\n </div>\n ) : null}\n <div className={css.popRow} style={{ borderTop: '1px dashed rgba(255,255,255,0.15)', marginTop: '4px', paddingTop: '4px' }}>\n <div className={css.popLeft}>\n <span>思考耗时诊断</span>\n </div>\n <span className={css.popRight}>\n {thinkMs > 25000 ? '推导耗时较长,任务较复杂' : '推导节奏健康,无卡顿停顿'}\n </span>\n </div>\n </>\n )}\n {hoverSlice === 'ttft' && (\n <>\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <i className={css.dot} style={{ background: 'var(--c-ttft)' }} />\n <span>首响应排队延迟</span>\n </div>\n <span className={css.popRight}>{duration(ttftMs)} (占模型 {ttftSubPct}%)</span>\n </div>\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <span>采样统计详情</span>\n </div>\n <span className={css.popRight}>\n {samples > 1 ? `累计 ${samples} 次 (均值 ${(ttftAvg / 1000).toFixed(2)}s)` : '单次握手'}\n </span>\n </div>\n <div className={css.popRow} style={{ borderTop: '1px dashed rgba(255,255,255,0.15)', marginTop: '4px', paddingTop: '4px' }}>\n <div className={css.popLeft}>\n <span>网络排队诊断</span>\n </div>\n <span className={css.popRight}>\n {ttftAvg < 1000\n ? '极度敏捷 (网络与云端极速响应)'\n : ttftAvg < 3000\n ? '正常 (标准网络往返与握手)'\n : '排队偏长 (云端并发高或网络延迟)'}\n </span>\n </div>\n </>\n )}\n {hoverSlice === 'output' && (\n <>\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <i className={css.dot} style={{ background: 'var(--c-output)' }} />\n <span>正文与代码耗时</span>\n </div>\n <span className={css.popRight}>{duration(outputMs)} (占模型 {outputSubPct}%)</span>\n </div>\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <span>实付正文输出量</span>\n </div>\n <span className={css.popRight}>{fmtNum(stats.output)} Token</span>\n </div>\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <span>实际生成速率</span>\n </div>\n <span className={css.popRight}>\n {tokensPerSecond && tokensPerSecond > 0\n ? `${tokensPerSecond >= 10 ? Math.round(tokensPerSecond) : tokensPerSecond.toFixed(1)} Token/秒 (实时)`\n : outputMs > 0\n ? `${Math.round(stats.output / (outputMs / 1000))} Token/秒 (均值)`\n : '—'}\n </span>\n </div>\n <div className={css.popRow} style={{ borderTop: '1px dashed rgba(255,255,255,0.15)', marginTop: '4px', paddingTop: '4px' }}>\n <div className={css.popLeft}>\n <span>生成算力分配</span>\n </div>\n <span className={css.popRight}>\n {totalGenTokens > 0 ? `正文占 ${outputTokenRatio}% · 思考占 ${thinkTokenRatio}%` : '—'}\n </span>\n </div>\n </>\n )}\n {hoverSlice === 'bash' && (\n <>\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <i className={css.dot} style={{ background: 'var(--c-bash)' }} />\n <span>终端 Bash 总耗时</span>\n </div>\n <span className={css.popRight}>{duration(bashMs)} (占工具 {bashSubPct}%)</span>\n </div>\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <span>占轮次总时间比</span>\n </div>\n <span className={css.popRight}>\n {combinedMs > 0 ? `${Math.round((bashMs / combinedMs) * 100)}%` : '0%'}\n </span>\n </div>\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <span>命令可靠度监控</span>\n </div>\n <span className={css.popRight}>\n {stats.tools} 次 ({stats.toolErrors > 0 ? `${stats.toolErrors} 次报错中断` : '零非零退出码'})\n </span>\n </div>\n <div className={css.popRow} style={{ borderTop: '1px dashed rgba(255,255,255,0.15)', marginTop: '4px', paddingTop: '4px' }}>\n <div className={css.popLeft}>\n <span>耗时瓶颈归因</span>\n </div>\n <span className={css.popRight}>\n {bashMs > modelTotalMs ? '本地环境为主要瓶颈 (耗时超模型)' : '本地开销极小 (主要耗时在云端)'}\n </span>\n </div>\n </>\n )}\n {hoverSlice === 'file' && (\n <>\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <i className={css.dot} style={{ background: 'var(--c-file)' }} />\n <span>文件读写总耗时</span>\n </div>\n <span className={css.popRight}>{duration(fileMs)} (占工具 {fileSubPct}%)</span>\n </div>\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <span>占轮次总时间比</span>\n </div>\n <span className={css.popRight}>\n {combinedMs > 0 ? `${Math.round((fileMs / combinedMs) * 100)}%` : '0%'}\n </span>\n </div>\n <div className={css.popRow}>\n <div className={css.popLeft}>\n <span>单次调用平均耗时</span>\n </div>\n <span className={css.popRight}>\n {Math.round(fileMs / Math.max(1, stats.tools))} ms / 次\n </span>\n </div>\n <div className={css.popRow} style={{ borderTop: '1px dashed rgba(255,255,255,0.15)', marginTop: '4px', paddingTop: '4px' }}>\n <div className={css.popLeft}>\n <span>文件 IO 评价</span>\n </div>\n <span className={css.popRight}>\n {fileMs < 2000 ? '毫秒级极速读写,无性能损耗' : '读写较为密集,轻微耗时累积'}\n </span>\n </div>\n </>\n )}\n </div>\n </div>\n ) : null}\n </div>\n\n {/* 底行:图例呼应 + 状态警报胶囊 */}\n <div className={css.legendRow}>\n <div className={css.legendGroup}>\n <span className={css.legendItem}>\n <i className={css.dot} style={{ background: 'var(--c-ttft)' }} />\n <span>{ttftLabel}</span>\n </span>\n <span className={css.legendItem}>\n <i className={css.dot} style={{ background: 'var(--c-think)' }} />\n <span>思考 {duration(thinkMs)}</span>\n </span>\n <span className={css.legendItem}>\n <i className={css.dot} style={{ background: 'var(--c-output)' }} />\n <span>输出 {duration(outputMs)}</span>\n </span>\n <span className={css.legendItem}>\n <i className={css.dot} style={{ background: 'var(--c-bash)' }} />\n <span>工具 {duration(toolTotalMs)}</span>\n </span>\n </div>\n\n {/* 状态胶囊 */}\n <div className={`${css.statusPill} ${statusClass}`}>\n {statusText}\n </div>\n </div>\n </div>\n )\n}\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n// Untyped local ESM helpers: single .mjs source kept for node tests.\n// @ts-ignore TS7016: no declarations for the local .mjs module\nimport { alertsOf, DEFAULT_LIMITS, limitsOf, scanSessions, mergeModels } from '../insights/presentation.mjs'\nimport type { InsightsView } from '../insights/projection.ts'\nimport css from './Insights.module.css'\nimport { TimingPanel } from './TimingPanel.tsx'\n\ntype Limits = { silenceSeconds: number; reasoningSeconds: number }\nconst STORAGE = 'dsh-watcher:insights-display:v1'\n\nfunction readLimits(): Limits {\n try {\n return limitsOf(JSON.parse(localStorage.getItem(STORAGE) ?? '{}'))\n } catch {\n return { ...DEFAULT_LIMITS }\n }\n}\n\nfunction useLimits() {\n const [limits, setLimits] = useState(readLimits)\n useEffect(() => {\n const update = () => setLimits(readLimits())\n window.addEventListener('watcher-insights-settings', update)\n return () => window.removeEventListener('watcher-insights-settings', update)\n }, [])\n return limits\n}\n\nconst fmt = (n: number) => new Intl.NumberFormat('zh-CN', { maximumFractionDigits: 0 }).format(n)\n\nconst fmtCompact = (n: number) => {\n if (!Number.isFinite(n) || n <= 0) return '0'\n if (n >= 1e8) return `${(n / 1e8).toFixed(1)} 亿`\n if (n >= 1e4) return `${(n / 1e4).toFixed(1)} 万`\n return fmt(n)\n}\n\nconst dayKey = (ms: number) => {\n const d = new Date(ms)\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`\n}\n\nconst dayLabel = (key: string) => {\n const [, m, d] = key.split('-')\n return `${Number(m)}/${Number(d)}`\n}\n\nconst PALETTE = ['#3b82f6', '#8b5cf6', '#f59e0b', '#10b981', '#ec4899', '#6366f1']\nconst WEEKDAYS = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']\n\nfunction computeStackedLineChart(\n daySeries: Array<{ key: string; label: string; total: number; weekday: string; sessions: number; segments: any[]; isToday?: boolean; isYesterday?: boolean }>,\n modelsList: Array<{ model: string; color: string; tokens: number; pct: number }>,\n width = 560,\n height = 160,\n) {\n const padding = { top: 20, right: 20, bottom: 28, left: 45 }\n const plotW = Math.max(10, width - padding.left - padding.right)\n const plotH = Math.max(10, height - padding.top - padding.bottom)\n const bottomY = padding.top + plotH\n\n const maxVal = Math.max(1, ...daySeries.map(d => d.total))\n const yMax = Math.ceil(maxVal * 1.15)\n const yCoord = (val: number) => bottomY - (val / yMax) * plotH\n\n // 按图例顺序作为堆叠图层:基底为主要模型,逐层向上堆叠\n const effectiveModels = modelsList.length > 0\n ? modelsList\n : [{ model: '全部模型', color: '#5686fe', tokens: maxVal, pct: 100 }]\n\n const stackLevels = daySeries.map((d, dayIdx) => {\n const x = padding.left + (dayIdx / Math.max(1, daySeries.length - 1)) * plotW\n let acc = 0\n const modelStacks = effectiveModels.map(m => {\n const seg = d.segments.find((s: any) => s.model === m.model)\n const tokens = seg ? seg.tokens : 0\n const bTokens = acc\n acc += tokens\n const tTokens = acc\n return {\n model: m.model,\n color: m.color,\n tokens,\n bottomY: yCoord(bTokens),\n topY: yCoord(tTokens),\n }\n })\n return {\n index: dayIdx,\n x,\n total: d.total,\n data: d,\n modelStacks,\n }\n })\n\n const buildSpline = (pts: Array<{ x: number; y: number }>) => {\n if (pts.length <= 1) return pts.length === 1 ? `M ${pts[0].x.toFixed(1)} ${pts[0].y.toFixed(1)}` : ''\n let d = `M ${pts[0].x.toFixed(1)} ${pts[0].y.toFixed(1)}`\n for (let i = 0; i < pts.length - 1; i++) {\n const p0 = pts[Math.max(0, i - 1)]\n const p1 = pts[i]\n const p2 = pts[i + 1]\n const p3 = pts[Math.min(pts.length - 1, i + 2)]\n const cp1x = p1.x + (p2.x - p0.x) / 6\n const cp1y = Math.min(bottomY, Math.max(padding.top, p1.y + (p2.y - p0.y) / 6))\n const cp2x = p2.x - (p3.x - p1.x) / 6\n const cp2y = Math.min(bottomY, Math.max(padding.top, p2.y - (p3.y - p1.y) / 6))\n d += ` C ${cp1x.toFixed(1)} ${cp1y.toFixed(1)}, ${cp2x.toFixed(1)} ${cp2y.toFixed(1)}, ${p2.x.toFixed(1)} ${p2.y.toFixed(1)}`\n }\n return d\n }\n\n const buildSegmentSpline = (pts: Array<{ x: number; y: number }>) => {\n let d = ''\n for (let i = 0; i < pts.length - 1; i++) {\n const p0 = pts[Math.max(0, i - 1)]\n const p1 = pts[i]\n const p2 = pts[i + 1]\n const p3 = pts[Math.min(pts.length - 1, i + 2)]\n const cp1x = p1.x + (p2.x - p0.x) / 6\n const cp1y = Math.min(bottomY, Math.max(padding.top, p1.y + (p2.y - p0.y) / 6))\n const cp2x = p2.x - (p3.x - p1.x) / 6\n const cp2y = Math.min(bottomY, Math.max(padding.top, p2.y - (p3.y - p1.y) / 6))\n d += ` C ${cp1x.toFixed(1)} ${cp1y.toFixed(1)}, ${cp2x.toFixed(1)} ${cp2y.toFixed(1)}, ${p2.x.toFixed(1)} ${p2.y.toFixed(1)}`\n }\n return d\n }\n\n // 为每个模型生成独立堆叠面积层与边界折线\n const layers = effectiveModels.map((m, mIdx) => {\n const topPts = stackLevels.map(sl => ({ x: sl.x, y: sl.modelStacks[mIdx].topY }))\n const bottomPts = stackLevels.map(sl => ({ x: sl.x, y: sl.modelStacks[mIdx].bottomY }))\n\n const lineD = buildSpline(topPts)\n const revBottom = [...bottomPts].reverse()\n const bottomSeg = buildSegmentSpline(revBottom)\n const areaD = `${lineD} L ${revBottom[0].x.toFixed(1)} ${revBottom[0].y.toFixed(1)}${bottomSeg} Z`\n\n return {\n model: m.model,\n color: m.color,\n lineD,\n areaD,\n topPts,\n }\n })\n\n return { layers, stackLevels, yMax, bottomY, padding, plotW, plotH }\n}\n\n/**\n * Viewport-space anchor for a chart hover card: a live element plus the\n * relative point inside it the card should point at. The rectangle is re-read\n * on every placement, so the card keeps following its bar/cell while a nested\n * settings pane scrolls.\n */\ntype ChartAnchor = {\n el: Element\n ratioX: number\n ratioY: number\n /** Preferred side of the anchor point; placement flips it when that side does not fit. */\n side: 'above' | 'below'\n}\n\nconst TOOLTIP_MARGIN = 8\nconst TOOLTIP_GAP = 12\n\n/**\n * Hover card for the charts. The panels clip their content, and a card centred\n * on a late bar is wider than the space left of the panel edge, so the card is\n * portalled to the document body and placed in viewport coordinates — the same\n * approach as the UI primitives' HoverCard. Placement is written straight to\n * the node: it runs before paint and again on scroll/resize, and it clamps to\n * the viewport so no side of the card is ever cut off.\n */\nfunction ChartTooltip({ anchor, children }: { anchor: ChartAnchor | null; children: ReactNode }) {\n const cardRef = useRef<HTMLDivElement | null>(null)\n useLayoutEffect(() => {\n const card = cardRef.current\n if (card === null || anchor === null) return\n const place = () => {\n const rect = anchor.el.getBoundingClientRect()\n const width = card.offsetWidth\n const height = card.offsetHeight\n const viewportWidth = document.documentElement.clientWidth\n const viewportHeight = document.documentElement.clientHeight\n const pointX = rect.left + rect.width * anchor.ratioX\n const pointY = rect.top + rect.height * anchor.ratioY\n const left = Math.min(\n Math.max(pointX - width / 2, TOOLTIP_MARGIN),\n Math.max(TOOLTIP_MARGIN, viewportWidth - width - TOOLTIP_MARGIN),\n )\n const above = pointY - height - TOOLTIP_GAP\n const below = pointY + TOOLTIP_GAP\n const fitsAbove = above >= TOOLTIP_MARGIN\n const fitsBelow = below + height <= viewportHeight - TOOLTIP_MARGIN\n const preferred = anchor.side === 'above' ? above : below\n const flipped = anchor.side === 'above' ? below : above\n const chosen = anchor.side === 'above'\n ? (fitsAbove ? preferred : flipped)\n : (fitsBelow ? preferred : flipped)\n const top = Math.min(\n Math.max(chosen, TOOLTIP_MARGIN),\n Math.max(TOOLTIP_MARGIN, viewportHeight - height - TOOLTIP_MARGIN),\n )\n card.style.left = `${Math.round(left)}px`\n card.style.top = `${Math.round(top)}px`\n card.style.visibility = 'visible'\n }\n place()\n window.addEventListener('scroll', place, true)\n window.addEventListener('resize', place)\n return () => {\n window.removeEventListener('scroll', place, true)\n window.removeEventListener('resize', place)\n }\n }, [anchor])\n if (anchor === null) return null\n return createPortal(\n <div ref={cardRef} className={`${css.chartTooltipBox} ${css.chartTooltipPortal}`}>\n {children}\n </div>,\n document.body,\n )\n}\n\nfunction effortLabel(effort: string | null | undefined): string {\n if (!effort) return ''\n const map: Record<string, string> = { high: '高', medium: '中', low: '低' }\n return map[effort.toLowerCase()] ?? effort\n}\n\ntype Evidence = { turn: number; steps: number[]; seqs: number[] }\n\nexport function SessionInsights({ value, now, running, waiting, onEvidence }: {\n value: InsightsView | undefined; now: number; running: boolean; waiting: boolean; onEvidence: (e: Evidence) => void\n}) {\n const limits = useLimits()\n const [scope, setScope] = useState<'turn' | 'session'>('turn')\n const [modelFilter, setModelFilter] = useState<'all' | number>('all')\n if (!value) return null\n\n const isMultiModel = (value.models?.length ?? 0) > 1\n const selectedModel = scope === 'session' && modelFilter !== 'all' && value.models[modelFilter]\n ? value.models[modelFilter]\n : undefined\n const stats = scope === 'turn' && value.turn\n ? value.turn.stats\n : (selectedModel ?? value.totals)\n const alerts = alertsOf(value, now, { running, waiting, limits })\n const currentRoute = value.turn?.route ?? (value.models && value.models.length > 0 ? value.models[0] : undefined)\n const totalIn = (stats.input ?? 0) + (stats.cacheRead ?? 0)\n const cachePct = totalIn > 0 ? Math.round(((stats.cacheRead ?? 0) / totalIn) * 100) : 0\n\n return (\n <section className={css.hudBox} aria-label=\"耗时分布与运行健康度\">\n <div className={css.hudTop}>\n <div className={css.hudTopLeft}>\n <span className={css.hudHeading}>\n {scope === 'turn'\n ? '本轮'\n : selectedModel\n ? `模型: ${selectedModel.model}`\n : '全会话'}\n </span>\n {scope === 'turn' && currentRoute?.model ? (\n <span className={css.currentModelTag} title={currentRoute.model}>\n <strong className={css.modelTagText}>{currentRoute.model}</strong>\n {currentRoute.effort ? (\n <span className={css.effortTag}>思考: {effortLabel(currentRoute.effort)}</span>\n ) : null}\n </span>\n ) : null}\n <span className={css.contextTag}>\n 上下文 <strong>{fmt(stats.input ?? 0)}</strong> Token\n </span>\n </div>\n <div className={css.hudTopRight}>\n <span className={css.tokenStat}>\n <strong>{fmt(stats.tokens ?? 0)}</strong> Token ({cachePct}% 命中)\n </span>\n <div className={css.scopeGroup} role=\"group\" aria-label=\"统计范围切换\">\n <button type=\"button\" className={css.scopeBtn} data-active={scope === 'turn' ? '' : undefined}\n onClick={() => { setScope('turn'); setModelFilter('all') }}>本轮</button>\n <button type=\"button\" className={css.scopeBtn} data-active={scope === 'session' ? '' : undefined}\n onClick={() => setScope('session')}>全会话</button>\n </div>\n </div>\n </div>\n {scope === 'session' && isMultiModel ? (\n <div className={css.modelTabBar} role=\"tablist\" aria-label=\"多模型切换\">\n <button type=\"button\" className={css.modelTabBtn} data-active={modelFilter === 'all' ? '' : undefined}\n onClick={() => setModelFilter('all')}>全部模型汇总 ({value.models.length})</button>\n {value.models.map((m: any, idx: number) => (\n <button type=\"button\" key={idx} className={css.modelTabBtn} data-active={modelFilter === idx ? '' : undefined}\n onClick={() => setModelFilter(idx)}>{m.model} ({m.calls}次)</button>\n ))}\n </div>\n ) : null}\n <div className={css.hudBody}>\n <TimingPanel stats={stats} scope={scope} />\n {alerts.length > 0 ? (\n <div className={css.alertSection} aria-live=\"polite\">\n {alerts.map((a: Evidence & { id: string; title: string; detail: string; kind?: string }) => {\n const isRepeat = a.kind === 'repeated-failure' || a.id.startsWith('repeat')\n const isSilence = a.id === 'silence'\n const isReason = a.id === 'reasoning-span'\n const tag = isRepeat ? '连续报错' : isSilence ? '网络停顿' : isReason ? '思考超时' : '异常'\n return (\n <div key={a.id} className={`${css.alertCard} ${isRepeat ? css.alertCardDanger : css.alertCardWarn}`}>\n <div className={css.alertLeft}>\n <span className={`${css.alertTag} ${isRepeat ? css.tagDanger : css.tagWarn}`}>{tag}</span>\n <div className={css.alertTexts}>\n <strong className={css.alertMainText}>{a.title}</strong>\n <span className={css.alertSubText}>{a.detail}</span>\n </div>\n </div>\n <button type=\"button\" className={css.alertActionBtn} onClick={() => onEvidence(a)}>定位现场</button>\n </div>\n )\n })}\n </div>\n ) : null}\n </div>\n </section>\n )\n}\n\nexport function InsightsSettings(props: { remote?: any }) {\n const limits = useLimits()\n const [silence, setSilence] = useState(limits.silenceSeconds)\n const [reasoning, setReasoning] = useState(limits.reasoningSeconds)\n const [saved, setSaved] = useState(false)\n const [userPickedRange, setUserPickedRange] = useState<boolean>(false)\n const [range, setRange] = useState<'7' | '30' | '180'>('7')\n const [customViewMode, setCustomViewMode] = useState<'bar' | 'line' | null>(null)\n const activeViewMode = customViewMode ?? (range === '30' || range === '180' ? 'line' : 'bar')\n const [hoveredDayIdx, setHoveredDayIdx] = useState<number | null>(null)\n const [hoveredDayAnchor, setHoveredDayAnchor] = useState<ChartAnchor | null>(null)\n const [hoveredLineIdx, setHoveredLineIdx] = useState<number | null>(null)\n const [hoveredLineAnchor, setHoveredLineAnchor] = useState<ChartAnchor | null>(null)\n const [hoveredHeatmapDay, setHoveredHeatmapDay] = useState<any | null>(null)\n const [hoveredHeatmapAnchor, setHoveredHeatmapAnchor] = useState<ChartAnchor | null>(null)\n const [sessionSort, setSessionSort] = useState<'tokens' | 'time' | 'errors'>('tokens')\n const [loading, setLoading] = useState(false)\n const [sessions, setSessions] = useState<{ total: number; rows: any[] } | null>(null)\n const [openSessionId, setOpenSessionId] = useState<string | null>(null)\n const [hoveredIdx, setHoveredIdx] = useState<number | null>(null)\n const [activeDrilldown, setActiveDrilldown] = useState<'speed' | 'latency' | 'thinking' | 'cache' | 'tool' | 'reliability' | null>(null)\n\n useEffect(() => {\n if (!props.remote) return\n let active = true\n setLoading(true)\n scanSessions(props.remote, { limit: 300 })\n .then((res: { total: number; rows: any[] }) => {\n if (active) {\n setSessions(res)\n // 智能感知:如果历史跨度确实超过 7 天,自动提档到 30 天;否则保持清爽的 7 天\n if (!userPickedRange) {\n const times = (res?.rows ?? [])\n .map((r: any) => r.updatedAt)\n .filter((t: any) => typeof t === 'number' && t > 0)\n if (times.length >= 2) {\n const span = Math.max(...times) - Math.min(...times)\n if (span > 7 * 86400000) {\n setRange('30')\n }\n }\n }\n }\n })\n .catch(console.error)\n .finally(() => { if (active) setLoading(false) })\n return () => { active = false }\n }, [props.remote, userPickedRange])\n\n const refresh = () => {\n if (!props.remote || loading) return\n setLoading(true)\n scanSessions(props.remote, { limit: 300 })\n .then(setSessions)\n .catch(console.error)\n .finally(() => setLoading(false))\n }\n\n const save = () => {\n localStorage.setItem(STORAGE, JSON.stringify({ silenceSeconds: silence, reasoningSeconds: reasoning }))\n window.dispatchEvent(new CustomEvent('watcher-insights-settings'))\n setSaved(true)\n setTimeout(() => setSaved(false), 2000)\n }\n\n const analytics = useMemo(() => {\n if (!sessions) return null\n const days = Number(range)\n const cutoff = Date.now() - days * 86400000\n const validRows = sessions.rows.filter((r: any) => r.value && (!r.updatedAt || r.updatedAt >= cutoff))\n const validViews = validRows.map((r: any) => r.value)\n let totalTokens = 0\n let totalModelMs = 0\n let totalToolMs = 0\n let totalBashMs = 0\n let totalTools = 0\n let totalCacheRead = 0\n let totalInput = 0\n let totalErrors = 0\n let totalRetries = 0\n\n validViews.forEach((v: any) => {\n totalTokens += v.totals.tokens ?? 0\n totalModelMs += v.totals.modelMs ?? 0\n totalToolMs += v.totals.toolMs ?? 0\n totalBashMs += v.totals.bashMs ?? 0\n totalTools += v.totals.tools ?? 0\n totalCacheRead += v.totals.cacheRead ?? 0\n totalInput += v.totals.input ?? 0\n totalErrors += v.totals.toolErrors ?? 0\n totalRetries += v.totals.retries ?? 0\n })\n\n const totalWallMs = totalModelMs + totalToolMs\n const toolTimePct = totalWallMs > 0 ? Math.round((totalToolMs / totalWallMs) * 100) : 0\n const totalFileMs = Math.max(0, totalToolMs - totalBashMs)\n const bashPct = totalToolMs > 0 ? Math.round((totalBashMs / totalToolMs) * 100) : 0\n const filePct = Math.max(0, 100 - bashPct)\n const totalInAll = totalInput + totalCacheRead\n const cacheHitPct = totalInAll > 0 ? Math.round((totalCacheRead / totalInAll) * 100) : 0\n\n // 重点:按纯模型名称汇总去重,确保模型级排行榜中每个模型仅出现一次,杜绝同名混杂和 React 重复 key 乱序!\n const modelMap = new Map<string, any>()\n for (const view of validViews) {\n for (const m of view.models ?? []) {\n const name = m.model || '未标注'\n let row = modelMap.get(name)\n if (!row) {\n row = { model: name, calls: 0, tokens: 0, input: 0, output: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0, modelMs: 0, firstMs: 0, firstSamples: 0 }\n modelMap.set(name, row)\n }\n for (const k of ['calls', 'tokens', 'input', 'output', 'cacheRead', 'cacheWrite', 'reasoning', 'modelMs', 'firstMs', 'firstSamples']) {\n if (typeof m[k] === 'number' && Number.isFinite(m[k])) {\n row[k] += m[k]\n }\n }\n }\n }\n const uniqueModels = [...modelMap.values()]\n\n // 1. 首响应延迟由短到长(升序:最快在上,TTFT 速度排行榜)\n const speedList = uniqueModels\n .filter((m: any) => (m.firstSamples ?? 0) > 0 && (m.firstMs ?? 0) > 0)\n .sort((a: any, b: any) => (a.firstMs / a.firstSamples) - (b.firstMs / b.firstSamples))\n\n // 2. 首响应排队由长到短(降序:最慢在上,延迟瓶颈排行榜)\n const latencyList = uniqueModels\n .filter((m: any) => (m.firstSamples ?? 0) > 0 && (m.firstMs ?? 0) > 0)\n .sort((a: any, b: any) => (b.firstMs / b.firstSamples) - (a.firstMs / a.firstSamples))\n\n // 3. 深度推导按思考 Token 占比降序(从高到低)\n const thinkList = uniqueModels\n .filter((m: any) => (m.reasoning ?? 0) > 0)\n .sort((a: any, b: any) => {\n const ratioA = a.reasoning / (((a.reasoning ?? 0) + (a.output ?? 0)) || 1)\n const ratioB = b.reasoning / (((b.reasoning ?? 0) + (b.output ?? 0)) || 1)\n return ratioB - ratioA || b.reasoning - a.reasoning\n })\n\n // 4. 前缀缓存按命中率降序(从高到低)\n const cacheList = uniqueModels\n .filter((m: any) => (m.tokens ?? 0) > 0)\n .sort((a: any, b: any) => {\n const rateA = (a.cacheRead ?? 0) / (((a.input ?? 0) + (a.cacheRead ?? 0)) || 1)\n const rateB = (b.cacheRead ?? 0) / (((b.input ?? 0) + (b.cacheRead ?? 0)) || 1)\n return rateB - rateA || (b.cacheRead ?? 0) - (a.cacheRead ?? 0)\n })\n\n // 头部 6 大 KPI 卡片数据:精准绑定对应排行榜的第一名!\n const fastKing = speedList[0]\n const slowKing = latencyList[0]\n const thinkKing = thinkList[0]\n const bestCacheModel = cacheList[0]\n\n // 工具高耗时排查会话 TOP 3 (严格按工具总耗时降序)\n const topToolSessions = [...validRows]\n .filter((r: any) => (r.value?.totals?.toolMs ?? 0) > 0)\n .sort((a: any, b: any) => (b.value.totals.toolMs ?? 0) - (a.value.totals.toolMs ?? 0))\n .slice(0, 3)\n\n // 报错与重试排查会话 (严格按报错量降序)\n const errorSessions = [...validRows]\n .filter((r: any) => (r.value?.totals?.toolErrors ?? 0) > 0 || (r.value?.totals?.retries ?? 0) > 0)\n .sort((a: any, b: any) => {\n const scoreA = (a.value.totals.toolErrors ?? 0) * 100 + (a.value.totals.retries ?? 0)\n const scoreB = (b.value.totals.toolErrors ?? 0) * 100 + (b.value.totals.retries ?? 0)\n return scoreB - scoreA\n })\n .slice(0, 6)\n\n // 重点对话账单:严格按用户指定的维度降序排序!\n const sortedSessions = [...validRows].sort((a: any, b: any) => {\n const va = a.value.totals\n const vb = b.value.totals\n if (sessionSort === 'tokens') {\n return (vb.tokens ?? 0) - (va.tokens ?? 0)\n }\n if (sessionSort === 'time') {\n const timeA = (va.modelMs ?? 0) + (va.toolMs ?? 0)\n const timeB = (vb.modelMs ?? 0) + (vb.toolMs ?? 0)\n return timeB - timeA\n }\n if (sessionSort === 'errors') {\n const scoreA = (va.toolErrors ?? 0) * 100 + (va.retries ?? 0)\n const scoreB = (vb.toolErrors ?? 0) * 100 + (vb.retries ?? 0)\n return scoreB - scoreA || (vb.tokens ?? 0) - (va.tokens ?? 0)\n }\n return (b.updatedAt ?? 0) - (a.updatedAt ?? 0)\n })\n const maxSessionTokens = Math.max(1, ...sortedSessions.map((s: any) => s.value?.totals?.tokens ?? 0))\n\n // 环形图数据:纯模型排序,前 4 名 + 其余汇总为 \"其他\",并保证严格按 Token 降序排列!\n const tokenRankedModels = [...uniqueModels].sort((a, b) => b.tokens - a.tokens)\n const topModels = tokenRankedModels.slice(0, 4)\n const restModels = tokenRankedModels.slice(4)\n const restTokens = restModels.reduce((sum: number, m: any) => sum + (m.tokens ?? 0), 0)\n const donutModels = [...topModels]\n if (restTokens > 0) {\n donutModels.push({ model: '其他模型', tokens: restTokens })\n }\n donutModels.sort((a: any, b: any) => (b.tokens ?? 0) - (a.tokens ?? 0))\n\n const donutTotal = donutModels.reduce((sum: number, m: any) => sum + (m.tokens ?? 0), 0)\n\n const colorOf = (name: string) => {\n const found = donutModels.findIndex((m: any) => m.model === name)\n return PALETTE[(found >= 0 ? found : 0) % PALETTE.length]\n }\n\n // 环形切片计算:无缝精准闭环,最后一段精确吸附\n const circumference = 2 * Math.PI * 38 // 238.761...\n let accumulated = 0\n const donutSegments = donutTotal <= 0 ? [] : donutModels.map((m: any, idx: number) => {\n const pctRatio = m.tokens / donutTotal\n const strokeLength = idx === donutModels.length - 1\n ? Math.max(0, circumference - accumulated)\n : pctRatio * circumference\n const gapLength = Math.max(0, circumference - strokeLength)\n const offset = -accumulated\n accumulated += strokeLength\n return {\n model: m.model,\n tokens: m.tokens,\n pct: Math.round(pctRatio * 100),\n color: PALETTE[idx % PALETTE.length],\n dasharray: `${strokeLength} ${gapLength}`,\n dashoffset: offset,\n }\n })\n\n // 每日活动序列\n const keys: string[] = []\n for (let i = days - 1; i >= 0; i--) keys.push(dayKey(Date.now() - i * 86400000))\n const byDay = new Map(keys.map(k => [k, { models: new Map<string, number>(), sessions: 0 }]))\n validRows.forEach((row: any) => {\n const key = row.updatedAt ? dayKey(row.updatedAt) : keys[keys.length - 1]\n const bucket = byDay.get(key)\n if (!bucket) return\n bucket.sessions += 1\n const models = row.value.models?.length\n ? row.value.models\n : [{ model: '未标注', tokens: row.value.totals.tokens ?? 0 }]\n models.forEach((m: any) => {\n bucket.models.set(m.model, (bucket.models.get(m.model) ?? 0) + (m.tokens ?? 0))\n })\n })\n\n const todayStr = dayKey(Date.now())\n const yesterdayStr = dayKey(Date.now() - 86400000)\n\n const daySeries = keys.map(key => {\n const bucket = byDay.get(key) ?? { models: new Map(), sessions: 0 }\n const segments = [...bucket.models.entries()]\n .map(([model, tokens]) => ({ model, tokens, color: colorOf(model) }))\n .sort((a, b) => b.tokens - a.tokens)\n const totalTokens = segments.reduce((s, x) => s + x.tokens, 0)\n const segsWithPct = segments.map(seg => ({\n ...seg,\n pct: totalTokens > 0 ? Math.round((seg.tokens / totalTokens) * 100) : 0,\n }))\n const dObj = new Date(key + 'T00:00:00')\n const weekdayStr = WEEKDAYS[dObj.getDay()]\n const isToday = key === todayStr\n const isYesterday = key === yesterdayStr\n const label = range === '7'\n ? (isToday ? '今天' : isYesterday ? '昨天' : weekdayStr)\n : (key.endsWith('01') || key.endsWith('05') || key.endsWith('10') || key.endsWith('15') || key.endsWith('20') || key.endsWith('25') ? dayLabel(key) : '')\n return {\n key,\n label,\n weekday: weekdayStr,\n isToday,\n isYesterday,\n total: totalTokens,\n sessions: bucket.sessions,\n segments: segsWithPct,\n }\n })\n const dayMax = Math.max(1, ...daySeries.map(d => d.total))\n\n // 活跃模型图例提取 (针对当前 range)\n const activeModelMap = new Map<string, number>()\n daySeries.forEach(d => {\n d.segments.forEach(s => {\n activeModelMap.set(s.model, (activeModelMap.get(s.model) ?? 0) + s.tokens)\n })\n })\n const activeRangeTotal = [...activeModelMap.values()].reduce((a, b) => a + b, 0)\n const activeRangeModels = [...activeModelMap.entries()]\n .map(([model, tokens]) => ({\n model,\n tokens,\n color: colorOf(model),\n pct: activeRangeTotal > 0 ? Math.round((tokens / activeRangeTotal) * 100) : 0,\n }))\n .sort((a, b) => b.tokens - a.tokens)\n\n // 近 6 个月(26 周,约 182 天)全景热力图数据生成 (如图 3)\n const todayDate = new Date()\n todayDate.setHours(23, 59, 59, 999)\n const todayDayOfWeek = (todayDate.getDay() + 6) % 7 // 周一为 0,周日为 6\n const currentWeekSunday = new Date(todayDate)\n currentWeekSunday.setDate(todayDate.getDate() + (6 - todayDayOfWeek))\n\n const numWeeks = 26\n const heatmapStart = new Date(currentWeekSunday)\n heatmapStart.setDate(currentWeekSunday.getDate() - (numWeeks * 7 - 1))\n heatmapStart.setHours(0, 0, 0, 0)\n\n const allHistoricalRows = sessions.rows.filter((r: any) => r.value && r.updatedAt && r.updatedAt >= heatmapStart.getTime())\n const heatmapDayMap = new Map<string, { tokens: number; sessions: number; models: Map<string, number> }>()\n allHistoricalRows.forEach((r: any) => {\n const k = dayKey(r.updatedAt)\n let dEntry = heatmapDayMap.get(k)\n if (!dEntry) {\n dEntry = { tokens: 0, sessions: 0, models: new Map() }\n heatmapDayMap.set(k, dEntry)\n }\n dEntry.tokens += r.value.totals?.tokens ?? 0\n dEntry.sessions += 1\n ;(r.value.models ?? []).forEach((m: any) => {\n dEntry!.models.set(m.model, (dEntry!.models.get(m.model) ?? 0) + (m.tokens ?? 0))\n })\n })\n\n const nonZeroTokenDays = [...heatmapDayMap.values()].map(d => d.tokens).filter(t => t > 0).sort((a, b) => a - b)\n const q1 = nonZeroTokenDays[Math.floor(nonZeroTokenDays.length * 0.25)] || 1\n const q2 = nonZeroTokenDays[Math.floor(nonZeroTokenDays.length * 0.50)] || q1\n const q3 = nonZeroTokenDays[Math.floor(nonZeroTokenDays.length * 0.75)] || q2\n const maxHeatmapDayTokens = nonZeroTokenDays.length > 0 ? nonZeroTokenDays[nonZeroTokenDays.length - 1] : 0\n\n const getHeatmapLevel = (tokens: number): 0 | 1 | 2 | 3 | 4 => {\n if (!tokens || tokens <= 0) return 0\n if (tokens <= q1) return 1\n if (tokens <= q2) return 2\n if (tokens <= q3) return 3\n return 4\n }\n\n const heatmapWeeks: Array<{\n weekIndex: number\n days: Array<{\n date: string\n dayOfWeek: number\n weekday: string\n month: number\n isFuture: boolean\n isToday: boolean\n tokens: number\n sessions: number\n models: Array<{ model: string; tokens: number; color: string; pct: number }>\n level: 0 | 1 | 2 | 3 | 4\n }>\n }> = []\n\n const heatmapMonthLabels: Array<{ colIndex: number; label: string }> = []\n\n for (let w = 0; w < numWeeks; w++) {\n const daysInWeek = []\n let monthStartingInThisWeek: number | null = null\n\n for (let d = 0; d < 7; d++) {\n const cur = new Date(heatmapStart)\n cur.setDate(heatmapStart.getDate() + w * 7 + d)\n const dateStr = dayKey(cur.getTime())\n const month = cur.getMonth()\n const isFuture = cur.getTime() > todayDate.getTime()\n const isToday = dateStr === todayStr\n\n // 精准识别每月 1 号所在的周列,确保月份标签与日期格子 100% 像素级对齐\n if (cur.getDate() === 1) {\n monthStartingInThisWeek = month\n }\n\n const data = heatmapDayMap.get(dateStr)\n const tokens = data?.tokens ?? 0\n const sessionsCount = data?.sessions ?? 0\n const modelsList = data\n ? [...data.models.entries()]\n .map(([m, t]) => ({\n model: m,\n tokens: t,\n color: colorOf(m),\n pct: tokens > 0 ? Math.round((t / tokens) * 100) : 0,\n }))\n .sort((a, b) => b.tokens - a.tokens)\n : []\n\n daysInWeek.push({\n date: dateStr,\n dayOfWeek: d,\n weekday: WEEKDAYS[cur.getDay()],\n month,\n isFuture,\n isToday,\n tokens,\n sessions: sessionsCount,\n models: modelsList,\n level: isFuture ? (0 as const) : getHeatmapLevel(tokens),\n })\n }\n\n if (monthStartingInThisWeek !== null) {\n heatmapMonthLabels.push({ colIndex: w, label: `${monthStartingInThisWeek + 1}月` })\n }\n\n heatmapWeeks.push({ weekIndex: w, days: daysInWeek })\n }\n\n const totalHeatmapTokens = nonZeroTokenDays.reduce((acc, v) => acc + v, 0)\n const totalHeatmapSessions = allHistoricalRows.length\n\n return {\n validCount: validRows.length,\n listed: sessions.total,\n totalTokens,\n totalTimeHours: ((totalModelMs + totalToolMs) / 3600000).toFixed(1),\n cacheHitPct,\n totalCacheRead,\n totalToolMs,\n totalBashMs,\n totalFileMs,\n bashPct,\n filePct,\n topToolSessions,\n errorSessions,\n sortedSessions,\n maxSessionTokens,\n totalTools,\n toolTimePct,\n totalErrors,\n totalRetries,\n speedList,\n latencyList,\n thinkList,\n cacheList,\n donutModels,\n donutTotal,\n donutSegments,\n thinkKing,\n fastKing,\n slowKing,\n bestCacheModel,\n daySeries,\n dayMax,\n activeRangeModels,\n heatmapWeeks,\n heatmapMonthLabels,\n heatmapStats: {\n activeDays: nonZeroTokenDays.length,\n totalHeatmapTokens,\n totalHeatmapSessions,\n maxHeatmapDayTokens,\n },\n }\n }, [sessions, range, sessionSort])\n\n const cacheNote = !analytics\n ? ''\n : analytics.cacheHitPct >= 70 ? '命中较高'\n : analytics.cacheHitPct >= 40 ? '一般'\n : '命中偏低'\n\n // 环形中心展示信息(不重复上面大数,展示主力占比或悬停选中的模型)\n const activeSeg = hoveredIdx !== null && analytics?.donutSegments[hoveredIdx]\n ? analytics.donutSegments[hoveredIdx]\n : null\n const topModel = analytics?.donutSegments[0]\n\n return (\n <div className={css.settingsContainer}>\n <div className={css.cockpitHeader}>\n <div className={css.cockpitTitleArea}>\n <h2 className={css.cockpitMainTitle}>对话开销与模型风云榜</h2>\n <p className={css.cockpitSubTitle}>只读汇总本地已缓存的对话。按活动日期归组,无额外后台开销。</p>\n </div>\n <div className={css.headerRightControls}>\n <div className={css.rangeSwitchGroup}>\n <button\n type=\"button\"\n className={css.rangeBtn}\n data-active={range === '7' ? '' : undefined}\n onClick={() => { setUserPickedRange(true); setRange('7'); setCustomViewMode(null); }}\n >\n 近 7 天\n </button>\n <button\n type=\"button\"\n className={css.rangeBtn}\n data-active={range === '30' ? '' : undefined}\n onClick={() => { setUserPickedRange(true); setRange('30'); setCustomViewMode(null); }}\n >\n 近 30 天\n </button>\n <button\n type=\"button\"\n className={css.rangeBtn}\n data-active={range === '180' ? '' : undefined}\n onClick={() => { setUserPickedRange(true); setRange('180'); setCustomViewMode(null); }}\n >\n 近 6 个月\n </button>\n </div>\n <button type=\"button\" className={css.settingsScanBtn} onClick={refresh} disabled={loading || !props.remote}>\n {loading ? '正在刷新' : '刷新'}\n </button>\n </div>\n </div>\n\n <div className={css.heroStatsRow}>\n <div className={css.heroBigNum}>\n {analytics ? fmtCompact(analytics.totalTokens) : '-'} <span className={css.heroUnit}>Token</span>\n </div>\n <div className={css.heroMetaCol}>\n <span>累计耗时 <strong>{analytics ? `${analytics.totalTimeHours} 小时` : '-'}</strong></span>\n <span>缓存命中 <strong>{analytics ? `${analytics.cacheHitPct}% (${cacheNote})` : '-'}</strong></span>\n <span>有统计的对话 <strong>{analytics ? `${analytics.validCount} / ${analytics.listed}` : '-'}</strong></span>\n </div>\n </div>\n\n {/* 六大极客风云与问题洞察榜单:两列规整自适应排版,右下角动作条绝对平齐 */}\n <div className={css.roastGrid}>\n {/* 卡片 1: 极致打字机 */}\n <div\n className={`${css.roastItem} ${activeDrilldown === 'speed' ? css.roastItemActive : ''}`}\n onClick={() => setActiveDrilldown(activeDrilldown === 'speed' ? null : 'speed')}\n >\n <div className={css.roastHead}>\n <span className={css.roastTag} style={{ color: '#10b981' }}>极致打字机</span>\n <span className={css.roastCategoryBadge}>速度王者</span>\n </div>\n <div className={css.roastTitle} title={analytics?.fastKing?.model}>{analytics?.fastKing?.model ?? '暂无数据'}</div>\n <div className={css.roastDesc} title=\"首字响应最迅速,轻量改错利器\">首字响应最迅速,轻量改错利器</div>\n <div className={css.roastVal} style={{ color: '#10b981' }}>\n {analytics?.fastKing?.firstSamples ? `首字均值 ${(analytics.fastKing.firstMs / analytics.fastKing.firstSamples / 1000).toFixed(2)} 秒` : '暂无数据'}\n </div>\n <div className={css.roastFooter}>\n <span className={css.roastFooterLeft}>首响应耗时</span>\n <span className={css.roastAction}>{activeDrilldown === 'speed' ? '收起透视 ▴' : '透视详情 ›'}</span>\n </div>\n </div>\n\n {/* 卡片 2: 最慢树懒 */}\n <div\n className={`${css.roastItem} ${activeDrilldown === 'latency' ? css.roastItemActive : ''}`}\n onClick={() => setActiveDrilldown(activeDrilldown === 'latency' ? null : 'latency')}\n >\n <div className={css.roastHead}>\n <span className={css.roastTag} style={{ color: '#d97706' }}>最慢树懒</span>\n <span className={css.roastCategoryBadge}>延迟瓶颈</span>\n </div>\n <div className={css.roastTitle} title={analytics?.slowKing?.model}>{analytics?.slowKing?.model ?? '暂无数据'}</div>\n <div className={css.roastDesc} title=\"首字排队最久,点根烟等它开工\">首字排队最久,点根烟等它开工</div>\n <div className={css.roastVal} style={{ color: '#d97706' }}>\n {analytics?.slowKing?.firstSamples ? `首字均值 ${(analytics.slowKing.firstMs / analytics.slowKing.firstSamples / 1000).toFixed(2)} 秒` : '暂无数据'}\n </div>\n <div className={css.roastFooter}>\n <span className={css.roastFooterLeft}>排队瓶颈</span>\n <span className={css.roastAction}>{activeDrilldown === 'latency' ? '收起透视 ▴' : '透视详情 ›'}</span>\n </div>\n </div>\n\n {/* 卡片 3: 深度沉思狂 */}\n <div\n className={`${css.roastItem} ${activeDrilldown === 'thinking' ? css.roastItemActive : ''}`}\n onClick={() => setActiveDrilldown(activeDrilldown === 'thinking' ? null : 'thinking')}\n >\n <div className={css.roastHead}>\n <span className={css.roastTag} style={{ color: '#8b5cf6' }}>深度沉思狂</span>\n <span className={css.roastCategoryBadge}>推理硬核</span>\n </div>\n <div className={css.roastTitle} title={analytics?.thinkKing?.model}>{analytics?.thinkKing?.model ?? '暂无思考记录'}</div>\n <div className={css.roastDesc} title=\"思考 Token 占自身输出比例最高\">思考 Token 占自身输出比例最高</div>\n <div className={css.roastVal} style={{ color: '#8b5cf6' }}>\n {analytics?.thinkKing ? `思考占比 ${Math.round(((analytics.thinkKing.reasoning ?? 0) / (((analytics.thinkKing.reasoning ?? 0) + (analytics.thinkKing.output ?? 0)) || 1)) * 100)}%` : '无推理记录'}\n </div>\n <div className={css.roastFooter}>\n <span className={css.roastFooterLeft}>推导占比</span>\n <span className={css.roastAction}>{activeDrilldown === 'thinking' ? '收起透视 ▴' : '透视详情 ›'}</span>\n </div>\n </div>\n\n {/* 卡片 4: 省流小能手 / 缓存待提升 */}\n <div\n className={`${css.roastItem} ${activeDrilldown === 'cache' ? css.roastItemActive : ''}`}\n onClick={() => setActiveDrilldown(activeDrilldown === 'cache' ? null : 'cache')}\n >\n <div className={css.roastHead}>\n <span className={css.roastTag} style={{ color: (analytics?.cacheHitPct ?? 0) >= 40 ? '#10b981' : '#f59e0b' }}>\n {(analytics?.cacheHitPct ?? 0) >= 40 ? '省流小能手' : '缓存待提升'}\n </span>\n <span className={css.roastCategoryBadge}>成本控制</span>\n </div>\n <div className={css.roastTitle} title={analytics?.bestCacheModel?.model}>\n {(analytics?.cacheHitPct ?? 0) >= 40 ? (analytics?.bestCacheModel?.model ?? '上下文复用') : '上下文重传较多'}\n </div>\n <div className={css.roastDesc} title={(analytics?.cacheHitPct ?? 0) >= 40 ? '前缀缓存命中率高,大幅节约 Token' : '较多长文本全量重传,可利用前缀缓存'}>\n {(analytics?.cacheHitPct ?? 0) >= 40 ? '前缀缓存命中率高,大幅节约 Token' : '较多长文本全量重传,可利用前缀缓存'}\n </div>\n <div className={css.roastVal} style={{ color: (analytics?.cacheHitPct ?? 0) >= 40 ? '#10b981' : '#f59e0b' }}>\n {analytics ? `命中 ${analytics.cacheHitPct}% (${fmtCompact(analytics.totalCacheRead)} Token)` : '-'}\n </div>\n <div className={css.roastFooter}>\n <span className={css.roastFooterLeft}>缓存效率</span>\n <span className={css.roastAction}>{activeDrilldown === 'cache' ? '收起透视 ▴' : '透视详情 ›'}</span>\n </div>\n </div>\n\n {/* 卡片 5: 终端耗时狂 / 秒级放行 */}\n <div\n className={`${css.roastItem} ${activeDrilldown === 'tool' ? css.roastItemActive : ''}`}\n onClick={() => setActiveDrilldown(activeDrilldown === 'tool' ? null : 'tool')}\n >\n <div className={css.roastHead}>\n <span className={css.roastTag} style={{ color: (analytics?.toolTimePct ?? 0) >= 30 ? '#f59e0b' : '#3b82f6' }}>\n {(analytics?.toolTimePct ?? 0) >= 30 ? '终端耗时狂' : '秒级放行'}\n </span>\n <span className={css.roastCategoryBadge}>工程归因</span>\n </div>\n <div className={css.roastTitle}>\n {(analytics?.toolTimePct ?? 0) >= 30 ? `本地命令占 ${analytics?.toolTimePct}% 耗时` : `本地损耗仅 ${analytics?.toolTimePct ?? 0}%`}\n </div>\n <div className={css.roastDesc} title={(analytics?.toolTimePct ?? 0) >= 30 ? '很多时候不是模型卡,是本地脚本跑太久' : '本地工具极速执行,等待时间主要在云端'}>\n {(analytics?.toolTimePct ?? 0) >= 30 ? '很多时候不是模型卡,是本地脚本跑太久' : '本地工具极速执行,等待时间主要在云端'}\n </div>\n <div className={css.roastVal} style={{ color: (analytics?.toolTimePct ?? 0) >= 30 ? '#f59e0b' : '#3b82f6' }}>\n {analytics ? `工具耗时 ${Math.round(analytics.totalToolMs / 1000)} 秒 (${analytics.totalTools} 次)` : '-'}\n </div>\n <div className={css.roastFooter}>\n <span className={css.roastFooterLeft}>本地耗时</span>\n <span className={css.roastAction}>{activeDrilldown === 'tool' ? '收起透视 ▴' : '透视详情 ›'}</span>\n </div>\n </div>\n\n {/* 卡片 6: 运行可靠度 */}\n <div\n className={`${css.roastItem} ${activeDrilldown === 'reliability' ? css.roastItemActive : ''}`}\n onClick={() => setActiveDrilldown(activeDrilldown === 'reliability' ? null : 'reliability')}\n >\n <div className={css.roastHead}>\n <span className={css.roastTag} style={{ color: (analytics?.totalErrors ?? 0) > 0 ? '#ef4444' : '#10b981' }}>\n {(analytics?.totalErrors ?? 0) > 0 ? '翻车排查' : '运行可靠度'}\n </span>\n <span className={css.roastCategoryBadge}>稳定性</span>\n </div>\n <div className={css.roastTitle} title={(analytics?.totalErrors ?? 0) > 0 ? '存在工具报错' : '执行顺畅'}>\n {(analytics?.totalErrors ?? 0) > 0 ? `${analytics?.totalErrors} 次工具报错` : '100% 顺畅'}\n </div>\n <div className={css.roastDesc} title={(analytics?.totalErrors ?? 0) > 0 ? '命令执行或参数错误,注意环境排查' : '未发生命令报错或异常,执行稳健'}>\n {(analytics?.totalErrors ?? 0) > 0 ? '命令执行或参数错误,注意环境排查' : '未发生命令报错或异常,执行稳健'}\n </div>\n <div className={css.roastVal} style={{ color: (analytics?.totalErrors ?? 0) > 0 ? '#ef4444' : '#10b981' }}>\n {(analytics?.totalErrors ?? 0) > 0 ? `${analytics?.totalErrors} 次报错 · ${analytics?.totalRetries} 次重试` : '0 报错 · 0 重试'}\n </div>\n <div className={css.roastFooter}>\n <span className={css.roastFooterLeft}>异常检测</span>\n <span className={css.roastAction}>{activeDrilldown === 'reliability' ? '收起透视 ▴' : '透视详情 ›'}</span>\n </div>\n </div>\n </div>\n\n {/* KPI 卡片深度下钻透视面板:严格严谨排序,绝不出框 */}\n {activeDrilldown && analytics ? (\n <div className={css.drilldownPanel}>\n <div className={css.drilldownHead}>\n <div className={css.drilldownTitleGroup}>\n <span className={css.drilldownTitle}>\n {activeDrilldown === 'speed' && '⚡ 模型首字响应延迟对比 (TTFT)'}\n {activeDrilldown === 'latency' && '🐢 模型首字排队耗时排行榜'}\n {activeDrilldown === 'thinking' && '🧠 深度推导算力分配明细'}\n {activeDrilldown === 'cache' && '💰 前缀缓存命中率排行榜'}\n {activeDrilldown === 'tool' && '⏱️ 本地工具与终端命令耗时全景拆解'}\n {activeDrilldown === 'reliability' && '🛡️ 运行可靠度与报错排查'}\n </span>\n <span className={css.drilldownSub}>\n {activeDrilldown === 'speed' && '按首响应延迟升序排列(最快在上,首字响应最迅速)'}\n {activeDrilldown === 'latency' && '按排队耗时降序排列(排队最久在上,定位卡顿瓶颈)'}\n {activeDrilldown === 'thinking' && '按思考 Token 占比降序排列(对比自我推导与正文算力比重)'}\n {activeDrilldown === 'cache' && '按前缀缓存命中率降序排列(直接决定上下文成本与省钱效率)'}\n {activeDrilldown === 'tool' && '本地工具耗时全景拆解(按单会话本地执行耗时由大到小降序排查)'}\n {activeDrilldown === 'reliability' && '按报错与重试次数降序排查(优先定位最高频故障会话)'}\n </span>\n </div>\n <button\n type=\"button\"\n className={css.drilldownCloseBtn}\n onClick={() => setActiveDrilldown(null)}\n >\n 收起 ✕\n </button>\n </div>\n\n {/* 1. 速度 / 延迟下钻:每个模型唯一,严格升序/降序 */}\n {activeDrilldown === 'speed' && (\n <div className={css.rankList}>\n {analytics.speedList.map((m: any, idx: number) => {\n const avgMs = m.firstMs / m.firstSamples\n const minMs = analytics.speedList[0].firstMs / analytics.speedList[0].firstSamples\n // 最快的模型得分为 100%,后续依次递减,条长完美单调递减\n const score = Math.max(10, Math.min(100, Math.round((minMs / avgMs) * 100)))\n const color = avgMs < 1000 ? '#10b981' : avgMs < 3000 ? '#3b82f6' : '#f59e0b'\n return (\n <div key={m.model} className={css.rankItem}>\n <div className={css.rankItemTop}>\n <div className={css.rankItemLeft}>\n <span className={`${css.rankBadge} ${idx === 0 ? css.rankBadgeGold : ''}`}>#{idx + 1}</span>\n <span className={css.rankName} title={m.model}>{m.model}</span>\n </div>\n <span className={css.rankValMain} style={{ color }}>\n {(avgMs / 1000).toFixed(2)} 秒\n </span>\n </div>\n <div className={css.rankTrack}>\n <div className={css.rankBar} style={{ width: `${score}%`, background: color }} />\n </div>\n <div className={css.rankSubText}>\n <span>速度敏捷得分 <strong>{score}分</strong> (首字均值 {(avgMs / 1000).toFixed(2)}s)</span>\n <span>累计采样 {m.firstSamples} 次</span>\n </div>\n </div>\n )\n })}\n {analytics.speedList.length === 0 ? (\n <div className={css.drilldownEmpty}>暂无模型首字响应延迟采样数据。</div>\n ) : null}\n </div>\n )}\n\n {activeDrilldown === 'latency' && (\n <div className={css.rankList}>\n {analytics.latencyList.map((m: any, idx: number) => {\n const avgMs = m.firstMs / m.firstSamples\n const maxMs = analytics.latencyList[0].firstMs / analytics.latencyList[0].firstSamples\n // 最慢的模型瓶颈权重 100%,后续依次递减,条长完美单调递减\n const bottleneckPct = Math.max(10, Math.min(100, Math.round((avgMs / maxMs) * 100)))\n const color = avgMs > 5000 ? '#ef4444' : avgMs > 2000 ? '#f59e0b' : '#3b82f6'\n return (\n <div key={m.model} className={css.rankItem}>\n <div className={css.rankItemTop}>\n <div className={css.rankItemLeft}>\n <span className={`${css.rankBadge} ${idx === 0 ? css.rankBadgeGold : ''}`}>#{idx + 1}</span>\n <span className={css.rankName} title={m.model}>{m.model}</span>\n </div>\n <span className={css.rankValMain} style={{ color }}>\n {(avgMs / 1000).toFixed(2)} 秒\n </span>\n </div>\n <div className={css.rankTrack}>\n <div className={css.rankBar} style={{ width: `${bottleneckPct}%`, background: color }} />\n </div>\n <div className={css.rankSubText}>\n <span>排队延迟 <strong>{(avgMs / 1000).toFixed(2)}s</strong> (瓶颈权重 {bottleneckPct}%)</span>\n <span>累计采样 {m.firstSamples} 次</span>\n </div>\n </div>\n )\n })}\n {analytics.latencyList.length === 0 ? (\n <div className={css.drilldownEmpty}>暂无模型排队延迟采样数据。</div>\n ) : null}\n </div>\n )}\n\n {/* 2. 深度思考推导下钻:严格按思考占比降序 */}\n {activeDrilldown === 'thinking' && (\n <div className={css.rankList}>\n {analytics.thinkList.map((m: any, idx: number) => {\n const totalTokens = (m.reasoning ?? 0) + (m.output ?? 0)\n const thinkPct = totalTokens > 0 ? Math.round((m.reasoning / totalTokens) * 100) : 0\n return (\n <div key={m.model} className={css.rankItem}>\n <div className={css.rankItemTop}>\n <div className={css.rankItemLeft}>\n <span className={`${css.rankBadge} ${idx === 0 ? css.rankBadgeGold : ''}`}>#{idx + 1}</span>\n <span className={css.rankName} title={m.model}>{m.model}</span>\n </div>\n <span className={css.rankValMain} style={{ color: '#8b5cf6' }}>\n 思考占比 {thinkPct}%\n </span>\n </div>\n <div className={css.toolCompoundTrack} style={{ height: '8px' }}>\n <div style={{ width: `${thinkPct}%`, background: '#8b5cf6', height: '100%' }} title={`思考: ${thinkPct}%`} />\n <div style={{ width: `${100 - thinkPct}%`, background: '#38bdf8', height: '100%' }} title={`正文: ${100 - thinkPct}%`} />\n </div>\n <div className={css.rankSubText}>\n <span>思考推导 <strong>{fmtCompact(m.reasoning)}</strong> Token ({thinkPct}%)</span>\n <span>正文输出 <strong>{fmtCompact(m.output)}</strong> Token</span>\n </div>\n </div>\n )\n })}\n {analytics.thinkList.length === 0 ? (\n <div className={css.drilldownEmpty}>当前时间范围内未检测到调用带推导思考过程的模型。</div>\n ) : null}\n </div>\n )}\n\n {/* 3. 前缀缓存下钻:严格按命中率降序 */}\n {activeDrilldown === 'cache' && (\n <div className={css.rankList}>\n {analytics.cacheList.map((m: any, idx: number) => {\n const totalIn = (m.input ?? 0) + (m.cacheRead ?? 0)\n const hitPct = totalIn > 0 ? Math.round(((m.cacheRead ?? 0) / totalIn) * 100) : 0\n return (\n <div key={m.model} className={css.rankItem}>\n <div className={css.rankItemTop}>\n <div className={css.rankItemLeft}>\n <span className={`${css.rankBadge} ${idx === 0 ? css.rankBadgeGold : ''}`}>#{idx + 1}</span>\n <span className={css.rankName} title={m.model}>{m.model}</span>\n </div>\n <span className={css.rankValMain} style={{ color: '#10b981' }}>\n 命中率 {hitPct}%\n </span>\n </div>\n <div className={css.toolCompoundTrack} style={{ height: '8px' }}>\n <div style={{ width: `${hitPct}%`, background: '#10b981', height: '100%' }} title={`缓存命中: ${hitPct}%`} />\n <div style={{ width: `${100 - hitPct}%`, background: 'var(--dsw-alias-border-l3, #94a3b8)', height: '100%' }} title={`未命中: ${100 - hitPct}%`} />\n </div>\n <div className={css.rankSubText}>\n <span>命中复用 <strong>{fmtCompact(m.cacheRead ?? 0)}</strong> Token ({hitPct}%)</span>\n <span>实付输入 <strong>{fmtCompact(m.input ?? 0)}</strong> Token</span>\n </div>\n </div>\n )\n })}\n {analytics.cacheList.length === 0 ? (\n <div className={css.drilldownEmpty}>暂无模型缓存使用记录。</div>\n ) : null}\n </div>\n )}\n\n {/* 4. 本地工具耗时下钻:排序严谨,严格降序 */}\n {activeDrilldown === 'tool' && (\n <div className={css.toolDrillSection}>\n {/* 顶部复合比例条 */}\n <div className={css.toolCompoundBox}>\n <div className={css.toolCompoundTrack}>\n <div className={css.toolSliceBash} style={{ width: `${analytics.bashPct}%` }} />\n <div className={css.toolSliceFile} style={{ width: `${analytics.filePct}%` }} />\n </div>\n <div className={css.toolCompoundLegend}>\n <span><i className={css.dlDot} style={{ background: 'var(--dsw-static-green-500, #10b981)' }} /> 终端命令 (Bash): <strong>{Math.round(analytics.totalBashMs / 1000)}秒 ({analytics.bashPct}%)</strong></span>\n <span><i className={css.dlDot} style={{ background: '#0ea5e9' }} /> 文件与通用读写: <strong>{Math.round(analytics.totalFileMs / 1000)}秒 ({analytics.filePct}%)</strong></span>\n </div>\n </div>\n\n {/* 两张典型场景拆解卡片 */}\n <div className={css.toolGridCards}>\n <div className={css.toolMiniCard}>\n <div className={css.toolMiniTitle}>\n <i className={css.dlDot} style={{ background: 'var(--dsw-static-green-500, #10b981)' }} />\n <span>终端 Bash 命令 (测试/构建/脚本)</span>\n </div>\n <div className={css.toolMiniNum}>{Math.round(analytics.totalBashMs / 1000)} 秒</div>\n <div className={css.toolMiniDesc}>\n 包含 npm run, cargo, git, Python 以及本地自动化测试脚本等高耗时运行环节。\n </div>\n </div>\n\n <div className={css.toolMiniCard}>\n <div className={css.toolMiniTitle}>\n <i className={css.dlDot} style={{ background: '#0ea5e9' }} />\n <span>文件操作与其他工具 (读写/检索)</span>\n </div>\n <div className={css.toolMiniNum}>{Math.round(analytics.totalFileMs / 1000)} 秒</div>\n <div className={css.toolMiniDesc}>\n 包含 read, write, edit, glob, grep 等轻量快速文件读写。单次耗时通常在毫秒级。\n </div>\n </div>\n </div>\n\n {/* 最耗时的对话工具执行排查 (严格按耗时降序) */}\n {analytics.topToolSessions && analytics.topToolSessions.length > 0 ? (\n <div className={css.toolTopList}>\n <div className={css.toolTopListTitle}>单会话工具总耗时 TOP 3 (降序排查)</div>\n {analytics.topToolSessions.slice(0, 3).map((s: any, idx: number) => {\n const tMs = s.value?.totals?.toolMs ?? 0\n const bMs = s.value?.totals?.bashMs ?? 0\n const fMs = Math.max(0, tMs - bMs)\n const bPct = tMs > 0 ? Math.round((bMs / tMs) * 100) : 0\n return (\n <div key={s.sessionId} className={css.rankItem}>\n <div className={css.rankItemTop}>\n <div className={css.rankItemLeft}>\n <span className={`${css.rankBadge} ${idx === 0 ? css.rankBadgeGold : ''}`}>#{idx + 1}</span>\n <span className={css.sessionIdTag}>{s.sessionId.slice(0, 14)}…</span>\n <span className={css.rankName} title={s.value?.models?.[0]?.model}>{s.value?.models?.[0]?.model ?? '通用会话'}</span>\n </div>\n <span className={css.rankValMain}>\n 总计 {Math.round(tMs / 1000)} 秒\n </span>\n </div>\n <div className={css.toolCompoundTrack} style={{ height: '8px' }}>\n <div style={{ width: `${bPct}%`, background: 'var(--dsw-static-green-500, #10b981)', height: '100%' }} title={`终端命令: ${Math.round(bMs/1000)}s`} />\n <div style={{ width: `${100 - bPct}%`, background: '#0ea5e9', height: '100%' }} title={`文件读写: ${Math.round(fMs/1000)}s`} />\n </div>\n <div className={css.rankSubText}>\n <span>终端 Bash <strong>{Math.round(bMs / 1000)}s</strong> ({bPct}%)</span>\n <span>文件读写 <strong>{Math.round(fMs / 1000)}s</strong> ({100 - bPct}%)</span>\n </div>\n </div>\n )\n })}\n </div>\n ) : null}\n </div>\n )}\n\n {/* 5. 运行可靠度与报错排查下钻:严格按报错次数降序 */}\n {activeDrilldown === 'reliability' && (\n <div className={css.errorDrillSection}>\n {analytics.totalErrors === 0 && analytics.totalRetries === 0 ? (\n <div className={css.errorAllGoodBox}>\n ✓ 全部会话工具执行 100% 顺畅,未记录到任何非零退出码或重试异常!\n </div>\n ) : (\n <div className={css.errorSessionList}>\n <div className={css.toolTopListTitle}>报错与重试排查列表 (按异常严重度降序)</div>\n {analytics.errorSessions.map((s: any, idx: number) => (\n <div key={s.sessionId} className={css.errorSessionRow}>\n <span className={`${css.rankBadge} ${idx === 0 ? css.rankBadgeGold : ''}`}>#{idx + 1}</span>\n <span className={css.sessionIdTag}>{s.sessionId.slice(0, 14)}…</span>\n <span className={css.rankName}>{s.value?.models?.[0]?.model ?? '通用对话'}</span>\n <span className={s.value?.totals?.toolErrors > 0 ? css.statusBad : css.statusOk}>\n {s.value?.totals?.toolErrors > 0 ? `${s.value.totals.toolErrors} 次报错` : '0 报错'}\n </span>\n <span className={s.value?.totals?.retries > 0 ? css.statusWarn : css.statusOk}>\n {s.value?.totals?.retries > 0 ? `${s.value.totals.retries} 次重试` : '0 重试'}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n ) : null}\n\n <div className={css.vizSplitGrid}>\n {/* 模型支出份额 (环形图 100% 闭环无缺口,图例按 Token 严格降序) */}\n <div className={css.vizPanel}>\n <div className={css.vizHead}>\n <span className={css.vizTitle}>模型支出份额</span>\n <span className={css.vizSub}>按消耗 Token 降序排列</span>\n </div>\n <div className={css.donutWrap}>\n <div className={css.donutSvgBox}>\n <svg viewBox=\"0 0 100 100\" className={css.donutSvg}>\n <circle cx=\"50\" cy=\"50\" r=\"38\" fill=\"none\" stroke=\"var(--dsw-alias-bg-layer-2)\" strokeWidth=\"12\" />\n <g transform=\"rotate(-90 50 50)\">\n {(analytics?.donutSegments.length ?? 0) === 1 ? (\n <circle cx=\"50\" cy=\"50\" r=\"38\" fill=\"none\" stroke={analytics!.donutSegments[0].color} strokeWidth=\"12\" />\n ) : (\n analytics?.donutSegments.map((seg, idx) => (\n <circle\n key={idx}\n cx=\"50\"\n cy=\"50\"\n r=\"38\"\n fill=\"none\"\n stroke={seg.color}\n strokeWidth=\"12\"\n strokeDasharray={seg.dasharray}\n strokeDashoffset={seg.dashoffset}\n />\n ))\n )}\n </g>\n </svg>\n <div className={css.donutCenterText}>\n <div className={css.donutCenterNum}>\n {activeSeg ? `${activeSeg.pct}%` : topModel ? `${topModel.pct}%` : `${analytics?.donutSegments.length ?? 0}款`}\n </div>\n <div className={css.donutCenterSub}>\n {activeSeg ? '选中占比' : '主力占比'}\n </div>\n </div>\n </div>\n <div className={css.donutLegendList}>\n {analytics?.donutSegments.map((seg, idx) => (\n <div\n key={idx}\n className={`${css.donutLegendRow} ${hoveredIdx === idx ? css.donutLegendRowActive : ''}`}\n onMouseEnter={() => setHoveredIdx(idx)}\n onMouseLeave={() => setHoveredIdx(null)}\n >\n <span className={css.dlLeft}>\n <i className={css.dlDot} style={{ background: seg.color }} />\n <span className={css.dlName} title={seg.model}>{seg.model}</span>\n </span>\n <span className={css.dlRight}>{fmtCompact(seg.tokens)} · {seg.pct}%</span>\n </div>\n ))}\n </div>\n </div>\n {/* 专属模型全名与份额透视条:彻底舒展超长模型名 */}\n {(activeSeg || topModel) ? (\n <div className={css.donutInspectBar}>\n <i className={css.dlDot} style={{ background: (activeSeg || topModel)?.color }} />\n <span className={css.donutInspectName} title={(activeSeg || topModel)?.model}>\n {(activeSeg || topModel)?.model}\n </span>\n <span className={css.donutInspectTag}>{activeSeg ? '当前高亮' : '全场主力'}</span>\n <span className={css.donutInspectVal}>\n {fmtCompact((activeSeg || topModel)?.tokens ?? 0)} Token ({ (activeSeg || topModel)?.pct }%)\n </span>\n </div>\n ) : null}\n </div>\n\n {/* 每日编码活跃度与走势 */}\n <div className={css.vizPanel}>\n <div className={css.vizHead}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '2px' }}>\n <span className={css.vizTitle}>\n {range === '7' ? '近 7 日活动分布' : range === '30' ? '近 30 日走势' : '近 6 个月趋势'}\n </span>\n <span className={css.vizSub}>\n {activeViewMode === 'bar' ? '柱状堆叠图 · 分色对应模型' : '平滑折线图 · 活动趋势'}\n </span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div className={css.viewSwitchGroup} role=\"group\" aria-label=\"图表类型切换\">\n <button\n type=\"button\"\n className={css.viewSwitchBtn}\n data-active={activeViewMode === 'bar' ? '' : undefined}\n onClick={() => setCustomViewMode('bar')}\n >\n 柱状图\n </button>\n <button\n type=\"button\"\n className={css.viewSwitchBtn}\n data-active={activeViewMode === 'line' ? '' : undefined}\n onClick={() => setCustomViewMode('line')}\n >\n 折线图\n </button>\n </div>\n </div>\n </div>\n\n {/* 图例 (Legend):展示当前区间内活跃模型及其颜色与消耗量 */}\n {analytics && analytics.activeRangeModels.length > 0 && (\n <div className={css.chartLegend} aria-label=\"图例\">\n {analytics.activeRangeModels.map(m => (\n <div key={m.model} className={css.chartLegendItem} title={`${m.model}: ${fmtCompact(m.tokens)} Token (${m.pct}%)`}>\n <i className={css.chartLegendDot} style={{ background: m.color }} />\n <span className={css.chartLegendName}>{m.model}</span>\n <span className={css.chartLegendVal}>{fmtCompact(m.tokens)} ({m.pct}%)</span>\n </div>\n ))}\n </div>\n )}\n\n {/* 模式 A:柱状图 (带图例、顶部数值、Hover 悬浮卡片) */}\n {activeViewMode === 'bar' ? (\n <div\n className={css.chartInteractiveWrap}\n onMouseLeave={() => { setHoveredDayIdx(null); setHoveredDayAnchor(null) }}\n >\n {/* 悬停浮层 Tooltip Popover:挂载到 body,避免被面板 overflow: hidden 裁剪 */}\n {hoveredDayIdx !== null && analytics?.daySeries[hoveredDayIdx] && (\n (() => {\n const day = analytics.daySeries[hoveredDayIdx]\n return (\n <ChartTooltip anchor={hoveredDayAnchor}>\n <div className={css.chartTooltipDate}>\n <span>{day.key}</span>\n <span className={css.chartTooltipDateBadge}>\n {day.isToday ? '今天 · ' : day.isYesterday ? '昨天 · ' : ''}{day.weekday}\n </span>\n </div>\n <div className={css.chartTooltipTotal}>\n {fmtCompact(day.total)} <span style={{ fontSize: '11px', fontWeight: 500 }}>Token</span>\n <span className={css.chartTooltipSessions}>· {day.sessions} 个会话</span>\n </div>\n {day.segments.length > 0 && <div className={css.chartTooltipDivider} />}\n <div className={css.chartTooltipModelList}>\n {day.segments.map(seg => (\n <div key={seg.model} className={css.chartTooltipModelRow}>\n <div className={css.chartTooltipModelLeft}>\n <i className={css.chartTooltipModelDot} style={{ background: seg.color }} />\n <span className={css.chartTooltipModelName} title={seg.model}>{seg.model}</span>\n </div>\n <span className={css.chartTooltipModelRight}>\n {fmtCompact(seg.tokens)} ({seg.pct}%)\n </span>\n </div>\n ))}\n </div>\n </ChartTooltip>\n )\n })()\n )}\n\n <div className={`${css.dayStack} ${range === '7' ? css.dayStackWeek : ''}`} aria-label=\"按日活跃柱图\">\n {(analytics?.daySeries ?? []).map((day, idx) => (\n <div\n key={day.key}\n className={css.dayCol}\n onMouseEnter={(e) => {\n setHoveredDayIdx(idx)\n setHoveredDayAnchor({ el: e.currentTarget, ratioX: 0.5, ratioY: 0, side: 'below' })\n }}\n >\n {/* 柱顶数值 */}\n <div className={css.dayBarTopLabel}>\n {day.total > 0 ? fmtCompact(day.total) : ''}\n </div>\n <div className={`${css.dayColFill} ${hoveredDayIdx === idx ? css.dayColFillActive : ''}`}>\n {day.total > 0 ? (\n day.segments.map(seg => (\n <div key={seg.model} className={css.daySeg} style={{\n height: `${(seg.tokens / analytics!.dayMax) * 100}%`,\n background: seg.color,\n }} />\n ))\n ) : (\n <div className={css.dayEmptyDot} />\n )}\n </div>\n <span className={`${css.dayLabel} ${day.isToday ? css.dayLabelToday : ''}`}>\n {day.label}\n </span>\n </div>\n ))}\n </div>\n </div>\n ) : (\n /* 模式 B:平滑堆叠折线图 (按模型分色多层堆叠、网格渐变、吸附光标与悬停卡片,如图 2) */\n <div\n className={css.chartInteractiveWrap}\n onMouseLeave={() => { setHoveredLineIdx(null); setHoveredLineAnchor(null) }}\n >\n {analytics && analytics.daySeries.length > 0 && (\n (() => {\n const lineData = computeStackedLineChart(analytics.daySeries, analytics.activeRangeModels, 560, 160)\n const hoveredPoint = hoveredLineIdx !== null && hoveredLineIdx < lineData.stackLevels.length\n ? lineData.stackLevels[hoveredLineIdx]\n : null\n\n return (\n <div className={css.lineChartWrap}>\n {/* 悬停浮层 Tooltip Popover:挂载到 body,避免被面板 overflow: hidden 裁剪 */}\n {hoveredPoint && (\n <ChartTooltip anchor={hoveredLineAnchor}>\n <div className={css.chartTooltipDate}>\n <span>{hoveredPoint.data.key}</span>\n <span className={css.chartTooltipDateBadge}>\n {hoveredPoint.data.isToday ? '今天 · ' : hoveredPoint.data.isYesterday ? '昨天 · ' : ''}{hoveredPoint.data.weekday}\n </span>\n </div>\n <div className={css.chartTooltipTotal}>\n {fmtCompact(hoveredPoint.data.total)} <span style={{ fontSize: '11px', fontWeight: 500 }}>Token</span>\n <span className={css.chartTooltipSessions}>· {hoveredPoint.data.sessions} 个会话</span>\n </div>\n {hoveredPoint.data.segments.length > 0 && <div className={css.chartTooltipDivider} />}\n <div className={css.chartTooltipModelList}>\n {hoveredPoint.data.segments.map((seg: any) => (\n <div key={seg.model} className={css.chartTooltipModelRow}>\n <div className={css.chartTooltipModelLeft}>\n <i className={css.chartTooltipModelDot} style={{ background: seg.color }} />\n <span className={css.chartTooltipModelName} title={seg.model}>{seg.model}</span>\n </div>\n <span className={css.chartTooltipModelRight}>\n {fmtCompact(seg.tokens)} ({seg.pct}%)\n </span>\n </div>\n ))}\n </div>\n </ChartTooltip>\n )}\n\n <svg\n className={css.lineChartSvg}\n viewBox=\"0 0 560 160\"\n preserveAspectRatio=\"none\"\n onMouseMove={(e) => {\n const rect = e.currentTarget.getBoundingClientRect()\n const scaleX = 560 / rect.width\n const svgX = (e.clientX - rect.left) * scaleX\n let nearestIdx = 0\n let minDiff = Infinity\n lineData.stackLevels.forEach((sl, idx) => {\n const diff = Math.abs(sl.x - svgX)\n if (diff < minDiff) {\n minDiff = diff\n nearestIdx = idx\n }\n })\n setHoveredLineIdx(nearestIdx)\n const level = lineData.stackLevels[nearestIdx]\n const stacks = level?.modelStacks ?? []\n const topY = stacks[stacks.length - 1]?.topY ?? 60\n setHoveredLineAnchor({\n el: e.currentTarget,\n ratioX: (level?.x ?? 0) / 560,\n ratioY: topY / 160,\n side: 'above',\n })\n }}\n >\n <defs>\n {lineData.layers.map((layer, mIdx) => (\n <linearGradient\n key={`grad_${layer.model}`}\n id={`dshWatcherLayerGrad_${mIdx}`}\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop offset=\"0%\" stopColor={layer.color} stopOpacity=\"0.55\" />\n <stop offset=\"100%\" stopColor={layer.color} stopOpacity=\"0.18\" />\n </linearGradient>\n ))}\n </defs>\n\n {/* 水平网格线与 Y 轴刻度 */}\n <line\n x1={lineData.padding.left}\n y1={lineData.padding.top}\n x2={560 - lineData.padding.right}\n y2={lineData.padding.top}\n className={css.lineGrid}\n />\n <text x={lineData.padding.left - 6} y={lineData.padding.top + 3} textAnchor=\"end\" className={css.lineAxisText}>\n {fmtCompact(lineData.yMax)}\n </text>\n\n <line\n x1={lineData.padding.left}\n y1={lineData.padding.top + lineData.plotH / 2}\n x2={560 - lineData.padding.right}\n y2={lineData.padding.top + lineData.plotH / 2}\n className={css.lineGrid}\n />\n <text x={lineData.padding.left - 6} y={lineData.padding.top + lineData.plotH / 2 + 3} textAnchor=\"end\" className={css.lineAxisText}>\n {fmtCompact(Math.round(lineData.yMax / 2))}\n </text>\n\n <line\n x1={lineData.padding.left}\n y1={lineData.bottomY}\n x2={560 - lineData.padding.right}\n y2={lineData.bottomY}\n stroke=\"var(--dsw-alias-border-l2)\"\n strokeWidth=\"1\"\n />\n <text x={lineData.padding.left - 6} y={lineData.bottomY + 3} textAnchor=\"end\" className={css.lineAxisText}>\n 0\n </text>\n\n {/* X 轴日期刻度 */}\n {lineData.stackLevels.map((sl, idx) => {\n const isKeyDate = lineData.stackLevels.length <= 10\n ? true\n : idx === 0 || idx === lineData.stackLevels.length - 1 || idx % Math.max(1, Math.floor(lineData.stackLevels.length / 5)) === 0\n if (!isKeyDate) return null\n const text = sl.data.isToday ? '今天' : sl.data.label || dayLabel(sl.data.key)\n return (\n <text\n key={sl.data.key}\n x={sl.x}\n y={lineData.bottomY + 16}\n textAnchor=\"middle\"\n className={css.lineAxisText}\n fill={sl.data.isToday ? 'var(--dsw-static-deepseek-450, #5686fe)' : undefined}\n fontWeight={sl.data.isToday ? '700' : undefined}\n >\n {text}\n </text>\n )\n })}\n\n {/* 各模型堆叠面积层 */}\n {lineData.layers.map((layer, mIdx) => (\n <path\n key={`area_${layer.model}`}\n d={layer.areaD}\n fill={`url(#dshWatcherLayerGrad_${mIdx})`}\n />\n ))}\n\n {/* 各模型堆叠边界折线 */}\n {lineData.layers.map((layer) => (\n <path\n key={`line_${layer.model}`}\n d={layer.lineD}\n fill=\"none\"\n stroke={layer.color}\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n ))}\n\n {/* 各模型数据节点圆点 */}\n {lineData.stackLevels.map((sl) => {\n return sl.modelStacks.map((ms: any) => {\n if (ms.tokens <= 0) return null\n return (\n <circle\n key={`dot_${ms.model}_${sl.index}`}\n cx={sl.x}\n cy={ms.topY}\n r=\"2\"\n fill={ms.color}\n />\n )\n })\n })}\n\n {/* 悬停光标与各层吸附高亮圆点 */}\n {hoveredPoint && (\n <g>\n <line\n x1={hoveredPoint.x}\n y1={lineData.padding.top}\n x2={hoveredPoint.x}\n y2={lineData.bottomY}\n className={css.lineCursor}\n />\n {hoveredPoint.modelStacks.map((ms: any) => {\n if (ms.tokens <= 0) return null\n return (\n <g key={`hover_dot_${ms.model}`}>\n <circle\n cx={hoveredPoint.x}\n cy={ms.topY}\n r=\"6\"\n fill={ms.color}\n fillOpacity=\"0.35\"\n />\n <circle\n cx={hoveredPoint.x}\n cy={ms.topY}\n r=\"3.5\"\n fill={ms.color}\n stroke=\"#ffffff\"\n strokeWidth=\"1.5\"\n />\n </g>\n )\n })}\n </g>\n )}\n </svg>\n </div>\n )\n })()\n )}\n </div>\n )}\n\n <div className={css.chartFoot}>\n {activeViewMode === 'bar'\n ? '每日柱高代表当天最后活动的对话 Token 汇总,分色对应上方模型图例。'\n : '折线展示编码活跃趋势,鼠标滑动可透视任意一天的 Token 消耗与调用明细。'}\n </div>\n </div>\n </div>\n\n {/* 5. 近 6 个月调用热力图 (GitHub 贡献矩阵风格 Calendar Heatmap,如图 3) */}\n {analytics && (\n <div className={css.heatmapPanel} onMouseLeave={() => setHoveredHeatmapDay(null)}>\n <div className={css.heatmapHead}>\n <div className={css.heatmapTitleGroup}>\n <span className={css.heatmapTitle}>近 6 个月调用热力图</span>\n <span className={css.heatmapSub}>26 周活动矩阵 · 真实反映长期 AI 编码活跃节奏与频次</span>\n </div>\n {hoveredHeatmapDay ? (\n <div className={css.heatmapLiveHud}>\n <span className={css.heatmapLiveDate}>\n {hoveredHeatmapDay.date} {hoveredHeatmapDay.isToday ? '(今天)' : ''} · {hoveredHeatmapDay.weekday}\n </span>\n <span className={css.heatmapLiveTokens}>\n {hoveredHeatmapDay.tokens > 0 ? `${fmtCompact(hoveredHeatmapDay.tokens)} Token · ${hoveredHeatmapDay.sessions} 个会话` : '无调用活动'}\n </span>\n {hoveredHeatmapDay.models[0] && (\n <span className={css.heatmapLiveModel}>\n 主力: {hoveredHeatmapDay.models[0].model} ({hoveredHeatmapDay.models[0].pct}%)\n </span>\n )}\n </div>\n ) : (\n <div className={css.heatmapStatsRow}>\n <span>活跃天数 <strong>{analytics.heatmapStats.activeDays} 天</strong></span>\n <span>调用会话 <strong>{analytics.heatmapStats.totalHeatmapSessions} 次</strong></span>\n <span>累计消耗 <strong>{fmtCompact(analytics.heatmapStats.totalHeatmapTokens)} Token</strong></span>\n <span>峰值单日 <strong>{fmtCompact(analytics.heatmapStats.maxHeatmapDayTokens)} Token</strong></span>\n </div>\n )}\n </div>\n\n <div\n className={css.chartInteractiveWrap}\n onMouseLeave={() => { setHoveredHeatmapDay(null); setHoveredHeatmapAnchor(null) }}\n >\n {/* 热力图悬停浮层 Tooltip Popover:挂载到 body,上下自动翻转,永不裁剪 */}\n {hoveredHeatmapDay && (\n <ChartTooltip anchor={hoveredHeatmapAnchor}>\n <div className={css.chartTooltipDate}>\n <span>{hoveredHeatmapDay.date}</span>\n <span className={css.chartTooltipDateBadge}>\n {hoveredHeatmapDay.isToday ? '今天 · ' : ''}{hoveredHeatmapDay.weekday}\n </span>\n </div>\n <div className={css.chartTooltipTotal}>\n {hoveredHeatmapDay.tokens > 0 ? (\n <>\n {fmtCompact(hoveredHeatmapDay.tokens)} <span style={{ fontSize: '11px', fontWeight: 500 }}>Token</span>\n <span className={css.chartTooltipSessions}>· {hoveredHeatmapDay.sessions} 个会话</span>\n </>\n ) : (\n <span style={{ fontSize: '12px', fontWeight: 500, color: 'var(--dsw-alias-label-tertiary)' }}>当日未产生模型调用</span>\n )}\n </div>\n {hoveredHeatmapDay.models.length > 0 && <div className={css.chartTooltipDivider} />}\n <div className={css.chartTooltipModelList}>\n {hoveredHeatmapDay.models.map((seg: any) => (\n <div key={seg.model} className={css.chartTooltipModelRow}>\n <div className={css.chartTooltipModelLeft}>\n <i className={css.chartTooltipModelDot} style={{ background: seg.color }} />\n <span className={css.chartTooltipModelName} title={seg.model}>{seg.model}</span>\n </div>\n <span className={css.chartTooltipModelRight}>\n {fmtCompact(seg.tokens)} ({seg.pct}%)\n </span>\n </div>\n ))}\n </div>\n </ChartTooltip>\n )}\n\n <div className={css.heatmapScrollArea}>\n <div className={css.heatmapContainer}>\n {/* 顶部月份标注:与下方周列在像素上 1:1 绝对对齐 */}\n <div className={css.heatmapMonthsRow}>\n {analytics.heatmapMonthLabels.map(m => (\n <span\n key={`${m.colIndex}-${m.label}`}\n className={css.heatmapMonthLabel}\n style={{ left: `${m.colIndex * 16}px` }}\n >\n {m.label}\n </span>\n ))}\n </div>\n\n {/* 矩阵主体:左侧星期标签 + 26 列方块 */}\n <div className={css.heatmapGrid}>\n <div className={css.heatmapWeekdaysCol}>\n <span>周一</span>\n <span>周三</span>\n <span>周五</span>\n <span>周日</span>\n </div>\n\n <div className={css.heatmapWeeksRow}>\n {analytics.heatmapWeeks.map(w => (\n <div key={w.weekIndex} className={css.heatmapWeekCol}>\n {w.days.map(d => (\n <div\n key={d.date}\n className={`${css.heatmapCell} ${d.isToday ? css.heatmapCellToday : ''} ${hoveredHeatmapDay?.date === d.date ? css.heatmapCellActive : ''}`}\n data-level={d.level}\n data-future={d.isFuture ? 'true' : undefined}\n onMouseEnter={(e) => {\n if (!d.isFuture) {\n setHoveredHeatmapDay(d)\n setHoveredHeatmapAnchor({\n el: e.currentTarget,\n ratioX: 0.5,\n ratioY: 0.5,\n side: d.dayOfWeek <= 3 ? 'below' : 'above',\n })\n }\n }}\n />\n ))}\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div className={css.heatmapFoot}>\n <span>只读汇总本地已缓存对话。方块深浅代表当天 Token 消耗强度(自适应四分位数分阶)。</span>\n <div className={css.heatmapLegend}>\n <span>少</span>\n <div className={css.heatmapLegendCell} style={{ background: 'var(--dsw-alias-bg-layer-2, rgba(255, 255, 255, 0.04))', border: '1px solid var(--dsw-alias-border-l2, rgba(255, 255, 255, 0.08))' }} />\n <div className={css.heatmapLegendCell} style={{ background: 'rgba(86, 134, 254, 0.22)', border: '1px solid rgba(86, 134, 254, 0.35)' }} />\n <div className={css.heatmapLegendCell} style={{ background: 'rgba(86, 134, 254, 0.45)', border: '1px solid rgba(86, 134, 254, 0.60)' }} />\n <div className={css.heatmapLegendCell} style={{ background: 'rgba(86, 134, 254, 0.72)', border: '1px solid rgba(86, 134, 254, 0.88)' }} />\n <div className={css.heatmapLegendCell} style={{ background: 'var(--dsw-static-deepseek-450, #5686fe)', border: '1px solid #9bb8ff', boxShadow: '0 0 6px rgba(86, 134, 254, 0.45)' }} />\n <span>多</span>\n </div>\n </div>\n </div>\n )}\n\n {/* 重点对话账单:严格按选定维度降序排序! */}\n <div className={css.vizPanel}>\n <div className={css.vizHead}>\n <div className={css.tableTitleGroup}>\n <span className={css.vizTitle}>重点对话账单</span>\n <span className={css.vizSub}>\n {sessionSort === 'tokens' && '按 Token 消耗由高到低严格排序'}\n {sessionSort === 'time' && '按执行总耗时由长到短严格排序'}\n {sessionSort === 'errors' && '按报错与重试次数降序排查'}\n </span>\n </div>\n <div className={css.tableSortGroup} role=\"group\" aria-label=\"对话账单排序切换\">\n <button\n type=\"button\"\n className={css.sortBtn}\n data-active={sessionSort === 'tokens' ? '' : undefined}\n onClick={() => setSessionSort('tokens')}\n >\n Token 消耗 ↓\n </button>\n <button\n type=\"button\"\n className={css.sortBtn}\n data-active={sessionSort === 'time' ? '' : undefined}\n onClick={() => setSessionSort('time')}\n >\n 总耗时 ↓\n </button>\n <button\n type=\"button\"\n className={css.sortBtn}\n data-active={sessionSort === 'errors' ? '' : undefined}\n onClick={() => setSessionSort('errors')}\n >\n 故障数 ↓\n </button>\n </div>\n </div>\n\n {sessions && sessions.rows.length > 0 ? (\n <div className={css.sessionTableBox}>\n <div className={css.sessionTableHeader}>\n <span>排名 · 会话ID</span>\n <span>主用模型</span>\n <span style={{ textAlign: 'right' }}>Token 消耗</span>\n <span style={{ textAlign: 'right' }}>总耗时</span>\n <span style={{ textAlign: 'center' }}>运行状态</span>\n <span />\n </div>\n {analytics?.sortedSessions.slice(0, 10).map((row: any, idx: number) => {\n const val = row.value\n const isOpen = openSessionId === row.sessionId\n const errCount = val.totals.toolErrors ?? 0\n const retryCount = val.totals.retries ?? 0\n const modelMs = val.totals.modelMs ?? 0\n const toolMs = val.totals.toolMs ?? 0\n const totalMs = modelMs + toolMs\n const modelPct = totalMs > 0 ? Math.round((modelMs / totalMs) * 100) : 50\n const status = errCount > 0\n ? `${errCount} 次报错`\n : retryCount > 0 ? `${retryCount} 次重试` : '顺畅'\n const tokenBarPct = Math.max(4, Math.round(((val.totals.tokens ?? 0) / analytics.maxSessionTokens) * 100))\n return (\n <div key={row.sessionId} className={`${css.sessionItemRow} ${isOpen ? css.sessionItemOpen : ''}`}>\n <button type=\"button\" className={css.sessionItemHead} onClick={() => setOpenSessionId(isOpen ? null : row.sessionId)}>\n <span className={css.sessionIdTag} title={row.sessionId}>\n <strong className={css.tableRankNum}>#{idx + 1}</strong> {row.sessionId.length > 12 ? `${row.sessionId.slice(0, 6)}…${row.sessionId.slice(-3)}` : row.sessionId}\n </span>\n <span className={css.sessionModelCell} title={val.models?.[0]?.model}>{val.models?.[0]?.model ?? '未标注'}</span>\n <div className={css.sessionTokenCell}>\n <span>{fmtCompact(val.totals.tokens)}</span>\n <div className={css.sessionTokenBar} style={{ width: `${tokenBarPct}%` }} />\n </div>\n <span style={{ textAlign: 'right' }}>{Math.round(totalMs / 1000)} 秒</span>\n <span style={{ textAlign: 'center' }} className={errCount > 0 ? css.statusBad : retryCount > 0 ? css.statusWarn : css.statusOk}>{status}</span>\n <span className={css.arrowIcon}>›</span>\n </button>\n {isOpen ? (\n <div className={css.sessionItemDrawer}>\n <div className={css.drawerTitle}>耗时构成下钻:模型响应 vs 本地工具</div>\n <div className={css.drawerBarTrack}>\n <div className={css.drawerSliceModel} style={{ width: `${modelPct}%` }} />\n <div className={css.drawerSliceTool} style={{ width: `${100 - modelPct}%` }} />\n </div>\n <div className={css.drawerMetaRow}>\n <span>模型 {Math.round(modelMs / 1000)} 秒 (首响应均值 {val.totals.firstSamples ? (val.totals.firstMs / val.totals.firstSamples / 1000).toFixed(1) : 0}s)</span>\n <span>工具 {Math.round(toolMs / 1000)} 秒 · {val.totals.tools} 次执行</span>\n <span>缓存命中率 {val.totals.input + val.totals.cacheRead > 0 ? Math.round((val.totals.cacheRead / (val.totals.input + val.totals.cacheRead)) * 100) : 0}%</span>\n </div>\n </div>\n ) : null}\n </div>\n )\n })}\n </div>\n ) : (\n <div className={css.emptyScan}>暂无已缓存的对话统计。</div>\n )}\n </div>\n\n <details className={css.settingsDrawer}>\n <summary className={css.settingsSummary}>⚙ 高级报警阈值设置 (默认开箱即用,无需频繁调整)</summary>\n <div className={css.settingsDrawerContent}>\n <label className={css.settingInlineItem}>\n <span>等多久没字算卡顿:</span>\n <input type=\"number\" min={5} max={300} className={css.settingsMiniInput} value={silence}\n onChange={e => setSilence(Number(e.target.value))} />\n <span>秒</span>\n </label>\n <label className={css.settingInlineItem}>\n <span>单次推导思考超时:</span>\n <input type=\"number\" min={10} max={600} className={css.settingsMiniInput} value={reasoning}\n onChange={e => setReasoning(Number(e.target.value))} />\n <span>秒</span>\n </label>\n <button type=\"button\" className={css.settingsMiniSaveBtn} onClick={save}>{saved ? '已保存 ✓' : '保存'}</button>\n </div>\n </details>\n </div>\n )\n}\n","import type { WorkGroup, WorkStatus, WorkTurn } from '../observation/fold.ts'\n\n/** Overview progress is deliberately separate from execution evidence status. */\nexport type OverviewState = 'active' | 'current' | 'waiting' | 'failure' | 'interrupted' | 'settled' | 'partial'\n\nexport const OVERVIEW_STATE_LABEL: Readonly<Record<OverviewState, string>> = Object.freeze({\n active: '进行中',\n current: '当前',\n waiting: '等待你',\n failure: '有失败记录',\n interrupted: '已中断',\n settled: '已结束',\n partial: '数据不完整',\n})\n\n/** Project evidence status into the one question overview markers answer: where should the user look? */\nexport function overviewStateOf(status: WorkStatus, isLatest: boolean): OverviewState {\n if (status === 'waiting') return 'waiting'\n if (status === 'failure') return 'failure'\n if (status === 'interrupted') return 'interrupted'\n if (status === 'running') return 'active'\n if (status === 'unknown') return 'partial'\n return isLatest ? 'current' : 'settled'\n}\n\nexport function groupOverviewSummary(group: WorkGroup): string {\n return group.executionCount > 1 ? `${group.executionCount} 次执行` : ''\n}\n\nexport function turnOverviewSummary(turn: WorkTurn): string {\n const executionCount = turn.groups.reduce((sum, group) => sum + group.executionCount, 0)\n return [\n `${turn.groups.length} 个阶段`,\n executionCount > 0 ? `${executionCount} 次执行` : null,\n ].filter((part): part is string => part !== null).join(' · ')\n}\n\nexport function turnNeedsDefaultDisclosure(state: OverviewState, isLatest: boolean): boolean {\n return isLatest || state === 'active' || state === 'waiting' || state === 'partial'\n}\n","import type { ConversationNode } from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type { WorkGroup, WorkItem, WorkPicture, WorkStep, WorkTurn } from './fold.ts'\n\n/** A measured decode rate or an explicit absence of enough source evidence. */\nexport type DecodeThroughput =\n | {\n kind: 'measured'\n decodeMs: number\n outputTokens: number\n tokensPerSecond: number\n }\n | { kind: 'unavailable' }\n\n/** Performance evidence correlated to one visible Turn. */\nexport interface TurnPerformance {\n /** Sum of step/start → assistant/message intervals carrying recorded timing. */\n modelMs: number | null\n /** Sum of tool/call → tool/result intervals represented by this Turn. */\n toolMs: number | null\n /** Lowest-step request dispatch → first non-empty token delta. */\n ttftMs: number | null\n /** Output tokens divided only by first-token → message decode time. */\n throughput: DecodeThroughput\n}\n\n/** A trustworthy wall-clock reading or a lower bound caused by a clipped start. */\nexport type ElapsedReading =\n | { kind: 'exact'; durationMs: number }\n | { kind: 'lower-bound'; durationMs: number }\n | { kind: 'unavailable' }\n\n/** Whole-session wall-clock evidence for the complete history or current loaded window. */\nexport type SessionTiming =\n | { kind: 'unavailable' }\n | {\n kind: 'measured'\n coverage: 'complete' | 'partial'\n startTime: number\n endTime: number\n elapsedMs: number\n activeTurnMs: number\n betweenTurnMs: number\n }\n\ninterface TurnFold {\n firstStep: number\n firstStepTtftMs: number | null\n modelMs: number\n modelSampled: boolean\n decodeMs: number\n outputTokens: number\n decodeSampled: boolean\n}\n\nfunction outputTokensOf(usage: unknown): number | null {\n if (typeof usage !== 'object' || usage === null || !('outputTokens' in usage)) return null\n const value = usage.outputTokens\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : null\n}\n\nfunction toolDurationOf(turn: WorkTurn): number | null {\n let durationMs = 0\n let sampled = false\n for (const group of turn.groups) {\n for (const item of group.items) {\n if (item.source !== 'tool' || item.durationMs === null) continue\n durationMs += item.durationMs\n sampled = true\n }\n }\n return sampled ? durationMs : null\n}\n\nfunction foldAssistantNodes(nodes: readonly ConversationNode[]): Map<number, TurnFold> {\n const folds = new Map<number, TurnFold>()\n for (const node of nodes) {\n if (node.kind !== 'assistant') continue\n const timing = node.timing\n const ttftMs = timing !== undefined && timing.stepStartTime !== null && timing.firstTokenTime !== null\n ? Math.max(0, timing.firstTokenTime - timing.stepStartTime)\n : null\n const modelMs = timing !== undefined && timing.stepStartTime !== null\n ? Math.max(0, timing.completedTime - timing.stepStartTime)\n : null\n const decodeMs = timing !== undefined && timing.firstTokenTime !== null\n ? Math.max(0, timing.completedTime - timing.firstTokenTime)\n : null\n const outputTokens = outputTokensOf(node.usage)\n\n let fold = folds.get(node.turn)\n if (fold === undefined) {\n fold = {\n firstStep: node.step,\n firstStepTtftMs: ttftMs,\n modelMs: 0,\n modelSampled: false,\n decodeMs: 0,\n outputTokens: 0,\n decodeSampled: false,\n }\n folds.set(node.turn, fold)\n } else if (node.step < fold.firstStep) {\n fold.firstStep = node.step\n fold.firstStepTtftMs = ttftMs\n }\n\n if (modelMs !== null) {\n fold.modelMs += modelMs\n fold.modelSampled = true\n }\n if (decodeMs !== null && outputTokens !== null) {\n fold.decodeMs += decodeMs\n fold.outputTokens += outputTokens\n fold.decodeSampled = true\n }\n }\n return folds\n}\n\n/**\n * Correlate durable assistant timing/usage with Watcher's occurrence-preserving Turns.\n * Missing timing or provider usage stays unavailable; this function never estimates it.\n */\nexport function deriveTurnPerformance(\n nodes: readonly ConversationNode[],\n turns: readonly WorkTurn[],\n): ReadonlyMap<number, TurnPerformance> {\n const assistantFolds = foldAssistantNodes(nodes)\n const performance = new Map<number, TurnPerformance>()\n\n for (const turn of turns) {\n const fold = assistantFolds.get(turn.turn)\n const throughput: DecodeThroughput = fold !== undefined && fold.decodeSampled && fold.decodeMs > 0\n ? {\n kind: 'measured',\n decodeMs: fold.decodeMs,\n outputTokens: fold.outputTokens,\n tokensPerSecond: fold.outputTokens / (fold.decodeMs / 1000),\n }\n : { kind: 'unavailable' }\n performance.set(turn.turn, {\n modelMs: fold?.modelSampled === true ? fold.modelMs : null,\n toolMs: toolDurationOf(turn),\n ttftMs: fold?.firstStepTtftMs ?? null,\n throughput,\n })\n }\n\n return performance\n}\n\nfunction itemEndTime(item: WorkItem): number {\n return item.resultTime ?? item.time\n}\n\nfunction observedTurnRange(\n turn: WorkTurn,\n live: boolean,\n now: number,\n): { startTime: number; endTime: number; exactBounds: boolean } | null {\n const items = turn.groups.flatMap(group => group.items)\n const observedStarts = [\n ...turn.groups.flatMap(group => group.startTime === null ? [] : [group.startTime]),\n ...items.map(item => item.time),\n ]\n const observedEnds = [\n ...turn.groups.flatMap(group => group.endTime === null ? [] : [group.endTime]),\n ...items.map(itemEndTime),\n ]\n const fallbackStart = observedStarts.length === 0 ? null : Math.min(...observedStarts)\n const fallbackEnd = observedEnds.length === 0 ? null : Math.max(...observedEnds)\n const startTime = turn.startTime ?? fallbackStart\n const endTime = turn.endTime ?? (live ? now : fallbackEnd)\n if (startTime === null || endTime === null) return null\n return {\n startTime,\n endTime: Math.max(startTime, endTime),\n exactBounds: turn.startTime !== null && (turn.endTime !== null || live),\n }\n}\n\n/** Settled Turn duration, live current duration, or a lower bound for a clipped Turn start. */\nexport function turnElapsedReading(turn: WorkTurn, live: boolean, now: number): ElapsedReading {\n const range = observedTurnRange(turn, live, now)\n if (range === null) return { kind: 'unavailable' }\n return {\n kind: range.exactBounds ? 'exact' : 'lower-bound',\n durationMs: range.endTime - range.startTime,\n }\n}\n\n/** Backward-compatible numeric face for callers that do not need coverage copy. */\nexport function turnElapsedMs(turn: WorkTurn, live: boolean, now: number): number | null {\n const reading = turnElapsedReading(turn, live, now)\n return reading.kind === 'unavailable' ? null : reading.durationMs\n}\n\nfunction boundedElapsed(startTime: number | null, endTime: number | null, live: boolean, now: number): number | null {\n if (startTime === null) return null\n const end = endTime ?? (live ? now : null)\n return end === null ? null : Math.max(0, end - startTime)\n}\n\n/** One phase's wall-clock span from its first Step start to its last Step end. */\nexport function groupElapsedMs(group: WorkGroup, live: boolean, now: number): number | null {\n return boundedElapsed(group.startTime, group.endTime, live, now)\n}\n\n/** One Step's wall-clock span, including model, tools, and in-step waits. */\nexport function stepElapsedMs(step: WorkStep, live: boolean, now: number): number | null {\n return boundedElapsed(step.startTime, step.endTime, live, now)\n}\n\n/** One execution's settled duration or live elapsed interval. */\nexport function itemElapsedMs(item: WorkItem, live: boolean, now: number): number | null {\n return item.durationMs ?? (live ? Math.max(0, now - item.time) : null)\n}\n\nfunction unionDuration(intervals: readonly { startTime: number; endTime: number }[]): number {\n const sorted = [...intervals].sort((left, right) => left.startTime - right.startTime || left.endTime - right.endTime)\n const first = sorted[0]\n if (first === undefined) return 0\n let startTime = first.startTime\n let endTime = first.endTime\n let durationMs = 0\n for (const interval of sorted.slice(1)) {\n if (interval.startTime <= endTime) {\n endTime = Math.max(endTime, interval.endTime)\n continue\n }\n durationMs += Math.max(0, endTime - startTime)\n startTime = interval.startTime\n endTime = interval.endTime\n }\n return durationMs + Math.max(0, endTime - startTime)\n}\n\n/**\n * Decompose the loaded session span into DSH Turn intervals and time between Turns.\n * Partial history is labelled as a window; missing Turn starts use observed work only.\n */\nexport function deriveSessionTiming(picture: WorkPicture, now: number): SessionTiming {\n const latestTurn = picture.turns.at(-1)?.turn ?? null\n const ranges = picture.turns.flatMap((turn) => {\n const live = picture.running && turn.turn === latestTurn\n const range = observedTurnRange(turn, live, now)\n return range === null ? [] : [range]\n })\n if (ranges.length === 0) return { kind: 'unavailable' }\n\n const startTime = Math.min(...ranges.map(range => range.startTime))\n const endTime = picture.running ? Math.max(startTime, now) : Math.max(...ranges.map(range => range.endTime))\n const elapsedMs = Math.max(0, endTime - startTime)\n const activeTurnMs = Math.min(elapsedMs, unionDuration(ranges))\n const coverage = picture.partialHistory || ranges.some(range => !range.exactBounds)\n ? 'partial'\n : 'complete'\n return {\n kind: 'measured',\n coverage,\n startTime,\n endTime,\n elapsedMs,\n activeTurnMs,\n betweenTurnMs: Math.max(0, elapsedMs - activeTurnMs),\n }\n}\n\n/** Whole tokens from ten up, one decimal below, matching DSH's RC8 chat chrome. */\nexport function formatTokensPerSecond(tokensPerSecond: number): string {\n const clamped = Math.max(0, tokensPerSecond)\n return clamped >= 10 ? String(Math.round(clamped)) : String(Math.round(clamped * 10) / 10)\n}\n","import type { WorkItem, WorkStep } from '../observation/fold.ts'\nimport type { ModelStepTrace } from '../observation/model-trace.ts'\n\ntype StepTimelineOccurrence = {\n readonly kind: 'occurrence'\n readonly item: WorkItem\n readonly occurrenceIndex: number\n}\n\nexport type StepTimelineEntry =\n | StepTimelineOccurrence\n | {\n readonly kind: 'model'\n readonly trace: ModelStepTrace\n }\n\n/** Compose the visible rows owned by one authoritative DSH Step. */\nexport function stepTimelineEntries(step: Pick<WorkStep, 'items' | 'model'>): readonly StepTimelineEntry[] {\n const occurrences: StepTimelineOccurrence[] = step.items\n .filter(item => item.source !== 'model')\n .map((item, occurrenceIndex) => ({ kind: 'occurrence', item, occurrenceIndex }))\n\n if (step.model === null) return occurrences\n\n // RC8 opens step/start before it appends the entered user/message records.\n // That lifecycle boundary starts timing, but it is not a causal claim that\n // the model ran before the prompt. Keep only the entered prompt rows ahead\n // of the model; steering queued during a live Step remains after it.\n const firstAgentOccurrence = occurrences.findIndex(entry => entry.item.source !== 'user')\n const modelIndex = firstAgentOccurrence < 0 ? occurrences.length : firstAgentOccurrence\n return [\n ...occurrences.slice(0, modelIndex),\n { kind: 'model', trace: step.model },\n ...occurrences.slice(modelIndex),\n ]\n}\n","export type DisclosureDepth = 'overview' | 'detail'\n\nexport type DisclosureLayer = 'phase' | 'step' | 'cluster' | 'model' | 'reasoning'\n\ntype LayerOverrides = Readonly<Record<DisclosureLayer, Readonly<Record<string, boolean>>>>\n\nexport interface DisclosureState {\n readonly depth: DisclosureDepth\n readonly turns: Readonly<Record<number, boolean>>\n readonly layers: LayerOverrides\n}\n\nfunction emptyLayerOverrides(): LayerOverrides {\n return {\n phase: {},\n step: {},\n cluster: {},\n model: {},\n reasoning: {},\n }\n}\n\nexport function createDisclosureState(depth: DisclosureDepth = 'overview'): DisclosureState {\n return { depth, turns: {}, layers: emptyLayerOverrides() }\n}\n\n/** Overview keeps the automatic Turn policy; detail opens every Turn by default. */\nexport function turnDisclosureOpen(\n state: DisclosureState,\n turn: number,\n overviewDefaultOpen: boolean,\n): boolean {\n return state.turns[turn] ?? (state.depth === 'detail' || overviewDefaultOpen)\n}\n\n/** Overview stops at phase headers; detail opens every nested level by default. */\nexport function layerDisclosureOpen(\n state: DisclosureState,\n layer: DisclosureLayer,\n key: string,\n): boolean {\n return state.layers[layer][key] ?? state.depth === 'detail'\n}\n\nexport function setLayerDisclosure(\n state: DisclosureState,\n layer: DisclosureLayer,\n key: string,\n open: boolean,\n): DisclosureState {\n return {\n ...state,\n layers: {\n ...state.layers,\n [layer]: {\n ...state.layers[layer],\n [key]: open,\n },\n },\n }\n}\n\nexport function toggleTurnDisclosure(\n state: DisclosureState,\n turn: number,\n overviewDefaultOpen: boolean,\n): DisclosureState {\n return {\n ...state,\n turns: {\n ...state.turns,\n [turn]: !turnDisclosureOpen(state, turn, overviewDefaultOpen),\n },\n }\n}\n\nexport function toggleLayerDisclosure(\n state: DisclosureState,\n layer: DisclosureLayer,\n key: string,\n): DisclosureState {\n return setLayerDisclosure(state, layer, key, !layerDisclosureOpen(state, layer, key))\n}\n\n/** Choosing a depth applies it immediately instead of inheriting stale manual folds. */\nexport function chooseDisclosureDepth(depth: DisclosureDepth): DisclosureState {\n return createDisclosureState(depth)\n}\n\n/** Session-specific ids may change, while the user's chosen depth remains useful. */\nexport function resetDisclosureOverrides(state: DisclosureState): DisclosureState {\n return createDisclosureState(state.depth)\n}\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState, type CSSProperties } from 'react'\nimport { createPortal } from 'react-dom'\nimport type {} from '@deepseek-ai/dsh-client-ui-chat/client'\nimport type {} from '@deepseek-ai/dsh-session-stats/client'\nimport {\n DiffBlock,\n IconCheckOutline16,\n IconChevronRightOutline14,\n IconCopyOutline16,\n IconRefreshOutline14,\n JsonTree,\n MarkdownText,\n Pill,\n ReadBlock,\n StateDot,\n TerminalBlock,\n useAnchoredPosition,\n writeClipboard,\n type DiffBlockLabels,\n type JsonTreeLabels,\n type MarkdownLabels,\n type ReadBlockLabels,\n type StateDotState,\n type TerminalBlockLabels,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport { createFollow } from '../hub/follow.ts'\nimport type { CompleteHistoryResult } from '../hub/history.ts'\nimport {\n clusterOutcomeSummary,\n clusterWorkItems,\n type WorkCluster,\n} from '../hub/aggregation.ts'\nimport {\n foldSnapshot,\n mergeObservedPictures,\n type WorkGroup,\n type WorkItem,\n type WorkPresentation,\n type WorkStatus,\n type WorkStep,\n type WorkTurn,\n type WatcherSnapshot,\n} from '../observation/fold.ts'\nimport css from './Watcher.module.css'\nimport { SessionInsights } from './Insights.tsx'\nimport {\n OVERVIEW_STATE_LABEL,\n overviewStateOf,\n turnNeedsDefaultDisclosure,\n turnOverviewSummary,\n} from '../hub/overview.ts'\nimport {\n deriveTurnPerformance,\n formatTokensPerSecond,\n groupElapsedMs,\n itemElapsedMs,\n stepElapsedMs,\n turnElapsedReading,\n type TurnPerformance,\n} from '../observation/performance.ts'\nimport {\n hasReasoningEvidence,\n modelStageMetrics,\n type ModelAttempt,\n type ModelStepTrace,\n} from '../observation/model-trace.ts'\nimport { stepTimelineEntries } from './step-timeline.ts'\nimport {\n chooseDisclosureDepth,\n createDisclosureState,\n layerDisclosureOpen,\n resetDisclosureOverrides,\n setLayerDisclosure,\n toggleLayerDisclosure,\n toggleTurnDisclosure,\n turnDisclosureOpen,\n type DisclosureLayer,\n type DisclosureState,\n} from './disclosure-depth.ts'\n\nexport interface WatcherInjected {\n loadAllHistory: (signal: AbortSignal) => Promise<CompleteHistoryResult>\n}\n\nexport type WatcherProps = PropsRuntime<'conversation.session.header.utilities'> & WatcherInjected\n\ntype DetailTab = 'result' | 'input' | 'raw'\ntype ObservationMode = 'itemized' | 'grouped'\ntype HistoryLoadState =\n | { kind: 'idle' }\n | { kind: 'loading' }\n | { kind: 'complete' }\n | { kind: 'error'; message: string }\n\nconst PANEL_GAP = 8\nconst PANEL_MARGIN = 12\nconst UNPLACED_PANEL_STYLE: CSSProperties = { visibility: 'hidden', left: 0, top: 0 }\nconst MARKDOWN_LABELS: MarkdownLabels = Object.freeze({\n code: Object.freeze({ copyLabel: '复制', copiedLabel: '已复制' }),\n footnotes: '脚注',\n})\nconst TERMINAL_LABELS: TerminalBlockLabels = Object.freeze({\n signal: (signal: string) => `信号 ${signal}`,\n exitCode: (exitCode: number) => `退出码 ${exitCode}`,\n running: '运行中',\n failed: '失败',\n done: '完成',\n copy: '复制',\n copied: '已复制',\n noOutput: '没有输出',\n collapseAria: '收起终端输出',\n collapse: '收起',\n expandAria: (hidden: number) => `展开其余 ${hidden} 行终端输出`,\n expand: (hidden: number) => `展开 ${hidden} 行`,\n})\nconst READ_LABELS: ReadBlockLabels = Object.freeze({\n window: (shown: number, total: number) => `显示 ${shown}/${total} 行`,\n copy: '复制',\n copied: '已复制',\n collapseAria: '收起文件内容',\n expandAria: (hidden: number) => `展开其余 ${hidden} 行文件内容`,\n collapse: '收起',\n expand: (hidden: number) => `展开 ${hidden} 行`,\n})\nconst DIFF_LABELS: DiffBlockLabels = Object.freeze({\n copy: '复制',\n copied: '已复制',\n collapseAria: '收起变更内容',\n expandAria: (hidden: number) => `展开其余 ${hidden} 行变更`,\n collapse: '收起',\n expand: (hidden: number) => `展开 ${hidden} 行`,\n files: (count: number) => `${count} 个文件`,\n})\nconst JSON_LABELS: JsonTreeLabels = Object.freeze({\n copyValue: '复制值',\n copyJson: '复制 JSON',\n copyPath: '复制路径',\n copyPrettyJson: '复制格式化 JSON',\n copyCompactJson: '复制紧凑 JSON',\n copied: '已复制',\n copyFailed: '复制失败',\n collapseNode: '收起节点',\n expandNode: '展开节点',\n copyButtonTitle: (action: string) => action,\n})\n\nconst STATUS_LABEL: Record<WorkStatus, string> = {\n running: '进行中',\n waiting: '等待你',\n success: '成功',\n failure: '失败',\n returned: '已返回',\n interrupted: '已中断',\n unknown: '未知',\n}\n\nfunction dotState(status: WorkStatus): StateDotState | null {\n if (status === 'running') return 'ongoing'\n if (status === 'waiting') return 'warning'\n if (status === 'failure' || status === 'interrupted') return 'error'\n if (status === 'success') return 'done'\n return null\n}\n\nfunction StatusMark({ status, className }: { status: WorkStatus; className?: string | undefined }) {\n const state = dotState(status)\n return state === null\n ? <span className={`${css.neutralDot}${className === undefined ? '' : ` ${className}`}`} data-status={status} aria-hidden=\"true\" />\n : <StateDot state={state} size={10} className={className} />\n}\n\nfunction formatDuration(durationMs: number | null): string | null {\n if (durationMs === null) return null\n if (durationMs < 1000) return `${Math.round(durationMs)} ms`\n const secondsWithDecimal = Math.round(durationMs / 100) / 10\n if (secondsWithDecimal < 60) {\n return `${secondsWithDecimal < 10 ? secondsWithDecimal.toFixed(1) : Math.round(secondsWithDecimal)} s`\n }\n const totalSeconds = Math.round(durationMs / 1000)\n const minutes = Math.floor(totalSeconds / 60)\n const seconds = totalSeconds % 60\n if (minutes >= 60) {\n const hours = Math.floor(minutes / 60)\n return `${hours}h ${minutes % 60}m`\n }\n return `${minutes}m ${seconds}s`\n}\n\ntype TurnDurationDisplay = {\n kind: 'exact' | 'partial'\n value: string\n}\n\nfunction turnDuration(turn: WorkTurn, live: boolean, now: number): TurnDurationDisplay | null {\n const reading = turnElapsedReading(turn, live, now)\n if (reading.kind === 'unavailable') return null\n const duration = formatDuration(reading.durationMs)\n if (duration === null) return null\n return {\n kind: reading.kind === 'exact' ? 'exact' : 'partial',\n value: duration,\n }\n}\n\nfunction useLiveClock(enabled: boolean): number {\n const [now, setNow] = useState(() => Date.now())\n\n useEffect(() => {\n if (!enabled) return\n setNow(Date.now())\n const timer = setInterval(() => setNow(Date.now()), 1000)\n return () => clearInterval(timer)\n }, [enabled])\n\n return now\n}\n\nfunction rawOf(item: WorkItem): string {\n if (item.rawText.trim() !== '') return item.rawText\n try {\n return JSON.stringify(item.rawValue, null, 2) ?? String(item.rawValue)\n } catch {\n return String(item.rawValue)\n }\n}\n\nfunction isJsonValue(value: unknown): value is object | unknown[] {\n return typeof value === 'object' && value !== null\n}\n\nfunction CopyRawButton({ text }: { text: string }) {\n const [copied, setCopied] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n }, [])\n\n const copy = () => {\n void writeClipboard(text).then((ok) => {\n if (!ok) return\n setCopied(true)\n if (timerRef.current !== null) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => setCopied(false), 1500)\n })\n }\n\n return (\n <button type=\"button\" className={css.copyRaw} onClick={copy} aria-label={copied ? '原始数据已复制' : '复制原始数据'}>\n {copied ? <IconCheckOutline16 size={14} /> : <IconCopyOutline16 size={14} />}\n {copied ? '已复制' : '复制'}\n </button>\n )\n}\n\nfunction ResultPresentation({ presentation }: { presentation: WorkPresentation }) {\n switch (presentation.kind) {\n case 'terminal':\n return (\n <TerminalBlock\n command={presentation.command}\n cwd={presentation.cwd ?? undefined}\n output={presentation.output}\n exitCode={presentation.exitCode ?? undefined}\n signal={presentation.signal ?? undefined}\n running={presentation.running}\n maxLines={18}\n labels={TERMINAL_LABELS}\n />\n )\n case 'read':\n return (\n <ReadBlock\n label={presentation.label}\n lang={presentation.lang ?? undefined}\n lines={presentation.lines}\n totalLines={presentation.totalLines}\n maxLines={18}\n labels={READ_LABELS}\n />\n )\n case 'diff':\n return <DiffBlock diffs={presentation.diffs} maxLines={18} labels={DIFF_LABELS} />\n case 'json':\n return <div className={css.jsonSurface}><JsonTree data={presentation.data} label=\"结构化结果\" labels={JSON_LABELS} /></div>\n case 'text':\n return (\n <article className={css.documentResult} data-watcher-document=\"\">\n <MarkdownText text={presentation.text} labels={MARKDOWN_LABELS} />\n </article>\n )\n case 'image':\n return (\n <div className={css.artifactResult}>\n <div className={css.artifactGlyph} aria-hidden=\"true\">▧</div>\n <strong>图片附件</strong>\n <span>附件已保留在本次会话记录中</span>\n {isJsonValue(presentation.attachment)\n ? <div className={css.jsonSurface}><JsonTree data={presentation.attachment} label=\"图片附件信息\" labels={JSON_LABELS} /></div>\n : null}\n </div>\n )\n case 'empty':\n return <div className={css.detailEmpty}>这次执行还没有可显示的结果</div>\n }\n}\n\nfunction preferredItem(group: WorkGroup): WorkItem | null {\n return group.items.find(item => item.status === 'failure' && item.recoveredBy === null)\n ?? group.items.find(item => item.status === 'waiting' || item.status === 'running')\n ?? group.items.at(-1)\n ?? null\n}\n\nfunction groupStatusLabel(group: WorkGroup): string {\n return group.status === 'failure' ? '含失败记录' : STATUS_LABEL[group.status]\n}\n\nfunction itemPattern(item: WorkItem): string | null {\n if (item.retryIndex > 0) return `重试 ${item.retryIndex} 次`\n if (item.iterationIndex > 0) return `迭代第 ${item.iterationIndex + 1} 版`\n if (item.recoveredBy !== null) return '后续已恢复'\n return null\n}\n\nfunction ExecutionInspector({\n group,\n selectedItemId,\n live,\n now,\n onSelectItem,\n onBack,\n}: {\n group: WorkGroup\n selectedItemId: string | null\n live: boolean\n now: number\n onSelectItem: (id: string) => void\n onBack: () => void\n}) {\n const [tab, setTab] = useState<DetailTab>('result')\n const fallback = preferredItem(group)\n const selected = group.items.find(item => item.id === selectedItemId) ?? fallback\n\n useEffect(() => setTab('result'), [group.id, selected?.id])\n\n if (selected === null) return null\n const duration = formatDuration(itemElapsedMs(selected, live && selected.status === 'running', now))\n const groupDuration = formatDuration(groupElapsedMs(group, live, now))\n const raw = rawOf(selected)\n const hasInput = Object.keys(selected.args).length > 0\n const pattern = itemPattern(selected)\n\n return (\n <aside className={css.inspector} aria-label={`${group.title} 的执行详情`} data-ud-check=\"watcher-inspector\" data-ud-role=\"panel\">\n <header className={css.inspectorHeader}>\n <button type=\"button\" className={css.inspectorBack} onClick={onBack} aria-label=\"返回工作路径\">\n <IconChevronRightOutline14 size={13} aria-hidden=\"true\" />\n 工作路径\n </button>\n <div className={css.statusLine} data-status={group.status}>\n <StatusMark status={group.status} />\n <span>{groupStatusLabel(group)}</span>\n <span className={css.location}>\n 对话轮次 {group.turn || '—'} · {group.steps.length} 个步骤{groupDuration === null ? '' : ` · ${groupDuration}`}\n </span>\n </div>\n <h2 className={css.inspectorTitle}>{group.title}</h2>\n <p className={css.inspectorSummary}>{group.subtitle}</p>\n <div className={css.groupSignals} aria-label=\"工作模式\">\n {group.parallelStepCount > 0 ? <span>并行 {group.parallelStepCount} 次</span> : null}\n {group.retryCount > 0 ? <span data-retry=\"\">重试 {group.retryCount} 次</span> : null}\n {group.iterationCount > 0 ? <span>有 {group.iterationCount} 次迭代</span> : null}\n {group.unconfirmedFailureCount > 0 ? <span data-error=\"\">{group.unconfirmedFailureCount} 条失败后未见成功证据</span> : null}\n </div>\n </header>\n\n <div className={css.inspectorBody}>\n <section className={css.executionSection} aria-labelledby={`execution-title-${group.id}`}>\n <div className={css.sectionHeading}>\n <h3 id={`execution-title-${group.id}`}>执行路径</h3>\n <span>{group.items.length} 条记录</span>\n </div>\n <div className={css.executionList}>\n {group.steps.map((step, stepIndex) => {\n const stepLive = live && stepIndex === group.steps.length - 1\n const stepDuration = formatDuration(stepElapsedMs(step, stepLive, now))\n return <div key={step.id} className={css.stepBlock} data-parallel={step.parallel ? '' : undefined}>\n <div className={css.stepHeading}>\n <span>步骤 {step.step || '—'}</span>\n <span className={css.stepSignals}>\n {stepDuration === null ? null : <span className={css.stepDuration}>{stepDuration}</span>}\n {step.parallel ? <span className={css.parallelLabel}>{step.executionCount} 项并行</span> : null}\n </span>\n </div>\n <div className={css.occurrences}>\n {step.items.map((item, itemIndex) => {\n const itemDuration = formatDuration(itemElapsedMs(item, stepLive && item.status === 'running', now))\n return <button\n key={item.id}\n type=\"button\"\n className={css.occurrence}\n data-selected={item.id === selected.id ? '' : undefined}\n data-status={item.status}\n aria-pressed={item.id === selected.id}\n onClick={() => onSelectItem(item.id)}\n >\n <StatusMark status={item.status} className={css.occurrenceDot} />\n <span className={css.occurrenceCopy}>\n <span className={css.occurrenceTitle}>{item.title}</span>\n <span className={css.occurrenceMeta}>\n {item.toolName ?? item.source}\n {step.items.length > 1 ? ` · 分支 ${itemIndex + 1}` : ''}\n {itemPattern(item) === null ? '' : ` · ${itemPattern(item)}`}\n </span>\n </span>\n {itemDuration === null ? null : <span className={css.occurrenceDuration}>{itemDuration}</span>}\n <IconChevronRightOutline14 size={12} className={css.occurrenceChevron} />\n </button>\n })}\n </div>\n </div>\n })}\n </div>\n </section>\n\n <section className={css.detailSection} aria-labelledby={`detail-title-${selected.id}`}>\n <div className={css.detailHeader}>\n <div className={css.detailIdentity}>\n <div className={css.detailStatus} data-status={selected.status}>\n <StatusMark status={selected.status} />\n <span>{STATUS_LABEL[selected.status]}</span>\n {pattern === null ? null : <span className={css.patternLabel}>{pattern}</span>}\n </div>\n <h3 id={`detail-title-${selected.id}`}>{selected.title}</h3>\n <p title={selected.subtitle}>{selected.subtitle || '没有补充说明'}</p>\n </div>\n <dl className={css.metrics}>\n {duration === null ? null : <><dt>耗时</dt><dd>{duration}</dd></>}\n {selected.exitCode === null ? null : <><dt>退出码</dt><dd data-error={selected.exitCode === 0 ? undefined : ''}>{selected.exitCode}</dd></>}\n {selected.signal === null ? null : <><dt>信号</dt><dd data-error=\"\">{selected.signal}</dd></>}\n </dl>\n </div>\n\n <div className={css.tabs} role=\"tablist\" aria-label=\"执行数据\">\n {([\n ['result', '结果'],\n ['input', '输入'],\n ['raw', '原始'],\n ] as const).map(([id, label]) => (\n <button\n key={id}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === id}\n className={css.tab}\n data-active={tab === id ? '' : undefined}\n onClick={() => setTab(id)}\n >\n {label}\n </button>\n ))}\n </div>\n\n <div className={css.tabPanel} role=\"tabpanel\">\n {tab === 'result' ? <ResultPresentation presentation={selected.presentation} /> : null}\n {tab === 'input'\n ? hasInput\n ? <div className={css.jsonSurface}><JsonTree data={selected.args} label=\"执行输入\" labels={JSON_LABELS} /></div>\n : <div className={css.detailEmpty}>这条记录没有工具输入</div>\n : null}\n {tab === 'raw'\n ? (\n <div className={css.rawPanel}>\n <div className={css.rawToolbar}>\n <span>完整原始数据 · 不截断</span>\n <CopyRawButton text={raw} />\n </div>\n <pre>{raw || '没有原始数据'}</pre>\n </div>\n )\n : null}\n </div>\n </section>\n </div>\n <footer className={css.inspectorFooter}>只读观察 · 不会改变 Agent</footer>\n </aside>\n )\n}\n\n/** The pupil scans only while live; the complete eye remains a useful static glyph. */\nfunction IconLivingEye({ size = 17 }: { size?: number }) {\n return (\n <svg\n className={css.eye}\n data-ud-motion=\"watcher-eye-scan\"\n width={size}\n height={size}\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <g className={css.eyeBlink}>\n <path\n className={css.eyeOutline}\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M9 3.25c-3.93 0-7.03 2.88-7.9 5.75.87 2.87 3.97 5.75 7.9 5.75s7.03-2.88 7.9-5.75C16.03 6.13 12.93 3.25 9 3.25Zm0 9.95A4.2 4.2 0 1 1 9 4.8a4.2 4.2 0 0 1 0 8.4Z\"\n />\n <g className={css.eyePupil}>\n <circle cx=\"9\" cy=\"9\" r=\"2.05\" fill=\"currentColor\" />\n <circle cx=\"9.65\" cy=\"8.35\" r=\"0.45\" fill=\"var(--dsw-specific-menu)\" opacity=\"0.9\" />\n </g>\n </g>\n </svg>\n )\n}\n\nfunction groupBadges(group: WorkGroup) {\n return (\n <span className={css.groupBadges} aria-hidden=\"true\">\n {group.parallelStepCount > 0\n ? <span data-kind=\"parallel\">{group.parallelStepCount === 1 ? '并行' : `并行 ${group.parallelStepCount} 组`}</span>\n : null}\n {group.retryCount > 0 ? <span data-kind=\"retry\">重试 {group.retryCount}</span> : null}\n {group.iterationCount > 0 ? <span data-kind=\"iteration\">迭代 {group.iterationCount}</span> : null}\n </span>\n )\n}\n\nfunction showOverviewTag(state: ReturnType<typeof overviewStateOf>): boolean {\n return state === 'waiting' || state === 'failure' || state === 'interrupted' || state === 'partial'\n}\n\nfunction itemMeta(item: WorkItem, { branch, step }: { branch: number | null; step: number | null }): string {\n return [\n step === null ? null : `步骤 ${step || '—'}`,\n item.toolName ?? item.source,\n branch === null ? null : `分支 ${branch}`,\n itemPattern(item),\n ].filter((part): part is string => part !== null && part !== '').join(' · ')\n}\n\nfunction branchNumberOf(step: WorkStep, item: WorkItem): number | null {\n if (!step.parallel) return null\n const index = step.items.findIndex(candidate => candidate.id === item.id)\n return index < 0 ? null : index + 1\n}\n\nfunction clusterBasisLabel(cluster: WorkCluster): string | null {\n if (cluster.executionCount < 2) return null\n if (cluster.basis === 'mutable-target' || cluster.basis === 'shared-target') return '同一目标'\n if (cluster.basis === 'exact-call') return '同一指令'\n return null\n}\n\nfunction reasoningAttemptDuration(attempt: ModelAttempt, now: number): number | null {\n if (attempt.firstReasoningTime === null || attempt.lastReasoningTime === null) return null\n const end = attempt.kind === 'running' && attempt.firstOutputTime === null\n ? now\n : attempt.lastReasoningTime\n return Math.max(0, end - attempt.firstReasoningTime)\n}\n\nfunction reasoningAttemptState(attempt: ModelAttempt): string {\n if (attempt.kind === 'running') return '生成中'\n if (attempt.kind === 'retried') return '已重试'\n if (attempt.kind === 'interrupted') return '已中断'\n return '已完成'\n}\n\ntype ModelStageSegment = {\n key: 'wait' | 'reasoning' | 'output' | 'unattributed'\n label: string\n durationMs: number | null\n unavailableLabel: string\n}\n\nfunction ModelStage({\n trace,\n stepId,\n now,\n open,\n disclosure,\n onToggle,\n onToggleReasoning,\n}: {\n trace: ModelStepTrace\n stepId: string\n now: number\n open: boolean\n disclosure: DisclosureState\n onToggle: () => void\n onToggleReasoning: (key: string) => void\n}) {\n const metrics = modelStageMetrics(trace, now)\n const hasReasoning = hasReasoningEvidence(trace)\n const total = formatDuration(metrics.totalMs)\n const visibleReasoning = formatDuration(metrics.visibleReasoningMs)\n const reasoningAttempts = trace.attempts.filter(attempt => attempt.reasoningText.trim() !== '')\n const summary = [\n total === null ? '时间不完整' : `模型 ${total}`,\n hasReasoning\n ? visibleReasoning === null ? '可见推理已记录' : `可见推理 ${visibleReasoning}`\n : null,\n trace.reasoningTokens === null ? null : `${trace.reasoningTokens.toLocaleString('zh-CN')} 推理 token`,\n metrics.live ? '进行中' : null,\n ].filter((value): value is string => value !== null).join(' · ')\n const segments: ModelStageSegment[] = [\n {\n key: 'wait',\n label: '首响应等待',\n durationMs: metrics.firstResponseMs,\n unavailableLabel: '时间戳不可用',\n },\n {\n key: 'reasoning',\n label: '可见推理',\n durationMs: metrics.visibleReasoningMs,\n unavailableLabel: hasReasoning ? '分段耗时不可用' : '未记录',\n },\n {\n key: 'output',\n label: '输出 / 工具意图',\n durationMs: metrics.outputMs,\n unavailableLabel: '时间戳不可用',\n },\n ...metrics.unattributedMs !== null && metrics.unattributedMs > 0\n ? [{\n key: 'unattributed' as const,\n label: '重试 / 未归因',\n durationMs: metrics.unattributedMs,\n unavailableLabel: '不可用',\n }]\n : [],\n ]\n const measuredSegments = segments.filter((segment): segment is ModelStageSegment & { durationMs: number } => (\n segment.durationMs !== null && segment.durationMs > 0\n ))\n const bodyId = `watcher-model-stage-${stepId}`\n\n return (\n <section className={css.modelStage} data-live={metrics.live ? '' : undefined}>\n <button\n type=\"button\"\n className={css.modelStageToggle}\n aria-expanded={open}\n aria-controls={bodyId}\n title=\"模型阶段只使用 DSH 会话中供应商公开写入的事件\"\n onClick={onToggle}\n >\n <IconChevronRightOutline14 size={11} className={css.modelStageChevron} />\n <span className={css.modelStageGlyph} aria-hidden=\"true\" />\n <span className={css.modelStageCopy}>\n <span className={css.modelStageTitle}>模型阶段</span>\n <span className={css.modelStageSummary}>{summary}</span>\n </span>\n </button>\n\n <div id={bodyId} className={css.modelStageBody} hidden={!open}>\n {measuredSegments.length === 0\n ? null\n : (\n <div className={css.modelStageBar} aria-label=\"模型阶段耗时比例\">\n {measuredSegments.map(segment => (\n <span\n key={segment.key}\n data-segment={segment.key}\n style={{ flexGrow: Math.max(segment.durationMs, 1) }}\n title={`${segment.label} ${formatDuration(segment.durationMs) ?? ''}`}\n />\n ))}\n </div>\n )}\n\n <dl className={css.modelStageLedger}>\n {segments.map(segment => (\n <div key={segment.key} className={css.modelStageMetric}>\n <dt>\n <span className={css.modelStageSwatch} data-segment={segment.key} aria-hidden=\"true\" />\n {segment.label}\n </dt>\n <dd>{formatDuration(segment.durationMs) ?? segment.unavailableLabel}</dd>\n </div>\n ))}\n </dl>\n\n {reasoningAttempts.length === 0\n ? <p className={css.modelStageNote}>本 Step 没有供应商可见推理记录</p>\n : (\n <div className={css.reasoningAttempts}>\n <p className={css.modelStageNote}>仅展示供应商写入 DSH 会话的可见 reasoning;不补写未记录内容。</p>\n {reasoningAttempts.map(attempt => {\n const key = `${stepId}:attempt:${attempt.attempt}`\n const reasoningOpen = layerDisclosureOpen(disclosure, 'reasoning', key)\n const duration = formatDuration(reasoningAttemptDuration(attempt, now))\n const meta = [\n reasoningAttemptState(attempt),\n duration ?? '分段耗时不可用',\n `${attempt.fragments.length} 个流片段`,\n attempt.kind === 'retried' ? `等待重试 ${formatDuration(attempt.retryDelayMs) ?? '—'}` : null,\n ].filter((value): value is string => value !== null).join(' · ')\n return (\n <section key={key} className={css.reasoningDisclosure} data-open={reasoningOpen ? '' : undefined}>\n <button\n type=\"button\"\n className={css.reasoningToggle}\n aria-expanded={reasoningOpen}\n aria-controls={`watcher-reasoning-${key}`}\n onClick={() => onToggleReasoning(key)}\n >\n <IconChevronRightOutline14 size={11} className={css.reasoningChevron} />\n <span className={css.reasoningLabel}>\n {reasoningAttempts.length === 1 ? '推理记录' : `尝试 ${attempt.attempt}`}\n </span>\n <span className={css.reasoningMeta}>{meta}</span>\n </button>\n <article\n id={`watcher-reasoning-${key}`}\n className={css.reasoningBody}\n hidden={!reasoningOpen}\n >\n <MarkdownText text={attempt.reasoningText} labels={MARKDOWN_LABELS} />\n </article>\n </section>\n )\n })}\n </div>\n )}\n </div>\n </section>\n )\n}\n\nfunction OverviewOccurrenceButton({\n item,\n occurrenceNumber,\n branch,\n step,\n live,\n selected,\n now,\n onSelect,\n}: {\n item: WorkItem\n occurrenceNumber: number\n branch: number | null\n step: number | null\n live: boolean\n selected: boolean\n now: number\n onSelect: () => void\n}) {\n const duration = formatDuration(itemElapsedMs(item, live, now))\n const meta = itemMeta(item, { branch, step })\n return (\n <button\n type=\"button\"\n className={css.overviewOccurrence}\n data-selected={selected ? '' : undefined}\n data-current={live ? '' : undefined}\n data-status={item.status}\n data-ud-motion=\"watcher-live-append\"\n aria-current={live ? 'step' : undefined}\n aria-pressed={selected}\n aria-label={`记录 ${occurrenceNumber},${item.title},${meta}${duration === null ? '' : `,耗时 ${duration}`},${STATUS_LABEL[item.status]}`}\n onClick={onSelect}\n >\n <span className={css.overviewOccurrenceIndex}>{String(occurrenceNumber).padStart(2, '0')}</span>\n <span className={css.overviewOccurrenceDotSlot} aria-hidden=\"true\">\n <StatusMark status={item.status} className={css.overviewOccurrenceDot} />\n </span>\n <span className={css.overviewOccurrenceCopy}>\n <span className={css.overviewOccurrenceTitle}>{item.title}</span>\n <span className={css.overviewOccurrenceMeta}>{meta}</span>\n </span>\n {duration === null ? null : <span className={css.overviewOccurrenceDuration}>{duration}</span>}\n <IconChevronRightOutline14 size={12} className={css.overviewOccurrenceChevron} />\n </button>\n )\n}\n\nfunction PhaseOverview({\n group,\n isNow,\n running,\n now,\n selectedGroup,\n selectedItemId,\n observationMode,\n open,\n disclosure,\n onToggle,\n onToggleLayer,\n onToggleReasoning,\n onSelectItem,\n}: {\n group: WorkGroup\n isNow: boolean\n running: boolean\n now: number\n selectedGroup: boolean\n selectedItemId: string | null\n observationMode: ObservationMode\n open: boolean\n disclosure: DisclosureState\n onToggle: () => void\n onToggleLayer: (layer: DisclosureLayer, key: string) => void\n onToggleReasoning: (key: string, modelKey: string) => void\n onSelectItem: (item: WorkItem) => void\n}) {\n const phaseState = overviewStateOf(group.status, isNow)\n const phaseDuration = formatDuration(groupElapsedMs(group, isNow && running, now))\n const phaseSummary = [\n `${group.steps.length} 个步骤`,\n `${group.executionCount} 次执行`,\n phaseDuration,\n ].filter((part): part is string => part !== null).join(' · ')\n const latestItemId = group.items.at(-1)?.id ?? null\n const clusters = clusterWorkItems(group.items.filter(item => item.source !== 'model'))\n const modelSteps = group.steps.filter((step): step is WorkStep & { model: ModelStepTrace } => step.model !== null)\n const groupedModelsKey = `${group.id}:model-list`\n const groupedModelsOpen = layerDisclosureOpen(disclosure, 'model', groupedModelsKey)\n\n return (\n <section\n className={css.phase}\n data-selected={selectedGroup ? '' : undefined}\n data-now={isNow ? '' : undefined}\n data-overview-state={phaseState}\n aria-label={`${group.title},${phaseSummary},${OVERVIEW_STATE_LABEL[phaseState]}`}\n >\n <header className={css.phaseHeader}>\n <button\n type=\"button\"\n className={css.phaseToggle}\n aria-expanded={open}\n aria-controls={`watcher-phase-body-${group.id}`}\n aria-label={`${group.title},${phaseSummary},${open ? '收起阶段' : '展开阶段'}`}\n onClick={onToggle}\n >\n <span className={css.phaseMarker} data-state={phaseState} aria-hidden=\"true\" />\n <IconChevronRightOutline14 size={12} className={css.phaseChevron} />\n <span className={css.phaseCopy}>\n <span className={css.phaseTitleLine}>\n <span className={css.phaseTitle} data-watcher-group-title=\"\">{group.title}</span>\n {groupBadges(group)}\n {showOverviewTag(phaseState)\n ? <span className={css.overviewTag} data-state={phaseState}>{OVERVIEW_STATE_LABEL[phaseState]}</span>\n : null}\n </span>\n <span className={css.phaseMeta}>{phaseSummary}</span>\n </span>\n </button>\n </header>\n\n <div id={`watcher-phase-body-${group.id}`} hidden={!open}>\n {observationMode === 'itemized'\n ? (\n <div className={css.stepTimeline} data-observation-mode=\"itemized\">\n {group.steps.map(step => {\n const stepLive = isNow && running && step.items.some(item => item.id === latestItemId && item.status === 'running')\n const stepDuration = formatDuration(stepElapsedMs(step, stepLive, now))\n const stepOpen = layerDisclosureOpen(disclosure, 'step', step.id)\n const modelMetrics = step.model === null ? null : modelStageMetrics(step.model, now)\n const modelDuration = formatDuration(modelMetrics?.totalMs ?? null)\n const showStepTotal = stepDuration !== null && stepDuration !== modelDuration\n const modelOpen = layerDisclosureOpen(disclosure, 'model', step.id)\n const timelineEntries = stepTimelineEntries(step)\n return (\n <section\n key={step.id}\n className={css.overviewStep}\n data-current={stepLive ? '' : undefined}\n data-parallel={step.parallel ? '' : undefined}\n >\n <header className={css.overviewStepHeader}>\n <button\n type=\"button\"\n className={css.stepToggle}\n aria-expanded={stepOpen}\n aria-controls={`watcher-step-body-${step.id}`}\n aria-label={`步骤 ${step.step || '—'},${step.executionCount} 次执行${stepDuration === null ? '' : `,耗时 ${stepDuration}`},${stepOpen ? '收起步骤' : '展开步骤'}`}\n onClick={() => onToggleLayer('step', step.id)}\n >\n <IconChevronRightOutline14 size={11} className={css.stepChevron} />\n <span className={css.overviewStepLabel}>步骤 {step.step || '—'}</span>\n <span className={css.overviewStepSignals}>\n {step.executionCount > 0 ? <span>{step.executionCount} 次</span> : null}\n {step.parallel ? <span className={css.parallelLabel}>{step.executionCount} 项并行</span> : null}\n {modelDuration === null ? null : <span>模型 {modelDuration}</span>}\n {showStepTotal ? <span>总 {stepDuration}</span> : null}\n </span>\n </button>\n </header>\n <div id={`watcher-step-body-${step.id}`} className={css.overviewOccurrences} hidden={!stepOpen}>\n {timelineEntries.map(entry => {\n if (entry.kind === 'model') {\n return (\n <ModelStage\n key={`model:${step.id}`}\n trace={entry.trace}\n stepId={step.id}\n now={now}\n open={modelOpen}\n disclosure={disclosure}\n onToggle={() => onToggleLayer('model', step.id)}\n onToggleReasoning={key => onToggleReasoning(key, step.id)}\n />\n )\n }\n\n const item = entry.item\n return (\n <OverviewOccurrenceButton\n key={item.id}\n item={item}\n occurrenceNumber={group.items.findIndex(candidate => candidate.id === item.id) + 1}\n branch={step.parallel ? entry.occurrenceIndex + 1 : null}\n step={null}\n live={stepLive && item.id === latestItemId && item.status === 'running'}\n selected={selectedGroup && selectedItemId === item.id}\n now={now}\n onSelect={() => onSelectItem(item)}\n />\n )\n })}\n </div>\n </section>\n )\n })}\n </div>\n )\n : (\n <div className={css.analysisClusters} data-observation-mode=\"grouped\">\n {modelSteps.length === 0\n ? null\n : (\n <section className={css.groupedModelStages} data-open={groupedModelsOpen ? '' : undefined}>\n <button\n type=\"button\"\n className={css.groupedModelToggle}\n aria-expanded={groupedModelsOpen}\n aria-controls={`watcher-grouped-models-${group.id}`}\n onClick={() => onToggleLayer('model', groupedModelsKey)}\n >\n <IconChevronRightOutline14 size={11} className={css.groupedModelChevron} />\n <span>\n <strong>模型阶段汇总</strong>\n <small>{modelSteps.length} 个 Step · 按 Step 保留,不合并推理</small>\n </span>\n </button>\n <div\n id={`watcher-grouped-models-${group.id}`}\n className={css.groupedModelList}\n hidden={!groupedModelsOpen}\n >\n {modelSteps.map(step => {\n const modelOpen = layerDisclosureOpen(disclosure, 'model', step.id)\n return (\n <div key={step.id} className={css.groupedModelStep}>\n <span className={css.groupedModelStepLabel}>步骤 {step.step || '—'}</span>\n <ModelStage\n trace={step.model}\n stepId={`${step.id}:grouped`}\n now={now}\n open={modelOpen}\n disclosure={disclosure}\n onToggle={() => onToggleLayer('model', step.id)}\n onToggleReasoning={key => onToggleReasoning(key, step.id)}\n />\n </div>\n )\n })}\n </div>\n </section>\n )}\n {clusters.map(cluster => {\n if (cluster.executionCount === 1) {\n const item = cluster.items[0]\n const sourceStep = group.steps.find(step => step.items.some(candidate => candidate.id === item.id))\n const branch = sourceStep === undefined ? null : branchNumberOf(sourceStep, item)\n return (\n <div key={cluster.id} className={css.analysisSingleton}>\n <OverviewOccurrenceButton\n item={item}\n occurrenceNumber={group.items.findIndex(candidate => candidate.id === item.id) + 1}\n branch={branch}\n step={item.step}\n live={isNow && running && item.id === latestItemId && item.status === 'running'}\n selected={selectedGroup && selectedItemId === item.id}\n now={now}\n onSelect={() => onSelectItem(item)}\n />\n </div>\n )\n }\n const clusterOpen = layerDisclosureOpen(disclosure, 'cluster', cluster.id)\n const basisLabel = clusterBasisLabel(cluster)\n const outcome = clusterOutcomeSummary(cluster)\n const clusterMeta = [\n basisLabel,\n `${cluster.executionCount} 次执行`,\n `${cluster.stepCount} 个步骤`,\n outcome,\n ].filter((part): part is string => part !== null && part !== '').join(' · ')\n return (\n <section key={cluster.id} className={css.analysisCluster} data-open={clusterOpen ? '' : undefined}>\n <button\n type=\"button\"\n className={css.analysisClusterToggle}\n aria-expanded={clusterOpen}\n aria-controls={`watcher-cluster-body-${cluster.id}`}\n aria-label={`${cluster.title},${clusterMeta},${clusterOpen ? '收起同类执行' : '展开同类执行'}`}\n onClick={() => onToggleLayer('cluster', cluster.id)}\n >\n <IconChevronRightOutline14 size={11} className={css.analysisClusterChevron} />\n <span className={css.analysisClusterDotSlot} aria-hidden=\"true\">\n <StatusMark status={cluster.latestStatus} className={css.analysisClusterDot} />\n </span>\n <span className={css.analysisClusterCopy}>\n <span className={css.analysisClusterTitle}>{cluster.title}</span>\n <span className={css.analysisClusterMeta}>{clusterMeta}</span>\n </span>\n {cluster.executionCount > 1\n ? <span className={css.analysisClusterCount}>×{cluster.executionCount}</span>\n : null}\n </button>\n <div\n id={`watcher-cluster-body-${cluster.id}`}\n className={css.analysisClusterItems}\n hidden={!clusterOpen}\n >\n {cluster.items.map(item => {\n const sourceStep = group.steps.find(step => step.items.some(candidate => candidate.id === item.id))\n const branch = sourceStep === undefined ? null : branchNumberOf(sourceStep, item)\n return (\n <OverviewOccurrenceButton\n key={item.id}\n item={item}\n occurrenceNumber={group.items.findIndex(candidate => candidate.id === item.id) + 1}\n branch={branch}\n step={item.step}\n live={isNow && running && item.id === latestItemId && item.status === 'running'}\n selected={selectedGroup && selectedItemId === item.id}\n now={now}\n onSelect={() => onSelectItem(item)}\n />\n )\n })}\n </div>\n </section>\n )\n })}\n </div>\n )}\n </div>\n </section>\n )\n}\n\n/** Native session-header utility: exact work picture, typed evidence, no steering. */\nexport function Watcher(props: WatcherProps) {\n const conversation = props.useConversation(state => state)\n const chat = conversation?.views?.get('chat')\n if (chat === undefined) return <span role=\"status\">Watcher 正在等待会话记录…</span>\n return <ReadyWatcher {...props} chat={chat} views={conversation.views} />\n}\n\nfunction ReadyWatcher({\n useSession,\n useSessionPendingInteraction,\n useProjection,\n sessionId,\n loadAllHistory,\n chat,\n views,\n}: WatcherProps & Pick<WatcherSnapshot, 'chat' | 'views'>) {\n const sessionSnapshot = useSession(state => state)\n const pending = useSessionPendingInteraction(state => state.get(sessionId))\n const snapshot = useMemo<WatcherSnapshot>(() => ({\n views,\n chat,\n nodes: chat.legacy.nodes,\n turnTimings: chat.legacy.turnTimings,\n runningCalls: chat.legacy.runningCalls,\n pending: pending === undefined ? [] : [pending],\n blank: sessionSnapshot.blank,\n running: sessionSnapshot.running,\n hasMore: sessionSnapshot.hasMore,\n }), [chat, views, pending, sessionSnapshot.blank, sessionSnapshot.hasMore, sessionSnapshot.running])\n const running = snapshot.running\n const wholeSessionStats = useProjection('sessionStats')\n const wholeSessionInsights = useProjection('watcherInsights')\n const snapshotPicture = useMemo(() => foldSnapshot(snapshot, { running }), [snapshot, running])\n const observedRef = useRef<{ sessionId: string; picture: typeof snapshotPicture } | null>(null)\n const picture = useMemo(() => {\n const previous = observedRef.current?.sessionId === sessionId\n ? observedRef.current.picture\n : null\n const next = previous === null ? snapshotPicture : mergeObservedPictures(previous, snapshotPicture)\n observedRef.current = { sessionId, picture: next }\n return next\n }, [sessionId, snapshotPicture])\n const performanceByTurn = useMemo(\n () => deriveTurnPerformance(snapshot.nodes, picture.turns),\n [snapshot.nodes, picture.turns],\n )\n const lastGroup = picture.nodes.at(-1)\n const lastGroupId = lastGroup?.id ?? null\n const lastItem = lastGroup?.items.at(-1)\n const latestActivityKey = lastItem === undefined\n ? lastGroupId\n : `${lastGroupId}:${lastItem.id}:${lastItem.seq}:${lastItem.status}:${lastItem.resultSeq ?? 'open'}:${lastItem.resultTime ?? 'open'}`\n const [open, setOpen] = useState(false)\n const [ui, setUi] = useState(() => ({ follow: true, unread: 0, selectedId: null as string | null }))\n const [selectedItemId, setSelectedItemId] = useState<string | null>(null)\n const [observationMode, setObservationMode] = useState<ObservationMode>('itemized')\n const [disclosure, setDisclosure] = useState(createDisclosureState)\n const [historyLoad, setHistoryLoad] = useState<HistoryLoadState>({ kind: 'idle' })\n const now = useLiveClock(open && picture.running)\n const followRef = useRef(createFollow())\n const rootRef = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const panelRef = useRef<HTMLDivElement>(null)\n const railRef = useRef<HTMLDivElement>(null)\n const programmaticScrollRef = useRef(false)\n const historyAbortRef = useRef<AbortController | null>(null)\n const panelPosition = useAnchoredPosition({\n open,\n anchorRef: triggerRef,\n panelRef,\n gap: PANEL_GAP,\n margin: PANEL_MARGIN,\n })\n\n // The panel is portaled out of the conversation header so it can sit above\n // the sticky composer and every shell column. Outside dismissal therefore\n // has to test the in-place trigger and the portaled surface independently.\n useEffect(() => {\n if (!open) return\n const closeOutside = (event: PointerEvent) => {\n if (!(event.target instanceof Node)) return\n if (rootRef.current?.contains(event.target) === true) return\n if (panelRef.current?.contains(event.target) === true) return\n setOpen(false)\n }\n const closeOnEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key !== 'Escape') return\n event.preventDefault()\n setOpen(false)\n triggerRef.current?.focus()\n }\n document.addEventListener('pointerdown', closeOutside)\n document.addEventListener('keydown', closeOnEscape)\n return () => {\n document.removeEventListener('pointerdown', closeOutside)\n document.removeEventListener('keydown', closeOnEscape)\n }\n }, [open])\n\n useLayoutEffect(() => {\n historyAbortRef.current?.abort()\n historyAbortRef.current = null\n setHistoryLoad({ kind: 'idle' })\n followRef.current.reset()\n setUi(followRef.current.snapshot())\n setSelectedItemId(null)\n setDisclosure(resetDisclosureOverrides)\n }, [sessionId])\n\n useEffect(() => () => {\n historyAbortRef.current?.abort()\n }, [])\n\n useLayoutEffect(() => {\n setUi(followRef.current.onPicture(picture))\n }, [latestActivityKey])\n\n useLayoutEffect(() => {\n const rail = railRef.current\n if (!rail || !open || !ui.follow) return\n programmaticScrollRef.current = true\n rail.scrollTop = rail.scrollHeight\n const frame = requestAnimationFrame(() => {\n programmaticScrollRef.current = false\n })\n return () => {\n cancelAnimationFrame(frame)\n programmaticScrollRef.current = false\n }\n }, [ui.follow, latestActivityKey, observationMode, open])\n\n const selected = ui.selectedId === null ? undefined : picture.nodes.find(group => group.id === ui.selectedId)\n const latestTurnNumber = picture.turns.at(-1)?.turn ?? null\n const totalTurnCount = Math.max(picture.turnCount, wholeSessionStats?.turns ?? 0)\n const totalStepCount = Math.max(picture.stepCount, wholeSessionStats?.steps ?? 0)\n const historyProgress = totalStepCount > picture.stepCount\n ? `${picture.stepCount}/${totalStepCount} 个步骤`\n : totalTurnCount > picture.turnCount\n ? `${picture.turnCount}/${totalTurnCount} 个对话轮次`\n : `${picture.stepCount} 个步骤已载入`\n const hasEdgeAlert = picture.pendingCount > 0\n || picture.now.status === 'failure'\n || picture.now.status === 'interrupted'\n const summaryState = picture.pendingCount > 0\n ? '等待确认'\n : picture.running\n ? '正在执行'\n : picture.now.status === 'failure'\n ? '执行失败'\n : picture.now.status === 'interrupted'\n ? '已中断'\n : picture.nodes.length > 0 ? '就绪' : '待命'\n const nowLabel = picture.now.label || (picture.nodes.length > 0 ? '执行路径已就绪' : '等待指令')\n\n const selectItem = (group: WorkGroup, item: WorkItem) => {\n setUi(followRef.current.onSelect(group.id))\n setSelectedItemId(item.id)\n }\n\n const onRailScroll = () => {\n if (programmaticScrollRef.current) return\n const rail = railRef.current\n if (rail === null) return\n const atBottom = rail.scrollHeight - rail.scrollTop - rail.clientHeight < 24\n setUi(followRef.current.onScroll({ atBottom }))\n }\n\n const backToLatest = () => {\n programmaticScrollRef.current = true\n setUi(followRef.current.backToLatest())\n }\n\n const pinForDisclosure = () => {\n if (ui.follow) setUi(followRef.current.setFollow(false))\n }\n\n const chooseObservationMode = (mode: ObservationMode) => {\n if (mode === observationMode) return\n if (ui.follow) programmaticScrollRef.current = true\n setObservationMode(mode)\n }\n\n const chooseDepth = (depth: DisclosureState['depth']) => {\n if (depth === disclosure.depth) return\n pinForDisclosure()\n setDisclosure(chooseDisclosureDepth(depth))\n }\n\n const startHistoryLoad = () => {\n if (historyLoad.kind === 'loading' || historyLoad.kind === 'complete') return\n historyAbortRef.current?.abort()\n const controller = new AbortController()\n historyAbortRef.current = controller\n setHistoryLoad({ kind: 'loading' })\n void loadAllHistory(controller.signal).then((result) => {\n if (historyAbortRef.current !== controller) return\n if (result.kind === 'blocked') {\n const message = result.reason === 'busy'\n ? '主会话正在载入历史,请稍后重试'\n : result.reason === 'page-limit'\n ? '历史页数超出安全上限,请分次重试'\n : '历史分页没有继续前进,请重试'\n setHistoryLoad({ kind: 'error', message })\n } else if (result.kind === 'complete') {\n // Keep a short terminal state until React observes the final Session\n // page. This prevents a stale `hasMore` render from starting the loop\n // a second time after the official loader has already reached page 1.\n setHistoryLoad({ kind: 'complete' })\n } else {\n setHistoryLoad({ kind: 'idle' })\n }\n }).catch((error: unknown) => {\n if (historyAbortRef.current !== controller || controller.signal.aborted) return\n setHistoryLoad({\n kind: 'error',\n message: error instanceof Error ? error.message : String(error),\n })\n }).finally(() => {\n if (historyAbortRef.current === controller) historyAbortRef.current = null\n })\n }\n\n useEffect(() => {\n // Full history is an explicit choice. Summary comes from the Host projection.\n if (!open || !snapshot.hasMore || historyLoad.kind !== 'idle') return\n }, [open, snapshot.hasMore, historyLoad.kind, sessionId])\n\n useEffect(() => {\n if (historyLoad.kind !== 'complete' || snapshot.hasMore) return\n setHistoryLoad({ kind: 'idle' })\n }, [historyLoad.kind, snapshot.hasMore])\n\n return (\n <div ref={rootRef} className={css.root} data-dsh-watcher=\"header\">\n <button\n ref={triggerRef}\n type=\"button\"\n className={css.trigger}\n data-open={open ? '' : undefined}\n data-live={picture.running && picture.nodes.length > 0 ? '' : undefined}\n data-alert={hasEdgeAlert ? '' : undefined}\n aria-expanded={open}\n aria-label={`Watcher,${summaryState}`}\n title=\"Watcher\"\n onClick={() => setOpen(value => !value)}\n >\n <IconLivingEye />\n </button>\n\n {open\n ? createPortal(\n <div\n ref={panelRef}\n className={css.menu}\n style={panelPosition ?? UNPLACED_PANEL_STYLE}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label=\"Watcher 工作图\"\n data-dsh-watcher-panel=\"\"\n data-ud-motion=\"watcher-panel-enter\"\n >\n {selected === undefined\n ? null\n : (\n <ExecutionInspector\n group={selected}\n selectedItemId={selectedItemId}\n live={picture.running && selected.id === lastGroupId}\n now={now}\n onSelectItem={setSelectedItemId}\n onBack={() => {\n backToLatest()\n setSelectedItemId(null)\n }}\n />\n )}\n\n <section className={css.workPicture} aria-label=\"Agent 工作路径\" data-ud-check=\"watcher-work-picture\" data-ud-role=\"panel\">\n <header className={css.pictureHeader}>\n <div className={css.nowBlock} aria-live=\"polite\">\n {picture.running || hasEdgeAlert || summaryState !== '就绪' ? (\n <div className={css.eyebrow} data-alert={hasEdgeAlert ? '' : undefined}>\n <span>{summaryState}</span>\n </div>\n ) : null}\n <div className={css.now} title={picture.running ? nowLabel : 'DSH-Watcher'}>\n {picture.running ? nowLabel : 'DSH-Watcher'}\n </div>\n <div className={css.summary}>\n <span>\n {snapshot.hasMore && totalTurnCount > picture.turnCount\n ? `已载入 ${picture.turnCount}/${totalTurnCount} 轮`\n : `${picture.turnCount} 轮`}\n </span>\n <span>\n {snapshot.hasMore && totalStepCount > picture.stepCount\n ? `${picture.stepCount}/${totalStepCount} 步`\n : `${picture.stepCount} 步`}\n </span>\n <span>{picture.actionCount} 次执行</span>\n {snapshot.hasMore || historyLoad.kind === 'loading' || historyLoad.kind === 'error' ? (\n <button\n type=\"button\"\n className={css.loadAllInlineBtn}\n onClick={startHistoryLoad}\n disabled={historyLoad.kind === 'loading'}\n >\n {historyLoad.kind === 'loading' ? '正在补齐历史…' : historyLoad.kind === 'error' ? '重试载入' : '载入全部历史 →'}\n </button>\n ) : null}\n {historyLoad.kind === 'loading' || historyLoad.kind === 'error' ? (\n <span role=\"status\">{historyLoad.kind === 'error' ? historyLoad.message : `已载入 ${historyProgress}`}</span>\n ) : null}\n </div>\n </div>\n <Pill\n className={css.follow}\n active={ui.follow}\n aria-pressed={ui.follow}\n aria-label={ui.follow ? '停止跟随最新工作' : '跟随最新工作'}\n onClick={() => {\n if (!ui.follow) programmaticScrollRef.current = true\n setUi(followRef.current.setFollow(!ui.follow))\n }}\n >\n <IconRefreshOutline14 size={12} />\n {ui.follow ? '自动跟随' : '浏览历史'}\n </Pill>\n </header>\n\n <SessionInsights value={wholeSessionInsights} now={now} running={picture.running} waiting={picture.pendingCount > 0} onEvidence={e => {\n pinForDisclosure()\n setDisclosure(chooseDisclosureDepth('detail'))\n requestAnimationFrame(() => document.getElementById('watcher-turn-' + e.turn)?.scrollIntoView({ block: 'nearest' }))\n }} />\n\n <div className={css.viewToolbar} aria-label=\"路径视图设置\">\n <div className={css.viewControl}>\n <span className={css.viewToolbarLabel}>组织</span>\n <div className={css.viewMode} role=\"group\" aria-label=\"路径组织方式\">\n <button\n type=\"button\"\n data-active={observationMode === 'itemized' ? '' : undefined}\n aria-pressed={observationMode === 'itemized'}\n title=\"按时间顺序展示每个步骤和每次执行\"\n onClick={() => chooseObservationMode('itemized')}\n >\n 逐项\n </button>\n <button\n type=\"button\"\n data-active={observationMode === 'grouped' ? '' : undefined}\n aria-pressed={observationMode === 'grouped'}\n title=\"按同一目标或完全相同的指令归类,展开仍可查看原始执行\"\n onClick={() => chooseObservationMode('grouped')}\n >\n 归类\n </button>\n </div>\n </div>\n <div className={css.viewControl}>\n <span className={css.viewToolbarLabel}>层级</span>\n <div className={css.viewMode} role=\"group\" aria-label=\"路径展开深度\">\n <button\n type=\"button\"\n data-active={disclosure.depth === 'overview' ? '' : undefined}\n aria-pressed={disclosure.depth === 'overview'}\n title=\"展开当前轮次,展示阶段概览;阶段内部保持收起\"\n onClick={() => chooseDepth('overview')}\n >\n 概览\n </button>\n <button\n type=\"button\"\n data-active={disclosure.depth === 'detail' ? '' : undefined}\n aria-pressed={disclosure.depth === 'detail'}\n title=\"展开所有轮次、阶段、步骤、模型与推理记录\"\n onClick={() => chooseDepth('detail')}\n >\n 详情\n </button>\n </div>\n </div>\n </div>\n\n {!ui.follow && ui.unread > 0\n ? (\n <button type=\"button\" className={css.unread} onClick={backToLatest}>\n <IconRefreshOutline14 size={12} />\n {ui.unread} 条新进展 · 查看最新\n </button>\n )\n : null}\n\n {picture.nodes.length === 0\n ? (\n <div className={css.empty}>\n <span className={css.emptyEye} aria-hidden=\"true\"><IconLivingEye size={22} /></span>\n <strong>还没有工作记录</strong>\n <span>第一轮对话开始后,路径会从这里生长</span>\n </div>\n )\n : (\n <div ref={railRef} className={css.railViewport} onScroll={onRailScroll}>\n <div className={css.turns}>\n {picture.turns.map(turn => {\n const isLatestTurn = turn.turn === latestTurnNumber\n const turnState = overviewStateOf(turn.status, isLatestTurn)\n const automaticDefaultOpen = turnNeedsDefaultDisclosure(turnState, isLatestTurn)\n const turnOpen = turnDisclosureOpen(disclosure, turn.turn, automaticDefaultOpen)\n const turnTitle = turn.turn === 0 ? '会话准备' : `对话轮次 ${turn.turn}`\n const turnSummary = turnOverviewSummary(turn)\n const performance = performanceByTurn.get(turn.turn)\n const isLiveTurn = isLatestTurn && picture.running\n const duration = turnDuration(turn, isLiveTurn, now)\n const tokenSpeed = performance?.throughput.kind === 'measured'\n ? `${formatTokensPerSecond(performance.throughput.tokensPerSecond)} tok/s`\n : null\n const durationAria = duration === null\n ? ''\n : duration.kind === 'exact'\n ? `,总耗时 ${duration.value}`\n : `,已记录 ${duration.value},开头未载入`\n const secondaryPerformance = [\n duration?.kind === 'partial' ? '开头未载入' : null,\n tokenSpeed,\n ].filter((value): value is string => value !== null).join(' · ')\n return (\n <section key={turn.turn} className={css.turn} aria-labelledby={`watcher-turn-${turn.turn}`}>\n <header className={css.turnHeader}>\n <h2 id={`watcher-turn-${turn.turn}`}>\n <button\n type=\"button\"\n className={css.turnToggle}\n aria-expanded={turnOpen}\n aria-controls={`watcher-turn-body-${turn.turn}`}\n aria-label={`${turnTitle},${OVERVIEW_STATE_LABEL[turnState]},${turnSummary}${durationAria}${tokenSpeed === null ? '' : `,生成速度 ${tokenSpeed}`},${turnOpen ? '收起轮次' : '展开轮次'}`}\n title={turnOpen ? '收起此轮次;新进展仍会继续更新' : '展开此轮次'}\n onClick={() => {\n pinForDisclosure()\n setDisclosure(current => toggleTurnDisclosure(\n current,\n turn.turn,\n automaticDefaultOpen,\n ))\n }}\n >\n <IconChevronRightOutline14 size={13} className={css.turnChevron} />\n <span className={css.turnCopy}>\n <span className={css.turnTitleLine}>\n <span className={css.turnTitle}>{turnTitle}</span>\n {showOverviewTag(turnState)\n ? <span className={css.overviewTag} data-state={turnState}>{OVERVIEW_STATE_LABEL[turnState]}</span>\n : null}\n </span>\n <span className={css.turnSummary}>{turnSummary}</span>\n </span>\n <span className={css.turnPerformance}>\n <span className={css.turnDuration}>\n {duration === null\n ? OVERVIEW_STATE_LABEL[turnState]\n : duration.kind === 'exact'\n ? `总 ${duration.value}`\n : `已记录 ${duration.value}`}\n </span>\n {secondaryPerformance === '' ? null : <span className={css.turnSpeed}>{secondaryPerformance}</span>}\n </span>\n </button>\n </h2>\n </header>\n <div id={`watcher-turn-body-${turn.turn}`} className={css.turnBody} hidden={!turnOpen}>\n <div className={css.groupRail}>\n <span className={css.railLine} aria-hidden=\"true\" />\n {turn.groups.map(group => {\n const isNow = group.id === lastGroupId\n const selectedGroup = ui.selectedId === group.id\n const phaseOpen = layerDisclosureOpen(disclosure, 'phase', group.id)\n return (\n <PhaseOverview\n key={group.id}\n group={group}\n isNow={isNow}\n running={picture.running}\n now={now}\n selectedGroup={selectedGroup}\n selectedItemId={selectedItemId}\n observationMode={observationMode}\n open={phaseOpen}\n disclosure={disclosure}\n onToggle={() => {\n pinForDisclosure()\n setDisclosure(current => toggleLayerDisclosure(current, 'phase', group.id))\n }}\n onToggleLayer={(layer, key) => {\n pinForDisclosure()\n setDisclosure(current => toggleLayerDisclosure(current, layer, key))\n }}\n onToggleReasoning={(key, modelKey) => {\n pinForDisclosure()\n setDisclosure(current => {\n const reasoningOpen = layerDisclosureOpen(current, 'reasoning', key)\n const withOpenParent = reasoningOpen\n ? current\n : setLayerDisclosure(current, 'model', modelKey, true)\n // Opening a nested reasoning record is explicit reading intent.\n // Keep its parent open when the live model settles and its\n // default changes after a depth switch or live update.\n return toggleLayerDisclosure(withOpenParent, 'reasoning', key)\n })\n }}\n onSelectItem={item => selectItem(group, item)}\n />\n )\n })}\n </div>\n </div>\n </section>\n )\n })}\n </div>\n </div>\n )}\n </section>\n </div>,\n document.body,\n )\n : null}\n </div>\n )\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type { ConversationNodeDefinition } from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport {\n modelTraceEventOf,\n modelTraceEventsOf,\n startModelStepTrace,\n updateModelStepTrace,\n type ModelStepTrace,\n} from '../observation/model-trace.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-conversation/client' {\n interface ConversationStepDataMap {\n /** Provider-exposed model activity retained for one Step. */\n 'dsh-watcher-model-stage': ModelStepTrace\n }\n}\n\nconst modelTraceDefinition: ConversationNodeDefinition<ModelStepTrace> = {\n kind: 'dsh-watcher-model-stage',\n match: (event) => {\n const normalized = modelTraceEventsOf(event)\n const first = normalized[0]\n if (first === undefined) return null\n return {\n id: `${first.turn}:${first.step}`,\n role: first.kind === 'step-start' ? 'start' : 'update',\n }\n },\n start: (_context, match) => {\n const event = modelTraceEventOf(match.event)\n if (event === null || event.kind !== 'step-start') {\n throw new Error('dsh-watcher-model-stage start requires step/start')\n }\n return startModelStepTrace(event)\n },\n update: (context, match) => {\n let state = context.state\n for (const event of modelTraceEventsOf(match.event)) {\n state = updateModelStepTrace(state, event)\n }\n return state\n },\n publication: (match) => {\n if (match.event.type === 'step/start') return 'none'\n if (match.event.type === 'assistant/live-chunk') {\n return match.event.data.chunk.type === 'usage' ? 'none' : 'animation-frame'\n }\n return 'immediate'\n },\n buildLocationData: (context, scope) => {\n if (scope !== 'step' || context.state === undefined) return null\n return {\n kind: 'step',\n turn: context.state.turn,\n step: context.state.step,\n key: 'dsh-watcher-model-stage',\n value: context.state,\n }\n },\n}\n\n/** Register the Step-scoped, read-only model-stage projection. */\nexport function registerModelTraceDefinition(ctx: ClientContext): void {\n ctx.uiConversation.events.register(modelTraceDefinition)\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-chat/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-session/client'\nimport type { SessionId } from '@deepseek-ai/dsh-session/types'\nimport { loadCompleteHistory } from '../hub/history.ts'\nimport { Watcher, type WatcherInjected } from './Watcher.tsx'\nimport { registerModelTraceDefinition } from './model-trace-definition.ts'\nimport { InsightsSettings } from './Insights.tsx'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-api-remotes/client'\n\nexport const name = 'dsh-watcher-client'\nexport const inject = ['slots', 'sessions', 'uiConversation']\n\n/**\n * Native session-header utility. Order 50 sits after Session log (0)\n * and before the files-panel toggle (110). No overlay glyph.\n */\nexport function apply(ctx: ClientContext) {\n registerModelTraceDefinition(ctx)\n ctx.inject(['remote', 'remote.session'], c => {\n c.slots.inject('settings.section', () => c.slots.register({\n name: 'settings.section', id: 'watcher-insights', order: 85,\n label: 'Watcher', inject: () => ({ remote: c.remote }),\n }, InsightsSettings))\n })\n ctx.slots.inject('conversation.session.header.utilities', () => ctx.slots.register({\n name: 'conversation.session.header.utilities',\n id: 'dsh-watcher',\n order: 50,\n label: 'Watcher',\n inject: (sessionId: SessionId): WatcherInjected => {\n // Workspace Host provides ISessions.binding(); keep runtime behavior.\n const session = (ctx.sessions as any).binding?.(sessionId)?.session as\n | { loadOlder: () => Promise<void>; getSnapshot: () => { hasMore: boolean; loadingOlder: boolean } }\n | undefined\n if (session === undefined) throw new Error(`dsh-watcher: session \"${sessionId}\" is unavailable`)\n return {\n loadAllHistory: signal => loadCompleteHistory({\n signal,\n loadOlder: () => session.loadOlder(),\n read: () => {\n const sessionSnapshot = session.getSnapshot()\n const conversation = ctx.uiConversation.binding(sessionId).snapshot.getSnapshot()\n const chat = conversation.views.get('chat')\n if (chat === undefined) throw new Error('dsh-watcher: Chat conversation target is unavailable')\n const firstNode = chat.legacy.nodes[0]\n const firstTurn = chat.timeline.turnOrder[0]\n return {\n hasMore: sessionSnapshot.hasMore,\n loadingOlder: sessionSnapshot.loadingOlder,\n headKey: `${firstTurn ?? 'none'}:${firstNode?.seq ?? 'none'}:${chat.legacy.nodes.length}`,\n }\n },\n }),\n }\n },\n }, Watcher))\n}\n"],"mappings":"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"}