import type { DurableJournal } from "@claudexor/journal"; import { type Project } from "@claudexor/schema"; /** Global-journal authority for the deliberately empty v2 project registry. */ export declare class ProjectStore { private readonly journal; private readonly projects; private readonly projectIdByRoot; private readonly registrationByKey; constructor(journal: DurableJournal); list(): Project[]; get(id: string): Project | undefined; findByRoot(root: string): Project | undefined; /** F3 nested-project disclosure: every registered project whose * root overlaps `id`'s root — `inside` when `id` lives under it, `contains` * when it lives under `id`. Pure projection over current roots (recomputed as * the registry changes), never a refusal — legit monorepos nest. */ nestingFor(id: string): Array<{ relation: "inside" | "contains"; root: string; projectId: string; }>; register(input: { root: string; idempotencyKey: string; clientId: string; }): Project; relink(id: string, rootInput: string): Project; /** F2 ghost-cleanup: retire a registered project — used by the * daemon sweep to unregister ghosts whose root is inside the Claudexor * runtime tree or permanently gone. Removes the registry entry, its root * index, and any idempotency bindings pointing at it, in ONE locked write. */ unregister(id: string): Project | undefined; validateProjection(): void; private replay; private commit; private apply; } export declare function projectProjection(): { name: string; create: (journal: DurableJournal) => ProjectStore; validate: (store: ProjectStore) => void; }; //# sourceMappingURL=projects.d.ts.map