refactor: reduce cyclomatic complexity of settings, tool data and layout sanitizers
Add characterization tests first, then split the hot spots into small helpers: - STT/TTS settings updates move to extensions/piagentui-speech-settings.ts (rule tables) - defaultExtractData is split into diff/diagnostic/output extractors - getToolSummaryCategory becomes an ordered rule table (toolSummary.ts) - sanitizePersistedTerminalLayoutMap is split per level - duplicated diff stats helpers are merged into utils/diffStats.ts
This commit is contained in:
1 parent
da09846708
commit
2d2cdf3b19
13 files changed
+962
-404
No files matched your search
@@ -1,6 +1,6 @@
|
||||
import { memo, useEffect, useMemo, useRef, useState } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { diffLines } from 'diff'
|
||||
import { computeDiffStats } from '../../../utils/diffStats'
|
||||
import { ChevronDownIcon, ChevronRightIcon } from '../../../components/Icons'
|
||||
import type { ToolPart } from '../../../types/message'
|
||||
import { useDelayedRender } from '../../../hooks'
|
||||
@@ -203,7 +203,7 @@ export const ToolPartView = memo(function ToolPartView({
|
||||
if (descriptive) {
|
||||
const hasDiffFiles = !!toolData.files?.length
|
||||
// diffStats 可能从 metadata 来,也可能需要从 diff 数据计算
|
||||
const diffStats = toolData.diffStats || computeDiffStatsFromData(toolData)
|
||||
const diffStats = toolData.diffStats || computeDiffStats(toolData)
|
||||
|
||||
return (
|
||||
<div className="group py-0.5">
|
||||
@@ -451,47 +451,6 @@ function isReadableTool(toolName: string): boolean {
|
||||
return READABLE_TOOL_PATTERNS.test(toolName.toLowerCase())
|
||||
}
|
||||
|
||||
/** 从 diff 数据计算 diffStats(当 metadata 没给 diffStats 时用) */
|
||||
function computeDiffStatsFromData(data: {
|
||||
diff?: { before: string; after: string } | string
|
||||
files?: Array<{ before?: string; after?: string; additions?: number; deletions?: number }>
|
||||
}): { additions: number; deletions: number } | undefined {
|
||||
// 多文件
|
||||
if (data.files?.length) {
|
||||
let additions = 0,
|
||||
deletions = 0
|
||||
for (const f of data.files) {
|
||||
if (f.additions !== undefined) additions += f.additions
|
||||
if (f.deletions !== undefined) deletions += f.deletions
|
||||
if (f.additions === undefined && f.before !== undefined && f.after !== undefined) {
|
||||
const s = computeDiffPair(f.before, f.after)
|
||||
additions += s.additions
|
||||
deletions += s.deletions
|
||||
}
|
||||
}
|
||||
return additions || deletions ? { additions, deletions } : undefined
|
||||
}
|
||||
|
||||
// 单个 diff
|
||||
if (data.diff && typeof data.diff === 'object') {
|
||||
const s = computeDiffPair(data.diff.before, data.diff.after)
|
||||
return s.additions || s.deletions ? s : undefined
|
||||
}
|
||||
|
||||
return undefined
|
||||
}
|
||||
|
||||
function computeDiffPair(before: string, after: string): { additions: number; deletions: number } {
|
||||
const changes = diffLines(before, after)
|
||||
let additions = 0,
|
||||
deletions = 0
|
||||
for (const c of changes) {
|
||||
if (c.added) additions += c.count || 0
|
||||
if (c.removed) deletions += c.count || 0
|
||||
}
|
||||
return { additions, deletions }
|
||||
}
|
||||
|
||||
// ============================================
|
||||
// ToolBody - 根据工具类型选择渲染器
|
||||
// ============================================
|
||||
|
||||
Reference in new issue
Block a user