import { isOrchestratorSession } from "@composio/ao-core/types"; type ProjectWithPrefix = { sessionPrefix?: string }; type SessionLike = { id: string; projectId: string; metadata?: Record }; /** * Check if a session belongs to a specific project. * Matches by projectId or sessionPrefix (same logic as resolveProject). * * @param session - Session with id and projectId * @param projectId - The project key to match against * @param projects - Projects config mapping */ function matchesProject( session: SessionLike, projectId: string, projects: Record, ): boolean { if (session.projectId === projectId) return true; const project = projects[projectId]; if (project?.sessionPrefix && session.id.startsWith(project.sessionPrefix)) return true; return projects[session.projectId]?.sessionPrefix === projectId; } export function filterProjectSessions( sessions: T[], projectFilter: string | null | undefined, projects: Record, ): T[] { if (!projectFilter || projectFilter === "all") return sessions; return sessions.filter((session) => matchesProject(session, projectFilter, projects)); } /** Build a project-scoped href, falling back to ?project=all when no project is active. */ export function getProjectScopedHref( basePath: "/" | "/prs", projectId: string | undefined, ): string { return projectId ? `${basePath}?project=${encodeURIComponent(projectId)}` : `${basePath}?project=all`; } export function filterWorkerSessions( sessions: T[], projectFilter: string | null | undefined, projects: Record, ): T[] { const allSessionPrefixes = Object.entries(projects).map( ([projectId, p]) => p.sessionPrefix ?? projectId, ); const workers = sessions.filter( (s) => !isOrchestratorSession( s, projects[s.projectId]?.sessionPrefix ?? s.projectId, allSessionPrefixes, ), ); return filterProjectSessions(workers, projectFilter, projects); }