/** * Drizzle ORM schema for the **DbWriterLease** arbitration tables (T11627 ST-2). * * Two operational tables co-located inside EACH scope's consolidated `cleo.db` * (project + global), migrated via the existing `drizzle-cleo-project` / * `drizzle-cleo-global` migration sets so lease state lives next to the data it * guards and is auto-split by the dual-cleo.db boundary * ({@link resolveDualScopeDbPath}). They are NOT part of the exodus target shape * under `schema/cleo-project/` — they are pure runtime infrastructure that the * lease engine ({@link withWriterLease}) reads and writes via `BEGIN IMMEDIATE`. * * ## `_writer_leases` — exactly ONE active row per (scope, lane) * * AC1 (one writer per scope/lane) is enforced by a **partial UNIQUE index** * `WHERE active = 1`. drizzle-orm does **not** surface partial-`WHERE` indexes in * its typed schema API (cf. `conduit-schema.ts:339` `project_agent_refs.enabled`, * `agent-registry-schema.ts`), so the index is emitted as **raw SQL in the lease * baseline migration** — this module declares only the full-column table. This is * the established repo pattern, not a deviation. The runtime bootstrap asserts the * index exists via {@link assertWriterLeaseActiveIndexPresent} so a missing index * (e.g. a migration that never ran) fails loudly instead of silently allowing two * active rows. * * ## `_writer_queue` — FIFO + priority waiters * * Ordered `priority ASC, ticket ASC` (priority-then-FIFO). The full (non-partial) * ordering index IS expressible in drizzle and is declared inline here; only the * partial-unique active-row index requires raw SQL. * * @module * @task T11627 * @epic T11625 * @see ./writer-lease.ts — the engine that arbitrates over these tables * @see ../../migrations/drizzle-cleo-project — project lease migration (raw partial index) * @see ../../migrations/drizzle-cleo-global — global lease migration (raw partial index) */ import type { DatabaseSync } from 'node:sqlite'; /** * The physical name of the lease table. Exported so the engine, the bootstrap * assertion, and tests all reference the single source of truth. */ export declare const WRITER_LEASES_TABLE: "_writer_leases"; /** * The physical name of the lease waiter-queue table. */ export declare const WRITER_QUEUE_TABLE: "_writer_queue"; /** * The physical name of the partial-UNIQUE active-row index. Asserted present at * bootstrap because drizzle cannot emit it (raw SQL in the baseline migration). */ export declare const WRITER_LEASES_ACTIVE_INDEX: "ux_writer_leases_active"; /** * `_writer_leases` — at most ONE active row per `(scope, lane)`. * * The single-active invariant is enforced by the raw-SQL partial-UNIQUE index * `ux_writer_leases_active ON _writer_leases (scope, lane) WHERE active = 1` * (emitted in the baseline migration — drizzle cannot model partial `WHERE`). * This declaration intentionally carries only the full-column table; do NOT add * a `.unique()` here (it would emit a NON-partial unique that wrongly forbids a * second released row for the same lane). */ export declare const writerLeases: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{ name: "_writer_leases"; schema: undefined; columns: { id: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_leases"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: true; isPrimaryKey: true; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; scope: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_leases"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; lane: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_leases"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; holderId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_leases"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; holderPid: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_leases"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; epoch: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_leases"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; acquiredAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_leases"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; heartbeatAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_leases"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; ttlMs: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_leases"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; reentrancyDepth: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_leases"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; active: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_leases"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; }; dialect: "sqlite"; }>; /** * `_writer_queue` — FIFO + priority waiters per `(scope, lane)`. * * Grant order is `priority ASC, ticket ASC` (priority-then-FIFO). The ordering * index below is a normal multi-column index — fully expressible in drizzle. */ export declare const writerQueue: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{ name: "_writer_queue"; schema: undefined; columns: { ticket: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_queue"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: true; isPrimaryKey: true; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; scope: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_queue"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; lane: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_queue"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; holderId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_queue"; dataType: "string"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}>; priority: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_queue"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; enqueuedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_queue"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; deadlineAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: string; tableName: "_writer_queue"; dataType: "number int53"; data: number; driverParam: number; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: undefined; baseColumn: never; identity: undefined; generated: undefined; }, {}>; }; dialect: "sqlite"; }>; /** * Assert that the raw-SQL partial-UNIQUE active-row index is physically present * on the given native `cleo.db` handle. * * Because drizzle cannot emit a partial-`WHERE` index, AC1 enforcement depends * entirely on the hand-written baseline migration having run. This check makes a * missing index a loud, immediate failure at bootstrap (or in T8) rather than a * silent loss of the single-active-writer invariant. * * @param nativeDb - The native `DatabaseSync` handle for a scope's `cleo.db`. * @throws {Error} `E_WRITER_LEASE_INDEX_MISSING` if `ux_writer_leases_active` is * absent (the lease migration did not run, or the partial index was dropped). * * @example * ```ts * const nativeDb = (handle.db as { $client: DatabaseSync }).$client; * assertWriterLeaseActiveIndexPresent(nativeDb); // throws if AC1 index missing * ``` * * @task T11627 */ export declare function assertWriterLeaseActiveIndexPresent(nativeDb: DatabaseSync): void; //# sourceMappingURL=writer-lease-schema.d.ts.map