import type { DatabaseSync } from 'node:sqlite';
/** Open (once) the database every helper below writes through. */
export declare function getDb(file?: string): DatabaseSync;
export declare const hashPassword: (pw: string, salt?: string) => string;
export declare function verifyPassword(pw: string, stored: string): boolean;
/** Accounts. Every app needs them and none of them should write this twice. */
export declare function createUserTable(): void;
export declare function addUser(name: string, email: string, role: string, password: string): import("node:sqlite").StatementResultingChanges;
export declare const findUser: (email: string) => Record<string, any> | undefined;
export declare const userById: (id: number) => Record<string, any> | undefined;
export type ColumnType = 'text' | 'int' | 'real';
/**
 * Create a table from the same column list the model is shown, so the schema in
 * the prompt and the schema on disk cannot drift apart.
 */
export declare function createTable(table: string, columns: {
    as: string;
    type?: ColumnType;
}[], extra?: string[]): void;
/** Quote an identifier. Identifiers can never be bound, so they are quoted. */
export declare const ident: (name: string) => string;
export type Trace = {
    sql: string;
    params: unknown[];
    rows?: number;
};
export declare const beginTrace: () => void;
export declare const endTrace: () => Trace[];
export declare const all: (sql: string, ...args: unknown[]) => Record<string, any>[];
export declare const one: (sql: string, ...args: unknown[]) => Record<string, any> | undefined;
export declare const run: (sql: string, ...args: unknown[]) => import("node:sqlite").StatementResultingChanges;
/** Fuzzy-resolve free text to a row id, for a value that names a record. */
export declare function lookupIn(table: string, text: string): number | null;
/** The store shape the runtime expects. */
export declare const store: {
    all: (sql: string, ...p: unknown[]) => Record<string, any>[];
    run: (sql: string, ...p: unknown[]) => import("node:sqlite").StatementResultingChanges;
    lookup: (table: string, text: string) => number | null;
};
