import type { TypedQueryClient } from "../generated/storage-kit/query.js"; import { type AsyncProjectResourceLinkProducerEvidenceVerifier } from "../lib/project-resource-link-migrations.js"; import type { Agent, CreateAgentInput, CreateRecipeInput, CreateRootInput, CreateWorkspaceInput, EventSource, GuardedProjectMutationReceiptLookupInput, GuardedProjectMutationReceiptLookupResult, GuardedProjectReadRequest, GuardedProjectReadResult, GuardedProjectMutationRequest, GuardedProjectMutationResult, GuardedProjectMutationRollbackRequest, JsonObject, ProjectResourceLink, ProjectResourceLinkMutationRequest, ProjectResourceLinkMutationResult, ProjectResourceLinkMigrationAdvanceRequest, ProjectResourceLinkMigrationPlanRequest, ProjectResourceLinkMigrationReadRequest, ProjectResourceLinkMigrationResult, ProjectResourceLinkMigrationRollbackRequest, ProjectResourceLinkReadRequest, ProjectResourceLinkReadResult, ProjectResourceLinkRollbackRequest, ProjectQuarantineReadRequest, ProjectQuarantineReadResult, ProjectQuarantineRequest, ProjectQuarantineResult, ProjectQuarantineRollbackRequest, Recipe, RecordWorkspaceEventInput, Root, UpdateRootInput, UpdateWorkspaceInput, Workspace, WorkspaceAgentAssignment, WorkspaceEvent, WorkspaceLocation, WorkspaceLock, WorkspaceKind, WorkspaceStatus, Machine } from "../types/workspace.js"; export declare function generateWorkspaceId(): string; export declare function generateRootId(): string; export declare function generateRecipeId(): string; export declare function generateAgentId(): string; export declare function generateEventId(): string; export declare function slugify(name: string): string; /** Not-found error carrying an HTTP status hint for the router. */ export declare class NotFoundError extends Error { readonly status = 404; constructor(message: string); } /** Client/validation error (bad input) carrying a 400 hint. */ export declare class ValidationError extends Error { readonly status = 400; constructor(message: string); } /** * Server-side bounds on a single `/v1/projects` page. These protect the * database from an unbounded scan; they are NOT a statement that the caller may * only ever see this many projects. The response reports `total` and `has_more` * so a client can page the rest — the `@hasna/projects` store does so * automatically. */ export declare const WORKSPACE_LIST_DEFAULT_LIMIT = 100; export declare const WORKSPACE_LIST_MAX_LIMIT = 1000; export interface WorkspaceFilter { status?: WorkspaceStatus; kind?: WorkspaceKind; root_id?: string; query?: string; tags?: string[]; /** Exclude rows tagged `registry-fixture` (the normalization program's generated test rows). Default reads exclude them. */ exclude_registry_fixtures?: boolean; limit?: number; offset?: number; } export declare class ProjectsPgStore { private readonly db; private readonly producerEvidenceVerifier?; constructor(db: TypedQueryClient, producerEvidenceVerifier?: AsyncProjectResourceLinkProducerEvidenceVerifier | undefined); private inTransaction; private ensureUniqueSlug; listRoots(): Promise; getRoot(idOrSlug: string): Promise; createRoot(input: CreateRootInput): Promise; updateRoot(idOrSlug: string, input: UpdateRootInput): Promise; deleteRoot(idOrSlug: string, detachWorkspaces?: boolean): Promise<{ root: Root; detached_workspaces: number; }>; listAgents(): Promise; getAgent(idOrSlug: string): Promise; createAgent(input: CreateAgentInput): Promise; listRecipes(): Promise; getRecipe(idOrSlug: string): Promise; createRecipe(input: CreateRecipeInput): Promise; /** * Shared predicate for listing and counting workspaces. Kept in one place so * a reported total can never describe a different set than the rows beside * it. */ private workspaceFilterSql; listWorkspaces(filter?: WorkspaceFilter): Promise; /** Rows matching `filter`, ignoring its limit/offset. */ countWorkspaces(filter?: WorkspaceFilter): Promise; getWorkspace(idOrSlug: string): Promise; guardedReadWorkspace(input: GuardedProjectReadRequest, startedAtMs?: number): Promise; listProjectResourceLinks(projectId: string, maxItems?: number): Promise; listWorkspaceLocations(projectId: string): Promise; listMachines(): Promise; addWorkspaceLocation(input: { workspace_id: string; path: string; machine_id?: string; label?: string; kind?: string; is_primary?: boolean; metadata?: JsonObject; agent_id?: string; source?: EventSource; command?: string; created_at?: string; }): Promise; listWorkspaceAgents(workspaceId: string): Promise; private toWorkspaceAgentAssignment; assignAgentToWorkspace(input: { workspace_id: string; agent_id: string; role?: string; assigned_by?: string; metadata?: JsonObject; created_at?: string; }): Promise; listLocks(): Promise; acquireLock(input: { lock_key: string; workspace_id?: string; agent_id?: string; reason?: string; ttl_seconds?: number; created_at?: string; }): Promise; releaseLock(lockKey: string, lockId: string): Promise; forceReleaseLock(lockKey: string): Promise; private pruneExpiredLocks; private listWorkspaceLocationsBounded; private replaceWorkspaceLocations; private replaceProjectResourceLinksExact; readProjectResourceLinks(input: ProjectResourceLinkReadRequest, startedAtMs?: number): Promise; readDuplicateProjectQuarantinePreimage(input: ProjectQuarantineReadRequest, startedAtMs?: number): Promise; requireWorkspace(idOrSlug: string): Promise; createWorkspace(input: CreateWorkspaceInput): Promise; updateWorkspace(idOrSlug: string, input: UpdateWorkspaceInput): Promise; private insertGuardedReceipt; private guardedAcceptedReceipt; private guardedAcceptedByStep; private requireForwardProjectResourceLinkReceipt; private guardedTerminalNonacceptance; private duplicateGuardedReceipt; private guardedConditionalUpdate; mutateProjectResourceLinks(input: ProjectResourceLinkMutationRequest): Promise; private mutateProjectResourceLinksInCurrentTransaction; rollbackProjectResourceLinks(input: ProjectResourceLinkRollbackRequest): Promise; quarantineDuplicateProject(input: ProjectQuarantineRequest): Promise; private quarantineDuplicateProjectInCurrentTransaction; rollbackDuplicateProjectQuarantine(input: ProjectQuarantineRollbackRequest): Promise; private rollbackDuplicateProjectQuarantineInCurrentTransaction; private resourceLinkMigrationManifest; private resourceLinkMigrationEvents; private boundedResourceLinkMigrationEvents; private insertResourceLinkMigrationEvent; private persistResourceLinkMigrationTransition; planProjectResourceLinkMigration(input: ProjectResourceLinkMigrationPlanRequest): Promise; readProjectResourceLinkMigration(input: ProjectResourceLinkMigrationReadRequest): Promise; advanceProjectResourceLinkMigration(input: ProjectResourceLinkMigrationAdvanceRequest): Promise; rollbackProjectResourceLinkMigration(input: ProjectResourceLinkMigrationRollbackRequest): Promise; guardedUpdateWorkspace(input: GuardedProjectMutationRequest): Promise; private guardedUpdateWorkspaceInCurrentTransaction; lookupGuardedWorkspaceMutationReceipt(input: GuardedProjectMutationReceiptLookupInput): Promise; rollbackGuardedWorkspaceMutation(input: GuardedProjectMutationRollbackRequest): Promise; private rollbackGuardedWorkspaceMutationInCurrentTransaction; archiveWorkspace(idOrSlug: string, input?: Omit): Promise; unarchiveWorkspace(idOrSlug: string, input?: Omit): Promise; deleteWorkspace(idOrSlug: string, input?: Omit & { hard?: boolean; }): Promise<{ workspace: Workspace; hard: boolean; }>; listWorkspaceEvents(workspaceId: string, limit?: number): Promise; recordEvent(input: RecordWorkspaceEventInput): Promise; ping(): Promise; } //# sourceMappingURL=pg-store.d.ts.map