Submatter/apps/worker/src/db/harness.ts

54 lines
2 KiB
TypeScript
Raw Normal View History

import { and, eq } from "drizzle-orm";
import type { db as dbInstance } from "@tasks/database";
import { harnessProviders, roleHarnessRoutes } from "@tasks/database/schema";
import { resolveHarnessForRole } from "@tasks/shared/worker/executor";
type Db = typeof dbInstance;
export async function resolveHarnessForRoleDb(
db: Db,
workspaceId: string,
roleId: string,
overrideAlias?: string | null,
): Promise<{ alias: string; harnessType: string; endpointUrl: string | null; authEnvVar: string | null }> {
if (overrideAlias) {
const [row] = await db
.select()
.from(harnessProviders)
.where(and(eq(harnessProviders.workspaceId, workspaceId), eq(harnessProviders.alias, overrideAlias)))
.limit(1);
if (row && row.enabled) {
return { alias: row.alias, harnessType: row.harnessType, endpointUrl: row.endpointUrl, authEnvVar: row.authEnvVar };
}
}
const providers = await db.select().from(harnessProviders).where(eq(harnessProviders.workspaceId, workspaceId));
const routes = await db.select().from(roleHarnessRoutes).where(eq(roleHarnessRoutes.workspaceId, workspaceId));
// map to shared types
const mappedProviders = providers.map((p) => ({
id: p.id,
workspaceId: p.workspaceId,
alias: p.alias,
displayName: p.displayName,
harnessType: p.harnessType as "minimal" | "crewai" | "langgraph" | "remote-ag-ui",
endpointUrl: p.endpointUrl,
authEnvVar: p.authEnvVar,
config: p.config,
enabled: p.enabled,
}));
const mappedRoutes = routes.map((r) => ({
id: r.id,
workspaceId: r.workspaceId,
roleId: r.roleId,
harnessProviderId: r.harnessProviderId,
enabled: r.enabled,
sortOrder: r.sortOrder,
}));
const result = resolveHarnessForRole({ roleId, providers: mappedProviders, routes: mappedRoutes });
return {
alias: result.harness.alias,
harnessType: result.harness.harnessType,
endpointUrl: result.harness.endpointUrl ?? null,
authEnvVar: result.harness.authEnvVar ?? null,
};
}