Refine WebUI commands and data skills

This commit is contained in:
武阳
2026-05-06 19:35:48 +08:00
parent 93a0eb74d7
commit a0da3c2423
13 changed files with 731 additions and 219 deletions
@@ -497,26 +497,39 @@ function collectActivityItems(messages: readonly MessageState[]) {
const id = `${message.id}:${index}`;
if (part.type === "reasoning") {
const status = getPartStatus(message, part);
const summary =
part.text.trim() ||
(status === "running"
? "模型正在整理下一步行动。"
: "思考并执行完成。");
items.push({
id,
kind: "reasoning",
title: status === "running" ? "思考中" : "思考完成",
summary:
part.text.trim() ||
(status === "running"
? "模型正在整理下一步行动。"
: "思考并执行完成。"),
title: reasoningTitle(summary, status),
summary,
status,
});
}
if (part.type === "tool-call") {
const input = stripStageNote(part.args);
const stageNote = getStageNote(part.args);
const argsText = formatToolArgs(input);
if (stageNote) {
items.push({
id: `${id}:stage`,
kind: "reasoning",
title: "阶段说明",
summary: stageNote,
status: getPartStatus(message, part),
});
}
items.push({
id,
kind: "tool",
title: part.toolName,
summary: summarizeTool(message, part),
status: getPartStatus(message, part),
argsText: part.argsText,
argsText,
result: decodeJsonString(part.result),
resultSummary: summarizeToolResult(decodeJsonString(part.result)),
rawResult:
@@ -525,7 +538,7 @@ function collectActivityItems(messages: readonly MessageState[]) {
: formatValue(decodeJsonString(part.result)),
fileLinks: extractLocalPaths(
[
part.argsText,
argsText,
part.result === undefined
? undefined
: formatValue(decodeJsonString(part.result)),
@@ -539,6 +552,42 @@ function collectActivityItems(messages: readonly MessageState[]) {
return items;
}
function getStageNote(value: unknown) {
if (!value || typeof value !== "object" || Array.isArray(value)) return "";
const note = (value as Record<string, unknown>).__claw_stage_note;
return typeof note === "string" ? note.trim() : "";
}
function stripStageNote(value: unknown): unknown {
if (!value || typeof value !== "object" || Array.isArray(value)) return value;
const { __claw_stage_note: _stageNote, ...rest } = value as Record<
string,
unknown
>;
return rest;
}
function formatToolArgs(value: unknown) {
if (value === undefined) return undefined;
if (typeof value === "string") return value;
return JSON.stringify(value ?? {}, null, 2);
}
function reasoningTitle(
text: string,
status: ToolCallMessagePartStatus["type"],
) {
if (status === "running") return "思考中";
const normalized = text.trim();
if (
normalized.startsWith("思考中") ||
normalized.startsWith("思考并执行完成")
) {
return "思考完成";
}
return "阶段说明";
}
function ActivityFileLinks({ paths }: { paths: string[] }) {
return (
<div className="rounded-md border bg-muted/30 px-3 py-2">