@hexclave/shared 1.0.30 → 1.0.32

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.
Files changed (41) hide show
  1. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  2. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +11 -37
  3. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  4. package/dist/config/schema.d.ts +1 -1
  5. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  6. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +11 -37
  7. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  8. package/dist/esm/config/schema.d.ts +1 -1
  9. package/dist/esm/interface/admin-metrics.d.ts +3 -3
  10. package/dist/esm/interface/conversations.d.ts +31 -31
  11. package/dist/esm/interface/crud/current-user.d.ts +6 -6
  12. package/dist/esm/interface/crud/email-outbox.d.ts +86 -86
  13. package/dist/esm/interface/crud/products.d.ts +4 -4
  14. package/dist/esm/interface/crud/project-api-keys.d.ts +4 -4
  15. package/dist/esm/interface/crud/team-member-profiles.d.ts +16 -16
  16. package/dist/esm/interface/crud/transactions.d.ts +2 -2
  17. package/dist/esm/interface/crud/users.d.ts +6 -6
  18. package/dist/esm/interface/server-interface.d.ts +1 -0
  19. package/dist/esm/interface/server-interface.d.ts.map +1 -1
  20. package/dist/esm/interface/server-interface.js +1 -0
  21. package/dist/esm/interface/server-interface.js.map +1 -1
  22. package/dist/esm/schema-fields.d.ts +1 -1
  23. package/dist/esm/sessions.d.ts +1 -1
  24. package/dist/interface/admin-metrics.d.ts +3 -3
  25. package/dist/interface/conversations.d.ts +31 -31
  26. package/dist/interface/crud/current-user.d.ts +6 -6
  27. package/dist/interface/crud/email-outbox.d.ts +86 -86
  28. package/dist/interface/crud/products.d.ts +4 -4
  29. package/dist/interface/crud/project-api-keys.d.ts +4 -4
  30. package/dist/interface/crud/team-member-profiles.d.ts +16 -16
  31. package/dist/interface/crud/transactions.d.ts +2 -2
  32. package/dist/interface/crud/users.d.ts +6 -6
  33. package/dist/interface/server-interface.d.ts +1 -0
  34. package/dist/interface/server-interface.d.ts.map +1 -1
  35. package/dist/interface/server-interface.js +1 -0
  36. package/dist/interface/server-interface.js.map +1 -1
  37. package/dist/schema-fields.d.ts +1 -1
  38. package/dist/sessions.d.ts +1 -1
  39. package/package.json +1 -1
  40. package/src/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.ts +11 -37
  41. package/src/interface/server-interface.ts +4 -0
@@ -163,21 +163,21 @@ declare const usersCrudServerReadSchema: yup$1.ObjectSchema<{
163
163
  }, "">;
164
164
  declare const usersCrudServerCreateSchema: yup$1.ObjectSchema<{
165
165
  primary_email: string | null | undefined;
166
- is_anonymous: boolean | undefined;
167
166
  display_name: string | null | undefined;
168
167
  client_metadata: {} | null | undefined;
169
168
  client_read_only_metadata: {} | null | undefined;
170
169
  server_metadata: {} | null | undefined;
170
+ is_anonymous: boolean | undefined;
171
171
  password: string | null | undefined;
172
+ country_code: string | null | undefined;
173
+ profile_image_url: string | null | undefined;
172
174
  primary_email_verified: boolean | undefined;
173
175
  primary_email_auth_enabled: boolean | undefined;
174
- profile_image_url: string | null | undefined;
175
176
  otp_auth_enabled: boolean | undefined;
176
177
  passkey_auth_enabled: boolean | undefined;
177
178
  restricted_by_admin: boolean | undefined;
178
179
  restricted_by_admin_reason: string | null | undefined;
179
180
  restricted_by_admin_private_details: string | null | undefined;
180
- country_code: string | null | undefined;
181
181
  risk_scores: {
182
182
  sign_up: {
183
183
  bot: number;
@@ -369,21 +369,21 @@ declare const usersCrud: CrudSchemaFromOptions<{
369
369
  }, "">;
370
370
  serverCreateSchema: yup$1.ObjectSchema<{
371
371
  primary_email: string | null | undefined;
372
- is_anonymous: boolean | undefined;
373
372
  display_name: string | null | undefined;
374
373
  client_metadata: {} | null | undefined;
375
374
  client_read_only_metadata: {} | null | undefined;
376
375
  server_metadata: {} | null | undefined;
376
+ is_anonymous: boolean | undefined;
377
377
  password: string | null | undefined;
378
+ country_code: string | null | undefined;
379
+ profile_image_url: string | null | undefined;
378
380
  primary_email_verified: boolean | undefined;
379
381
  primary_email_auth_enabled: boolean | undefined;
380
- profile_image_url: string | null | undefined;
381
382
  otp_auth_enabled: boolean | undefined;
382
383
  passkey_auth_enabled: boolean | undefined;
383
384
  restricted_by_admin: boolean | undefined;
384
385
  restricted_by_admin_reason: string | null | undefined;
385
386
  restricted_by_admin_private_details: string | null | undefined;
386
- country_code: string | null | undefined;
387
387
  risk_scores: {
388
388
  sign_up: {
389
389
  bot: number;
@@ -92,6 +92,7 @@ declare class HexclaveServerInterface extends HexclaveClientInterface {
92
92
  orderBy?: 'signedUpAt' | 'lastActiveAt';
93
93
  desc?: boolean;
94
94
  query?: string;
95
+ excludedEmailDomains?: string[];
95
96
  includeRestricted?: boolean;
96
97
  teamId?: string;
97
98
  } & ({
@@ -1 +1 @@
1
- {"version":3,"file":"server-interface.d.ts","names":[],"sources":["../../src/interface/server-interface.ts"],"mappings":"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"}
1
+ {"version":3,"file":"server-interface.d.ts","names":[],"sources":["../../src/interface/server-interface.ts"],"mappings":"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"}
@@ -106,6 +106,7 @@ var HexclaveServerInterface = class extends __client_interface_js.HexclaveClient
106
106
  lastActiveAt: "last_active_at"
107
107
  }[options.orderBy] } : {},
108
108
  ...options.query ? { query: options.query } : {},
109
+ ...options.excludedEmailDomains && options.excludedEmailDomains.length > 0 ? { excluded_email_domains: options.excludedEmailDomains.join(",") } : {},
109
110
  ...options.includeRestricted ? { include_restricted: "true" } : {},
110
111
  ...options.includeAnonymous ? { include_anonymous: "true" } : {},
111
112
  ...options.onlyAnonymous ? { only_anonymous: "true" } : {}
@@ -1 +1 @@
1
- {"version":3,"file":"server-interface.js","names":["HexclaveClientInterface","Result","KnownErrors","HexclaveAssertionError","InternalSession"],"sources":["../../src/interface/server-interface.ts"],"sourcesContent":["import * as yup from \"yup\";\nimport { decryptValue, encryptValue, hashKey } from \"../helpers/vault/client-side\";\nimport { KnownErrors } from \"../known-errors\";\nimport { inlineProductSchema } from \"../schema-fields\";\nimport { AccessToken, InternalSession, RefreshToken } from \"../sessions\";\nimport { HexclaveAssertionError } from \"../utils/errors\";\nimport { filterUndefined } from \"../utils/objects\";\nimport { Result } from \"../utils/results\";\nimport { urlString } from \"../utils/urls\";\nimport {\n ClientInterfaceOptions,\n HexclaveClientInterface\n} from \"./client-interface\";\nimport { ConnectedAccountAccessTokenCrud, ConnectedAccountCrud } from \"./crud/connected-accounts\";\nimport { ContactChannelsCrud } from \"./crud/contact-channels\";\nimport { CurrentUserCrud } from \"./crud/current-user\";\nimport { ItemCrud } from \"./crud/items\";\nimport { NotificationPreferenceCrud } from \"./crud/notification-preferences\";\nimport { OAuthProviderCrud } from \"./crud/oauth-providers\";\nimport { ProjectPermissionsCrud } from \"./crud/project-permissions\";\nimport { SessionsCrud } from \"./crud/sessions\";\nimport { TeamInvitationCrud } from \"./crud/team-invitation\";\nimport { TeamMemberProfilesCrud } from \"./crud/team-member-profiles\";\nimport { TeamMembershipsCrud } from \"./crud/team-memberships\";\nimport { TeamPermissionsCrud } from \"./crud/team-permissions\";\nimport { TeamsCrud } from \"./crud/teams\";\nimport { UsersCrud } from \"./crud/users\";\n\nexport type ServerAuthApplicationOptions = (\n & ClientInterfaceOptions\n & (\n | {\n readonly secretServerKey: string,\n }\n | {\n readonly projectOwnerSession: InternalSession | (() => Promise<string | null>),\n }\n )\n);\n\nexport class HexclaveServerInterface extends HexclaveClientInterface {\n constructor(public override options: ServerAuthApplicationOptions) {\n super(options);\n }\n\n protected async sendServerRequest(path: string, options: RequestInit, session: InternalSession | null, requestType: \"server\" | \"admin\" = \"server\") {\n return await this.sendClientRequest(\n path,\n {\n ...options,\n headers: {\n // Hexclave rebrand: emit x-hexclave-* request header; the backend proxy dual-accepts both names.\n \"x-hexclave-secret-server-key\": \"secretServerKey\" in this.options ? this.options.secretServerKey : \"\",\n ...options.headers,\n },\n },\n session,\n requestType,\n );\n }\n\n override async getCustomerBilling(\n customerType: \"user\" | \"team\",\n customerId: string,\n session: InternalSession | null,\n ): Promise<{\n has_customer: boolean,\n default_payment_method: {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n } | null,\n }> {\n const response = await this.sendServerRequest(\n urlString`/payments/billing/${customerType}/${customerId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n override async createCustomerPaymentMethodSetupIntent(\n customerType: \"user\" | \"team\",\n customerId: string,\n session: InternalSession | null,\n ): Promise<{\n client_secret: string,\n stripe_account_id: string,\n }> {\n const response = await this.sendServerRequest(\n urlString`/payments/payment-method/${customerType}/${customerId}/setup-intent`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n session,\n );\n return await response.json();\n }\n\n override async setDefaultCustomerPaymentMethodFromSetupIntent(\n customerType: \"user\" | \"team\",\n customerId: string,\n setupIntentId: string,\n session: InternalSession | null,\n ): Promise<{\n default_payment_method: {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n },\n }> {\n const response = await this.sendServerRequest(\n urlString`/payments/payment-method/${customerType}/${customerId}/set-default`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n setup_intent_id: setupIntentId,\n }),\n },\n session,\n );\n return await response.json();\n }\n\n\n protected async sendServerRequestAndCatchKnownError<E extends typeof KnownErrors[keyof KnownErrors]>(\n path: string,\n requestOptions: RequestInit,\n tokenStoreOrNull: InternalSession | null,\n errorsToCatch: readonly E[],\n ): Promise<Result<\n Response & {\n usedTokens: {\n accessToken: AccessToken,\n refreshToken: RefreshToken | null,\n } | null,\n },\n InstanceType<E>\n >> {\n try {\n return Result.ok(await this.sendServerRequest(path, requestOptions, tokenStoreOrNull));\n } catch (e) {\n for (const errorType of errorsToCatch) {\n if (errorType.isInstance(e)) {\n return Result.error(e as InstanceType<E>);\n }\n }\n throw e;\n }\n }\n\n async createServerUser(data: UsersCrud['Server']['Create']): Promise<UsersCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n \"/users\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async getServerUserByToken(session: InternalSession): Promise<CurrentUserCrud['Server']['Read'] | null> {\n const responseOrError = await this.sendServerRequestAndCatchKnownError(\n \"/users/me\",\n {},\n session,\n [KnownErrors.CannotGetOwnUserWithoutUser],\n );\n if (responseOrError.status === \"error\") {\n if (KnownErrors.CannotGetOwnUserWithoutUser.isInstance(responseOrError.error)) {\n return null;\n } else {\n throw new HexclaveAssertionError(\"Unexpected uncaught error\", { cause: responseOrError.error });\n }\n }\n const response = responseOrError.data;\n const user: CurrentUserCrud['Server']['Read'] = await response.json();\n if (!(user as any)) throw new HexclaveAssertionError(\"User endpoint returned null; this should never happen\");\n return user;\n }\n\n async getServerUserById(userId: string): Promise<Result<UsersCrud['Server']['Read']>> {\n const responseOrError = await this.sendServerRequestAndCatchKnownError(\n urlString`/users/${userId}`,\n {},\n null,\n [KnownErrors.UserNotFound],\n );\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n const user: UsersCrud['Server']['Read'] = await responseOrError.data.json();\n return Result.ok(user);\n }\n\n async listServerTeamInvitations(options: {\n teamId: string,\n }): Promise<TeamInvitationCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n urlString`/team-invitations?team_id=${options.teamId}`,\n {},\n null,\n );\n const result = await response.json() as TeamInvitationCrud['Server']['List'];\n return result.items;\n }\n\n async revokeServerTeamInvitation(invitationId: string, teamId: string) {\n await this.sendServerRequest(\n urlString`/team-invitations/${invitationId}?team_id=${teamId}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n async listServerTeamMemberProfiles(\n options: {\n teamId: string,\n },\n ): Promise<TeamMemberProfilesCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n urlString`/team-member-profiles?team_id=${options.teamId}`,\n {},\n null,\n );\n const result = await response.json() as TeamMemberProfilesCrud['Server']['List'];\n return result.items;\n }\n\n async getServerTeamMemberProfile(\n options: {\n teamId: string,\n userId: string,\n },\n ): Promise<TeamMemberProfilesCrud['Client']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/team-member-profiles/${options.teamId}/${options.userId}`,\n {},\n null,\n );\n return await response.json();\n }\n\n async listServerTeamPermissions(\n options: {\n userId?: string,\n teamId?: string,\n recursive: boolean,\n },\n session: InternalSession | null,\n ): Promise<TeamPermissionsCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n `/team-permissions?${new URLSearchParams(filterUndefined({\n user_id: options.userId,\n team_id: options.teamId,\n recursive: options.recursive.toString(),\n }))}`,\n {},\n session,\n );\n const result = await response.json() as TeamPermissionsCrud['Server']['List'];\n return result.items;\n }\n\n async listServerProjectPermissions(\n options: {\n userId?: string,\n recursive: boolean,\n },\n session: InternalSession | null,\n ): Promise<ProjectPermissionsCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n `/project-permissions?${new URLSearchParams(filterUndefined({\n user_id: options.userId,\n recursive: options.recursive.toString(),\n }))}`,\n {},\n session,\n );\n const result = await response.json() as ProjectPermissionsCrud['Server']['List'];\n return result.items;\n }\n\n async listServerUsers(options: (\n & {\n cursor?: string,\n limit?: number,\n orderBy?: 'signedUpAt' | 'lastActiveAt',\n desc?: boolean,\n query?: string,\n includeRestricted?: boolean,\n teamId?: string,\n }\n & (\n {\n includeAnonymous?: boolean,\n onlyAnonymous?: false,\n }\n | {\n includeAnonymous: true,\n onlyAnonymous: true,\n }\n )\n )): Promise<UsersCrud['Server']['List']> {\n const searchParams = new URLSearchParams(filterUndefined({\n cursor: options.cursor,\n limit: options.limit?.toString(),\n desc: options.desc?.toString(),\n team_id: options.teamId,\n ...options.orderBy ? {\n order_by: {\n signedUpAt: \"signed_up_at\",\n lastActiveAt: \"last_active_at\",\n }[options.orderBy],\n } : {},\n ...options.query ? {\n query: options.query,\n } : {},\n ...options.includeRestricted ? {\n include_restricted: 'true',\n } : {},\n ...options.includeAnonymous ? {\n include_anonymous: 'true',\n } : {},\n ...options.onlyAnonymous ? {\n only_anonymous: 'true',\n } : {},\n }));\n const response = await this.sendServerRequest(\"/users?\" + searchParams.toString(), {}, null);\n return await response.json();\n }\n\n async listServerTeams(options?: {\n userId?: string,\n }): Promise<TeamsCrud['Server']['Read'][]> {\n const result = await this.listServerTeamsPaginated(options);\n return result.items;\n }\n\n async listServerTeamsPaginated(options?: {\n userId?: string,\n orderBy?: 'createdAt',\n desc?: boolean,\n cursor?: string,\n limit?: number,\n query?: string,\n }): Promise<TeamsCrud['Server']['List']> {\n const response = await this.sendServerRequest(\n `/teams?${new URLSearchParams(filterUndefined({\n user_id: options?.userId,\n // SDK option uses camelCase `createdAt`; backend uses snake_case.\n order_by: options?.orderBy === 'createdAt' ? 'created_at' : options?.orderBy,\n desc: options?.desc !== undefined ? String(options.desc) : undefined,\n cursor: options?.cursor,\n limit: options?.limit?.toString(),\n query: options?.query,\n }))}`,\n {},\n null\n );\n return await response.json() as TeamsCrud['Server']['List'];\n }\n\n async getServerTeam(teamId: string): Promise<TeamsCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n `/teams/${teamId}`,\n {},\n null\n );\n return await response.json();\n }\n\n async listServerTeamUsers(teamId: string): Promise<UsersCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(`/users?team_id=${teamId}`, {}, null);\n const result = await response.json() as UsersCrud['Server']['List'];\n return result.items;\n }\n\n /* when passing a session, the user will be added to the team */\n async createServerTeam(data: TeamsCrud['Server']['Create']): Promise<TeamsCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n \"/teams\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null\n );\n return await response.json();\n }\n\n async updateServerTeam(teamId: string, data: TeamsCrud['Server']['Update']): Promise<TeamsCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/teams/${teamId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteServerTeam(teamId: string): Promise<void> {\n await this.sendServerRequest(\n urlString`/teams/${teamId}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n async addServerUserToTeam(options: {\n userId: string,\n teamId: string,\n }): Promise<TeamMembershipsCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/team-memberships/${options.teamId}/${options.userId}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n return await response.json();\n }\n\n async removeServerUserFromTeam(options: {\n userId: string,\n teamId: string,\n }) {\n await this.sendServerRequest(\n urlString`/team-memberships/${options.teamId}/${options.userId}`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async listServerUserTeamInvitations(userId: string): Promise<TeamInvitationCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n \"/team-invitations?\" + new URLSearchParams({ user_id: userId }),\n {},\n null,\n );\n const result = await response.json() as TeamInvitationCrud['Server']['List'];\n return result.items;\n }\n\n async acceptServerTeamInvitationById(\n invitationId: string,\n userId: string,\n ) {\n await this.sendServerRequest(\n urlString`/team-invitations/${invitationId}/accept` + \"?\" + new URLSearchParams({ user_id: userId }),\n { method: \"POST\" },\n null,\n );\n }\n\n async updateServerUser(userId: string, update: UsersCrud['Server']['Update']): Promise<UsersCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/users/${userId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(update),\n },\n null,\n );\n return await response.json();\n }\n\n async createServerProviderAccessToken(\n userId: string,\n provider: string,\n scope: string,\n ): Promise<ConnectedAccountAccessTokenCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/connected-accounts/${userId}/${provider}/access-token`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ scope }),\n },\n null,\n );\n return await response.json();\n }\n\n /**\n * Get access token for a specific connected account by provider ID and provider account ID.\n * This is the preferred method when dealing with multiple accounts of the same provider.\n */\n async createServerProviderAccessTokenByAccount(\n userId: string,\n providerId: string,\n providerAccountId: string,\n scope: string,\n ): Promise<ConnectedAccountAccessTokenCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/connected-accounts/${userId}/${providerId}/${providerAccountId}/access-token`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ scope }),\n },\n null,\n );\n return await response.json();\n }\n\n /**\n * List all connected accounts for a user.\n */\n async listServerConnectedAccounts(\n userId: string,\n ): Promise<ConnectedAccountCrud['Server']['List']> {\n const response = await this.sendServerRequest(\n urlString`/connected-accounts/${userId}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async createServerUserSession(userId: string, expiresInMillis: number, isImpersonation: boolean): Promise<{ accessToken: string, refreshToken: string }> {\n const response = await this.sendServerRequest(\n \"/auth/sessions\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n user_id: userId,\n expires_in_millis: expiresInMillis,\n is_impersonation: isImpersonation,\n }),\n },\n null,\n );\n const result = await response.json();\n return {\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n };\n }\n\n async leaveServerTeam(\n options: {\n teamId: string,\n userId: string,\n },\n ) {\n await this.sendClientRequest(\n urlString`/team-memberships/${options.teamId}/${options.userId}`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async updateServerTeamMemberProfile(options: {\n teamId: string,\n userId: string,\n profile: TeamMemberProfilesCrud['Server']['Update'],\n }) {\n await this.sendServerRequest(\n urlString`/team-member-profiles/${options.teamId}/${options.userId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options.profile),\n },\n null,\n );\n }\n\n async grantServerTeamUserPermission(teamId: string, userId: string, permissionId: string) {\n await this.sendServerRequest(\n urlString`/team-permissions/${teamId}/${userId}/${permissionId}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async grantServerProjectPermission(userId: string, permissionId: string) {\n await this.sendServerRequest(\n urlString`/project-permissions/${userId}/${permissionId}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async revokeServerTeamUserPermission(teamId: string, userId: string, permissionId: string) {\n await this.sendServerRequest(\n urlString`/team-permissions/${teamId}/${userId}/${permissionId}`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async revokeServerProjectPermission(userId: string, permissionId: string) {\n await this.sendServerRequest(\n urlString`/project-permissions/${userId}/${permissionId}`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async deleteServerUser(userId: string) {\n await this.sendServerRequest(\n urlString`/users/${userId}`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async createServerContactChannel(\n data: ContactChannelsCrud['Server']['Create'],\n ): Promise<ContactChannelsCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n \"/contact-channels\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async updateServerContactChannel(\n userId: string,\n contactChannelId: string,\n data: ContactChannelsCrud['Server']['Update'],\n ): Promise<ContactChannelsCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/contact-channels/${userId}/${contactChannelId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteServerContactChannel(\n userId: string,\n contactChannelId: string,\n ): Promise<void> {\n await this.sendServerRequest(\n urlString`/contact-channels/${userId}/${contactChannelId}`,\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n async listServerContactChannels(\n userId: string,\n ): Promise<ContactChannelsCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n urlString`/contact-channels?user_id=${userId}`,\n {\n method: \"GET\",\n },\n null,\n );\n const json = await response.json() as ContactChannelsCrud['Server']['List'];\n return json.items;\n }\n\n async listServerNotificationCategories(\n userId: string,\n ): Promise<NotificationPreferenceCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n urlString`/emails/notification-preference/${userId}`,\n {\n method: \"GET\",\n },\n null,\n );\n const json = await response.json() as NotificationPreferenceCrud['Server']['List'];\n return json.items;\n }\n\n async setServerNotificationsEnabled(\n userId: string,\n notificationCategoryId: string,\n enabled: boolean,\n ): Promise<void> {\n await this.sendServerRequest(\n urlString`/emails/notification-preference/${userId}/${notificationCategoryId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n enabled,\n }),\n },\n null,\n );\n }\n\n async sendServerContactChannelVerificationEmail(\n userId: string,\n contactChannelId: string,\n callbackUrl: string,\n ): Promise<void> {\n await this.sendServerRequest(\n urlString`/contact-channels/${userId}/${contactChannelId}/send-verification-code`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ callback_url: callbackUrl }),\n },\n null,\n );\n }\n\n\n async listServerSessions(userId: string): Promise<SessionsCrud['Server']['List']> {\n const response = await this.sendServerRequest(\n urlString`/auth/sessions?user_id=${userId}`,\n {\n method: \"GET\",\n },\n null,\n );\n return await response.json();\n }\n\n async deleteServerSession(sessionId: string) {\n await this.sendServerRequest(\n urlString`/auth/sessions/${sessionId}`,\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n\n async sendServerTeamInvitation(options: {\n email: string,\n teamId: string,\n callbackUrl: string,\n }): Promise<void> {\n await this.sendServerRequest(\n \"/team-invitations/send-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email: options.email,\n team_id: options.teamId,\n callback_url: options.callbackUrl,\n }),\n },\n null,\n );\n }\n\n async updatePassword(\n options: { oldPassword: string, newPassword: string },\n ): Promise<KnownErrors[\"PasswordConfirmationMismatch\"] | KnownErrors[\"PasswordRequirementsNotMet\"] | undefined> {\n const res = await this.sendServerRequestAndCatchKnownError(\n \"/auth/password/update\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n old_password: options.oldPassword,\n new_password: options.newPassword,\n }),\n },\n null,\n [KnownErrors.PasswordConfirmationMismatch, KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n // OAuth Providers CRUD operations\n async createServerOAuthProvider(\n data: OAuthProviderCrud['Server']['Create'],\n ): Promise<OAuthProviderCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n \"/oauth-providers\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n\n async listServerOAuthProviders(\n options: {\n user_id?: string,\n } = {},\n ): Promise<OAuthProviderCrud['Server']['Read'][]> {\n const queryParams = new URLSearchParams(filterUndefined(options));\n const response = await this.sendServerRequest(\n `/oauth-providers${queryParams.toString() ? `?${queryParams.toString()}` : ''}`,\n {\n method: \"GET\",\n },\n null,\n );\n const result = await response.json();\n return result.items;\n }\n\n async updateServerOAuthProvider(\n userId: string,\n providerId: string,\n data: OAuthProviderCrud['Server']['Update'],\n ): Promise<OAuthProviderCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/oauth-providers/${userId}/${providerId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteServerOAuthProvider(\n userId: string,\n providerId: string,\n ): Promise<void> {\n const response = await this.sendServerRequest(\n urlString`/oauth-providers/${userId}/${providerId}`,\n {\n method: \"DELETE\",\n },\n null,\n );\n return await response.json();\n }\n\n async sendEmail(options: {\n userIds?: string[],\n allUsers?: true,\n themeId?: string | null | false,\n html?: string,\n subject?: string,\n notificationCategoryName?: string,\n templateId?: string,\n variables?: Record<string, any>,\n draftId?: string,\n scheduledAt?: Date,\n }): Promise<Result<void, KnownErrors[\"RequiresCustomEmailServer\"] | KnownErrors[\"SchemaError\"] | KnownErrors[\"UserIdDoesNotExist\"]>> {\n const res = await this.sendServerRequest(\n \"/emails/send-email\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n user_ids: options.userIds,\n all_users: options.allUsers,\n theme_id: options.themeId,\n html: options.html,\n subject: options.subject,\n notification_category_name: options.notificationCategoryName,\n template_id: options.templateId,\n variables: options.variables,\n draft_id: options.draftId,\n scheduled_at_millis: options.scheduledAt?.getTime(),\n }),\n },\n null,\n );\n return Result.ok(undefined);\n }\n\n async getEmailDeliveryInfo(): Promise<{\n stats: {\n hour: { sent: number, bounced: number, marked_as_spam: number },\n day: { sent: number, bounced: number, marked_as_spam: number },\n week: { sent: number, bounced: number, marked_as_spam: number },\n month: { sent: number, bounced: number, marked_as_spam: number },\n },\n capacity: {\n rate_per_second: number,\n boost_multiplier: number,\n penalty_factor: number,\n is_boost_active: boolean,\n boost_expires_at: string | null,\n },\n }> {\n const res = await this.sendServerRequest(\n \"/emails/delivery-info\",\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n },\n null,\n );\n return await res.json();\n }\n\n async activateEmailCapacityBoost(): Promise<{ expires_at: string }> {\n const res = await this.sendServerRequest(\n \"/emails/capacity-boost\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({}),\n },\n null,\n );\n return await res.json();\n }\n\n async updateItemQuantity(\n options: (\n { itemId: string, userId: string } |\n { itemId: string, teamId: string } |\n { itemId: string, customCustomerId: string }\n ),\n data: ItemCrud['Server']['Update'],\n ): Promise<void> {\n let customerType: \"user\" | \"team\" | \"custom\";\n let customerId: string;\n const itemId: string = options.itemId;\n\n if (\"userId\" in options) {\n customerType = \"user\";\n customerId = options.userId;\n } else if (\"teamId\" in options) {\n customerType = \"team\";\n customerId = options.teamId;\n } else if (\"customCustomerId\" in options) {\n customerType = \"custom\";\n customerId = options.customCustomerId;\n } else {\n throw new HexclaveAssertionError(\"updateItemQuantity requires one of userId, teamId, or customCustomerId\");\n }\n\n const queryParams = new URLSearchParams({ allow_negative: (data.allow_negative ?? false).toString() });\n await this.sendServerRequest(\n `/payments/items/${customerType}/${customerId}/${itemId}/update-quantity?${queryParams.toString()}`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ delta: data.delta, expires_at: data.expires_at, description: data.description }),\n },\n null\n );\n }\n\n async grantProduct(\n options: {\n customerType: \"user\" | \"team\" | \"custom\",\n customerId: string,\n productId?: string,\n product?: yup.InferType<typeof inlineProductSchema>,\n quantity?: number,\n },\n ): Promise<void> {\n if (!options.productId && !options.product) {\n throw new HexclaveAssertionError(\"grantProduct requires either productId or product\");\n }\n if (options.productId && options.product) {\n throw new HexclaveAssertionError(\"grantProduct should not receive both productId and product\");\n }\n const body = filterUndefined({\n product_id: options.productId,\n product_inline: options.product,\n quantity: options.quantity,\n });\n await this.sendServerRequest(\n urlString`/payments/products/${options.customerType}/${options.customerId}`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n null,\n );\n }\n\n async getDataVaultStoreValue(secret: string, storeId: string, key: string) {\n const hashedKey = await hashKey(secret, key);\n const response = await this.sendServerRequestAndCatchKnownError(\n `/data-vault/stores/${storeId}/get`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ hashed_key: hashedKey }),\n },\n null,\n [KnownErrors.DataVaultStoreHashedKeyDoesNotExist] as const,\n );\n if (response.status === \"error\") {\n if (KnownErrors.DataVaultStoreHashedKeyDoesNotExist.isInstance(response.error)) {\n return null;\n } else {\n throw new HexclaveAssertionError(\"Unexpected uncaught error\", { cause: response.error });\n }\n }\n const json = await response.data.json();\n const encryptedValue = json.encrypted_value;\n if (typeof encryptedValue !== \"string\") throw new HexclaveAssertionError(\"encrypted_value is not a string\", { type: typeof encryptedValue });\n return await decryptValue(secret, key, encryptedValue);\n }\n\n async setDataVaultStoreValue(secret: string, storeId: string, key: string, value: string) {\n const hashedKey = await hashKey(secret, key);\n const encryptedValue = await encryptValue(secret, key, value);\n await this.sendServerRequest(\n `/data-vault/stores/${storeId}/set`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ hashed_key: hashedKey, encrypted_value: encryptedValue }),\n },\n null,\n );\n }\n\n async initiateServerPasskeyRegistration(userId: string): Promise<Result<{ options_json: any, code: string }, KnownErrors[]>> {\n // Create a temporary session for this user to use for passkey registration\n // TODO instead of creating a new session, this should just call the endpoint in a way in which it doesn't require a session\n // (currently this shows up on session history etc... not ideal)\n const { accessToken, refreshToken } = await this.createServerUserSession(userId, 60000 * 2, false); // 2 minute session\n const tempSession = new InternalSession({\n accessToken,\n refreshToken,\n refreshAccessTokenCallback: async () => null, // No refresh for temporary sessions\n });\n\n // Use the existing initiatePasskeyRegistration method with the temporary session\n return await this.initiatePasskeyRegistration({}, tempSession);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAwCA,IAAa,0BAAb,cAA6CA,8CAAwB;CACnE,YAAY,AAAgB,SAAuC;AACjE,QAAM,QAAQ;EADY;;CAI5B,MAAgB,kBAAkB,MAAc,SAAsB,SAAiC,cAAkC,UAAU;AACjJ,SAAO,MAAM,KAAK,kBAChB,MACA;GACE,GAAG;GACH,SAAS;IAEP,gCAAgC,qBAAqB,KAAK,UAAU,KAAK,QAAQ,kBAAkB;IACnG,GAAG,QAAQ;IACZ;GACF,EACD,SACA,YACD;;CAGH,MAAe,mBACb,cACA,YACA,SAUC;AAMD,SAAO,OALU,MAAM,KAAK,kBAC1B,0BAAS,qBAAqB,aAAa,GAAG,cAC9C,EAAE,EACF,QACD,EACqB,MAAM;;CAG9B,MAAe,uCACb,cACA,YACA,SAIC;AAYD,SAAO,OAXU,MAAM,KAAK,kBAC1B,0BAAS,4BAA4B,aAAa,GAAG,WAAW,gBAChE;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EAAE,CAAC;GACzB,EACD,QACD,EACqB,MAAM;;CAG9B,MAAe,+CACb,cACA,YACA,eACA,SASC;AAcD,SAAO,OAbU,MAAM,KAAK,kBAC1B,0BAAS,4BAA4B,aAAa,GAAG,WAAW,eAChE;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EACnB,iBAAiB,eAClB,CAAC;GACH,EACD,QACD,EACqB,MAAM;;CAI9B,MAAgB,oCACd,MACA,gBACA,kBACA,eASC;AACD,MAAI;AACF,UAAOC,2BAAO,GAAG,MAAM,KAAK,kBAAkB,MAAM,gBAAgB,iBAAiB,CAAC;WAC/E,GAAG;AACV,QAAK,MAAM,aAAa,cACtB,KAAI,UAAU,WAAW,EAAE,CACzB,QAAOA,2BAAO,MAAM,EAAqB;AAG7C,SAAM;;;CAIV,MAAM,iBAAiB,MAA2E;AAYhG,SAAO,OAXU,MAAM,KAAK,kBAC1B,UACA;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,KAAK;GAC3B,EACD,KACD,EACqB,MAAM;;CAG9B,MAAM,qBAAqB,SAA6E;EACtG,MAAM,kBAAkB,MAAM,KAAK,oCACjC,aACA,EAAE,EACF,SACA,CAACC,+BAAY,4BAA4B,CAC1C;AACD,MAAI,gBAAgB,WAAW,QAC7B,KAAIA,+BAAY,4BAA4B,WAAW,gBAAgB,MAAM,CAC3E,QAAO;MAEP,OAAM,IAAIC,0CAAuB,6BAA6B,EAAE,OAAO,gBAAgB,OAAO,CAAC;EAInG,MAAM,OAA0C,MAD/B,gBAAgB,KAC8B,MAAM;AACrE,MAAI,CAAE,KAAc,OAAM,IAAIA,0CAAuB,wDAAwD;AAC7G,SAAO;;CAGT,MAAM,kBAAkB,QAA8D;EACpF,MAAM,kBAAkB,MAAM,KAAK,oCACjC,0BAAS,UAAU,UACnB,EAAE,EACF,MACA,CAACD,+BAAY,aAAa,CAC3B;AACD,MAAI,gBAAgB,WAAW,QAC7B,QAAOD,2BAAO,MAAM,gBAAgB,MAAM;EAE5C,MAAM,OAAoC,MAAM,gBAAgB,KAAK,MAAM;AAC3E,SAAOA,2BAAO,GAAG,KAAK;;CAGxB,MAAM,0BAA0B,SAEoB;AAOlD,UADe,OALE,MAAM,KAAK,kBAC1B,0BAAS,6BAA6B,QAAQ,UAC9C,EAAE,EACF,KACD,EAC6B,MAAM,EACtB;;CAGhB,MAAM,2BAA2B,cAAsB,QAAgB;AACrE,QAAM,KAAK,kBACT,0BAAS,qBAAqB,aAAa,WAAW,UACtD,EAAE,QAAQ,UAAU,EACpB,KACD;;CAGH,MAAM,6BACJ,SAGqD;AAOrD,UADe,OALE,MAAM,KAAK,kBAC1B,0BAAS,iCAAiC,QAAQ,UAClD,EAAE,EACF,KACD,EAC6B,MAAM,EACtB;;CAGhB,MAAM,2BACJ,SAImD;AAMnD,SAAO,OALU,MAAM,KAAK,kBAC1B,0BAAS,yBAAyB,QAAQ,OAAO,GAAG,QAAQ,UAC5D,EAAE,EACF,KACD,EACqB,MAAM;;CAG9B,MAAM,0BACJ,SAKA,SACkD;AAWlD,UADe,OATE,MAAM,KAAK,kBAC1B,qBAAqB,IAAI,yDAAgC;GACvD,SAAS,QAAQ;GACjB,SAAS,QAAQ;GACjB,WAAW,QAAQ,UAAU,UAAU;GACxC,CAAC,CAAC,IACH,EAAE,EACF,QACD,EAC6B,MAAM,EACtB;;CAGhB,MAAM,6BACJ,SAIA,SACqD;AAUrD,UADe,OARE,MAAM,KAAK,kBAC1B,wBAAwB,IAAI,yDAAgC;GAC1D,SAAS,QAAQ;GACjB,WAAW,QAAQ,UAAU,UAAU;GACxC,CAAC,CAAC,IACH,EAAE,EACF,QACD,EAC6B,MAAM,EACtB;;CAGhB,MAAM,gBAAgB,SAoBmB;EACvC,MAAM,eAAe,IAAI,yDAAgC;GACvD,QAAQ,QAAQ;GAChB,OAAO,QAAQ,OAAO,UAAU;GAChC,MAAM,QAAQ,MAAM,UAAU;GAC9B,SAAS,QAAQ;GACjB,GAAG,QAAQ,UAAU,EACnB,UAAU;IACR,YAAY;IACZ,cAAc;IACf,CAAC,QAAQ,UACX,GAAG,EAAE;GACN,GAAG,QAAQ,QAAQ,EACjB,OAAO,QAAQ,OAChB,GAAG,EAAE;GACN,GAAG,QAAQ,oBAAoB,EAC7B,oBAAoB,QACrB,GAAG,EAAE;GACN,GAAG,QAAQ,mBAAmB,EAC5B,mBAAmB,QACpB,GAAG,EAAE;GACN,GAAG,QAAQ,gBAAgB,EACzB,gBAAgB,QACjB,GAAG,EAAE;GACP,CAAC,CAAC;AAEH,SAAO,OADU,MAAM,KAAK,kBAAkB,YAAY,aAAa,UAAU,EAAE,EAAE,EAAE,KAAK,EACtE,MAAM;;CAG9B,MAAM,gBAAgB,SAEqB;AAEzC,UADe,MAAM,KAAK,yBAAyB,QAAQ,EAC7C;;CAGhB,MAAM,yBAAyB,SAOU;AAcvC,SAAO,OAbU,MAAM,KAAK,kBAC1B,UAAU,IAAI,yDAAgC;GAC5C,SAAS,SAAS;GAElB,UAAU,SAAS,YAAY,cAAc,eAAe,SAAS;GACrE,MAAM,SAAS,SAAS,SAAY,OAAO,QAAQ,KAAK,GAAG;GAC3D,QAAQ,SAAS;GACjB,OAAO,SAAS,OAAO,UAAU;GACjC,OAAO,SAAS;GACjB,CAAC,CAAC,IACH,EAAE,EACF,KACD,EACqB,MAAM;;CAG9B,MAAM,cAAc,QAAsD;AAMxE,SAAO,OALU,MAAM,KAAK,kBAC1B,UAAU,UACV,EAAE,EACF,KACD,EACqB,MAAM;;CAG9B,MAAM,oBAAoB,QAAwD;AAGhF,UADe,OADE,MAAM,KAAK,kBAAkB,kBAAkB,UAAU,EAAE,EAAE,KAAK,EACrD,MAAM,EACtB;;CAIhB,MAAM,iBAAiB,MAA2E;AAYhG,SAAO,OAXU,MAAM,KAAK,kBAC1B,UACA;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,KAAK;GAC3B,EACD,KACD,EACqB,MAAM;;CAG9B,MAAM,iBAAiB,QAAgB,MAA2E;AAYhH,SAAO,OAXU,MAAM,KAAK,kBAC1B,0BAAS,UAAU,UACnB;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,KAAK;GAC3B,EACD,KACD,EACqB,MAAM;;CAG9B,MAAM,iBAAiB,QAA+B;AACpD,QAAM,KAAK,kBACT,0BAAS,UAAU,UACnB,EAAE,QAAQ,UAAU,EACpB,KACD;;CAGH,MAAM,oBAAoB,SAGyB;AAYjD,SAAO,OAXU,MAAM,KAAK,kBAC1B,0BAAS,qBAAqB,QAAQ,OAAO,GAAG,QAAQ,UACxD;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EAAE,CAAC;GACzB,EACD,KACD,EACqB,MAAM;;CAG9B,MAAM,yBAAyB,SAG5B;AACD,QAAM,KAAK,kBACT,0BAAS,qBAAqB,QAAQ,OAAO,GAAG,QAAQ,UACxD;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EAAE,CAAC;GACzB,EACD,KACD;;CAGH,MAAM,8BAA8B,QAAiE;AAOnG,UADe,OALE,MAAM,KAAK,kBAC1B,uBAAuB,IAAI,gBAAgB,EAAE,SAAS,QAAQ,CAAC,EAC/D,EAAE,EACF,KACD,EAC6B,MAAM,EACtB;;CAGhB,MAAM,+BACJ,cACA,QACA;AACA,QAAM,KAAK,kBACT,0BAAS,qBAAqB,aAAa,WAAW,MAAM,IAAI,gBAAgB,EAAE,SAAS,QAAQ,CAAC,EACpG,EAAE,QAAQ,QAAQ,EAClB,KACD;;CAGH,MAAM,iBAAiB,QAAgB,QAA6E;AAYlH,SAAO,OAXU,MAAM,KAAK,kBAC1B,0BAAS,UAAU,UACnB;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,OAAO;GAC7B,EACD,KACD,EACqB,MAAM;;CAG9B,MAAM,gCACJ,QACA,UACA,OAC4D;AAY5D,SAAO,OAXU,MAAM,KAAK,kBAC1B,0BAAS,uBAAuB,OAAO,GAAG,SAAS,gBACnD;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC;GAChC,EACD,KACD,EACqB,MAAM;;;;;;CAO9B,MAAM,yCACJ,QACA,YACA,mBACA,OAC4D;AAY5D,SAAO,OAXU,MAAM,KAAK,kBAC1B,0BAAS,uBAAuB,OAAO,GAAG,WAAW,GAAG,kBAAkB,gBAC1E;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC;GAChC,EACD,KACD,EACqB,MAAM;;;;;CAM9B,MAAM,4BACJ,QACiD;AAMjD,SAAO,OALU,MAAM,KAAK,kBAC1B,0BAAS,uBAAuB,UAChC,EAAE,QAAQ,OAAO,EACjB,KACD,EACqB,MAAM;;CAG9B,MAAM,wBAAwB,QAAgB,iBAAyB,iBAAkF;EAgBvJ,MAAM,SAAS,OAfE,MAAM,KAAK,kBAC1B,kBACA;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU;IACnB,SAAS;IACT,mBAAmB;IACnB,kBAAkB;IACnB,CAAC;GACH,EACD,KACD,EAC6B,MAAM;AACpC,SAAO;GACL,aAAa,OAAO;GACpB,cAAc,OAAO;GACtB;;CAGH,MAAM,gBACJ,SAIA;AACA,QAAM,KAAK,kBACT,0BAAS,qBAAqB,QAAQ,OAAO,GAAG,QAAQ,UACxD;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EAAE,CAAC;GACzB,EACD,KACD;;CAGH,MAAM,8BAA8B,SAIjC;AACD,QAAM,KAAK,kBACT,0BAAS,yBAAyB,QAAQ,OAAO,GAAG,QAAQ,UAC5D;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,QAAQ,QAAQ;GACtC,EACD,KACD;;CAGH,MAAM,8BAA8B,QAAgB,QAAgB,cAAsB;AACxF,QAAM,KAAK,kBACT,0BAAS,qBAAqB,OAAO,GAAG,OAAO,GAAG,gBAClD;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EAAE,CAAC;GACzB,EACD,KACD;;CAGH,MAAM,6BAA6B,QAAgB,cAAsB;AACvE,QAAM,KAAK,kBACT,0BAAS,wBAAwB,OAAO,GAAG,gBAC3C;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EAAE,CAAC;GACzB,EACD,KACD;;CAGH,MAAM,+BAA+B,QAAgB,QAAgB,cAAsB;AACzF,QAAM,KAAK,kBACT,0BAAS,qBAAqB,OAAO,GAAG,OAAO,GAAG,gBAClD;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EAAE,CAAC;GACzB,EACD,KACD;;CAGH,MAAM,8BAA8B,QAAgB,cAAsB;AACxE,QAAM,KAAK,kBACT,0BAAS,wBAAwB,OAAO,GAAG,gBAC3C;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EAAE,CAAC;GACzB,EACD,KACD;;CAGH,MAAM,iBAAiB,QAAgB;AACrC,QAAM,KAAK,kBACT,0BAAS,UAAU,UACnB;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EAAE,CAAC;GACzB,EACD,KACD;;CAGH,MAAM,2BACJ,MACgD;AAYhD,SAAO,OAXU,MAAM,KAAK,kBAC1B,qBACA;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,KAAK;GAC3B,EACD,KACD,EACqB,MAAM;;CAG9B,MAAM,2BACJ,QACA,kBACA,MACgD;AAYhD,SAAO,OAXU,MAAM,KAAK,kBAC1B,0BAAS,qBAAqB,OAAO,GAAG,oBACxC;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,KAAK;GAC3B,EACD,KACD,EACqB,MAAM;;CAG9B,MAAM,2BACJ,QACA,kBACe;AACf,QAAM,KAAK,kBACT,0BAAS,qBAAqB,OAAO,GAAG,oBACxC,EACE,QAAQ,UACT,EACD,KACD;;CAGH,MAAM,0BACJ,QACkD;AASlD,UADa,OAPI,MAAM,KAAK,kBAC1B,0BAAS,6BAA6B,UACtC,EACE,QAAQ,OACT,EACD,KACD,EAC2B,MAAM,EACtB;;CAGd,MAAM,iCACJ,QACyD;AASzD,UADa,OAPI,MAAM,KAAK,kBAC1B,0BAAS,mCAAmC,UAC5C,EACE,QAAQ,OACT,EACD,KACD,EAC2B,MAAM,EACtB;;CAGd,MAAM,8BACJ,QACA,wBACA,SACe;AACf,QAAM,KAAK,kBACT,0BAAS,mCAAmC,OAAO,GAAG,0BACtD;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EACnB,SACD,CAAC;GACH,EACD,KACD;;CAGH,MAAM,0CACJ,QACA,kBACA,aACe;AACf,QAAM,KAAK,kBACT,0BAAS,qBAAqB,OAAO,GAAG,iBAAiB,0BACzD;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EAAE,cAAc,aAAa,CAAC;GACpD,EACD,KACD;;CAIH,MAAM,mBAAmB,QAAyD;AAQhF,SAAO,OAPU,MAAM,KAAK,kBAC1B,0BAAS,0BAA0B,UACnC,EACE,QAAQ,OACT,EACD,KACD,EACqB,MAAM;;CAG9B,MAAM,oBAAoB,WAAmB;AAC3C,QAAM,KAAK,kBACT,0BAAS,kBAAkB,aAC3B,EACE,QAAQ,UACT,EACD,KACD;;CAIH,MAAM,yBAAyB,SAIb;AAChB,QAAM,KAAK,kBACT,+BACA;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU;IACnB,OAAO,QAAQ;IACf,SAAS,QAAQ;IACjB,cAAc,QAAQ;IACvB,CAAC;GACH,EACD,KACD;;CAGH,MAAM,eACJ,SAC8G;EAC9G,MAAM,MAAM,MAAM,KAAK,oCACrB,yBACA;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU;IACnB,cAAc,QAAQ;IACtB,cAAc,QAAQ;IACvB,CAAC;GACH,EACD,MACA,CAACC,+BAAY,8BAA8BA,+BAAY,2BAA2B,CACnF;AAED,MAAI,IAAI,WAAW,QACjB,QAAO,IAAI;;CAKf,MAAM,0BACJ,MAC8C;AAY9C,SAAO,OAXU,MAAM,KAAK,kBAC1B,oBACA;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,KAAK;GAC3B,EACD,KACD,EACqB,MAAM;;CAI9B,MAAM,yBACJ,UAEI,EAAE,EAC0C;EAChD,MAAM,cAAc,IAAI,yDAAgC,QAAQ,CAAC;AASjE,UADe,OAPE,MAAM,KAAK,kBAC1B,mBAAmB,YAAY,UAAU,GAAG,IAAI,YAAY,UAAU,KAAK,MAC3E,EACE,QAAQ,OACT,EACD,KACD,EAC6B,MAAM,EACtB;;CAGhB,MAAM,0BACJ,QACA,YACA,MAC8C;AAY9C,SAAO,OAXU,MAAM,KAAK,kBAC1B,0BAAS,oBAAoB,OAAO,GAAG,cACvC;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,KAAK;GAC3B,EACD,KACD,EACqB,MAAM;;CAG9B,MAAM,0BACJ,QACA,YACe;AAQf,SAAO,OAPU,MAAM,KAAK,kBAC1B,0BAAS,oBAAoB,OAAO,GAAG,cACvC,EACE,QAAQ,UACT,EACD,KACD,EACqB,MAAM;;CAG9B,MAAM,UAAU,SAWqH;AACvH,QAAM,KAAK,kBACrB,sBACA;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU;IACnB,UAAU,QAAQ;IAClB,WAAW,QAAQ;IACnB,UAAU,QAAQ;IAClB,MAAM,QAAQ;IACd,SAAS,QAAQ;IACjB,4BAA4B,QAAQ;IACpC,aAAa,QAAQ;IACrB,WAAW,QAAQ;IACnB,UAAU,QAAQ;IAClB,qBAAqB,QAAQ,aAAa,SAAS;IACpD,CAAC;GACH,EACD,KACD;AACD,SAAOD,2BAAO,GAAG,OAAU;;CAG7B,MAAM,uBAcH;AAWD,SAAO,OAVK,MAAM,KAAK,kBACrB,yBACA;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACF,EACD,KACD,EACgB,MAAM;;CAGzB,MAAM,6BAA8D;AAYlE,SAAO,OAXK,MAAM,KAAK,kBACrB,0BACA;GACE,QAAQ;GACR,SAAS,EACP,gBAAgB,oBACjB;GACD,MAAM,KAAK,UAAU,EAAE,CAAC;GACzB,EACD,KACD,EACgB,MAAM;;CAGzB,MAAM,mBACJ,SAKA,MACe;EACf,IAAI;EACJ,IAAI;EACJ,MAAM,SAAiB,QAAQ;AAE/B,MAAI,YAAY,SAAS;AACvB,kBAAe;AACf,gBAAa,QAAQ;aACZ,YAAY,SAAS;AAC9B,kBAAe;AACf,gBAAa,QAAQ;aACZ,sBAAsB,SAAS;AACxC,kBAAe;AACf,gBAAa,QAAQ;QAErB,OAAM,IAAIE,0CAAuB,yEAAyE;EAG5G,MAAM,cAAc,IAAI,gBAAgB,EAAE,iBAAiB,KAAK,kBAAkB,OAAO,UAAU,EAAE,CAAC;AACtG,QAAM,KAAK,kBACT,mBAAmB,aAAa,GAAG,WAAW,GAAG,OAAO,mBAAmB,YAAY,UAAU,IACjG;GACE,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAC/C,MAAM,KAAK,UAAU;IAAE,OAAO,KAAK;IAAO,YAAY,KAAK;IAAY,aAAa,KAAK;IAAa,CAAC;GACxG,EACD,KACD;;CAGH,MAAM,aACJ,SAOe;AACf,MAAI,CAAC,QAAQ,aAAa,CAAC,QAAQ,QACjC,OAAM,IAAIA,0CAAuB,oDAAoD;AAEvF,MAAI,QAAQ,aAAa,QAAQ,QAC/B,OAAM,IAAIA,0CAAuB,6DAA6D;EAEhG,MAAM,gDAAuB;GAC3B,YAAY,QAAQ;GACpB,gBAAgB,QAAQ;GACxB,UAAU,QAAQ;GACnB,CAAC;AACF,QAAM,KAAK,kBACT,0BAAS,sBAAsB,QAAQ,aAAa,GAAG,QAAQ,cAC/D;GACE,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAC/C,MAAM,KAAK,UAAU,KAAK;GAC3B,EACD,KACD;;CAGH,MAAM,uBAAuB,QAAgB,SAAiB,KAAa;EACzE,MAAM,YAAY,mDAAc,QAAQ,IAAI;EAC5C,MAAM,WAAW,MAAM,KAAK,oCAC1B,sBAAsB,QAAQ,OAC9B;GACE,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAC/C,MAAM,KAAK,UAAU,EAAE,YAAY,WAAW,CAAC;GAChD,EACD,MACA,CAACD,+BAAY,oCAAoC,CAClD;AACD,MAAI,SAAS,WAAW,QACtB,KAAIA,+BAAY,oCAAoC,WAAW,SAAS,MAAM,CAC5E,QAAO;MAEP,OAAM,IAAIC,0CAAuB,6BAA6B,EAAE,OAAO,SAAS,OAAO,CAAC;EAI5F,MAAM,kBADO,MAAM,SAAS,KAAK,MAAM,EACX;AAC5B,MAAI,OAAO,mBAAmB,SAAU,OAAM,IAAIA,0CAAuB,mCAAmC,EAAE,MAAM,OAAO,gBAAgB,CAAC;AAC5I,SAAO,wDAAmB,QAAQ,KAAK,eAAe;;CAGxD,MAAM,uBAAuB,QAAgB,SAAiB,KAAa,OAAe;EACxF,MAAM,YAAY,mDAAc,QAAQ,IAAI;EAC5C,MAAM,iBAAiB,wDAAmB,QAAQ,KAAK,MAAM;AAC7D,QAAM,KAAK,kBACT,sBAAsB,QAAQ,OAC9B;GACE,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAC/C,MAAM,KAAK,UAAU;IAAE,YAAY;IAAW,iBAAiB;IAAgB,CAAC;GACjF,EACD,KACD;;CAGH,MAAM,kCAAkC,QAAqF;EAI3H,MAAM,EAAE,aAAa,iBAAiB,MAAM,KAAK,wBAAwB,QAAQ,MAAQ,GAAG,MAAM;EAClG,MAAM,cAAc,IAAIC,+BAAgB;GACtC;GACA;GACA,4BAA4B,YAAY;GACzC,CAAC;AAGF,SAAO,MAAM,KAAK,4BAA4B,EAAE,EAAE,YAAY"}
1
+ {"version":3,"file":"server-interface.js","names":["HexclaveClientInterface","Result","KnownErrors","HexclaveAssertionError","InternalSession"],"sources":["../../src/interface/server-interface.ts"],"sourcesContent":["import * as yup from \"yup\";\nimport { decryptValue, encryptValue, hashKey } from \"../helpers/vault/client-side\";\nimport { KnownErrors } from \"../known-errors\";\nimport { inlineProductSchema } from \"../schema-fields\";\nimport { AccessToken, InternalSession, RefreshToken } from \"../sessions\";\nimport { HexclaveAssertionError } from \"../utils/errors\";\nimport { filterUndefined } from \"../utils/objects\";\nimport { Result } from \"../utils/results\";\nimport { urlString } from \"../utils/urls\";\nimport {\n ClientInterfaceOptions,\n HexclaveClientInterface\n} from \"./client-interface\";\nimport { ConnectedAccountAccessTokenCrud, ConnectedAccountCrud } from \"./crud/connected-accounts\";\nimport { ContactChannelsCrud } from \"./crud/contact-channels\";\nimport { CurrentUserCrud } from \"./crud/current-user\";\nimport { ItemCrud } from \"./crud/items\";\nimport { NotificationPreferenceCrud } from \"./crud/notification-preferences\";\nimport { OAuthProviderCrud } from \"./crud/oauth-providers\";\nimport { ProjectPermissionsCrud } from \"./crud/project-permissions\";\nimport { SessionsCrud } from \"./crud/sessions\";\nimport { TeamInvitationCrud } from \"./crud/team-invitation\";\nimport { TeamMemberProfilesCrud } from \"./crud/team-member-profiles\";\nimport { TeamMembershipsCrud } from \"./crud/team-memberships\";\nimport { TeamPermissionsCrud } from \"./crud/team-permissions\";\nimport { TeamsCrud } from \"./crud/teams\";\nimport { UsersCrud } from \"./crud/users\";\n\nexport type ServerAuthApplicationOptions = (\n & ClientInterfaceOptions\n & (\n | {\n readonly secretServerKey: string,\n }\n | {\n readonly projectOwnerSession: InternalSession | (() => Promise<string | null>),\n }\n )\n);\n\nexport class HexclaveServerInterface extends HexclaveClientInterface {\n constructor(public override options: ServerAuthApplicationOptions) {\n super(options);\n }\n\n protected async sendServerRequest(path: string, options: RequestInit, session: InternalSession | null, requestType: \"server\" | \"admin\" = \"server\") {\n return await this.sendClientRequest(\n path,\n {\n ...options,\n headers: {\n // Hexclave rebrand: emit x-hexclave-* request header; the backend proxy dual-accepts both names.\n \"x-hexclave-secret-server-key\": \"secretServerKey\" in this.options ? this.options.secretServerKey : \"\",\n ...options.headers,\n },\n },\n session,\n requestType,\n );\n }\n\n override async getCustomerBilling(\n customerType: \"user\" | \"team\",\n customerId: string,\n session: InternalSession | null,\n ): Promise<{\n has_customer: boolean,\n default_payment_method: {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n } | null,\n }> {\n const response = await this.sendServerRequest(\n urlString`/payments/billing/${customerType}/${customerId}`,\n {},\n session,\n );\n return await response.json();\n }\n\n override async createCustomerPaymentMethodSetupIntent(\n customerType: \"user\" | \"team\",\n customerId: string,\n session: InternalSession | null,\n ): Promise<{\n client_secret: string,\n stripe_account_id: string,\n }> {\n const response = await this.sendServerRequest(\n urlString`/payments/payment-method/${customerType}/${customerId}/setup-intent`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n session,\n );\n return await response.json();\n }\n\n override async setDefaultCustomerPaymentMethodFromSetupIntent(\n customerType: \"user\" | \"team\",\n customerId: string,\n setupIntentId: string,\n session: InternalSession | null,\n ): Promise<{\n default_payment_method: {\n id: string,\n brand: string | null,\n last4: string | null,\n exp_month: number | null,\n exp_year: number | null,\n },\n }> {\n const response = await this.sendServerRequest(\n urlString`/payments/payment-method/${customerType}/${customerId}/set-default`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n setup_intent_id: setupIntentId,\n }),\n },\n session,\n );\n return await response.json();\n }\n\n\n protected async sendServerRequestAndCatchKnownError<E extends typeof KnownErrors[keyof KnownErrors]>(\n path: string,\n requestOptions: RequestInit,\n tokenStoreOrNull: InternalSession | null,\n errorsToCatch: readonly E[],\n ): Promise<Result<\n Response & {\n usedTokens: {\n accessToken: AccessToken,\n refreshToken: RefreshToken | null,\n } | null,\n },\n InstanceType<E>\n >> {\n try {\n return Result.ok(await this.sendServerRequest(path, requestOptions, tokenStoreOrNull));\n } catch (e) {\n for (const errorType of errorsToCatch) {\n if (errorType.isInstance(e)) {\n return Result.error(e as InstanceType<E>);\n }\n }\n throw e;\n }\n }\n\n async createServerUser(data: UsersCrud['Server']['Create']): Promise<UsersCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n \"/users\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async getServerUserByToken(session: InternalSession): Promise<CurrentUserCrud['Server']['Read'] | null> {\n const responseOrError = await this.sendServerRequestAndCatchKnownError(\n \"/users/me\",\n {},\n session,\n [KnownErrors.CannotGetOwnUserWithoutUser],\n );\n if (responseOrError.status === \"error\") {\n if (KnownErrors.CannotGetOwnUserWithoutUser.isInstance(responseOrError.error)) {\n return null;\n } else {\n throw new HexclaveAssertionError(\"Unexpected uncaught error\", { cause: responseOrError.error });\n }\n }\n const response = responseOrError.data;\n const user: CurrentUserCrud['Server']['Read'] = await response.json();\n if (!(user as any)) throw new HexclaveAssertionError(\"User endpoint returned null; this should never happen\");\n return user;\n }\n\n async getServerUserById(userId: string): Promise<Result<UsersCrud['Server']['Read']>> {\n const responseOrError = await this.sendServerRequestAndCatchKnownError(\n urlString`/users/${userId}`,\n {},\n null,\n [KnownErrors.UserNotFound],\n );\n if (responseOrError.status === \"error\") {\n return Result.error(responseOrError.error);\n }\n const user: UsersCrud['Server']['Read'] = await responseOrError.data.json();\n return Result.ok(user);\n }\n\n async listServerTeamInvitations(options: {\n teamId: string,\n }): Promise<TeamInvitationCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n urlString`/team-invitations?team_id=${options.teamId}`,\n {},\n null,\n );\n const result = await response.json() as TeamInvitationCrud['Server']['List'];\n return result.items;\n }\n\n async revokeServerTeamInvitation(invitationId: string, teamId: string) {\n await this.sendServerRequest(\n urlString`/team-invitations/${invitationId}?team_id=${teamId}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n async listServerTeamMemberProfiles(\n options: {\n teamId: string,\n },\n ): Promise<TeamMemberProfilesCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n urlString`/team-member-profiles?team_id=${options.teamId}`,\n {},\n null,\n );\n const result = await response.json() as TeamMemberProfilesCrud['Server']['List'];\n return result.items;\n }\n\n async getServerTeamMemberProfile(\n options: {\n teamId: string,\n userId: string,\n },\n ): Promise<TeamMemberProfilesCrud['Client']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/team-member-profiles/${options.teamId}/${options.userId}`,\n {},\n null,\n );\n return await response.json();\n }\n\n async listServerTeamPermissions(\n options: {\n userId?: string,\n teamId?: string,\n recursive: boolean,\n },\n session: InternalSession | null,\n ): Promise<TeamPermissionsCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n `/team-permissions?${new URLSearchParams(filterUndefined({\n user_id: options.userId,\n team_id: options.teamId,\n recursive: options.recursive.toString(),\n }))}`,\n {},\n session,\n );\n const result = await response.json() as TeamPermissionsCrud['Server']['List'];\n return result.items;\n }\n\n async listServerProjectPermissions(\n options: {\n userId?: string,\n recursive: boolean,\n },\n session: InternalSession | null,\n ): Promise<ProjectPermissionsCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n `/project-permissions?${new URLSearchParams(filterUndefined({\n user_id: options.userId,\n recursive: options.recursive.toString(),\n }))}`,\n {},\n session,\n );\n const result = await response.json() as ProjectPermissionsCrud['Server']['List'];\n return result.items;\n }\n\n async listServerUsers(options: (\n & {\n cursor?: string,\n limit?: number,\n orderBy?: 'signedUpAt' | 'lastActiveAt',\n desc?: boolean,\n query?: string,\n excludedEmailDomains?: string[],\n includeRestricted?: boolean,\n teamId?: string,\n }\n & (\n {\n includeAnonymous?: boolean,\n onlyAnonymous?: false,\n }\n | {\n includeAnonymous: true,\n onlyAnonymous: true,\n }\n )\n )): Promise<UsersCrud['Server']['List']> {\n const searchParams = new URLSearchParams(filterUndefined({\n cursor: options.cursor,\n limit: options.limit?.toString(),\n desc: options.desc?.toString(),\n team_id: options.teamId,\n ...options.orderBy ? {\n order_by: {\n signedUpAt: \"signed_up_at\",\n lastActiveAt: \"last_active_at\",\n }[options.orderBy],\n } : {},\n ...options.query ? {\n query: options.query,\n } : {},\n ...options.excludedEmailDomains && options.excludedEmailDomains.length > 0 ? {\n excluded_email_domains: options.excludedEmailDomains.join(\",\"), // backend expects comma-separated list of domains.\n } : {},\n ...options.includeRestricted ? {\n include_restricted: 'true',\n } : {},\n ...options.includeAnonymous ? {\n include_anonymous: 'true',\n } : {},\n ...options.onlyAnonymous ? {\n only_anonymous: 'true',\n } : {},\n }));\n const response = await this.sendServerRequest(\"/users?\" + searchParams.toString(), {}, null);\n return await response.json();\n }\n\n async listServerTeams(options?: {\n userId?: string,\n }): Promise<TeamsCrud['Server']['Read'][]> {\n const result = await this.listServerTeamsPaginated(options);\n return result.items;\n }\n\n async listServerTeamsPaginated(options?: {\n userId?: string,\n orderBy?: 'createdAt',\n desc?: boolean,\n cursor?: string,\n limit?: number,\n query?: string,\n }): Promise<TeamsCrud['Server']['List']> {\n const response = await this.sendServerRequest(\n `/teams?${new URLSearchParams(filterUndefined({\n user_id: options?.userId,\n // SDK option uses camelCase `createdAt`; backend uses snake_case.\n order_by: options?.orderBy === 'createdAt' ? 'created_at' : options?.orderBy,\n desc: options?.desc !== undefined ? String(options.desc) : undefined,\n cursor: options?.cursor,\n limit: options?.limit?.toString(),\n query: options?.query,\n }))}`,\n {},\n null\n );\n return await response.json() as TeamsCrud['Server']['List'];\n }\n\n async getServerTeam(teamId: string): Promise<TeamsCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n `/teams/${teamId}`,\n {},\n null\n );\n return await response.json();\n }\n\n async listServerTeamUsers(teamId: string): Promise<UsersCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(`/users?team_id=${teamId}`, {}, null);\n const result = await response.json() as UsersCrud['Server']['List'];\n return result.items;\n }\n\n /* when passing a session, the user will be added to the team */\n async createServerTeam(data: TeamsCrud['Server']['Create']): Promise<TeamsCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n \"/teams\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null\n );\n return await response.json();\n }\n\n async updateServerTeam(teamId: string, data: TeamsCrud['Server']['Update']): Promise<TeamsCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/teams/${teamId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteServerTeam(teamId: string): Promise<void> {\n await this.sendServerRequest(\n urlString`/teams/${teamId}`,\n { method: \"DELETE\" },\n null,\n );\n }\n\n async addServerUserToTeam(options: {\n userId: string,\n teamId: string,\n }): Promise<TeamMembershipsCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/team-memberships/${options.teamId}/${options.userId}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n return await response.json();\n }\n\n async removeServerUserFromTeam(options: {\n userId: string,\n teamId: string,\n }) {\n await this.sendServerRequest(\n urlString`/team-memberships/${options.teamId}/${options.userId}`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async listServerUserTeamInvitations(userId: string): Promise<TeamInvitationCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n \"/team-invitations?\" + new URLSearchParams({ user_id: userId }),\n {},\n null,\n );\n const result = await response.json() as TeamInvitationCrud['Server']['List'];\n return result.items;\n }\n\n async acceptServerTeamInvitationById(\n invitationId: string,\n userId: string,\n ) {\n await this.sendServerRequest(\n urlString`/team-invitations/${invitationId}/accept` + \"?\" + new URLSearchParams({ user_id: userId }),\n { method: \"POST\" },\n null,\n );\n }\n\n async updateServerUser(userId: string, update: UsersCrud['Server']['Update']): Promise<UsersCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/users/${userId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(update),\n },\n null,\n );\n return await response.json();\n }\n\n async createServerProviderAccessToken(\n userId: string,\n provider: string,\n scope: string,\n ): Promise<ConnectedAccountAccessTokenCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/connected-accounts/${userId}/${provider}/access-token`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ scope }),\n },\n null,\n );\n return await response.json();\n }\n\n /**\n * Get access token for a specific connected account by provider ID and provider account ID.\n * This is the preferred method when dealing with multiple accounts of the same provider.\n */\n async createServerProviderAccessTokenByAccount(\n userId: string,\n providerId: string,\n providerAccountId: string,\n scope: string,\n ): Promise<ConnectedAccountAccessTokenCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/connected-accounts/${userId}/${providerId}/${providerAccountId}/access-token`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ scope }),\n },\n null,\n );\n return await response.json();\n }\n\n /**\n * List all connected accounts for a user.\n */\n async listServerConnectedAccounts(\n userId: string,\n ): Promise<ConnectedAccountCrud['Server']['List']> {\n const response = await this.sendServerRequest(\n urlString`/connected-accounts/${userId}`,\n { method: \"GET\" },\n null,\n );\n return await response.json();\n }\n\n async createServerUserSession(userId: string, expiresInMillis: number, isImpersonation: boolean): Promise<{ accessToken: string, refreshToken: string }> {\n const response = await this.sendServerRequest(\n \"/auth/sessions\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n user_id: userId,\n expires_in_millis: expiresInMillis,\n is_impersonation: isImpersonation,\n }),\n },\n null,\n );\n const result = await response.json();\n return {\n accessToken: result.access_token,\n refreshToken: result.refresh_token,\n };\n }\n\n async leaveServerTeam(\n options: {\n teamId: string,\n userId: string,\n },\n ) {\n await this.sendClientRequest(\n urlString`/team-memberships/${options.teamId}/${options.userId}`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async updateServerTeamMemberProfile(options: {\n teamId: string,\n userId: string,\n profile: TeamMemberProfilesCrud['Server']['Update'],\n }) {\n await this.sendServerRequest(\n urlString`/team-member-profiles/${options.teamId}/${options.userId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(options.profile),\n },\n null,\n );\n }\n\n async grantServerTeamUserPermission(teamId: string, userId: string, permissionId: string) {\n await this.sendServerRequest(\n urlString`/team-permissions/${teamId}/${userId}/${permissionId}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async grantServerProjectPermission(userId: string, permissionId: string) {\n await this.sendServerRequest(\n urlString`/project-permissions/${userId}/${permissionId}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async revokeServerTeamUserPermission(teamId: string, userId: string, permissionId: string) {\n await this.sendServerRequest(\n urlString`/team-permissions/${teamId}/${userId}/${permissionId}`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async revokeServerProjectPermission(userId: string, permissionId: string) {\n await this.sendServerRequest(\n urlString`/project-permissions/${userId}/${permissionId}`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async deleteServerUser(userId: string) {\n await this.sendServerRequest(\n urlString`/users/${userId}`,\n {\n method: \"DELETE\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({}),\n },\n null,\n );\n }\n\n async createServerContactChannel(\n data: ContactChannelsCrud['Server']['Create'],\n ): Promise<ContactChannelsCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n \"/contact-channels\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async updateServerContactChannel(\n userId: string,\n contactChannelId: string,\n data: ContactChannelsCrud['Server']['Update'],\n ): Promise<ContactChannelsCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/contact-channels/${userId}/${contactChannelId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteServerContactChannel(\n userId: string,\n contactChannelId: string,\n ): Promise<void> {\n await this.sendServerRequest(\n urlString`/contact-channels/${userId}/${contactChannelId}`,\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n async listServerContactChannels(\n userId: string,\n ): Promise<ContactChannelsCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n urlString`/contact-channels?user_id=${userId}`,\n {\n method: \"GET\",\n },\n null,\n );\n const json = await response.json() as ContactChannelsCrud['Server']['List'];\n return json.items;\n }\n\n async listServerNotificationCategories(\n userId: string,\n ): Promise<NotificationPreferenceCrud['Server']['Read'][]> {\n const response = await this.sendServerRequest(\n urlString`/emails/notification-preference/${userId}`,\n {\n method: \"GET\",\n },\n null,\n );\n const json = await response.json() as NotificationPreferenceCrud['Server']['List'];\n return json.items;\n }\n\n async setServerNotificationsEnabled(\n userId: string,\n notificationCategoryId: string,\n enabled: boolean,\n ): Promise<void> {\n await this.sendServerRequest(\n urlString`/emails/notification-preference/${userId}/${notificationCategoryId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n enabled,\n }),\n },\n null,\n );\n }\n\n async sendServerContactChannelVerificationEmail(\n userId: string,\n contactChannelId: string,\n callbackUrl: string,\n ): Promise<void> {\n await this.sendServerRequest(\n urlString`/contact-channels/${userId}/${contactChannelId}/send-verification-code`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ callback_url: callbackUrl }),\n },\n null,\n );\n }\n\n\n async listServerSessions(userId: string): Promise<SessionsCrud['Server']['List']> {\n const response = await this.sendServerRequest(\n urlString`/auth/sessions?user_id=${userId}`,\n {\n method: \"GET\",\n },\n null,\n );\n return await response.json();\n }\n\n async deleteServerSession(sessionId: string) {\n await this.sendServerRequest(\n urlString`/auth/sessions/${sessionId}`,\n {\n method: \"DELETE\",\n },\n null,\n );\n }\n\n\n async sendServerTeamInvitation(options: {\n email: string,\n teamId: string,\n callbackUrl: string,\n }): Promise<void> {\n await this.sendServerRequest(\n \"/team-invitations/send-code\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n email: options.email,\n team_id: options.teamId,\n callback_url: options.callbackUrl,\n }),\n },\n null,\n );\n }\n\n async updatePassword(\n options: { oldPassword: string, newPassword: string },\n ): Promise<KnownErrors[\"PasswordConfirmationMismatch\"] | KnownErrors[\"PasswordRequirementsNotMet\"] | undefined> {\n const res = await this.sendServerRequestAndCatchKnownError(\n \"/auth/password/update\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n old_password: options.oldPassword,\n new_password: options.newPassword,\n }),\n },\n null,\n [KnownErrors.PasswordConfirmationMismatch, KnownErrors.PasswordRequirementsNotMet]\n );\n\n if (res.status === \"error\") {\n return res.error;\n }\n }\n\n // OAuth Providers CRUD operations\n async createServerOAuthProvider(\n data: OAuthProviderCrud['Server']['Create'],\n ): Promise<OAuthProviderCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n \"/oauth-providers\",\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n\n async listServerOAuthProviders(\n options: {\n user_id?: string,\n } = {},\n ): Promise<OAuthProviderCrud['Server']['Read'][]> {\n const queryParams = new URLSearchParams(filterUndefined(options));\n const response = await this.sendServerRequest(\n `/oauth-providers${queryParams.toString() ? `?${queryParams.toString()}` : ''}`,\n {\n method: \"GET\",\n },\n null,\n );\n const result = await response.json();\n return result.items;\n }\n\n async updateServerOAuthProvider(\n userId: string,\n providerId: string,\n data: OAuthProviderCrud['Server']['Update'],\n ): Promise<OAuthProviderCrud['Server']['Read']> {\n const response = await this.sendServerRequest(\n urlString`/oauth-providers/${userId}/${providerId}`,\n {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(data),\n },\n null,\n );\n return await response.json();\n }\n\n async deleteServerOAuthProvider(\n userId: string,\n providerId: string,\n ): Promise<void> {\n const response = await this.sendServerRequest(\n urlString`/oauth-providers/${userId}/${providerId}`,\n {\n method: \"DELETE\",\n },\n null,\n );\n return await response.json();\n }\n\n async sendEmail(options: {\n userIds?: string[],\n allUsers?: true,\n themeId?: string | null | false,\n html?: string,\n subject?: string,\n notificationCategoryName?: string,\n templateId?: string,\n variables?: Record<string, any>,\n draftId?: string,\n scheduledAt?: Date,\n }): Promise<Result<void, KnownErrors[\"RequiresCustomEmailServer\"] | KnownErrors[\"SchemaError\"] | KnownErrors[\"UserIdDoesNotExist\"]>> {\n const res = await this.sendServerRequest(\n \"/emails/send-email\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n user_ids: options.userIds,\n all_users: options.allUsers,\n theme_id: options.themeId,\n html: options.html,\n subject: options.subject,\n notification_category_name: options.notificationCategoryName,\n template_id: options.templateId,\n variables: options.variables,\n draft_id: options.draftId,\n scheduled_at_millis: options.scheduledAt?.getTime(),\n }),\n },\n null,\n );\n return Result.ok(undefined);\n }\n\n async getEmailDeliveryInfo(): Promise<{\n stats: {\n hour: { sent: number, bounced: number, marked_as_spam: number },\n day: { sent: number, bounced: number, marked_as_spam: number },\n week: { sent: number, bounced: number, marked_as_spam: number },\n month: { sent: number, bounced: number, marked_as_spam: number },\n },\n capacity: {\n rate_per_second: number,\n boost_multiplier: number,\n penalty_factor: number,\n is_boost_active: boolean,\n boost_expires_at: string | null,\n },\n }> {\n const res = await this.sendServerRequest(\n \"/emails/delivery-info\",\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n },\n null,\n );\n return await res.json();\n }\n\n async activateEmailCapacityBoost(): Promise<{ expires_at: string }> {\n const res = await this.sendServerRequest(\n \"/emails/capacity-boost\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({}),\n },\n null,\n );\n return await res.json();\n }\n\n async updateItemQuantity(\n options: (\n { itemId: string, userId: string } |\n { itemId: string, teamId: string } |\n { itemId: string, customCustomerId: string }\n ),\n data: ItemCrud['Server']['Update'],\n ): Promise<void> {\n let customerType: \"user\" | \"team\" | \"custom\";\n let customerId: string;\n const itemId: string = options.itemId;\n\n if (\"userId\" in options) {\n customerType = \"user\";\n customerId = options.userId;\n } else if (\"teamId\" in options) {\n customerType = \"team\";\n customerId = options.teamId;\n } else if (\"customCustomerId\" in options) {\n customerType = \"custom\";\n customerId = options.customCustomerId;\n } else {\n throw new HexclaveAssertionError(\"updateItemQuantity requires one of userId, teamId, or customCustomerId\");\n }\n\n const queryParams = new URLSearchParams({ allow_negative: (data.allow_negative ?? false).toString() });\n await this.sendServerRequest(\n `/payments/items/${customerType}/${customerId}/${itemId}/update-quantity?${queryParams.toString()}`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ delta: data.delta, expires_at: data.expires_at, description: data.description }),\n },\n null\n );\n }\n\n async grantProduct(\n options: {\n customerType: \"user\" | \"team\" | \"custom\",\n customerId: string,\n productId?: string,\n product?: yup.InferType<typeof inlineProductSchema>,\n quantity?: number,\n },\n ): Promise<void> {\n if (!options.productId && !options.product) {\n throw new HexclaveAssertionError(\"grantProduct requires either productId or product\");\n }\n if (options.productId && options.product) {\n throw new HexclaveAssertionError(\"grantProduct should not receive both productId and product\");\n }\n const body = filterUndefined({\n product_id: options.productId,\n product_inline: options.product,\n quantity: options.quantity,\n });\n await this.sendServerRequest(\n urlString`/payments/products/${options.customerType}/${options.customerId}`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n null,\n );\n }\n\n async getDataVaultStoreValue(secret: string, storeId: string, key: string) {\n const hashedKey = await hashKey(secret, key);\n const response = await this.sendServerRequestAndCatchKnownError(\n `/data-vault/stores/${storeId}/get`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ hashed_key: hashedKey }),\n },\n null,\n [KnownErrors.DataVaultStoreHashedKeyDoesNotExist] as const,\n );\n if (response.status === \"error\") {\n if (KnownErrors.DataVaultStoreHashedKeyDoesNotExist.isInstance(response.error)) {\n return null;\n } else {\n throw new HexclaveAssertionError(\"Unexpected uncaught error\", { cause: response.error });\n }\n }\n const json = await response.data.json();\n const encryptedValue = json.encrypted_value;\n if (typeof encryptedValue !== \"string\") throw new HexclaveAssertionError(\"encrypted_value is not a string\", { type: typeof encryptedValue });\n return await decryptValue(secret, key, encryptedValue);\n }\n\n async setDataVaultStoreValue(secret: string, storeId: string, key: string, value: string) {\n const hashedKey = await hashKey(secret, key);\n const encryptedValue = await encryptValue(secret, key, value);\n await this.sendServerRequest(\n `/data-vault/stores/${storeId}/set`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ hashed_key: hashedKey, encrypted_value: encryptedValue }),\n },\n null,\n );\n }\n\n async initiateServerPasskeyRegistration(userId: string): Promise<Result<{ options_json: any, code: string }, KnownErrors[]>> {\n // Create a temporary session for this user to use for passkey registration\n // TODO instead of creating a new session, this should just call the endpoint in a way in which it doesn't require a session\n // (currently this shows up on session history etc... not ideal)\n const { accessToken, refreshToken } = await this.createServerUserSession(userId, 60000 * 2, false); // 2 minute session\n const tempSession = new InternalSession({\n accessToken,\n refreshToken,\n refreshAccessTokenCallback: async () => null, // No refresh for temporary sessions\n });\n\n // Use the existing initiatePasskeyRegistration method with the temporary session\n return await this.initiatePasskeyRegistration({}, tempSession);\n }\n}\n"],"mappings":"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"}
@@ -314,8 +314,8 @@ declare const inlineProductSchema: yup$1.ObjectSchema<{
314
314
  free_trial?: DayInterval | undefined;
315
315
  }>;
316
316
  included_items: Record<string, {
317
- repeat?: "never" | DayInterval | undefined;
318
317
  quantity?: number | undefined;
318
+ repeat?: "never" | DayInterval | undefined;
319
319
  expires?: "never" | "when-purchase-expires" | "when-repeated" | undefined;
320
320
  }>;
321
321
  client_metadata: {} | null | undefined;
@@ -9,7 +9,6 @@ declare class AccessToken {
9
9
  private constructor();
10
10
  get payload(): {
11
11
  exp?: number | undefined;
12
- sub: string;
13
12
  project_id: string;
14
13
  refresh_token_id: string;
15
14
  email: string | null;
@@ -17,6 +16,7 @@ declare class AccessToken {
17
16
  type: "anonymous" | "email_not_verified" | "restricted_by_administrator";
18
17
  } | null;
19
18
  branch_id: string;
19
+ sub: string;
20
20
  iat: number;
21
21
  iss: string;
22
22
  aud: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hexclave/shared",
3
- "version": "1.0.30",
3
+ "version": "1.0.32",
4
4
  "repository": "https://github.com/hexclave/hexclave",
5
5
  "files": [
6
6
  "README.md",
@@ -27,15 +27,7 @@ export const convexSetupPrompt = deindent`
27
27
  </Step>
28
28
 
29
29
  <Step title="Install and configure Hexclave">
30
- Install Hexclave in the app. If you have not already completed the SDK setup steps above, run the setup wizard:
31
-
32
- \`\`\`sh
33
- npx @hexclave/cli@latest init
34
- \`\`\`
35
-
36
- Create or select a Hexclave project in the dashboard. Copy the Hexclave environment variables into the app's \`.env.local\` file.
37
-
38
- Also add the same Hexclave environment variables to the Convex deployment environment in the Convex dashboard.
30
+ Install Hexclave in the app. If you have not already completed the SDK setup steps above, follow the instructions in the [Getting Started Guide](https://docs.hexclave.com/guides/getting-started/setup).
39
31
  </Step>
40
32
 
41
33
  <Step title="Configure Convex auth providers">
@@ -135,31 +127,7 @@ export const supabaseSetupPrompt = deindent`
135
127
  </Step>
136
128
 
137
129
  <Step title="Install Hexclave and Supabase dependencies">
138
- If you are starting from scratch with Next.js, you can use Supabase's template and then initialize Hexclave:
139
-
140
- \`\`\`sh
141
- npx create-next-app@latest -e with-supabase hexclave-supabase
142
- cd hexclave-supabase
143
- npx @hexclave/cli@latest init
144
- \`\`\`
145
-
146
- Add the Supabase environment variables to \`.env.local\`:
147
-
148
- \`\`\`.env .env.local
149
- NEXT_PUBLIC_SUPABASE_URL=<your-supabase-url>
150
- NEXT_PUBLIC_SUPABASE_ANON_KEY=<your-supabase-anon-key>
151
- SUPABASE_JWT_SECRET=<your-supabase-jwt-secret>
152
- \`\`\`
153
-
154
- Also add the Hexclave environment variables:
155
-
156
- \`\`\`.env .env.local
157
- # The project ID is the only client-exposed Hexclave variable; in Next.js it must
158
- # be prefixed with NEXT_PUBLIC_. HEXCLAVE_SECRET_SERVER_KEY is server-only and must
159
- # NEVER be prefixed or exposed to the client.
160
- NEXT_PUBLIC_HEXCLAVE_PROJECT_ID=<your-hexclave-project-id>
161
- HEXCLAVE_SECRET_SERVER_KEY=<your-secret-server-key>
162
- \`\`\`
130
+ First, follow the instructions on how to get started with Hexclave for your framework in the [Getting Started Guide](https://docs.hexclave.com/guides/getting-started/setup).
163
131
  </Step>
164
132
 
165
133
  <Step title="Mint Supabase JWTs from Hexclave users">
@@ -813,6 +781,7 @@ export function getSdkSetupPrompt(mainType: "ai-prompt" | "nextjs" | "react" | "
813
781
  const isMaybeTanstackStart = isDefinitelyTanstackStart || mainType === "ai-prompt";
814
782
  const isDefinitelyVanillaReact = mainType === "react";
815
783
  const isMaybeVanillaReact = isDefinitelyVanillaReact || mainType === "ai-prompt";
784
+ const isDefinitelyVite = isDefinitelyTanstackStart;
816
785
 
817
786
  const isDefinitelyBackend = mainType === "nodejs" || mainType === "bun" || mainType === "nextjs";
818
787
  const isMaybeBackend = isDefinitelyBackend || mainType === "js" || mainType === "ai-prompt";
@@ -996,7 +965,7 @@ export function getSdkSetupPrompt(mainType: "ai-prompt" | "nextjs" | "react" | "
996
965
  }
997
966
  \`\`\`
998
967
 
999
- \`hexclave dev\` injects all necessary environment variables into the app process automatically, so the app is ready to use without any extra environment variable setup.
968
+ \`hexclave dev\` injects all necessary environment variables into the app process automatically, so the app is ready to use without any extra environment variable setup.${isAiPrompt ? " It injects non-sensitive environment variables (eg. the project ID) with and without the prefixes \`NEXT_PUBLIC_\` and \`VITE_\`, so no extra environment variable setup is necessary for most frameworks." : ""}
1000
969
  </Accordion>
1001
970
 
1002
971
  <Accordion title="Option 2: Connecting to a production project hosted in the cloud">
@@ -1015,7 +984,8 @@ export function getSdkSetupPrompt(mainType: "ai-prompt" | "nextjs" | "react" | "
1015
984
  ${isAiPrompt ? `${deindent`
1016
985
  Some projects have the \`requirePublishableClientKey\` config option enabled. In that case, a publishable client key will also be necessary. However, this is extremely uncommon; for most projects this is not true, so don't ask the user for one unless you have confirmation that the publishable client key is required. If it's not required, the project ID is the only environment variable required to use Hexclave on a client.
1017
986
  `}\n\n` : ""}\`\`\`.env .env.local
1018
- HEXCLAVE_PROJECT_ID=<your-project-id>
987
+ ${!isDefinitelyNextjs && !isDefinitelyVite ? "# note: prefix the environment variable with NEXT_PUBLIC_ or VITE_ if your framework requires you to do so" : ""}
988
+ ${isDefinitelyNextjs ? "NEXT_PUBLIC_" : (isDefinitelyVite ? "VITE_" : "")}HEXCLAVE_PROJECT_ID=<your-project-id>
1019
989
  \`\`\`
1020
990
 
1021
991
  Alternatively, you can also just set the project ID in the \`hexclave/client.ts\` file:
@@ -1037,7 +1007,11 @@ export function getSdkSetupPrompt(mainType: "ai-prompt" | "nextjs" | "react" | "
1037
1007
  ${isAiPrompt ? `${deindent`
1038
1008
  If the \`requirePublishableClientKey\` config option is enabled as described above, a publishable client key will also be necessary. Otherwise, these two are the only environment variables required to use Hexclave on a server.
1039
1009
  `}\n\n` : ""}\`\`\`.env .env.local
1040
- HEXCLAVE_PROJECT_ID=<your-project-id>
1010
+ ${!isDefinitelyNextjs && !isDefinitelyVite ? deindent`
1011
+ # as above, prefix the project ID environment variable with NEXT_PUBLIC_ or VITE_ if your framework requires you to do so
1012
+ # do NOT prefix the secret server key environment variable with NEXT_PUBLIC_ or VITE_ as it is server-only
1013
+ ` : ""}
1014
+ ${isDefinitelyNextjs ? "NEXT_PUBLIC_" : (isDefinitelyVite ? "VITE_" : "")}HEXCLAVE_PROJECT_ID=<your-project-id>
1041
1015
  HEXCLAVE_SECRET_SERVER_KEY=<your-secret-server-key>
1042
1016
  \`\`\`
1043
1017
 
@@ -304,6 +304,7 @@ export class HexclaveServerInterface extends HexclaveClientInterface {
304
304
  orderBy?: 'signedUpAt' | 'lastActiveAt',
305
305
  desc?: boolean,
306
306
  query?: string,
307
+ excludedEmailDomains?: string[],
307
308
  includeRestricted?: boolean,
308
309
  teamId?: string,
309
310
  }
@@ -332,6 +333,9 @@ export class HexclaveServerInterface extends HexclaveClientInterface {
332
333
  ...options.query ? {
333
334
  query: options.query,
334
335
  } : {},
336
+ ...options.excludedEmailDomains && options.excludedEmailDomains.length > 0 ? {
337
+ excluded_email_domains: options.excludedEmailDomains.join(","), // backend expects comma-separated list of domains.
338
+ } : {},
335
339
  ...options.includeRestricted ? {
336
340
  include_restricted: 'true',
337
341
  } : {},