export type TargetIdResolution = | { ok: true; targetId: string } | { ok: false; reason: "not_found" | "ambiguous"; matches?: string[] }; export function resolveTargetIdFromTabs( input: string, tabs: Array<{ targetId: string }>, ): TargetIdResolution { const needle = input.trim(); if (!needle) { return { ok: false, reason: "not_found" }; } const exact = tabs.find((t) => t.targetId === needle); if (exact) { return { ok: true, targetId: exact.targetId }; } const lower = needle.toLowerCase(); const matches = tabs.map((t) => t.targetId).filter((id) => id.toLowerCase().startsWith(lower)); const only = matches.length === 1 ? matches[0] : undefined; if (only) { return { ok: true, targetId: only }; } if (matches.length === 0) { return { ok: false, reason: "not_found" }; } return { ok: false, reason: "ambiguous", matches }; }