diff --git a/mateclaw-ui/src/components/chat/ExecutionDetailDialog.vue b/mateclaw-ui/src/components/chat/ExecutionDetailDialog.vue new file mode 100644 index 00000000..02cfb7d3 --- /dev/null +++ b/mateclaw-ui/src/components/chat/ExecutionDetailDialog.vue @@ -0,0 +1,251 @@ + + + + + + + + diff --git a/mateclaw-ui/src/components/chat/JsonView.vue b/mateclaw-ui/src/components/chat/JsonView.vue new file mode 100644 index 00000000..de1e905c --- /dev/null +++ b/mateclaw-ui/src/components/chat/JsonView.vue @@ -0,0 +1,95 @@ + + + + + + + + diff --git a/mateclaw-ui/src/components/chat/PlanStepsPanel.vue b/mateclaw-ui/src/components/chat/PlanStepsPanel.vue index 38313ec9..38bd1934 100644 --- a/mateclaw-ui/src/components/chat/PlanStepsPanel.vue +++ b/mateclaw-ui/src/components/chat/PlanStepsPanel.vue @@ -1,7 +1,8 @@ @@ -226,11 +260,21 @@ function truncateResult(text: string, max: number): string { color: var(--mc-text-tertiary); } +.plan-step__detail { + flex-shrink: 0; + margin-left: auto; + color: var(--mc-text-quaternary); + cursor: pointer; + transition: color 0.15s; +} +.plan-step__detail:hover { + color: var(--mc-primary); +} + .plan-step__arrow { flex-shrink: 0; color: var(--mc-text-quaternary); transition: transform 0.2s; - margin-left: auto; } .plan-step__arrow.is-open { transform: rotate(180deg); diff --git a/mateclaw-ui/src/components/chat/ToolCallSegment.vue b/mateclaw-ui/src/components/chat/ToolCallSegment.vue index c0d17776..ad6fb4ff 100644 --- a/mateclaw-ui/src/components/chat/ToolCallSegment.vue +++ b/mateclaw-ui/src/components/chat/ToolCallSegment.vue @@ -1,9 +1,10 @@ @@ -245,11 +277,30 @@ const childProgress = computed(() => { border-radius: 3px; } +/* Trailing controls pinned to the right edge as a single group, so the + detail icon and chevron stay together regardless of whether args render. */ +.seg-tool__actions { + flex-shrink: 0; + margin-left: auto; + display: flex; + align-items: center; + gap: 6px; +} + +.seg-tool__detail { + flex-shrink: 0; + color: var(--mc-text-tertiary); + cursor: pointer; + transition: color 0.15s; +} +.seg-tool__detail:hover { + color: var(--mc-primary); +} + .seg-tool__arrow { flex-shrink: 0; color: var(--mc-text-tertiary); transition: transform 0.2s; - margin-left: auto; } .seg-tool__arrow.is-open { transform: rotate(180deg); diff --git a/mateclaw-ui/src/i18n/locales/en-US.ts b/mateclaw-ui/src/i18n/locales/en-US.ts index ea7a16d3..f44e34d7 100644 --- a/mateclaw-ui/src/i18n/locales/en-US.ts +++ b/mateclaw-ui/src/i18n/locales/en-US.ts @@ -95,6 +95,23 @@ export default { interrupted: 'Interrupted', subagentStalled: 'Subagent stalled — no progress', subagentAsync: 'Running in background — result via task_output', + executionPlan: 'Execution Plan', + planDone: 'done', + detail: { + viewDetail: 'View details', + request: 'Request', + response: 'Response', + copy: 'Copy', + copied: 'Copied', + copyFailed: 'Copy failed', + empty: 'No content', + status: { + running: 'In progress', + completed: 'Completed', + error: 'Failed', + pending: 'Pending', + }, + }, expandLines: 'Show more ({hidden} more lines)', collapse: 'Show less', failed: 'Generation failed', diff --git a/mateclaw-ui/src/i18n/locales/zh-CN.ts b/mateclaw-ui/src/i18n/locales/zh-CN.ts index 1b498819..58d7c2b5 100644 --- a/mateclaw-ui/src/i18n/locales/zh-CN.ts +++ b/mateclaw-ui/src/i18n/locales/zh-CN.ts @@ -95,6 +95,23 @@ export default { interrupted: '已中断', subagentStalled: '子 Agent 无进展', subagentAsync: '后台运行中,结果稍后获取', + executionPlan: '执行计划', + planDone: '已完成', + detail: { + viewDetail: '查看详情', + request: '请求参数', + response: '响应输出', + copy: '复制', + copied: '已复制', + copyFailed: '复制失败', + empty: '无内容', + status: { + running: '进行中', + completed: '已完成', + error: '失败', + pending: '待处理', + }, + }, expandLines: '展开(还有 {hidden} 行)', collapse: '收起', failed: '生成失败',