Tool to send cross-session opencode messages, including as request-response pattern
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

make filterSessions more generic with predicate support

rektide ee6951e7 da84cc17

+46 -22
+46 -22
src/session/filter.ts
··· 1 1 import { Session } from "./session.js"; 2 2 3 - export interface SessionFilter { 3 + export type SessionPredicate = (session: Session) => boolean; 4 + 5 + export interface SessionFilter extends Partial<Session> { 4 6 busy?: boolean; 5 7 idle?: boolean; 6 8 retrying?: boolean; 7 - port?: number; 8 9 sessionIDPattern?: string; 9 10 minRetryAttempt?: number; 10 11 } 11 12 12 - export async function* filterSessions( 13 - sessions: AsyncGenerator<Session>, 14 - filter: SessionFilter, 15 - ): AsyncGenerator<Session> { 16 - for await (const session of sessions) { 17 - if (filter.busy && session.status !== "busy") { 18 - continue; 19 - } 20 - if (filter.idle && session.status !== "idle") { 21 - continue; 13 + function matches(session: Session, filter: SessionFilter): boolean { 14 + for (const [key, value] of Object.entries(filter)) { 15 + if (key === "busy" && value === true && session.status !== "busy") { 16 + return false; 22 17 } 23 - if (filter.retrying && session.status !== "retry") { 24 - continue; 18 + if (key === "idle" && value === true && session.status !== "idle") { 19 + return false; 25 20 } 26 - if (filter.port && session.port !== filter.port) { 27 - continue; 21 + if (key === "retrying" && value === true && session.status !== "retry") { 22 + return false; 28 23 } 29 - if (filter.sessionIDPattern && !session.sessionID.includes(filter.sessionIDPattern)) { 30 - continue; 24 + if (key === "sessionIDPattern" && !session.sessionID.includes(value as string)) { 25 + return false; 31 26 } 32 27 if ( 33 - filter.minRetryAttempt && 28 + key === "minRetryAttempt" && 34 29 session.retryAttempt !== undefined && 35 - session.retryAttempt < filter.minRetryAttempt 30 + session.retryAttempt < (value as number) 36 31 ) { 37 - continue; 32 + return false; 33 + } 34 + if ( 35 + key !== "busy" && 36 + key !== "idle" && 37 + key !== "retrying" && 38 + key !== "sessionIDPattern" && 39 + key !== "minRetryAttempt" 40 + ) { 41 + const sessionValue = (session as any)[key]; 42 + if (sessionValue !== value) { 43 + return false; 44 + } 38 45 } 39 - yield session; 46 + } 47 + return true; 48 + } 49 + 50 + export async function* filterSessions( 51 + sessions: AsyncGenerator<Session>, 52 + filter: SessionFilter | SessionPredicate, 53 + ): AsyncGenerator<Session> { 54 + for await (const session of sessions) { 55 + if (typeof filter === "function") { 56 + if (filter(session)) { 57 + yield session; 58 + } 59 + } else { 60 + if (matches(session, filter)) { 61 + yield session; 62 + } 63 + } 40 64 } 41 65 }