@@ -38,6 +38,34 @@ export interface GetTopCandidatesParams {
3838 maxCandidates : number ;
3939}
4040
41+ function isAccountManager ( value : unknown ) : value is AccountManager {
42+ return (
43+ typeof value === "object" &&
44+ value !== null &&
45+ "getAccountsSnapshot" in value &&
46+ typeof value . getAccountsSnapshot === "function"
47+ ) ;
48+ }
49+
50+ function isGetTopCandidatesParams ( value : unknown ) : value is GetTopCandidatesParams {
51+ return (
52+ typeof value === "object" &&
53+ value !== null &&
54+ "accountManager" in value &&
55+ isAccountManager ( value . accountManager ) &&
56+ "modelFamily" in value &&
57+ typeof value . modelFamily === "string" &&
58+ "model" in value &&
59+ ( typeof value . model === "string" || value . model === null ) &&
60+ "maxCandidates" in value &&
61+ typeof value . maxCandidates === "number"
62+ ) ;
63+ }
64+
65+ function toProbeError ( error : unknown ) : Error {
66+ return error instanceof Error ? error : new Error ( String ( error ) ) ;
67+ }
68+
4169/**
4270 * Get top N candidates ranked by hybrid score WITHOUT mutating AccountManager state.
4371 * Uses getAccountsSnapshot() and ranks by health + tokens + freshness.
@@ -64,13 +92,19 @@ export function getTopCandidates(
6492 let resolvedMaxCandidates : number | undefined ;
6593
6694 if ( useNamedParams ) {
67- const namedParams = accountManagerOrParams as GetTopCandidatesParams ;
95+ if ( ! isGetTopCandidatesParams ( accountManagerOrParams ) ) {
96+ throw new TypeError ( "getTopCandidates requires accountManager" ) ;
97+ }
98+ const namedParams = accountManagerOrParams ;
6899 resolvedAccountManager = namedParams . accountManager ;
69100 resolvedModelFamily = namedParams . modelFamily ;
70101 resolvedModel = namedParams . model ;
71102 resolvedMaxCandidates = namedParams . maxCandidates ;
72103 } else {
73- resolvedAccountManager = accountManagerOrParams as AccountManager ;
104+ if ( ! isAccountManager ( accountManagerOrParams ) ) {
105+ throw new TypeError ( "getTopCandidates requires accountManager" ) ;
106+ }
107+ resolvedAccountManager = accountManagerOrParams ;
74108 resolvedModelFamily = modelFamily ;
75109 resolvedModel = model ;
76110 resolvedMaxCandidates = maxCandidates ;
@@ -158,7 +192,7 @@ export async function probeAccountsInParallel<T>(
158192 const response = await probeFn ( account , controller . signal ) ;
159193 return { type : "success" , account, response } ;
160194 } catch ( error ) {
161- return { type : "failure" , account, error : error as Error } ;
195+ return { type : "failure" , account, error : toProbeError ( error ) } ;
162196 }
163197 }
164198
0 commit comments