fix: show web search queries in progress drafts

This commit is contained in:
Peter Steinberger
2026-05-08 01:37:11 +01:00
parent accf774591
commit 164ecfd7c8
6 changed files with 102 additions and 11 deletions

View File

@@ -280,19 +280,76 @@ function resolveWebSearchDetail(args: unknown): string | undefined {
return undefined;
}
const query = normalizeOptionalString(record.query);
const queries = collectWebSearchQueries(record);
const count =
typeof record.count === "number" && Number.isFinite(record.count) && record.count > 0
? Math.floor(record.count)
: undefined;
: typeof record.max_results === "number" &&
Number.isFinite(record.max_results) &&
record.max_results > 0
? Math.floor(record.max_results)
: typeof record.num_results === "number" &&
Number.isFinite(record.num_results) &&
record.num_results > 0
? Math.floor(record.num_results)
: typeof record.limit === "number" && Number.isFinite(record.limit) && record.limit > 0
? Math.floor(record.limit)
: typeof record.top_k === "number" && Number.isFinite(record.top_k) && record.top_k > 0
? Math.floor(record.top_k)
: undefined;
if (!query) {
if (queries.length === 0) {
return undefined;
}
return count !== undefined ? `for "${query}" (top ${count})` : `for "${query}"`;
const displayedQueries = queries.slice(0, 3).map((query) => `"${query}"`);
const queryText =
queries.length > displayedQueries.length
? `${displayedQueries.join(", ")}`
: displayedQueries.join(", ");
return count !== undefined ? `for ${queryText} (top ${count})` : `for ${queryText}`;
}
function collectWebSearchQueries(record: Record<string, unknown>): string[] {
const queries: string[] = [];
const seen = new Set<string>();
const add = (value: unknown) => {
const normalized = normalizeOptionalString(value);
if (!normalized || seen.has(normalized)) {
return;
}
seen.add(normalized);
queries.push(normalized);
};
add(record.query);
add(record.q);
add(record.search);
add(record.input);
for (const key of ["search_query", "image_query", "queries"]) {
const value = record[key];
if (!Array.isArray(value)) {
continue;
}
for (const entry of value) {
if (typeof entry === "string") {
add(entry);
continue;
}
const entryRecord = asRecord(entry);
if (!entryRecord) {
continue;
}
add(entryRecord.query);
add(entryRecord.q);
add(entryRecord.search);
}
}
return queries;
}
function resolveWebFetchDetail(args: unknown): string | undefined {
const record = asRecord(args);
if (!record) {

View File

@@ -88,6 +88,33 @@ describe("tool display details", () => {
expect(detail).toBe('for "OpenClaw docs" (top 3)');
});
it("formats web_search provider query shapes", () => {
expect(
formatToolDetail(
resolveToolDisplay({
name: "web_search",
args: { q: "Codex OAuth API key", max_results: 5 },
}),
),
).toBe('for "Codex OAuth API key" (top 5)');
expect(
formatToolDetail(
resolveToolDisplay({
name: "web_search",
args: {
search_query: [
{ q: "latest Kimi model" },
{ q: "latest Gemini model" },
{ q: "latest Claude model" },
{ q: "latest OpenAI model" },
],
},
}),
),
).toBe('for "latest Kimi model", "latest Gemini model", "latest Claude model"…');
});
it("summarizes exec commands with context", () => {
const detail = formatToolDetail(
resolveToolDisplay({

View File

@@ -332,6 +332,13 @@ describe("channel-streaming", () => {
args: { command: "sed -n '1,80p' extensions/discord/src/draft-stream.ts" },
}),
).toBe("🛠️ Bash: print lines 1-80 from extensions/discord/src/draft-stream.ts");
expect(
formatChannelProgressDraftLine({
event: "tool",
name: "web_search",
args: { search_query: [{ q: "Codex OAuth API key" }], response_length: "short" },
}),
).toBe('🔎 Web Search: for "Codex OAuth API key"');
expect(
formatChannelProgressDraftLine({
event: "item",