/** * ProjectManager — multi-project isolation. * * Each mapped Matrix room gets its own pi child process (own cwd, own * session, own bash environment). Rooms are lazily started on first * message; the default PiRpc (management room / default workdir) is shared. * * Agent events are bound to the room that owns the process, so replies * always go back to the right chat even with concurrent turns. */ import { PiRpc, type PiRpcOptions } from "./pi-rpc.js"; export interface ProjectEntry { name?: string; workdir: string; } export interface ProjectManagerOptions { /** Shared default PiRpc (management room / default workdir). */ defaultRpc: PiRpc; /** Base options for project processes (cliPath, common args, ...). */ baseOptions: PiRpcOptions; /** Subscribe a per-room agent event listener: (roomId, event). */ onRoomEvent: (roomId: string, event: unknown) => void; /** Multi-project mode. false = single-project: every room uses defaultRpc. */ multiProject?: boolean; } export declare class ProjectManager { private defaultRpc; private baseOptions; private onRoomEvent; private multiProject; /** roomId -> PiRpc for project rooms (lazily started). */ private projectRpcs; constructor(opts: ProjectManagerOptions); /** Current projects mapping from config (roomId -> entry). */ projectMap(): Record; /** All configured projects as [roomId, entry] pairs. */ listProjects(): Array<[string, ProjectEntry]>; /** * Resolve the PiRpc for a room (starting it on first use). * - Single-project mode: every room uses the shared default Rpc. * - Multi-project: mapped project room -> project process; else default. */ getRpcForRoom(roomId: string): Promise; /** Whether this room is a mapped project room (only meaningful in multi-project). */ isProjectRoom(roomId: string): boolean; /** Whether multi-project mode is enabled. */ get isMultiProject(): boolean; /** Whether a project process is currently running for this room. */ isRunning(roomId: string): boolean; private getProjectRpc; /** Register a new project room at runtime (used by /pmctl new). */ registerProject(roomId: string, workdir: string, name?: string): void; /** Update a project's workdir (used by /pmctl mv). */ updateProjectWorkdir(roomId: string, workdir: string): Promise; /** Rename a project (used by /pmctl rename). */ renameProject(roomId: string, name: string): void; /** Remove a project (used by /pmctl rm): stop its process, drop the mapping. */ removeProject(roomId: string): Promise; stopAll(): Promise; } //# sourceMappingURL=project-manager.d.ts.map