@fonderie/client 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,6 +8,11 @@
8
8
  interface IFonderieClientOptions {
9
9
  baseUrl: string;
10
10
  accessToken?: string;
11
+ workspaceId?: string;
12
+ }
13
+
14
+ interface IRequestConfig {
15
+ workspaceId?: string;
11
16
  }
12
17
 
13
18
  new FonderieClient(opts: IFonderieClientOptions): FonderieClient
@@ -17,6 +22,14 @@ new FonderieClient(opts: IFonderieClientOptions): FonderieClient
17
22
  .audit: AuditClient
18
23
  .webhooks: WebhooksClient
19
24
  .customers: CustomersClient
25
+ .setAccessToken(token: string | undefined): void
26
+ .setWorkspaceId(workspaceId: string | undefined): void
27
+ .request<T = unknown>(opts: { method: string; path: string; body?: unknown; workspaceId?: string | undefined; }): Promise<IApiResponse<T>>
28
+ .get<T = unknown>(path: string, config?: IRequestConfig | undefined): Promise<IApiResponse<T>>
29
+ .post<T = unknown>(path: string, body?: unknown, config?: IRequestConfig | undefined): Promise<IApiResponse<T>>
30
+ .put<T = unknown>(path: string, body?: unknown, config?: IRequestConfig | undefined): Promise<IApiResponse<T>>
31
+ .patch<T = unknown>(path: string, body?: unknown, config?: IRequestConfig | undefined): Promise<IApiResponse<T>>
32
+ .delete<T = unknown>(path: string, config?: IRequestConfig | undefined): Promise<IApiResponse<T>>
20
33
 
21
34
  new FonderieApiError(reason: string, explanation: string, status: number, details?: unknown): FonderieApiError
22
35
  .reason: string
package/dist/index.cjs CHANGED
@@ -1062,15 +1062,60 @@ var FonderieClient = class {
1062
1062
  webhooks;
1063
1063
  customers;
1064
1064
  http;
1065
+ tokens;
1066
+ workspaceId;
1065
1067
  constructor(opts) {
1066
1068
  this.http = new HttpClient(opts.baseUrl);
1067
- const tokens = new TokenStore(opts.accessToken);
1068
- this.auth = new AuthClient(this.http, tokens);
1069
- this.billing = new BillingClient(this.http, tokens);
1070
- this.workspaces = new WorkspacesClient(this.http, tokens);
1071
- this.audit = new AuditClient(this.http, tokens);
1072
- this.webhooks = new WebhooksClient(this.http, tokens);
1073
- this.customers = new CustomersClient(this.http, tokens);
1069
+ this.tokens = new TokenStore(opts.accessToken);
1070
+ this.workspaceId = opts.workspaceId;
1071
+ this.auth = new AuthClient(this.http, this.tokens);
1072
+ this.billing = new BillingClient(this.http, this.tokens);
1073
+ this.workspaces = new WorkspacesClient(this.http, this.tokens);
1074
+ this.audit = new AuditClient(this.http, this.tokens);
1075
+ this.webhooks = new WebhooksClient(this.http, this.tokens);
1076
+ this.customers = new CustomersClient(this.http, this.tokens);
1077
+ }
1078
+ // The JWT used to authenticate every request — the typed modules and the
1079
+ // generic transport share one token store. Pass undefined to sign out.
1080
+ setAccessToken(token) {
1081
+ this.tokens.set(token);
1082
+ }
1083
+ // Default X-Workspace-ID for the generic transport, also propagated to the
1084
+ // workspace-scoped modules so one call configures the whole client.
1085
+ setWorkspaceId(workspaceId) {
1086
+ this.workspaceId = workspaceId;
1087
+ this.billing.setWorkspaceId(workspaceId);
1088
+ this.workspaces.setWorkspaceId(workspaceId);
1089
+ this.customers.setWorkspaceId(workspaceId);
1090
+ }
1091
+ // ── Generic transport ──────────────────────────────────────────────────────
1092
+ // A Fonderie-aware HTTP client for endpoints outside the typed modules (an
1093
+ // app's own routes on the same backend). It attaches the shared JWT and
1094
+ // X-Workspace-ID automatically and returns Fonderie's { reason, explanation,
1095
+ // result } envelope — so you don't hand-roll auth for custom endpoints.
1096
+ request(opts) {
1097
+ return this.http.request({
1098
+ method: opts.method,
1099
+ path: opts.path,
1100
+ body: opts.body,
1101
+ token: this.tokens.get(),
1102
+ workspaceId: opts.workspaceId ?? this.workspaceId
1103
+ });
1104
+ }
1105
+ get(path, config) {
1106
+ return this.request({ method: "GET", path, workspaceId: config?.workspaceId });
1107
+ }
1108
+ post(path, body, config) {
1109
+ return this.request({ method: "POST", path, body, workspaceId: config?.workspaceId });
1110
+ }
1111
+ put(path, body, config) {
1112
+ return this.request({ method: "PUT", path, body, workspaceId: config?.workspaceId });
1113
+ }
1114
+ patch(path, body, config) {
1115
+ return this.request({ method: "PATCH", path, body, workspaceId: config?.workspaceId });
1116
+ }
1117
+ delete(path, config) {
1118
+ return this.request({ method: "DELETE", path, workspaceId: config?.workspaceId });
1074
1119
  }
1075
1120
  };
1076
1121
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/http.ts","../src/modules/audit.ts","../src/modules/auth.ts","../src/modules/billing.ts","../src/modules/customers.ts","../src/modules/webhooks.ts","../src/modules/workspaces.ts","../src/token-store.ts","../src/client.ts","../src/modules/config-admin.ts","../src/modules/courier-admin.ts"],"sourcesContent":["export type { IFonderieClientOptions } from './client';\nexport { FonderieClient } from './client';\nexport { FonderieApiError } from './http';\nexport type { IListAuditEventsInput } from './modules/audit';\nexport { AuditClient } from './modules/audit';\nexport type {\n\tIChangePasswordInput,\n\tILoginInput,\n\tIRegisterInput,\n\tIResetPasswordInput,\n\tIUpdatePreferencesInput,\n\tIUpdateProfileInput,\n} from './modules/auth';\nexport { AuthClient } from './modules/auth';\nexport type {\n\tICheckoutInput,\n\tICreatePlanInput,\n\tIRecordUsageInput,\n\tIUpdatePlanInput,\n} from './modules/billing';\nexport { BillingClient } from './modules/billing';\nexport type {\n\tIConfigAdminClientOptions,\n\tIRollbackInput,\n\tISetConfigInput,\n\tISetSecretInput,\n} from './modules/config-admin';\nexport { ConfigAdminClient } from './modules/config-admin';\nexport type {\n\tICourierAdminClientOptions,\n\tIRollbackTemplateInput,\n\tISetTemplateInput,\n} from './modules/courier-admin';\nexport { CourierAdminClient } from './modules/courier-admin';\nexport type {\n\tIAddAddressInput,\n\tIAddEmailInput,\n\tIAddPhoneInput,\n\tIAddRelationshipInput,\n\tIBlacklistCustomerInput,\n\tICreateCustomerInput,\n\tIGetCustomerInput,\n\tIListCustomersInput,\n\tIUpdateCustomerInput,\n} from './modules/customers';\nexport { CustomersClient } from './modules/customers';\nexport type {\n\tICreateWebhookEndpointInput,\n\tIUpdateWebhookEndpointInput,\n} from './modules/webhooks';\nexport { WebhooksClient } from './modules/webhooks';\nexport type {\n\tICreateRoleInput,\n\tICreateWorkspaceInput,\n\tIInviteEntry,\n\tIRolePermission,\n\tIRolePermissionInput,\n\tIRolePermissionsResult,\n\tIUpdateRoleInput,\n\tIUpdateSettingsInput,\n\tIUpdateWorkspaceInput,\n} from './modules/workspaces';\nexport { WorkspacesClient } from './modules/workspaces';\nexport type {\n\tCustomerLabelType,\n\tCustomerSex,\n\tCustomerType,\n\tIAcceptInvitationResult,\n\tIAddressDTO,\n\tIApiError,\n\tIApiResponse,\n\tIAuditEventDTO,\n\tIAuditPageResult,\n\tICheckoutUrlResult,\n\tIConfigEntry,\n\tIConfigRevision,\n\tICustomerAddressDTO,\n\tICustomerAddressListResult,\n\tICustomerAddressResult,\n\tICustomerDetailD2DTO,\n\tICustomerDetailDTO,\n\tICustomerDTO,\n\tICustomerEmailDTO,\n\tICustomerEmailListResult,\n\tICustomerEmailResult,\n\tICustomerLabelDTO,\n\tICustomerLabelListResult,\n\tICustomerListResult,\n\tICustomerNoteDTO,\n\tICustomerNoteListResult,\n\tICustomerNoteResult,\n\tICustomerPhoneDTO,\n\tICustomerPhoneListResult,\n\tICustomerPhoneResult,\n\tICustomerRelationshipDTO,\n\tICustomerRelationshipExpandedD2DTO,\n\tICustomerRelationshipExpandedDTO,\n\tICustomerRelationshipListResult,\n\tICustomerRelationshipResult,\n\tICustomerResult,\n\tICustomerShallowDTO,\n\tICustomerTagListResult,\n\tIInvitationDTO,\n\tIInvitationListResult,\n\tIInviteResult,\n\tILoginResult,\n\tIMemberDTO,\n\tIMemberListResult,\n\tIMeResult,\n\tIMfaEnabledResult,\n\tIMfaSetupResult,\n\tIPlanDTO,\n\tIPlanFeature,\n\tIPlanListResult,\n\tIPlanResult,\n\tIPortalUrlResult,\n\tIRefreshResult,\n\tIRegisterResult,\n\tIResendVerificationResult,\n\tIRevealSecretResult,\n\tIRoleDTO,\n\tIRoleListResult,\n\tIRoleResult,\n\tISecretEntry,\n\tISecretRevision,\n\tISubscriptionDTO,\n\tISubscriptionResult,\n\tITemplateEntry,\n\tITemplateRevision,\n\tITestWebhookResult,\n\tITokens,\n\tIUsageResult,\n\tIUserDTO,\n\tIUserPreferences,\n\tIUserSkill,\n\tIVerifyEmailResult,\n\tIWebhookDeliveryDTO,\n\tIWebhookDeliveryListResult,\n\tIWebhookEndpointCreatedDTO,\n\tIWebhookEndpointDTO,\n\tIWebhookEndpointListResult,\n\tIWorkspaceAddressDTO,\n\tIWorkspaceDTO,\n\tIWorkspaceListResult,\n\tIWorkspaceResult,\n\tIWorkspaceSettingsDTO,\n\tIWorkspaceSettingsResult,\n\tSubscriberType,\n} from './types';\n","import type { IApiError } from './types';\n\nexport class FonderieApiError extends Error {\n\tconstructor(\n\t\tpublic readonly reason: string,\n\t\tpublic readonly explanation: string,\n\t\tpublic readonly status: number,\n\t\tpublic readonly details?: unknown,\n\t) {\n\t\tsuper(explanation);\n\t\tthis.name = 'FonderieApiError';\n\t}\n}\n\nexport interface IRequestOptions {\n\tmethod: string;\n\tpath: string;\n\tbody?: unknown;\n\ttoken?: string | undefined;\n\tcookie?: string | undefined;\n\t// Resolves the billing subscriber to a workspace (@fonderie/billing's\n\t// resolveSubscriber falls back to the session user when omitted).\n\tworkspaceId?: string | undefined;\n}\n\nexport class HttpClient {\n\tconstructor(private baseUrl: string) {}\n\n\tasync request<T>(opts: IRequestOptions): Promise<T> {\n\t\tconst headers: Record<string, string> = {\n\t\t\t'Content-Type': 'application/json',\n\t\t};\n\n\t\tif (opts.token) headers['Authorization'] = `Bearer ${opts.token}`;\n\t\tif (opts.cookie) headers['Cookie'] = opts.cookie;\n\t\tif (opts.workspaceId) headers['X-Workspace-ID'] = opts.workspaceId;\n\n\t\tconst fetchInit: RequestInit = {\n\t\t\tmethod: opts.method,\n\t\t\theaders,\n\t\t\tcredentials: 'include',\n\t\t};\n\t\tif (opts.body !== undefined) fetchInit.body = JSON.stringify(opts.body);\n\n\t\tconst res = await fetch(`${this.baseUrl}${opts.path}`, fetchInit);\n\n\t\t// 204 No Content (e.g. some DELETE routes) has no body to parse — a\n\t\t// bare `res.json()` throws on the empty string.\n\t\tif (res.status === 204) {\n\t\t\tif (!res.ok) throw new FonderieApiError('unknown', res.statusText, res.status);\n\t\t\treturn undefined as T;\n\t\t}\n\n\t\tconst data = (await res.json()) as T | IApiError;\n\n\t\tif (!res.ok || res.status === 202) {\n\t\t\tconst err = data as IApiError;\n\t\t\tthrow new FonderieApiError(err.reason, err.explanation, res.status, err.details);\n\t\t}\n\n\t\treturn data as T;\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type { IApiResponse, IAuditPageResult } from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface IListAuditEventsInput {\n\ttype?: string;\n\tactorId?: string;\n\tfrom?: Date;\n\tto?: Date;\n\tlimit?: number;\n\tcursor?: string;\n}\n\n// ── Audit client ─────────────────────────────────────────────────────────────\n\nexport class AuditClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes the audit query to a workspace (X-Workspace-ID). Falls back to\n\t// the caller's personal workspace when unset, same as billing/workspaces.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\tlistEvents(input: IListAuditEventsInput = {}) {\n\t\tconst params = new URLSearchParams();\n\t\tif (input.limit !== undefined) params.set('limit', String(input.limit));\n\t\tif (input.type) params.set('type', input.type);\n\t\tif (input.actorId) params.set('actorId', input.actorId);\n\t\tif (input.from) params.set('from', input.from.toISOString());\n\t\tif (input.to) params.set('to', input.to.toISOString());\n\t\tif (input.cursor) params.set('cursor', input.cursor);\n\t\tconst qs = params.toString();\n\n\t\treturn this.http.request<IApiResponse<IAuditPageResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/audit${qs ? `?${qs}` : ''}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIApiResponse,\n\tILoginResult,\n\tIMeResult,\n\tIMfaEnabledResult,\n\tIMfaSetupResult,\n\tIRefreshResult,\n\tIRegisterResult,\n\tIResendVerificationResult,\n\tIVerifyEmailResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface IRegisterInput {\n\temail: string;\n\tpassword: string;\n\tfirstName?: string;\n\tlastName?: string;\n}\n\nexport interface ILoginInput {\n\temail: string;\n\tpassword: string;\n}\n\nexport interface IResetPasswordInput {\n\t// The 6-digit code emailed by forgotPassword. Matches @fonderie/auth's\n\t// resetPasswordSchema ({ pin, password }); the route is POST /auth/email/reset.\n\tpin: string;\n\tpassword: string;\n}\n\n// User updates are split by @fonderie/auth into dedicated, individually\n// validated routes — there is no combined /users/update endpoint.\nexport interface IUpdateProfileInput {\n\tfirstName?: string;\n\tlastName?: string;\n\tavatarUrl?: string;\n}\n\nexport interface IUpdatePreferencesInput {\n\tlocale?: string;\n\ttimezone?: string;\n\tnotifications?: unknown;\n\temailDigest?: unknown;\n\tdateFormat?: unknown;\n\ttimeFormat?: unknown;\n}\n\nexport interface IChangePasswordInput {\n\tcurrentPassword: string;\n\tnewPassword: string;\n}\n\n// ── MFA sub-client ───────────────────────────────────────────────────────────\n\nclass MfaClient {\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate token: () => string | undefined,\n\t) {}\n\n\tsetup() {\n\t\treturn this.http.request<IApiResponse<IMfaSetupResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/setup',\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n\n\tverify(token: string) {\n\t\treturn this.http.request<IApiResponse<IMfaEnabledResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/verify',\n\t\t\tbody: { token },\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n\n\tdisable(token: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/disable',\n\t\t\tbody: { token },\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n\n\t// POST /auth/mfa/backup-codes (mfaTokenSchema { token }) — returns a fresh set.\n\tregenerateBackupCodes(token: string) {\n\t\treturn this.http.request<IApiResponse<{ backupCodes: string[] }>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/backup-codes',\n\t\t\tbody: { token },\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n}\n\n// ── Auth client ──────────────────────────────────────────────────────────────\n\nexport class AuthClient {\n\treadonly mfa: MfaClient;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {\n\t\tthis.mfa = new MfaClient(http, () => this.tokens.get());\n\t}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// ── Public ─────────────────────────────────────────────────────────────────\n\n\tregister(input: IRegisterInput) {\n\t\treturn this.http.request<IApiResponse<IRegisterResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/register',\n\t\t\tbody: input,\n\t\t});\n\t}\n\n\tlogin(input: ILoginInput) {\n\t\treturn this.http.request<IApiResponse<ILoginResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/login',\n\t\t\tbody: input,\n\t\t});\n\t}\n\n\trefreshTokens(refreshToken?: string) {\n\t\treturn this.http.request<IApiResponse<IRefreshResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/refresh',\n\t\t\tbody: refreshToken ? { refreshToken } : undefined,\n\t\t});\n\t}\n\n\tforgotPassword(email: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/email/forgot',\n\t\t\tbody: { email },\n\t\t});\n\t}\n\n\tresetPassword(input: IResetPasswordInput) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/email/reset',\n\t\t\tbody: input,\n\t\t});\n\t}\n\n\tverifyEmail(token: string) {\n\t\t// @fonderie/auth registers this as POST /auth/verify with body { token }\n\t\t// (verifySchema = { token: sixDigitPin }).\n\t\treturn this.http.request<IApiResponse<IVerifyEmailResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/verify',\n\t\t\tbody: { token },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Protected ──────────────────────────────────────────────────────────────\n\n\tlogout(refreshToken?: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/logout',\n\t\t\tbody: refreshToken ? { refreshToken } : undefined,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tsendVerificationEmail() {\n\t\t// @fonderie/auth registers this as GET /auth/send-verification (requireAuth).\n\t\treturn this.http.request<IApiResponse<IResendVerificationResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/auth/send-verification',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Protected + Verified ───────────────────────────────────────────────────\n\n\tgetUser() {\n\t\treturn this.http.request<IApiResponse<IMeResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/users',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdateProfile(input: IUpdateProfileInput) {\n\t\treturn this.http.request<IApiResponse<IMeResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/profile',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdatePreferences(input: IUpdatePreferencesInput) {\n\t\treturn this.http.request<IApiResponse<IMeResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/preferences',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdateEmail(email: string) {\n\t\treturn this.http.request<IApiResponse<unknown>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/email',\n\t\t\tbody: { email },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdatePhone(phone: string) {\n\t\treturn this.http.request<IApiResponse<unknown>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/phone',\n\t\t\tbody: { phone },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tchangePassword(input: IChangePasswordInput) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/password',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// GET /users/export — the caller's own data as a portable bundle (SAR).\n\texportData() {\n\t\treturn this.http.request<IApiResponse<unknown>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/users/export',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tdeleteUser() {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: '/users',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIApiResponse,\n\tICheckoutUrlResult,\n\tIPlanListResult,\n\tIPlanResult,\n\tIPortalUrlResult,\n\tISubscriptionResult,\n\tIUsageResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ICheckoutInput {\n\tplan: string;\n\tinterval?: 'month' | 'year';\n}\n\nexport interface IRecordUsageInput {\n\tmetric: string;\n\tquantity?: number;\n}\n\nexport interface ICreatePlanInput {\n\tname: string;\n\tdescription?: string | null;\n\ttier?: number;\n\tseats?: number | null;\n\ttrialDays?: number;\n\tmonthlyAmount?: number | null;\n\tmonthlyPriceId?: string | null;\n\tyearlyAmount?: number | null;\n\tyearlyPriceId?: string | null;\n\tfeatures?: unknown;\n\tmetadata?: unknown;\n}\n\nexport type IUpdatePlanInput = Partial<ICreatePlanInput>;\n\n// ── Billing client ───────────────────────────────────────────────────────────\n\nexport class BillingClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Subscriber is resolved from this workspace ID (X-Workspace-ID) when set,\n\t// falling back to the session user otherwise — see @fonderie/billing's\n\t// resolveSubscriber. Call with undefined to bill the signed-in user directly.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t// ── Plans — public read-only ────────────────────────────────────────────────\n\n\tlistPlans() {\n\t\treturn this.http.request<IApiResponse<IPlanListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/plans',\n\t\t});\n\t}\n\n\tgetPlan(planId: string) {\n\t\treturn this.http.request<IApiResponse<IPlanResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/plans/${planId}`,\n\t\t});\n\t}\n\n\t// ── Plans — admin write ──────────────────────────────────────────────────────\n\t// Unlike every other write in this client, @fonderie/billing does not gate\n\t// these with requireAuth or an admin token — \"the caller is responsible for\n\t// authorization\" (its own routes.ts comment). Sending the session token is\n\t// harmless (the server ignores it) but does nothing on its own; gate access\n\t// to these calls yourself (an app-level route guard, a reverse-proxy admin\n\t// zone, or similar) before wiring them into a UI.\n\n\tcreatePlan(input: ICreatePlanInput) {\n\t\treturn this.http.request<IApiResponse<IPlanResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/plans',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdatePlan(planId: string, input: IUpdatePlanInput) {\n\t\treturn this.http.request<IApiResponse<IPlanResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/plans/${planId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tdeletePlan(planId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/plans/${planId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Subscription ─────────────────────────────────────────────────────────────\n\n\tgetSubscription() {\n\t\treturn this.http.request<IApiResponse<ISubscriptionResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/billing/subscription',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Checkout / portal ────────────────────────────────────────────────────────\n\n\tcreateCheckoutSession(input: ICheckoutInput) {\n\t\treturn this.http.request<IApiResponse<ICheckoutUrlResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/billing/checkout',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreatePortalSession() {\n\t\treturn this.http.request<IApiResponse<IPortalUrlResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/billing/portal',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Usage ────────────────────────────────────────────────────────────────────\n\n\trecordUsage(input: IRecordUsageInput) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/billing/usage',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetUsage(metric: string) {\n\t\treturn this.http.request<IApiResponse<IUsageResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/billing/usage/${metric}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tCustomerLabelType,\n\tCustomerSex,\n\tCustomerType,\n\tIApiResponse,\n\tICustomerAddressListResult,\n\tICustomerAddressResult,\n\tICustomerDetailD2DTO,\n\tICustomerDetailDTO,\n\tICustomerEmailListResult,\n\tICustomerEmailResult,\n\tICustomerLabelListResult,\n\tICustomerListResult,\n\tICustomerNoteListResult,\n\tICustomerNoteResult,\n\tICustomerPhoneListResult,\n\tICustomerPhoneResult,\n\tICustomerRelationshipListResult,\n\tICustomerRelationshipResult,\n\tICustomerResult,\n\tICustomerTagListResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface IListCustomersInput {\n\tsearch?: string;\n\tblacklisted?: boolean;\n\tlimit?: number;\n\toffset?: number;\n}\n\nexport interface IGetCustomerInput {\n\tdepth?: 1 | 2;\n}\n\nexport interface ICreateCustomerInput {\n\ttype?: CustomerType;\n\tsex?: CustomerSex;\n\tfirstName?: string | null;\n\tlastName?: string | null;\n\tcompanyName?: string | null;\n\tavatarUrl?: string | null;\n\tlocale?: string | null;\n\treferenceCode?: string | null;\n\treferralCode?: string | null;\n\treferredByCode?: string | null;\n}\n\nexport type IUpdateCustomerInput = ICreateCustomerInput;\n\nexport interface IBlacklistCustomerInput {\n\treason?: string;\n}\n\nexport interface IAddEmailInput {\n\temail: string;\n\tlabel?: string;\n\tisPrimary?: boolean;\n}\n\nexport interface IAddPhoneInput {\n\tphone: string;\n\tlabel?: string;\n\tisPrimary?: boolean;\n}\n\nexport interface IAddAddressInput {\n\tcountryIso: string;\n\tzipPostalCode: string;\n\tsubdivision1Iso?: string | null;\n\tsubdivision2Iso?: string | null;\n\tunit?: string | null;\n\tline1?: string | null;\n\tline2?: string | null;\n\tlabel?: string;\n\tisPrimary?: boolean;\n}\n\nexport interface IAddRelationshipInput {\n\trelatedId: string;\n\trelationship?: string;\n\tisPrimary?: boolean;\n}\n\n// ── Customers client ─────────────────────────────────────────────────────────\n\nexport class CustomersClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes every request to this workspace (X-Workspace-ID). Falls back to\n\t// the caller's personal workspace when unset, same as billing/workspaces/audit/webhooks.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t// ── Core customer CRUD ───────────────────────────────────────────────────────\n\n\tlistCustomers(input: IListCustomersInput = {}) {\n\t\tconst params = new URLSearchParams();\n\t\tif (input.search !== undefined) params.set('search', input.search);\n\t\tif (input.blacklisted !== undefined) params.set('blacklisted', String(input.blacklisted));\n\t\tif (input.limit !== undefined) params.set('limit', String(input.limit));\n\t\tif (input.offset !== undefined) params.set('offset', String(input.offset));\n\t\tconst qs = params.toString();\n\n\t\treturn this.http.request<IApiResponse<ICustomerListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: qs ? `/customers?${qs}` : '/customers',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreateCustomer(input: ICreateCustomerInput = {}) {\n\t\treturn this.http.request<IApiResponse<ICustomerResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/customers',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// depth defaults to 2 server-side; pass { depth: 1 } for one level of\n\t// relationship expansion instead of the D2 (nested-relationships) shape.\n\tgetCustomer(customerId: string, input: IGetCustomerInput = {}) {\n\t\tconst qs = input.depth === 1 ? '?depth=1' : '';\n\t\treturn this.http.request<IApiResponse<ICustomerDetailDTO | ICustomerDetailD2DTO>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}${qs}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateCustomer(customerId: string, input: IUpdateCustomerInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tdeleteCustomer(customerId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tblacklistCustomer(customerId: string, input: IBlacklistCustomerInput = {}) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/blacklist`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tunblacklistCustomer(customerId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/unblacklist`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Emails ───────────────────────────────────────────────────────────────────\n\n\tlistEmails(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerEmailListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/emails`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddEmail(customerId: string, input: IAddEmailInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerEmailResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/emails`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Only the label is editable — email addresses themselves are immutable\n\t// once added; remove and re-add to change the address.\n\tupdateEmailLabel(customerId: string, emailId: string, label: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerEmailResult>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/customers/${customerId}/emails/${emailId}`,\n\t\t\tbody: { label },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryEmail(customerId: string, emailId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/emails/${emailId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveEmail(customerId: string, emailId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/emails/${emailId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Phones ───────────────────────────────────────────────────────────────────\n\n\tlistPhones(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerPhoneListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/phones`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddPhone(customerId: string, input: IAddPhoneInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerPhoneResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/phones`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Only the label is editable — same as updateEmailLabel.\n\tupdatePhoneLabel(customerId: string, phoneId: string, label: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerPhoneResult>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/customers/${customerId}/phones/${phoneId}`,\n\t\t\tbody: { label },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryPhone(customerId: string, phoneId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/phones/${phoneId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremovePhone(customerId: string, phoneId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/phones/${phoneId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Addresses ────────────────────────────────────────────────────────────────\n\n\tlistAddresses(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerAddressListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/addresses`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddAddress(customerId: string, input: IAddAddressInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerAddressResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/addresses`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Only the label is editable — same as updateEmailLabel.\n\tupdateAddressLabel(customerId: string, addrId: string, label: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerAddressResult>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/customers/${customerId}/addresses/${addrId}`,\n\t\t\tbody: { label },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryAddress(customerId: string, addrId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/addresses/${addrId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveAddress(customerId: string, addrId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/addresses/${addrId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Notes ────────────────────────────────────────────────────────────────────\n\n\tlistNotes(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerNoteListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/notes`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreateNote(customerId: string, body: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerNoteResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/notes`,\n\t\t\tbody: { body },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateNote(customerId: string, noteId: string, body: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerNoteResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/notes/${noteId}`,\n\t\t\tbody: { body },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tdeleteNote(customerId: string, noteId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/notes/${noteId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Tags ─────────────────────────────────────────────────────────────────────\n\n\tlistTags(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerTagListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/tags`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddTag(customerId: string, tag: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/tags`,\n\t\t\tbody: { tag },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveTag(customerId: string, tag: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/tags/${encodeURIComponent(tag)}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Relationships ────────────────────────────────────────────────────────────\n\n\tlistRelationships(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerRelationshipListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/relationships`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddRelationship(customerId: string, input: IAddRelationshipInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerRelationshipResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/relationships`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryRelationship(customerId: string, relatedId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/relationships/${relatedId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveRelationship(customerId: string, relatedId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/relationships/${relatedId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Labels ───────────────────────────────────────────────────────────────────\n\t// Shared vocabulary across all customers in the workspace — labels are\n\t// looked up/created implicitly by addEmail/addPhone/addAddress's `label`\n\t// string; these two methods are for managing the vocabulary directly\n\t// (e.g. an admin screen listing/pruning unused labels).\n\n\tlistLabels(type: CustomerLabelType) {\n\t\treturn this.http.request<IApiResponse<ICustomerLabelListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/labels?type=${type}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveLabel(labelId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/labels/${labelId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIApiResponse,\n\tITestWebhookResult,\n\tIWebhookDeliveryListResult,\n\tIWebhookEndpointCreatedDTO,\n\tIWebhookEndpointDTO,\n\tIWebhookEndpointListResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ICreateWebhookEndpointInput {\n\turl: string;\n\tevents?: string[];\n}\n\nexport interface IUpdateWebhookEndpointInput {\n\turl?: string;\n\tevents?: string[];\n\tenabled?: boolean;\n}\n\n// ── Webhooks client ──────────────────────────────────────────────────────────\n\nexport class WebhooksClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes every request to this workspace (X-Workspace-ID). Falls back to\n\t// the caller's personal workspace when unset, same as billing/workspaces/audit.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\tlistEndpoints() {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/webhooks',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// The response includes `secret` — shown once, at creation. There is no\n\t// way to retrieve it again afterward; store it or let the caller copy it.\n\tcreateEndpoint(input: ICreateWebhookEndpointInput) {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointCreatedDTO>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/webhooks',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetEndpoint(endpointId: string) {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointDTO>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/webhooks/${endpointId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateEndpoint(endpointId: string, input: IUpdateWebhookEndpointInput) {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointDTO>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/webhooks/${endpointId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tdeleteEndpoint(endpointId: string) {\n\t\treturn this.http.request<undefined>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/webhooks/${endpointId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tlistDeliveries(endpointId: string) {\n\t\treturn this.http.request<IApiResponse<IWebhookDeliveryListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/webhooks/${endpointId}/deliveries`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\ttestEndpoint(endpointId: string) {\n\t\treturn this.http.request<IApiResponse<ITestWebhookResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/webhooks/${endpointId}/test`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIAcceptInvitationResult,\n\tIApiResponse,\n\tIInvitationListResult,\n\tIInviteResult,\n\tIMemberListResult,\n\tIRoleListResult,\n\tIRoleResult,\n\tIWorkspaceListResult,\n\tIWorkspaceResult,\n\tIWorkspaceSettingsResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ICreateWorkspaceInput {\n\tname: string;\n\tdescription?: string;\n\ttype?: string;\n}\n\nexport interface IUpdateWorkspaceInput {\n\tname?: string;\n\tdescription?: string | null;\n\tmotto?: string | null;\n\tphone?: string | null;\n\tbusinessType?: string | null;\n\taddress?: {\n\t\tline1?: string;\n\t\tline2?: string;\n\t\tcity?: string;\n\t\tstate?: string;\n\t\tzip?: string;\n\t\tcountry?: string;\n\t} | null;\n}\n\nexport interface IInviteEntry {\n\temail: string;\n\troleId?: string;\n}\n\nexport interface IUpdateSettingsInput {\n\tlocale?: string;\n\ttimezone?: string;\n\tcurrency?: string;\n\tdateFormat?: string;\n\ttimeFormat?: string;\n}\n\nexport interface ICreateRoleInput {\n\tname: string;\n\tdescription?: string;\n}\n\nexport interface IUpdateRoleInput {\n\tname?: string;\n\tdescription?: string | null;\n\tactive?: boolean;\n}\n\nexport interface IRolePermissionInput {\n\tpermissionKey: string;\n\tcanCreate?: boolean;\n\tcanRead?: boolean;\n\tcanUpdate?: boolean;\n\tcanDelete?: boolean;\n}\n\nexport interface IRolePermission {\n\tpermissionKey: string;\n\tcanCreate: boolean;\n\tcanRead: boolean;\n\tcanUpdate: boolean;\n\tcanDelete: boolean;\n}\n\nexport interface IRolePermissionsResult {\n\tpermissions: IRolePermission[];\n}\n\n// ── Workspaces client ────────────────────────────────────────────────────────\n\nexport class WorkspacesClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes every subsequent request to this workspace (X-Workspace-ID).\n\t// Falls back to the caller's personal workspace when unset.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t// ── Workspace creation + listing ─────────────────────────────────────────────\n\n\tlistWorkspaces() {\n\t\treturn this.http.request<IApiResponse<IWorkspaceListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tcreateWorkspace(input: ICreateWorkspaceInput) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tgetWorkspace(id: string) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/${id}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdateWorkspace(input: IUpdateWorkspaceInput) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/workspaces',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Personal workspaces can't be archived — the server returns 403 if you try.\n\tarchiveWorkspace() {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/archive',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\trestoreWorkspace() {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/restore',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Roles ────────────────────────────────────────────────────────────────────\n\n\tlistRoles() {\n\t\treturn this.http.request<IApiResponse<IRoleListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/roles',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreateRole(input: ICreateRoleInput) {\n\t\treturn this.http.request<IApiResponse<IRoleResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/roles',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetRole(roleId: string) {\n\t\treturn this.http.request<IApiResponse<IRoleResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/roles/${roleId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateRole(roleId: string, input: IUpdateRoleInput) {\n\t\treturn this.http.request<IApiResponse<IRoleResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/workspaces/roles/${roleId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveRole(roleId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/roles/${roleId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetRolePermissions(roleId: string) {\n\t\treturn this.http.request<IApiResponse<IRolePermissionsResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/roles/${roleId}/permissions`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetRolePermissions(roleId: string, permissions: IRolePermissionInput[]) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/workspaces/roles/${roleId}/permissions`,\n\t\t\tbody: { permissions },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Members ──────────────────────────────────────────────────────────────────\n\n\tlistMembers() {\n\t\treturn this.http.request<IApiResponse<IMemberListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/members',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveMember(userId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/members/${userId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetMemberRoles(userId: string) {\n\t\treturn this.http.request<IApiResponse<IRoleListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/members/${userId}/roles`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddMemberRole(userId: string, roleId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/workspaces/members/${userId}/roles`,\n\t\t\tbody: { roleId },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveMemberRole(userId: string, roleId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/members/${userId}/roles/${roleId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Invitations ──────────────────────────────────────────────────────────────\n\n\tlistInvitations() {\n\t\treturn this.http.request<IApiResponse<IInvitationListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/invitations',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tinvite(entries: IInviteEntry | IInviteEntry[]) {\n\t\treturn this.http.request<IApiResponse<IInviteResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/invitations',\n\t\t\tbody: entries,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcancelInvitation(inviteId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/invitations/${inviteId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tacceptInvitation(pin: string) {\n\t\treturn this.http.request<IApiResponse<IAcceptInvitationResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/invitations/accept',\n\t\t\tbody: { pin },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Settings ─────────────────────────────────────────────────────────────────\n\n\tgetSettings() {\n\t\treturn this.http.request<IApiResponse<IWorkspaceSettingsResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/settings',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateSettings(input: IUpdateSettingsInput) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceSettingsResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/workspaces/settings',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","// Shared by every module of a FonderieClient so that setting the access\n// token on one (e.g. AuthClient after login) is immediately visible to all\n// the others (e.g. BillingClient) — they're separate module instances, but\n// one session.\nexport class TokenStore {\n\tprivate token: string | undefined;\n\n\tconstructor(initial?: string) {\n\t\tthis.token = initial;\n\t}\n\n\tget(): string | undefined {\n\t\treturn this.token;\n\t}\n\n\tset(token: string | undefined) {\n\t\tthis.token = token;\n\t}\n}\n","import { HttpClient } from './http';\nimport { AuditClient } from './modules/audit';\nimport { AuthClient } from './modules/auth';\nimport { BillingClient } from './modules/billing';\nimport { CustomersClient } from './modules/customers';\nimport { WebhooksClient } from './modules/webhooks';\nimport { WorkspacesClient } from './modules/workspaces';\nimport { TokenStore } from './token-store';\n\nexport interface IFonderieClientOptions {\n\tbaseUrl: string;\n\taccessToken?: string;\n}\n\nexport class FonderieClient {\n\treadonly auth: AuthClient;\n\treadonly billing: BillingClient;\n\treadonly workspaces: WorkspacesClient;\n\treadonly audit: AuditClient;\n\treadonly webhooks: WebhooksClient;\n\treadonly customers: CustomersClient;\n\n\tprivate http: HttpClient;\n\n\tconstructor(opts: IFonderieClientOptions) {\n\t\tthis.http = new HttpClient(opts.baseUrl);\n\t\tconst tokens = new TokenStore(opts.accessToken);\n\t\tthis.auth = new AuthClient(this.http, tokens);\n\t\tthis.billing = new BillingClient(this.http, tokens);\n\t\tthis.workspaces = new WorkspacesClient(this.http, tokens);\n\t\tthis.audit = new AuditClient(this.http, tokens);\n\t\tthis.webhooks = new WebhooksClient(this.http, tokens);\n\t\tthis.customers = new CustomersClient(this.http, tokens);\n\t}\n}\n","import { HttpClient } from '../http';\nimport type {\n\tIApiResponse,\n\tIConfigEntry,\n\tIConfigRevision,\n\tIRevealSecretResult,\n\tISecretEntry,\n\tISecretRevision,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ISetConfigInput {\n\tvalue: unknown;\n\tdescription?: string;\n\tifVersion?: number;\n}\n\nexport interface ISetSecretInput {\n\tvalue: string;\n\tdescription?: string;\n\tifVersion?: number;\n}\n\nexport interface IRollbackInput {\n\ttoVersion: number;\n}\n\nexport interface IConfigAdminClientOptions {\n\tbaseUrl: string;\n\tadminToken: string;\n}\n\nfunction envQuery(environment?: string): string {\n\treturn environment ? `?environment=${encodeURIComponent(environment)}` : '';\n}\n\n// ── Config admin client ──────────────────────────────────────────────────────\n//\n// Separate from FonderieClient on purpose, for the same reason as\n// CourierAdminClient: @fonderie/config's admin routes (/admin/config/*,\n// /admin/secrets/*) are guarded by a static bearer token configured on the\n// server, not the signed-in user's session. Construct with that token\n// directly; it shares no state with AuthClient/BillingClient/WorkspacesClient.\nexport class ConfigAdminClient {\n\tprivate http: HttpClient;\n\tprivate adminToken: string;\n\n\tconstructor(opts: IConfigAdminClientOptions) {\n\t\tthis.http = new HttpClient(opts.baseUrl);\n\t\tthis.adminToken = opts.adminToken;\n\t}\n\n\t// ── Config ───────────────────────────────────────────────────────────────\n\n\tlistConfig(environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/config${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tgetConfig(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/config/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tsetConfig(key: string, input: ISetConfigInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/admin/config/${key}${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tdeleteConfig(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/admin/config/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tlistConfigRevisions(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigRevision[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/config/${key}/revisions${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\trollbackConfig(key: string, input: IRollbackInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/config/${key}/rollback${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\t// ── Secrets (masked) ─────────────────────────────────────────────────────\n\n\tlistSecrets(environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/secrets${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tgetSecret(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/secrets/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tsetSecret(key: string, input: ISetSecretInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/admin/secrets/${key}${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tdeleteSecret(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/admin/secrets/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tlistSecretRevisions(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretRevision[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/secrets/${key}/revisions${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\trollbackSecret(key: string, input: IRollbackInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/secrets/${key}/rollback${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\t// POST (not GET) so the decrypted value never lands in a URL or access log.\n\trevealSecret(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IRevealSecretResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/secrets/${key}/reveal${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n}\n","import { HttpClient } from '../http';\nimport type { IApiResponse, ITemplateEntry, ITemplateRevision } from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ISetTemplateInput {\n\ttext: string;\n\tsubject?: string;\n\thtml?: string;\n\tactive?: boolean;\n\tifVersion?: number;\n}\n\nexport interface IRollbackTemplateInput {\n\ttoVersion: number;\n}\n\nexport interface ICourierAdminClientOptions {\n\tbaseUrl: string;\n\tadminToken: string;\n}\n\n// ── Courier admin client ─────────────────────────────────────────────────────\n//\n// Separate from FonderieClient on purpose: @fonderie/courier's admin routes\n// (/admin/templates/*) are guarded by a static bearer token configured on the\n// server (CourierModule's adminToken), not the signed-in user's session —\n// the same model @fonderie/config's admin surface uses, and the one the\n// `fonderie template`/`fonderie config` CLI commands already speak to via\n// FONDERIE_ADMIN_URL/FONDERIE_ADMIN_TOKEN. Bundling this into FonderieClient\n// would suggest an end-user's session token can reach it, which it can't —\n// this is an ops/admin-dashboard client, constructed with its own token.\nexport class CourierAdminClient {\n\tprivate http: HttpClient;\n\tprivate adminToken: string;\n\n\tconstructor(opts: ICourierAdminClientOptions) {\n\t\tthis.http = new HttpClient(opts.baseUrl);\n\t\tthis.adminToken = opts.adminToken;\n\t}\n\n\tlistTemplates() {\n\t\treturn this.http.request<IApiResponse<ITemplateEntry[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/admin/templates',\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tgetTemplate(type: string, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateEntry>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/templates/${type}${q}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tsetTemplate(type: string, input: ISetTemplateInput, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateEntry>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/admin/templates/${type}${q}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tdeleteTemplate(type: string, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/admin/templates/${type}${q}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tlistRevisions(type: string, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateRevision[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/templates/${type}/revisions${q}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\trollback(type: string, input: IRollbackTemplateInput, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateEntry>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/templates/${type}/rollback${q}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/http.ts","../src/modules/audit.ts","../src/modules/auth.ts","../src/modules/billing.ts","../src/modules/customers.ts","../src/modules/webhooks.ts","../src/modules/workspaces.ts","../src/token-store.ts","../src/client.ts","../src/modules/config-admin.ts","../src/modules/courier-admin.ts"],"sourcesContent":["export type { IFonderieClientOptions, IRequestConfig } from './client';\nexport { FonderieClient } from './client';\nexport { FonderieApiError } from './http';\nexport type { IListAuditEventsInput } from './modules/audit';\nexport { AuditClient } from './modules/audit';\nexport type {\n\tIChangePasswordInput,\n\tILoginInput,\n\tIRegisterInput,\n\tIResetPasswordInput,\n\tIUpdatePreferencesInput,\n\tIUpdateProfileInput,\n} from './modules/auth';\nexport { AuthClient } from './modules/auth';\nexport type {\n\tICheckoutInput,\n\tICreatePlanInput,\n\tIRecordUsageInput,\n\tIUpdatePlanInput,\n} from './modules/billing';\nexport { BillingClient } from './modules/billing';\nexport type {\n\tIConfigAdminClientOptions,\n\tIRollbackInput,\n\tISetConfigInput,\n\tISetSecretInput,\n} from './modules/config-admin';\nexport { ConfigAdminClient } from './modules/config-admin';\nexport type {\n\tICourierAdminClientOptions,\n\tIRollbackTemplateInput,\n\tISetTemplateInput,\n} from './modules/courier-admin';\nexport { CourierAdminClient } from './modules/courier-admin';\nexport type {\n\tIAddAddressInput,\n\tIAddEmailInput,\n\tIAddPhoneInput,\n\tIAddRelationshipInput,\n\tIBlacklistCustomerInput,\n\tICreateCustomerInput,\n\tIGetCustomerInput,\n\tIListCustomersInput,\n\tIUpdateCustomerInput,\n} from './modules/customers';\nexport { CustomersClient } from './modules/customers';\nexport type {\n\tICreateWebhookEndpointInput,\n\tIUpdateWebhookEndpointInput,\n} from './modules/webhooks';\nexport { WebhooksClient } from './modules/webhooks';\nexport type {\n\tICreateRoleInput,\n\tICreateWorkspaceInput,\n\tIInviteEntry,\n\tIRolePermission,\n\tIRolePermissionInput,\n\tIRolePermissionsResult,\n\tIUpdateRoleInput,\n\tIUpdateSettingsInput,\n\tIUpdateWorkspaceInput,\n} from './modules/workspaces';\nexport { WorkspacesClient } from './modules/workspaces';\nexport type {\n\tCustomerLabelType,\n\tCustomerSex,\n\tCustomerType,\n\tIAcceptInvitationResult,\n\tIAddressDTO,\n\tIApiError,\n\tIApiResponse,\n\tIAuditEventDTO,\n\tIAuditPageResult,\n\tICheckoutUrlResult,\n\tIConfigEntry,\n\tIConfigRevision,\n\tICustomerAddressDTO,\n\tICustomerAddressListResult,\n\tICustomerAddressResult,\n\tICustomerDetailD2DTO,\n\tICustomerDetailDTO,\n\tICustomerDTO,\n\tICustomerEmailDTO,\n\tICustomerEmailListResult,\n\tICustomerEmailResult,\n\tICustomerLabelDTO,\n\tICustomerLabelListResult,\n\tICustomerListResult,\n\tICustomerNoteDTO,\n\tICustomerNoteListResult,\n\tICustomerNoteResult,\n\tICustomerPhoneDTO,\n\tICustomerPhoneListResult,\n\tICustomerPhoneResult,\n\tICustomerRelationshipDTO,\n\tICustomerRelationshipExpandedD2DTO,\n\tICustomerRelationshipExpandedDTO,\n\tICustomerRelationshipListResult,\n\tICustomerRelationshipResult,\n\tICustomerResult,\n\tICustomerShallowDTO,\n\tICustomerTagListResult,\n\tIInvitationDTO,\n\tIInvitationListResult,\n\tIInviteResult,\n\tILoginResult,\n\tIMemberDTO,\n\tIMemberListResult,\n\tIMeResult,\n\tIMfaEnabledResult,\n\tIMfaSetupResult,\n\tIPlanDTO,\n\tIPlanFeature,\n\tIPlanListResult,\n\tIPlanResult,\n\tIPortalUrlResult,\n\tIRefreshResult,\n\tIRegisterResult,\n\tIResendVerificationResult,\n\tIRevealSecretResult,\n\tIRoleDTO,\n\tIRoleListResult,\n\tIRoleResult,\n\tISecretEntry,\n\tISecretRevision,\n\tISubscriptionDTO,\n\tISubscriptionResult,\n\tITemplateEntry,\n\tITemplateRevision,\n\tITestWebhookResult,\n\tITokens,\n\tIUsageResult,\n\tIUserDTO,\n\tIUserPreferences,\n\tIUserSkill,\n\tIVerifyEmailResult,\n\tIWebhookDeliveryDTO,\n\tIWebhookDeliveryListResult,\n\tIWebhookEndpointCreatedDTO,\n\tIWebhookEndpointDTO,\n\tIWebhookEndpointListResult,\n\tIWorkspaceAddressDTO,\n\tIWorkspaceDTO,\n\tIWorkspaceListResult,\n\tIWorkspaceResult,\n\tIWorkspaceSettingsDTO,\n\tIWorkspaceSettingsResult,\n\tSubscriberType,\n} from './types';\n","import type { IApiError } from './types';\n\nexport class FonderieApiError extends Error {\n\tconstructor(\n\t\tpublic readonly reason: string,\n\t\tpublic readonly explanation: string,\n\t\tpublic readonly status: number,\n\t\tpublic readonly details?: unknown,\n\t) {\n\t\tsuper(explanation);\n\t\tthis.name = 'FonderieApiError';\n\t}\n}\n\nexport interface IRequestOptions {\n\tmethod: string;\n\tpath: string;\n\tbody?: unknown;\n\ttoken?: string | undefined;\n\tcookie?: string | undefined;\n\t// Resolves the billing subscriber to a workspace (@fonderie/billing's\n\t// resolveSubscriber falls back to the session user when omitted).\n\tworkspaceId?: string | undefined;\n}\n\nexport class HttpClient {\n\tconstructor(private baseUrl: string) {}\n\n\tasync request<T>(opts: IRequestOptions): Promise<T> {\n\t\tconst headers: Record<string, string> = {\n\t\t\t'Content-Type': 'application/json',\n\t\t};\n\n\t\tif (opts.token) headers['Authorization'] = `Bearer ${opts.token}`;\n\t\tif (opts.cookie) headers['Cookie'] = opts.cookie;\n\t\tif (opts.workspaceId) headers['X-Workspace-ID'] = opts.workspaceId;\n\n\t\tconst fetchInit: RequestInit = {\n\t\t\tmethod: opts.method,\n\t\t\theaders,\n\t\t\tcredentials: 'include',\n\t\t};\n\t\tif (opts.body !== undefined) fetchInit.body = JSON.stringify(opts.body);\n\n\t\tconst res = await fetch(`${this.baseUrl}${opts.path}`, fetchInit);\n\n\t\t// 204 No Content (e.g. some DELETE routes) has no body to parse — a\n\t\t// bare `res.json()` throws on the empty string.\n\t\tif (res.status === 204) {\n\t\t\tif (!res.ok) throw new FonderieApiError('unknown', res.statusText, res.status);\n\t\t\treturn undefined as T;\n\t\t}\n\n\t\tconst data = (await res.json()) as T | IApiError;\n\n\t\tif (!res.ok || res.status === 202) {\n\t\t\tconst err = data as IApiError;\n\t\t\tthrow new FonderieApiError(err.reason, err.explanation, res.status, err.details);\n\t\t}\n\n\t\treturn data as T;\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type { IApiResponse, IAuditPageResult } from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface IListAuditEventsInput {\n\ttype?: string;\n\tactorId?: string;\n\tfrom?: Date;\n\tto?: Date;\n\tlimit?: number;\n\tcursor?: string;\n}\n\n// ── Audit client ─────────────────────────────────────────────────────────────\n\nexport class AuditClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes the audit query to a workspace (X-Workspace-ID). Falls back to\n\t// the caller's personal workspace when unset, same as billing/workspaces.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\tlistEvents(input: IListAuditEventsInput = {}) {\n\t\tconst params = new URLSearchParams();\n\t\tif (input.limit !== undefined) params.set('limit', String(input.limit));\n\t\tif (input.type) params.set('type', input.type);\n\t\tif (input.actorId) params.set('actorId', input.actorId);\n\t\tif (input.from) params.set('from', input.from.toISOString());\n\t\tif (input.to) params.set('to', input.to.toISOString());\n\t\tif (input.cursor) params.set('cursor', input.cursor);\n\t\tconst qs = params.toString();\n\n\t\treturn this.http.request<IApiResponse<IAuditPageResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/audit${qs ? `?${qs}` : ''}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIApiResponse,\n\tILoginResult,\n\tIMeResult,\n\tIMfaEnabledResult,\n\tIMfaSetupResult,\n\tIRefreshResult,\n\tIRegisterResult,\n\tIResendVerificationResult,\n\tIVerifyEmailResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface IRegisterInput {\n\temail: string;\n\tpassword: string;\n\tfirstName?: string;\n\tlastName?: string;\n}\n\nexport interface ILoginInput {\n\temail: string;\n\tpassword: string;\n}\n\nexport interface IResetPasswordInput {\n\t// The 6-digit code emailed by forgotPassword. Matches @fonderie/auth's\n\t// resetPasswordSchema ({ pin, password }); the route is POST /auth/email/reset.\n\tpin: string;\n\tpassword: string;\n}\n\n// User updates are split by @fonderie/auth into dedicated, individually\n// validated routes — there is no combined /users/update endpoint.\nexport interface IUpdateProfileInput {\n\tfirstName?: string;\n\tlastName?: string;\n\tavatarUrl?: string;\n}\n\nexport interface IUpdatePreferencesInput {\n\tlocale?: string;\n\ttimezone?: string;\n\tnotifications?: unknown;\n\temailDigest?: unknown;\n\tdateFormat?: unknown;\n\ttimeFormat?: unknown;\n}\n\nexport interface IChangePasswordInput {\n\tcurrentPassword: string;\n\tnewPassword: string;\n}\n\n// ── MFA sub-client ───────────────────────────────────────────────────────────\n\nclass MfaClient {\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate token: () => string | undefined,\n\t) {}\n\n\tsetup() {\n\t\treturn this.http.request<IApiResponse<IMfaSetupResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/setup',\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n\n\tverify(token: string) {\n\t\treturn this.http.request<IApiResponse<IMfaEnabledResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/verify',\n\t\t\tbody: { token },\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n\n\tdisable(token: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/disable',\n\t\t\tbody: { token },\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n\n\t// POST /auth/mfa/backup-codes (mfaTokenSchema { token }) — returns a fresh set.\n\tregenerateBackupCodes(token: string) {\n\t\treturn this.http.request<IApiResponse<{ backupCodes: string[] }>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/backup-codes',\n\t\t\tbody: { token },\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n}\n\n// ── Auth client ──────────────────────────────────────────────────────────────\n\nexport class AuthClient {\n\treadonly mfa: MfaClient;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {\n\t\tthis.mfa = new MfaClient(http, () => this.tokens.get());\n\t}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// ── Public ─────────────────────────────────────────────────────────────────\n\n\tregister(input: IRegisterInput) {\n\t\treturn this.http.request<IApiResponse<IRegisterResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/register',\n\t\t\tbody: input,\n\t\t});\n\t}\n\n\tlogin(input: ILoginInput) {\n\t\treturn this.http.request<IApiResponse<ILoginResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/login',\n\t\t\tbody: input,\n\t\t});\n\t}\n\n\trefreshTokens(refreshToken?: string) {\n\t\treturn this.http.request<IApiResponse<IRefreshResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/refresh',\n\t\t\tbody: refreshToken ? { refreshToken } : undefined,\n\t\t});\n\t}\n\n\tforgotPassword(email: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/email/forgot',\n\t\t\tbody: { email },\n\t\t});\n\t}\n\n\tresetPassword(input: IResetPasswordInput) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/email/reset',\n\t\t\tbody: input,\n\t\t});\n\t}\n\n\tverifyEmail(token: string) {\n\t\t// @fonderie/auth registers this as POST /auth/verify with body { token }\n\t\t// (verifySchema = { token: sixDigitPin }).\n\t\treturn this.http.request<IApiResponse<IVerifyEmailResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/verify',\n\t\t\tbody: { token },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Protected ──────────────────────────────────────────────────────────────\n\n\tlogout(refreshToken?: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/logout',\n\t\t\tbody: refreshToken ? { refreshToken } : undefined,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tsendVerificationEmail() {\n\t\t// @fonderie/auth registers this as GET /auth/send-verification (requireAuth).\n\t\treturn this.http.request<IApiResponse<IResendVerificationResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/auth/send-verification',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Protected + Verified ───────────────────────────────────────────────────\n\n\tgetUser() {\n\t\treturn this.http.request<IApiResponse<IMeResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/users',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdateProfile(input: IUpdateProfileInput) {\n\t\treturn this.http.request<IApiResponse<IMeResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/profile',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdatePreferences(input: IUpdatePreferencesInput) {\n\t\treturn this.http.request<IApiResponse<IMeResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/preferences',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdateEmail(email: string) {\n\t\treturn this.http.request<IApiResponse<unknown>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/email',\n\t\t\tbody: { email },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdatePhone(phone: string) {\n\t\treturn this.http.request<IApiResponse<unknown>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/phone',\n\t\t\tbody: { phone },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tchangePassword(input: IChangePasswordInput) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/password',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// GET /users/export — the caller's own data as a portable bundle (SAR).\n\texportData() {\n\t\treturn this.http.request<IApiResponse<unknown>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/users/export',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tdeleteUser() {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: '/users',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIApiResponse,\n\tICheckoutUrlResult,\n\tIPlanListResult,\n\tIPlanResult,\n\tIPortalUrlResult,\n\tISubscriptionResult,\n\tIUsageResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ICheckoutInput {\n\tplan: string;\n\tinterval?: 'month' | 'year';\n}\n\nexport interface IRecordUsageInput {\n\tmetric: string;\n\tquantity?: number;\n}\n\nexport interface ICreatePlanInput {\n\tname: string;\n\tdescription?: string | null;\n\ttier?: number;\n\tseats?: number | null;\n\ttrialDays?: number;\n\tmonthlyAmount?: number | null;\n\tmonthlyPriceId?: string | null;\n\tyearlyAmount?: number | null;\n\tyearlyPriceId?: string | null;\n\tfeatures?: unknown;\n\tmetadata?: unknown;\n}\n\nexport type IUpdatePlanInput = Partial<ICreatePlanInput>;\n\n// ── Billing client ───────────────────────────────────────────────────────────\n\nexport class BillingClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Subscriber is resolved from this workspace ID (X-Workspace-ID) when set,\n\t// falling back to the session user otherwise — see @fonderie/billing's\n\t// resolveSubscriber. Call with undefined to bill the signed-in user directly.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t// ── Plans — public read-only ────────────────────────────────────────────────\n\n\tlistPlans() {\n\t\treturn this.http.request<IApiResponse<IPlanListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/plans',\n\t\t});\n\t}\n\n\tgetPlan(planId: string) {\n\t\treturn this.http.request<IApiResponse<IPlanResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/plans/${planId}`,\n\t\t});\n\t}\n\n\t// ── Plans — admin write ──────────────────────────────────────────────────────\n\t// Unlike every other write in this client, @fonderie/billing does not gate\n\t// these with requireAuth or an admin token — \"the caller is responsible for\n\t// authorization\" (its own routes.ts comment). Sending the session token is\n\t// harmless (the server ignores it) but does nothing on its own; gate access\n\t// to these calls yourself (an app-level route guard, a reverse-proxy admin\n\t// zone, or similar) before wiring them into a UI.\n\n\tcreatePlan(input: ICreatePlanInput) {\n\t\treturn this.http.request<IApiResponse<IPlanResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/plans',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdatePlan(planId: string, input: IUpdatePlanInput) {\n\t\treturn this.http.request<IApiResponse<IPlanResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/plans/${planId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tdeletePlan(planId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/plans/${planId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Subscription ─────────────────────────────────────────────────────────────\n\n\tgetSubscription() {\n\t\treturn this.http.request<IApiResponse<ISubscriptionResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/billing/subscription',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Checkout / portal ────────────────────────────────────────────────────────\n\n\tcreateCheckoutSession(input: ICheckoutInput) {\n\t\treturn this.http.request<IApiResponse<ICheckoutUrlResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/billing/checkout',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreatePortalSession() {\n\t\treturn this.http.request<IApiResponse<IPortalUrlResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/billing/portal',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Usage ────────────────────────────────────────────────────────────────────\n\n\trecordUsage(input: IRecordUsageInput) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/billing/usage',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetUsage(metric: string) {\n\t\treturn this.http.request<IApiResponse<IUsageResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/billing/usage/${metric}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tCustomerLabelType,\n\tCustomerSex,\n\tCustomerType,\n\tIApiResponse,\n\tICustomerAddressListResult,\n\tICustomerAddressResult,\n\tICustomerDetailD2DTO,\n\tICustomerDetailDTO,\n\tICustomerEmailListResult,\n\tICustomerEmailResult,\n\tICustomerLabelListResult,\n\tICustomerListResult,\n\tICustomerNoteListResult,\n\tICustomerNoteResult,\n\tICustomerPhoneListResult,\n\tICustomerPhoneResult,\n\tICustomerRelationshipListResult,\n\tICustomerRelationshipResult,\n\tICustomerResult,\n\tICustomerTagListResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface IListCustomersInput {\n\tsearch?: string;\n\tblacklisted?: boolean;\n\tlimit?: number;\n\toffset?: number;\n}\n\nexport interface IGetCustomerInput {\n\tdepth?: 1 | 2;\n}\n\nexport interface ICreateCustomerInput {\n\ttype?: CustomerType;\n\tsex?: CustomerSex;\n\tfirstName?: string | null;\n\tlastName?: string | null;\n\tcompanyName?: string | null;\n\tavatarUrl?: string | null;\n\tlocale?: string | null;\n\treferenceCode?: string | null;\n\treferralCode?: string | null;\n\treferredByCode?: string | null;\n}\n\nexport type IUpdateCustomerInput = ICreateCustomerInput;\n\nexport interface IBlacklistCustomerInput {\n\treason?: string;\n}\n\nexport interface IAddEmailInput {\n\temail: string;\n\tlabel?: string;\n\tisPrimary?: boolean;\n}\n\nexport interface IAddPhoneInput {\n\tphone: string;\n\tlabel?: string;\n\tisPrimary?: boolean;\n}\n\nexport interface IAddAddressInput {\n\tcountryIso: string;\n\tzipPostalCode: string;\n\tsubdivision1Iso?: string | null;\n\tsubdivision2Iso?: string | null;\n\tunit?: string | null;\n\tline1?: string | null;\n\tline2?: string | null;\n\tlabel?: string;\n\tisPrimary?: boolean;\n}\n\nexport interface IAddRelationshipInput {\n\trelatedId: string;\n\trelationship?: string;\n\tisPrimary?: boolean;\n}\n\n// ── Customers client ─────────────────────────────────────────────────────────\n\nexport class CustomersClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes every request to this workspace (X-Workspace-ID). Falls back to\n\t// the caller's personal workspace when unset, same as billing/workspaces/audit/webhooks.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t// ── Core customer CRUD ───────────────────────────────────────────────────────\n\n\tlistCustomers(input: IListCustomersInput = {}) {\n\t\tconst params = new URLSearchParams();\n\t\tif (input.search !== undefined) params.set('search', input.search);\n\t\tif (input.blacklisted !== undefined) params.set('blacklisted', String(input.blacklisted));\n\t\tif (input.limit !== undefined) params.set('limit', String(input.limit));\n\t\tif (input.offset !== undefined) params.set('offset', String(input.offset));\n\t\tconst qs = params.toString();\n\n\t\treturn this.http.request<IApiResponse<ICustomerListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: qs ? `/customers?${qs}` : '/customers',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreateCustomer(input: ICreateCustomerInput = {}) {\n\t\treturn this.http.request<IApiResponse<ICustomerResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/customers',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// depth defaults to 2 server-side; pass { depth: 1 } for one level of\n\t// relationship expansion instead of the D2 (nested-relationships) shape.\n\tgetCustomer(customerId: string, input: IGetCustomerInput = {}) {\n\t\tconst qs = input.depth === 1 ? '?depth=1' : '';\n\t\treturn this.http.request<IApiResponse<ICustomerDetailDTO | ICustomerDetailD2DTO>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}${qs}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateCustomer(customerId: string, input: IUpdateCustomerInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tdeleteCustomer(customerId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tblacklistCustomer(customerId: string, input: IBlacklistCustomerInput = {}) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/blacklist`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tunblacklistCustomer(customerId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/unblacklist`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Emails ───────────────────────────────────────────────────────────────────\n\n\tlistEmails(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerEmailListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/emails`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddEmail(customerId: string, input: IAddEmailInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerEmailResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/emails`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Only the label is editable — email addresses themselves are immutable\n\t// once added; remove and re-add to change the address.\n\tupdateEmailLabel(customerId: string, emailId: string, label: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerEmailResult>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/customers/${customerId}/emails/${emailId}`,\n\t\t\tbody: { label },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryEmail(customerId: string, emailId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/emails/${emailId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveEmail(customerId: string, emailId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/emails/${emailId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Phones ───────────────────────────────────────────────────────────────────\n\n\tlistPhones(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerPhoneListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/phones`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddPhone(customerId: string, input: IAddPhoneInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerPhoneResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/phones`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Only the label is editable — same as updateEmailLabel.\n\tupdatePhoneLabel(customerId: string, phoneId: string, label: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerPhoneResult>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/customers/${customerId}/phones/${phoneId}`,\n\t\t\tbody: { label },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryPhone(customerId: string, phoneId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/phones/${phoneId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremovePhone(customerId: string, phoneId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/phones/${phoneId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Addresses ────────────────────────────────────────────────────────────────\n\n\tlistAddresses(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerAddressListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/addresses`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddAddress(customerId: string, input: IAddAddressInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerAddressResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/addresses`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Only the label is editable — same as updateEmailLabel.\n\tupdateAddressLabel(customerId: string, addrId: string, label: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerAddressResult>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/customers/${customerId}/addresses/${addrId}`,\n\t\t\tbody: { label },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryAddress(customerId: string, addrId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/addresses/${addrId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveAddress(customerId: string, addrId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/addresses/${addrId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Notes ────────────────────────────────────────────────────────────────────\n\n\tlistNotes(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerNoteListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/notes`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreateNote(customerId: string, body: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerNoteResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/notes`,\n\t\t\tbody: { body },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateNote(customerId: string, noteId: string, body: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerNoteResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/notes/${noteId}`,\n\t\t\tbody: { body },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tdeleteNote(customerId: string, noteId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/notes/${noteId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Tags ─────────────────────────────────────────────────────────────────────\n\n\tlistTags(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerTagListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/tags`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddTag(customerId: string, tag: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/tags`,\n\t\t\tbody: { tag },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveTag(customerId: string, tag: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/tags/${encodeURIComponent(tag)}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Relationships ────────────────────────────────────────────────────────────\n\n\tlistRelationships(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerRelationshipListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/relationships`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddRelationship(customerId: string, input: IAddRelationshipInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerRelationshipResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/relationships`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryRelationship(customerId: string, relatedId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/relationships/${relatedId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveRelationship(customerId: string, relatedId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/relationships/${relatedId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Labels ───────────────────────────────────────────────────────────────────\n\t// Shared vocabulary across all customers in the workspace — labels are\n\t// looked up/created implicitly by addEmail/addPhone/addAddress's `label`\n\t// string; these two methods are for managing the vocabulary directly\n\t// (e.g. an admin screen listing/pruning unused labels).\n\n\tlistLabels(type: CustomerLabelType) {\n\t\treturn this.http.request<IApiResponse<ICustomerLabelListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/labels?type=${type}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveLabel(labelId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/labels/${labelId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIApiResponse,\n\tITestWebhookResult,\n\tIWebhookDeliveryListResult,\n\tIWebhookEndpointCreatedDTO,\n\tIWebhookEndpointDTO,\n\tIWebhookEndpointListResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ICreateWebhookEndpointInput {\n\turl: string;\n\tevents?: string[];\n}\n\nexport interface IUpdateWebhookEndpointInput {\n\turl?: string;\n\tevents?: string[];\n\tenabled?: boolean;\n}\n\n// ── Webhooks client ──────────────────────────────────────────────────────────\n\nexport class WebhooksClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes every request to this workspace (X-Workspace-ID). Falls back to\n\t// the caller's personal workspace when unset, same as billing/workspaces/audit.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\tlistEndpoints() {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/webhooks',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// The response includes `secret` — shown once, at creation. There is no\n\t// way to retrieve it again afterward; store it or let the caller copy it.\n\tcreateEndpoint(input: ICreateWebhookEndpointInput) {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointCreatedDTO>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/webhooks',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetEndpoint(endpointId: string) {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointDTO>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/webhooks/${endpointId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateEndpoint(endpointId: string, input: IUpdateWebhookEndpointInput) {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointDTO>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/webhooks/${endpointId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tdeleteEndpoint(endpointId: string) {\n\t\treturn this.http.request<undefined>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/webhooks/${endpointId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tlistDeliveries(endpointId: string) {\n\t\treturn this.http.request<IApiResponse<IWebhookDeliveryListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/webhooks/${endpointId}/deliveries`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\ttestEndpoint(endpointId: string) {\n\t\treturn this.http.request<IApiResponse<ITestWebhookResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/webhooks/${endpointId}/test`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIAcceptInvitationResult,\n\tIApiResponse,\n\tIInvitationListResult,\n\tIInviteResult,\n\tIMemberListResult,\n\tIRoleListResult,\n\tIRoleResult,\n\tIWorkspaceListResult,\n\tIWorkspaceResult,\n\tIWorkspaceSettingsResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ICreateWorkspaceInput {\n\tname: string;\n\tdescription?: string;\n\ttype?: string;\n}\n\nexport interface IUpdateWorkspaceInput {\n\tname?: string;\n\tdescription?: string | null;\n\tmotto?: string | null;\n\tphone?: string | null;\n\tbusinessType?: string | null;\n\taddress?: {\n\t\tline1?: string;\n\t\tline2?: string;\n\t\tcity?: string;\n\t\tstate?: string;\n\t\tzip?: string;\n\t\tcountry?: string;\n\t} | null;\n}\n\nexport interface IInviteEntry {\n\temail: string;\n\troleId?: string;\n}\n\nexport interface IUpdateSettingsInput {\n\tlocale?: string;\n\ttimezone?: string;\n\tcurrency?: string;\n\tdateFormat?: string;\n\ttimeFormat?: string;\n}\n\nexport interface ICreateRoleInput {\n\tname: string;\n\tdescription?: string;\n}\n\nexport interface IUpdateRoleInput {\n\tname?: string;\n\tdescription?: string | null;\n\tactive?: boolean;\n}\n\nexport interface IRolePermissionInput {\n\tpermissionKey: string;\n\tcanCreate?: boolean;\n\tcanRead?: boolean;\n\tcanUpdate?: boolean;\n\tcanDelete?: boolean;\n}\n\nexport interface IRolePermission {\n\tpermissionKey: string;\n\tcanCreate: boolean;\n\tcanRead: boolean;\n\tcanUpdate: boolean;\n\tcanDelete: boolean;\n}\n\nexport interface IRolePermissionsResult {\n\tpermissions: IRolePermission[];\n}\n\n// ── Workspaces client ────────────────────────────────────────────────────────\n\nexport class WorkspacesClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes every subsequent request to this workspace (X-Workspace-ID).\n\t// Falls back to the caller's personal workspace when unset.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t// ── Workspace creation + listing ─────────────────────────────────────────────\n\n\tlistWorkspaces() {\n\t\treturn this.http.request<IApiResponse<IWorkspaceListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tcreateWorkspace(input: ICreateWorkspaceInput) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tgetWorkspace(id: string) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/${id}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdateWorkspace(input: IUpdateWorkspaceInput) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/workspaces',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Personal workspaces can't be archived — the server returns 403 if you try.\n\tarchiveWorkspace() {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/archive',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\trestoreWorkspace() {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/restore',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Roles ────────────────────────────────────────────────────────────────────\n\n\tlistRoles() {\n\t\treturn this.http.request<IApiResponse<IRoleListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/roles',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreateRole(input: ICreateRoleInput) {\n\t\treturn this.http.request<IApiResponse<IRoleResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/roles',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetRole(roleId: string) {\n\t\treturn this.http.request<IApiResponse<IRoleResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/roles/${roleId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateRole(roleId: string, input: IUpdateRoleInput) {\n\t\treturn this.http.request<IApiResponse<IRoleResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/workspaces/roles/${roleId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveRole(roleId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/roles/${roleId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetRolePermissions(roleId: string) {\n\t\treturn this.http.request<IApiResponse<IRolePermissionsResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/roles/${roleId}/permissions`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetRolePermissions(roleId: string, permissions: IRolePermissionInput[]) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/workspaces/roles/${roleId}/permissions`,\n\t\t\tbody: { permissions },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Members ──────────────────────────────────────────────────────────────────\n\n\tlistMembers() {\n\t\treturn this.http.request<IApiResponse<IMemberListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/members',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveMember(userId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/members/${userId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetMemberRoles(userId: string) {\n\t\treturn this.http.request<IApiResponse<IRoleListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/members/${userId}/roles`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddMemberRole(userId: string, roleId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/workspaces/members/${userId}/roles`,\n\t\t\tbody: { roleId },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveMemberRole(userId: string, roleId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/members/${userId}/roles/${roleId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Invitations ──────────────────────────────────────────────────────────────\n\n\tlistInvitations() {\n\t\treturn this.http.request<IApiResponse<IInvitationListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/invitations',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tinvite(entries: IInviteEntry | IInviteEntry[]) {\n\t\treturn this.http.request<IApiResponse<IInviteResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/invitations',\n\t\t\tbody: entries,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcancelInvitation(inviteId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/invitations/${inviteId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tacceptInvitation(pin: string) {\n\t\treturn this.http.request<IApiResponse<IAcceptInvitationResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/invitations/accept',\n\t\t\tbody: { pin },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Settings ─────────────────────────────────────────────────────────────────\n\n\tgetSettings() {\n\t\treturn this.http.request<IApiResponse<IWorkspaceSettingsResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/settings',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateSettings(input: IUpdateSettingsInput) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceSettingsResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/workspaces/settings',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","// Shared by every module of a FonderieClient so that setting the access\n// token on one (e.g. AuthClient after login) is immediately visible to all\n// the others (e.g. BillingClient) — they're separate module instances, but\n// one session.\nexport class TokenStore {\n\tprivate token: string | undefined;\n\n\tconstructor(initial?: string) {\n\t\tthis.token = initial;\n\t}\n\n\tget(): string | undefined {\n\t\treturn this.token;\n\t}\n\n\tset(token: string | undefined) {\n\t\tthis.token = token;\n\t}\n}\n","import { HttpClient } from './http';\nimport { AuditClient } from './modules/audit';\nimport { AuthClient } from './modules/auth';\nimport { BillingClient } from './modules/billing';\nimport { CustomersClient } from './modules/customers';\nimport { WebhooksClient } from './modules/webhooks';\nimport { WorkspacesClient } from './modules/workspaces';\nimport { TokenStore } from './token-store';\nimport type { IApiResponse } from './types';\n\nexport interface IFonderieClientOptions {\n\tbaseUrl: string;\n\taccessToken?: string;\n\tworkspaceId?: string;\n}\n\n// Per-call options for the generic transport. `workspaceId` overrides the\n// client-level default for a single request.\nexport interface IRequestConfig {\n\tworkspaceId?: string;\n}\n\nexport class FonderieClient {\n\treadonly auth: AuthClient;\n\treadonly billing: BillingClient;\n\treadonly workspaces: WorkspacesClient;\n\treadonly audit: AuditClient;\n\treadonly webhooks: WebhooksClient;\n\treadonly customers: CustomersClient;\n\n\tprivate http: HttpClient;\n\tprivate tokens: TokenStore;\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(opts: IFonderieClientOptions) {\n\t\tthis.http = new HttpClient(opts.baseUrl);\n\t\tthis.tokens = new TokenStore(opts.accessToken);\n\t\tthis.workspaceId = opts.workspaceId;\n\t\tthis.auth = new AuthClient(this.http, this.tokens);\n\t\tthis.billing = new BillingClient(this.http, this.tokens);\n\t\tthis.workspaces = new WorkspacesClient(this.http, this.tokens);\n\t\tthis.audit = new AuditClient(this.http, this.tokens);\n\t\tthis.webhooks = new WebhooksClient(this.http, this.tokens);\n\t\tthis.customers = new CustomersClient(this.http, this.tokens);\n\t}\n\n\t// The JWT used to authenticate every request — the typed modules and the\n\t// generic transport share one token store. Pass undefined to sign out.\n\tsetAccessToken(token: string | undefined): void {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Default X-Workspace-ID for the generic transport, also propagated to the\n\t// workspace-scoped modules so one call configures the whole client.\n\tsetWorkspaceId(workspaceId: string | undefined): void {\n\t\tthis.workspaceId = workspaceId;\n\t\tthis.billing.setWorkspaceId(workspaceId);\n\t\tthis.workspaces.setWorkspaceId(workspaceId);\n\t\tthis.customers.setWorkspaceId(workspaceId);\n\t}\n\n\t// ── Generic transport ──────────────────────────────────────────────────────\n\t// A Fonderie-aware HTTP client for endpoints outside the typed modules (an\n\t// app's own routes on the same backend). It attaches the shared JWT and\n\t// X-Workspace-ID automatically and returns Fonderie's { reason, explanation,\n\t// result } envelope — so you don't hand-roll auth for custom endpoints.\n\n\trequest<T = unknown>(opts: {\n\t\tmethod: string;\n\t\tpath: string;\n\t\tbody?: unknown;\n\t\tworkspaceId?: string | undefined;\n\t}): Promise<IApiResponse<T>> {\n\t\treturn this.http.request<IApiResponse<T>>({\n\t\t\tmethod: opts.method,\n\t\t\tpath: opts.path,\n\t\t\tbody: opts.body,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: opts.workspaceId ?? this.workspaceId,\n\t\t});\n\t}\n\n\tget<T = unknown>(path: string, config?: IRequestConfig): Promise<IApiResponse<T>> {\n\t\treturn this.request<T>({ method: 'GET', path, workspaceId: config?.workspaceId });\n\t}\n\n\tpost<T = unknown>(path: string, body?: unknown, config?: IRequestConfig): Promise<IApiResponse<T>> {\n\t\treturn this.request<T>({ method: 'POST', path, body, workspaceId: config?.workspaceId });\n\t}\n\n\tput<T = unknown>(path: string, body?: unknown, config?: IRequestConfig): Promise<IApiResponse<T>> {\n\t\treturn this.request<T>({ method: 'PUT', path, body, workspaceId: config?.workspaceId });\n\t}\n\n\tpatch<T = unknown>(path: string, body?: unknown, config?: IRequestConfig): Promise<IApiResponse<T>> {\n\t\treturn this.request<T>({ method: 'PATCH', path, body, workspaceId: config?.workspaceId });\n\t}\n\n\tdelete<T = unknown>(path: string, config?: IRequestConfig): Promise<IApiResponse<T>> {\n\t\treturn this.request<T>({ method: 'DELETE', path, workspaceId: config?.workspaceId });\n\t}\n}\n","import { HttpClient } from '../http';\nimport type {\n\tIApiResponse,\n\tIConfigEntry,\n\tIConfigRevision,\n\tIRevealSecretResult,\n\tISecretEntry,\n\tISecretRevision,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ISetConfigInput {\n\tvalue: unknown;\n\tdescription?: string;\n\tifVersion?: number;\n}\n\nexport interface ISetSecretInput {\n\tvalue: string;\n\tdescription?: string;\n\tifVersion?: number;\n}\n\nexport interface IRollbackInput {\n\ttoVersion: number;\n}\n\nexport interface IConfigAdminClientOptions {\n\tbaseUrl: string;\n\tadminToken: string;\n}\n\nfunction envQuery(environment?: string): string {\n\treturn environment ? `?environment=${encodeURIComponent(environment)}` : '';\n}\n\n// ── Config admin client ──────────────────────────────────────────────────────\n//\n// Separate from FonderieClient on purpose, for the same reason as\n// CourierAdminClient: @fonderie/config's admin routes (/admin/config/*,\n// /admin/secrets/*) are guarded by a static bearer token configured on the\n// server, not the signed-in user's session. Construct with that token\n// directly; it shares no state with AuthClient/BillingClient/WorkspacesClient.\nexport class ConfigAdminClient {\n\tprivate http: HttpClient;\n\tprivate adminToken: string;\n\n\tconstructor(opts: IConfigAdminClientOptions) {\n\t\tthis.http = new HttpClient(opts.baseUrl);\n\t\tthis.adminToken = opts.adminToken;\n\t}\n\n\t// ── Config ───────────────────────────────────────────────────────────────\n\n\tlistConfig(environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/config${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tgetConfig(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/config/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tsetConfig(key: string, input: ISetConfigInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/admin/config/${key}${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tdeleteConfig(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/admin/config/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tlistConfigRevisions(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigRevision[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/config/${key}/revisions${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\trollbackConfig(key: string, input: IRollbackInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/config/${key}/rollback${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\t// ── Secrets (masked) ─────────────────────────────────────────────────────\n\n\tlistSecrets(environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/secrets${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tgetSecret(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/secrets/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tsetSecret(key: string, input: ISetSecretInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/admin/secrets/${key}${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tdeleteSecret(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/admin/secrets/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tlistSecretRevisions(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretRevision[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/secrets/${key}/revisions${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\trollbackSecret(key: string, input: IRollbackInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/secrets/${key}/rollback${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\t// POST (not GET) so the decrypted value never lands in a URL or access log.\n\trevealSecret(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IRevealSecretResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/secrets/${key}/reveal${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n}\n","import { HttpClient } from '../http';\nimport type { IApiResponse, ITemplateEntry, ITemplateRevision } from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ISetTemplateInput {\n\ttext: string;\n\tsubject?: string;\n\thtml?: string;\n\tactive?: boolean;\n\tifVersion?: number;\n}\n\nexport interface IRollbackTemplateInput {\n\ttoVersion: number;\n}\n\nexport interface ICourierAdminClientOptions {\n\tbaseUrl: string;\n\tadminToken: string;\n}\n\n// ── Courier admin client ─────────────────────────────────────────────────────\n//\n// Separate from FonderieClient on purpose: @fonderie/courier's admin routes\n// (/admin/templates/*) are guarded by a static bearer token configured on the\n// server (CourierModule's adminToken), not the signed-in user's session —\n// the same model @fonderie/config's admin surface uses, and the one the\n// `fonderie template`/`fonderie config` CLI commands already speak to via\n// FONDERIE_ADMIN_URL/FONDERIE_ADMIN_TOKEN. Bundling this into FonderieClient\n// would suggest an end-user's session token can reach it, which it can't —\n// this is an ops/admin-dashboard client, constructed with its own token.\nexport class CourierAdminClient {\n\tprivate http: HttpClient;\n\tprivate adminToken: string;\n\n\tconstructor(opts: ICourierAdminClientOptions) {\n\t\tthis.http = new HttpClient(opts.baseUrl);\n\t\tthis.adminToken = opts.adminToken;\n\t}\n\n\tlistTemplates() {\n\t\treturn this.http.request<IApiResponse<ITemplateEntry[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/admin/templates',\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tgetTemplate(type: string, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateEntry>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/templates/${type}${q}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tsetTemplate(type: string, input: ISetTemplateInput, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateEntry>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/admin/templates/${type}${q}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tdeleteTemplate(type: string, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/admin/templates/${type}${q}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tlistRevisions(type: string, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateRevision[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/templates/${type}/revisions${q}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\trollback(type: string, input: IRollbackTemplateInput, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateEntry>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/templates/${type}/rollback${q}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC3C,YACiB,QACA,aACA,QACA,SACf;AACD,UAAM,WAAW;AALD;AACA;AACA;AACA;AAGhB,SAAK,OAAO;AAAA,EACb;AAAA,EAPiB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAKlB;AAaO,IAAM,aAAN,MAAiB;AAAA,EACvB,YAAoB,SAAiB;AAAjB;AAAA,EAAkB;AAAA,EAAlB;AAAA,EAEpB,MAAM,QAAW,MAAmC;AACnD,UAAM,UAAkC;AAAA,MACvC,gBAAgB;AAAA,IACjB;AAEA,QAAI,KAAK,MAAO,SAAQ,eAAe,IAAI,UAAU,KAAK,KAAK;AAC/D,QAAI,KAAK,OAAQ,SAAQ,QAAQ,IAAI,KAAK;AAC1C,QAAI,KAAK,YAAa,SAAQ,gBAAgB,IAAI,KAAK;AAEvD,UAAM,YAAyB;AAAA,MAC9B,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,aAAa;AAAA,IACd;AACA,QAAI,KAAK,SAAS,OAAW,WAAU,OAAO,KAAK,UAAU,KAAK,IAAI;AAEtE,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,KAAK,IAAI,IAAI,SAAS;AAIhE,QAAI,IAAI,WAAW,KAAK;AACvB,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,iBAAiB,WAAW,IAAI,YAAY,IAAI,MAAM;AAC7E,aAAO;AAAA,IACR;AAEA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAE7B,QAAI,CAAC,IAAI,MAAM,IAAI,WAAW,KAAK;AAClC,YAAM,MAAM;AACZ,YAAM,IAAI,iBAAiB,IAAI,QAAQ,IAAI,aAAa,IAAI,QAAQ,IAAI,OAAO;AAAA,IAChF;AAEA,WAAO;AAAA,EACR;AACD;;;AC7CO,IAAM,cAAN,MAAkB;AAAA,EAGxB,YACS,MACA,QACP;AAFO;AACA;AAAA,EACN;AAAA,EAFM;AAAA,EACA;AAAA,EAJD;AAAA,EAOR,eAAe,OAA2B;AACzC,SAAK,OAAO,IAAI,KAAK;AAAA,EACtB;AAAA;AAAA;AAAA,EAIA,eAAe,aAAiC;AAC/C,SAAK,cAAc;AAAA,EACpB;AAAA,EAEA,WAAW,QAA+B,CAAC,GAAG;AAC7C,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,MAAM,KAAK,CAAC;AACtE,QAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,MAAM,IAAI;AAC7C,QAAI,MAAM,QAAS,QAAO,IAAI,WAAW,MAAM,OAAO;AACtD,QAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,MAAM,KAAK,YAAY,CAAC;AAC3D,QAAI,MAAM,GAAI,QAAO,IAAI,MAAM,MAAM,GAAG,YAAY,CAAC;AACrD,QAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,MAAM,MAAM;AACnD,UAAM,KAAK,OAAO,SAAS;AAE3B,WAAO,KAAK,KAAK,QAAwC;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM,SAAS,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,MACjC,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AACD;;;ACOA,IAAM,YAAN,MAAgB;AAAA,EACf,YACS,MACA,OACP;AAFO;AACA;AAAA,EACN;AAAA,EAFM;AAAA,EACA;AAAA,EAGT,QAAQ;AACP,WAAO,KAAK,KAAK,QAAuC;AAAA,MACvD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,MAAM;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,OAAO,OAAe;AACrB,WAAO,KAAK,KAAK,QAAyC;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE,MAAM;AAAA,MACd,OAAO,KAAK,MAAM;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,QAAQ,OAAe;AACtB,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE,MAAM;AAAA,MACd,OAAO,KAAK,MAAM;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAGA,sBAAsB,OAAe;AACpC,WAAO,KAAK,KAAK,QAAiD;AAAA,MACjE,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE,MAAM;AAAA,MACd,OAAO,KAAK,MAAM;AAAA,IACnB,CAAC;AAAA,EACF;AACD;AAIO,IAAM,aAAN,MAAiB;AAAA,EAGvB,YACS,MACA,QACP;AAFO;AACA;AAER,SAAK,MAAM,IAAI,UAAU,MAAM,MAAM,KAAK,OAAO,IAAI,CAAC;AAAA,EACvD;AAAA,EAJS;AAAA,EACA;AAAA,EAJA;AAAA,EAST,eAAe,OAA2B;AACzC,SAAK,OAAO,IAAI,KAAK;AAAA,EACtB;AAAA;AAAA,EAIA,SAAS,OAAuB;AAC/B,WAAO,KAAK,KAAK,QAAuC;AAAA,MACvD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACP,CAAC;AAAA,EACF;AAAA,EAEA,MAAM,OAAoB;AACzB,WAAO,KAAK,KAAK,QAAoC;AAAA,MACpD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACP,CAAC;AAAA,EACF;AAAA,EAEA,cAAc,cAAuB;AACpC,WAAO,KAAK,KAAK,QAAsC;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,eAAe,EAAE,aAAa,IAAI;AAAA,IACzC,CAAC;AAAA,EACF;AAAA,EAEA,eAAe,OAAe;AAC7B,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE,MAAM;AAAA,IACf,CAAC;AAAA,EACF;AAAA,EAEA,cAAc,OAA4B;AACzC,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACP,CAAC;AAAA,EACF;AAAA,EAEA,YAAY,OAAe;AAG1B,WAAO,KAAK,KAAK,QAA0C;AAAA,MAC1D,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE,MAAM;AAAA,MACd,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,OAAO,cAAuB;AAC7B,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,eAAe,EAAE,aAAa,IAAI;AAAA,MACxC,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA,EAEA,wBAAwB;AAEvB,WAAO,KAAK,KAAK,QAAiD;AAAA,MACjE,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,UAAU;AACT,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA,EAEA,cAAc,OAA4B;AACzC,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA,EAEA,kBAAkB,OAAgC;AACjD,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA,EAEA,YAAY,OAAe;AAC1B,WAAO,KAAK,KAAK,QAA+B;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE,MAAM;AAAA,MACd,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA,EAEA,YAAY,OAAe;AAC1B,WAAO,KAAK,KAAK,QAA+B;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE,MAAM;AAAA,MACd,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA,EAEA,eAAe,OAA6B;AAC3C,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA;AAAA,EAGA,aAAa;AACZ,WAAO,KAAK,KAAK,QAA+B;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA,EAEA,aAAa;AACZ,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AACD;;;AC5NO,IAAM,gBAAN,MAAoB;AAAA,EAG1B,YACS,MACA,QACP;AAFO;AACA;AAAA,EACN;AAAA,EAFM;AAAA,EACA;AAAA,EAJD;AAAA,EAOR,eAAe,OAA2B;AACzC,SAAK,OAAO,IAAI,KAAK;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,aAAiC;AAC/C,SAAK,cAAc;AAAA,EACpB;AAAA;AAAA,EAIA,YAAY;AACX,WAAO,KAAK,KAAK,QAAuC;AAAA,MACvD,QAAQ;AAAA,MACR,MAAM;AAAA,IACP,CAAC;AAAA,EACF;AAAA,EAEA,QAAQ,QAAgB;AACvB,WAAO,KAAK,KAAK,QAAmC;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM,UAAU,MAAM;AAAA,IACvB,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,WAAW,OAAyB;AACnC,WAAO,KAAK,KAAK,QAAmC;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA,EAEA,WAAW,QAAgB,OAAyB;AACnD,WAAO,KAAK,KAAK,QAAmC;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM,UAAU,MAAM;AAAA,MACtB,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA,EAEA,WAAW,QAAgB;AAC1B,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,UAAU,MAAM;AAAA,MACtB,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,kBAAkB;AACjB,WAAO,KAAK,KAAK,QAA2C;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,sBAAsB,OAAuB;AAC5C,WAAO,KAAK,KAAK,QAA0C;AAAA,MAC1D,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,sBAAsB;AACrB,WAAO,KAAK,KAAK,QAAwC;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,YAAY,OAA0B;AACrC,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,SAAS,QAAgB;AACxB,WAAO,KAAK,KAAK,QAAoC;AAAA,MACpD,QAAQ;AAAA,MACR,MAAM,kBAAkB,MAAM;AAAA,MAC9B,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AACD;;;AC1EO,IAAM,kBAAN,MAAsB;AAAA,EAG5B,YACS,MACA,QACP;AAFO;AACA;AAAA,EACN;AAAA,EAFM;AAAA,EACA;AAAA,EAJD;AAAA,EAOR,eAAe,OAA2B;AACzC,SAAK,OAAO,IAAI,KAAK;AAAA,EACtB;AAAA;AAAA;AAAA,EAIA,eAAe,aAAiC;AAC/C,SAAK,cAAc;AAAA,EACpB;AAAA;AAAA,EAIA,cAAc,QAA6B,CAAC,GAAG;AAC9C,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,WAAW,OAAW,QAAO,IAAI,UAAU,MAAM,MAAM;AACjE,QAAI,MAAM,gBAAgB,OAAW,QAAO,IAAI,eAAe,OAAO,MAAM,WAAW,CAAC;AACxF,QAAI,MAAM,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,MAAM,KAAK,CAAC;AACtE,QAAI,MAAM,WAAW,OAAW,QAAO,IAAI,UAAU,OAAO,MAAM,MAAM,CAAC;AACzE,UAAM,KAAK,OAAO,SAAS;AAE3B,WAAO,KAAK,KAAK,QAA2C;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM,KAAK,cAAc,EAAE,KAAK;AAAA,MAChC,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,eAAe,QAA8B,CAAC,GAAG;AAChD,WAAO,KAAK,KAAK,QAAuC;AAAA,MACvD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,YAAY,YAAoB,QAA2B,CAAC,GAAG;AAC9D,UAAM,KAAK,MAAM,UAAU,IAAI,aAAa;AAC5C,WAAO,KAAK,KAAK,QAAiE;AAAA,MACjF,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,GAAG,EAAE;AAAA,MACnC,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,eAAe,YAAoB,OAA6B;AAC/D,WAAO,KAAK,KAAK,QAAuC;AAAA,MACvD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,eAAe,YAAoB;AAClC,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,kBAAkB,YAAoB,QAAiC,CAAC,GAAG;AAC1E,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,oBAAoB,YAAoB;AACvC,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,WAAW,YAAoB;AAC9B,WAAO,KAAK,KAAK,QAAgD;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,SAAS,YAAoB,OAAuB;AACnD,WAAO,KAAK,KAAK,QAA4C;AAAA,MAC5D,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,iBAAiB,YAAoB,SAAiB,OAAe;AACpE,WAAO,KAAK,KAAK,QAA4C;AAAA,MAC5D,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,WAAW,OAAO;AAAA,MAChD,MAAM,EAAE,MAAM;AAAA,MACd,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,gBAAgB,YAAoB,SAAiB;AACpD,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,WAAW,OAAO;AAAA,MAChD,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,YAAY,YAAoB,SAAiB;AAChD,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,WAAW,OAAO;AAAA,MAChD,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,WAAW,YAAoB;AAC9B,WAAO,KAAK,KAAK,QAAgD;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,SAAS,YAAoB,OAAuB;AACnD,WAAO,KAAK,KAAK,QAA4C;AAAA,MAC5D,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAGA,iBAAiB,YAAoB,SAAiB,OAAe;AACpE,WAAO,KAAK,KAAK,QAA4C;AAAA,MAC5D,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,WAAW,OAAO;AAAA,MAChD,MAAM,EAAE,MAAM;AAAA,MACd,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,gBAAgB,YAAoB,SAAiB;AACpD,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,WAAW,OAAO;AAAA,MAChD,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,YAAY,YAAoB,SAAiB;AAChD,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,WAAW,OAAO;AAAA,MAChD,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,cAAc,YAAoB;AACjC,WAAO,KAAK,KAAK,QAAkD;AAAA,MAClE,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,WAAW,YAAoB,OAAyB;AACvD,WAAO,KAAK,KAAK,QAA8C;AAAA,MAC9D,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAGA,mBAAmB,YAAoB,QAAgB,OAAe;AACrE,WAAO,KAAK,KAAK,QAA8C;AAAA,MAC9D,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,cAAc,MAAM;AAAA,MAClD,MAAM,EAAE,MAAM;AAAA,MACd,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,kBAAkB,YAAoB,QAAgB;AACrD,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,cAAc,MAAM;AAAA,MAClD,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,cAAc,YAAoB,QAAgB;AACjD,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,cAAc,MAAM;AAAA,MAClD,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,UAAU,YAAoB;AAC7B,WAAO,KAAK,KAAK,QAA+C;AAAA,MAC/D,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,WAAW,YAAoB,MAAc;AAC5C,WAAO,KAAK,KAAK,QAA2C;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,MAAM,EAAE,KAAK;AAAA,MACb,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,WAAW,YAAoB,QAAgB,MAAc;AAC5D,WAAO,KAAK,KAAK,QAA2C;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,UAAU,MAAM;AAAA,MAC9C,MAAM,EAAE,KAAK;AAAA,MACb,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,WAAW,YAAoB,QAAgB;AAC9C,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,UAAU,MAAM;AAAA,MAC9C,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,SAAS,YAAoB;AAC5B,WAAO,KAAK,KAAK,QAA8C;AAAA,MAC9D,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,OAAO,YAAoB,KAAa;AACvC,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,MAAM,EAAE,IAAI;AAAA,MACZ,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,UAAU,YAAoB,KAAa;AAC1C,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,SAAS,mBAAmB,GAAG,CAAC;AAAA,MAC9D,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,kBAAkB,YAAoB;AACrC,WAAO,KAAK,KAAK,QAAuD;AAAA,MACvE,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,gBAAgB,YAAoB,OAA8B;AACjE,WAAO,KAAK,KAAK,QAAmD;AAAA,MACnE,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU;AAAA,MAC9B,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,uBAAuB,YAAoB,WAAmB;AAC7D,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,kBAAkB,SAAS;AAAA,MACzD,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,mBAAmB,YAAoB,WAAmB;AACzD,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,cAAc,UAAU,kBAAkB,SAAS;AAAA,MACzD,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,MAAyB;AACnC,WAAO,KAAK,KAAK,QAAgD;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM,0BAA0B,IAAI;AAAA,MACpC,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,YAAY,SAAiB;AAC5B,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,qBAAqB,OAAO;AAAA,MAClC,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AACD;;;AC1bO,IAAM,iBAAN,MAAqB;AAAA,EAG3B,YACS,MACA,QACP;AAFO;AACA;AAAA,EACN;AAAA,EAFM;AAAA,EACA;AAAA,EAJD;AAAA,EAOR,eAAe,OAA2B;AACzC,SAAK,OAAO,IAAI,KAAK;AAAA,EACtB;AAAA;AAAA;AAAA,EAIA,eAAe,aAAiC;AAC/C,SAAK,cAAc;AAAA,EACpB;AAAA,EAEA,gBAAgB;AACf,WAAO,KAAK,KAAK,QAAkD;AAAA,MAClE,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA;AAAA,EAIA,eAAe,OAAoC;AAClD,WAAO,KAAK,KAAK,QAAkD;AAAA,MAClE,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,YAAY,YAAoB;AAC/B,WAAO,KAAK,KAAK,QAA2C;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM,aAAa,UAAU;AAAA,MAC7B,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,eAAe,YAAoB,OAAoC;AACtE,WAAO,KAAK,KAAK,QAA2C;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM,aAAa,UAAU;AAAA,MAC7B,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,eAAe,YAAoB;AAClC,WAAO,KAAK,KAAK,QAAmB;AAAA,MACnC,QAAQ;AAAA,MACR,MAAM,aAAa,UAAU;AAAA,MAC7B,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,eAAe,YAAoB;AAClC,WAAO,KAAK,KAAK,QAAkD;AAAA,MAClE,QAAQ;AAAA,MACR,MAAM,aAAa,UAAU;AAAA,MAC7B,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,aAAa,YAAoB;AAChC,WAAO,KAAK,KAAK,QAA0C;AAAA,MAC1D,QAAQ;AAAA,MACR,MAAM,aAAa,UAAU;AAAA,MAC7B,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AACD;;;ACzBO,IAAM,mBAAN,MAAuB;AAAA,EAG7B,YACS,MACA,QACP;AAFO;AACA;AAAA,EACN;AAAA,EAFM;AAAA,EACA;AAAA,EAJD;AAAA,EAOR,eAAe,OAA2B;AACzC,SAAK,OAAO,IAAI,KAAK;AAAA,EACtB;AAAA;AAAA;AAAA,EAIA,eAAe,aAAiC;AAC/C,SAAK,cAAc;AAAA,EACpB;AAAA;AAAA,EAIA,iBAAiB;AAChB,WAAO,KAAK,KAAK,QAA4C;AAAA,MAC5D,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA,EAEA,gBAAgB,OAA8B;AAC7C,WAAO,KAAK,KAAK,QAAwC;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA,EAEA,aAAa,IAAY;AACxB,WAAO,KAAK,KAAK,QAAwC;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM,eAAe,EAAE;AAAA,MACvB,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA,EAEA,gBAAgB,OAA8B;AAC7C,WAAO,KAAK,KAAK,QAAwC;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAGA,mBAAmB;AAClB,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,mBAAmB;AAClB,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,YAAY;AACX,WAAO,KAAK,KAAK,QAAuC;AAAA,MACvD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,WAAW,OAAyB;AACnC,WAAO,KAAK,KAAK,QAAmC;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,QAAQ,QAAgB;AACvB,WAAO,KAAK,KAAK,QAAmC;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM,qBAAqB,MAAM;AAAA,MACjC,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,WAAW,QAAgB,OAAyB;AACnD,WAAO,KAAK,KAAK,QAAmC;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM,qBAAqB,MAAM;AAAA,MACjC,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,WAAW,QAAgB;AAC1B,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,qBAAqB,MAAM;AAAA,MACjC,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,mBAAmB,QAAgB;AAClC,WAAO,KAAK,KAAK,QAA8C;AAAA,MAC9D,QAAQ;AAAA,MACR,MAAM,qBAAqB,MAAM;AAAA,MACjC,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,mBAAmB,QAAgB,aAAqC;AACvE,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,qBAAqB,MAAM;AAAA,MACjC,MAAM,EAAE,YAAY;AAAA,MACpB,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,cAAc;AACb,WAAO,KAAK,KAAK,QAAyC;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,aAAa,QAAgB;AAC5B,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,uBAAuB,MAAM;AAAA,MACnC,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,eAAe,QAAgB;AAC9B,WAAO,KAAK,KAAK,QAAuC;AAAA,MACvD,QAAQ;AAAA,MACR,MAAM,uBAAuB,MAAM;AAAA,MACnC,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,cAAc,QAAgB,QAAgB;AAC7C,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,uBAAuB,MAAM;AAAA,MACnC,MAAM,EAAE,OAAO;AAAA,MACf,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,iBAAiB,QAAgB,QAAgB;AAChD,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,uBAAuB,MAAM,UAAU,MAAM;AAAA,MACnD,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,kBAAkB;AACjB,WAAO,KAAK,KAAK,QAA6C;AAAA,MAC7D,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,OAAO,SAAwC;AAC9C,WAAO,KAAK,KAAK,QAAqC;AAAA,MACrD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,iBAAiB,UAAkB;AAClC,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,2BAA2B,QAAQ;AAAA,MACzC,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,iBAAiB,KAAa;AAC7B,WAAO,KAAK,KAAK,QAA+C;AAAA,MAC/D,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE,IAAI;AAAA,MACZ,OAAO,KAAK,OAAO,IAAI;AAAA,IACxB,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,cAAc;AACb,WAAO,KAAK,KAAK,QAAgD;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AAAA,EAEA,eAAe,OAA6B;AAC3C,WAAO,KAAK,KAAK,QAAgD;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,IACnB,CAAC;AAAA,EACF;AACD;;;AC1UO,IAAM,aAAN,MAAiB;AAAA,EACf;AAAA,EAER,YAAY,SAAkB;AAC7B,SAAK,QAAQ;AAAA,EACd;AAAA,EAEA,MAA0B;AACzB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI,OAA2B;AAC9B,SAAK,QAAQ;AAAA,EACd;AACD;;;ACIO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAED;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAA8B;AACzC,SAAK,OAAO,IAAI,WAAW,KAAK,OAAO;AACvC,SAAK,SAAS,IAAI,WAAW,KAAK,WAAW;AAC7C,SAAK,cAAc,KAAK;AACxB,SAAK,OAAO,IAAI,WAAW,KAAK,MAAM,KAAK,MAAM;AACjD,SAAK,UAAU,IAAI,cAAc,KAAK,MAAM,KAAK,MAAM;AACvD,SAAK,aAAa,IAAI,iBAAiB,KAAK,MAAM,KAAK,MAAM;AAC7D,SAAK,QAAQ,IAAI,YAAY,KAAK,MAAM,KAAK,MAAM;AACnD,SAAK,WAAW,IAAI,eAAe,KAAK,MAAM,KAAK,MAAM;AACzD,SAAK,YAAY,IAAI,gBAAgB,KAAK,MAAM,KAAK,MAAM;AAAA,EAC5D;AAAA;AAAA;AAAA,EAIA,eAAe,OAAiC;AAC/C,SAAK,OAAO,IAAI,KAAK;AAAA,EACtB;AAAA;AAAA;AAAA,EAIA,eAAe,aAAuC;AACrD,SAAK,cAAc;AACnB,SAAK,QAAQ,eAAe,WAAW;AACvC,SAAK,WAAW,eAAe,WAAW;AAC1C,SAAK,UAAU,eAAe,WAAW;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAqB,MAKQ;AAC5B,WAAO,KAAK,KAAK,QAAyB;AAAA,MACzC,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,OAAO,KAAK,OAAO,IAAI;AAAA,MACvB,aAAa,KAAK,eAAe,KAAK;AAAA,IACvC,CAAC;AAAA,EACF;AAAA,EAEA,IAAiB,MAAc,QAAmD;AACjF,WAAO,KAAK,QAAW,EAAE,QAAQ,OAAO,MAAM,aAAa,QAAQ,YAAY,CAAC;AAAA,EACjF;AAAA,EAEA,KAAkB,MAAc,MAAgB,QAAmD;AAClG,WAAO,KAAK,QAAW,EAAE,QAAQ,QAAQ,MAAM,MAAM,aAAa,QAAQ,YAAY,CAAC;AAAA,EACxF;AAAA,EAEA,IAAiB,MAAc,MAAgB,QAAmD;AACjG,WAAO,KAAK,QAAW,EAAE,QAAQ,OAAO,MAAM,MAAM,aAAa,QAAQ,YAAY,CAAC;AAAA,EACvF;AAAA,EAEA,MAAmB,MAAc,MAAgB,QAAmD;AACnG,WAAO,KAAK,QAAW,EAAE,QAAQ,SAAS,MAAM,MAAM,aAAa,QAAQ,YAAY,CAAC;AAAA,EACzF;AAAA,EAEA,OAAoB,MAAc,QAAmD;AACpF,WAAO,KAAK,QAAW,EAAE,QAAQ,UAAU,MAAM,aAAa,QAAQ,YAAY,CAAC;AAAA,EACpF;AACD;;;ACpEA,SAAS,SAAS,aAA8B;AAC/C,SAAO,cAAc,gBAAgB,mBAAmB,WAAW,CAAC,KAAK;AAC1E;AASO,IAAM,oBAAN,MAAwB;AAAA,EACtB;AAAA,EACA;AAAA,EAER,YAAY,MAAiC;AAC5C,SAAK,OAAO,IAAI,WAAW,KAAK,OAAO;AACvC,SAAK,aAAa,KAAK;AAAA,EACxB;AAAA;AAAA,EAIA,WAAW,aAAsB;AAChC,WAAO,KAAK,KAAK,QAAsC;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM,gBAAgB,SAAS,WAAW,CAAC;AAAA,MAC3C,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,UAAU,KAAa,aAAsB;AAC5C,WAAO,KAAK,KAAK,QAAoC;AAAA,MACpD,QAAQ;AAAA,MACR,MAAM,iBAAiB,GAAG,GAAG,SAAS,WAAW,CAAC;AAAA,MAClD,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,UAAU,KAAa,OAAwB,aAAsB;AACpE,WAAO,KAAK,KAAK,QAAoC;AAAA,MACpD,QAAQ;AAAA,MACR,MAAM,iBAAiB,GAAG,GAAG,SAAS,WAAW,CAAC;AAAA,MAClD,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,aAAa,KAAa,aAAsB;AAC/C,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,iBAAiB,GAAG,GAAG,SAAS,WAAW,CAAC;AAAA,MAClD,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,oBAAoB,KAAa,aAAsB;AACtD,WAAO,KAAK,KAAK,QAAyC;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM,iBAAiB,GAAG,aAAa,SAAS,WAAW,CAAC;AAAA,MAC5D,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,eAAe,KAAa,OAAuB,aAAsB;AACxE,WAAO,KAAK,KAAK,QAAoC;AAAA,MACpD,QAAQ;AAAA,MACR,MAAM,iBAAiB,GAAG,YAAY,SAAS,WAAW,CAAC;AAAA,MAC3D,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA;AAAA,EAIA,YAAY,aAAsB;AACjC,WAAO,KAAK,KAAK,QAAsC;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM,iBAAiB,SAAS,WAAW,CAAC;AAAA,MAC5C,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,UAAU,KAAa,aAAsB;AAC5C,WAAO,KAAK,KAAK,QAAoC;AAAA,MACpD,QAAQ;AAAA,MACR,MAAM,kBAAkB,GAAG,GAAG,SAAS,WAAW,CAAC;AAAA,MACnD,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,UAAU,KAAa,OAAwB,aAAsB;AACpE,WAAO,KAAK,KAAK,QAAoC;AAAA,MACpD,QAAQ;AAAA,MACR,MAAM,kBAAkB,GAAG,GAAG,SAAS,WAAW,CAAC;AAAA,MACnD,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,aAAa,KAAa,aAAsB;AAC/C,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,kBAAkB,GAAG,GAAG,SAAS,WAAW,CAAC;AAAA,MACnD,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,oBAAoB,KAAa,aAAsB;AACtD,WAAO,KAAK,KAAK,QAAyC;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM,kBAAkB,GAAG,aAAa,SAAS,WAAW,CAAC;AAAA,MAC7D,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,eAAe,KAAa,OAAuB,aAAsB;AACxE,WAAO,KAAK,KAAK,QAAoC;AAAA,MACpD,QAAQ;AAAA,MACR,MAAM,kBAAkB,GAAG,YAAY,SAAS,WAAW,CAAC;AAAA,MAC5D,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA;AAAA,EAGA,aAAa,KAAa,aAAsB;AAC/C,WAAO,KAAK,KAAK,QAA2C;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM,kBAAkB,GAAG,UAAU,SAAS,WAAW,CAAC;AAAA,MAC1D,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AACD;;;ACrIO,IAAM,qBAAN,MAAyB;AAAA,EACvB;AAAA,EACA;AAAA,EAER,YAAY,MAAkC;AAC7C,SAAK,OAAO,IAAI,WAAW,KAAK,OAAO;AACvC,SAAK,aAAa,KAAK;AAAA,EACxB;AAAA,EAEA,gBAAgB;AACf,WAAO,KAAK,KAAK,QAAwC;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,YAAY,MAAc,QAAwB;AACjD,UAAM,IAAI,SAAS,WAAW,mBAAmB,MAAM,CAAC,KAAK;AAC7D,WAAO,KAAK,KAAK,QAAsC;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM,oBAAoB,IAAI,GAAG,CAAC;AAAA,MAClC,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,YAAY,MAAc,OAA0B,QAAwB;AAC3E,UAAM,IAAI,SAAS,WAAW,mBAAmB,MAAM,CAAC,KAAK;AAC7D,WAAO,KAAK,KAAK,QAAsC;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM,oBAAoB,IAAI,GAAG,CAAC;AAAA,MAClC,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,eAAe,MAAc,QAAwB;AACpD,UAAM,IAAI,SAAS,WAAW,mBAAmB,MAAM,CAAC,KAAK;AAC7D,WAAO,KAAK,KAAK,QAAiC;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,oBAAoB,IAAI,GAAG,CAAC;AAAA,MAClC,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,cAAc,MAAc,QAAwB;AACnD,UAAM,IAAI,SAAS,WAAW,mBAAmB,MAAM,CAAC,KAAK;AAC7D,WAAO,KAAK,KAAK,QAA2C;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM,oBAAoB,IAAI,aAAa,CAAC;AAAA,MAC5C,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,SAAS,MAAc,OAA+B,QAAwB;AAC7E,UAAM,IAAI,SAAS,WAAW,mBAAmB,MAAM,CAAC,KAAK;AAC7D,WAAO,KAAK,KAAK,QAAsC;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM,oBAAoB,IAAI,YAAY,CAAC;AAAA,MAC3C,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,IACb,CAAC;AAAA,EACF;AACD;","names":[]}
package/dist/index.d.cts CHANGED
@@ -837,6 +837,10 @@ declare class WorkspacesClient {
837
837
  interface IFonderieClientOptions {
838
838
  baseUrl: string;
839
839
  accessToken?: string;
840
+ workspaceId?: string;
841
+ }
842
+ interface IRequestConfig {
843
+ workspaceId?: string;
840
844
  }
841
845
  declare class FonderieClient {
842
846
  readonly auth: AuthClient;
@@ -846,7 +850,22 @@ declare class FonderieClient {
846
850
  readonly webhooks: WebhooksClient;
847
851
  readonly customers: CustomersClient;
848
852
  private http;
853
+ private tokens;
854
+ private workspaceId;
849
855
  constructor(opts: IFonderieClientOptions);
856
+ setAccessToken(token: string | undefined): void;
857
+ setWorkspaceId(workspaceId: string | undefined): void;
858
+ request<T = unknown>(opts: {
859
+ method: string;
860
+ path: string;
861
+ body?: unknown;
862
+ workspaceId?: string | undefined;
863
+ }): Promise<IApiResponse<T>>;
864
+ get<T = unknown>(path: string, config?: IRequestConfig): Promise<IApiResponse<T>>;
865
+ post<T = unknown>(path: string, body?: unknown, config?: IRequestConfig): Promise<IApiResponse<T>>;
866
+ put<T = unknown>(path: string, body?: unknown, config?: IRequestConfig): Promise<IApiResponse<T>>;
867
+ patch<T = unknown>(path: string, body?: unknown, config?: IRequestConfig): Promise<IApiResponse<T>>;
868
+ delete<T = unknown>(path: string, config?: IRequestConfig): Promise<IApiResponse<T>>;
850
869
  }
851
870
 
852
871
  interface ISetConfigInput {
@@ -911,4 +930,4 @@ declare class CourierAdminClient {
911
930
  rollback(type: string, input: IRollbackTemplateInput, locale?: string | null): Promise<IApiResponse<ITemplateEntry>>;
912
931
  }
913
932
 
914
- export { AuditClient, AuthClient, BillingClient, ConfigAdminClient, CourierAdminClient, type CustomerLabelType, type CustomerSex, type CustomerType, CustomersClient, FonderieApiError, FonderieClient, type IAcceptInvitationResult, type IAddAddressInput, type IAddEmailInput, type IAddPhoneInput, type IAddRelationshipInput, type IAddressDTO, type IApiError, type IApiResponse, type IAuditEventDTO, type IAuditPageResult, type IBlacklistCustomerInput, type IChangePasswordInput, type ICheckoutInput, type ICheckoutUrlResult, type IConfigAdminClientOptions, type IConfigEntry, type IConfigRevision, type ICourierAdminClientOptions, type ICreateCustomerInput, type ICreatePlanInput, type ICreateRoleInput, type ICreateWebhookEndpointInput, type ICreateWorkspaceInput, type ICustomerAddressDTO, type ICustomerAddressListResult, type ICustomerAddressResult, type ICustomerDTO, type ICustomerDetailD2DTO, type ICustomerDetailDTO, type ICustomerEmailDTO, type ICustomerEmailListResult, type ICustomerEmailResult, type ICustomerLabelDTO, type ICustomerLabelListResult, type ICustomerListResult, type ICustomerNoteDTO, type ICustomerNoteListResult, type ICustomerNoteResult, type ICustomerPhoneDTO, type ICustomerPhoneListResult, type ICustomerPhoneResult, type ICustomerRelationshipDTO, type ICustomerRelationshipExpandedD2DTO, type ICustomerRelationshipExpandedDTO, type ICustomerRelationshipListResult, type ICustomerRelationshipResult, type ICustomerResult, type ICustomerShallowDTO, type ICustomerTagListResult, type IFonderieClientOptions, type IGetCustomerInput, type IInvitationDTO, type IInvitationListResult, type IInviteEntry, type IInviteResult, type IListAuditEventsInput, type IListCustomersInput, type ILoginInput, type ILoginResult, type IMeResult, type IMemberDTO, type IMemberListResult, type IMfaEnabledResult, type IMfaSetupResult, type IPlanDTO, type IPlanFeature, type IPlanListResult, type IPlanResult, type IPortalUrlResult, type IRecordUsageInput, type IRefreshResult, type IRegisterInput, type IRegisterResult, type IResendVerificationResult, type IResetPasswordInput, type IRevealSecretResult, type IRoleDTO, type IRoleListResult, type IRolePermission, type IRolePermissionInput, type IRolePermissionsResult, type IRoleResult, type IRollbackInput, type IRollbackTemplateInput, type ISecretEntry, type ISecretRevision, type ISetConfigInput, type ISetSecretInput, type ISetTemplateInput, type ISubscriptionDTO, type ISubscriptionResult, type ITemplateEntry, type ITemplateRevision, type ITestWebhookResult, type ITokens, type IUpdateCustomerInput, type IUpdatePlanInput, type IUpdatePreferencesInput, type IUpdateProfileInput, type IUpdateRoleInput, type IUpdateSettingsInput, type IUpdateWebhookEndpointInput, type IUpdateWorkspaceInput, type IUsageResult, type IUserDTO, type IUserPreferences, type IUserSkill, type IVerifyEmailResult, type IWebhookDeliveryDTO, type IWebhookDeliveryListResult, type IWebhookEndpointCreatedDTO, type IWebhookEndpointDTO, type IWebhookEndpointListResult, type IWorkspaceAddressDTO, type IWorkspaceDTO, type IWorkspaceListResult, type IWorkspaceResult, type IWorkspaceSettingsDTO, type IWorkspaceSettingsResult, type SubscriberType, WebhooksClient, WorkspacesClient };
933
+ export { AuditClient, AuthClient, BillingClient, ConfigAdminClient, CourierAdminClient, type CustomerLabelType, type CustomerSex, type CustomerType, CustomersClient, FonderieApiError, FonderieClient, type IAcceptInvitationResult, type IAddAddressInput, type IAddEmailInput, type IAddPhoneInput, type IAddRelationshipInput, type IAddressDTO, type IApiError, type IApiResponse, type IAuditEventDTO, type IAuditPageResult, type IBlacklistCustomerInput, type IChangePasswordInput, type ICheckoutInput, type ICheckoutUrlResult, type IConfigAdminClientOptions, type IConfigEntry, type IConfigRevision, type ICourierAdminClientOptions, type ICreateCustomerInput, type ICreatePlanInput, type ICreateRoleInput, type ICreateWebhookEndpointInput, type ICreateWorkspaceInput, type ICustomerAddressDTO, type ICustomerAddressListResult, type ICustomerAddressResult, type ICustomerDTO, type ICustomerDetailD2DTO, type ICustomerDetailDTO, type ICustomerEmailDTO, type ICustomerEmailListResult, type ICustomerEmailResult, type ICustomerLabelDTO, type ICustomerLabelListResult, type ICustomerListResult, type ICustomerNoteDTO, type ICustomerNoteListResult, type ICustomerNoteResult, type ICustomerPhoneDTO, type ICustomerPhoneListResult, type ICustomerPhoneResult, type ICustomerRelationshipDTO, type ICustomerRelationshipExpandedD2DTO, type ICustomerRelationshipExpandedDTO, type ICustomerRelationshipListResult, type ICustomerRelationshipResult, type ICustomerResult, type ICustomerShallowDTO, type ICustomerTagListResult, type IFonderieClientOptions, type IGetCustomerInput, type IInvitationDTO, type IInvitationListResult, type IInviteEntry, type IInviteResult, type IListAuditEventsInput, type IListCustomersInput, type ILoginInput, type ILoginResult, type IMeResult, type IMemberDTO, type IMemberListResult, type IMfaEnabledResult, type IMfaSetupResult, type IPlanDTO, type IPlanFeature, type IPlanListResult, type IPlanResult, type IPortalUrlResult, type IRecordUsageInput, type IRefreshResult, type IRegisterInput, type IRegisterResult, type IRequestConfig, type IResendVerificationResult, type IResetPasswordInput, type IRevealSecretResult, type IRoleDTO, type IRoleListResult, type IRolePermission, type IRolePermissionInput, type IRolePermissionsResult, type IRoleResult, type IRollbackInput, type IRollbackTemplateInput, type ISecretEntry, type ISecretRevision, type ISetConfigInput, type ISetSecretInput, type ISetTemplateInput, type ISubscriptionDTO, type ISubscriptionResult, type ITemplateEntry, type ITemplateRevision, type ITestWebhookResult, type ITokens, type IUpdateCustomerInput, type IUpdatePlanInput, type IUpdatePreferencesInput, type IUpdateProfileInput, type IUpdateRoleInput, type IUpdateSettingsInput, type IUpdateWebhookEndpointInput, type IUpdateWorkspaceInput, type IUsageResult, type IUserDTO, type IUserPreferences, type IUserSkill, type IVerifyEmailResult, type IWebhookDeliveryDTO, type IWebhookDeliveryListResult, type IWebhookEndpointCreatedDTO, type IWebhookEndpointDTO, type IWebhookEndpointListResult, type IWorkspaceAddressDTO, type IWorkspaceDTO, type IWorkspaceListResult, type IWorkspaceResult, type IWorkspaceSettingsDTO, type IWorkspaceSettingsResult, type SubscriberType, WebhooksClient, WorkspacesClient };
package/dist/index.d.ts CHANGED
@@ -837,6 +837,10 @@ declare class WorkspacesClient {
837
837
  interface IFonderieClientOptions {
838
838
  baseUrl: string;
839
839
  accessToken?: string;
840
+ workspaceId?: string;
841
+ }
842
+ interface IRequestConfig {
843
+ workspaceId?: string;
840
844
  }
841
845
  declare class FonderieClient {
842
846
  readonly auth: AuthClient;
@@ -846,7 +850,22 @@ declare class FonderieClient {
846
850
  readonly webhooks: WebhooksClient;
847
851
  readonly customers: CustomersClient;
848
852
  private http;
853
+ private tokens;
854
+ private workspaceId;
849
855
  constructor(opts: IFonderieClientOptions);
856
+ setAccessToken(token: string | undefined): void;
857
+ setWorkspaceId(workspaceId: string | undefined): void;
858
+ request<T = unknown>(opts: {
859
+ method: string;
860
+ path: string;
861
+ body?: unknown;
862
+ workspaceId?: string | undefined;
863
+ }): Promise<IApiResponse<T>>;
864
+ get<T = unknown>(path: string, config?: IRequestConfig): Promise<IApiResponse<T>>;
865
+ post<T = unknown>(path: string, body?: unknown, config?: IRequestConfig): Promise<IApiResponse<T>>;
866
+ put<T = unknown>(path: string, body?: unknown, config?: IRequestConfig): Promise<IApiResponse<T>>;
867
+ patch<T = unknown>(path: string, body?: unknown, config?: IRequestConfig): Promise<IApiResponse<T>>;
868
+ delete<T = unknown>(path: string, config?: IRequestConfig): Promise<IApiResponse<T>>;
850
869
  }
851
870
 
852
871
  interface ISetConfigInput {
@@ -911,4 +930,4 @@ declare class CourierAdminClient {
911
930
  rollback(type: string, input: IRollbackTemplateInput, locale?: string | null): Promise<IApiResponse<ITemplateEntry>>;
912
931
  }
913
932
 
914
- export { AuditClient, AuthClient, BillingClient, ConfigAdminClient, CourierAdminClient, type CustomerLabelType, type CustomerSex, type CustomerType, CustomersClient, FonderieApiError, FonderieClient, type IAcceptInvitationResult, type IAddAddressInput, type IAddEmailInput, type IAddPhoneInput, type IAddRelationshipInput, type IAddressDTO, type IApiError, type IApiResponse, type IAuditEventDTO, type IAuditPageResult, type IBlacklistCustomerInput, type IChangePasswordInput, type ICheckoutInput, type ICheckoutUrlResult, type IConfigAdminClientOptions, type IConfigEntry, type IConfigRevision, type ICourierAdminClientOptions, type ICreateCustomerInput, type ICreatePlanInput, type ICreateRoleInput, type ICreateWebhookEndpointInput, type ICreateWorkspaceInput, type ICustomerAddressDTO, type ICustomerAddressListResult, type ICustomerAddressResult, type ICustomerDTO, type ICustomerDetailD2DTO, type ICustomerDetailDTO, type ICustomerEmailDTO, type ICustomerEmailListResult, type ICustomerEmailResult, type ICustomerLabelDTO, type ICustomerLabelListResult, type ICustomerListResult, type ICustomerNoteDTO, type ICustomerNoteListResult, type ICustomerNoteResult, type ICustomerPhoneDTO, type ICustomerPhoneListResult, type ICustomerPhoneResult, type ICustomerRelationshipDTO, type ICustomerRelationshipExpandedD2DTO, type ICustomerRelationshipExpandedDTO, type ICustomerRelationshipListResult, type ICustomerRelationshipResult, type ICustomerResult, type ICustomerShallowDTO, type ICustomerTagListResult, type IFonderieClientOptions, type IGetCustomerInput, type IInvitationDTO, type IInvitationListResult, type IInviteEntry, type IInviteResult, type IListAuditEventsInput, type IListCustomersInput, type ILoginInput, type ILoginResult, type IMeResult, type IMemberDTO, type IMemberListResult, type IMfaEnabledResult, type IMfaSetupResult, type IPlanDTO, type IPlanFeature, type IPlanListResult, type IPlanResult, type IPortalUrlResult, type IRecordUsageInput, type IRefreshResult, type IRegisterInput, type IRegisterResult, type IResendVerificationResult, type IResetPasswordInput, type IRevealSecretResult, type IRoleDTO, type IRoleListResult, type IRolePermission, type IRolePermissionInput, type IRolePermissionsResult, type IRoleResult, type IRollbackInput, type IRollbackTemplateInput, type ISecretEntry, type ISecretRevision, type ISetConfigInput, type ISetSecretInput, type ISetTemplateInput, type ISubscriptionDTO, type ISubscriptionResult, type ITemplateEntry, type ITemplateRevision, type ITestWebhookResult, type ITokens, type IUpdateCustomerInput, type IUpdatePlanInput, type IUpdatePreferencesInput, type IUpdateProfileInput, type IUpdateRoleInput, type IUpdateSettingsInput, type IUpdateWebhookEndpointInput, type IUpdateWorkspaceInput, type IUsageResult, type IUserDTO, type IUserPreferences, type IUserSkill, type IVerifyEmailResult, type IWebhookDeliveryDTO, type IWebhookDeliveryListResult, type IWebhookEndpointCreatedDTO, type IWebhookEndpointDTO, type IWebhookEndpointListResult, type IWorkspaceAddressDTO, type IWorkspaceDTO, type IWorkspaceListResult, type IWorkspaceResult, type IWorkspaceSettingsDTO, type IWorkspaceSettingsResult, type SubscriberType, WebhooksClient, WorkspacesClient };
933
+ export { AuditClient, AuthClient, BillingClient, ConfigAdminClient, CourierAdminClient, type CustomerLabelType, type CustomerSex, type CustomerType, CustomersClient, FonderieApiError, FonderieClient, type IAcceptInvitationResult, type IAddAddressInput, type IAddEmailInput, type IAddPhoneInput, type IAddRelationshipInput, type IAddressDTO, type IApiError, type IApiResponse, type IAuditEventDTO, type IAuditPageResult, type IBlacklistCustomerInput, type IChangePasswordInput, type ICheckoutInput, type ICheckoutUrlResult, type IConfigAdminClientOptions, type IConfigEntry, type IConfigRevision, type ICourierAdminClientOptions, type ICreateCustomerInput, type ICreatePlanInput, type ICreateRoleInput, type ICreateWebhookEndpointInput, type ICreateWorkspaceInput, type ICustomerAddressDTO, type ICustomerAddressListResult, type ICustomerAddressResult, type ICustomerDTO, type ICustomerDetailD2DTO, type ICustomerDetailDTO, type ICustomerEmailDTO, type ICustomerEmailListResult, type ICustomerEmailResult, type ICustomerLabelDTO, type ICustomerLabelListResult, type ICustomerListResult, type ICustomerNoteDTO, type ICustomerNoteListResult, type ICustomerNoteResult, type ICustomerPhoneDTO, type ICustomerPhoneListResult, type ICustomerPhoneResult, type ICustomerRelationshipDTO, type ICustomerRelationshipExpandedD2DTO, type ICustomerRelationshipExpandedDTO, type ICustomerRelationshipListResult, type ICustomerRelationshipResult, type ICustomerResult, type ICustomerShallowDTO, type ICustomerTagListResult, type IFonderieClientOptions, type IGetCustomerInput, type IInvitationDTO, type IInvitationListResult, type IInviteEntry, type IInviteResult, type IListAuditEventsInput, type IListCustomersInput, type ILoginInput, type ILoginResult, type IMeResult, type IMemberDTO, type IMemberListResult, type IMfaEnabledResult, type IMfaSetupResult, type IPlanDTO, type IPlanFeature, type IPlanListResult, type IPlanResult, type IPortalUrlResult, type IRecordUsageInput, type IRefreshResult, type IRegisterInput, type IRegisterResult, type IRequestConfig, type IResendVerificationResult, type IResetPasswordInput, type IRevealSecretResult, type IRoleDTO, type IRoleListResult, type IRolePermission, type IRolePermissionInput, type IRolePermissionsResult, type IRoleResult, type IRollbackInput, type IRollbackTemplateInput, type ISecretEntry, type ISecretRevision, type ISetConfigInput, type ISetSecretInput, type ISetTemplateInput, type ISubscriptionDTO, type ISubscriptionResult, type ITemplateEntry, type ITemplateRevision, type ITestWebhookResult, type ITokens, type IUpdateCustomerInput, type IUpdatePlanInput, type IUpdatePreferencesInput, type IUpdateProfileInput, type IUpdateRoleInput, type IUpdateSettingsInput, type IUpdateWebhookEndpointInput, type IUpdateWorkspaceInput, type IUsageResult, type IUserDTO, type IUserPreferences, type IUserSkill, type IVerifyEmailResult, type IWebhookDeliveryDTO, type IWebhookDeliveryListResult, type IWebhookEndpointCreatedDTO, type IWebhookEndpointDTO, type IWebhookEndpointListResult, type IWorkspaceAddressDTO, type IWorkspaceDTO, type IWorkspaceListResult, type IWorkspaceResult, type IWorkspaceSettingsDTO, type IWorkspaceSettingsResult, type SubscriberType, WebhooksClient, WorkspacesClient };
package/dist/index.js CHANGED
@@ -1027,15 +1027,60 @@ var FonderieClient = class {
1027
1027
  webhooks;
1028
1028
  customers;
1029
1029
  http;
1030
+ tokens;
1031
+ workspaceId;
1030
1032
  constructor(opts) {
1031
1033
  this.http = new HttpClient(opts.baseUrl);
1032
- const tokens = new TokenStore(opts.accessToken);
1033
- this.auth = new AuthClient(this.http, tokens);
1034
- this.billing = new BillingClient(this.http, tokens);
1035
- this.workspaces = new WorkspacesClient(this.http, tokens);
1036
- this.audit = new AuditClient(this.http, tokens);
1037
- this.webhooks = new WebhooksClient(this.http, tokens);
1038
- this.customers = new CustomersClient(this.http, tokens);
1034
+ this.tokens = new TokenStore(opts.accessToken);
1035
+ this.workspaceId = opts.workspaceId;
1036
+ this.auth = new AuthClient(this.http, this.tokens);
1037
+ this.billing = new BillingClient(this.http, this.tokens);
1038
+ this.workspaces = new WorkspacesClient(this.http, this.tokens);
1039
+ this.audit = new AuditClient(this.http, this.tokens);
1040
+ this.webhooks = new WebhooksClient(this.http, this.tokens);
1041
+ this.customers = new CustomersClient(this.http, this.tokens);
1042
+ }
1043
+ // The JWT used to authenticate every request — the typed modules and the
1044
+ // generic transport share one token store. Pass undefined to sign out.
1045
+ setAccessToken(token) {
1046
+ this.tokens.set(token);
1047
+ }
1048
+ // Default X-Workspace-ID for the generic transport, also propagated to the
1049
+ // workspace-scoped modules so one call configures the whole client.
1050
+ setWorkspaceId(workspaceId) {
1051
+ this.workspaceId = workspaceId;
1052
+ this.billing.setWorkspaceId(workspaceId);
1053
+ this.workspaces.setWorkspaceId(workspaceId);
1054
+ this.customers.setWorkspaceId(workspaceId);
1055
+ }
1056
+ // ── Generic transport ──────────────────────────────────────────────────────
1057
+ // A Fonderie-aware HTTP client for endpoints outside the typed modules (an
1058
+ // app's own routes on the same backend). It attaches the shared JWT and
1059
+ // X-Workspace-ID automatically and returns Fonderie's { reason, explanation,
1060
+ // result } envelope — so you don't hand-roll auth for custom endpoints.
1061
+ request(opts) {
1062
+ return this.http.request({
1063
+ method: opts.method,
1064
+ path: opts.path,
1065
+ body: opts.body,
1066
+ token: this.tokens.get(),
1067
+ workspaceId: opts.workspaceId ?? this.workspaceId
1068
+ });
1069
+ }
1070
+ get(path, config) {
1071
+ return this.request({ method: "GET", path, workspaceId: config?.workspaceId });
1072
+ }
1073
+ post(path, body, config) {
1074
+ return this.request({ method: "POST", path, body, workspaceId: config?.workspaceId });
1075
+ }
1076
+ put(path, body, config) {
1077
+ return this.request({ method: "PUT", path, body, workspaceId: config?.workspaceId });
1078
+ }
1079
+ patch(path, body, config) {
1080
+ return this.request({ method: "PATCH", path, body, workspaceId: config?.workspaceId });
1081
+ }
1082
+ delete(path, config) {
1083
+ return this.request({ method: "DELETE", path, workspaceId: config?.workspaceId });
1039
1084
  }
1040
1085
  };
1041
1086
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/http.ts","../src/modules/audit.ts","../src/modules/auth.ts","../src/modules/billing.ts","../src/modules/customers.ts","../src/modules/webhooks.ts","../src/modules/workspaces.ts","../src/token-store.ts","../src/client.ts","../src/modules/config-admin.ts","../src/modules/courier-admin.ts"],"sourcesContent":["import type { IApiError } from './types';\n\nexport class FonderieApiError extends Error {\n\tconstructor(\n\t\tpublic readonly reason: string,\n\t\tpublic readonly explanation: string,\n\t\tpublic readonly status: number,\n\t\tpublic readonly details?: unknown,\n\t) {\n\t\tsuper(explanation);\n\t\tthis.name = 'FonderieApiError';\n\t}\n}\n\nexport interface IRequestOptions {\n\tmethod: string;\n\tpath: string;\n\tbody?: unknown;\n\ttoken?: string | undefined;\n\tcookie?: string | undefined;\n\t// Resolves the billing subscriber to a workspace (@fonderie/billing's\n\t// resolveSubscriber falls back to the session user when omitted).\n\tworkspaceId?: string | undefined;\n}\n\nexport class HttpClient {\n\tconstructor(private baseUrl: string) {}\n\n\tasync request<T>(opts: IRequestOptions): Promise<T> {\n\t\tconst headers: Record<string, string> = {\n\t\t\t'Content-Type': 'application/json',\n\t\t};\n\n\t\tif (opts.token) headers['Authorization'] = `Bearer ${opts.token}`;\n\t\tif (opts.cookie) headers['Cookie'] = opts.cookie;\n\t\tif (opts.workspaceId) headers['X-Workspace-ID'] = opts.workspaceId;\n\n\t\tconst fetchInit: RequestInit = {\n\t\t\tmethod: opts.method,\n\t\t\theaders,\n\t\t\tcredentials: 'include',\n\t\t};\n\t\tif (opts.body !== undefined) fetchInit.body = JSON.stringify(opts.body);\n\n\t\tconst res = await fetch(`${this.baseUrl}${opts.path}`, fetchInit);\n\n\t\t// 204 No Content (e.g. some DELETE routes) has no body to parse — a\n\t\t// bare `res.json()` throws on the empty string.\n\t\tif (res.status === 204) {\n\t\t\tif (!res.ok) throw new FonderieApiError('unknown', res.statusText, res.status);\n\t\t\treturn undefined as T;\n\t\t}\n\n\t\tconst data = (await res.json()) as T | IApiError;\n\n\t\tif (!res.ok || res.status === 202) {\n\t\t\tconst err = data as IApiError;\n\t\t\tthrow new FonderieApiError(err.reason, err.explanation, res.status, err.details);\n\t\t}\n\n\t\treturn data as T;\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type { IApiResponse, IAuditPageResult } from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface IListAuditEventsInput {\n\ttype?: string;\n\tactorId?: string;\n\tfrom?: Date;\n\tto?: Date;\n\tlimit?: number;\n\tcursor?: string;\n}\n\n// ── Audit client ─────────────────────────────────────────────────────────────\n\nexport class AuditClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes the audit query to a workspace (X-Workspace-ID). Falls back to\n\t// the caller's personal workspace when unset, same as billing/workspaces.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\tlistEvents(input: IListAuditEventsInput = {}) {\n\t\tconst params = new URLSearchParams();\n\t\tif (input.limit !== undefined) params.set('limit', String(input.limit));\n\t\tif (input.type) params.set('type', input.type);\n\t\tif (input.actorId) params.set('actorId', input.actorId);\n\t\tif (input.from) params.set('from', input.from.toISOString());\n\t\tif (input.to) params.set('to', input.to.toISOString());\n\t\tif (input.cursor) params.set('cursor', input.cursor);\n\t\tconst qs = params.toString();\n\n\t\treturn this.http.request<IApiResponse<IAuditPageResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/audit${qs ? `?${qs}` : ''}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIApiResponse,\n\tILoginResult,\n\tIMeResult,\n\tIMfaEnabledResult,\n\tIMfaSetupResult,\n\tIRefreshResult,\n\tIRegisterResult,\n\tIResendVerificationResult,\n\tIVerifyEmailResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface IRegisterInput {\n\temail: string;\n\tpassword: string;\n\tfirstName?: string;\n\tlastName?: string;\n}\n\nexport interface ILoginInput {\n\temail: string;\n\tpassword: string;\n}\n\nexport interface IResetPasswordInput {\n\t// The 6-digit code emailed by forgotPassword. Matches @fonderie/auth's\n\t// resetPasswordSchema ({ pin, password }); the route is POST /auth/email/reset.\n\tpin: string;\n\tpassword: string;\n}\n\n// User updates are split by @fonderie/auth into dedicated, individually\n// validated routes — there is no combined /users/update endpoint.\nexport interface IUpdateProfileInput {\n\tfirstName?: string;\n\tlastName?: string;\n\tavatarUrl?: string;\n}\n\nexport interface IUpdatePreferencesInput {\n\tlocale?: string;\n\ttimezone?: string;\n\tnotifications?: unknown;\n\temailDigest?: unknown;\n\tdateFormat?: unknown;\n\ttimeFormat?: unknown;\n}\n\nexport interface IChangePasswordInput {\n\tcurrentPassword: string;\n\tnewPassword: string;\n}\n\n// ── MFA sub-client ───────────────────────────────────────────────────────────\n\nclass MfaClient {\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate token: () => string | undefined,\n\t) {}\n\n\tsetup() {\n\t\treturn this.http.request<IApiResponse<IMfaSetupResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/setup',\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n\n\tverify(token: string) {\n\t\treturn this.http.request<IApiResponse<IMfaEnabledResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/verify',\n\t\t\tbody: { token },\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n\n\tdisable(token: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/disable',\n\t\t\tbody: { token },\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n\n\t// POST /auth/mfa/backup-codes (mfaTokenSchema { token }) — returns a fresh set.\n\tregenerateBackupCodes(token: string) {\n\t\treturn this.http.request<IApiResponse<{ backupCodes: string[] }>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/backup-codes',\n\t\t\tbody: { token },\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n}\n\n// ── Auth client ──────────────────────────────────────────────────────────────\n\nexport class AuthClient {\n\treadonly mfa: MfaClient;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {\n\t\tthis.mfa = new MfaClient(http, () => this.tokens.get());\n\t}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// ── Public ─────────────────────────────────────────────────────────────────\n\n\tregister(input: IRegisterInput) {\n\t\treturn this.http.request<IApiResponse<IRegisterResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/register',\n\t\t\tbody: input,\n\t\t});\n\t}\n\n\tlogin(input: ILoginInput) {\n\t\treturn this.http.request<IApiResponse<ILoginResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/login',\n\t\t\tbody: input,\n\t\t});\n\t}\n\n\trefreshTokens(refreshToken?: string) {\n\t\treturn this.http.request<IApiResponse<IRefreshResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/refresh',\n\t\t\tbody: refreshToken ? { refreshToken } : undefined,\n\t\t});\n\t}\n\n\tforgotPassword(email: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/email/forgot',\n\t\t\tbody: { email },\n\t\t});\n\t}\n\n\tresetPassword(input: IResetPasswordInput) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/email/reset',\n\t\t\tbody: input,\n\t\t});\n\t}\n\n\tverifyEmail(token: string) {\n\t\t// @fonderie/auth registers this as POST /auth/verify with body { token }\n\t\t// (verifySchema = { token: sixDigitPin }).\n\t\treturn this.http.request<IApiResponse<IVerifyEmailResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/verify',\n\t\t\tbody: { token },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Protected ──────────────────────────────────────────────────────────────\n\n\tlogout(refreshToken?: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/logout',\n\t\t\tbody: refreshToken ? { refreshToken } : undefined,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tsendVerificationEmail() {\n\t\t// @fonderie/auth registers this as GET /auth/send-verification (requireAuth).\n\t\treturn this.http.request<IApiResponse<IResendVerificationResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/auth/send-verification',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Protected + Verified ───────────────────────────────────────────────────\n\n\tgetUser() {\n\t\treturn this.http.request<IApiResponse<IMeResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/users',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdateProfile(input: IUpdateProfileInput) {\n\t\treturn this.http.request<IApiResponse<IMeResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/profile',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdatePreferences(input: IUpdatePreferencesInput) {\n\t\treturn this.http.request<IApiResponse<IMeResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/preferences',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdateEmail(email: string) {\n\t\treturn this.http.request<IApiResponse<unknown>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/email',\n\t\t\tbody: { email },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdatePhone(phone: string) {\n\t\treturn this.http.request<IApiResponse<unknown>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/phone',\n\t\t\tbody: { phone },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tchangePassword(input: IChangePasswordInput) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/password',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// GET /users/export — the caller's own data as a portable bundle (SAR).\n\texportData() {\n\t\treturn this.http.request<IApiResponse<unknown>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/users/export',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tdeleteUser() {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: '/users',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIApiResponse,\n\tICheckoutUrlResult,\n\tIPlanListResult,\n\tIPlanResult,\n\tIPortalUrlResult,\n\tISubscriptionResult,\n\tIUsageResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ICheckoutInput {\n\tplan: string;\n\tinterval?: 'month' | 'year';\n}\n\nexport interface IRecordUsageInput {\n\tmetric: string;\n\tquantity?: number;\n}\n\nexport interface ICreatePlanInput {\n\tname: string;\n\tdescription?: string | null;\n\ttier?: number;\n\tseats?: number | null;\n\ttrialDays?: number;\n\tmonthlyAmount?: number | null;\n\tmonthlyPriceId?: string | null;\n\tyearlyAmount?: number | null;\n\tyearlyPriceId?: string | null;\n\tfeatures?: unknown;\n\tmetadata?: unknown;\n}\n\nexport type IUpdatePlanInput = Partial<ICreatePlanInput>;\n\n// ── Billing client ───────────────────────────────────────────────────────────\n\nexport class BillingClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Subscriber is resolved from this workspace ID (X-Workspace-ID) when set,\n\t// falling back to the session user otherwise — see @fonderie/billing's\n\t// resolveSubscriber. Call with undefined to bill the signed-in user directly.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t// ── Plans — public read-only ────────────────────────────────────────────────\n\n\tlistPlans() {\n\t\treturn this.http.request<IApiResponse<IPlanListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/plans',\n\t\t});\n\t}\n\n\tgetPlan(planId: string) {\n\t\treturn this.http.request<IApiResponse<IPlanResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/plans/${planId}`,\n\t\t});\n\t}\n\n\t// ── Plans — admin write ──────────────────────────────────────────────────────\n\t// Unlike every other write in this client, @fonderie/billing does not gate\n\t// these with requireAuth or an admin token — \"the caller is responsible for\n\t// authorization\" (its own routes.ts comment). Sending the session token is\n\t// harmless (the server ignores it) but does nothing on its own; gate access\n\t// to these calls yourself (an app-level route guard, a reverse-proxy admin\n\t// zone, or similar) before wiring them into a UI.\n\n\tcreatePlan(input: ICreatePlanInput) {\n\t\treturn this.http.request<IApiResponse<IPlanResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/plans',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdatePlan(planId: string, input: IUpdatePlanInput) {\n\t\treturn this.http.request<IApiResponse<IPlanResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/plans/${planId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tdeletePlan(planId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/plans/${planId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Subscription ─────────────────────────────────────────────────────────────\n\n\tgetSubscription() {\n\t\treturn this.http.request<IApiResponse<ISubscriptionResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/billing/subscription',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Checkout / portal ────────────────────────────────────────────────────────\n\n\tcreateCheckoutSession(input: ICheckoutInput) {\n\t\treturn this.http.request<IApiResponse<ICheckoutUrlResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/billing/checkout',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreatePortalSession() {\n\t\treturn this.http.request<IApiResponse<IPortalUrlResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/billing/portal',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Usage ────────────────────────────────────────────────────────────────────\n\n\trecordUsage(input: IRecordUsageInput) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/billing/usage',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetUsage(metric: string) {\n\t\treturn this.http.request<IApiResponse<IUsageResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/billing/usage/${metric}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tCustomerLabelType,\n\tCustomerSex,\n\tCustomerType,\n\tIApiResponse,\n\tICustomerAddressListResult,\n\tICustomerAddressResult,\n\tICustomerDetailD2DTO,\n\tICustomerDetailDTO,\n\tICustomerEmailListResult,\n\tICustomerEmailResult,\n\tICustomerLabelListResult,\n\tICustomerListResult,\n\tICustomerNoteListResult,\n\tICustomerNoteResult,\n\tICustomerPhoneListResult,\n\tICustomerPhoneResult,\n\tICustomerRelationshipListResult,\n\tICustomerRelationshipResult,\n\tICustomerResult,\n\tICustomerTagListResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface IListCustomersInput {\n\tsearch?: string;\n\tblacklisted?: boolean;\n\tlimit?: number;\n\toffset?: number;\n}\n\nexport interface IGetCustomerInput {\n\tdepth?: 1 | 2;\n}\n\nexport interface ICreateCustomerInput {\n\ttype?: CustomerType;\n\tsex?: CustomerSex;\n\tfirstName?: string | null;\n\tlastName?: string | null;\n\tcompanyName?: string | null;\n\tavatarUrl?: string | null;\n\tlocale?: string | null;\n\treferenceCode?: string | null;\n\treferralCode?: string | null;\n\treferredByCode?: string | null;\n}\n\nexport type IUpdateCustomerInput = ICreateCustomerInput;\n\nexport interface IBlacklistCustomerInput {\n\treason?: string;\n}\n\nexport interface IAddEmailInput {\n\temail: string;\n\tlabel?: string;\n\tisPrimary?: boolean;\n}\n\nexport interface IAddPhoneInput {\n\tphone: string;\n\tlabel?: string;\n\tisPrimary?: boolean;\n}\n\nexport interface IAddAddressInput {\n\tcountryIso: string;\n\tzipPostalCode: string;\n\tsubdivision1Iso?: string | null;\n\tsubdivision2Iso?: string | null;\n\tunit?: string | null;\n\tline1?: string | null;\n\tline2?: string | null;\n\tlabel?: string;\n\tisPrimary?: boolean;\n}\n\nexport interface IAddRelationshipInput {\n\trelatedId: string;\n\trelationship?: string;\n\tisPrimary?: boolean;\n}\n\n// ── Customers client ─────────────────────────────────────────────────────────\n\nexport class CustomersClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes every request to this workspace (X-Workspace-ID). Falls back to\n\t// the caller's personal workspace when unset, same as billing/workspaces/audit/webhooks.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t// ── Core customer CRUD ───────────────────────────────────────────────────────\n\n\tlistCustomers(input: IListCustomersInput = {}) {\n\t\tconst params = new URLSearchParams();\n\t\tif (input.search !== undefined) params.set('search', input.search);\n\t\tif (input.blacklisted !== undefined) params.set('blacklisted', String(input.blacklisted));\n\t\tif (input.limit !== undefined) params.set('limit', String(input.limit));\n\t\tif (input.offset !== undefined) params.set('offset', String(input.offset));\n\t\tconst qs = params.toString();\n\n\t\treturn this.http.request<IApiResponse<ICustomerListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: qs ? `/customers?${qs}` : '/customers',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreateCustomer(input: ICreateCustomerInput = {}) {\n\t\treturn this.http.request<IApiResponse<ICustomerResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/customers',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// depth defaults to 2 server-side; pass { depth: 1 } for one level of\n\t// relationship expansion instead of the D2 (nested-relationships) shape.\n\tgetCustomer(customerId: string, input: IGetCustomerInput = {}) {\n\t\tconst qs = input.depth === 1 ? '?depth=1' : '';\n\t\treturn this.http.request<IApiResponse<ICustomerDetailDTO | ICustomerDetailD2DTO>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}${qs}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateCustomer(customerId: string, input: IUpdateCustomerInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tdeleteCustomer(customerId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tblacklistCustomer(customerId: string, input: IBlacklistCustomerInput = {}) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/blacklist`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tunblacklistCustomer(customerId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/unblacklist`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Emails ───────────────────────────────────────────────────────────────────\n\n\tlistEmails(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerEmailListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/emails`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddEmail(customerId: string, input: IAddEmailInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerEmailResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/emails`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Only the label is editable — email addresses themselves are immutable\n\t// once added; remove and re-add to change the address.\n\tupdateEmailLabel(customerId: string, emailId: string, label: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerEmailResult>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/customers/${customerId}/emails/${emailId}`,\n\t\t\tbody: { label },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryEmail(customerId: string, emailId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/emails/${emailId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveEmail(customerId: string, emailId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/emails/${emailId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Phones ───────────────────────────────────────────────────────────────────\n\n\tlistPhones(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerPhoneListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/phones`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddPhone(customerId: string, input: IAddPhoneInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerPhoneResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/phones`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Only the label is editable — same as updateEmailLabel.\n\tupdatePhoneLabel(customerId: string, phoneId: string, label: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerPhoneResult>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/customers/${customerId}/phones/${phoneId}`,\n\t\t\tbody: { label },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryPhone(customerId: string, phoneId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/phones/${phoneId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremovePhone(customerId: string, phoneId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/phones/${phoneId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Addresses ────────────────────────────────────────────────────────────────\n\n\tlistAddresses(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerAddressListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/addresses`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddAddress(customerId: string, input: IAddAddressInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerAddressResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/addresses`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Only the label is editable — same as updateEmailLabel.\n\tupdateAddressLabel(customerId: string, addrId: string, label: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerAddressResult>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/customers/${customerId}/addresses/${addrId}`,\n\t\t\tbody: { label },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryAddress(customerId: string, addrId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/addresses/${addrId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveAddress(customerId: string, addrId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/addresses/${addrId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Notes ────────────────────────────────────────────────────────────────────\n\n\tlistNotes(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerNoteListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/notes`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreateNote(customerId: string, body: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerNoteResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/notes`,\n\t\t\tbody: { body },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateNote(customerId: string, noteId: string, body: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerNoteResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/notes/${noteId}`,\n\t\t\tbody: { body },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tdeleteNote(customerId: string, noteId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/notes/${noteId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Tags ─────────────────────────────────────────────────────────────────────\n\n\tlistTags(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerTagListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/tags`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddTag(customerId: string, tag: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/tags`,\n\t\t\tbody: { tag },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveTag(customerId: string, tag: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/tags/${encodeURIComponent(tag)}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Relationships ────────────────────────────────────────────────────────────\n\n\tlistRelationships(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerRelationshipListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/relationships`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddRelationship(customerId: string, input: IAddRelationshipInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerRelationshipResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/relationships`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryRelationship(customerId: string, relatedId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/relationships/${relatedId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveRelationship(customerId: string, relatedId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/relationships/${relatedId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Labels ───────────────────────────────────────────────────────────────────\n\t// Shared vocabulary across all customers in the workspace — labels are\n\t// looked up/created implicitly by addEmail/addPhone/addAddress's `label`\n\t// string; these two methods are for managing the vocabulary directly\n\t// (e.g. an admin screen listing/pruning unused labels).\n\n\tlistLabels(type: CustomerLabelType) {\n\t\treturn this.http.request<IApiResponse<ICustomerLabelListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/labels?type=${type}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveLabel(labelId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/labels/${labelId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIApiResponse,\n\tITestWebhookResult,\n\tIWebhookDeliveryListResult,\n\tIWebhookEndpointCreatedDTO,\n\tIWebhookEndpointDTO,\n\tIWebhookEndpointListResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ICreateWebhookEndpointInput {\n\turl: string;\n\tevents?: string[];\n}\n\nexport interface IUpdateWebhookEndpointInput {\n\turl?: string;\n\tevents?: string[];\n\tenabled?: boolean;\n}\n\n// ── Webhooks client ──────────────────────────────────────────────────────────\n\nexport class WebhooksClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes every request to this workspace (X-Workspace-ID). Falls back to\n\t// the caller's personal workspace when unset, same as billing/workspaces/audit.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\tlistEndpoints() {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/webhooks',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// The response includes `secret` — shown once, at creation. There is no\n\t// way to retrieve it again afterward; store it or let the caller copy it.\n\tcreateEndpoint(input: ICreateWebhookEndpointInput) {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointCreatedDTO>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/webhooks',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetEndpoint(endpointId: string) {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointDTO>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/webhooks/${endpointId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateEndpoint(endpointId: string, input: IUpdateWebhookEndpointInput) {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointDTO>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/webhooks/${endpointId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tdeleteEndpoint(endpointId: string) {\n\t\treturn this.http.request<undefined>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/webhooks/${endpointId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tlistDeliveries(endpointId: string) {\n\t\treturn this.http.request<IApiResponse<IWebhookDeliveryListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/webhooks/${endpointId}/deliveries`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\ttestEndpoint(endpointId: string) {\n\t\treturn this.http.request<IApiResponse<ITestWebhookResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/webhooks/${endpointId}/test`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIAcceptInvitationResult,\n\tIApiResponse,\n\tIInvitationListResult,\n\tIInviteResult,\n\tIMemberListResult,\n\tIRoleListResult,\n\tIRoleResult,\n\tIWorkspaceListResult,\n\tIWorkspaceResult,\n\tIWorkspaceSettingsResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ICreateWorkspaceInput {\n\tname: string;\n\tdescription?: string;\n\ttype?: string;\n}\n\nexport interface IUpdateWorkspaceInput {\n\tname?: string;\n\tdescription?: string | null;\n\tmotto?: string | null;\n\tphone?: string | null;\n\tbusinessType?: string | null;\n\taddress?: {\n\t\tline1?: string;\n\t\tline2?: string;\n\t\tcity?: string;\n\t\tstate?: string;\n\t\tzip?: string;\n\t\tcountry?: string;\n\t} | null;\n}\n\nexport interface IInviteEntry {\n\temail: string;\n\troleId?: string;\n}\n\nexport interface IUpdateSettingsInput {\n\tlocale?: string;\n\ttimezone?: string;\n\tcurrency?: string;\n\tdateFormat?: string;\n\ttimeFormat?: string;\n}\n\nexport interface ICreateRoleInput {\n\tname: string;\n\tdescription?: string;\n}\n\nexport interface IUpdateRoleInput {\n\tname?: string;\n\tdescription?: string | null;\n\tactive?: boolean;\n}\n\nexport interface IRolePermissionInput {\n\tpermissionKey: string;\n\tcanCreate?: boolean;\n\tcanRead?: boolean;\n\tcanUpdate?: boolean;\n\tcanDelete?: boolean;\n}\n\nexport interface IRolePermission {\n\tpermissionKey: string;\n\tcanCreate: boolean;\n\tcanRead: boolean;\n\tcanUpdate: boolean;\n\tcanDelete: boolean;\n}\n\nexport interface IRolePermissionsResult {\n\tpermissions: IRolePermission[];\n}\n\n// ── Workspaces client ────────────────────────────────────────────────────────\n\nexport class WorkspacesClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes every subsequent request to this workspace (X-Workspace-ID).\n\t// Falls back to the caller's personal workspace when unset.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t// ── Workspace creation + listing ─────────────────────────────────────────────\n\n\tlistWorkspaces() {\n\t\treturn this.http.request<IApiResponse<IWorkspaceListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tcreateWorkspace(input: ICreateWorkspaceInput) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tgetWorkspace(id: string) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/${id}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdateWorkspace(input: IUpdateWorkspaceInput) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/workspaces',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Personal workspaces can't be archived — the server returns 403 if you try.\n\tarchiveWorkspace() {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/archive',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\trestoreWorkspace() {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/restore',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Roles ────────────────────────────────────────────────────────────────────\n\n\tlistRoles() {\n\t\treturn this.http.request<IApiResponse<IRoleListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/roles',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreateRole(input: ICreateRoleInput) {\n\t\treturn this.http.request<IApiResponse<IRoleResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/roles',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetRole(roleId: string) {\n\t\treturn this.http.request<IApiResponse<IRoleResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/roles/${roleId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateRole(roleId: string, input: IUpdateRoleInput) {\n\t\treturn this.http.request<IApiResponse<IRoleResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/workspaces/roles/${roleId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveRole(roleId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/roles/${roleId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetRolePermissions(roleId: string) {\n\t\treturn this.http.request<IApiResponse<IRolePermissionsResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/roles/${roleId}/permissions`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetRolePermissions(roleId: string, permissions: IRolePermissionInput[]) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/workspaces/roles/${roleId}/permissions`,\n\t\t\tbody: { permissions },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Members ──────────────────────────────────────────────────────────────────\n\n\tlistMembers() {\n\t\treturn this.http.request<IApiResponse<IMemberListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/members',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveMember(userId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/members/${userId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetMemberRoles(userId: string) {\n\t\treturn this.http.request<IApiResponse<IRoleListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/members/${userId}/roles`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddMemberRole(userId: string, roleId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/workspaces/members/${userId}/roles`,\n\t\t\tbody: { roleId },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveMemberRole(userId: string, roleId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/members/${userId}/roles/${roleId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Invitations ──────────────────────────────────────────────────────────────\n\n\tlistInvitations() {\n\t\treturn this.http.request<IApiResponse<IInvitationListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/invitations',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tinvite(entries: IInviteEntry | IInviteEntry[]) {\n\t\treturn this.http.request<IApiResponse<IInviteResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/invitations',\n\t\t\tbody: entries,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcancelInvitation(inviteId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/invitations/${inviteId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tacceptInvitation(pin: string) {\n\t\treturn this.http.request<IApiResponse<IAcceptInvitationResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/invitations/accept',\n\t\t\tbody: { pin },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Settings ─────────────────────────────────────────────────────────────────\n\n\tgetSettings() {\n\t\treturn this.http.request<IApiResponse<IWorkspaceSettingsResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/settings',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateSettings(input: IUpdateSettingsInput) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceSettingsResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/workspaces/settings',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","// Shared by every module of a FonderieClient so that setting the access\n// token on one (e.g. AuthClient after login) is immediately visible to all\n// the others (e.g. BillingClient) — they're separate module instances, but\n// one session.\nexport class TokenStore {\n\tprivate token: string | undefined;\n\n\tconstructor(initial?: string) {\n\t\tthis.token = initial;\n\t}\n\n\tget(): string | undefined {\n\t\treturn this.token;\n\t}\n\n\tset(token: string | undefined) {\n\t\tthis.token = token;\n\t}\n}\n","import { HttpClient } from './http';\nimport { AuditClient } from './modules/audit';\nimport { AuthClient } from './modules/auth';\nimport { BillingClient } from './modules/billing';\nimport { CustomersClient } from './modules/customers';\nimport { WebhooksClient } from './modules/webhooks';\nimport { WorkspacesClient } from './modules/workspaces';\nimport { TokenStore } from './token-store';\n\nexport interface IFonderieClientOptions {\n\tbaseUrl: string;\n\taccessToken?: string;\n}\n\nexport class FonderieClient {\n\treadonly auth: AuthClient;\n\treadonly billing: BillingClient;\n\treadonly workspaces: WorkspacesClient;\n\treadonly audit: AuditClient;\n\treadonly webhooks: WebhooksClient;\n\treadonly customers: CustomersClient;\n\n\tprivate http: HttpClient;\n\n\tconstructor(opts: IFonderieClientOptions) {\n\t\tthis.http = new HttpClient(opts.baseUrl);\n\t\tconst tokens = new TokenStore(opts.accessToken);\n\t\tthis.auth = new AuthClient(this.http, tokens);\n\t\tthis.billing = new BillingClient(this.http, tokens);\n\t\tthis.workspaces = new WorkspacesClient(this.http, tokens);\n\t\tthis.audit = new AuditClient(this.http, tokens);\n\t\tthis.webhooks = new WebhooksClient(this.http, tokens);\n\t\tthis.customers = new CustomersClient(this.http, tokens);\n\t}\n}\n","import { HttpClient } from '../http';\nimport type {\n\tIApiResponse,\n\tIConfigEntry,\n\tIConfigRevision,\n\tIRevealSecretResult,\n\tISecretEntry,\n\tISecretRevision,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ISetConfigInput {\n\tvalue: unknown;\n\tdescription?: string;\n\tifVersion?: number;\n}\n\nexport interface ISetSecretInput {\n\tvalue: string;\n\tdescription?: string;\n\tifVersion?: number;\n}\n\nexport interface IRollbackInput {\n\ttoVersion: number;\n}\n\nexport interface IConfigAdminClientOptions {\n\tbaseUrl: string;\n\tadminToken: string;\n}\n\nfunction envQuery(environment?: string): string {\n\treturn environment ? `?environment=${encodeURIComponent(environment)}` : '';\n}\n\n// ── Config admin client ──────────────────────────────────────────────────────\n//\n// Separate from FonderieClient on purpose, for the same reason as\n// CourierAdminClient: @fonderie/config's admin routes (/admin/config/*,\n// /admin/secrets/*) are guarded by a static bearer token configured on the\n// server, not the signed-in user's session. Construct with that token\n// directly; it shares no state with AuthClient/BillingClient/WorkspacesClient.\nexport class ConfigAdminClient {\n\tprivate http: HttpClient;\n\tprivate adminToken: string;\n\n\tconstructor(opts: IConfigAdminClientOptions) {\n\t\tthis.http = new HttpClient(opts.baseUrl);\n\t\tthis.adminToken = opts.adminToken;\n\t}\n\n\t// ── Config ───────────────────────────────────────────────────────────────\n\n\tlistConfig(environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/config${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tgetConfig(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/config/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tsetConfig(key: string, input: ISetConfigInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/admin/config/${key}${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tdeleteConfig(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/admin/config/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tlistConfigRevisions(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigRevision[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/config/${key}/revisions${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\trollbackConfig(key: string, input: IRollbackInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/config/${key}/rollback${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\t// ── Secrets (masked) ─────────────────────────────────────────────────────\n\n\tlistSecrets(environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/secrets${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tgetSecret(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/secrets/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tsetSecret(key: string, input: ISetSecretInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/admin/secrets/${key}${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tdeleteSecret(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/admin/secrets/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tlistSecretRevisions(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretRevision[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/secrets/${key}/revisions${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\trollbackSecret(key: string, input: IRollbackInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/secrets/${key}/rollback${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\t// POST (not GET) so the decrypted value never lands in a URL or access log.\n\trevealSecret(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IRevealSecretResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/secrets/${key}/reveal${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n}\n","import { HttpClient } from '../http';\nimport type { IApiResponse, ITemplateEntry, ITemplateRevision } from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ISetTemplateInput {\n\ttext: string;\n\tsubject?: string;\n\thtml?: string;\n\tactive?: boolean;\n\tifVersion?: number;\n}\n\nexport interface IRollbackTemplateInput {\n\ttoVersion: number;\n}\n\nexport interface ICourierAdminClientOptions {\n\tbaseUrl: string;\n\tadminToken: string;\n}\n\n// ── Courier admin client ─────────────────────────────────────────────────────\n//\n// Separate from FonderieClient on purpose: @fonderie/courier's admin routes\n// (/admin/templates/*) are guarded by a static bearer token configured on the\n// server (CourierModule's adminToken), not the signed-in user's session —\n// the same model @fonderie/config's admin surface uses, and the one the\n// `fonderie template`/`fonderie config` CLI commands already speak to via\n// FONDERIE_ADMIN_URL/FONDERIE_ADMIN_TOKEN. Bundling this into FonderieClient\n// would suggest an end-user's session token can reach it, which it can't —\n// this is an ops/admin-dashboard client, constructed with its own token.\nexport class CourierAdminClient {\n\tprivate http: HttpClient;\n\tprivate adminToken: string;\n\n\tconstructor(opts: ICourierAdminClientOptions) {\n\t\tthis.http = new HttpClient(opts.baseUrl);\n\t\tthis.adminToken = opts.adminToken;\n\t}\n\n\tlistTemplates() {\n\t\treturn this.http.request<IApiResponse<ITemplateEntry[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/admin/templates',\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tgetTemplate(type: string, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateEntry>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/templates/${type}${q}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tsetTemplate(type: string, input: ISetTemplateInput, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateEntry>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/admin/templates/${type}${q}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tdeleteTemplate(type: string, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/admin/templates/${type}${q}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tlistRevisions(type: string, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateRevision[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/templates/${type}/revisions${q}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\trollback(type: string, input: IRollbackTemplateInput, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateEntry>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/templates/${type}/rollback${q}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/http.ts","../src/modules/audit.ts","../src/modules/auth.ts","../src/modules/billing.ts","../src/modules/customers.ts","../src/modules/webhooks.ts","../src/modules/workspaces.ts","../src/token-store.ts","../src/client.ts","../src/modules/config-admin.ts","../src/modules/courier-admin.ts"],"sourcesContent":["import type { IApiError } from './types';\n\nexport class FonderieApiError extends Error {\n\tconstructor(\n\t\tpublic readonly reason: string,\n\t\tpublic readonly explanation: string,\n\t\tpublic readonly status: number,\n\t\tpublic readonly details?: unknown,\n\t) {\n\t\tsuper(explanation);\n\t\tthis.name = 'FonderieApiError';\n\t}\n}\n\nexport interface IRequestOptions {\n\tmethod: string;\n\tpath: string;\n\tbody?: unknown;\n\ttoken?: string | undefined;\n\tcookie?: string | undefined;\n\t// Resolves the billing subscriber to a workspace (@fonderie/billing's\n\t// resolveSubscriber falls back to the session user when omitted).\n\tworkspaceId?: string | undefined;\n}\n\nexport class HttpClient {\n\tconstructor(private baseUrl: string) {}\n\n\tasync request<T>(opts: IRequestOptions): Promise<T> {\n\t\tconst headers: Record<string, string> = {\n\t\t\t'Content-Type': 'application/json',\n\t\t};\n\n\t\tif (opts.token) headers['Authorization'] = `Bearer ${opts.token}`;\n\t\tif (opts.cookie) headers['Cookie'] = opts.cookie;\n\t\tif (opts.workspaceId) headers['X-Workspace-ID'] = opts.workspaceId;\n\n\t\tconst fetchInit: RequestInit = {\n\t\t\tmethod: opts.method,\n\t\t\theaders,\n\t\t\tcredentials: 'include',\n\t\t};\n\t\tif (opts.body !== undefined) fetchInit.body = JSON.stringify(opts.body);\n\n\t\tconst res = await fetch(`${this.baseUrl}${opts.path}`, fetchInit);\n\n\t\t// 204 No Content (e.g. some DELETE routes) has no body to parse — a\n\t\t// bare `res.json()` throws on the empty string.\n\t\tif (res.status === 204) {\n\t\t\tif (!res.ok) throw new FonderieApiError('unknown', res.statusText, res.status);\n\t\t\treturn undefined as T;\n\t\t}\n\n\t\tconst data = (await res.json()) as T | IApiError;\n\n\t\tif (!res.ok || res.status === 202) {\n\t\t\tconst err = data as IApiError;\n\t\t\tthrow new FonderieApiError(err.reason, err.explanation, res.status, err.details);\n\t\t}\n\n\t\treturn data as T;\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type { IApiResponse, IAuditPageResult } from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface IListAuditEventsInput {\n\ttype?: string;\n\tactorId?: string;\n\tfrom?: Date;\n\tto?: Date;\n\tlimit?: number;\n\tcursor?: string;\n}\n\n// ── Audit client ─────────────────────────────────────────────────────────────\n\nexport class AuditClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes the audit query to a workspace (X-Workspace-ID). Falls back to\n\t// the caller's personal workspace when unset, same as billing/workspaces.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\tlistEvents(input: IListAuditEventsInput = {}) {\n\t\tconst params = new URLSearchParams();\n\t\tif (input.limit !== undefined) params.set('limit', String(input.limit));\n\t\tif (input.type) params.set('type', input.type);\n\t\tif (input.actorId) params.set('actorId', input.actorId);\n\t\tif (input.from) params.set('from', input.from.toISOString());\n\t\tif (input.to) params.set('to', input.to.toISOString());\n\t\tif (input.cursor) params.set('cursor', input.cursor);\n\t\tconst qs = params.toString();\n\n\t\treturn this.http.request<IApiResponse<IAuditPageResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/audit${qs ? `?${qs}` : ''}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIApiResponse,\n\tILoginResult,\n\tIMeResult,\n\tIMfaEnabledResult,\n\tIMfaSetupResult,\n\tIRefreshResult,\n\tIRegisterResult,\n\tIResendVerificationResult,\n\tIVerifyEmailResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface IRegisterInput {\n\temail: string;\n\tpassword: string;\n\tfirstName?: string;\n\tlastName?: string;\n}\n\nexport interface ILoginInput {\n\temail: string;\n\tpassword: string;\n}\n\nexport interface IResetPasswordInput {\n\t// The 6-digit code emailed by forgotPassword. Matches @fonderie/auth's\n\t// resetPasswordSchema ({ pin, password }); the route is POST /auth/email/reset.\n\tpin: string;\n\tpassword: string;\n}\n\n// User updates are split by @fonderie/auth into dedicated, individually\n// validated routes — there is no combined /users/update endpoint.\nexport interface IUpdateProfileInput {\n\tfirstName?: string;\n\tlastName?: string;\n\tavatarUrl?: string;\n}\n\nexport interface IUpdatePreferencesInput {\n\tlocale?: string;\n\ttimezone?: string;\n\tnotifications?: unknown;\n\temailDigest?: unknown;\n\tdateFormat?: unknown;\n\ttimeFormat?: unknown;\n}\n\nexport interface IChangePasswordInput {\n\tcurrentPassword: string;\n\tnewPassword: string;\n}\n\n// ── MFA sub-client ───────────────────────────────────────────────────────────\n\nclass MfaClient {\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate token: () => string | undefined,\n\t) {}\n\n\tsetup() {\n\t\treturn this.http.request<IApiResponse<IMfaSetupResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/setup',\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n\n\tverify(token: string) {\n\t\treturn this.http.request<IApiResponse<IMfaEnabledResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/verify',\n\t\t\tbody: { token },\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n\n\tdisable(token: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/disable',\n\t\t\tbody: { token },\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n\n\t// POST /auth/mfa/backup-codes (mfaTokenSchema { token }) — returns a fresh set.\n\tregenerateBackupCodes(token: string) {\n\t\treturn this.http.request<IApiResponse<{ backupCodes: string[] }>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/mfa/backup-codes',\n\t\t\tbody: { token },\n\t\t\ttoken: this.token(),\n\t\t});\n\t}\n}\n\n// ── Auth client ──────────────────────────────────────────────────────────────\n\nexport class AuthClient {\n\treadonly mfa: MfaClient;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {\n\t\tthis.mfa = new MfaClient(http, () => this.tokens.get());\n\t}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// ── Public ─────────────────────────────────────────────────────────────────\n\n\tregister(input: IRegisterInput) {\n\t\treturn this.http.request<IApiResponse<IRegisterResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/register',\n\t\t\tbody: input,\n\t\t});\n\t}\n\n\tlogin(input: ILoginInput) {\n\t\treturn this.http.request<IApiResponse<ILoginResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/login',\n\t\t\tbody: input,\n\t\t});\n\t}\n\n\trefreshTokens(refreshToken?: string) {\n\t\treturn this.http.request<IApiResponse<IRefreshResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/refresh',\n\t\t\tbody: refreshToken ? { refreshToken } : undefined,\n\t\t});\n\t}\n\n\tforgotPassword(email: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/email/forgot',\n\t\t\tbody: { email },\n\t\t});\n\t}\n\n\tresetPassword(input: IResetPasswordInput) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/email/reset',\n\t\t\tbody: input,\n\t\t});\n\t}\n\n\tverifyEmail(token: string) {\n\t\t// @fonderie/auth registers this as POST /auth/verify with body { token }\n\t\t// (verifySchema = { token: sixDigitPin }).\n\t\treturn this.http.request<IApiResponse<IVerifyEmailResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/verify',\n\t\t\tbody: { token },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Protected ──────────────────────────────────────────────────────────────\n\n\tlogout(refreshToken?: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/auth/logout',\n\t\t\tbody: refreshToken ? { refreshToken } : undefined,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tsendVerificationEmail() {\n\t\t// @fonderie/auth registers this as GET /auth/send-verification (requireAuth).\n\t\treturn this.http.request<IApiResponse<IResendVerificationResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/auth/send-verification',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Protected + Verified ───────────────────────────────────────────────────\n\n\tgetUser() {\n\t\treturn this.http.request<IApiResponse<IMeResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/users',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdateProfile(input: IUpdateProfileInput) {\n\t\treturn this.http.request<IApiResponse<IMeResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/profile',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdatePreferences(input: IUpdatePreferencesInput) {\n\t\treturn this.http.request<IApiResponse<IMeResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/preferences',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdateEmail(email: string) {\n\t\treturn this.http.request<IApiResponse<unknown>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/email',\n\t\t\tbody: { email },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdatePhone(phone: string) {\n\t\treturn this.http.request<IApiResponse<unknown>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/phone',\n\t\t\tbody: { phone },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tchangePassword(input: IChangePasswordInput) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/users/password',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// GET /users/export — the caller's own data as a portable bundle (SAR).\n\texportData() {\n\t\treturn this.http.request<IApiResponse<unknown>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/users/export',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tdeleteUser() {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: '/users',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIApiResponse,\n\tICheckoutUrlResult,\n\tIPlanListResult,\n\tIPlanResult,\n\tIPortalUrlResult,\n\tISubscriptionResult,\n\tIUsageResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ICheckoutInput {\n\tplan: string;\n\tinterval?: 'month' | 'year';\n}\n\nexport interface IRecordUsageInput {\n\tmetric: string;\n\tquantity?: number;\n}\n\nexport interface ICreatePlanInput {\n\tname: string;\n\tdescription?: string | null;\n\ttier?: number;\n\tseats?: number | null;\n\ttrialDays?: number;\n\tmonthlyAmount?: number | null;\n\tmonthlyPriceId?: string | null;\n\tyearlyAmount?: number | null;\n\tyearlyPriceId?: string | null;\n\tfeatures?: unknown;\n\tmetadata?: unknown;\n}\n\nexport type IUpdatePlanInput = Partial<ICreatePlanInput>;\n\n// ── Billing client ───────────────────────────────────────────────────────────\n\nexport class BillingClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Subscriber is resolved from this workspace ID (X-Workspace-ID) when set,\n\t// falling back to the session user otherwise — see @fonderie/billing's\n\t// resolveSubscriber. Call with undefined to bill the signed-in user directly.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t// ── Plans — public read-only ────────────────────────────────────────────────\n\n\tlistPlans() {\n\t\treturn this.http.request<IApiResponse<IPlanListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/plans',\n\t\t});\n\t}\n\n\tgetPlan(planId: string) {\n\t\treturn this.http.request<IApiResponse<IPlanResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/plans/${planId}`,\n\t\t});\n\t}\n\n\t// ── Plans — admin write ──────────────────────────────────────────────────────\n\t// Unlike every other write in this client, @fonderie/billing does not gate\n\t// these with requireAuth or an admin token — \"the caller is responsible for\n\t// authorization\" (its own routes.ts comment). Sending the session token is\n\t// harmless (the server ignores it) but does nothing on its own; gate access\n\t// to these calls yourself (an app-level route guard, a reverse-proxy admin\n\t// zone, or similar) before wiring them into a UI.\n\n\tcreatePlan(input: ICreatePlanInput) {\n\t\treturn this.http.request<IApiResponse<IPlanResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/plans',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdatePlan(planId: string, input: IUpdatePlanInput) {\n\t\treturn this.http.request<IApiResponse<IPlanResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/plans/${planId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tdeletePlan(planId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/plans/${planId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Subscription ─────────────────────────────────────────────────────────────\n\n\tgetSubscription() {\n\t\treturn this.http.request<IApiResponse<ISubscriptionResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/billing/subscription',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Checkout / portal ────────────────────────────────────────────────────────\n\n\tcreateCheckoutSession(input: ICheckoutInput) {\n\t\treturn this.http.request<IApiResponse<ICheckoutUrlResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/billing/checkout',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreatePortalSession() {\n\t\treturn this.http.request<IApiResponse<IPortalUrlResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/billing/portal',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Usage ────────────────────────────────────────────────────────────────────\n\n\trecordUsage(input: IRecordUsageInput) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/billing/usage',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetUsage(metric: string) {\n\t\treturn this.http.request<IApiResponse<IUsageResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/billing/usage/${metric}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tCustomerLabelType,\n\tCustomerSex,\n\tCustomerType,\n\tIApiResponse,\n\tICustomerAddressListResult,\n\tICustomerAddressResult,\n\tICustomerDetailD2DTO,\n\tICustomerDetailDTO,\n\tICustomerEmailListResult,\n\tICustomerEmailResult,\n\tICustomerLabelListResult,\n\tICustomerListResult,\n\tICustomerNoteListResult,\n\tICustomerNoteResult,\n\tICustomerPhoneListResult,\n\tICustomerPhoneResult,\n\tICustomerRelationshipListResult,\n\tICustomerRelationshipResult,\n\tICustomerResult,\n\tICustomerTagListResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface IListCustomersInput {\n\tsearch?: string;\n\tblacklisted?: boolean;\n\tlimit?: number;\n\toffset?: number;\n}\n\nexport interface IGetCustomerInput {\n\tdepth?: 1 | 2;\n}\n\nexport interface ICreateCustomerInput {\n\ttype?: CustomerType;\n\tsex?: CustomerSex;\n\tfirstName?: string | null;\n\tlastName?: string | null;\n\tcompanyName?: string | null;\n\tavatarUrl?: string | null;\n\tlocale?: string | null;\n\treferenceCode?: string | null;\n\treferralCode?: string | null;\n\treferredByCode?: string | null;\n}\n\nexport type IUpdateCustomerInput = ICreateCustomerInput;\n\nexport interface IBlacklistCustomerInput {\n\treason?: string;\n}\n\nexport interface IAddEmailInput {\n\temail: string;\n\tlabel?: string;\n\tisPrimary?: boolean;\n}\n\nexport interface IAddPhoneInput {\n\tphone: string;\n\tlabel?: string;\n\tisPrimary?: boolean;\n}\n\nexport interface IAddAddressInput {\n\tcountryIso: string;\n\tzipPostalCode: string;\n\tsubdivision1Iso?: string | null;\n\tsubdivision2Iso?: string | null;\n\tunit?: string | null;\n\tline1?: string | null;\n\tline2?: string | null;\n\tlabel?: string;\n\tisPrimary?: boolean;\n}\n\nexport interface IAddRelationshipInput {\n\trelatedId: string;\n\trelationship?: string;\n\tisPrimary?: boolean;\n}\n\n// ── Customers client ─────────────────────────────────────────────────────────\n\nexport class CustomersClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes every request to this workspace (X-Workspace-ID). Falls back to\n\t// the caller's personal workspace when unset, same as billing/workspaces/audit/webhooks.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t// ── Core customer CRUD ───────────────────────────────────────────────────────\n\n\tlistCustomers(input: IListCustomersInput = {}) {\n\t\tconst params = new URLSearchParams();\n\t\tif (input.search !== undefined) params.set('search', input.search);\n\t\tif (input.blacklisted !== undefined) params.set('blacklisted', String(input.blacklisted));\n\t\tif (input.limit !== undefined) params.set('limit', String(input.limit));\n\t\tif (input.offset !== undefined) params.set('offset', String(input.offset));\n\t\tconst qs = params.toString();\n\n\t\treturn this.http.request<IApiResponse<ICustomerListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: qs ? `/customers?${qs}` : '/customers',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreateCustomer(input: ICreateCustomerInput = {}) {\n\t\treturn this.http.request<IApiResponse<ICustomerResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/customers',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// depth defaults to 2 server-side; pass { depth: 1 } for one level of\n\t// relationship expansion instead of the D2 (nested-relationships) shape.\n\tgetCustomer(customerId: string, input: IGetCustomerInput = {}) {\n\t\tconst qs = input.depth === 1 ? '?depth=1' : '';\n\t\treturn this.http.request<IApiResponse<ICustomerDetailDTO | ICustomerDetailD2DTO>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}${qs}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateCustomer(customerId: string, input: IUpdateCustomerInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tdeleteCustomer(customerId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tblacklistCustomer(customerId: string, input: IBlacklistCustomerInput = {}) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/blacklist`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tunblacklistCustomer(customerId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/unblacklist`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Emails ───────────────────────────────────────────────────────────────────\n\n\tlistEmails(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerEmailListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/emails`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddEmail(customerId: string, input: IAddEmailInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerEmailResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/emails`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Only the label is editable — email addresses themselves are immutable\n\t// once added; remove and re-add to change the address.\n\tupdateEmailLabel(customerId: string, emailId: string, label: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerEmailResult>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/customers/${customerId}/emails/${emailId}`,\n\t\t\tbody: { label },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryEmail(customerId: string, emailId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/emails/${emailId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveEmail(customerId: string, emailId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/emails/${emailId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Phones ───────────────────────────────────────────────────────────────────\n\n\tlistPhones(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerPhoneListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/phones`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddPhone(customerId: string, input: IAddPhoneInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerPhoneResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/phones`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Only the label is editable — same as updateEmailLabel.\n\tupdatePhoneLabel(customerId: string, phoneId: string, label: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerPhoneResult>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/customers/${customerId}/phones/${phoneId}`,\n\t\t\tbody: { label },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryPhone(customerId: string, phoneId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/phones/${phoneId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremovePhone(customerId: string, phoneId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/phones/${phoneId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Addresses ────────────────────────────────────────────────────────────────\n\n\tlistAddresses(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerAddressListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/addresses`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddAddress(customerId: string, input: IAddAddressInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerAddressResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/addresses`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Only the label is editable — same as updateEmailLabel.\n\tupdateAddressLabel(customerId: string, addrId: string, label: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerAddressResult>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/customers/${customerId}/addresses/${addrId}`,\n\t\t\tbody: { label },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryAddress(customerId: string, addrId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/addresses/${addrId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveAddress(customerId: string, addrId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/addresses/${addrId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Notes ────────────────────────────────────────────────────────────────────\n\n\tlistNotes(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerNoteListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/notes`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreateNote(customerId: string, body: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerNoteResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/notes`,\n\t\t\tbody: { body },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateNote(customerId: string, noteId: string, body: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerNoteResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/notes/${noteId}`,\n\t\t\tbody: { body },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tdeleteNote(customerId: string, noteId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/notes/${noteId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Tags ─────────────────────────────────────────────────────────────────────\n\n\tlistTags(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerTagListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/tags`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddTag(customerId: string, tag: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/tags`,\n\t\t\tbody: { tag },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveTag(customerId: string, tag: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/tags/${encodeURIComponent(tag)}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Relationships ────────────────────────────────────────────────────────────\n\n\tlistRelationships(customerId: string) {\n\t\treturn this.http.request<IApiResponse<ICustomerRelationshipListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/${customerId}/relationships`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddRelationship(customerId: string, input: IAddRelationshipInput) {\n\t\treturn this.http.request<IApiResponse<ICustomerRelationshipResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/customers/${customerId}/relationships`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetPrimaryRelationship(customerId: string, relatedId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/customers/${customerId}/relationships/${relatedId}/primary`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveRelationship(customerId: string, relatedId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/${customerId}/relationships/${relatedId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Labels ───────────────────────────────────────────────────────────────────\n\t// Shared vocabulary across all customers in the workspace — labels are\n\t// looked up/created implicitly by addEmail/addPhone/addAddress's `label`\n\t// string; these two methods are for managing the vocabulary directly\n\t// (e.g. an admin screen listing/pruning unused labels).\n\n\tlistLabels(type: CustomerLabelType) {\n\t\treturn this.http.request<IApiResponse<ICustomerLabelListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/customers/labels?type=${type}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveLabel(labelId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/customers/labels/${labelId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIApiResponse,\n\tITestWebhookResult,\n\tIWebhookDeliveryListResult,\n\tIWebhookEndpointCreatedDTO,\n\tIWebhookEndpointDTO,\n\tIWebhookEndpointListResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ICreateWebhookEndpointInput {\n\turl: string;\n\tevents?: string[];\n}\n\nexport interface IUpdateWebhookEndpointInput {\n\turl?: string;\n\tevents?: string[];\n\tenabled?: boolean;\n}\n\n// ── Webhooks client ──────────────────────────────────────────────────────────\n\nexport class WebhooksClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes every request to this workspace (X-Workspace-ID). Falls back to\n\t// the caller's personal workspace when unset, same as billing/workspaces/audit.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\tlistEndpoints() {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/webhooks',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// The response includes `secret` — shown once, at creation. There is no\n\t// way to retrieve it again afterward; store it or let the caller copy it.\n\tcreateEndpoint(input: ICreateWebhookEndpointInput) {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointCreatedDTO>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/webhooks',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetEndpoint(endpointId: string) {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointDTO>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/webhooks/${endpointId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateEndpoint(endpointId: string, input: IUpdateWebhookEndpointInput) {\n\t\treturn this.http.request<IApiResponse<IWebhookEndpointDTO>>({\n\t\t\tmethod: 'PATCH',\n\t\t\tpath: `/webhooks/${endpointId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tdeleteEndpoint(endpointId: string) {\n\t\treturn this.http.request<undefined>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/webhooks/${endpointId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tlistDeliveries(endpointId: string) {\n\t\treturn this.http.request<IApiResponse<IWebhookDeliveryListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/webhooks/${endpointId}/deliveries`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\ttestEndpoint(endpointId: string) {\n\t\treturn this.http.request<IApiResponse<ITestWebhookResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/webhooks/${endpointId}/test`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","import type { HttpClient } from '../http';\nimport type { TokenStore } from '../token-store';\nimport type {\n\tIAcceptInvitationResult,\n\tIApiResponse,\n\tIInvitationListResult,\n\tIInviteResult,\n\tIMemberListResult,\n\tIRoleListResult,\n\tIRoleResult,\n\tIWorkspaceListResult,\n\tIWorkspaceResult,\n\tIWorkspaceSettingsResult,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ICreateWorkspaceInput {\n\tname: string;\n\tdescription?: string;\n\ttype?: string;\n}\n\nexport interface IUpdateWorkspaceInput {\n\tname?: string;\n\tdescription?: string | null;\n\tmotto?: string | null;\n\tphone?: string | null;\n\tbusinessType?: string | null;\n\taddress?: {\n\t\tline1?: string;\n\t\tline2?: string;\n\t\tcity?: string;\n\t\tstate?: string;\n\t\tzip?: string;\n\t\tcountry?: string;\n\t} | null;\n}\n\nexport interface IInviteEntry {\n\temail: string;\n\troleId?: string;\n}\n\nexport interface IUpdateSettingsInput {\n\tlocale?: string;\n\ttimezone?: string;\n\tcurrency?: string;\n\tdateFormat?: string;\n\ttimeFormat?: string;\n}\n\nexport interface ICreateRoleInput {\n\tname: string;\n\tdescription?: string;\n}\n\nexport interface IUpdateRoleInput {\n\tname?: string;\n\tdescription?: string | null;\n\tactive?: boolean;\n}\n\nexport interface IRolePermissionInput {\n\tpermissionKey: string;\n\tcanCreate?: boolean;\n\tcanRead?: boolean;\n\tcanUpdate?: boolean;\n\tcanDelete?: boolean;\n}\n\nexport interface IRolePermission {\n\tpermissionKey: string;\n\tcanCreate: boolean;\n\tcanRead: boolean;\n\tcanUpdate: boolean;\n\tcanDelete: boolean;\n}\n\nexport interface IRolePermissionsResult {\n\tpermissions: IRolePermission[];\n}\n\n// ── Workspaces client ────────────────────────────────────────────────────────\n\nexport class WorkspacesClient {\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(\n\t\tprivate http: HttpClient,\n\t\tprivate tokens: TokenStore,\n\t) {}\n\n\tsetAccessToken(token: string | undefined) {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Scopes every subsequent request to this workspace (X-Workspace-ID).\n\t// Falls back to the caller's personal workspace when unset.\n\tsetWorkspaceId(workspaceId: string | undefined) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t// ── Workspace creation + listing ─────────────────────────────────────────────\n\n\tlistWorkspaces() {\n\t\treturn this.http.request<IApiResponse<IWorkspaceListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces',\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tcreateWorkspace(input: ICreateWorkspaceInput) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tgetWorkspace(id: string) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/${id}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\tupdateWorkspace(input: IUpdateWorkspaceInput) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/workspaces',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// Personal workspaces can't be archived — the server returns 403 if you try.\n\tarchiveWorkspace() {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/archive',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\trestoreWorkspace() {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/restore',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Roles ────────────────────────────────────────────────────────────────────\n\n\tlistRoles() {\n\t\treturn this.http.request<IApiResponse<IRoleListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/roles',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcreateRole(input: ICreateRoleInput) {\n\t\treturn this.http.request<IApiResponse<IRoleResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/roles',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetRole(roleId: string) {\n\t\treturn this.http.request<IApiResponse<IRoleResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/roles/${roleId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateRole(roleId: string, input: IUpdateRoleInput) {\n\t\treturn this.http.request<IApiResponse<IRoleResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/workspaces/roles/${roleId}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveRole(roleId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/roles/${roleId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetRolePermissions(roleId: string) {\n\t\treturn this.http.request<IApiResponse<IRolePermissionsResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/roles/${roleId}/permissions`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tsetRolePermissions(roleId: string, permissions: IRolePermissionInput[]) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/workspaces/roles/${roleId}/permissions`,\n\t\t\tbody: { permissions },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Members ──────────────────────────────────────────────────────────────────\n\n\tlistMembers() {\n\t\treturn this.http.request<IApiResponse<IMemberListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/members',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveMember(userId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/members/${userId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tgetMemberRoles(userId: string) {\n\t\treturn this.http.request<IApiResponse<IRoleListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/workspaces/members/${userId}/roles`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\taddMemberRole(userId: string, roleId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/workspaces/members/${userId}/roles`,\n\t\t\tbody: { roleId },\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tremoveMemberRole(userId: string, roleId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/members/${userId}/roles/${roleId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\t// ── Invitations ──────────────────────────────────────────────────────────────\n\n\tlistInvitations() {\n\t\treturn this.http.request<IApiResponse<IInvitationListResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/invitations',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tinvite(entries: IInviteEntry | IInviteEntry[]) {\n\t\treturn this.http.request<IApiResponse<IInviteResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/invitations',\n\t\t\tbody: entries,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tcancelInvitation(inviteId: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/workspaces/invitations/${inviteId}`,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tacceptInvitation(pin: string) {\n\t\treturn this.http.request<IApiResponse<IAcceptInvitationResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: '/workspaces/invitations/accept',\n\t\t\tbody: { pin },\n\t\t\ttoken: this.tokens.get(),\n\t\t});\n\t}\n\n\t// ── Settings ─────────────────────────────────────────────────────────────────\n\n\tgetSettings() {\n\t\treturn this.http.request<IApiResponse<IWorkspaceSettingsResult>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/workspaces/settings',\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n\n\tupdateSettings(input: IUpdateSettingsInput) {\n\t\treturn this.http.request<IApiResponse<IWorkspaceSettingsResult>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: '/workspaces/settings',\n\t\t\tbody: input,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t});\n\t}\n}\n","// Shared by every module of a FonderieClient so that setting the access\n// token on one (e.g. AuthClient after login) is immediately visible to all\n// the others (e.g. BillingClient) — they're separate module instances, but\n// one session.\nexport class TokenStore {\n\tprivate token: string | undefined;\n\n\tconstructor(initial?: string) {\n\t\tthis.token = initial;\n\t}\n\n\tget(): string | undefined {\n\t\treturn this.token;\n\t}\n\n\tset(token: string | undefined) {\n\t\tthis.token = token;\n\t}\n}\n","import { HttpClient } from './http';\nimport { AuditClient } from './modules/audit';\nimport { AuthClient } from './modules/auth';\nimport { BillingClient } from './modules/billing';\nimport { CustomersClient } from './modules/customers';\nimport { WebhooksClient } from './modules/webhooks';\nimport { WorkspacesClient } from './modules/workspaces';\nimport { TokenStore } from './token-store';\nimport type { IApiResponse } from './types';\n\nexport interface IFonderieClientOptions {\n\tbaseUrl: string;\n\taccessToken?: string;\n\tworkspaceId?: string;\n}\n\n// Per-call options for the generic transport. `workspaceId` overrides the\n// client-level default for a single request.\nexport interface IRequestConfig {\n\tworkspaceId?: string;\n}\n\nexport class FonderieClient {\n\treadonly auth: AuthClient;\n\treadonly billing: BillingClient;\n\treadonly workspaces: WorkspacesClient;\n\treadonly audit: AuditClient;\n\treadonly webhooks: WebhooksClient;\n\treadonly customers: CustomersClient;\n\n\tprivate http: HttpClient;\n\tprivate tokens: TokenStore;\n\tprivate workspaceId: string | undefined;\n\n\tconstructor(opts: IFonderieClientOptions) {\n\t\tthis.http = new HttpClient(opts.baseUrl);\n\t\tthis.tokens = new TokenStore(opts.accessToken);\n\t\tthis.workspaceId = opts.workspaceId;\n\t\tthis.auth = new AuthClient(this.http, this.tokens);\n\t\tthis.billing = new BillingClient(this.http, this.tokens);\n\t\tthis.workspaces = new WorkspacesClient(this.http, this.tokens);\n\t\tthis.audit = new AuditClient(this.http, this.tokens);\n\t\tthis.webhooks = new WebhooksClient(this.http, this.tokens);\n\t\tthis.customers = new CustomersClient(this.http, this.tokens);\n\t}\n\n\t// The JWT used to authenticate every request — the typed modules and the\n\t// generic transport share one token store. Pass undefined to sign out.\n\tsetAccessToken(token: string | undefined): void {\n\t\tthis.tokens.set(token);\n\t}\n\n\t// Default X-Workspace-ID for the generic transport, also propagated to the\n\t// workspace-scoped modules so one call configures the whole client.\n\tsetWorkspaceId(workspaceId: string | undefined): void {\n\t\tthis.workspaceId = workspaceId;\n\t\tthis.billing.setWorkspaceId(workspaceId);\n\t\tthis.workspaces.setWorkspaceId(workspaceId);\n\t\tthis.customers.setWorkspaceId(workspaceId);\n\t}\n\n\t// ── Generic transport ──────────────────────────────────────────────────────\n\t// A Fonderie-aware HTTP client for endpoints outside the typed modules (an\n\t// app's own routes on the same backend). It attaches the shared JWT and\n\t// X-Workspace-ID automatically and returns Fonderie's { reason, explanation,\n\t// result } envelope — so you don't hand-roll auth for custom endpoints.\n\n\trequest<T = unknown>(opts: {\n\t\tmethod: string;\n\t\tpath: string;\n\t\tbody?: unknown;\n\t\tworkspaceId?: string | undefined;\n\t}): Promise<IApiResponse<T>> {\n\t\treturn this.http.request<IApiResponse<T>>({\n\t\t\tmethod: opts.method,\n\t\t\tpath: opts.path,\n\t\t\tbody: opts.body,\n\t\t\ttoken: this.tokens.get(),\n\t\t\tworkspaceId: opts.workspaceId ?? this.workspaceId,\n\t\t});\n\t}\n\n\tget<T = unknown>(path: string, config?: IRequestConfig): Promise<IApiResponse<T>> {\n\t\treturn this.request<T>({ method: 'GET', path, workspaceId: config?.workspaceId });\n\t}\n\n\tpost<T = unknown>(path: string, body?: unknown, config?: IRequestConfig): Promise<IApiResponse<T>> {\n\t\treturn this.request<T>({ method: 'POST', path, body, workspaceId: config?.workspaceId });\n\t}\n\n\tput<T = unknown>(path: string, body?: unknown, config?: IRequestConfig): Promise<IApiResponse<T>> {\n\t\treturn this.request<T>({ method: 'PUT', path, body, workspaceId: config?.workspaceId });\n\t}\n\n\tpatch<T = unknown>(path: string, body?: unknown, config?: IRequestConfig): Promise<IApiResponse<T>> {\n\t\treturn this.request<T>({ method: 'PATCH', path, body, workspaceId: config?.workspaceId });\n\t}\n\n\tdelete<T = unknown>(path: string, config?: IRequestConfig): Promise<IApiResponse<T>> {\n\t\treturn this.request<T>({ method: 'DELETE', path, workspaceId: config?.workspaceId });\n\t}\n}\n","import { HttpClient } from '../http';\nimport type {\n\tIApiResponse,\n\tIConfigEntry,\n\tIConfigRevision,\n\tIRevealSecretResult,\n\tISecretEntry,\n\tISecretRevision,\n} from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ISetConfigInput {\n\tvalue: unknown;\n\tdescription?: string;\n\tifVersion?: number;\n}\n\nexport interface ISetSecretInput {\n\tvalue: string;\n\tdescription?: string;\n\tifVersion?: number;\n}\n\nexport interface IRollbackInput {\n\ttoVersion: number;\n}\n\nexport interface IConfigAdminClientOptions {\n\tbaseUrl: string;\n\tadminToken: string;\n}\n\nfunction envQuery(environment?: string): string {\n\treturn environment ? `?environment=${encodeURIComponent(environment)}` : '';\n}\n\n// ── Config admin client ──────────────────────────────────────────────────────\n//\n// Separate from FonderieClient on purpose, for the same reason as\n// CourierAdminClient: @fonderie/config's admin routes (/admin/config/*,\n// /admin/secrets/*) are guarded by a static bearer token configured on the\n// server, not the signed-in user's session. Construct with that token\n// directly; it shares no state with AuthClient/BillingClient/WorkspacesClient.\nexport class ConfigAdminClient {\n\tprivate http: HttpClient;\n\tprivate adminToken: string;\n\n\tconstructor(opts: IConfigAdminClientOptions) {\n\t\tthis.http = new HttpClient(opts.baseUrl);\n\t\tthis.adminToken = opts.adminToken;\n\t}\n\n\t// ── Config ───────────────────────────────────────────────────────────────\n\n\tlistConfig(environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/config${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tgetConfig(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/config/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tsetConfig(key: string, input: ISetConfigInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/admin/config/${key}${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tdeleteConfig(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/admin/config/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tlistConfigRevisions(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigRevision[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/config/${key}/revisions${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\trollbackConfig(key: string, input: IRollbackInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IConfigEntry>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/config/${key}/rollback${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\t// ── Secrets (masked) ─────────────────────────────────────────────────────\n\n\tlistSecrets(environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/secrets${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tgetSecret(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/secrets/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tsetSecret(key: string, input: ISetSecretInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/admin/secrets/${key}${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tdeleteSecret(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/admin/secrets/${key}${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tlistSecretRevisions(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretRevision[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/secrets/${key}/revisions${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\trollbackSecret(key: string, input: IRollbackInput, environment?: string) {\n\t\treturn this.http.request<IApiResponse<ISecretEntry>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/secrets/${key}/rollback${envQuery(environment)}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\t// POST (not GET) so the decrypted value never lands in a URL or access log.\n\trevealSecret(key: string, environment?: string) {\n\t\treturn this.http.request<IApiResponse<IRevealSecretResult>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/secrets/${key}/reveal${envQuery(environment)}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n}\n","import { HttpClient } from '../http';\nimport type { IApiResponse, ITemplateEntry, ITemplateRevision } from '../types';\n\n// ── Input shapes ─────────────────────────────────────────────────────────────\n\nexport interface ISetTemplateInput {\n\ttext: string;\n\tsubject?: string;\n\thtml?: string;\n\tactive?: boolean;\n\tifVersion?: number;\n}\n\nexport interface IRollbackTemplateInput {\n\ttoVersion: number;\n}\n\nexport interface ICourierAdminClientOptions {\n\tbaseUrl: string;\n\tadminToken: string;\n}\n\n// ── Courier admin client ─────────────────────────────────────────────────────\n//\n// Separate from FonderieClient on purpose: @fonderie/courier's admin routes\n// (/admin/templates/*) are guarded by a static bearer token configured on the\n// server (CourierModule's adminToken), not the signed-in user's session —\n// the same model @fonderie/config's admin surface uses, and the one the\n// `fonderie template`/`fonderie config` CLI commands already speak to via\n// FONDERIE_ADMIN_URL/FONDERIE_ADMIN_TOKEN. Bundling this into FonderieClient\n// would suggest an end-user's session token can reach it, which it can't —\n// this is an ops/admin-dashboard client, constructed with its own token.\nexport class CourierAdminClient {\n\tprivate http: HttpClient;\n\tprivate adminToken: string;\n\n\tconstructor(opts: ICourierAdminClientOptions) {\n\t\tthis.http = new HttpClient(opts.baseUrl);\n\t\tthis.adminToken = opts.adminToken;\n\t}\n\n\tlistTemplates() {\n\t\treturn this.http.request<IApiResponse<ITemplateEntry[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: '/admin/templates',\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tgetTemplate(type: string, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateEntry>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/templates/${type}${q}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tsetTemplate(type: string, input: ISetTemplateInput, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateEntry>>({\n\t\t\tmethod: 'PUT',\n\t\t\tpath: `/admin/templates/${type}${q}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tdeleteTemplate(type: string, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<undefined>>({\n\t\t\tmethod: 'DELETE',\n\t\t\tpath: `/admin/templates/${type}${q}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\tlistRevisions(type: string, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateRevision[]>>({\n\t\t\tmethod: 'GET',\n\t\t\tpath: `/admin/templates/${type}/revisions${q}`,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n\n\trollback(type: string, input: IRollbackTemplateInput, locale?: string | null) {\n\t\tconst q = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n\t\treturn this.http.request<IApiResponse<ITemplateEntry>>({\n\t\t\tmethod: 'POST',\n\t\t\tpath: `/admin/templates/${type}/rollback${q}`,\n\t\t\tbody: input,\n\t\t\ttoken: this.adminToken,\n\t\t});\n\t}\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fonderie/client",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Isomorphic TypeScript client for Fonderie-powered APIs — fully typed request and response shapes, zero runtime dependencies.",
5
5
  "keywords": [
6
6
  "fonderiejs",