@aouda/client 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +151 -0
- package/dist/cli/index.cjs +5906 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +52 -0
- package/dist/cli/index.d.ts +52 -0
- package/dist/cli/index.js +5875 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client-DXT2ZAeO.d.cts +3356 -0
- package/dist/client-DXT2ZAeO.d.ts +3356 -0
- package/dist/index.cjs +5535 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +196 -0
- package/dist/index.d.ts +196 -0
- package/dist/index.js +5460 -0
- package/dist/index.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/auth/auth-handler.ts","../src/auth/auth-transport.ts","../src/auth/auth-client.ts","../src/bulkLoad.ts","../src/transport.ts","../src/resilience/retry.ts","../src/resilience/circuit-breaker.ts","../src/resilience/resilient-transport.ts","../src/database-path.ts","../src/streaming/subscription.ts","../src/streaming/write-stream.ts","../src/query-builder.ts","../src/tables.ts","../src/databases.ts","../src/schema/api.ts","../src/schema/branches.ts","../src/admin/server.ts","../src/admin/health.ts","../src/admin/metrics.ts","../src/admin/replication.ts","../src/admin/cluster.ts","../src/admin/backup.ts","../src/admin/config.ts","../src/admin/node.ts","../src/admin/index.ts","../src/materialized.ts","../src/streaming/websocket-transport.ts","../src/streaming/longpoll-transport.ts","../src/streaming/fallback-streaming-transport.ts","../src/client.ts","../src/mcp/cluster-tools.ts","../src/index.ts"],"sourcesContent":["/**\n * @aouda/client type definitions.\n */\n\nimport type {\n ServerAuthOptions,\n AppAuthOptions,\n AuthorizationMode,\n} from \"./auth/auth-types.js\";\n\n/**\n * Retry policy with exponential backoff and jitter.\n * Transient failures (connection, timeout, 5xx) are retried up to maxRetries times.\n */\nexport interface RetryPolicy {\n /** Maximum number of retry attempts (default: 3). Setting to 0 disables retries. */\n maxRetries?: number;\n /** Initial delay before first retry in ms (default: 100). */\n initialDelayMs?: number;\n /**\n * Base delay between retries in milliseconds.\n * @deprecated Use initialDelayMs instead. If both are present, initialDelayMs takes precedence.\n */\n baseDelayMs?: number;\n /** Maximum delay between retries in ms (default: 30_000). */\n maxDelayMs?: number;\n /** Backoff multiplier (default: 2). */\n multiplier?: number;\n /** Jitter factor 0–1 to randomize delays (default: 0.1). */\n jitterFactor?: number;\n}\n\n/** Retry policy presets (None, Default, Aggressive). */\n/* eslint-disable @typescript-eslint/no-namespace */\nexport namespace RetryPolicy {\n /** No retries. */\n export const None: RetryPolicy = { maxRetries: 0 };\n /** Default: 3 retries, 100ms initial delay, 30s max. */\n export const Default: RetryPolicy = {};\n /** Aggressive: 5 retries, 60s max delay. */\n export const Aggressive: RetryPolicy = { maxRetries: 5, maxDelayMs: 60_000 };\n}\n\n/**\n * Circuit breaker policy. After failureThreshold failures within failureWindowMs,\n * the circuit opens and requests fail fast until openDurationMs has passed (then half-open).\n */\nexport interface CircuitBreakerPolicy {\n /** Number of failures before opening the circuit (default: 5). */\n failureThreshold?: number;\n /** Time window for counting failures in ms (default: 30_000). */\n failureWindowMs?: number;\n /** Time to wait before allowing test requests (half-open) in ms (default: 30_000). */\n openDurationMs?: number;\n /** Successes needed in half-open to close the circuit (default: 2). */\n successThreshold?: number;\n}\n\n/** Circuit breaker policy presets (Disabled, Default, Sensitive). */\nexport namespace CircuitBreakerPolicy {\n /** Circuit breaker disabled (never opens). */\n export const Disabled: CircuitBreakerPolicy = {\n failureThreshold: Number.MAX_SAFE_INTEGER,\n };\n /** Default: 5 failures in 30s window, 30s open duration. */\n export const Default: CircuitBreakerPolicy = {};\n /** Sensitive: 3 failures in 15s window. */\n export const Sensitive: CircuitBreakerPolicy = {\n failureThreshold: 3,\n failureWindowMs: 15_000,\n };\n}\n/* eslint-enable @typescript-eslint/no-namespace */\n\n/**\n * Configuration options for AoudaClient.\n */\nexport interface AoudaClientOptions {\n /**\n * The base URL of the Aouda server.\n * Required. Must be a valid URL (e.g., \"http://localhost:8080\").\n */\n serverUrl: string;\n\n /**\n * Database name to scope all data and schema operations.\n * Required. Must be a non-empty string (no default).\n */\n database: string;\n\n /**\n * Request timeout in milliseconds.\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Optional retry policy configuration.\n * When omitted, no retries are performed (equivalent to RetryPolicy.None).\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * Optional circuit breaker policy.\n * When omitted, circuit breaker is disabled (equivalent to CircuitBreakerPolicy.Disabled).\n */\n circuitBreakerPolicy?: CircuitBreakerPolicy;\n\n /**\n * Server/database-admin auth credentials. Routes to `/api/auth/…`.\n * Mutually exclusive with `appAuth`.\n * When set, the client automatically handles token lifecycle:\n * proactive refresh, and 401 retry.\n */\n serverAuth?: ServerAuthOptions;\n\n /**\n * Application-user auth credentials. Routes to `/api/databases/{db}/auth/…`.\n * Mutually exclusive with `serverAuth`.\n * When set, the client automatically handles token lifecycle:\n * proactive refresh, and 401 retry.\n * Use `apiKey` for connection (Layer 1); call `client.auth.signIn()` for user identity (Layer 2).\n */\n appAuth?: AppAuthOptions;\n\n /**\n * Streaming transport options.\n */\n streaming?: {\n /**\n * Enables permessage-deflate compression for WebSocket transport in Node.js.\n * Browser-native WebSocket compression remains browser-managed.\n * @default true\n */\n enableCompression?: boolean;\n /**\n * Streaming WebSocket wire mode.\n * - \"json\": text frames (default)\n * - \"msgpack\": binary MessagePack frames after auth negotiation\n * @default \"json\"\n */\n wireMode?: \"json\" | \"msgpack\";\n /**\n * Enables HTTP long-poll fallback when WebSocket transport cannot connect.\n * @default true\n */\n enableLongPollFallback?: boolean;\n /**\n * Long-poll wait timeout in milliseconds for fallback transport.\n * @default 25000\n */\n longPollWaitMs?: number;\n };\n}\n\n/**\n * Health status response from the Aouda server.\n * Matches the wire protocol response from GET /health.\n */\nexport interface HealthStatus {\n /**\n * Status string from the server (e.g., \"healthy\").\n */\n status: string;\n\n /**\n * Whether the server is healthy.\n * Derived: true if status equals \"healthy\" (case-insensitive).\n */\n isHealthy: boolean;\n}\n\n// --- Schema contract (typed client) ---\n\n/**\n * Schema type contract for the generic Aouda client.\n *\n * Use as the type parameter for `createAoudaClient<S>(options)` so that\n * `table(name)` accepts only table names from the schema and returns\n * queries typed with the corresponding row interface.\n *\n * Shape (aligned with server TypeScript generator and B.8 CLI output):\n * - `tables`: record mapping table names (string keys) to row types (object types).\n *\n * @example\n * ```typescript\n * interface Order { id: number; status: string; }\n * interface Schema { tables: { orders: Order; }; }\n * const client = createAoudaClient<Schema>({ serverUrl: \"...\" });\n * client.table('orders'); // OK, returns TableQuery<Order>\n * client.table('other'); // type error\n * ```\n */\nexport interface SchemaLike {\n /** Maps table names to their row types. */\n tables: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Default schema when no generic is provided: any string table name,\n * rows typed as `Record<string, unknown>`.\n */\nexport interface DefaultSchema extends SchemaLike {\n tables: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Extracts the union of table names from a schema type.\n * Use for variables or parameters that must be a valid table name for schema `S`.\n *\n * @example\n * ```typescript\n * type TableName = TableNameFromSchema<Schema>; // 'orders' | 'authors' | ...\n * const name: TableName = 'orders';\n * ```\n */\nexport type TableNameFromSchema<S extends SchemaLike> =\n keyof S[\"tables\"] & string;\n\n// --- HTTP Transport (internal) ---\n\n/**\n * Options for the HTTP transport layer.\n */\nexport interface HttpTransportOptions {\n baseUrl: string;\n timeout: number;\n defaultHeaders?: Record<string, string>;\n}\n\n/**\n * Full request configuration for HttpTransport.request().\n */\nexport interface RequestConfig {\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n path: string;\n body?: unknown;\n headers?: Record<string, string>;\n /** Override default timeout for this request. */\n timeout?: number;\n /** External abort signal (e.g. client disconnect). */\n signal?: AbortSignal;\n /** If true, return the raw response text instead of parsing JSON. */\n rawText?: boolean;\n /**\n * If response status is in this list, return parsed JSON instead of throwing.\n * Used e.g. for GET /ready which returns 503 with a body when not ready.\n */\n allowStatuses?: number[];\n /**\n * If set, send this raw string as the request body instead of JSON-serializing `body`.\n * Used for NDJSON streaming (bulk-load :append).\n */\n rawBodyStr?: string;\n}\n\n/**\n * Options for convenience methods (get, post, put, patch, delete).\n */\nexport interface RequestOptions {\n headers?: Record<string, string>;\n timeout?: number;\n signal?: AbortSignal;\n /** Sent as X-Request-Id header when provided. */\n requestId?: string;\n}\n\n/**\n * Server error response shape (from wire protocol).\n */\nexport interface ErrorResponse {\n error: string;\n code: string;\n details?: string;\n requestId?: string;\n}\n\n// --- Query Types ---\n\n/**\n * User-facing comparison operator for where clauses.\n * Mapped to wire protocol operators (eq, ne, gt, etc.) internally.\n */\nexport type WhereOperator =\n | \"=\"\n | \"!=\"\n | \">\"\n | \"<\"\n | \">=\"\n | \"<=\"\n | \"in\"\n | \"notIn\"\n | \"like\"\n | \"isNull\"\n | \"isNotNull\"\n | \"between\";\n\n/**\n * User-facing sort direction.\n * Mapped to wire protocol `descending` boolean internally.\n */\nexport type SortDirection = \"asc\" | \"desc\";\n\n/**\n * Statistics about query execution.\n * Returned by the server with every query response.\n */\nexport interface QueryStats {\n /** Number of rows scanned during query execution. */\n rowsScanned: number;\n /** Number of rows returned in the result. */\n rowsReturned: number;\n /** Number of segments accessed during query execution. */\n segmentsAccessed: number;\n /** Query execution time in milliseconds. */\n executionMs: number;\n}\n\n/**\n * Result of a query execution.\n * Contains the rows and execution statistics.\n */\nexport interface QueryResult<T = Record<string, unknown>> {\n /** Array of result rows. */\n rows: T[];\n /** Query execution statistics. */\n stats: QueryStats;\n}\n\n// --- Internal Query Types (not exported from index.ts) ---\n\n/**\n * Wire protocol comparison operators.\n * @internal\n */\nexport type WireOperator =\n | \"eq\"\n | \"ne\"\n | \"gt\"\n | \"gte\"\n | \"lt\"\n | \"lte\"\n | \"in\"\n | \"nin\"\n | \"like\";\n\n/**\n * A single predicate in a where clause.\n * @internal\n */\nexport interface WherePredicate {\n column: string;\n op: WireOperator;\n value: unknown;\n}\n\n/**\n * Where clause structure for the wire protocol.\n * Semantics: `(∧ and) ∧ (∨ or) ∧ (∧ groups[i])` — see server `QueryTranslator`.\n * Prefer `TableQuery.whereGroup` / `WhereGroupBuilder` in the TS client instead of hand-building `groups`.\n * @internal\n */\nexport interface WhereClause {\n and?: WherePredicate[];\n or?: WherePredicate[];\n /** Nested sub-clauses AND-combined with top-level `and` / `or` (wire: `groups`). */\n groups?: WhereClause[];\n}\n\n/**\n * Order by clause for the wire protocol.\n * @internal\n */\nexport interface OrderByClause {\n column: string;\n descending?: boolean;\n}\n\n/**\n * Supported join types in query requests.\n * @internal\n */\nexport type JoinType = \"inner\" | \"left\" | \"right\" | \"full\" | \"cross\";\n\n/**\n * Join clause for the wire protocol query request.\n * Supports both single-column and multi-column equality joins, plus cross join.\n * @internal\n */\nexport interface JoinClause {\n table: string;\n type?: JoinType;\n leftColumn?: string;\n rightColumn?: string;\n leftColumns?: string[];\n rightColumns?: string[];\n}\n\n/**\n * Supported aggregate functions in query requests.\n * @internal\n */\nexport type AggregateFunction = \"sum\" | \"min\" | \"max\";\n\n/**\n * Aggregate operation specification for query requests.\n * @internal\n */\nexport interface AggregateOperation {\n op: AggregateFunction;\n column: string;\n}\n\n/**\n * Aggregate request payload in QueryRequest.\n * @internal\n */\nexport interface AggregateRequest {\n operations: AggregateOperation[];\n groupBy?: string[] | null;\n}\n\n/**\n * Query request body for POST /api/query.\n * @internal\n */\nexport interface QueryRequest {\n table: string;\n /** Required by server for database-scoped requests. Set by client. */\n database?: string;\n select?: string[] | null;\n where?: WhereClause | null;\n orderBy?: OrderByClause[] | null;\n joins?: JoinClause[] | null;\n aggregate?: AggregateRequest | null;\n offset?: number;\n limit?: number;\n /**\n * Allow cross-partition access for this query.\n * When true, queries on partitioned tables may run without partition key filters (admin/PLS rules apply server-side).\n */\n crossPartitionAccess?: boolean;\n /**\n * Server-side computed columns appended after physical-column projection.\n * Independent of `select`; both can be combined in the same query.\n */\n selectExpr?: ComputedColumnDef[] | null;\n}\n\n/**\n * Columnar response from the server (default format).\n */\nexport interface ColumnarResponse {\n columns: string[];\n types: string[];\n data: unknown[][];\n rowCount: number;\n stats: QueryStats;\n}\n\n// --- Table Types ---\n\n/**\n * Summary of a table returned by list().\n */\nexport interface TableSummary {\n /** Table name. */\n name: string;\n /** Number of columns in the table. */\n columnCount: number;\n /** Total row count across all segments. */\n rowCount: number;\n /** ISO 8601 timestamp when table was created (empty for legacy tables). */\n createdAt: string;\n /** ISO 8601 timestamp when table/data was last modified (empty for legacy tables). */\n lastModifiedAt: string;\n /** Approximate size in bytes across all segments. */\n sizeBytes: number;\n /** Storage policy (optional metadata). */\n policy?: TablePolicy;\n}\n\n/**\n * Detailed schema of a table returned by get().\n */\nexport interface TableSchema {\n /** Table name. */\n name: string;\n /** Column definitions. */\n columns: ColumnSchema[];\n /** Storage policy (optional metadata). */\n policy?: TablePolicy;\n /** Whether partition-level security is enabled. */\n partitionLevelSecurity?: boolean;\n /** Table authorization mode (ADRA). */\n authMode?: AuthorizationMode;\n /** Permission dimension for auth-db-pls mode. */\n permissionDimension?: string;\n /** Resolver name for auth-db-rls mode. */\n rlsResolverName?: string;\n}\n\n/**\n * Schema definition for a single column.\n */\nexport interface ColumnSchema {\n /** Column name. */\n name: string;\n /** Aouda data type (e.g., 'Int64', 'String', 'Double'). */\n type: string;\n /** Whether the column allows null values. */\n isNullable: boolean;\n /** Whether column has server-assigned auto-increment values. */\n isAutoIncrement?: boolean;\n /** Position in composite primary key (null if not PK). */\n primaryKeyOrder?: number;\n /** Position in composite partition key. */\n partitionKeyOrder?: number;\n /** Position in cluster columns for storage ordering. */\n clusterOrder?: number;\n /** Reference to another table's column (for relationship navigation). */\n reference?: ReferenceInfo;\n}\n\n/**\n * Storage policy for a table.\n */\nexport interface TablePolicy {\n /** Storage temperature setting. */\n storageTemperature?: string;\n /** Residency configuration. */\n residency?: ResidencyConfig;\n}\n\n/**\n * Residency configuration within a table policy.\n */\nexport interface ResidencyConfig {\n /** Data durability setting. */\n dataDurability?: string;\n /** Whether all data is pinned in memory. */\n pinAllInMemory?: boolean;\n}\n\n/**\n * Reference information for a column pointing to another table.\n */\nexport interface ReferenceInfo {\n /** Name of the table this column references. */\n targetTable: string;\n /** Name of the column in the target table. */\n targetColumn: string;\n /** Whether this reference was explicitly declared or inferred from naming conventions. */\n source: \"declared\" | \"inferred\";\n}\n\n/**\n * Enhanced schema response from schema() method.\n */\nexport interface TableSchemaResponse {\n /** Table name. */\n name: string;\n /** Column definitions with full metadata. */\n columns: ColumnSchema[];\n /** Column names forming the primary key, in order. */\n primaryKey: string[];\n /** Column names forming the partition key, in order. */\n partitionKey: string[];\n /** Column names for cluster ordering, in order. */\n clusterColumns: string[];\n /** Secondary indexes (placeholder for future). */\n indexes: IndexInfo[];\n /** Relationships to other tables (both declared and inferred). */\n relationships?: RelationshipInfo[];\n /** Whether partition-level security is enabled. */\n partitionLevelSecurity?: boolean;\n /** Table authorization mode (ADRA). */\n authMode?: AuthorizationMode;\n /** Permission dimension for auth-db-pls mode. */\n permissionDimension?: string;\n /** Resolver name for auth-db-rls mode. */\n rlsResolverName?: string;\n}\n\n/**\n * Index information (placeholder for future index management).\n */\nexport interface IndexInfo {\n /** Index name. */\n name: string;\n /** Indexed column names. */\n columns: string[];\n /** Whether index enforces uniqueness. */\n isUnique: boolean;\n}\n\n/**\n * Relationship between tables for ERD visualization.\n */\nexport interface RelationshipInfo {\n /** Source column of the relationship. */\n from: RelationshipEndpoint;\n /** Target table and column. */\n to: RelationshipEndpoint;\n /** Whether this relationship was declared or inferred. */\n source: \"declared\" | \"inferred\";\n /** Cardinality of the relationship. */\n cardinality: \"many-to-one\" | \"one-to-one\" | \"one-to-many\";\n}\n\n/**\n * Endpoint of a relationship (from or to side).\n */\nexport interface RelationshipEndpoint {\n /** Table name (required for \"to\" side, optional for \"from\" side in single-table context). */\n table?: string;\n /** Column name. */\n column: string;\n}\n\n/**\n * Response for relationships() — all tables with relationships for ERD.\n */\nexport interface SchemaRelationshipsResponse {\n /** All tables with column summaries. */\n tables: TableSummaryForErd[];\n /** All relationships (declared and inferred) across all tables. */\n relationships: RelationshipInfo[];\n}\n\n/**\n * Simplified table summary for ERD visualization.\n */\nexport interface TableSummaryForErd {\n /** Table name. */\n name: string;\n /** Column summaries. */\n columns: ColumnSummaryForErd[];\n}\n\n/**\n * Simplified column summary for ERD visualization.\n */\nexport interface ColumnSummaryForErd {\n /** Column name. */\n name: string;\n /** Data type. */\n type: string;\n /** Whether this column is part of the primary key. */\n isPrimaryKey?: boolean;\n /** Whether this column references another table. */\n isReference?: boolean;\n}\n\n/**\n * Options for TypeScript type generation.\n */\nexport interface TypeGenerationOptions {\n /** Include JSDoc comments in output (default: true). */\n comments?: boolean;\n /** Include Schema interface and TableName type (default: true). */\n schema?: boolean;\n /** Optional namespace wrapper for the generated types. */\n namespace?: string;\n}\n\n// --- Mutation Result Types ---\n\n/**\n * Result of an insert operation.\n */\nexport interface InsertResult {\n /** Number of rows successfully inserted. */\n rowsInserted: number;\n /** Server-side execution time in milliseconds. */\n executionMs: number;\n /** Generated values for auto-increment columns. Keys are row indices (as strings). */\n generatedValues?: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Result of an update or delete operation.\n */\nexport interface MutationResult {\n /** Number of rows affected by the operation. */\n rowsAffected: number;\n /** Server-side execution time in milliseconds. */\n executionMs: number;\n /** True when a limited delete can continue with additional matching rows. */\n hasMore?: boolean;\n /**\n * Rows returned by a RETURNING clause. Present only when `returning` was specified.\n * For UPDATE: post-update values. For DELETE: pre-delete values.\n */\n rows?: Record<string, unknown>[];\n /**\n * True when the RETURNING row count exceeded the server maximum (10 000)\n * and the result was truncated to the first 10 000 rows.\n */\n rowsTruncated?: boolean;\n}\n\n/**\n * Per-operation result for batch mutations.\n */\nexport interface BatchMutationOperationResult {\n /** Operation index in request order. */\n index: number;\n /** Operation kind. */\n operationType: \"update\" | \"delete\";\n /** Rows affected by this operation. */\n rowsAffected: number;\n /** For limited deletes, true means additional rows still match. */\n hasMore?: boolean;\n}\n\n/**\n * Result of a batch mutation execution.\n */\nexport interface BatchMutationResult {\n /** Per-operation results in request order. */\n operationResults: BatchMutationOperationResult[];\n /** Aggregate rows affected across all operations. */\n totalRowsAffected: number;\n /** Server-side execution time in milliseconds. */\n executionMs: number;\n}\n\n// --- Internal Mutation Types (not exported from index.ts) ---\n\n/**\n * Request body for POST /api/tables/{name}/rows (insert).\n * @internal\n */\nexport interface InsertRequest {\n /** Required by server for database-scoped requests. Set by client. */\n database: string;\n rows: Record<string, unknown>[];\n}\n\n/**\n * Response from POST /api/tables/{name}/rows (insert).\n * @internal\n */\nexport interface InsertResponse {\n rowsInserted: number;\n executionMs: number;\n generatedValues?: Record<string, Record<string, unknown>>;\n}\n\n// ── ScalarExprNode discriminated union (mirrors Aouda.Protocol.ScalarExprNode) ──\n\n/**\n * Literal (constant) value node.\n * @internal\n */\nexport interface LiteralScalarExpr {\n type: \"literal\";\n value: unknown;\n}\n\n/**\n * Column reference node — reads another column in the same row.\n * @internal\n */\nexport interface ColRefScalarExpr {\n type: \"colRef\";\n col: string;\n}\n\n/**\n * Binary arithmetic node. op must be \"+\", \"-\", \"*\", or \"/\".\n * @internal\n */\nexport interface ArithmeticScalarExpr {\n type: \"arithmetic\";\n op: \"+\" | \"-\" | \"*\" | \"/\";\n left: ScalarExprNode;\n right: ScalarExprNode;\n}\n\n/**\n * Coalesce node — returns the first non-null argument.\n * @internal\n */\nexport interface CoalesceScalarExpr {\n type: \"coalesce\";\n args: ScalarExprNode[];\n}\n\n/**\n * Conditional (CASE WHEN) node. when is a WhereClause evaluated per row.\n * @internal\n */\nexport interface ConditionalScalarExpr {\n type: \"conditional\";\n when: WhereClause;\n then: ScalarExprNode;\n else: ScalarExprNode;\n}\n\n/**\n * Discriminated union for scalar expression nodes in expression-based SET values.\n * Named ScalarExprNode (not SetExprNode) to allow reuse for future SELECT projections.\n * @internal\n */\nexport type ScalarExprNode =\n | LiteralScalarExpr\n | ColRefScalarExpr\n | ArithmeticScalarExpr\n | CoalesceScalarExpr\n | ConditionalScalarExpr;\n\n/**\n * A single server-side computed column definition for SELECT projections.\n * Plain JSON object; the polymorphism lives in ScalarExprNode.\n * @internal\n */\nexport interface ComputedColumnDef {\n /** Output column alias. Must be unique and must not collide with physical column names in the select list. */\n alias: string;\n /** Expression tree evaluated per row to produce the column value. */\n expr: ScalarExprNode;\n}\n\n/**\n * Request body for PATCH /api/tables/{name}/rows (update).\n * @internal\n */\n/**\n * Options for `update()` on a query builder.\n */\nexport interface UpdateOptions {\n /**\n * Columns to include in the RETURNING clause.\n * Use `[\"*\"]` to return all columns.\n * Returned rows reflect post-update values.\n */\n returning?: string[];\n}\n\n/**\n * Options for `delete()` on a query builder.\n */\nexport interface DeleteOptions {\n /**\n * Columns to include in the RETURNING clause.\n * Use `[\"*\"]` to return all columns.\n * Returned rows reflect pre-delete values.\n */\n returning?: string[];\n}\n\nexport interface UpdateRequest {\n /** Required by server for database-scoped requests. Set by client. */\n database: string;\n where: WhereClause;\n set: Record<string, unknown>;\n /** Expression-based SET values. When the same column appears in both set and setExpr, set (literal) takes precedence. */\n setExpr?: Record<string, ScalarExprNode>;\n /**\n * Columns to return after the update. Use `[\"*\"]` for all columns.\n * If omitted, no rows are returned.\n */\n returning?: string[];\n}\n\n/**\n * Response from PATCH /api/tables/{name}/rows (update).\n * @internal\n */\nexport interface UpdateResponse {\n rowsUpdated: number;\n executionMs: number;\n /** Columnar RETURNING data (post-update values). Absent when no returning clause was sent. */\n rows?: ColumnarResponse;\n /** True when the RETURNING result was truncated to MaxReturningRows (10 000). */\n rowsTruncated?: boolean;\n}\n\n/**\n * Request body for DELETE /api/tables/{name}/rows (delete).\n * @internal\n */\nexport interface DeleteRequest {\n /** Required by server for database-scoped requests. Set by client. */\n database: string;\n where: WhereClause;\n limit?: number;\n orderBy?: OrderByClause[];\n /**\n * Columns to return before deletion. Use `[\"*\"]` for all columns.\n * If omitted, no rows are returned.\n */\n returning?: string[];\n}\n\n/**\n * Response from DELETE /api/tables/{name}/rows (delete).\n * @internal\n */\nexport interface DeleteResponse {\n rowsDeleted: number;\n executionMs: number;\n hasMore?: boolean;\n /** Columnar RETURNING data (pre-delete values). Absent when no returning clause was sent. */\n rows?: ColumnarResponse;\n /** True when the RETURNING result was truncated to MaxReturningRows (10 000). */\n rowsTruncated?: boolean;\n}\n\n/**\n * Request body for POST /api/tables/{name}/truncate.\n * @internal\n */\nexport interface TruncateRequest {\n /** Required by server for database-scoped requests. Set by client. */\n database: string;\n}\n\n/**\n * One operation in a batch mutation request.\n * @internal\n */\nexport interface BatchMutationOperationRequest {\n where: WhereClause;\n set?: Record<string, unknown>;\n setExpr?: Record<string, ScalarExprNode>;\n delete?: boolean;\n limit?: number;\n orderBy?: OrderByClause[];\n}\n\n/**\n * Request body for POST /api/tables/{name}/rows/batch.\n * @internal\n */\nexport interface BatchMutationRequest {\n database: string;\n operations: BatchMutationOperationRequest[];\n}\n\n/**\n * Response from POST /api/tables/{name}/rows/batch.\n * @internal\n */\nexport interface BatchMutationResponse {\n operationResults: BatchMutationOperationResult[];\n totalRowsAffected: number;\n executionMs: number;\n}\n\n// --- Internal Table Types (not exported from index.ts) ---\n\n/**\n * Wire protocol response for GET /api/tables.\n * @internal\n */\nexport interface TablesListResponse {\n tables: TableSummary[];\n count: number;\n}\n\n// --- DDL Request Types (create/rename/delete table, add/rename/drop column) ---\n\n/** Valid Aouda column types per wire protocol Data Types. */\nexport const AOUDA_DATA_TYPES = [\n \"Bool\",\n \"Byte\",\n \"Int16\",\n \"Int32\",\n \"Int64\",\n \"UInt16\",\n \"UInt32\",\n \"UInt64\",\n \"Float32\",\n \"Double\",\n \"Decimal\",\n \"String\",\n \"Timestamp\",\n \"Date\",\n \"Guid\",\n] as const;\n\nexport type AoudaDataType = (typeof AOUDA_DATA_TYPES)[number];\n\n/** Partition function applied to partition key columns at insert time. */\nexport type PartitionFunction =\n | \"None\"\n | \"TruncateToDay\"\n | \"TruncateToHour\"\n | \"TruncateToMinute\"\n | \"TruncateToWeek\"\n | \"TruncateToMonth\"\n | \"TruncateToYear\";\n\n/**\n * Column definition when creating a table (POST /api/databases/{db}/tables).\n */\nexport interface CreateColumnRequest {\n name: string;\n type: string;\n /** Whether the column allows null values. */\n isNullable?: boolean;\n primaryKeyOrder?: number;\n partitionKeyOrder?: number;\n clusterOrder?: number;\n partitionFunction?: PartitionFunction;\n reference?: { targetTable: string; targetColumn: string };\n isAutoIncrement?: boolean;\n}\n\n/**\n * Request body for creating a table. Must include database (required by server in multi-db).\n */\nexport interface CreateTableRequest {\n database: string;\n name: string;\n columns: CreateColumnRequest[];\n policy?: { storageTemperature?: string };\n authMode?: AuthorizationMode;\n permissionDimension?: string;\n rlsResolverName?: string;\n}\n\n/**\n * Request body for renaming a table (PATCH /api/databases/{db}/tables/{name}).\n */\nexport interface RenameTableRequest {\n database: string;\n newName: string;\n}\n\n/**\n * Request body for adding a column (POST /api/databases/{db}/tables/{name}/columns).\n */\nexport interface AddColumnRequest {\n database: string;\n name: string;\n type: string;\n}\n\n/**\n * Request body for renaming a column (PATCH /api/databases/{db}/tables/{name}/columns/{columnName}).\n */\nexport interface RenameColumnRequest {\n database: string;\n newName: string;\n}\n\n/**\n * Request body for updating a table's storage policy (PUT /api/databases/{db}/tables/{name}/policy).\n * When calling client.tables.updatePolicy(name, body), the client injects database from the scoped client.\n * storageTemperature: \"Auto\" | \"HotOnly\" | \"ColdPreferred\".\n */\nexport interface UpdateTablePolicyRequest {\n storageTemperature: string;\n}\n\n// --- Databases API (server-level) ---\n\n/**\n * Database options in server response (camelCase).\n */\nexport interface DatabaseOptionsInfo {\n maxMemoryBytes?: number | null;\n defaultTemperature: string;\n enableWal: boolean;\n replicationMode: string;\n}\n\n/**\n * Database info returned by list/create/get (camelCase, matches server JSON).\n */\nexport interface DatabaseInfo {\n name: string;\n state: string;\n createdAt: string;\n options: DatabaseOptionsInfo;\n}\n\n/**\n * Options when creating a database (camelCase, matches server request).\n */\nexport interface CreateDatabaseOptions {\n enableWal?: boolean;\n replicationMode?: string;\n maxMemoryBytes?: number | null;\n defaultTemperature?: string | null;\n}\n\n/**\n * Server response for GET /api/databases (list).\n * @internal\n */\nexport interface DatabaseListResponse {\n databases: DatabaseInfo[];\n count: number;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Bulk-Load Types (S11)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface BulkLoadOptions {\n embeddingModelVersion?: string;\n maxRowsPerSegment?: number;\n conflictPolicy?: \"block\" | \"failFast\";\n pkUniquenessOverride?: \"strict\" | \"recent\" | \"bestEffort\";\n\n /** Replication policy. See ADR 0030. */\n replicationMode?: \"logShipSegments\" | \"skipReplication\" | \"markForSnapshot\";\n /** Two-key safety for \"skipReplication\" on multi-node clusters. */\n forceSingleNodeReplicationBypass?: boolean;\n /** Post-load materialized-query behavior. */\n postLoadMqBehavior?: \"auto\" | \"skip\";\n\n /** Write-concern barrier at commit. Default \"acknowledged\". */\n writeConcern?: \"acknowledged\" | \"majority\" | \"all\";\n /** Max wait for the write-concern barrier in milliseconds. Default 300000 (5 min). */\n writeConcernTimeoutMs?: number;\n\n /** Max rows per :append call. Default 50000. Server caps take precedence if lower. */\n appendBatchSize?: number;\n /** If true, wait for deferred work before resolving. Default false. */\n waitForDeferredWork?: boolean;\n /** Idempotency key. Strongly recommended for production; enables resume from durable cursor. */\n idempotencyKey?: string;\n /** Progress callback invoked after each :append and once during :commit. */\n onProgress?: (progress: BulkLoadProgress) => void;\n /** AbortSignal for cancellation. Issues :abort on the server before throwing. */\n signal?: AbortSignal;\n}\n\nexport interface BulkLoadProgress {\n ivfAssignmentsCompleted: number;\n ivfAssignmentsTotal: number;\n raBitQEncodingsCompleted: number;\n raBitQEncodingsTotal: number;\n cscMirrorsCompleted: number;\n cscMirrorsTotal: number;\n pkIndexRebuildCompleted: number;\n pkIndexRebuildTotal: number;\n replicas: BulkLoadReplicaProgress[];\n}\n\nexport interface BulkLoadReplicaProgress {\n serverId: string;\n segmentsFetched: number;\n segmentsTotal: number;\n lagSeconds: number;\n}\n\nexport interface BulkLoadJobHandle {\n readonly jobId: string;\n readonly tables: readonly string[];\n readonly rowsLoaded: number;\n readonly perTableRowCounts: Readonly<Record<string, number>>;\n readonly rowsDurablyCommitted: number;\n readonly segmentsCreated: number;\n readonly committedAtUtc: string;\n readonly walPosition: number;\n readonly writeConcernSatisfied: \"acknowledged\" | \"majority\" | \"all\";\n readonly writeConcernTimedOut: boolean;\n /** True if this load was resumed from a server-restart-recovered job. */\n readonly wasResumed: boolean;\n /** Resolves when deferred work is done. Polls the server with exponential backoff. */\n readonly deferredWorkCompletion: Promise<BulkLoadProgress>;\n /** One-off progress snapshot. */\n getProgress(): Promise<BulkLoadProgress>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Bulk-Load Wire DTOs (internal, mirrors S10 server shapes)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @internal */\nexport interface BulkLoadBeginRequest {\n database: string;\n tables: string[];\n options?: {\n embeddingModelVersion?: string;\n maxRowsPerSegment?: number;\n conflictPolicy?: string;\n pkUniquenessOverride?: string;\n replicationMode?: string;\n forceSingleNodeReplicationBypass?: boolean;\n postLoadMqBehavior?: string;\n };\n idempotencyKey?: string;\n}\n\n/** @internal */\nexport interface BulkLoadBeginResponse {\n jobId: string;\n tables: string[];\n acquiredAtUtc: string;\n maxRowsPerAppend: number;\n resumedFromDurableCursor?: BulkLoadDurableCursorDto;\n}\n\n/** @internal */\nexport interface BulkLoadAppendResponse {\n rowsAppended: number;\n rowsAppendedToBuffer: number;\n rowsDurablyCommitted: number;\n acceptedAtUtc: string;\n segmentsSealedSoFar: number;\n}\n\n/** @internal */\nexport interface BulkLoadDurableCursorDto {\n rowsDurablyCommitted: number;\n segmentsCommitted: number;\n perTable: Record<string, number>;\n}\n\n/** @internal */\nexport interface BulkLoadCommitRequest {\n database: string;\n jobId: string;\n waitForDeferredWork: boolean;\n writeConcern?: string;\n writeConcernTimeoutMs?: number;\n}\n\n/** @internal */\nexport interface BulkLoadCommitResponse {\n jobId: string;\n tables: string[];\n rowsLoaded: number;\n perTableRowCounts: Record<string, number>;\n segmentsCreated: number;\n committedAtUtc: string;\n deferredWorkCompleted: boolean;\n walPosition: number;\n writeConcernRequested: string;\n writeConcernAchieved: string;\n writeConcernTimedOut: boolean;\n progress?: BulkLoadProgressDto;\n}\n\nexport interface BulkLoadStatusResponse {\n jobId: string;\n tables: string[];\n state: \"acquired\" | \"appending\" | \"committing\" | \"deferred\" | \"completed\" | \"failed\" | \"aborted\" | string;\n rowsAppendedToBuffer: number;\n rowsDurablyCommitted: number;\n segmentsSealed: number;\n startedAtUtc: string;\n lastUpdatedUtc: string;\n progress?: BulkLoadProgressDto;\n replicas: BulkLoadReplicaProgressDto[];\n error?: string;\n errorCode?: string;\n mqRebuildStatus?: \"pending\" | \"inProgress\" | \"completed\" | \"skipped\" | \"failed\" | string;\n}\n\n/** Response for GET /api/databases/{db}/bulk-load:list. */\nexport interface BulkLoadListResponse {\n database: string;\n jobs: BulkLoadStatusResponse[];\n snapshotUtc: string;\n}\n\n/** Request body for POST /api/databases/{db}/bulk-load:force-abort. */\nexport interface BulkLoadForceAbortRequest {\n database: string;\n jobId: string;\n /** Operator-supplied reason recorded in the WAL frame. Required. */\n reason: string;\n}\n\n/** Response for POST /api/databases/{db}/bulk-load:force-abort. */\nexport interface BulkLoadForceAbortResponse {\n jobId: string;\n aborted: boolean;\n}\n\n/** @internal */\nexport interface BulkLoadProgressDto {\n ivfAssignmentsCompleted: number;\n ivfAssignmentsTotal: number;\n raBitQEncodingsCompleted: number;\n raBitQEncodingsTotal: number;\n cscMirrorsCompleted: number;\n cscMirrorsTotal: number;\n pkIndexRebuildCompleted: number;\n pkIndexRebuildTotal: number;\n}\n\nexport interface BulkLoadReplicaProgressDto {\n serverId: string;\n segmentsFetched: number;\n segmentsTotal: number;\n lagSeconds: number;\n}\n","/**\n * @aouda/client error types.\n */\n\n/**\n * Base error class for Aouda client errors.\n */\nexport class AoudaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AoudaError\";\n // Maintain proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when connection to the Aouda server fails.\n * This includes network errors, DNS failures, and connection refused.\n */\nexport class AoudaConnectionError extends AoudaError {\n constructor(\n message: string,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = \"AoudaConnectionError\";\n }\n}\n\n/**\n * Error thrown when a request times out.\n */\nexport class AoudaTimeoutError extends AoudaError {\n constructor(\n message: string,\n public readonly timeoutMs: number\n ) {\n super(message);\n this.name = \"AoudaTimeoutError\";\n }\n}\n\n/**\n * Error thrown when the server returns an unexpected response.\n * Used when the error body cannot be parsed (no error code available).\n */\nexport class AoudaResponseError extends AoudaError {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly statusText: string\n ) {\n super(message);\n this.name = \"AoudaResponseError\";\n }\n}\n\n/**\n * Base class for server-returned errors with a structured error code.\n */\nexport class AoudaApiError extends AoudaError {\n constructor(\n message: string,\n public readonly code: string,\n public readonly statusCode: number,\n public readonly details?: string,\n public readonly requestId?: string\n ) {\n super(message);\n this.name = \"AoudaApiError\";\n }\n}\n\n/**\n * Thrown for TABLE_NOT_FOUND, COLUMN_NOT_FOUND (404).\n */\nexport class AoudaNotFoundError extends AoudaApiError {\n constructor(\n message: string,\n code: string,\n statusCode: number,\n details?: string,\n requestId?: string\n ) {\n super(message, code, statusCode, details, requestId);\n this.name = \"AoudaNotFoundError\";\n }\n}\n\n/**\n * Thrown for TABLE_EXISTS, COLUMN_EXISTS (409).\n */\nexport class AoudaConflictError extends AoudaApiError {\n constructor(\n message: string,\n code: string,\n statusCode: number,\n details?: string,\n requestId?: string\n ) {\n super(message, code, statusCode, details, requestId);\n this.name = \"AoudaConflictError\";\n }\n}\n\n/**\n * Thrown for INVALID_REQUEST, INVALID_OPERATOR, etc. (400).\n */\nexport class AoudaValidationError extends AoudaApiError {\n constructor(\n message: string,\n code: string,\n statusCode: number,\n details?: string,\n requestId?: string\n ) {\n super(message, code, statusCode, details, requestId);\n this.name = \"AoudaValidationError\";\n }\n}\n\n/**\n * Thrown for INTERNAL_ERROR, SERVICE_UNAVAILABLE, etc. (5xx).\n */\nexport class AoudaServerError extends AoudaApiError {\n constructor(\n message: string,\n code: string,\n statusCode: number,\n details?: string,\n requestId?: string\n ) {\n super(message, code, statusCode, details, requestId);\n this.name = \"AoudaServerError\";\n }\n}\n\n/**\n * Thrown for 401 authentication errors (AUTH_TOKEN_EXPIRED, AUTH_TOKEN_INVALID, etc.).\n */\nexport class AoudaAuthenticationError extends AoudaApiError {\n constructor(\n message: string,\n code: string,\n statusCode: number,\n details?: string,\n requestId?: string\n ) {\n super(message, code, statusCode, details, requestId);\n this.name = \"AoudaAuthenticationError\";\n }\n}\n\n/**\n * Thrown when the circuit breaker is open and requests are rejected immediately.\n * Use openedAt and retryAfter to know when the circuit will allow test requests again.\n */\nexport class AoudaCircuitBreakerOpenError extends AoudaError {\n constructor(\n message: string,\n public readonly openedAt: Date,\n public readonly retryAfter: Date,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = \"AoudaCircuitBreakerOpenError\";\n }\n}\n","/**\n * AuthHandler — manages the client's authentication state:\n * token storage, proactive refresh, and a promise-coalescing single-refresh gate.\n *\n * Two-layer auth model: clients connect via API key (Layer 1); user sign-in is performed\n * explicitly via AuthClient.signIn() (Layer 2). There is no auto-authentication on first request.\n *\n * All auth endpoint calls use direct globalThis.fetch to avoid\n * circular refresh through the transport pipeline.\n *\n * @internal\n */\n\nimport type { AuthResult, UserProfile } from \"./auth-types.js\";\nimport { AoudaAuthenticationError } from \"../errors.js\";\n\n/**\n * Flat credential config passed to AuthHandler.\n * Decoupled from ServerAuthOptions/AppAuthOptions so the handler is auth-system-agnostic.\n * @internal\n */\nexport interface AuthConfig {\n /** Resolved auth endpoint base path: \"/api/auth\" or \"/api/databases/{db}/auth\". */\n basePath: string;\n apiKey?: string;\n token?: string;\n refreshToken?: string;\n userToken?: string;\n /** Explicit auth database name (app auth only). */\n authDatabase?: string;\n /** How early before expiry (ms) to proactively refresh. Default: 120_000 (2 min). */\n refreshThresholdMs?: number;\n}\n\nconst DEFAULT_REFRESH_THRESHOLD_MS = 120_000;\nconst CONTENT_TYPE_JSON = \"application/json\";\n\n/**\n * Cross-environment base64url decode using globalThis.atob (Node.js >= 16 + all browsers).\n */\nfunction base64UrlDecode(input: string): string {\n const padded = input.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const pad = padded.length % 4 === 0 ? \"\" : \"=\".repeat(4 - (padded.length % 4));\n return globalThis.atob(padded + pad);\n}\n\n/**\n * Parses the `exp` claim from a JWT payload without any JWT library.\n * Returns Unix seconds or null if unparseable.\n */\nfunction parseTokenExpiry(jwt: string): number | null {\n const parts = jwt.split(\".\");\n if (parts.length !== 3) return null;\n try {\n const payload = JSON.parse(base64UrlDecode(parts[1])) as Record<string, unknown>;\n return typeof payload.exp === \"number\" ? payload.exp : null;\n } catch {\n return null;\n }\n}\n\nexport class AuthHandler {\n private _accessToken: string | null = null;\n private _refreshToken: string | null = null;\n private _tokenExpiry: number | null = null;\n private _authenticated = false;\n private _refreshPromise: Promise<boolean> | null = null;\n private readonly _serverUrl: string;\n private readonly _timeout: number;\n private readonly _refreshThresholdMs: number;\n private readonly _apiKeyMode: boolean;\n private readonly _isServiceKeyMode: boolean;\n private readonly _userToken: string | undefined;\n /** Base path for auth endpoints: either \"/api/auth\" (server) or \"/api/databases/{db}/auth\" (app). */\n private readonly _authBasePath: string;\n private _authDatabase: string | null;\n private readonly _authDatabaseExplicit: boolean;\n\n constructor(\n config: AuthConfig,\n serverUrl: string,\n timeout: number\n ) {\n this._serverUrl = serverUrl.replace(/\\/+$/, \"\");\n this._timeout = timeout;\n this._authBasePath = config.basePath;\n this._authDatabase = config.authDatabase ?? null;\n this._authDatabaseExplicit = config.authDatabase != null;\n this._refreshThresholdMs =\n config.refreshThresholdMs ?? DEFAULT_REFRESH_THRESHOLD_MS;\n this._apiKeyMode = typeof config.apiKey === \"string\" && config.apiKey.length > 0;\n this._isServiceKeyMode =\n this._apiKeyMode &&\n (config.apiKey!.startsWith(\"mk_svc_\") || config.apiKey!.startsWith(\"mk_srv_\"));\n this._userToken = config.userToken;\n\n if (this._apiKeyMode) {\n this._accessToken = config.apiKey ?? null;\n this._authenticated = true;\n } else if (config.token) {\n this._accessToken = config.token;\n this._refreshToken = config.refreshToken ?? null;\n this._tokenExpiry = parseTokenExpiry(config.token);\n this._authenticated = true;\n } else if (config.refreshToken) {\n this._refreshToken = config.refreshToken;\n }\n }\n\n /** True when configured with apiKey and no refresh-capable user session exists. */\n get isApiKeyMode(): boolean {\n return this._apiKeyMode && this._refreshToken == null;\n }\n\n /**\n * The user JWT to forward as X-User-Token on outgoing requests.\n * Non-null only when the primary credential is a service-level key\n * (prefix `mk_svc_` or `mk_srv_`) and `userToken` was set in the auth config.\n */\n get userToken(): string | null {\n return this._isServiceKeyMode ? (this._userToken ?? null) : null;\n }\n\n /** The resolved auth database name (explicit, discovered, or default \"_auth\"). */\n get authDatabase(): string {\n return this._authDatabase ?? \"_auth\";\n }\n\n /**\n * Updates the auth database from an X-Auth-Database response header.\n * Only updates if the database was not explicitly configured at construction.\n */\n setDiscoveredAuthDatabase(name: string): void {\n if (!name) return;\n if (this._authDatabaseExplicit) return;\n this._authDatabase = name;\n }\n\n /** Whether initial authentication has completed. */\n get isAuthenticated(): boolean {\n return this._authenticated;\n }\n\n /** Internal server URL used for direct auth endpoint calls. */\n get serverUrl(): string {\n return this._serverUrl;\n }\n\n /** Internal auth base path (e.g. /api/auth or /api/databases/{db}/auth). */\n get authBasePath(): string {\n return this._authBasePath;\n }\n\n /** Internal request timeout used for direct auth endpoint calls. */\n get timeoutMs(): number {\n return this._timeout;\n }\n\n /** Current access token (null if not yet authenticated). */\n get currentAccessToken(): string | null {\n return this._accessToken;\n }\n\n /** Current refresh token (null if not set). */\n get currentRefreshToken(): string | null {\n return this._refreshToken;\n }\n\n /**\n * No-op in the two-layer auth model.\n * App-mode clients connect via ApiKey (set at construction).\n * User sign-in is done explicitly via AuthClient.signIn() / signUp().\n */\n async ensureAuthenticated(): Promise<void> {\n // No-op: two-layer model requires explicit signIn() call.\n }\n\n /**\n * Returns the current access token. If the token is within the refresh threshold\n * of expiry, proactively refreshes first. In API key mode, returns the API key with no refresh.\n */\n async getAccessToken(): Promise<string | null> {\n if (this._accessToken == null) return null;\n if (this._apiKeyMode) return this._accessToken;\n\n if (this.shouldProactivelyRefresh()) {\n await this.tryRefresh();\n }\n\n return this._accessToken;\n }\n\n /**\n * Attempts to refresh the access token using the stored refresh token.\n * Uses promise coalescing: if a refresh is already in flight, all callers\n * await the same Promise. The first caller initiates the refresh; subsequent\n * callers get the same result.\n *\n * @returns true if refresh succeeded, false if it failed.\n */\n async tryRefresh(): Promise<boolean> {\n if (this._refreshToken == null) return false;\n\n if (this._refreshPromise != null) return this._refreshPromise;\n\n this._refreshPromise = this._doRefresh();\n try {\n return await this._refreshPromise;\n } finally {\n this._refreshPromise = null;\n }\n }\n\n /**\n * Stores tokens from an auth response (sign-in, sign-up, or refresh).\n */\n handleSignInResult(result: AuthResult): void {\n this._accessToken = result.accessToken;\n this._refreshToken = result.refreshToken;\n this._tokenExpiry = parseTokenExpiry(result.accessToken);\n this._authenticated = true;\n }\n\n /**\n * Clears all stored tokens (called on sign-out).\n */\n clearTokens(): void {\n this._accessToken = null;\n this._refreshToken = null;\n this._tokenExpiry = null;\n this._authenticated = false;\n }\n\n // --- Auth endpoint calls (direct fetch, bypass transport pipeline) ---\n\n async callSignInEndpoint(\n email: string,\n password: string\n ): Promise<AuthResult | null> {\n const url = `${this._serverUrl}${this._authBasePath}/signin`;\n const response = await this._fetchJson(url, \"POST\", { email, password });\n if (!response.ok) {\n const body = await this._tryReadErrorBody(response);\n throw new AoudaAuthenticationError(\n `Sign-in failed with status ${response.status}.`,\n body?.code ?? body?.error ?? \"AUTH_SIGNIN_FAILED\",\n response.status,\n body?.details,\n body?.requestId\n );\n }\n return (await response.json()) as AuthResult;\n }\n\n async callSignUpEndpoint(\n email: string,\n password: string\n ): Promise<AuthResult | null> {\n const url = `${this._serverUrl}${this._authBasePath}/signup`;\n const response = await this._fetchJson(url, \"POST\", { email, password });\n if (!response.ok) {\n const body = await this._tryReadErrorBody(response);\n throw new AoudaAuthenticationError(\n `Sign-up failed with status ${response.status}.`,\n body?.code ?? body?.error ?? \"AUTH_SIGNUP_FAILED\",\n response.status,\n body?.details,\n body?.requestId\n );\n }\n return (await response.json()) as AuthResult;\n }\n\n async callSignOutEndpoint(): Promise<void> {\n const url = `${this._serverUrl}${this._authBasePath}/signout`;\n const headers: Record<string, string> = {\n \"Content-Type\": CONTENT_TYPE_JSON,\n };\n if (this._accessToken) {\n headers[\"Authorization\"] = `Bearer ${this._accessToken}`;\n }\n // Sign-out is best-effort; don't throw on failure\n try {\n await globalThis.fetch(url, {\n method: \"POST\",\n headers,\n signal: AbortSignal.timeout(this._timeout),\n });\n } catch {\n // Swallow errors — sign-out is best-effort\n }\n }\n\n async callRefreshEndpoint(): Promise<AuthResult> {\n const url = `${this._serverUrl}${this._authBasePath}/refresh`;\n const response = await this._fetchJson(url, \"POST\", {\n refreshToken: this._refreshToken,\n });\n if (!response.ok) {\n const body = await this._tryReadErrorBody(response);\n throw new AoudaAuthenticationError(\n `Token refresh failed with status ${response.status}.`,\n body?.code ?? body?.error ?? \"AUTH_REFRESH_FAILED\",\n response.status,\n body?.details,\n body?.requestId\n );\n }\n return (await response.json()) as AuthResult;\n }\n\n async callMeEndpoint(): Promise<UserProfile> {\n await this.ensureAuthenticated();\n const token = await this.getAccessToken();\n\n const url = `${this._serverUrl}${this._authBasePath}/me`;\n const headers: Record<string, string> = {};\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n const response = await globalThis.fetch(url, {\n method: \"GET\",\n headers,\n signal: AbortSignal.timeout(this._timeout),\n });\n if (!response.ok) {\n const body = await this._tryReadErrorBody(response);\n throw new AoudaAuthenticationError(\n `Profile request failed with status ${response.status}.`,\n body?.code ?? body?.error ?? \"AUTH_PROFILE_FAILED\",\n response.status,\n body?.details,\n body?.requestId\n );\n }\n return (await response.json()) as UserProfile;\n }\n\n async callChangePasswordEndpoint(\n currentPassword: string,\n newPassword: string\n ): Promise<void> {\n await this.ensureAuthenticated();\n const token = await this.getAccessToken();\n\n const url = `${this._serverUrl}${this._authBasePath}/password`;\n const headers: Record<string, string> = {\n \"Content-Type\": CONTENT_TYPE_JSON,\n };\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n const response = await globalThis.fetch(url, {\n method: \"PUT\",\n headers,\n body: JSON.stringify({ currentPassword, newPassword }),\n signal: AbortSignal.timeout(this._timeout),\n });\n if (!response.ok) {\n const body = await this._tryReadErrorBody(response);\n throw new AoudaAuthenticationError(\n `Password change failed with status ${response.status}.`,\n body?.code ?? body?.error ?? \"AUTH_PASSWORD_CHANGE_FAILED\",\n response.status,\n body?.details,\n body?.requestId\n );\n }\n }\n\n // --- Internal helpers ---\n\n private shouldProactivelyRefresh(): boolean {\n if (this._tokenExpiry == null) return false;\n const nowSeconds = Date.now() / 1000;\n const thresholdSeconds = this._refreshThresholdMs / 1000;\n return this._tokenExpiry <= nowSeconds + thresholdSeconds;\n }\n\n private async _doRefresh(): Promise<boolean> {\n try {\n const result = await this.callRefreshEndpoint();\n this.handleSignInResult(result);\n return true;\n } catch {\n return false;\n }\n }\n\n private async _fetchJson(\n url: string,\n method: string,\n body: unknown\n ): Promise<Response> {\n const headers: Record<string, string> = {\n \"Content-Type\": CONTENT_TYPE_JSON,\n };\n if (this._accessToken) {\n headers[\"Authorization\"] = `Bearer ${this._accessToken}`;\n }\n\n return globalThis.fetch(url, {\n method,\n headers,\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this._timeout),\n });\n }\n\n private async _tryReadErrorBody(\n response: Response\n ): Promise<{ error?: string; code?: string; details?: string; requestId?: string } | null> {\n try {\n const text = await response.text();\n if (!text) return null;\n return JSON.parse(text) as { error?: string; code?: string; details?: string; requestId?: string };\n } catch {\n return null;\n }\n }\n}\n","/**\n * AuthTransport — Transport wrapper that handles auth header injection\n * and 401 refresh+retry. Sits between ResilientTransport and HttpTransport\n * in the transport pipeline.\n *\n * Pipeline: ResilientTransport → AuthTransport → HttpTransport → fetch\n *\n * @internal\n */\n\nimport type { Transport } from \"../transport.js\";\nimport type {\n RequestConfig,\n RequestOptions,\n BulkLoadListResponse,\n BulkLoadForceAbortResponse,\n} from \"../types.js\";\nimport { AoudaAuthenticationError } from \"../errors.js\";\nimport { AuthHandler } from \"./auth-handler.js\";\n\nconst REQUEST_ID_HEADER = \"X-Request-Id\";\n\nexport class AuthTransport implements Transport {\n private readonly _inner: Transport;\n private readonly _authHandler: AuthHandler;\n\n constructor(inner: Transport, authHandler: AuthHandler) {\n this._inner = inner;\n this._authHandler = authHandler;\n }\n\n async request<T>(config: RequestConfig): Promise<T> {\n await this._authHandler.ensureAuthenticated();\n\n const token = await this._authHandler.getAccessToken();\n const userToken = this._authHandler.userToken;\n const authConfig = this.injectAuthHeaders(config, token, userToken);\n\n try {\n return await this._inner.request<T>(authConfig);\n } catch (error) {\n if (!this.isAuthError(error)) throw error;\n\n if (this._authHandler.isApiKeyMode) {\n throw error;\n }\n\n if (await this._authHandler.tryRefresh()) {\n const newToken = await this._authHandler.getAccessToken();\n const retryConfig = this.injectAuthHeaders(config, newToken, userToken);\n return await this._inner.request<T>(retryConfig);\n }\n\n throw error;\n }\n }\n\n async requestRaw(config: RequestConfig): Promise<Response> {\n await this._authHandler.ensureAuthenticated();\n\n const token = await this._authHandler.getAccessToken();\n const userToken = this._authHandler.userToken;\n const authConfig = this.injectAuthHeaders(config, token, userToken);\n\n try {\n return await this._inner.requestRaw(authConfig);\n } catch (error) {\n if (!this.isAuthError(error)) throw error;\n\n if (this._authHandler.isApiKeyMode) {\n throw error;\n }\n\n if (await this._authHandler.tryRefresh()) {\n const newToken = await this._authHandler.getAccessToken();\n const retryConfig = this.injectAuthHeaders(config, newToken, userToken);\n return await this._inner.requestRaw(retryConfig);\n }\n\n throw error;\n }\n }\n\n // --- Convenience methods delegate to request() ---\n\n get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>({\n method: \"GET\",\n path,\n headers: this.buildHeaders(options),\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n post<T>(path: string, body: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({\n method: \"POST\",\n path,\n body,\n headers: this.buildHeaders(options),\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n put<T>(path: string, body: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({\n method: \"PUT\",\n path,\n body,\n headers: this.buildHeaders(options),\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n patch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({\n method: \"PATCH\",\n path,\n body,\n headers: this.buildHeaders(options),\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n delete<T>(\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({\n method: \"DELETE\",\n path,\n body,\n headers: this.buildHeaders(options),\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n getText(path: string, options?: RequestOptions): Promise<string> {\n const headers = this.buildHeaders(options) ?? {};\n const withAccept = { Accept: \"text/plain\", ...headers };\n return this.request<string>({\n method: \"GET\",\n path,\n headers: withAccept,\n timeout: options?.timeout,\n signal: options?.signal,\n rawText: true,\n });\n }\n\n postRaw<T>(path: string, rawBody: string, contentType: string, options?: RequestOptions): Promise<T> {\n const headers: Record<string, string> = {\n \"Content-Type\": contentType,\n ...this.buildHeaders(options),\n };\n return this.request<T>({\n method: \"POST\",\n path,\n headers,\n timeout: options?.timeout,\n signal: options?.signal,\n rawBodyStr: rawBody,\n });\n }\n\n bulkLoadList(db: string): Promise<BulkLoadListResponse> {\n return this.get<BulkLoadListResponse>(\n `/api/databases/${encodeURIComponent(db)}/bulk-load:list`\n );\n }\n\n bulkLoadForceAbort(db: string, jobId: string, reason: string): Promise<BulkLoadForceAbortResponse> {\n return this.post<BulkLoadForceAbortResponse>(\n `/api/databases/${encodeURIComponent(db)}/bulk-load:force-abort`,\n { database: db, jobId, reason }\n );\n }\n\n abort(): void {\n this._inner.abort();\n }\n\n reset(): void {\n this._inner.reset();\n }\n\n // --- Private helpers ---\n\n private injectAuthHeaders(\n config: RequestConfig,\n token: string | null,\n userToken: string | null\n ): RequestConfig {\n if (token == null && userToken == null) return config;\n const headers: Record<string, string> = { ...config.headers };\n if (token != null) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n if (userToken != null) {\n headers[\"X-User-Token\"] = userToken;\n }\n return { ...config, headers };\n }\n\n private isAuthError(error: unknown): boolean {\n return error instanceof AoudaAuthenticationError;\n }\n\n private buildHeaders(\n options?: RequestOptions\n ): Record<string, string> | undefined {\n const headers = { ...options?.headers };\n if (options?.requestId != null) {\n headers[REQUEST_ID_HEADER] = options.requestId;\n }\n return Object.keys(headers).length > 0 ? headers : undefined;\n }\n}\n","/**\n * AuthClient — public auth API exposed as `client.auth`.\n * Makes direct fetch calls through AuthHandler (not through the transport\n * pipeline) to avoid circular refresh.\n */\n\nimport type {\n AuthResult,\n UserProfile,\n CreatePartitionGrantRequest,\n PartitionGrant,\n PartitionGrantsListResponse,\n CreateRlsResolverRequest,\n RlsResolver,\n RlsResolversListResponse,\n UpdateRlsResolverRequest,\n} from \"./auth-types.js\";\nimport { AuthHandler } from \"./auth-handler.js\";\nimport { AoudaAuthenticationError } from \"../errors.js\";\n\n/**\n * Public auth API for application-level auth operations.\n * Access via `client.auth`.\n */\nexport class AuthClient {\n private readonly _authHandler: AuthHandler;\n\n constructor(authHandler: AuthHandler) {\n this._authHandler = authHandler;\n }\n\n /**\n * Creates a new user account and returns auth tokens.\n * Updates the client's stored tokens so subsequent requests use the new identity.\n */\n async signUp(email: string, password: string): Promise<AuthResult> {\n const result = await this._authHandler.callSignUpEndpoint(email, password);\n if (result != null) {\n this._authHandler.handleSignInResult(result);\n }\n return result!;\n }\n\n /**\n * Authenticates with credentials and returns auth tokens.\n * Updates the client's stored tokens so subsequent requests use the new identity.\n */\n async signIn(email: string, password: string): Promise<AuthResult> {\n const result = await this._authHandler.callSignInEndpoint(email, password);\n if (result != null) {\n this._authHandler.handleSignInResult(result);\n }\n return result!;\n }\n\n /**\n * Signs out the current user, revokes session, and clears stored tokens.\n */\n async signOut(): Promise<void> {\n await this._authHandler.callSignOutEndpoint();\n this._authHandler.clearTokens();\n }\n\n /**\n * Refreshes the access token using the stored refresh token.\n * Updates the client's stored tokens.\n */\n async refresh(): Promise<AuthResult> {\n const result = await this._authHandler.callRefreshEndpoint();\n this._authHandler.handleSignInResult(result);\n return result;\n }\n\n /**\n * Returns the current user's profile.\n */\n async me(): Promise<UserProfile> {\n return this._authHandler.callMeEndpoint();\n }\n\n /**\n * Changes the current user's password.\n */\n async changePassword(\n currentPassword: string,\n newPassword: string\n ): Promise<void> {\n return this._authHandler.callChangePasswordEndpoint(\n currentPassword,\n newPassword\n );\n }\n\n /**\n * Creates a partition grant for a user.\n */\n async createPartitionGrant(\n userId: string,\n request: CreatePartitionGrantRequest\n ): Promise<PartitionGrant> {\n this.validateNonEmptyString(userId, \"userId\");\n this.validateNonEmptyString(request.dimension, \"dimension\");\n this.validateNonEmptyString(request.partitionKey, \"partitionKey\");\n\n const encodedUserId = encodeURIComponent(userId);\n return this.authRequest<PartitionGrant>(\n \"POST\",\n `/admin/users/${encodedUserId}/partition-grants`,\n request\n );\n }\n\n /**\n * Lists partition grants for a user with optional dimension filtering.\n */\n async listPartitionGrants(\n userId: string,\n options?: { dimension?: string }\n ): Promise<PartitionGrant[]> {\n this.validateNonEmptyString(userId, \"userId\");\n const encodedUserId = encodeURIComponent(userId);\n const params = new URLSearchParams();\n if (options?.dimension) {\n params.set(\"dimension\", options.dimension);\n }\n\n const suffix = params.toString();\n const path = `/admin/users/${encodedUserId}/partition-grants${suffix ? `?${suffix}` : \"\"}`;\n const response =\n await this.authRequest<PartitionGrantsListResponse>(\"GET\", path);\n return response.grants;\n }\n\n /**\n * Deletes a partition grant for a user.\n */\n async deletePartitionGrant(userId: string, grantId: string): Promise<void> {\n this.validateNonEmptyString(userId, \"userId\");\n this.validateNonEmptyString(grantId, \"grantId\");\n const encodedUserId = encodeURIComponent(userId);\n const encodedGrantId = encodeURIComponent(grantId);\n await this.authRequest<void>(\n \"DELETE\",\n `/admin/users/${encodedUserId}/partition-grants/${encodedGrantId}`\n );\n }\n\n /**\n * Creates an RLS resolver.\n */\n async createRlsResolver(request: CreateRlsResolverRequest): Promise<RlsResolver> {\n this.validateNonEmptyString(request.name, \"name\");\n this.validateNonEmptyString(request.targetTable, \"targetTable\");\n this.validateNonEmptyString(request.resolverType, \"resolverType\");\n\n return this.authRequest<RlsResolver>(\"POST\", \"/admin/rls-resolvers\", request);\n }\n\n /**\n * Lists RLS resolvers with optional target table filtering.\n */\n async listRlsResolvers(options?: {\n targetTable?: string;\n }): Promise<RlsResolver[]> {\n const params = new URLSearchParams();\n if (options?.targetTable) {\n params.set(\"targetTable\", options.targetTable);\n }\n\n const suffix = params.toString();\n const path = `/admin/rls-resolvers${suffix ? `?${suffix}` : \"\"}`;\n const response = await this.authRequest<RlsResolversListResponse>(\n \"GET\",\n path\n );\n return response.resolvers;\n }\n\n /**\n * Gets a single RLS resolver.\n */\n async getRlsResolver(resolverId: string): Promise<RlsResolver> {\n this.validateNonEmptyString(resolverId, \"resolverId\");\n const encodedResolverId = encodeURIComponent(resolverId);\n return this.authRequest<RlsResolver>(\n \"GET\",\n `/admin/rls-resolvers/${encodedResolverId}`\n );\n }\n\n /**\n * Updates an existing RLS resolver.\n */\n async updateRlsResolver(\n resolverId: string,\n request: UpdateRlsResolverRequest\n ): Promise<RlsResolver> {\n this.validateNonEmptyString(resolverId, \"resolverId\");\n const encodedResolverId = encodeURIComponent(resolverId);\n return this.authRequest<RlsResolver>(\n \"PATCH\",\n `/admin/rls-resolvers/${encodedResolverId}`,\n request\n );\n }\n\n /**\n * Deletes an RLS resolver.\n */\n async deleteRlsResolver(resolverId: string): Promise<void> {\n this.validateNonEmptyString(resolverId, \"resolverId\");\n const encodedResolverId = encodeURIComponent(resolverId);\n await this.authRequest<void>(\"DELETE\", `/admin/rls-resolvers/${encodedResolverId}`);\n }\n\n private validateNonEmptyString(value: string, fieldName: string): void {\n if (value.trim().length === 0) {\n throw new Error(`${fieldName} must be a non-empty string`);\n }\n }\n\n private async authRequest<T>(\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\",\n path: string,\n body?: unknown\n ): Promise<T> {\n await this._authHandler.ensureAuthenticated();\n const token = await this._authHandler.getAccessToken();\n const endpoint = `${this._authHandler.serverUrl}${this._authHandler.authBasePath}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n const response = await globalThis.fetch(endpoint, {\n method,\n headers,\n body:\n body !== undefined && method !== \"GET\" && method !== \"DELETE\"\n ? JSON.stringify(body)\n : undefined,\n signal: AbortSignal.timeout(this._authHandler.timeoutMs),\n });\n\n if (!response.ok) {\n const parsed = await this.tryReadAuthError(response);\n throw new AoudaAuthenticationError(\n parsed?.error ?? `Request failed with status ${response.status}.`,\n parsed?.code ?? \"AUTH_ADMIN_REQUEST_FAILED\",\n response.status,\n parsed?.details,\n parsed?.requestId\n );\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const text = await response.text();\n if (text.trim().length === 0) {\n return undefined as T;\n }\n\n return JSON.parse(text) as T;\n }\n\n private async tryReadAuthError(\n response: Response\n ): Promise<\n { error?: string; code?: string; details?: string; requestId?: string } | null\n > {\n try {\n const text = await response.text();\n if (!text) return null;\n return JSON.parse(text) as {\n error?: string;\n code?: string;\n details?: string;\n requestId?: string;\n };\n } catch {\n return null;\n }\n }\n}\n","/**\n * Bulk-load coordinator for @aouda/client.\n * Implements the :begin / :append × N / :commit HTTP sequence.\n * No Node-only dependencies — works in any fetch-capable runtime.\n */\n\nimport type { Transport } from \"./transport.js\";\nimport type {\n BulkLoadOptions,\n BulkLoadJobHandle,\n BulkLoadProgress,\n BulkLoadBeginRequest,\n BulkLoadBeginResponse,\n BulkLoadAppendResponse,\n BulkLoadCommitRequest,\n BulkLoadCommitResponse,\n BulkLoadStatusResponse,\n BulkLoadProgressDto,\n BulkLoadReplicaProgressDto,\n} from \"./types.js\";\nimport { AoudaApiError } from \"./errors.js\";\n\nfunction databasePath(db: string): string {\n return `/api/databases/${encodeURIComponent(db)}`;\n}\n\n/**\n * Yield batches from an Iterable or AsyncIterable, skipping the first `skip` rows.\n * Works for both synchronous and asynchronous iterables via `for await`.\n */\nasync function* chunkedWithSkip<T>(\n rows: Iterable<T> | AsyncIterable<T>,\n size: number,\n skip: number\n): AsyncIterable<T[]> {\n let batch: T[] = [];\n let index = 0;\n for await (const row of rows as AsyncIterable<T>) {\n if (index++ < skip) continue;\n batch.push(row);\n if (batch.length >= size) {\n yield batch;\n batch = [];\n }\n }\n if (batch.length > 0) yield batch;\n}\n\nfunction mapProgress(\n dto: BulkLoadProgressDto | undefined,\n replicas: BulkLoadReplicaProgressDto[]\n): BulkLoadProgress {\n return {\n ivfAssignmentsCompleted: dto?.ivfAssignmentsCompleted ?? 0,\n ivfAssignmentsTotal: dto?.ivfAssignmentsTotal ?? 0,\n raBitQEncodingsCompleted: dto?.raBitQEncodingsCompleted ?? 0,\n raBitQEncodingsTotal: dto?.raBitQEncodingsTotal ?? 0,\n cscMirrorsCompleted: dto?.cscMirrorsCompleted ?? 0,\n cscMirrorsTotal: dto?.cscMirrorsTotal ?? 0,\n pkIndexRebuildCompleted: dto?.pkIndexRebuildCompleted ?? 0,\n pkIndexRebuildTotal: dto?.pkIndexRebuildTotal ?? 0,\n replicas: replicas.map((r) => ({\n serverId: r.serverId,\n segmentsFetched: r.segmentsFetched,\n segmentsTotal: r.segmentsTotal,\n lagSeconds: r.lagSeconds,\n })),\n };\n}\n\n/**\n * Build a BulkLoadJobHandle from the commit response.\n */\nfunction buildHandle(\n jobId: string,\n commitResp: BulkLoadCommitResponse,\n wasResumed: boolean,\n transport: Transport,\n database: string,\n signal: AbortSignal | undefined\n): BulkLoadJobHandle {\n const statusPath = `${databasePath(database)}/bulk-load/${encodeURIComponent(jobId)}`;\n\n const completedProgress =\n commitResp.deferredWorkCompleted\n ? mapProgress(commitResp.progress, [])\n : null;\n\n const pollDeferred = (): Promise<BulkLoadProgress> =>\n pollDeferredWork(transport, statusPath, signal);\n\n const lazyDeferred: { task: Promise<BulkLoadProgress> | null } = { task: null };\n\n return {\n jobId: commitResp.jobId,\n tables: commitResp.tables,\n rowsLoaded: commitResp.rowsLoaded,\n perTableRowCounts: commitResp.perTableRowCounts,\n rowsDurablyCommitted: commitResp.rowsLoaded,\n segmentsCreated: commitResp.segmentsCreated,\n committedAtUtc: commitResp.committedAtUtc,\n walPosition: commitResp.walPosition,\n writeConcernSatisfied: (commitResp.writeConcernAchieved ?? \"acknowledged\") as\n | \"acknowledged\"\n | \"majority\"\n | \"all\",\n writeConcernTimedOut: commitResp.writeConcernTimedOut,\n wasResumed,\n get deferredWorkCompletion(): Promise<BulkLoadProgress> {\n if (completedProgress !== null) {\n return Promise.resolve(completedProgress);\n }\n if (lazyDeferred.task === null) {\n lazyDeferred.task = pollDeferred();\n }\n return lazyDeferred.task;\n },\n getProgress(): Promise<BulkLoadProgress> {\n return transport\n .get<BulkLoadStatusResponse>(statusPath, { signal })\n .then((s) => mapProgress(s.progress, s.replicas));\n },\n };\n}\n\nasync function pollDeferredWork(\n transport: Transport,\n statusPath: string,\n signal: AbortSignal | undefined\n): Promise<BulkLoadProgress> {\n const delays = [1000, 2000, 4000, 8000, 16000];\n let delayIndex = 0;\n\n while (true) {\n const status = await transport.get<BulkLoadStatusResponse>(statusPath, { signal });\n\n if (status.state === \"completed\") {\n return mapProgress(status.progress, status.replicas);\n }\n\n if (status.state === \"failed\") {\n const msg = status.error ?? \"Bulk-load deferred work failed.\";\n throw new AoudaApiError(msg, status.errorCode ?? \"BULK_LOAD_FAILED\", 500, undefined, undefined);\n }\n\n const delay = delays[Math.min(delayIndex++, delays.length - 1)];\n await new Promise<void>((resolve, reject) => {\n const id = setTimeout(resolve, delay);\n signal?.addEventListener(\"abort\", () => {\n clearTimeout(id);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n }, { once: true });\n });\n }\n}\n\n/**\n * POST NDJSON body to a path, returning parsed JSON response.\n * Uses transport.postRaw to bypass JSON serialization of the body.\n */\nfunction postNdjson<T>(\n transport: Transport,\n path: string,\n ndjsonBody: string,\n signal: AbortSignal | undefined\n): Promise<T> {\n return transport.postRaw<T>(path, ndjsonBody, \"application/x-ndjson\", { signal });\n}\n\n/**\n * Coordinator for the bulk-load HTTP sequence.\n */\nexport class BulkLoadCoordinator {\n constructor(\n private readonly transport: Transport,\n private readonly database: string\n ) {}\n\n async run<T extends Record<string, unknown>>(\n tables: readonly string[],\n rows: Iterable<T> | AsyncIterable<T>,\n options: BulkLoadOptions = {}\n ): Promise<BulkLoadJobHandle> {\n if (tables.length === 0) {\n throw new Error(\"At least one table must be specified.\");\n }\n\n const idempotencyKey = options.idempotencyKey ?? crypto.randomUUID();\n const dbPath = databasePath(this.database);\n\n // 1. :begin\n const beginBody: BulkLoadBeginRequest = {\n database: this.database,\n tables: [...tables],\n idempotencyKey,\n options: {\n embeddingModelVersion: options.embeddingModelVersion,\n maxRowsPerSegment: options.maxRowsPerSegment,\n conflictPolicy: options.conflictPolicy,\n pkUniquenessOverride: options.pkUniquenessOverride,\n replicationMode: options.replicationMode,\n forceSingleNodeReplicationBypass: options.forceSingleNodeReplicationBypass,\n postLoadMqBehavior: options.postLoadMqBehavior,\n },\n };\n\n const beginResp = await this.transport.post<BulkLoadBeginResponse>(\n `${dbPath}/bulk-load:begin`,\n beginBody,\n { signal: options.signal }\n );\n\n const jobId = beginResp.jobId;\n const maxRowsPerAppend = beginResp.maxRowsPerAppend > 0 ? beginResp.maxRowsPerAppend : 100_000;\n const batchSize = Math.min(options.appendBatchSize ?? 50_000, maxRowsPerAppend);\n\n const resumeOffset = beginResp.resumedFromDurableCursor?.rowsDurablyCommitted ?? 0;\n const wasResumed = resumeOffset > 0;\n\n const appendPath = `${dbPath}/bulk-load/${encodeURIComponent(jobId)}:append`;\n const abortPath = `${dbPath}/bulk-load/${encodeURIComponent(jobId)}:abort`;\n\n try {\n // 2. :append loop\n for await (const batch of chunkedWithSkip(rows, batchSize, resumeOffset)) {\n const ndjson = batch.map((r) => JSON.stringify(r)).join(\"\\n\") + \"\\n\";\n const appendResp = await postNdjson<BulkLoadAppendResponse>(\n this.transport,\n appendPath,\n ndjson,\n options.signal\n );\n\n options.onProgress?.(\n mapProgress(undefined, [])\n );\n // rowsDurablyCommitted from the append response tracks the server's durable cursor\n // but is not forwarded to the onProgress callback: BulkLoadProgress carries deferred-work\n // counters (IVF/RaBitQ/CSC/PK rebuild), not streaming row counters. There is no field on\n // BulkLoadProgress for row-level durable progress. It is retained here for potential\n // future use (e.g. a richer progress type in a later session).\n void appendResp.rowsDurablyCommitted;\n }\n\n // 3. :commit\n const commitBody: BulkLoadCommitRequest = {\n database: this.database,\n jobId,\n waitForDeferredWork: options.waitForDeferredWork ?? false,\n writeConcern: options.writeConcern,\n writeConcernTimeoutMs: options.writeConcernTimeoutMs,\n };\n\n const commitResp = await this.transport.post<BulkLoadCommitResponse>(\n `${dbPath}/bulk-load/${encodeURIComponent(jobId)}:commit`,\n commitBody,\n { signal: options.signal }\n );\n\n if (commitResp.progress) {\n options.onProgress?.(mapProgress(commitResp.progress, []));\n }\n\n return buildHandle(jobId, commitResp, wasResumed, this.transport, this.database, options.signal);\n } catch (err) {\n // Best-effort abort on any error (including cancellation)\n await this.transport\n .post(abortPath, { database: this.database, jobId })\n .catch(() => {\n // ignore abort errors\n });\n throw err;\n }\n }\n}\n","/**\n * HTTP transport layer for @aouda/client.\n * Internal use only — not exported from the package.\n */\n\nimport type {\n HttpTransportOptions,\n RequestConfig,\n RequestOptions,\n ErrorResponse,\n BulkLoadListResponse,\n BulkLoadForceAbortResponse,\n} from \"./types.js\";\nimport {\n AoudaConnectionError,\n AoudaTimeoutError,\n AoudaResponseError,\n AoudaApiError,\n AoudaNotFoundError,\n AoudaConflictError,\n AoudaValidationError,\n AoudaServerError,\n AoudaAuthenticationError,\n} from \"./errors.js\";\n\nconst PROTOCOL_VERSION_HEADER = \"X-Aouda-Protocol-Version\";\nconst PROTOCOL_VERSION = \"1\";\nconst CONTENT_TYPE_JSON = \"application/json\";\nconst REQUEST_ID_HEADER = \"X-Request-Id\";\n\n/** Map server error codes to AoudaApiError subclass constructors. */\nconst ERROR_CODE_MAP: Record<\n string,\n new (\n message: string,\n code: string,\n statusCode: number,\n details?: string,\n requestId?: string\n ) => AoudaApiError\n> = {\n TABLE_NOT_FOUND: AoudaNotFoundError,\n COLUMN_NOT_FOUND: AoudaNotFoundError,\n TABLE_EXISTS: AoudaConflictError,\n COLUMN_EXISTS: AoudaConflictError,\n WRITE_NOT_ALLOWED: AoudaApiError,\n NOT_PRIMARY: AoudaApiError,\n INVALID_REQUEST: AoudaValidationError,\n INVALID_FORMAT: AoudaValidationError,\n MISSING_DATABASE: AoudaValidationError,\n MISSING_TABLE: AoudaValidationError,\n INVALID_OPERATOR: AoudaValidationError,\n INVALID_COLUMN: AoudaValidationError,\n INVALID_VALUE: AoudaValidationError,\n UNSUPPORTED_VERSION: AoudaValidationError,\n MALFORMED_REQUEST: AoudaValidationError,\n INTERNAL_ERROR: AoudaServerError,\n SERVICE_UNAVAILABLE: AoudaServerError,\n TIMEOUT: AoudaServerError,\n OVERLOADED: AoudaServerError,\n AUTH_TOKEN_MISSING: AoudaAuthenticationError,\n AUTH_TOKEN_EXPIRED: AoudaAuthenticationError,\n AUTH_TOKEN_INVALID: AoudaAuthenticationError,\n AUTH_TOKEN_REVOKED: AoudaAuthenticationError,\n AUTH_API_KEY_INVALID: AoudaAuthenticationError,\n AUTH_REQUIRED: AoudaAuthenticationError,\n};\n\n/**\n * Creates a composed abort controller that aborts when any of the provided signals abort.\n */\nfunction createComposedAbortController(\n ...signals: (AbortSignal | null | undefined)[]\n): AbortController {\n const controller = new AbortController();\n const validSignals = signals.filter(\n (s): s is AbortSignal => s !== null && s !== undefined\n );\n\n for (const signal of validSignals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n return controller;\n }\n signal.addEventListener(\n \"abort\",\n () => {\n controller.abort(signal.reason);\n },\n { once: true }\n );\n }\n\n return controller;\n}\n\n/**\n * Parses an error response body and maps to the appropriate AoudaApiError subclass.\n */\nfunction createApiError(\n statusCode: number,\n statusText: string,\n body: ErrorResponse\n): AoudaApiError {\n const message = body.error ?? `${statusCode} ${statusText}`;\n const code = body.code ?? \"UNKNOWN\";\n const details = body.details;\n const requestId = body.requestId;\n\n const Ctor = ERROR_CODE_MAP[code] ?? AoudaApiError;\n return new Ctor(message, code, statusCode, details, requestId);\n}\n\n/**\n * Transport interface used by the client for all server calls.\n * Implemented by HttpTransport and ResilientTransport (wrapper).\n */\nexport interface Transport {\n request<T>(config: RequestConfig): Promise<T>;\n requestRaw(config: RequestConfig): Promise<Response>;\n get<T>(path: string, options?: RequestOptions): Promise<T>;\n post<T>(path: string, body: unknown, options?: RequestOptions): Promise<T>;\n put<T>(path: string, body: unknown, options?: RequestOptions): Promise<T>;\n patch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions\n ): Promise<T>;\n delete<T>(\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T>;\n getText(path: string, options?: RequestOptions): Promise<string>;\n /**\n * POST a raw string body (e.g. NDJSON) without JSON serialization.\n * The caller sets Content-Type via options.headers.\n */\n postRaw<T>(path: string, rawBody: string, contentType: string, options?: RequestOptions): Promise<T>;\n /** List all bulk-load sessions for a database (admin). */\n bulkLoadList(db: string): Promise<BulkLoadListResponse>;\n /** Force-abort a stuck bulk-load job by emitting a BulkLoadAborted WAL frame (admin). */\n bulkLoadForceAbort(db: string, jobId: string, reason: string): Promise<BulkLoadForceAbortResponse>;\n abort(): void;\n reset(): void;\n}\n\n/**\n * HTTP transport for Aouda API requests.\n * Encapsulates URL construction, headers, timeout/abort, and error mapping.\n */\nexport class HttpTransport implements Transport {\n private readonly baseUrl: string;\n private readonly defaultTimeout: number;\n private readonly defaultHeaders: Record<string, string>;\n private abortController: AbortController;\n\n constructor(options: HttpTransportOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.defaultTimeout = options.timeout;\n this.defaultHeaders = {\n Accept: CONTENT_TYPE_JSON,\n [PROTOCOL_VERSION_HEADER]: PROTOCOL_VERSION,\n ...options.defaultHeaders,\n };\n this.abortController = new AbortController();\n }\n\n /**\n * Abort all in-flight and future requests (e.g. on client disconnect).\n */\n abort(): void {\n this.abortController.abort();\n }\n\n /**\n * Reset the lifecycle abort controller so new requests can run after a reconnect.\n * Call from the client when transitioning to connected state (e.g. in connect()).\n */\n reset(): void {\n this.abortController = new AbortController();\n }\n\n /**\n * Execute an HTTP request and return parsed JSON.\n */\n async request<T>(config: RequestConfig): Promise<T> {\n const url = `${this.baseUrl}${config.path.startsWith(\"/\") ? config.path : `/${config.path}`}`;\n const timeoutMs = config.timeout ?? this.defaultTimeout;\n\n const timeoutController = new AbortController();\n const timeoutId = setTimeout(() => {\n timeoutController.abort();\n }, timeoutMs);\n\n let wasTimeout = false;\n timeoutController.signal.addEventListener(\"abort\", () => {\n wasTimeout = true;\n });\n\n const composedController = createComposedAbortController(\n timeoutController.signal,\n this.abortController.signal,\n config.signal\n );\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n ...config.headers,\n };\n\n if (config.body !== undefined && config.body !== null) {\n headers[\"Content-Type\"] = CONTENT_TYPE_JSON;\n }\n\n const init: RequestInit = {\n method: config.method,\n headers,\n signal: composedController.signal,\n };\n\n if (config.rawBodyStr !== undefined) {\n init.body = config.rawBodyStr;\n } else if (\n (config.method === \"POST\" ||\n config.method === \"PUT\" ||\n config.method === \"PATCH\" ||\n config.method === \"DELETE\") &&\n config.body !== undefined &&\n config.body !== null\n ) {\n init.body = JSON.stringify(config.body);\n }\n\n try {\n const response = await fetch(url, init);\n\n if (!response.ok) {\n const text = await response.text();\n\n // If this status is allowed (e.g. 503 for /ready), return parsed body.\n if (config.allowStatuses?.includes(response.status) && text) {\n try {\n return JSON.parse(text) as T;\n } catch {\n // Fall through to error handling\n }\n }\n\n let errorBody: ErrorResponse | null = null;\n if (text) {\n try {\n errorBody = JSON.parse(text) as ErrorResponse;\n } catch {\n // Not JSON — use generic response error\n }\n }\n\n if (response.status === 401) {\n const code = errorBody?.code ?? \"AUTH_TOKEN_MISSING\";\n throw new AoudaAuthenticationError(\n errorBody?.error ?? \"Unauthorized\",\n code,\n 401,\n errorBody?.details,\n errorBody?.requestId\n );\n }\n\n if (errorBody?.code != null) {\n throw createApiError(\n response.status,\n response.statusText,\n errorBody as ErrorResponse\n );\n }\n\n throw new AoudaResponseError(\n errorBody?.error ?? `${response.status} ${response.statusText}`,\n response.status,\n response.statusText\n );\n }\n\n const responseText = await response.text();\n if (config.rawText) {\n return responseText as unknown as T;\n }\n if (!responseText.trim()) {\n return undefined as T;\n }\n return JSON.parse(responseText) as T;\n } catch (error) {\n if (\n error instanceof AoudaApiError ||\n error instanceof AoudaResponseError\n ) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n if (wasTimeout) {\n throw new AoudaTimeoutError(\n `Request timed out after ${timeoutMs}ms`,\n timeoutMs\n );\n }\n throw new AoudaConnectionError(\n \"Request aborted: client disconnected\",\n error\n );\n }\n throw new AoudaConnectionError(\n `Failed to connect: ${error.message}`,\n error\n );\n }\n\n throw new AoudaConnectionError(\n \"Failed to connect: Unknown error\"\n );\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Execute an HTTP request and return the raw Response.\n * Used by streaming endpoints (e.g., SSE) that cannot be eagerly buffered.\n */\n async requestRaw(config: RequestConfig): Promise<Response> {\n const url = `${this.baseUrl}${config.path.startsWith(\"/\") ? config.path : `/${config.path}`}`;\n const timeoutMs = config.timeout ?? this.defaultTimeout;\n\n const timeoutController = new AbortController();\n const timeoutId = setTimeout(() => {\n timeoutController.abort();\n }, timeoutMs);\n\n let wasTimeout = false;\n timeoutController.signal.addEventListener(\"abort\", () => {\n wasTimeout = true;\n });\n\n const composedController = createComposedAbortController(\n timeoutController.signal,\n this.abortController.signal,\n config.signal\n );\n\n const headers: Record<string, string> = {\n ...this.defaultHeaders,\n ...config.headers,\n };\n\n if (config.rawBodyStr === undefined && config.body !== undefined && config.body !== null) {\n headers[\"Content-Type\"] = CONTENT_TYPE_JSON;\n }\n\n const init: RequestInit = {\n method: config.method,\n headers,\n signal: composedController.signal,\n };\n\n if (config.rawBodyStr !== undefined) {\n init.body = config.rawBodyStr;\n } else if (\n (config.method === \"POST\" ||\n config.method === \"PUT\" ||\n config.method === \"PATCH\" ||\n config.method === \"DELETE\") &&\n config.body !== undefined &&\n config.body !== null\n ) {\n init.body = JSON.stringify(config.body);\n }\n\n try {\n const response = await fetch(url, init);\n if (response.ok || config.allowStatuses?.includes(response.status)) {\n return response;\n }\n\n const text = await response.text();\n let errorBody: ErrorResponse | null = null;\n if (text) {\n try {\n errorBody = JSON.parse(text) as ErrorResponse;\n } catch {\n // Not JSON — use generic response error.\n }\n }\n\n if (response.status === 401) {\n const code = errorBody?.code ?? \"AUTH_TOKEN_MISSING\";\n throw new AoudaAuthenticationError(\n errorBody?.error ?? \"Unauthorized\",\n code,\n 401,\n errorBody?.details,\n errorBody?.requestId\n );\n }\n\n if (errorBody?.code != null) {\n throw createApiError(\n response.status,\n response.statusText,\n errorBody as ErrorResponse\n );\n }\n\n throw new AoudaResponseError(\n errorBody?.error ?? `${response.status} ${response.statusText}`,\n response.status,\n response.statusText\n );\n } catch (error) {\n if (\n error instanceof AoudaApiError ||\n error instanceof AoudaResponseError\n ) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n if (wasTimeout) {\n throw new AoudaTimeoutError(\n `Request timed out after ${timeoutMs}ms`,\n timeoutMs\n );\n }\n throw new AoudaConnectionError(\n \"Request aborted: client disconnected\",\n error\n );\n }\n throw new AoudaConnectionError(\n `Failed to connect: ${error.message}`,\n error\n );\n }\n\n throw new AoudaConnectionError(\"Failed to connect: Unknown error\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n get<T>(path: string, options?: RequestOptions): Promise<T> {\n const headers = { ...options?.headers };\n if (options?.requestId != null) {\n headers[REQUEST_ID_HEADER] = options.requestId;\n }\n return this.request<T>({\n method: \"GET\",\n path,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n post<T>(path: string, body: unknown, options?: RequestOptions): Promise<T> {\n const headers = { ...options?.headers };\n if (options?.requestId != null) {\n headers[REQUEST_ID_HEADER] = options.requestId;\n }\n return this.request<T>({\n method: \"POST\",\n path,\n body,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n put<T>(path: string, body: unknown, options?: RequestOptions): Promise<T> {\n const headers = { ...options?.headers };\n if (options?.requestId != null) {\n headers[REQUEST_ID_HEADER] = options.requestId;\n }\n return this.request<T>({\n method: \"PUT\",\n path,\n body,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n patch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions\n ): Promise<T> {\n const headers = { ...options?.headers };\n if (options?.requestId != null) {\n headers[REQUEST_ID_HEADER] = options.requestId;\n }\n return this.request<T>({\n method: \"PATCH\",\n path,\n body,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n delete<T>(\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n const headers = { ...options?.headers };\n if (options?.requestId != null) {\n headers[REQUEST_ID_HEADER] = options.requestId;\n }\n return this.request<T>({\n method: \"DELETE\",\n path,\n body,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n /**\n * POST a raw string body (e.g. NDJSON) without JSON serialization.\n */\n postRaw<T>(path: string, rawBody: string, contentType: string, options?: RequestOptions): Promise<T> {\n const headers: Record<string, string> = {\n \"Content-Type\": contentType,\n ...options?.headers,\n };\n if (options?.requestId != null) {\n headers[REQUEST_ID_HEADER] = options.requestId;\n }\n return this.request<T>({\n method: \"POST\",\n path,\n headers,\n timeout: options?.timeout,\n signal: options?.signal,\n rawBodyStr: rawBody,\n });\n }\n\n bulkLoadList(db: string): Promise<BulkLoadListResponse> {\n return this.get<BulkLoadListResponse>(\n `/api/databases/${encodeURIComponent(db)}/bulk-load:list`\n );\n }\n\n bulkLoadForceAbort(db: string, jobId: string, reason: string): Promise<BulkLoadForceAbortResponse> {\n return this.post<BulkLoadForceAbortResponse>(\n `/api/databases/${encodeURIComponent(db)}/bulk-load:force-abort`,\n { database: db, jobId, reason }\n );\n }\n\n /**\n * Execute a GET request and return the raw response text (no JSON parsing).\n * Used for endpoints that return non-JSON content (e.g., text/plain).\n */\n getText(path: string, options?: RequestOptions): Promise<string> {\n const headers: Record<string, string> = {\n Accept: \"text/plain\",\n ...options?.headers,\n };\n if (options?.requestId != null) {\n headers[REQUEST_ID_HEADER] = options.requestId;\n }\n return this.request<string>({\n method: \"GET\",\n path,\n headers,\n timeout: options?.timeout,\n signal: options?.signal,\n rawText: true,\n });\n }\n}\n","/**\n * Retry policy helpers: delay calculation and retryability.\n * @internal\n */\n\nimport type { RetryPolicy as RetryPolicyType } from \"../types.js\";\nimport {\n AoudaConnectionError,\n AoudaTimeoutError,\n AoudaServerError,\n AoudaNotFoundError,\n AoudaValidationError,\n AoudaConflictError,\n AoudaResponseError,\n AoudaApiError,\n AoudaAuthenticationError,\n} from \"../errors.js\";\n\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_INITIAL_DELAY_MS = 100;\nconst DEFAULT_MAX_DELAY_MS = 30_000;\nconst DEFAULT_MULTIPLIER = 2;\nconst DEFAULT_JITTER_FACTOR = 0.1;\n\n/** Normalized retry policy with all defaults applied. */\nexport interface NormalizedRetryPolicy {\n maxRetries: number;\n initialDelayMs: number;\n maxDelayMs: number;\n multiplier: number;\n jitterFactor: number;\n}\n\n/**\n * Normalize a RetryPolicy (apply defaults, map baseDelayMs to initialDelayMs for backward compat).\n */\nexport function normalizeRetryPolicy(policy: RetryPolicyType | undefined): NormalizedRetryPolicy {\n if (!policy) {\n return {\n maxRetries: DEFAULT_MAX_RETRIES,\n initialDelayMs: DEFAULT_INITIAL_DELAY_MS,\n maxDelayMs: DEFAULT_MAX_DELAY_MS,\n multiplier: DEFAULT_MULTIPLIER,\n jitterFactor: DEFAULT_JITTER_FACTOR,\n };\n }\n const initialDelayMs =\n policy.initialDelayMs ?? policy.baseDelayMs ?? DEFAULT_INITIAL_DELAY_MS;\n return {\n maxRetries: policy.maxRetries ?? DEFAULT_MAX_RETRIES,\n initialDelayMs,\n maxDelayMs: policy.maxDelayMs ?? DEFAULT_MAX_DELAY_MS,\n multiplier: policy.multiplier ?? DEFAULT_MULTIPLIER,\n jitterFactor: policy.jitterFactor ?? DEFAULT_JITTER_FACTOR,\n };\n}\n\n/**\n * Calculate delay for a retry attempt (1-based).\n * Exponential backoff: initialDelayMs * multiplier^(attempt-1), plus jitter, capped at maxDelayMs.\n * Returns 0 for attempt <= 0.\n */\nexport function calculateDelay(\n policy: NormalizedRetryPolicy,\n attempt: number\n): number {\n if (attempt <= 0) {\n return 0;\n }\n const baseMs =\n policy.initialDelayMs * Math.pow(policy.multiplier, attempt - 1);\n // Jitter: ± jitterFactor of base (symmetric range [base*(1-jitter), base*(1+jitter)])\n const jitterRange = baseMs * policy.jitterFactor;\n const jitter = (Math.random() * 2 - 1) * jitterRange;\n const delayMs = Math.min(Math.max(0, baseMs + jitter), policy.maxDelayMs);\n return Math.round(delayMs);\n}\n\n/**\n * Determine if an error is retryable (transient).\n * Retry: AoudaConnectionError (except when cause is AbortError), AoudaTimeoutError,\n * AoudaServerError (5xx), AoudaResponseError with statusCode >= 500.\n * Do not retry: AoudaNotFoundError, AoudaValidationError, AoudaConflictError,\n * AoudaResponseError (4xx), AoudaApiError with 4xx, AbortError / user cancellation.\n */\nexport function isRetryable(error: unknown): boolean {\n if (error instanceof AoudaAuthenticationError) return false;\n if (error instanceof AoudaConnectionError) {\n if (error.cause instanceof Error && error.cause.name === \"AbortError\") {\n return false;\n }\n return true;\n }\n if (error instanceof AoudaTimeoutError) return true;\n if (error instanceof AoudaServerError) return true;\n if (error instanceof AoudaNotFoundError) return false;\n if (error instanceof AoudaValidationError) return false;\n if (error instanceof AoudaConflictError) return false;\n if (error instanceof AoudaResponseError) {\n return error.statusCode >= 500;\n }\n if (error instanceof AoudaApiError) {\n return error.statusCode >= 500;\n }\n if (error instanceof Error && error.name === \"AbortError\") return false;\n return false;\n}\n\n/** Preset: no retries. */\nexport const RETRY_POLICY_NONE: NormalizedRetryPolicy = {\n maxRetries: 0,\n initialDelayMs: DEFAULT_INITIAL_DELAY_MS,\n maxDelayMs: DEFAULT_MAX_DELAY_MS,\n multiplier: DEFAULT_MULTIPLIER,\n jitterFactor: DEFAULT_JITTER_FACTOR,\n};\n\n/** Preset: default (3 retries, 100ms initial, 30s max). */\nexport const RETRY_POLICY_DEFAULT: NormalizedRetryPolicy = {\n maxRetries: DEFAULT_MAX_RETRIES,\n initialDelayMs: DEFAULT_INITIAL_DELAY_MS,\n maxDelayMs: DEFAULT_MAX_DELAY_MS,\n multiplier: DEFAULT_MULTIPLIER,\n jitterFactor: DEFAULT_JITTER_FACTOR,\n};\n\n/** Preset: aggressive (5 retries, 60s max delay). */\nexport const RETRY_POLICY_AGGRESSIVE: NormalizedRetryPolicy = {\n maxRetries: 5,\n initialDelayMs: DEFAULT_INITIAL_DELAY_MS,\n maxDelayMs: 60_000,\n multiplier: DEFAULT_MULTIPLIER,\n jitterFactor: DEFAULT_JITTER_FACTOR,\n};\n","/**\n * Circuit breaker: fail fast after N failures in a window, then allow probe after cooldown.\n * @internal\n */\n\nimport type { CircuitBreakerPolicy as CircuitBreakerPolicyType } from \"../types.js\";\n\nconst DEFAULT_FAILURE_THRESHOLD = 5;\nconst DEFAULT_FAILURE_WINDOW_MS = 30_000;\nconst DEFAULT_OPEN_DURATION_MS = 30_000;\nconst DEFAULT_SUCCESS_THRESHOLD = 2;\n\nexport type CircuitState = \"Closed\" | \"Open\" | \"HalfOpen\";\n\n/** Normalized circuit breaker policy with defaults applied. */\nexport interface NormalizedCircuitBreakerPolicy {\n failureThreshold: number;\n failureWindowMs: number;\n openDurationMs: number;\n successThreshold: number;\n}\n\n/**\n * Normalize policy and apply defaults.\n * Disabled preset uses failureThreshold = Number.MAX_SAFE_INTEGER.\n */\nexport function normalizeCircuitBreakerPolicy(\n policy: CircuitBreakerPolicyType | undefined\n): NormalizedCircuitBreakerPolicy {\n if (!policy) {\n return {\n failureThreshold: Number.MAX_SAFE_INTEGER,\n failureWindowMs: DEFAULT_FAILURE_WINDOW_MS,\n openDurationMs: DEFAULT_OPEN_DURATION_MS,\n successThreshold: DEFAULT_SUCCESS_THRESHOLD,\n };\n }\n return {\n failureThreshold:\n policy.failureThreshold ?? DEFAULT_FAILURE_THRESHOLD,\n failureWindowMs: policy.failureWindowMs ?? DEFAULT_FAILURE_WINDOW_MS,\n openDurationMs: policy.openDurationMs ?? DEFAULT_OPEN_DURATION_MS,\n successThreshold: policy.successThreshold ?? DEFAULT_SUCCESS_THRESHOLD,\n };\n}\n\n/**\n * Circuit breaker: Closed → Open after threshold failures in window;\n * Open → HalfOpen after openDurationMs; HalfOpen → Closed after successThreshold successes,\n * or back to Open on failure.\n */\nexport class CircuitBreaker {\n private state: CircuitState = \"Closed\";\n private readonly policy: NormalizedCircuitBreakerPolicy;\n /** Failure timestamps (Date.now()) within the current window. */\n private readonly failureTimestamps: number[] = [];\n private openedAt: number = 0;\n private lastFailure: unknown = null;\n private halfOpenSuccesses: number = 0;\n private halfOpenAttempts: number = 0;\n\n constructor(policy: NormalizedCircuitBreakerPolicy) {\n this.policy = policy;\n }\n\n /**\n * Whether a request should be allowed (not rejected by circuit).\n * Closed: true. Open: false until openDurationMs has passed, then transition to HalfOpen and return true.\n * HalfOpen: allow up to successThreshold probes (then return false until state changes).\n */\n shouldAllow(): boolean {\n if (this.state === \"Closed\") {\n return true;\n }\n if (this.state === \"Open\") {\n const now = Date.now();\n if (now - this.openedAt >= this.policy.openDurationMs) {\n this.state = \"HalfOpen\";\n this.halfOpenSuccesses = 0;\n this.halfOpenAttempts = 0;\n return true;\n }\n return false;\n }\n // HalfOpen: allow up to successThreshold probes\n if (this.halfOpenAttempts < this.policy.successThreshold) {\n this.halfOpenAttempts += 1;\n return true;\n }\n return false;\n }\n\n recordSuccess(): void {\n if (this.state === \"HalfOpen\") {\n this.halfOpenSuccesses += 1;\n if (this.halfOpenSuccesses >= this.policy.successThreshold) {\n this.state = \"Closed\";\n this.openedAt = 0;\n this.lastFailure = null;\n this.failureTimestamps.length = 0;\n }\n }\n }\n\n recordFailure(error: unknown): void {\n this.lastFailure = error;\n if (this.state === \"HalfOpen\") {\n this.state = \"Open\";\n this.openedAt = Date.now();\n return;\n }\n if (this.state === \"Closed\") {\n const now = Date.now();\n this.failureTimestamps.push(now);\n this.pruneOutsideWindow(now);\n if (this.failureTimestamps.length >= this.policy.failureThreshold) {\n this.state = \"Open\";\n this.openedAt = now;\n }\n }\n }\n\n private pruneOutsideWindow(now: number): void {\n const cutoff = now - this.policy.failureWindowMs;\n while (this.failureTimestamps.length > 0 && this.failureTimestamps[0] < cutoff) {\n this.failureTimestamps.shift();\n }\n }\n\n reset(): void {\n this.state = \"Closed\";\n this.openedAt = 0;\n this.lastFailure = null;\n this.failureTimestamps.length = 0;\n this.halfOpenSuccesses = 0;\n this.halfOpenAttempts = 0;\n }\n\n /**\n * When the circuit will transition to half-open (or null if not open).\n */\n getRetryAfter(): Date | null {\n if (this.state !== \"Open\" || this.openedAt === 0) {\n return null;\n }\n return new Date(this.openedAt + this.policy.openDurationMs);\n }\n\n /** For tests and AoudaCircuitBreakerOpenError: when the circuit was opened. */\n getOpenedAt(): Date | null {\n if (this.openedAt === 0) return null;\n return new Date(this.openedAt);\n }\n\n /** Last failure that was recorded (e.g. when opening or in half-open). */\n getLastFailure(): unknown {\n return this.lastFailure;\n }\n\n getState(): CircuitState {\n return this.state;\n }\n}\n\n/** Preset: disabled (circuit never opens). */\nexport const CIRCUIT_BREAKER_POLICY_DISABLED: NormalizedCircuitBreakerPolicy = {\n failureThreshold: Number.MAX_SAFE_INTEGER,\n failureWindowMs: DEFAULT_FAILURE_WINDOW_MS,\n openDurationMs: DEFAULT_OPEN_DURATION_MS,\n successThreshold: DEFAULT_SUCCESS_THRESHOLD,\n};\n\n/** Preset: default. */\nexport const CIRCUIT_BREAKER_POLICY_DEFAULT: NormalizedCircuitBreakerPolicy = {\n failureThreshold: DEFAULT_FAILURE_THRESHOLD,\n failureWindowMs: DEFAULT_FAILURE_WINDOW_MS,\n openDurationMs: DEFAULT_OPEN_DURATION_MS,\n successThreshold: DEFAULT_SUCCESS_THRESHOLD,\n};\n\n/** Preset: sensitive (lower threshold, shorter window). */\nexport const CIRCUIT_BREAKER_POLICY_SENSITIVE: NormalizedCircuitBreakerPolicy = {\n failureThreshold: 3,\n failureWindowMs: 15_000,\n openDurationMs: DEFAULT_OPEN_DURATION_MS,\n successThreshold: DEFAULT_SUCCESS_THRESHOLD,\n};\n","/**\n * Transport wrapper that applies retry with exponential backoff and circuit breaker.\n * @internal\n */\n\nimport type {\n RequestConfig,\n RequestOptions,\n BulkLoadListResponse,\n BulkLoadForceAbortResponse,\n} from \"../types.js\";\n\nconst REQUEST_ID_HEADER = \"X-Request-Id\";\nimport { AoudaCircuitBreakerOpenError } from \"../errors.js\";\nimport {\n normalizeRetryPolicy,\n calculateDelay,\n isRetryable,\n type NormalizedRetryPolicy,\n} from \"./retry.js\";\nimport {\n CircuitBreaker,\n normalizeCircuitBreakerPolicy,\n} from \"./circuit-breaker.js\";\nimport type { RetryPolicy, CircuitBreakerPolicy } from \"../types.js\";\nimport type { Transport } from \"../transport.js\";\n\nfunction delayMs(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) return Promise.resolve();\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n const onAbort = (): void => {\n clearTimeout(id);\n signal?.removeEventListener(\"abort\", onAbort);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n const id = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\n/**\n * Wraps an HttpTransport with retry and circuit breaker.\n * Implements the same Transport interface so it can be used interchangeably.\n */\nexport class ResilientTransport implements Transport {\n private readonly inner: Transport;\n private readonly retryPolicy: NormalizedRetryPolicy;\n private readonly circuitBreaker: CircuitBreaker;\n\n constructor(\n inner: Transport,\n retryPolicy: RetryPolicy,\n circuitBreakerPolicy: CircuitBreakerPolicy\n ) {\n this.inner = inner;\n this.retryPolicy = normalizeRetryPolicy(retryPolicy);\n this.circuitBreaker = new CircuitBreaker(\n normalizeCircuitBreakerPolicy(circuitBreakerPolicy)\n );\n }\n\n async request<T>(config: RequestConfig): Promise<T> {\n let attempt = 0;\n let lastError: unknown = null;\n\n while (true) {\n if (!this.circuitBreaker.shouldAllow()) {\n const openedAt = this.circuitBreaker.getOpenedAt();\n const retryAfter = this.circuitBreaker.getRetryAfter();\n const lastFailure = this.circuitBreaker.getLastFailure();\n const openedAtDate = openedAt ?? new Date();\n const retryAfterDate = retryAfter ?? new Date(openedAtDate.getTime() + 30_000);\n const cause = lastFailure instanceof Error ? lastFailure : undefined;\n const remaining = Math.ceil((retryAfterDate.getTime() - Date.now()) / 1000);\n const message =\n remaining <= 0\n ? `Circuit breaker is open (opened at ${openedAtDate.toISOString()}). Retry is now allowed.`\n : `Circuit breaker is open (opened at ${openedAtDate.toISOString()}). Retry after ${remaining} seconds.`;\n throw new AoudaCircuitBreakerOpenError(\n message,\n openedAtDate,\n retryAfterDate,\n cause\n );\n }\n\n try {\n const result = await this.inner.request<T>(config);\n this.circuitBreaker.recordSuccess();\n return result;\n } catch (error) {\n lastError = error;\n const retryable = isRetryable(error);\n\n if (retryable) {\n this.circuitBreaker.recordFailure(error);\n }\n\n if (!retryable) {\n throw error;\n }\n\n attempt += 1;\n if (attempt > this.retryPolicy.maxRetries) {\n throw error;\n }\n\n const delay = calculateDelay(this.retryPolicy, attempt);\n try {\n await delayMs(delay, config.signal);\n } catch {\n throw lastError;\n }\n }\n }\n }\n\n async requestRaw(config: RequestConfig): Promise<Response> {\n let attempt = 0;\n let lastError: unknown = null;\n\n while (true) {\n if (!this.circuitBreaker.shouldAllow()) {\n const openedAt = this.circuitBreaker.getOpenedAt();\n const retryAfter = this.circuitBreaker.getRetryAfter();\n const lastFailure = this.circuitBreaker.getLastFailure();\n const openedAtDate = openedAt ?? new Date();\n const retryAfterDate = retryAfter ?? new Date(openedAtDate.getTime() + 30_000);\n const cause = lastFailure instanceof Error ? lastFailure : undefined;\n const remaining = Math.ceil((retryAfterDate.getTime() - Date.now()) / 1000);\n const message =\n remaining <= 0\n ? `Circuit breaker is open (opened at ${openedAtDate.toISOString()}). Retry is now allowed.`\n : `Circuit breaker is open (opened at ${openedAtDate.toISOString()}). Retry after ${remaining} seconds.`;\n throw new AoudaCircuitBreakerOpenError(\n message,\n openedAtDate,\n retryAfterDate,\n cause\n );\n }\n\n try {\n const result = await this.inner.requestRaw(config);\n this.circuitBreaker.recordSuccess();\n return result;\n } catch (error) {\n lastError = error;\n const retryable = isRetryable(error);\n\n if (retryable) {\n this.circuitBreaker.recordFailure(error);\n }\n\n if (!retryable) {\n throw error;\n }\n\n attempt += 1;\n if (attempt > this.retryPolicy.maxRetries) {\n throw error;\n }\n\n const delay = calculateDelay(this.retryPolicy, attempt);\n try {\n await delayMs(delay, config.signal);\n } catch {\n throw lastError;\n }\n }\n }\n }\n\n private buildHeaders(options?: RequestOptions): Record<string, string> | undefined {\n const headers = { ...options?.headers };\n if (options?.requestId != null) {\n headers[REQUEST_ID_HEADER] = options.requestId;\n }\n return Object.keys(headers).length > 0 ? headers : undefined;\n }\n\n get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>({\n method: \"GET\",\n path,\n headers: this.buildHeaders(options),\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n post<T>(path: string, body: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({\n method: \"POST\",\n path,\n body,\n headers: this.buildHeaders(options),\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n put<T>(path: string, body: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({\n method: \"PUT\",\n path,\n body,\n headers: this.buildHeaders(options),\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n patch<T>(\n path: string,\n body: unknown,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({\n method: \"PATCH\",\n path,\n body,\n headers: this.buildHeaders(options),\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n delete<T>(\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n return this.request<T>({\n method: \"DELETE\",\n path,\n body,\n headers: this.buildHeaders(options),\n timeout: options?.timeout,\n signal: options?.signal,\n });\n }\n\n getText(path: string, options?: RequestOptions): Promise<string> {\n const headers = this.buildHeaders(options) ?? {};\n const withAccept = { Accept: \"text/plain\", ...headers };\n return this.request<string>({\n method: \"GET\",\n path,\n headers: withAccept,\n timeout: options?.timeout,\n signal: options?.signal,\n rawText: true,\n });\n }\n\n postRaw<T>(path: string, rawBody: string, contentType: string, options?: RequestOptions): Promise<T> {\n const headers: Record<string, string> = {\n \"Content-Type\": contentType,\n ...this.buildHeaders(options),\n };\n return this.request<T>({\n method: \"POST\",\n path,\n headers,\n timeout: options?.timeout,\n signal: options?.signal,\n rawBodyStr: rawBody,\n });\n }\n\n bulkLoadList(db: string): Promise<BulkLoadListResponse> {\n return this.get<BulkLoadListResponse>(\n `/api/databases/${encodeURIComponent(db)}/bulk-load:list`\n );\n }\n\n bulkLoadForceAbort(db: string, jobId: string, reason: string): Promise<BulkLoadForceAbortResponse> {\n return this.post<BulkLoadForceAbortResponse>(\n `/api/databases/${encodeURIComponent(db)}/bulk-load:force-abort`,\n { database: db, jobId, reason }\n );\n }\n\n abort(): void {\n this.inner.abort();\n }\n\n reset(): void {\n this.inner.reset();\n this.circuitBreaker.reset();\n }\n\n /**\n * Force the circuit breaker to closed state (e.g. after manual recovery).\n */\n resetCircuitBreaker(): void {\n this.circuitBreaker.reset();\n }\n}\n","/**\n * Database-scoped path prefix for Aouda API.\n * @internal\n */\n\n/**\n * Returns the path prefix for database-scoped endpoints.\n * Use for all paths that target a specific database (query, tables, schema, rows).\n *\n * @param db - Database name (will be encoded).\n * @returns e.g. \"/api/databases/mydb\"\n */\nexport function databasePath(db: string): string {\n return `/api/databases/${encodeURIComponent(db)}`;\n}\n","import { AoudaConnectionError } from \"../errors.js\";\nimport type { WhereClause } from \"../types.js\";\nimport type {\n ChangeMessage,\n ServerErrorMessage,\n ServerMessage,\n SnapshotMessage,\n SubscribeMessage,\n} from \"./streaming-types.js\";\nimport type { StreamingTransport } from \"./streaming-transport.js\";\n\nexport interface SubscriptionSnapshotEvent<T = Record<string, unknown>> {\n type: \"snapshot\";\n rows: T[];\n version: number;\n}\n\nexport interface SubscriptionChangeEvent<T = Record<string, unknown>> {\n type: \"change\";\n op: \"insert\" | \"update\" | \"delete\";\n row?: T;\n prev?: T;\n key?: unknown;\n version: number;\n}\n\nexport type SubscriptionEvent<T = Record<string, unknown>> =\n | SubscriptionSnapshotEvent<T>\n | SubscriptionChangeEvent<T>;\n\nexport interface SubscribeOptions<T = Record<string, unknown>> {\n onSnapshot?: (rows: T[], version: number) => void;\n onChange?: (event: SubscriptionChangeEvent<T>) => void;\n onError?: (error: Error) => void;\n filter?: Record<string, unknown>;\n}\n\nexport interface Subscription<T = Record<string, unknown>>\n extends AsyncIterable<SubscriptionEvent<T>> {\n readonly id: string;\n readonly lastVersion: number;\n unsubscribe(): Promise<void>;\n}\n\ninterface AsyncQueueWaiter<T> {\n resolve: (value: IteratorResult<T>) => void;\n reject: (reason?: unknown) => void;\n}\n\nclass AsyncEventQueue<T> {\n private readonly _values: T[] = [];\n private readonly _waiters: AsyncQueueWaiter<T>[] = [];\n private _closed = false;\n private _error: Error | null = null;\n\n push(value: T): void {\n if (this._closed || this._error !== null) {\n return;\n }\n const waiter = this._waiters.shift();\n if (waiter) {\n waiter.resolve({ value, done: false });\n return;\n }\n this._values.push(value);\n }\n\n close(): void {\n if (this._closed) {\n return;\n }\n this._closed = true;\n while (this._waiters.length > 0) {\n const waiter = this._waiters.shift();\n waiter?.resolve({ value: undefined as never, done: true });\n }\n }\n\n fail(error: Error): void {\n if (this._closed || this._error !== null) {\n return;\n }\n this._error = error;\n while (this._waiters.length > 0) {\n const waiter = this._waiters.shift();\n waiter?.reject(error);\n }\n }\n\n async next(): Promise<IteratorResult<T>> {\n if (this._values.length > 0) {\n const value = this._values.shift() as T;\n return { value, done: false };\n }\n if (this._error !== null) {\n throw this._error;\n }\n if (this._closed) {\n return { value: undefined as never, done: true };\n }\n return new Promise<IteratorResult<T>>((resolve, reject) => {\n this._waiters.push({ resolve, reject });\n });\n }\n}\n\nexport class TableSubscription<T = Record<string, unknown>>\n implements Subscription<T>, AsyncIterator<SubscriptionEvent<T>>\n{\n readonly id: string;\n\n private readonly _transport: StreamingTransport;\n private readonly _tableName: string;\n private readonly _baseFilter?: Record<string, unknown>;\n private readonly _onSnapshot?: (rows: T[], version: number) => void;\n private readonly _onChange?: (event: SubscriptionChangeEvent<T>) => void;\n private readonly _onError?: (error: Error) => void;\n private readonly _queue = new AsyncEventQueue<SubscriptionEvent<T>>();\n private readonly _reconnectHandlerKey: string;\n\n private _active = true;\n private _started = false;\n private _startPromise: Promise<void> | null = null;\n private _lastVersion = 0;\n\n constructor(\n transport: StreamingTransport,\n tableName: string,\n options: SubscribeOptions<T> = {},\n baseFilter?: Record<string, unknown>\n ) {\n this.id = createStreamingId(\"sub\");\n this._transport = transport;\n this._tableName = tableName;\n this._baseFilter = baseFilter;\n this._onSnapshot = options.onSnapshot;\n this._onChange = options.onChange;\n this._onError = options.onError;\n this._reconnectHandlerKey = `${this.id}::reconnect`;\n }\n\n get lastVersion(): number {\n return this._lastVersion;\n }\n\n start(): void {\n if (this._started) {\n return;\n }\n this._started = true;\n this._startPromise = this._startInternal();\n this._startPromise.catch((error: unknown) => {\n const wrapped =\n error instanceof Error\n ? error\n : new AoudaConnectionError(\"Subscription failed to start\");\n this._notifyError(wrapped);\n void this.unsubscribe();\n });\n }\n\n async unsubscribe(): Promise<void> {\n if (!this._active) {\n return;\n }\n this._active = false;\n this._transport.unregisterReconnectHandler(this._reconnectHandlerKey);\n this._transport.unregisterHandler(this.id);\n this._queue.close();\n\n try {\n await this._transport.send({ type: \"unsubscribe\", id: this.id });\n } catch {\n // Best-effort cleanup when transport is already unavailable.\n }\n }\n\n [Symbol.asyncIterator](): AsyncIterator<SubscriptionEvent<T>> {\n return this;\n }\n\n next(): Promise<IteratorResult<SubscriptionEvent<T>>> {\n return this._queue.next();\n }\n\n private async _startInternal(): Promise<void> {\n this._transport.registerHandler(this.id, (msg) => this._handleMessage(msg));\n this._transport.registerReconnectHandler(this._reconnectHandlerKey, () => {\n void this._handleReconnect();\n });\n\n await this._transport.connect();\n await this._sendSubscribe(undefined);\n }\n\n private async _handleReconnect(): Promise<void> {\n if (!this._active) {\n return;\n }\n\n try {\n const resumeFrom = this._lastVersion > 0 ? this._lastVersion : undefined;\n await this._sendSubscribe(resumeFrom);\n } catch (error) {\n const wrapped =\n error instanceof Error\n ? error\n : new AoudaConnectionError(\"Subscription reconnect failed\");\n this._notifyError(wrapped);\n }\n }\n\n private async _sendSubscribe(resumeFrom?: number): Promise<void> {\n const message: SubscribeMessage = {\n type: \"subscribe\",\n id: this.id,\n target: this._tableName,\n };\n\n const filter = this._baseFilter;\n if (filter !== undefined) {\n message.filter = filter;\n }\n if (resumeFrom !== undefined) {\n message.resume_from = resumeFrom;\n }\n\n await this._transport.send(message);\n }\n\n private _handleMessage(message: ServerMessage): void {\n if (!this._active) {\n return;\n }\n\n switch (message.type) {\n case \"snapshot\":\n this._handleSnapshot(message);\n return;\n case \"change\":\n this._handleChange(message);\n return;\n case \"error\":\n this._handleServerError(message);\n return;\n default:\n return;\n }\n }\n\n private _handleSnapshot(message: SnapshotMessage): void {\n this._lastVersion = message.version;\n const rows = message.rows as T[];\n\n this._onSnapshot?.(rows, message.version);\n this._queue.push({\n type: \"snapshot\",\n rows,\n version: message.version,\n });\n }\n\n private _handleChange(message: ChangeMessage): void {\n this._lastVersion = message.version;\n const event: SubscriptionChangeEvent<T> = {\n type: \"change\",\n op: message.op,\n row: message.row as T | undefined,\n prev: message.prev as T | undefined,\n key: message.key,\n version: message.version,\n };\n\n this._onChange?.(event);\n this._queue.push(event);\n }\n\n private _handleServerError(message: ServerErrorMessage): void {\n const error = new AoudaConnectionError(\n `Subscription error (${message.code}): ${message.message}`\n );\n this._notifyError(error);\n this._queue.fail(error);\n void this.unsubscribe();\n }\n\n private _notifyError(error: Error): void {\n this._onError?.(error);\n }\n}\n\nexport function buildSubscriptionFilter(\n whereClause: WhereClause | undefined\n): Record<string, unknown> | undefined {\n if (whereClause === undefined) {\n return undefined;\n }\n\n const hasAnd = Array.isArray(whereClause.and) && whereClause.and.length > 0;\n const hasOr = Array.isArray(whereClause.or) && whereClause.or.length > 0;\n const hasGroups =\n Array.isArray(whereClause.groups) && whereClause.groups.length > 0;\n if (!hasAnd && !hasOr && !hasGroups) {\n return undefined;\n }\n\n return whereClause as unknown as Record<string, unknown>;\n}\n\nfunction createStreamingId(prefix: string): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return `${prefix}-${crypto.randomUUID()}`;\n }\n\n const random = Math.random().toString(36).slice(2, 10);\n const timestamp = Date.now().toString(36);\n return `${prefix}-${timestamp}-${random}`;\n}\n","import { AoudaConnectionError } from \"../errors.js\";\nimport type {\n ServerErrorMessage,\n ServerMessage,\n StreamAckMessage,\n StreamClosedMessage,\n StreamReadyMessage,\n} from \"./streaming-types.js\";\nimport type { StreamingTransport } from \"./streaming-transport.js\";\n\nexport interface OpenWriteStreamOptions {\n mode?: \"insert\" | \"upsert\";\n}\n\nexport interface WriteStream<T = Record<string, unknown>> {\n readonly id: string;\n readonly lastAcknowledgedSeq: number;\n write(row: Partial<T> | Partial<T>[]): Promise<void>;\n close(): Promise<void>;\n}\n\nexport class TableWriteStream<T = Record<string, unknown>>\n implements WriteStream<T>\n{\n readonly id: string;\n\n private readonly _transport: StreamingTransport;\n private readonly _tableName: string;\n private readonly _mode: \"insert\" | \"upsert\";\n private readonly _reconnectHandlerKey: string;\n\n private _closed = false;\n private _nextSeq = 1;\n private _lastAcknowledgedSeq = 0;\n private _openResolve: (() => void) | null = null;\n private _openReject: ((error: Error) => void) | null = null;\n private _closeResolve: (() => void) | null = null;\n private _closeReject: ((error: Error) => void) | null = null;\n private _readyPromise: Promise<void>;\n\n constructor(\n transport: StreamingTransport,\n tableName: string,\n options: OpenWriteStreamOptions = {}\n ) {\n this.id = createStreamingId(\"stream\");\n this._transport = transport;\n this._tableName = tableName;\n this._mode = options.mode ?? \"insert\";\n this._reconnectHandlerKey = `${this.id}::reconnect`;\n this._readyPromise = new Promise<void>((resolve, reject) => {\n this._openResolve = resolve;\n this._openReject = reject;\n });\n }\n\n get lastAcknowledgedSeq(): number {\n return this._lastAcknowledgedSeq;\n }\n\n async open(): Promise<void> {\n this._transport.registerHandler(this.id, (message) => {\n this._handleMessage(message);\n });\n this._transport.registerReconnectHandler(this._reconnectHandlerKey, () => {\n void this._handleReconnect();\n });\n\n await this._transport.connect();\n await this._sendOpen();\n await this._readyPromise;\n }\n\n async write(row: Partial<T> | Partial<T>[]): Promise<void> {\n await this._readyPromise;\n this._assertWritable();\n\n const rows = Array.isArray(row) ? row : [row];\n if (rows.length === 0) {\n return;\n }\n\n const seq = this._nextSeq++;\n await this._transport.send({\n type: \"stream_rows\",\n id: this.id,\n seq,\n rows: rows as unknown[],\n });\n }\n\n async close(): Promise<void> {\n if (this._closed) {\n return;\n }\n\n await this._readyPromise;\n this._closed = true;\n\n const closePromise = new Promise<void>((resolve, reject) => {\n this._closeResolve = resolve;\n this._closeReject = reject;\n });\n\n await this._transport.send({\n type: \"stream_close\",\n id: this.id,\n });\n\n await closePromise;\n this._cleanup();\n }\n\n private _handleMessage(message: ServerMessage): void {\n switch (message.type) {\n case \"stream_ready\":\n this._handleReady(message);\n return;\n case \"stream_ack\":\n this._handleAck(message);\n return;\n case \"stream_closed\":\n this._handleClosed(message);\n return;\n case \"error\":\n this._handleServerError(message);\n return;\n default:\n return;\n }\n }\n\n private _handleReady(_message: StreamReadyMessage): void {\n const resolve = this._openResolve;\n this._openResolve = null;\n this._openReject = null;\n resolve?.();\n }\n\n private _handleAck(message: StreamAckMessage): void {\n this._lastAcknowledgedSeq = Math.max(\n this._lastAcknowledgedSeq,\n message.through\n );\n }\n\n private _handleClosed(_message: StreamClosedMessage): void {\n this._closed = true;\n const resolve = this._closeResolve;\n this._closeResolve = null;\n this._closeReject = null;\n resolve?.();\n }\n\n private _handleServerError(message: ServerErrorMessage): void {\n const error = new AoudaConnectionError(\n `Write stream error (${message.code}): ${message.message}`\n );\n\n const openReject = this._openReject;\n this._openResolve = null;\n this._openReject = null;\n openReject?.(error);\n\n const closeReject = this._closeReject;\n this._closeResolve = null;\n this._closeReject = null;\n closeReject?.(error);\n\n this._closed = true;\n this._cleanup();\n }\n\n private _handleReconnect(): void {\n if (this._closed) {\n return;\n }\n\n this._nextSeq = 1;\n this._lastAcknowledgedSeq = 0;\n this._readyForReconnect();\n\n void this._sendOpen().catch((error: unknown) => {\n const wrapped =\n error instanceof Error\n ? error\n : new AoudaConnectionError(\"Write stream reconnect failed\");\n this._handleServerError({\n type: \"error\",\n id: this.id,\n code: \"STREAM_RECONNECT_FAILED\",\n message: wrapped.message,\n });\n });\n }\n\n private async _sendOpen(): Promise<void> {\n await this._transport.send({\n type: \"stream_open\",\n id: this.id,\n table: this._tableName,\n mode: this._mode,\n });\n }\n\n private _readyForReconnect(): void {\n this._readyPromise = new Promise<void>((resolve, reject) => {\n this._openResolve = resolve;\n this._openReject = reject;\n });\n }\n\n private _assertWritable(): void {\n if (this._closed) {\n throw new AoudaConnectionError(\"Write stream is closed\");\n }\n }\n\n private _cleanup(): void {\n this._transport.unregisterHandler(this.id);\n this._transport.unregisterReconnectHandler(this._reconnectHandlerKey);\n }\n}\n\nexport async function openTableWriteStream<T = Record<string, unknown>>(\n transport: StreamingTransport,\n tableName: string,\n options: OpenWriteStreamOptions = {}\n): Promise<TableWriteStream<T>> {\n const stream = new TableWriteStream<T>(transport, tableName, options);\n await stream.open();\n return stream;\n}\n\nfunction createStreamingId(prefix: string): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return `${prefix}-${crypto.randomUUID()}`;\n }\n\n const random = Math.random().toString(36).slice(2, 10);\n const timestamp = Date.now().toString(36);\n return `${prefix}-${timestamp}-${random}`;\n}\n","/**\n * Query builder for @aouda/client.\n * Provides a fluent API for constructing and executing queries.\n */\n\nimport type { Transport } from \"./transport.js\";\nimport type {\n WhereOperator,\n SortDirection,\n WireOperator,\n WherePredicate,\n WhereClause,\n OrderByClause,\n JoinClause,\n JoinType,\n QueryRequest,\n ColumnarResponse,\n QueryResult,\n QueryStats,\n AggregateOperation,\n InsertResult,\n MutationResult,\n InsertRequest,\n InsertResponse,\n UpdateRequest,\n UpdateResponse,\n UpdateOptions,\n DeleteRequest,\n DeleteResponse,\n DeleteOptions,\n TruncateRequest,\n BatchMutationRequest,\n BatchMutationResponse,\n BatchMutationResult,\n BatchMutationOperationRequest,\n BulkLoadOptions,\n BulkLoadJobHandle,\n ScalarExprNode,\n ColRefScalarExpr,\n LiteralScalarExpr,\n ComputedColumnDef,\n} from \"./types.js\";\nimport { BulkLoadCoordinator } from \"./bulkLoad.js\";\nimport { databasePath } from \"./database-path.js\";\nimport type { StreamingTransport } from \"./streaming/streaming-transport.js\";\nimport {\n buildSubscriptionFilter,\n TableSubscription,\n type SubscribeOptions,\n type Subscription,\n} from \"./streaming/subscription.js\";\nimport {\n openTableWriteStream,\n type OpenWriteStreamOptions,\n type WriteStream,\n} from \"./streaming/write-stream.js\";\n\n/**\n * Maps user-facing operators to wire protocol operators.\n */\nconst OPERATOR_MAP: Partial<Record<WhereOperator, WireOperator>> = {\n \"=\": \"eq\",\n \"!=\": \"ne\",\n \">\": \"gt\",\n \">=\": \"gte\",\n \"<\": \"lt\",\n \"<=\": \"lte\",\n in: \"in\",\n notIn: \"nin\",\n like: \"like\",\n};\n\nfunction getWireOperator(operator: WhereOperator): WireOperator {\n const wireOp = OPERATOR_MAP[operator];\n if (wireOp === undefined) {\n throw new Error(`Unsupported operator mapping for '${operator}'`);\n }\n return wireOp;\n}\n\nfunction buildWherePredicates(\n column: string,\n operator: WhereOperator,\n value?: unknown\n): WherePredicate[] {\n if (operator === \"between\") {\n if (!Array.isArray(value) || value.length !== 2) {\n throw new Error(\n \"where(..., 'between', value) requires a two-element tuple [min, max]\"\n );\n }\n\n const [min, max] = value;\n return [\n { column, op: \"gte\", value: min },\n { column, op: \"lte\", value: max },\n ];\n }\n\n if (operator === \"isNull\") {\n return [{ column, op: \"eq\", value: null }];\n }\n\n if (operator === \"isNotNull\") {\n return [{ column, op: \"ne\", value: null }];\n }\n\n if (value === undefined) {\n throw new Error(`where(..., '${operator}', value) requires a non-undefined value`);\n }\n\n return [{ column, op: getWireOperator(operator), value }];\n}\n\nfunction whereClauseHasContent(w: WhereClause): boolean {\n return (\n (w.and !== undefined && w.and.length > 0) ||\n (w.or !== undefined && w.or.length > 0) ||\n (w.groups !== undefined && w.groups.length > 0)\n );\n}\n\n/**\n * Mutable builder for a nested {@link WhereClause} used with {@link TableQuery.whereGroup}.\n * - `where()` — ANDs predicates inside this group.\n * - `orWhere()` — adds to this group’s `or` list (disjunction).\n * - `subgroup()` — nests another clause under wire `groups`.\n */\nexport class WhereGroupBuilder {\n private andPredicates: WherePredicate[] = [];\n private orPredicates: WherePredicate[] | null = null;\n private subgroups: WhereClause[] = [];\n\n where(column: string, operator: \"isNull\" | \"isNotNull\"): this;\n where(\n column: string,\n operator: Exclude<WhereOperator, \"isNull\" | \"isNotNull\">,\n value: unknown\n ): this;\n where(column: string, operator: WhereOperator, value?: unknown): this {\n this.andPredicates.push(...buildWherePredicates(column, operator, value));\n return this;\n }\n\n /**\n * Adds a predicate to the inner `or` list (disjunction within this group).\n */\n orWhere(column: string, operator: \"isNull\" | \"isNotNull\"): this;\n orWhere(\n column: string,\n operator: Exclude<WhereOperator, \"isNull\" | \"isNotNull\">,\n value: unknown\n ): this;\n orWhere(column: string, operator: WhereOperator, value?: unknown): this {\n if (this.orPredicates === null) {\n this.orPredicates = [];\n }\n this.orPredicates.push(...buildWherePredicates(column, operator, value));\n return this;\n }\n\n /**\n * Nests a further {@link WhereClause} under `groups`.\n */\n subgroup(fn: (inner: WhereGroupBuilder) => void): this {\n const inner = new WhereGroupBuilder();\n fn(inner);\n const built = inner.build();\n if (!whereClauseHasContent(built)) {\n throw new Error(\"subgroup() produced an empty where clause.\");\n }\n this.subgroups.push(built);\n return this;\n }\n\n build(): WhereClause {\n const w: WhereClause = {};\n if (this.andPredicates.length > 0) {\n w.and = [...this.andPredicates];\n }\n if (this.orPredicates !== null && this.orPredicates.length > 0) {\n w.or = [...this.orPredicates];\n }\n if (this.subgroups.length > 0) {\n w.groups = [...this.subgroups];\n }\n return w;\n }\n}\n\n/**\n * One batch mutation operation for {@link TableQuery.batch}.\n */\nexport type BatchOperationInput<T = Record<string, unknown>> =\n | {\n where: (query: TableQuery<T>) => TableQuery<T>;\n update: Partial<T>;\n delete?: false;\n }\n | {\n where: (query: TableQuery<T>) => TableQuery<T>;\n delete: true;\n limit?: number;\n orderBy?: OrderByClause[];\n update?: never;\n };\n\n/**\n * Internal state for the query builder.\n * This is passed between immutable instances.\n */\ninterface QueryBuilderState {\n predicates: WherePredicate[];\n /** Root-level `groups` entries (each merged with top-level `and`). */\n groupClauses: WhereClause[];\n orderByClauses: OrderByClause[];\n joinClauses: JoinClause[];\n aggregateOperations: AggregateOperation[];\n groupByColumns: string[] | null;\n selectColumns: string[] | null;\n limitValue: number | null;\n offsetValue: number | null;\n crossPartitionAccess: boolean;\n /** Server-side computed column projections (S7). */\n selectExprs: ComputedColumnDef[] | null;\n}\n\n/**\n * Coerces a raw columnar value using the server-declared column type name.\n *\n * The server sends typed columnar data (e.g. Timestamp as Int64 ticks, Guid as string) alongside\n * a `types[]` array. This function is the TypeScript equivalent of the C# `CoerceValue` in\n * `ClientColumnarResult` — it is the single place that applies type-aware conversions so that\n * callers receive properly typed values without needing to know about wire-format details.\n *\n * Timestamp: .NET ticks (100-ns intervals since 0001-01-01 UTC) → ISO 8601 string.\n * Guid: already a string — passed through unchanged.\n * All other types: passed through unchanged.\n */\nexport function coerceColumnarValue(value: unknown, typeName: string): unknown {\n if (value === null || value === undefined) return value;\n\n switch (typeName) {\n case \"Timestamp\": {\n if (typeof value === \"number\") {\n // .NET ticks → ms since Unix epoch: subtract epoch offset (ticks for 1970-01-01) then ÷ 10 000\n const ms = value / 10000 - 62135596800000;\n const d = new Date(ms);\n return isNaN(d.getTime()) ? value : d.toISOString();\n }\n // Already a string (ISO or other) — pass through\n return value;\n }\n default:\n return value;\n }\n}\n\n/**\n * Converts columnar response data to an array of row objects.\n * Uses `response.types` to apply type-aware coercions (e.g. Timestamp ticks → ISO string).\n * @param response - The columnar response from the server.\n * @returns Array of row objects.\n */\nfunction columnarToRows<T>(response: ColumnarResponse): T[] {\n const { columns, types, data, rowCount } = response;\n const rows: T[] = [];\n\n for (let i = 0; i < rowCount; i++) {\n const row: Record<string, unknown> = {};\n for (let j = 0; j < columns.length; j++) {\n const typeName = types[j];\n row[columns[j]] = typeName\n ? coerceColumnarValue(data[j][i], typeName)\n : data[j][i];\n }\n rows.push(row as T);\n }\n\n return rows;\n}\n\n/**\n * Fluent query builder for Aouda tables.\n *\n * The builder is immutable — each method returns a new instance\n * with the updated state, allowing query branching.\n *\n * @example\n * ```typescript\n * const results = await client.table('orders')\n * .where('status', '=', 'active')\n * .where('price', '>', 100)\n * .orderBy('price', 'desc')\n * .thenBy('createdAt')\n * .limit(50)\n * .select('id', 'status', 'price')\n * .execute();\n * ```\n *\n * Nested boolean filters (e.g. OR under an AND) use {@link TableQuery.whereGroup} and\n * {@link WhereGroupBuilder}; those become the wire `groups` array on {@link WhereClause}.\n *\n * @typeParam T - The type of rows returned by the query.\n */\nexport class TableQuery<T = Record<string, unknown>> {\n private readonly transport: Transport;\n private readonly tableName: string;\n private readonly database: string;\n private readonly state: QueryBuilderState;\n private readonly getWebSocketTransport:\n | (() => StreamingTransport)\n | undefined;\n\n /**\n * Creates a new TableQuery instance.\n *\n * @param transport - The HTTP transport for making requests.\n * @param tableName - The name of the table to query.\n * @param database - The database name for path and request body.\n * @param state - Optional initial state (used for immutable chaining).\n * @internal Use `client.table()` to create queries.\n */\n constructor(\n transport: Transport,\n tableName: string,\n database: string,\n state?: QueryBuilderState,\n getWebSocketTransport?: () => StreamingTransport\n ) {\n this.transport = transport;\n this.tableName = tableName;\n this.database = database;\n this.getWebSocketTransport = getWebSocketTransport;\n this.state = state ?? {\n predicates: [],\n groupClauses: [],\n orderByClauses: [],\n joinClauses: [],\n aggregateOperations: [],\n groupByColumns: null,\n selectColumns: null,\n limitValue: null,\n offsetValue: null,\n crossPartitionAccess: false,\n selectExprs: null,\n };\n }\n\n /**\n * Adds a filter predicate to the query.\n * Multiple `where()` calls are combined with AND.\n *\n * When T is a specific row type, only keys of T are accepted as column names.\n *\n * @param column - The column name to filter on.\n * @param operator - The comparison operator.\n * @param value - The value to compare against.\n * @returns A new TableQuery with the filter added.\n *\n * @example\n * ```typescript\n * query.where('status', '=', 'active')\n * .where('price', '>', 100)\n * ```\n */\n where(\n column: keyof T & string,\n operator: \"isNull\" | \"isNotNull\"\n ): TableQuery<T>;\n where(\n column: keyof T & string,\n operator: Exclude<WhereOperator, \"isNull\" | \"isNotNull\">,\n value: unknown\n ): TableQuery<T>;\n where(\n column: keyof T & string,\n operator: WhereOperator,\n value?: unknown\n ): TableQuery<T> {\n const newPredicates = buildWherePredicates(column, operator, value);\n\n return new TableQuery<T>(\n this.transport,\n this.tableName,\n this.database,\n {\n ...this.state,\n predicates: [...this.state.predicates, ...newPredicates],\n },\n this.getWebSocketTransport\n );\n }\n\n /**\n * AND-combines a nested where subtree with any prior `where()` predicates.\n * Serializes as the `groups` property on the request body (see {@link WhereClause.groups}).\n *\n * @param fn - Configures a {@link WhereGroupBuilder}; must not leave the group empty.\n */\n whereGroup(fn: (g: WhereGroupBuilder) => void): TableQuery<T> {\n const g = new WhereGroupBuilder();\n fn(g);\n const sub = g.build();\n if (!whereClauseHasContent(sub)) {\n throw new Error(\"whereGroup() callback produced an empty where clause.\");\n }\n return new TableQuery<T>(this.transport, this.tableName, this.database, {\n ...this.state,\n groupClauses: [...this.state.groupClauses, sub],\n }, this.getWebSocketTransport);\n }\n\n /**\n * Sets the primary sort column for the query.\n * Calling `orderBy()` again replaces any previous ordering.\n *\n * When T is a specific row type, only keys of T are accepted as column names.\n *\n * @param column - The column name to sort by.\n * @param direction - The sort direction ('asc' or 'desc'). Defaults to 'asc'.\n * @returns A new TableQuery with the ordering set.\n *\n * @example\n * ```typescript\n * query.orderBy('price', 'desc')\n * ```\n */\n orderBy(\n column: keyof T & string,\n direction: SortDirection = \"asc\"\n ): TableQuery<T> {\n const orderByClause: OrderByClause = {\n column,\n descending: direction === \"desc\",\n };\n\n return new TableQuery<T>(this.transport, this.tableName, this.database, {\n ...this.state,\n orderByClauses: [orderByClause],\n }, this.getWebSocketTransport);\n }\n\n /**\n * Sets the primary sort column to descending order.\n * Convenience alias for `orderBy(column, 'desc')`.\n *\n * @param column - The column name to sort by descending.\n * @returns A new TableQuery with descending ordering set.\n *\n * @example\n * ```typescript\n * query.orderByDescending('price')\n * ```\n */\n orderByDescending(column: keyof T & string): TableQuery<T> {\n return this.orderBy(column, \"desc\");\n }\n\n /**\n * Adds a secondary sort column to the query.\n * Must be called after `orderBy()`.\n *\n * When T is a specific row type, only keys of T are accepted as column names.\n *\n * @param column - The column name to sort by.\n * @param direction - The sort direction ('asc' or 'desc'). Defaults to 'asc'.\n * @returns A new TableQuery with the secondary sort added.\n * @throws Error if `orderBy()` has not been called first.\n *\n * @example\n * ```typescript\n * query.orderBy('status')\n * .thenBy('price', 'desc')\n * .thenBy('createdAt')\n * ```\n */\n thenBy(\n column: keyof T & string,\n direction: SortDirection = \"asc\"\n ): TableQuery<T> {\n if (this.state.orderByClauses.length === 0) {\n throw new Error(\"thenBy() requires orderBy() to be called first\");\n }\n\n const orderByClause: OrderByClause = {\n column,\n descending: direction === \"desc\",\n };\n\n return new TableQuery<T>(this.transport, this.tableName, this.database, {\n ...this.state,\n orderByClauses: [...this.state.orderByClauses, orderByClause],\n }, this.getWebSocketTransport);\n }\n\n /**\n * Sets the maximum number of rows to return.\n *\n * @param count - The maximum number of rows.\n * @returns A new TableQuery with the limit set.\n *\n * @example\n * ```typescript\n * query.limit(50)\n * ```\n */\n limit(count: number): TableQuery<T> {\n return new TableQuery<T>(this.transport, this.tableName, this.database, {\n ...this.state,\n limitValue: count,\n }, this.getWebSocketTransport);\n }\n\n /**\n * Sets the number of rows to skip.\n *\n * @param count - The number of rows to skip.\n * @returns A new TableQuery with the offset set.\n *\n * @example\n * ```typescript\n * query.offset(100).limit(50) // Page 3 of 50-row pages\n * ```\n */\n offset(count: number): TableQuery<T> {\n return new TableQuery<T>(this.transport, this.tableName, this.database, {\n ...this.state,\n offsetValue: count,\n }, this.getWebSocketTransport);\n }\n\n /**\n * Requests cross-partition access for this query.\n *\n * Sets `crossPartitionAccess: true` on the wire request. Use for admin or\n * authorized analytics queries that scan multiple partitions without a\n * partition-key filter. Server-side PLS and role checks still apply.\n *\n * @returns A new TableQuery with cross-partition access enabled.\n */\n withCrossPartitionAccess(): TableQuery<T> {\n return new TableQuery<T>(this.transport, this.tableName, this.database, {\n ...this.state,\n crossPartitionAccess: true,\n }, this.getWebSocketTransport);\n }\n\n /**\n * Restricts the columns returned in the result.\n * If not called, all columns are returned.\n *\n * When T is a specific row type, only keys of T are accepted as column names.\n *\n * @param columns - The column names to return.\n * @returns A new TableQuery with column selection set.\n *\n * @example\n * ```typescript\n * query.select('id', 'name', 'price')\n * ```\n */\n select(...columns: (keyof T & string)[]): TableQuery<T> {\n return new TableQuery<T>(this.transport, this.tableName, this.database, {\n ...this.state,\n selectColumns: columns.length > 0 ? columns : null,\n }, this.getWebSocketTransport);\n }\n\n /**\n * Adds server-side computed columns to the query result.\n *\n * Each entry specifies an output alias and a {@link ScalarExprNode} expression tree\n * evaluated per row on the server. Computed columns are appended after any physical-column\n * `select()` projection.\n *\n * @param projections - One or more `{ alias, expr }` pairs.\n * @returns A new TableQuery with computed columns set.\n *\n * @example\n * ```typescript\n * query.selectExpr(\n * { alias: 'discounted', expr: { $mul: [{ $col: 'price' }, { $lit: 0.9 }] } }\n * )\n * ```\n */\n selectExpr(...projections: ComputedColumnDef[]): TableQuery<T> {\n if (projections.length === 0) {\n throw new Error(\"selectExpr() requires at least one projection.\");\n }\n return new TableQuery<T>(this.transport, this.tableName, this.database, {\n ...this.state,\n selectExprs: projections,\n }, this.getWebSocketTransport);\n }\n\n /**\n * Adds an INNER JOIN clause.\n */\n join(\n rightTable: string,\n leftColumn: string,\n rightColumn: string\n ): TableQuery<Record<string, unknown>>;\n join(\n rightTable: string,\n leftColumns: string[],\n rightColumns: string[]\n ): TableQuery<Record<string, unknown>>;\n join(\n rightTable: string,\n leftColumnOrColumns: string | string[],\n rightColumnOrColumns: string | string[]\n ): TableQuery<Record<string, unknown>> {\n return this.addJoinClause(\n \"inner\",\n rightTable,\n leftColumnOrColumns,\n rightColumnOrColumns\n );\n }\n\n /**\n * Adds a LEFT JOIN clause.\n */\n leftJoin(\n rightTable: string,\n leftColumn: string,\n rightColumn: string\n ): TableQuery<Record<string, unknown>>;\n leftJoin(\n rightTable: string,\n leftColumns: string[],\n rightColumns: string[]\n ): TableQuery<Record<string, unknown>>;\n leftJoin(\n rightTable: string,\n leftColumnOrColumns: string | string[],\n rightColumnOrColumns: string | string[]\n ): TableQuery<Record<string, unknown>> {\n return this.addJoinClause(\n \"left\",\n rightTable,\n leftColumnOrColumns,\n rightColumnOrColumns\n );\n }\n\n /**\n * Adds a RIGHT JOIN clause.\n */\n rightJoin(\n rightTable: string,\n leftColumn: string,\n rightColumn: string\n ): TableQuery<Record<string, unknown>>;\n rightJoin(\n rightTable: string,\n leftColumns: string[],\n rightColumns: string[]\n ): TableQuery<Record<string, unknown>>;\n rightJoin(\n rightTable: string,\n leftColumnOrColumns: string | string[],\n rightColumnOrColumns: string | string[]\n ): TableQuery<Record<string, unknown>> {\n return this.addJoinClause(\n \"right\",\n rightTable,\n leftColumnOrColumns,\n rightColumnOrColumns\n );\n }\n\n /**\n * Adds a FULL JOIN clause.\n */\n fullJoin(\n rightTable: string,\n leftColumn: string,\n rightColumn: string\n ): TableQuery<Record<string, unknown>>;\n fullJoin(\n rightTable: string,\n leftColumns: string[],\n rightColumns: string[]\n ): TableQuery<Record<string, unknown>>;\n fullJoin(\n rightTable: string,\n leftColumnOrColumns: string | string[],\n rightColumnOrColumns: string | string[]\n ): TableQuery<Record<string, unknown>> {\n return this.addJoinClause(\n \"full\",\n rightTable,\n leftColumnOrColumns,\n rightColumnOrColumns\n );\n }\n\n /**\n * Adds a CROSS JOIN clause.\n */\n crossJoin(rightTable: string): TableQuery<Record<string, unknown>> {\n if (rightTable.trim().length === 0) {\n throw new Error(\"crossJoin() requires a non-empty rightTable\");\n }\n\n return new TableQuery<Record<string, unknown>>(\n this.transport,\n this.tableName,\n this.database,\n {\n ...this.state,\n joinClauses: [\n ...this.state.joinClauses,\n {\n table: rightTable,\n type: \"cross\",\n },\n ],\n },\n this.getWebSocketTransport\n );\n }\n\n /**\n * Adds a SUM aggregate operation for the specified column.\n */\n sum(column: keyof T & string): TableQuery<T> {\n return this.addAggregate(\"sum\", column);\n }\n\n /**\n * Adds a MIN aggregate operation for the specified column.\n */\n min(column: keyof T & string): TableQuery<T> {\n return this.addAggregate(\"min\", column);\n }\n\n /**\n * Adds a MAX aggregate operation for the specified column.\n */\n max(column: keyof T & string): TableQuery<T> {\n return this.addAggregate(\"max\", column);\n }\n\n /**\n * Sets grouping columns for aggregate queries.\n */\n groupBy(...columns: (keyof T & string)[]): TableQuery<T> {\n if (columns.length === 0) {\n throw new Error(\"groupBy() requires at least one column\");\n }\n\n return new TableQuery<T>(\n this.transport,\n this.tableName,\n this.database,\n {\n ...this.state,\n groupByColumns: [...columns],\n },\n this.getWebSocketTransport\n );\n }\n\n /**\n * Validates grouped aggregate configuration and returns the same query.\n */\n groupAggregate(): TableQuery<T> {\n if (this.state.aggregateOperations.length === 0) {\n throw new Error(\n \"groupAggregate() requires at least one aggregate operation. Use sum(), min(), or max().\"\n );\n }\n if (this.state.groupByColumns === null || this.state.groupByColumns.length === 0) {\n throw new Error(\"groupAggregate() requires groupBy() to be called first.\");\n }\n return this;\n }\n\n /**\n * Subscribes to table changes over the shared WebSocket transport.\n * Supports callback handlers and async-iterator consumption.\n */\n subscribe(options: SubscribeOptions<T> = {}): Subscription<T> {\n const wsTransport = this.requireWebSocketTransport();\n const whereClause = this.buildWhereClause();\n const queryFilter = buildSubscriptionFilter(whereClause);\n const mergedFilter = mergeFilterObjects(queryFilter, options.filter);\n\n const subscription = new TableSubscription<T>(\n wsTransport,\n this.tableName,\n {\n onSnapshot: options.onSnapshot,\n onChange: options.onChange,\n onError: options.onError,\n },\n mergedFilter\n );\n subscription.start();\n return subscription;\n }\n\n /**\n * Opens a high-throughput write stream for insert/upsert operations.\n */\n async openWriteStream(\n options: OpenWriteStreamOptions = {}\n ): Promise<WriteStream<T>> {\n const wsTransport = this.requireWebSocketTransport();\n return openTableWriteStream<T>(wsTransport, this.tableName, options);\n }\n\n /**\n * Builds the query request body for the wire protocol.\n * @returns The query request object.\n * @internal\n */\n private buildRequest(): QueryRequest {\n const request: QueryRequest = {\n table: this.tableName,\n database: this.database,\n };\n\n if (this.state.selectColumns !== null) {\n request.select = this.state.selectColumns;\n }\n\n const whereClause = this.buildWhereClause();\n if (whereClause !== undefined) {\n request.where = whereClause;\n }\n\n if (this.state.orderByClauses.length > 0) {\n request.orderBy = this.state.orderByClauses;\n }\n\n if (this.state.joinClauses.length > 0) {\n request.joins = this.state.joinClauses;\n }\n\n if (this.state.aggregateOperations.length > 0) {\n request.aggregate = {\n operations: this.state.aggregateOperations,\n };\n if (this.state.groupByColumns !== null && this.state.groupByColumns.length > 0) {\n request.aggregate.groupBy = this.state.groupByColumns;\n }\n }\n\n if (this.state.offsetValue !== null) {\n request.offset = this.state.offsetValue;\n }\n\n if (this.state.limitValue !== null) {\n request.limit = this.state.limitValue;\n }\n\n if (this.state.crossPartitionAccess) {\n request.crossPartitionAccess = true;\n }\n\n if (this.state.selectExprs !== null && this.state.selectExprs.length > 0) {\n request.selectExpr = this.state.selectExprs;\n }\n\n return request;\n }\n\n private buildWhereClause(): WhereClause | undefined {\n const hasAnd = this.state.predicates.length > 0;\n const hasGroups = this.state.groupClauses.length > 0;\n if (!hasAnd && !hasGroups) {\n return undefined;\n }\n const where: WhereClause = {};\n if (hasAnd) {\n where.and = this.state.predicates;\n }\n if (hasGroups) {\n where.groups = [...this.state.groupClauses];\n }\n return where;\n }\n\n private addJoinClause(\n type: JoinType,\n rightTable: string,\n leftColumnOrColumns: string | string[],\n rightColumnOrColumns: string | string[]\n ): TableQuery<Record<string, unknown>> {\n if (rightTable.trim().length === 0) {\n throw new Error(\"join() requires a non-empty rightTable\");\n }\n\n const joinClause: JoinClause = {\n table: rightTable,\n type,\n };\n\n if (\n typeof leftColumnOrColumns === \"string\" &&\n typeof rightColumnOrColumns === \"string\"\n ) {\n if (\n leftColumnOrColumns.trim().length === 0 ||\n rightColumnOrColumns.trim().length === 0\n ) {\n throw new Error(\"join() requires non-empty left/right columns\");\n }\n joinClause.leftColumn = leftColumnOrColumns;\n joinClause.rightColumn = rightColumnOrColumns;\n } else if (\n Array.isArray(leftColumnOrColumns) &&\n Array.isArray(rightColumnOrColumns)\n ) {\n if (\n leftColumnOrColumns.length === 0 ||\n rightColumnOrColumns.length === 0\n ) {\n throw new Error(\"join() requires non-empty left/right column arrays\");\n }\n if (leftColumnOrColumns.length !== rightColumnOrColumns.length) {\n throw new Error(\n \"join() requires leftColumns and rightColumns to have equal length\"\n );\n }\n joinClause.leftColumns = [...leftColumnOrColumns];\n joinClause.rightColumns = [...rightColumnOrColumns];\n } else {\n throw new Error(\n \"join() requires both column arguments to be strings or string arrays\"\n );\n }\n\n return new TableQuery<Record<string, unknown>>(\n this.transport,\n this.tableName,\n this.database,\n {\n ...this.state,\n joinClauses: [...this.state.joinClauses, joinClause],\n },\n this.getWebSocketTransport\n );\n }\n\n private addAggregate(\n op: AggregateOperation[\"op\"],\n column: keyof T & string\n ): TableQuery<T> {\n if (column.trim().length === 0) {\n throw new Error(\"Aggregate column must be a non-empty string\");\n }\n\n return new TableQuery<T>(\n this.transport,\n this.tableName,\n this.database,\n {\n ...this.state,\n aggregateOperations: [\n ...this.state.aggregateOperations,\n {\n op,\n column,\n },\n ],\n },\n this.getWebSocketTransport\n );\n }\n\n private requireWebSocketTransport(): StreamingTransport {\n if (this.getWebSocketTransport === undefined) {\n throw new Error(\n \"Streaming transport is unavailable. Create TableQuery instances via AoudaClient.table().\"\n );\n }\n return this.getWebSocketTransport();\n }\n\n /**\n * Executes the query and returns the results.\n *\n * Sends a POST request to `/api/query` with the built query\n * and converts the columnar response to row objects.\n *\n * @returns The query result with rows and statistics.\n *\n * @example\n * ```typescript\n * const result = await client.table('orders')\n * .where('status', '=', 'active')\n * .execute();\n *\n * console.log(result.rows);\n * console.log(result.stats.executionMs);\n * ```\n */\n async execute(): Promise<QueryResult<T>> {\n const request = this.buildRequest();\n const path = `${databasePath(this.database)}/query`;\n const response = await this.transport.post<ColumnarResponse>(path, request);\n\n const rows = columnarToRows<T>(response);\n const stats: QueryStats = response.stats;\n\n return { rows, stats };\n }\n\n /**\n * Executes the query and returns the raw columnar JSON payload (no row-object conversion).\n */\n async toColumnar(): Promise<ColumnarResponse> {\n const request = this.buildRequest();\n const path = `${databasePath(this.database)}/query`;\n return this.transport.post<ColumnarResponse>(path, request);\n }\n\n /**\n * Executes a count query and returns the number of matching rows.\n *\n * This is a convenience method that executes the query with\n * limit 0 and returns the rowCount from statistics.\n *\n * @returns The number of rows matching the query.\n *\n * @example\n * ```typescript\n * const count = await client.table('orders')\n * .where('status', '=', 'active')\n * .count();\n * ```\n */\n async count(): Promise<number> {\n const countQuery = new TableQuery<T>(\n this.transport,\n this.tableName,\n this.database,\n {\n ...this.state,\n limitValue: 0,\n selectColumns: [],\n },\n this.getWebSocketTransport\n );\n\n const request = countQuery.buildRequest();\n const path = `${databasePath(this.database)}/query`;\n const response = await this.transport.post<ColumnarResponse>(path, request);\n\n return response.rowCount;\n }\n\n // --- Mutation Operations ---\n\n /**\n * Inserts a single row into the table.\n *\n * This is a terminal operation — it executes immediately and returns\n * a Promise. It does not use query builder state (where, orderBy, etc.).\n *\n * @param row - The row data to insert. Keys are column names.\n * @returns The insert result with row count, execution time, and optional generated values.\n * @throws Error if `row` is null or undefined.\n *\n * @example\n * ```typescript\n * const result = await client.table('orders')\n * .insert({ status: 'pending', price: 100 });\n *\n * console.log(result.rowsInserted); // 1\n * console.log(result.generatedValues); // { \"0\": { id: 42 } }\n * ```\n */\n async insert(row: Partial<T>): Promise<InsertResult> {\n if (row == null) {\n throw new Error(\"insert() requires a non-null row object\");\n }\n\n const prefix = databasePath(this.database);\n const path = `${prefix}/tables/${encodeURIComponent(this.tableName)}/rows`;\n const body: InsertRequest = {\n database: this.database,\n rows: [row as Record<string, unknown>],\n };\n\n const response = await this.transport.post<InsertResponse>(path, body);\n\n const result: InsertResult = {\n rowsInserted: response.rowsInserted,\n executionMs: response.executionMs,\n };\n\n if (response.generatedValues !== undefined) {\n result.generatedValues = response.generatedValues;\n }\n\n return result;\n }\n\n /**\n * Inserts multiple rows into the table in a single request.\n *\n * This is a terminal operation — it executes immediately and returns\n * a Promise. It does not use query builder state (where, orderBy, etc.).\n *\n * @param rows - Array of row objects to insert. Must contain at least one row.\n * @returns The insert result with total row count, execution time, and optional generated values.\n * @throws Error if `rows` is empty.\n *\n * @example\n * ```typescript\n * const result = await client.table('orders')\n * .insertMany([\n * { status: 'pending', price: 100 },\n * { status: 'shipped', price: 200 },\n * ]);\n *\n * console.log(result.rowsInserted); // 2\n * ```\n */\n async insertMany(rows: Partial<T>[]): Promise<InsertResult> {\n if (!Array.isArray(rows) || rows.length === 0) {\n throw new Error(\"insertMany() requires a non-empty array of rows\");\n }\n\n const prefix = databasePath(this.database);\n const path = `${prefix}/tables/${encodeURIComponent(this.tableName)}/rows`;\n const body: InsertRequest = {\n database: this.database,\n rows: rows as Record<string, unknown>[],\n };\n\n const response = await this.transport.post<InsertResponse>(path, body);\n\n const result: InsertResult = {\n rowsInserted: response.rowsInserted,\n executionMs: response.executionMs,\n };\n\n if (response.generatedValues !== undefined) {\n result.generatedValues = response.generatedValues;\n }\n\n return result;\n }\n\n /**\n * Updates rows matching the current where predicates.\n *\n * This is a terminal operation — it executes immediately and returns\n * a Promise. Requires at least one `where()` predicate to prevent\n * accidental bulk updates.\n *\n * @param values - The column values to set. Keys are column names.\n * @returns The mutation result with rows affected and execution time.\n * @throws Error if no `where()` predicates have been set.\n * @throws Error if `values` is null, undefined, or empty.\n *\n * @example\n * ```typescript\n * const result = await client.table('orders')\n * .where('id', '=', 1)\n * .update({ status: 'shipped' });\n *\n * console.log(result.rowsAffected); // 1\n * ```\n */\n async update(values: Partial<T>, options?: UpdateOptions): Promise<MutationResult> {\n if (values == null || Object.keys(values as Record<string, unknown>).length === 0) {\n throw new Error(\"update() requires a non-empty values object\");\n }\n\n if (\n this.state.predicates.length === 0 &&\n this.state.groupClauses.length === 0\n ) {\n throw new Error(\n \"update() requires at least one where() predicate to prevent accidental bulk updates\"\n );\n }\n\n const prefix = databasePath(this.database);\n const path = `${prefix}/tables/${encodeURIComponent(this.tableName)}/rows`;\n const where = this.buildWhereClause()!;\n\n const { set, setExpr } = splitSetAndExprValues(values as Record<string, unknown>);\n\n const body: UpdateRequest = {\n database: this.database,\n where,\n set,\n ...(Object.keys(setExpr).length > 0 ? { setExpr } : {}),\n ...(options?.returning ? { returning: options.returning } : {}),\n };\n\n const response = await this.transport.patch<UpdateResponse>(path, body);\n\n return {\n rowsAffected: response.rowsUpdated,\n executionMs: response.executionMs,\n ...(response.rows ? { rows: columnarToRows(response.rows) } : {}),\n ...(response.rowsTruncated ? { rowsTruncated: true } : {}),\n };\n }\n\n /**\n * Deletes rows matching the current where predicates.\n *\n * This is a terminal operation — it executes immediately and returns\n * a Promise. Requires at least one `where()` predicate to prevent\n * accidental bulk deletes.\n *\n * @returns The mutation result with rows affected and execution time.\n * @throws Error if no `where()` predicates have been set.\n *\n * @example\n * ```typescript\n * const result = await client.table('orders')\n * .where('id', '=', 1)\n * .delete();\n *\n * console.log(result.rowsAffected); // 1\n * ```\n */\n async delete(options?: DeleteOptions): Promise<MutationResult> {\n if (\n this.state.predicates.length === 0 &&\n this.state.groupClauses.length === 0\n ) {\n throw new Error(\n \"delete() requires at least one where() predicate to prevent accidental bulk deletes\"\n );\n }\n\n const prefix = databasePath(this.database);\n const path = `${prefix}/tables/${encodeURIComponent(this.tableName)}/rows`;\n const where = this.buildWhereClause()!;\n const body: DeleteRequest = {\n database: this.database,\n where,\n };\n if (this.state.limitValue !== null) {\n body.limit = this.state.limitValue;\n }\n if (this.state.orderByClauses.length > 0) {\n body.orderBy = this.state.orderByClauses;\n }\n if (options?.returning) {\n body.returning = options.returning;\n }\n\n const response = await this.transport.delete<DeleteResponse>(path, body);\n\n return {\n rowsAffected: response.rowsDeleted,\n executionMs: response.executionMs,\n hasMore: response.hasMore,\n ...(response.rows ? { rows: columnarToRows(response.rows) } : {}),\n ...(response.rowsTruncated ? { rowsTruncated: true } : {}),\n };\n }\n\n /**\n * Truncates the table (removes all rows) while preserving schema.\n *\n * This is a terminal operation and does not require where() predicates.\n */\n async truncate(): Promise<MutationResult> {\n const prefix = databasePath(this.database);\n const path = `${prefix}/tables/${encodeURIComponent(this.tableName)}/truncate`;\n const body: TruncateRequest = {\n database: this.database,\n };\n\n const response = await this.transport.post<DeleteResponse>(path, body);\n return {\n rowsAffected: response.rowsDeleted,\n executionMs: response.executionMs,\n hasMore: false,\n };\n }\n\n /**\n * Executes multiple update/delete mutations against the same table in one request.\n *\n * Each operation must provide its own `where` query builder callback.\n */\n async batch(operations: BatchOperationInput<T>[]): Promise<BatchMutationResult> {\n if (!Array.isArray(operations) || operations.length === 0) {\n throw new Error(\"batch() requires a non-empty operations array\");\n }\n\n const wireOperations: BatchMutationOperationRequest[] = operations.map((op, index) => {\n const base = new TableQuery<T>(this.transport, this.tableName, this.database);\n const scoped = op.where(base);\n const where = scoped.buildWhereClause();\n if (!where) {\n throw new Error(\n `batch() operation at index ${index} must include at least one where() predicate`\n );\n }\n\n if (op.delete === true) {\n return {\n where,\n delete: true,\n ...(op.limit !== undefined ? { limit: op.limit } : {}),\n ...(op.orderBy ? { orderBy: op.orderBy } : {}),\n };\n }\n\n const updateValues = op.update as Record<string, unknown> | undefined;\n if (!updateValues || Object.keys(updateValues).length === 0) {\n throw new Error(\n `batch() update operation at index ${index} requires a non-empty update object`\n );\n }\n\n const { set, setExpr } = splitSetAndExprValues(updateValues);\n return {\n where,\n set,\n ...(Object.keys(setExpr).length > 0 ? { setExpr } : {}),\n };\n });\n\n const prefix = databasePath(this.database);\n const path = `${prefix}/tables/${encodeURIComponent(this.tableName)}/rows/batch`;\n const body: BatchMutationRequest = {\n database: this.database,\n operations: wireOperations,\n };\n\n const response = await this.transport.post<BatchMutationResponse>(path, body);\n return {\n operationResults: response.operationResults,\n totalRowsAffected: response.totalRowsAffected,\n executionMs: response.executionMs,\n };\n }\n\n /**\n * Bulk-load rows into this table.\n *\n * Executes the full `:begin` → `:append × N` → `:commit` sequence,\n * handling batching and resume-on-reconnect automatically.\n *\n * @param rows - Synchronous or asynchronous iterable of row objects.\n * @param options - Optional bulk-load tuning options.\n * @returns A handle describing the committed job.\n *\n * @example\n * ```typescript\n * const handle = await client.table('products').bulkLoad(rows);\n * console.log(`Loaded ${handle.rowsLoaded} rows`);\n * ```\n */\n bulkLoad(\n rows: Iterable<T> | AsyncIterable<T>,\n options?: BulkLoadOptions\n ): Promise<BulkLoadJobHandle> {\n return new BulkLoadCoordinator(this.transport, this.database).run(\n [this.tableName],\n rows as Iterable<Record<string, unknown>> | AsyncIterable<Record<string, unknown>>,\n options\n );\n }\n}\n\nfunction mergeFilterObjects(\n queryFilter: Record<string, unknown> | undefined,\n explicitFilter: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined {\n if (queryFilter === undefined) {\n return explicitFilter;\n }\n if (explicitFilter === undefined) {\n return queryFilter;\n }\n return {\n ...queryFilter,\n ...explicitFilter,\n };\n}\n\nfunction splitSetAndExprValues(values: Record<string, unknown>): {\n set: Record<string, unknown>;\n setExpr: Record<string, ScalarExprNode>;\n} {\n const set: Record<string, unknown> = {};\n const setExpr: Record<string, ScalarExprNode> = {};\n\n for (const [col, val] of Object.entries(values)) {\n if (isExprOperator(val)) {\n setExpr[col] = serializeUpdateValue(col, val as Record<string, unknown>);\n } else {\n set[col] = val;\n }\n }\n\n return { set, setExpr };\n}\n\n/**\n * Returns true when a value object contains at least one `$`-prefixed operator key.\n * Operator objects (e.g. `{ $inc: 1 }`) are serialized into `setExpr` on the wire;\n * plain values go into `set`.\n */\nfunction isExprOperator(val: unknown): val is Record<string, unknown> {\n return (\n typeof val === \"object\" &&\n val !== null &&\n !Array.isArray(val) &&\n Object.keys(val as object).some((k) => k.startsWith(\"$\"))\n );\n}\n\n/**\n * Serializes a `$`-prefixed operator object for a single column into a {@link ScalarExprNode}.\n */\nfunction serializeUpdateValue(\n col: string,\n val: Record<string, unknown>\n): ScalarExprNode {\n if (\"$inc\" in val) {\n return {\n type: \"arithmetic\",\n op: \"+\",\n left: { type: \"colRef\", col },\n right: { type: \"literal\", value: val.$inc },\n };\n }\n if (\"$dec\" in val) {\n return {\n type: \"arithmetic\",\n op: \"-\",\n left: { type: \"colRef\", col },\n right: { type: \"literal\", value: val.$dec },\n };\n }\n if (\"$mul\" in val) {\n return {\n type: \"arithmetic\",\n op: \"*\",\n left: { type: \"colRef\", col },\n right: { type: \"literal\", value: val.$mul },\n };\n }\n if (\"$div\" in val) {\n return {\n type: \"arithmetic\",\n op: \"/\",\n left: { type: \"colRef\", col },\n right: { type: \"literal\", value: val.$div },\n };\n }\n if (\"$col\" in val) {\n return { type: \"colRef\", col: val.$col as string };\n }\n if (\"$ifNull\" in val) {\n const args = val.$ifNull as unknown[];\n return {\n type: \"coalesce\",\n args: args.map((a) =>\n typeof a === \"string\" && a.startsWith(\"$\")\n ? ({ type: \"colRef\", col: a.slice(1) } satisfies ColRefScalarExpr)\n : ({ type: \"literal\", value: a } satisfies LiteralScalarExpr)\n ),\n };\n }\n if (\"$cond\" in val) {\n const cond = val.$cond as {\n when: WhereClause;\n then: unknown;\n else: unknown;\n };\n const toNode = (v: unknown): ScalarExprNode =>\n typeof v === \"string\" && v.startsWith(\"$\")\n ? { type: \"colRef\", col: v.slice(1) }\n : { type: \"literal\", value: v };\n return {\n type: \"conditional\",\n when: cond.when,\n then: toNode(cond.then),\n else: toNode(cond.else),\n };\n }\n throw new Error(\n `Unknown expression operator in update() for column '${col}': ${JSON.stringify(val)}`\n );\n}\n","/**\n * Table operations API for @aouda/client.\n * Provides table listing, schema introspection, and type generation.\n */\n\nimport type { Transport } from \"./transport.js\";\nimport type {\n TableSummary,\n TableSchema,\n TableSchemaResponse,\n ColumnSchema,\n SchemaRelationshipsResponse,\n TypeGenerationOptions,\n TablesListResponse,\n CreateTableRequest,\n RenameTableRequest,\n AddColumnRequest,\n RenameColumnRequest,\n UpdateTablePolicyRequest,\n TablePolicy,\n} from \"./types.js\";\nimport { databasePath } from \"./database-path.js\";\n\n/**\n * Validates that a value is a non-empty string.\n * @param value - The value to check.\n * @param name - The name of the parameter for error messages.\n * @throws Error if the value is empty or not a string.\n */\nfunction validateNonEmptyString(value: unknown, name: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string`);\n }\n}\n\n/**\n * API for table listing and metadata operations.\n * Access via `client.tables`.\n */\nexport class TablesApi {\n private readonly transport: Transport;\n private readonly database: string;\n\n constructor(transport: Transport, database: string) {\n this.transport = transport;\n this.database = database;\n }\n\n /**\n * Lists all tables in the database with statistics.\n * @returns Array of table summaries (includes rowCount, sizeBytes, timestamps).\n */\n async list(): Promise<TableSummary[]> {\n const prefix = databasePath(this.database);\n const response =\n await this.transport.get<TablesListResponse>(`${prefix}/tables`);\n return response.tables;\n }\n\n /**\n * Gets detailed schema for a specific table.\n * @param name - The table name.\n * @returns Table schema with columns.\n * @throws AoudaNotFoundError if table does not exist.\n * @throws Error if table name is empty or whitespace-only.\n */\n async get(name: string): Promise<TableSchema> {\n validateNonEmptyString(name, \"Table name\");\n const prefix = databasePath(this.database);\n const encodedName = encodeURIComponent(name);\n return this.transport.get<TableSchema>(\n `${prefix}/tables/${encodedName}`\n );\n }\n\n /**\n * Gets enhanced schema introspection with key arrays and relationships.\n * Optimized for schema exploration tools like Aouda Studio.\n * @param name - The table name.\n * @returns Enhanced schema with primaryKey, partitionKey, clusterColumns, relationships.\n * @throws AoudaNotFoundError if table does not exist.\n * @throws Error if table name is empty or whitespace-only.\n */\n async schema(name: string): Promise<TableSchemaResponse> {\n validateNonEmptyString(name, \"Table name\");\n const prefix = databasePath(this.database);\n const encodedName = encodeURIComponent(name);\n return this.transport.get<TableSchemaResponse>(\n `${prefix}/tables/${encodedName}/schema`\n );\n }\n\n /**\n * Gets all tables and relationships for ERD visualization.\n * Returns both declared and inferred relationships.\n * @returns All tables with column summaries and relationship graph.\n */\n async relationships(): Promise<SchemaRelationshipsResponse> {\n const prefix = databasePath(this.database);\n return this.transport.get<SchemaRelationshipsResponse>(\n `${prefix}/schema/relationships`\n );\n }\n\n /**\n * Generates TypeScript interfaces for all tables.\n * @param options - Generation options (comments, schema wrapper, namespace).\n * @returns TypeScript code as a string.\n */\n async generateTypes(options?: TypeGenerationOptions): Promise<string> {\n const params = new URLSearchParams();\n\n if (options?.comments !== undefined) {\n params.set(\"comments\", String(options.comments));\n }\n if (options?.schema !== undefined) {\n params.set(\"schema\", String(options.schema));\n }\n if (options?.namespace !== undefined) {\n params.set(\"namespace\", options.namespace);\n }\n\n const query = params.toString();\n const prefix = databasePath(this.database);\n const path = `${prefix}/schema/typescript${query ? `?${query}` : \"\"}`;\n\n return this.transport.getText(path);\n }\n\n /**\n * Creates a new table.\n * @param body - Request body (database, name, columns, optional policy). database must match the client's database.\n * @returns 201 response body (table detail).\n * @throws AoudaApiError for TABLE_EXISTS, WRITE_NOT_ALLOWED, INVALID_REQUEST, etc.\n */\n async createTable(body: CreateTableRequest): Promise<TableSchema | undefined> {\n validateNonEmptyString(body.name, \"Table name\");\n if (!body.columns?.length) {\n throw new Error(\"At least one column is required\");\n }\n const prefix = databasePath(this.database);\n const result = await this.transport.post<TableSchema | undefined>(\n `${prefix}/tables`,\n body\n );\n return result;\n }\n\n /**\n * Renames a table.\n * @param name - Current table name.\n * @param body - Request body (database, newName).\n * @returns 200 response body (table detail).\n * @throws AoudaNotFoundError if table does not exist; AoudaApiError for WRITE_NOT_ALLOWED, etc.\n */\n async renameTable(\n name: string,\n body: RenameTableRequest\n ): Promise<TableSchema | undefined> {\n validateNonEmptyString(name, \"Table name\");\n validateNonEmptyString(body.newName, \"New table name\");\n const prefix = databasePath(this.database);\n const encodedName = encodeURIComponent(name);\n return this.transport.patch<TableSchema | undefined>(\n `${prefix}/tables/${encodedName}`,\n body\n );\n }\n\n /**\n * Deletes a table.\n * @param name - Table name.\n * @throws AoudaNotFoundError if table does not exist; AoudaApiError for WRITE_NOT_ALLOWED, etc.\n */\n async deleteTable(name: string): Promise<void> {\n validateNonEmptyString(name, \"Table name\");\n const prefix = databasePath(this.database);\n const encodedName = encodeURIComponent(name);\n await this.transport.delete<void>(`${prefix}/tables/${encodedName}`);\n }\n\n /**\n * Adds a column to a table.\n * @param tableName - Table name.\n * @param body - Request body (database, name, type).\n * @returns 201 response body (column detail).\n * @throws AoudaNotFoundError if table does not exist; AoudaApiError for COLUMN_EXISTS, WRITE_NOT_ALLOWED, etc.\n */\n async addColumn(\n tableName: string,\n body: AddColumnRequest\n ): Promise<ColumnSchema | undefined> {\n validateNonEmptyString(tableName, \"Table name\");\n validateNonEmptyString(body.name, \"Column name\");\n const prefix = databasePath(this.database);\n const encodedTable = encodeURIComponent(tableName);\n return this.transport.post<ColumnSchema | undefined>(\n `${prefix}/tables/${encodedTable}/columns`,\n body\n );\n }\n\n /**\n * Renames a column.\n * @param tableName - Table name.\n * @param columnName - Current column name.\n * @param body - Request body (database, newName).\n * @returns 200 response body (column detail).\n * @throws AoudaNotFoundError if table or column does not exist; AoudaApiError for WRITE_NOT_ALLOWED, etc.\n */\n async renameColumn(\n tableName: string,\n columnName: string,\n body: RenameColumnRequest\n ): Promise<ColumnSchema | undefined> {\n validateNonEmptyString(tableName, \"Table name\");\n validateNonEmptyString(columnName, \"Column name\");\n validateNonEmptyString(body.newName, \"New column name\");\n const prefix = databasePath(this.database);\n const encodedTable = encodeURIComponent(tableName);\n const encodedColumn = encodeURIComponent(columnName);\n return this.transport.patch<ColumnSchema | undefined>(\n `${prefix}/tables/${encodedTable}/columns/${encodedColumn}`,\n body\n );\n }\n\n /**\n * Drops a column from a table.\n * @param tableName - Table name.\n * @param columnName - Column name.\n * @throws AoudaNotFoundError if table or column does not exist; AoudaApiError for WRITE_NOT_ALLOWED, etc.\n */\n async dropColumn(tableName: string, columnName: string): Promise<void> {\n validateNonEmptyString(tableName, \"Table name\");\n validateNonEmptyString(columnName, \"Column name\");\n const prefix = databasePath(this.database);\n const encodedTable = encodeURIComponent(tableName);\n const encodedColumn = encodeURIComponent(columnName);\n await this.transport.delete<void>(\n `${prefix}/tables/${encodedTable}/columns/${encodedColumn}`\n );\n }\n\n /**\n * Updates a table's storage policy (temperature).\n * @param name - Table name.\n * @param body - Request body with storageTemperature (\"Auto\" | \"HotOnly\" | \"ColdPreferred\").\n * @returns Updated policy (storageTemperature, optional residency).\n * @throws AoudaNotFoundError if table does not exist; AoudaApiError for WRITE_NOT_ALLOWED, INVALID_REQUEST, etc.\n */\n async updatePolicy(\n name: string,\n body: UpdateTablePolicyRequest\n ): Promise<TablePolicy> {\n validateNonEmptyString(name, \"Table name\");\n const prefix = databasePath(this.database);\n const encodedName = encodeURIComponent(name);\n const requestBody = {\n database: this.database,\n storageTemperature: body.storageTemperature,\n };\n return this.transport.put<TablePolicy>(\n `${prefix}/tables/${encodedName}/policy`,\n requestBody\n );\n }\n}\n","/**\n * Databases API for @aouda/client.\n * Server-level operations: list and create databases.\n */\n\nimport type { Transport } from \"./transport.js\";\nimport type {\n DatabaseInfo,\n CreateDatabaseOptions,\n DatabaseListResponse,\n} from \"./types.js\";\n\n/**\n * API for listing and creating databases.\n * Access via `client.databases`.\n * Uses server-level paths (GET/POST /api/databases) with no database in path.\n */\nexport class DatabasesApi {\n private readonly transport: Transport;\n\n constructor(transport: Transport) {\n this.transport = transport;\n }\n\n /**\n * Lists all databases on the server.\n * GET /api/databases\n *\n * @returns Array of database info (name, state, createdAt, options).\n */\n async list(): Promise<DatabaseInfo[]> {\n const response =\n await this.transport.get<DatabaseListResponse>(\"/api/databases\");\n return response.databases;\n }\n\n /**\n * Creates a new database.\n * POST /api/databases\n *\n * @param name - Database name.\n * @param options - Optional settings (enableWal, replicationMode, maxMemoryBytes, defaultTemperature).\n * @returns The created database info.\n */\n async create(\n name: string,\n options?: CreateDatabaseOptions\n ): Promise<DatabaseInfo> {\n const body: Record<string, unknown> = { name };\n if (options?.enableWal !== undefined) {\n body.enableWal = options.enableWal;\n }\n if (options?.replicationMode !== undefined) {\n body.replicationMode = options.replicationMode;\n }\n if (options?.maxMemoryBytes !== undefined) {\n body.maxMemoryBytes = options.maxMemoryBytes;\n }\n if (options?.defaultTemperature !== undefined) {\n body.defaultTemperature = options.defaultTemperature;\n }\n return this.transport.post<DatabaseInfo>(\"/api/databases\", body);\n }\n\n /**\n * Gets information for a single database.\n * GET /api/databases/{db}\n *\n * @param databaseName - Database name.\n * @returns Database info.\n */\n async get(databaseName: string): Promise<DatabaseInfo> {\n const path = `/api/databases/${encodeURIComponent(databaseName)}`;\n return this.transport.get<DatabaseInfo>(path);\n }\n\n /**\n * Drops a database.\n * DELETE /api/databases/{db}\n *\n * @param databaseName - Database name.\n */\n async drop(databaseName: string): Promise<void> {\n const path = `/api/databases/${encodeURIComponent(databaseName)}`;\n await this.transport.delete(path);\n }\n}\n","/**\n * Schema management API: diff, apply, export, history.\n * Uses server endpoints under /api/databases/{db}/schema.\n */\n\nimport type { Transport } from \"../transport.js\";\nimport { databasePath } from \"../database-path.js\";\n\n/** Server diff result (matches SchemaDiffResult). */\nexport interface SchemaDiffResult {\n changes: SchemaChange[];\n summary: DiffSummary;\n warnings?: SchemaChangeWarning[];\n}\n\nexport interface SchemaChange {\n type: string;\n tableName?: string | null;\n columnName?: string | null;\n isDestructive: boolean;\n details: string;\n before?: unknown;\n after?: unknown;\n}\n\nexport interface DiffSummary {\n totalChanges: number;\n safeChanges: number;\n destructiveChanges: number;\n tablesCreated: number;\n tablesDropped: number;\n columnsAdded: number;\n columnsDropped: number;\n policiesUpdated: number;\n durabilitiesUpdated: number;\n settingsUpdated: number;\n}\n\nexport interface SchemaChangeWarning {\n code?: string;\n message?: string;\n}\n\n/** Server apply request body. */\nexport interface SchemaApplyRequest {\n schema: Record<string, unknown>;\n options?: { allowDestructive?: boolean; dryRun?: boolean };\n}\n\n/** Server apply response (SchemaApplyResponse). */\nexport interface SchemaApplyResponse {\n result: SchemaApplyResult;\n historyId?: number | null;\n}\n\nexport interface SchemaApplyResult {\n entries: ApplyResultEntry[];\n summary: ApplyResultSummary;\n}\n\nexport interface ApplyResultEntry {\n changeType: string;\n tableName?: string | null;\n columnName?: string | null;\n status: string;\n reason?: string | null;\n}\n\nexport interface ApplyResultSummary {\n totalChanges: number;\n applied: number;\n skipped: number;\n failed: number;\n planned: number;\n}\n\n/** Migration history entry (MigrationHistoryEntry). */\nexport interface MigrationHistoryEntry {\n id: number;\n timestamp: string;\n source: string;\n schemaHash: string;\n changes: MigrationChangeEntry[];\n appliedBy?: string | null;\n}\n\nexport interface MigrationChangeEntry {\n changeType?: string;\n tableName?: string | null;\n columnName?: string | null;\n status?: string;\n}\n\n/** Per-table counts from `POST .../schema/seed`. */\nexport interface SeedTableApplyResult {\n insertedCount: number;\n skippedCount: number;\n}\n\n/** Root response from seed apply. */\nexport interface SeedApplyResult {\n tables: Record<string, SeedTableApplyResult>;\n}\n\n/**\n * Schema API for Aouda (diff, apply, export, history).\n */\nexport class SchemaApi {\n private readonly transport: Transport;\n private readonly database: string;\n\n constructor(transport: Transport, database: string) {\n this.transport = transport;\n this.database = database;\n }\n\n private get prefix(): string {\n return `${databasePath(this.database)}/schema`;\n }\n\n /**\n * Compute diff between desired schema and current database.\n * @param desired - Schema document (merged from file + overlay).\n * @param format - \"json\" (default) or \"markdown\".\n */\n async diff(\n desired: Record<string, unknown>,\n format: \"json\" | \"markdown\" = \"json\"\n ): Promise<SchemaDiffResult | string> {\n const path = `${this.prefix}/diff${format === \"markdown\" ? \"?format=markdown\" : \"\"}`;\n if (format === \"markdown\") {\n return this.transport.request<string>({\n method: \"POST\",\n path,\n body: desired,\n headers: { Accept: \"text/markdown\" },\n rawText: true,\n });\n }\n return this.transport.post<SchemaDiffResult>(path, desired);\n }\n\n /**\n * Apply desired schema to the database.\n */\n async apply(\n desired: Record<string, unknown>,\n options: { allowDestructive?: boolean; dryRun?: boolean } = {}\n ): Promise<SchemaApplyResponse> {\n const body: SchemaApplyRequest = {\n schema: desired,\n options: {\n allowDestructive: options.allowDestructive ?? false,\n dryRun: options.dryRun ?? false,\n },\n };\n return this.transport.post<SchemaApplyResponse>(`${this.prefix}/apply`, body);\n }\n\n /**\n * Export current database schema as JSON (aouda.schema.json format).\n */\n async export(): Promise<Record<string, unknown>> {\n return this.transport.get<Record<string, unknown>>(`${this.prefix}/export`);\n }\n\n /**\n * Get paginated migration history (newest first).\n */\n async history(limit: number = 50, offset: number = 0): Promise<MigrationHistoryEntry[]> {\n const path = `${this.prefix}/history?limit=${encodeURIComponent(limit)}&offset=${encodeURIComponent(offset)}`;\n return this.transport.get<MigrationHistoryEntry[]>(path);\n }\n\n /**\n * Apply seed data (idempotent inserts). Body is a aouda seed document (`{ tables: { ... } }`).\n */\n async seed(document: Record<string, unknown>): Promise<SeedApplyResult> {\n return this.transport.post<SeedApplyResult>(`${this.prefix}/seed`, document);\n }\n}\n","/**\n * Branches API: list, create, get, delete, diff, merge.\n * Uses server endpoints under /api/databases/{db}/branches.\n */\n\nimport type { Transport } from \"../transport.js\";\nimport { databasePath } from \"../database-path.js\";\nimport type {\n SchemaDiffResult,\n SchemaChange,\n SchemaApplyResult,\n} from \"./api.js\";\n\n/** Branch metadata (and optional diff from parent). Matches server BranchInfo. */\nexport interface BranchInfo {\n name: string;\n from: string;\n createdAt: string;\n diff?: SchemaDiffResult | null;\n}\n\n/** Request body for creating a branch. */\nexport interface CreateBranchRequest {\n name: string;\n parentBranch?: string;\n /** Server uses \"from\" for parent branch name. */\n from?: string;\n}\n\n/** Options for merge (dry-run vs execute). */\nexport interface MergeBranchOptions {\n dryRun?: boolean;\n /** Server uses \"execute\" in body. */\n execute?: boolean;\n allowDestructive?: boolean;\n force?: boolean;\n}\n\n/** Merge conflict (branch change vs parent change). */\nexport interface MergeConflict {\n branchChange: SchemaChange;\n parentChange: SchemaChange;\n description: string;\n}\n\n/** Merge plan result (dry-run). */\nexport interface MergeResult {\n mergePlan: SchemaDiffResult;\n conflicts: MergeConflict[];\n hasConflicts: boolean;\n parentDiverged: boolean;\n branchName: string;\n baseSnapshotMissing?: boolean;\n}\n\n/** Result of executing a merge. */\nexport interface MergeExecutionResult {\n mergeResult: MergeResult;\n applyResult?: SchemaApplyResult | null;\n historyId?: number | null;\n executed: boolean;\n}\n\n/**\n * Branches API for Aouda (database-scoped).\n */\nexport class BranchesApi {\n private readonly transport: Transport;\n private readonly database: string;\n\n constructor(transport: Transport, database: string) {\n this.transport = transport;\n this.database = database;\n }\n\n private get prefix(): string {\n return `${databasePath(this.database)}/branches`;\n }\n\n /** List all branches (excluding implicit main). */\n async list(): Promise<BranchInfo[]> {\n return this.transport.get<BranchInfo[]>(this.prefix);\n }\n\n /** Create a branch. Parent defaults to main. */\n async create(body: CreateBranchRequest): Promise<BranchInfo> {\n const payload = {\n name: body.name,\n from: body.from ?? body.parentBranch ?? \"main\",\n };\n return this.transport.post<BranchInfo>(this.prefix, payload);\n }\n\n /** Get branch details (includes diff from parent when available). */\n async get(name: string): Promise<BranchInfo> {\n const path = `${this.prefix}/${encodeURIComponent(name)}`;\n return this.transport.get<BranchInfo>(path);\n }\n\n /** Get schema diff of branch vs parent. */\n async diff(name: string): Promise<SchemaDiffResult> {\n const path = `${this.prefix}/${encodeURIComponent(name)}/diff`;\n return this.transport.post<SchemaDiffResult>(path, {});\n }\n\n /**\n * Merge branch to parent (main). Use dryRun: true to get plan, then execute without dryRun to apply.\n * Returns MergeResult when dryRun (or no options); returns MergeExecutionResult when execute: true.\n */\n async merge(\n name: string,\n options: MergeBranchOptions = {}\n ): Promise<MergeResult | MergeExecutionResult> {\n const path = `${this.prefix}/${encodeURIComponent(name)}/merge`;\n const execute = options.execute ?? (options.dryRun === false);\n const body = {\n execute: !!execute,\n allowDestructive: options.allowDestructive ?? false,\n force: options.force ?? false,\n };\n return this.transport.post<MergeResult | MergeExecutionResult>(path, body);\n }\n\n /** Delete a branch. */\n async delete(name: string): Promise<void> {\n const path = `${this.prefix}/${encodeURIComponent(name)}`;\n await this.transport.delete(path);\n }\n}\n","/**\n * Server admin API: info, memory, metrics.\n * Access via client.admin.server.\n */\n\nimport type { Transport } from \"../transport.js\";\nimport type {\n ServiceInfo,\n ServerMemoryResponse,\n ServerMetricsResponse,\n SingleDatabaseMetricsResponse,\n} from \"./types.js\";\n\nexport class ServerAdminApi {\n private readonly transport: Transport;\n\n constructor(transport: Transport) {\n this.transport = transport;\n }\n\n /**\n * Service information (name, version, status, table/database counts).\n * GET /\n */\n async info(): Promise<ServiceInfo> {\n return this.transport.get<ServiceInfo>(\"/\");\n }\n\n /**\n * Server-wide memory usage with per-database breakdown.\n * GET /api/server/memory\n */\n async memory(): Promise<ServerMemoryResponse> {\n return this.transport.get<ServerMemoryResponse>(\"/api/server/memory\");\n }\n\n /**\n * Per-database metrics summary for all databases.\n * GET /api/server/metrics\n */\n async metrics(): Promise<ServerMetricsResponse> {\n return this.transport.get<ServerMetricsResponse>(\"/api/server/metrics\");\n }\n\n /**\n * Combined metrics for a single database.\n * GET /api/server/databases/{db}/metrics\n *\n * @param databaseName - Database name.\n */\n async databaseMetrics(databaseName: string): Promise<SingleDatabaseMetricsResponse> {\n const path = `/api/server/databases/${encodeURIComponent(databaseName)}/metrics`;\n return this.transport.get<SingleDatabaseMetricsResponse>(path);\n }\n}\n","/**\n * Health admin API: check, ready, detailed.\n * Access via client.admin.health.\n */\n\nimport type { Transport } from \"../transport.js\";\nimport type { HealthStatus } from \"../types.js\";\nimport type { ReadinessResponse, DetailedHealthResponse } from \"./types.js\";\n\n/** Raw health response from GET /health. */\ninterface HealthResponse {\n status: string;\n}\n\nexport class HealthAdminApi {\n private readonly transport: Transport;\n\n constructor(transport: Transport) {\n this.transport = transport;\n }\n\n /**\n * Basic liveness probe. Same as client.health().\n * GET /health\n */\n async check(): Promise<HealthStatus> {\n const response = await this.transport.get<HealthResponse>(\"/health\");\n return {\n status: response.status,\n isHealthy: response.status.toLowerCase() === \"healthy\",\n };\n }\n\n /**\n * Readiness probe. Returns 200 when ready; on 503 returns parsed body (ready: false, reason).\n * GET /ready\n */\n async ready(): Promise<ReadinessResponse> {\n return this.transport.request<ReadinessResponse>({\n method: \"GET\",\n path: \"/ready\",\n allowStatuses: [503],\n });\n }\n\n /**\n * Detailed component-level health. Returns 200 when healthy/degraded, 503 when unhealthy (body still returned).\n * GET /health/detailed\n */\n async detailed(): Promise<DetailedHealthResponse> {\n return this.transport.request<DetailedHealthResponse>({\n method: \"GET\",\n path: \"/health/detailed\",\n allowStatuses: [503],\n });\n }\n}\n","/**\n * Admin metrics API: snapshot, summary, subsystem, history.\n * Access via client.admin.metrics.\n */\n\nimport type { Transport } from \"../transport.js\";\nimport type {\n MetricsSnapshot,\n MetricsSummary,\n MetricsHistory,\n MetricsHistoryOptions,\n} from \"./metrics-types.js\";\n\nconst BASE_PATH = \"/api/admin/metrics\";\n\nexport class MetricsAdminApi {\n private readonly transport: Transport;\n\n constructor(transport: Transport) {\n this.transport = transport;\n }\n\n /**\n * Full metrics snapshot with all subsystems.\n * GET /api/admin/metrics\n */\n async snapshot(): Promise<MetricsSnapshot> {\n return this.transport.get<MetricsSnapshot>(BASE_PATH);\n }\n\n /**\n * Lightweight metrics summary for dashboard cards.\n * GET /api/admin/metrics/summary\n */\n async summary(): Promise<MetricsSummary> {\n return this.transport.get<MetricsSummary>(`${BASE_PATH}/summary`);\n }\n\n /**\n * Metrics for a specific subsystem (query, storage, replication, etc.).\n * GET /api/admin/metrics/{subsystem}\n * Returns 404 for unknown subsystem name.\n *\n * @param name - Subsystem name (e.g. query, storage, replication, memory, io).\n */\n async subsystem(name: string): Promise<Record<string, unknown>> {\n const path = `${BASE_PATH}/${encodeURIComponent(name)}`;\n return this.transport.get<Record<string, unknown>>(path);\n }\n\n /**\n * Historical metrics for sparkline charts.\n * GET /api/admin/metrics/history?minutes=&interval=\n * Server clamps minutes to 1–1440, interval to 1–3600.\n *\n * @param options - Optional minutes (default 60) and interval in seconds (default 60).\n */\n async history(options?: MetricsHistoryOptions): Promise<MetricsHistory> {\n const minutes = options?.minutes ?? 60;\n const interval = options?.interval ?? 60;\n const params = new URLSearchParams({\n minutes: String(minutes),\n interval: String(interval),\n });\n const path = `${BASE_PATH}/history?${params.toString()}`;\n return this.transport.get<MetricsHistory>(path);\n }\n}\n","/**\n * Admin replication API: status, topology, coverage.\n * Access via client.admin.replication.\n */\n\nimport type { Transport } from \"../transport.js\";\nimport type {\n ReplicationStatusResponse,\n TopologyResponse,\n CoverageResponse,\n} from \"./replication-types.js\";\n\nconst BASE_PATH = \"/admin/replication\";\n\nexport class ReplicationAdminApi {\n private readonly transport: Transport;\n\n constructor(transport: Transport) {\n this.transport = transport;\n }\n\n /**\n * Current replication status (role, lag, fencing token, per-database lag).\n * GET /admin/replication/status\n */\n async status(): Promise<ReplicationStatusResponse> {\n return this.transport.get<ReplicationStatusResponse>(\n `${BASE_PATH}/status`\n );\n }\n\n /**\n * Replica set topology (members, read candidates, primary).\n * GET /admin/replication/topology\n */\n async topology(): Promise<TopologyResponse> {\n return this.transport.get<TopologyResponse>(`${BASE_PATH}/topology`);\n }\n\n /**\n * Per-table replication coverage across all databases.\n * GET /admin/replication/coverage\n */\n async coverage(): Promise<CoverageResponse> {\n return this.transport.get<CoverageResponse>(`${BASE_PATH}/coverage`);\n }\n}\n","/**\n * Admin cluster lifecycle API.\n * Access via client.admin.cluster.\n */\n\nimport type { Transport } from \"../transport.js\";\nimport type {\n JoinClusterRequest,\n JoinClusterResponse,\n LeaveClusterResponse,\n PromoteClusterResponse,\n FailoverClusterResponse,\n DrainClusterResponse,\n ClusterConfigResponse,\n ClusterConfigPatchRequest,\n} from \"./cluster-types.js\";\n\nconst BASE_PATH = \"/admin/cluster\";\n\nexport class ClusterAdminApi {\n private readonly transport: Transport;\n\n constructor(transport: Transport) {\n this.transport = transport;\n }\n\n /**\n * Join this node to an existing replica set.\n * POST /admin/cluster/join\n */\n async join(request: JoinClusterRequest): Promise<JoinClusterResponse> {\n return this.transport.post<JoinClusterResponse>(`${BASE_PATH}/join`, request);\n }\n\n /**\n * Leave the current cluster and return to standalone mode.\n * DELETE /admin/cluster/leave\n */\n async leave(): Promise<LeaveClusterResponse> {\n return this.transport.delete<LeaveClusterResponse>(`${BASE_PATH}/leave`);\n }\n\n /**\n * Trigger election to promote this node.\n * POST /admin/cluster/promote\n */\n async promote(): Promise<PromoteClusterResponse> {\n return this.transport.post<PromoteClusterResponse>(`${BASE_PATH}/promote`, {});\n }\n\n /**\n * Trigger failover by stepping down current primary.\n * POST /admin/cluster/failover\n */\n async failover(): Promise<FailoverClusterResponse> {\n return this.transport.post<FailoverClusterResponse>(\n `${BASE_PATH}/failover`,\n {}\n );\n }\n\n /**\n * Mark a member as draining.\n * POST /admin/cluster/drain/{nodeAddress}\n */\n async drain(nodeAddress: string): Promise<DrainClusterResponse> {\n const encoded = encodeURIComponent(nodeAddress);\n return this.transport.post<DrainClusterResponse>(\n `${BASE_PATH}/drain/${encoded}`,\n {}\n );\n }\n\n /**\n * Fetch current cluster config.\n * GET /admin/cluster/config\n */\n async getConfig(): Promise<ClusterConfigResponse> {\n return this.transport.get<ClusterConfigResponse>(`${BASE_PATH}/config`);\n }\n\n /**\n * Patch mutable cluster config fields.\n * PATCH /admin/cluster/config\n */\n async patchConfig(\n patch: ClusterConfigPatchRequest\n ): Promise<ClusterConfigResponse> {\n return this.transport.patch<ClusterConfigResponse>(\n `${BASE_PATH}/config`,\n patch\n );\n }\n}\n","/**\n * Admin backup API.\n * Access via client.admin.backup.\n */\n\nimport type { Transport } from \"../transport.js\";\nimport type {\n TriggerBackupRequest,\n TriggerBackupResponse,\n ListBackupsResponse,\n RestoreBackupResponse,\n BackupSchedule,\n} from \"./backup-types.js\";\n\nconst BASE_PATH = \"/admin/backup\";\n\nexport class BackupAdminApi {\n private readonly transport: Transport;\n\n constructor(transport: Transport) {\n this.transport = transport;\n }\n\n /**\n * Trigger an immediate backup.\n * POST /admin/backup/trigger\n */\n async trigger(request?: TriggerBackupRequest): Promise<TriggerBackupResponse> {\n return this.transport.post<TriggerBackupResponse>(\n `${BASE_PATH}/trigger`,\n request ?? {}\n );\n }\n\n /**\n * List available backups.\n * GET /admin/backup/list\n */\n async list(): Promise<ListBackupsResponse> {\n return this.transport.get<ListBackupsResponse>(`${BASE_PATH}/list`);\n }\n\n /**\n * Restore a backup by id.\n * POST /admin/backup/restore/{id}\n */\n async restore(backupId: string): Promise<RestoreBackupResponse> {\n const encoded = encodeURIComponent(backupId);\n return this.transport.post<RestoreBackupResponse>(\n `${BASE_PATH}/restore/${encoded}`,\n {}\n );\n }\n\n /**\n * Get backup schedule.\n * GET /admin/backup/schedule\n */\n async getSchedule(): Promise<BackupSchedule> {\n return this.transport.get<BackupSchedule>(`${BASE_PATH}/schedule`);\n }\n\n /**\n * Set backup schedule.\n * PUT /admin/backup/schedule\n */\n async setSchedule(schedule: BackupSchedule): Promise<BackupSchedule> {\n return this.transport.put<BackupSchedule>(`${BASE_PATH}/schedule`, schedule);\n }\n}\n","/**\n * Admin runtime config API.\n * Access via client.admin.config.\n */\n\nimport type { Transport } from \"../transport.js\";\nimport type {\n AdminConfigResponse,\n AdminConfigSchemaResponse,\n AdminConfigPatchRequest,\n} from \"./config-types.js\";\n\nconst BASE_PATH = \"/admin/config\";\n\nexport class ConfigAdminApi {\n private readonly transport: Transport;\n\n constructor(transport: Transport) {\n this.transport = transport;\n }\n\n /**\n * Get current runtime config.\n * GET /admin/config\n */\n async get(): Promise<AdminConfigResponse> {\n return this.transport.get<AdminConfigResponse>(BASE_PATH);\n }\n\n /**\n * Patch mutable runtime config values.\n * PATCH /admin/config\n */\n async patch(patch: AdminConfigPatchRequest): Promise<AdminConfigResponse> {\n return this.transport.patch<AdminConfigResponse>(BASE_PATH, patch);\n }\n\n /**\n * Get mutable and immutable config fields.\n * GET /admin/config/schema\n */\n async schema(): Promise<AdminConfigSchemaResponse> {\n return this.transport.get<AdminConfigSchemaResponse>(`${BASE_PATH}/schema`);\n }\n}\n","/**\n * Admin node info and logs API.\n * Access via client.admin.node.\n */\n\nimport type { Transport } from \"../transport.js\";\nimport type {\n NodeInfoResponse,\n NodeLogEntry,\n NodeLogsResponse,\n NodeLogsQuery,\n NodeLogStreamOptions,\n} from \"./node-types.js\";\n\nconst BASE_PATH = \"/admin/node\";\n\nexport class NodeAdminApi {\n private readonly transport: Transport;\n\n constructor(transport: Transport) {\n this.transport = transport;\n }\n\n /**\n * Get node identity and resource snapshot.\n * GET /admin/node\n */\n async get(): Promise<NodeInfoResponse> {\n return this.transport.get<NodeInfoResponse>(BASE_PATH);\n }\n\n /**\n * Query recent buffered logs.\n * GET /admin/node/logs\n */\n async logs(options?: NodeLogsQuery): Promise<NodeLogsResponse> {\n const path = this.buildLogsPath(`${BASE_PATH}/logs`, options);\n return this.transport.get<NodeLogsResponse>(path, options);\n }\n\n /**\n * Stream node logs as SSE events.\n * GET /admin/node/logs/stream\n */\n async *streamLogs(\n options?: NodeLogStreamOptions\n ): AsyncIterable<NodeLogEntry> {\n const path = this.buildLogsPath(`${BASE_PATH}/logs/stream`, options);\n const response = await this.transport.requestRaw({\n method: \"GET\",\n path,\n headers: { Accept: \"text/event-stream\" },\n timeout: options?.timeout,\n signal: options?.signal,\n });\n\n if (response.body === null) {\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const boundary = findEventBoundary(buffer);\n if (boundary < 0) {\n break;\n }\n\n const rawEvent = buffer.slice(0, boundary);\n const separatorLength = buffer.startsWith(\"\\r\\n\\r\\n\", boundary)\n ? 4\n : 2;\n buffer = buffer.slice(boundary + separatorLength);\n\n const parsed = parseSseLogEvent(rawEvent);\n if (parsed !== null) {\n yield parsed;\n }\n }\n }\n\n const remaining = decoder.decode();\n if (remaining.length > 0) {\n buffer += remaining;\n }\n\n const trailing = parseSseLogEvent(buffer);\n if (trailing !== null) {\n yield trailing;\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n private buildLogsPath(\n basePath: string,\n options?: Pick<NodeLogsQuery, \"level\" | \"contains\" | \"limit\">\n ): string {\n const params = new URLSearchParams();\n\n if (options?.level !== undefined) {\n params.set(\"level\", options.level);\n }\n if (options?.contains !== undefined && options.contains.trim().length > 0) {\n params.set(\"contains\", options.contains);\n }\n if (options?.limit !== undefined) {\n params.set(\"limit\", String(options.limit));\n }\n\n const query = params.toString();\n return query.length > 0 ? `${basePath}?${query}` : basePath;\n }\n}\n\nfunction findEventBoundary(buffer: string): number {\n const unix = buffer.indexOf(\"\\n\\n\");\n const windows = buffer.indexOf(\"\\r\\n\\r\\n\");\n if (unix < 0) {\n return windows;\n }\n if (windows < 0) {\n return unix;\n }\n return Math.min(unix, windows);\n}\n\nfunction parseSseLogEvent(rawEvent: string): NodeLogEntry | null {\n const normalized = rawEvent.replace(/\\r\\n/g, \"\\n\").trim();\n if (normalized.length === 0) {\n return null;\n }\n\n let eventName = \"\";\n const dataLines: string[] = [];\n for (const line of normalized.split(\"\\n\")) {\n if (line.startsWith(\"event:\")) {\n eventName = line.slice(\"event:\".length).trim();\n continue;\n }\n\n if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(\"data:\".length).trimStart());\n }\n }\n\n if (eventName.length > 0 && eventName !== \"log\") {\n return null;\n }\n if (dataLines.length === 0) {\n return null;\n }\n\n const payload = dataLines.join(\"\\n\");\n try {\n const parsed = JSON.parse(payload) as NodeLogEntry;\n if (\n typeof parsed.timestampUtc === \"string\" &&\n typeof parsed.level === \"string\" &&\n typeof parsed.category === \"string\" &&\n typeof parsed.message === \"string\"\n ) {\n return parsed;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n","/**\n * Admin API: server info, memory, metrics, health, replication.\n * Access via client.admin.\n */\n\nimport type { Transport } from \"../transport.js\";\nimport { ServerAdminApi } from \"./server.js\";\nimport { HealthAdminApi } from \"./health.js\";\nimport { MetricsAdminApi } from \"./metrics.js\";\nimport { ReplicationAdminApi } from \"./replication.js\";\nimport { ClusterAdminApi } from \"./cluster.js\";\nimport { BackupAdminApi } from \"./backup.js\";\nimport { ConfigAdminApi } from \"./config.js\";\nimport { NodeAdminApi } from \"./node.js\";\n\nexport { ServerAdminApi } from \"./server.js\";\nexport { HealthAdminApi } from \"./health.js\";\nexport { MetricsAdminApi } from \"./metrics.js\";\nexport { ReplicationAdminApi } from \"./replication.js\";\nexport { ClusterAdminApi } from \"./cluster.js\";\nexport { BackupAdminApi } from \"./backup.js\";\nexport { ConfigAdminApi } from \"./config.js\";\nexport { NodeAdminApi } from \"./node.js\";\nexport type {\n ServiceInfo,\n ServerMemoryResponse,\n ServerMetricsResponse,\n SingleDatabaseMetricsResponse,\n DatabaseMemoryUsage,\n DatabaseMetricsDto,\n ReadinessResponse,\n DetailedHealthResponse,\n ComponentHealthEntry,\n} from \"./types.js\";\nexport type {\n MetricsSnapshot,\n MetricsSummary,\n MetricsHistory,\n MetricsHistoryOptions,\n LatencyPercentiles,\n QueryMetrics,\n StorageMetrics,\n ReplicationMetrics,\n BackupMetrics,\n PartitioningMetrics,\n TimeSeriesMetrics,\n MaterializedQueryMetrics,\n BloomFilterMetrics,\n TransactionMetrics,\n MemoryMetrics,\n IoMetrics,\n SimdMetrics,\n PageCacheMetrics,\n DatabaseMemoryMetrics,\n PerDatabaseMetrics,\n} from \"./metrics-types.js\";\nexport type {\n ReplicationStatusResponse,\n PerDatabaseLagEntry,\n TopologyResponse,\n MemberInfo,\n PerDatabaseStatusEntry,\n SubscriptionInfo,\n CoverageResponse,\n DatabaseCoverageEntry,\n TableCoverageEntry,\n} from \"./replication-types.js\";\nexport type {\n JoinClusterRequest,\n JoinClusterResponse,\n LeaveClusterResponse,\n PromoteClusterResponse,\n FailoverClusterResponse,\n DrainClusterResponse,\n ClusterMemberEntry,\n ClusterThisNodeEntry,\n ClusterConfigResponse,\n ClusterConfigPatchRequest,\n} from \"./cluster-types.js\";\nexport type {\n TriggerBackupRequest,\n TriggerBackupResponse,\n BackupSummary,\n ListBackupsResponse,\n RestoreBackupResponse,\n BackupSchedule,\n} from \"./backup-types.js\";\nexport type {\n AdminMemoryConfig,\n AdminBackupConfig,\n AdminLoggingConfig,\n AdminConfigResponse,\n AdminConfigSchemaResponse,\n AdminMemoryPatch,\n AdminBackupPatch,\n AdminLoggingPatch,\n AdminConfigPatchRequest,\n} from \"./config-types.js\";\nexport type {\n NodeInfoResponse,\n NodeLogLevel,\n NodeLogEntry,\n NodeLogsResponse,\n NodeLogsQuery,\n NodeLogStreamOptions,\n} from \"./node-types.js\";\n\n/** Aggregated admin API exposed as client.admin. */\nexport class AdminApi {\n readonly server: ServerAdminApi;\n readonly health: HealthAdminApi;\n readonly metrics: MetricsAdminApi;\n readonly replication: ReplicationAdminApi;\n readonly cluster: ClusterAdminApi;\n readonly backup: BackupAdminApi;\n readonly config: ConfigAdminApi;\n readonly node: NodeAdminApi;\n\n constructor(transport: Transport) {\n this.server = new ServerAdminApi(transport);\n this.health = new HealthAdminApi(transport);\n this.metrics = new MetricsAdminApi(transport);\n this.replication = new ReplicationAdminApi(transport);\n this.cluster = new ClusterAdminApi(transport);\n this.backup = new BackupAdminApi(transport);\n this.config = new ConfigAdminApi(transport);\n this.node = new NodeAdminApi(transport);\n }\n}\n","/**\n * Materialized query HTTP API (`/api/databases/{db}/materialized-queries`).\n */\n\nimport type { Transport } from \"./transport.js\";\nimport { databasePath } from \"./database-path.js\";\n\n/** Matches server `MaterializedQueryType` enum (numeric). */\nexport const MaterializedQueryType = {\n LatestPerKey: 1,\n FirstPerKey: 2,\n Aggregate: 3,\n Filter: 4,\n TopNPerGroup: 5,\n} as const;\n\nexport type MaterializedQueryTypeNumber =\n (typeof MaterializedQueryType)[keyof typeof MaterializedQueryType];\n\n/** Matches server `MaterializedQueryState` enum (numeric). */\nexport const MaterializedQueryState = {\n Building: 0,\n Ready: 1,\n Rebuilding: 2,\n Error: 3,\n} as const;\n\nexport type MaterializedQueryStateNumber =\n (typeof MaterializedQueryState)[keyof typeof MaterializedQueryState];\n\n/** Status DTO returned by list/get (camelCase JSON from ASP.NET). */\nexport interface MaterializedQueryStatus {\n name: string;\n sourceTable: string;\n type: number;\n state: number;\n rowCount: number;\n createdUtc: string;\n lastUpdatedUtc?: string | null;\n currentLag?: string | null;\n rebuildProgress?: number | null;\n errorMessage?: string | null;\n}\n\n/**\n * Create payload: `configJson` is the type-specific config string (FilterConfig, LatestPerKeyConfig, …).\n * You may pass `config` as an object instead; it is JSON-stringified for the wire body.\n */\nexport interface MaterializedQueryDefinition {\n version?: number;\n name: string;\n sourceTable: string;\n type: MaterializedQueryTypeNumber;\n /** Serialized JSON text for the pattern config. */\n configJson?: string;\n /** If set (and `configJson` omitted), serialized with `JSON.stringify`. */\n config?: unknown;\n storage?: { storageTemperature?: string };\n updateMode?: number;\n}\n\nexport interface MaterializedQueryExecuteResult {\n rows: Record<string, unknown>[];\n stats?: {\n rowsScanned: number;\n rowsReturned: number;\n executionMs: number;\n };\n}\n\n/** Placeholder for future filter/limit on materialized query execution. */\nexport type MaterializedQueryExecuteOptions = Record<string, never>;\n\nexport interface MaterializedQueryRefreshOptions {\n await?: boolean;\n}\n\nfunction buildCreateBody(spec: MaterializedQueryDefinition): Record<string, unknown> {\n let configJson = spec.configJson;\n if (configJson === undefined || configJson === \"\") {\n if (spec.config === undefined) {\n throw new Error(\"materializedQueries.create() requires configJson or config\");\n }\n configJson = JSON.stringify(spec.config);\n }\n const body: Record<string, unknown> = {\n version: spec.version ?? 1,\n name: spec.name,\n sourceTable: spec.sourceTable,\n type: spec.type,\n configJson,\n };\n if (spec.storage !== undefined) {\n body.storage = spec.storage;\n }\n if (spec.updateMode !== undefined) {\n body.updateMode = spec.updateMode;\n }\n return body;\n}\n\n/**\n * Materialized query operations for a single database.\n */\nexport class MaterializedQueriesApi {\n private readonly transport: Transport;\n private readonly database: string;\n\n constructor(transport: Transport, database: string) {\n this.transport = transport;\n this.database = database;\n }\n\n private get prefix(): string {\n return `${databasePath(this.database)}/materialized-queries`;\n }\n\n async list(): Promise<MaterializedQueryStatus[]> {\n return this.transport.get<MaterializedQueryStatus[]>(this.prefix);\n }\n\n /**\n * Create a materialized query. Server returns 204 with an empty body on success.\n */\n async create(spec: MaterializedQueryDefinition): Promise<void> {\n await this.transport.post<undefined>(`${this.prefix}`, buildCreateBody(spec));\n }\n\n async drop(name: string): Promise<void> {\n const enc = encodeURIComponent(name);\n await this.transport.delete<undefined>(`${this.prefix}/${enc}`);\n }\n\n async status(name: string): Promise<MaterializedQueryStatus> {\n const enc = encodeURIComponent(name);\n return this.transport.get<MaterializedQueryStatus>(`${this.prefix}/${enc}`);\n }\n\n async refresh(name: string, options?: MaterializedQueryRefreshOptions): Promise<void> {\n const enc = encodeURIComponent(name);\n await this.transport.post<undefined>(`${this.prefix}/${enc}:refresh`, {\n await: options?.await ?? false,\n });\n }\n\n /**\n * Read rows from a Ready materialized query. Optional `options` reserved for future use.\n */\n async query(\n name: string,\n _options?: MaterializedQueryExecuteOptions\n ): Promise<MaterializedQueryExecuteResult> {\n const enc = encodeURIComponent(name);\n return this.transport.post<MaterializedQueryExecuteResult>(\n `${this.prefix}/${enc}/query`,\n {}\n );\n }\n}\n","import type { AuthHandler } from \"../auth/auth-handler.js\";\nimport { decode as decodeMessagePack, encode as encodeMessagePack } from \"@msgpack/msgpack\";\nimport {\n AoudaAuthenticationError,\n AoudaConnectionError,\n} from \"../errors.js\";\nimport type {\n ClientMessage,\n ServerMessage,\n StreamingWireMode,\n} from \"./streaming-types.js\";\nimport type { StreamingTransport } from \"./streaming-transport.js\";\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst DEFAULT_PING_INTERVAL_MS = 20_000;\nconst DEFAULT_MAX_MISSED_HEARTBEATS = 3;\nconst INITIAL_BACKOFF_MS = 1_000;\nconst MAX_BACKOFF_MS = 30_000;\nconst JITTER_FACTOR = 0.2;\nconst WS_READY_STATE_OPEN = 1;\n\n// ─── Public types ─────────────────────────────────────────────────────────────\n\n/** Minimal WebSocket interface required by WebSocketTransport. */\nexport interface WebSocketLike {\n readonly readyState: number;\n binaryType?: \"blob\" | \"arraybuffer\";\n onopen: ((ev: unknown) => void) | null;\n onmessage: ((ev: { data: unknown }) => void) | null;\n onclose:\n | ((ev: { code: number; reason: string; wasClean: boolean }) => void)\n | null;\n onerror: ((ev: unknown) => void) | null;\n send(data: string | Uint8Array): void;\n close(code?: number, reason?: string): void;\n}\n\n/** Callback invoked when an incoming server message arrives. */\nexport type MessageHandler = (message: ServerMessage) => void;\n\nexport interface WebSocketTransportOptions {\n /** Provide token source; pass null for no-auth databases. */\n authHandler: AuthHandler | null;\n /**\n * Override the WebSocket constructor for testing or custom environments.\n * Defaults to native `globalThis.WebSocket` (browser / Node 22+) or the\n * `ws` npm package (Node < 22, loaded via dynamic import).\n */\n wsFactory?: (\n url: string,\n enableCompression: boolean\n ) => WebSocketLike | Promise<WebSocketLike>;\n /** Called after a successful reconnect + re-auth handshake. */\n onReconnected?: () => void;\n /** Milliseconds between client-sent pings. Default: 20 000. */\n pingIntervalMs?: number;\n /** Number of unanswered pings before triggering reconnect. Default: 3. */\n maxMissedHeartbeats?: number;\n /** Enable permessage-deflate when using Node.js `ws`. Default: true. */\n enableCompression?: boolean;\n /** Streaming wire mode negotiated via auth message. Default: \"json\". */\n wireMode?: StreamingWireMode;\n}\n\n// ─── WebSocketTransport ───────────────────────────────────────────────────────\n\n/**\n * Persistent, multiplexed WebSocket connection for Aouda real-time streaming.\n *\n * - Connects to `/api/databases/{db}/ws` and completes the auth handshake.\n * - Serializes concurrent `send()` calls; no interleaved frames.\n * - Routes incoming server messages to per-channel handlers keyed by `id`.\n * Broadcast messages (no `id`) go to the `\"__global__\"` handler.\n * - Tracks the latest version from `heartbeat` messages.\n * - Auto-reconnects with exponential backoff + jitter; fires `onReconnected`\n * after a successful reconnect handshake.\n * - Fully disposable via `dispose()` / `Symbol.asyncDispose`.\n *\n * Not exported from `src/index.ts` — internal implementation detail of\n * `AoudaClient`. Access via `AoudaClient._getOrCreateWebSocketTransport()`.\n */\nexport class WebSocketTransport implements StreamingTransport {\n private readonly _serverUrl: string;\n private readonly _database: string;\n private readonly _authHandler: AuthHandler | null;\n private readonly _wsFactory: (\n url: string,\n enableCompression: boolean\n ) => WebSocketLike | Promise<WebSocketLike>;\n private readonly _onReconnected?: () => void;\n private readonly _pingIntervalMs: number;\n private readonly _maxMissedHeartbeats: number;\n private readonly _enableCompression: boolean;\n private _wireMode: StreamingWireMode;\n\n private _ws: WebSocketLike | null = null;\n private readonly _handlers = new Map<string, MessageHandler>();\n private readonly _reconnectHandlers = new Map<string, () => void>();\n\n // Serialized-send queue: each send appends to this tail.\n private _sendTail: Promise<void> = Promise.resolve();\n\n private _lastVersion = 0;\n private _reconnectAttempt = 0;\n private _disposed = false;\n private _missedPings = 0;\n private _pingTimerId: ReturnType<typeof setInterval> | null = null;\n private _reconnectTimerId: ReturnType<typeof setTimeout> | null = null;\n\n // Resolved/rejected when the auth handshake completes.\n private _authResolve: (() => void) | null = null;\n private _authReject: ((err: Error) => void) | null = null;\n\n constructor(\n serverUrl: string,\n database: string,\n options: WebSocketTransportOptions\n ) {\n this._serverUrl = serverUrl;\n this._database = database;\n this._authHandler = options.authHandler;\n this._wsFactory = options.wsFactory ?? defaultWsFactory;\n this._onReconnected = options.onReconnected;\n this._pingIntervalMs = options.pingIntervalMs ?? DEFAULT_PING_INTERVAL_MS;\n this._maxMissedHeartbeats =\n options.maxMissedHeartbeats ?? DEFAULT_MAX_MISSED_HEARTBEATS;\n this._enableCompression = options.enableCompression ?? true;\n this._wireMode = options.wireMode ?? \"json\";\n }\n\n // ─── Public API ────────────────────────────────────────────────────────────\n\n /** Latest version number from the most recent server `heartbeat` message. */\n get lastVersion(): number {\n return this._lastVersion;\n }\n\n /**\n * Registers a handler for incoming server messages with the given channel id.\n * Use `\"__global__\"` to receive broadcast messages that carry no `id`.\n */\n registerHandler(id: string, handler: MessageHandler): void {\n this._handlers.set(id, handler);\n }\n\n /** Removes a previously registered handler. */\n unregisterHandler(id: string): void {\n this._handlers.delete(id);\n }\n\n /**\n * Registers a reconnect callback keyed by an id so higher-level streaming\n * primitives can restore state after transport reconnect/auth success.\n */\n registerReconnectHandler(id: string, handler: () => void): void {\n this._reconnectHandlers.set(id, handler);\n }\n\n /** Removes a previously registered reconnect callback. */\n unregisterReconnectHandler(id: string): void {\n this._reconnectHandlers.delete(id);\n }\n\n /**\n * Opens the WebSocket connection and completes the auth handshake.\n * Resets the reconnect attempt counter on success.\n *\n * @throws AoudaConnectionError if the connection cannot be established.\n * @throws AoudaAuthenticationError if the server rejects the auth message.\n */\n async connect(): Promise<void> {\n if (this._disposed) {\n throw new AoudaConnectionError(\"WebSocketTransport has been disposed\");\n }\n await this._doConnect();\n this._reconnectAttempt = 0;\n }\n\n /**\n * Serializes a `ClientMessage` onto the WebSocket.\n * Concurrent calls are queued and sent in order; no frames interleave.\n *\n * @throws AoudaConnectionError if the transport is disposed or not connected.\n */\n send(message: ClientMessage): Promise<void> {\n const result = this._sendTail.then(() => this._doSend(message));\n // Keep the tail advancing even when a send rejects.\n this._sendTail = result.catch(() => {});\n return result;\n }\n\n /**\n * Closes the WebSocket, stops the reconnect loop, and rejects all pending\n * sends with `AoudaConnectionError`.\n */\n async dispose(): Promise<void> {\n if (this._disposed) return;\n this._disposed = true;\n this._stopPingInterval();\n this._clearReconnectTimer();\n\n // Reject any pending auth handshake so connect() callers are unblocked.\n const authReject = this._authReject;\n this._authResolve = null;\n this._authReject = null;\n if (authReject) {\n authReject(new AoudaConnectionError(\"WebSocketTransport disposed\"));\n }\n\n if (this._ws !== null) {\n this._ws.onclose = null; // suppress reconnect-on-close\n this._ws.close(1000, \"dispose\");\n this._ws = null;\n }\n // Reject any sends that are still in the queue.\n const err = new AoudaConnectionError(\"WebSocketTransport disposed\");\n this._sendTail = this._sendTail\n .then(() => {\n throw err;\n })\n .catch(() => {});\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n return this.dispose();\n }\n\n // ─── Internal: connection lifecycle ───────────────────────────────────────\n\n private async _doConnect(): Promise<void> {\n const wsUrl = buildWsUrl(this._serverUrl, this._database);\n let ws: WebSocketLike;\n try {\n ws = await this._wsFactory(wsUrl, this._enableCompression);\n } catch (err) {\n throw new AoudaConnectionError(\n `Failed to create WebSocket connection to ${wsUrl}`,\n err instanceof Error ? err : undefined\n );\n }\n\n this._ws = ws;\n if (\"binaryType\" in ws) {\n ws.binaryType = \"arraybuffer\";\n }\n\n await new Promise<void>((resolve, reject) => {\n this._authResolve = resolve;\n this._authReject = reject;\n\n ws.onerror = (ev) => {\n const r = this._authReject;\n this._authResolve = null;\n this._authReject = null;\n if (r) {\n r(\n new AoudaConnectionError(\n \"WebSocket error during connection\",\n ev instanceof Error ? ev : undefined\n )\n );\n }\n };\n\n ws.onclose = (ev) => {\n const r = this._authReject;\n this._authResolve = null;\n this._authReject = null;\n if (r) {\n r(\n new AoudaConnectionError(\n `WebSocket closed during auth handshake (code=${ev.code})`\n )\n );\n } else if (!this._disposed) {\n this._handleClose();\n }\n };\n\n ws.onmessage = (ev) => {\n this._handleMessage(ev.data);\n };\n\n ws.onopen = async () => {\n try {\n const token = this._authHandler\n ? await this._authHandler.getAccessToken()\n : null;\n this._sendRaw({\n type: \"auth\",\n token,\n database: this._database,\n wire_mode: this._wireMode,\n });\n } catch (err) {\n const r = this._authReject;\n this._authResolve = null;\n this._authReject = null;\n if (r) {\n r(\n err instanceof Error\n ? err\n : new AoudaConnectionError(\"Auth failed\")\n );\n }\n }\n };\n });\n\n // Auth handshake succeeded — update runtime handlers.\n ws.onclose = () => {\n if (!this._disposed) this._handleClose();\n };\n ws.onerror = () => {\n // Errors surface as close events; handled there.\n };\n\n this._startPingInterval();\n }\n\n // ─── Internal: message dispatch ───────────────────────────────────────────\n\n private _handleMessage(data: unknown): void {\n const msg = decodeServerMessage(data);\n if (msg === null) return;\n\n // Handle protocol-level messages internally first.\n switch (msg.type) {\n case \"auth_ok\": {\n if (msg.wire_mode === \"json\" || msg.wire_mode === \"msgpack\") {\n this._wireMode = msg.wire_mode;\n }\n const resolve = this._authResolve;\n this._authResolve = null;\n this._authReject = null;\n if (resolve) resolve();\n break;\n }\n case \"auth_error\": {\n const reject = this._authReject;\n this._authResolve = null;\n this._authReject = null;\n if (reject) {\n reject(\n new AoudaAuthenticationError(\n msg.message,\n msg.code,\n 401\n )\n );\n }\n break;\n }\n case \"heartbeat\":\n this._lastVersion = msg.version;\n break;\n case \"pong\":\n this._missedPings = 0;\n break;\n }\n\n // Route to registered handlers.\n const id = \"id\" in msg ? (msg as { id?: string }).id : undefined;\n if (id !== undefined && id !== null) {\n this._handlers.get(id)?.(msg);\n } else {\n this._handlers.get(\"__global__\")?.(msg);\n }\n }\n\n // ─── Internal: reconnect ──────────────────────────────────────────────────\n\n private _handleClose(): void {\n this._stopPingInterval();\n this._scheduleReconnect();\n }\n\n private _scheduleReconnect(): void {\n if (this._disposed) return;\n this._clearReconnectTimer();\n\n const delay = computeBackoff(this._reconnectAttempt);\n this._reconnectAttempt++;\n\n this._reconnectTimerId = setTimeout(() => {\n if (this._disposed) return;\n void this._reconnectOnce();\n }, delay);\n }\n\n private async _reconnectOnce(): Promise<void> {\n try {\n await this._doConnect();\n this._reconnectAttempt = 0;\n this._onReconnected?.();\n for (const handler of this._reconnectHandlers.values()) {\n try {\n handler();\n } catch {\n // Never let one listener block other reconnect listeners.\n }\n }\n } catch {\n if (!this._disposed) this._scheduleReconnect();\n }\n }\n\n // ─── Internal: ping / heartbeat ───────────────────────────────────────────\n\n private _startPingInterval(): void {\n this._stopPingInterval();\n this._missedPings = 0;\n\n this._pingTimerId = setInterval(() => {\n this._missedPings++;\n if (this._missedPings >= this._maxMissedHeartbeats) {\n this._stopPingInterval();\n if (this._ws !== null) {\n this._ws.onclose = null;\n this._ws.close(1001, \"missed heartbeats\");\n this._ws = null;\n }\n if (!this._disposed) this._handleClose();\n return;\n }\n this._sendRaw({ type: \"ping\" });\n }, this._pingIntervalMs);\n }\n\n private _stopPingInterval(): void {\n if (this._pingTimerId !== null) {\n clearInterval(this._pingTimerId);\n this._pingTimerId = null;\n }\n }\n\n private _clearReconnectTimer(): void {\n if (this._reconnectTimerId !== null) {\n clearTimeout(this._reconnectTimerId);\n this._reconnectTimerId = null;\n }\n }\n\n // ─── Internal: send helpers ───────────────────────────────────────────────\n\n private async _doSend(message: ClientMessage): Promise<void> {\n if (this._disposed) {\n throw new AoudaConnectionError(\"WebSocketTransport has been disposed\");\n }\n if (this._ws === null || this._ws.readyState !== WS_READY_STATE_OPEN) {\n throw new AoudaConnectionError(\"WebSocket is not open\");\n }\n this._ws.send(encodeClientMessage(message, this._wireMode));\n }\n\n /** Fire-and-forget raw send used for auth and ping (bypasses the send queue). */\n private _sendRaw(message: ClientMessage): void {\n if (this._ws !== null) {\n const payload =\n message.type === \"auth\"\n ? JSON.stringify(message)\n : encodeClientMessage(message, this._wireMode);\n this._ws.send(payload);\n }\n }\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction buildWsUrl(serverUrl: string, database: string): string {\n const base = serverUrl.replace(/\\/+$/, \"\").replace(/^https?/, (m) =>\n m === \"https\" ? \"wss\" : \"ws\"\n );\n return `${base}/api/databases/${encodeURIComponent(database)}/ws`;\n}\n\nfunction computeBackoff(attempt: number): number {\n const base = Math.min(\n INITIAL_BACKOFF_MS * Math.pow(2, attempt),\n MAX_BACKOFF_MS\n );\n const jitter = base * JITTER_FACTOR * (Math.random() * 2 - 1);\n return Math.max(1, Math.round(base + jitter));\n}\n\nfunction encodeClientMessage(\n message: ClientMessage,\n wireMode: StreamingWireMode\n): string | Uint8Array {\n if (wireMode === \"msgpack\" && message.type !== \"auth\") {\n return encodeMessagePack(message);\n }\n\n return JSON.stringify(message);\n}\n\nfunction decodeServerMessage(data: unknown): (ServerMessage & { id?: string }) | null {\n if (typeof data === \"string\") {\n try {\n return JSON.parse(data) as ServerMessage & { id?: string };\n } catch {\n return null;\n }\n }\n\n const bytes = toByteArray(data);\n if (bytes === null) return null;\n\n try {\n return decodeMessagePack(bytes) as ServerMessage & { id?: string };\n } catch {\n return null;\n }\n}\n\nfunction toByteArray(data: unknown): Uint8Array | null {\n if (data instanceof Uint8Array) return data;\n if (data instanceof ArrayBuffer) return new Uint8Array(data);\n\n // Browser Blob support for callers that do not set binaryType to \"arraybuffer\".\n if (typeof Blob !== \"undefined\" && data instanceof Blob) {\n return null;\n }\n\n return null;\n}\n\n/**\n * Default WebSocket factory.\n * Uses native `globalThis.WebSocket` (browser, Node 22+); falls back to the\n * `ws` npm package via dynamic import for Node < 22.\n * The dynamic import is intentionally NOT at the top level to avoid breaking\n * browser bundles that do not polyfill `ws`.\n */\nasync function defaultWsFactory(\n url: string,\n enableCompression: boolean\n): Promise<WebSocketLike> {\n if (typeof globalThis.WebSocket !== \"undefined\") {\n return new globalThis.WebSocket(url) as unknown as WebSocketLike;\n }\n // Node.js < 22: load `ws` lazily so browser bundles are never affected.\n const { WebSocket: NodeWebSocket } = await import(\"ws\");\n return new NodeWebSocket(url, {\n perMessageDeflate: enableCompression,\n }) as unknown as WebSocketLike;\n}\n","import type { AuthHandler } from \"../auth/auth-handler.js\";\nimport {\n AoudaAuthenticationError,\n AoudaConnectionError,\n} from \"../errors.js\";\nimport type { ClientMessage, ServerMessage } from \"./streaming-types.js\";\nimport type { StreamingTransport } from \"./streaming-transport.js\";\n\nconst INITIAL_BACKOFF_MS = 1_000;\nconst MAX_BACKOFF_MS = 30_000;\nconst JITTER_FACTOR = 0.2;\nconst DEFAULT_WAIT_MS = 25_000;\n\ninterface LongPollTransportOptions {\n authHandler: AuthHandler | null;\n waitMs?: number;\n onReconnected?: () => void;\n fetchImpl?: typeof fetch;\n}\n\ninterface ConnectResponse {\n sessionId: string;\n wireMode: string;\n}\n\ninterface PollResponse {\n messages: ServerMessage[];\n}\n\nexport class LongPollTransport implements StreamingTransport {\n private readonly _serverUrl: string;\n private readonly _database: string;\n private readonly _authHandler: AuthHandler | null;\n private readonly _onReconnected?: () => void;\n private readonly _waitMs: number;\n private readonly _fetch: typeof fetch;\n\n private _sessionId: string | null = null;\n private _handlers = new Map<string, (message: ServerMessage) => void>();\n private _reconnectHandlers = new Map<string, () => void>();\n private _disposed = false;\n private _connected = false;\n private _pollTask: Promise<void> | null = null;\n private _lastVersion = 0;\n\n constructor(\n serverUrl: string,\n database: string,\n options: LongPollTransportOptions\n ) {\n this._serverUrl = serverUrl;\n this._database = database;\n this._authHandler = options.authHandler;\n this._onReconnected = options.onReconnected;\n this._waitMs = Math.max(1, options.waitMs ?? DEFAULT_WAIT_MS);\n this._fetch = options.fetchImpl ?? fetch;\n }\n\n get lastVersion(): number {\n return this._lastVersion;\n }\n\n registerHandler(id: string, handler: (message: ServerMessage) => void): void {\n this._handlers.set(id, handler);\n }\n\n unregisterHandler(id: string): void {\n this._handlers.delete(id);\n }\n\n registerReconnectHandler(id: string, handler: () => void): void {\n this._reconnectHandlers.set(id, handler);\n }\n\n unregisterReconnectHandler(id: string): void {\n this._reconnectHandlers.delete(id);\n }\n\n async connect(): Promise<void> {\n if (this._disposed) {\n throw new AoudaConnectionError(\"LongPollTransport has been disposed\");\n }\n if (this._connected) {\n return;\n }\n\n await this._connectCore();\n this._connected = true;\n this._pollTask = this._runPollLoopWithReconnect();\n }\n\n async send(message: ClientMessage): Promise<void> {\n if (this._disposed) {\n throw new AoudaConnectionError(\"LongPollTransport has been disposed\");\n }\n if (!this._connected || this._sessionId === null) {\n throw new AoudaConnectionError(\"Long-poll session is not connected\");\n }\n\n await this._fetch(this._sendUrl(this._sessionId), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(message),\n }).then(async (res) => {\n if (!res.ok) {\n const text = await res.text();\n throw new AoudaConnectionError(\n `Long-poll send failed (${res.status}): ${text}`\n );\n }\n });\n }\n\n async dispose(): Promise<void> {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._connected = false;\n\n const sessionId = this._sessionId;\n this._sessionId = null;\n if (sessionId !== null) {\n try {\n await this._fetch(this._disconnectUrl(sessionId), { method: \"DELETE\" });\n } catch {\n // best effort\n }\n }\n\n try {\n await this._pollTask;\n } catch {\n // ignore\n }\n }\n\n private async _connectCore(): Promise<void> {\n const token = this._authHandler\n ? await this._authHandler.getAccessToken()\n : null;\n\n const res = await this._fetch(this._connectUrl(), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ token, wireMode: \"json\" }),\n });\n\n if (!res.ok) {\n const text = await res.text();\n if (res.status === 401) {\n throw new AoudaAuthenticationError(\n `Long-poll auth failed: ${text}`,\n \"AUTH_FAILED\",\n 401\n );\n }\n throw new AoudaConnectionError(\n `Long-poll connect failed (${res.status}): ${text}`\n );\n }\n\n const payload = (await res.json()) as ConnectResponse;\n if (!payload.sessionId) {\n throw new AoudaConnectionError(\"Long-poll connect response missing sessionId\");\n }\n\n this._sessionId = payload.sessionId;\n }\n\n private async _runPollLoopWithReconnect(): Promise<void> {\n while (!this._disposed && this._sessionId !== null) {\n try {\n while (!this._disposed && this._sessionId !== null) {\n await this._runPollLoopOnce();\n }\n } catch {\n // reconnect path\n }\n\n if (this._disposed) {\n return;\n }\n\n const ok = await this._reconnectWithBackoff();\n if (!ok) {\n return;\n }\n }\n }\n\n private async _runPollLoopOnce(): Promise<void> {\n if (this._sessionId === null) {\n return;\n }\n const res = await this._fetch(this._pollUrl(this._sessionId), {\n method: \"GET\",\n });\n if (!res.ok) {\n throw new AoudaConnectionError(`Long-poll failed (${res.status})`);\n }\n\n const payload = (await res.json()) as PollResponse;\n if (!Array.isArray(payload.messages)) {\n return;\n }\n\n for (const msg of payload.messages) {\n if (msg.type === \"heartbeat\") {\n this._lastVersion = msg.version;\n }\n\n const id = \"id\" in msg ? (msg as { id?: string }).id : undefined;\n if (id !== undefined && id !== null) {\n this._handlers.get(id)?.(msg);\n } else {\n this._handlers.get(\"__global__\")?.(msg);\n }\n }\n\n // Prevent tight-loop starvation when poll responses return immediately\n // (e.g. tests/mocks or aggressively configured servers).\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n\n private async _reconnectWithBackoff(): Promise<boolean> {\n let attempt = 0;\n while (!this._disposed) {\n const delay = computeBackoff(attempt);\n attempt++;\n await new Promise((resolve) => setTimeout(resolve, delay));\n if (this._disposed) {\n return false;\n }\n\n try {\n await this._connectCore();\n this._onReconnected?.();\n for (const handler of this._reconnectHandlers.values()) {\n try {\n handler();\n } catch {\n // isolate reconnect listeners\n }\n }\n return true;\n } catch (error) {\n if (error instanceof AoudaAuthenticationError) {\n return false;\n }\n }\n }\n\n return false;\n }\n\n private _baseUrl(): string {\n return this._serverUrl.replace(/\\/+$/, \"\");\n }\n\n private _rootUrl(): string {\n return `${this._baseUrl()}/api/databases/${encodeURIComponent(\n this._database\n )}/stream/longpoll`;\n }\n\n private _connectUrl(): string {\n return `${this._rootUrl()}/connect`;\n }\n\n private _sendUrl(sessionId: string): string {\n return `${this._rootUrl()}/${encodeURIComponent(sessionId)}/send`;\n }\n\n private _pollUrl(sessionId: string): string {\n return `${this._rootUrl()}/${encodeURIComponent(\n sessionId\n )}/poll?wait_ms=${this._waitMs}`;\n }\n\n private _disconnectUrl(sessionId: string): string {\n return `${this._rootUrl()}/${encodeURIComponent(sessionId)}`;\n }\n}\n\nfunction computeBackoff(attempt: number): number {\n const base = Math.min(INITIAL_BACKOFF_MS * Math.pow(2, attempt), MAX_BACKOFF_MS);\n const jitter = base * JITTER_FACTOR * (Math.random() * 2 - 1);\n return Math.max(1, Math.round(base + jitter));\n}\n","import { AoudaAuthenticationError } from \"../errors.js\";\nimport type { ClientMessage, ServerMessage } from \"./streaming-types.js\";\nimport type { StreamingTransport } from \"./streaming-transport.js\";\n\nexport class FallbackStreamingTransport implements StreamingTransport {\n private _active: StreamingTransport;\n private readonly _primary: StreamingTransport;\n private readonly _createFallback: () => StreamingTransport;\n private _fallback: StreamingTransport | null = null;\n private _handlers = new Map<string, (message: ServerMessage) => void>();\n private _reconnectHandlers = new Map<string, () => void>();\n\n constructor(primary: StreamingTransport, createFallback: () => StreamingTransport) {\n this._primary = primary;\n this._active = primary;\n this._createFallback = createFallback;\n }\n\n get lastVersion(): number {\n return this._active.lastVersion;\n }\n\n registerHandler(id: string, handler: (message: ServerMessage) => void): void {\n this._handlers.set(id, handler);\n this._active.registerHandler(id, handler);\n }\n\n unregisterHandler(id: string): void {\n this._handlers.delete(id);\n this._active.unregisterHandler(id);\n }\n\n registerReconnectHandler(id: string, handler: () => void): void {\n this._reconnectHandlers.set(id, handler);\n this._active.registerReconnectHandler(id, handler);\n }\n\n unregisterReconnectHandler(id: string): void {\n this._reconnectHandlers.delete(id);\n this._active.unregisterReconnectHandler(id);\n }\n\n async connect(): Promise<void> {\n try {\n await this._active.connect();\n return;\n } catch (error) {\n if (error instanceof AoudaAuthenticationError) {\n throw error;\n }\n if (this._active !== this._primary) {\n throw error;\n }\n }\n\n if (this._fallback === null) {\n this._fallback = this._createFallback();\n }\n this._active = this._fallback;\n for (const [id, handler] of this._handlers) {\n this._active.registerHandler(id, handler);\n }\n for (const [id, handler] of this._reconnectHandlers) {\n this._active.registerReconnectHandler(id, handler);\n }\n await this._active.connect();\n }\n\n async send(message: ClientMessage): Promise<void> {\n await this._active.send(message);\n }\n\n async dispose(): Promise<void> {\n await this._active.dispose();\n if (this._fallback !== null && this._fallback !== this._active) {\n await this._fallback.dispose();\n }\n if (this._primary !== this._active) {\n await this._primary.dispose();\n }\n }\n}\n","/**\n * @aouda/client — AoudaClient implementation.\n */\n\nimport type {\n AoudaClientOptions,\n HealthStatus,\n SchemaLike,\n DefaultSchema,\n BulkLoadOptions,\n BulkLoadJobHandle,\n BulkLoadListResponse,\n BulkLoadForceAbortResponse,\n} from \"./types.js\";\nimport { RetryPolicy, CircuitBreakerPolicy } from \"./types.js\";\nimport { BulkLoadCoordinator } from \"./bulkLoad.js\";\nimport { AoudaConnectionError } from \"./errors.js\";\nimport { HttpTransport } from \"./transport.js\";\nimport { ResilientTransport } from \"./resilience/resilient-transport.js\";\nimport { TableQuery } from \"./query-builder.js\";\nimport { TablesApi } from \"./tables.js\";\nimport { DatabasesApi } from \"./databases.js\";\nimport { SchemaApi } from \"./schema/api.js\";\nimport { BranchesApi } from \"./schema/branches.js\";\nimport { AdminApi } from \"./admin/index.js\";\nimport { MaterializedQueriesApi } from \"./materialized.js\";\nimport { AuthHandler, AuthTransport, AuthClient } from \"./auth/index.js\";\nimport type { AuthConfig } from \"./auth/index.js\";\nimport { WebSocketTransport } from \"./streaming/websocket-transport.js\";\nimport { LongPollTransport } from \"./streaming/longpoll-transport.js\";\nimport { FallbackStreamingTransport } from \"./streaming/fallback-streaming-transport.js\";\nimport type { StreamingTransport } from \"./streaming/streaming-transport.js\";\n\n/** Default request timeout in milliseconds. */\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n/**\n * Raw health response from the server.\n * Internal type matching the wire protocol.\n */\ninterface HealthResponse {\n status: string;\n}\n\n/**\n * Normalizes a base URL by removing trailing slashes.\n * @param url - The URL to normalize.\n * @returns The normalized URL without trailing slashes.\n */\nfunction normalizeBaseUrl(url: string): string {\n return url.replace(/\\/+$/, \"\");\n}\n\n/**\n * Validates that a value is a non-empty string.\n * @param value - The value to check.\n * @param name - The name of the parameter for error messages.\n * @throws Error if the value is empty or not a string.\n */\nfunction validateNonEmptyString(value: unknown, name: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string`);\n }\n}\n\n/**\n * Official TypeScript client for Aouda.\n *\n * When a schema type `S` is supplied (e.g. from the Type Generation CLI),\n * use `AoudaClient<S>` or `createAoudaClient<S>(options)` for table and\n * column name autocomplete and inferred result row types.\n *\n * Basic usage:\n * ```typescript\n * const client = new AoudaClient({ serverUrl: \"http://localhost:8080\", database: \"mydb\" });\n * await client.connect();\n * const health = await client.health();\n * console.log(health.isHealthy);\n * await client.disconnect();\n * ```\n *\n * @typeParam S - Schema type with `tables` mapping table names to row types. Defaults to untyped (any table name, Record<string, unknown> rows).\n */\nexport class AoudaClient<S extends SchemaLike = DefaultSchema> {\n private readonly transport: ResilientTransport;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly database: string;\n private connected: boolean = false;\n private readonly _tables: TablesApi;\n private readonly _databases: DatabasesApi;\n private readonly _schema: SchemaApi;\n private readonly _branches: BranchesApi;\n private readonly _admin: AdminApi;\n private readonly _materializedQueries: MaterializedQueriesApi;\n private readonly _auth: AuthClient | null;\n private readonly _authHandler: AuthHandler | null;\n private readonly _streamingEnableCompression: boolean;\n private readonly _streamingWireMode: \"json\" | \"msgpack\";\n private readonly _streamingEnableLongPollFallback: boolean;\n private readonly _streamingLongPollWaitMs: number;\n private _wsTransport: StreamingTransport | null = null;\n\n /**\n * Creates a new AoudaClient instance.\n *\n * @param options - Client configuration options.\n * @throws Error if serverUrl or database is empty or invalid.\n */\n constructor(options: AoudaClientOptions) {\n validateNonEmptyString(options.serverUrl, \"serverUrl\");\n validateNonEmptyString(options.database, \"database\");\n\n this.baseUrl = normalizeBaseUrl(options.serverUrl);\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n this.database = options.database.trim();\n\n if (!Number.isFinite(this.timeout) || this.timeout <= 0) {\n throw new Error(\"timeout must be a finite positive number\");\n }\n\n this._streamingEnableCompression =\n options.streaming?.enableCompression ?? true;\n this._streamingWireMode = options.streaming?.wireMode ?? \"json\";\n this._streamingEnableLongPollFallback =\n options.streaming?.enableLongPollFallback ?? true;\n this._streamingLongPollWaitMs = options.streaming?.longPollWaitMs ?? 25_000;\n\n // Validate auth options\n if (options.serverAuth && options.appAuth) {\n throw new Error(\"Specify either serverAuth or appAuth, not both\");\n }\n\n if (options.serverAuth) {\n const sa = options.serverAuth;\n const hasApiKey = typeof sa.apiKey === \"string\" && sa.apiKey.length > 0;\n const hasToken = !!sa.token;\n if (hasApiKey && hasToken) {\n throw new Error(\"Specify either apiKey or token, not both\");\n }\n if (sa.refreshToken && !sa.token) {\n throw new Error(\"refreshToken requires token\");\n }\n }\n\n if (options.appAuth) {\n const aa = options.appAuth;\n const hasApiKey = typeof aa.apiKey === \"string\" && aa.apiKey.length > 0;\n const hasToken = !!aa.token;\n if (hasApiKey && hasToken) {\n throw new Error(\"Specify either apiKey or token, not both\");\n }\n if (aa.refreshToken && !aa.token) {\n throw new Error(\"refreshToken requires token\");\n }\n }\n\n const httpTransport = new HttpTransport({\n baseUrl: this.baseUrl,\n timeout: this.timeout,\n });\n\n // Pipeline: ResilientTransport → [AuthTransport →] HttpTransport\n const activeAuth = options.serverAuth ?? options.appAuth;\n if (activeAuth) {\n let authConfig: AuthConfig;\n if (options.serverAuth) {\n authConfig = {\n basePath: \"/api/auth\",\n apiKey: options.serverAuth.apiKey,\n token: options.serverAuth.token,\n refreshToken: options.serverAuth.refreshToken,\n userToken: options.serverAuth.userToken,\n refreshThresholdMs: options.serverAuth.refreshThresholdMs,\n };\n } else {\n authConfig = {\n basePath: `/api/databases/${encodeURIComponent(this.database)}/auth`,\n apiKey: options.appAuth!.apiKey,\n token: options.appAuth!.token,\n refreshToken: options.appAuth!.refreshToken,\n userToken: options.appAuth!.userToken,\n authDatabase: options.appAuth!.authDatabase,\n refreshThresholdMs: options.appAuth!.refreshThresholdMs,\n };\n }\n const authHandler = new AuthHandler(authConfig, this.baseUrl, this.timeout);\n const authTransport = new AuthTransport(httpTransport, authHandler);\n this.transport = new ResilientTransport(\n authTransport,\n options.retryPolicy ?? RetryPolicy.None,\n options.circuitBreakerPolicy ?? CircuitBreakerPolicy.Disabled\n );\n this._auth = new AuthClient(authHandler);\n this._authHandler = authHandler;\n } else {\n this.transport = new ResilientTransport(\n httpTransport,\n options.retryPolicy ?? RetryPolicy.None,\n options.circuitBreakerPolicy ?? CircuitBreakerPolicy.Disabled\n );\n this._auth = null;\n this._authHandler = null;\n }\n\n this._tables = new TablesApi(this.transport, this.database);\n this._databases = new DatabasesApi(this.transport);\n this._schema = new SchemaApi(this.transport, this.database);\n this._branches = new BranchesApi(this.transport, this.database);\n this._admin = new AdminApi(this.transport);\n this._materializedQueries = new MaterializedQueriesApi(\n this.transport,\n this.database\n );\n }\n\n /**\n * Connects to the Aouda server.\n *\n * This method validates the configuration and optionally verifies\n * connectivity by calling the health endpoint. For HTTP clients,\n * no persistent connection is maintained; this method ensures\n * the client is in a valid state and the server is reachable.\n *\n * @throws AoudaConnectionError if the server is unreachable.\n * @throws AoudaTimeoutError if the health check times out.\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n this.transport.reset();\n const healthStatus = await this.health();\n if (!healthStatus.isHealthy) {\n throw new AoudaConnectionError(\n `Server is not healthy: status=\"${healthStatus.status}\"`\n );\n }\n this.connected = true;\n }\n\n /**\n * Disconnects from the Aouda server.\n *\n * This method releases any resources held by the client.\n * For HTTP clients, this aborts any pending requests and\n * resets internal state. This method is idempotent and\n * safe to call multiple times.\n */\n async disconnect(): Promise<void> {\n this.transport.abort();\n this.connected = false;\n if (this._wsTransport !== null) {\n await this._wsTransport.dispose();\n this._wsTransport = null;\n }\n }\n\n /**\n * Checks the health of the Aouda server.\n *\n * Performs a GET request to the /health endpoint and returns\n * the health status. The request respects the configured timeout\n * and will be aborted if disconnect() is called.\n *\n * @returns The health status of the server.\n * @throws AoudaConnectionError if the server is unreachable or client is disconnected.\n * @throws AoudaTimeoutError if the request times out.\n * @throws AoudaResponseError if the server returns a non-2xx status.\n */\n async health(): Promise<HealthStatus> {\n const response = await this.transport.get<HealthResponse>(\"/health\");\n return {\n status: response.status,\n isHealthy: response.status.toLowerCase() === \"healthy\",\n };\n }\n\n /**\n * Creates a query builder for the specified table.\n *\n * This is the primary entry point for querying data from Aouda.\n * Returns a fluent query builder that can be chained with\n * `where()`, `orderBy()`, `limit()`, etc.\n *\n * When the client is typed with a schema (e.g. createAoudaClient<Schema>(options)),\n * `name` is constrained to keys of `S['tables']` and the returned query is typed\n * with the corresponding row type.\n *\n * @param name - The name of the table to query.\n * @returns A new TableQuery instance for building the query.\n * @throws Error if the table name is empty or whitespace-only.\n *\n * @example\n * ```typescript\n * const results = await client.table('orders')\n * .where('status', '=', 'active')\n * .orderBy('price', 'desc')\n * .limit(50)\n * .execute();\n * ```\n */\n table<N extends keyof S[\"tables\"]>(name: N): TableQuery<S[\"tables\"][N]> {\n validateNonEmptyString(name as string, \"Table name\");\n return new TableQuery<S[\"tables\"][N]>(\n this.transport,\n name as string,\n this.database,\n undefined,\n () => this._getOrCreateWebSocketTransport()\n );\n }\n\n /**\n * Access table listing and schema operations.\n * @returns The tables API.\n */\n get tables(): TablesApi {\n return this._tables;\n }\n\n /**\n * Access server-level database operations (list, create, get, drop).\n * @returns The databases API.\n */\n get databases(): DatabasesApi {\n return this._databases;\n }\n\n /**\n * Access schema management operations (diff, apply, export, history).\n * @returns The schema API.\n */\n get schema(): SchemaApi {\n return this._schema;\n }\n\n /**\n * Access branch operations (list, create, get, diff, merge, delete).\n * @returns The branches API.\n */\n get branches(): BranchesApi {\n return this._branches;\n }\n\n /**\n * Access admin operations (server info, memory, metrics, health).\n * @returns The admin API.\n */\n get admin(): AdminApi {\n return this._admin;\n }\n\n /**\n * Materialized query lifecycle (list, create, drop, status, query).\n */\n get materializedQueries(): MaterializedQueriesApi {\n return this._materializedQueries;\n }\n\n /**\n * Access auth operations (signUp, signIn, signOut, refresh, me, changePassword).\n * @returns The auth API.\n * @throws Error if auth is not configured on this client.\n */\n get auth(): AuthClient {\n if (this._auth == null) {\n throw new Error(\n \"Auth is not configured. Provide serverAuth or appAuth in AoudaClientOptions.\"\n );\n }\n return this._auth;\n }\n\n /**\n * Returns whether the client is currently connected.\n */\n get isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Returns the configured server URL (normalized).\n */\n get serverUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Returns the configured timeout in milliseconds.\n */\n get timeoutMs(): number {\n return this.timeout;\n }\n\n /**\n * Returns the configured database name.\n */\n get databaseName(): string {\n return this.database;\n }\n\n /**\n * Resets the circuit breaker to closed state.\n * Call after manual recovery or when the server is known to be healthy again.\n */\n resetCircuitBreaker(): void {\n this.transport.resetCircuitBreaker();\n }\n\n /**\n * Bulk-load rows into a single table.\n *\n * Executes the full `:begin` → `:append × N` → `:commit` sequence, handling\n * batching and resume-on-reconnect automatically.\n *\n * @param tableName - Target table.\n * @param rows - Synchronous or asynchronous iterable of row objects.\n * @param options - Optional bulk-load tuning options.\n * @returns A handle describing the committed job and providing deferred-work polling.\n *\n * @example\n * ```typescript\n * const handle = await client.bulkLoad('products', rows, { writeConcern: 'majority' });\n * console.log(`Loaded ${handle.rowsLoaded} rows, job ${handle.jobId}`);\n * ```\n */\n bulkLoad<T extends Record<string, unknown>>(\n tableName: string,\n rows: Iterable<T> | AsyncIterable<T>,\n options?: BulkLoadOptions\n ): Promise<BulkLoadJobHandle> {\n validateNonEmptyString(tableName, \"tableName\");\n return new BulkLoadCoordinator(this.transport, this.database).run(\n [tableName],\n rows,\n options\n );\n }\n\n /**\n * Bulk-load rows into multiple tables atomically.\n *\n * Each row must include a `_table` discriminator field that matches one of\n * the supplied table names.\n *\n * @param tables - Target table names.\n * @param rows - Synchronous or asynchronous iterable of row objects.\n * @param options - Optional bulk-load tuning options.\n * @returns A handle describing the committed job.\n */\n bulkLoadMultiTable<T extends Record<string, unknown>>(\n tables: readonly string[],\n rows: Iterable<T> | AsyncIterable<T>,\n options?: BulkLoadOptions\n ): Promise<BulkLoadJobHandle> {\n if (!tables || tables.length === 0) {\n throw new Error(\"At least one table must be specified.\");\n }\n return new BulkLoadCoordinator(this.transport, this.database).run(\n tables,\n rows,\n options\n );\n }\n\n /**\n * List all bulk-load sessions registered for a database.\n * Admin use: returns both active and recently-completed jobs from the in-memory registry.\n */\n bulkLoadList(db: string): Promise<BulkLoadListResponse> {\n return this.transport.bulkLoadList(db);\n }\n\n /**\n * Force-abort a stuck bulk-load job by emitting a BulkLoadAborted WAL frame.\n * Requires BulkLoad + write permission. Use only when the job is in a terminal-wait\n * state past its bulkLoadResumeWindow.\n */\n bulkLoadForceAbort(\n db: string,\n jobId: string,\n reason: string\n ): Promise<BulkLoadForceAbortResponse> {\n return this.transport.bulkLoadForceAbort(db, jobId, reason);\n }\n\n /**\n * Returns the shared WebSocketTransport for this client, creating it lazily\n * on the first call. Used internally by streaming operations (S13+).\n *\n * @internal\n */\n _getOrCreateWebSocketTransport(): StreamingTransport {\n if (this._wsTransport === null) {\n const primary = new WebSocketTransport(this.baseUrl, this.database, {\n authHandler: this._authHandler,\n enableCompression: this._streamingEnableCompression,\n wireMode: this._streamingWireMode,\n });\n\n if (this._streamingEnableLongPollFallback) {\n this._wsTransport = new FallbackStreamingTransport(primary, () => {\n return new LongPollTransport(this.baseUrl, this.database, {\n authHandler: this._authHandler,\n waitMs: this._streamingLongPollWaitMs,\n });\n });\n } else {\n this._wsTransport = primary;\n }\n }\n return this._wsTransport;\n }\n}\n\n/**\n * Factory function to create a new AoudaClient instance.\n *\n * When a schema type `S` is provided, the returned client's `table()` method\n * accepts only table names from `S['tables']` and returns typed TableQuery.\n * Without a type argument, behavior is unchanged (any string table name,\n * rows as Record<string, unknown>).\n *\n * @param options - Client configuration options.\n * @returns A new AoudaClient instance.\n *\n * @example\n * ```typescript\n * const client = createAoudaClient({ serverUrl: \"http://localhost:8080\", database: \"mydb\" });\n * ```\n *\n * @example\n * ```typescript\n * const client = createAoudaClient<Schema>({ serverUrl: \"http://localhost:8080\", database: \"mydb\" });\n * const q = client.table('orders'); // TableQuery<Order>\n * ```\n */\nexport function createAoudaClient<S extends SchemaLike = DefaultSchema>(\n options: AoudaClientOptions\n): AoudaClient<S> {\n return new AoudaClient<S>(options);\n}\n","import type { DefaultSchema, SchemaLike } from \"../types.js\";\nimport type { AoudaClient } from \"../client.js\";\nimport type { HealthStatus } from \"../types.js\";\nimport type {\n JoinClusterRequest,\n JoinClusterResponse,\n LeaveClusterResponse,\n PromoteClusterResponse,\n FailoverClusterResponse,\n DrainClusterResponse,\n ClusterConfigResponse,\n ClusterConfigPatchRequest,\n TriggerBackupRequest,\n TriggerBackupResponse,\n ListBackupsResponse,\n RestoreBackupResponse,\n BackupSchedule,\n ReplicationStatusResponse,\n TopologyResponse,\n CoverageResponse,\n ReadinessResponse,\n DetailedHealthResponse,\n NodeInfoResponse,\n} from \"../admin/index.js\";\n\nexport interface McpToolSchema {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n}\n\nexport interface McpToolDefinition<TInput, TOutput> {\n name: string;\n description: string;\n inputSchema: McpToolSchema;\n execute: (input: TInput) => Promise<TOutput>;\n}\n\nexport interface ClusterStatusToolInput {\n includeCoverage?: boolean;\n}\n\nexport interface ClusterStatusToolOutput {\n replicationStatus: ReplicationStatusResponse;\n topology: TopologyResponse;\n coverage?: CoverageResponse;\n}\n\nexport interface ClusterHealthToolInput {\n includeDetailed?: boolean;\n includeNodeInfo?: boolean;\n}\n\nexport interface ClusterHealthToolOutput {\n health: HealthStatus;\n readiness: ReadinessResponse;\n replicationStatus: ReplicationStatusResponse;\n detailed?: DetailedHealthResponse;\n node?: NodeInfoResponse;\n}\n\nexport type BackupTriggerToolInput = TriggerBackupRequest;\n\nexport interface BackupRestoreToolInput {\n backupId: string;\n}\n\nexport type BackupSetScheduleToolInput = BackupSchedule;\n\nexport interface ClusterDrainToolInput {\n nodeAddress: string;\n}\n\nexport type ClusterPatchConfigToolInput = ClusterConfigPatchRequest;\n\nexport class AoudaClusterMcpTools<S extends SchemaLike = DefaultSchema> {\n private readonly client: AoudaClient<S>;\n\n constructor(client: AoudaClient<S>) {\n this.client = client;\n }\n\n async clusterStatus(\n input: ClusterStatusToolInput = {}\n ): Promise<ClusterStatusToolOutput> {\n const status = await this.client.admin.replication.status();\n const topology = await this.client.admin.replication.topology();\n\n if (input.includeCoverage === true) {\n const coverage = await this.client.admin.replication.coverage();\n return {\n replicationStatus: status,\n topology,\n coverage,\n };\n }\n\n return {\n replicationStatus: status,\n topology,\n };\n }\n\n async clusterHealth(\n input: ClusterHealthToolInput = {}\n ): Promise<ClusterHealthToolOutput> {\n const health = await this.client.admin.health.check();\n const readiness = await this.client.admin.health.ready();\n const replicationStatus = await this.client.admin.replication.status();\n\n const result: ClusterHealthToolOutput = {\n health,\n readiness,\n replicationStatus,\n };\n\n if (input.includeDetailed === true) {\n result.detailed = await this.client.admin.health.detailed();\n }\n\n if (input.includeNodeInfo === true) {\n result.node = await this.client.admin.node.get();\n }\n\n return result;\n }\n\n async backupTrigger(\n input: BackupTriggerToolInput = {}\n ): Promise<TriggerBackupResponse> {\n return this.client.admin.backup.trigger(input);\n }\n\n async backupList(): Promise<ListBackupsResponse> {\n return this.client.admin.backup.list();\n }\n\n async backupRestore(input: BackupRestoreToolInput): Promise<RestoreBackupResponse> {\n return this.client.admin.backup.restore(input.backupId);\n }\n\n async backupGetSchedule(): Promise<BackupSchedule> {\n return this.client.admin.backup.getSchedule();\n }\n\n async backupSetSchedule(\n input: BackupSetScheduleToolInput\n ): Promise<BackupSchedule> {\n return this.client.admin.backup.setSchedule(input);\n }\n\n async clusterJoin(input: JoinClusterRequest): Promise<JoinClusterResponse> {\n return this.client.admin.cluster.join(input);\n }\n\n async clusterLeave(): Promise<LeaveClusterResponse> {\n return this.client.admin.cluster.leave();\n }\n\n async clusterPromote(): Promise<PromoteClusterResponse> {\n return this.client.admin.cluster.promote();\n }\n\n async clusterFailover(): Promise<FailoverClusterResponse> {\n return this.client.admin.cluster.failover();\n }\n\n async clusterDrain(input: ClusterDrainToolInput): Promise<DrainClusterResponse> {\n return this.client.admin.cluster.drain(input.nodeAddress);\n }\n\n async clusterGetConfig(): Promise<ClusterConfigResponse> {\n return this.client.admin.cluster.getConfig();\n }\n\n async clusterPatchConfig(\n input: ClusterPatchConfigToolInput\n ): Promise<ClusterConfigResponse> {\n return this.client.admin.cluster.patchConfig(input);\n }\n}\n\nexport interface AoudaClusterMcpToolSet {\n aouda_cluster_status: McpToolDefinition<\n ClusterStatusToolInput,\n ClusterStatusToolOutput\n >;\n aouda_cluster_health: McpToolDefinition<\n ClusterHealthToolInput,\n ClusterHealthToolOutput\n >;\n aouda_backup_trigger: McpToolDefinition<\n BackupTriggerToolInput,\n TriggerBackupResponse\n >;\n aouda_backup_list: McpToolDefinition<Record<string, never>, ListBackupsResponse>;\n aouda_backup_restore: McpToolDefinition<\n BackupRestoreToolInput,\n RestoreBackupResponse\n >;\n aouda_backup_get_schedule: McpToolDefinition<\n Record<string, never>,\n BackupSchedule\n >;\n aouda_backup_set_schedule: McpToolDefinition<\n BackupSetScheduleToolInput,\n BackupSchedule\n >;\n aouda_cluster_join: McpToolDefinition<JoinClusterRequest, JoinClusterResponse>;\n aouda_cluster_leave: McpToolDefinition<\n Record<string, never>,\n LeaveClusterResponse\n >;\n aouda_cluster_promote: McpToolDefinition<\n Record<string, never>,\n PromoteClusterResponse\n >;\n aouda_cluster_failover: McpToolDefinition<\n Record<string, never>,\n FailoverClusterResponse\n >;\n aouda_cluster_drain: McpToolDefinition<\n ClusterDrainToolInput,\n DrainClusterResponse\n >;\n aouda_cluster_get_config: McpToolDefinition<\n Record<string, never>,\n ClusterConfigResponse\n >;\n aouda_cluster_patch_config: McpToolDefinition<\n ClusterPatchConfigToolInput,\n ClusterConfigResponse\n >;\n}\n\nexport function createAoudaClusterMcpToolSet<S extends SchemaLike = DefaultSchema>(\n client: AoudaClient<S>\n): AoudaClusterMcpToolSet {\n const api = new AoudaClusterMcpTools(client);\n\n return {\n aouda_cluster_status: {\n name: \"aouda_cluster_status\",\n description: \"Get replication status, topology, and optional coverage.\",\n inputSchema: {\n type: \"object\",\n properties: {\n includeCoverage: { type: \"boolean\", default: false },\n },\n additionalProperties: false,\n },\n execute: (input: ClusterStatusToolInput) => api.clusterStatus(input ?? {}),\n },\n aouda_cluster_health: {\n name: \"aouda_cluster_health\",\n description: \"Get health, readiness, replication health, and optional detail.\",\n inputSchema: {\n type: \"object\",\n properties: {\n includeDetailed: { type: \"boolean\", default: false },\n includeNodeInfo: { type: \"boolean\", default: false },\n },\n additionalProperties: false,\n },\n execute: (input: ClusterHealthToolInput) => api.clusterHealth(input ?? {}),\n },\n aouda_backup_trigger: {\n name: \"aouda_backup_trigger\",\n description: \"Trigger an immediate backup.\",\n inputSchema: {\n type: \"object\",\n properties: {\n destination: { type: [\"string\", \"null\"] },\n incremental: { type: \"boolean\", default: true },\n baseBackupId: { type: [\"string\", \"null\"] },\n },\n additionalProperties: false,\n },\n execute: (input: BackupTriggerToolInput) => api.backupTrigger(input ?? {}),\n },\n aouda_backup_list: {\n name: \"aouda_backup_list\",\n description: \"List existing backups.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n execute: () => api.backupList(),\n },\n aouda_backup_restore: {\n name: \"aouda_backup_restore\",\n description: \"Restore a backup by backup id.\",\n inputSchema: {\n type: \"object\",\n properties: {\n backupId: { type: \"string\" },\n },\n required: [\"backupId\"],\n additionalProperties: false,\n },\n execute: (input: BackupRestoreToolInput) => api.backupRestore(input),\n },\n aouda_backup_get_schedule: {\n name: \"aouda_backup_get_schedule\",\n description: \"Get backup schedule configuration.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n execute: () => api.backupGetSchedule(),\n },\n aouda_backup_set_schedule: {\n name: \"aouda_backup_set_schedule\",\n description: \"Update backup schedule configuration.\",\n inputSchema: {\n type: \"object\",\n properties: {\n cronExpression: { type: [\"string\", \"null\"] },\n destination: { type: [\"string\", \"null\"] },\n incremental: { type: \"boolean\" },\n },\n required: [\"incremental\"],\n additionalProperties: false,\n },\n execute: (input: BackupSetScheduleToolInput) => api.backupSetSchedule(input),\n },\n aouda_cluster_join: {\n name: \"aouda_cluster_join\",\n description: \"Join this node to a replica set.\",\n inputSchema: {\n type: \"object\",\n properties: {\n replicaSetName: { type: \"string\" },\n primaryAddress: { type: \"string\" },\n thisNodeAddress: { type: \"string\" },\n role: { enum: [\"secondary\", \"witness\"] },\n },\n required: [\"replicaSetName\", \"primaryAddress\", \"thisNodeAddress\"],\n additionalProperties: false,\n },\n execute: (input: JoinClusterRequest) => api.clusterJoin(input),\n },\n aouda_cluster_leave: {\n name: \"aouda_cluster_leave\",\n description: \"Leave cluster and return to standalone mode.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n execute: () => api.clusterLeave(),\n },\n aouda_cluster_promote: {\n name: \"aouda_cluster_promote\",\n description: \"Trigger election to promote this node.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n execute: () => api.clusterPromote(),\n },\n aouda_cluster_failover: {\n name: \"aouda_cluster_failover\",\n description: \"Trigger failover by stepping down current primary.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n execute: () => api.clusterFailover(),\n },\n aouda_cluster_drain: {\n name: \"aouda_cluster_drain\",\n description: \"Drain a node for maintenance.\",\n inputSchema: {\n type: \"object\",\n properties: {\n nodeAddress: { type: \"string\" },\n },\n required: [\"nodeAddress\"],\n additionalProperties: false,\n },\n execute: (input: ClusterDrainToolInput) => api.clusterDrain(input),\n },\n aouda_cluster_get_config: {\n name: \"aouda_cluster_get_config\",\n description: \"Get mutable cluster config.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n execute: () => api.clusterGetConfig(),\n },\n aouda_cluster_patch_config: {\n name: \"aouda_cluster_patch_config\",\n description: \"Patch mutable cluster config values.\",\n inputSchema: {\n type: \"object\",\n properties: {\n heartbeatIntervalMs: { type: \"number\" },\n electionTimeoutMs: { type: \"number\" },\n },\n additionalProperties: false,\n },\n execute: (input: ClusterPatchConfigToolInput) => api.clusterPatchConfig(input),\n },\n };\n}\n","/**\n * @aouda/client — Official TypeScript/JavaScript client for Aouda.\n *\n * @example\n * ```typescript\n * import { AoudaClient } from \"@aouda/client\";\n *\n * const client = new AoudaClient({ serverUrl: \"http://localhost:8080\", database: \"mydb\" });\n * await client.connect();\n * const health = await client.health();\n * console.log(health.isHealthy); // true\n * await client.disconnect();\n * ```\n */\n\n// Version\nexport const version = \"0.0.1\";\n\n// Types (RetryPolicy and CircuitBreakerPolicy exported as value + type from types.js)\nexport type {\n AoudaClientOptions,\n HealthStatus,\n QueryResult,\n QueryStats,\n ColumnarResponse,\n WhereOperator,\n SortDirection,\n InsertResult,\n MutationResult,\n BatchMutationResult,\n UpdateOptions,\n DeleteOptions,\n TableSummary,\n TableSchema,\n ColumnSchema,\n TablePolicy,\n ResidencyConfig,\n ReferenceInfo,\n TableSchemaResponse,\n IndexInfo,\n RelationshipInfo,\n RelationshipEndpoint,\n SchemaRelationshipsResponse,\n TableSummaryForErd,\n ColumnSummaryForErd,\n TypeGenerationOptions,\n SchemaLike,\n DefaultSchema,\n TableNameFromSchema,\n DatabaseInfo,\n DatabaseOptionsInfo,\n CreateDatabaseOptions,\n AoudaDataType,\n CreateColumnRequest,\n CreateTableRequest,\n RenameTableRequest,\n AddColumnRequest,\n RenameColumnRequest,\n UpdateTablePolicyRequest,\n BulkLoadOptions,\n BulkLoadJobHandle,\n BulkLoadProgress,\n BulkLoadReplicaProgress,\n BulkLoadStatusResponse,\n BulkLoadReplicaProgressDto,\n BulkLoadListResponse,\n BulkLoadForceAbortRequest,\n BulkLoadForceAbortResponse,\n ComputedColumnDef,\n} from \"./types.js\";\nexport { RetryPolicy, CircuitBreakerPolicy, AOUDA_DATA_TYPES } from \"./types.js\";\n\n// Admin API types\nexport type {\n ServiceInfo,\n ServerMemoryResponse,\n ServerMetricsResponse,\n SingleDatabaseMetricsResponse,\n DatabaseMemoryUsage,\n DatabaseMetricsDto,\n ReadinessResponse,\n DetailedHealthResponse,\n ComponentHealthEntry,\n MetricsSnapshot,\n MetricsSummary,\n MetricsHistory,\n MetricsHistoryOptions,\n LatencyPercentiles,\n QueryMetrics,\n StorageMetrics,\n ReplicationMetrics,\n BackupMetrics,\n PartitioningMetrics,\n TimeSeriesMetrics,\n MaterializedQueryMetrics,\n BloomFilterMetrics,\n TransactionMetrics,\n MemoryMetrics,\n IoMetrics,\n SimdMetrics,\n PageCacheMetrics,\n DatabaseMemoryMetrics,\n PerDatabaseMetrics,\n ReplicationStatusResponse,\n PerDatabaseLagEntry,\n TopologyResponse,\n MemberInfo,\n PerDatabaseStatusEntry,\n SubscriptionInfo,\n CoverageResponse,\n DatabaseCoverageEntry,\n TableCoverageEntry,\n JoinClusterRequest,\n JoinClusterResponse,\n LeaveClusterResponse,\n PromoteClusterResponse,\n FailoverClusterResponse,\n DrainClusterResponse,\n ClusterMemberEntry,\n ClusterThisNodeEntry,\n ClusterConfigResponse,\n ClusterConfigPatchRequest,\n TriggerBackupRequest,\n TriggerBackupResponse,\n BackupSummary,\n ListBackupsResponse,\n RestoreBackupResponse,\n BackupSchedule,\n AdminMemoryConfig,\n AdminBackupConfig,\n AdminLoggingConfig,\n AdminConfigResponse,\n AdminConfigSchemaResponse,\n AdminMemoryPatch,\n AdminBackupPatch,\n AdminLoggingPatch,\n AdminConfigPatchRequest,\n NodeInfoResponse,\n NodeLogLevel,\n NodeLogEntry,\n NodeLogsResponse,\n NodeLogsQuery,\n NodeLogStreamOptions,\n} from \"./admin/index.js\";\n\n// Errors\nexport {\n AoudaError,\n AoudaConnectionError,\n AoudaTimeoutError,\n AoudaResponseError,\n AoudaApiError,\n AoudaNotFoundError,\n AoudaConflictError,\n AoudaValidationError,\n AoudaServerError,\n AoudaCircuitBreakerOpenError,\n AoudaAuthenticationError,\n} from \"./errors.js\";\n\n// Auth\nexport type {\n ServerAuthOptions,\n AppAuthOptions,\n AuthResult,\n AuthUserInfo,\n UserProfile,\n AuthorizationMode,\n CreatePartitionGrantRequest,\n PartitionGrant,\n PartitionGrantsListResponse,\n RlsResolverRuleInput,\n CreateRlsResolverRequest,\n UpdateRlsResolverRequest,\n RlsResolverRule,\n RlsResolver,\n RlsResolversListResponse,\n} from \"./auth/index.js\";\nexport { AuthClient } from \"./auth/index.js\";\n\n// Client\nexport { AoudaClient, createAoudaClient } from \"./client.js\";\n\n// Bulk-load coordinator (advanced use)\nexport { BulkLoadCoordinator } from \"./bulkLoad.js\";\n\n// Query Builder\nexport { TableQuery, WhereGroupBuilder, coerceColumnarValue } from \"./query-builder.js\";\nexport type { BatchOperationInput } from \"./query-builder.js\";\nexport type {\n Subscription,\n SubscriptionEvent,\n SubscriptionSnapshotEvent,\n SubscriptionChangeEvent,\n SubscribeOptions,\n} from \"./streaming/subscription.js\";\nexport type {\n WriteStream,\n OpenWriteStreamOptions,\n} from \"./streaming/write-stream.js\";\n\n// Tables API\nexport { TablesApi } from \"./tables.js\";\n\n// Databases API\nexport { DatabasesApi } from \"./databases.js\";\n\n// Schema diff types (used by branches diff/merge)\nexport type {\n SchemaDiffResult,\n SchemaChange,\n DiffSummary,\n SeedApplyResult,\n SeedTableApplyResult,\n} from \"./schema/api.js\";\n\n// Materialized queries API\nexport {\n MaterializedQueriesApi,\n MaterializedQueryType,\n MaterializedQueryState,\n} from \"./materialized.js\";\nexport type {\n MaterializedQueryTypeNumber,\n MaterializedQueryStateNumber,\n MaterializedQueryStatus,\n MaterializedQueryDefinition,\n MaterializedQueryExecuteResult,\n MaterializedQueryExecuteOptions,\n MaterializedQueryRefreshOptions,\n} from \"./materialized.js\";\n\n// Branches API\nexport { BranchesApi } from \"./schema/branches.js\";\nexport type {\n BranchInfo,\n CreateBranchRequest,\n MergeBranchOptions,\n MergeResult,\n MergeConflict,\n MergeExecutionResult,\n} from \"./schema/branches.js\";\n\n// Admin API\nexport {\n AdminApi,\n ServerAdminApi,\n HealthAdminApi,\n MetricsAdminApi,\n ReplicationAdminApi,\n ClusterAdminApi,\n BackupAdminApi,\n ConfigAdminApi,\n NodeAdminApi,\n} from \"./admin/index.js\";\n\n// MCP cluster tools\nexport {\n AoudaClusterMcpTools,\n createAoudaClusterMcpToolSet,\n} from \"./mcp/index.js\";\nexport type {\n McpToolSchema,\n McpToolDefinition,\n ClusterStatusToolInput,\n ClusterStatusToolOutput,\n ClusterHealthToolInput,\n ClusterHealthToolOutput,\n BackupTriggerToolInput,\n BackupRestoreToolInput,\n BackupSetScheduleToolInput,\n ClusterDrainToolInput,\n ClusterPatchConfigToolInput,\n AoudaClusterMcpToolSet,\n} from \"./mcp/index.js\";\n"],"mappings":"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","names":["RetryPolicy","CircuitBreakerPolicy","CONTENT_TYPE_JSON","REQUEST_ID_HEADER","delayMs","REQUEST_ID_HEADER","databasePath","createStreamingId","databasePath","databasePath","databasePath","databasePath","BASE_PATH","BASE_PATH","BASE_PATH","BASE_PATH","BASE_PATH","databasePath","INITIAL_BACKOFF_MS","MAX_BACKOFF_MS","JITTER_FACTOR","computeBackoff","validateNonEmptyString"]}
|