/** * Schema factories for sharing/ownership. * * Templates make a resource table "ownable" by spreading `ownableColumns()` into * the table definition and declaring a companion shares table via * `createSharesTable()`. The shares table carries per-principal grants; the * parent table's `visibility` column is the coarse default (private / org / * public). * * import { table, text, ownableColumns, createSharesTable } from * "@agent-native/core/db/schema"; * * export const decks = table("decks", { * id: text("id").primaryKey(), * title: text("title").notNull(), * data: text("data").notNull(), * ...ownableColumns(), * }); * * export const deckShares = createSharesTable("deck_shares"); * * The share row `role` supports `viewer | editor | admin`. `admin` is a * share-level capability — it lets non-owners manage shares. The single * `owner_email` column on the resource remains the ground truth for ownership. */ /** * Columns any ownable resource should include. Spread into the table definition. * * - `ownerEmail` — the creator. Auto-filled by write actions from the request context. * - `orgId` — owner's active org at creation time. Used for `visibility = 'org'` checks. * - `visibility`— coarse default: `'private' | 'org' | 'public'`. Default `'private'`. */ export declare function ownableColumns(): { ownerEmail: import("drizzle-orm").HasDefault>>; orgId: import("drizzle-orm/sqlite-core").SQLiteTextBuilderInitial<"org_id", [string, ...string[]], number>; visibility: import("drizzle-orm").HasDefault>>; }; /** * Create a companion shares table for an ownable resource. Call this right * after defining the parent table. * * Columns: * - `id` — share row id (generated by the share action) * - `resourceId` — id of the parent resource * - `principalType` — `'user' | 'org'` * - `principalId` — email (for user) or org id (for org) * - `role` — `'viewer' | 'editor' | 'admin'` * - `createdBy` — email of the user who created the share * - `createdAt` — ISO timestamp * * Uniqueness across `(resource_id, principal_type, principal_id)` is enforced * at the action layer via upsert-style logic. A composite DB-level unique * index can be added per template if desired — omitted here to keep the * factory dialect-agnostic. */ export declare function createSharesTable(tableName: string): import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{ name: string; schema: undefined; columns: { id: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: "id"; tableName: string; dataType: "string"; columnType: "SQLiteText"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: true; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}, { length: number; }>; resourceId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: "resource_id"; tableName: string; dataType: "string"; columnType: "SQLiteText"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}, { length: number; }>; principalType: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: "principal_type"; tableName: string; dataType: "string"; columnType: "SQLiteText"; data: "org" | "user"; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: ["user", "org"]; baseColumn: never; identity: undefined; generated: undefined; }, {}, { length: number; }>; principalId: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: "principal_id"; tableName: string; dataType: "string"; columnType: "SQLiteText"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}, { length: number; }>; role: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: "role"; tableName: string; dataType: "string"; columnType: "SQLiteText"; data: "admin" | "editor" | "viewer"; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: ["viewer", "editor", "admin"]; baseColumn: never; identity: undefined; generated: undefined; }, {}, { length: number; }>; createdBy: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: "created_by"; tableName: string; dataType: "string"; columnType: "SQLiteText"; data: string; driverParam: string; notNull: true; hasDefault: false; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}, { length: number; }>; createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{ name: "created_at"; tableName: string; dataType: "string"; columnType: "SQLiteText"; data: string; driverParam: string; notNull: true; hasDefault: true; isPrimaryKey: false; isAutoincrement: false; hasRuntimeDefault: false; enumValues: [string, ...string[]]; baseColumn: never; identity: undefined; generated: undefined; }, {}, { length: number; }>; }; dialect: 'sqlite'; }>; export type Visibility = "private" | "org" | "public"; export type ShareRole = "viewer" | "editor" | "admin"; export type PrincipalType = "user" | "org"; /** Role precedence — higher number = stronger capability. */ export declare const ROLE_RANK: Record; export declare function roleSatisfies(actual: ShareRole | "owner", minimum: ShareRole | "owner"): boolean; //# sourceMappingURL=schema.d.ts.map