@@ -158,6 +158,27 @@ function coerceBigInt(raw: unknown): bigint | undefined {
158158 if ( typeof raw === "bigint" ) return raw ;
159159 return undefined ;
160160}
161+ async function collectStackUserIdsForIdentities (
162+ callerToken : string ,
163+ identities : ReadonlySet < string > ,
164+ ) : Promise < Set < string > > {
165+ const out = new Set < string > ( ) ;
166+ if ( identities . size === 0 ) return out ;
167+ const { rows } = await sqlQuery ( callerToken , "SELECT * FROM operators" ) ;
168+ for ( const row of rows ) {
169+ const stackUserIdRaw = row . stack_user_id ?? row . stackUserId ;
170+ if ( typeof stackUserIdRaw !== "string" ) continue ;
171+ if ( stackUserIdRaw === "__service__" ) continue ;
172+ const rowJson = JSON . stringify ( row ) . toLowerCase ( ) ;
173+ for ( const identity of identities ) {
174+ if ( rowJson . includes ( identity . toLowerCase ( ) ) ) {
175+ out . add ( stackUserIdRaw ) ;
176+ break ;
177+ }
178+ }
179+ }
180+ return out ;
181+ }
161182
162183/**
163184 * Per-test collector for anything these tests drop into SpacetimeDB so
@@ -198,11 +219,12 @@ export function createCleanupScope(): CleanupScope {
198219 const caller = await mintIdentity ( ) . catch ( ( ) => null ) ;
199220 if ( caller == null ) return ;
200221
222+ const callerStackUserId = `cleanup-${ caller . identity } ` ;
201223 try {
202224 await callReducer ( caller . token , "add_operator" , [
203225 logToken ,
204226 [ `0x${ caller . identity } ` ] ,
205- `__cleanup__- ${ caller . identity } ` ,
227+ callerStackUserId ,
206228 "Cleanup Scope" ,
207229 ] ) . catch ( ( ) => undefined ) ;
208230
@@ -225,11 +247,15 @@ export function createCleanupScope(): CleanupScope {
225247 await callReducer ( caller . token , "delete_ai_query_log" , [ logToken , correlationId ] ) . catch ( ( ) => undefined ) ;
226248 }
227249
228- for ( const identity of identities ) {
229- await callReducer ( caller . token , "remove_operator" , [ logToken , [ `0x${ identity } ` ] ] ) . catch ( ( ) => undefined ) ;
250+ if ( identities . size > 0 ) {
251+ const stackUserIdsToRemove = await collectStackUserIdsForIdentities ( caller . token , identities )
252+ . catch ( ( ) => new Set < string > ( ) ) ;
253+ for ( const stackUserId of stackUserIdsToRemove ) {
254+ await callReducer ( caller . token , "remove_operators_for_user" , [ logToken , stackUserId ] ) . catch ( ( ) => undefined ) ;
255+ }
230256 }
231257 } finally {
232- await callReducer ( caller . token , "remove_operator " , [ logToken , [ `0x ${ caller . identity } ` ] ] ) . catch ( ( ) => undefined ) ;
258+ await callReducer ( caller . token , "remove_operators_for_user " , [ logToken , callerStackUserId ] ) . catch ( ( ) => undefined ) ;
233259 identities . clear ( ) ;
234260 questions . clear ( ) ;
235261 aiQueryCorrelationIds . clear ( ) ;
0 commit comments