Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 40 additions & 23 deletions lib/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,32 +160,49 @@ window.__ModuleLoader__.load({
}

function extractDiffs(block) {
// PTC 模式:从 argsRaw 动态构建 diffs
// callId 包含 ':code:' 表示这是 run_code 的子调用
if (typeof block.callId === 'string' && block.callId.includes(':code:')) {
// RunningToolCall 的 argsRaw 在 block 上,ToolResultNode 的 argsRaw 在 block.call 上
const argsRaw = block.call ? block.call.argsRaw : block.argsRaw
const name = block.call ? block.call.name : block.name
if (name === 'edit' || name === 'write') {
try {
const args = JSON.parse(argsRaw)
if (args && typeof args === 'object') {
const filePath = args.file_path
if (typeof filePath === 'string' && filePath !== '') {
if (name === 'write' && typeof args.content === 'string') {
return narrowDiffs([{ path: filePath, oldText: null, newText: args.content }])
}
if (name === 'edit' && typeof args.old_string === 'string' && typeof args.new_string === 'string') {
return narrowDiffs([{ path: filePath, oldText: args.old_string || null, newText: args.new_string }])
}
const done = 'kind' in block
// PTC 子调用标记:新版 DSH 用 parentCallId;旧版 callId 含 ':code:',双兼容
const subCall = block.parentCallId !== void 0 ||
(typeof block.callId === 'string' && block.callId.includes(':code:'))

// settled 且非错误:优先取真实应用的 diff(新版 DSH 在 block.meta.diffs,
// 与内置 diffCardModel/appliedDiffs 同构 {path, oldText, newText},含多 hunk)
if (done && !subCall && !block.isError) {
const meta = block.meta
if (meta !== null && typeof meta === 'object' && !Array.isArray(meta)) {
const diffs = meta.diffs
if (Array.isArray(diffs) && diffs.length > 0) {
const n = narrowDiffs(diffs)
if (n !== null) return n
}
}
}

// 子调用 / running / 兜底:从参数意图构建 diff。
// running block 的 argsRaw/name 在 block 顶层,settled 在 block.call 上(防御性双取)
// settled 失败(非子调用)不显示意图 diff,与内置 diffCardModel 一致
if (done && !subCall && block.isError) return null
const argsRaw = (block.call ? block.call.argsRaw : block.argsRaw) ?? ''
const name = block.call ? block.call.name : block.name
if (name === 'edit' || name === 'write') {
try {
const args = JSON.parse(argsRaw)
if (args && typeof args === 'object') {
const filePath = args.file_path
if (typeof filePath === 'string' && filePath !== '') {
if (name === 'write' && typeof args.content === 'string') {
return narrowDiffs([{ path: filePath, oldText: null, newText: args.content }])
}
if (name === 'edit' && typeof args.old_string === 'string' && typeof args.new_string === 'string') {
return narrowDiffs([{ path: filePath, oldText: args.old_string || null, newText: args.new_string }])
}
}
} catch {}
}
}
} catch {}
}
// 标准模式:从 callView 或 resultView 提取 diffs
if (!('kind' in block)) {

// 旧版 DSH(<0.1.x 重构前):callView/resultView.card === 'diff'
if (!done) {
const call = block.callView && block.callView.card === 'diff' ? block.callView : null
return call ? narrowDiffs(call.diffs) : null
}
Expand Down