@objectstack/client 7.5.0 → 7.7.0

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/realtime-api.ts","../src/query-builder.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { QueryAST, SortNode, AggregationNode, isFilterAST } from '@objectstack/spec/data';\nimport {\n BatchUpdateRequest,\n BatchUpdateResponse,\n UpdateManyRequest,\n DeleteManyRequest,\n BatchOptions,\n MetadataCacheRequest,\n MetadataCacheResponse,\n StandardErrorCode,\n ErrorCategory,\n GetDiscoveryResponse,\n GetMetaTypesResponse,\n GetMetaItemsResponse,\n LoginRequest,\n SessionResponse,\n GetPresignedUrlRequest,\n PresignedUrlResponse,\n CompleteUploadRequest,\n FileUploadResponse,\n InitiateChunkedUploadRequest,\n InitiateChunkedUploadResponse,\n UploadChunkResponse,\n CompleteChunkedUploadRequest,\n CompleteChunkedUploadResponse,\n UploadProgress,\n CheckPermissionRequest,\n CheckPermissionResponse,\n GetObjectPermissionsResponse,\n GetEffectivePermissionsResponse,\n RealtimeConnectRequest,\n RealtimeConnectResponse,\n RealtimeSubscribeRequest,\n RealtimeSubscribeResponse,\n SetPresenceRequest,\n GetPresenceResponse,\n GetWorkflowConfigResponse,\n GetWorkflowStateResponse,\n WorkflowTransitionRequest,\n WorkflowTransitionResponse,\n WorkflowApproveRequest,\n WorkflowApproveResponse,\n WorkflowRejectRequest,\n WorkflowRejectResponse,\n ListViewsResponse,\n GetViewResponse,\n CreateViewRequest,\n CreateViewResponse,\n UpdateViewRequest,\n UpdateViewResponse,\n DeleteViewResponse,\n RegisterDeviceRequest,\n RegisterDeviceResponse,\n UnregisterDeviceResponse,\n GetNotificationPreferencesResponse,\n UpdateNotificationPreferencesRequest,\n UpdateNotificationPreferencesResponse,\n ListNotificationsResponse,\n MarkNotificationsReadResponse,\n MarkAllNotificationsReadResponse,\n AiNlqRequest,\n AiNlqResponse,\n AiSuggestRequest,\n AiSuggestResponse,\n AiInsightsRequest,\n AiInsightsResponse,\n GetLocalesResponse,\n GetTranslationsResponse,\n GetFieldLabelsResponse,\n RegisterRequest,\n GetFeedResponse,\n CreateFeedItemResponse,\n UpdateFeedItemResponse,\n DeleteFeedItemResponse,\n AddReactionResponse,\n RemoveReactionResponse,\n PinFeedItemResponse,\n UnpinFeedItemResponse,\n StarFeedItemResponse,\n UnstarFeedItemResponse,\n SearchFeedResponse,\n GetChangelogResponse,\n SubscribeResponse,\n UnsubscribeResponse,\n WellKnownCapabilities,\n ApiRoutes,\n} from '@objectstack/spec/api';\nimport { Logger, createLogger } from '@objectstack/core/logger';\nimport { RealtimeAPI } from './realtime-api';\n\n/**\n * Route types that the client can resolve.\n * Covers all keys from `ApiRoutes` (the discovery schema) plus\n * client-specific virtual routes (`views`, `permissions`).\n */\nexport type ApiRouteType = keyof ApiRoutes | 'views' | 'permissions';\n\nexport interface ClientConfig {\n baseUrl: string;\n token?: string;\n /**\n * Custom fetch implementation (e.g. node-fetch or for Next.js caching)\n */\n fetch?: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n /**\n * Logger instance for debugging\n */\n logger?: Logger;\n /**\n * Enable debug logging\n */\n debug?: boolean;\n /**\n * Active project id (UUID of `sys_environment`). When present, the\n * client injects an `X-Environment-Id` header on every request so the\n * server's tenant router can resolve the physical data-plane database.\n *\n * @see docs/adr/0002-project-database-isolation.md\n */\n environmentId?: string;\n /**\n * Active UI locale (BCP-47, e.g. `'zh-CN'`). When set, the client sends\n * it as an `Accept-Language` header on every request so the server\n * resolves metadata translations (object/field labels, view headers,\n * action text) for the *in-app* language rather than the browser default.\n *\n * Apps should keep this in sync with their language switcher via\n * {@link ObjectStackClient.setLocale} so switching language re-fetches\n * localized metadata without a page refresh (issue #1319).\n */\n locale?: string;\n}\n\n/**\n * Discovery Result\n * Re-export from @objectstack/spec/api for convenience\n */\nexport type DiscoveryResult = GetDiscoveryResponse;\n\n/**\n * @deprecated Use `data.query()` with standard QueryAST parameters instead.\n * This interface uses legacy parameter names (filter/sort/top/skip) that\n * require translation to QueryAST. Prefer QueryAST fields directly:\n * - filter → where\n * - select → fields\n * - sort → orderBy\n * - skip → offset\n * - top → limit\n */\nexport interface QueryOptions {\n select?: string[]; // Simplified Selection\n /** @canonical Preferred filter parameter (singular). */\n filter?: Record<string, any> | unknown[]; // Map or AST\n /** @deprecated Use `filter` (singular). Kept for backward compatibility. */\n filters?: Record<string, any> | unknown[]; // Map or AST\n sort?: string | string[] | SortNode[]; // 'name' or ['-created_at'] or AST\n top?: number;\n skip?: number;\n // Advanced features\n aggregations?: AggregationNode[];\n groupBy?: string[];\n}\n\n/**\n * Canonical query options using Spec protocol field names.\n * This is the recommended interface for `data.find()` queries.\n *\n * Canonical field mapping (QueryAST-aligned):\n * - `where` — filter conditions (replaces legacy `filter`/`filters`)\n * - `fields` — field selection (replaces legacy `select`)\n * - `orderBy` — sort definition (replaces legacy `sort`)\n * - `limit` — max records (replaces legacy `top`)\n * - `offset` — skip records (replaces legacy `skip`)\n * - `expand` — relation loading (replaces legacy `populate`)\n */\nexport interface QueryOptionsV2 {\n /** Filter conditions (WHERE clause). Accepts MongoDB-style $op object or FilterCondition AST. */\n where?: Record<string, any> | unknown[];\n /** Fields to retrieve (SELECT clause). */\n fields?: string[];\n /** Sort definition (ORDER BY clause). */\n orderBy?: string | string[] | SortNode[];\n /** Maximum number of records to return (LIMIT). */\n limit?: number;\n /** Number of records to skip (OFFSET). */\n offset?: number;\n /** Relations to expand (JOIN / eager-load). */\n expand?: Record<string, any> | string[];\n /** Aggregation functions. */\n aggregations?: AggregationNode[];\n /** Group by fields. */\n groupBy?: string[];\n}\n\nexport interface PaginatedResult<T = any> {\n /** Spec-compliant: array of matching records */\n records: T[];\n /** Total number of matching records (if requested) */\n total?: number;\n /** The object name */\n object?: string;\n /** Whether more records are available */\n hasMore?: boolean;\n}\n\n/** Spec: GetDataResponseSchema */\nexport interface GetDataResult<T = any> {\n object: string;\n id: string;\n record: T;\n}\n\n/** Spec: CreateDataResponseSchema */\nexport interface CreateDataResult<T = any> {\n object: string;\n id: string;\n record: T;\n}\n\n/** Spec: UpdateDataResponseSchema */\nexport interface UpdateDataResult<T = any> {\n object: string;\n id: string;\n record: T;\n}\n\n/** Spec: DeleteDataResponseSchema */\nexport interface DeleteDataResult {\n object: string;\n id: string;\n deleted: boolean;\n}\n\nexport interface StandardError {\n code: StandardErrorCode;\n message: string;\n category: ErrorCategory;\n httpStatus: number;\n retryable: boolean;\n details?: Record<string, any>;\n}\n\nexport class ObjectStackClient {\n private baseUrl: string;\n private token?: string;\n private environmentId?: string;\n private locale?: string;\n private fetchImpl: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n private discoveryInfo?: DiscoveryResult;\n private logger: Logger;\n private realtimeAPI: RealtimeAPI;\n\n constructor(config: ClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.token = config.token;\n this.environmentId = config.environmentId;\n this.locale = config.locale;\n this.fetchImpl = config.fetch || globalThis.fetch.bind(globalThis);\n\n // Initialize logger\n this.logger = config.logger || createLogger({\n level: config.debug ? 'debug' : 'info',\n format: 'pretty'\n });\n\n // Initialize realtime API\n this.realtimeAPI = new RealtimeAPI(this.baseUrl, this.token);\n\n this.logger.debug('ObjectStack client created', { baseUrl: this.baseUrl });\n }\n\n /**\n * Initialize the client by discovering server capabilities.\n */\n async connect() {\n this.logger.debug('Connecting to ObjectStack server', { baseUrl: this.baseUrl });\n\n try {\n let data: DiscoveryResult | undefined;\n\n // 1. Try Protocol-standard Discovery Path /api/v1/discovery (primary)\n try {\n const discoveryUrl = `${this.baseUrl}/api/v1/discovery`;\n this.logger.debug('Probing protocol-standard discovery endpoint', { url: discoveryUrl });\n const res = await this.fetchImpl(discoveryUrl);\n if (res.ok) {\n const body = await res.json();\n data = body.data || body;\n this.logger.debug('Discovered via /api/v1/discovery');\n }\n } catch (e) {\n this.logger.debug('Protocol-standard discovery probe failed', { error: (e as Error).message });\n }\n\n // 2. Fallback to Standard Discovery (.well-known)\n if (!data) {\n let wellKnownUrl: string;\n try {\n // If baseUrl is absolute, get origin\n const url = new URL(this.baseUrl);\n wellKnownUrl = `${url.origin}/.well-known/objectstack`;\n } catch {\n // If baseUrl is relative, use absolute path from root\n wellKnownUrl = '/.well-known/objectstack';\n }\n\n this.logger.debug('Falling back to .well-known discovery', { url: wellKnownUrl });\n const res = await this.fetchImpl(wellKnownUrl);\n if (!res.ok) {\n throw new Error(`Failed to connect to ${wellKnownUrl}: ${res.statusText}`);\n }\n const body = await res.json();\n data = body.data || body;\n }\n\n if (!data) {\n throw new Error('Connection failed: No discovery data returned');\n }\n\n this.discoveryInfo = data;\n\n this.logger.info('Connected to ObjectStack server', {\n version: data.version,\n apiName: data.apiName,\n services: data.services\n });\n\n return data as DiscoveryResult;\n } catch (e) {\n this.logger.error('Failed to connect to ObjectStack server', e as Error, { baseUrl: this.baseUrl });\n throw e;\n }\n }\n\n /**\n * Well-known capability flags discovered from the server.\n * Returns undefined if the client has not yet connected or the server\n * did not include capabilities in its discovery response.\n *\n * The server may return capabilities in hierarchical format\n * `{ key: { enabled: boolean } }` or flat boolean format `{ key: boolean }`.\n * This getter normalizes both to flat `WellKnownCapabilities`.\n */\n get capabilities(): WellKnownCapabilities | undefined {\n const raw = this.discoveryInfo?.capabilities;\n if (!raw) return undefined;\n // Normalize: hierarchical { enabled: boolean } → flat boolean\n const result: Record<string, boolean> = {};\n for (const [key, value] of Object.entries(raw)) {\n result[key] = typeof value === 'object' && value !== null ? !!(value as any).enabled : !!value;\n }\n return result as unknown as WellKnownCapabilities;\n }\n\n /**\n * Metadata Operations\n */\n meta = {\n /**\n * Get all available metadata types\n * Returns types like 'object', 'plugin', 'view', etc.\n */\n getTypes: async (): Promise<GetMetaTypesResponse> => {\n const route = this.getRoute('metadata');\n const res = await this.fetch(`${this.baseUrl}${route}`);\n return this.unwrapResponse<GetMetaTypesResponse>(res);\n },\n\n /**\n * Get all items of a specific metadata type\n * @param type - Metadata type name (e.g., 'object', 'plugin')\n * @param options - Optional filters (e.g., packageId to scope by package)\n */\n getItems: async (type: string, options?: { packageId?: string }): Promise<GetMetaItemsResponse> => {\n const route = this.getRoute('metadata');\n const params = new URLSearchParams();\n if (options?.packageId) params.set('package', options.packageId);\n const qs = params.toString();\n const url = `${this.baseUrl}${route}/${type}${qs ? `?${qs}` : ''}`;\n const res = await this.fetch(url);\n return this.unwrapResponse<GetMetaItemsResponse>(res);\n },\n\n /**\n * Get a specific metadata item by type and name\n * @param type - Metadata type (e.g., 'object', 'plugin')\n * @param name - Item name (snake_case identifier)\n * @param options - Optional filters (e.g., packageId to scope by package)\n */\n getItem: async (type: string, name: string, options?: { packageId?: string }) => {\n const route = this.getRoute('metadata');\n const params = new URLSearchParams();\n if (options?.packageId) params.set('package', options.packageId);\n const qs = params.toString();\n const url = `${this.baseUrl}${route}/${type}/${name}${qs ? `?${qs}` : ''}`;\n const res = await this.fetch(url);\n return this.unwrapResponse(res);\n },\n\n /**\n * Save a metadata item\n * @param type - Metadata type (e.g., 'object', 'plugin')\n * @param name - Item name\n * @param item - The metadata content to save\n */\n saveItem: async (type: string, name: string, item: any) => {\n const route = this.getRoute('metadata');\n const res = await this.fetch(`${this.baseUrl}${route}/${type}/${name}`, {\n method: 'PUT',\n body: JSON.stringify(item)\n });\n return this.unwrapResponse(res);\n },\n\n /**\n * Delete a metadata item\n * @param type - Metadata type (e.g., 'object', 'plugin')\n * @param name - Item name (snake_case identifier)\n */\n deleteItem: async (type: string, name: string): Promise<{ type: string; name: string; deleted: boolean }> => {\n const route = this.getRoute('metadata');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(type)}/${encodeURIComponent(name)}`, {\n method: 'DELETE',\n });\n return this.unwrapResponse(res);\n },\n\n /**\n * Get the durable change-log for a specific metadata item.\n * Returns events recorded in `sys_metadata_history` for every\n * overlay put/delete, ordered by `event_seq` ascending. Non-overlay\n * metadata types return an empty list.\n */\n getHistory: async (\n type: string,\n name: string,\n options?: { sinceSeq?: number; limit?: number },\n ): Promise<{ events: Array<{\n seq: number;\n op: string;\n ref: { org?: string; type: string; name: string };\n hash: string | null;\n parentHash: string | null;\n actor: string;\n message?: string;\n ts: string;\n source: string;\n }> }> => {\n const route = this.getRoute('metadata');\n const params = new URLSearchParams();\n if (options?.sinceSeq !== undefined) params.set('sinceSeq', String(options.sinceSeq));\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n const qs = params.toString();\n const url = `${this.baseUrl}${route}/${encodeURIComponent(type)}/${encodeURIComponent(name)}/history${qs ? `?${qs}` : ''}`;\n const res = await this.fetch(url);\n return this.unwrapResponse(res);\n },\n \n /**\n * Get object metadata with cache support\n * Supports ETag-based conditional requests for efficient caching\n */\n getCached: async (name: string, cacheOptions?: MetadataCacheRequest): Promise<MetadataCacheResponse> => {\n const route = this.getRoute('metadata');\n const headers: Record<string, string> = {};\n \n if (cacheOptions?.ifNoneMatch) {\n headers['If-None-Match'] = cacheOptions.ifNoneMatch;\n }\n if (cacheOptions?.ifModifiedSince) {\n headers['If-Modified-Since'] = cacheOptions.ifModifiedSince;\n }\n \n const res = await this.fetch(`${this.baseUrl}${route}/object/${name}`, {\n headers\n });\n \n // Check for 304 Not Modified\n if (res.status === 304) {\n return {\n notModified: true,\n etag: cacheOptions?.ifNoneMatch ? { \n value: cacheOptions.ifNoneMatch.replace(/^W\\/|\"/g, ''),\n weak: cacheOptions.ifNoneMatch.startsWith('W/')\n } : undefined\n };\n }\n \n const data = await res.json();\n const etag = res.headers.get('ETag');\n const lastModified = res.headers.get('Last-Modified');\n \n return {\n data,\n etag: etag ? { \n value: etag.replace(/^W\\/|\"/g, ''), \n weak: etag.startsWith('W/') \n } : undefined,\n lastModified: lastModified || undefined,\n notModified: false\n };\n },\n \n getView: async (object: string, type: 'list' | 'form' = 'list') => {\n const route = this.getRoute('ui');\n const res = await this.fetch(`${this.baseUrl}${route}/view/${object}?type=${type}`);\n return this.unwrapResponse(res);\n }\n };\n\n /**\n * Analytics Services\n */\n analytics = {\n query: async (payload: any) => {\n const route = this.getRoute('analytics');\n const res = await this.fetch(`${this.baseUrl}${route}/query`, {\n method: 'POST',\n body: JSON.stringify(payload)\n });\n return res.json();\n },\n meta: async (cube: string) => {\n const route = this.getRoute('analytics');\n const res = await this.fetch(`${this.baseUrl}${route}/meta/${cube}`);\n return res.json();\n },\n explain: async (payload: any) => {\n const route = this.getRoute('analytics');\n const res = await this.fetch(`${this.baseUrl}${route}/explain`, {\n method: 'POST',\n body: JSON.stringify(payload)\n });\n return res.json();\n }\n };\n\n /**\n * Package Management Services\n * \n * Manages the lifecycle of installed packages.\n * A package (ManifestSchema) is the unit of installation.\n * An app (AppSchema) is a UI navigation definition within a package.\n * A package may contain 0, 1, or many apps, or be a pure functionality plugin.\n * \n * Endpoints:\n * - GET /packages → list installed packages\n * - GET /packages/:id → get package details \n * - POST /packages → install a package\n * - DELETE /packages/:id → uninstall a package\n * - PATCH /packages/:id/enable → enable a package\n * - PATCH /packages/:id/disable → disable a package\n */\n packages = {\n /**\n * List all installed packages with optional filters.\n */\n list: async (filters?: { status?: string; type?: string; enabled?: boolean }) => {\n const route = this.getRoute('packages');\n const params = new URLSearchParams();\n if (filters?.status) params.set('status', filters.status);\n if (filters?.type) params.set('type', filters.type);\n if (filters?.enabled !== undefined) params.set('enabled', String(filters.enabled));\n const qs = params.toString();\n const url = `${this.baseUrl}${route}${qs ? '?' + qs : ''}`;\n const res = await this.fetch(url);\n return this.unwrapResponse<{ packages: any[]; total: number }>(res);\n },\n\n /**\n * Get a specific installed package by its ID (reverse domain identifier).\n */\n get: async (id: string) => {\n const route = this.getRoute('packages');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(id)}`);\n return this.unwrapResponse<{ package: any }>(res);\n },\n\n /**\n * Install a new package from its manifest.\n */\n install: async (manifest: any, options?: { settings?: Record<string, any>; enableOnInstall?: boolean }) => {\n const route = this.getRoute('packages');\n const res = await this.fetch(`${this.baseUrl}${route}`, {\n method: 'POST',\n body: JSON.stringify({\n manifest,\n settings: options?.settings,\n enableOnInstall: options?.enableOnInstall,\n }),\n });\n return this.unwrapResponse<{ package: any; message?: string }>(res);\n },\n\n /**\n * Uninstall a package by its ID.\n */\n uninstall: async (id: string) => {\n const route = this.getRoute('packages');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n return this.unwrapResponse<{ id: string; success: boolean; message?: string }>(res);\n },\n\n /**\n * Enable a disabled package.\n */\n enable: async (id: string) => {\n const route = this.getRoute('packages');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(id)}/enable`, {\n method: 'PATCH',\n });\n return this.unwrapResponse<{ package: any; message?: string }>(res);\n },\n\n /**\n * Disable an installed package.\n */\n disable: async (id: string) => {\n const route = this.getRoute('packages');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(id)}/disable`, {\n method: 'PATCH',\n });\n return this.unwrapResponse<{ package: any; message?: string }>(res);\n },\n };\n\n /**\n * Environment Management Services\n *\n * Environments are the v4.1+ isolation primitive — each project owns a\n * physically separate data-plane database. All Studio-level switching goes\n * through this API.\n *\n * Endpoints:\n * - GET /api/v1/cloud/environments → list environments\n * - GET /api/v1/cloud/environments/:id → get one (with database info)\n * - POST /api/v1/cloud/environments → provision a new project\n * - PATCH /api/v1/cloud/environments/:id → update (displayName, plan, status, …)\n * - POST /api/v1/cloud/environments/:id/activate → set as session's active project\n * - POST /api/v1/cloud/environments/:id/credentials/rotate → rotate credential\n *\n * @see docs/adr/0002-project-database-isolation.md\n */\n projects = {\n /**\n * List environments visible to the current session. Optionally filter\n * by organization (control-plane query — not routed through a data-plane DB).\n */\n list: async (filters?: { organization_id?: string; env_type?: string; status?: string }) => {\n const params = new URLSearchParams();\n if (filters?.organization_id) params.set('organizationId', filters.organization_id);\n if (filters?.env_type) params.set('envType', filters.env_type);\n if (filters?.status) params.set('status', filters.status);\n const qs = params.toString();\n const url = `${this.baseUrl}/api/v1/cloud/environments${qs ? '?' + qs : ''}`;\n const res = await this.fetch(url);\n return this.unwrapResponse<{ projects: any[]; total: number }>(res);\n },\n\n /**\n * Get a single project (joined with its database and membership row).\n */\n get: async (id: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}`);\n return this.unwrapResponse<{\n project: any;\n database?: any;\n credential?: any;\n membership?: any;\n organization?: any;\n }>(res);\n },\n\n /**\n * Provision a new project. Delegates to\n * `ProjectProvisioningService.provisionProject` on the server.\n */\n create: async (req: {\n organization_id: string;\n slug?: string;\n display_name: string;\n env_type?: string;\n project_type?: string;\n plan?: string;\n region?: string;\n driver?: string;\n is_default?: boolean;\n is_system?: boolean;\n storage_limit_mb?: number;\n clone_from_environment_id?: string;\n template_id?: string;\n metadata?: Record<string, unknown>;\n }) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return this.unwrapResponse<{ project: any; database: any }>(res);\n },\n\n /**\n * Update a project (display_name, plan, status, is_default, metadata).\n */\n update: async (id: string, patch: Record<string, unknown>) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(patch),\n });\n return this.unwrapResponse<{ project: any }>(res);\n },\n\n /**\n * Cascade-delete a project: cleans up credential/member/package_installation\n * rows, releases the physical database via the provisioning adapter, and\n * removes the `sys_environment` row. Default projects require `force: true`.\n */\n delete: async (id: string, opts?: { force?: boolean }) => {\n const qs = opts?.force ? '?force=1' : '';\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}${qs}`,\n { method: 'DELETE' },\n );\n return this.unwrapResponse<{ deleted: boolean; environmentId: string; warnings: string[] }>(res);\n },\n\n /**\n * Activate this project for the current session. The server writes\n * `active_environment_id` on the better-auth session; subsequent requests\n * are routed to this project's database.\n */\n activate: async (id: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/activate`, {\n method: 'POST',\n });\n return this.unwrapResponse<{ project: any; sessionUpdated: boolean }>(res);\n },\n\n /**\n * Rotate the active database credential for this project.\n */\n rotateCredential: async (id: string, plaintext: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/credentials/rotate`, {\n method: 'POST',\n body: JSON.stringify({ plaintext }),\n });\n return this.unwrapResponse<{ credential: any }>(res);\n },\n\n /**\n * Update the hostname bound to this project. Validates format and\n * uniqueness server-side; invalidates the dispatcher's routing cache.\n */\n updateHostname: async (id: string, hostname: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/hostname`, {\n method: 'POST',\n body: JSON.stringify({ hostname }),\n });\n return this.unwrapResponse<{ project: any }>(res);\n },\n\n /**\n * Update the visibility of this project ('private' | 'public').\n * `private` (default) hides the project from /pub/v1 enumeration but\n * still allows anonymous artifact downloads when the URL includes an\n * exact `?commit=<id>` (share-by-link). `public` lists the project and\n * freely exposes all revisions.\n */\n updateVisibility: async (id: string, visibility: 'private' | 'public') => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify({ visibility }),\n });\n return this.unwrapResponse<{ project: any }>(res);\n },\n\n /**\n * List published artifact revisions for a project. Each revision has\n * an immutable commitId (content-addressable) and storage_key.\n * Optional `branch` filter narrows to a single logical branch\n * (default branch `main` also matches rows with NULL `branch`).\n */\n listRevisions: async (id: string, opts?: { limit?: number; cursor?: string; branch?: string }) => {\n const params = new URLSearchParams();\n if (opts?.limit) params.set('limit', String(opts.limit));\n if (opts?.cursor) params.set('cursor', opts.cursor);\n if (opts?.branch) params.set('branch', opts.branch);\n const qs = params.toString();\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/revisions${qs ? `?${qs}` : ''}`,\n );\n return this.unwrapResponse<{\n items: Array<{\n commitId: string;\n checksum: string;\n storageKey: string;\n sizeBytes: number;\n builtAt: string;\n publishedAt: string;\n publishedBy: string | null;\n note: string | null;\n isCurrent: boolean;\n branch: string;\n isBranchHead: boolean;\n }>;\n nextCursor: string | null;\n branch: string | null;\n }>(res);\n },\n\n /**\n * List logical branches for a project. Each branch has a head commit\n * (latest published revision on that branch) and a count of revisions.\n * Branches without a head row (e.g. all rows demoted) are omitted.\n */\n listBranches: async (id: string) => {\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/branches`,\n );\n return this.unwrapResponse<{\n environmentId: string;\n branches: Array<{\n branch: string;\n headCommitId: string;\n headRevisionId: string;\n revisionCount: number;\n headPublishedAt: string | null;\n headNote: string | null;\n isCurrent: boolean;\n }>;\n }>(res);\n },\n\n /**\n * Rename a branch. Updates every revision row in `from` to `to`.\n * 409 if `to` already has rows.\n */\n renameBranch: async (id: string, from: string, to: string) => {\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/branches/${encodeURIComponent(from)}/rename`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ newName: to }),\n },\n );\n return this.unwrapResponse<{ environmentId: string; from: string; to: string; renamed: number }>(res);\n },\n\n /**\n * Delete (demote) a branch. Soft-removal — clears `is_branch_head` on\n * every row in this branch; the revisions themselves remain. The\n * `main` branch and any branch carrying the active revision cannot be\n * deleted.\n */\n deleteBranch: async (id: string, name: string) => {\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/branches/${encodeURIComponent(name)}`,\n { method: 'DELETE' },\n );\n return this.unwrapResponse<{ environmentId: string; branch: string; demoted: number; totalRevisions: number }>(res);\n },\n\n /**\n * Activate (rollback to) a previously-published revision by commit id.\n * Marks the target revision is_current=true and demotes the prior one.\n */\n activateRevision: async (id: string, commitId: string) => {\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/revisions/${encodeURIComponent(commitId)}/activate`,\n { method: 'POST' },\n );\n return this.unwrapResponse<{ environmentId: string; commitId: string; activated: boolean; previousCommitId: string | null }>(res);\n },\n\n /**\n * Retry provisioning for a project stuck in `failed` (or\n * `provisioning`) state. The server re-runs the driver handshake; on\n * success the project flips to `active`, on failure it stays\n * `failed` with `metadata.provisioningError` updated.\n */\n retryProvisioning: async (id: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/retry`, {\n method: 'POST',\n });\n return this.unwrapResponse<{ project: any }>(res);\n },\n\n /**\n * List members of a project (per-project RBAC).\n */\n listMembers: async (id: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/members`);\n return this.unwrapResponse<{ members: any[] }>(res);\n },\n\n /**\n * Invite a member to a project. Caller must be `owner` or `admin`.\n * Pass either `email` (resolved against the user table) or `user_id`.\n * Returns `{ member, alreadyMember }` — `alreadyMember=true` means the\n * row already existed; the call is idempotent.\n */\n addMember: async (\n id: string,\n payload: { email?: string; user_id?: string; role?: 'owner' | 'admin' | 'member' | 'viewer' },\n ) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/members`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n });\n return this.unwrapResponse<{ member: any; alreadyMember: boolean }>(res);\n },\n\n /**\n * Update a member's role. Caller must be `owner` or `admin`. Demoting\n * the last `owner` returns 409.\n */\n updateMemberRole: async (\n id: string,\n memberId: string,\n role: 'owner' | 'admin' | 'member' | 'viewer',\n ) => {\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`,\n {\n method: 'PATCH',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ role }),\n },\n );\n return this.unwrapResponse<{ member: any }>(res);\n },\n\n /**\n * Remove a member. Owners/admins may remove anyone; non-privileged\n * users may only remove themselves. Removing the last `owner` returns 409.\n */\n removeMember: async (id: string, memberId: string) => {\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`,\n { method: 'DELETE' },\n );\n return this.unwrapResponse<{ removed: boolean; memberId: string }>(res);\n },\n\n /**\n * List ObjectQL drivers registered on the server. Useful for populating a\n * driver selector when provisioning a new project (memory / turso /\n * future sql drivers). Returned `name` is the short alias (e.g. `memory`,\n * `turso`); `driverId` is the full FQN (e.g. `com.objectstack.driver.memory`).\n */\n listDrivers: async () => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/drivers`);\n return this.unwrapResponse<{ drivers: Array<{ name: string; driverId: string }>; total: number }>(res);\n },\n\n /**\n * List available project templates. Templates are seeded into the project\n * database once at provisioning time when `template_id` is supplied.\n */\n listTemplates: async () => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/templates`);\n return this.unwrapResponse<{ templates: Array<{ id: string; label: string; description: string; category?: string }>; total: number }>(res);\n },\n\n /**\n * Per-project package installation management (Power Apps \"solution\" model).\n * Install records are stored in the environment's own database.\n */\n packages: {\n /** List all packages installed in a specific project. */\n list: async (envId: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages`);\n return this.unwrapResponse<{ packages: any[]; total: number }>(res);\n },\n\n /** Install a package into the project. */\n install: async (envId: string, body: {\n packageId: string;\n version?: string;\n settings?: Record<string, unknown>;\n enableOnInstall?: boolean;\n }) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n return this.unwrapResponse<{ package: any }>(res);\n },\n\n /** Get a single installation record. */\n get: async (envId: string, pkgId: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages/${encodeURIComponent(pkgId)}`);\n return this.unwrapResponse<{ package: any }>(res);\n },\n\n /** Enable a previously disabled package. */\n enable: async (envId: string, pkgId: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages/${encodeURIComponent(pkgId)}/enable`, {\n method: 'PATCH',\n });\n return this.unwrapResponse<{ package: any }>(res);\n },\n\n /** Disable an installed package (metadata will not be loaded). */\n disable: async (envId: string, pkgId: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages/${encodeURIComponent(pkgId)}/disable`, {\n method: 'PATCH',\n });\n return this.unwrapResponse<{ package: any }>(res);\n },\n\n /** Uninstall a package from the project. Forbidden for scope=platform packages. */\n uninstall: async (envId: string, pkgId: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages/${encodeURIComponent(pkgId)}`, {\n method: 'DELETE',\n });\n return this.unwrapResponse<{ id: string; success: boolean }>(res);\n },\n\n /** Upgrade an installed package to a newer version. */\n upgrade: async (envId: string, pkgId: string, targetVersion?: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages/${encodeURIComponent(pkgId)}/upgrade`, {\n method: 'POST',\n body: JSON.stringify({ targetVersion }),\n });\n return this.unwrapResponse<{ package: any }>(res);\n },\n },\n };\n\n /**\n * Project-scoped client factory.\n *\n * Returns a thin wrapper around the data / meta / packages namespaces that\n * prefixes every request with `/api/v1/environments/:environmentId/...`. Use this\n * when the server has `enableProjectScoping: true` in its REST API config.\n *\n * Backward compatibility: `client.data.*`, `client.meta.*`, and\n * `client.packages.*` continue to work unchanged; they hit unscoped routes\n * and rely on hostname / `X-Environment-Id` header / session resolution.\n *\n * @example\n * ```ts\n * const scoped = client.project('00000000-0000-0000-0000-000000000001');\n * const tasks = await scoped.data.find('task', { top: 10 });\n * const objects = await scoped.meta.getItems('object');\n * ```\n */\n project(environmentId: string): ScopedProjectClient {\n if (!environmentId) {\n throw new Error('[ObjectStack] project(id): environmentId is required');\n }\n return new ScopedProjectClient(this, environmentId);\n }\n\n // ── Internal accessors exposed to ScopedProjectClient ────────────────\n // The scoped client lives in the same module so using module-level access\n // works; TypeScript requires these to be accessible, so we expose them via\n // small protected getters that keep the public surface unchanged.\n /** @internal */\n _baseUrl(): string { return this.baseUrl; }\n /** @internal */\n _fetch(url: string, init?: RequestInit): Promise<Response> {\n return this.fetch(url, init);\n }\n /** @internal */\n _unwrap<T>(res: Response): Promise<T> { return this.unwrapResponse<T>(res); }\n /** @internal */\n _isFilterAST(v: unknown): boolean { return this.isFilterAST(v); }\n\n /**\n * Organization Services\n *\n * Thin wrapper around better-auth's organization plugin endpoints, which\n * are mounted under `/api/v1/auth/organization/**`. Used by the Studio\n * OrganizationSwitcher and the /orgs management routes.\n */\n organizations = {\n /**\n * List organizations the current user belongs to.\n * GET /api/v1/auth/organization/list\n */\n list: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/list`);\n const data = await res.json();\n // better-auth returns the array directly, sometimes wrapped in { data }.\n const orgs = Array.isArray(data) ? data : (data?.data ?? []);\n return { organizations: orgs as Array<{ id: string; name: string; slug?: string; logo?: string; metadata?: any }> };\n },\n\n /**\n * Create a new organization.\n * POST /api/v1/auth/organization/create\n */\n create: async (req: { name: string; slug?: string; logo?: string; metadata?: Record<string, unknown> }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/create`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Update an existing organization.\n * POST /api/v1/auth/organization/update\n *\n * better-auth requires the caller to be an owner/admin (server-side\n * enforcement); the body shape is `{ organizationId, data: {...} }`.\n */\n update: async (\n organizationId: string,\n data: { name?: string; slug?: string; logo?: string; metadata?: Record<string, unknown> },\n ) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/update`, {\n method: 'POST',\n body: JSON.stringify({ organizationId, data }),\n });\n return res.json();\n },\n\n /**\n * Set the active organization on the current session. The server writes\n * `activeOrganizationId` on the better-auth session, which downstream\n * handlers (e.g. `EnvironmentProvisioningService`) consult.\n *\n * POST /api/v1/auth/organization/set-active\n */\n setActive: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/set-active`, {\n method: 'POST',\n body: JSON.stringify({ organizationId }),\n });\n return res.json();\n },\n\n /**\n * Get full organization detail (members, invitations, teams).\n * GET /api/v1/auth/organization/get-full-organization?organizationId=...\n */\n get: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/organization/get-full-organization?organizationId=${encodeURIComponent(organizationId)}`,\n );\n return res.json();\n },\n\n /**\n * List members of an organization.\n */\n listMembers: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/organization/list-members?organizationId=${encodeURIComponent(organizationId)}`,\n );\n return res.json();\n },\n\n /**\n * Invite a user to the organization.\n */\n invite: async (req: { email: string; role?: string; organizationId?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/invite-member`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Leave the given organization.\n */\n leave: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/leave`, {\n method: 'POST',\n body: JSON.stringify({ organizationId }),\n });\n return res.json();\n },\n\n /**\n * Delete an organization via better-auth's organization plugin.\n *\n * POST /api/v1/auth/organization/delete\n *\n * better-auth removes the organization row, all members, and all\n * pending invitations. Project teardown (per-project DBs, etc.) is\n * handled server-side by hooks attached to the organization plugin.\n */\n delete: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/delete`, {\n method: 'POST',\n body: JSON.stringify({ organizationId }),\n });\n return res.json();\n },\n\n /**\n * Remove a member from an organization.\n *\n * better-auth: POST /organization/remove-member\n * Body: `{ memberIdOrEmail, organizationId? }` — note the parameter is the\n * **member id** (the row id from `member` table) or the user's email; it\n * is *not* the bare `userId`. Server enforces owner/admin permission.\n */\n removeMember: async (\n organizationId: string,\n params: { memberIdOrEmail: string },\n ) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/remove-member`, {\n method: 'POST',\n body: JSON.stringify({ memberIdOrEmail: params.memberIdOrEmail, organizationId }),\n });\n return res.json();\n },\n\n /**\n * Change a member's role in an organization (owner/admin only).\n *\n * better-auth: POST /organization/update-member-role\n * Body: `{ memberId, role, organizationId? }`. The `memberId` is the\n * `member` table row id (not user id). `role` is one of the configured\n * organisation roles (default: `owner | admin | member`).\n */\n updateMemberRole: async (\n organizationId: string,\n params: { memberId: string; role: string },\n ) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/update-member-role`, {\n method: 'POST',\n body: JSON.stringify({ memberId: params.memberId, role: params.role, organizationId }),\n });\n return res.json();\n },\n\n /**\n * Look up the calling user's membership row in the given organisation.\n * Useful for permission checks on the client without having to scan the\n * full member list.\n *\n * better-auth: GET /organization/get-active-member?organizationId=…\n */\n getActiveMember: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/organization/get-active-member?organizationId=${encodeURIComponent(organizationId)}`,\n );\n return res.json();\n },\n\n /**\n * Invitation lifecycle — wraps better-auth's organization-plugin\n * invitation endpoints. Always go through here instead of writing to\n * `sys_invitation` via the data API: the better-auth writers handle\n * status transitions, expiry, dedupe, and the `sendInvitationEmail`\n * side-effect that the auth-manager wires up.\n */\n invitations: {\n /**\n * List pending/accepted/canceled invitations for an organization.\n * Requires owner/admin role on that org.\n *\n * better-auth: GET /organization/list-invitations?organizationId=…\n */\n list: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/organization/list-invitations?organizationId=${encodeURIComponent(organizationId)}`,\n );\n const data = await res.json();\n const invitations = Array.isArray(data) ? data : (data?.data ?? data?.invitations ?? []);\n return { invitations: invitations as Array<{\n id: string;\n email: string;\n role: string;\n status: 'pending' | 'accepted' | 'rejected' | 'canceled';\n organizationId: string;\n inviterId: string;\n expiresAt: string;\n teamId?: string | null;\n }> };\n },\n\n /**\n * List the **current user's** incoming invitations across every\n * organisation. Used by the per-user \"Invitations\" inbox page.\n *\n * better-auth: GET /organization/list-user-invitations\n */\n listMine: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/list-user-invitations`);\n const data = await res.json();\n const invitations = Array.isArray(data) ? data : (data?.data ?? data?.invitations ?? []);\n return { invitations: invitations as Array<{\n id: string;\n email: string;\n role: string;\n status: string;\n organizationId: string;\n inviterId: string;\n expiresAt: string;\n }> };\n },\n\n /** better-auth: POST /organization/cancel-invitation */\n cancel: async (invitationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/cancel-invitation`, {\n method: 'POST',\n body: JSON.stringify({ invitationId }),\n });\n return res.json();\n },\n\n /** better-auth: POST /organization/accept-invitation */\n accept: async (invitationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/accept-invitation`, {\n method: 'POST',\n body: JSON.stringify({ invitationId }),\n });\n return res.json();\n },\n\n /** better-auth: POST /organization/reject-invitation */\n reject: async (invitationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/reject-invitation`, {\n method: 'POST',\n body: JSON.stringify({ invitationId }),\n });\n return res.json();\n },\n\n /**\n * \"Resend\" an invitation. better-auth has no first-class resend\n * endpoint, so we implement it as cancel-then-invite: cancel the old\n * row (so its status flips to `canceled` and audit hooks fire), then\n * issue a fresh invite. The new invite re-runs `sendInvitationEmail`\n * on the server, so the recipient gets a brand-new accept URL.\n *\n * If `cancel()` fails (e.g. invite already accepted) the error is\n * re-thrown without re-inviting.\n */\n resend: async (\n invitation: { id?: string; email: string; role?: string; organizationId: string; teamId?: string | null },\n ) => {\n if (invitation.id) {\n try {\n await this.organizations.invitations.cancel(invitation.id);\n } catch {\n // Best-effort: ignore \"already canceled / accepted\" so the\n // re-invite still goes out.\n }\n }\n return this.organizations.invite({\n email: invitation.email,\n role: invitation.role ?? 'member',\n organizationId: invitation.organizationId,\n });\n },\n },\n\n /**\n * Team management — only available when the organisation plugin is\n * configured with `teams: { enabled: true }` on the server. Calls return\n * a 4xx if teams aren't enabled; UI should hide the section in that case.\n */\n teams: {\n /** better-auth: GET /organization/list-teams?organizationId=… */\n list: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/organization/list-teams?organizationId=${encodeURIComponent(organizationId)}`,\n );\n const data = await res.json();\n const teams = Array.isArray(data) ? data : (data?.data ?? data?.teams ?? []);\n return { teams: teams as Array<{ id: string; name: string; organizationId: string; createdAt?: string }> };\n },\n\n /** better-auth: POST /organization/create-team */\n create: async (req: { name: string; organizationId: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/create-team`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /** better-auth: POST /organization/update-team */\n update: async (params: { teamId: string; data: { name?: string } }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/update-team`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n return res.json();\n },\n\n /** better-auth: POST /organization/remove-team */\n delete: async (params: { teamId: string; organizationId?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/remove-team`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n return res.json();\n },\n\n /** better-auth: GET /organization/list-team-members?teamId=… */\n listMembers: async (teamId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/organization/list-team-members?teamId=${encodeURIComponent(teamId)}`,\n );\n const data = await res.json();\n const members = Array.isArray(data) ? data : (data?.data ?? data?.members ?? []);\n return { members: members as Array<{ id: string; teamId: string; userId: string }> };\n },\n\n /** better-auth: POST /organization/add-team-member */\n addMember: async (params: { teamId: string; userId: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/add-team-member`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n return res.json();\n },\n\n /** better-auth: POST /organization/remove-team-member */\n removeMember: async (params: { teamId: string; userId: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/remove-team-member`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n return res.json();\n },\n },\n };\n\n /**\n * OAuth / OpenID Connect Provider — admin endpoints exposed by\n * `@better-auth/oauth-provider` (when enabled on the server). Lets users\n * register their own OAuth client applications, list them, and revoke them.\n *\n * All endpoints are mounted under the auth route, e.g. `/api/v1/auth/oauth2/*`.\n */\n oauth = {\n applications: {\n /**\n * Register a new OAuth client application.\n * POST /api/v1/auth/oauth2/create-client (authenticated)\n *\n * Returns the freshly-issued `client_id` and `client_secret`.\n * The secret is only returned at creation time — store it securely.\n */\n register: async (req: {\n client_name?: string;\n name?: string;\n redirect_uris: string[];\n token_endpoint_auth_method?: 'none' | 'client_secret_basic' | 'client_secret_post';\n grant_types?: string[];\n response_types?: string[];\n client_uri?: string;\n logo_uri?: string;\n scope?: string;\n scopes?: string[];\n contacts?: string[];\n tos_uri?: string;\n policy_uri?: string;\n metadata?: Record<string, unknown>;\n }) => {\n const route = this.getRoute('auth');\n // The new oauth-provider package exposes `/oauth2/create-client`\n // (authenticated dynamic registration). The legacy `/oauth2/register`\n // endpoint is now disabled by default for security and only\n // available when the server explicitly opts in via the\n // `allowUnauthenticatedClientRegistration` option.\n const res = await this.fetch(`${this.baseUrl}${route}/oauth2/create-client`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Get a single OAuth application by its `client_id`.\n * GET /api/v1/auth/oauth2/get-client?client_id=...\n */\n get: async (clientId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/oauth2/get-client?client_id=${encodeURIComponent(clientId)}`,\n );\n return res.json();\n },\n\n /**\n * Get a single OAuth application's public fields (no auth required\n * once the user has signed in). Used by the consent screen.\n * GET /api/v1/auth/oauth2/public-client?client_id=...\n */\n getPublic: async (clientId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/oauth2/public-client?client_id=${encodeURIComponent(clientId)}`,\n );\n return res.json();\n },\n\n /**\n * List OAuth applications visible to the current user.\n *\n * Uses `@better-auth/oauth-provider`'s `/oauth2/get-clients` endpoint\n * which returns clients owned by the current user (and their\n * organization, if applicable).\n */\n list: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/oauth2/get-clients`);\n const data = await res.json();\n const items = Array.isArray(data) ? data : data?.clients ?? data?.data ?? [];\n return { applications: items as Array<Record<string, any>> };\n },\n\n /**\n * Delete an OAuth application by its `client_id`.\n * POST /api/v1/auth/oauth2/delete-client\n *\n * Tokens and consents referencing the client cascade-delete via the\n * better-auth schema's `onDelete: cascade` foreign keys.\n */\n delete: async (clientId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/oauth2/delete-client`, {\n method: 'POST',\n body: JSON.stringify({ client_id: clientId }),\n });\n return res.json();\n },\n },\n\n /**\n * Submit the user's decision to a pending consent request.\n * POST /api/v1/auth/oauth2/consent\n *\n * Called by the consent screen after the user accepts or denies. The\n * `oauth_query` is the raw query string of the consent page URL — it\n * carries the signed authorization request that the consent endpoint\n * verifies before issuing the authorization code.\n */\n consent: async (req: { accept: boolean; scope?: string; oauth_query?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/oauth2/consent`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n };\n\n /**\n * Update the active project id used for subsequent requests.\n * Pass `undefined` to clear (falls back to the session default).\n */\n setProjectId(environmentId: string | undefined): void {\n this.environmentId = environmentId;\n this.logger.debug('Active project changed', { environmentId });\n }\n\n /**\n * Current active project id (if set).\n */\n getProjectId(): string | undefined {\n return this.environmentId;\n }\n\n /**\n * Update the active UI locale used for subsequent requests. Apps should\n * call this from their language switcher so server-translated metadata\n * (object/field labels, view headers, action text) follows the in-app\n * language without a page refresh. Pass `undefined` to clear and fall\n * back to the browser's `Accept-Language` (issue #1319).\n */\n setLocale(locale: string | undefined): void {\n this.locale = locale;\n this.logger.debug('Active locale changed', { locale });\n }\n\n /**\n * Current active UI locale (if set).\n */\n getLocale(): string | undefined {\n return this.locale;\n }\n\n /**\n * Authentication Services\n */\n auth = {\n /**\n * Get authentication configuration\n * Returns available auth providers and features\n */\n getConfig: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/config`);\n return this.unwrapResponse(res);\n },\n\n /**\n * Login with email and password\n * Uses better-auth endpoint: POST /sign-in/email\n */\n login: async (request: LoginRequest): Promise<SessionResponse> => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/sign-in/email`, {\n method: 'POST',\n headers: { Origin: this.baseUrl },\n body: JSON.stringify(request)\n });\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n // better-auth signals errors via non-2xx status with `{ code, message }`.\n // Throw so callers can `try/catch` (e.g. detect EMAIL_NOT_VERIFIED and\n // redirect to the resend-verification page) instead of silently\n // receiving a normalized-looking response with no token.\n const message = raw?.message || raw?.error?.message || `Login failed (HTTP ${res.status})`;\n const err = new Error(message) as Error & { code?: string; status?: number };\n if (raw?.code) err.code = raw.code;\n err.status = res.status;\n throw err;\n }\n // Normalize: better-auth returns `{ token, user }` at top level,\n // but our SessionResponse shape wraps them in `data`.\n const data = raw && (raw.data ?? (raw.token || raw.user ? { token: raw.token, user: raw.user } : undefined));\n const normalized = data ? { ...raw, data } : raw;\n // Auto-set token if present in response\n if (normalized.data?.token) {\n this.token = normalized.data.token;\n }\n return normalized;\n },\n \n /**\n * Logout current user\n * Uses better-auth endpoint: POST /sign-out\n */\n logout: async () => {\n const route = this.getRoute('auth');\n await this.fetch(`${this.baseUrl}${route}/sign-out`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Origin: this.baseUrl },\n body: '{}',\n });\n this.token = undefined;\n },\n\n /**\n * Get current user session\n * Uses better-auth endpoint: GET /get-session\n */\n me: async (): Promise<SessionResponse> => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/get-session`, {\n headers: { Origin: this.baseUrl },\n });\n return res.json();\n },\n\n /**\n * Register a new user account\n * Uses better-auth endpoint: POST /sign-up/email\n */\n register: async (request: RegisterRequest): Promise<SessionResponse> => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/sign-up/email`, {\n method: 'POST',\n headers: { Origin: this.baseUrl },\n body: JSON.stringify(request)\n });\n const raw = await res.json();\n const data = raw && (raw.data ?? (raw.token || raw.user ? { token: raw.token, user: raw.user } : undefined));\n const normalized = data ? { ...raw, data } : raw;\n if (normalized.data?.token) {\n this.token = normalized.data.token;\n }\n return normalized;\n },\n\n /**\n * Initiate OAuth sign-in via a social or OIDC provider.\n *\n * - Social providers (Google, GitHub, etc.): calls POST /sign-in/social with `{ provider }`.\n * - OIDC/enterprise providers: calls POST /sign-in/oauth2 with `{ providerId }`.\n *\n * After the provider callback better-auth sets the session cookie and redirects to `callbackURL`.\n */\n signInWithProvider: async (\n provider: string,\n opts?: { callbackURL?: string; errorCallbackURL?: string; type?: 'social' | 'oidc' },\n ): Promise<void> => {\n if (typeof window === 'undefined') {\n throw new Error('signInWithProvider requires a browser environment');\n }\n const route = this.getRoute('auth');\n const callbackURL = opts?.callbackURL ?? window.location.origin + '/login';\n const isOidc = opts?.type === 'oidc';\n const endpoint = isOidc ? '/sign-in/oauth2' : '/sign-in/social';\n const body: Record<string, string> = isOidc\n ? { providerId: provider, callbackURL }\n : { provider, callbackURL };\n if (opts?.errorCallbackURL) body.errorCallbackURL = opts.errorCallbackURL;\n const res = await this.fetch(`${this.baseUrl}${route}${endpoint}`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const data = await res.json();\n const redirectUrl = data?.url ?? data?.data?.url;\n if (redirectUrl) {\n window.location.assign(redirectUrl);\n } else {\n throw new Error(`signInWithProvider: no redirect URL returned for provider \"${provider}\"`);\n }\n },\n\n /**\n * Refresh an authentication token\n * Note: better-auth handles token refresh automatically via /get-session\n * @param _refreshToken - Not used (better-auth handles refresh automatically)\n */\n refreshToken: async (_refreshToken: string): Promise<SessionResponse> => {\n const route = this.getRoute('auth');\n // better-auth doesn't have a separate refresh endpoint\n // Session refresh is handled automatically when calling /get-session\n const res = await this.fetch(`${this.baseUrl}${route}/get-session`, {\n method: 'GET'\n });\n const data = await res.json();\n if (data.data?.token) {\n this.token = data.data.token;\n }\n return data;\n },\n\n /**\n * Probe the framework-only `/auth/bootstrap-status` endpoint to determine\n * whether the very first owner has been provisioned. The Account portal's\n * `/setup` route uses this to decide whether to render the bootstrap form\n * or bounce the user straight to `/login`.\n */\n bootstrapStatus: async (): Promise<{ hasOwner: boolean }> => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/bootstrap-status`);\n const data = await res.json();\n // Endpoint may or may not be wrapped in `{ data }`.\n const payload = (data?.data ?? data) as { hasOwner?: boolean };\n return { hasOwner: !!payload?.hasOwner };\n },\n\n /**\n * Update the current user's profile.\n *\n * better-auth: POST /update-user — accepts `{ name?, image?, ... }`\n * (any custom user fields configured on the server). Returns the\n * updated user.\n */\n updateUser: async (data: { name?: string; image?: string | null; [key: string]: unknown }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/update-user`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n return res.json();\n },\n\n /**\n * Change the current user's password (email/password accounts only).\n *\n * better-auth: POST /change-password.\n * Set `revokeOtherSessions: true` to invalidate every other session\n * after the change.\n */\n changePassword: async (req: {\n currentPassword: string;\n newPassword: string;\n revokeOtherSessions?: boolean;\n }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/change-password`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Begin a change-email flow. better-auth sends a verification mail to\n * the new address; the change only takes effect after the user clicks\n * the link.\n *\n * better-auth: POST /change-email — `{ newEmail, callbackURL? }`.\n */\n changeEmail: async (req: { newEmail: string; callbackURL?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/change-email`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Re-send the email-verification link to the current user (or any\n * address when called as an admin). better-auth: POST /send-verification-email.\n */\n sendVerificationEmail: async (req: { email: string; callbackURL?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/send-verification-email`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Verify an email-verification token (the link target).\n *\n * better-auth: GET /verify-email?token=…&callbackURL=…\n */\n verifyEmail: async (params: { token: string; callbackURL?: string }) => {\n const route = this.getRoute('auth');\n const url = new URL(`${this.baseUrl}${route}/verify-email`);\n url.searchParams.set('token', params.token);\n if (params.callbackURL) url.searchParams.set('callbackURL', params.callbackURL);\n const res = await this.fetch(url.toString());\n return res.json();\n },\n\n /**\n * Permanently delete the current user. better-auth supports two flows:\n *\n * 1. With a fresh-session password challenge: POST `{ password }`.\n * 2. With an emailed deletion-confirmation token: POST `{ token }`,\n * typically following an out-of-band confirmation step.\n *\n * Server policy decides which is required; pass whichever you have.\n */\n deleteUser: async (req: { password?: string; token?: string; callbackURL?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/delete-user`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n // Local cleanup mirrors logout(): drop cached bearer token so the next\n // call doesn't try to use a credential for a now-deleted user.\n this.token = undefined;\n return res.json();\n },\n\n /**\n * Active-session management. Wraps better-auth's session endpoints so\n * the Account portal's `/account/sessions` page can list every device\n * the user is signed in from and revoke them individually or in bulk.\n */\n sessions: {\n /** better-auth: GET /list-sessions — returns the current user's sessions. */\n list: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/list-sessions`);\n const data = await res.json();\n const sessions = Array.isArray(data) ? data : (data?.data ?? data?.sessions ?? []);\n return { sessions: sessions as Array<{\n id: string;\n token: string;\n userId: string;\n userAgent?: string;\n ipAddress?: string;\n createdAt: string;\n expiresAt: string;\n }> };\n },\n\n /** better-auth: POST /revoke-session — revoke a single session by token. */\n revoke: async (token: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/revoke-session`, {\n method: 'POST',\n body: JSON.stringify({ token }),\n });\n return res.json();\n },\n\n /** better-auth: POST /revoke-other-sessions — keep current, kill the rest. */\n revokeOthers: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/revoke-other-sessions`, {\n method: 'POST',\n body: '{}',\n });\n return res.json();\n },\n\n /** better-auth: POST /revoke-sessions — kill every session for this user. */\n revokeAll: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/revoke-sessions`, {\n method: 'POST',\n body: '{}',\n });\n // Local cleanup — current session is gone too.\n this.token = undefined;\n return res.json();\n },\n },\n\n /**\n * Two-factor authentication (TOTP + backup codes). Requires the\n * `twoFactor` plugin to be enabled on the server (see\n * `plugin-auth` config). Endpoints live under `/two-factor/*`.\n */\n twoFactor: {\n /**\n * Start enrolment. Server returns a TOTP URI (`otpauth://...`) which\n * the UI renders as a QR code; the user then calls `verifyTotp` to\n * confirm and finish enabling.\n */\n enable: async (req: { password: string }): Promise<{ totpURI?: string; backupCodes?: string[] }> => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/two-factor/enable`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n const data = await res.json();\n return (data?.data ?? data) as { totpURI?: string; backupCodes?: string[] };\n },\n\n /**\n * Confirm a TOTP code — used to finalise enrolment after `enable()`\n * or to step up an existing 2FA-enabled session. `trustDevice` (when\n * supported by the server config) suppresses the 2FA challenge on\n * this browser for the configured trust period.\n */\n verifyTotp: async (req: { code: string; trustDevice?: boolean }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/two-factor/verify-totp`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /** Disable 2FA for the current user. Requires the password again. */\n disable: async (req: { password: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/two-factor/disable`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Issue a fresh set of backup codes (invalidating any previous set).\n * Display them once — the server only stores hashes.\n */\n generateBackupCodes: async (req: { password: string }): Promise<{ backupCodes: string[] }> => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/two-factor/generate-backup-codes`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n const data = await res.json();\n return (data?.data ?? data) as { backupCodes: string[] };\n },\n\n /**\n * Verify a 2FA backup code in lieu of a TOTP. Useful as a recovery\n * affordance when the user has lost their authenticator app.\n */\n verifyBackupCode: async (req: { code: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/two-factor/verify-backup-code`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n },\n\n /**\n * Linked credentials — i.e. the rows in better-auth's `account` table\n * (one per provider × user). Lets the user see and unlink their social\n * / OIDC connections from the Account portal.\n */\n accounts: {\n /** better-auth: GET /list-accounts */\n list: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/list-accounts`);\n const data = await res.json();\n const accounts = Array.isArray(data) ? data : (data?.data ?? data?.accounts ?? []);\n return { accounts: accounts as Array<{\n id: string;\n providerId: string;\n accountId: string;\n createdAt?: string;\n updatedAt?: string;\n }> };\n },\n\n /**\n * Unlink a provider connection.\n * better-auth: POST /unlink-account — `{ providerId, accountId? }`.\n * `accountId` is required when the user has more than one account\n * for the same provider.\n */\n unlink: async (req: { providerId: string; accountId?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/unlink-account`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Link an additional social provider to the current user.\n * better-auth: POST /link-social — `{ provider, callbackURL }`. The\n * server returns a redirect URL; the caller should `window.location`\n * to it (mirroring `signInWithProvider`).\n */\n linkSocial: async (req: { provider: string; callbackURL?: string }): Promise<{ url?: string }> => {\n const route = this.getRoute('auth');\n const callbackURL = req.callbackURL\n ?? (typeof window !== 'undefined' ? window.location.href : undefined);\n const res = await this.fetch(`${this.baseUrl}${route}/link-social`, {\n method: 'POST',\n body: JSON.stringify({ provider: req.provider, callbackURL }),\n });\n const data = await res.json();\n return (data?.data ?? data) as { url?: string };\n },\n },\n };\n\n /**\n * Storage Services\n */\n storage = {\n upload: async (file: any, scope: string = 'user'): Promise<FileUploadResponse> => {\n // 1. Get Presigned URL\n const presignedReq: GetPresignedUrlRequest = {\n filename: file.name,\n mimeType: file.type,\n size: file.size,\n scope\n };\n \n const route = this.getRoute('storage');\n const presignedRes = await this.fetch(`${this.baseUrl}${route}/upload/presigned`, {\n method: 'POST',\n body: JSON.stringify(presignedReq)\n });\n const { data: presigned } = await presignedRes.json() as { data: PresignedUrlResponse['data'] };\n\n // 2. Upload to Cloud directly (Bypass API Middleware to avoid Auth headers if using S3)\n // Use fetchImpl directly\n const uploadRes = await this.fetchImpl(presigned.uploadUrl, {\n method: presigned.method,\n headers: presigned.headers,\n body: file\n });\n\n if (!uploadRes.ok) {\n throw new Error(`Storage Upload Failed: ${uploadRes.statusText}`);\n }\n\n // 3. Complete Upload\n const completeReq: CompleteUploadRequest = {\n fileId: presigned.fileId\n };\n const completeRes = await this.fetch(`${this.baseUrl}${route}/upload/complete`, {\n method: 'POST',\n body: JSON.stringify(completeReq)\n });\n \n return completeRes.json();\n },\n \n getDownloadUrl: async (fileId: string): Promise<string> => {\n const route = this.getRoute('storage');\n const res = await this.fetch(`${this.baseUrl}${route}/files/${fileId}/url`);\n const data = await res.json();\n return data.url;\n },\n\n /**\n * Get a presigned URL for direct-to-cloud upload\n */\n getPresignedUrl: async (req: GetPresignedUrlRequest): Promise<PresignedUrlResponse> => {\n const route = this.getRoute('storage');\n const res = await this.fetch(`${this.baseUrl}${route}/upload/presigned`, {\n method: 'POST',\n body: JSON.stringify(req)\n });\n return res.json();\n },\n\n /**\n * Initiate a chunked (multipart) upload session\n */\n initChunkedUpload: async (req: InitiateChunkedUploadRequest): Promise<InitiateChunkedUploadResponse> => {\n const route = this.getRoute('storage');\n const res = await this.fetch(`${this.baseUrl}${route}/upload/chunked`, {\n method: 'POST',\n body: JSON.stringify(req)\n });\n return res.json();\n },\n\n /**\n * Upload a single chunk/part of a multipart upload\n */\n uploadPart: async (uploadId: string, chunkIndex: number, resumeToken: string, data: Blob | Buffer): Promise<UploadChunkResponse> => {\n const route = this.getRoute('storage');\n const res = await this.fetch(`${this.baseUrl}${route}/upload/chunked/${uploadId}/chunk/${chunkIndex}`, {\n method: 'PUT',\n headers: { 'x-resume-token': resumeToken },\n body: data as any\n });\n return res.json();\n },\n\n /**\n * Complete a chunked upload by assembling all parts\n */\n completeChunkedUpload: async (req: CompleteChunkedUploadRequest): Promise<CompleteChunkedUploadResponse> => {\n const route = this.getRoute('storage');\n const res = await this.fetch(`${this.baseUrl}${route}/upload/chunked/${req.uploadId}/complete`, {\n method: 'POST',\n body: JSON.stringify(req)\n });\n return res.json();\n },\n\n /**\n * Resume an interrupted chunked upload.\n * Fetches current progress, then uploads remaining chunks and completes.\n */\n resumeUpload: async (uploadId: string, file: Blob | ArrayBuffer, chunkSize: number, resumeToken: string): Promise<CompleteChunkedUploadResponse> => {\n const route = this.getRoute('storage');\n\n // 1. Get current progress\n const progressRes = await this.fetch(`${this.baseUrl}${route}/upload/chunked/${uploadId}/progress`);\n const progress = await progressRes.json() as UploadProgress;\n\n const { totalChunks, uploadedChunks } = progress.data;\n const parts: Array<{ chunkIndex: number; eTag: string }> = [];\n\n // 2. Upload remaining chunks\n const fileBuffer = file instanceof ArrayBuffer ? file : await file.arrayBuffer();\n for (let i = uploadedChunks; i < totalChunks; i++) {\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, fileBuffer.byteLength);\n const chunk = new Blob([fileBuffer.slice(start, end)]);\n\n const chunkRes = await this.storage.uploadPart(uploadId, i, resumeToken, chunk);\n parts.push({ chunkIndex: i, eTag: chunkRes.data.eTag });\n }\n\n // 3. Complete\n return this.storage.completeChunkedUpload({ uploadId, parts });\n },\n };\n\n /**\n * Automation Services\n */\n automation = {\n /**\n * Trigger a named automation flow (legacy endpoint)\n */\n trigger: async (triggerName: string, payload: any) => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/trigger/${triggerName}`, {\n method: 'POST',\n body: JSON.stringify(payload)\n });\n return res.json();\n },\n\n /**\n * List all registered automation flows\n */\n list: async (): Promise<{ flows: string[]; total: number; hasMore: boolean }> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}`);\n return this.unwrapResponse(res);\n },\n\n /**\n * Get a flow definition by name\n */\n get: async (name: string): Promise<any> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${name}`);\n return this.unwrapResponse(res);\n },\n\n /**\n * Create (register) a new flow\n */\n create: async (name: string, definition: any): Promise<any> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}`, {\n method: 'POST',\n body: JSON.stringify({ name, ...definition }),\n });\n return this.unwrapResponse(res);\n },\n\n /**\n * Update an existing flow\n */\n update: async (name: string, definition: any): Promise<any> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${name}`, {\n method: 'PUT',\n body: JSON.stringify({ definition }),\n });\n return this.unwrapResponse(res);\n },\n\n /**\n * Delete (unregister) a flow\n */\n delete: async (name: string): Promise<{ name: string; deleted: boolean }> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${name}`, {\n method: 'DELETE',\n });\n return this.unwrapResponse(res);\n },\n\n /**\n * Enable or disable a flow\n */\n toggle: async (name: string, enabled: boolean): Promise<{ name: string; enabled: boolean }> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${name}/toggle`, {\n method: 'POST',\n body: JSON.stringify({ enabled }),\n });\n return this.unwrapResponse(res);\n },\n\n /**\n * Execution run history\n */\n runs: {\n /**\n * List execution runs for a flow\n */\n list: async (flowName: string, options?: { limit?: number; cursor?: string }): Promise<{ runs: any[]; hasMore: boolean }> => {\n const route = this.getRoute('automation');\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.cursor) params.set('cursor', options.cursor);\n const qs = params.toString();\n const res = await this.fetch(`${this.baseUrl}${route}/${flowName}/runs${qs ? `?${qs}` : ''}`);\n return this.unwrapResponse(res);\n },\n\n /**\n * Get a single execution run\n */\n get: async (flowName: string, runId: string): Promise<any> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${flowName}/runs/${runId}`);\n return this.unwrapResponse(res);\n },\n },\n\n /**\n * Flat aliases mirroring the ScopedProjectClient.automation surface so\n * Studio (and other consumers) can use the same call shape regardless of\n * whether they hold a scoped or unscoped client.\n */\n /** Alias for `automation.get` — fetch a flow definition by name. */\n getFlow: async <T = any>(name: string): Promise<T> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(name)}`);\n return this.unwrapResponse(res) as Promise<T>;\n },\n /** Execute (trigger) a flow with an execution context. */\n execute: async <T = any>(name: string, ctx?: Record<string, any>): Promise<T> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(name)}/trigger`, {\n method: 'POST',\n body: JSON.stringify(ctx ?? {}),\n });\n return this.unwrapResponse(res) as Promise<T>;\n },\n /** Alias for `automation.runs.list`. */\n listRuns: async <T = any>(\n flowName: string,\n opts?: { limit?: number; cursor?: string },\n ): Promise<T> => {\n const route = this.getRoute('automation');\n const params = new URLSearchParams();\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.cursor) params.set('cursor', opts.cursor);\n const qs = params.toString();\n const res = await this.fetch(\n `${this.baseUrl}${route}/${encodeURIComponent(flowName)}/runs${qs ? `?${qs}` : ''}`,\n );\n return this.unwrapResponse(res) as Promise<T>;\n },\n /** Alias for `automation.runs.get`. */\n getRun: async <T = any>(flowName: string, runId: string): Promise<T> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(\n `${this.baseUrl}${route}/${encodeURIComponent(flowName)}/runs/${encodeURIComponent(runId)}`,\n );\n return this.unwrapResponse(res) as Promise<T>;\n },\n };\n\n /**\n * Event Subscription API\n * Provides real-time event subscriptions for metadata and data changes\n */\n get events() {\n return this.realtimeAPI;\n }\n\n /**\n * Permissions Services\n */\n permissions = {\n /**\n * Check if current user has permission for an action on an object\n */\n check: async (request: CheckPermissionRequest): Promise<CheckPermissionResponse> => {\n const route = this.getRoute('permissions');\n const params = new URLSearchParams({ object: request.object, action: request.action });\n if (request.recordId !== undefined) params.set('recordId', request.recordId);\n if (request.field !== undefined) params.set('field', request.field);\n const res = await this.fetch(`${this.baseUrl}${route}/check?${params.toString()}`);\n return this.unwrapResponse<CheckPermissionResponse>(res);\n },\n\n /**\n * Get all permissions for a specific object\n */\n getObjectPermissions: async (object: string): Promise<GetObjectPermissionsResponse> => {\n const route = this.getRoute('permissions');\n const res = await this.fetch(`${this.baseUrl}${route}/objects/${encodeURIComponent(object)}`);\n return this.unwrapResponse<GetObjectPermissionsResponse>(res);\n },\n\n /**\n * Get effective permissions for the current user\n */\n getEffectivePermissions: async (): Promise<GetEffectivePermissionsResponse> => {\n const route = this.getRoute('permissions');\n const res = await this.fetch(`${this.baseUrl}${route}/effective`);\n return this.unwrapResponse<GetEffectivePermissionsResponse>(res);\n }\n };\n\n /**\n * Realtime Services\n */\n realtime = {\n /**\n * Establish a realtime connection\n */\n connect: async (request?: RealtimeConnectRequest): Promise<RealtimeConnectResponse> => {\n const route = this.getRoute('realtime');\n const res = await this.fetch(`${this.baseUrl}${route}/connect`, {\n method: 'POST',\n body: JSON.stringify(request || {})\n });\n return this.unwrapResponse<RealtimeConnectResponse>(res);\n },\n\n /**\n * Disconnect from realtime services\n */\n disconnect: async (): Promise<void> => {\n const route = this.getRoute('realtime');\n await this.fetch(`${this.baseUrl}${route}/disconnect`, {\n method: 'POST'\n });\n },\n\n /**\n * Subscribe to a channel\n */\n subscribe: async (request: RealtimeSubscribeRequest): Promise<RealtimeSubscribeResponse> => {\n const route = this.getRoute('realtime');\n const res = await this.fetch(`${this.baseUrl}${route}/subscribe`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<RealtimeSubscribeResponse>(res);\n },\n\n /**\n * Unsubscribe from a channel\n */\n unsubscribe: async (subscriptionId: string): Promise<void> => {\n const route = this.getRoute('realtime');\n await this.fetch(`${this.baseUrl}${route}/unsubscribe`, {\n method: 'POST',\n body: JSON.stringify({ subscriptionId })\n });\n },\n\n /**\n * Set presence state on a channel\n */\n setPresence: async (channel: string, state: SetPresenceRequest['state']): Promise<void> => {\n const route = this.getRoute('realtime');\n await this.fetch(`${this.baseUrl}${route}/presence`, {\n method: 'PUT',\n body: JSON.stringify({ channel, state })\n });\n },\n\n /**\n * Get presence information for a channel\n */\n getPresence: async (channel: string): Promise<GetPresenceResponse> => {\n const route = this.getRoute('realtime');\n const res = await this.fetch(`${this.baseUrl}${route}/presence/${encodeURIComponent(channel)}`);\n return this.unwrapResponse<GetPresenceResponse>(res);\n }\n };\n\n /**\n * Workflow Services\n */\n workflow = {\n /**\n * Get workflow configuration for an object\n */\n getConfig: async (object: string): Promise<GetWorkflowConfigResponse> => {\n const route = this.getRoute('workflow');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/config`);\n return this.unwrapResponse<GetWorkflowConfigResponse>(res);\n },\n\n /**\n * Get current workflow state for a record\n */\n getState: async (object: string, recordId: string): Promise<GetWorkflowStateResponse> => {\n const route = this.getRoute('workflow');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/state`);\n return this.unwrapResponse<GetWorkflowStateResponse>(res);\n },\n\n /**\n * Execute a workflow state transition\n */\n transition: async (request: WorkflowTransitionRequest): Promise<WorkflowTransitionResponse> => {\n const route = this.getRoute('workflow');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(request.object)}/${encodeURIComponent(request.recordId)}/transition`, {\n method: 'POST',\n body: JSON.stringify({\n transition: request.transition,\n comment: request.comment,\n data: request.data\n })\n });\n return this.unwrapResponse<WorkflowTransitionResponse>(res);\n },\n\n /**\n * Approve a workflow step\n */\n approve: async (request: WorkflowApproveRequest): Promise<WorkflowApproveResponse> => {\n const route = this.getRoute('workflow');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(request.object)}/${encodeURIComponent(request.recordId)}/approve`, {\n method: 'POST',\n body: JSON.stringify({\n comment: request.comment,\n data: request.data\n })\n });\n return this.unwrapResponse<WorkflowApproveResponse>(res);\n },\n\n /**\n * Reject a workflow step\n */\n reject: async (request: WorkflowRejectRequest): Promise<WorkflowRejectResponse> => {\n const route = this.getRoute('workflow');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(request.object)}/${encodeURIComponent(request.recordId)}/reject`, {\n method: 'POST',\n body: JSON.stringify({\n reason: request.reason,\n comment: request.comment\n })\n });\n return this.unwrapResponse<WorkflowRejectResponse>(res);\n }\n };\n\n /**\n * Views CRUD Services\n */\n views = {\n /**\n * List views for an object\n */\n list: async (object: string, type?: 'list' | 'form'): Promise<ListViewsResponse> => {\n const route = this.getRoute('views');\n const params = new URLSearchParams();\n if (type) params.set('type', type);\n const qs = params.toString();\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}${qs ? `?${qs}` : ''}`);\n return this.unwrapResponse<ListViewsResponse>(res);\n },\n\n /**\n * Get a specific view\n */\n get: async (object: string, viewId: string): Promise<GetViewResponse> => {\n const route = this.getRoute('views');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(viewId)}`);\n return this.unwrapResponse<GetViewResponse>(res);\n },\n\n /**\n * Create a new view\n */\n create: async (object: string, data: CreateViewRequest['data']): Promise<CreateViewResponse> => {\n const route = this.getRoute('views');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}`, {\n method: 'POST',\n body: JSON.stringify({ object, data })\n });\n return this.unwrapResponse<CreateViewResponse>(res);\n },\n\n /**\n * Update an existing view\n */\n update: async (object: string, viewId: string, data: UpdateViewRequest['data']): Promise<UpdateViewResponse> => {\n const route = this.getRoute('views');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(viewId)}`, {\n method: 'PUT',\n body: JSON.stringify({ object, viewId, data })\n });\n return this.unwrapResponse<UpdateViewResponse>(res);\n },\n\n /**\n * Delete a view\n */\n delete: async (object: string, viewId: string): Promise<DeleteViewResponse> => {\n const route = this.getRoute('views');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(viewId)}`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<DeleteViewResponse>(res);\n }\n };\n\n /**\n * Notification Services\n */\n notifications = {\n /**\n * Register a device for push notifications\n */\n registerDevice: async (request: RegisterDeviceRequest): Promise<RegisterDeviceResponse> => {\n const route = this.getRoute('notifications');\n const res = await this.fetch(`${this.baseUrl}${route}/devices`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<RegisterDeviceResponse>(res);\n },\n\n /**\n * Unregister a device from push notifications\n */\n unregisterDevice: async (deviceId: string): Promise<UnregisterDeviceResponse> => {\n const route = this.getRoute('notifications');\n const res = await this.fetch(`${this.baseUrl}${route}/devices/${encodeURIComponent(deviceId)}`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<UnregisterDeviceResponse>(res);\n },\n\n /**\n * Get notification preferences for the current user\n */\n getPreferences: async (): Promise<GetNotificationPreferencesResponse> => {\n const route = this.getRoute('notifications');\n const res = await this.fetch(`${this.baseUrl}${route}/preferences`);\n return this.unwrapResponse<GetNotificationPreferencesResponse>(res);\n },\n\n /**\n * Update notification preferences\n */\n updatePreferences: async (preferences: UpdateNotificationPreferencesRequest['preferences']): Promise<UpdateNotificationPreferencesResponse> => {\n const route = this.getRoute('notifications');\n const res = await this.fetch(`${this.baseUrl}${route}/preferences`, {\n method: 'PUT',\n body: JSON.stringify({ preferences })\n });\n return this.unwrapResponse<UpdateNotificationPreferencesResponse>(res);\n },\n\n /**\n * List notifications for the current user\n */\n list: async (options?: { read?: boolean; type?: string; limit?: number; cursor?: string }): Promise<ListNotificationsResponse> => {\n const route = this.getRoute('notifications');\n const params = new URLSearchParams();\n if (options?.read !== undefined) params.set('read', String(options.read));\n if (options?.type) params.set('type', options.type);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.cursor) params.set('cursor', options.cursor);\n const qs = params.toString();\n const res = await this.fetch(`${this.baseUrl}${route}${qs ? `?${qs}` : ''}`);\n return this.unwrapResponse<ListNotificationsResponse>(res);\n },\n\n /**\n * Mark specific notifications as read\n */\n markRead: async (ids: string[]): Promise<MarkNotificationsReadResponse> => {\n const route = this.getRoute('notifications');\n const res = await this.fetch(`${this.baseUrl}${route}/read`, {\n method: 'POST',\n body: JSON.stringify({ ids })\n });\n return this.unwrapResponse<MarkNotificationsReadResponse>(res);\n },\n\n /**\n * Mark all notifications as read\n */\n markAllRead: async (): Promise<MarkAllNotificationsReadResponse> => {\n const route = this.getRoute('notifications');\n const res = await this.fetch(`${this.baseUrl}${route}/read/all`, {\n method: 'POST'\n });\n return this.unwrapResponse<MarkAllNotificationsReadResponse>(res);\n }\n };\n\n /**\n * AI Services\n */\n ai = {\n /**\n * Natural language query — converts natural language to structured query\n */\n nlq: async (request: AiNlqRequest): Promise<AiNlqResponse> => {\n const route = this.getRoute('ai');\n const res = await this.fetch(`${this.baseUrl}${route}/nlq`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<AiNlqResponse>(res);\n },\n\n // AI chat method removed — use Vercel AI SDK `useChat()` / `@ai-sdk/react` directly.\n\n /**\n * AI-powered field value suggestions\n */\n suggest: async (request: AiSuggestRequest): Promise<AiSuggestResponse> => {\n const route = this.getRoute('ai');\n const res = await this.fetch(`${this.baseUrl}${route}/suggest`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<AiSuggestResponse>(res);\n },\n\n /**\n * AI-powered data insights\n */\n insights: async (request: AiInsightsRequest): Promise<AiInsightsResponse> => {\n const route = this.getRoute('ai');\n const res = await this.fetch(`${this.baseUrl}${route}/insights`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<AiInsightsResponse>(res);\n }\n };\n\n /**\n * Internationalization Services\n */\n i18n = {\n /**\n * Get available locales\n */\n getLocales: async (): Promise<GetLocalesResponse> => {\n const route = this.getRoute('i18n');\n const res = await this.fetch(`${this.baseUrl}${route}/locales`);\n return this.unwrapResponse<GetLocalesResponse>(res);\n },\n\n /**\n * Get translations for a locale\n */\n getTranslations: async (locale: string, options?: { namespace?: string; keys?: string[] }): Promise<GetTranslationsResponse> => {\n const route = this.getRoute('i18n');\n const params = new URLSearchParams();\n params.set('locale', locale);\n if (options?.namespace) params.set('namespace', options.namespace);\n if (options?.keys) params.set('keys', options.keys.join(','));\n const res = await this.fetch(`${this.baseUrl}${route}/translations?${params.toString()}`);\n return this.unwrapResponse<GetTranslationsResponse>(res);\n },\n\n /**\n * Get translated field labels for an object\n */\n getFieldLabels: async (object: string, locale: string): Promise<GetFieldLabelsResponse> => {\n const route = this.getRoute('i18n');\n const res = await this.fetch(`${this.baseUrl}${route}/labels/${encodeURIComponent(object)}?locale=${encodeURIComponent(locale)}`);\n return this.unwrapResponse<GetFieldLabelsResponse>(res);\n }\n };\n\n /**\n * Feed / Chatter Services\n *\n * Provides access to the activity timeline (comments, field changes, tasks),\n * emoji reactions, pin/star, search, changelog, and record subscriptions.\n * Base path: /api/data/{object}/{recordId}/feed\n */\n feed = {\n /**\n * List feed items for a record\n */\n list: async (object: string, recordId: string, options?: { type?: string; limit?: number; cursor?: string }): Promise<GetFeedResponse> => {\n const route = this.getRoute('data');\n const params = new URLSearchParams();\n if (options?.type) params.set('type', options.type);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.cursor) params.set('cursor', options.cursor);\n const qs = params.toString();\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed${qs ? `?${qs}` : ''}`);\n return this.unwrapResponse<GetFeedResponse>(res);\n },\n\n /**\n * Create a new feed item (comment, note, task, etc.)\n */\n create: async (object: string, recordId: string, data: { type: string; body?: string; mentions?: any[]; parentId?: string; visibility?: string }): Promise<CreateFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed`, {\n method: 'POST',\n body: JSON.stringify(data)\n });\n return this.unwrapResponse<CreateFeedItemResponse>(res);\n },\n\n /**\n * Update an existing feed item\n */\n update: async (object: string, recordId: string, feedId: string, data: { body?: string; mentions?: any[]; visibility?: string }): Promise<UpdateFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}`, {\n method: 'PUT',\n body: JSON.stringify(data)\n });\n return this.unwrapResponse<UpdateFeedItemResponse>(res);\n },\n\n /**\n * Delete a feed item\n */\n delete: async (object: string, recordId: string, feedId: string): Promise<DeleteFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<DeleteFeedItemResponse>(res);\n },\n\n /**\n * Add an emoji reaction to a feed item\n */\n addReaction: async (object: string, recordId: string, feedId: string, emoji: string): Promise<AddReactionResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}/reactions`, {\n method: 'POST',\n body: JSON.stringify({ emoji })\n });\n return this.unwrapResponse<AddReactionResponse>(res);\n },\n\n /**\n * Remove an emoji reaction from a feed item\n */\n removeReaction: async (object: string, recordId: string, feedId: string, emoji: string): Promise<RemoveReactionResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}/reactions/${encodeURIComponent(emoji)}`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<RemoveReactionResponse>(res);\n },\n\n /**\n * Pin a feed item to the top of the timeline\n */\n pin: async (object: string, recordId: string, feedId: string): Promise<PinFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}/pin`, {\n method: 'POST'\n });\n return this.unwrapResponse<PinFeedItemResponse>(res);\n },\n\n /**\n * Unpin a feed item\n */\n unpin: async (object: string, recordId: string, feedId: string): Promise<UnpinFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}/pin`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<UnpinFeedItemResponse>(res);\n },\n\n /**\n * Star (bookmark) a feed item\n */\n star: async (object: string, recordId: string, feedId: string): Promise<StarFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}/star`, {\n method: 'POST'\n });\n return this.unwrapResponse<StarFeedItemResponse>(res);\n },\n\n /**\n * Unstar a feed item\n */\n unstar: async (object: string, recordId: string, feedId: string): Promise<UnstarFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}/star`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<UnstarFeedItemResponse>(res);\n },\n\n /**\n * Search feed items\n */\n search: async (object: string, recordId: string, query: string, options?: { type?: string; actorId?: string; dateFrom?: string; dateTo?: string; limit?: number; cursor?: string }): Promise<SearchFeedResponse> => {\n const route = this.getRoute('data');\n const params = new URLSearchParams();\n params.set('query', query);\n if (options?.type) params.set('type', options.type);\n if (options?.actorId) params.set('actorId', options.actorId);\n if (options?.dateFrom) params.set('dateFrom', options.dateFrom);\n if (options?.dateTo) params.set('dateTo', options.dateTo);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.cursor) params.set('cursor', options.cursor);\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/search?${params.toString()}`);\n return this.unwrapResponse<SearchFeedResponse>(res);\n },\n\n /**\n * Get field-level changelog for a record\n */\n getChangelog: async (object: string, recordId: string, options?: { field?: string; actorId?: string; dateFrom?: string; dateTo?: string; limit?: number; cursor?: string }): Promise<GetChangelogResponse> => {\n const route = this.getRoute('data');\n const params = new URLSearchParams();\n if (options?.field) params.set('field', options.field);\n if (options?.actorId) params.set('actorId', options.actorId);\n if (options?.dateFrom) params.set('dateFrom', options.dateFrom);\n if (options?.dateTo) params.set('dateTo', options.dateTo);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.cursor) params.set('cursor', options.cursor);\n const qs = params.toString();\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/changelog${qs ? `?${qs}` : ''}`);\n return this.unwrapResponse<GetChangelogResponse>(res);\n },\n\n /**\n * Subscribe to record notifications\n */\n subscribe: async (object: string, recordId: string, options?: { events?: string[]; channels?: string[] }): Promise<SubscribeResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/subscribe`, {\n method: 'POST',\n body: JSON.stringify(options || {})\n });\n return this.unwrapResponse<SubscribeResponse>(res);\n },\n\n /**\n * Unsubscribe from record notifications\n */\n unsubscribe: async (object: string, recordId: string): Promise<UnsubscribeResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/subscribe`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<UnsubscribeResponse>(res);\n },\n };\n\n /**\n * Data Operations\n */\n data = {\n /**\n * Advanced Query using ObjectStack Query Protocol\n * Supports both simplified options and full AST\n */\n query: async <T = any>(object: string, query: Partial<QueryAST>): Promise<PaginatedResult<T>> => {\n const route = this.getRoute('data');\n // POST for complex query to avoid URL length limits and allow clean JSON AST\n // Convention: POST /api/v1/data/:object/query\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/query`, {\n method: 'POST',\n body: JSON.stringify(query)\n });\n return this.unwrapResponse<PaginatedResult<T>>(res);\n },\n\n /**\n * @deprecated Use `data.query()` with standard QueryAST parameters instead.\n * This method uses legacy parameter names. Internally adapts to HTTP GET params.\n */\n find: async <T = any>(object: string, options: QueryOptions | QueryOptionsV2 = {}): Promise<PaginatedResult<T>> => {\n const route = this.getRoute('data');\n const queryParams = new URLSearchParams();\n\n // ── Normalize V2 canonical options → HTTP transport params ───\n // Detect V2 options by presence of canonical-only keys.\n const v2 = options as QueryOptionsV2;\n const normalizedOptions: QueryOptions = {} as QueryOptions;\n if ('where' in options || 'fields' in options || 'orderBy' in options || 'offset' in options) {\n // V2 canonical options detected — map to legacy HTTP transport keys\n if (v2.where) normalizedOptions.filter = v2.where as any;\n if (v2.fields) normalizedOptions.select = v2.fields;\n if (v2.orderBy) normalizedOptions.sort = v2.orderBy as any;\n if (v2.limit != null) normalizedOptions.top = v2.limit;\n if (v2.offset != null) normalizedOptions.skip = v2.offset;\n if (v2.aggregations) normalizedOptions.aggregations = v2.aggregations;\n if (v2.groupBy) normalizedOptions.groupBy = v2.groupBy;\n } else {\n // Legacy QueryOptions — pass through as-is\n Object.assign(normalizedOptions, options);\n }\n\n // 1. Handle Pagination\n if (normalizedOptions.top) queryParams.set('top', normalizedOptions.top.toString());\n if (normalizedOptions.skip) queryParams.set('skip', normalizedOptions.skip.toString());\n\n // 2. Handle Sort\n if (normalizedOptions.sort) {\n // Check if it's AST \n if (Array.isArray(normalizedOptions.sort) && typeof normalizedOptions.sort[0] === 'object') {\n queryParams.set('sort', JSON.stringify(normalizedOptions.sort));\n } else {\n const sortVal = Array.isArray(normalizedOptions.sort) ? normalizedOptions.sort.join(',') : normalizedOptions.sort;\n queryParams.set('sort', sortVal as string);\n }\n }\n \n // 3. Handle Select\n if (normalizedOptions.select) {\n queryParams.set('select', normalizedOptions.select.join(','));\n }\n\n // 4. Handle Filters (Simple vs AST)\n // Canonical HTTP param name: `filter` (singular). `filters` (plural) is accepted\n // for backward compatibility but `filter` is the standard going forward.\n const filterValue = normalizedOptions.filter ?? normalizedOptions.filters;\n if (filterValue) {\n // Detect AST filter format vs simple key-value map. AST filters use an array structure\n // with [field, operator, value] or [logicOp, ...nodes] shape (see isFilterAST from spec).\n // For complex filter expressions, use .query() which builds a proper QueryAST.\n if (this.isFilterAST(filterValue) || Array.isArray(filterValue)) {\n // AST or any array → serialize as JSON in `filter` param\n queryParams.set('filter', JSON.stringify(filterValue));\n } else if (typeof filterValue === 'object' && filterValue !== null) {\n // Plain key-value map → append each as individual query params\n Object.entries(filterValue as Record<string, unknown>).forEach(([k, v]) => {\n if (v !== undefined && v !== null) {\n queryParams.append(k, String(v));\n }\n });\n }\n }\n \n // 5. Handle Aggregations & GroupBy (Pass through as JSON if present)\n if (normalizedOptions.aggregations) {\n queryParams.set('aggregations', JSON.stringify(normalizedOptions.aggregations));\n }\n if (normalizedOptions.groupBy) {\n queryParams.set('groupBy', normalizedOptions.groupBy.join(','));\n }\n\n const res = await this.fetch(`${this.baseUrl}${route}/${object}?${queryParams.toString()}`);\n return this.unwrapResponse<PaginatedResult<T>>(res);\n },\n\n get: async <T = any>(object: string, id: string): Promise<GetDataResult<T>> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/${id}`);\n return this.unwrapResponse<GetDataResult<T>>(res);\n },\n\n create: async <T = any>(object: string, data: Partial<T>): Promise<CreateDataResult<T>> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${object}`, {\n method: 'POST',\n body: JSON.stringify(data)\n });\n return this.unwrapResponse<CreateDataResult<T>>(res);\n },\n\n createMany: async <T = any>(object: string, data: Partial<T>[]): Promise<T[]> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/createMany`, {\n method: 'POST',\n body: JSON.stringify(data)\n });\n return this.unwrapResponse<T[]>(res);\n },\n\n update: async <T = any>(\n object: string,\n id: string,\n data: Partial<T>,\n opts?: { ifMatch?: string },\n ): Promise<UpdateDataResult<T>> => {\n const route = this.getRoute('data');\n const headers: Record<string, string> = {};\n // Optimistic Concurrency Control: when the caller passes\n // `opts.ifMatch` (typically the `updated_at` value they read), we\n // forward it as a standard `If-Match` header. The server returns\n // `409 CONCURRENT_UPDATE` if the record has been modified since.\n // See packages/objectql/src/protocol.ts ConcurrentUpdateError.\n if (opts?.ifMatch) headers['If-Match'] = String(opts.ifMatch);\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n ...(Object.keys(headers).length ? { headers } : {}),\n });\n return this.unwrapResponse<UpdateDataResult<T>>(res);\n },\n\n /**\n * Batch update multiple records\n * Uses the new BatchUpdateRequest schema with full control over options\n */\n batch: async (object: string, request: BatchUpdateRequest): Promise<BatchUpdateResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/batch`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<BatchUpdateResponse>(res);\n },\n\n /**\n * Update multiple records (simplified batch update)\n * Convenience method for batch updates without full BatchUpdateRequest\n */\n updateMany: async <T = any>(\n object: string, \n records: Array<{ id: string; data: Partial<T> }>,\n options?: BatchOptions\n ): Promise<BatchUpdateResponse> => {\n const route = this.getRoute('data');\n const request: UpdateManyRequest = {\n records,\n options\n };\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/updateMany`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<BatchUpdateResponse>(res);\n },\n\n delete: async (\n object: string,\n id: string,\n opts?: { ifMatch?: string },\n ): Promise<DeleteDataResult> => {\n const route = this.getRoute('data');\n const headers: Record<string, string> = {};\n // OCC: same opt-in protocol as `update`. See note there.\n if (opts?.ifMatch) headers['If-Match'] = String(opts.ifMatch);\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/${id}`, {\n method: 'DELETE',\n ...(Object.keys(headers).length ? { headers } : {}),\n });\n return this.unwrapResponse<DeleteDataResult>(res);\n },\n\n /**\n * Delete multiple records by IDs\n */\n deleteMany: async(object: string, ids: string[], options?: BatchOptions): Promise<BatchUpdateResponse> => {\n const route = this.getRoute('data');\n const request: DeleteManyRequest = {\n ids,\n options\n };\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/deleteMany`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<BatchUpdateResponse>(res);\n }\n };\n\n\n\n /**\n * Private Helpers\n */\n\n private isFilterAST(filter: any): boolean {\n // Delegate to the spec-exported structural validator instead of naive Array.isArray.\n // This checks for valid AST shapes: [field, op, val], [logic, ...nodes], or [[cond], ...].\n return isFilterAST(filter);\n }\n\n /**\n * Unwrap the standard REST API response envelope.\n * The HTTP layer wraps responses as `{ success: boolean, data: T, meta? }`\n * (see BaseResponseSchema in contract.zod.ts).\n * This method strips the envelope and returns the inner `data` payload\n * so callers receive the spec-level type (e.g. GetMetaTypesResponse).\n */\n private async unwrapResponse<T>(res: Response): Promise<T> {\n const body = await res.json();\n // If the body has a `success` flag it's a BaseResponse envelope\n if (body && typeof body.success === 'boolean' && 'data' in body) {\n return body.data as T;\n }\n // Already unwrapped or non-standard\n return body as T;\n }\n\n private async fetch(url: string, options: RequestInit = {}): Promise<Response> {\n this.logger.debug('HTTP request', { \n method: options.method || 'GET',\n url,\n hasBody: !!options.body\n });\n \n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string> || {}),\n };\n\n if (this.token) {\n headers['Authorization'] = `Bearer ${this.token}`;\n }\n\n if (this.environmentId) {\n headers['X-Environment-Id'] = this.environmentId;\n }\n\n // Carry the in-app locale so the server resolves metadata translations\n // for the chosen UI language. Don't clobber a caller-supplied header\n // (case-insensitive check — `headers` is spread from options above).\n if (this.locale && !Object.keys(headers).some((h) => h.toLowerCase() === 'accept-language')) {\n headers['Accept-Language'] = this.locale;\n }\n\n const res = await this.fetchImpl(url, { ...options, headers });\n \n this.logger.debug('HTTP response', { \n method: options.method || 'GET',\n url,\n status: res.status,\n ok: res.ok\n });\n \n if (!res.ok) {\n let errorBody: any;\n try {\n errorBody = await res.json();\n } catch {\n errorBody = { message: res.statusText };\n }\n \n this.logger.error('HTTP request failed', undefined, { \n method: options.method || 'GET',\n url,\n status: res.status,\n error: errorBody\n });\n \n // Create a standardized error if the response includes error details.\n //\n // Server may shape the body as any of:\n // { message: '...' }\n // { error: { code, message } }\n // { error: 'CODE: human readable' } ← plain-string variant (e.g. RECORD_LOCKED)\n // { error: '...' , code: '...' }\n // Without the plain-string branch we'd silently fall back to\n // `res.statusText` (\"Bad Request\") and hide the actual reason from\n // callers — which made debugging things like the approval lock\n // (\"RECORD_LOCKED: …\") needlessly painful.\n const errorMessage =\n errorBody?.message\n ?? errorBody?.error?.message\n ?? (typeof errorBody?.error === 'string' ? errorBody.error : undefined)\n ?? res.statusText;\n const errorCode = errorBody?.code || errorBody?.error?.code;\n const error = new Error(`[ObjectStack] ${errorCode ? `${errorCode}: ` : ''}${errorMessage}`) as any;\n \n // Attach error details for programmatic access\n error.code = errorCode;\n error.category = errorBody?.category;\n error.httpStatus = res.status;\n error.retryable = errorBody?.retryable;\n error.details = errorBody?.details || errorBody;\n \n throw error;\n }\n \n return res;\n }\n\n /**\n * Get the conventional route path for a given API endpoint type\n * ObjectStack uses standard conventions: /api/v1/data, /api/v1/meta, /api/v1/ui\n */\n private getRoute(type: ApiRouteType): string {\n // 1. Use discovered routes if available (only for ApiRoutes keys, not client-specific keys)\n const routes = this.discoveryInfo?.routes;\n if (routes) {\n const key = type as keyof ApiRoutes;\n const discovered = routes[key];\n if (discovered) return discovered;\n }\n\n // 2. Fallback to conventions (covers all ApiRoutes keys + client-specific virtual routes)\n const routeMap: Record<ApiRouteType, string> = {\n data: '/api/v1/data',\n metadata: '/api/v1/meta',\n discovery: '/api/v1/discovery',\n ui: '/api/v1/ui',\n auth: '/api/v1/auth',\n analytics: '/api/v1/analytics',\n storage: '/api/v1/storage',\n automation: '/api/v1/automation',\n packages: '/api/v1/packages',\n permissions: '/api/v1/permissions',\n realtime: '/api/v1/realtime',\n workflow: '/api/v1/workflow',\n views: '/api/v1/ui/views',\n notifications: '/api/v1/notifications',\n ai: '/api/v1/ai',\n i18n: '/api/v1/i18n',\n feed: '/api/v1/feed',\n graphql: '/graphql',\n };\n \n return routeMap[type] || `/api/v1/${type}`;\n }\n}\n\n/**\n * Project-scoped sub-client.\n *\n * Wraps an {@link ObjectStackClient} and prefixes every request with\n * `/api/v1/environments/:environmentId/...` so a single client instance can talk to\n * multiple projects without mutating global state.\n *\n * The scoped client exposes the same shape as the `data`, `meta`, `batch`,\n * and `packages` namespaces on `ObjectStackClient` — only the URL prefix\n * differs. The server-side dual-mode route registration (see\n * `packages/rest/src/rest-server.ts`) accepts both shapes when\n * `projectResolution` is `'auto'` or `'optional'`.\n */\nexport class ScopedProjectClient {\n private readonly parent: ObjectStackClient;\n private readonly environmentId: string;\n\n constructor(parent: ObjectStackClient, environmentId: string) {\n this.parent = parent;\n this.environmentId = environmentId;\n }\n\n /** The environmentId this client is scoped to. */\n getProjectId(): string { return this.environmentId; }\n\n /** Prefix segment inserted between the baseUrl and the resource path. */\n private scope(): string { return `/api/v1/environments/${encodeURIComponent(this.environmentId)}`; }\n\n private url(suffix: string): string {\n return `${this.parent._baseUrl()}${this.scope()}${suffix}`;\n }\n\n /**\n * Metadata operations scoped to this project.\n */\n meta = {\n getTypes: async (): Promise<GetMetaTypesResponse> => {\n const res = await this.parent._fetch(this.url('/meta'));\n return this.parent._unwrap<GetMetaTypesResponse>(res);\n },\n getItems: async (type: string, options?: { packageId?: string }): Promise<GetMetaItemsResponse> => {\n const params = new URLSearchParams();\n if (options?.packageId) params.set('package', options.packageId);\n const qs = params.toString();\n const res = await this.parent._fetch(this.url(`/meta/${type}${qs ? `?${qs}` : ''}`));\n return this.parent._unwrap<GetMetaItemsResponse>(res);\n },\n getItem: async (type: string, name: string, options?: { packageId?: string }) => {\n const params = new URLSearchParams();\n if (options?.packageId) params.set('package', options.packageId);\n const qs = params.toString();\n const res = await this.parent._fetch(this.url(`/meta/${type}/${name}${qs ? `?${qs}` : ''}`));\n return this.parent._unwrap(res);\n },\n saveItem: async (type: string, name: string, item: any) => {\n const res = await this.parent._fetch(this.url(`/meta/${type}/${name}`), {\n method: 'PUT',\n body: JSON.stringify(item),\n });\n return this.parent._unwrap(res);\n },\n deleteItem: async (type: string, name: string): Promise<{ type: string; name: string; deleted: boolean }> => {\n const res = await this.parent._fetch(this.url(`/meta/${encodeURIComponent(type)}/${encodeURIComponent(name)}`), {\n method: 'DELETE',\n });\n return this.parent._unwrap(res);\n },\n getHistory: async (\n type: string,\n name: string,\n options?: { sinceSeq?: number; limit?: number },\n ) => {\n const params = new URLSearchParams();\n if (options?.sinceSeq !== undefined) params.set('sinceSeq', String(options.sinceSeq));\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n const qs = params.toString();\n const res = await this.parent._fetch(\n this.url(`/meta/${encodeURIComponent(type)}/${encodeURIComponent(name)}/history${qs ? `?${qs}` : ''}`),\n );\n return this.parent._unwrap(res);\n },\n };\n\n /**\n * Data operations scoped to this project.\n *\n * Mirrors the query / find / get / create / update / delete / batch\n * surface on {@link ObjectStackClient}. URL construction differs only\n * in the prefix — query parameter serialization is identical.\n */\n data = {\n query: async <T = any>(object: string, query: Partial<QueryAST>): Promise<PaginatedResult<T>> => {\n const res = await this.parent._fetch(this.url(`/data/${object}/query`), {\n method: 'POST',\n body: JSON.stringify(query),\n });\n return this.parent._unwrap<PaginatedResult<T>>(res);\n },\n find: async <T = any>(object: string, options: QueryOptions | QueryOptionsV2 = {}): Promise<PaginatedResult<T>> => {\n const queryParams = new URLSearchParams();\n\n const v2 = options as QueryOptionsV2;\n const normalizedOptions: QueryOptions = {} as QueryOptions;\n if ('where' in options || 'fields' in options || 'orderBy' in options || 'offset' in options) {\n if (v2.where) normalizedOptions.filter = v2.where as any;\n if (v2.fields) normalizedOptions.select = v2.fields;\n if (v2.orderBy) normalizedOptions.sort = v2.orderBy as any;\n if (v2.limit != null) normalizedOptions.top = v2.limit;\n if (v2.offset != null) normalizedOptions.skip = v2.offset;\n if (v2.aggregations) normalizedOptions.aggregations = v2.aggregations;\n if (v2.groupBy) normalizedOptions.groupBy = v2.groupBy;\n } else {\n Object.assign(normalizedOptions, options);\n }\n\n if (normalizedOptions.top) queryParams.set('top', normalizedOptions.top.toString());\n if (normalizedOptions.skip) queryParams.set('skip', normalizedOptions.skip.toString());\n if (normalizedOptions.sort) {\n if (Array.isArray(normalizedOptions.sort) && typeof normalizedOptions.sort[0] === 'object') {\n queryParams.set('sort', JSON.stringify(normalizedOptions.sort));\n } else {\n const sortVal = Array.isArray(normalizedOptions.sort) ? normalizedOptions.sort.join(',') : normalizedOptions.sort;\n queryParams.set('sort', sortVal as string);\n }\n }\n if (normalizedOptions.select) {\n queryParams.set('select', normalizedOptions.select.join(','));\n }\n const filterValue = normalizedOptions.filter ?? normalizedOptions.filters;\n if (filterValue) {\n if (this.parent._isFilterAST(filterValue) || Array.isArray(filterValue)) {\n queryParams.set('filter', JSON.stringify(filterValue));\n } else if (typeof filterValue === 'object' && filterValue !== null) {\n Object.entries(filterValue as Record<string, unknown>).forEach(([k, v]) => {\n if (v !== undefined && v !== null) {\n queryParams.append(k, String(v));\n }\n });\n }\n }\n if (normalizedOptions.aggregations) {\n queryParams.set('aggregations', JSON.stringify(normalizedOptions.aggregations));\n }\n if (normalizedOptions.groupBy) {\n queryParams.set('groupBy', normalizedOptions.groupBy.join(','));\n }\n\n const qs = queryParams.toString();\n const res = await this.parent._fetch(this.url(`/data/${object}${qs ? `?${qs}` : ''}`));\n return this.parent._unwrap<PaginatedResult<T>>(res);\n },\n get: async <T = any>(object: string, id: string): Promise<GetDataResult<T>> => {\n const res = await this.parent._fetch(this.url(`/data/${object}/${id}`));\n return this.parent._unwrap<GetDataResult<T>>(res);\n },\n create: async <T = any>(object: string, data: Partial<T>): Promise<CreateDataResult<T>> => {\n const res = await this.parent._fetch(this.url(`/data/${object}`), {\n method: 'POST',\n body: JSON.stringify(data),\n });\n return this.parent._unwrap<CreateDataResult<T>>(res);\n },\n createMany: async <T = any>(object: string, data: Partial<T>[]): Promise<T[]> => {\n const res = await this.parent._fetch(this.url(`/data/${object}/createMany`), {\n method: 'POST',\n body: JSON.stringify(data),\n });\n return this.parent._unwrap<T[]>(res);\n },\n update: async <T = any>(object: string, id: string, data: Partial<T>): Promise<UpdateDataResult<T>> => {\n const res = await this.parent._fetch(this.url(`/data/${object}/${id}`), {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n return this.parent._unwrap<UpdateDataResult<T>>(res);\n },\n batch: async (object: string, request: BatchUpdateRequest): Promise<BatchUpdateResponse> => {\n const res = await this.parent._fetch(this.url(`/data/${object}/batch`), {\n method: 'POST',\n body: JSON.stringify(request),\n });\n return this.parent._unwrap<BatchUpdateResponse>(res);\n },\n updateMany: async <T = any>(\n object: string,\n records: Array<{ id: string; data: Partial<T> }>,\n options?: BatchOptions,\n ): Promise<BatchUpdateResponse> => {\n const request: UpdateManyRequest = { records, options };\n const res = await this.parent._fetch(this.url(`/data/${object}/updateMany`), {\n method: 'POST',\n body: JSON.stringify(request),\n });\n return this.parent._unwrap<BatchUpdateResponse>(res);\n },\n delete: async (object: string, id: string): Promise<DeleteDataResult> => {\n const res = await this.parent._fetch(this.url(`/data/${object}/${id}`), {\n method: 'DELETE',\n });\n return this.parent._unwrap<DeleteDataResult>(res);\n },\n deleteMany: async (object: string, ids: string[], options?: BatchOptions): Promise<BatchUpdateResponse> => {\n const request: DeleteManyRequest = { ids, options };\n const res = await this.parent._fetch(this.url(`/data/${object}/deleteMany`), {\n method: 'POST',\n body: JSON.stringify(request),\n });\n return this.parent._unwrap<BatchUpdateResponse>(res);\n },\n };\n\n /**\n * Package management scoped to this project.\n * Only the read-path is exposed here — publish / delete remain on the\n * global `client.packages` namespace for now, pending dedicated per-project\n * package tests.\n */\n packages = {\n list: async (): Promise<{ packages: any[]; total: number }> => {\n const res = await this.parent._fetch(this.url('/packages'));\n return this.parent._unwrap<{ packages: any[]; total: number }>(res);\n },\n get: async (id: string, version?: string) => {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n const res = await this.parent._fetch(this.url(`/packages/${encodeURIComponent(id)}${qs}`));\n return this.parent._unwrap<{ package: any }>(res);\n },\n };\n\n /**\n * Automation (Flow) operations scoped to this project.\n *\n * Thin wrapper around the dispatcher's automation routes, mounted under\n * `/api/v1/environments/:environmentId/automation/...`. Surface mirrors the methods\n * needed by Studio's Flow viewer: read flow definition, execute (trigger),\n * list runs, fetch a single run.\n */\n automation = {\n /** Fetch a flow definition by name. */\n getFlow: async <T = any>(name: string): Promise<T> => {\n const res = await this.parent._fetch(this.url(`/automation/${encodeURIComponent(name)}`));\n return this.parent._unwrap<T>(res);\n },\n /**\n * Execute (trigger) a flow by name. The request body is forwarded as the\n * automation execution context (e.g. `{ params, trigger }`).\n */\n execute: async <T = any>(name: string, ctx?: Record<string, any>): Promise<T> => {\n const res = await this.parent._fetch(this.url(`/automation/${encodeURIComponent(name)}/trigger`), {\n method: 'POST',\n body: JSON.stringify(ctx ?? {}),\n });\n return this.parent._unwrap<T>(res);\n },\n /** List recent runs for a flow. */\n listRuns: async <T = any>(\n flowName: string,\n opts?: { limit?: number; cursor?: string },\n ): Promise<T> => {\n const params = new URLSearchParams();\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.cursor) params.set('cursor', opts.cursor);\n const qs = params.toString();\n const res = await this.parent._fetch(\n this.url(`/automation/${encodeURIComponent(flowName)}/runs${qs ? `?${qs}` : ''}`),\n );\n return this.parent._unwrap<T>(res);\n },\n /** Fetch a single run (with step log) for a flow. */\n getRun: async <T = any>(flowName: string, runId: string): Promise<T> => {\n const res = await this.parent._fetch(\n this.url(`/automation/${encodeURIComponent(flowName)}/runs/${encodeURIComponent(runId)}`),\n );\n return this.parent._unwrap<T>(res);\n },\n };\n}\n\n// Re-export type-safe query builder\nexport { QueryBuilder, FilterBuilder, createQuery, createFilter } from './query-builder';\n\n// Re-export realtime API types\nexport { RealtimeAPI, RealtimeSubscriptionFilter, RealtimeEventHandler } from './realtime-api';\n\n// Re-export commonly used types from @objectstack/spec/api for convenience\nexport type {\n BatchUpdateRequest,\n BatchUpdateResponse,\n UpdateManyRequest,\n DeleteManyRequest,\n BatchOptions,\n BatchRecord,\n BatchOperationResult,\n MetadataCacheRequest,\n MetadataCacheResponse,\n StandardErrorCode,\n ErrorCategory,\n GetDiscoveryResponse,\n GetMetaTypesResponse,\n GetMetaItemsResponse,\n CheckPermissionRequest,\n CheckPermissionResponse,\n GetObjectPermissionsResponse,\n GetEffectivePermissionsResponse,\n RealtimeConnectRequest,\n RealtimeConnectResponse,\n RealtimeSubscribeRequest,\n RealtimeSubscribeResponse,\n GetPresenceResponse,\n GetWorkflowConfigResponse,\n GetWorkflowStateResponse,\n WorkflowTransitionRequest,\n WorkflowTransitionResponse,\n WorkflowApproveRequest,\n WorkflowApproveResponse,\n WorkflowRejectRequest,\n WorkflowRejectResponse,\n ListViewsResponse,\n GetViewResponse,\n CreateViewResponse,\n UpdateViewResponse,\n DeleteViewResponse,\n RegisterDeviceRequest,\n RegisterDeviceResponse,\n ListNotificationsResponse,\n AiNlqRequest,\n AiNlqResponse,\n AiSuggestRequest,\n AiSuggestResponse,\n AiInsightsRequest,\n AiInsightsResponse,\n GetLocalesResponse,\n GetTranslationsResponse,\n GetFieldLabelsResponse,\n RegisterRequest,\n RefreshTokenRequest,\n GetFeedResponse,\n CreateFeedItemResponse,\n UpdateFeedItemResponse,\n DeleteFeedItemResponse,\n AddReactionResponse,\n RemoveReactionResponse,\n PinFeedItemResponse,\n UnpinFeedItemResponse,\n StarFeedItemResponse,\n UnstarFeedItemResponse,\n SearchFeedResponse,\n GetChangelogResponse,\n SubscribeResponse,\n UnsubscribeResponse,\n WellKnownCapabilities,\n GetAuthConfigResponse,\n AuthProviderInfo,\n EmailPasswordConfigPublic,\n AuthFeaturesConfig,\n} from '@objectstack/spec/api';\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Realtime API Module for ObjectStackClient\n *\n * Provides real-time event subscription capabilities using long-polling.\n * For production WebSocket/SSE support, extend with transport adapters.\n */\n\nimport type { RealtimeEventPayload } from '@objectstack/spec/contracts';\nimport type { MetadataEvent, DataEvent } from '@objectstack/spec/api';\n\nexport interface RealtimeSubscriptionFilter {\n /** Metadata/object type filter */\n type?: string;\n /** Package ID filter */\n packageId?: string;\n /** Event types to listen for */\n eventTypes?: string[];\n /** Record ID filter (for data events) */\n recordId?: string;\n}\n\nexport type RealtimeEventHandler = (event: RealtimeEventPayload) => void;\n\n/**\n * Realtime API for subscribing to server events\n *\n * Note: Currently uses in-memory adapter. WebSocket/SSE transport planned for future.\n */\nexport class RealtimeAPI {\n // @ts-expect-error - Reserved for future WebSocket/SSE implementation\n private _baseUrl: string;\n // @ts-expect-error - Reserved for future WebSocket/SSE implementation\n private _token?: string;\n private subscriptions = new Map<string, {\n filter: RealtimeSubscriptionFilter;\n handler: RealtimeEventHandler;\n }>();\n private pollInterval?: ReturnType<typeof setInterval>;\n private eventBuffer: RealtimeEventPayload[] = [];\n\n constructor(baseUrl: string, token?: string) {\n this._baseUrl = baseUrl;\n this._token = token;\n }\n\n /**\n * Subscribe to metadata events\n * Returns an unsubscribe function\n */\n subscribeMetadata(\n type: string,\n callback: (event: MetadataEvent) => void,\n options?: { packageId?: string }\n ): () => void {\n const subscriptionId = `metadata-${type}-${Date.now()}`;\n\n this.subscriptions.set(subscriptionId, {\n filter: {\n type,\n packageId: options?.packageId,\n eventTypes: [\n `metadata.${type}.created`,\n `metadata.${type}.updated`,\n `metadata.${type}.deleted`\n ]\n },\n handler: (event) => {\n // Type guard and filter\n if (event.type.startsWith('metadata.')) {\n callback(event as any as MetadataEvent);\n }\n }\n });\n\n // Start polling if not already started\n this.startPolling();\n\n // Return unsubscribe function\n return () => {\n this.subscriptions.delete(subscriptionId);\n if (this.subscriptions.size === 0) {\n this.stopPolling();\n }\n };\n }\n\n /**\n * Subscribe to data record events\n * Returns an unsubscribe function\n */\n subscribeData(\n object: string,\n callback: (event: DataEvent) => void,\n options?: { recordId?: string }\n ): () => void {\n const subscriptionId = `data-${object}-${Date.now()}`;\n\n this.subscriptions.set(subscriptionId, {\n filter: {\n type: object,\n recordId: options?.recordId,\n eventTypes: [\n 'data.record.created',\n 'data.record.updated',\n 'data.record.deleted'\n ]\n },\n handler: (event) => {\n // Type guard and filter\n if (event.type.startsWith('data.') && event.object === object) {\n if (!options?.recordId || (event.payload as any)?.recordId === options.recordId) {\n callback(event as any as DataEvent);\n }\n }\n }\n });\n\n // Start polling if not already started\n this.startPolling();\n\n // Return unsubscribe function\n return () => {\n this.subscriptions.delete(subscriptionId);\n if (this.subscriptions.size === 0) {\n this.stopPolling();\n }\n };\n }\n\n /**\n * Emit an event to all matching subscriptions (client-side only)\n * This is used for in-process event delivery\n */\n private emitEvent(event: RealtimeEventPayload): void {\n for (const sub of this.subscriptions.values()) {\n // Check if event matches subscription filters\n const matchesType = !sub.filter.type ||\n event.type.includes(sub.filter.type) ||\n event.object === sub.filter.type;\n\n const matchesEventType = !sub.filter.eventTypes?.length ||\n sub.filter.eventTypes.includes(event.type);\n\n const matchesPackage = !sub.filter.packageId ||\n (event.payload as any)?.packageId === sub.filter.packageId;\n\n if (matchesType && matchesEventType && matchesPackage) {\n try {\n sub.handler(event);\n } catch (error) {\n console.error('Error in realtime event handler:', error);\n }\n }\n }\n }\n\n /**\n * Start polling for events (fallback mechanism)\n * In production, this would be replaced with WebSocket/SSE\n */\n private startPolling(): void {\n if (this.pollInterval) return;\n\n // For now, we rely on the in-memory adapter within the same process\n // Events are delivered synchronously via the IRealtimeService\n // This polling is a placeholder for future WebSocket/SSE implementation\n\n // Poll every 2 seconds for buffered events\n this.pollInterval = setInterval(() => {\n // Process any buffered events\n while (this.eventBuffer.length > 0) {\n const event = this.eventBuffer.shift();\n if (event) {\n this.emitEvent(event);\n }\n }\n }, 2000);\n }\n\n /**\n * Stop polling for events\n */\n private stopPolling(): void {\n if (this.pollInterval) {\n clearInterval(this.pollInterval);\n this.pollInterval = undefined;\n }\n }\n\n /**\n * Internal method to buffer events from server\n * This would be called by WebSocket/SSE handlers in production\n */\n _bufferEvent(event: RealtimeEventPayload): void {\n this.eventBuffer.push(event);\n }\n\n /**\n * Disconnect and clean up all subscriptions\n */\n disconnect(): void {\n this.stopPolling();\n this.subscriptions.clear();\n this.eventBuffer = [];\n }\n}\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Type-Safe Query Builder\n * \n * Provides a fluent API for building ObjectStack queries with:\n * - Compile-time type checking\n * - Intelligent code completion\n * - Runtime validation\n * - Type-safe filters and selections\n */\n\nimport { QueryAST, FilterCondition, SortNode } from '@objectstack/spec/data';\n\n/**\n * Type-safe filter builder\n */\nexport class FilterBuilder<T = any> {\n private conditions: FilterCondition[] = [];\n\n /**\n * Equality filter: field = value\n */\n equals<K extends keyof T>(field: K, value: T[K]): this {\n this.conditions.push([field as string, '=', value]);\n return this;\n }\n\n /**\n * Not equals filter: field != value\n */\n notEquals<K extends keyof T>(field: K, value: T[K]): this {\n this.conditions.push([field as string, '!=', value]);\n return this;\n }\n\n /**\n * Greater than filter: field > value\n */\n greaterThan<K extends keyof T>(field: K, value: T[K]): this {\n this.conditions.push([field as string, '>', value]);\n return this;\n }\n\n /**\n * Greater than or equal filter: field >= value\n */\n greaterThanOrEqual<K extends keyof T>(field: K, value: T[K]): this {\n this.conditions.push([field as string, '>=', value]);\n return this;\n }\n\n /**\n * Less than filter: field < value\n */\n lessThan<K extends keyof T>(field: K, value: T[K]): this {\n this.conditions.push([field as string, '<', value]);\n return this;\n }\n\n /**\n * Less than or equal filter: field <= value\n */\n lessThanOrEqual<K extends keyof T>(field: K, value: T[K]): this {\n this.conditions.push([field as string, '<=', value]);\n return this;\n }\n\n /**\n * IN filter: field IN (value1, value2, ...)\n */\n in<K extends keyof T>(field: K, values: T[K][]): this {\n this.conditions.push([field as string, 'in', values]);\n return this;\n }\n\n /**\n * NOT IN filter: field NOT IN (value1, value2, ...)\n */\n notIn<K extends keyof T>(field: K, values: T[K][]): this {\n this.conditions.push([field as string, 'not_in', values]);\n return this;\n }\n\n /**\n * LIKE filter: field LIKE pattern\n */\n like<K extends keyof T>(field: K, pattern: string): this {\n this.conditions.push([field as string, 'like', pattern]);\n return this;\n }\n\n /**\n * IS NULL filter: field IS NULL\n */\n isNull<K extends keyof T>(field: K): this {\n this.conditions.push([field as string, 'is_null', null]);\n return this;\n }\n\n /**\n * IS NOT NULL filter: field IS NOT NULL\n */\n isNotNull<K extends keyof T>(field: K): this {\n this.conditions.push([field as string, 'is_not_null', null]);\n return this;\n }\n\n /**\n * BETWEEN filter: field BETWEEN min AND max\n */\n between<K extends keyof T>(field: K, min: T[K], max: T[K]): this {\n this.conditions.push(['and', [field as string, '>=', min], [field as string, '<=', max]] as FilterCondition);\n return this;\n }\n\n /**\n * CONTAINS filter: field contains value (case-insensitive LIKE %value%)\n */\n contains<K extends keyof T>(field: K, value: string): this {\n this.conditions.push([field as string, 'like', `%${value}%`]);\n return this;\n }\n\n /**\n * STARTS WITH filter: field starts with value (LIKE value%)\n */\n startsWith<K extends keyof T>(field: K, value: string): this {\n this.conditions.push([field as string, 'like', `${value}%`]);\n return this;\n }\n\n /**\n * ENDS WITH filter: field ends with value (LIKE %value)\n */\n endsWith<K extends keyof T>(field: K, value: string): this {\n this.conditions.push([field as string, 'like', `%${value}`]);\n return this;\n }\n\n /**\n * EXISTS filter: field is not null (alias for isNotNull)\n */\n exists<K extends keyof T>(field: K): this {\n this.conditions.push([field as string, 'is_not_null', null]);\n return this;\n }\n\n /**\n * Build the filter condition\n */\n build(): FilterCondition {\n if (this.conditions.length === 0) {\n throw new Error('Filter builder has no conditions');\n }\n if (this.conditions.length === 1) {\n return this.conditions[0];\n }\n // Combine multiple conditions with AND\n return ['and', ...this.conditions];\n }\n\n /**\n * Get raw conditions array\n */\n getConditions(): FilterCondition[] {\n return this.conditions;\n }\n}\n\n/**\n * Type-safe query builder\n */\nexport class QueryBuilder<T = any> {\n private query: Partial<QueryAST> = {};\n private _object: string;\n\n constructor(object: string) {\n this._object = object;\n this.query.object = object;\n }\n\n /**\n * Select specific fields\n */\n select<K extends keyof T>(...fields: K[]): this {\n this.query.fields = fields as string[];\n return this;\n }\n\n /**\n * Add filters using a builder function\n */\n where(builderFn: (builder: FilterBuilder<T>) => void): this {\n const builder = new FilterBuilder<T>();\n builderFn(builder);\n const conditions = builder.getConditions();\n \n if (conditions.length === 1) {\n this.query.where = conditions[0];\n } else if (conditions.length > 1) {\n this.query.where = ['and', ...conditions] as FilterCondition;\n }\n \n return this;\n }\n\n /**\n * Add raw filter condition\n */\n filter(condition: FilterCondition): this {\n this.query.where = condition;\n return this;\n }\n\n /**\n * Sort by fields\n */\n orderBy<K extends keyof T>(field: K, order: 'asc' | 'desc' = 'asc'): this {\n if (!this.query.orderBy) {\n this.query.orderBy = [];\n }\n (this.query.orderBy as SortNode[]).push({\n field: field as string,\n order\n });\n return this;\n }\n\n /**\n * Limit the number of results\n */\n limit(count: number): this {\n this.query.limit = count;\n return this;\n }\n\n /**\n * Skip records (for pagination).\n * @deprecated Prefer `.offset()` for alignment with Spec canonical field names.\n */\n skip(count: number): this {\n this.query.offset = count;\n return this;\n }\n\n /**\n * Offset records (for pagination) — canonical alias for `.skip()`\n */\n offset(count: number): this {\n this.query.offset = count;\n return this;\n }\n\n /**\n * Paginate results\n */\n paginate(page: number, pageSize: number): this {\n this.query.limit = pageSize;\n this.query.offset = (page - 1) * pageSize;\n return this;\n }\n\n /**\n * Group by fields\n */\n groupBy<K extends keyof T>(...fields: K[]): this {\n this.query.groupBy = fields as string[];\n return this;\n }\n\n /**\n * Expand (eager-load) a related object with an optional sub-query\n */\n expand(relation: string, subQuery?: Partial<QueryAST>): this {\n if (!this.query.expand) {\n this.query.expand = {};\n }\n (this.query.expand as Record<string, any>)[relation] = subQuery || {};\n return this;\n }\n\n /**\n * Add full-text search\n */\n search(query: string, options?: { fields?: string[]; fuzzy?: boolean }): this {\n (this.query as any).search = { query, ...options };\n return this;\n }\n\n /**\n * Set cursor for keyset pagination\n */\n cursor(cursor: Record<string, any>): this {\n (this.query as any).cursor = cursor;\n return this;\n }\n\n /**\n * Enable SELECT DISTINCT\n */\n distinct(): this {\n (this.query as any).distinct = true;\n return this;\n }\n\n /**\n * Build the final query AST\n */\n build(): QueryAST {\n return {\n object: this._object,\n ...this.query\n } as QueryAST;\n }\n\n /**\n * Get the current query state\n */\n getQuery(): Partial<QueryAST> {\n return { ...this.query };\n }\n}\n\n/**\n * Create a type-safe query builder for an object\n */\nexport function createQuery<T = any>(object: string): QueryBuilder<T> {\n return new QueryBuilder<T>(object);\n}\n\n/**\n * Create a type-safe filter builder\n */\nexport function createFilter<T = any>(): FilterBuilder<T> {\n return new FilterBuilder<T>();\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/realtime-api.ts","../src/query-builder.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { QueryAST, SortNode, AggregationNode, isFilterAST } from '@objectstack/spec/data';\nimport {\n BatchUpdateRequest,\n BatchUpdateResponse,\n UpdateManyRequest,\n DeleteManyRequest,\n BatchOptions,\n MetadataCacheRequest,\n MetadataCacheResponse,\n StandardErrorCode,\n ErrorCategory,\n GetDiscoveryResponse,\n GetMetaTypesResponse,\n GetMetaItemsResponse,\n LoginRequest,\n SessionResponse,\n GetPresignedUrlRequest,\n PresignedUrlResponse,\n CompleteUploadRequest,\n FileUploadResponse,\n InitiateChunkedUploadRequest,\n InitiateChunkedUploadResponse,\n UploadChunkResponse,\n CompleteChunkedUploadRequest,\n CompleteChunkedUploadResponse,\n UploadProgress,\n CheckPermissionRequest,\n CheckPermissionResponse,\n GetObjectPermissionsResponse,\n GetEffectivePermissionsResponse,\n RealtimeConnectRequest,\n RealtimeConnectResponse,\n RealtimeSubscribeRequest,\n RealtimeSubscribeResponse,\n SetPresenceRequest,\n GetPresenceResponse,\n GetWorkflowConfigResponse,\n GetWorkflowStateResponse,\n WorkflowTransitionRequest,\n WorkflowTransitionResponse,\n ListViewsResponse,\n GetViewResponse,\n CreateViewRequest,\n CreateViewResponse,\n UpdateViewRequest,\n UpdateViewResponse,\n DeleteViewResponse,\n RegisterDeviceRequest,\n RegisterDeviceResponse,\n UnregisterDeviceResponse,\n GetNotificationPreferencesResponse,\n UpdateNotificationPreferencesRequest,\n UpdateNotificationPreferencesResponse,\n ListNotificationsResponse,\n MarkNotificationsReadResponse,\n MarkAllNotificationsReadResponse,\n AiNlqRequest,\n AiNlqResponse,\n AiSuggestRequest,\n AiSuggestResponse,\n AiInsightsRequest,\n AiInsightsResponse,\n GetLocalesResponse,\n GetTranslationsResponse,\n GetFieldLabelsResponse,\n RegisterRequest,\n GetFeedResponse,\n CreateFeedItemResponse,\n UpdateFeedItemResponse,\n DeleteFeedItemResponse,\n AddReactionResponse,\n RemoveReactionResponse,\n PinFeedItemResponse,\n UnpinFeedItemResponse,\n StarFeedItemResponse,\n UnstarFeedItemResponse,\n SearchFeedResponse,\n GetChangelogResponse,\n SubscribeResponse,\n UnsubscribeResponse,\n WellKnownCapabilities,\n ApiRoutes,\n} from '@objectstack/spec/api';\nimport type {\n ApprovalRequestRow,\n ApprovalActionRow,\n ApprovalStatus,\n ApprovalDecisionResult,\n} from '@objectstack/spec/contracts';\nimport { Logger, createLogger } from '@objectstack/core/logger';\nimport { RealtimeAPI } from './realtime-api';\n\n/**\n * Route types that the client can resolve.\n * Covers all keys from `ApiRoutes` (the discovery schema) plus\n * client-specific virtual routes (`views`, `permissions`).\n */\nexport type ApiRouteType = keyof ApiRoutes | 'views' | 'permissions';\n\nexport interface ClientConfig {\n baseUrl: string;\n token?: string;\n /**\n * Custom fetch implementation (e.g. node-fetch or for Next.js caching)\n */\n fetch?: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n /**\n * Logger instance for debugging\n */\n logger?: Logger;\n /**\n * Enable debug logging\n */\n debug?: boolean;\n /**\n * Active project id (UUID of `sys_environment`). When present, the\n * client injects an `X-Environment-Id` header on every request so the\n * server's tenant router can resolve the physical data-plane database.\n *\n * @see docs/adr/0002-project-database-isolation.md\n */\n environmentId?: string;\n /**\n * Active UI locale (BCP-47, e.g. `'zh-CN'`). When set, the client sends\n * it as an `Accept-Language` header on every request so the server\n * resolves metadata translations (object/field labels, view headers,\n * action text) for the *in-app* language rather than the browser default.\n *\n * Apps should keep this in sync with their language switcher via\n * {@link ObjectStackClient.setLocale} so switching language re-fetches\n * localized metadata without a page refresh (issue #1319).\n */\n locale?: string;\n}\n\n/**\n * Discovery Result\n * Re-export from @objectstack/spec/api for convenience\n */\nexport type DiscoveryResult = GetDiscoveryResponse;\n\n/**\n * @deprecated Use `data.query()` with standard QueryAST parameters instead.\n * This interface uses legacy parameter names (filter/sort/top/skip) that\n * require translation to QueryAST. Prefer QueryAST fields directly:\n * - filter → where\n * - select → fields\n * - sort → orderBy\n * - skip → offset\n * - top → limit\n */\nexport interface QueryOptions {\n select?: string[]; // Simplified Selection\n /** @canonical Preferred filter parameter (singular). */\n filter?: Record<string, any> | unknown[]; // Map or AST\n /** @deprecated Use `filter` (singular). Kept for backward compatibility. */\n filters?: Record<string, any> | unknown[]; // Map or AST\n sort?: string | string[] | SortNode[]; // 'name' or ['-created_at'] or AST\n top?: number;\n skip?: number;\n // Advanced features\n aggregations?: AggregationNode[];\n groupBy?: string[];\n}\n\n/**\n * Canonical query options using Spec protocol field names.\n * This is the recommended interface for `data.find()` queries.\n *\n * Canonical field mapping (QueryAST-aligned):\n * - `where` — filter conditions (replaces legacy `filter`/`filters`)\n * - `fields` — field selection (replaces legacy `select`)\n * - `orderBy` — sort definition (replaces legacy `sort`)\n * - `limit` — max records (replaces legacy `top`)\n * - `offset` — skip records (replaces legacy `skip`)\n * - `expand` — relation loading (replaces legacy `populate`)\n */\nexport interface QueryOptionsV2 {\n /** Filter conditions (WHERE clause). Accepts MongoDB-style $op object or FilterCondition AST. */\n where?: Record<string, any> | unknown[];\n /** Fields to retrieve (SELECT clause). */\n fields?: string[];\n /** Sort definition (ORDER BY clause). */\n orderBy?: string | string[] | SortNode[];\n /** Maximum number of records to return (LIMIT). */\n limit?: number;\n /** Number of records to skip (OFFSET). */\n offset?: number;\n /** Relations to expand (JOIN / eager-load). */\n expand?: Record<string, any> | string[];\n /** Aggregation functions. */\n aggregations?: AggregationNode[];\n /** Group by fields. */\n groupBy?: string[];\n}\n\nexport interface PaginatedResult<T = any> {\n /** Spec-compliant: array of matching records */\n records: T[];\n /** Total number of matching records (if requested) */\n total?: number;\n /** The object name */\n object?: string;\n /** Whether more records are available */\n hasMore?: boolean;\n}\n\n/** Spec: GetDataResponseSchema */\nexport interface GetDataResult<T = any> {\n object: string;\n id: string;\n record: T;\n}\n\n/** Spec: CreateDataResponseSchema */\nexport interface CreateDataResult<T = any> {\n object: string;\n id: string;\n record: T;\n}\n\n/** Spec: UpdateDataResponseSchema */\nexport interface UpdateDataResult<T = any> {\n object: string;\n id: string;\n record: T;\n}\n\n/** Spec: DeleteDataResponseSchema */\nexport interface DeleteDataResult {\n object: string;\n id: string;\n deleted: boolean;\n}\n\nexport interface StandardError {\n code: StandardErrorCode;\n message: string;\n category: ErrorCategory;\n httpStatus: number;\n retryable: boolean;\n details?: Record<string, any>;\n}\n\nexport class ObjectStackClient {\n private baseUrl: string;\n private token?: string;\n private environmentId?: string;\n private locale?: string;\n private fetchImpl: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n private discoveryInfo?: DiscoveryResult;\n private logger: Logger;\n private realtimeAPI: RealtimeAPI;\n\n constructor(config: ClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.token = config.token;\n this.environmentId = config.environmentId;\n this.locale = config.locale;\n this.fetchImpl = config.fetch || globalThis.fetch.bind(globalThis);\n\n // Initialize logger\n this.logger = config.logger || createLogger({\n level: config.debug ? 'debug' : 'info',\n format: 'pretty'\n });\n\n // Initialize realtime API\n this.realtimeAPI = new RealtimeAPI(this.baseUrl, this.token);\n\n this.logger.debug('ObjectStack client created', { baseUrl: this.baseUrl });\n }\n\n /**\n * Initialize the client by discovering server capabilities.\n */\n async connect() {\n this.logger.debug('Connecting to ObjectStack server', { baseUrl: this.baseUrl });\n\n try {\n let data: DiscoveryResult | undefined;\n\n // 1. Try Protocol-standard Discovery Path /api/v1/discovery (primary)\n try {\n const discoveryUrl = `${this.baseUrl}/api/v1/discovery`;\n this.logger.debug('Probing protocol-standard discovery endpoint', { url: discoveryUrl });\n const res = await this.fetchImpl(discoveryUrl);\n if (res.ok) {\n const body = await res.json();\n data = body.data || body;\n this.logger.debug('Discovered via /api/v1/discovery');\n }\n } catch (e) {\n this.logger.debug('Protocol-standard discovery probe failed', { error: (e as Error).message });\n }\n\n // 2. Fallback to Standard Discovery (.well-known)\n if (!data) {\n let wellKnownUrl: string;\n try {\n // If baseUrl is absolute, get origin\n const url = new URL(this.baseUrl);\n wellKnownUrl = `${url.origin}/.well-known/objectstack`;\n } catch {\n // If baseUrl is relative, use absolute path from root\n wellKnownUrl = '/.well-known/objectstack';\n }\n\n this.logger.debug('Falling back to .well-known discovery', { url: wellKnownUrl });\n const res = await this.fetchImpl(wellKnownUrl);\n if (!res.ok) {\n throw new Error(`Failed to connect to ${wellKnownUrl}: ${res.statusText}`);\n }\n const body = await res.json();\n data = body.data || body;\n }\n\n if (!data) {\n throw new Error('Connection failed: No discovery data returned');\n }\n\n this.discoveryInfo = data;\n\n this.logger.info('Connected to ObjectStack server', {\n version: data.version,\n apiName: data.apiName,\n services: data.services\n });\n\n return data as DiscoveryResult;\n } catch (e) {\n this.logger.error('Failed to connect to ObjectStack server', e as Error, { baseUrl: this.baseUrl });\n throw e;\n }\n }\n\n /**\n * Well-known capability flags discovered from the server.\n * Returns undefined if the client has not yet connected or the server\n * did not include capabilities in its discovery response.\n *\n * The server may return capabilities in hierarchical format\n * `{ key: { enabled: boolean } }` or flat boolean format `{ key: boolean }`.\n * This getter normalizes both to flat `WellKnownCapabilities`.\n */\n get capabilities(): WellKnownCapabilities | undefined {\n const raw = this.discoveryInfo?.capabilities;\n if (!raw) return undefined;\n // Normalize: hierarchical { enabled: boolean } → flat boolean\n const result: Record<string, boolean> = {};\n for (const [key, value] of Object.entries(raw)) {\n result[key] = typeof value === 'object' && value !== null ? !!(value as any).enabled : !!value;\n }\n return result as unknown as WellKnownCapabilities;\n }\n\n /**\n * Metadata Operations\n */\n meta = {\n /**\n * Get all available metadata types\n * Returns types like 'object', 'plugin', 'view', etc.\n */\n getTypes: async (): Promise<GetMetaTypesResponse> => {\n const route = this.getRoute('metadata');\n const res = await this.fetch(`${this.baseUrl}${route}`);\n return this.unwrapResponse<GetMetaTypesResponse>(res);\n },\n\n /**\n * Get all items of a specific metadata type\n * @param type - Metadata type name (e.g., 'object', 'plugin')\n * @param options - Optional filters (e.g., packageId to scope by package)\n */\n getItems: async (type: string, options?: { packageId?: string }): Promise<GetMetaItemsResponse> => {\n const route = this.getRoute('metadata');\n const params = new URLSearchParams();\n if (options?.packageId) params.set('package', options.packageId);\n const qs = params.toString();\n const url = `${this.baseUrl}${route}/${type}${qs ? `?${qs}` : ''}`;\n const res = await this.fetch(url);\n return this.unwrapResponse<GetMetaItemsResponse>(res);\n },\n\n /**\n * Get a specific metadata item by type and name\n * @param type - Metadata type (e.g., 'object', 'plugin')\n * @param name - Item name (snake_case identifier)\n * @param options - Optional filters (e.g., packageId to scope by package)\n */\n getItem: async (type: string, name: string, options?: { packageId?: string }) => {\n const route = this.getRoute('metadata');\n const params = new URLSearchParams();\n if (options?.packageId) params.set('package', options.packageId);\n const qs = params.toString();\n const url = `${this.baseUrl}${route}/${type}/${name}${qs ? `?${qs}` : ''}`;\n const res = await this.fetch(url);\n return this.unwrapResponse(res);\n },\n\n /**\n * Save a metadata item\n * @param type - Metadata type (e.g., 'object', 'plugin')\n * @param name - Item name\n * @param item - The metadata content to save\n */\n saveItem: async (type: string, name: string, item: any) => {\n const route = this.getRoute('metadata');\n const res = await this.fetch(`${this.baseUrl}${route}/${type}/${name}`, {\n method: 'PUT',\n body: JSON.stringify(item)\n });\n return this.unwrapResponse(res);\n },\n\n /**\n * Delete a metadata item\n * @param type - Metadata type (e.g., 'object', 'plugin')\n * @param name - Item name (snake_case identifier)\n */\n deleteItem: async (type: string, name: string): Promise<{ type: string; name: string; deleted: boolean }> => {\n const route = this.getRoute('metadata');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(type)}/${encodeURIComponent(name)}`, {\n method: 'DELETE',\n });\n return this.unwrapResponse(res);\n },\n\n /**\n * Get the durable change-log for a specific metadata item.\n * Returns events recorded in `sys_metadata_history` for every\n * overlay put/delete, ordered by `event_seq` ascending. Non-overlay\n * metadata types return an empty list.\n */\n getHistory: async (\n type: string,\n name: string,\n options?: { sinceSeq?: number; limit?: number },\n ): Promise<{ events: Array<{\n seq: number;\n op: string;\n ref: { org?: string; type: string; name: string };\n hash: string | null;\n parentHash: string | null;\n actor: string;\n message?: string;\n ts: string;\n source: string;\n }> }> => {\n const route = this.getRoute('metadata');\n const params = new URLSearchParams();\n if (options?.sinceSeq !== undefined) params.set('sinceSeq', String(options.sinceSeq));\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n const qs = params.toString();\n const url = `${this.baseUrl}${route}/${encodeURIComponent(type)}/${encodeURIComponent(name)}/history${qs ? `?${qs}` : ''}`;\n const res = await this.fetch(url);\n return this.unwrapResponse(res);\n },\n \n /**\n * Get object metadata with cache support\n * Supports ETag-based conditional requests for efficient caching\n */\n getCached: async (name: string, cacheOptions?: MetadataCacheRequest): Promise<MetadataCacheResponse> => {\n const route = this.getRoute('metadata');\n const headers: Record<string, string> = {};\n \n if (cacheOptions?.ifNoneMatch) {\n headers['If-None-Match'] = cacheOptions.ifNoneMatch;\n }\n if (cacheOptions?.ifModifiedSince) {\n headers['If-Modified-Since'] = cacheOptions.ifModifiedSince;\n }\n \n const res = await this.fetch(`${this.baseUrl}${route}/object/${name}`, {\n headers\n });\n \n // Check for 304 Not Modified\n if (res.status === 304) {\n return {\n notModified: true,\n etag: cacheOptions?.ifNoneMatch ? { \n value: cacheOptions.ifNoneMatch.replace(/^W\\/|\"/g, ''),\n weak: cacheOptions.ifNoneMatch.startsWith('W/')\n } : undefined\n };\n }\n \n const data = await res.json();\n const etag = res.headers.get('ETag');\n const lastModified = res.headers.get('Last-Modified');\n \n return {\n data,\n etag: etag ? { \n value: etag.replace(/^W\\/|\"/g, ''), \n weak: etag.startsWith('W/') \n } : undefined,\n lastModified: lastModified || undefined,\n notModified: false\n };\n },\n \n getView: async (object: string, type: 'list' | 'form' = 'list') => {\n const route = this.getRoute('ui');\n const res = await this.fetch(`${this.baseUrl}${route}/view/${object}?type=${type}`);\n return this.unwrapResponse(res);\n }\n };\n\n /**\n * Analytics Services\n */\n analytics = {\n query: async (payload: any) => {\n const route = this.getRoute('analytics');\n const res = await this.fetch(`${this.baseUrl}${route}/query`, {\n method: 'POST',\n body: JSON.stringify(payload)\n });\n return res.json();\n },\n meta: async (cube: string) => {\n const route = this.getRoute('analytics');\n const res = await this.fetch(`${this.baseUrl}${route}/meta/${cube}`);\n return res.json();\n },\n explain: async (payload: any) => {\n const route = this.getRoute('analytics');\n const res = await this.fetch(`${this.baseUrl}${route}/explain`, {\n method: 'POST',\n body: JSON.stringify(payload)\n });\n return res.json();\n }\n };\n\n /**\n * Package Management Services\n * \n * Manages the lifecycle of installed packages.\n * A package (ManifestSchema) is the unit of installation.\n * An app (AppSchema) is a UI navigation definition within a package.\n * A package may contain 0, 1, or many apps, or be a pure functionality plugin.\n * \n * Endpoints:\n * - GET /packages → list installed packages\n * - GET /packages/:id → get package details \n * - POST /packages → install a package\n * - DELETE /packages/:id → uninstall a package\n * - PATCH /packages/:id/enable → enable a package\n * - PATCH /packages/:id/disable → disable a package\n */\n packages = {\n /**\n * List all installed packages with optional filters.\n */\n list: async (filters?: { status?: string; type?: string; enabled?: boolean }) => {\n const route = this.getRoute('packages');\n const params = new URLSearchParams();\n if (filters?.status) params.set('status', filters.status);\n if (filters?.type) params.set('type', filters.type);\n if (filters?.enabled !== undefined) params.set('enabled', String(filters.enabled));\n const qs = params.toString();\n const url = `${this.baseUrl}${route}${qs ? '?' + qs : ''}`;\n const res = await this.fetch(url);\n return this.unwrapResponse<{ packages: any[]; total: number }>(res);\n },\n\n /**\n * Get a specific installed package by its ID (reverse domain identifier).\n */\n get: async (id: string) => {\n const route = this.getRoute('packages');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(id)}`);\n return this.unwrapResponse<{ package: any }>(res);\n },\n\n /**\n * Install a new package from its manifest.\n */\n install: async (manifest: any, options?: { settings?: Record<string, any>; enableOnInstall?: boolean }) => {\n const route = this.getRoute('packages');\n const res = await this.fetch(`${this.baseUrl}${route}`, {\n method: 'POST',\n body: JSON.stringify({\n manifest,\n settings: options?.settings,\n enableOnInstall: options?.enableOnInstall,\n }),\n });\n return this.unwrapResponse<{ package: any; message?: string }>(res);\n },\n\n /**\n * Uninstall a package by its ID.\n */\n uninstall: async (id: string) => {\n const route = this.getRoute('packages');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n });\n return this.unwrapResponse<{ id: string; success: boolean; message?: string }>(res);\n },\n\n /**\n * Enable a disabled package.\n */\n enable: async (id: string) => {\n const route = this.getRoute('packages');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(id)}/enable`, {\n method: 'PATCH',\n });\n return this.unwrapResponse<{ package: any; message?: string }>(res);\n },\n\n /**\n * Disable an installed package.\n */\n disable: async (id: string) => {\n const route = this.getRoute('packages');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(id)}/disable`, {\n method: 'PATCH',\n });\n return this.unwrapResponse<{ package: any; message?: string }>(res);\n },\n };\n\n /**\n * Environment Management Services\n *\n * Environments are the v4.1+ isolation primitive — each project owns a\n * physically separate data-plane database. All Studio-level switching goes\n * through this API.\n *\n * Endpoints:\n * - GET /api/v1/cloud/environments → list environments\n * - GET /api/v1/cloud/environments/:id → get one (with database info)\n * - POST /api/v1/cloud/environments → provision a new project\n * - PATCH /api/v1/cloud/environments/:id → update (displayName, plan, status, …)\n * - POST /api/v1/cloud/environments/:id/activate → set as session's active project\n * - POST /api/v1/cloud/environments/:id/credentials/rotate → rotate credential\n *\n * @see docs/adr/0002-project-database-isolation.md\n */\n projects = {\n /**\n * List environments visible to the current session. Optionally filter\n * by organization (control-plane query — not routed through a data-plane DB).\n */\n list: async (filters?: { organization_id?: string; env_type?: string; status?: string }) => {\n const params = new URLSearchParams();\n if (filters?.organization_id) params.set('organizationId', filters.organization_id);\n if (filters?.env_type) params.set('envType', filters.env_type);\n if (filters?.status) params.set('status', filters.status);\n const qs = params.toString();\n const url = `${this.baseUrl}/api/v1/cloud/environments${qs ? '?' + qs : ''}`;\n const res = await this.fetch(url);\n return this.unwrapResponse<{ projects: any[]; total: number }>(res);\n },\n\n /**\n * Get a single project (joined with its database and membership row).\n */\n get: async (id: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}`);\n return this.unwrapResponse<{\n project: any;\n database?: any;\n credential?: any;\n membership?: any;\n organization?: any;\n }>(res);\n },\n\n /**\n * Provision a new project. Delegates to\n * `ProjectProvisioningService.provisionProject` on the server.\n */\n create: async (req: {\n organization_id: string;\n slug?: string;\n display_name: string;\n env_type?: string;\n project_type?: string;\n plan?: string;\n region?: string;\n driver?: string;\n is_default?: boolean;\n is_system?: boolean;\n storage_limit_mb?: number;\n clone_from_environment_id?: string;\n template_id?: string;\n metadata?: Record<string, unknown>;\n }) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return this.unwrapResponse<{ project: any; database: any }>(res);\n },\n\n /**\n * Update a project (display_name, plan, status, is_default, metadata).\n */\n update: async (id: string, patch: Record<string, unknown>) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(patch),\n });\n return this.unwrapResponse<{ project: any }>(res);\n },\n\n /**\n * Cascade-delete a project: cleans up credential/member/package_installation\n * rows, releases the physical database via the provisioning adapter, and\n * removes the `sys_environment` row. Default projects require `force: true`.\n */\n delete: async (id: string, opts?: { force?: boolean }) => {\n const qs = opts?.force ? '?force=1' : '';\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}${qs}`,\n { method: 'DELETE' },\n );\n return this.unwrapResponse<{ deleted: boolean; environmentId: string; warnings: string[] }>(res);\n },\n\n /**\n * Activate this project for the current session. The server writes\n * `active_environment_id` on the better-auth session; subsequent requests\n * are routed to this project's database.\n */\n activate: async (id: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/activate`, {\n method: 'POST',\n });\n return this.unwrapResponse<{ project: any; sessionUpdated: boolean }>(res);\n },\n\n /**\n * Rotate the active database credential for this project.\n */\n rotateCredential: async (id: string, plaintext: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/credentials/rotate`, {\n method: 'POST',\n body: JSON.stringify({ plaintext }),\n });\n return this.unwrapResponse<{ credential: any }>(res);\n },\n\n /**\n * Update the hostname bound to this project. Validates format and\n * uniqueness server-side; invalidates the dispatcher's routing cache.\n */\n updateHostname: async (id: string, hostname: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/hostname`, {\n method: 'POST',\n body: JSON.stringify({ hostname }),\n });\n return this.unwrapResponse<{ project: any }>(res);\n },\n\n /**\n * Update the visibility of this project ('private' | 'public').\n * `private` (default) hides the project from /pub/v1 enumeration but\n * still allows anonymous artifact downloads when the URL includes an\n * exact `?commit=<id>` (share-by-link). `public` lists the project and\n * freely exposes all revisions.\n */\n updateVisibility: async (id: string, visibility: 'private' | 'public') => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify({ visibility }),\n });\n return this.unwrapResponse<{ project: any }>(res);\n },\n\n /**\n * List published artifact revisions for a project. Each revision has\n * an immutable commitId (content-addressable) and storage_key.\n * Optional `branch` filter narrows to a single logical branch\n * (default branch `main` also matches rows with NULL `branch`).\n */\n listRevisions: async (id: string, opts?: { limit?: number; cursor?: string; branch?: string }) => {\n const params = new URLSearchParams();\n if (opts?.limit) params.set('limit', String(opts.limit));\n if (opts?.cursor) params.set('cursor', opts.cursor);\n if (opts?.branch) params.set('branch', opts.branch);\n const qs = params.toString();\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/revisions${qs ? `?${qs}` : ''}`,\n );\n return this.unwrapResponse<{\n items: Array<{\n commitId: string;\n checksum: string;\n storageKey: string;\n sizeBytes: number;\n builtAt: string;\n publishedAt: string;\n publishedBy: string | null;\n note: string | null;\n isCurrent: boolean;\n branch: string;\n isBranchHead: boolean;\n }>;\n nextCursor: string | null;\n branch: string | null;\n }>(res);\n },\n\n /**\n * List logical branches for a project. Each branch has a head commit\n * (latest published revision on that branch) and a count of revisions.\n * Branches without a head row (e.g. all rows demoted) are omitted.\n */\n listBranches: async (id: string) => {\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/branches`,\n );\n return this.unwrapResponse<{\n environmentId: string;\n branches: Array<{\n branch: string;\n headCommitId: string;\n headRevisionId: string;\n revisionCount: number;\n headPublishedAt: string | null;\n headNote: string | null;\n isCurrent: boolean;\n }>;\n }>(res);\n },\n\n /**\n * Rename a branch. Updates every revision row in `from` to `to`.\n * 409 if `to` already has rows.\n */\n renameBranch: async (id: string, from: string, to: string) => {\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/branches/${encodeURIComponent(from)}/rename`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ newName: to }),\n },\n );\n return this.unwrapResponse<{ environmentId: string; from: string; to: string; renamed: number }>(res);\n },\n\n /**\n * Delete (demote) a branch. Soft-removal — clears `is_branch_head` on\n * every row in this branch; the revisions themselves remain. The\n * `main` branch and any branch carrying the active revision cannot be\n * deleted.\n */\n deleteBranch: async (id: string, name: string) => {\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/branches/${encodeURIComponent(name)}`,\n { method: 'DELETE' },\n );\n return this.unwrapResponse<{ environmentId: string; branch: string; demoted: number; totalRevisions: number }>(res);\n },\n\n /**\n * Activate (rollback to) a previously-published revision by commit id.\n * Marks the target revision is_current=true and demotes the prior one.\n */\n activateRevision: async (id: string, commitId: string) => {\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/revisions/${encodeURIComponent(commitId)}/activate`,\n { method: 'POST' },\n );\n return this.unwrapResponse<{ environmentId: string; commitId: string; activated: boolean; previousCommitId: string | null }>(res);\n },\n\n /**\n * Retry provisioning for a project stuck in `failed` (or\n * `provisioning`) state. The server re-runs the driver handshake; on\n * success the project flips to `active`, on failure it stays\n * `failed` with `metadata.provisioningError` updated.\n */\n retryProvisioning: async (id: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/retry`, {\n method: 'POST',\n });\n return this.unwrapResponse<{ project: any }>(res);\n },\n\n /**\n * List members of a project (per-project RBAC).\n */\n listMembers: async (id: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/members`);\n return this.unwrapResponse<{ members: any[] }>(res);\n },\n\n /**\n * Invite a member to a project. Caller must be `owner` or `admin`.\n * Pass either `email` (resolved against the user table) or `user_id`.\n * Returns `{ member, alreadyMember }` — `alreadyMember=true` means the\n * row already existed; the call is idempotent.\n */\n addMember: async (\n id: string,\n payload: { email?: string; user_id?: string; role?: 'owner' | 'admin' | 'member' | 'viewer' },\n ) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/members`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n });\n return this.unwrapResponse<{ member: any; alreadyMember: boolean }>(res);\n },\n\n /**\n * Update a member's role. Caller must be `owner` or `admin`. Demoting\n * the last `owner` returns 409.\n */\n updateMemberRole: async (\n id: string,\n memberId: string,\n role: 'owner' | 'admin' | 'member' | 'viewer',\n ) => {\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`,\n {\n method: 'PATCH',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ role }),\n },\n );\n return this.unwrapResponse<{ member: any }>(res);\n },\n\n /**\n * Remove a member. Owners/admins may remove anyone; non-privileged\n * users may only remove themselves. Removing the last `owner` returns 409.\n */\n removeMember: async (id: string, memberId: string) => {\n const res = await this.fetch(\n `${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(id)}/members/${encodeURIComponent(memberId)}`,\n { method: 'DELETE' },\n );\n return this.unwrapResponse<{ removed: boolean; memberId: string }>(res);\n },\n\n /**\n * List ObjectQL drivers registered on the server. Useful for populating a\n * driver selector when provisioning a new project (memory / turso /\n * future sql drivers). Returned `name` is the short alias (e.g. `memory`,\n * `turso`); `driverId` is the full FQN (e.g. `com.objectstack.driver.memory`).\n */\n listDrivers: async () => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/drivers`);\n return this.unwrapResponse<{ drivers: Array<{ name: string; driverId: string }>; total: number }>(res);\n },\n\n /**\n * List available project templates. Templates are seeded into the project\n * database once at provisioning time when `template_id` is supplied.\n */\n listTemplates: async () => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/templates`);\n return this.unwrapResponse<{ templates: Array<{ id: string; label: string; description: string; category?: string }>; total: number }>(res);\n },\n\n /**\n * Per-project package installation management (Power Apps \"solution\" model).\n * Install records are stored in the environment's own database.\n */\n packages: {\n /** List all packages installed in a specific project. */\n list: async (envId: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages`);\n return this.unwrapResponse<{ packages: any[]; total: number }>(res);\n },\n\n /** Install a package into the project. */\n install: async (envId: string, body: {\n packageId: string;\n version?: string;\n settings?: Record<string, unknown>;\n enableOnInstall?: boolean;\n }) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n return this.unwrapResponse<{ package: any }>(res);\n },\n\n /** Get a single installation record. */\n get: async (envId: string, pkgId: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages/${encodeURIComponent(pkgId)}`);\n return this.unwrapResponse<{ package: any }>(res);\n },\n\n /** Enable a previously disabled package. */\n enable: async (envId: string, pkgId: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages/${encodeURIComponent(pkgId)}/enable`, {\n method: 'PATCH',\n });\n return this.unwrapResponse<{ package: any }>(res);\n },\n\n /** Disable an installed package (metadata will not be loaded). */\n disable: async (envId: string, pkgId: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages/${encodeURIComponent(pkgId)}/disable`, {\n method: 'PATCH',\n });\n return this.unwrapResponse<{ package: any }>(res);\n },\n\n /** Uninstall a package from the project. Forbidden for scope=platform packages. */\n uninstall: async (envId: string, pkgId: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages/${encodeURIComponent(pkgId)}`, {\n method: 'DELETE',\n });\n return this.unwrapResponse<{ id: string; success: boolean }>(res);\n },\n\n /** Upgrade an installed package to a newer version. */\n upgrade: async (envId: string, pkgId: string, targetVersion?: string) => {\n const res = await this.fetch(`${this.baseUrl}/api/v1/cloud/environments/${encodeURIComponent(envId)}/packages/${encodeURIComponent(pkgId)}/upgrade`, {\n method: 'POST',\n body: JSON.stringify({ targetVersion }),\n });\n return this.unwrapResponse<{ package: any }>(res);\n },\n },\n };\n\n /**\n * Project-scoped client factory.\n *\n * Returns a thin wrapper around the data / meta / packages namespaces that\n * prefixes every request with `/api/v1/environments/:environmentId/...`. Use this\n * when the server has `enableProjectScoping: true` in its REST API config.\n *\n * Backward compatibility: `client.data.*`, `client.meta.*`, and\n * `client.packages.*` continue to work unchanged; they hit unscoped routes\n * and rely on hostname / `X-Environment-Id` header / session resolution.\n *\n * @example\n * ```ts\n * const scoped = client.project('00000000-0000-0000-0000-000000000001');\n * const tasks = await scoped.data.find('task', { top: 10 });\n * const objects = await scoped.meta.getItems('object');\n * ```\n */\n project(environmentId: string): ScopedProjectClient {\n if (!environmentId) {\n throw new Error('[ObjectStack] project(id): environmentId is required');\n }\n return new ScopedProjectClient(this, environmentId);\n }\n\n // ── Internal accessors exposed to ScopedProjectClient ────────────────\n // The scoped client lives in the same module so using module-level access\n // works; TypeScript requires these to be accessible, so we expose them via\n // small protected getters that keep the public surface unchanged.\n /** @internal */\n _baseUrl(): string { return this.baseUrl; }\n /** @internal */\n _fetch(url: string, init?: RequestInit): Promise<Response> {\n return this.fetch(url, init);\n }\n /** @internal */\n _unwrap<T>(res: Response): Promise<T> { return this.unwrapResponse<T>(res); }\n /** @internal */\n _isFilterAST(v: unknown): boolean { return this.isFilterAST(v); }\n\n /**\n * Organization Services\n *\n * Thin wrapper around better-auth's organization plugin endpoints, which\n * are mounted under `/api/v1/auth/organization/**`. Used by the Studio\n * OrganizationSwitcher and the /orgs management routes.\n */\n organizations = {\n /**\n * List organizations the current user belongs to.\n * GET /api/v1/auth/organization/list\n */\n list: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/list`);\n const data = await res.json();\n // better-auth returns the array directly, sometimes wrapped in { data }.\n const orgs = Array.isArray(data) ? data : (data?.data ?? []);\n return { organizations: orgs as Array<{ id: string; name: string; slug?: string; logo?: string; metadata?: any }> };\n },\n\n /**\n * Create a new organization.\n * POST /api/v1/auth/organization/create\n */\n create: async (req: { name: string; slug?: string; logo?: string; metadata?: Record<string, unknown> }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/create`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Update an existing organization.\n * POST /api/v1/auth/organization/update\n *\n * better-auth requires the caller to be an owner/admin (server-side\n * enforcement); the body shape is `{ organizationId, data: {...} }`.\n */\n update: async (\n organizationId: string,\n data: { name?: string; slug?: string; logo?: string; metadata?: Record<string, unknown> },\n ) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/update`, {\n method: 'POST',\n body: JSON.stringify({ organizationId, data }),\n });\n return res.json();\n },\n\n /**\n * Set the active organization on the current session. The server writes\n * `activeOrganizationId` on the better-auth session, which downstream\n * handlers (e.g. `EnvironmentProvisioningService`) consult.\n *\n * POST /api/v1/auth/organization/set-active\n */\n setActive: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/set-active`, {\n method: 'POST',\n body: JSON.stringify({ organizationId }),\n });\n return res.json();\n },\n\n /**\n * Get full organization detail (members, invitations, teams).\n * GET /api/v1/auth/organization/get-full-organization?organizationId=...\n */\n get: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/organization/get-full-organization?organizationId=${encodeURIComponent(organizationId)}`,\n );\n return res.json();\n },\n\n /**\n * List members of an organization.\n */\n listMembers: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/organization/list-members?organizationId=${encodeURIComponent(organizationId)}`,\n );\n return res.json();\n },\n\n /**\n * Invite a user to the organization.\n */\n invite: async (req: { email: string; role?: string; organizationId?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/invite-member`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Leave the given organization.\n */\n leave: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/leave`, {\n method: 'POST',\n body: JSON.stringify({ organizationId }),\n });\n return res.json();\n },\n\n /**\n * Delete an organization via better-auth's organization plugin.\n *\n * POST /api/v1/auth/organization/delete\n *\n * better-auth removes the organization row, all members, and all\n * pending invitations. Project teardown (per-project DBs, etc.) is\n * handled server-side by hooks attached to the organization plugin.\n */\n delete: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/delete`, {\n method: 'POST',\n body: JSON.stringify({ organizationId }),\n });\n return res.json();\n },\n\n /**\n * Remove a member from an organization.\n *\n * better-auth: POST /organization/remove-member\n * Body: `{ memberIdOrEmail, organizationId? }` — note the parameter is the\n * **member id** (the row id from `member` table) or the user's email; it\n * is *not* the bare `userId`. Server enforces owner/admin permission.\n */\n removeMember: async (\n organizationId: string,\n params: { memberIdOrEmail: string },\n ) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/remove-member`, {\n method: 'POST',\n body: JSON.stringify({ memberIdOrEmail: params.memberIdOrEmail, organizationId }),\n });\n return res.json();\n },\n\n /**\n * Change a member's role in an organization (owner/admin only).\n *\n * better-auth: POST /organization/update-member-role\n * Body: `{ memberId, role, organizationId? }`. The `memberId` is the\n * `member` table row id (not user id). `role` is one of the configured\n * organisation roles (default: `owner | admin | member`).\n */\n updateMemberRole: async (\n organizationId: string,\n params: { memberId: string; role: string },\n ) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/update-member-role`, {\n method: 'POST',\n body: JSON.stringify({ memberId: params.memberId, role: params.role, organizationId }),\n });\n return res.json();\n },\n\n /**\n * Look up the calling user's membership row in the given organisation.\n * Useful for permission checks on the client without having to scan the\n * full member list.\n *\n * better-auth: GET /organization/get-active-member?organizationId=…\n */\n getActiveMember: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/organization/get-active-member?organizationId=${encodeURIComponent(organizationId)}`,\n );\n return res.json();\n },\n\n /**\n * Invitation lifecycle — wraps better-auth's organization-plugin\n * invitation endpoints. Always go through here instead of writing to\n * `sys_invitation` via the data API: the better-auth writers handle\n * status transitions, expiry, dedupe, and the `sendInvitationEmail`\n * side-effect that the auth-manager wires up.\n */\n invitations: {\n /**\n * List pending/accepted/canceled invitations for an organization.\n * Requires owner/admin role on that org.\n *\n * better-auth: GET /organization/list-invitations?organizationId=…\n */\n list: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/organization/list-invitations?organizationId=${encodeURIComponent(organizationId)}`,\n );\n const data = await res.json();\n const invitations = Array.isArray(data) ? data : (data?.data ?? data?.invitations ?? []);\n return { invitations: invitations as Array<{\n id: string;\n email: string;\n role: string;\n status: 'pending' | 'accepted' | 'rejected' | 'canceled';\n organizationId: string;\n inviterId: string;\n expiresAt: string;\n teamId?: string | null;\n }> };\n },\n\n /**\n * List the **current user's** incoming invitations across every\n * organisation. Used by the per-user \"Invitations\" inbox page.\n *\n * better-auth: GET /organization/list-user-invitations\n */\n listMine: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/list-user-invitations`);\n const data = await res.json();\n const invitations = Array.isArray(data) ? data : (data?.data ?? data?.invitations ?? []);\n return { invitations: invitations as Array<{\n id: string;\n email: string;\n role: string;\n status: string;\n organizationId: string;\n inviterId: string;\n expiresAt: string;\n }> };\n },\n\n /** better-auth: POST /organization/cancel-invitation */\n cancel: async (invitationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/cancel-invitation`, {\n method: 'POST',\n body: JSON.stringify({ invitationId }),\n });\n return res.json();\n },\n\n /** better-auth: POST /organization/accept-invitation */\n accept: async (invitationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/accept-invitation`, {\n method: 'POST',\n body: JSON.stringify({ invitationId }),\n });\n return res.json();\n },\n\n /** better-auth: POST /organization/reject-invitation */\n reject: async (invitationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/reject-invitation`, {\n method: 'POST',\n body: JSON.stringify({ invitationId }),\n });\n return res.json();\n },\n\n /**\n * \"Resend\" an invitation. better-auth has no first-class resend\n * endpoint, so we implement it as cancel-then-invite: cancel the old\n * row (so its status flips to `canceled` and audit hooks fire), then\n * issue a fresh invite. The new invite re-runs `sendInvitationEmail`\n * on the server, so the recipient gets a brand-new accept URL.\n *\n * If `cancel()` fails (e.g. invite already accepted) the error is\n * re-thrown without re-inviting.\n */\n resend: async (\n invitation: { id?: string; email: string; role?: string; organizationId: string; teamId?: string | null },\n ) => {\n if (invitation.id) {\n try {\n await this.organizations.invitations.cancel(invitation.id);\n } catch {\n // Best-effort: ignore \"already canceled / accepted\" so the\n // re-invite still goes out.\n }\n }\n return this.organizations.invite({\n email: invitation.email,\n role: invitation.role ?? 'member',\n organizationId: invitation.organizationId,\n });\n },\n },\n\n /**\n * Team management — only available when the organisation plugin is\n * configured with `teams: { enabled: true }` on the server. Calls return\n * a 4xx if teams aren't enabled; UI should hide the section in that case.\n */\n teams: {\n /** better-auth: GET /organization/list-teams?organizationId=… */\n list: async (organizationId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/organization/list-teams?organizationId=${encodeURIComponent(organizationId)}`,\n );\n const data = await res.json();\n const teams = Array.isArray(data) ? data : (data?.data ?? data?.teams ?? []);\n return { teams: teams as Array<{ id: string; name: string; organizationId: string; createdAt?: string }> };\n },\n\n /** better-auth: POST /organization/create-team */\n create: async (req: { name: string; organizationId: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/create-team`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /** better-auth: POST /organization/update-team */\n update: async (params: { teamId: string; data: { name?: string } }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/update-team`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n return res.json();\n },\n\n /** better-auth: POST /organization/remove-team */\n delete: async (params: { teamId: string; organizationId?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/remove-team`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n return res.json();\n },\n\n /** better-auth: GET /organization/list-team-members?teamId=… */\n listMembers: async (teamId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/organization/list-team-members?teamId=${encodeURIComponent(teamId)}`,\n );\n const data = await res.json();\n const members = Array.isArray(data) ? data : (data?.data ?? data?.members ?? []);\n return { members: members as Array<{ id: string; teamId: string; userId: string }> };\n },\n\n /** better-auth: POST /organization/add-team-member */\n addMember: async (params: { teamId: string; userId: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/add-team-member`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n return res.json();\n },\n\n /** better-auth: POST /organization/remove-team-member */\n removeMember: async (params: { teamId: string; userId: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/organization/remove-team-member`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n return res.json();\n },\n },\n };\n\n /**\n * OAuth / OpenID Connect Provider — admin endpoints exposed by\n * `@better-auth/oauth-provider` (when enabled on the server). Lets users\n * register their own OAuth client applications, list them, and revoke them.\n *\n * All endpoints are mounted under the auth route, e.g. `/api/v1/auth/oauth2/*`.\n */\n oauth = {\n applications: {\n /**\n * Register a new OAuth client application.\n * POST /api/v1/auth/oauth2/create-client (authenticated)\n *\n * Returns the freshly-issued `client_id` and `client_secret`.\n * The secret is only returned at creation time — store it securely.\n */\n register: async (req: {\n client_name?: string;\n name?: string;\n redirect_uris: string[];\n token_endpoint_auth_method?: 'none' | 'client_secret_basic' | 'client_secret_post';\n grant_types?: string[];\n response_types?: string[];\n client_uri?: string;\n logo_uri?: string;\n scope?: string;\n scopes?: string[];\n contacts?: string[];\n tos_uri?: string;\n policy_uri?: string;\n metadata?: Record<string, unknown>;\n }) => {\n const route = this.getRoute('auth');\n // The new oauth-provider package exposes `/oauth2/create-client`\n // (authenticated dynamic registration). The legacy `/oauth2/register`\n // endpoint is now disabled by default for security and only\n // available when the server explicitly opts in via the\n // `allowUnauthenticatedClientRegistration` option.\n const res = await this.fetch(`${this.baseUrl}${route}/oauth2/create-client`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Get a single OAuth application by its `client_id`.\n * GET /api/v1/auth/oauth2/get-client?client_id=...\n */\n get: async (clientId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/oauth2/get-client?client_id=${encodeURIComponent(clientId)}`,\n );\n return res.json();\n },\n\n /**\n * Get a single OAuth application's public fields (no auth required\n * once the user has signed in). Used by the consent screen.\n * GET /api/v1/auth/oauth2/public-client?client_id=...\n */\n getPublic: async (clientId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(\n `${this.baseUrl}${route}/oauth2/public-client?client_id=${encodeURIComponent(clientId)}`,\n );\n return res.json();\n },\n\n /**\n * List OAuth applications visible to the current user.\n *\n * Uses `@better-auth/oauth-provider`'s `/oauth2/get-clients` endpoint\n * which returns clients owned by the current user (and their\n * organization, if applicable).\n */\n list: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/oauth2/get-clients`);\n const data = await res.json();\n const items = Array.isArray(data) ? data : data?.clients ?? data?.data ?? [];\n return { applications: items as Array<Record<string, any>> };\n },\n\n /**\n * Delete an OAuth application by its `client_id`.\n * POST /api/v1/auth/oauth2/delete-client\n *\n * Tokens and consents referencing the client cascade-delete via the\n * better-auth schema's `onDelete: cascade` foreign keys.\n */\n delete: async (clientId: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/oauth2/delete-client`, {\n method: 'POST',\n body: JSON.stringify({ client_id: clientId }),\n });\n return res.json();\n },\n },\n\n /**\n * Submit the user's decision to a pending consent request.\n * POST /api/v1/auth/oauth2/consent\n *\n * Called by the consent screen after the user accepts or denies. The\n * `oauth_query` is the raw query string of the consent page URL — it\n * carries the signed authorization request that the consent endpoint\n * verifies before issuing the authorization code.\n */\n consent: async (req: { accept: boolean; scope?: string; oauth_query?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/oauth2/consent`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n };\n\n /**\n * Update the active project id used for subsequent requests.\n * Pass `undefined` to clear (falls back to the session default).\n */\n setProjectId(environmentId: string | undefined): void {\n this.environmentId = environmentId;\n this.logger.debug('Active project changed', { environmentId });\n }\n\n /**\n * Current active project id (if set).\n */\n getProjectId(): string | undefined {\n return this.environmentId;\n }\n\n /**\n * Update the active UI locale used for subsequent requests. Apps should\n * call this from their language switcher so server-translated metadata\n * (object/field labels, view headers, action text) follows the in-app\n * language without a page refresh. Pass `undefined` to clear and fall\n * back to the browser's `Accept-Language` (issue #1319).\n */\n setLocale(locale: string | undefined): void {\n this.locale = locale;\n this.logger.debug('Active locale changed', { locale });\n }\n\n /**\n * Current active UI locale (if set).\n */\n getLocale(): string | undefined {\n return this.locale;\n }\n\n /**\n * Authentication Services\n */\n auth = {\n /**\n * Get authentication configuration\n * Returns available auth providers and features\n */\n getConfig: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/config`);\n return this.unwrapResponse(res);\n },\n\n /**\n * Login with email and password\n * Uses better-auth endpoint: POST /sign-in/email\n */\n login: async (request: LoginRequest): Promise<SessionResponse> => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/sign-in/email`, {\n method: 'POST',\n headers: { Origin: this.baseUrl },\n body: JSON.stringify(request)\n });\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n // better-auth signals errors via non-2xx status with `{ code, message }`.\n // Throw so callers can `try/catch` (e.g. detect EMAIL_NOT_VERIFIED and\n // redirect to the resend-verification page) instead of silently\n // receiving a normalized-looking response with no token.\n const message = raw?.message || raw?.error?.message || `Login failed (HTTP ${res.status})`;\n const err = new Error(message) as Error & { code?: string; status?: number };\n if (raw?.code) err.code = raw.code;\n err.status = res.status;\n throw err;\n }\n // Normalize: better-auth returns `{ token, user }` at top level,\n // but our SessionResponse shape wraps them in `data`.\n const data = raw && (raw.data ?? (raw.token || raw.user ? { token: raw.token, user: raw.user } : undefined));\n const normalized = data ? { ...raw, data } : raw;\n // Auto-set token if present in response\n if (normalized.data?.token) {\n this.token = normalized.data.token;\n }\n return normalized;\n },\n \n /**\n * Logout current user\n * Uses better-auth endpoint: POST /sign-out\n */\n logout: async () => {\n const route = this.getRoute('auth');\n await this.fetch(`${this.baseUrl}${route}/sign-out`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Origin: this.baseUrl },\n body: '{}',\n });\n this.token = undefined;\n },\n\n /**\n * Get current user session\n * Uses better-auth endpoint: GET /get-session\n */\n me: async (): Promise<SessionResponse> => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/get-session`, {\n headers: { Origin: this.baseUrl },\n });\n return res.json();\n },\n\n /**\n * Register a new user account\n * Uses better-auth endpoint: POST /sign-up/email\n */\n register: async (request: RegisterRequest): Promise<SessionResponse> => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/sign-up/email`, {\n method: 'POST',\n headers: { Origin: this.baseUrl },\n body: JSON.stringify(request)\n });\n const raw = await res.json();\n const data = raw && (raw.data ?? (raw.token || raw.user ? { token: raw.token, user: raw.user } : undefined));\n const normalized = data ? { ...raw, data } : raw;\n if (normalized.data?.token) {\n this.token = normalized.data.token;\n }\n return normalized;\n },\n\n /**\n * Initiate OAuth sign-in via a social or OIDC provider.\n *\n * - Social providers (Google, GitHub, etc.): calls POST /sign-in/social with `{ provider }`.\n * - OIDC/enterprise providers: calls POST /sign-in/oauth2 with `{ providerId }`.\n *\n * After the provider callback better-auth sets the session cookie and redirects to `callbackURL`.\n */\n signInWithProvider: async (\n provider: string,\n opts?: { callbackURL?: string; errorCallbackURL?: string; type?: 'social' | 'oidc' },\n ): Promise<void> => {\n if (typeof window === 'undefined') {\n throw new Error('signInWithProvider requires a browser environment');\n }\n const route = this.getRoute('auth');\n const callbackURL = opts?.callbackURL ?? window.location.origin + '/login';\n const isOidc = opts?.type === 'oidc';\n const endpoint = isOidc ? '/sign-in/oauth2' : '/sign-in/social';\n const body: Record<string, string> = isOidc\n ? { providerId: provider, callbackURL }\n : { provider, callbackURL };\n if (opts?.errorCallbackURL) body.errorCallbackURL = opts.errorCallbackURL;\n const res = await this.fetch(`${this.baseUrl}${route}${endpoint}`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const data = await res.json();\n const redirectUrl = data?.url ?? data?.data?.url;\n if (redirectUrl) {\n window.location.assign(redirectUrl);\n } else {\n throw new Error(`signInWithProvider: no redirect URL returned for provider \"${provider}\"`);\n }\n },\n\n /**\n * Refresh an authentication token\n * Note: better-auth handles token refresh automatically via /get-session\n * @param _refreshToken - Not used (better-auth handles refresh automatically)\n */\n refreshToken: async (_refreshToken: string): Promise<SessionResponse> => {\n const route = this.getRoute('auth');\n // better-auth doesn't have a separate refresh endpoint\n // Session refresh is handled automatically when calling /get-session\n const res = await this.fetch(`${this.baseUrl}${route}/get-session`, {\n method: 'GET'\n });\n const data = await res.json();\n if (data.data?.token) {\n this.token = data.data.token;\n }\n return data;\n },\n\n /**\n * Probe the framework-only `/auth/bootstrap-status` endpoint to determine\n * whether the very first owner has been provisioned. The Account portal's\n * `/setup` route uses this to decide whether to render the bootstrap form\n * or bounce the user straight to `/login`.\n */\n bootstrapStatus: async (): Promise<{ hasOwner: boolean }> => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/bootstrap-status`);\n const data = await res.json();\n // Endpoint may or may not be wrapped in `{ data }`.\n const payload = (data?.data ?? data) as { hasOwner?: boolean };\n return { hasOwner: !!payload?.hasOwner };\n },\n\n /**\n * Update the current user's profile.\n *\n * better-auth: POST /update-user — accepts `{ name?, image?, ... }`\n * (any custom user fields configured on the server). Returns the\n * updated user.\n */\n updateUser: async (data: { name?: string; image?: string | null; [key: string]: unknown }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/update-user`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n return res.json();\n },\n\n /**\n * Change the current user's password (email/password accounts only).\n *\n * better-auth: POST /change-password.\n * Set `revokeOtherSessions: true` to invalidate every other session\n * after the change.\n */\n changePassword: async (req: {\n currentPassword: string;\n newPassword: string;\n revokeOtherSessions?: boolean;\n }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/change-password`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Begin a change-email flow. better-auth sends a verification mail to\n * the new address; the change only takes effect after the user clicks\n * the link.\n *\n * better-auth: POST /change-email — `{ newEmail, callbackURL? }`.\n */\n changeEmail: async (req: { newEmail: string; callbackURL?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/change-email`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Re-send the email-verification link to the current user (or any\n * address when called as an admin). better-auth: POST /send-verification-email.\n */\n sendVerificationEmail: async (req: { email: string; callbackURL?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/send-verification-email`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Verify an email-verification token (the link target).\n *\n * better-auth: GET /verify-email?token=…&callbackURL=…\n */\n verifyEmail: async (params: { token: string; callbackURL?: string }) => {\n const route = this.getRoute('auth');\n const url = new URL(`${this.baseUrl}${route}/verify-email`);\n url.searchParams.set('token', params.token);\n if (params.callbackURL) url.searchParams.set('callbackURL', params.callbackURL);\n const res = await this.fetch(url.toString());\n return res.json();\n },\n\n /**\n * Permanently delete the current user. better-auth supports two flows:\n *\n * 1. With a fresh-session password challenge: POST `{ password }`.\n * 2. With an emailed deletion-confirmation token: POST `{ token }`,\n * typically following an out-of-band confirmation step.\n *\n * Server policy decides which is required; pass whichever you have.\n */\n deleteUser: async (req: { password?: string; token?: string; callbackURL?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/delete-user`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n // Local cleanup mirrors logout(): drop cached bearer token so the next\n // call doesn't try to use a credential for a now-deleted user.\n this.token = undefined;\n return res.json();\n },\n\n /**\n * Active-session management. Wraps better-auth's session endpoints so\n * the Account portal's `/account/sessions` page can list every device\n * the user is signed in from and revoke them individually or in bulk.\n */\n sessions: {\n /** better-auth: GET /list-sessions — returns the current user's sessions. */\n list: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/list-sessions`);\n const data = await res.json();\n const sessions = Array.isArray(data) ? data : (data?.data ?? data?.sessions ?? []);\n return { sessions: sessions as Array<{\n id: string;\n token: string;\n userId: string;\n userAgent?: string;\n ipAddress?: string;\n createdAt: string;\n expiresAt: string;\n }> };\n },\n\n /** better-auth: POST /revoke-session — revoke a single session by token. */\n revoke: async (token: string) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/revoke-session`, {\n method: 'POST',\n body: JSON.stringify({ token }),\n });\n return res.json();\n },\n\n /** better-auth: POST /revoke-other-sessions — keep current, kill the rest. */\n revokeOthers: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/revoke-other-sessions`, {\n method: 'POST',\n body: '{}',\n });\n return res.json();\n },\n\n /** better-auth: POST /revoke-sessions — kill every session for this user. */\n revokeAll: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/revoke-sessions`, {\n method: 'POST',\n body: '{}',\n });\n // Local cleanup — current session is gone too.\n this.token = undefined;\n return res.json();\n },\n },\n\n /**\n * Two-factor authentication (TOTP + backup codes). Requires the\n * `twoFactor` plugin to be enabled on the server (see\n * `plugin-auth` config). Endpoints live under `/two-factor/*`.\n */\n twoFactor: {\n /**\n * Start enrolment. Server returns a TOTP URI (`otpauth://...`) which\n * the UI renders as a QR code; the user then calls `verifyTotp` to\n * confirm and finish enabling.\n */\n enable: async (req: { password: string }): Promise<{ totpURI?: string; backupCodes?: string[] }> => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/two-factor/enable`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n const data = await res.json();\n return (data?.data ?? data) as { totpURI?: string; backupCodes?: string[] };\n },\n\n /**\n * Confirm a TOTP code — used to finalise enrolment after `enable()`\n * or to step up an existing 2FA-enabled session. `trustDevice` (when\n * supported by the server config) suppresses the 2FA challenge on\n * this browser for the configured trust period.\n */\n verifyTotp: async (req: { code: string; trustDevice?: boolean }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/two-factor/verify-totp`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /** Disable 2FA for the current user. Requires the password again. */\n disable: async (req: { password: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/two-factor/disable`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Issue a fresh set of backup codes (invalidating any previous set).\n * Display them once — the server only stores hashes.\n */\n generateBackupCodes: async (req: { password: string }): Promise<{ backupCodes: string[] }> => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/two-factor/generate-backup-codes`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n const data = await res.json();\n return (data?.data ?? data) as { backupCodes: string[] };\n },\n\n /**\n * Verify a 2FA backup code in lieu of a TOTP. Useful as a recovery\n * affordance when the user has lost their authenticator app.\n */\n verifyBackupCode: async (req: { code: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/two-factor/verify-backup-code`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n },\n\n /**\n * Linked credentials — i.e. the rows in better-auth's `account` table\n * (one per provider × user). Lets the user see and unlink their social\n * / OIDC connections from the Account portal.\n */\n accounts: {\n /** better-auth: GET /list-accounts */\n list: async () => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/list-accounts`);\n const data = await res.json();\n const accounts = Array.isArray(data) ? data : (data?.data ?? data?.accounts ?? []);\n return { accounts: accounts as Array<{\n id: string;\n providerId: string;\n accountId: string;\n createdAt?: string;\n updatedAt?: string;\n }> };\n },\n\n /**\n * Unlink a provider connection.\n * better-auth: POST /unlink-account — `{ providerId, accountId? }`.\n * `accountId` is required when the user has more than one account\n * for the same provider.\n */\n unlink: async (req: { providerId: string; accountId?: string }) => {\n const route = this.getRoute('auth');\n const res = await this.fetch(`${this.baseUrl}${route}/unlink-account`, {\n method: 'POST',\n body: JSON.stringify(req),\n });\n return res.json();\n },\n\n /**\n * Link an additional social provider to the current user.\n * better-auth: POST /link-social — `{ provider, callbackURL }`. The\n * server returns a redirect URL; the caller should `window.location`\n * to it (mirroring `signInWithProvider`).\n */\n linkSocial: async (req: { provider: string; callbackURL?: string }): Promise<{ url?: string }> => {\n const route = this.getRoute('auth');\n const callbackURL = req.callbackURL\n ?? (typeof window !== 'undefined' ? window.location.href : undefined);\n const res = await this.fetch(`${this.baseUrl}${route}/link-social`, {\n method: 'POST',\n body: JSON.stringify({ provider: req.provider, callbackURL }),\n });\n const data = await res.json();\n return (data?.data ?? data) as { url?: string };\n },\n },\n };\n\n /**\n * Storage Services\n */\n storage = {\n upload: async (file: any, scope: string = 'user'): Promise<FileUploadResponse> => {\n // 1. Get Presigned URL\n const presignedReq: GetPresignedUrlRequest = {\n filename: file.name,\n mimeType: file.type,\n size: file.size,\n scope\n };\n \n const route = this.getRoute('storage');\n const presignedRes = await this.fetch(`${this.baseUrl}${route}/upload/presigned`, {\n method: 'POST',\n body: JSON.stringify(presignedReq)\n });\n const { data: presigned } = await presignedRes.json() as { data: PresignedUrlResponse['data'] };\n\n // 2. Upload to Cloud directly (Bypass API Middleware to avoid Auth headers if using S3)\n // Use fetchImpl directly\n const uploadRes = await this.fetchImpl(presigned.uploadUrl, {\n method: presigned.method,\n headers: presigned.headers,\n body: file\n });\n\n if (!uploadRes.ok) {\n throw new Error(`Storage Upload Failed: ${uploadRes.statusText}`);\n }\n\n // 3. Complete Upload\n const completeReq: CompleteUploadRequest = {\n fileId: presigned.fileId\n };\n const completeRes = await this.fetch(`${this.baseUrl}${route}/upload/complete`, {\n method: 'POST',\n body: JSON.stringify(completeReq)\n });\n \n return completeRes.json();\n },\n \n getDownloadUrl: async (fileId: string): Promise<string> => {\n const route = this.getRoute('storage');\n const res = await this.fetch(`${this.baseUrl}${route}/files/${fileId}/url`);\n const data = await res.json();\n return data.url;\n },\n\n /**\n * Get a presigned URL for direct-to-cloud upload\n */\n getPresignedUrl: async (req: GetPresignedUrlRequest): Promise<PresignedUrlResponse> => {\n const route = this.getRoute('storage');\n const res = await this.fetch(`${this.baseUrl}${route}/upload/presigned`, {\n method: 'POST',\n body: JSON.stringify(req)\n });\n return res.json();\n },\n\n /**\n * Initiate a chunked (multipart) upload session\n */\n initChunkedUpload: async (req: InitiateChunkedUploadRequest): Promise<InitiateChunkedUploadResponse> => {\n const route = this.getRoute('storage');\n const res = await this.fetch(`${this.baseUrl}${route}/upload/chunked`, {\n method: 'POST',\n body: JSON.stringify(req)\n });\n return res.json();\n },\n\n /**\n * Upload a single chunk/part of a multipart upload\n */\n uploadPart: async (uploadId: string, chunkIndex: number, resumeToken: string, data: Blob | Buffer): Promise<UploadChunkResponse> => {\n const route = this.getRoute('storage');\n const res = await this.fetch(`${this.baseUrl}${route}/upload/chunked/${uploadId}/chunk/${chunkIndex}`, {\n method: 'PUT',\n headers: { 'x-resume-token': resumeToken },\n body: data as any\n });\n return res.json();\n },\n\n /**\n * Complete a chunked upload by assembling all parts\n */\n completeChunkedUpload: async (req: CompleteChunkedUploadRequest): Promise<CompleteChunkedUploadResponse> => {\n const route = this.getRoute('storage');\n const res = await this.fetch(`${this.baseUrl}${route}/upload/chunked/${req.uploadId}/complete`, {\n method: 'POST',\n body: JSON.stringify(req)\n });\n return res.json();\n },\n\n /**\n * Resume an interrupted chunked upload.\n * Fetches current progress, then uploads remaining chunks and completes.\n */\n resumeUpload: async (uploadId: string, file: Blob | ArrayBuffer, chunkSize: number, resumeToken: string): Promise<CompleteChunkedUploadResponse> => {\n const route = this.getRoute('storage');\n\n // 1. Get current progress\n const progressRes = await this.fetch(`${this.baseUrl}${route}/upload/chunked/${uploadId}/progress`);\n const progress = await progressRes.json() as UploadProgress;\n\n const { totalChunks, uploadedChunks } = progress.data;\n const parts: Array<{ chunkIndex: number; eTag: string }> = [];\n\n // 2. Upload remaining chunks\n const fileBuffer = file instanceof ArrayBuffer ? file : await file.arrayBuffer();\n for (let i = uploadedChunks; i < totalChunks; i++) {\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, fileBuffer.byteLength);\n const chunk = new Blob([fileBuffer.slice(start, end)]);\n\n const chunkRes = await this.storage.uploadPart(uploadId, i, resumeToken, chunk);\n parts.push({ chunkIndex: i, eTag: chunkRes.data.eTag });\n }\n\n // 3. Complete\n return this.storage.completeChunkedUpload({ uploadId, parts });\n },\n };\n\n /**\n * Automation Services\n */\n automation = {\n /**\n * Trigger a named automation flow (legacy endpoint)\n */\n trigger: async (triggerName: string, payload: any) => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/trigger/${triggerName}`, {\n method: 'POST',\n body: JSON.stringify(payload)\n });\n return res.json();\n },\n\n /**\n * List all registered automation flows\n */\n list: async (): Promise<{ flows: string[]; total: number; hasMore: boolean }> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}`);\n return this.unwrapResponse(res);\n },\n\n /**\n * Get a flow definition by name\n */\n get: async (name: string): Promise<any> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${name}`);\n return this.unwrapResponse(res);\n },\n\n /**\n * Create (register) a new flow\n */\n create: async (name: string, definition: any): Promise<any> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}`, {\n method: 'POST',\n body: JSON.stringify({ name, ...definition }),\n });\n return this.unwrapResponse(res);\n },\n\n /**\n * Update an existing flow\n */\n update: async (name: string, definition: any): Promise<any> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${name}`, {\n method: 'PUT',\n body: JSON.stringify({ definition }),\n });\n return this.unwrapResponse(res);\n },\n\n /**\n * Delete (unregister) a flow\n */\n delete: async (name: string): Promise<{ name: string; deleted: boolean }> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${name}`, {\n method: 'DELETE',\n });\n return this.unwrapResponse(res);\n },\n\n /**\n * Enable or disable a flow\n */\n toggle: async (name: string, enabled: boolean): Promise<{ name: string; enabled: boolean }> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${name}/toggle`, {\n method: 'POST',\n body: JSON.stringify({ enabled }),\n });\n return this.unwrapResponse(res);\n },\n\n /**\n * Execution run history\n */\n runs: {\n /**\n * List execution runs for a flow\n */\n list: async (flowName: string, options?: { limit?: number; cursor?: string }): Promise<{ runs: any[]; hasMore: boolean }> => {\n const route = this.getRoute('automation');\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.cursor) params.set('cursor', options.cursor);\n const qs = params.toString();\n const res = await this.fetch(`${this.baseUrl}${route}/${flowName}/runs${qs ? `?${qs}` : ''}`);\n return this.unwrapResponse(res);\n },\n\n /**\n * Get a single execution run\n */\n get: async (flowName: string, runId: string): Promise<any> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${flowName}/runs/${runId}`);\n return this.unwrapResponse(res);\n },\n },\n\n /**\n * Flat aliases mirroring the ScopedProjectClient.automation surface so\n * Studio (and other consumers) can use the same call shape regardless of\n * whether they hold a scoped or unscoped client.\n */\n /** Alias for `automation.get` — fetch a flow definition by name. */\n getFlow: async <T = any>(name: string): Promise<T> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(name)}`);\n return this.unwrapResponse(res) as Promise<T>;\n },\n /** Execute (trigger) a flow with an execution context. */\n execute: async <T = any>(name: string, ctx?: Record<string, any>): Promise<T> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(name)}/trigger`, {\n method: 'POST',\n body: JSON.stringify(ctx ?? {}),\n });\n return this.unwrapResponse(res) as Promise<T>;\n },\n /** Alias for `automation.runs.list`. */\n listRuns: async <T = any>(\n flowName: string,\n opts?: { limit?: number; cursor?: string },\n ): Promise<T> => {\n const route = this.getRoute('automation');\n const params = new URLSearchParams();\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.cursor) params.set('cursor', opts.cursor);\n const qs = params.toString();\n const res = await this.fetch(\n `${this.baseUrl}${route}/${encodeURIComponent(flowName)}/runs${qs ? `?${qs}` : ''}`,\n );\n return this.unwrapResponse(res) as Promise<T>;\n },\n /** Alias for `automation.runs.get`. */\n getRun: async <T = any>(flowName: string, runId: string): Promise<T> => {\n const route = this.getRoute('automation');\n const res = await this.fetch(\n `${this.baseUrl}${route}/${encodeURIComponent(flowName)}/runs/${encodeURIComponent(runId)}`,\n );\n return this.unwrapResponse(res) as Promise<T>;\n },\n };\n\n /**\n * Event Subscription API\n * Provides real-time event subscriptions for metadata and data changes\n */\n get events() {\n return this.realtimeAPI;\n }\n\n /**\n * Permissions Services\n */\n permissions = {\n /**\n * Check if current user has permission for an action on an object\n */\n check: async (request: CheckPermissionRequest): Promise<CheckPermissionResponse> => {\n const route = this.getRoute('permissions');\n const params = new URLSearchParams({ object: request.object, action: request.action });\n if (request.recordId !== undefined) params.set('recordId', request.recordId);\n if (request.field !== undefined) params.set('field', request.field);\n const res = await this.fetch(`${this.baseUrl}${route}/check?${params.toString()}`);\n return this.unwrapResponse<CheckPermissionResponse>(res);\n },\n\n /**\n * Get all permissions for a specific object\n */\n getObjectPermissions: async (object: string): Promise<GetObjectPermissionsResponse> => {\n const route = this.getRoute('permissions');\n const res = await this.fetch(`${this.baseUrl}${route}/objects/${encodeURIComponent(object)}`);\n return this.unwrapResponse<GetObjectPermissionsResponse>(res);\n },\n\n /**\n * Get effective permissions for the current user\n */\n getEffectivePermissions: async (): Promise<GetEffectivePermissionsResponse> => {\n const route = this.getRoute('permissions');\n const res = await this.fetch(`${this.baseUrl}${route}/effective`);\n return this.unwrapResponse<GetEffectivePermissionsResponse>(res);\n }\n };\n\n /**\n * Realtime Services\n */\n realtime = {\n /**\n * Establish a realtime connection\n */\n connect: async (request?: RealtimeConnectRequest): Promise<RealtimeConnectResponse> => {\n const route = this.getRoute('realtime');\n const res = await this.fetch(`${this.baseUrl}${route}/connect`, {\n method: 'POST',\n body: JSON.stringify(request || {})\n });\n return this.unwrapResponse<RealtimeConnectResponse>(res);\n },\n\n /**\n * Disconnect from realtime services\n */\n disconnect: async (): Promise<void> => {\n const route = this.getRoute('realtime');\n await this.fetch(`${this.baseUrl}${route}/disconnect`, {\n method: 'POST'\n });\n },\n\n /**\n * Subscribe to a channel\n */\n subscribe: async (request: RealtimeSubscribeRequest): Promise<RealtimeSubscribeResponse> => {\n const route = this.getRoute('realtime');\n const res = await this.fetch(`${this.baseUrl}${route}/subscribe`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<RealtimeSubscribeResponse>(res);\n },\n\n /**\n * Unsubscribe from a channel\n */\n unsubscribe: async (subscriptionId: string): Promise<void> => {\n const route = this.getRoute('realtime');\n await this.fetch(`${this.baseUrl}${route}/unsubscribe`, {\n method: 'POST',\n body: JSON.stringify({ subscriptionId })\n });\n },\n\n /**\n * Set presence state on a channel\n */\n setPresence: async (channel: string, state: SetPresenceRequest['state']): Promise<void> => {\n const route = this.getRoute('realtime');\n await this.fetch(`${this.baseUrl}${route}/presence`, {\n method: 'PUT',\n body: JSON.stringify({ channel, state })\n });\n },\n\n /**\n * Get presence information for a channel\n */\n getPresence: async (channel: string): Promise<GetPresenceResponse> => {\n const route = this.getRoute('realtime');\n const res = await this.fetch(`${this.baseUrl}${route}/presence/${encodeURIComponent(channel)}`);\n return this.unwrapResponse<GetPresenceResponse>(res);\n }\n };\n\n /**\n * Workflow Services\n */\n workflow = {\n /**\n * Get workflow configuration for an object\n */\n getConfig: async (object: string): Promise<GetWorkflowConfigResponse> => {\n const route = this.getRoute('workflow');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/config`);\n return this.unwrapResponse<GetWorkflowConfigResponse>(res);\n },\n\n /**\n * Get current workflow state for a record\n */\n getState: async (object: string, recordId: string): Promise<GetWorkflowStateResponse> => {\n const route = this.getRoute('workflow');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/state`);\n return this.unwrapResponse<GetWorkflowStateResponse>(res);\n },\n\n /**\n * Execute a workflow state transition\n */\n transition: async (request: WorkflowTransitionRequest): Promise<WorkflowTransitionResponse> => {\n const route = this.getRoute('workflow');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(request.object)}/${encodeURIComponent(request.recordId)}/transition`, {\n method: 'POST',\n body: JSON.stringify({\n transition: request.transition,\n comment: request.comment,\n data: request.data\n })\n });\n return this.unwrapResponse<WorkflowTransitionResponse>(res);\n }\n // ADR-0019: approve/reject are no longer workflow operations. Approval is a\n // flow node — see the `approvals` namespace below for recording decisions.\n };\n\n /**\n * Approval Services (ADR-0019)\n *\n * Approval is a first-class flow node, not a workflow step: a flow's\n * Approval node opens a request and suspends the run; recording a decision\n * here finalises the request and resumes the owning flow down the matching\n * `approve` / `reject` edge. This namespace drives the \"my approvals\" inbox\n * and the decision API exposed under `/api/v1/approvals`.\n */\n approvals = {\n /**\n * List approval requests (\"my approvals\" inbox). Filter by status, target\n * object / record, the user expected to act next, or the submitter.\n */\n listRequests: async (filter?: {\n object?: string;\n recordId?: string;\n status?: ApprovalStatus | ApprovalStatus[];\n approverId?: string;\n submitterId?: string;\n }): Promise<ApprovalRequestRow[]> => {\n const route = this.getRoute('approvals');\n const params = new URLSearchParams();\n if (filter?.object) params.set('object', filter.object);\n if (filter?.recordId) params.set('recordId', filter.recordId);\n if (filter?.status) {\n params.set('status', Array.isArray(filter.status) ? filter.status.join(',') : filter.status);\n }\n if (filter?.approverId) params.set('approverId', filter.approverId);\n if (filter?.submitterId) params.set('submitterId', filter.submitterId);\n const qs = params.toString();\n const res = await this.fetch(`${this.baseUrl}${route}/requests${qs ? `?${qs}` : ''}`);\n const body = await this.unwrapResponse<{ data?: ApprovalRequestRow[] } | ApprovalRequestRow[]>(res);\n return Array.isArray(body) ? body : (body?.data ?? []);\n },\n\n /**\n * Get a single approval request by id.\n */\n getRequest: async (requestId: string): Promise<ApprovalRequestRow> => {\n const route = this.getRoute('approvals');\n const res = await this.fetch(`${this.baseUrl}${route}/requests/${encodeURIComponent(requestId)}`);\n return this.unwrapResponse<ApprovalRequestRow>(res);\n },\n\n /**\n * Record an approve decision on a request. Finalises the request when the\n * node's behaviour is satisfied and resumes the owning flow run.\n */\n approve: async (requestId: string, decision?: { actorId?: string; comment?: string }): Promise<ApprovalDecisionResult> => {\n const route = this.getRoute('approvals');\n const res = await this.fetch(`${this.baseUrl}${route}/requests/${encodeURIComponent(requestId)}/approve`, {\n method: 'POST',\n body: JSON.stringify({ actorId: decision?.actorId, comment: decision?.comment })\n });\n return this.unwrapResponse<ApprovalDecisionResult>(res);\n },\n\n /**\n * Record a reject decision on a request. Resumes the owning flow run down\n * the `reject` edge.\n */\n reject: async (requestId: string, decision?: { actorId?: string; comment?: string }): Promise<ApprovalDecisionResult> => {\n const route = this.getRoute('approvals');\n const res = await this.fetch(`${this.baseUrl}${route}/requests/${encodeURIComponent(requestId)}/reject`, {\n method: 'POST',\n body: JSON.stringify({ actorId: decision?.actorId, comment: decision?.comment })\n });\n return this.unwrapResponse<ApprovalDecisionResult>(res);\n },\n\n /**\n * Audit trail (the immutable action log) for an approval request.\n */\n listActions: async (requestId: string): Promise<ApprovalActionRow[]> => {\n const route = this.getRoute('approvals');\n const res = await this.fetch(`${this.baseUrl}${route}/requests/${encodeURIComponent(requestId)}/actions`);\n const body = await this.unwrapResponse<{ data?: ApprovalActionRow[] } | ApprovalActionRow[]>(res);\n return Array.isArray(body) ? body : (body?.data ?? []);\n }\n };\n\n /**\n * Views CRUD Services\n */\n views = {\n /**\n * List views for an object\n */\n list: async (object: string, type?: 'list' | 'form'): Promise<ListViewsResponse> => {\n const route = this.getRoute('views');\n const params = new URLSearchParams();\n if (type) params.set('type', type);\n const qs = params.toString();\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}${qs ? `?${qs}` : ''}`);\n return this.unwrapResponse<ListViewsResponse>(res);\n },\n\n /**\n * Get a specific view\n */\n get: async (object: string, viewId: string): Promise<GetViewResponse> => {\n const route = this.getRoute('views');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(viewId)}`);\n return this.unwrapResponse<GetViewResponse>(res);\n },\n\n /**\n * Create a new view\n */\n create: async (object: string, data: CreateViewRequest['data']): Promise<CreateViewResponse> => {\n const route = this.getRoute('views');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}`, {\n method: 'POST',\n body: JSON.stringify({ object, data })\n });\n return this.unwrapResponse<CreateViewResponse>(res);\n },\n\n /**\n * Update an existing view\n */\n update: async (object: string, viewId: string, data: UpdateViewRequest['data']): Promise<UpdateViewResponse> => {\n const route = this.getRoute('views');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(viewId)}`, {\n method: 'PUT',\n body: JSON.stringify({ object, viewId, data })\n });\n return this.unwrapResponse<UpdateViewResponse>(res);\n },\n\n /**\n * Delete a view\n */\n delete: async (object: string, viewId: string): Promise<DeleteViewResponse> => {\n const route = this.getRoute('views');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(viewId)}`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<DeleteViewResponse>(res);\n }\n };\n\n /**\n * Notification Services\n */\n notifications = {\n /**\n * Register a device for push notifications\n */\n registerDevice: async (request: RegisterDeviceRequest): Promise<RegisterDeviceResponse> => {\n const route = this.getRoute('notifications');\n const res = await this.fetch(`${this.baseUrl}${route}/devices`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<RegisterDeviceResponse>(res);\n },\n\n /**\n * Unregister a device from push notifications\n */\n unregisterDevice: async (deviceId: string): Promise<UnregisterDeviceResponse> => {\n const route = this.getRoute('notifications');\n const res = await this.fetch(`${this.baseUrl}${route}/devices/${encodeURIComponent(deviceId)}`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<UnregisterDeviceResponse>(res);\n },\n\n /**\n * Get notification preferences for the current user\n */\n getPreferences: async (): Promise<GetNotificationPreferencesResponse> => {\n const route = this.getRoute('notifications');\n const res = await this.fetch(`${this.baseUrl}${route}/preferences`);\n return this.unwrapResponse<GetNotificationPreferencesResponse>(res);\n },\n\n /**\n * Update notification preferences\n */\n updatePreferences: async (preferences: UpdateNotificationPreferencesRequest['preferences']): Promise<UpdateNotificationPreferencesResponse> => {\n const route = this.getRoute('notifications');\n const res = await this.fetch(`${this.baseUrl}${route}/preferences`, {\n method: 'PUT',\n body: JSON.stringify({ preferences })\n });\n return this.unwrapResponse<UpdateNotificationPreferencesResponse>(res);\n },\n\n /**\n * List notifications for the current user\n */\n list: async (options?: { read?: boolean; type?: string; limit?: number; cursor?: string }): Promise<ListNotificationsResponse> => {\n const route = this.getRoute('notifications');\n const params = new URLSearchParams();\n if (options?.read !== undefined) params.set('read', String(options.read));\n if (options?.type) params.set('type', options.type);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.cursor) params.set('cursor', options.cursor);\n const qs = params.toString();\n const res = await this.fetch(`${this.baseUrl}${route}${qs ? `?${qs}` : ''}`);\n return this.unwrapResponse<ListNotificationsResponse>(res);\n },\n\n /**\n * Mark specific notifications as read\n */\n markRead: async (ids: string[]): Promise<MarkNotificationsReadResponse> => {\n const route = this.getRoute('notifications');\n const res = await this.fetch(`${this.baseUrl}${route}/read`, {\n method: 'POST',\n body: JSON.stringify({ ids })\n });\n return this.unwrapResponse<MarkNotificationsReadResponse>(res);\n },\n\n /**\n * Mark all notifications as read\n */\n markAllRead: async (): Promise<MarkAllNotificationsReadResponse> => {\n const route = this.getRoute('notifications');\n const res = await this.fetch(`${this.baseUrl}${route}/read/all`, {\n method: 'POST'\n });\n return this.unwrapResponse<MarkAllNotificationsReadResponse>(res);\n }\n };\n\n /**\n * AI Services\n */\n ai = {\n /**\n * Natural language query — converts natural language to structured query\n */\n nlq: async (request: AiNlqRequest): Promise<AiNlqResponse> => {\n const route = this.getRoute('ai');\n const res = await this.fetch(`${this.baseUrl}${route}/nlq`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<AiNlqResponse>(res);\n },\n\n // AI chat method removed — use Vercel AI SDK `useChat()` / `@ai-sdk/react` directly.\n\n /**\n * AI-powered field value suggestions\n */\n suggest: async (request: AiSuggestRequest): Promise<AiSuggestResponse> => {\n const route = this.getRoute('ai');\n const res = await this.fetch(`${this.baseUrl}${route}/suggest`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<AiSuggestResponse>(res);\n },\n\n /**\n * AI-powered data insights\n */\n insights: async (request: AiInsightsRequest): Promise<AiInsightsResponse> => {\n const route = this.getRoute('ai');\n const res = await this.fetch(`${this.baseUrl}${route}/insights`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<AiInsightsResponse>(res);\n }\n };\n\n /**\n * Internationalization Services\n */\n i18n = {\n /**\n * Get available locales\n */\n getLocales: async (): Promise<GetLocalesResponse> => {\n const route = this.getRoute('i18n');\n const res = await this.fetch(`${this.baseUrl}${route}/locales`);\n return this.unwrapResponse<GetLocalesResponse>(res);\n },\n\n /**\n * Get translations for a locale\n */\n getTranslations: async (locale: string, options?: { namespace?: string; keys?: string[] }): Promise<GetTranslationsResponse> => {\n const route = this.getRoute('i18n');\n const params = new URLSearchParams();\n params.set('locale', locale);\n if (options?.namespace) params.set('namespace', options.namespace);\n if (options?.keys) params.set('keys', options.keys.join(','));\n const res = await this.fetch(`${this.baseUrl}${route}/translations?${params.toString()}`);\n return this.unwrapResponse<GetTranslationsResponse>(res);\n },\n\n /**\n * Get translated field labels for an object\n */\n getFieldLabels: async (object: string, locale: string): Promise<GetFieldLabelsResponse> => {\n const route = this.getRoute('i18n');\n const res = await this.fetch(`${this.baseUrl}${route}/labels/${encodeURIComponent(object)}?locale=${encodeURIComponent(locale)}`);\n return this.unwrapResponse<GetFieldLabelsResponse>(res);\n }\n };\n\n /**\n * Feed / Chatter Services\n *\n * Provides access to the activity timeline (comments, field changes, tasks),\n * emoji reactions, pin/star, search, changelog, and record subscriptions.\n * Base path: /api/data/{object}/{recordId}/feed\n */\n feed = {\n /**\n * List feed items for a record\n */\n list: async (object: string, recordId: string, options?: { type?: string; limit?: number; cursor?: string }): Promise<GetFeedResponse> => {\n const route = this.getRoute('data');\n const params = new URLSearchParams();\n if (options?.type) params.set('type', options.type);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.cursor) params.set('cursor', options.cursor);\n const qs = params.toString();\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed${qs ? `?${qs}` : ''}`);\n return this.unwrapResponse<GetFeedResponse>(res);\n },\n\n /**\n * Create a new feed item (comment, note, task, etc.)\n */\n create: async (object: string, recordId: string, data: { type: string; body?: string; mentions?: any[]; parentId?: string; visibility?: string }): Promise<CreateFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed`, {\n method: 'POST',\n body: JSON.stringify(data)\n });\n return this.unwrapResponse<CreateFeedItemResponse>(res);\n },\n\n /**\n * Update an existing feed item\n */\n update: async (object: string, recordId: string, feedId: string, data: { body?: string; mentions?: any[]; visibility?: string }): Promise<UpdateFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}`, {\n method: 'PUT',\n body: JSON.stringify(data)\n });\n return this.unwrapResponse<UpdateFeedItemResponse>(res);\n },\n\n /**\n * Delete a feed item\n */\n delete: async (object: string, recordId: string, feedId: string): Promise<DeleteFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<DeleteFeedItemResponse>(res);\n },\n\n /**\n * Add an emoji reaction to a feed item\n */\n addReaction: async (object: string, recordId: string, feedId: string, emoji: string): Promise<AddReactionResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}/reactions`, {\n method: 'POST',\n body: JSON.stringify({ emoji })\n });\n return this.unwrapResponse<AddReactionResponse>(res);\n },\n\n /**\n * Remove an emoji reaction from a feed item\n */\n removeReaction: async (object: string, recordId: string, feedId: string, emoji: string): Promise<RemoveReactionResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}/reactions/${encodeURIComponent(emoji)}`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<RemoveReactionResponse>(res);\n },\n\n /**\n * Pin a feed item to the top of the timeline\n */\n pin: async (object: string, recordId: string, feedId: string): Promise<PinFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}/pin`, {\n method: 'POST'\n });\n return this.unwrapResponse<PinFeedItemResponse>(res);\n },\n\n /**\n * Unpin a feed item\n */\n unpin: async (object: string, recordId: string, feedId: string): Promise<UnpinFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}/pin`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<UnpinFeedItemResponse>(res);\n },\n\n /**\n * Star (bookmark) a feed item\n */\n star: async (object: string, recordId: string, feedId: string): Promise<StarFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}/star`, {\n method: 'POST'\n });\n return this.unwrapResponse<StarFeedItemResponse>(res);\n },\n\n /**\n * Unstar a feed item\n */\n unstar: async (object: string, recordId: string, feedId: string): Promise<UnstarFeedItemResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/${encodeURIComponent(feedId)}/star`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<UnstarFeedItemResponse>(res);\n },\n\n /**\n * Search feed items\n */\n search: async (object: string, recordId: string, query: string, options?: { type?: string; actorId?: string; dateFrom?: string; dateTo?: string; limit?: number; cursor?: string }): Promise<SearchFeedResponse> => {\n const route = this.getRoute('data');\n const params = new URLSearchParams();\n params.set('query', query);\n if (options?.type) params.set('type', options.type);\n if (options?.actorId) params.set('actorId', options.actorId);\n if (options?.dateFrom) params.set('dateFrom', options.dateFrom);\n if (options?.dateTo) params.set('dateTo', options.dateTo);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.cursor) params.set('cursor', options.cursor);\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/feed/search?${params.toString()}`);\n return this.unwrapResponse<SearchFeedResponse>(res);\n },\n\n /**\n * Get field-level changelog for a record\n */\n getChangelog: async (object: string, recordId: string, options?: { field?: string; actorId?: string; dateFrom?: string; dateTo?: string; limit?: number; cursor?: string }): Promise<GetChangelogResponse> => {\n const route = this.getRoute('data');\n const params = new URLSearchParams();\n if (options?.field) params.set('field', options.field);\n if (options?.actorId) params.set('actorId', options.actorId);\n if (options?.dateFrom) params.set('dateFrom', options.dateFrom);\n if (options?.dateTo) params.set('dateTo', options.dateTo);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.cursor) params.set('cursor', options.cursor);\n const qs = params.toString();\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/changelog${qs ? `?${qs}` : ''}`);\n return this.unwrapResponse<GetChangelogResponse>(res);\n },\n\n /**\n * Subscribe to record notifications\n */\n subscribe: async (object: string, recordId: string, options?: { events?: string[]; channels?: string[] }): Promise<SubscribeResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/subscribe`, {\n method: 'POST',\n body: JSON.stringify(options || {})\n });\n return this.unwrapResponse<SubscribeResponse>(res);\n },\n\n /**\n * Unsubscribe from record notifications\n */\n unsubscribe: async (object: string, recordId: string): Promise<UnsubscribeResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(object)}/${encodeURIComponent(recordId)}/subscribe`, {\n method: 'DELETE'\n });\n return this.unwrapResponse<UnsubscribeResponse>(res);\n },\n };\n\n /**\n * Data Operations\n */\n data = {\n /**\n * Advanced Query using ObjectStack Query Protocol\n * Supports both simplified options and full AST\n */\n query: async <T = any>(object: string, query: Partial<QueryAST>): Promise<PaginatedResult<T>> => {\n const route = this.getRoute('data');\n // POST for complex query to avoid URL length limits and allow clean JSON AST\n // Convention: POST /api/v1/data/:object/query\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/query`, {\n method: 'POST',\n body: JSON.stringify(query)\n });\n return this.unwrapResponse<PaginatedResult<T>>(res);\n },\n\n /**\n * @deprecated Use `data.query()` with standard QueryAST parameters instead.\n * This method uses legacy parameter names. Internally adapts to HTTP GET params.\n */\n find: async <T = any>(object: string, options: QueryOptions | QueryOptionsV2 = {}): Promise<PaginatedResult<T>> => {\n const route = this.getRoute('data');\n const queryParams = new URLSearchParams();\n\n // ── Normalize V2 canonical options → HTTP transport params ───\n // Detect V2 options by presence of canonical-only keys.\n const v2 = options as QueryOptionsV2;\n const normalizedOptions: QueryOptions = {} as QueryOptions;\n if ('where' in options || 'fields' in options || 'orderBy' in options || 'offset' in options) {\n // V2 canonical options detected — map to legacy HTTP transport keys\n if (v2.where) normalizedOptions.filter = v2.where as any;\n if (v2.fields) normalizedOptions.select = v2.fields;\n if (v2.orderBy) normalizedOptions.sort = v2.orderBy as any;\n if (v2.limit != null) normalizedOptions.top = v2.limit;\n if (v2.offset != null) normalizedOptions.skip = v2.offset;\n if (v2.aggregations) normalizedOptions.aggregations = v2.aggregations;\n if (v2.groupBy) normalizedOptions.groupBy = v2.groupBy;\n } else {\n // Legacy QueryOptions — pass through as-is\n Object.assign(normalizedOptions, options);\n }\n\n // 1. Handle Pagination\n if (normalizedOptions.top) queryParams.set('top', normalizedOptions.top.toString());\n if (normalizedOptions.skip) queryParams.set('skip', normalizedOptions.skip.toString());\n\n // 2. Handle Sort\n if (normalizedOptions.sort) {\n // Check if it's AST \n if (Array.isArray(normalizedOptions.sort) && typeof normalizedOptions.sort[0] === 'object') {\n queryParams.set('sort', JSON.stringify(normalizedOptions.sort));\n } else {\n const sortVal = Array.isArray(normalizedOptions.sort) ? normalizedOptions.sort.join(',') : normalizedOptions.sort;\n queryParams.set('sort', sortVal as string);\n }\n }\n \n // 3. Handle Select\n if (normalizedOptions.select) {\n queryParams.set('select', normalizedOptions.select.join(','));\n }\n\n // 4. Handle Filters (Simple vs AST)\n // Canonical HTTP param name: `filter` (singular). `filters` (plural) is accepted\n // for backward compatibility but `filter` is the standard going forward.\n const filterValue = normalizedOptions.filter ?? normalizedOptions.filters;\n if (filterValue) {\n // Detect AST filter format vs simple key-value map. AST filters use an array structure\n // with [field, operator, value] or [logicOp, ...nodes] shape (see isFilterAST from spec).\n // For complex filter expressions, use .query() which builds a proper QueryAST.\n if (this.isFilterAST(filterValue) || Array.isArray(filterValue)) {\n // AST or any array → serialize as JSON in `filter` param\n queryParams.set('filter', JSON.stringify(filterValue));\n } else if (typeof filterValue === 'object' && filterValue !== null) {\n // Plain key-value map → append each as individual query params\n Object.entries(filterValue as Record<string, unknown>).forEach(([k, v]) => {\n if (v !== undefined && v !== null) {\n queryParams.append(k, String(v));\n }\n });\n }\n }\n \n // 5. Handle Aggregations & GroupBy (Pass through as JSON if present)\n if (normalizedOptions.aggregations) {\n queryParams.set('aggregations', JSON.stringify(normalizedOptions.aggregations));\n }\n if (normalizedOptions.groupBy) {\n queryParams.set('groupBy', normalizedOptions.groupBy.join(','));\n }\n\n const res = await this.fetch(`${this.baseUrl}${route}/${object}?${queryParams.toString()}`);\n return this.unwrapResponse<PaginatedResult<T>>(res);\n },\n\n get: async <T = any>(object: string, id: string): Promise<GetDataResult<T>> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/${id}`);\n return this.unwrapResponse<GetDataResult<T>>(res);\n },\n\n create: async <T = any>(object: string, data: Partial<T>): Promise<CreateDataResult<T>> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${object}`, {\n method: 'POST',\n body: JSON.stringify(data)\n });\n return this.unwrapResponse<CreateDataResult<T>>(res);\n },\n\n createMany: async <T = any>(object: string, data: Partial<T>[]): Promise<T[]> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/createMany`, {\n method: 'POST',\n body: JSON.stringify(data)\n });\n return this.unwrapResponse<T[]>(res);\n },\n\n update: async <T = any>(\n object: string,\n id: string,\n data: Partial<T>,\n opts?: { ifMatch?: string },\n ): Promise<UpdateDataResult<T>> => {\n const route = this.getRoute('data');\n const headers: Record<string, string> = {};\n // Optimistic Concurrency Control: when the caller passes\n // `opts.ifMatch` (typically the `updated_at` value they read), we\n // forward it as a standard `If-Match` header. The server returns\n // `409 CONCURRENT_UPDATE` if the record has been modified since.\n // See packages/objectql/src/protocol.ts ConcurrentUpdateError.\n if (opts?.ifMatch) headers['If-Match'] = String(opts.ifMatch);\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/${id}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n ...(Object.keys(headers).length ? { headers } : {}),\n });\n return this.unwrapResponse<UpdateDataResult<T>>(res);\n },\n\n /**\n * Batch update multiple records\n * Uses the new BatchUpdateRequest schema with full control over options\n */\n batch: async (object: string, request: BatchUpdateRequest): Promise<BatchUpdateResponse> => {\n const route = this.getRoute('data');\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/batch`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<BatchUpdateResponse>(res);\n },\n\n /**\n * Update multiple records (simplified batch update)\n * Convenience method for batch updates without full BatchUpdateRequest\n */\n updateMany: async <T = any>(\n object: string, \n records: Array<{ id: string; data: Partial<T> }>,\n options?: BatchOptions\n ): Promise<BatchUpdateResponse> => {\n const route = this.getRoute('data');\n const request: UpdateManyRequest = {\n records,\n options\n };\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/updateMany`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<BatchUpdateResponse>(res);\n },\n\n delete: async (\n object: string,\n id: string,\n opts?: { ifMatch?: string },\n ): Promise<DeleteDataResult> => {\n const route = this.getRoute('data');\n const headers: Record<string, string> = {};\n // OCC: same opt-in protocol as `update`. See note there.\n if (opts?.ifMatch) headers['If-Match'] = String(opts.ifMatch);\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/${id}`, {\n method: 'DELETE',\n ...(Object.keys(headers).length ? { headers } : {}),\n });\n return this.unwrapResponse<DeleteDataResult>(res);\n },\n\n /**\n * Delete multiple records by IDs\n */\n deleteMany: async(object: string, ids: string[], options?: BatchOptions): Promise<BatchUpdateResponse> => {\n const route = this.getRoute('data');\n const request: DeleteManyRequest = {\n ids,\n options\n };\n const res = await this.fetch(`${this.baseUrl}${route}/${object}/deleteMany`, {\n method: 'POST',\n body: JSON.stringify(request)\n });\n return this.unwrapResponse<BatchUpdateResponse>(res);\n }\n };\n\n\n\n /**\n * Private Helpers\n */\n\n private isFilterAST(filter: any): boolean {\n // Delegate to the spec-exported structural validator instead of naive Array.isArray.\n // This checks for valid AST shapes: [field, op, val], [logic, ...nodes], or [[cond], ...].\n return isFilterAST(filter);\n }\n\n /**\n * Unwrap the standard REST API response envelope.\n * The HTTP layer wraps responses as `{ success: boolean, data: T, meta? }`\n * (see BaseResponseSchema in contract.zod.ts).\n * This method strips the envelope and returns the inner `data` payload\n * so callers receive the spec-level type (e.g. GetMetaTypesResponse).\n */\n private async unwrapResponse<T>(res: Response): Promise<T> {\n const body = await res.json();\n // If the body has a `success` flag it's a BaseResponse envelope\n if (body && typeof body.success === 'boolean' && 'data' in body) {\n return body.data as T;\n }\n // Already unwrapped or non-standard\n return body as T;\n }\n\n private async fetch(url: string, options: RequestInit = {}): Promise<Response> {\n this.logger.debug('HTTP request', { \n method: options.method || 'GET',\n url,\n hasBody: !!options.body\n });\n \n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(options.headers as Record<string, string> || {}),\n };\n\n if (this.token) {\n headers['Authorization'] = `Bearer ${this.token}`;\n }\n\n if (this.environmentId) {\n headers['X-Environment-Id'] = this.environmentId;\n }\n\n // Carry the in-app locale so the server resolves metadata translations\n // for the chosen UI language. Don't clobber a caller-supplied header\n // (case-insensitive check — `headers` is spread from options above).\n if (this.locale && !Object.keys(headers).some((h) => h.toLowerCase() === 'accept-language')) {\n headers['Accept-Language'] = this.locale;\n }\n\n const res = await this.fetchImpl(url, { ...options, headers });\n \n this.logger.debug('HTTP response', { \n method: options.method || 'GET',\n url,\n status: res.status,\n ok: res.ok\n });\n \n if (!res.ok) {\n let errorBody: any;\n try {\n errorBody = await res.json();\n } catch {\n errorBody = { message: res.statusText };\n }\n \n this.logger.error('HTTP request failed', undefined, { \n method: options.method || 'GET',\n url,\n status: res.status,\n error: errorBody\n });\n \n // Create a standardized error if the response includes error details.\n //\n // Server may shape the body as any of:\n // { message: '...' }\n // { error: { code, message } }\n // { error: 'CODE: human readable' } ← plain-string variant (e.g. RECORD_LOCKED)\n // { error: '...' , code: '...' }\n // Without the plain-string branch we'd silently fall back to\n // `res.statusText` (\"Bad Request\") and hide the actual reason from\n // callers — which made debugging things like the approval lock\n // (\"RECORD_LOCKED: …\") needlessly painful.\n const errorMessage =\n errorBody?.message\n ?? errorBody?.error?.message\n ?? (typeof errorBody?.error === 'string' ? errorBody.error : undefined)\n ?? res.statusText;\n const errorCode = errorBody?.code || errorBody?.error?.code;\n const error = new Error(`[ObjectStack] ${errorCode ? `${errorCode}: ` : ''}${errorMessage}`) as any;\n \n // Attach error details for programmatic access\n error.code = errorCode;\n error.category = errorBody?.category;\n error.httpStatus = res.status;\n error.retryable = errorBody?.retryable;\n error.details = errorBody?.details || errorBody;\n \n throw error;\n }\n \n return res;\n }\n\n /**\n * Get the conventional route path for a given API endpoint type\n * ObjectStack uses standard conventions: /api/v1/data, /api/v1/meta, /api/v1/ui\n */\n private getRoute(type: ApiRouteType): string {\n // 1. Use discovered routes if available (only for ApiRoutes keys, not client-specific keys)\n const routes = this.discoveryInfo?.routes;\n if (routes) {\n const key = type as keyof ApiRoutes;\n const discovered = routes[key];\n if (discovered) return discovered;\n }\n\n // 2. Fallback to conventions (covers all ApiRoutes keys + client-specific virtual routes)\n const routeMap: Record<ApiRouteType, string> = {\n data: '/api/v1/data',\n metadata: '/api/v1/meta',\n discovery: '/api/v1/discovery',\n ui: '/api/v1/ui',\n auth: '/api/v1/auth',\n analytics: '/api/v1/analytics',\n storage: '/api/v1/storage',\n automation: '/api/v1/automation',\n packages: '/api/v1/packages',\n permissions: '/api/v1/permissions',\n realtime: '/api/v1/realtime',\n workflow: '/api/v1/workflow',\n approvals: '/api/v1/approvals',\n views: '/api/v1/ui/views',\n notifications: '/api/v1/notifications',\n ai: '/api/v1/ai',\n i18n: '/api/v1/i18n',\n feed: '/api/v1/feed',\n graphql: '/graphql',\n };\n \n return routeMap[type] || `/api/v1/${type}`;\n }\n}\n\n/**\n * Project-scoped sub-client.\n *\n * Wraps an {@link ObjectStackClient} and prefixes every request with\n * `/api/v1/environments/:environmentId/...` so a single client instance can talk to\n * multiple projects without mutating global state.\n *\n * The scoped client exposes the same shape as the `data`, `meta`, `batch`,\n * and `packages` namespaces on `ObjectStackClient` — only the URL prefix\n * differs. The server-side dual-mode route registration (see\n * `packages/rest/src/rest-server.ts`) accepts both shapes when\n * `projectResolution` is `'auto'` or `'optional'`.\n */\nexport class ScopedProjectClient {\n private readonly parent: ObjectStackClient;\n private readonly environmentId: string;\n\n constructor(parent: ObjectStackClient, environmentId: string) {\n this.parent = parent;\n this.environmentId = environmentId;\n }\n\n /** The environmentId this client is scoped to. */\n getProjectId(): string { return this.environmentId; }\n\n /** Prefix segment inserted between the baseUrl and the resource path. */\n private scope(): string { return `/api/v1/environments/${encodeURIComponent(this.environmentId)}`; }\n\n private url(suffix: string): string {\n return `${this.parent._baseUrl()}${this.scope()}${suffix}`;\n }\n\n /**\n * Metadata operations scoped to this project.\n */\n meta = {\n getTypes: async (): Promise<GetMetaTypesResponse> => {\n const res = await this.parent._fetch(this.url('/meta'));\n return this.parent._unwrap<GetMetaTypesResponse>(res);\n },\n getItems: async (type: string, options?: { packageId?: string }): Promise<GetMetaItemsResponse> => {\n const params = new URLSearchParams();\n if (options?.packageId) params.set('package', options.packageId);\n const qs = params.toString();\n const res = await this.parent._fetch(this.url(`/meta/${type}${qs ? `?${qs}` : ''}`));\n return this.parent._unwrap<GetMetaItemsResponse>(res);\n },\n getItem: async (type: string, name: string, options?: { packageId?: string }) => {\n const params = new URLSearchParams();\n if (options?.packageId) params.set('package', options.packageId);\n const qs = params.toString();\n const res = await this.parent._fetch(this.url(`/meta/${type}/${name}${qs ? `?${qs}` : ''}`));\n return this.parent._unwrap(res);\n },\n saveItem: async (type: string, name: string, item: any) => {\n const res = await this.parent._fetch(this.url(`/meta/${type}/${name}`), {\n method: 'PUT',\n body: JSON.stringify(item),\n });\n return this.parent._unwrap(res);\n },\n deleteItem: async (type: string, name: string): Promise<{ type: string; name: string; deleted: boolean }> => {\n const res = await this.parent._fetch(this.url(`/meta/${encodeURIComponent(type)}/${encodeURIComponent(name)}`), {\n method: 'DELETE',\n });\n return this.parent._unwrap(res);\n },\n getHistory: async (\n type: string,\n name: string,\n options?: { sinceSeq?: number; limit?: number },\n ) => {\n const params = new URLSearchParams();\n if (options?.sinceSeq !== undefined) params.set('sinceSeq', String(options.sinceSeq));\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n const qs = params.toString();\n const res = await this.parent._fetch(\n this.url(`/meta/${encodeURIComponent(type)}/${encodeURIComponent(name)}/history${qs ? `?${qs}` : ''}`),\n );\n return this.parent._unwrap(res);\n },\n };\n\n /**\n * Data operations scoped to this project.\n *\n * Mirrors the query / find / get / create / update / delete / batch\n * surface on {@link ObjectStackClient}. URL construction differs only\n * in the prefix — query parameter serialization is identical.\n */\n data = {\n query: async <T = any>(object: string, query: Partial<QueryAST>): Promise<PaginatedResult<T>> => {\n const res = await this.parent._fetch(this.url(`/data/${object}/query`), {\n method: 'POST',\n body: JSON.stringify(query),\n });\n return this.parent._unwrap<PaginatedResult<T>>(res);\n },\n find: async <T = any>(object: string, options: QueryOptions | QueryOptionsV2 = {}): Promise<PaginatedResult<T>> => {\n const queryParams = new URLSearchParams();\n\n const v2 = options as QueryOptionsV2;\n const normalizedOptions: QueryOptions = {} as QueryOptions;\n if ('where' in options || 'fields' in options || 'orderBy' in options || 'offset' in options) {\n if (v2.where) normalizedOptions.filter = v2.where as any;\n if (v2.fields) normalizedOptions.select = v2.fields;\n if (v2.orderBy) normalizedOptions.sort = v2.orderBy as any;\n if (v2.limit != null) normalizedOptions.top = v2.limit;\n if (v2.offset != null) normalizedOptions.skip = v2.offset;\n if (v2.aggregations) normalizedOptions.aggregations = v2.aggregations;\n if (v2.groupBy) normalizedOptions.groupBy = v2.groupBy;\n } else {\n Object.assign(normalizedOptions, options);\n }\n\n if (normalizedOptions.top) queryParams.set('top', normalizedOptions.top.toString());\n if (normalizedOptions.skip) queryParams.set('skip', normalizedOptions.skip.toString());\n if (normalizedOptions.sort) {\n if (Array.isArray(normalizedOptions.sort) && typeof normalizedOptions.sort[0] === 'object') {\n queryParams.set('sort', JSON.stringify(normalizedOptions.sort));\n } else {\n const sortVal = Array.isArray(normalizedOptions.sort) ? normalizedOptions.sort.join(',') : normalizedOptions.sort;\n queryParams.set('sort', sortVal as string);\n }\n }\n if (normalizedOptions.select) {\n queryParams.set('select', normalizedOptions.select.join(','));\n }\n const filterValue = normalizedOptions.filter ?? normalizedOptions.filters;\n if (filterValue) {\n if (this.parent._isFilterAST(filterValue) || Array.isArray(filterValue)) {\n queryParams.set('filter', JSON.stringify(filterValue));\n } else if (typeof filterValue === 'object' && filterValue !== null) {\n Object.entries(filterValue as Record<string, unknown>).forEach(([k, v]) => {\n if (v !== undefined && v !== null) {\n queryParams.append(k, String(v));\n }\n });\n }\n }\n if (normalizedOptions.aggregations) {\n queryParams.set('aggregations', JSON.stringify(normalizedOptions.aggregations));\n }\n if (normalizedOptions.groupBy) {\n queryParams.set('groupBy', normalizedOptions.groupBy.join(','));\n }\n\n const qs = queryParams.toString();\n const res = await this.parent._fetch(this.url(`/data/${object}${qs ? `?${qs}` : ''}`));\n return this.parent._unwrap<PaginatedResult<T>>(res);\n },\n get: async <T = any>(object: string, id: string): Promise<GetDataResult<T>> => {\n const res = await this.parent._fetch(this.url(`/data/${object}/${id}`));\n return this.parent._unwrap<GetDataResult<T>>(res);\n },\n create: async <T = any>(object: string, data: Partial<T>): Promise<CreateDataResult<T>> => {\n const res = await this.parent._fetch(this.url(`/data/${object}`), {\n method: 'POST',\n body: JSON.stringify(data),\n });\n return this.parent._unwrap<CreateDataResult<T>>(res);\n },\n createMany: async <T = any>(object: string, data: Partial<T>[]): Promise<T[]> => {\n const res = await this.parent._fetch(this.url(`/data/${object}/createMany`), {\n method: 'POST',\n body: JSON.stringify(data),\n });\n return this.parent._unwrap<T[]>(res);\n },\n update: async <T = any>(object: string, id: string, data: Partial<T>): Promise<UpdateDataResult<T>> => {\n const res = await this.parent._fetch(this.url(`/data/${object}/${id}`), {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n return this.parent._unwrap<UpdateDataResult<T>>(res);\n },\n batch: async (object: string, request: BatchUpdateRequest): Promise<BatchUpdateResponse> => {\n const res = await this.parent._fetch(this.url(`/data/${object}/batch`), {\n method: 'POST',\n body: JSON.stringify(request),\n });\n return this.parent._unwrap<BatchUpdateResponse>(res);\n },\n updateMany: async <T = any>(\n object: string,\n records: Array<{ id: string; data: Partial<T> }>,\n options?: BatchOptions,\n ): Promise<BatchUpdateResponse> => {\n const request: UpdateManyRequest = { records, options };\n const res = await this.parent._fetch(this.url(`/data/${object}/updateMany`), {\n method: 'POST',\n body: JSON.stringify(request),\n });\n return this.parent._unwrap<BatchUpdateResponse>(res);\n },\n delete: async (object: string, id: string): Promise<DeleteDataResult> => {\n const res = await this.parent._fetch(this.url(`/data/${object}/${id}`), {\n method: 'DELETE',\n });\n return this.parent._unwrap<DeleteDataResult>(res);\n },\n deleteMany: async (object: string, ids: string[], options?: BatchOptions): Promise<BatchUpdateResponse> => {\n const request: DeleteManyRequest = { ids, options };\n const res = await this.parent._fetch(this.url(`/data/${object}/deleteMany`), {\n method: 'POST',\n body: JSON.stringify(request),\n });\n return this.parent._unwrap<BatchUpdateResponse>(res);\n },\n };\n\n /**\n * Package management scoped to this project.\n * Only the read-path is exposed here — publish / delete remain on the\n * global `client.packages` namespace for now, pending dedicated per-project\n * package tests.\n */\n packages = {\n list: async (): Promise<{ packages: any[]; total: number }> => {\n const res = await this.parent._fetch(this.url('/packages'));\n return this.parent._unwrap<{ packages: any[]; total: number }>(res);\n },\n get: async (id: string, version?: string) => {\n const qs = version ? `?version=${encodeURIComponent(version)}` : '';\n const res = await this.parent._fetch(this.url(`/packages/${encodeURIComponent(id)}${qs}`));\n return this.parent._unwrap<{ package: any }>(res);\n },\n };\n\n /**\n * Automation (Flow) operations scoped to this project.\n *\n * Thin wrapper around the dispatcher's automation routes, mounted under\n * `/api/v1/environments/:environmentId/automation/...`. Surface mirrors the methods\n * needed by Studio's Flow viewer: read flow definition, execute (trigger),\n * list runs, fetch a single run.\n */\n automation = {\n /** Fetch a flow definition by name. */\n getFlow: async <T = any>(name: string): Promise<T> => {\n const res = await this.parent._fetch(this.url(`/automation/${encodeURIComponent(name)}`));\n return this.parent._unwrap<T>(res);\n },\n /**\n * Execute (trigger) a flow by name. The request body is forwarded as the\n * automation execution context (e.g. `{ params, trigger }`).\n */\n execute: async <T = any>(name: string, ctx?: Record<string, any>): Promise<T> => {\n const res = await this.parent._fetch(this.url(`/automation/${encodeURIComponent(name)}/trigger`), {\n method: 'POST',\n body: JSON.stringify(ctx ?? {}),\n });\n return this.parent._unwrap<T>(res);\n },\n /** List recent runs for a flow. */\n listRuns: async <T = any>(\n flowName: string,\n opts?: { limit?: number; cursor?: string },\n ): Promise<T> => {\n const params = new URLSearchParams();\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.cursor) params.set('cursor', opts.cursor);\n const qs = params.toString();\n const res = await this.parent._fetch(\n this.url(`/automation/${encodeURIComponent(flowName)}/runs${qs ? `?${qs}` : ''}`),\n );\n return this.parent._unwrap<T>(res);\n },\n /** Fetch a single run (with step log) for a flow. */\n getRun: async <T = any>(flowName: string, runId: string): Promise<T> => {\n const res = await this.parent._fetch(\n this.url(`/automation/${encodeURIComponent(flowName)}/runs/${encodeURIComponent(runId)}`),\n );\n return this.parent._unwrap<T>(res);\n },\n };\n}\n\n// Re-export type-safe query builder\nexport { QueryBuilder, FilterBuilder, createQuery, createFilter } from './query-builder';\n\n// Re-export realtime API types\nexport { RealtimeAPI, RealtimeSubscriptionFilter, RealtimeEventHandler } from './realtime-api';\n\n// Re-export commonly used types from @objectstack/spec/api for convenience\nexport type {\n BatchUpdateRequest,\n BatchUpdateResponse,\n UpdateManyRequest,\n DeleteManyRequest,\n BatchOptions,\n BatchRecord,\n BatchOperationResult,\n MetadataCacheRequest,\n MetadataCacheResponse,\n StandardErrorCode,\n ErrorCategory,\n GetDiscoveryResponse,\n GetMetaTypesResponse,\n GetMetaItemsResponse,\n CheckPermissionRequest,\n CheckPermissionResponse,\n GetObjectPermissionsResponse,\n GetEffectivePermissionsResponse,\n RealtimeConnectRequest,\n RealtimeConnectResponse,\n RealtimeSubscribeRequest,\n RealtimeSubscribeResponse,\n GetPresenceResponse,\n GetWorkflowConfigResponse,\n GetWorkflowStateResponse,\n WorkflowTransitionRequest,\n WorkflowTransitionResponse,\n ListViewsResponse,\n GetViewResponse,\n CreateViewResponse,\n UpdateViewResponse,\n DeleteViewResponse,\n RegisterDeviceRequest,\n RegisterDeviceResponse,\n ListNotificationsResponse,\n AiNlqRequest,\n AiNlqResponse,\n AiSuggestRequest,\n AiSuggestResponse,\n AiInsightsRequest,\n AiInsightsResponse,\n GetLocalesResponse,\n GetTranslationsResponse,\n GetFieldLabelsResponse,\n RegisterRequest,\n RefreshTokenRequest,\n GetFeedResponse,\n CreateFeedItemResponse,\n UpdateFeedItemResponse,\n DeleteFeedItemResponse,\n AddReactionResponse,\n RemoveReactionResponse,\n PinFeedItemResponse,\n UnpinFeedItemResponse,\n StarFeedItemResponse,\n UnstarFeedItemResponse,\n SearchFeedResponse,\n GetChangelogResponse,\n SubscribeResponse,\n UnsubscribeResponse,\n WellKnownCapabilities,\n GetAuthConfigResponse,\n AuthProviderInfo,\n EmailPasswordConfigPublic,\n AuthFeaturesConfig,\n} from '@objectstack/spec/api';\n\n// Approval runtime types (ADR-0019) — surfaced so SDK consumers can type the\n// `client.approvals` namespace without reaching into `@objectstack/spec`.\nexport type {\n ApprovalRequestRow,\n ApprovalActionRow,\n ApprovalStatus,\n ApprovalDecisionInput,\n ApprovalDecisionResult,\n} from '@objectstack/spec/contracts';\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Realtime API Module for ObjectStackClient\n *\n * Provides real-time event subscription capabilities using long-polling.\n * For production WebSocket/SSE support, extend with transport adapters.\n */\n\nimport type { RealtimeEventPayload } from '@objectstack/spec/contracts';\nimport type { MetadataEvent, DataEvent } from '@objectstack/spec/api';\n\nexport interface RealtimeSubscriptionFilter {\n /** Metadata/object type filter */\n type?: string;\n /** Package ID filter */\n packageId?: string;\n /** Event types to listen for */\n eventTypes?: string[];\n /** Record ID filter (for data events) */\n recordId?: string;\n}\n\nexport type RealtimeEventHandler = (event: RealtimeEventPayload) => void;\n\n/**\n * Realtime API for subscribing to server events\n *\n * Note: Currently uses in-memory adapter. WebSocket/SSE transport planned for future.\n */\nexport class RealtimeAPI {\n // @ts-expect-error - Reserved for future WebSocket/SSE implementation\n private _baseUrl: string;\n // @ts-expect-error - Reserved for future WebSocket/SSE implementation\n private _token?: string;\n private subscriptions = new Map<string, {\n filter: RealtimeSubscriptionFilter;\n handler: RealtimeEventHandler;\n }>();\n private pollInterval?: ReturnType<typeof setInterval>;\n private eventBuffer: RealtimeEventPayload[] = [];\n\n constructor(baseUrl: string, token?: string) {\n this._baseUrl = baseUrl;\n this._token = token;\n }\n\n /**\n * Subscribe to metadata events\n * Returns an unsubscribe function\n */\n subscribeMetadata(\n type: string,\n callback: (event: MetadataEvent) => void,\n options?: { packageId?: string }\n ): () => void {\n const subscriptionId = `metadata-${type}-${Date.now()}`;\n\n this.subscriptions.set(subscriptionId, {\n filter: {\n type,\n packageId: options?.packageId,\n eventTypes: [\n `metadata.${type}.created`,\n `metadata.${type}.updated`,\n `metadata.${type}.deleted`\n ]\n },\n handler: (event) => {\n // Type guard and filter\n if (event.type.startsWith('metadata.')) {\n callback(event as any as MetadataEvent);\n }\n }\n });\n\n // Start polling if not already started\n this.startPolling();\n\n // Return unsubscribe function\n return () => {\n this.subscriptions.delete(subscriptionId);\n if (this.subscriptions.size === 0) {\n this.stopPolling();\n }\n };\n }\n\n /**\n * Subscribe to data record events\n * Returns an unsubscribe function\n */\n subscribeData(\n object: string,\n callback: (event: DataEvent) => void,\n options?: { recordId?: string }\n ): () => void {\n const subscriptionId = `data-${object}-${Date.now()}`;\n\n this.subscriptions.set(subscriptionId, {\n filter: {\n type: object,\n recordId: options?.recordId,\n eventTypes: [\n 'data.record.created',\n 'data.record.updated',\n 'data.record.deleted'\n ]\n },\n handler: (event) => {\n // Type guard and filter\n if (event.type.startsWith('data.') && event.object === object) {\n if (!options?.recordId || (event.payload as any)?.recordId === options.recordId) {\n callback(event as any as DataEvent);\n }\n }\n }\n });\n\n // Start polling if not already started\n this.startPolling();\n\n // Return unsubscribe function\n return () => {\n this.subscriptions.delete(subscriptionId);\n if (this.subscriptions.size === 0) {\n this.stopPolling();\n }\n };\n }\n\n /**\n * Emit an event to all matching subscriptions (client-side only)\n * This is used for in-process event delivery\n */\n private emitEvent(event: RealtimeEventPayload): void {\n for (const sub of this.subscriptions.values()) {\n // Check if event matches subscription filters\n const matchesType = !sub.filter.type ||\n event.type.includes(sub.filter.type) ||\n event.object === sub.filter.type;\n\n const matchesEventType = !sub.filter.eventTypes?.length ||\n sub.filter.eventTypes.includes(event.type);\n\n const matchesPackage = !sub.filter.packageId ||\n (event.payload as any)?.packageId === sub.filter.packageId;\n\n if (matchesType && matchesEventType && matchesPackage) {\n try {\n sub.handler(event);\n } catch (error) {\n console.error('Error in realtime event handler:', error);\n }\n }\n }\n }\n\n /**\n * Start polling for events (fallback mechanism)\n * In production, this would be replaced with WebSocket/SSE\n */\n private startPolling(): void {\n if (this.pollInterval) return;\n\n // For now, we rely on the in-memory adapter within the same process\n // Events are delivered synchronously via the IRealtimeService\n // This polling is a placeholder for future WebSocket/SSE implementation\n\n // Poll every 2 seconds for buffered events\n this.pollInterval = setInterval(() => {\n // Process any buffered events\n while (this.eventBuffer.length > 0) {\n const event = this.eventBuffer.shift();\n if (event) {\n this.emitEvent(event);\n }\n }\n }, 2000);\n }\n\n /**\n * Stop polling for events\n */\n private stopPolling(): void {\n if (this.pollInterval) {\n clearInterval(this.pollInterval);\n this.pollInterval = undefined;\n }\n }\n\n /**\n * Internal method to buffer events from server\n * This would be called by WebSocket/SSE handlers in production\n */\n _bufferEvent(event: RealtimeEventPayload): void {\n this.eventBuffer.push(event);\n }\n\n /**\n * Disconnect and clean up all subscriptions\n */\n disconnect(): void {\n this.stopPolling();\n this.subscriptions.clear();\n this.eventBuffer = [];\n }\n}\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Type-Safe Query Builder\n * \n * Provides a fluent API for building ObjectStack queries with:\n * - Compile-time type checking\n * - Intelligent code completion\n * - Runtime validation\n * - Type-safe filters and selections\n */\n\nimport { QueryAST, FilterCondition, SortNode } from '@objectstack/spec/data';\n\n/**\n * Type-safe filter builder\n */\nexport class FilterBuilder<T = any> {\n private conditions: FilterCondition[] = [];\n\n /**\n * Equality filter: field = value\n */\n equals<K extends keyof T>(field: K, value: T[K]): this {\n this.conditions.push([field as string, '=', value]);\n return this;\n }\n\n /**\n * Not equals filter: field != value\n */\n notEquals<K extends keyof T>(field: K, value: T[K]): this {\n this.conditions.push([field as string, '!=', value]);\n return this;\n }\n\n /**\n * Greater than filter: field > value\n */\n greaterThan<K extends keyof T>(field: K, value: T[K]): this {\n this.conditions.push([field as string, '>', value]);\n return this;\n }\n\n /**\n * Greater than or equal filter: field >= value\n */\n greaterThanOrEqual<K extends keyof T>(field: K, value: T[K]): this {\n this.conditions.push([field as string, '>=', value]);\n return this;\n }\n\n /**\n * Less than filter: field < value\n */\n lessThan<K extends keyof T>(field: K, value: T[K]): this {\n this.conditions.push([field as string, '<', value]);\n return this;\n }\n\n /**\n * Less than or equal filter: field <= value\n */\n lessThanOrEqual<K extends keyof T>(field: K, value: T[K]): this {\n this.conditions.push([field as string, '<=', value]);\n return this;\n }\n\n /**\n * IN filter: field IN (value1, value2, ...)\n */\n in<K extends keyof T>(field: K, values: T[K][]): this {\n this.conditions.push([field as string, 'in', values]);\n return this;\n }\n\n /**\n * NOT IN filter: field NOT IN (value1, value2, ...)\n */\n notIn<K extends keyof T>(field: K, values: T[K][]): this {\n this.conditions.push([field as string, 'not_in', values]);\n return this;\n }\n\n /**\n * LIKE filter: field LIKE pattern\n */\n like<K extends keyof T>(field: K, pattern: string): this {\n this.conditions.push([field as string, 'like', pattern]);\n return this;\n }\n\n /**\n * IS NULL filter: field IS NULL\n */\n isNull<K extends keyof T>(field: K): this {\n this.conditions.push([field as string, 'is_null', null]);\n return this;\n }\n\n /**\n * IS NOT NULL filter: field IS NOT NULL\n */\n isNotNull<K extends keyof T>(field: K): this {\n this.conditions.push([field as string, 'is_not_null', null]);\n return this;\n }\n\n /**\n * BETWEEN filter: field BETWEEN min AND max\n */\n between<K extends keyof T>(field: K, min: T[K], max: T[K]): this {\n this.conditions.push(['and', [field as string, '>=', min], [field as string, '<=', max]] as FilterCondition);\n return this;\n }\n\n /**\n * CONTAINS filter: field contains value (case-insensitive LIKE %value%)\n */\n contains<K extends keyof T>(field: K, value: string): this {\n this.conditions.push([field as string, 'like', `%${value}%`]);\n return this;\n }\n\n /**\n * STARTS WITH filter: field starts with value (LIKE value%)\n */\n startsWith<K extends keyof T>(field: K, value: string): this {\n this.conditions.push([field as string, 'like', `${value}%`]);\n return this;\n }\n\n /**\n * ENDS WITH filter: field ends with value (LIKE %value)\n */\n endsWith<K extends keyof T>(field: K, value: string): this {\n this.conditions.push([field as string, 'like', `%${value}`]);\n return this;\n }\n\n /**\n * EXISTS filter: field is not null (alias for isNotNull)\n */\n exists<K extends keyof T>(field: K): this {\n this.conditions.push([field as string, 'is_not_null', null]);\n return this;\n }\n\n /**\n * Build the filter condition\n */\n build(): FilterCondition {\n if (this.conditions.length === 0) {\n throw new Error('Filter builder has no conditions');\n }\n if (this.conditions.length === 1) {\n return this.conditions[0];\n }\n // Combine multiple conditions with AND\n return ['and', ...this.conditions];\n }\n\n /**\n * Get raw conditions array\n */\n getConditions(): FilterCondition[] {\n return this.conditions;\n }\n}\n\n/**\n * Type-safe query builder\n */\nexport class QueryBuilder<T = any> {\n private query: Partial<QueryAST> = {};\n private _object: string;\n\n constructor(object: string) {\n this._object = object;\n this.query.object = object;\n }\n\n /**\n * Select specific fields\n */\n select<K extends keyof T>(...fields: K[]): this {\n this.query.fields = fields as string[];\n return this;\n }\n\n /**\n * Add filters using a builder function\n */\n where(builderFn: (builder: FilterBuilder<T>) => void): this {\n const builder = new FilterBuilder<T>();\n builderFn(builder);\n const conditions = builder.getConditions();\n \n if (conditions.length === 1) {\n this.query.where = conditions[0];\n } else if (conditions.length > 1) {\n this.query.where = ['and', ...conditions] as FilterCondition;\n }\n \n return this;\n }\n\n /**\n * Add raw filter condition\n */\n filter(condition: FilterCondition): this {\n this.query.where = condition;\n return this;\n }\n\n /**\n * Sort by fields\n */\n orderBy<K extends keyof T>(field: K, order: 'asc' | 'desc' = 'asc'): this {\n if (!this.query.orderBy) {\n this.query.orderBy = [];\n }\n (this.query.orderBy as SortNode[]).push({\n field: field as string,\n order\n });\n return this;\n }\n\n /**\n * Limit the number of results\n */\n limit(count: number): this {\n this.query.limit = count;\n return this;\n }\n\n /**\n * Skip records (for pagination).\n * @deprecated Prefer `.offset()` for alignment with Spec canonical field names.\n */\n skip(count: number): this {\n this.query.offset = count;\n return this;\n }\n\n /**\n * Offset records (for pagination) — canonical alias for `.skip()`\n */\n offset(count: number): this {\n this.query.offset = count;\n return this;\n }\n\n /**\n * Paginate results\n */\n paginate(page: number, pageSize: number): this {\n this.query.limit = pageSize;\n this.query.offset = (page - 1) * pageSize;\n return this;\n }\n\n /**\n * Group by fields\n */\n groupBy<K extends keyof T>(...fields: K[]): this {\n this.query.groupBy = fields as string[];\n return this;\n }\n\n /**\n * Expand (eager-load) a related object with an optional sub-query\n */\n expand(relation: string, subQuery?: Partial<QueryAST>): this {\n if (!this.query.expand) {\n this.query.expand = {};\n }\n (this.query.expand as Record<string, any>)[relation] = subQuery || {};\n return this;\n }\n\n /**\n * Add full-text search\n */\n search(query: string, options?: { fields?: string[]; fuzzy?: boolean }): this {\n (this.query as any).search = { query, ...options };\n return this;\n }\n\n /**\n * Set cursor for keyset pagination\n */\n cursor(cursor: Record<string, any>): this {\n (this.query as any).cursor = cursor;\n return this;\n }\n\n /**\n * Enable SELECT DISTINCT\n */\n distinct(): this {\n (this.query as any).distinct = true;\n return this;\n }\n\n /**\n * Build the final query AST\n */\n build(): QueryAST {\n return {\n object: this._object,\n ...this.query\n } as QueryAST;\n }\n\n /**\n * Get the current query state\n */\n getQuery(): Partial<QueryAST> {\n return { ...this.query };\n }\n}\n\n/**\n * Create a type-safe query builder for an object\n */\nexport function createQuery<T = any>(object: string): QueryBuilder<T> {\n return new QueryBuilder<T>(object);\n}\n\n/**\n * Create a type-safe filter builder\n */\nexport function createFilter<T = any>(): FilterBuilder<T> {\n return new FilterBuilder<T>();\n}\n"],"mappings":"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","names":[]}