Refine WebUI commands and data skills
This commit is contained in:
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user