diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index e5fe41c79..8637afe03 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -17,6 +17,9 @@ ### Fixed - Resume Cursor idle-stall turns after completed MCP/todo tool results. The watchdog already closes the Connect stream, so unmarked blocks no longer need the `exec-resolved` marker to continue. +### Fixed + +- Fixed the Web Search Provider Order settings summary showing providers excluded from web search ([#8884](https://github.com/can1357/oh-my-pi/issues/8884)). ## [17.3.7] - 2026-08-17 diff --git a/packages/coding-agent/src/modes/components/settings-selector.ts b/packages/coding-agent/src/modes/components/settings-selector.ts index 7d6f439ac..f18ada5ca 100644 --- a/packages/coding-agent/src/modes/components/settings-selector.ts +++ b/packages/coding-agent/src/modes/components/settings-selector.ts @@ -1168,15 +1168,15 @@ export class SettingsSelectorComponent implements Component { return entries.map(([provider, limit]) => `${provider}: ${limit}`).join(", "); } - #createMultiSelect(def: SettingDef & { type: "multiselect" }, done: (value?: string) => void): Container { - let options = def.options; - if (def.path === "providers.webSearchOrder") { - const excluded: unknown = settings.get("providers.webSearchExclude"); - if (Array.isArray(excluded)) { - options = options.filter(option => !excluded.includes(option.value)); - } - } + #getMultiSelectOptions(def: SettingDef & { type: "multiselect" }) { + if (def.path !== "providers.webSearchOrder") return def.options; + const excluded: unknown = settings.get("providers.webSearchExclude"); + if (!Array.isArray(excluded)) return def.options; + return def.options.filter(option => !excluded.includes(option.value)); + } + #createMultiSelect(def: SettingDef & { type: "multiselect" }, done: (value?: string) => void): Container { + const options = this.#getMultiSelectOptions(def); const current: unknown = settings.get(def.path); const initial = Array.isArray(current) ? current.filter((entry): entry is string => typeof entry === "string") @@ -1196,9 +1196,15 @@ export class SettingsSelectorComponent implements Component { } #formatMultiSelectValue(def: SettingDef & { type: "multiselect" }, value: unknown): string { - const ids = Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === "string") : []; - if (ids.length === 0) return def.ordered ? "default" : "none"; - const labels = ids.map(id => def.options.find(option => option.value === id)?.label ?? id); + const options = this.#getMultiSelectOptions(def); + const labels = Array.isArray(value) + ? value.flatMap(entry => { + if (typeof entry !== "string") return []; + const option = options.find(candidate => candidate.value === entry); + return option ? [option.label] : []; + }) + : []; + if (labels.length === 0) return def.ordered ? "default" : "none"; return def.ordered ? labels.join(" → ") : labels.join(", "); } diff --git a/packages/coding-agent/test/modes/components/settings-multiselect.test.ts b/packages/coding-agent/test/modes/components/settings-multiselect.test.ts index 8d5cb719f..d65d211f2 100644 --- a/packages/coding-agent/test/modes/components/settings-multiselect.test.ts +++ b/packages/coding-agent/test/modes/components/settings-multiselect.test.ts @@ -96,6 +96,32 @@ describe("multiselect settings (array-of-enum)", () => { expect(menu).toContain(secondChoice!.label); }); + it("hides excluded providers from the web search order row summary", () => { + const comp = createSelector(); + settings.set("providers.webSearchOrder", [firstChoice!.value, secondChoice!.value]); + settings.set("providers.webSearchExclude", [firstChoice!.value]); + for (const ch of "web search provider order") comp.handleInput(ch); + + const row = Bun.stripANSI(comp.render(120).join("\n")) + .split("\n") + .find(line => line.includes("Web Search Provider Order")); + expect(row).not.toContain(firstChoice!.label); + expect(row).toContain(secondChoice!.label); + }); + + it("shows the default web search order when every configured provider is excluded", () => { + const comp = createSelector(); + settings.set("providers.webSearchOrder", [firstChoice!.value]); + settings.set("providers.webSearchExclude", [firstChoice!.value]); + for (const ch of "web search provider order") comp.handleInput(ch); + + const row = Bun.stripANSI(comp.render(120).join("\n")) + .split("\n") + .find(line => line.includes("Web Search Provider Order")); + expect(row).not.toContain(firstChoice!.label); + expect(row).toContain("default"); + }); + it("splices the hovered option into the pressed digit's position", () => { const [a, b, c] = SEARCH_PROVIDER_CHOICES; const comp = createSelector();