buildx-sdk 1.8.20 → 1.8.21
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/README.md +11 -6
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/ApiKeys.d.ts +3 -3
- package/dist/services/Auth.d.ts +4 -14
- package/dist/services/BaseService.d.ts +5 -5
- package/dist/types/index.d.ts +0 -1
- package/package.json +1 -1
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/services/Auth.ts","../src/services/Projects.ts","../src/services/Collections.ts","../src/services/Storage.ts","../src/services/Flows.ts","../src/services/Templates.ts","../src/services/Functions.ts","../src/services/BuildxObjects.ts","../src/services/ApiKeys.ts","../src/services/Onboarding.ts","../src/services/Crypto.ts","../../buildx-common/build/error/index.mjs","../src/services/BaseService.ts","../src/Buildx.ts"],"sourcesContent":["import { BaseService } from \"./BaseService\";\nimport {\n\tAuthUser,\n\tAuthResponse,\n\tLoginCredentials,\n\tGoogleCredentials,\n\tEotpRequest,\n\tEotpVerify,\n\tDeviceTrustOtpVerifyRequest,\n\tPasswordResetRequest,\n\tPasswordResetPayload,\n\tChangePasswordRequest,\n\tPublicOnboardingOtpRequestPayload,\n\tPublicOnboardingOtpRequestData,\n\tPublicOnboardingOtpVerifyPayload,\n\tPublicOnboardingOtpVerifyData,\n\tPublicOnboardingCompletePayload,\n\tPublicOnboardingCompleteData,\n\tErrorResponse,\n\tSuccessResponse\n} from \"../types/index\";\n\n/**\n * Authentication service for Buildx\n * Handles user authentication, login, signup, and user management\n * \n * @example\n * ```typescript\n * const auth = buildx.auth();\n * \n * // Login with username and password\n * const result = await auth.login({ username: 'user', password: 'pass' });\n * \n * // Get current user\n * const user = await auth.getCurrentUser();\n * \n * // Sign up new user\n * const newUser = await auth.signup({ username: 'newuser', password: 'pass' });\n * ```\n */\nexport class Auth {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Set the access token\n\t */\n\tsetAccessToken(token: string | null): void {\n\t\tthis.baseService.setAccessToken(token);\n\t}\n\n\t/**\n\t * Get the access token\n\t */\n\tgetAccessToken(): string | null {\n\t\treturn this.baseService.getAccessToken();\n\t}\n\n\t/**\n\t * Set the refresh token\n\t */\n\tsetRefreshToken(token: string | null): void {\n\t\tthis.baseService.setRefreshToken(token);\n\t}\n\n\t/**\n\t * Get the refresh token\n\t */\n\tgetRefreshToken(): string | null {\n\t\treturn this.baseService.getRefreshToken();\n\t}\n\n\t/**\n\t * Set optional client identifier used for device trust auth\n\t */\n\tsetClientId(clientId: string | null): void {\n\t\tthis.baseService.setClientId(clientId);\n\t}\n\n\t/**\n\t * Get optional client identifier used for device trust auth\n\t */\n\tgetClientId(): string | null {\n\t\treturn this.baseService.getClientId();\n\t}\n\n\t/**\n\t * Set optional client proof (device token) used for device trust auth\n\t */\n\tsetClientProof(clientProof: string | null): void {\n\t\tthis.baseService.setClientProof(clientProof);\n\t}\n\n\t/**\n\t * Get optional client proof (device token) used for device trust auth\n\t */\n\tgetClientProof(): string | null {\n\t\treturn this.baseService.getClientProof();\n\t}\n\n\t/**\n\t * Clear all stored tokens\n\t */\n\tclearTokens(): void {\n\t\tthis.baseService.clearTokens();\n\t}\n\n\t/**\n\t * Check if user is authenticated\n\t */\n\tisAuthenticated(): boolean {\n\t\treturn this.baseService.isAuthenticated();\n\t}\n\n\t/**\n\t * Set auth project scope for auth route selection.\n\t * - null => buildx auth mode (no /:project_id prefix)\n\t * - \"<project-id>\" => project-based auth mode\n\t */\n\tsetProjectScope(projectId: string | null): void {\n\t\tconst normalized = String(projectId || \"\").trim();\n\t\tthis.baseService.updateConfig({\n\t\t\t...this.baseService.config,\n\t\t\tprojectId: normalized || \"default\",\n\t\t});\n\t}\n\n\t/**\n\t * Get current auth project scope.\n\t * Returns null when current scope is buildx/root mode.\n\t */\n\tgetProjectScope(): string | null {\n\t\tconst projectId = String(this.baseService.config.projectId || \"\").trim();\n\t\tif (!projectId || projectId === \"default\") return null;\n\t\treturn projectId;\n\t}\n\n\t/**\n\t * Store tokens from authentication response\n\t */\n\tprivate storeTokens(response: AuthResponse | AuthUser | null | undefined): void {\n\t\tif (!response || typeof response !== \"object\") {\n\t\t\treturn;\n\t\t}\n\t\tconst accessToken = (response as any).token || (response as any).access_token || null;\n\t\tconst refreshToken = (response as any).refresh_token || (response as any).refreshToken || null;\n\t\tif (accessToken) {\n\t\t\tthis.baseService.setAccessToken(accessToken);\n\t\t}\n\t\tif (refreshToken) {\n\t\t\tthis.baseService.setRefreshToken(refreshToken);\n\t\t\tthis.baseService.setClientProof(refreshToken);\n\t\t} else if (accessToken) {\n\t\t\tthis.baseService.setClientProof(accessToken);\n\t\t}\n\t}\n\n\t/**\n\t * Check if response is an error response\n\t */\n\tprivate isErrorResponse(response: any): response is ErrorResponse {\n\t\treturn response && typeof response === \"object\" && \"success\" in response && response.success === false;\n\t}\n\n\tprivate hasProjectScope(): boolean {\n\t\tconst projectId = this.baseService.config.projectId;\n\t\treturn !!projectId && projectId !== \"default\";\n\t}\n\n\tprivate getAuthClientContext(): { client_id?: string; client_proof?: string } {\n\t\tconst clientId = this.baseService.getClientId();\n\t\tconst clientProof = this.baseService.getClientProof();\n\t\tconst payload: { client_id?: string; client_proof?: string } = {};\n\t\tif (clientId) payload.client_id = clientId;\n\t\tif (clientProof) payload.client_proof = clientProof;\n\t\treturn payload;\n\t}\n\n\tprivate getAuthClientHeaders(): Record<string, string> {\n\t\tconst clientId = this.baseService.getClientId();\n\t\tconst clientProof = this.baseService.getClientProof();\n\t\tconst headers: Record<string, string> = {};\n\t\tif (clientId) headers[\"x-client-id\"] = clientId;\n\t\tif (clientProof) headers[\"x-client-proof\"] = clientProof;\n\t\treturn headers;\n\t}\n\n\tprivate buildAuthUrl(path: string, options?: { requireProjectScope?: boolean }): string {\n\t\tconst projectId = this.baseService.config.projectId;\n\t\tconst suffix = path.startsWith(\"/auth\") ? path : `/auth${path.startsWith(\"/\") ? path : `/${path}`}`;\n\n\t\tif (projectId && projectId !== \"default\") {\n\t\t\treturn `/${projectId}${suffix}`;\n\t\t}\n\n\t\tif (options?.requireProjectScope) {\n\t\t\tthrow new Error(\"Project ID is required for this auth endpoint\");\n\t\t}\n\n\t\treturn suffix;\n\t}\n\n\t/**\n\t * Login with username and password\n\t */\n\tasync login(credentials: LoginCredentials): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/login\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(\n\t\t\turl,\n\t\t\t{ ...credentials, ...this.getAuthClientContext() },\n\t\t\t{ headers: this.getAuthClientHeaders() }\n\t\t);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Login with Google credentials\n\t */\n\tasync loginWithGoogle(credentials: GoogleCredentials): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/google\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(\n\t\t\turl,\n\t\t\t{ ...credentials, ...this.getAuthClientContext() },\n\t\t\t{ headers: this.getAuthClientHeaders() }\n\t\t);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Sign up a new user\n\t */\n\tasync signup(credentials: LoginCredentials): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/signup\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(\n\t\t\turl,\n\t\t\t{ ...credentials, ...this.getAuthClientContext() },\n\t\t\t{ headers: this.getAuthClientHeaders() }\n\t\t);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Request email OTP for authentication\n\t */\n\tasync requestEotp(request: EotpRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/eotp/auth/request\", { requireProjectScope: true });\n\t\treturn await this.baseService.post(url, request);\n\t}\n\n\t/**\n\t * Request OTP for login (alias of requestEotp)\n\t */\n\tasync requestEotpAuth(request: EotpRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\treturn this.requestEotp(request);\n\t}\n\n\t/**\n\t * Request OTP for login (alias of requestEotp)\n\t */\n\tasync requestOtpLogin(request: EotpRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\treturn this.requestEotp(request);\n\t}\n\n\t/**\n\t * Verify email OTP\n\t */\n\tasync verifyEotp(verify: EotpVerify): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/eotp/auth/verify\", { requireProjectScope: true });\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(\n\t\t\turl,\n\t\t\t{ ...verify, ...this.getAuthClientContext() },\n\t\t\t{ headers: this.getAuthClientHeaders() }\n\t\t);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Verify OTP for login (alias of verifyEotp)\n\t */\n\tasync verifyEotpAuth(verify: EotpVerify): Promise<AuthUser | ErrorResponse> {\n\t\treturn this.verifyEotp(verify);\n\t}\n\n\t/**\n\t * Verify OTP for login (alias of verifyEotp)\n\t */\n\tasync verifyOtpLogin(verify: EotpVerify): Promise<AuthUser | ErrorResponse> {\n\t\treturn this.verifyEotp(verify);\n\t}\n\n\t/**\n\t * Request OTP for public onboarding flow (pre-project auth).\n\t * @deprecated Use `buildx.onboarding().requestOtp(...)` instead.\n\t */\n\tasync requestPublicOnboardingOtp(\n\t\tpayload: PublicOnboardingOtpRequestPayload\n\t): Promise<SuccessResponse<PublicOnboardingOtpRequestData> | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/public/onboarding/otp/request\", payload);\n\t}\n\n\t/**\n\t * Verify OTP for public onboarding flow.\n\t * @deprecated Use `buildx.onboarding().verifyOtp(...)` instead.\n\t */\n\tasync verifyPublicOnboardingOtp(\n\t\tpayload: PublicOnboardingOtpVerifyPayload\n\t): Promise<SuccessResponse<PublicOnboardingOtpVerifyData> | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/public/onboarding/otp/verify\", payload);\n\t}\n\n\t/**\n\t * Complete public onboarding and return project-scoped access token.\n\t * @deprecated Use `buildx.onboarding().complete(...)` instead.\n\t */\n\tasync completePublicOnboarding(\n\t\tpayload: PublicOnboardingCompletePayload,\n\t\tidempotencyKey: string\n\t): Promise<SuccessResponse<PublicOnboardingCompleteData> | ErrorResponse> {\n\t\tconst response = await this.baseService.post<SuccessResponse<PublicOnboardingCompleteData> | ErrorResponse>(\n\t\t\t\"/public/onboarding/complete\",\n\t\t\tpayload,\n\t\t\t{\n\t\t\t\theaders: {\n\t\t\t\t\t\"Idempotency-Key\": idempotencyKey,\n\t\t\t\t},\n\t\t\t}\n\t\t);\n\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\tconst accessToken = (response as any)?.data?.access_token;\n\t\tconst refreshToken = (response as any)?.data?.refresh_token;\n\t\tif (accessToken) {\n\t\t\tthis.baseService.setAccessToken(accessToken);\n\t\t}\n\t\tif (refreshToken) {\n\t\t\tthis.baseService.setRefreshToken(refreshToken);\n\t\t}\n\t\treturn response;\n\t}\n\n\t/**\n\t * Retrieve public onboarding request status by request id.\n\t * @deprecated Use `buildx.onboarding().getRequest(...)` instead.\n\t */\n\tasync getPublicOnboardingRequest(\n\t\trequestId: string\n\t): Promise<SuccessResponse<PublicOnboardingOtpRequestData> | ErrorResponse> {\n\t\treturn await this.baseService.get(`/public/onboarding/request/${encodeURIComponent(requestId)}`);\n\t}\n\n\t/**\n\t * Get current authenticated user\n\t */\n\tasync getCurrentUser(): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/me\");\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Refresh authentication token\n\t */\n\tasync refreshToken(): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/token\");\n\t\tconst response = await this.baseService.post<AuthResponse | SuccessResponse | ErrorResponse>(\n\t\t\turl,\n\t\t\t{},\n\t\t\t{ headers: this.getAuthClientHeaders() }\n\t\t);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tif (response && typeof response === \"object\" && (\"token\" in response && (response as any).token)) {\n\t\t\tthis.storeTokens(response as AuthResponse);\n\t\t}\n\n\t\treturn response as SuccessResponse;\n\t}\n\n\t/**\n\t * Verify device trust OTP challenge and finalize login tokens\n\t */\n\tasync verifyDeviceTrustOtp(payload: DeviceTrustOtpVerifyRequest): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/device-trust/verify\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(\n\t\t\turl,\n\t\t\tpayload,\n\t\t\t{ headers: this.getAuthClientHeaders() }\n\t\t);\n\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Update user password\n\t */\n\tasync updatePassword(password: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/password/update\");\n\t\treturn await this.baseService.post(url, { password });\n\t}\n\n\t/**\n\t * Change current user password\n\t */\n\tasync changePassword(request: ChangePasswordRequest | string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/password/update\");\n\t\tif (typeof request === \"string\") {\n\t\t\treturn await this.baseService.post(url, { password: request });\n\t\t}\n\n\t\tconst password = request.password ?? request.newPassword ?? request.new_password;\n\t\tconst payload: Record<string, any> = { ...request };\n\t\tif (password) {\n\t\t\tpayload.password = password;\n\t\t}\n\t\tif (request.currentPassword && !payload.current_password) {\n\t\t\tpayload.current_password = request.currentPassword;\n\t\t}\n\t\tif (request.newPassword && !payload.new_password) {\n\t\t\tpayload.new_password = request.newPassword;\n\t\t}\n\n\t\treturn await this.baseService.post(url, payload);\n\t}\n\n\t/**\n\t * Admin update user password\n\t */\n\tasync adminUpdatePassword(userId: string, password: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/password/update\");\n\t\treturn await this.baseService.post(url, { user_id: userId, password });\n\t}\n\n\t/**\n\t * Request password reset email\n\t */\n\tasync requestPasswordReset(request: PasswordResetRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/password/reset/request\");\n\t\treturn await this.baseService.post(url, request);\n\t}\n\n\t/**\n\t * Reset password with token\n\t */\n\tasync resetPassword(payload: PasswordResetPayload): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/password/reset\");\n\t\treturn await this.baseService.post(url, payload);\n\t}\n\n\t/**\n\t * Update push notification token\n\t */\n\tasync updatePushToken(token: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.hasProjectScope()\n\t\t\t? `/${this.baseService.config.projectId}/users/push-tokens`\n\t\t\t: \"/users/push-tokens\";\n\t\treturn await this.baseService.post(url, { token });\n\t}\n\n\t/**\n\t * List all users (admin only)\n\t */\n\tasync listUsers(organizationId?: string): Promise<AuthUser[] | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? `/${organizationId}/auth/users`\n\t\t\t: \"/auth/users\";\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Lookup users (for autocomplete/search)\n\t */\n\tasync lookupUsers(organizationId?: string): Promise<AuthUser[] | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? `/${organizationId}/auth/users/lookup`\n\t\t\t: \"/auth/users/lookup\";\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get user by ID\n\t */\n\tasync getUser(userId: string, organizationId?: string): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? `/${organizationId}/auth/user/${userId}`\n\t\t\t: `/auth/user/${userId}`;\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Delete user (admin only)\n\t */\n\tasync deleteUser(userId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(`/auth/user/${userId}/delete`);\n\t\treturn await this.baseService.post(url, {});\n\t}\n} \n","import { BaseService } from \"./BaseService\";\nimport {\n\tProject,\n\tErrorResponse,\n\tSuccessResponse,\n\tProjectLocalePayload,\n\tProjectLocaleValidationResponse,\n} from \"../types/index\";\n\n/**\n * Projects service for Buildx\n * Handles project management operations\n * \n * @example\n * ```typescript\n * const projects = buildx.projects();\n * \n * // List all projects\n * const projectList = await projects.list();\n * \n * // Create a new project\n * const newProject = await projects.create({\n * name: 'My Project',\n * description: 'A new project'\n * });\n * \n * // Get project by ID\n * const project = await projects.get('project-id');\n * ```\n */\nexport class Projects {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all projects\n\t */\n\tasync list(): Promise<Project[] | ErrorResponse> {\n\t\treturn await this.baseService.get(\"/projects\");\n\t}\n\n\t/**\n\t * Get project by ID\n\t */\n\tasync get(projectId: string): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.get(`/project/${projectId}`);\n\t}\n\n\t/**\n\t * Create a new project\n\t */\n\tasync create(projectData: Partial<Project>): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/projects\", projectData);\n\t}\n\n\t/**\n\t * Update project\n\t */\n\tasync update(projectId: string, projectData: Partial<Project>): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.patch(`/project/${projectId}`, projectData);\n\t}\n\n\t/**\n\t * Update project metadata and locale defaults (timezone/language).\n\t */\n\tasync updateMetadata(\n\t\tprojectId: string,\n\t\tpayload: {\n\t\t\tmetadata?: Record<string, any>;\n\t\t\tdefault_language?: string;\n\t\t\ttimezone?: string;\n\t\t}\n\t): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.patch(`/project/${projectId}/metadata`, payload);\n\t}\n\n\t/**\n\t * Validate locale format for project settings.\n\t * Format:\n\t * - default_language: \"en\" | \"en-US\"\n\t * - timezone: \"Asia/Bangkok\" | \"UTC\"\n\t */\n\tasync validateLocale(payload: ProjectLocalePayload): Promise<ProjectLocaleValidationResponse | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/project/locale/validate\", payload);\n\t}\n\n\t/**\n\t * Delete project\n\t */\n\tasync deleteById(projectId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\treturn await this.baseService.delete(`/project/${projectId}`);\n\t}\n\n\t/**\n\t * Backup project\n\t */\n\tasync backup(projectId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst response = await this.baseService.axiosInstance.get(`/project/${projectId}/backup`, {\n\t\t\tresponseType: \"blob\",\n\t\t\theaders: await this.baseService.getHeaders(),\n\t\t});\n\n\t\t// Create download link for browser\n\t\tif (typeof window !== \"undefined\") {\n\t\t\tconst url = window.URL.createObjectURL(response.data);\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tlink.href = url;\n\t\t\tlink.setAttribute(\"download\", `backup_${projectId}.buildx`);\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t\twindow.URL.revokeObjectURL(url);\n\t\t}\n\n\t\treturn { success: true, message: \"Backup downloaded successfully\" };\n\t}\n\n\t/**\n\t * Restore project from backup\n\t */\n\tasync restore(projectId: string, file: File): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"new_project_id\", projectId);\n\t\tformData.append(\"backup_file\", file);\n\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data\" };\n\t\treturn await this.baseService.post(\"/project/import\", formData, { headers });\n\n\t}\n}\n","import { BaseService } from \"./BaseService\";\nimport {\n\tCollection,\n\tDocument,\n\tQueryOptions,\n\tErrorResponse,\n\tSuccessResponse,\n\tImportMapping,\n\tPaginatedResult,\n\tRelationHydrationConfig,\n\tCollectionRealtimeHandlers,\n\tCollectionRealtimeSubscribeOptions,\n\tCollectionRealtimeSubscription,\n\tCollectionRealtimeEvent,\n\tPaginationWebSocketLike,\n} from \"../types/index\";\n\ntype UpdateDocumentOptions = {\n\tupdateOnly?: boolean;\n};\n\ntype CollectionWsResponse = {\n\tid?: string;\n\tok?: boolean;\n\tresult?: any;\n\terror?: string;\n};\n\nclass CollectionWsClient {\n\tprivate socket: PaginationWebSocketLike | null = null;\n\tprivate connectPromise: Promise<void> | null = null;\n\tprivate requestCounter = 0;\n\tprivate readonly pending = new Map<string, { resolve: (value: any) => void; reject: (error: any) => void; timeout: ReturnType<typeof setTimeout> }>();\n\n\tconstructor(\n\t\tprivate readonly baseService: BaseService,\n\t\tprivate readonly collectionId: string,\n\t\tprivate readonly wsFactory?: (url: string) => PaginationWebSocketLike\n\t) { }\n\n\tasync query(action: \"queryWithPagination\" | \"queryRaw\", payload: Record<string, any>, timeoutMs = 30000): Promise<any> {\n\t\tawait this.ensureConnected();\n\t\tif (!this.socket) {\n\t\t\tthrow new Error(\"WebSocket connection is unavailable\");\n\t\t}\n\n\t\tconst id = `${Date.now()}_${++this.requestCounter}`;\n\t\tconst resultPromise = new Promise<any>((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.pending.delete(id);\n\t\t\t\treject(new Error(\"WebSocket pagination timeout\"));\n\t\t\t}, timeoutMs);\n\t\t\tthis.pending.set(id, { resolve, reject, timeout });\n\t\t});\n\n\t\tthis.socket.send(JSON.stringify({\n\t\t\tid,\n\t\t\taction,\n\t\t\tpayload,\n\t\t}));\n\n\t\treturn resultPromise;\n\t}\n\n\tclose() {\n\t\tif (!this.socket) return;\n\t\ttry {\n\t\t\tthis.socket.close();\n\t\t} catch (_error) {\n\t\t\t// noop\n\t\t}\n\t\tthis.socket = null;\n\t\tthis.connectPromise = null;\n\t\tfor (const [, entry] of this.pending.entries()) {\n\t\t\tclearTimeout(entry.timeout);\n\t\t\tentry.reject(new Error(\"WebSocket closed\"));\n\t\t}\n\t\tthis.pending.clear();\n\t}\n\n\tprivate async ensureConnected() {\n\t\tif (this.socket && this.isSocketOpen(this.socket)) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.connectPromise) {\n\t\t\treturn this.connectPromise;\n\t\t}\n\n\t\tthis.connectPromise = new Promise<void>((resolve, reject) => {\n\t\t\tconst GlobalWebSocket = (globalThis as any).WebSocket;\n\t\t\tif (!this.wsFactory && !GlobalWebSocket) {\n\t\t\t\treject(new Error(\"WebSocket is not available in this runtime\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvoid this.baseService.ensureValidAccessToken().then(() => {\n\t\t\t\tconst url = this.buildSocketUrl();\n\t\t\t\tconst socket = this.wsFactory\n\t\t\t\t\t? this.wsFactory(url)\n\t\t\t\t\t: new GlobalWebSocket(url);\n\t\t\t\tthis.socket = socket;\n\t\t\t\tlet settled = false;\n\n\t\t\t\tconst onOpen = () => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\t\t\t\tconst onError = (error: any) => {\n\t\t\t\t\tif (!settled) {\n\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t\tthis.close();\n\t\t\t\t};\n\t\t\t\tconst onClose = () => {\n\t\t\t\t\tif (!settled) {\n\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\treject(new Error(\"WebSocket closed before connection is ready\"));\n\t\t\t\t\t}\n\t\t\t\t\tthis.close();\n\t\t\t\t};\n\t\t\t\tconst onMessage = (event: any) => {\n\t\t\t\t\tlet response: CollectionWsResponse;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresponse = JSON.parse(event?.data || \"{}\");\n\t\t\t\t\t} catch (_error) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst id = response?.id;\n\t\t\t\t\tif (!id) return;\n\t\t\t\t\tconst pending = this.pending.get(id);\n\t\t\t\t\tif (!pending) return;\n\t\t\t\t\tclearTimeout(pending.timeout);\n\t\t\t\t\tthis.pending.delete(id);\n\n\t\t\t\t\tif (response.ok && response.result) {\n\t\t\t\t\t\tpending.resolve(response.result);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tpending.reject(new Error(response.error || \"WebSocket pagination query failed\"));\n\t\t\t\t};\n\n\t\t\t\tif (socket.addEventListener) {\n\t\t\t\t\tsocket.addEventListener(\"open\", onOpen);\n\t\t\t\t\tsocket.addEventListener(\"error\", onError);\n\t\t\t\t\tsocket.addEventListener(\"close\", onClose);\n\t\t\t\t\tsocket.addEventListener(\"message\", onMessage);\n\t\t\t\t} else {\n\t\t\t\t\tsocket.onopen = onOpen;\n\t\t\t\t\tsocket.onerror = onError;\n\t\t\t\t\tsocket.onclose = onClose;\n\t\t\t\t\tsocket.onmessage = onMessage;\n\t\t\t\t}\n\t\t\t}).catch((error) => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t}).finally(() => {\n\t\t\tthis.connectPromise = null;\n\t\t});\n\n\t\treturn this.connectPromise;\n\t}\n\n\tprivate isSocketOpen(socket: PaginationWebSocketLike): boolean {\n\t\tconst openState = (globalThis as any).WebSocket?.OPEN ?? 1;\n\t\treturn socket.readyState === openState;\n\t}\n\n\tprivate buildSocketUrl() {\n\t\tconst endpoint = this.baseService.config.apiEndpoint.replace(/\\/$/, \"\");\n\t\tconst wsEndpoint = endpoint.replace(/^http:/i, \"ws:\").replace(/^https:/i, \"wss:\");\n\t\tconst path = this.baseService.buildProjectUrl(`/${this.collectionId}/data/pagination/ws`);\n\n\t\tconst params = new URLSearchParams();\n\t\tconst apiKey = this.baseService.config.apiKey;\n\t\tif (apiKey) params.set(\"api_key\", apiKey);\n\t\tconst token = this.baseService.getAccessToken();\n\t\tif (token) params.set(\"token\", token);\n\n\t\tconst qs = params.toString();\n\t\treturn `${wsEndpoint}${path}${qs ? `?${qs}` : \"\"}`;\n\t}\n}\n\n/**\n * Collections service for Buildx\n * Handles collection management, documents, and queries\n * \n * @example\n * ```typescript\n * const collections = buildx.collections();\n * \n * // Get all collections\n * const collectionsList = await collections.list();\n * \n * // Get collection schema\n * const schema = await collections.getSchema('collection-id');\n * \n * // Query documents\n * const docs = await collections.query('collection-id', {\n * filter: { status: 'active' },\n * limit: 10\n * });\n * ```\n */\nexport class Collections {\n\tprivate baseService: BaseService;\n\tprivate static readonly RELATION_QUERY_CHUNK_SIZE = 200;\n\tprivate collectionWsClient: CollectionWsClient | null = null;\n\tprivate collectionWsCollectionId: string | null = null;\n\tprivate collectionWsDisabledUntil = 0;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all collections in a project\n\t */\n\tasync list(withStats = false, withBuildx = false): Promise<Collection[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/collections\");\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (withStats) {\n\t\t\tqueryParams.with_stats = true;\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst collections = await this.baseService.get(fullUrl);\n\n\t\tif (Array.isArray(collections) && !withBuildx) {\n\t\t\treturn collections.filter(collection =>\n\t\t\t\tcollection.collection_id && !collection.collection_id.startsWith(\"buildx_\")\n\t\t\t);\n\t\t}\n\n\t\treturn collections;\n\t}\n\n\t/**\n\t * Get collection schema\n\t */\n\tasync getSchema(collectionId: string, depth = 1): Promise<Collection | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/collection/${collectionId}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (depth > 1) {\n\t\t\tqueryParams.depth = depth;\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\treturn await this.baseService.get(fullUrl);\n\t}\n\n\t/**\n\t * Create or update collection\n\t */\n\tasync set(collectionData: Partial<Collection>): Promise<Collection | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/collections\");\n\t\treturn await this.baseService.post(url, collectionData);\n\t}\n\n\t/**\n\t * Delete collection\n\t */\n\tasync deleteCollection(collectionId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/collections/${collectionId}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n\n\t/**\n\t * Query documents in a collection\n\t */\n\tasync query(collectionId: string, options?: QueryOptions): Promise<Document[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}`);\n\t\tconst noPopulate = options?.noPopulate ?? (!!options?.relations && options.relations.length > 0);\n\t\tconst queryParams = this.buildQueryParams({\n\t\t\t...options,\n\t\t\toptions: noPopulate\n\t\t\t\t? {\n\t\t\t\t\t...(options?.options || {}),\n\t\t\t\t\tnoPopulate: true,\n\t\t\t\t}\n\t\t\t\t: options?.options,\n\t\t});\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst result = await this.baseService.get(fullUrl);\n\t\tif (!Array.isArray(result)) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (!options?.relations || options.relations.length === 0) {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst preferWs = (options?.paginationTransport || \"auto\") !== \"http\";\n\t\treturn await this.hydrateRelations(result, options.relations, options.relationSelect, {\n\t\t\tpreferWs,\n\t\t\twsFactory: options.wsFactory,\n\t\t});\n\t}\n\n\t/**\n\t * Query documents without server-side populate.\n\t */\n\tasync queryRaw(collectionId: string, options?: QueryOptions): Promise<Document[] | ErrorResponse> {\n\t\tconst normalizedOptions: QueryOptions = {\n\t\t\t...options,\n\t\t\toptions: {\n\t\t\t\t...(options?.options || {}),\n\t\t\t\tnoPopulate: true,\n\t\t\t},\n\t\t};\n\t\tconst transport = normalizedOptions.paginationTransport || \"http\";\n\t\tif (transport !== \"http\" && Date.now() >= this.collectionWsDisabledUntil) {\n\t\t\ttry {\n\t\t\t\treturn await this.queryRawViaWs(collectionId, normalizedOptions);\n\t\t\t} catch (error: any) {\n\t\t\t\tconsole.warn(\"[buildx-sdk] WS raw query failed, fallback to HTTP\", error?.message || error);\n\t\t\t\tthis.collectionWsDisabledUntil = Date.now() + 30000;\n\t\t\t\tthis.resetCollectionWsClient();\n\t\t\t}\n\t\t}\n\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/raw`);\n\t\tconst queryParams = this.buildQueryParams(normalizedOptions);\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\treturn await this.baseService.get(fullUrl);\n\t}\n\n\t/**\n\t * Query documents with pagination metadata.\n\t */\n\tasync queryWithPagination(collectionId: string, options?: QueryOptions): Promise<PaginatedResult<Document> | ErrorResponse> {\n\t\tconst noPopulate = options?.noPopulate ?? (!!options?.relations && options.relations.length > 0);\n\t\tconst normalizedOptions: QueryOptions = {\n\t\t\t...options,\n\t\t\toptions: noPopulate\n\t\t\t\t? {\n\t\t\t\t\t...(options?.options || {}),\n\t\t\t\t\tnoPopulate: true,\n\t\t\t\t}\n\t\t\t\t: options?.options,\n\t\t};\n\n\t\tconst transport = normalizedOptions.paginationTransport || \"auto\";\n\t\tlet result: PaginatedResult<Document> | ErrorResponse;\n\t\tconst shouldTryWs = transport !== \"http\" && Date.now() >= this.collectionWsDisabledUntil;\n\t\tif (shouldTryWs) {\n\t\t\ttry {\n\t\t\t\tresult = await this.queryWithPaginationViaWs(collectionId, normalizedOptions);\n\t\t\t}\n\t\t\tcatch (error: any) {\n\t\t\t\t// Retry on HTTP endpoint for compatibility and temporarily disable WS attempts.\n\t\t\t\tconsole.warn(\"[buildx-sdk] WS pagination failed, fallback to HTTP\", error?.message || error);\n\t\t\t\tthis.collectionWsDisabledUntil = Date.now() + 30000;\n\t\t\t\tthis.resetCollectionWsClient();\n\t\t\t\tresult = await this.queryWithPaginationViaHttp(collectionId, normalizedOptions);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tresult = await this.queryWithPaginationViaHttp(collectionId, normalizedOptions);\n\t\t}\n\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\tif (!normalizedOptions?.relations || normalizedOptions.relations.length === 0) {\n\t\t\treturn result as PaginatedResult<Document>;\n\t\t}\n\n\t\tconst preferWs = transport !== \"http\";\n\t\tconst hydratedRows = await this.hydrateRelations((result as PaginatedResult<Document>).data || [], normalizedOptions.relations, normalizedOptions.relationSelect, {\n\t\t\tpreferWs,\n\t\t\twsFactory: normalizedOptions.wsFactory,\n\t\t});\n\t\tif (!Array.isArray(hydratedRows)) {\n\t\t\treturn hydratedRows;\n\t\t}\n\n\t\treturn {\n\t\t\t...(result as PaginatedResult<Document>),\n\t\t\tdata: hydratedRows,\n\t\t};\n\t}\n\n\tprivate async queryWithPaginationViaHttp(collectionId: string, options?: QueryOptions): Promise<PaginatedResult<Document> | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/data/pagination`);\n\t\tconst queryParams = this.buildQueryParams(options);\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\t\tconst result = await this.baseService.get(fullUrl);\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\treturn {\n\t\t\t...(result as PaginatedResult<Document>),\n\t\t\tmeta: {\n\t\t\t\t...((result as PaginatedResult<Document>).meta || {}),\n\t\t\t\ttransport: \"http\",\n\t\t\t},\n\t\t} as PaginatedResult<Document>;\n\t}\n\n\tprivate async queryWithPaginationViaWs(collectionId: string, options?: QueryOptions): Promise<PaginatedResult<Document> | ErrorResponse> {\n\t\tconst payload = this.buildQueryParams(options);\n\t\tconst client = this.getOrCreateCollectionWsClient(collectionId, options?.wsFactory);\n\t\tconst result = await client.query(\"queryWithPagination\", payload);\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\treturn {\n\t\t\t...(result as PaginatedResult<Document>),\n\t\t\tmeta: {\n\t\t\t\t...((result as PaginatedResult<Document>).meta || {}),\n\t\t\t\ttransport: \"ws\",\n\t\t\t},\n\t\t} as PaginatedResult<Document>;\n\t}\n\n\tprivate async queryRawViaWs(collectionId: string, options?: QueryOptions): Promise<Document[] | ErrorResponse> {\n\t\tconst payload = this.buildQueryParams(options);\n\t\tconst client = this.getOrCreateCollectionWsClient(collectionId, options?.wsFactory);\n\t\tconst result = await client.query(\"queryRaw\", payload);\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\treturn Array.isArray(result) ? result as Document[] : [];\n\t}\n\n\tprivate getOrCreateCollectionWsClient(collectionId: string, wsFactory?: (url: string) => PaginationWebSocketLike) {\n\t\tif (!this.collectionWsClient || this.collectionWsCollectionId !== collectionId) {\n\t\t\tthis.resetCollectionWsClient();\n\t\t\tthis.collectionWsClient = new CollectionWsClient(this.baseService, collectionId, wsFactory);\n\t\t\tthis.collectionWsCollectionId = collectionId;\n\t\t}\n\t\treturn this.collectionWsClient;\n\t}\n\n\tprivate resetCollectionWsClient() {\n\t\tif (this.collectionWsClient) {\n\t\t\tthis.collectionWsClient.close();\n\t\t}\n\t\tthis.collectionWsClient = null;\n\t\tthis.collectionWsCollectionId = null;\n\t}\n\n\t/**\n\t * Subscribe realtime data events for a collection via WebSocket.\n\t */\n\tsubscribeRealtime(\n\t\tcollectionId: string,\n\t\thandlers: CollectionRealtimeHandlers,\n\t\toptions?: CollectionRealtimeSubscribeOptions\n\t): CollectionRealtimeSubscription {\n\t\tconst GlobalWebSocket = (globalThis as any).WebSocket;\n\t\tconst factory = options?.wsFactory;\n\t\tif (!factory && !GlobalWebSocket) {\n\t\t\tthrow new Error(\"WebSocket is not available in this runtime. Provide wsFactory in options.\");\n\t\t}\n\t\tconst reconnectEnabled = options?.reconnect !== false;\n\t\tconst reconnectDelayMs = typeof options?.reconnectDelayMs === \"number\" && options.reconnectDelayMs >= 0\n\t\t\t? options.reconnectDelayMs\n\t\t\t: 5000;\n\t\tlet socket: PaginationWebSocketLike | null = null;\n\t\tlet hasConnected = false;\n\t\tlet isClosed = false;\n\t\tlet reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\t\tlet disconnectHandled = false;\n\t\tlet connect: (() => Promise<void>) | null = null;\n\n\t\tconst emitConnected = () => {\n\t\t\tif (isClosed || hasConnected) return;\n\t\t\thasConnected = true;\n\t\t\thandlers.onConnected?.();\n\t\t};\n\t\tconst stopReconnectTimer = () => {\n\t\t\tif (!reconnectTimer) return;\n\t\t\tclearTimeout(reconnectTimer);\n\t\t\treconnectTimer = null;\n\t\t};\n\t\tconst buildSocketUrl = async () => {\n\t\t\tconst endpoint = this.baseService.config.apiEndpoint.replace(/\\/$/, \"\");\n\t\t\tconst wsEndpoint = endpoint.replace(/^http:/i, \"ws:\").replace(/^https:/i, \"wss:\");\n\t\t\tconst path = this.baseService.buildProjectUrl(`/${collectionId}/realtime/ws`);\n\n\t\t\tconst params = new URLSearchParams();\n\t\t\tconst apiKey = options?.apiKey || this.baseService.config.apiKey;\n\t\t\tif (apiKey) params.set(\"api_key\", apiKey);\n\t\t\tconst token = options?.token || await this.baseService.ensureValidAccessToken();\n\t\t\tif (token) params.set(\"token\", token);\n\n\t\t\tconst qs = params.toString();\n\t\t\treturn `${wsEndpoint}${path}${qs ? `?${qs}` : \"\"}`;\n\t\t};\n\t\tconst emitEvent = (rawEvent: any) => {\n\t\t\tif (isClosed) return;\n\t\t\ttry {\n\t\t\t\tconst raw = rawEvent?.data;\n\t\t\t\tif (raw == null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet parsed: any;\n\t\t\t\tif (typeof raw === \"string\") {\n\t\t\t\t\tconst text = raw.trim();\n\t\t\t\t\tif (!text) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tparsed = JSON.parse(text);\n\t\t\t\t} else if (typeof raw === \"object\") {\n\t\t\t\t\tparsed = raw;\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (parsed.type === \"ping\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (parsed.type === \"connected\") {\n\t\t\t\t\temitConnected();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst data = {\n\t\t\t\t\t...parsed,\n\t\t\t\t\ttimestamp: typeof parsed.timestamp === \"number\" ? parsed.timestamp : Date.now(),\n\t\t\t\t} as CollectionRealtimeEvent;\n\t\t\t\thandlers.onEvent?.(data);\n\t\t\t}\n\t\t\tcatch (error) {\n\t\t\t\thandlers.onError?.(error);\n\t\t\t}\n\t\t};\n\t\tconst scheduleReconnect = () => {\n\t\t\tif (isClosed || !reconnectEnabled || reconnectTimer) return;\n\t\t\treconnectTimer = setTimeout(() => {\n\t\t\t\treconnectTimer = null;\n\t\t\t\tif (isClosed) return;\n\t\t\t\thasConnected = false;\n\t\t\t\tif (connect) {\n\t\t\t\t\tvoid connect();\n\t\t\t\t}\n\t\t\t}, reconnectDelayMs);\n\t\t};\n\t\tconst handleDisconnect = (error: Error) => {\n\t\t\tif (isClosed || disconnectHandled) return;\n\t\t\tdisconnectHandled = true;\n\t\t\thandlers.onError?.(error);\n\t\t\tscheduleReconnect();\n\t\t};\n\n\t\tconst onOpen = () => {\n\t\t\tdisconnectHandled = false;\n\t\t\temitConnected();\n\t\t};\n\t\tconst onMessage = (event: any) => emitEvent(event);\n\t\tconst onError = (error: any) => {\n\t\t\tif (isClosed) return;\n\t\t\tconst message = error?.message || error?.type || \"Realtime WebSocket error\";\n\t\t\thandleDisconnect(error instanceof Error ? error : new Error(message));\n\t\t};\n\t\tconst onClose = (event: any) => {\n\t\t\tif (isClosed) return;\n\t\t\tconst code = event?.code;\n\t\t\tconst reason = event?.reason;\n\t\t\tconst closeError = new Error(\n\t\t\t\t`Realtime WebSocket closed${code ? ` (code ${code})` : \"\"}${reason ? `: ${reason}` : \"\"}`\n\t\t\t);\n\t\t\thandleDisconnect(closeError);\n\t\t};\n\t\tconnect = async () => {\n\t\t\tstopReconnectTimer();\n\t\t\tconst url = await buildSocketUrl();\n\t\t\tconst nextSocket = factory ? factory(url) : new GlobalWebSocket(url);\n\t\t\tsocket = nextSocket;\n\n\t\t\tif (nextSocket.addEventListener) {\n\t\t\t\tnextSocket.addEventListener(\"open\", onOpen);\n\t\t\t\tnextSocket.addEventListener(\"message\", onMessage);\n\t\t\t\tnextSocket.addEventListener(\"error\", onError);\n\t\t\t\tnextSocket.addEventListener(\"close\", onClose);\n\t\t\t} else {\n\t\t\t\tnextSocket.onopen = onOpen;\n\t\t\t\tnextSocket.onmessage = onMessage;\n\t\t\t\tnextSocket.onerror = onError;\n\t\t\t\tnextSocket.onclose = onClose;\n\t\t\t}\n\t\t};\n\n\t\tvoid connect().catch((error) => {\n\t\t\thandleDisconnect(error instanceof Error ? error : new Error(String(error || \"Realtime connection failed\")));\n\t\t});\n\n\t\treturn {\n\t\t\tclose: () => {\n\t\t\t\tisClosed = true;\n\t\t\t\tstopReconnectTimer();\n\t\t\t\tsocket?.close();\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Get lookup data for a collection (for dropdowns/autocomplete)\n\t */\n\tasync lookup(collectionId: string, options?: QueryOptions): Promise<Array<{ value: string; label: string }> | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (options) {\n\t\t\tif (options.filter) {\n\t\t\t\tqueryParams.filter = options.filter;\n\t\t\t}\n\t\t\tif (options.jsonFilter) {\n\t\t\t\tqueryParams.jsonFilter = options.jsonFilter;\n\t\t\t}\n\t\t\tif (options.projection) {\n\t\t\t\tqueryParams.projection = options.projection;\n\t\t\t}\n\t\t\tif (options.options) {\n\t\t\t\tqueryParams.options = options.options;\n\t\t\t}\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst result = await this.baseService.get(fullUrl);\n\n\t\tif (Array.isArray(result)) {\n\t\t\treturn result.map(row => ({\n\t\t\t\tvalue: row._id,\n\t\t\t\tlabel: row._display || row.label || row.title || row.name || row.username || row.description || \"\"\n\t\t\t}));\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate buildQueryParams(options?: QueryOptions): Record<string, any> {\n\t\tconst queryParams: Record<string, any> = {};\n\t\tif (!options) return queryParams;\n\n\t\tconst searchQuery = options.q || (options as any).searchQuery;\n\t\tif (searchQuery) {\n\t\t\tqueryParams.q = searchQuery;\n\t\t}\n\t\tif (options.quick_filter_fields) {\n\t\t\tqueryParams.quick_filter_fields = options.quick_filter_fields;\n\t\t}\n\t\tif (options.filter) {\n\t\t\tqueryParams.filter = options.filter;\n\t\t}\n\t\tif (options.jsonFilter) {\n\t\t\tqueryParams.jsonFilter = options.jsonFilter;\n\t\t}\n\t\tif (options.select) {\n\t\t\tqueryParams.select = Array.isArray(options.select)\n\t\t\t\t? options.select.join(\",\")\n\t\t\t\t: options.select;\n\t\t}\n\t\tif (options.projection) {\n\t\t\tqueryParams.projection = options.projection;\n\t\t}\n\t\tif (options.options) {\n\t\t\tqueryParams.options = options.options;\n\t\t}\n\t\tif (options.sort) {\n\t\t\tqueryParams.sort = options.sort;\n\t\t}\n\t\tif (typeof options.limit === \"number\") {\n\t\t\tqueryParams.limit = options.limit;\n\t\t}\n\t\tif (typeof options.skip === \"number\" && options.skip > 0) {\n\t\t\tqueryParams.skip = options.skip;\n\t\t}\n\n\t\treturn queryParams;\n\t}\n\n\tprivate async hydrateRelations(\n\t\trows: Document[],\n\t\trelations: RelationHydrationConfig[],\n\t\trelationSelect?: string | string[],\n\t\toptions?: {\n\t\t\tpreferWs?: boolean;\n\t\t\twsFactory?: (url: string) => PaginationWebSocketLike;\n\t\t}\n\t): Promise<Document[] | ErrorResponse> {\n\t\tconst enhancedRows = rows.map((row) => ({ ...row }));\n\t\tconst defaultSelect = relationSelect || \"_id,_display,name,title,username\";\n\n\t\tconst groupedByCollection = relations.reduce((acc, relation) => {\n\t\t\tif (!acc[relation.collectionId]) {\n\t\t\t\tacc[relation.collectionId] = [];\n\t\t\t}\n\t\t\tacc[relation.collectionId].push(relation);\n\t\t\treturn acc;\n\t\t}, {} as Record<string, RelationHydrationConfig[]>);\n\n\t\tconst relationCache = new Map<string, Document>();\n\n\t\tfor (const [refCollectionId, configs] of Object.entries(groupedByCollection)) {\n\t\t\tconst ids = new Set<string>();\n\t\t\tfor (const row of enhancedRows) {\n\t\t\t\tfor (const config of configs) {\n\t\t\t\t\tconst value = row[config.field];\n\t\t\t\t\tif (!value) continue;\n\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\tfor (const item of value) {\n\t\t\t\t\t\t\tconst id = this.extractReferenceId(item);\n\t\t\t\t\t\t\tif (id) ids.add(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst id = this.extractReferenceId(value);\n\t\t\t\t\t\tif (id) ids.add(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst missingIds = Array.from(ids).filter((id) => !relationCache.has(`${refCollectionId}:${id}`));\n\t\t\tif (missingIds.length > 0) {\n\t\t\t\tconst chunkSize = Collections.RELATION_QUERY_CHUNK_SIZE;\n\t\t\t\tfor (let i = 0; i < missingIds.length; i += chunkSize) {\n\t\t\t\t\tconst idChunk = missingIds.slice(i, i + chunkSize);\n\t\t\t\t\tconst relatedDocs = await this.queryRaw(refCollectionId, {\n\t\t\t\t\t\tfilter: { _id: { $in: idChunk } },\n\t\t\t\t\t\tselect: defaultSelect,\n\t\t\t\t\t\tpaginationTransport: options?.preferWs ? \"auto\" : \"http\",\n\t\t\t\t\t\twsFactory: options?.wsFactory,\n\t\t\t\t\t});\n\t\t\t\t\tif (!Array.isArray(relatedDocs)) {\n\t\t\t\t\t\treturn relatedDocs;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const doc of relatedDocs) {\n\t\t\t\t\t\tif (doc?._id) {\n\t\t\t\t\t\t\trelationCache.set(`${refCollectionId}:${doc._id}`, doc);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const row of enhancedRows) {\n\t\t\t\tfor (const config of configs) {\n\t\t\t\t\tconst value = row[config.field];\n\t\t\t\t\tif (!value) continue;\n\n\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\trow[config.field] = value.map((item) => {\n\t\t\t\t\t\t\tconst id = this.extractReferenceId(item);\n\t\t\t\t\t\t\tif (!id) return item;\n\t\t\t\t\t\t\treturn relationCache.get(`${refCollectionId}:${id}`) || item;\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst id = this.extractReferenceId(value);\n\t\t\t\t\t\tif (!id) continue;\n\t\t\t\t\t\trow[config.field] = relationCache.get(`${refCollectionId}:${id}`) || value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn enhancedRows;\n\t}\n\n\tprivate extractReferenceId(value: any): string | null {\n\t\tif (value === null || value === undefined) return null;\n\t\tif (typeof value === \"string\" || typeof value === \"number\") {\n\t\t\tconst normalized = String(value).trim();\n\t\t\treturn normalized.length > 0 ? normalized : null;\n\t\t}\n\t\tif (typeof value === \"object\" && value._id !== undefined && value._id !== null) {\n\t\t\tconst normalized = String(value._id).trim();\n\t\t\treturn normalized.length > 0 ? normalized : null;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\t\t\n\t * Get single document by ID\n\t */\n\tasync getDocument(collectionId: string, documentId: string, populate?: string[]): Promise<Document | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (populate && populate.length > 0) {\n\t\t\tqueryParams.populate = populate.join(\",\");\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\treturn await this.baseService.get(fullUrl);\n\t}\n\n\t/**\n\t * Create new document\n\t */\n\tasync createDocument(collectionId: string, data: any): Promise<Document | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Update document\n\t */\n\tasync updateDocument(collectionId: string, documentId: string, data: any): Promise<Document | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\treturn await this.baseService.patch(url, data);\n\t}\n\n\t/**\n\t * Update document with optional mode flags.\n\t */\n\tasync updateDocumentWithOptions(\n\t\tcollectionId: string,\n\t\tdocumentId: string,\n\t\tdata: any,\n\t\toptions?: UpdateDocumentOptions\n\t): Promise<Document | ErrorResponse> {\n\t\tconst baseUrl = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\tconst url = options?.updateOnly ? `${baseUrl}?mode=updateOnly` : baseUrl;\n\t\treturn await this.baseService.patch(url, data);\n\t}\n\n\t/**\n\t * Get document revisions\n\t */\n\tasync getDocumentRevisions(collectionId: string, documentId: string): Promise<Document[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}/revisions`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Delete document\n\t */\n\tasync deleteDocument(collectionId: string, documentId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n\n\t/**\n\t * Delete documents by filter\n\t */\n\tasync deleteByFilter(collectionId: string, filter: any): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/delete`);\n\t\treturn await this.baseService.post(url, { filter });\n\t}\n\n\t/**\n\t * Import data to collection\n\t */\n\tasync import(collectionId: string, file: File, mapping: ImportMapping): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"mapping\", JSON.stringify(mapping));\n\t\tformData.append(\"file\", file);\n\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/import`);\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data\" };\n\n\t\treturn await this.baseService.post(url, formData, { headers });\n\t}\n\n\t/**\n\t * Get collection data types\n\t */\n\tasync getDataTypes(): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/collections/types\");\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Validate collection data\n\t */\n\tasync validate(collectionId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/validate`);\n\t\treturn await this.baseService.post(url, null);\n\t}\n\n\t/**\n\t * Migrate collection data\n\t */\n\tasync migrate(collectionId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/migrate`);\n\t\treturn await this.baseService.post(url, null);\n\t}\n} \n","import { BaseService } from \"./BaseService\";\nimport {\n\tErrorResponse,\n\tSuccessResponse,\n\tStorageUploadResult,\n\tPrivateStorageAccessUrlPayload,\n\tPrivateStorageAccessUrlResult\n} from \"../types/index\";\n\n/**\n * Storage service for Buildx\n * Handles file upload, download, and management\n * \n * @example\n * ```typescript\n * const storage = buildx.storage();\n * \n * // Upload file\n * const result = await storage.upload(file, 'uploads/');\n * \n * // List files in directory\n * const files = await storage.list('uploads/');\n * \n * // Delete file\n * await storage.delete('uploads/file.txt');\n * ```\n */\nexport class Storage {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Upload file to storage\n\t */\n\tasync upload(file: File, prefix?: string): Promise<StorageUploadResult | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tif (prefix && prefix !== \"\") {\n\t\t\tformData.append(\"prefix\", prefix);\n\t\t}\n\t\tformData.append(\"file\", file);\n\t\tformData.append(\"filename\", file.name || \"file\");\n\n\t\tconst url = this.baseService.buildProjectUrl(\"/storage/upload\");\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data; charset=utf-8\" };\n\n\t\treturn await this.baseService.post(url, formData, { headers });\n\t}\n\n\t/**\n\t * Upload file to collection storage\n\t */\n\tasync uploadToCollection(file: File, collectionId: string, prefix?: string): Promise<StorageUploadResult | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tif (prefix && prefix !== \"\") {\n\t\t\tformData.append(\"prefix\", prefix);\n\t\t}\n\t\tformData.append(\"file\", file);\n\t\tformData.append(\"filename\", file.name || \"file\");\n\t\tformData.append(\"collection_id\", collectionId);\n\n\t\tconst url = this.baseService.buildProjectUrl(\"/storage/upload\");\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data; charset=utf-8\" };\n\n\t\treturn await this.baseService.post(url, formData, { headers });\n\t}\n\n\t/**\n\t * List files in directory\n\t */\n\tasync list(path: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/storage?path=${encodeURIComponent(path)}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get storage size for path\n\t */\n\tasync getSize(path: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/storage/size?path=${encodeURIComponent(path)}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Delete file from storage\n\t */\n\tasync delete(path: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/storage?path=${encodeURIComponent(path)}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n\n\t/**\n\t * Create tokenized private access URL for a project-scoped storage path.\n\t */\n\tasync getPrivateAccessUrl(payload: PrivateStorageAccessUrlPayload): Promise<PrivateStorageAccessUrlResult | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/storage/private/access-url\");\n\t\treturn await this.baseService.post(url, payload);\n\t}\n}\n","import { BaseService } from \"./BaseService\";\nimport { ErrorResponse } from \"../types/index\";\n\n/**\n * Flows service for Buildx\n * Handles flow types and running flows\n * \n * @example\n * ```typescript\n * const flows = buildx.flows();\n * \n * // Get flow types\n * const types = await flows.getTypes();\n * \n * // Run a flow\n * const result = await flows.run('flow-id', 'session-id', 'root', { arg1: 'value' });\n * ```\n */\nexport class Flows {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Get all flow types\n\t */\n\tasync getTypes(): Promise<any | ErrorResponse> {\n\t\t// Optionally use cache in the future\n\t\treturn await this.baseService.get(\"/flows/types\");\n\t}\n\n\t/**\n\t * Run a flow\n\t */\n\tasync run(flowId: string, sessionId: string | null = null, state: any = \"root\", args: any = {}): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/flows/${flowId}/run`);\n\t\treturn await this.baseService.post(url, { session_id: sessionId, state, args });\n\t}\n\n\t/**\n\t * Get GPT flow code suggestions\n\t */\n\tasync getGptFlowSuggestions(instruction: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/ai/gpt/flow/node\");\n\t\treturn await this.baseService.post<any>(url, { instruction });\n\t}\n\n\t/**\n\t * Get GPT collection suggestions\n\t */\n\tasync getGptCollectionSuggestions(instruction: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/ai/gpt/collections\");\n\t\treturn await this.baseService.post<any>(url, { instruction });\n\t}\n\n\t/**\n\t * Get GPT lifecycle suggestions\n\t */\n\tasync getGptLifecycleSuggestions(instruction: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/ai/gpt/lifecycle\");\n\t\treturn await this.baseService.post<any>(url, { instruction });\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { ErrorResponse, SuccessResponse } from \"../types/index\";\n\n/**\n * Templates service for Buildx\n * Handles template rendering and preview\n * \n * @example\n * ```typescript\n * const templates = buildx.templates();\n * \n * // Preview a template\n * const preview = await templates.preview('template', { name: 'John' });\n * \n * // Render a template\n * const rendered = await templates.render('template-id', { name: 'John' });\n * \n * // Generate PDF\n * await templates.generatePDF('template-id', data);\n * ```\n */\nexport class Templates {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Preview a template with data\n\t */\n\tasync preview(template: any, data: any): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/templates/preview\");\n\t\treturn await this.baseService.post(url, { template, data });\n\t}\n\n\t/**\n\t * Render a template by ID with data\n\t */\n\tasync render(templateId: string, data: any): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/templates/${templateId}/render`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Render a template as PDF and download (browser only)\n\t */\n\tasync renderPDF(templateId: string, data: any): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/templates/${templateId}/pdf`);\n\t\tconst headers = { ...(await this.baseService.getHeaders()), responseType: \"blob\" };\n\t\tconst response = await this.baseService.axiosInstance.post(url, data, { headers });\n\n\t\t// Create download link for browser\n\t\tif (typeof window !== \"undefined\") {\n\t\t\tconst blobUrl = window.URL.createObjectURL(response.data);\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tlink.href = blobUrl;\n\t\t\tlink.setAttribute(\"download\", \"document.pdf\");\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t\twindow.URL.revokeObjectURL(blobUrl);\n\t\t}\n\n\t\treturn { success: true, message: \"PDF downloaded successfully\" };\n\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { Function, FunctionLog, ErrorResponse } from \"../types/index\";\n\n/**\n * Functions service for Buildx\n * Handles serverless functions management\n * \n * @example\n * ```typescript\n * const functions = buildx.functions();\n * \n * // Get all functions\n * const funcs = await functions.list();\n * \n * // Get function by name\n * const func = await functions.getByName('function-name');\n * \n * // Update function\n * await functions.update('function-name', { code: 'new code' });\n * ```\n */\nexport class Functions {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all functions in a project\n\t */\n\tasync list(): Promise<Function[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/functions\");\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get function by name\n\t */\n\tasync getByName(functionName: string): Promise<Function | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Update function\n\t */\n\tasync update(functionName: string, data: Partial<Function>): Promise<Function | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Get function logs\n\t */\n\tasync getLogs(functionName: string): Promise<FunctionLog[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}/logs`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Invoke function runtime (supports revision pinning).\n\t */\n\tasync invoke(\n\t\tfunctionName: string,\n\t\tpayload: any,\n\t\toptions?: { revision?: string | number; alias?: string }\n\t): Promise<any | ErrorResponse> {\n\t\tconst query = new URLSearchParams();\n\t\tif (options?.revision != null) query.set(\"revision\", String(options.revision));\n\t\tif (options?.alias) query.set(\"alias\", options.alias);\n\t\tconst queryString = query.toString();\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/run/${functionName}${queryString ? `?${queryString}` : \"\"}`);\n\t\treturn await this.baseService.post(url, payload);\n\t}\n\n\t/**\n\t * List immutable revisions for a function.\n\t */\n\tasync listRevisions(functionName: string): Promise<any[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}/revisions`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Publish a revision to an alias (default: live).\n\t */\n\tasync publishRevision(functionName: string, revision: string | number, alias = \"live\"): Promise<Function | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}/revisions/${revision}/publish`);\n\t\treturn await this.baseService.post(url, { alias });\n\t}\n\n\t/**\n\t * Move an alias pointer to a revision.\n\t */\n\tasync setAlias(functionName: string, alias: string, revision: string | number): Promise<Function | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}/aliases/${alias}`);\n\t\treturn await this.baseService.put(url, { revision });\n\t}\n} \n","import { BaseService } from \"./BaseService\";\nimport { BuildxObject, ErrorResponse, SuccessResponse } from \"../types/index\";\n\n/**\n * Buildx Objects service for Buildx\n * Handles Buildx-specific objects (users, roles, etc.)\n * \n * @example\n * ```typescript\n * const buildxObjects = buildx.buildxObjects();\n * \n * // Get Buildx collection\n * const collection = await buildxObjects.getCollection('users');\n * \n * // Get Buildx document\n * const doc = await buildxObjects.getDocument('users', 'user-id');\n * \n * // Query Buildx objects\n * const objects = await buildxObjects.query('users', { limit: 10 });\n * ```\n */\nexport class BuildxObjects {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Get Buildx collection\n\t */\n\tasync getCollection(type: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/collection/${type}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get Buildx document by ID\n\t */\n\tasync getDocument(type: string, id: string): Promise<BuildxObject | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}/${id}`);\n\t\tconst result = await this.baseService.get(url);\n\n\t\tif (typeof result === \"object\" && result !== null) {\n\t\t\tresult._display = result._display || result.label || result.title || result.name || result.username || result.description || \"\";\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Query Buildx objects\n\t */\n\tasync query(type: string, options?: any): Promise<BuildxObject[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (options) {\n\t\t\tif (options.filter) {\n\t\t\t\tqueryParams.filter = options.filter;\n\t\t\t}\n\t\t\tif (options.jsonFilter) {\n\t\t\t\tqueryParams.jsonFilter = options.jsonFilter;\n\t\t\t}\n\t\t\tif (options.select) {\n\t\t\t\tqueryParams.select = Array.isArray(options.select)\n\t\t\t\t\t? options.select.join(\",\")\n\t\t\t\t\t: options.select;\n\t\t\t}\n\t\t\tif (options.projection) {\n\t\t\t\tqueryParams.projection = options.projection;\n\t\t\t}\n\t\t\tif (options.options) {\n\t\t\t\tqueryParams.options = options.options;\n\t\t\t}\n\t\t\tif (options.sort) {\n\t\t\t\tqueryParams.sort = options.sort;\n\t\t\t}\n\t\t\tif (options.limit) {\n\t\t\t\tqueryParams.limit = options.limit;\n\t\t\t}\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst result = await this.baseService.get(fullUrl);\n\n\t\tif (Array.isArray(result)) {\n\t\t\tresult.forEach(row => {\n\t\t\t\trow._display = row._display || row.label || row.title || row.name || row.username || row.description || \"\";\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Create Buildx object\n\t */\n\tasync create(type: string, data: any): Promise<BuildxObject | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Update Buildx object\n\t */\n\tasync update(type: string, id: string, data: any): Promise<BuildxObject | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}/${id}`);\n\t\treturn await this.baseService.patch(url, data);\n\t}\n\n\t/**\n\t * Delete Buildx object\n\t */\n\tasync deleteObject(type: string, id: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}/${id}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { ApiKey, ErrorResponse } from \"../types/index\";\n\n/**\n * API Keys service for Buildx\n * Handles API key management\n * \n * @example\n * ```typescript\n * const apiKeys = buildx.apiKeys();\n * \n * // List API keys\n * const keys = await apiKeys.list();\n * \n * // Get API key by ID\n * const key = await apiKeys.get('key-id');\n * \n * // Get API key secret\n * const secret = await apiKeys.getSecret('key-id');\n * ```\n */\nexport class ApiKeys {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all API keys\n\t */\n\tasync list(organizationId?: string): Promise<ApiKey[] | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? `/${organizationId}/auth/api-keys`\n\t\t\t: \"/auth/api-keys\";\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get API key by ID\n\t */\n\tasync get(apiKeyId: string, organizationId?: string): Promise<ApiKey | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? `/${organizationId}/auth/api-key/${apiKeyId}`\n\t\t\t: `/auth/api-key/${apiKeyId}`;\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get API key secret\n\t */\n\tasync getSecret(apiKeyId: string, organizationId?: string): Promise<any | ErrorResponse> {\n\t\tconst url = organizationId\n\t\t\t? `/${organizationId}/auth/api-key/${apiKeyId}/secret`\n\t\t\t: `/auth/api-key/${apiKeyId}/secret`;\n\t\treturn await this.baseService.get(url);\n\t}\n} \n","import { BaseService } from \"./BaseService\";\nimport {\n\tErrorResponse,\n\tSuccessResponse,\n\tPublicOnboardingOtpRequestPayload,\n\tPublicOnboardingOtpRequestData,\n\tPublicOnboardingProjectIdAvailabilityPayload,\n\tPublicOnboardingProjectIdAvailabilityData,\n\tPublicOnboardingOtpVerifyPayload,\n\tPublicOnboardingOtpVerifyData,\n\tPublicOnboardingCompletePayload,\n\tPublicOnboardingCompleteData,\n} from \"../types/index\";\n\n/**\n * Public onboarding service for Buildx (pre-project provisioning flow).\n */\nexport class Onboarding {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\tprivate isErrorResponse(response: any): response is ErrorResponse {\n\t\treturn response && typeof response === \"object\" && \"success\" in response && response.success === false;\n\t}\n\n\t/**\n\t * Check project-id availability for public onboarding.\n\t */\n\tasync checkProjectIdAvailability(\n\t\tpayload: PublicOnboardingProjectIdAvailabilityPayload\n\t): Promise<SuccessResponse<PublicOnboardingProjectIdAvailabilityData> | ErrorResponse> {\n\t\tconst query = new URLSearchParams({\n\t\t\tproduct_key: payload.product_key,\n\t\t\tproject_id: payload.project_id,\n\t\t});\n\t\treturn await this.baseService.get(`/public/onboarding/project-id/availability?${query.toString()}`);\n\t}\n\n\t/**\n\t * Request onboarding OTP.\n\t */\n\tasync requestOtp(\n\t\tpayload: PublicOnboardingOtpRequestPayload\n\t): Promise<SuccessResponse<PublicOnboardingOtpRequestData> | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/public/onboarding/otp/request\", payload);\n\t}\n\n\t/**\n\t * Verify onboarding OTP.\n\t */\n\tasync verifyOtp(\n\t\tpayload: PublicOnboardingOtpVerifyPayload\n\t): Promise<SuccessResponse<PublicOnboardingOtpVerifyData> | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/public/onboarding/otp/verify\", payload);\n\t}\n\n\t/**\n\t * Complete onboarding and persist returned auth tokens when available.\n\t */\n\tasync complete(\n\t\tpayload: PublicOnboardingCompletePayload,\n\t\tidempotencyKey: string\n\t): Promise<SuccessResponse<PublicOnboardingCompleteData> | ErrorResponse> {\n\t\tconst response = await this.baseService.post<SuccessResponse<PublicOnboardingCompleteData> | ErrorResponse>(\n\t\t\t\"/public/onboarding/complete\",\n\t\t\tpayload,\n\t\t\t{\n\t\t\t\theaders: {\n\t\t\t\t\t\"Idempotency-Key\": idempotencyKey,\n\t\t\t\t},\n\t\t\t}\n\t\t);\n\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\tconst accessToken = (response as any)?.data?.access_token;\n\t\tconst refreshToken = (response as any)?.data?.refresh_token;\n\t\tif (accessToken) {\n\t\t\tthis.baseService.setAccessToken(accessToken);\n\t\t}\n\t\tif (refreshToken) {\n\t\t\tthis.baseService.setRefreshToken(refreshToken);\n\t\t}\n\t\treturn response;\n\t}\n\n\t/**\n\t * Get onboarding request status.\n\t */\n\tasync getRequest(\n\t\trequestId: string\n\t): Promise<SuccessResponse<PublicOnboardingOtpRequestData> | ErrorResponse> {\n\t\treturn await this.baseService.get(`/public/onboarding/request/${encodeURIComponent(requestId)}`);\n\t}\n}\n","import { BaseService } from \"./BaseService\";\nimport { ErrorResponse, TsaHashPayloadOptions, TsaHashPayloadResult } from \"../types\";\n\nexport class Crypto {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Hash payload and request TSA timestamp token for current project scope.\n\t */\n\tasync hashPayloadWithTsa(\n\t\tpayload: string,\n\t\toptions: TsaHashPayloadOptions = {}\n\t): Promise<TsaHashPayloadResult | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/crypto/tsa/hash\");\n\t\treturn await this.baseService.post(url, {\n\t\t\tpayload,\n\t\t\t...options,\n\t\t});\n\t}\n}\n","const ERROR_CODES={INTERNAL_SERVER:{code:\"E01000\",message:\"Internal Server Error.\",statusCode:500},NOT_IMPLEMENTED:{code:\"E01001\",message:\"Method Not Implemented.\",statusCode:501},FUNC_NOT_AVAILABLE:{code:\"E01002\",message:\"Method Not Allowed.\",statusCode:405},MAINTENANCE_MODE:{code:\"E01003\",message:\"Service is under maintenance.\",statusCode:503},INVALID_RESPONSE:{code:\"E01004\",message:\"Invalid response.\",statusCode:400},INTERNAL_SERVER_ERROR:{code:\"E01000\",message:\"Internal Server Error.\",statusCode:500},INSUFFICIENT_PERMISSIONS:{code:\"E02001\",message:\"Insufficient permissions.\",statusCode:403},FORBIDDEN:{code:\"E02003\",message:\"Forbidden.\",statusCode:403},IP_RESTRICTED:{code:\"E02004\",message:\"IP Address not in whitelist.\",statusCode:403},UNAUTHORIZED:{code:\"E02005\",message:\"Unauthorized access.\",statusCode:401},TOKEN_EXPIRED:{code:\"E02006\",message:\"Token expired.\",statusCode:401},INVALID_API_KEY:{code:\"E02011\",message:\"Invalid API-KEY\",statusCode:400},INVALID_API_KEY_EXPIRED:{code:\"E02012\",message:\"Invalid API-KEY expired\",statusCode:400},INVALID_SIGNATURE:{code:\"E02013\",message:\"Invalid signature\",statusCode:400},INVALID_CREDENTIALS:{code:\"E02014\",message:\"Invalid credentials.\",statusCode:401},INVALID_EMAIL_DOMAIN:{code:\"E02015\",message:\"Invalid email domain.\",statusCode:400},INVALID_OTP:{code:\"E02021\",message:\"Invalid OTP.\",statusCode:400},OTP_EXPIRED:{code:\"E02022\",message:\"OTP expired.\",statusCode:400},EMAIL_SEND_FAILED:{code:\"E02023\",message:\"Failed to send email.\",statusCode:500},INVALID_REQUEST:{code:\"E03001\",message:\"Invalid request.\",statusCode:400},BAD_REQUEST:{code:\"E03001\",message:\"Bad request.\",statusCode:400},PROJECT_NOT_FOUND:{code:\"E03002\",message:\"Project not found.\",statusCode:404},PROJECT_DELETED:{code:\"E03003\",message:\"Project deleted.\",statusCode:404},PROJECT_ALREADY_EXISTS:{code:\"E03004\",message:\"Project already exists.\",statusCode:400},PROJECT_DEACTIVATED:{code:\"E03005\",message:\"Project is deactivated.\",statusCode:403},INVALID_USER_CREDENTIALS:{code:\"E03011\",message:\"Invalid user credentials.\",statusCode:400},INVALID_USER_SYNC_INFO:{code:\"E03012\",message:\"Invalid user sync info.\",statusCode:400},USER_ALREADY_EXISTS:{code:\"E03013\",message:\"User already exists.\",statusCode:400},USER_NOT_FOUND:{code:\"E03014\",message:\"User not found.\",statusCode:400},SALT_CANNOT_BE_EMPTY:{code:\"E03015\",message:\"Salt cannot be empty.\",statusCode:400},USER_INFO_NOT_FOUND:{code:\"E03016\",message:\"User info not found.\",statusCode:400},CREDENTIAL_NOT_FOUND:{code:\"E03021\",message:\"Credential not found.\",statusCode:404},CREDENTIAL_ALREADY_EXISTS:{code:\"E03022\",message:\"Credential already exists.\",statusCode:400},VALIDATION_ERROR:{code:\"E03023\",message:\"Validation error.\",statusCode:400},EXTERNAL_SERVICE_NOT_FOUND:{code:\"E03024\",message:\"External service not found.\",statusCode:404},INTEGRATION_CONFIG_NOT_FOUND:{code:\"E03031\",message:\"Integration config not found.\",statusCode:404},INTEGRATION_CONFIG_ALREADY_EXISTS:{code:\"E03032\",message:\"Integration config already exists.\",statusCode:400},COLLECTION_ALREADY_EXISTS:{code:\"E04001\",message:\"Collection already exists.\",statusCode:400},INVALID_COLLECTION:{code:\"E04002\",message:\"Invalid collection.\",statusCode:400},COLLECTION_NOT_FOUND:{code:\"E04004\",message:\"Collection not found.\",statusCode:404},DOCUMENT_NOT_FOUND:{code:\"E04011\",message:\"Document not found.\",statusCode:404},INVALID_DOCUMENT:{code:\"E04012\",message:\"Invalid document.\",statusCode:400},DOCUMENT_ALREADY_EXISTS:{code:\"E04014\",message:\"Document already exists.\",statusCode:400},CANNOT_TRANSITION:{code:\"E05001\",message:\"Cannot transition to the requested state.\",statusCode:400},STATE_NOT_FOUND:{code:\"E05002\",message:\"State not found.\",statusCode:400},LIFECYCLE_NOT_FOUND:{code:\"E05003\",message:\"Lifecycle not found.\",statusCode:400},FLOW_NOT_FOUND:{code:\"E05004\",message:\"Flow not found.\",statusCode:400},TRANSITION_NOT_ALLOWED:{code:\"E05005\",message:\"Transition not allowed.\",statusCode:400},INTERACTIVE_FLOW_NOT_ALLOWED:{code:\"E05006\",message:\"Interactive flow not allowed.\",statusCode:400},FUNCTION_NOT_FOUND:{code:\"E06001\",message:\"Function not found.\",statusCode:404},FUNCTION_CHECKSUM_MISMATCH:{code:\"E06002\",message:\"Function checksum mismatch.\",statusCode:400},FUNCTION_METHOD_NOT_ALLOWED:{code:\"E06003\",message:\"Method not allowed for this function.\",statusCode:405},FUNCTION_ANONYMOUS_ACCESS_DENIED:{code:\"E06004\",message:\"Anonymous access not allowed for this function.\",statusCode:403},FUNCTION_NOT_LIVE:{code:\"E06005\",message:\"Function is not live.\",statusCode:400},FUNCTION_EXECUTION_FAILED:{code:\"E06006\",message:\"Function execution failed.\",statusCode:500},FUNCTION_LOG_NOT_FOUND:{code:\"E06007\",message:\"Function log not found.\",statusCode:404},INVITATION_NOT_FOUND:{code:\"E07001\",message:\"Invitation not found.\",statusCode:404},INVITATION_EXPIRED:{code:\"E07002\",message:\"Invitation has expired.\",statusCode:400},INVALID_INVITATION_STATUS:{code:\"E07003\",message:\"Invalid invitation status.\",statusCode:400},USER_ALREADY_INVITED:{code:\"E07004\",message:\"User is already invited or is a member.\",statusCode:400},TEAM_MEMBER_NOT_FOUND:{code:\"E07005\",message:\"Team member not found.\",statusCode:404},USER_CREATION_FAILED:{code:\"E07006\",message:\"Failed to create user account.\",statusCode:500},INVALID_INPUT:{code:\"E07008\",message:\"Invalid input provided.\",statusCode:400},INVITATION_EMAIL_MISMATCH:{code:\"E07009\",message:\"Authenticated user's email does not match invitation email.\",statusCode:403},AI_ERROR:{code:\"E08001\",message:\"AI error.\",statusCode:500},AI_IS_NOT_AVAILABLE:{code:\"E08002\",message:\"AI is not available.\",statusCode:500},PAYMENT_CREATION_FAILED:{code:\"E09001\",message:\"Payment creation failed.\",statusCode:500}},AUTH_ERROR_CODES={UNAUTHORIZED:ERROR_CODES.UNAUTHORIZED,TOKEN_EXPIRED:ERROR_CODES.TOKEN_EXPIRED},LEGACY_AUTH_ERROR_CODES={UNAUTHORIZED:[\"E07007\",\"E02003\"]},normalizeCode=value=>String(value||\"\").trim().toUpperCase(),getMessageText=error=>String(error?.response?.data?.message||error?.response?.data?.description||error?.response?.data?.error||error?.inner?.message||error?.message||error?.description||error?.error||\"\").toLowerCase(),extractErrorCode=error=>normalizeCode(error?.response?.data?.code||error?.code),isLegacyUnauthorizedCode=code=>LEGACY_AUTH_ERROR_CODES.UNAUTHORIZED.includes(normalizeCode(code)),isTokenExpiredError=error=>{if(extractErrorCode(error)===AUTH_ERROR_CODES.TOKEN_EXPIRED.code)return!0;const message=getMessageText(error);return!!message&&(message.includes(\"jwt expired\")||message.includes(\"token expired\")||message.includes(\"expired token\")||message.includes(\"session expired\"))},isUnauthorizedError=error=>{if(isTokenExpiredError(error))return!1;const code=extractErrorCode(error);if(code===AUTH_ERROR_CODES.UNAUTHORIZED.code||isLegacyUnauthorizedCode(code))return!0;const message=getMessageText(error);if(message.includes(\"invalid token\"))return!0;if(message.includes(\"unauthorized\"))return!0;if(message.includes(\"invalid jwt\"))return!0;const statusCode=(error=>{const value=Number(error?.response?.status||error?.statusCode||error?.status||0);return Number.isFinite(value)?value:0})(error);return!(statusCode!==AUTH_ERROR_CODES.UNAUTHORIZED.statusCode||!message)},normalizeLegacyAuthErrorCode=error=>isTokenExpiredError(error)?AUTH_ERROR_CODES.TOKEN_EXPIRED.code:isUnauthorizedError(error)?AUTH_ERROR_CODES.UNAUTHORIZED.code:null;export{AUTH_ERROR_CODES,ERROR_CODES,LEGACY_AUTH_ERROR_CODES,extractErrorCode,isLegacyUnauthorizedCode,isTokenExpiredError,isUnauthorizedError,normalizeLegacyAuthErrorCode};\n","import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { BuildxConfig, ApiHeaders, ErrorResponse } from \"../types\";\nimport { AUTH_ERROR_CODES, isTokenExpiredError } from \"buildx-common/error\";\n\nconst DEFAULT_API_ENDPOINT = \"https://api.buildx.ai\";\nconst DEFAULT_PROJECT_ID = \"default\";\nlet instances: Record<string, BaseService> = {};\n\n/**\n * Base service class that provides common functionality for all Buildx services\n */\nexport class BaseService {\n\tpublic config: BuildxConfig;\n\tpublic axiosInstance: AxiosInstance;\n\tprivate _accessToken: string | null = null;\n\tprivate _refreshToken: string | null = null;\n\tprivate _clientId: string | null = null;\n\tprivate _clientProof: string | null = null;\n\tprivate refreshPromise: Promise<boolean> | null = null;\n\n\tstatic getInstance(apiKey: string, projectId?: string, apiEndpoint?: string, organizationId?: string): BaseService {\n\t\tif (!projectId) {\n\t\t\tprojectId = \"default\";\n\t\t}\n\n\t\tconst endpoint = (apiEndpoint || DEFAULT_API_ENDPOINT).replace(/\\/$/, \"\");\n\t\tconst instanceKey = `${endpoint}|${apiKey}|${projectId}|${organizationId || \"\"}`;\n\t\tif (!instances[instanceKey]) {\n\t\t\tinstances[instanceKey] = new BaseService({\n\t\t\t\tapiEndpoint: endpoint,\n\t\t\t\tprojectId: projectId,\n\t\t\t\tapiKey: apiKey,\n\t\t\t\torganizationId: organizationId,\n\t\t\t});\n\t\t} else {\n\t\t\tconst current = instances[instanceKey];\n\t\t\tif (current.config.apiEndpoint !== endpoint || current.config.apiKey !== apiKey) {\n\t\t\t\tcurrent.updateConfig({\n\t\t\t\t\t...current.config,\n\t\t\t\t\tapiEndpoint: endpoint,\n\t\t\t\t\tapiKey: apiKey,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn instances[instanceKey];\n\t}\n\n\tconstructor(config: BuildxConfig) {\n\t\tthis.config = config;\n\t\tthis._clientId = config.clientId ?? null;\n\t\tthis._clientProof = config.clientProof ?? null;\n\t\tthis.axiosInstance = axios.create({\n\t\t\tbaseURL: config.apiEndpoint,\n\t\t\ttimeout: 30000,\n\t\t});\n\n\t\t// Add request interceptor for authentication\n\t\tthis.axiosInstance.interceptors.request.use(\n\t\t\t(config) => {\n\t\t\t\t// Add API key to all requests\n\t\t\t\tconfig.headers[\"X-API-Key\"] = this.config.apiKey;\n\t\t\t\treturn config;\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\treturn Promise.reject(error);\n\t\t\t}\n\t\t);\n\n\t\t// Add response interceptor for error handling\n\t\tthis.axiosInstance.interceptors.response.use(\n\t\t\t(response) => response,\n\t\t\t(error) => {\n\t\t\t\treturn this.handleError(error);\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Update the service configuration\n\t */\n\tupdateConfig(config: BuildxConfig): void {\n\t\tthis.config = config;\n\t\tthis._clientId = config.clientId ?? this._clientId;\n\t\tthis._clientProof = config.clientProof ?? this._clientProof;\n\t\tthis.axiosInstance.defaults.baseURL = config.apiEndpoint;\n\t}\n\n\t/**\n\t * Set the access token\n\t */\n\tpublic setAccessToken(token: string | null): void {\n\t\tthis._accessToken = token;\n\t\tthis.emitTokenChange();\n\t}\n\n\t/**\n\t * Get the access token\n\t */\n\tpublic getAccessToken(): string | null {\n\t\treturn this._accessToken;\n\t}\n\n\t/**\n\t * Set the refresh token\n\t */\n\tpublic setRefreshToken(token: string | null): void {\n\t\tthis._refreshToken = token;\n\t\tthis.emitTokenChange();\n\t}\n\n\t/**\n\t * Get the refresh token\n\t */\n\tpublic getRefreshToken(): string | null {\n\t\treturn this._refreshToken;\n\t}\n\n\t/**\n\t * Set the client identifier for optional device trust auth flow\n\t */\n\tpublic setClientId(clientId: string | null): void {\n\t\tthis._clientId = clientId;\n\t}\n\n\t/**\n\t * Get the client identifier used for optional device trust auth flow\n\t */\n\tpublic getClientId(): string | null {\n\t\treturn this._clientId;\n\t}\n\n\t/**\n\t * Set the client proof (device token) for optional device trust auth flow\n\t */\n\tpublic setClientProof(clientProof: string | null): void {\n\t\tthis._clientProof = clientProof;\n\t}\n\n\t/**\n\t * Get the client proof (device token) used for optional device trust auth flow\n\t */\n\tpublic getClientProof(): string | null {\n\t\treturn this._clientProof;\n\t}\n\n\t/**\n\t * Clear all stored tokens\n\t */\n\tpublic clearTokens(): void {\n\t\tthis._accessToken = null;\n\t\tthis._refreshToken = null;\n\t\tthis.emitTokenChange();\n\t}\n\n\tprivate emitTokenChange(): void {\n\t\tif (typeof this.config.onTokenChange !== \"function\") return;\n\t\ttry {\n\t\t\tthis.config.onTokenChange({\n\t\t\t\taccessToken: this._accessToken,\n\t\t\t\trefreshToken: this._refreshToken,\n\t\t\t});\n\t\t} catch {\n\t\t\t// Ignore callback failures to avoid breaking request flow.\n\t\t}\n\t}\n\n\tprivate decodeJwtPayload(token: string): Record<string, any> | null {\n\t\ttry {\n\t\t\tconst [, payload] = token.split(\".\");\n\t\t\tif (!payload) return null;\n\t\t\tconst normalized = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\t\t\tconst padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\n\t\t\tconst BufferCtor = (globalThis as any).Buffer;\n\t\t\tconst json = typeof atob === \"function\"\n\t\t\t\t? atob(padded)\n\t\t\t\t: BufferCtor.from(padded, \"base64\").toString(\"utf8\");\n\t\t\treturn JSON.parse(json);\n\t\t}\n\t\tcatch (_error) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate isTokenExpiredOrNearExpiry(token: string, skewMs = 30000): boolean {\n\t\tconst payload = this.decodeJwtPayload(token);\n\t\tconst exp = Number(payload?.exp || 0);\n\t\tif (!exp) {\n\t\t\treturn false;\n\t\t}\n\t\treturn Date.now() >= (exp * 1000) - skewMs;\n\t}\n\n\t/**\n\t * Check if user is authenticated (has access token)\n\t */\n\tpublic isAuthenticated(): boolean {\n\t\treturn this._accessToken !== null;\n\t}\n\n\t/**\n\t * Get default headers with authentication\n\t */\n\tpublic async getHeaders(useRefreshToken = false): Promise<ApiHeaders> {\n\t\tconst token = useRefreshToken ? this._refreshToken : this._accessToken;\n\n\t\tconst headers: ApiHeaders = {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"X-API-Key\": this.config.apiKey,\n\t\t};\n\n\t\tif (token) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${token}`;\n\t\t}\n\n\t\treturn headers;\n\t}\n\n\t/**\n\t * Get headers without authentication (for public endpoints)\n\t */\n\tpublic getPublicHeaders(): ApiHeaders {\n\t\treturn {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"X-API-Key\": this.config.apiKey,\n\t\t};\n\t}\n\n\t/**\n\t * Make a GET request\n\t */\n\tpublic async get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {\n\t\treturn await this.executeWithAutoRefresh<T>(url, async () => {\n\t\t\tconst headers = await this.getHeaders();\n\t\t\tconst response = await this.axiosInstance.get(url, {\n\t\t\t\t...config,\n\t\t\t\theaders: { ...headers, ...config?.headers },\n\t\t\t});\n\t\t\treturn this.unwrapResponse<T>(response as AxiosResponse<T> | T);\n\t\t});\n\t}\n\n\t/**\n\t * Make a POST request\n\t */\n\tpublic async post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n\t\treturn await this.executeWithAutoRefresh<T>(url, async () => {\n\t\t\tconst headers = await this.getHeaders();\n\t\t\tconst response = await this.axiosInstance.post(url, data, {\n\t\t\t\t...config,\n\t\t\t\theaders: { ...headers, ...config?.headers },\n\t\t\t});\n\t\t\treturn this.unwrapResponse<T>(response as AxiosResponse<T> | T);\n\t\t});\n\t}\n\n\t/**\n\t * Make a PUT request\n\t */\n\tpublic async put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n\t\treturn await this.executeWithAutoRefresh<T>(url, async () => {\n\t\t\tconst headers = await this.getHeaders();\n\t\t\tconst response = await this.axiosInstance.put(url, data, {\n\t\t\t\t...config,\n\t\t\t\theaders: { ...headers, ...config?.headers },\n\t\t\t});\n\t\t\treturn this.unwrapResponse<T>(response as AxiosResponse<T> | T);\n\t\t});\n\t}\n\n\t/**\n\t * Make a PATCH request\n\t */\n\tpublic async patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n\t\treturn await this.executeWithAutoRefresh<T>(url, async () => {\n\t\t\tconst headers = await this.getHeaders();\n\t\t\tconst response = await this.axiosInstance.patch(url, data, {\n\t\t\t\t...config,\n\t\t\t\theaders: { ...headers, ...config?.headers },\n\t\t\t});\n\t\t\treturn this.unwrapResponse<T>(response as AxiosResponse<T> | T);\n\t\t});\n\t}\n\n\t/**\n\t * Make a DELETE request\n\t */\n\tpublic async delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {\n\t\treturn await this.executeWithAutoRefresh<T>(url, async () => {\n\t\t\tconst headers = await this.getHeaders();\n\t\t\tconst response = await this.axiosInstance.delete(url, {\n\t\t\t\t...config,\n\t\t\t\theaders: { ...headers, ...config?.headers },\n\t\t\t});\n\t\t\treturn this.unwrapResponse<T>(response as AxiosResponse<T> | T);\n\t\t});\n\t}\n\n\tprivate isErrorPayload(payload: any): payload is ErrorResponse {\n\t\treturn !!payload && typeof payload === \"object\" && payload.success === false;\n\t}\n\n\tprivate shouldAttemptRefresh(url: string, payload: ErrorResponse): boolean {\n\t\tif (!this._refreshToken) return false;\n\t\tif (url.includes(\"/auth/login\") || url.includes(\"/auth/token\")) return false;\n\t\tconst status = Number(payload.statusCode || (payload as any).status || 0);\n\t\tconst code = String((payload as any).code || \"\").toUpperCase();\n\t\tconst text = String(\n\t\t\t(payload as any).message ||\n\t\t\t(payload as any).description ||\n\t\t\t(payload as any).error ||\n\t\t\t\"\"\n\t\t).toLowerCase();\n\t\tif (status !== 401) return false;\n\t\tif (code === AUTH_ERROR_CODES.UNAUTHORIZED.code) return false;\n\t\tif (code === AUTH_ERROR_CODES.TOKEN_EXPIRED.code) return true;\n\t\treturn isTokenExpiredError({\n\t\t\tcode,\n\t\t\tstatusCode: status,\n\t\t\tmessage: text,\n\t\t});\n\t}\n\n\tprivate getRefreshUrl(): string {\n\t\tconst pid = this.config.projectId;\n\t\tif (pid && pid !== DEFAULT_PROJECT_ID) {\n\t\t\treturn `/${pid}/auth/token`;\n\t\t}\n\t\treturn \"/auth/token\";\n\t}\n\n\tprivate async refreshAccessToken(): Promise<boolean> {\n\t\tif (this.refreshPromise) return this.refreshPromise;\n\t\tthis.refreshPromise = (async () => {\n\t\t\tif (!this._refreshToken) return false;\n\t\t\ttry {\n\t\t\t\tconst response = await this.axiosInstance.post(this.getRefreshUrl(), {}, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\t\"X-API-Key\": this.config.apiKey,\n\t\t\t\t\t\tAuthorization: `Bearer ${this._refreshToken}`,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tconst data = this.unwrapResponse<any>(response as AxiosResponse<any>);\n\t\t\t\tconst nextAccessToken = data?.token || data?.access_token;\n\t\t\t\tconst nextRefreshToken = data?.refresh_token || data?.refreshToken || this._refreshToken;\n\t\t\t\tif (!nextAccessToken) {\n\t\t\t\t\tthis.clearTokens();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthis.setAccessToken(nextAccessToken);\n\t\t\t\tthis.setRefreshToken(nextRefreshToken);\n\t\t\t\treturn true;\n\t\t\t} catch {\n\t\t\t\tthis.clearTokens();\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tthis.refreshPromise = null;\n\t\t\t}\n\t\t})();\n\t\treturn this.refreshPromise;\n\t}\n\n\tprivate async executeWithAutoRefresh<T>(url: string, fn: () => Promise<T>): Promise<T> {\n\t\tconst first = await fn();\n\t\tif (!this.isErrorPayload(first)) {\n\t\t\treturn first;\n\t\t}\n\t\tif (!this.shouldAttemptRefresh(url, first)) {\n\t\t\treturn first;\n\t\t}\n\t\tconst refreshed = await this.refreshAccessToken();\n\t\tif (!refreshed) {\n\t\t\treturn {\n\t\t\t\t...first,\n\t\t\t\tmessage: \"Session expired and refresh failed. Please login again.\",\n\t\t\t} as unknown as T;\n\t\t}\n\t\treturn await fn();\n\t}\n\n\t/**\n\t * Axios interceptor may resolve with either AxiosResponse or plain ErrorResponse.\n\t * Normalize both shapes to a single payload object.\n\t */\n\tprivate unwrapResponse<T = any>(response: AxiosResponse<T> | T): T {\n\t\tif (response && typeof response === \"object\" && \"data\" in (response as any)) {\n\t\t\treturn (response as AxiosResponse<T>).data;\n\t\t}\n\t\treturn response as T;\n\t}\n\n\t/**\n\t * Handle API errors\n\t */\n\tpublic handleError(error: any): ErrorResponse {\n\t\tif (error.response) {\n\t\t\tconst { status, data } = error.response;\n\n\t\t\tif (data && typeof data === \"object\") {\n\t\t\t\treturn {\n\t\t\t\t\terror: data.error || \"RequestError\",\n\t\t\t\t\tmessage: data.message || data.description || \"Something went wrong\",\n\t\t\t\t\tstatusCode: status,\n\t\t\t\t\tcode: data.code,\n\t\t\t\t\tsuccess: false,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\terror: \"RequestError\",\n\t\t\t\tmessage: `Request failed with status ${status}`,\n\t\t\t\tstatusCode: status,\n\t\t\t\tsuccess: false,\n\t\t\t};\n\t\t}\n\n\t\tif (error.message === \"Network Error\") {\n\t\t\treturn {\n\t\t\t\terror: \"NetworkError\",\n\t\t\t\tmessage: \"Network connection failed\",\n\t\t\t\tstatusCode: 500,\n\t\t\t\tsuccess: false,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\terror: \"RequestError\",\n\t\t\tmessage: error.message || \"Unknown error occurred\",\n\t\t\tstatusCode: 500,\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\tpublic async ensureValidAccessToken(): Promise<string | null> {\n\t\tif (this._accessToken && !this.isTokenExpiredOrNearExpiry(this._accessToken)) {\n\t\t\treturn this._accessToken;\n\t\t}\n\t\tif (!this._refreshToken) {\n\t\t\treturn this._accessToken;\n\t\t}\n\t\tconst refreshed = await this.refreshAccessToken();\n\t\treturn refreshed ? this._accessToken : null;\n\t}\n\n\t/**\n\t * Build URL with project ID\n\t */\n\tpublic buildProjectUrl(path = \"\"): string {\n\t\tconst pid = this.config.projectId;\n\t\tif (!pid || pid === DEFAULT_PROJECT_ID) {\n\t\t\tthrow new Error(\"Project ID is required\");\n\t\t}\n\t\treturn `/project/${pid}${path}`;\n\t}\n\n\t/**\n\t * Build URL with organization ID\n\t */\n\tpublic buildOrgUrl(path = \"\"): string {\n\t\tconst oid = this.config.organizationId || this.config.projectId;\n\t\tif (!oid) {\n\t\t\tthrow new Error(\"Organization ID is required\");\n\t\t}\n\t\treturn `/${oid}${path}`;\n\t}\n\n\t/**\n\t * Build query string from options\n\t */\n\tpublic buildQueryString(options: Record<string, any>): string {\n\t\tconst params = new URLSearchParams();\n\n\t\tObject.entries(options).forEach(([key, value]) => {\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tif (typeof value === \"object\") {\n\t\t\t\t\tparams.append(key, JSON.stringify(value));\n\t\t\t\t} else {\n\t\t\t\t\tparams.append(key, String(value));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst queryString = params.toString();\n\t\treturn queryString ? `?${queryString}` : \"\";\n\t}\n}\n","import { BuildxConfig } from \"./types\";\nimport { Auth } from \"./services/Auth\";\nimport { Projects } from \"./services/Projects\";\nimport { Collections } from \"./services/Collections\";\nimport { Storage } from \"./services/Storage\";\nimport { Flows } from \"./services/Flows\";\nimport { Templates } from \"./services/Templates\";\nimport { Functions } from \"./services/Functions\";\nimport { BuildxObjects } from \"./services/BuildxObjects\";\nimport { ApiKeys } from \"./services/ApiKeys\";\nimport { Onboarding } from \"./services/Onboarding\";\nimport { Crypto } from \"./services/Crypto\";\nimport { BaseService } from \"./services/BaseService\";\n\n/**\n * Main Buildx SDK class\n * \n * @example\n * ```typescript\n * import { Buildx } from 'buildx-sdk';\n * \n * const buildx = new Buildx({\n * apiEndpoint: 'https://api.buildx.com',\n * apiKey: 'your-api-key',\n * projectId: 'your-project-id'\n * });\n * \n * // Use different services\n * const auth = buildx.auth();\n * const projects = buildx.projects();\n * const collections = buildx.collections();\n * ```\n */\nexport class Buildx {\n\tprivate config: BuildxConfig;\n\tprivate _auth: Auth;\n\tprivate _projects: Projects;\n\tprivate _collections: Collections;\n\tprivate _storage: Storage;\n\tprivate _flows: Flows;\n\tprivate _templates: Templates;\n\tprivate _functions: Functions;\n\tprivate _buildxObjects: BuildxObjects;\n\tprivate _apiKeys: ApiKeys;\n\tprivate _onboarding: Onboarding;\n\tprivate _crypto: Crypto;\n\n\tprivate _baseService: BaseService;\n\n\tconstructor(config: BuildxConfig) {\n\t\tthis.config = {\n\t\t\tapiEndpoint: config.apiEndpoint.replace(/\\/$/, \"\"), // Remove trailing slash\n\t\t\tapiKey: config.apiKey,\n\t\t\tprojectId: config.projectId,\n\t\t\torganizationId: config.organizationId,\n\t\t\tonTokenChange: config.onTokenChange,\n\t\t};\n\n\t\tthis._baseService = BaseService.getInstance(\n\t\t\tthis.config.apiKey,\n\t\t\tthis.config.projectId,\n\t\t\tthis.config.apiEndpoint,\n\t\t\tthis.config.organizationId\n\t\t);\n\t\tthis._baseService.updateConfig(this.config);\n\n\t\t// Initialize services\n\t\tthis._auth = new Auth(this._baseService);\n\t\tthis._projects = new Projects(this._baseService);\n\t\tthis._collections = new Collections(this._baseService);\n\t\tthis._storage = new Storage(this._baseService);\n\t\tthis._flows = new Flows(this._baseService);\n\t\tthis._templates = new Templates(this._baseService);\n\t\tthis._functions = new Functions(this._baseService);\n\t\tthis._buildxObjects = new BuildxObjects(this._baseService);\n\t\tthis._apiKeys = new ApiKeys(this._baseService);\n\t\tthis._onboarding = new Onboarding(this._baseService);\n\t\tthis._crypto = new Crypto(this._baseService);\n\t}\n\n\t/**\n\t * Get the current configuration\n\t */\n\tgetConfig(): BuildxConfig {\n\t\treturn { ...this.config };\n\t}\n\n\t/**\n\t * Update the configuration\n\t */\n\tupdateConfig(config: Partial<BuildxConfig>): void {\n\t\tthis.config = { ...this.config, ...config };\n\t\tthis._baseService.updateConfig(this.config);\n\t}\n\n\t/**\n\t * Authentication service\n\t * Handles user authentication, login, signup, and user management\n\t */\n\tauth(): Auth {\n\t\treturn this._auth;\n\t}\n\n\t/**\n\t * Projects service\n\t * Manages projects, including CRUD operations\n\t */\n\tprojects(): Projects {\n\t\treturn this._projects;\n\t}\n\n\t/**\n\t * Collections service\n\t * Manages data collections, documents, and queries\n\t */\n\tcollections(): Collections {\n\t\treturn this._collections;\n\t}\n\n\t/**\n\t * Storage service\n\t * Handles file upload, download, and management\n\t */\n\tstorage(): Storage {\n\t\treturn this._storage;\n\t}\n\n\t/**\n\t * Flows service\n\t * Manages workflow execution and flow types\n\t */\n\tflows(): Flows {\n\t\treturn this._flows;\n\t}\n\n\t/**\n\t * Templates service\n\t * Handles template rendering and preview\n\t */\n\ttemplates(): Templates {\n\t\treturn this._templates;\n\t}\n\n\t/**\n\t * Functions service\n\t * Manages serverless functions\n\t */\n\tfunctions(): Functions {\n\t\treturn this._functions;\n\t}\n\n\t/**\n\t * Buildx Objects service\n\t * Manages Buildx-specific objects (users, roles, etc.)\n\t */\n\tbuildxObjects(): BuildxObjects {\n\t\treturn this._buildxObjects;\n\t}\n\n\t/**\n\t * API Keys service\n\t * Manages API key operations\n\t */\n\tapiKeys(): ApiKeys {\n\t\treturn this._apiKeys;\n\t}\n\n\t/**\n\t * Public onboarding service\n\t * Handles pre-project onboarding flow (OTP -> complete -> bootstrap access)\n\t */\n\tonboarding(): Onboarding {\n\t\treturn this._onboarding;\n\t}\n\n\t/**\n\t * Crypto service\n\t * Handles project-scoped cryptographic utilities (for example TSA hashing)\n\t */\n\tcrypto(): Crypto {\n\t\treturn this._crypto;\n\t}\n}\n\n// Export the main class as default\nexport default Buildx;\n"],"names":["Auth","constructor","baseService","this","setAccessToken","token","getAccessToken","setRefreshToken","getRefreshToken","setClientId","clientId","getClientId","setClientProof","clientProof","getClientProof","clearTokens","isAuthenticated","setProjectScope","projectId","normalized","String","trim","updateConfig","config","getProjectScope","storeTokens","response","accessToken","access_token","refreshToken","refresh_token","isErrorResponse","success","hasProjectScope","getAuthClientContext","payload","client_id","client_proof","getAuthClientHeaders","headers","buildAuthUrl","path","options","suffix","startsWith","requireProjectScope","Error","login","credentials","url","post","loginWithGoogle","signup","requestEotp","request","requestEotpAuth","requestOtpLogin","verifyEotp","verify","verifyEotpAuth","verifyOtpLogin","requestPublicOnboardingOtp","verifyPublicOnboardingOtp","completePublicOnboarding","idempotencyKey","data","getPublicOnboardingRequest","requestId","get","encodeURIComponent","getCurrentUser","verifyDeviceTrustOtp","updatePassword","password","changePassword","newPassword","new_password","currentPassword","current_password","adminUpdatePassword","userId","user_id","requestPasswordReset","resetPassword","updatePushToken","listUsers","organizationId","lookupUsers","getUser","deleteUser","Projects","list","create","projectData","update","patch","updateMetadata","validateLocale","deleteById","delete","backup","axiosInstance","responseType","getHeaders","window","URL","createObjectURL","link","document","createElement","href","setAttribute","body","appendChild","click","removeChild","revokeObjectURL","message","restore","file","formData","FormData","append","CollectionWsClient","collectionId","wsFactory","socket","connectPromise","requestCounter","pending","Map","query","action","timeoutMs","ensureConnected","id","Date","now","resultPromise","Promise","resolve","reject","timeout","setTimeout","set","send","JSON","stringify","close","_error","entry","entries","clearTimeout","clear","isSocketOpen","GlobalWebSocket","globalThis","WebSocket","ensureValidAccessToken","then","buildSocketUrl","settled","onOpen","onError","error","onClose","onMessage","event","parse","ok","result","addEventListener","onopen","onerror","onclose","onmessage","catch","finally","openState","OPEN","readyState","wsEndpoint","apiEndpoint","replace","buildProjectUrl","params","URLSearchParams","apiKey","qs","toString","Collections","collectionWsClient","collectionWsCollectionId","collectionWsDisabledUntil","withStats","withBuildx","queryParams","with_stats","queryString","buildQueryString","fullUrl","collections","Array","isArray","filter","collection","collection_id","getSchema","depth","collectionData","deleteCollection","noPopulate","relations","length","buildQueryParams","preferWs","paginationTransport","hydrateRelations","relationSelect","queryRaw","normalizedOptions","queryRawViaWs","console","warn","resetCollectionWsClient","queryWithPagination","transport","queryWithPaginationViaWs","queryWithPaginationViaHttp","hydratedRows","meta","client","getOrCreateCollectionWsClient","subscribeRealtime","handlers","factory","reconnectEnabled","reconnect","reconnectDelayMs","hasConnected","isClosed","reconnectTimer","disconnectHandled","connect","emitConnected","onConnected","stopReconnectTimer","async","handleDisconnect","rawEvent","raw","parsed","text","type","timestamp","onEvent","emitEvent","code","reason","closeError","nextSocket","lookup","jsonFilter","projection","map","row","value","_id","label","_display","title","name","username","description","searchQuery","q","quick_filter_fields","select","join","sort","limit","skip","rows","enhancedRows","defaultSelect","groupedByCollection","reduce","acc","relation","push","relationCache","refCollectionId","configs","Object","ids","Set","field","item","extractReferenceId","add","missingIds","from","has","chunkSize","RELATION_QUERY_CHUNK_SIZE","i","idChunk","slice","relatedDocs","$in","doc","undefined","getDocument","documentId","populate","createDocument","updateDocument","updateDocumentWithOptions","baseUrl","updateOnly","getDocumentRevisions","deleteDocument","deleteByFilter","import","mapping","getDataTypes","validate","migrate","Storage","upload","prefix","uploadToCollection","getSize","getPrivateAccessUrl","Flows","getTypes","run","flowId","sessionId","state","args","session_id","getGptFlowSuggestions","instruction","getGptCollectionSuggestions","getGptLifecycleSuggestions","Templates","preview","template","render","templateId","renderPDF","blobUrl","Functions","getByName","functionName","getLogs","invoke","revision","alias","listRevisions","publishRevision","setAlias","put","BuildxObjects","getCollection","forEach","deleteObject","ApiKeys","apiKeyId","getSecret","Onboarding","checkProjectIdAvailability","product_key","project_id","requestOtp","verifyOtp","complete","getRequest","Crypto","hashPayloadWithTsa","ERROR_CODES","UNAUTHORIZED","TOKEN_EXPIRED","AUTH_ERROR_CODES","extractErrorCode","toUpperCase","isTokenExpiredError","inner","toLowerCase","getMessageText","includes","DEFAULT_PROJECT_ID","instances","BaseService","getInstance","endpoint","instanceKey","current","_accessToken","_refreshToken","_clientId","_clientProof","refreshPromise","axios","baseURL","interceptors","use","handleError","defaults","emitTokenChange","onTokenChange","decodeJwtPayload","split","padded","padEnd","Math","ceil","BufferCtor","Buffer","json","atob","isTokenExpiredOrNearExpiry","skewMs","exp","Number","useRefreshToken","getPublicHeaders","executeWithAutoRefresh","unwrapResponse","isErrorPayload","shouldAttemptRefresh","status","statusCode","getRefreshUrl","pid","refreshAccessToken","Authorization","nextAccessToken","nextRefreshToken","fn","first","buildOrgUrl","oid","key","Buildx","_baseService","_auth","_projects","_collections","_storage","_flows","_templates","_functions","_buildxObjects","_apiKeys","_onboarding","_crypto","getConfig","auth","projects","storage","flows","templates","functions","buildxObjects","apiKeys","onboarding","crypto"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/services/Auth.ts","../src/services/Projects.ts","../src/services/Collections.ts","../src/services/Storage.ts","../src/services/Flows.ts","../src/services/Templates.ts","../src/services/Functions.ts","../src/services/BuildxObjects.ts","../src/services/ApiKeys.ts","../src/services/Onboarding.ts","../src/services/Crypto.ts","../../buildx-common/build/error/index.mjs","../src/services/BaseService.ts","../src/Buildx.ts"],"sourcesContent":["import { BaseService } from \"./BaseService\";\nimport {\n\tAuthUser,\n\tAuthResponse,\n\tLoginCredentials,\n\tGoogleCredentials,\n\tEotpRequest,\n\tEotpVerify,\n\tDeviceTrustOtpVerifyRequest,\n\tPasswordResetRequest,\n\tPasswordResetPayload,\n\tChangePasswordRequest,\n\tPublicOnboardingOtpRequestPayload,\n\tPublicOnboardingOtpRequestData,\n\tPublicOnboardingOtpVerifyPayload,\n\tPublicOnboardingOtpVerifyData,\n\tPublicOnboardingCompletePayload,\n\tPublicOnboardingCompleteData,\n\tErrorResponse,\n\tSuccessResponse\n} from \"../types/index\";\n\n/**\n * Authentication service for Buildx\n * Handles user authentication, login, signup, and user management\n * \n * @example\n * ```typescript\n * const auth = buildx.auth();\n * \n * // Login with username and password\n * const result = await auth.login({ username: 'user', password: 'pass' });\n * \n * // Get current user\n * const user = await auth.getCurrentUser();\n * \n * // Sign up new user\n * const newUser = await auth.signup({ username: 'newuser', password: 'pass' });\n * ```\n */\nexport class Auth {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\tprivate resolveAuthProjectScope(): string | null {\n\t\tconst projectId = String(this.baseService.config.projectId || \"\").trim();\n\t\tif (!projectId || projectId === \"default\") return null;\n\t\treturn projectId;\n\t}\n\n\t/**\n\t * Set the access token\n\t */\n\tsetAccessToken(token: string | null): void {\n\t\tthis.baseService.setAccessToken(token);\n\t}\n\n\t/**\n\t * Get the access token\n\t */\n\tgetAccessToken(): string | null {\n\t\treturn this.baseService.getAccessToken();\n\t}\n\n\t/**\n\t * Set the refresh token\n\t */\n\tsetRefreshToken(token: string | null): void {\n\t\tthis.baseService.setRefreshToken(token);\n\t}\n\n\t/**\n\t * Get the refresh token\n\t */\n\tgetRefreshToken(): string | null {\n\t\treturn this.baseService.getRefreshToken();\n\t}\n\n\t/**\n\t * Set optional client identifier used for device trust auth\n\t */\n\tsetClientId(clientId: string | null): void {\n\t\tthis.baseService.setClientId(clientId);\n\t}\n\n\t/**\n\t * Get optional client identifier used for device trust auth\n\t */\n\tgetClientId(): string | null {\n\t\treturn this.baseService.getClientId();\n\t}\n\n\t/**\n\t * Set optional client proof (device token) used for device trust auth\n\t */\n\tsetClientProof(clientProof: string | null): void {\n\t\tthis.baseService.setClientProof(clientProof);\n\t}\n\n\t/**\n\t * Get optional client proof (device token) used for device trust auth\n\t */\n\tgetClientProof(): string | null {\n\t\treturn this.baseService.getClientProof();\n\t}\n\n\t/**\n\t * Clear all stored tokens\n\t */\n\tclearTokens(): void {\n\t\tthis.baseService.clearTokens();\n\t}\n\n\t/**\n\t * Check if user is authenticated\n\t */\n\tisAuthenticated(): boolean {\n\t\treturn this.baseService.isAuthenticated();\n\t}\n\n\t/**\n\t * Store tokens from authentication response\n\t */\n\tprivate storeTokens(response: AuthResponse | AuthUser | null | undefined): void {\n\t\tif (!response || typeof response !== \"object\") {\n\t\t\treturn;\n\t\t}\n\t\tconst accessToken = (response as any).token || (response as any).access_token || null;\n\t\tconst refreshToken = (response as any).refresh_token || (response as any).refreshToken || null;\n\t\tif (accessToken) {\n\t\t\tthis.baseService.setAccessToken(accessToken);\n\t\t}\n\t\tif (refreshToken) {\n\t\t\tthis.baseService.setRefreshToken(refreshToken);\n\t\t\tthis.baseService.setClientProof(refreshToken);\n\t\t} else if (accessToken) {\n\t\t\tthis.baseService.setClientProof(accessToken);\n\t\t}\n\t}\n\n\t/**\n\t * Check if response is an error response\n\t */\n\tprivate isErrorResponse(response: any): response is ErrorResponse {\n\t\treturn response && typeof response === \"object\" && \"success\" in response && response.success === false;\n\t}\n\n\tprivate hasProjectScope(): boolean {\n\t\treturn !!this.resolveAuthProjectScope();\n\t}\n\n\tprivate getAuthClientContext(): { client_id?: string; client_proof?: string } {\n\t\tconst clientId = this.baseService.getClientId();\n\t\tconst clientProof = this.baseService.getClientProof();\n\t\tconst payload: { client_id?: string; client_proof?: string } = {};\n\t\tif (clientId) payload.client_id = clientId;\n\t\tif (clientProof) payload.client_proof = clientProof;\n\t\treturn payload;\n\t}\n\n\tprivate getAuthClientHeaders(): Record<string, string> {\n\t\tconst clientId = this.baseService.getClientId();\n\t\tconst clientProof = this.baseService.getClientProof();\n\t\tconst headers: Record<string, string> = {};\n\t\tif (clientId) headers[\"x-client-id\"] = clientId;\n\t\tif (clientProof) headers[\"x-client-proof\"] = clientProof;\n\t\treturn headers;\n\t}\n\n\tprivate buildAuthUrl(path: string, options?: { requireProjectScope?: boolean }): string {\n\t\tconst projectId = this.resolveAuthProjectScope();\n\t\tconst suffix = path.startsWith(\"/auth\") ? path : `/auth${path.startsWith(\"/\") ? path : `/${path}`}`;\n\n\t\tif (projectId) {\n\t\t\treturn `/${projectId}${suffix}`;\n\t\t}\n\n\t\tif (options?.requireProjectScope) {\n\t\t\tthrow new Error(\"Project ID is required for this auth endpoint\");\n\t\t}\n\n\t\treturn suffix;\n\t}\n\n\t/**\n\t * Login with username and password\n\t */\n\tasync login(credentials: LoginCredentials): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/login\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(\n\t\t\turl,\n\t\t\t{ ...credentials, ...this.getAuthClientContext() },\n\t\t\t{ headers: this.getAuthClientHeaders() }\n\t\t);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Login with Google credentials\n\t */\n\tasync loginWithGoogle(credentials: GoogleCredentials): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/google\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(\n\t\t\turl,\n\t\t\t{ ...credentials, ...this.getAuthClientContext() },\n\t\t\t{ headers: this.getAuthClientHeaders() }\n\t\t);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Sign up a new user\n\t */\n\tasync signup(credentials: LoginCredentials): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/signup\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(\n\t\t\turl,\n\t\t\t{ ...credentials, ...this.getAuthClientContext() },\n\t\t\t{ headers: this.getAuthClientHeaders() }\n\t\t);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Request email OTP for authentication\n\t */\n\tasync requestEotp(request: EotpRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/eotp/auth/request\", { requireProjectScope: true });\n\t\treturn await this.baseService.post(url, request);\n\t}\n\n\t/**\n\t * Request OTP for login (alias of requestEotp)\n\t */\n\tasync requestEotpAuth(request: EotpRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\treturn this.requestEotp(request);\n\t}\n\n\t/**\n\t * Request OTP for login (alias of requestEotp)\n\t */\n\tasync requestOtpLogin(request: EotpRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\treturn this.requestEotp(request);\n\t}\n\n\t/**\n\t * Verify email OTP\n\t */\n\tasync verifyEotp(verify: EotpVerify): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/eotp/auth/verify\", { requireProjectScope: true });\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(\n\t\t\turl,\n\t\t\t{ ...verify, ...this.getAuthClientContext() },\n\t\t\t{ headers: this.getAuthClientHeaders() }\n\t\t);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Verify OTP for login (alias of verifyEotp)\n\t */\n\tasync verifyEotpAuth(verify: EotpVerify): Promise<AuthUser | ErrorResponse> {\n\t\treturn this.verifyEotp(verify);\n\t}\n\n\t/**\n\t * Verify OTP for login (alias of verifyEotp)\n\t */\n\tasync verifyOtpLogin(verify: EotpVerify): Promise<AuthUser | ErrorResponse> {\n\t\treturn this.verifyEotp(verify);\n\t}\n\n\t/**\n\t * Request OTP for public onboarding flow (pre-project auth).\n\t * @deprecated Use `buildx.onboarding().requestOtp(...)` instead.\n\t */\n\tasync requestPublicOnboardingOtp(\n\t\tpayload: PublicOnboardingOtpRequestPayload\n\t): Promise<SuccessResponse<PublicOnboardingOtpRequestData> | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/public/onboarding/otp/request\", payload);\n\t}\n\n\t/**\n\t * Verify OTP for public onboarding flow.\n\t * @deprecated Use `buildx.onboarding().verifyOtp(...)` instead.\n\t */\n\tasync verifyPublicOnboardingOtp(\n\t\tpayload: PublicOnboardingOtpVerifyPayload\n\t): Promise<SuccessResponse<PublicOnboardingOtpVerifyData> | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/public/onboarding/otp/verify\", payload);\n\t}\n\n\t/**\n\t * Complete public onboarding and return project-scoped access token.\n\t * @deprecated Use `buildx.onboarding().complete(...)` instead.\n\t */\n\tasync completePublicOnboarding(\n\t\tpayload: PublicOnboardingCompletePayload,\n\t\tidempotencyKey: string\n\t): Promise<SuccessResponse<PublicOnboardingCompleteData> | ErrorResponse> {\n\t\tconst response = await this.baseService.post<SuccessResponse<PublicOnboardingCompleteData> | ErrorResponse>(\n\t\t\t\"/public/onboarding/complete\",\n\t\t\tpayload,\n\t\t\t{\n\t\t\t\theaders: {\n\t\t\t\t\t\"Idempotency-Key\": idempotencyKey,\n\t\t\t\t},\n\t\t\t}\n\t\t);\n\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\tconst accessToken = (response as any)?.data?.access_token;\n\t\tconst refreshToken = (response as any)?.data?.refresh_token;\n\t\tif (accessToken) {\n\t\t\tthis.baseService.setAccessToken(accessToken);\n\t\t}\n\t\tif (refreshToken) {\n\t\t\tthis.baseService.setRefreshToken(refreshToken);\n\t\t}\n\t\treturn response;\n\t}\n\n\t/**\n\t * Retrieve public onboarding request status by request id.\n\t * @deprecated Use `buildx.onboarding().getRequest(...)` instead.\n\t */\n\tasync getPublicOnboardingRequest(\n\t\trequestId: string\n\t): Promise<SuccessResponse<PublicOnboardingOtpRequestData> | ErrorResponse> {\n\t\treturn await this.baseService.get(`/public/onboarding/request/${encodeURIComponent(requestId)}`);\n\t}\n\n\t/**\n\t * Get current authenticated user\n\t */\n\tasync getCurrentUser(): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/me\");\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Refresh authentication token\n\t */\n\tasync refreshToken(): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/token\");\n\t\tconst response = await this.baseService.post<AuthResponse | SuccessResponse | ErrorResponse>(\n\t\t\turl,\n\t\t\t{},\n\t\t\t{ headers: this.getAuthClientHeaders() }\n\t\t);\n\n\t\t// Check if it's an error response\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\t// Store tokens if they exist in the response\n\t\tif (response && typeof response === \"object\" && (\"token\" in response && (response as any).token)) {\n\t\t\tthis.storeTokens(response as AuthResponse);\n\t\t}\n\n\t\treturn response as SuccessResponse;\n\t}\n\n\t/**\n\t * Verify device trust OTP challenge and finalize login tokens\n\t */\n\tasync verifyDeviceTrustOtp(payload: DeviceTrustOtpVerifyRequest): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/device-trust/verify\");\n\t\tconst response = await this.baseService.post<AuthResponse | AuthUser | ErrorResponse>(\n\t\t\turl,\n\t\t\tpayload,\n\t\t\t{ headers: this.getAuthClientHeaders() }\n\t\t);\n\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\tthis.storeTokens(response as AuthResponse | AuthUser);\n\t\treturn response as AuthUser;\n\t}\n\n\t/**\n\t * Update user password\n\t */\n\tasync updatePassword(password: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/password/update\");\n\t\treturn await this.baseService.post(url, { password });\n\t}\n\n\t/**\n\t * Change current user password\n\t */\n\tasync changePassword(request: ChangePasswordRequest | string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/password/update\");\n\t\tif (typeof request === \"string\") {\n\t\t\treturn await this.baseService.post(url, { password: request });\n\t\t}\n\n\t\tconst password = request.password ?? request.newPassword ?? request.new_password;\n\t\tconst payload: Record<string, any> = { ...request };\n\t\tif (password) {\n\t\t\tpayload.password = password;\n\t\t}\n\t\tif (request.currentPassword && !payload.current_password) {\n\t\t\tpayload.current_password = request.currentPassword;\n\t\t}\n\t\tif (request.newPassword && !payload.new_password) {\n\t\t\tpayload.new_password = request.newPassword;\n\t\t}\n\n\t\treturn await this.baseService.post(url, payload);\n\t}\n\n\t/**\n\t * Admin update user password\n\t */\n\tasync adminUpdatePassword(userId: string, password: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/password/update\");\n\t\treturn await this.baseService.post(url, { user_id: userId, password });\n\t}\n\n\t/**\n\t * Request password reset email\n\t */\n\tasync requestPasswordReset(request: PasswordResetRequest): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/password/reset/request\");\n\t\treturn await this.baseService.post(url, request);\n\t}\n\n\t/**\n\t * Reset password with token\n\t */\n\tasync resetPassword(payload: PasswordResetPayload): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(\"/auth/password/reset\");\n\t\treturn await this.baseService.post(url, payload);\n\t}\n\n\t/**\n\t * Update push notification token\n\t */\n\tasync updatePushToken(token: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst projectScope = this.resolveAuthProjectScope();\n\t\tconst url = this.hasProjectScope()\n\t\t\t? `/${projectScope}/users/push-tokens`\n\t\t\t: \"/users/push-tokens\";\n\t\treturn await this.baseService.post(url, { token });\n\t}\n\n\t/**\n\t * List all users (admin only)\n\t */\n\tasync listUsers(projectId?: string): Promise<AuthUser[] | ErrorResponse> {\n\t\tconst url = projectId\n\t\t\t? `/${projectId}/auth/users`\n\t\t\t: \"/auth/users\";\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Lookup users (for autocomplete/search)\n\t */\n\tasync lookupUsers(projectId?: string): Promise<AuthUser[] | ErrorResponse> {\n\t\tconst url = projectId\n\t\t\t? `/${projectId}/auth/users/lookup`\n\t\t\t: \"/auth/users/lookup\";\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get user by ID\n\t */\n\tasync getUser(userId: string, projectId?: string): Promise<AuthUser | ErrorResponse> {\n\t\tconst url = projectId\n\t\t\t? `/${projectId}/auth/user/${userId}`\n\t\t\t: `/auth/user/${userId}`;\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Delete user (admin only)\n\t */\n\tasync deleteUser(userId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.buildAuthUrl(`/auth/user/${userId}/delete`);\n\t\treturn await this.baseService.post(url, {});\n\t}\n} \n","import { BaseService } from \"./BaseService\";\nimport {\n\tProject,\n\tErrorResponse,\n\tSuccessResponse,\n\tProjectLocalePayload,\n\tProjectLocaleValidationResponse,\n} from \"../types/index\";\n\n/**\n * Projects service for Buildx\n * Handles project management operations\n * \n * @example\n * ```typescript\n * const projects = buildx.projects();\n * \n * // List all projects\n * const projectList = await projects.list();\n * \n * // Create a new project\n * const newProject = await projects.create({\n * name: 'My Project',\n * description: 'A new project'\n * });\n * \n * // Get project by ID\n * const project = await projects.get('project-id');\n * ```\n */\nexport class Projects {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all projects\n\t */\n\tasync list(): Promise<Project[] | ErrorResponse> {\n\t\treturn await this.baseService.get(\"/projects\");\n\t}\n\n\t/**\n\t * Get project by ID\n\t */\n\tasync get(projectId: string): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.get(`/project/${projectId}`);\n\t}\n\n\t/**\n\t * Create a new project\n\t */\n\tasync create(projectData: Partial<Project>): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/projects\", projectData);\n\t}\n\n\t/**\n\t * Update project\n\t */\n\tasync update(projectId: string, projectData: Partial<Project>): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.patch(`/project/${projectId}`, projectData);\n\t}\n\n\t/**\n\t * Update project metadata and locale defaults (timezone/language).\n\t */\n\tasync updateMetadata(\n\t\tprojectId: string,\n\t\tpayload: {\n\t\t\tmetadata?: Record<string, any>;\n\t\t\tdefault_language?: string;\n\t\t\ttimezone?: string;\n\t\t}\n\t): Promise<Project | ErrorResponse> {\n\t\treturn await this.baseService.patch(`/project/${projectId}/metadata`, payload);\n\t}\n\n\t/**\n\t * Validate locale format for project settings.\n\t * Format:\n\t * - default_language: \"en\" | \"en-US\"\n\t * - timezone: \"Asia/Bangkok\" | \"UTC\"\n\t */\n\tasync validateLocale(payload: ProjectLocalePayload): Promise<ProjectLocaleValidationResponse | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/project/locale/validate\", payload);\n\t}\n\n\t/**\n\t * Delete project\n\t */\n\tasync deleteById(projectId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\treturn await this.baseService.delete(`/project/${projectId}`);\n\t}\n\n\t/**\n\t * Backup project\n\t */\n\tasync backup(projectId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst response = await this.baseService.axiosInstance.get(`/project/${projectId}/backup`, {\n\t\t\tresponseType: \"blob\",\n\t\t\theaders: await this.baseService.getHeaders(),\n\t\t});\n\n\t\t// Create download link for browser\n\t\tif (typeof window !== \"undefined\") {\n\t\t\tconst url = window.URL.createObjectURL(response.data);\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tlink.href = url;\n\t\t\tlink.setAttribute(\"download\", `backup_${projectId}.buildx`);\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t\twindow.URL.revokeObjectURL(url);\n\t\t}\n\n\t\treturn { success: true, message: \"Backup downloaded successfully\" };\n\t}\n\n\t/**\n\t * Restore project from backup\n\t */\n\tasync restore(projectId: string, file: File): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"new_project_id\", projectId);\n\t\tformData.append(\"backup_file\", file);\n\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data\" };\n\t\treturn await this.baseService.post(\"/project/import\", formData, { headers });\n\n\t}\n}\n","import { BaseService } from \"./BaseService\";\nimport {\n\tCollection,\n\tDocument,\n\tQueryOptions,\n\tErrorResponse,\n\tSuccessResponse,\n\tImportMapping,\n\tPaginatedResult,\n\tRelationHydrationConfig,\n\tCollectionRealtimeHandlers,\n\tCollectionRealtimeSubscribeOptions,\n\tCollectionRealtimeSubscription,\n\tCollectionRealtimeEvent,\n\tPaginationWebSocketLike,\n} from \"../types/index\";\n\ntype UpdateDocumentOptions = {\n\tupdateOnly?: boolean;\n};\n\ntype CollectionWsResponse = {\n\tid?: string;\n\tok?: boolean;\n\tresult?: any;\n\terror?: string;\n};\n\nclass CollectionWsClient {\n\tprivate socket: PaginationWebSocketLike | null = null;\n\tprivate connectPromise: Promise<void> | null = null;\n\tprivate requestCounter = 0;\n\tprivate readonly pending = new Map<string, { resolve: (value: any) => void; reject: (error: any) => void; timeout: ReturnType<typeof setTimeout> }>();\n\n\tconstructor(\n\t\tprivate readonly baseService: BaseService,\n\t\tprivate readonly collectionId: string,\n\t\tprivate readonly wsFactory?: (url: string) => PaginationWebSocketLike\n\t) { }\n\n\tasync query(action: \"queryWithPagination\" | \"queryRaw\", payload: Record<string, any>, timeoutMs = 30000): Promise<any> {\n\t\tawait this.ensureConnected();\n\t\tif (!this.socket) {\n\t\t\tthrow new Error(\"WebSocket connection is unavailable\");\n\t\t}\n\n\t\tconst id = `${Date.now()}_${++this.requestCounter}`;\n\t\tconst resultPromise = new Promise<any>((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tthis.pending.delete(id);\n\t\t\t\treject(new Error(\"WebSocket pagination timeout\"));\n\t\t\t}, timeoutMs);\n\t\t\tthis.pending.set(id, { resolve, reject, timeout });\n\t\t});\n\n\t\tthis.socket.send(JSON.stringify({\n\t\t\tid,\n\t\t\taction,\n\t\t\tpayload,\n\t\t}));\n\n\t\treturn resultPromise;\n\t}\n\n\tclose() {\n\t\tif (!this.socket) return;\n\t\ttry {\n\t\t\tthis.socket.close();\n\t\t} catch (_error) {\n\t\t\t// noop\n\t\t}\n\t\tthis.socket = null;\n\t\tthis.connectPromise = null;\n\t\tfor (const [, entry] of this.pending.entries()) {\n\t\t\tclearTimeout(entry.timeout);\n\t\t\tentry.reject(new Error(\"WebSocket closed\"));\n\t\t}\n\t\tthis.pending.clear();\n\t}\n\n\tprivate async ensureConnected() {\n\t\tif (this.socket && this.isSocketOpen(this.socket)) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.connectPromise) {\n\t\t\treturn this.connectPromise;\n\t\t}\n\n\t\tthis.connectPromise = new Promise<void>((resolve, reject) => {\n\t\t\tconst GlobalWebSocket = (globalThis as any).WebSocket;\n\t\t\tif (!this.wsFactory && !GlobalWebSocket) {\n\t\t\t\treject(new Error(\"WebSocket is not available in this runtime\"));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvoid this.baseService.ensureValidAccessToken().then(() => {\n\t\t\t\tconst url = this.buildSocketUrl();\n\t\t\t\tconst socket = this.wsFactory\n\t\t\t\t\t? this.wsFactory(url)\n\t\t\t\t\t: new GlobalWebSocket(url);\n\t\t\t\tthis.socket = socket;\n\t\t\t\tlet settled = false;\n\n\t\t\t\tconst onOpen = () => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\t\t\t\tconst onError = (error: any) => {\n\t\t\t\t\tif (!settled) {\n\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\t\t\t\t\tthis.close();\n\t\t\t\t};\n\t\t\t\tconst onClose = () => {\n\t\t\t\t\tif (!settled) {\n\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\treject(new Error(\"WebSocket closed before connection is ready\"));\n\t\t\t\t\t}\n\t\t\t\t\tthis.close();\n\t\t\t\t};\n\t\t\t\tconst onMessage = (event: any) => {\n\t\t\t\t\tlet response: CollectionWsResponse;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tresponse = JSON.parse(event?.data || \"{}\");\n\t\t\t\t\t} catch (_error) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst id = response?.id;\n\t\t\t\t\tif (!id) return;\n\t\t\t\t\tconst pending = this.pending.get(id);\n\t\t\t\t\tif (!pending) return;\n\t\t\t\t\tclearTimeout(pending.timeout);\n\t\t\t\t\tthis.pending.delete(id);\n\n\t\t\t\t\tif (response.ok && response.result) {\n\t\t\t\t\t\tpending.resolve(response.result);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tpending.reject(new Error(response.error || \"WebSocket pagination query failed\"));\n\t\t\t\t};\n\n\t\t\t\tif (socket.addEventListener) {\n\t\t\t\t\tsocket.addEventListener(\"open\", onOpen);\n\t\t\t\t\tsocket.addEventListener(\"error\", onError);\n\t\t\t\t\tsocket.addEventListener(\"close\", onClose);\n\t\t\t\t\tsocket.addEventListener(\"message\", onMessage);\n\t\t\t\t} else {\n\t\t\t\t\tsocket.onopen = onOpen;\n\t\t\t\t\tsocket.onerror = onError;\n\t\t\t\t\tsocket.onclose = onClose;\n\t\t\t\t\tsocket.onmessage = onMessage;\n\t\t\t\t}\n\t\t\t}).catch((error) => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t}).finally(() => {\n\t\t\tthis.connectPromise = null;\n\t\t});\n\n\t\treturn this.connectPromise;\n\t}\n\n\tprivate isSocketOpen(socket: PaginationWebSocketLike): boolean {\n\t\tconst openState = (globalThis as any).WebSocket?.OPEN ?? 1;\n\t\treturn socket.readyState === openState;\n\t}\n\n\tprivate buildSocketUrl() {\n\t\tconst endpoint = this.baseService.config.apiEndpoint.replace(/\\/$/, \"\");\n\t\tconst wsEndpoint = endpoint.replace(/^http:/i, \"ws:\").replace(/^https:/i, \"wss:\");\n\t\tconst path = this.baseService.buildProjectUrl(`/${this.collectionId}/data/pagination/ws`);\n\n\t\tconst params = new URLSearchParams();\n\t\tconst apiKey = this.baseService.config.apiKey;\n\t\tif (apiKey) params.set(\"api_key\", apiKey);\n\t\tconst token = this.baseService.getAccessToken();\n\t\tif (token) params.set(\"token\", token);\n\n\t\tconst qs = params.toString();\n\t\treturn `${wsEndpoint}${path}${qs ? `?${qs}` : \"\"}`;\n\t}\n}\n\n/**\n * Collections service for Buildx\n * Handles collection management, documents, and queries\n * \n * @example\n * ```typescript\n * const collections = buildx.collections();\n * \n * // Get all collections\n * const collectionsList = await collections.list();\n * \n * // Get collection schema\n * const schema = await collections.getSchema('collection-id');\n * \n * // Query documents\n * const docs = await collections.query('collection-id', {\n * filter: { status: 'active' },\n * limit: 10\n * });\n * ```\n */\nexport class Collections {\n\tprivate baseService: BaseService;\n\tprivate static readonly RELATION_QUERY_CHUNK_SIZE = 200;\n\tprivate collectionWsClient: CollectionWsClient | null = null;\n\tprivate collectionWsCollectionId: string | null = null;\n\tprivate collectionWsDisabledUntil = 0;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all collections in a project\n\t */\n\tasync list(withStats = false, withBuildx = false): Promise<Collection[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/collections\");\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (withStats) {\n\t\t\tqueryParams.with_stats = true;\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst collections = await this.baseService.get(fullUrl);\n\n\t\tif (Array.isArray(collections) && !withBuildx) {\n\t\t\treturn collections.filter(collection =>\n\t\t\t\tcollection.collection_id && !collection.collection_id.startsWith(\"buildx_\")\n\t\t\t);\n\t\t}\n\n\t\treturn collections;\n\t}\n\n\t/**\n\t * Get collection schema\n\t */\n\tasync getSchema(collectionId: string, depth = 1): Promise<Collection | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/collection/${collectionId}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (depth > 1) {\n\t\t\tqueryParams.depth = depth;\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\treturn await this.baseService.get(fullUrl);\n\t}\n\n\t/**\n\t * Create or update collection\n\t */\n\tasync set(collectionData: Partial<Collection>): Promise<Collection | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/collections\");\n\t\treturn await this.baseService.post(url, collectionData);\n\t}\n\n\t/**\n\t * Delete collection\n\t */\n\tasync deleteCollection(collectionId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/collections/${collectionId}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n\n\t/**\n\t * Query documents in a collection\n\t */\n\tasync query(collectionId: string, options?: QueryOptions): Promise<Document[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}`);\n\t\tconst noPopulate = options?.noPopulate ?? (!!options?.relations && options.relations.length > 0);\n\t\tconst queryParams = this.buildQueryParams({\n\t\t\t...options,\n\t\t\toptions: noPopulate\n\t\t\t\t? {\n\t\t\t\t\t...(options?.options || {}),\n\t\t\t\t\tnoPopulate: true,\n\t\t\t\t}\n\t\t\t\t: options?.options,\n\t\t});\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst result = await this.baseService.get(fullUrl);\n\t\tif (!Array.isArray(result)) {\n\t\t\treturn result;\n\t\t}\n\n\t\tif (!options?.relations || options.relations.length === 0) {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst preferWs = (options?.paginationTransport || \"auto\") !== \"http\";\n\t\treturn await this.hydrateRelations(result, options.relations, options.relationSelect, {\n\t\t\tpreferWs,\n\t\t\twsFactory: options.wsFactory,\n\t\t});\n\t}\n\n\t/**\n\t * Query documents without server-side populate.\n\t */\n\tasync queryRaw(collectionId: string, options?: QueryOptions): Promise<Document[] | ErrorResponse> {\n\t\tconst normalizedOptions: QueryOptions = {\n\t\t\t...options,\n\t\t\toptions: {\n\t\t\t\t...(options?.options || {}),\n\t\t\t\tnoPopulate: true,\n\t\t\t},\n\t\t};\n\t\tconst transport = normalizedOptions.paginationTransport || \"http\";\n\t\tif (transport !== \"http\" && Date.now() >= this.collectionWsDisabledUntil) {\n\t\t\ttry {\n\t\t\t\treturn await this.queryRawViaWs(collectionId, normalizedOptions);\n\t\t\t} catch (error: any) {\n\t\t\t\tconsole.warn(\"[buildx-sdk] WS raw query failed, fallback to HTTP\", error?.message || error);\n\t\t\t\tthis.collectionWsDisabledUntil = Date.now() + 30000;\n\t\t\t\tthis.resetCollectionWsClient();\n\t\t\t}\n\t\t}\n\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/raw`);\n\t\tconst queryParams = this.buildQueryParams(normalizedOptions);\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\treturn await this.baseService.get(fullUrl);\n\t}\n\n\t/**\n\t * Query documents with pagination metadata.\n\t */\n\tasync queryWithPagination(collectionId: string, options?: QueryOptions): Promise<PaginatedResult<Document> | ErrorResponse> {\n\t\tconst noPopulate = options?.noPopulate ?? (!!options?.relations && options.relations.length > 0);\n\t\tconst normalizedOptions: QueryOptions = {\n\t\t\t...options,\n\t\t\toptions: noPopulate\n\t\t\t\t? {\n\t\t\t\t\t...(options?.options || {}),\n\t\t\t\t\tnoPopulate: true,\n\t\t\t\t}\n\t\t\t\t: options?.options,\n\t\t};\n\n\t\tconst transport = normalizedOptions.paginationTransport || \"auto\";\n\t\tlet result: PaginatedResult<Document> | ErrorResponse;\n\t\tconst shouldTryWs = transport !== \"http\" && Date.now() >= this.collectionWsDisabledUntil;\n\t\tif (shouldTryWs) {\n\t\t\ttry {\n\t\t\t\tresult = await this.queryWithPaginationViaWs(collectionId, normalizedOptions);\n\t\t\t}\n\t\t\tcatch (error: any) {\n\t\t\t\t// Retry on HTTP endpoint for compatibility and temporarily disable WS attempts.\n\t\t\t\tconsole.warn(\"[buildx-sdk] WS pagination failed, fallback to HTTP\", error?.message || error);\n\t\t\t\tthis.collectionWsDisabledUntil = Date.now() + 30000;\n\t\t\t\tthis.resetCollectionWsClient();\n\t\t\t\tresult = await this.queryWithPaginationViaHttp(collectionId, normalizedOptions);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tresult = await this.queryWithPaginationViaHttp(collectionId, normalizedOptions);\n\t\t}\n\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\tif (!normalizedOptions?.relations || normalizedOptions.relations.length === 0) {\n\t\t\treturn result as PaginatedResult<Document>;\n\t\t}\n\n\t\tconst preferWs = transport !== \"http\";\n\t\tconst hydratedRows = await this.hydrateRelations((result as PaginatedResult<Document>).data || [], normalizedOptions.relations, normalizedOptions.relationSelect, {\n\t\t\tpreferWs,\n\t\t\twsFactory: normalizedOptions.wsFactory,\n\t\t});\n\t\tif (!Array.isArray(hydratedRows)) {\n\t\t\treturn hydratedRows;\n\t\t}\n\n\t\treturn {\n\t\t\t...(result as PaginatedResult<Document>),\n\t\t\tdata: hydratedRows,\n\t\t};\n\t}\n\n\tprivate async queryWithPaginationViaHttp(collectionId: string, options?: QueryOptions): Promise<PaginatedResult<Document> | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/data/pagination`);\n\t\tconst queryParams = this.buildQueryParams(options);\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\t\tconst result = await this.baseService.get(fullUrl);\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\treturn {\n\t\t\t...(result as PaginatedResult<Document>),\n\t\t\tmeta: {\n\t\t\t\t...((result as PaginatedResult<Document>).meta || {}),\n\t\t\t\ttransport: \"http\",\n\t\t\t},\n\t\t} as PaginatedResult<Document>;\n\t}\n\n\tprivate async queryWithPaginationViaWs(collectionId: string, options?: QueryOptions): Promise<PaginatedResult<Document> | ErrorResponse> {\n\t\tconst payload = this.buildQueryParams(options);\n\t\tconst client = this.getOrCreateCollectionWsClient(collectionId, options?.wsFactory);\n\t\tconst result = await client.query(\"queryWithPagination\", payload);\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\treturn {\n\t\t\t...(result as PaginatedResult<Document>),\n\t\t\tmeta: {\n\t\t\t\t...((result as PaginatedResult<Document>).meta || {}),\n\t\t\t\ttransport: \"ws\",\n\t\t\t},\n\t\t} as PaginatedResult<Document>;\n\t}\n\n\tprivate async queryRawViaWs(collectionId: string, options?: QueryOptions): Promise<Document[] | ErrorResponse> {\n\t\tconst payload = this.buildQueryParams(options);\n\t\tconst client = this.getOrCreateCollectionWsClient(collectionId, options?.wsFactory);\n\t\tconst result = await client.query(\"queryRaw\", payload);\n\t\tif (!result || (result as ErrorResponse).success === false) {\n\t\t\treturn result as ErrorResponse;\n\t\t}\n\t\treturn Array.isArray(result) ? result as Document[] : [];\n\t}\n\n\tprivate getOrCreateCollectionWsClient(collectionId: string, wsFactory?: (url: string) => PaginationWebSocketLike) {\n\t\tif (!this.collectionWsClient || this.collectionWsCollectionId !== collectionId) {\n\t\t\tthis.resetCollectionWsClient();\n\t\t\tthis.collectionWsClient = new CollectionWsClient(this.baseService, collectionId, wsFactory);\n\t\t\tthis.collectionWsCollectionId = collectionId;\n\t\t}\n\t\treturn this.collectionWsClient;\n\t}\n\n\tprivate resetCollectionWsClient() {\n\t\tif (this.collectionWsClient) {\n\t\t\tthis.collectionWsClient.close();\n\t\t}\n\t\tthis.collectionWsClient = null;\n\t\tthis.collectionWsCollectionId = null;\n\t}\n\n\t/**\n\t * Subscribe realtime data events for a collection via WebSocket.\n\t */\n\tsubscribeRealtime(\n\t\tcollectionId: string,\n\t\thandlers: CollectionRealtimeHandlers,\n\t\toptions?: CollectionRealtimeSubscribeOptions\n\t): CollectionRealtimeSubscription {\n\t\tconst GlobalWebSocket = (globalThis as any).WebSocket;\n\t\tconst factory = options?.wsFactory;\n\t\tif (!factory && !GlobalWebSocket) {\n\t\t\tthrow new Error(\"WebSocket is not available in this runtime. Provide wsFactory in options.\");\n\t\t}\n\t\tconst reconnectEnabled = options?.reconnect !== false;\n\t\tconst reconnectDelayMs = typeof options?.reconnectDelayMs === \"number\" && options.reconnectDelayMs >= 0\n\t\t\t? options.reconnectDelayMs\n\t\t\t: 5000;\n\t\tlet socket: PaginationWebSocketLike | null = null;\n\t\tlet hasConnected = false;\n\t\tlet isClosed = false;\n\t\tlet reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\t\tlet disconnectHandled = false;\n\t\tlet connect: (() => Promise<void>) | null = null;\n\n\t\tconst emitConnected = () => {\n\t\t\tif (isClosed || hasConnected) return;\n\t\t\thasConnected = true;\n\t\t\thandlers.onConnected?.();\n\t\t};\n\t\tconst stopReconnectTimer = () => {\n\t\t\tif (!reconnectTimer) return;\n\t\t\tclearTimeout(reconnectTimer);\n\t\t\treconnectTimer = null;\n\t\t};\n\t\tconst buildSocketUrl = async () => {\n\t\t\tconst endpoint = this.baseService.config.apiEndpoint.replace(/\\/$/, \"\");\n\t\t\tconst wsEndpoint = endpoint.replace(/^http:/i, \"ws:\").replace(/^https:/i, \"wss:\");\n\t\t\tconst path = this.baseService.buildProjectUrl(`/${collectionId}/realtime/ws`);\n\n\t\t\tconst params = new URLSearchParams();\n\t\t\tconst apiKey = options?.apiKey || this.baseService.config.apiKey;\n\t\t\tif (apiKey) params.set(\"api_key\", apiKey);\n\t\t\tconst token = options?.token || await this.baseService.ensureValidAccessToken();\n\t\t\tif (token) params.set(\"token\", token);\n\n\t\t\tconst qs = params.toString();\n\t\t\treturn `${wsEndpoint}${path}${qs ? `?${qs}` : \"\"}`;\n\t\t};\n\t\tconst emitEvent = (rawEvent: any) => {\n\t\t\tif (isClosed) return;\n\t\t\ttry {\n\t\t\t\tconst raw = rawEvent?.data;\n\t\t\t\tif (raw == null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet parsed: any;\n\t\t\t\tif (typeof raw === \"string\") {\n\t\t\t\t\tconst text = raw.trim();\n\t\t\t\t\tif (!text) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tparsed = JSON.parse(text);\n\t\t\t\t} else if (typeof raw === \"object\") {\n\t\t\t\t\tparsed = raw;\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (parsed.type === \"ping\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (parsed.type === \"connected\") {\n\t\t\t\t\temitConnected();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst data = {\n\t\t\t\t\t...parsed,\n\t\t\t\t\ttimestamp: typeof parsed.timestamp === \"number\" ? parsed.timestamp : Date.now(),\n\t\t\t\t} as CollectionRealtimeEvent;\n\t\t\t\thandlers.onEvent?.(data);\n\t\t\t}\n\t\t\tcatch (error) {\n\t\t\t\thandlers.onError?.(error);\n\t\t\t}\n\t\t};\n\t\tconst scheduleReconnect = () => {\n\t\t\tif (isClosed || !reconnectEnabled || reconnectTimer) return;\n\t\t\treconnectTimer = setTimeout(() => {\n\t\t\t\treconnectTimer = null;\n\t\t\t\tif (isClosed) return;\n\t\t\t\thasConnected = false;\n\t\t\t\tif (connect) {\n\t\t\t\t\tvoid connect();\n\t\t\t\t}\n\t\t\t}, reconnectDelayMs);\n\t\t};\n\t\tconst handleDisconnect = (error: Error) => {\n\t\t\tif (isClosed || disconnectHandled) return;\n\t\t\tdisconnectHandled = true;\n\t\t\thandlers.onError?.(error);\n\t\t\tscheduleReconnect();\n\t\t};\n\n\t\tconst onOpen = () => {\n\t\t\tdisconnectHandled = false;\n\t\t\temitConnected();\n\t\t};\n\t\tconst onMessage = (event: any) => emitEvent(event);\n\t\tconst onError = (error: any) => {\n\t\t\tif (isClosed) return;\n\t\t\tconst message = error?.message || error?.type || \"Realtime WebSocket error\";\n\t\t\thandleDisconnect(error instanceof Error ? error : new Error(message));\n\t\t};\n\t\tconst onClose = (event: any) => {\n\t\t\tif (isClosed) return;\n\t\t\tconst code = event?.code;\n\t\t\tconst reason = event?.reason;\n\t\t\tconst closeError = new Error(\n\t\t\t\t`Realtime WebSocket closed${code ? ` (code ${code})` : \"\"}${reason ? `: ${reason}` : \"\"}`\n\t\t\t);\n\t\t\thandleDisconnect(closeError);\n\t\t};\n\t\tconnect = async () => {\n\t\t\tstopReconnectTimer();\n\t\t\tconst url = await buildSocketUrl();\n\t\t\tconst nextSocket = factory ? factory(url) : new GlobalWebSocket(url);\n\t\t\tsocket = nextSocket;\n\n\t\t\tif (nextSocket.addEventListener) {\n\t\t\t\tnextSocket.addEventListener(\"open\", onOpen);\n\t\t\t\tnextSocket.addEventListener(\"message\", onMessage);\n\t\t\t\tnextSocket.addEventListener(\"error\", onError);\n\t\t\t\tnextSocket.addEventListener(\"close\", onClose);\n\t\t\t} else {\n\t\t\t\tnextSocket.onopen = onOpen;\n\t\t\t\tnextSocket.onmessage = onMessage;\n\t\t\t\tnextSocket.onerror = onError;\n\t\t\t\tnextSocket.onclose = onClose;\n\t\t\t}\n\t\t};\n\n\t\tvoid connect().catch((error) => {\n\t\t\thandleDisconnect(error instanceof Error ? error : new Error(String(error || \"Realtime connection failed\")));\n\t\t});\n\n\t\treturn {\n\t\t\tclose: () => {\n\t\t\t\tisClosed = true;\n\t\t\t\tstopReconnectTimer();\n\t\t\t\tsocket?.close();\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Get lookup data for a collection (for dropdowns/autocomplete)\n\t */\n\tasync lookup(collectionId: string, options?: QueryOptions): Promise<Array<{ value: string; label: string }> | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (options) {\n\t\t\tif (options.filter) {\n\t\t\t\tqueryParams.filter = options.filter;\n\t\t\t}\n\t\t\tif (options.jsonFilter) {\n\t\t\t\tqueryParams.jsonFilter = options.jsonFilter;\n\t\t\t}\n\t\t\tif (options.projection) {\n\t\t\t\tqueryParams.projection = options.projection;\n\t\t\t}\n\t\t\tif (options.options) {\n\t\t\t\tqueryParams.options = options.options;\n\t\t\t}\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst result = await this.baseService.get(fullUrl);\n\n\t\tif (Array.isArray(result)) {\n\t\t\treturn result.map(row => ({\n\t\t\t\tvalue: row._id,\n\t\t\t\tlabel: row._display || row.label || row.title || row.name || row.username || row.description || \"\"\n\t\t\t}));\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate buildQueryParams(options?: QueryOptions): Record<string, any> {\n\t\tconst queryParams: Record<string, any> = {};\n\t\tif (!options) return queryParams;\n\n\t\tconst searchQuery = options.q || (options as any).searchQuery;\n\t\tif (searchQuery) {\n\t\t\tqueryParams.q = searchQuery;\n\t\t}\n\t\tif (options.quick_filter_fields) {\n\t\t\tqueryParams.quick_filter_fields = options.quick_filter_fields;\n\t\t}\n\t\tif (options.filter) {\n\t\t\tqueryParams.filter = options.filter;\n\t\t}\n\t\tif (options.jsonFilter) {\n\t\t\tqueryParams.jsonFilter = options.jsonFilter;\n\t\t}\n\t\tif (options.select) {\n\t\t\tqueryParams.select = Array.isArray(options.select)\n\t\t\t\t? options.select.join(\",\")\n\t\t\t\t: options.select;\n\t\t}\n\t\tif (options.projection) {\n\t\t\tqueryParams.projection = options.projection;\n\t\t}\n\t\tif (options.options) {\n\t\t\tqueryParams.options = options.options;\n\t\t}\n\t\tif (options.sort) {\n\t\t\tqueryParams.sort = options.sort;\n\t\t}\n\t\tif (typeof options.limit === \"number\") {\n\t\t\tqueryParams.limit = options.limit;\n\t\t}\n\t\tif (typeof options.skip === \"number\" && options.skip > 0) {\n\t\t\tqueryParams.skip = options.skip;\n\t\t}\n\n\t\treturn queryParams;\n\t}\n\n\tprivate async hydrateRelations(\n\t\trows: Document[],\n\t\trelations: RelationHydrationConfig[],\n\t\trelationSelect?: string | string[],\n\t\toptions?: {\n\t\t\tpreferWs?: boolean;\n\t\t\twsFactory?: (url: string) => PaginationWebSocketLike;\n\t\t}\n\t): Promise<Document[] | ErrorResponse> {\n\t\tconst enhancedRows = rows.map((row) => ({ ...row }));\n\t\tconst defaultSelect = relationSelect || \"_id,_display,name,title,username\";\n\n\t\tconst groupedByCollection = relations.reduce((acc, relation) => {\n\t\t\tif (!acc[relation.collectionId]) {\n\t\t\t\tacc[relation.collectionId] = [];\n\t\t\t}\n\t\t\tacc[relation.collectionId].push(relation);\n\t\t\treturn acc;\n\t\t}, {} as Record<string, RelationHydrationConfig[]>);\n\n\t\tconst relationCache = new Map<string, Document>();\n\n\t\tfor (const [refCollectionId, configs] of Object.entries(groupedByCollection)) {\n\t\t\tconst ids = new Set<string>();\n\t\t\tfor (const row of enhancedRows) {\n\t\t\t\tfor (const config of configs) {\n\t\t\t\t\tconst value = row[config.field];\n\t\t\t\t\tif (!value) continue;\n\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\tfor (const item of value) {\n\t\t\t\t\t\t\tconst id = this.extractReferenceId(item);\n\t\t\t\t\t\t\tif (id) ids.add(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst id = this.extractReferenceId(value);\n\t\t\t\t\t\tif (id) ids.add(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst missingIds = Array.from(ids).filter((id) => !relationCache.has(`${refCollectionId}:${id}`));\n\t\t\tif (missingIds.length > 0) {\n\t\t\t\tconst chunkSize = Collections.RELATION_QUERY_CHUNK_SIZE;\n\t\t\t\tfor (let i = 0; i < missingIds.length; i += chunkSize) {\n\t\t\t\t\tconst idChunk = missingIds.slice(i, i + chunkSize);\n\t\t\t\t\tconst relatedDocs = await this.queryRaw(refCollectionId, {\n\t\t\t\t\t\tfilter: { _id: { $in: idChunk } },\n\t\t\t\t\t\tselect: defaultSelect,\n\t\t\t\t\t\tpaginationTransport: options?.preferWs ? \"auto\" : \"http\",\n\t\t\t\t\t\twsFactory: options?.wsFactory,\n\t\t\t\t\t});\n\t\t\t\t\tif (!Array.isArray(relatedDocs)) {\n\t\t\t\t\t\treturn relatedDocs;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const doc of relatedDocs) {\n\t\t\t\t\t\tif (doc?._id) {\n\t\t\t\t\t\t\trelationCache.set(`${refCollectionId}:${doc._id}`, doc);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const row of enhancedRows) {\n\t\t\t\tfor (const config of configs) {\n\t\t\t\t\tconst value = row[config.field];\n\t\t\t\t\tif (!value) continue;\n\n\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\trow[config.field] = value.map((item) => {\n\t\t\t\t\t\t\tconst id = this.extractReferenceId(item);\n\t\t\t\t\t\t\tif (!id) return item;\n\t\t\t\t\t\t\treturn relationCache.get(`${refCollectionId}:${id}`) || item;\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst id = this.extractReferenceId(value);\n\t\t\t\t\t\tif (!id) continue;\n\t\t\t\t\t\trow[config.field] = relationCache.get(`${refCollectionId}:${id}`) || value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn enhancedRows;\n\t}\n\n\tprivate extractReferenceId(value: any): string | null {\n\t\tif (value === null || value === undefined) return null;\n\t\tif (typeof value === \"string\" || typeof value === \"number\") {\n\t\t\tconst normalized = String(value).trim();\n\t\t\treturn normalized.length > 0 ? normalized : null;\n\t\t}\n\t\tif (typeof value === \"object\" && value._id !== undefined && value._id !== null) {\n\t\t\tconst normalized = String(value._id).trim();\n\t\t\treturn normalized.length > 0 ? normalized : null;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\t\t\n\t * Get single document by ID\n\t */\n\tasync getDocument(collectionId: string, documentId: string, populate?: string[]): Promise<Document | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (populate && populate.length > 0) {\n\t\t\tqueryParams.populate = populate.join(\",\");\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\treturn await this.baseService.get(fullUrl);\n\t}\n\n\t/**\n\t * Create new document\n\t */\n\tasync createDocument(collectionId: string, data: any): Promise<Document | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Update document\n\t */\n\tasync updateDocument(collectionId: string, documentId: string, data: any): Promise<Document | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\treturn await this.baseService.patch(url, data);\n\t}\n\n\t/**\n\t * Update document with optional mode flags.\n\t */\n\tasync updateDocumentWithOptions(\n\t\tcollectionId: string,\n\t\tdocumentId: string,\n\t\tdata: any,\n\t\toptions?: UpdateDocumentOptions\n\t): Promise<Document | ErrorResponse> {\n\t\tconst baseUrl = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\tconst url = options?.updateOnly ? `${baseUrl}?mode=updateOnly` : baseUrl;\n\t\treturn await this.baseService.patch(url, data);\n\t}\n\n\t/**\n\t * Get document revisions\n\t */\n\tasync getDocumentRevisions(collectionId: string, documentId: string): Promise<Document[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}/revisions`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Delete document\n\t */\n\tasync deleteDocument(collectionId: string, documentId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/${documentId}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n\n\t/**\n\t * Delete documents by filter\n\t */\n\tasync deleteByFilter(collectionId: string, filter: any): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/delete`);\n\t\treturn await this.baseService.post(url, { filter });\n\t}\n\n\t/**\n\t * Import data to collection\n\t */\n\tasync import(collectionId: string, file: File, mapping: ImportMapping): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"mapping\", JSON.stringify(mapping));\n\t\tformData.append(\"file\", file);\n\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/import`);\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data\" };\n\n\t\treturn await this.baseService.post(url, formData, { headers });\n\t}\n\n\t/**\n\t * Get collection data types\n\t */\n\tasync getDataTypes(): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/collections/types\");\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Validate collection data\n\t */\n\tasync validate(collectionId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/validate`);\n\t\treturn await this.baseService.post(url, null);\n\t}\n\n\t/**\n\t * Migrate collection data\n\t */\n\tasync migrate(collectionId: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/${collectionId}/migrate`);\n\t\treturn await this.baseService.post(url, null);\n\t}\n} \n","import { BaseService } from \"./BaseService\";\nimport {\n\tErrorResponse,\n\tSuccessResponse,\n\tStorageUploadResult,\n\tPrivateStorageAccessUrlPayload,\n\tPrivateStorageAccessUrlResult\n} from \"../types/index\";\n\n/**\n * Storage service for Buildx\n * Handles file upload, download, and management\n * \n * @example\n * ```typescript\n * const storage = buildx.storage();\n * \n * // Upload file\n * const result = await storage.upload(file, 'uploads/');\n * \n * // List files in directory\n * const files = await storage.list('uploads/');\n * \n * // Delete file\n * await storage.delete('uploads/file.txt');\n * ```\n */\nexport class Storage {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Upload file to storage\n\t */\n\tasync upload(file: File, prefix?: string): Promise<StorageUploadResult | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tif (prefix && prefix !== \"\") {\n\t\t\tformData.append(\"prefix\", prefix);\n\t\t}\n\t\tformData.append(\"file\", file);\n\t\tformData.append(\"filename\", file.name || \"file\");\n\n\t\tconst url = this.baseService.buildProjectUrl(\"/storage/upload\");\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data; charset=utf-8\" };\n\n\t\treturn await this.baseService.post(url, formData, { headers });\n\t}\n\n\t/**\n\t * Upload file to collection storage\n\t */\n\tasync uploadToCollection(file: File, collectionId: string, prefix?: string): Promise<StorageUploadResult | ErrorResponse> {\n\t\tconst formData = new FormData();\n\t\tif (prefix && prefix !== \"\") {\n\t\t\tformData.append(\"prefix\", prefix);\n\t\t}\n\t\tformData.append(\"file\", file);\n\t\tformData.append(\"filename\", file.name || \"file\");\n\t\tformData.append(\"collection_id\", collectionId);\n\n\t\tconst url = this.baseService.buildProjectUrl(\"/storage/upload\");\n\t\tconst headers = { ...(await this.baseService.getHeaders()), \"Content-Type\": \"multipart/form-data; charset=utf-8\" };\n\n\t\treturn await this.baseService.post(url, formData, { headers });\n\t}\n\n\t/**\n\t * List files in directory\n\t */\n\tasync list(path: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/storage?path=${encodeURIComponent(path)}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get storage size for path\n\t */\n\tasync getSize(path: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/storage/size?path=${encodeURIComponent(path)}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Delete file from storage\n\t */\n\tasync delete(path: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/storage?path=${encodeURIComponent(path)}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n\n\t/**\n\t * Create tokenized private access URL for a project-scoped storage path.\n\t */\n\tasync getPrivateAccessUrl(payload: PrivateStorageAccessUrlPayload): Promise<PrivateStorageAccessUrlResult | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/storage/private/access-url\");\n\t\treturn await this.baseService.post(url, payload);\n\t}\n}\n","import { BaseService } from \"./BaseService\";\nimport { ErrorResponse } from \"../types/index\";\n\n/**\n * Flows service for Buildx\n * Handles flow types and running flows\n * \n * @example\n * ```typescript\n * const flows = buildx.flows();\n * \n * // Get flow types\n * const types = await flows.getTypes();\n * \n * // Run a flow\n * const result = await flows.run('flow-id', 'session-id', 'root', { arg1: 'value' });\n * ```\n */\nexport class Flows {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Get all flow types\n\t */\n\tasync getTypes(): Promise<any | ErrorResponse> {\n\t\t// Optionally use cache in the future\n\t\treturn await this.baseService.get(\"/flows/types\");\n\t}\n\n\t/**\n\t * Run a flow\n\t */\n\tasync run(flowId: string, sessionId: string | null = null, state: any = \"root\", args: any = {}): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/flows/${flowId}/run`);\n\t\treturn await this.baseService.post(url, { session_id: sessionId, state, args });\n\t}\n\n\t/**\n\t * Get GPT flow code suggestions\n\t */\n\tasync getGptFlowSuggestions(instruction: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/ai/gpt/flow/node\");\n\t\treturn await this.baseService.post<any>(url, { instruction });\n\t}\n\n\t/**\n\t * Get GPT collection suggestions\n\t */\n\tasync getGptCollectionSuggestions(instruction: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/ai/gpt/collections\");\n\t\treturn await this.baseService.post<any>(url, { instruction });\n\t}\n\n\t/**\n\t * Get GPT lifecycle suggestions\n\t */\n\tasync getGptLifecycleSuggestions(instruction: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/ai/gpt/lifecycle\");\n\t\treturn await this.baseService.post<any>(url, { instruction });\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { ErrorResponse, SuccessResponse } from \"../types/index\";\n\n/**\n * Templates service for Buildx\n * Handles template rendering and preview\n * \n * @example\n * ```typescript\n * const templates = buildx.templates();\n * \n * // Preview a template\n * const preview = await templates.preview('template', { name: 'John' });\n * \n * // Render a template\n * const rendered = await templates.render('template-id', { name: 'John' });\n * \n * // Generate PDF\n * await templates.generatePDF('template-id', data);\n * ```\n */\nexport class Templates {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Preview a template with data\n\t */\n\tasync preview(template: any, data: any): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/templates/preview\");\n\t\treturn await this.baseService.post(url, { template, data });\n\t}\n\n\t/**\n\t * Render a template by ID with data\n\t */\n\tasync render(templateId: string, data: any): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/templates/${templateId}/render`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Render a template as PDF and download (browser only)\n\t */\n\tasync renderPDF(templateId: string, data: any): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/templates/${templateId}/pdf`);\n\t\tconst headers = { ...(await this.baseService.getHeaders()), responseType: \"blob\" };\n\t\tconst response = await this.baseService.axiosInstance.post(url, data, { headers });\n\n\t\t// Create download link for browser\n\t\tif (typeof window !== \"undefined\") {\n\t\t\tconst blobUrl = window.URL.createObjectURL(response.data);\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tlink.href = blobUrl;\n\t\t\tlink.setAttribute(\"download\", \"document.pdf\");\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t\twindow.URL.revokeObjectURL(blobUrl);\n\t\t}\n\n\t\treturn { success: true, message: \"PDF downloaded successfully\" };\n\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { Function, FunctionLog, ErrorResponse } from \"../types/index\";\n\n/**\n * Functions service for Buildx\n * Handles serverless functions management\n * \n * @example\n * ```typescript\n * const functions = buildx.functions();\n * \n * // Get all functions\n * const funcs = await functions.list();\n * \n * // Get function by name\n * const func = await functions.getByName('function-name');\n * \n * // Update function\n * await functions.update('function-name', { code: 'new code' });\n * ```\n */\nexport class Functions {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all functions in a project\n\t */\n\tasync list(): Promise<Function[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/functions\");\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get function by name\n\t */\n\tasync getByName(functionName: string): Promise<Function | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Update function\n\t */\n\tasync update(functionName: string, data: Partial<Function>): Promise<Function | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Get function logs\n\t */\n\tasync getLogs(functionName: string): Promise<FunctionLog[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}/logs`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Invoke function runtime (supports revision pinning).\n\t */\n\tasync invoke(\n\t\tfunctionName: string,\n\t\tpayload: any,\n\t\toptions?: { revision?: string | number; alias?: string }\n\t): Promise<any | ErrorResponse> {\n\t\tconst query = new URLSearchParams();\n\t\tif (options?.revision != null) query.set(\"revision\", String(options.revision));\n\t\tif (options?.alias) query.set(\"alias\", options.alias);\n\t\tconst queryString = query.toString();\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/run/${functionName}${queryString ? `?${queryString}` : \"\"}`);\n\t\treturn await this.baseService.post(url, payload);\n\t}\n\n\t/**\n\t * List immutable revisions for a function.\n\t */\n\tasync listRevisions(functionName: string): Promise<any[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}/revisions`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Publish a revision to an alias (default: live).\n\t */\n\tasync publishRevision(functionName: string, revision: string | number, alias = \"live\"): Promise<Function | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}/revisions/${revision}/publish`);\n\t\treturn await this.baseService.post(url, { alias });\n\t}\n\n\t/**\n\t * Move an alias pointer to a revision.\n\t */\n\tasync setAlias(functionName: string, alias: string, revision: string | number): Promise<Function | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/functions/${functionName}/aliases/${alias}`);\n\t\treturn await this.baseService.put(url, { revision });\n\t}\n} \n","import { BaseService } from \"./BaseService\";\nimport { BuildxObject, ErrorResponse, SuccessResponse } from \"../types/index\";\n\n/**\n * Buildx Objects service for Buildx\n * Handles Buildx-specific objects (users, roles, etc.)\n * \n * @example\n * ```typescript\n * const buildxObjects = buildx.buildxObjects();\n * \n * // Get Buildx collection\n * const collection = await buildxObjects.getCollection('users');\n * \n * // Get Buildx document\n * const doc = await buildxObjects.getDocument('users', 'user-id');\n * \n * // Query Buildx objects\n * const objects = await buildxObjects.query('users', { limit: 10 });\n * ```\n */\nexport class BuildxObjects {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Get Buildx collection\n\t */\n\tasync getCollection(type: string): Promise<any | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/collection/${type}`);\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get Buildx document by ID\n\t */\n\tasync getDocument(type: string, id: string): Promise<BuildxObject | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}/${id}`);\n\t\tconst result = await this.baseService.get(url);\n\n\t\tif (typeof result === \"object\" && result !== null) {\n\t\t\tresult._display = result._display || result.label || result.title || result.name || result.username || result.description || \"\";\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Query Buildx objects\n\t */\n\tasync query(type: string, options?: any): Promise<BuildxObject[] | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}`);\n\t\tconst queryParams: Record<string, any> = {};\n\n\t\tif (options) {\n\t\t\tif (options.filter) {\n\t\t\t\tqueryParams.filter = options.filter;\n\t\t\t}\n\t\t\tif (options.jsonFilter) {\n\t\t\t\tqueryParams.jsonFilter = options.jsonFilter;\n\t\t\t}\n\t\t\tif (options.select) {\n\t\t\t\tqueryParams.select = Array.isArray(options.select)\n\t\t\t\t\t? options.select.join(\",\")\n\t\t\t\t\t: options.select;\n\t\t\t}\n\t\t\tif (options.projection) {\n\t\t\t\tqueryParams.projection = options.projection;\n\t\t\t}\n\t\t\tif (options.options) {\n\t\t\t\tqueryParams.options = options.options;\n\t\t\t}\n\t\t\tif (options.sort) {\n\t\t\t\tqueryParams.sort = options.sort;\n\t\t\t}\n\t\t\tif (options.limit) {\n\t\t\t\tqueryParams.limit = options.limit;\n\t\t\t}\n\t\t}\n\n\t\tconst queryString = this.baseService.buildQueryString(queryParams);\n\t\tconst fullUrl = queryString ? `${url}${queryString}` : url;\n\n\t\tconst result = await this.baseService.get(fullUrl);\n\n\t\tif (Array.isArray(result)) {\n\t\t\tresult.forEach(row => {\n\t\t\t\trow._display = row._display || row.label || row.title || row.name || row.username || row.description || \"\";\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Create Buildx object\n\t */\n\tasync create(type: string, data: any): Promise<BuildxObject | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}`);\n\t\treturn await this.baseService.post(url, data);\n\t}\n\n\t/**\n\t * Update Buildx object\n\t */\n\tasync update(type: string, id: string, data: any): Promise<BuildxObject | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}/${id}`);\n\t\treturn await this.baseService.patch(url, data);\n\t}\n\n\t/**\n\t * Delete Buildx object\n\t */\n\tasync deleteObject(type: string, id: string): Promise<SuccessResponse | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(`/buildx/${type}/${id}`);\n\t\treturn await this.baseService.delete(url);\n\t}\n} ","import { BaseService } from \"./BaseService\";\nimport { ApiKey, ErrorResponse } from \"../types/index\";\n\n/**\n * API Keys service for Buildx\n * Handles API key management\n * \n * @example\n * ```typescript\n * const apiKeys = buildx.apiKeys();\n * \n * // List API keys\n * const keys = await apiKeys.list();\n * \n * // Get API key by ID\n * const key = await apiKeys.get('key-id');\n * \n * // Get API key secret\n * const secret = await apiKeys.getSecret('key-id');\n * ```\n */\nexport class ApiKeys {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * List all API keys\n\t */\n\tasync list(projectId?: string): Promise<ApiKey[] | ErrorResponse> {\n\t\tconst url = projectId\n\t\t\t? `/${projectId}/auth/api-keys`\n\t\t\t: \"/auth/api-keys\";\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get API key by ID\n\t */\n\tasync get(apiKeyId: string, projectId?: string): Promise<ApiKey | ErrorResponse> {\n\t\tconst url = projectId\n\t\t\t? `/${projectId}/auth/api-key/${apiKeyId}`\n\t\t\t: `/auth/api-key/${apiKeyId}`;\n\t\treturn await this.baseService.get(url);\n\t}\n\n\t/**\n\t * Get API key secret\n\t */\n\tasync getSecret(apiKeyId: string, projectId?: string): Promise<any | ErrorResponse> {\n\t\tconst url = projectId\n\t\t\t? `/${projectId}/auth/api-key/${apiKeyId}/secret`\n\t\t\t: `/auth/api-key/${apiKeyId}/secret`;\n\t\treturn await this.baseService.get(url);\n\t}\n} \n","import { BaseService } from \"./BaseService\";\nimport {\n\tErrorResponse,\n\tSuccessResponse,\n\tPublicOnboardingOtpRequestPayload,\n\tPublicOnboardingOtpRequestData,\n\tPublicOnboardingProjectIdAvailabilityPayload,\n\tPublicOnboardingProjectIdAvailabilityData,\n\tPublicOnboardingOtpVerifyPayload,\n\tPublicOnboardingOtpVerifyData,\n\tPublicOnboardingCompletePayload,\n\tPublicOnboardingCompleteData,\n} from \"../types/index\";\n\n/**\n * Public onboarding service for Buildx (pre-project provisioning flow).\n */\nexport class Onboarding {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\tprivate isErrorResponse(response: any): response is ErrorResponse {\n\t\treturn response && typeof response === \"object\" && \"success\" in response && response.success === false;\n\t}\n\n\t/**\n\t * Check project-id availability for public onboarding.\n\t */\n\tasync checkProjectIdAvailability(\n\t\tpayload: PublicOnboardingProjectIdAvailabilityPayload\n\t): Promise<SuccessResponse<PublicOnboardingProjectIdAvailabilityData> | ErrorResponse> {\n\t\tconst query = new URLSearchParams({\n\t\t\tproduct_key: payload.product_key,\n\t\t\tproject_id: payload.project_id,\n\t\t});\n\t\treturn await this.baseService.get(`/public/onboarding/project-id/availability?${query.toString()}`);\n\t}\n\n\t/**\n\t * Request onboarding OTP.\n\t */\n\tasync requestOtp(\n\t\tpayload: PublicOnboardingOtpRequestPayload\n\t): Promise<SuccessResponse<PublicOnboardingOtpRequestData> | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/public/onboarding/otp/request\", payload);\n\t}\n\n\t/**\n\t * Verify onboarding OTP.\n\t */\n\tasync verifyOtp(\n\t\tpayload: PublicOnboardingOtpVerifyPayload\n\t): Promise<SuccessResponse<PublicOnboardingOtpVerifyData> | ErrorResponse> {\n\t\treturn await this.baseService.post(\"/public/onboarding/otp/verify\", payload);\n\t}\n\n\t/**\n\t * Complete onboarding and persist returned auth tokens when available.\n\t */\n\tasync complete(\n\t\tpayload: PublicOnboardingCompletePayload,\n\t\tidempotencyKey: string\n\t): Promise<SuccessResponse<PublicOnboardingCompleteData> | ErrorResponse> {\n\t\tconst response = await this.baseService.post<SuccessResponse<PublicOnboardingCompleteData> | ErrorResponse>(\n\t\t\t\"/public/onboarding/complete\",\n\t\t\tpayload,\n\t\t\t{\n\t\t\t\theaders: {\n\t\t\t\t\t\"Idempotency-Key\": idempotencyKey,\n\t\t\t\t},\n\t\t\t}\n\t\t);\n\n\t\tif (this.isErrorResponse(response)) {\n\t\t\treturn response;\n\t\t}\n\n\t\tconst accessToken = (response as any)?.data?.access_token;\n\t\tconst refreshToken = (response as any)?.data?.refresh_token;\n\t\tif (accessToken) {\n\t\t\tthis.baseService.setAccessToken(accessToken);\n\t\t}\n\t\tif (refreshToken) {\n\t\t\tthis.baseService.setRefreshToken(refreshToken);\n\t\t}\n\t\treturn response;\n\t}\n\n\t/**\n\t * Get onboarding request status.\n\t */\n\tasync getRequest(\n\t\trequestId: string\n\t): Promise<SuccessResponse<PublicOnboardingOtpRequestData> | ErrorResponse> {\n\t\treturn await this.baseService.get(`/public/onboarding/request/${encodeURIComponent(requestId)}`);\n\t}\n}\n","import { BaseService } from \"./BaseService\";\nimport { ErrorResponse, TsaHashPayloadOptions, TsaHashPayloadResult } from \"../types\";\n\nexport class Crypto {\n\tprivate baseService: BaseService;\n\n\tconstructor(baseService: BaseService) {\n\t\tthis.baseService = baseService;\n\t}\n\n\t/**\n\t * Hash payload and request TSA timestamp token for current project scope.\n\t */\n\tasync hashPayloadWithTsa(\n\t\tpayload: string,\n\t\toptions: TsaHashPayloadOptions = {}\n\t): Promise<TsaHashPayloadResult | ErrorResponse> {\n\t\tconst url = this.baseService.buildProjectUrl(\"/crypto/tsa/hash\");\n\t\treturn await this.baseService.post(url, {\n\t\t\tpayload,\n\t\t\t...options,\n\t\t});\n\t}\n}\n","const ERROR_CODES={INTERNAL_SERVER:{code:\"E01000\",message:\"Internal Server Error.\",statusCode:500},NOT_IMPLEMENTED:{code:\"E01001\",message:\"Method Not Implemented.\",statusCode:501},FUNC_NOT_AVAILABLE:{code:\"E01002\",message:\"Method Not Allowed.\",statusCode:405},MAINTENANCE_MODE:{code:\"E01003\",message:\"Service is under maintenance.\",statusCode:503},INVALID_RESPONSE:{code:\"E01004\",message:\"Invalid response.\",statusCode:400},INTERNAL_SERVER_ERROR:{code:\"E01000\",message:\"Internal Server Error.\",statusCode:500},INSUFFICIENT_PERMISSIONS:{code:\"E02001\",message:\"Insufficient permissions.\",statusCode:403},FORBIDDEN:{code:\"E02003\",message:\"Forbidden.\",statusCode:403},IP_RESTRICTED:{code:\"E02004\",message:\"IP Address not in whitelist.\",statusCode:403},UNAUTHORIZED:{code:\"E02005\",message:\"Unauthorized access.\",statusCode:401},TOKEN_EXPIRED:{code:\"E02006\",message:\"Token expired.\",statusCode:401},INVALID_API_KEY:{code:\"E02011\",message:\"Invalid API-KEY\",statusCode:400},INVALID_API_KEY_EXPIRED:{code:\"E02012\",message:\"Invalid API-KEY expired\",statusCode:400},INVALID_SIGNATURE:{code:\"E02013\",message:\"Invalid signature\",statusCode:400},INVALID_CREDENTIALS:{code:\"E02014\",message:\"Invalid credentials.\",statusCode:401},INVALID_EMAIL_DOMAIN:{code:\"E02015\",message:\"Invalid email domain.\",statusCode:400},INVALID_OTP:{code:\"E02021\",message:\"Invalid OTP.\",statusCode:400},OTP_EXPIRED:{code:\"E02022\",message:\"OTP expired.\",statusCode:400},EMAIL_SEND_FAILED:{code:\"E02023\",message:\"Failed to send email.\",statusCode:500},INVALID_REQUEST:{code:\"E03001\",message:\"Invalid request.\",statusCode:400},BAD_REQUEST:{code:\"E03001\",message:\"Bad request.\",statusCode:400},PROJECT_NOT_FOUND:{code:\"E03002\",message:\"Project not found.\",statusCode:404},PROJECT_DELETED:{code:\"E03003\",message:\"Project deleted.\",statusCode:404},PROJECT_ALREADY_EXISTS:{code:\"E03004\",message:\"Project already exists.\",statusCode:400},PROJECT_DEACTIVATED:{code:\"E03005\",message:\"Project is deactivated.\",statusCode:403},INVALID_USER_CREDENTIALS:{code:\"E03011\",message:\"Invalid user credentials.\",statusCode:400},INVALID_USER_SYNC_INFO:{code:\"E03012\",message:\"Invalid user sync info.\",statusCode:400},USER_ALREADY_EXISTS:{code:\"E03013\",message:\"User already exists.\",statusCode:400},USER_NOT_FOUND:{code:\"E03014\",message:\"User not found.\",statusCode:400},SALT_CANNOT_BE_EMPTY:{code:\"E03015\",message:\"Salt cannot be empty.\",statusCode:400},USER_INFO_NOT_FOUND:{code:\"E03016\",message:\"User info not found.\",statusCode:400},CREDENTIAL_NOT_FOUND:{code:\"E03021\",message:\"Credential not found.\",statusCode:404},CREDENTIAL_ALREADY_EXISTS:{code:\"E03022\",message:\"Credential already exists.\",statusCode:400},VALIDATION_ERROR:{code:\"E03023\",message:\"Validation error.\",statusCode:400},EXTERNAL_SERVICE_NOT_FOUND:{code:\"E03024\",message:\"External service not found.\",statusCode:404},INTEGRATION_CONFIG_NOT_FOUND:{code:\"E03031\",message:\"Integration config not found.\",statusCode:404},INTEGRATION_CONFIG_ALREADY_EXISTS:{code:\"E03032\",message:\"Integration config already exists.\",statusCode:400},COLLECTION_ALREADY_EXISTS:{code:\"E04001\",message:\"Collection already exists.\",statusCode:400},INVALID_COLLECTION:{code:\"E04002\",message:\"Invalid collection.\",statusCode:400},COLLECTION_NOT_FOUND:{code:\"E04004\",message:\"Collection not found.\",statusCode:404},DOCUMENT_NOT_FOUND:{code:\"E04011\",message:\"Document not found.\",statusCode:404},INVALID_DOCUMENT:{code:\"E04012\",message:\"Invalid document.\",statusCode:400},DOCUMENT_ALREADY_EXISTS:{code:\"E04014\",message:\"Document already exists.\",statusCode:400},DOCUMENT_DELETE_BLOCKED_BY_RELATION:{code:\"E04015\",message:\"Document delete blocked by related records.\",statusCode:409},CANNOT_TRANSITION:{code:\"E05001\",message:\"Cannot transition to the requested state.\",statusCode:400},STATE_NOT_FOUND:{code:\"E05002\",message:\"State not found.\",statusCode:400},LIFECYCLE_NOT_FOUND:{code:\"E05003\",message:\"Lifecycle not found.\",statusCode:400},FLOW_NOT_FOUND:{code:\"E05004\",message:\"Flow not found.\",statusCode:400},TRANSITION_NOT_ALLOWED:{code:\"E05005\",message:\"Transition not allowed.\",statusCode:400},INTERACTIVE_FLOW_NOT_ALLOWED:{code:\"E05006\",message:\"Interactive flow not allowed.\",statusCode:400},FUNCTION_NOT_FOUND:{code:\"E06001\",message:\"Function not found.\",statusCode:404},FUNCTION_CHECKSUM_MISMATCH:{code:\"E06002\",message:\"Function checksum mismatch.\",statusCode:400},FUNCTION_METHOD_NOT_ALLOWED:{code:\"E06003\",message:\"Method not allowed for this function.\",statusCode:405},FUNCTION_ANONYMOUS_ACCESS_DENIED:{code:\"E06004\",message:\"Anonymous access not allowed for this function.\",statusCode:403},FUNCTION_NOT_LIVE:{code:\"E06005\",message:\"Function is not live.\",statusCode:400},FUNCTION_EXECUTION_FAILED:{code:\"E06006\",message:\"Function execution failed.\",statusCode:500},FUNCTION_LOG_NOT_FOUND:{code:\"E06007\",message:\"Function log not found.\",statusCode:404},INVITATION_NOT_FOUND:{code:\"E07001\",message:\"Invitation not found.\",statusCode:404},INVITATION_EXPIRED:{code:\"E07002\",message:\"Invitation has expired.\",statusCode:400},INVALID_INVITATION_STATUS:{code:\"E07003\",message:\"Invalid invitation status.\",statusCode:400},USER_ALREADY_INVITED:{code:\"E07004\",message:\"User is already invited or is a member.\",statusCode:400},TEAM_MEMBER_NOT_FOUND:{code:\"E07005\",message:\"Team member not found.\",statusCode:404},USER_CREATION_FAILED:{code:\"E07006\",message:\"Failed to create user account.\",statusCode:500},INVALID_INPUT:{code:\"E07008\",message:\"Invalid input provided.\",statusCode:400},INVITATION_EMAIL_MISMATCH:{code:\"E07009\",message:\"Authenticated user's email does not match invitation email.\",statusCode:403},AI_ERROR:{code:\"E08001\",message:\"AI error.\",statusCode:500},AI_IS_NOT_AVAILABLE:{code:\"E08002\",message:\"AI is not available.\",statusCode:500},PAYMENT_CREATION_FAILED:{code:\"E09001\",message:\"Payment creation failed.\",statusCode:500}},AUTH_ERROR_CODES={UNAUTHORIZED:ERROR_CODES.UNAUTHORIZED,TOKEN_EXPIRED:ERROR_CODES.TOKEN_EXPIRED},LEGACY_AUTH_ERROR_CODES={UNAUTHORIZED:[\"E07007\",\"E02003\"]},normalizeCode=value=>String(value||\"\").trim().toUpperCase(),getMessageText=error=>String(error?.response?.data?.message||error?.response?.data?.description||error?.response?.data?.error||error?.inner?.message||error?.message||error?.description||error?.error||\"\").toLowerCase(),extractErrorCode=error=>normalizeCode(error?.response?.data?.code||error?.code),isLegacyUnauthorizedCode=code=>LEGACY_AUTH_ERROR_CODES.UNAUTHORIZED.includes(normalizeCode(code)),isTokenExpiredError=error=>{if(extractErrorCode(error)===AUTH_ERROR_CODES.TOKEN_EXPIRED.code)return!0;const message=getMessageText(error);return!!message&&(message.includes(\"jwt expired\")||message.includes(\"token expired\")||message.includes(\"expired token\")||message.includes(\"session expired\"))},isUnauthorizedError=error=>{if(isTokenExpiredError(error))return!1;const code=extractErrorCode(error);if(code===AUTH_ERROR_CODES.UNAUTHORIZED.code||isLegacyUnauthorizedCode(code))return!0;const message=getMessageText(error);if(message.includes(\"invalid token\"))return!0;if(message.includes(\"unauthorized\"))return!0;if(message.includes(\"invalid jwt\"))return!0;const statusCode=(error=>{const value=Number(error?.response?.status||error?.statusCode||error?.status||0);return Number.isFinite(value)?value:0})(error);return!(statusCode!==AUTH_ERROR_CODES.UNAUTHORIZED.statusCode||!message)},normalizeLegacyAuthErrorCode=error=>isTokenExpiredError(error)?AUTH_ERROR_CODES.TOKEN_EXPIRED.code:isUnauthorizedError(error)?AUTH_ERROR_CODES.UNAUTHORIZED.code:null;export{AUTH_ERROR_CODES,ERROR_CODES,LEGACY_AUTH_ERROR_CODES,extractErrorCode,isLegacyUnauthorizedCode,isTokenExpiredError,isUnauthorizedError,normalizeLegacyAuthErrorCode};\n","import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { BuildxConfig, ApiHeaders, ErrorResponse } from \"../types\";\nimport { AUTH_ERROR_CODES, isTokenExpiredError } from \"buildx-common/error\";\n\nconst DEFAULT_API_ENDPOINT = \"https://api.buildx.ai\";\nconst DEFAULT_PROJECT_ID = \"default\";\nlet instances: Record<string, BaseService> = {};\n\n/**\n * Base service class that provides common functionality for all Buildx services\n */\nexport class BaseService {\n\tpublic config: BuildxConfig;\n\tpublic axiosInstance: AxiosInstance;\n\tprivate _accessToken: string | null = null;\n\tprivate _refreshToken: string | null = null;\n\tprivate _clientId: string | null = null;\n\tprivate _clientProof: string | null = null;\n\tprivate refreshPromise: Promise<boolean> | null = null;\n\n\tprivate static normalizeProjectId(projectId?: string): string {\n\t\tconst normalized = String(projectId || \"\").trim();\n\t\treturn normalized || DEFAULT_PROJECT_ID;\n\t}\n\n\tprivate static normalizeEndpoint(apiEndpoint?: string): string {\n\t\treturn String(apiEndpoint || DEFAULT_API_ENDPOINT).replace(/\\/$/, \"\");\n\t}\n\n\tprivate static createInstanceKey(apiEndpoint: string, apiKey: string, projectId: string): string {\n\t\treturn `${apiEndpoint}|${apiKey}|${projectId}`;\n\t}\n\n\tprivate static isInstanceConfigMatching(\n\t\tinstance: BaseService,\n\t\tendpoint: string,\n\t\tapiKey: string,\n\t\tprojectId: string\n\t): boolean {\n\t\tconst currentEndpoint = BaseService.normalizeEndpoint(instance.config.apiEndpoint);\n\t\tconst currentProjectId = BaseService.normalizeProjectId(instance.config.projectId);\n\t\tconst currentApiKey = String(instance.config.apiKey || \"\");\n\t\treturn currentEndpoint === endpoint\n\t\t\t&& currentApiKey === apiKey\n\t\t\t&& currentProjectId === projectId;\n\t}\n\n\tstatic getInstance(apiKey: string, projectId?: string, apiEndpoint?: string): BaseService {\n\t\tconst normalizedProjectId = BaseService.normalizeProjectId(projectId);\n\t\tconst endpoint = BaseService.normalizeEndpoint(apiEndpoint);\n\t\tconst instanceKey = BaseService.createInstanceKey(endpoint, apiKey, normalizedProjectId);\n\t\tif (!instances[instanceKey]) {\n\t\t\tinstances[instanceKey] = new BaseService({\n\t\t\t\tapiEndpoint: endpoint,\n\t\t\t\tprojectId: normalizedProjectId,\n\t\t\t\tapiKey: apiKey,\n\t\t\t});\n\t\t} else {\n\t\t\tconst current = instances[instanceKey];\n\t\t\tif (!BaseService.isInstanceConfigMatching(current, endpoint, apiKey, normalizedProjectId)) {\n\t\t\t\tinstances[instanceKey] = new BaseService({\n\t\t\t\t\tapiEndpoint: endpoint,\n\t\t\t\t\tprojectId: normalizedProjectId,\n\t\t\t\t\tapiKey: apiKey,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn instances[instanceKey];\n\t}\n\n\tconstructor(config: BuildxConfig) {\n\t\tthis.config = config;\n\t\tthis._clientId = config.clientId ?? null;\n\t\tthis._clientProof = config.clientProof ?? null;\n\t\tthis.axiosInstance = axios.create({\n\t\t\tbaseURL: config.apiEndpoint,\n\t\t\ttimeout: 30000,\n\t\t});\n\n\t\t// Add request interceptor for authentication\n\t\tthis.axiosInstance.interceptors.request.use(\n\t\t\t(config) => {\n\t\t\t\t// Add API key to all requests\n\t\t\t\tconfig.headers[\"X-API-Key\"] = this.config.apiKey;\n\t\t\t\treturn config;\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\treturn Promise.reject(error);\n\t\t\t}\n\t\t);\n\n\t\t// Add response interceptor for error handling\n\t\tthis.axiosInstance.interceptors.response.use(\n\t\t\t(response) => response,\n\t\t\t(error) => {\n\t\t\t\treturn this.handleError(error);\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Update the service configuration\n\t */\n\tupdateConfig(config: BuildxConfig): void {\n\t\tthis.config = config;\n\t\tthis._clientId = config.clientId ?? this._clientId;\n\t\tthis._clientProof = config.clientProof ?? this._clientProof;\n\t\tthis.axiosInstance.defaults.baseURL = config.apiEndpoint;\n\t}\n\n\t/**\n\t * Set the access token\n\t */\n\tpublic setAccessToken(token: string | null): void {\n\t\tthis._accessToken = token;\n\t\tthis.emitTokenChange();\n\t}\n\n\t/**\n\t * Get the access token\n\t */\n\tpublic getAccessToken(): string | null {\n\t\treturn this._accessToken;\n\t}\n\n\t/**\n\t * Set the refresh token\n\t */\n\tpublic setRefreshToken(token: string | null): void {\n\t\tthis._refreshToken = token;\n\t\tthis.emitTokenChange();\n\t}\n\n\t/**\n\t * Get the refresh token\n\t */\n\tpublic getRefreshToken(): string | null {\n\t\treturn this._refreshToken;\n\t}\n\n\t/**\n\t * Set the client identifier for optional device trust auth flow\n\t */\n\tpublic setClientId(clientId: string | null): void {\n\t\tthis._clientId = clientId;\n\t}\n\n\t/**\n\t * Get the client identifier used for optional device trust auth flow\n\t */\n\tpublic getClientId(): string | null {\n\t\treturn this._clientId;\n\t}\n\n\t/**\n\t * Set the client proof (device token) for optional device trust auth flow\n\t */\n\tpublic setClientProof(clientProof: string | null): void {\n\t\tthis._clientProof = clientProof;\n\t}\n\n\t/**\n\t * Get the client proof (device token) used for optional device trust auth flow\n\t */\n\tpublic getClientProof(): string | null {\n\t\treturn this._clientProof;\n\t}\n\n\t/**\n\t * Clear all stored tokens\n\t */\n\tpublic clearTokens(): void {\n\t\tthis._accessToken = null;\n\t\tthis._refreshToken = null;\n\t\tthis.emitTokenChange();\n\t}\n\n\tprivate emitTokenChange(): void {\n\t\tif (typeof this.config.onTokenChange !== \"function\") return;\n\t\ttry {\n\t\t\tthis.config.onTokenChange({\n\t\t\t\taccessToken: this._accessToken,\n\t\t\t\trefreshToken: this._refreshToken,\n\t\t\t});\n\t\t} catch {\n\t\t\t// Ignore callback failures to avoid breaking request flow.\n\t\t}\n\t}\n\n\tprivate decodeJwtPayload(token: string): Record<string, any> | null {\n\t\ttry {\n\t\t\tconst [, payload] = token.split(\".\");\n\t\t\tif (!payload) return null;\n\t\t\tconst normalized = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\t\t\tconst padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\n\t\t\tconst BufferCtor = (globalThis as any).Buffer;\n\t\t\tconst json = typeof atob === \"function\"\n\t\t\t\t? atob(padded)\n\t\t\t\t: BufferCtor.from(padded, \"base64\").toString(\"utf8\");\n\t\t\treturn JSON.parse(json);\n\t\t}\n\t\tcatch (_error) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate isTokenExpiredOrNearExpiry(token: string, skewMs = 30000): boolean {\n\t\tconst payload = this.decodeJwtPayload(token);\n\t\tconst exp = Number(payload?.exp || 0);\n\t\tif (!exp) {\n\t\t\treturn false;\n\t\t}\n\t\treturn Date.now() >= (exp * 1000) - skewMs;\n\t}\n\n\t/**\n\t * Check if user is authenticated (has access token)\n\t */\n\tpublic isAuthenticated(): boolean {\n\t\treturn this._accessToken !== null;\n\t}\n\n\t/**\n\t * Get default headers with authentication\n\t */\n\tpublic async getHeaders(useRefreshToken = false): Promise<ApiHeaders> {\n\t\tconst token = useRefreshToken ? this._refreshToken : this._accessToken;\n\n\t\tconst headers: ApiHeaders = {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"X-API-Key\": this.config.apiKey,\n\t\t};\n\n\t\tif (token) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${token}`;\n\t\t}\n\n\t\treturn headers;\n\t}\n\n\t/**\n\t * Get headers without authentication (for public endpoints)\n\t */\n\tpublic getPublicHeaders(): ApiHeaders {\n\t\treturn {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"X-API-Key\": this.config.apiKey,\n\t\t};\n\t}\n\n\t/**\n\t * Make a GET request\n\t */\n\tpublic async get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {\n\t\treturn await this.executeWithAutoRefresh<T>(url, async () => {\n\t\t\tconst headers = await this.getHeaders();\n\t\t\tconst response = await this.axiosInstance.get(url, {\n\t\t\t\t...config,\n\t\t\t\theaders: { ...headers, ...config?.headers },\n\t\t\t});\n\t\t\treturn this.unwrapResponse<T>(response as AxiosResponse<T> | T);\n\t\t});\n\t}\n\n\t/**\n\t * Make a POST request\n\t */\n\tpublic async post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n\t\treturn await this.executeWithAutoRefresh<T>(url, async () => {\n\t\t\tconst headers = await this.getHeaders();\n\t\t\tconst response = await this.axiosInstance.post(url, data, {\n\t\t\t\t...config,\n\t\t\t\theaders: { ...headers, ...config?.headers },\n\t\t\t});\n\t\t\treturn this.unwrapResponse<T>(response as AxiosResponse<T> | T);\n\t\t});\n\t}\n\n\t/**\n\t * Make a PUT request\n\t */\n\tpublic async put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n\t\treturn await this.executeWithAutoRefresh<T>(url, async () => {\n\t\t\tconst headers = await this.getHeaders();\n\t\t\tconst response = await this.axiosInstance.put(url, data, {\n\t\t\t\t...config,\n\t\t\t\theaders: { ...headers, ...config?.headers },\n\t\t\t});\n\t\t\treturn this.unwrapResponse<T>(response as AxiosResponse<T> | T);\n\t\t});\n\t}\n\n\t/**\n\t * Make a PATCH request\n\t */\n\tpublic async patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {\n\t\treturn await this.executeWithAutoRefresh<T>(url, async () => {\n\t\t\tconst headers = await this.getHeaders();\n\t\t\tconst response = await this.axiosInstance.patch(url, data, {\n\t\t\t\t...config,\n\t\t\t\theaders: { ...headers, ...config?.headers },\n\t\t\t});\n\t\t\treturn this.unwrapResponse<T>(response as AxiosResponse<T> | T);\n\t\t});\n\t}\n\n\t/**\n\t * Make a DELETE request\n\t */\n\tpublic async delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {\n\t\treturn await this.executeWithAutoRefresh<T>(url, async () => {\n\t\t\tconst headers = await this.getHeaders();\n\t\t\tconst response = await this.axiosInstance.delete(url, {\n\t\t\t\t...config,\n\t\t\t\theaders: { ...headers, ...config?.headers },\n\t\t\t});\n\t\t\treturn this.unwrapResponse<T>(response as AxiosResponse<T> | T);\n\t\t});\n\t}\n\n\tprivate isErrorPayload(payload: any): payload is ErrorResponse {\n\t\treturn !!payload && typeof payload === \"object\" && payload.success === false;\n\t}\n\n\tprivate shouldAttemptRefresh(url: string, payload: ErrorResponse): boolean {\n\t\tif (!this._refreshToken) return false;\n\t\tif (url.includes(\"/auth/login\") || url.includes(\"/auth/token\")) return false;\n\t\tconst status = Number(payload.statusCode || (payload as any).status || 0);\n\t\tconst code = String((payload as any).code || \"\").toUpperCase();\n\t\tconst text = String(\n\t\t\t(payload as any).message ||\n\t\t\t(payload as any).description ||\n\t\t\t(payload as any).error ||\n\t\t\t\"\"\n\t\t).toLowerCase();\n\t\tif (status !== 401) return false;\n\t\tif (code === AUTH_ERROR_CODES.UNAUTHORIZED.code) return false;\n\t\tif (code === AUTH_ERROR_CODES.TOKEN_EXPIRED.code) return true;\n\t\treturn isTokenExpiredError({\n\t\t\tcode,\n\t\t\tstatusCode: status,\n\t\t\tmessage: text,\n\t\t});\n\t}\n\n\tprivate getRefreshUrl(): string {\n\t\tconst pid = this.config.projectId;\n\t\tif (pid && pid !== DEFAULT_PROJECT_ID) {\n\t\t\treturn `/${pid}/auth/token`;\n\t\t}\n\t\treturn \"/auth/token\";\n\t}\n\n\tprivate async refreshAccessToken(): Promise<boolean> {\n\t\tif (this.refreshPromise) return this.refreshPromise;\n\t\tthis.refreshPromise = (async () => {\n\t\t\tif (!this._refreshToken) return false;\n\t\t\ttry {\n\t\t\t\tconst response = await this.axiosInstance.post(this.getRefreshUrl(), {}, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\t\"X-API-Key\": this.config.apiKey,\n\t\t\t\t\t\tAuthorization: `Bearer ${this._refreshToken}`,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tconst data = this.unwrapResponse<any>(response as AxiosResponse<any>);\n\t\t\t\tconst nextAccessToken = data?.token || data?.access_token;\n\t\t\t\tconst nextRefreshToken = data?.refresh_token || data?.refreshToken || this._refreshToken;\n\t\t\t\tif (!nextAccessToken) {\n\t\t\t\t\tthis.clearTokens();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthis.setAccessToken(nextAccessToken);\n\t\t\t\tthis.setRefreshToken(nextRefreshToken);\n\t\t\t\treturn true;\n\t\t\t} catch {\n\t\t\t\tthis.clearTokens();\n\t\t\t\treturn false;\n\t\t\t} finally {\n\t\t\t\tthis.refreshPromise = null;\n\t\t\t}\n\t\t})();\n\t\treturn this.refreshPromise;\n\t}\n\n\tprivate async executeWithAutoRefresh<T>(url: string, fn: () => Promise<T>): Promise<T> {\n\t\tconst first = await fn();\n\t\tif (!this.isErrorPayload(first)) {\n\t\t\treturn first;\n\t\t}\n\t\tif (!this.shouldAttemptRefresh(url, first)) {\n\t\t\treturn first;\n\t\t}\n\t\tconst refreshed = await this.refreshAccessToken();\n\t\tif (!refreshed) {\n\t\t\treturn {\n\t\t\t\t...first,\n\t\t\t\tmessage: \"Session expired and refresh failed. Please login again.\",\n\t\t\t} as unknown as T;\n\t\t}\n\t\treturn await fn();\n\t}\n\n\t/**\n\t * Axios interceptor may resolve with either AxiosResponse or plain ErrorResponse.\n\t * Normalize both shapes to a single payload object.\n\t */\n\tprivate unwrapResponse<T = any>(response: AxiosResponse<T> | T): T {\n\t\tif (response && typeof response === \"object\" && \"data\" in (response as any)) {\n\t\t\treturn (response as AxiosResponse<T>).data;\n\t\t}\n\t\treturn response as T;\n\t}\n\n\t/**\n\t * Handle API errors\n\t */\n\tpublic handleError(error: any): ErrorResponse {\n\t\tif (error.response) {\n\t\t\tconst { status, data } = error.response;\n\n\t\t\tif (data && typeof data === \"object\") {\n\t\t\t\treturn {\n\t\t\t\t\terror: data.error || \"RequestError\",\n\t\t\t\t\tmessage: data.message || data.description || \"Something went wrong\",\n\t\t\t\t\tstatusCode: status,\n\t\t\t\t\tcode: data.code,\n\t\t\t\t\tsuccess: false,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\terror: \"RequestError\",\n\t\t\t\tmessage: `Request failed with status ${status}`,\n\t\t\t\tstatusCode: status,\n\t\t\t\tsuccess: false,\n\t\t\t};\n\t\t}\n\n\t\tif (error.message === \"Network Error\") {\n\t\t\treturn {\n\t\t\t\terror: \"NetworkError\",\n\t\t\t\tmessage: \"Network connection failed\",\n\t\t\t\tstatusCode: 500,\n\t\t\t\tsuccess: false,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\terror: \"RequestError\",\n\t\t\tmessage: error.message || \"Unknown error occurred\",\n\t\t\tstatusCode: 500,\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\tpublic async ensureValidAccessToken(): Promise<string | null> {\n\t\tif (this._accessToken && !this.isTokenExpiredOrNearExpiry(this._accessToken)) {\n\t\t\treturn this._accessToken;\n\t\t}\n\t\tif (!this._refreshToken) {\n\t\t\treturn this._accessToken;\n\t\t}\n\t\tconst refreshed = await this.refreshAccessToken();\n\t\treturn refreshed ? this._accessToken : null;\n\t}\n\n\t/**\n\t * Build URL with project ID\n\t */\n\tpublic buildProjectUrl(path = \"\"): string {\n\t\tconst pid = this.config.projectId;\n\t\tif (!pid || pid === DEFAULT_PROJECT_ID) {\n\t\t\tthrow new Error(\"Project ID is required\");\n\t\t}\n\t\treturn `/project/${pid}${path}`;\n\t}\n\n\t/**\n\t * Build query string from options\n\t */\n\tpublic buildQueryString(options: Record<string, any>): string {\n\t\tconst params = new URLSearchParams();\n\n\t\tObject.entries(options).forEach(([key, value]) => {\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tif (typeof value === \"object\") {\n\t\t\t\t\tparams.append(key, JSON.stringify(value));\n\t\t\t\t} else {\n\t\t\t\t\tparams.append(key, String(value));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tconst queryString = params.toString();\n\t\treturn queryString ? `?${queryString}` : \"\";\n\t}\n}\n","import { BuildxConfig } from \"./types\";\nimport { Auth } from \"./services/Auth\";\nimport { Projects } from \"./services/Projects\";\nimport { Collections } from \"./services/Collections\";\nimport { Storage } from \"./services/Storage\";\nimport { Flows } from \"./services/Flows\";\nimport { Templates } from \"./services/Templates\";\nimport { Functions } from \"./services/Functions\";\nimport { BuildxObjects } from \"./services/BuildxObjects\";\nimport { ApiKeys } from \"./services/ApiKeys\";\nimport { Onboarding } from \"./services/Onboarding\";\nimport { Crypto } from \"./services/Crypto\";\nimport { BaseService } from \"./services/BaseService\";\n\n/**\n * Main Buildx SDK class\n * \n * @example\n * ```typescript\n * import { Buildx } from 'buildx-sdk';\n * \n * const buildx = new Buildx({\n * apiEndpoint: 'https://api.buildx.com',\n * apiKey: 'your-api-key',\n * projectId: 'your-project-id'\n * });\n * \n * // Use different services\n * const auth = buildx.auth();\n * const projects = buildx.projects();\n * const collections = buildx.collections();\n * ```\n */\nexport class Buildx {\n\tprivate config: BuildxConfig;\n\tprivate _auth: Auth;\n\tprivate _projects: Projects;\n\tprivate _collections: Collections;\n\tprivate _storage: Storage;\n\tprivate _flows: Flows;\n\tprivate _templates: Templates;\n\tprivate _functions: Functions;\n\tprivate _buildxObjects: BuildxObjects;\n\tprivate _apiKeys: ApiKeys;\n\tprivate _onboarding: Onboarding;\n\tprivate _crypto: Crypto;\n\n\tprivate _baseService: BaseService;\n\n\tconstructor(config: BuildxConfig) {\n\t\tthis.config = {\n\t\t\tapiEndpoint: config.apiEndpoint.replace(/\\/$/, \"\"), // Remove trailing slash\n\t\t\tapiKey: config.apiKey,\n\t\t\tprojectId: config.projectId,\n\t\t\tonTokenChange: config.onTokenChange,\n\t\t};\n\n\t\tthis._baseService = BaseService.getInstance(\n\t\t\tthis.config.apiKey,\n\t\t\tthis.config.projectId,\n\t\t\tthis.config.apiEndpoint\n\t\t);\n\t\tthis._baseService.updateConfig(this.config);\n\n\t\t// Initialize services\n\t\tthis._auth = new Auth(this._baseService);\n\t\tthis._projects = new Projects(this._baseService);\n\t\tthis._collections = new Collections(this._baseService);\n\t\tthis._storage = new Storage(this._baseService);\n\t\tthis._flows = new Flows(this._baseService);\n\t\tthis._templates = new Templates(this._baseService);\n\t\tthis._functions = new Functions(this._baseService);\n\t\tthis._buildxObjects = new BuildxObjects(this._baseService);\n\t\tthis._apiKeys = new ApiKeys(this._baseService);\n\t\tthis._onboarding = new Onboarding(this._baseService);\n\t\tthis._crypto = new Crypto(this._baseService);\n\t}\n\n\t/**\n\t * Get the current configuration\n\t */\n\tgetConfig(): BuildxConfig {\n\t\treturn { ...this.config };\n\t}\n\n\t/**\n\t * Update the configuration\n\t */\n\tupdateConfig(config: Partial<BuildxConfig>): void {\n\t\tthis.config = { ...this.config, ...config };\n\t\tthis._baseService.updateConfig(this.config);\n\t}\n\n\t/**\n\t * Authentication service\n\t * Handles user authentication, login, signup, and user management\n\t */\n\tauth(): Auth {\n\t\treturn this._auth;\n\t}\n\n\t/**\n\t * Projects service\n\t * Manages projects, including CRUD operations\n\t */\n\tprojects(): Projects {\n\t\treturn this._projects;\n\t}\n\n\t/**\n\t * Collections service\n\t * Manages data collections, documents, and queries\n\t */\n\tcollections(): Collections {\n\t\treturn this._collections;\n\t}\n\n\t/**\n\t * Storage service\n\t * Handles file upload, download, and management\n\t */\n\tstorage(): Storage {\n\t\treturn this._storage;\n\t}\n\n\t/**\n\t * Flows service\n\t * Manages workflow execution and flow types\n\t */\n\tflows(): Flows {\n\t\treturn this._flows;\n\t}\n\n\t/**\n\t * Templates service\n\t * Handles template rendering and preview\n\t */\n\ttemplates(): Templates {\n\t\treturn this._templates;\n\t}\n\n\t/**\n\t * Functions service\n\t * Manages serverless functions\n\t */\n\tfunctions(): Functions {\n\t\treturn this._functions;\n\t}\n\n\t/**\n\t * Buildx Objects service\n\t * Manages Buildx-specific objects (users, roles, etc.)\n\t */\n\tbuildxObjects(): BuildxObjects {\n\t\treturn this._buildxObjects;\n\t}\n\n\t/**\n\t * API Keys service\n\t * Manages API key operations\n\t */\n\tapiKeys(): ApiKeys {\n\t\treturn this._apiKeys;\n\t}\n\n\t/**\n\t * Public onboarding service\n\t * Handles pre-project onboarding flow (OTP -> complete -> bootstrap access)\n\t */\n\tonboarding(): Onboarding {\n\t\treturn this._onboarding;\n\t}\n\n\t/**\n\t * Crypto service\n\t * Handles project-scoped cryptographic utilities (for example TSA hashing)\n\t */\n\tcrypto(): Crypto {\n\t\treturn this._crypto;\n\t}\n}\n\n// Export the main class as default\nexport default Buildx;\n"],"names":["Auth","constructor","baseService","this","resolveAuthProjectScope","projectId","String","config","trim","setAccessToken","token","getAccessToken","setRefreshToken","getRefreshToken","setClientId","clientId","getClientId","setClientProof","clientProof","getClientProof","clearTokens","isAuthenticated","storeTokens","response","accessToken","access_token","refreshToken","refresh_token","isErrorResponse","success","hasProjectScope","getAuthClientContext","payload","client_id","client_proof","getAuthClientHeaders","headers","buildAuthUrl","path","options","suffix","startsWith","requireProjectScope","Error","login","credentials","url","post","loginWithGoogle","signup","requestEotp","request","requestEotpAuth","requestOtpLogin","verifyEotp","verify","verifyEotpAuth","verifyOtpLogin","requestPublicOnboardingOtp","verifyPublicOnboardingOtp","completePublicOnboarding","idempotencyKey","data","getPublicOnboardingRequest","requestId","get","encodeURIComponent","getCurrentUser","verifyDeviceTrustOtp","updatePassword","password","changePassword","newPassword","new_password","currentPassword","current_password","adminUpdatePassword","userId","user_id","requestPasswordReset","resetPassword","updatePushToken","projectScope","listUsers","lookupUsers","getUser","deleteUser","Projects","list","create","projectData","update","patch","updateMetadata","validateLocale","deleteById","delete","backup","axiosInstance","responseType","getHeaders","window","URL","createObjectURL","link","document","createElement","href","setAttribute","body","appendChild","click","removeChild","revokeObjectURL","message","restore","file","formData","FormData","append","CollectionWsClient","collectionId","wsFactory","socket","connectPromise","requestCounter","pending","Map","query","action","timeoutMs","ensureConnected","id","Date","now","resultPromise","Promise","resolve","reject","timeout","setTimeout","set","send","JSON","stringify","close","_error","entry","entries","clearTimeout","clear","isSocketOpen","GlobalWebSocket","globalThis","WebSocket","ensureValidAccessToken","then","buildSocketUrl","settled","onOpen","onError","error","onClose","onMessage","event","parse","ok","result","addEventListener","onopen","onerror","onclose","onmessage","catch","finally","openState","OPEN","readyState","wsEndpoint","apiEndpoint","replace","buildProjectUrl","params","URLSearchParams","apiKey","qs","toString","Collections","collectionWsClient","collectionWsCollectionId","collectionWsDisabledUntil","withStats","withBuildx","queryParams","with_stats","queryString","buildQueryString","fullUrl","collections","Array","isArray","filter","collection","collection_id","getSchema","depth","collectionData","deleteCollection","noPopulate","relations","length","buildQueryParams","preferWs","paginationTransport","hydrateRelations","relationSelect","queryRaw","normalizedOptions","queryRawViaWs","console","warn","resetCollectionWsClient","queryWithPagination","transport","queryWithPaginationViaWs","queryWithPaginationViaHttp","hydratedRows","meta","client","getOrCreateCollectionWsClient","subscribeRealtime","handlers","factory","reconnectEnabled","reconnect","reconnectDelayMs","hasConnected","isClosed","reconnectTimer","disconnectHandled","connect","emitConnected","onConnected","stopReconnectTimer","async","handleDisconnect","rawEvent","raw","parsed","text","type","timestamp","onEvent","emitEvent","code","reason","closeError","nextSocket","lookup","jsonFilter","projection","map","row","value","_id","label","_display","title","name","username","description","searchQuery","q","quick_filter_fields","select","join","sort","limit","skip","rows","enhancedRows","defaultSelect","groupedByCollection","reduce","acc","relation","push","relationCache","refCollectionId","configs","Object","ids","Set","field","item","extractReferenceId","add","missingIds","from","has","chunkSize","RELATION_QUERY_CHUNK_SIZE","i","idChunk","slice","relatedDocs","$in","doc","normalized","undefined","getDocument","documentId","populate","createDocument","updateDocument","updateDocumentWithOptions","baseUrl","updateOnly","getDocumentRevisions","deleteDocument","deleteByFilter","import","mapping","getDataTypes","validate","migrate","Storage","upload","prefix","uploadToCollection","getSize","getPrivateAccessUrl","Flows","getTypes","run","flowId","sessionId","state","args","session_id","getGptFlowSuggestions","instruction","getGptCollectionSuggestions","getGptLifecycleSuggestions","Templates","preview","template","render","templateId","renderPDF","blobUrl","Functions","getByName","functionName","getLogs","invoke","revision","alias","listRevisions","publishRevision","setAlias","put","BuildxObjects","getCollection","forEach","deleteObject","ApiKeys","apiKeyId","getSecret","Onboarding","checkProjectIdAvailability","product_key","project_id","requestOtp","verifyOtp","complete","getRequest","Crypto","hashPayloadWithTsa","ERROR_CODES","UNAUTHORIZED","TOKEN_EXPIRED","AUTH_ERROR_CODES","extractErrorCode","toUpperCase","isTokenExpiredError","inner","toLowerCase","getMessageText","includes","DEFAULT_PROJECT_ID","instances","BaseService","normalizeProjectId","normalizeEndpoint","createInstanceKey","isInstanceConfigMatching","instance","endpoint","currentEndpoint","currentProjectId","currentApiKey","getInstance","normalizedProjectId","instanceKey","current","_accessToken","_refreshToken","_clientId","_clientProof","refreshPromise","axios","baseURL","interceptors","use","handleError","updateConfig","defaults","emitTokenChange","onTokenChange","decodeJwtPayload","split","padded","padEnd","Math","ceil","BufferCtor","Buffer","json","atob","isTokenExpiredOrNearExpiry","skewMs","exp","Number","useRefreshToken","getPublicHeaders","executeWithAutoRefresh","unwrapResponse","isErrorPayload","shouldAttemptRefresh","status","statusCode","getRefreshUrl","pid","refreshAccessToken","Authorization","nextAccessToken","nextRefreshToken","fn","first","key","Buildx","_baseService","_auth","_projects","_collections","_storage","_flows","_templates","_functions","_buildxObjects","_apiKeys","_onboarding","_crypto","getConfig","auth","projects","storage","flows","templates","functions","buildxObjects","apiKeys","onboarding","crypto"],"mappings":"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"}
|