/**
 * DiskThreadStore — filesystem-backed implementation of {@link ThreadStore}.
 *
 * Every mutation is write-tmp-rename (Convention #8). Layout uses the Phase 2
 * intermediate shape:
 *
 *   {rootDir}/projects/{projectId}/threads/{threadId}/
 *     thread.json
 *
 * Sessions stay under `projects/{projectId}/sessions/{sessionId}/...` rather
 * than nesting under `threads/{threadId}/` — the denormalized `threadId` on
 * each session record (Phase 2.4 decision) makes thread-scoped queries
 * addressable without path-level nesting, and keeps Project-scoped consumers
 * (handoff, retention, archival) a single-directory scan. Phase 6 collapses
 * `projects/{projectId}/` to `.namzu/` as part of `namzu init` folder binding.
 *
 * Tenant scoping is enforced through the JSON payload (`tenantId` field on
 * every record), not the path — cross-tenant reads reject with
 * {@link TenantIsolationError} (Convention #17).
 */
import type { TenantId } from '../../types/ids/index.js';
import type { ProjectId, ThreadId } from '../../types/session/ids.js';
import type { Thread } from '../../types/thread/entity.js';
import type { CreateThreadParams, ThreadStore } from '../../types/thread/store.js';
/** Config for {@link DiskThreadStore}. `rootDir` is absolute. */
export interface DiskThreadStoreConfig {
    rootDir: string;
}
export declare class DiskThreadStore implements ThreadStore {
    private readonly rootDir;
    private readonly threadIndex;
    constructor(config: DiskThreadStoreConfig);
    createThread(params: CreateThreadParams, tenantId: TenantId): Promise<Thread>;
    getThread(threadId: ThreadId, tenantId: TenantId): Promise<Thread | null>;
    updateThread(thread: Thread, tenantId: TenantId): Promise<void>;
    deleteThread(threadId: ThreadId, tenantId: TenantId): Promise<void>;
    listThreads(projectId: ProjectId, tenantId: TenantId): Promise<readonly Thread[]>;
    private locateThread;
    private assertTenant;
}
//# sourceMappingURL=disk.d.ts.map