diff --git a/server/src/services/agents.ts b/server/src/services/agents.ts index 54d48045..703a3f95 100644 --- a/server/src/services/agents.ts +++ b/server/src/services/agents.ts @@ -1,5 +1,5 @@ import { createHash, randomBytes } from "node:crypto"; -import { and, desc, eq, inArray } from "drizzle-orm"; +import { and, desc, eq, inArray, ne } from "drizzle-orm"; import type { Db } from "@paperclipai/db"; import { agents, @@ -251,8 +251,12 @@ export function agentService(db: Db) { } return { - list: async (companyId: string) => { - const rows = await db.select().from(agents).where(eq(agents.companyId, companyId)); + list: async (companyId: string, options?: { includeTerminated?: boolean }) => { + const conditions = [eq(agents.companyId, companyId)]; + if (!options?.includeTerminated) { + conditions.push(ne(agents.status, "terminated")); + } + const rows = await db.select().from(agents).where(and(...conditions)); return rows.map(normalizeAgentRow); }, @@ -469,7 +473,10 @@ export function agentService(db: Db) { }, orgForCompany: async (companyId: string) => { - const rows = await db.select().from(agents).where(eq(agents.companyId, companyId)); + const rows = await db + .select() + .from(agents) + .where(and(eq(agents.companyId, companyId), ne(agents.status, "terminated"))); const normalizedRows = rows.map(normalizeAgentRow); const byManager = new Map(); for (const row of normalizedRows) { diff --git a/server/src/services/company-portability.ts b/server/src/services/company-portability.ts index 89b77dab..cc59063c 100644 --- a/server/src/services/company-portability.ts +++ b/server/src/services/company-portability.ts @@ -564,7 +564,7 @@ export function companyPortabilityService(db: Db) { requiredSecrets: [], }; - const allAgentRows = include.agents ? await agents.list(companyId) : []; + const allAgentRows = include.agents ? await agents.list(companyId, { includeTerminated: true }) : []; const agentRows = allAgentRows.filter((agent) => agent.status !== "terminated"); if (include.agents) { const skipped = allAgentRows.length - agentRows.length; diff --git a/ui/src/components/GoalTree.tsx b/ui/src/components/GoalTree.tsx index fe20ee64..116b1668 100644 --- a/ui/src/components/GoalTree.tsx +++ b/ui/src/components/GoalTree.tsx @@ -92,7 +92,8 @@ function GoalNode({ goal, children, allGoals, depth, goalLink, onSelect }: GoalN } export function GoalTree({ goals, goalLink, onSelect }: GoalTreeProps) { - const roots = goals.filter((g) => !g.parentId); + const goalIds = new Set(goals.map((g) => g.id)); + const roots = goals.filter((g) => !g.parentId || !goalIds.has(g.parentId)); if (goals.length === 0) { return

No goals.

;