34 lines
1.2 KiB
TypeScript
34 lines
1.2 KiB
TypeScript
import { isOrchestratorSession } from "@composio/ao-core";
|
|
|
|
type ProjectWithPrefix = { sessionPrefix?: string };
|
|
type SessionLike = { id: string; projectId: string; metadata?: Record<string, string> };
|
|
|
|
/**
|
|
* 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<string, ProjectWithPrefix>,
|
|
): boolean {
|
|
if (session.projectId === projectId) return true;
|
|
const project = projects[projectId];
|
|
if (project?.sessionPrefix && session.id.startsWith(project.sessionPrefix)) return true;
|
|
return false;
|
|
}
|
|
|
|
export function filterWorkerSessions<T extends SessionLike>(
|
|
sessions: T[],
|
|
projectFilter: string | null | undefined,
|
|
projects: Record<string, ProjectWithPrefix>,
|
|
): T[] {
|
|
const workers = sessions.filter((s) => !isOrchestratorSession(s));
|
|
if (!projectFilter || projectFilter === "all") return workers;
|
|
return workers.filter((s) => matchesProject(s, projectFilter, projects));
|
|
}
|