Each project (space) now has a main agent and a main conversation of its own. The user talks to it, and it delegates to the project's specialists. Creating a project sets both up and opens the conversation, and deleting an otherwise empty project removes them with it. Claude-Session: https://claude.ai/code/session_01R8hSsKTB3W3e61wD6kvzur Co-authored-by: Claude <noreply@anthropic.com>
23 lines
934 B
TypeScript
23 lines
934 B
TypeScript
import type { Group, Space } from "@rakazo/contracts";
|
|
|
|
/** The project's own main conversation, where the user talks to its main agent. */
|
|
export function projectMainGroup<T extends Pick<Group, "kind" | "spaceId">>(
|
|
groups: readonly T[],
|
|
spaceId: string,
|
|
): T | undefined {
|
|
return groups.find((group) => group.spaceId === spaceId && group.kind === "main");
|
|
}
|
|
|
|
/** Non-default project space without any conversation yet, not even its main one. */
|
|
export function isEmptyProjectSpace(
|
|
spaceId: string | null | undefined,
|
|
spaces: readonly Pick<Space, "id" | "isDefault">[],
|
|
groups: readonly Pick<Group, "id" | "kind" | "spaceId">[],
|
|
homeSpaceId: string | undefined,
|
|
): boolean {
|
|
if (!spaceId || !homeSpaceId || spaceId === homeSpaceId) return false;
|
|
const space = spaces.find((item) => item.id === spaceId);
|
|
if (!space || space.isDefault) return false;
|
|
return !groups.some((group) => group.spaceId === spaceId);
|
|
}
|